Index: /trunk/anuga_core/source/anuga/parallel/INSTALL-README
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/INSTALL-README	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/INSTALL-README	(revision 9501)
@@ -0,0 +1,3 @@
+
+Read http://anuga.anu.edu.au/wiki/AnugaParallel
+ 
Index: /trunk/anuga_core/source/anuga/parallel/README
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/README	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/README	(revision 9501)
@@ -0,0 +1,3 @@
+
+Read http://anuga.anu.edu.au/wiki/AnugaParallel
+
Index: /trunk/anuga_core/source/anuga/parallel/__init__.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/__init__.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/__init__.py	(revision 9501)
@@ -0,0 +1,29 @@
+"""
+This is the public API to ANUGA_PARALLEL.
+
+Ideally, all tools needed to run parallel simulations should be
+imported from this module
+"""
+
+# Lets import the standard anuga interface
+#from anuga import *
+
+
+from parallel_api import distribute
+from parallel_api import myid, numprocs, get_processor_name
+from parallel_api import send, receive
+from parallel_api import pypar_available, barrier, finalize
+
+if pypar_available:
+    from parallel_meshes import parallel_rectangle
+    from parallel_shallow_water import Parallel_domain as Parallel_shallow_water_domain
+    from parallel_advection     import Parallel_domain as Parallel_advection_domain
+    from parallel_operator_factory import Inlet_operator, Boyd_box_operator, Boyd_pipe_operator
+    from parallel_operator_factory import Weir_orifice_trapezoid_operator #added by PM 22/10/2013
+else:
+    from anuga import rectangular_cross as parallel_rectangle
+    from anuga import Domain as Parallel_shallow_water_domain
+    from anuga.advection import Advection_Domain as Parallel_advection_domain
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/config.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/config.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/config.py	(revision 9501)
@@ -0,0 +1,14 @@
+#! /usr/bin/python
+
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+__author__="stephen"
+__date__ ="$27/08/2012 8:58:23 PM$"
+
+
+ghost_layer_width = 2
+
+
+if __name__ == "__main__":
+    print "Hello World";
Index: /trunk/anuga_core/source/anuga/parallel/data/merimbula_10785_1.tsh
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/data/merimbula_10785_1.tsh	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/data/merimbula_10785_1.tsh	(revision 9501)
@@ -0,0 +1,18185 @@
+5719 1 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Triangulation Vertices...
+0 756956.4 5913709.0 -1.05857910142 
+1 756979.4 5913720.0 -0.930256716426 
+2 756996.9 5913754.0 -0.384269340021 
+3 757024.4 5913793.0 -0.125330994253 
+4 757053.3 5913790.0 -0.177543895094 
+5 757091.3 5913769.0 -0.246912441532 
+6 757115.8 5913740.0 -0.347470047572 
+7 757119.1 5913676.0 -1.0153632953 
+8 757109.7 5913639.0 -1.27592843557 
+9 757099.4 5913604.0 -1.30818945402 
+10 757102.3 5913568.0 -1.22102047727 
+11 757121.9 5913544.0 -1.15870628606 
+12 757146.9 5913507.0 -1.06744256608 
+13 757173.1 5913481.0 -1.34338873589 
+14 757208.3 5913450.0 -1.34795702415 
+15 757241.3 5913424.0 -0.658884060878 
+16 757278.6 5913415.0 -0.202750043154 
+17 757313.6 5913416.0 -0.357582415844 
+18 757352.6 5913399.0 -0.350696607251 
+19 757382.1 5913381.0 -0.297108045802 
+20 757435.2 5913355.0 -0.224015874196 
+21 757469.4 5913363.0 -0.232950767947 
+22 757495.5 5913378.0 -0.304468425652 
+23 757520.6 5913393.0 -0.261688278222 
+24 757580.5 5913402.0 -0.26005347607 
+25 757622.8 5913387.0 -0.330548150361 
+26 757658.0 5913366.0 -0.169381377428 
+27 757683.9 5913344.0 -0.284046976833 
+28 757692.4 5913302.0 -0.237140821617 
+29 757711.5 5913255.0 0.0114529741 
+30 757699.8 5913198.0 -0.0515441837891 
+31 757694.5 5913161.0 -0.101507151741 
+32 757697.4 5913107.0 -0.186419626479 
+33 757703.9 5913063.0 -0.152146044918 
+34 757713.1 5913020.0 -0.0321163950475 
+35 757725.9 5912968.0 -0.0309828545732 
+36 757764.3 5912914.0 -0.160074681446 
+37 757795.8 5912882.0 -0.175369044956 
+38 757823.4 5912843.0 -0.265337636881 
+39 757861.6 5912840.0 -0.187762439574 
+40 757898.6 5912833.0 -0.165740878776 
+41 757946.3 5912800.0 -0.19645987677 
+42 757982.8 5912776.0 -0.23230255575 
+43 758012.8 5912752.0 -0.253128191054 
+44 758082.6 5912770.0 -0.252714809571 
+45 758141.9 5912746.0 -0.184445204606 
+46 758178.6 5912745.0 -0.243060292372 
+47 758215.3 5912735.0 -0.185704481615 
+48 758243.5 5912747.0 -0.168217285222 
+49 758300.5 5912705.0 -0.117686626931 
+50 758363.2 5912661.0 -0.280394878109 
+51 758410.1 5912597.0 -0.426651570128 
+52 758442.4 5912560.0 -0.517635990396 
+53 758478.6 5912565.0 -0.281820396525 
+54 758501.9 5912604.0 -0.113066569536 
+55 758542.0 5912658.0 -0.0825699244761 
+56 758591.1 5912693.0 -0.0635172194751 
+57 758630.6 5912714.0 -0.0714117982476 
+58 758670.1 5912755.0 -0.0343803207281 
+59 758708.4 5912767.0 -0.028414969048 
+60 758746.5 5912792.0 0.0733174978561 
+61 758777.8 5912795.0 0.0025025984844 
+62 758829.4 5912789.0 -0.0766058453139 
+63 758879.9 5912755.0 -0.107316235091 
+64 758909.5 5912753.0 -0.103600862254 
+65 758947.3 5912764.0 -0.279861120727 
+66 758985.3 5912781.0 -0.368829689425 
+67 759015.4 5912826.0 -0.231415048354 
+68 759041.8 5912867.0 -0.0734020727309 
+69 759094.9 5912871.0 -0.425036798591 
+70 759122.8 5912876.0 -0.308588573743 
+71 759162.0 5912871.0 -1.40128909387 
+72 759170.0 5912890.0 -0.176072625742 
+73 759193.8 5912906.0 -0.486103718308 
+74 759209.6 5912931.0 0.162292263706 
+75 759228.0 5912954.0 -0.599899533136 
+76 759232.4 5912991.0 -0.113549604166 
+77 759235.8 5913020.0 -0.798765074401 
+78 759243.4 5913044.0 -0.66836549828 
+79 759262.3 5913073.0 -0.322426281145 
+80 759274.8 5913096.0 -0.411306178855 
+81 759304.5 5913144.0 -0.280774625932 
+82 759329.6 5913173.0 -0.234460946706 
+83 759347.1 5913190.0 -0.279682252246 
+84 759372.1 5913218.0 0.124629853763 
+85 759389.7 5913249.0 -0.17467118384 
+86 759399.4 5913273.0 0.0296177431407 
+87 759403.4 5913314.0 -0.194660371612 
+88 759403.2 5913351.0 -0.208277584299 
+89 759403.8 5913388.0 -0.149277675281 
+90 759422.0 5913419.0 -0.0511553017668 
+91 759427.9 5913448.0 0.000602196168005 
+92 759454.6 5913488.0 0.66754101098 
+93 759493.3 5913521.0 0.117985698077 
+94 759520.8 5913539.0 0.0882915827384 
+95 759551.9 5913558.0 0.25729833712 
+96 759595.8 5913584.0 0.315880001711 
+97 759632.5 5913599.0 -0.173491634922 
+98 759664.6 5913608.0 -0.305367491372 
+99 759708.0 5913616.0 -0.397765149714 
+100 759762.1 5913619.0 -0.416403525253 
+101 759799.8 5913620.0 -0.319723989117 
+102 759844.5 5913617.0 -0.277267963897 
+103 759910.8 5913595.0 -0.268415427519 
+104 759944.2 5913582.0 -0.270854925335 
+105 759997.4 5913562.0 -0.259014257035 
+106 760042.6 5913544.0 0.161247065454 
+107 760099.1 5913521.0 -0.0866017222103 
+108 760183.0 5913505.0 0.44962317077 
+109 760270.8 5913479.0 0.402925658588 
+110 760318.7 5913453.0 0.418497500013 
+111 760362.4 5913449.0 0.20441589251 
+112 760406.4 5913429.0 -0.0618146501833 
+113 760468.0 5913408.0 -0.181488568512 
+114 760514.6 5913383.0 -0.0539863289797 
+115 760533.6 5913307.0 -0.385096271235 
+116 760506.8 5913254.0 -0.525222838409 
+117 760506.3 5913182.0 -0.737815792894 
+118 760509.4 5913140.0 -0.589320595178 
+119 760513.4 5913097.0 -0.105143984879 
+120 760543.6 5913078.0 0.47556497613 
+121 760517.2 5913038.0 -0.197388746517 
+122 760515.9 5912999.0 -0.377318700619 
+123 760522.7 5912961.0 -0.39944834645 
+124 760538.6 5912911.0 -0.448860641268 
+125 760533.5 5912882.0 -0.926351496253 
+126 760523.6 5912842.0 0.067974338178 
+127 760530.7 5912799.0 -0.268638914746 
+128 760568.4 5912715.0 -0.139400531391 
+129 760548.1 5912657.0 0.31622455604 
+130 760604.9 5912563.0 -2.91367708118 
+131 760659.6 5912545.0 -3.57578941256 
+132 760731.9 5912514.0 -4.49799560728 
+133 760776.9 5912482.0 -4.62564930778 
+134 760820.9 5912414.0 -3.80674094524 
+135 760830.0 5912347.0 -4.94566176095 
+136 760872.2 5912268.0 -3.89147536778 
+137 760914.6 5912302.0 -3.81545599159 
+138 760974.8 5912243.0 -3.81900292394 
+139 761016.3 5912205.0 -3.49050618739 
+140 761052.7 5912151.0 -3.29743560189 
+141 759608.8 5912326.0 -2.50311131006 
+142 759648.9 5912370.0 -2.49854080032 
+143 759734.6 5912453.0 -2.35271604257 
+144 759831.9 5912548.0 -1.60813095165 
+145 759926.0 5912617.0 -0.320290556206 
+146 760035.3 5912684.0 0.0211316708495 
+147 760130.8 5912731.0 0.211595125577 
+148 760188.9 5912759.0 0.807589373583 
+149 760259.2 5912788.0 1.04750182848 
+150 760345.6 5912800.0 0.349723586514 
+151 760413.1 5912792.0 -0.790008409706 
+152 760394.6 5912830.0 -0.2988045194 
+153 760352.9 5912826.0 0.243780465645 
+154 760301.9 5912836.0 -0.490627182964 
+155 760251.9 5912865.0 -1.89364889452 
+156 760180.4 5912895.0 -1.20719746677 
+157 760150.5 5912884.0 -0.691818356953 
+158 760110.3 5912889.0 -1.08014386735 
+159 760029.2 5912933.0 -0.630775039662 
+160 759965.3 5912969.0 -0.796592540882 
+161 759917.9 5912983.0 -0.461554816476 
+162 759867.0 5912984.0 -0.172677542929 
+163 759809.5 5912981.0 -0.455343216108 
+164 759769.6 5912980.0 -0.814686769423 
+165 759723.6 5912982.0 -0.160007359477 
+166 759683.6 5912981.0 -0.162139491744 
+167 759634.8 5912975.0 0.0483044700545 
+168 759560.4 5912960.0 -0.182585512533 
+169 759496.9 5912934.0 -0.0899427716913 
+170 759463.8 5912906.0 -0.282814648778 
+171 759452.2 5912877.0 -0.341769155358 
+172 759442.1 5912839.0 -0.489139913808 
+173 759426.3 5912793.0 -0.225596570306 
+174 759409.4 5912769.0 -0.991890866953 
+175 759369.2 5912796.0 -1.28902202935 
+176 759321.1 5912831.0 -0.817929632674 
+177 759294.3 5912856.0 -1.11707011413 
+178 759269.9 5912879.0 -1.14018490757 
+179 759252.7 5912892.0 -1.44908186645 
+180 759242.1 5912879.0 -1.32265939268 
+181 759254.3 5912853.0 -1.38275117438 
+182 759290.6 5912825.0 -0.93069567139 
+183 759328.1 5912797.0 -1.04105172763 
+184 759352.9 5912777.0 -2.24698281885 
+185 759381.3 5912755.0 -1.32374395506 
+186 759381.4 5912717.0 -1.24705683131 
+187 759347.9 5912694.0 -1.21250919679 
+188 759336.6 5912672.0 -0.589476693786 
+189 759306.7 5912620.0 -0.368382537085 
+190 759260.9 5912576.0 -0.146959783628 
+191 759227.4 5912544.0 -0.450098193693 
+192 759191.9 5912522.0 -0.388313189066 
+193 759151.9 5912465.0 -0.496403883137 
+194 759112.6 5912446.0 -0.445102986969 
+195 759095.4 5912412.0 -0.475563963638 
+196 759059.8 5912378.0 -0.37349081838 
+197 759036.9 5912368.0 -0.453698693697 
+198 759011.5 5912327.0 -0.469527330016 
+199 758971.9 5912285.0 -0.471244737575 
+200 758940.6 5912247.0 -0.413412067175 
+201 758907.8 5912250.0 -0.32354834683 
+202 758868.7 5912214.0 -0.367068327359 
+203 758829.6 5912201.0 -0.318465278278 
+204 758812.3 5912178.0 -0.2629510714 
+205 758784.7 5912150.0 -0.280446955099 
+206 758762.4 5912134.0 -0.265954321969 
+207 758715.3 5912140.0 -0.311649563656 
+208 758649.9 5912122.0 -0.300039303411 
+209 758612.4 5912099.0 -0.268987106205 
+210 758573.8 5912070.0 -0.237347242748 
+211 758533.9 5912064.0 -0.219390086708 
+212 758483.9 5912059.0 -0.207883782632 
+213 758442.6 5912049.0 -0.210193006785 
+214 758388.3 5912057.0 -0.2237782443 
+215 758351.5 5912047.0 -0.220211660562 
+216 758301.5 5912036.0 -0.170493225374 
+217 758265.8 5912017.0 -0.0927155491112 
+218 758219.8 5912007.0 0.0665950182502 
+219 758176.5 5911973.0 0.00650388070029 
+220 758124.0 5911951.0 -0.0166417982108 
+221 758079.8 5911927.0 -0.0886730019271 
+222 758044.5 5911902.0 -0.0761150757338 
+223 758018.3 5911866.0 -0.00732674769168 
+224 757994.7 5911809.0 0.0520656451332 
+225 757972.8 5911763.0 0.0828254772779 
+226 757965.1 5911712.0 0.105813361908 
+227 757940.1 5911668.0 0.0976377252762 
+228 757935.4 5911635.0 0.0399996400809 
+229 757949.6 5911581.0 -0.0142419261735 
+230 757950.4 5911525.0 -0.0488999851731 
+231 757947.5 5911473.0 -0.0741824184894 
+232 757937.5 5911433.0 -0.0706420501714 
+233 757923.5 5911388.0 -0.0777885250112 
+234 757896.9 5911328.0 -0.0806319977021 
+235 757855.8 5911253.0 -0.0633259265677 
+236 757834.2 5911219.0 -0.0684471347927 
+237 757810.9 5911182.0 -0.0884413777088 
+238 757781.3 5911149.0 -0.0845328630913 
+239 757763.1 5911109.0 -0.0436404950811 
+240 757750.3 5911055.0 -0.0368265085099 
+241 757752.1 5911015.0 -0.0651400676143 
+242 757768.3 5910992.0 -0.0847453124576 
+243 757798.1 5910985.0 -0.137522749219 
+244 757850.6 5910987.0 -0.0888609970148 
+245 757885.3 5910987.0 -0.0902883442064 
+246 757931.7 5910977.0 -0.0770894720917 
+247 757966.1 5910930.0 -0.179037489338 
+248 757956.1 5910889.0 -0.191946080218 
+249 757951.6 5910860.0 -0.150767219178 
+250 757987.4 5910828.0 -0.143833070665 
+251 758030.8 5910795.0 -0.152448048088 
+252 758053.1 5910780.0 -0.156662247452 
+253 758083.1 5910774.0 -0.158598590033 
+254 758072.2 5910743.0 -0.16088166945 
+255 758068.3 5910706.0 -0.167478997871 
+256 758064.3 5910657.0 -0.179789654352 
+257 758058.4 5910621.0 -0.189389696387 
+258 758059.8 5910587.0 -0.195858425304 
+259 758060.1 5910536.0 -0.198364919105 
+260 758023.4 5910497.0 -0.198377500566 
+261 758005.5 5910511.0 -0.198378775479 
+262 758034.9 5910554.0 -0.198391610707 
+263 758006.9 5910564.0 -0.203649754237 
+264 757974.1 5910538.0 -0.214376052372 
+265 757933.7 5910548.0 -0.223268411847 
+266 757917.0 5910584.0 -0.245101777457 
+267 757904.9 5910572.0 -0.216196152561 
+268 757926.2 5910544.0 -0.311481855211 
+269 757945.8 5910525.0 -0.364529114825 
+270 757979.7 5910486.0 -0.378197712419 
+271 757948.6 5910460.0 -0.379900606674 
+272 757914.3 5910426.0 -0.378638404569 
+273 757865.2 5910391.0 -0.362264575803 
+274 757811.1 5910369.0 -0.329996723111 
+275 757766.6 5910340.0 -0.302395389225 
+276 757718.4 5910304.0 -0.283656918172 
+277 757684.1 5910270.0 -0.264846993563 
+278 757641.7 5910262.0 -0.24660206142 
+279 757587.9 5910260.0 -0.229868451452 
+280 757543.4 5910262.0 -0.225222220931 
+281 757489.6 5910273.0 -0.221837032631 
+282 757428.7 5910315.0 -0.224621383156 
+283 757379.1 5910361.0 -0.236496508518 
+284 757345.7 5910399.0 -0.249238226823 
+285 757317.4 5910433.0 -0.263049723235 
+286 757273.5 5910483.0 -0.28258219677 
+287 757250.6 5910515.0 -0.290326114188 
+288 757233.9 5910548.0 -0.294285795203 
+289 757217.8 5910575.0 -0.294054785725 
+290 757209.6 5910609.0 -0.290013830255 
+291 757196.3 5910662.0 -0.272064830695 
+292 757183.8 5910700.0 -0.255057694073 
+293 757178.7 5910764.0 -0.22838715962 
+294 757196.9 5910825.0 -0.201998086823 
+295 757227.5 5910865.0 -0.177003917585 
+296 757250.2 5910926.0 -0.149454536438 
+297 757267.0 5910972.0 -0.139159586214 
+298 757294.6 5911035.0 -0.132818310376 
+299 757325.2 5911082.0 -0.128786337435 
+300 757358.4 5911150.0 -0.117500505835 
+301 757377.0 5911203.0 -0.110280917097 
+302 757422.8 5911250.0 -0.106654958792 
+303 757448.7 5911284.0 -0.106247585559 
+304 757482.4 5911329.0 -0.102758107024 
+305 757523.1 5911380.0 -0.0939937396827 
+306 757578.2 5911416.0 -0.0816838330896 
+307 757639.1 5911443.0 -0.0687116300453 
+308 757664.8 5911454.0 -0.0650083713236 
+309 757710.8 5911490.0 -0.0732598747619 
+310 757708.0 5911521.0 -0.0808631123427 
+311 757685.7 5911581.0 -0.0737153804526 
+312 757645.0 5911622.0 -0.082336228402 
+313 757618.3 5911643.0 -0.0961828768184 
+314 757586.3 5911673.0 -0.0909342479872 
+315 757547.1 5911692.0 -0.0915832382959 
+316 757509.9 5911693.0 -0.109473005534 
+317 757471.9 5911685.0 -0.108790107021 
+318 757440.8 5911676.0 -0.146621802961 
+319 757401.5 5911661.0 -0.186087510064 
+320 757366.0 5911649.0 -0.185233821256 
+321 757324.2 5911630.0 -0.148917258334 
+322 757281.2 5911595.0 -0.172112255945 
+323 757238.5 5911562.0 -0.189380297494 
+324 757207.5 5911551.0 -0.194428261711 
+325 757177.3 5911546.0 -0.182414225486 
+326 757144.5 5911550.0 -0.178141305312 
+327 757082.9 5911576.0 -0.202831792705 
+328 757039.3 5911608.0 -0.182835844995 
+329 756980.0 5911640.0 -0.166020801633 
+330 756921.4 5911664.0 -0.189140042919 
+331 756888.5 5911666.0 -0.191399825189 
+332 756836.4 5911676.0 -0.175382000736 
+333 756787.3 5911671.0 -0.197894227856 
+334 756730.3 5911682.0 -0.181030536112 
+335 756702.6 5911693.0 -0.252142370778 
+336 756665.4 5911717.0 -0.238010928003 
+337 756641.6 5911695.0 -0.201486499152 
+338 756610.4 5911701.0 -0.189089271191 
+339 756610.0 5911740.0 -0.172127397733 
+340 756598.6 5911765.0 -0.147276755549 
+341 756557.1 5911778.0 -0.10272071726 
+342 756519.6 5911765.0 -0.075079862123 
+343 756445.7 5911774.0 -0.051524632646 
+344 756417.1 5911778.0 -0.0498106143453 
+345 756420.0 5911806.0 -0.0481907071368 
+346 756445.4 5911847.0 -0.033487875988 
+347 756451.1 5911894.0 0.0209913135198 
+348 756462.4 5911923.0 0.0858339483577 
+349 756463.8 5911972.0 0.269944592684 
+350 756458.3 5911993.0 0.200502180797 
+351 756416.3 5911997.0 -0.00282461852219 
+352 756378.1 5911987.0 0.0433053473914 
+353 756345.5 5911990.0 0.0661059516228 
+354 756306.4 5911997.0 -0.0450490367553 
+355 756298.8 5912022.0 -0.194444871704 
+356 756347.4 5912031.0 -0.383370557938 
+357 756381.6 5912035.0 -0.34603749111 
+358 756427.4 5912038.0 -0.198213574592 
+359 756472.7 5912037.0 -0.347630647261 
+360 756488.6 5912053.0 -0.377279742215 
+361 756465.7 5912099.0 -0.190585492832 
+362 756450.3 5912124.0 -0.251407926914 
+363 756444.8 5912165.0 -0.410097001167 
+364 756441.5 5912204.0 -0.23098260697 
+365 756451.7 5912241.0 -0.354144128828 
+366 756465.4 5912282.0 -0.272982227143 
+367 756484.4 5912330.0 -0.267704334103 
+368 756494.2 5912370.0 -0.238042822673 
+369 756506.4 5912400.0 -0.238363871584 
+370 756518.6 5912442.0 -0.234549789926 
+371 756529.0 5912470.0 -0.227188169515 
+372 756566.5 5912515.0 -0.365585959241 
+373 756550.5 5912577.0 -0.428308738133 
+374 756523.5 5912625.0 -0.401932218634 
+375 756492.3 5912676.0 -0.375142191801 
+376 756470.6 5912721.0 -0.324738467267 
+377 756442.3 5912767.0 -0.337717177755 
+378 756412.1 5912833.0 -0.318820281755 
+379 756397.2 5912869.0 -0.329840094373 
+380 756359.8 5912879.0 -0.279945992068 
+381 756346.4 5912935.0 -0.290664285638 
+382 756336.3 5912971.0 -0.338152784559 
+383 756327.6 5913025.0 -0.310785996394 
+384 756323.8 5913088.0 -0.278945850052 
+385 756329.5 5913148.0 -0.227974443954 
+386 756334.8 5913205.0 -0.287478521769 
+387 756345.8 5913272.0 -0.397374422381 
+388 756357.9 5913339.0 -0.256406070037 
+389 756366.3 5913373.0 -0.26606013011 
+390 756378.6 5913432.0 -0.257906223585 
+391 756408.6 5913485.0 -0.278297288287 
+392 756432.7 5913523.0 -0.244293601041 
+393 756470.8 5913548.0 -0.236800024882 
+394 756528.6 5913571.0 -0.224169290788 
+395 756571.5 5913582.0 -0.248652134255 
+396 756611.9 5913590.0 -0.214926889496 
+397 756636.9 5913591.0 -0.185595861354 
+398 756662.6 5913621.0 -0.10799572919 
+399 756640.1 5913642.0 -0.46512243594 
+400 756584.9 5913655.0 -0.626875851838 
+401 756537.7 5913658.0 -1.12733441072 
+402 756484.7 5913660.0 -1.05475933646 
+403 756448.5 5913655.0 -0.798866536189 
+404 756437.6 5913625.0 -0.730703555269 
+405 756404.8 5913650.0 -0.794734074091 
+406 756367.5 5913658.0 -0.866013109207 
+407 756323.8 5913660.0 -0.403909411886 
+408 756308.8 5913715.0 -0.285493906054 
+409 756289.3 5913751.0 -0.320955583839 
+410 756312.9 5913752.0 -0.356687556947 
+411 756306.9 5913786.0 -0.482225288017 
+412 756285.2 5913828.0 -0.401055450318 
+413 756264.3 5913865.0 -0.459329139616 
+414 756240.6 5913892.0 -0.497753193789 
+415 756203.3 5913923.0 -0.451671009366 
+416 756162.7 5913946.0 -0.798041388266 
+417 756116.1 5913963.0 -0.406464637888 
+418 756080.8 5913986.0 -0.357407119644 
+419 756057.4 5914024.0 -0.367160071554 
+420 756046.0 5914051.0 -0.401280639217 
+421 756030.9 5914077.0 -0.429660393693 
+422 756019.9 5914113.0 -0.470035184559 
+423 756000.5 5914149.0 -0.256344955779 
+424 755991.1 5914167.0 -0.204405949773 
+425 755997.3 5914199.0 -0.228486486622 
+426 755995.1 5914233.0 -0.12905270068 
+427 755984.7 5914263.0 -0.0289429060115 
+428 755986.8 5914291.0 -0.0873751677817 
+429 755978.8 5914334.0 -0.231738400088 
+430 755963.8 5914373.0 -0.431053885962 
+431 755990.4 5914386.0 -0.187463388906 
+432 755996.9 5914351.0 -0.139995906469 
+433 756005.1 5914317.0 -0.123050125679 
+434 756016.6 5914291.0 -0.0305050799664 
+435 756019.6 5914262.0 0.00104630739646 
+436 756019.2 5914239.0 -0.0997018391172 
+437 756027.7 5914210.0 -0.155395376082 
+438 756031.4 5914183.0 -0.176385706192 
+439 756054.8 5914123.0 -0.242504511431 
+440 756081.4 5914068.0 -0.154206838543 
+441 756105.8 5914029.0 -0.25049900953 
+442 756123.6 5914005.0 -0.232956602053 
+443 756150.0 5913988.0 -0.371376652148 
+444 756186.3 5913988.0 -0.333605011533 
+445 756191.9 5913971.0 -0.379559620997 
+446 756226.1 5913950.0 -0.620730862273 
+447 756259.5 5913927.0 -0.827053548604 
+448 756276.4 5913906.0 -1.01798477029 
+449 756309.1 5913863.0 -0.655778035952 
+450 756330.8 5913824.0 -0.789993729089 
+451 756342.5 5913797.0 -0.812822830178 
+452 756357.7 5913759.0 -0.429622817869 
+453 756394.8 5913693.0 -0.666785830703 
+454 756442.5 5913692.0 -0.603228376585 
+455 756482.9 5913705.0 -0.34317514379 
+456 756575.4 5913715.0 -0.178847501359 
+457 756579.3 5913763.0 -0.107630540731 
+458 756595.8 5913793.0 -0.0989747419325 
+459 756649.6 5913787.0 -0.092178325626 
+460 756627.0 5913761.0 -0.0917228728646 
+461 756673.0 5913784.0 -0.111280876557 
+462 756744.0 5913796.0 0.00822202082485 
+463 756774.0 5913763.0 -0.315846365549 
+464 756795.8 5913741.0 -0.336311722984 
+465 756828.8 5913718.0 -0.541637774323 
+466 756881.3 5913682.0 -0.654415555337 
+467 756908.8 5913687.0 -0.626226168801 
+468 760330.75 5912238.5 -9.5014159576 
+469 760691.725 5912194.75 -13.3515345269 
+470 759862.94023 5912295.19832 -3.54482183307 
+471 760872.2125 5912172.875 -8.04353716101 
+472 756925.183541 5911997.84175 -4.92786692085 
+473 756786.475587 5911863.83716 -0.428926066733 
+474 756882.162363 5913048.63706 -5.89688953472 
+475 756733.464948 5912290.17959 -4.70916657954 
+476 757464.947063 5910644.19821 -0.805942593034 
+477 757544.862909 5912301.20022 -0.457473278829 
+478 757709.523059 5911977.16652 -0.284271161716 
+479 756662.996678 5913281.66082 -3.53816307628 
+480 756928.263149 5913501.82768 -5.09810114772 
+481 757383.956356 5913038.21571 -7.8949502549 
+482 757744.549056 5910745.78762 -0.404916975873 
+483 758296.73209 5912321.25791 -0.614623416926 
+484 758879.531365 5912529.5042 -0.839751803972 
+485 759590.351325 5913181.86363 -0.517520476307 
+486 757576.161903 5912697.29765 -0.564051196914 
+487 757219.212571 5911916.45234 -3.99720696309 
+488 756643.066923 5912949.67812 -4.26001830235 
+489 756951.525884 5912647.42603 -4.33249042633 
+490 757934.626395 5912247.06222 -0.434646206463 
+491 757827.857701 5910661.78474 -0.266791175834 
+492 757591.65831 5910884.78803 -0.484229171465 
+493 759826.659501 5913329.41749 -0.404662683464 
+494 757817.74741 5912538.93426 -0.444383578207 
+495 757711.585662 5911309.16941 -0.0802825402007 
+496 757529.47036 5913203.51898 -6.63625292172 
+497 757281.504651 5913249.30901 -7.03801049413 
+498 759387.986961 5913019.58861 -1.30407526081 
+499 760336.956114 5913024.48646 -0.707567411046 
+500 757574.936492 5910467.62445 -0.907430345359 
+501 757752.336593 5911785.94438 -0.0697037612296 
+502 757533.767022 5911888.43323 -0.197464898269 
+503 756630.631967 5913434.70083 -0.963504026916 
+504 757033.270585 5913286.74144 -6.4184388958 
+505 758516.28267 5912297.78369 -0.610620898017 
+506 758672.71238 5912475.49042 -0.708885260117 
+507 759610.977909 5913371.22125 -2.24900913488 
+508 760005.163571 5913191.20809 -0.770509018083 
+509 756626.477969 5911926.73544 -0.200259751159 
+510 756646.029381 5912410.60052 -0.757955330451 
+511 757582.793472 5911154.98747 -0.445400335729 
+512 757177.284394 5911685.33489 -3.27597179397 
+513 757829.310056 5911516.33059 -0.075790226363 
+514 757008.363892 5913629.89368 -3.8058034108 
+515 758156.005707 5912589.73444 -0.557713276415 
+516 758209.263346 5912166.26861 -0.4942450476 
+517 758722.984412 5912263.18716 -0.494041117756 
+518 759006.009726 5912469.95923 -1.47982563823 
+519 759120.462502 5912676.91619 -1.6224346126 
+520 759252.549281 5912729.07355 -1.19800920547 
+521 760276.353834 5912503.25454 -3.46917713939 
+522 759310.880095 5912951.09828 -1.33761776248 
+523 756913.404012 5911804.06849 -4.1782812294 
+524 757335.646011 5910728.89342 -0.335783886781 
+525 757887.963417 5911988.38996 -0.28684918196 
+526 756512.068108 5913318.94906 -0.797823270584 
+527 757547.305324 5913007.01184 -7.75040872795 
+528 757755.133833 5910869.01832 -0.428729550214 
+529 758887.148645 5912642.23995 -0.191747208966 
+530 759492.082943 5913221.58044 -2.39181377476 
+531 757333.068353 5911804.9332 -3.36509459839 
+532 756492.113252 5912995.29747 -2.33086187925 
+533 756733.564801 5912711.5677 -3.39540614079 
+534 757676.321491 5910944.42035 -0.515218496174 
+535 759877.28924 5913459.49697 -0.670136084073 
+536 759785.130665 5913156.83148 -0.342728171712 
+537 757908.173588 5912651.96699 -0.342104991802 
+538 759404.297609 5913113.61276 -3.12561617362 
+539 757810.219553 5911669.66343 -0.0835703640495 
+540 756764.610076 5913507.6032 -2.64293584946 
+541 758478.968668 5912428.78684 -1.4664172304 
+542 759683.376153 5913479.28672 -1.72656334368 
+543 760195.088791 5913282.39339 -2.60847338011 
+544 757319.988067 5910617.63418 -0.322788960246 
+545 757858.157456 5910889.34884 -0.322474620822 
+546 760511.2375 5912216.625 -11.3480552601 
+547 756751.246801 5911775.12467 -1.45939272002 
+548 756601.641751 5912213.68641 -2.52608579564 
+549 756911.562485 5913593.68133 -2.62046783234 
+550 757032.104 5913490.66993 -5.04598947862 
+551 758309.970429 5912476.99108 -0.852752634785 
+552 757678.733747 5912798.26681 -0.314109848824 
+553 757869.620477 5910619.67394 -0.416089012452 
+554 757419.116635 5910890.37653 -0.240405431876 
+555 757559.229138 5913299.86024 -4.10036642636 
+556 757438.781542 5910505.25449 -0.226912085088 
+557 759521.241844 5913413.90959 -0.551748179781 
+558 758336.77756 5912173.89058 -0.452655925358 
+559 759126.250743 5912776.40386 -6.49395048779 
+560 758023.880358 5912082.68617 -0.391646215479 
+561 756545.566799 5911873.89207 -0.0707242805464 
+562 756529.394766 5912155.47918 -2.19439065659 
+563 756529.898973 5911996.05883 -0.0351072651418 
+564 756712.247989 5913696.74785 -0.237791591744 
+565 757831.370291 5910493.96329 -0.372070532924 
+566 760452.59107 5912911.17726 -2.70765745321 
+567 760376.896544 5913151.33439 -0.259122385591 
+568 757691.536535 5911708.64145 -0.214438379291 
+569 757468.104592 5911797.27819 -0.301101641828 
+570 756627.495926 5913513.10186 -0.398830845777 
+571 757147.859383 5913339.3446 -6.49939929788 
+572 757834.009031 5912733.38166 -0.313827446911 
+573 760328.409703 5913315.82135 0.00330720261622 
+574 759084.085687 5912555.12408 -0.789068419192 
+575 756578.435061 5912819.04733 -1.40987689663 
+576 757681.514207 5911379.42726 -0.0652933585836 
+577 759327.714841 5913052.3452 -2.69512116902 
+578 758667.209056 5912597.4913 -0.538694363577 
+579 756580.223396 5912352.49782 -0.412229157103 
+580 759010.437151 5912673.84049 -0.530711058501 
+581 756487.673194 5913162.03907 -1.16455416566 
+582 756500.080294 5912890.49754 -1.34460451703 
+583 759700.931969 5913088.22122 -0.665698717248 
+584 759783.727781 5913514.77766 -2.59743457248 
+585 758004.212692 5910731.3972 -0.15844193066 
+586 758769.657049 5912715.17646 -0.076580634667 
+587 760139.534654 5912959.94262 -2.04168756891 
+588 757472.399167 5913273.07606 -4.60304223474 
+589 757324.899104 5913320.4277 -5.17982790736 
+590 757869.432251 5911840.42519 -0.0726897274602 
+591 758497.171214 5912178.78786 -0.371243790054 
+592 758817.489828 5912302.72406 -0.54533935088 
+593 759385.022562 5912920.69098 -1.07877965874 
+594 760014.714925 5913394.60297 -0.668665032901 
+595 759894.797223 5913102.97366 -0.706328205691 
+596 757098.942245 5913432.47257 -5.52481032472 
+597 756509.318615 5913447.76543 -0.451644209526 
+598 759735.870115 5912310.59916 -2.55676776247 
+599 757614.330727 5913191.3633 -4.40333111003 
+600 760427.811695 5913021.45794 -1.16387818282 
+601 757570.239405 5910363.11425 -0.28454493601 
+602 758580.439194 5912530.61774 -1.42377061979 
+603 757682.583086 5911169.7757 -0.13738718165 
+604 757181.279488 5911615.66789 -0.850028351316 
+605 760360.859576 5912639.98705 -1.6422201496 
+606 759488.598262 5913332.96107 -0.885408171707 
+607 759580.236971 5913476.66396 -0.586034264045 
+608 757893.649009 5910490.81161 -0.394713709941 
+609 757610.871516 5911773.63281 -0.196078818288 
+610 757896.589059 5910762.43089 -0.141162311472 
+611 757982.011433 5910652.00271 -0.185065004016 
+612 757240.182008 5913337.57265 -6.19500649677 
+613 756657.790381 5911776.89161 -0.166619407072 
+614 756584.11292 5912433.59806 -0.397737948284 
+615 757508.289034 5911211.74232 -0.128358689645 
+616 758158.157305 5912668.69809 -0.381588421798 
+617 758772.642188 5912225.83588 -0.489365056904 
+618 759027.47509 5912420.80354 -0.786408090967 
+619 758903.315116 5912395.84982 -0.743718611747 
+620 760217.260743 5912625.87271 -1.4366587941 
+621 756909.117862 5911733.56134 -0.641037936085 
+622 756436.120516 5913337.71258 -0.432320130781 
+623 757358.764335 5911728.91593 -0.950392962513 
+624 756415.657093 5912973.84727 -0.652230133956 
+625 756689.439982 5912579.79096 -1.93758660198 
+626 757666.273634 5911031.17831 -0.227652306881 
+627 760684.846849 5912400.19088 -8.06619393739 
+628 758009.052014 5911989.47436 -0.155696993232 
+629 757728.923986 5910446.45544 -0.219116190211 
+630 759787.377662 5913067.17627 -0.733549986523 
+631 759203.059123 5912864.89616 -6.40792904224 
+632 759165.734597 5912603.86349 -1.51577681086 
+633 759298.074106 5912705.69035 -1.01098909834 
+634 757612.38971 5913071.96155 -4.22513029789 
+635 757769.385151 5910929.68821 -0.348142285475 
+636 759442.578259 5913241.58858 -1.26012455303 
+637 760365.697266 5912911.94975 -1.74529689337 
+638 759288.696954 5913016.45263 -2.40749706046 
+639 758586.045763 5912184.03952 -0.403139779369 
+640 757051.296632 5913704.49806 -1.90587055338 
+641 757781.776803 5911276.16532 -0.0892021906153 
+642 757472.829764 5911052.02664 -0.236239259054 
+643 757768.353236 5911510.82481 -0.109816007041 
+644 758247.063301 5912095.24448 -0.22232669216 
+645 759285.663969 5912917.73541 -1.66168773708 
+646 757261.608274 5910704.53891 -0.262628401002 
+647 758890.990536 5912699.09993 -0.374720435275 
+648 759902.815346 5913525.07943 -2.77387662074 
+649 759370.776021 5913148.12027 -1.23750564259 
+650 757875.052168 5911660.42969 0.0304196581752 
+651 756706.200586 5913557.64067 -0.314533665751 
+652 759665.672347 5913542.4303 -0.574599140233 
+653 757321.712226 5910541.69578 -0.293387155464 
+654 758132.803029 5912073.22129 -0.377738555727 
+655 757530.36064 5911761.7158 -0.303788914385 
+656 757439.103969 5911740.09462 -0.30225041831 
+657 757042.323998 5911760.84755 -0.593942134833 
+658 758744.622887 5912182.31716 -0.390520279247 
+659 759224.511148 5912904.16322 -2.64065081281 
+660 756987.758156 5913672.9784 -2.78200127272 
+661 757719.049088 5910974.51544 -0.22788992895 
+662 757953.790129 5912708.98766 -0.36862340754 
+663 758469.565129 5912496.86847 -0.78894695013 
+664 757509.137203 5913324.06427 -2.12990495812 
+665 760247.543149 5913379.03046 -0.0937557306728 
+666 756601.451589 5912707.73156 -1.19319994325 
+667 757808.847069 5911402.69266 -0.0827701183218 
+668 757648.990439 5910339.72068 -0.28867563515 
+669 757271.951041 5910588.98988 -0.300208103259 
+670 756528.627412 5912238.08389 -0.563078674907 
+671 757890.720762 5910598.39781 -0.35005057042 
+672 757832.912708 5910562.16852 -1.06822602904 
+673 757921.683304 5910650.20548 -0.191781823427 
+674 757337.210513 5910920.29007 -0.129790053891 
+675 759117.370781 5912825.95404 -5.11121192219 
+676 758446.351935 5912123.78901 -0.227839675522 
+677 759989.573818 5913476.59648 -1.96089258782 
+678 760601.399093 5912460.24752 -6.27822337005 
+679 758027.644219 5912603.14744 -0.49569381726 
+680 757634.55524 5913312.15344 -1.7323104417 
+681 758249.041618 5912694.8422 -0.236789829138 
+682 757278.356051 5910794.39062 -0.197898332555 
+683 757633.391204 5912972.80399 -0.316472200388 
+684 757073.002045 5913524.07 -3.83008250365 
+685 759472.004189 5913423.92691 -0.200476070421 
+686 758353.716168 5912111.5565 -0.276319697561 
+687 760440.25829 5913111.88217 -0.772822423404 
+688 760057.253648 5913057.50648 -0.881715369723 
+689 759964.704162 5913054.22409 -0.868058896039 
+690 757387.083809 5911008.24841 -0.128426399919 
+691 757883.299215 5911750.43159 0.0190302934298 
+692 757878.954049 5911468.88649 -0.0831618902732 
+693 757043.771827 5913581.40204 -3.67888892943 
+694 757907.102298 5910881.75395 -0.277726617673 
+695 756903.116992 5913640.13155 -1.88333489339 
+696 756798.964951 5913612.47803 -0.383325815269 
+697 756494.242018 5911991.19315 0.177470713674 
+698 756775.989128 5913677.40179 -0.312827158409 
+699 758544.287059 5912130.59356 -0.227468835186 
+700 757583.719408 5911289.88324 -0.109351258743 
+701 757975.256947 5911924.85967 -0.16581344312 
+702 757743.449978 5911212.72547 -0.125012310878 
+703 757536.534878 5912854.48365 -1.66124402976 
+704 757261.512544 5912701.56172 -7.75967455671 
+705 756519.691249 5911937.77921 0.0224736048839 
+706 760096.845115 5912266.84916 -7.30773280743 
+707 759437.561591 5912970.58201 -0.787399693986 
+708 756733.413734 5911730.21777 -0.731930182405 
+709 758369.581883 5912529.03027 -0.631734902396 
+710 757730.655244 5912849.37704 -0.240727023354 
+711 757383.81822 5910459.50561 -0.253772652888 
+712 756652.872286 5912076.15874 -1.03601620468 
+713 756625.907587 5913552.81032 -0.281526118007 
+714 760334.525947 5913385.18722 -0.0153307260718 
+715 758707.255712 5912703.53177 -0.262510003837 
+716 758071.455971 5912401.51095 -0.533930416148 
+717 760472.212963 5912716.11296 -1.39921955975 
+718 760442.635002 5913319.72155 -0.282541819288 
+719 756499.974783 5911891.65724 -0.00424404816089 
+720 760463.531965 5912970.02046 -2.21212494856 
+721 757869.609115 5912781.04818 -0.300424803815 
+722 757446.542632 5911148.8307 -0.109478939864 
+723 758666.905364 5912204.85211 -0.494034449834 
+724 760435.890246 5912459.18132 -4.40351486615 
+725 758289.908771 5912623.23375 -0.360155828024 
+726 760989.164942 5912158.70042 -3.05125347713 
+727 760458.931089 5912837.81579 -2.00419504064 
+728 756596.611265 5911831.39173 -0.129229502744 
+729 756680.893792 5913663.15406 -0.379710084904 
+730 756753.144952 5913720.53363 -0.342660245794 
+731 757187.427941 5913389.56623 -5.21734773494 
+732 756412.597065 5913109.83503 -0.580149852387 
+733 757297.524418 5913365.64538 -3.41920884975 
+734 759343.938277 5912882.34743 -1.03711432915 
+735 759532.688038 5913490.83077 -0.241086566711 
+736 759312.027176 5912751.6937 -1.25291593065 
+737 757686.253884 5910604.66271 -1.58857691532 
+738 759576.785175 5913070.74153 -0.655258764855 
+739 757105.231281 5911652.12887 -0.629944649189 
+740 757867.95 5910939.22473 -0.262942798343 
+741 756492.603115 5912132.81552 -0.749654304739 
+742 756544.219052 5912090.2186 -0.358023276123 
+743 760495.580136 5912903.61711 -3.87445675966 
+744 757660.672777 5911669.40039 -0.116102788344 
+745 757734.998468 5911642.69994 -0.127764334267 
+746 756502.664646 5912023.12295 -0.157416435307 
+747 757467.104165 5910406.15058 -0.226505313814 
+748 757255.548674 5911670.42877 -1.12629379698 
+749 756520.750513 5911822.26775 -0.0693288574422 
+750 756564.720283 5913519.2859 -0.358959997278 
+751 759782.29389 5913568.83533 -0.593436350114 
+752 758969.938806 5912381.11547 -0.679718092575 
+753 759244.296059 5912656.99753 -1.29161767716 
+754 758754.153139 5912625.23861 -0.128196467649 
+755 757058.99055 5913634.9075 -3.24657556347 
+756 759235.647292 5912791.28792 -1.33262700223 
+757 757666.220505 5911415.15891 -0.0645841680832 
+758 757736.395742 5911424.05621 -0.0598964912896 
+759 757621.822655 5911375.01714 -0.0771377466137 
+760 758638.051424 5912652.33542 -0.348608748646 
+761 759702.312836 5913032.98657 -0.651219777206 
+762 757409.001842 5913162.86708 -7.44115205369 
+763 759451.547567 5913368.72085 -0.487545925831 
+764 759432.771495 5913174.80877 -2.95162012533 
+765 759174.506403 5912813.97815 -6.33828563744 
+766 756726.521765 5913618.30613 -0.122927775964 
+767 756805.524709 5911735.61436 -0.455475251445 
+768 756515.274232 5912780.18969 -0.509302224683 
+769 756538.8541 5912369.32133 -0.265789221396 
+770 756450.667573 5912870.04616 -0.582358766646 
+771 760242.444581 5912979.37038 -1.06676411126 
+772 760229.503527 5913128.03187 -0.948340856361 
+773 757654.468487 5913029.93977 -0.662069818325 
+774 759055.383639 5912766.68861 -0.737460812822 
+775 759297.01478 5913069.03001 -0.919493843185 
+776 759335.391667 5913103.05702 -1.22792415142 
+777 758987.550104 5912724.99977 -0.743070697026 
+778 756422.877419 5913224.94251 -0.517614822596 
+779 759400.167701 5912870.4874 -0.827877294542 
+780 756596.392762 5912634.40843 -0.587025458798 
+781 757873.174778 5910824.61854 -0.226011601565 
+782 758623.372463 5912302.82413 -0.644785705674 
+783 759494.66946 5913108.78597 -0.769718736639 
+784 756490.276595 5912188.48763 -0.862749706533 
+785 759109.10474 5912503.37414 -1.21357278873 
+786 758023.826629 5910760.55659 -0.155777495382 
+787 757970.447926 5910775.28524 -0.144172241746 
+788 758765.753665 5912755.90176 -0.108451379873 
+789 757461.951557 5913317.73959 -1.72654693574 
+790 757392.618896 5913277.96772 -5.41866560436 
+791 757928.904852 5911812.11106 0.00889614846516 
+792 759422.951795 5912905.51928 -0.65823157088 
+793 756635.042179 5913701.66427 -0.252547487413 
+794 757792.198893 5911587.01174 -0.122031262623 
+795 757234.38365 5911772.21781 -3.8999367746 
+796 756539.3509 5912311.26733 -0.351183072863 
+797 758833.987156 5912253.10517 -0.530661630449 
+798 760122.20941 5913414.20466 -3.29542712792 
+799 756831.360338 5912453.21294 -2.5748563802 
+800 757156.887257 5912386.08112 -5.28792895181 
+801 757692.973003 5911097.10566 -0.0769273233626 
+802 758073.547686 5911991.21551 -0.304907515792 
+803 757752.481683 5910529.86736 -0.904459653946 
+804 759984.583261 5912438.44073 -2.86378246011 
+805 756547.970833 5912041.47921 -0.143910271474 
+806 756601.500927 5911993.87526 -0.168813961119 
+807 756697.245333 5911991.27781 -0.377671135032 
+808 756808.084206 5912103.25972 -4.24928703997 
+809 757010.398394 5912210.24579 -6.58889321846 
+810 757883.469654 5910533.59602 -0.47259957587 
+811 757646.412948 5912883.02858 -0.338934361012 
+812 758814.442649 5912740.01872 -0.228907879982 
+813 758823.526062 5912670.85231 -0.139738380356 
+814 756389.662824 5912915.74896 -0.366526602315 
+815 757887.603848 5911552.10863 -0.0643048786725 
+816 760153.075958 5912923.1349 -2.53005900822 
+817 760202.46935 5912943.76903 -3.00390194735 
+818 757347.078596 5913356.77742 -2.25434123243 
+819 759893.570357 5913040.52618 -0.796367698542 
+820 757130.855058 5913464.63087 -4.06622962592 
+821 756462.948638 5913477.17376 -0.324872900322 
+822 756451.050358 5913407.15158 -0.383833663395 
+823 759065.588827 5912448.43153 -0.810043217744 
+824 758067.985613 5912682.3369 -0.412279873146 
+825 756606.570858 5912285.50508 -0.660424755641 
+826 758021.629523 5910602.4571 -0.195816880596 
+827 757968.644674 5910600.70158 -0.209375834957 
+828 757585.076324 5913347.76223 -1.04346490957 
+829 757001.924424 5913388.5297 -6.10743305819 
+830 756848.116589 5913285.44315 -5.04387791103 
+831 757567.835756 5910309.63306 -0.226640518444 
+832 757506.300079 5910339.19332 -0.215947257853 
+833 758533.236529 5912558.8183 -0.716936349578 
+834 758590.167866 5912600.50644 -0.566079987076 
+835 760370.537445 5912721.64406 -0.95257407786 
+836 757587.764172 5911725.95871 -0.201182037072 
+837 757324.19087 5911685.50009 -0.423866573287 
+838 757868.576904 5910569.49653 -0.648458575376 
+839 760461.949502 5913157.61211 -0.749185502737 
+840 756856.01407 5913607.5745 -1.58080131009 
+841 756868.213143 5913538.35457 -4.14985869167 
+842 756843.822096 5913430.63143 -4.28759105785 
+843 758400.158122 5912452.59164 -1.34752951738 
+844 758408.935208 5912339.28848 -0.616433542829 
+845 756530.573358 5912722.18837 -0.519192302294 
+846 758940.546562 5912716.76 -0.546974362702 
+847 760457.435832 5913218.34107 -0.612371444447 
+848 759269.972955 5912967.77024 -3.69423655618 
+849 757657.80661 5913185.13567 -1.12199488847 
+850 757644.680511 5913248.3699 -2.33069687641 
+851 757627.929029 5913131.42559 -3.49903449434 
+852 757544.930039 5913121.35272 -6.89140278712 
+853 760474.323383 5913019.90755 -1.90294750058 
+854 757729.623265 5911148.37241 -0.0905467737813 
+855 757211.077357 5911590.10017 -0.320295871431 
+856 757224.064954 5911635.38436 -0.629855917285 
+857 756639.628963 5912488.21647 -0.730257059103 
+858 756732.961803 5912456.84107 -1.33169871947 
+859 759841.24537 5913543.35118 -1.80203084797 
+860 759641.727323 5913059.10652 -0.709187247087 
+861 760184.462246 5913004.23235 -2.51491193352 
+862 757390.64176 5913331.22163 -2.10532402619 
+863 757294.502263 5911744.61602 -2.40604775661 
+864 760240.151033 5913054.06473 -0.56345993966 
+865 757145.97474 5913192.34044 -7.22435890599 
+866 757915.890005 5910513.75495 -0.383632468446 
+867 758023.722598 5910645.16671 -0.184736612575 
+868 757250.578196 5913380.65908 -2.52051490071 
+869 759444.284468 5913289.31615 -0.758333545537 
+870 757482.552692 5911728.64971 -0.257290821771 
+871 757757.984942 5912769.6856 -0.259761229519 
+872 757744.164721 5912642.99166 -0.346229863539 
+873 757627.165292 5912482.21203 -0.691745185415 
+874 757381.713461 5912484.59746 -7.98971156158 
+875 757818.970925 5910768.70855 -0.2326212501 
+876 760781.96875 5912183.8125 -13.8462960039 
+877 757406.797363 5911910.6672 -1.01593757259 
+878 757504.639019 5912095.74887 -0.738109194121 
+879 757165.003656 5911581.64998 -0.325306167085 
+880 757135.088898 5911616.86519 -0.661100032813 
+881 758186.587736 5912701.97049 -0.283358808903 
+882 758212.417227 5912651.1171 -0.363057562724 
+883 756397.158096 5913347.33859 -0.301460404942 
+884 756403.182412 5913288.0572 -0.373880561388 
+885 760721.463744 5912451.68339 -5.592983295 
+886 760756.523004 5912371.13827 -7.47790814361 
+887 760689.592135 5912308.95505 -11.2537192075 
+888 759788.521373 5913021.54222 -0.743420322607 
+889 759838.409283 5913045.6239 -0.810277267035 
+890 756975.949917 5913569.05242 -3.86684091849 
+891 756954.8189 5913625.53901 -3.3846642757 
+892 756667.296106 5913534.57987 -0.443122297348 
+893 756673.388881 5913475.67434 -1.09973162848 
+894 756728.430787 5913375.44097 -3.64951393054 
+895 759727.447324 5913540.33266 -0.72209944085 
+896 757942.254474 5910718.66263 -0.146615941696 
+897 756596.807018 5912069.75254 -0.4178586454 
+898 756617.050893 5912141.12068 -3.20599152474 
+899 756719.074349 5912155.02127 -4.6692219848 
+900 758826.058093 5912591.44063 -1.1633991334 
+901 758777.87386 5912495.78894 -0.635508803203 
+902 756407.997541 5913391.75741 -0.295905674705 
+903 756629.584648 5911764.0298 -0.163345869571 
+904 756627.947026 5911804.97932 -0.151693421165 
+905 756700.584004 5911852.25831 -0.181009622281 
+906 756645.445029 5911857.53363 -0.172127940626 
+907 756552.331601 5912445.40255 -0.263646241263 
+908 756581.657944 5912475.6733 -0.397313402195 
+909 756555.625063 5912405.58477 -0.283261144388 
+910 757470.027486 5911240.88862 -0.106240444765 
+911 757524.000026 5911272.0537 -0.105405933183 
+912 760253.094888 5912703.09119 -2.26449871064 
+913 757711.091798 5911033.19513 -0.0300662027737 
+914 758037.072343 5911949.90965 -0.248261105437 
+915 759412.010436 5913215.8373 -0.744744117832 
+916 757398.284908 5910581.42311 -0.438393644945 
+917 758087.908675 5912188.05134 -0.456535923754 
+918 758416.170904 5912202.65456 -0.483220315054 
+919 760122.913943 5912504.85599 -4.26773100307 
+920 758730.830836 5912377.14882 -0.591673693718 
+921 758798.16492 5912206.63834 -0.392091531256 
+922 756906.913966 5911697.30723 -0.309775264082 
+923 756976.856643 5911711.24944 -0.351840180795 
+924 756862.117202 5911718.22448 -0.397829909265 
+925 757371.977581 5911689.82674 -0.300864793363 
+926 756620.300371 5912561.94848 -0.783077702482 
+927 757274.950949 5910548.04866 -0.294826106325 
+928 757918.100618 5910617.19053 -0.238919366252 
+929 759502.836187 5913010.04527 -0.685891278211 
+930 756455.067279 5912929.33491 -1.03310394807 
+931 756388.740794 5913171.23805 -0.410668070518 
+932 760307.571963 5913101.51983 -0.312294342955 
+933 756851.073481 5911783.06491 -2.79856047197 
+934 756860.833866 5911857.08814 -1.40853450621 
+935 756955.855873 5911898.7325 -5.2619704648 
+936 757081.853079 5911992.02698 -6.60134958589 
+937 757264.446079 5912161.28091 -7.19082934072 
+938 756832.257 5911955.23938 -0.708244481836 
+939 760294.876185 5913192.33312 -0.146541957169 
+940 757816.930838 5910432.17985 -0.359167359034 
+941 759672.335058 5912318.29958 -2.50746562309 
+942 756376.323405 5912962.81198 -0.365788112524 
+943 756382.173718 5913017.57667 -0.459480569709 
+944 757760.641239 5910397.78586 -0.304224339368 
+945 757694.203599 5910389.15904 -0.301679775644 
+946 757651.537348 5910454.18198 -0.839806932428 
+947 757626.958987 5910539.0973 -0.998427020967 
+948 757578.785368 5910642.25846 -0.824165041146 
+949 757523.971379 5910766.77428 -0.494469405714 
+950 757528.621341 5910556.00464 -1.41142295387 
+951 756709.757838 5913748.08111 -0.176872379084 
+952 760256.821759 5912922.98295 -1.95190422826 
+953 760306.950909 5912965.79104 -0.936094747072 
+954 757146.282585 5913417.40736 -5.34864246734 
+955 757107.540159 5913377.57749 -6.13638849031 
+956 757088.629642 5913317.2589 -6.58512559901 
+957 757093.095803 5913243.68748 -6.89906503791 
+958 757017.937847 5913113.38545 -6.02619771744 
+959 757050.161681 5912871.0802 -6.02285852938 
+960 757169.871616 5913010.29559 -6.5000859119 
+961 757016.85346 5913200.83742 -6.51438042098 
+962 756914.368795 5913155.83392 -5.88573577095 
+963 756752.311455 5913146.08623 -5.31190195966 
+964 758529.501473 5912498.96184 -1.28716510504 
+965 758595.053575 5912450.29158 -0.774912052388 
+966 759642.79752 5913131.68385 -0.655656164624 
+967 759696.916625 5913240.74466 -0.479683333868 
+968 760118.786085 5913025.9222 -1.63713407073 
+969 760130.442954 5913124.36292 -1.57644859724 
+970 759833.993792 5913106.36135 -0.68668070351 
+971 759869.107827 5913189.24604 -0.468645206417 
+972 756670.017709 5911819.78145 -0.175698269873 
+973 759691.75 5912411.5 -2.46629301019 
+974 759808.422 5912377.29529 -2.55890917091 
+975 756441.592093 5913028.38929 -1.02359494184 
+976 756510.991578 5913079.23008 -2.07154584746 
+977 756620.025982 5913154.62098 -3.97241058872 
+978 756940.8774 5913259.87796 -5.11533626986 
+979 759598.867481 5913528.75894 -0.447894042779 
+980 757589.137202 5910978.28395 -0.669833379577 
+981 759213.843091 5912591.72755 -1.17863521534 
+982 756494.70857 5912833.55729 -0.658694437114 
+983 756668.768349 5912666.25106 -2.53963830843 
+984 758872.658848 5912293.51473 -0.578495849904 
+985 758854.520587 5912354.70772 -0.667107565749 
+986 758830.317026 5912432.91935 -0.639407733365 
+987 756708.690181 5913509.09352 -1.03527188886 
+988 756734.987443 5913445.96093 -2.76730135212 
+989 756812.584364 5912213.41031 -5.50647365254 
+990 756849.991331 5912331.11781 -5.91973476139 
+991 756993.257955 5912415.4485 -5.42644435417 
+992 756596.653421 5912392.35323 -0.455690319983 
+993 756639.920729 5912351.20242 -0.503641717937 
+994 756720.752672 5912372.90262 -3.12084377461 
+995 757437.669328 5911200.11893 -0.105237845403 
+996 756704.720742 5911786.70023 -0.358771939158 
+997 756581.716846 5913019.233 -3.37690531209 
+998 756689.478601 5913052.449 -4.46383597391 
+999 756783.791667 5912947.99162 -4.4958297186 
+1000 757659.261745 5913078.88583 -1.16961032593 
+1001 760369.971996 5912867.38569 -2.69973399602 
+1002 760320.519666 5912885.12912 -2.31724734622 
+1003 760419.723309 5912873.35485 -2.30460744721 
+1004 757400.281672 5911795.72894 -0.537325461578 
+1005 757942.087957 5912753.83898 -0.306449389309 
+1006 757893.067036 5912717.09665 -0.287384460012 
+1007 759186.305006 5912744.47984 -1.37842327274 
+1008 757618.38986 5911088.94042 -0.396684064332 
+1009 756671.597464 5912244.96365 -2.92705012763 
+1010 760452.515656 5913064.12625 -1.25286724078 
+1011 760387.970626 5913073.01066 -0.764804823147 
+1012 760185.961983 5912690.81763 -1.77170962857 
+1013 760113.859825 5912616.05527 -2.04108040346 
+1014 758169.045389 5912291.14204 -0.471414755385 
+1015 757102.733395 5912554.88531 -4.9661745748 
+1016 757776.735939 5910960.98157 -0.261846789263 
+1017 757818.651204 5910934.62568 -0.299254057641 
+1018 758610.06393 5912144.87946 -0.345914378069 
+1019 757252.044391 5910647.81991 -0.288029233677 
+1020 759066.383675 5912822.171 -0.445823174769 
+1021 757367.631193 5910814.67482 -0.209091303339 
+1022 757788.400303 5911222.00508 -0.0921929475364 
+1023 759437.334778 5913332.68397 -0.516607131843 
+1024 758130.011364 5912010.29674 -0.204130972572 
+1025 757085.177301 5913478.04619 -4.73384532742 
+1026 757048.59697 5913442.13198 -5.6605167077 
+1027 756987.307693 5913448.37726 -5.69196873307 
+1028 756920.409863 5913400.3299 -5.57542400181 
+1029 757639.708292 5911717.64727 -0.199128159993 
+1030 757675.78864 5911771.6507 -0.193403363635 
+1031 757646.636977 5911880.94773 -0.1761476942 
+1032 758009.196019 5910687.20236 -0.171444167546 
+1033 758803.152883 5912239.83448 -0.511474423054 
+1034 758769.383165 5912273.18822 -0.522714609586 
+1035 758735.10125 5912319.60385 -0.529821255004 
+1036 758674.309451 5912344.02343 -0.586801969797 
+1037 758606.31476 5912376.00129 -0.73536823714 
+1038 757038.949022 5911678.29475 -0.408431415309 
+1039 757950.36854 5910630.39077 -0.203354163355 
+1040 757744.223279 5910952.10874 -0.3162426602 
+1041 757727.136732 5910907.60358 -0.413849076691 
+1042 757669.481145 5910836.31938 -0.420877407836 
+1043 757430.938788 5910742.21558 -0.345873931884 
+1044 757711.171904 5910940.32024 -0.406437511583 
+1045 758266.590022 5912058.5548 -0.180345321504 
+1046 758300.858727 5912100.33407 -0.266470806303 
+1047 758217.589007 5912056.01686 -0.166445852692 
+1048 758187.653091 5912109.19648 -0.432264284274 
+1049 758268.79601 5912152.38178 -0.432981242568 
+1050 758258.059662 5912240.90653 -0.515972147623 
+1051 758145.133213 5912157.92396 -0.475957668284 
+1052 758169.360587 5912222.33035 -0.469910051839 
+1053 759627.757144 5913558.20785 -0.361706388857 
+1054 757839.791928 5912807.01722 -0.268241991145 
+1055 757790.668539 5912806.36415 -0.253155258703 
+1056 760491.272268 5912558.50069 -2.3264897173 
+1057 759347.280798 5912740.41521 -1.87494949636 
+1058 757924.638725 5911879.76712 -0.083232918165 
+1059 757856.335562 5911917.20823 -0.277988680161 
+1060 757798.572601 5911985.49118 -0.33867603307 
+1061 757735.035175 5912184.70869 -0.342306310216 
+1062 757839.334738 5912108.23256 -0.332640351425 
+1063 757745.645681 5912071.20729 -0.299549809097 
+1064 757623.188155 5912064.28723 -0.416280329235 
+1065 757786.416439 5911865.77385 -0.178870976829 
+1066 760113.123512 5912929.33141 -1.68526781411 
+1067 760086.06191 5912979.37925 -1.06116991947 
+1068 760069.75 5912911.0 -0.714583658766 
+1069 756785.46392 5912544.60365 -2.48143409412 
+1070 756900.108259 5912544.9581 -3.53544216507 
+1071 757941.049544 5910492.23506 -0.377524202699 
+1072 757692.658175 5912712.71092 -0.312152742273 
+1073 757645.162273 5912623.73695 -0.432108576538 
+1074 757512.743598 5912568.66919 -0.120364749308 
+1075 757418.776464 5912694.9462 -8.39669648244 
+1076 757346.993396 5912861.06554 -8.13028859293 
+1077 756944.006738 5911693.63592 -0.293029247575 
+1078 757400.766557 5911721.33604 -0.305075299138 
+1079 757165.743867 5913265.60116 -6.92130039551 
+1080 759710.819268 5913162.05707 -0.56795809809 
+1081 756910.570116 5912154.23992 -5.66914725228 
+1082 757012.216111 5912090.03285 -6.29327649733 
+1083 757130.904649 5912151.94773 -7.11124015692 
+1084 757540.735494 5911089.70416 -0.441223053259 
+1085 758784.706288 5912352.21598 -0.57885367301 
+1086 758107.061583 5912256.45155 -0.477939358575 
+1087 758021.288831 5912243.58736 -0.444930299436 
+1088 757981.875564 5912343.03768 -0.461917620739 
+1089 757811.725724 5912367.18502 -0.405579893638 
+1090 757955.160192 5912481.82007 -0.850136749423 
+1091 758105.005234 5912332.8463 -0.472041791505 
+1092 758202.322623 5912412.2633 -1.01245734317 
+1093 757974.631187 5912162.36441 -0.3426823038 
+1094 757712.178268 5912543.30813 -0.595532292829 
+1095 757725.721706 5912434.76866 -0.504145850659 
+1096 757696.021422 5912308.45905 -0.331531818354 
+1097 757077.780252 5913732.72901 -0.5624655848 
+1098 757037.501276 5913743.97726 -0.710885208209 
+1099 757736.838986 5911507.97836 -0.0816964928714 
+1100 757743.857412 5911561.96767 -0.0814704419942 
+1101 757756.524189 5911465.91214 -0.0847077629995 
+1102 759916.013468 5913558.98845 -0.947091132552 
+1103 759958.090879 5913523.08801 -2.98775845181 
+1104 759877.65 5913606.0 -0.315796883641 
+1105 757908.572212 5911655.65562 0.0740773044434 
+1106 757884.490582 5911606.63562 -0.0486166219493 
+1107 757907.039199 5911706.00447 0.0765876155249 
+1108 757448.314076 5911708.26858 -0.209793192893 
+1109 757396.025562 5910409.5551 -0.240788992222 
+1110 759050.913721 5912507.16391 -1.19165530871 
+1111 758970.466026 5912558.55917 -0.945567853403 
+1112 760086.015996 5913308.13967 -0.8211303069 
+1113 759747.552071 5913043.34678 -0.708462398352 
+1114 757880.472021 5910699.90871 -0.1312059153 
+1115 756677.670967 5911903.5664 -0.221824433474 
+1116 756737.914795 5911899.69967 -0.185599607645 
+1117 757569.688703 5911227.94986 -0.180793539109 
+1118 757648.679198 5911242.61093 -0.189582817942 
+1119 757506.738036 5910929.28011 -0.545143087804 
+1120 757849.012393 5912672.56157 -0.348724970592 
+1121 757856.995645 5912600.22251 -0.390676079509 
+1122 757940.089506 5912569.21946 -0.475024307319 
+1123 760019.607486 5912552.41277 -1.77632375148 
+1124 757591.863566 5912185.33504 -0.377493741406 
+1125 757802.050946 5911477.93545 -0.0798664079314 
+1126 759932.81899 5913472.06899 -1.08183514547 
+1127 759924.251584 5913380.98905 -0.444364228413 
+1128 759983.289076 5913296.05747 -0.550029138066 
+1129 757787.593445 5912689.67107 -0.320977871623 
+1130 759965.190151 5913424.2687 -0.67480069577 
+1131 756376.25 5913726.0 -0.510817254037 
+1132 757223.306717 5910691.93971 -0.262827064369 
+1133 757227.319161 5910744.25985 -0.23680730329 
+1134 756675.982399 5913583.52758 -0.080953183199 
+1135 760050.720696 5913483.05193 -3.24806711221 
+1136 757890.974346 5911422.79687 -0.0805349298145 
+1137 757873.795358 5911374.13939 -0.0778584033495 
+1138 757829.804913 5911323.25624 -0.103431012763 
+1139 760400.665883 5912964.48525 -1.19159481538 
+1140 757401.640445 5911086.78378 -0.126126474185 
+1141 759552.921049 5913521.37581 -0.179976236851 
+1142 757082.023256 5913665.72544 -1.74879169678 
+1143 757699.253421 5911435.81352 -0.0601931726562 
+1144 757288.414644 5913122.25417 -7.63264318904 
+1145 759375.557919 5913071.03962 -2.88011449777 
+1146 759439.066085 5913059.15456 -0.91229644229 
+1147 759141.844392 5912551.1253 -1.73794094121 
+1148 758039.650514 5910728.73641 -0.162281894704 
+1149 756511.851854 5913503.02116 -0.342830048576 
+1150 756463.149664 5913284.03105 -0.597453046503 
+1151 756535.052113 5913235.02438 -1.32541216198 
+1152 758351.562574 5912257.03287 -0.552582982136 
+1153 756738.136156 5911821.71831 -0.419686613988 
+1154 756789.876076 5911811.13566 -1.27412384667 
+1155 758673.750985 5912409.75984 -0.658055026103 
+1156 758175.673779 5912029.5679 -0.147510678021 
+1157 758090.042868 5912122.69468 -0.426737792658 
+1158 757929.375057 5912079.33198 -0.413964595529 
+1159 757856.425918 5911707.51525 0.0425161155978 
+1160 757816.282112 5911762.52435 -0.0258730543541 
+1161 757429.778695 5910370.56173 -0.229062003487 
+1162 757433.351033 5910445.14395 -0.2344079945 
+1163 757500.724365 5910469.35787 -0.251627058816 
+1164 757844.398621 5911435.26207 -0.0764349915804 
+1165 758730.903945 5912443.53641 -0.616498091781 
+1166 759338.877758 5913001.05632 -1.77248598734 
+1167 757815.673955 5911254.63066 -0.0695522656651 
+1168 758892.980058 5912728.54486 -0.276151848419 
+1169 758851.125689 5912716.58318 -0.25329775553 
+1170 757529.363139 5911724.60876 -0.192338679453 
+1171 757942.195992 5910813.45364 -0.133943264417 
+1172 756640.466959 5911735.16476 -0.182517383579 
+1173 759390.201201 5913182.70464 -0.950256472887 
+1174 759799.469909 5913244.67055 -0.412396693033 
+1175 759750.02763 5912394.19855 -2.45996277692 
+1176 759783.25 5912500.5 -2.08446793541 
+1177 759889.412145 5912428.29585 -2.14907253821 
+1178 759979.892673 5912281.02374 -5.88324584825 
+1179 759927.953808 5912518.21085 -1.71645285829 
+1180 759794.116055 5912437.19053 -2.29255849151 
+1181 759846.05283 5912478.69187 -1.99878379275 
+1182 757707.905451 5910864.19969 -0.493384770925 
+1183 757737.451742 5910808.46717 -0.396641141392 
+1184 757658.949023 5910891.25273 -0.830546108849 
+1185 757682.189137 5910770.46809 -0.554208324785 
+1186 757602.598406 5910789.2605 -0.402164882755 
+1187 757685.454228 5910687.59562 -1.62090911809 
+1188 757690.000564 5910910.5287 -0.714335678574 
+1189 759747.013512 5913089.44133 -0.718089126223 
+1190 757764.188552 5911719.29699 -0.0966449532677 
+1191 757621.661931 5910932.85828 -0.481003603368 
+1192 760944.7 5912272.5 -3.82613890763 
+1193 760930.688721 5912165.78771 -5.48188362262 
+1194 759763.471392 5913412.43418 -0.704040856678 
+1195 757977.431061 5912738.53883 -0.320856510067 
+1196 758009.290813 5912688.81907 -0.395100675325 
+1197 760272.936569 5913425.81295 0.00571213729891 
+1198 760200.880647 5913434.64173 -0.00284348840838 
+1199 760176.511335 5913366.81134 -1.65376024933 
+1200 757290.626682 5910876.23228 -0.154561740125 
+1201 757113.314642 5911729.36529 -1.6637487041 
+1202 757123.14583 5911847.31501 -0.858424405504 
+1203 757655.402104 5911326.68642 -0.07646336582 
+1204 760584.849086 5912349.24856 -9.84597050939 
+1205 756918.48032 5912914.74354 -5.36401054068 
+1206 756822.701365 5912816.17833 -4.69731487653 
+1207 756945.552396 5911730.19315 -0.466713927718 
+1208 756987.847359 5911764.74826 -1.17357687063 
+1209 757020.860067 5911843.44215 -4.50323571293 
+1210 756930.64092 5911767.6368 -2.26740601315 
+1211 756961.172124 5911804.3755 -4.34389249255 
+1212 756936.991653 5911850.34139 -4.97001962348 
+1213 756902.281797 5911891.74473 -2.97332959995 
+1214 756889.748097 5911769.63087 -2.249808621 
+1215 756922.862374 5911942.82253 -4.5978226463 
+1216 757001.227609 5911967.07501 -5.99491315268 
+1217 757217.282647 5913212.39594 -7.23517607624 
+1218 757202.630125 5913127.69699 -7.58057492238 
+1219 757111.49068 5913104.96868 -6.96871269026 
+1220 757055.342305 5913005.00724 -4.07307540545 
+1221 759692.996629 5913575.67079 -0.431102360913 
+1222 759735.625493 5913582.7673 -0.478331739687 
+1223 758464.687837 5912532.18006 -0.60863530675 
+1224 758417.892656 5912507.72401 -0.605334968343 
+1225 758502.9117 5912535.33582 -0.728547384643 
+1226 757926.796387 5910917.86673 -0.22536001392 
+1227 756831.560616 5913657.39069 -0.465836324401 
+1228 760198.299135 5912376.168 -6.78886337586 
+1229 760169.697908 5913069.804 -2.40491775245 
+1230 759199.92137 5912637.96219 -1.55541476498 
+1231 759202.813235 5912692.46099 -1.18640581526 
+1232 757798.150715 5910890.92244 -0.422112352317 
+1233 757802.690301 5910828.8154 -0.411942773356 
+1234 757205.434776 5912045.59073 -7.21020526459 
+1235 757350.561276 5912044.45988 -5.44840800059 
+1236 759027.338741 5912558.92159 -0.709727890622 
+1237 759060.089988 5912622.44079 -1.46974191112 
+1238 758998.554128 5912613.39046 -2.10039272031 
+1239 758950.295331 5912654.26995 -0.337148376809 
+1240 759785.77533 5913111.99188 -0.637911079274 
+1241 759747.112251 5913133.86045 -0.674593325062 
+1242 757241.001339 5913053.71927 -7.75038205033 
+1243 757261.801515 5912939.67925 -7.76749424548 
+1244 757230.838173 5912820.65789 -6.17293878772 
+1245 757106.829776 5912725.22 -6.40309139904 
+1246 757494.739726 5913349.11588 -0.646181426953 
+1247 758504.785191 5912102.64809 -0.201316251715 
+1248 758734.169823 5912732.32484 -0.194969809956 
+1249 757844.732796 5910595.09199 -0.859266097574 
+1250 757769.622693 5910603.47426 -1.52115054678 
+1251 757806.180731 5910590.3493 -1.36046579598 
+1252 757791.309488 5910549.47338 -1.28879258459 
+1253 757800.201155 5910631.17043 -0.883815686002 
+1254 757769.227733 5910686.95083 -0.557273152458 
+1255 757759.692337 5910645.1665 -1.38009477321 
+1256 757727.243065 5910674.55176 -1.2964021413 
+1257 757789.074306 5910505.6496 -0.59665440612 
+1258 757728.102869 5910615.61371 -1.60221654375 
+1259 757718.57993 5910566.56743 -1.3728146542 
+1260 757690.834541 5910506.92914 -0.690297786138 
+1261 757749.538504 5910485.66598 -0.439733944131 
+1262 757774.27672 5910447.63593 -0.326699695868 
+1263 757836.362967 5910628.4555 -0.615679711207 
+1264 757695.470094 5910646.22189 -1.71318743792 
+1265 757636.79901 5910653.91783 -1.13396172322 
+1266 757594.309628 5910715.17344 -0.460409445932 
+1267 757617.918215 5910597.70399 -0.876061501053 
+1268 757523.339994 5910692.1734 -0.78948006054 
+1269 757670.946943 5910558.91099 -0.842319360093 
+1270 760369.185849 5913238.45132 -0.0827240784771 
+1271 758924.519808 5912333.73823 -0.652517981173 
+1272 758807.628094 5912271.89325 -0.517024585282 
+1273 756842.497882 5912638.001 -3.94573983294 
+1274 756889.174519 5912733.37546 -3.91190436606 
+1275 756998.673686 5912747.21993 -4.38749171819 
+1276 756974.894581 5911675.46882 -0.259028739291 
+1277 757007.575216 5911662.07105 -0.265642810857 
+1278 757009.65 5911624.0 -0.165545826467 
+1279 757073.8822 5911627.64919 -0.350834318426 
+1280 757009.242014 5911697.29535 -0.36083384151 
+1281 757044.32311 5911719.42043 -0.528156591976 
+1282 757083.22682 5911693.42273 -0.933805481361 
+1283 757005.529612 5911733.23728 -0.406689942731 
+1284 758778.310961 5912409.07088 -0.612523501785 
+1285 757804.066164 5912630.80358 -0.3695862905 
+1286 757762.943888 5912581.99212 -0.400458104746 
+1287 759378.505571 5912970.37956 -1.18963655877 
+1288 757964.965125 5912653.29071 -0.412044402949 
+1289 756853.354694 5911908.14628 -0.956492851853 
+1290 756801.806155 5911913.32498 -0.439762310229 
+1291 756764.52879 5911972.4255 -0.381818072003 
+1292 756749.965136 5912049.94085 -2.23557673122 
+1293 756813.069546 5912021.67117 -0.443740510171 
+1294 756881.247469 5912066.78366 -3.72994333354 
+1295 757062.026836 5911913.3545 -5.70359190478 
+1296 757140.214078 5911935.48499 -4.91503107444 
+1297 757039.124511 5911643.14737 -0.290458593697 
+1298 756458.441256 5911810.55298 -0.0483035497914 
+1299 756485.042716 5911840.62804 -0.0417275944509 
+1300 756482.65 5911769.5 -0.0606538709766 
+1301 758041.75 5910516.5 -0.198375967839 
+1302 758020.2 5910532.5 -0.198380777282 
+1303 760472.9436 5912777.96751 -1.47965639276 
+1304 757583.897547 5913244.14791 -5.04453799861 
+1305 760661.407115 5912455.62473 -6.3423060831 
+1306 760627.607065 5912408.66009 -8.09473505999 
+1307 760564.447002 5912409.02381 -7.81500899341 
+1308 760463.986659 5912341.36599 -9.08137294421 
+1309 760520.093189 5912479.96027 -4.71980833593 
+1310 760333.599451 5912372.52932 -7.00030261576 
+1311 760648.553205 5912352.56189 -9.95522547812 
+1312 760601.48125 5912205.6875 -12.2565207813 
+1313 760544.174532 5912285.0841 -10.929717769 
+1314 760523.353404 5912361.62864 -9.07546323052 
+1315 760474.983463 5912406.24635 -6.99585966031 
+1316 760403.165205 5912394.11049 -6.75412065714 
+1317 760350.619745 5912461.30071 -3.71721547512 
+1318 760395.407785 5912546.85559 -1.97376918006 
+1319 760389.119663 5912316.47423 -8.89108373547 
+1320 760420.99375 5912227.5625 -10.430239319 
+1321 759631.559561 5913487.68855 -0.682740022812 
+1322 759647.942396 5913424.74123 -3.08668130029 
+1323 759698.436763 5913350.34137 -0.47116395268 
+1324 756737.484946 5912636.9792 -3.47786455115 
+1325 756684.911204 5913420.85478 -2.07635772169 
+1326 756639.630608 5913356.66162 -1.895504327 
+1327 756564.188703 5913387.50089 -0.801840806555 
+1328 756587.260878 5913299.20595 -1.72484731648 
+1329 756610.788722 5913228.53269 -2.78962444784 
+1330 756689.425167 5913200.82736 -4.7061408001 
+1331 756755.888798 5913267.29476 -4.09589484046 
+1332 757432.936154 5911851.53161 -0.480734073855 
+1333 757471.009815 5911903.70538 -0.325948978442 
+1334 757525.98757 5911993.04429 -0.268726822003 
+1335 757446.817315 5911980.17874 -0.532358219616 
+1336 757368.855294 5911858.55159 -2.86739775541 
+1337 757313.774795 5911938.52162 -4.74575306241 
+1338 757296.81166 5911867.88427 -4.42378375073 
+1339 758648.385212 5912165.48214 -0.418254251623 
+1340 758624.89887 5912200.57147 -0.49664078795 
+1341 758580.47826 5912251.04609 -0.549923314129 
+1342 758640.884753 5912251.94783 -0.52794787862 
+1343 758674.328736 5912291.91182 -0.510330129624 
+1344 757190.178712 5912263.87826 -6.29434864225 
+1345 757360.84644 5912309.24116 -7.87190184187 
+1346 757768.078458 5911338.17373 -0.0800053728395 
+1347 758036.158806 5912153.6483 -0.393215716192 
+1348 757876.35 5911290.5 -0.0731463914629 
+1349 757716.873115 5910714.79111 -1.02874672628 
+1350 757677.290041 5910728.77452 -1.05071723733 
+1351 757636.453918 5910754.70748 -0.550402010704 
+1352 757640.789025 5910700.139 -1.10276496555 
+1353 757837.044825 5911285.99778 -0.0877441519102 
+1354 759572.688705 5913279.58984 -0.678083915987 
+1355 757656.520363 5910299.81207 -0.257758302787 
+1356 757613.013637 5910312.26793 -0.223399714912 
+1357 757685.829084 5910326.00669 -0.283808048797 
+1358 757723.778148 5910347.06648 -0.294447496058 
+1359 757240.613783 5910598.49097 -0.294151249277 
+1360 757263.961901 5910619.06953 -0.298065506168 
+1361 758298.794714 5912549.95536 -0.560273120244 
+1362 758222.308792 5912500.90223 -0.68458648082 
+1363 758131.305379 5912474.84885 -0.971191398853 
+1364 758230.161954 5912578.81072 -0.530836626868 
+1365 760492.887314 5912814.84267 -2.86068919977 
+1366 758948.377342 5912441.61386 -1.10081836968 
+1367 758887.965218 5912456.03192 -0.700957582283 
+1368 758929.924347 5912498.06859 -0.714916596442 
+1369 757702.207857 5912910.49892 -0.274267417803 
+1370 756569.148148 5912763.38172 -0.882288757227 
+1371 756657.208586 5912777.29774 -2.43306192115 
+1372 756652.543256 5912863.68527 -3.11634262038 
+1373 756733.378356 5912824.731 -4.1150435653 
+1374 757129.753726 5911582.01939 -0.290625222637 
+1375 757103.125597 5911603.9277 -0.374845356002 
+1376 756616.132609 5912456.57556 -0.564869544707 
+1377 756657.236594 5912450.59657 -0.916532522831 
+1378 756692.119426 5912489.85363 -0.878986199985 
+1379 756696.628534 5912417.99043 -1.19476658829 
+1380 756742.667848 5912510.62007 -1.41516396261 
+1381 756664.470554 5912534.03849 -1.01699239806 
+1382 756782.919268 5912475.59011 -2.16652315558 
+1383 756780.117238 5912407.125 -4.32208332591 
+1384 756827.510753 5912508.49963 -1.94338420977 
+1385 756884.906993 5912484.71874 -2.29952351835 
+1386 756898.160384 5912400.93718 -4.88648213964 
+1387 756968.260011 5912495.72248 -4.19184488641 
+1388 756958.270664 5912307.94069 -6.3331667136 
+1389 756842.712018 5912568.73899 -3.29943414803 
+1390 757055.878139 5912478.97818 -4.61206292158 
+1391 757073.458735 5912306.64785 -6.48806445126 
+1392 757146.092037 5912475.70653 -4.89217653277 
+1393 757232.012136 5912574.21783 -6.91728813171 
+1394 757265.244441 5912444.59539 -6.65374618974 
+1395 756779.501759 5912339.59247 -5.48824268947 
+1396 756797.322776 5912276.83691 -5.61121775578 
+1397 756868.543259 5912260.42444 -5.96252414833 
+1398 756890.746965 5912603.51883 -4.03458874381 
+1399 756951.655048 5912583.22677 -4.36270142719 
+1400 757035.906105 5912615.49604 -5.29114974602 
+1401 756895.425662 5912661.06278 -4.11643341786 
+1402 756934.81537 5912700.89439 -3.86720199938 
+1403 756991.894959 5912689.38807 -4.36585441615 
+1404 756941.594096 5912758.72625 -3.60859612235 
+1405 756984.779802 5912825.6273 -4.85471196447 
+1406 756888.752236 5912801.11981 -4.14435186069 
+1407 757047.854068 5912712.14207 -5.28007940908 
+1408 757062.655655 5912784.90965 -4.67110206519 
+1409 757147.083371 5912801.20086 -6.77395466638 
+1410 757168.151753 5912900.50395 -6.56689872259 
+1411 757090.8501 5912657.76509 -5.95808929664 
+1412 757177.955345 5912672.75056 -6.86285902394 
+1413 756869.02571 5912866.98182 -5.04016716793 
+1414 756851.848209 5912934.25278 -4.87883181805 
+1415 756829.960693 5913001.26249 -4.82442160192 
+1416 756805.064943 5913081.14252 -5.72726365141 
+1417 756756.574193 5913018.223 -4.53448929027 
+1418 756801.883442 5912881.68261 -5.01281212116 
+1419 756730.528016 5912897.83656 -4.60374009249 
+1420 756902.046587 5912982.15827 -4.94058608168 
+1421 756970.200413 5913038.75665 -5.92761238713 
+1422 756974.593861 5912964.13277 -4.71297683005 
+1423 756849.784812 5912693.54384 -4.01567183445 
+1424 756829.189084 5912753.30323 -4.20508818055 
+1425 756789.644099 5912673.18456 -3.83216152017 
+1426 756832.935949 5913157.67958 -5.3745207628 
+1427 756794.462936 5912603.22115 -3.76625899801 
+1428 756774.108111 5912779.392 -3.87084596948 
+1429 756715.961246 5912768.1205 -3.12263319914 
+1430 756679.237844 5912725.67319 -2.84264485448 
+1431 756605.154298 5912507.31421 -0.541506616516 
+1432 757301.941352 5910668.57217 -0.313368849374 
+1433 757376.683674 5910666.38661 -0.888939581092 
+1434 757282.980882 5910643.79841 -0.304742738763 
+1435 757834.132464 5912770.41683 -0.26898342367 
+1436 757796.231801 5912752.02536 -0.278580173036 
+1437 757760.635992 5912725.18118 -0.334579597248 
+1438 757721.830759 5912745.20079 -0.295924452705 
+1439 757678.922142 5912754.38641 -0.294910735255 
+1440 757599.683938 5912775.98682 -0.331079706264 
+1441 757632.938173 5912716.12892 -0.390402096459 
+1442 757502.249242 5912762.25211 -1.52208169968 
+1443 757441.059635 5912837.48673 -6.83818287626 
+1444 757416.514601 5912938.99102 -8.02943008735 
+1445 757719.60314 5912787.42505 -0.237534887694 
+1446 757642.297058 5912776.16977 -0.306671617207 
+1447 757620.75681 5912830.50811 -0.300516693222 
+1448 757588.919957 5912878.58706 -0.388983500115 
+1449 757532.888588 5912931.38548 -7.09609076209 
+1450 757477.701675 5912981.09314 -7.95269993289 
+1451 757486.847375 5913062.95101 -7.63571231679 
+1452 757745.256131 5912685.51816 -0.291533940604 
+1453 757701.508194 5912665.36366 -0.401661038744 
+1454 757699.33175 5912609.36142 -0.775642968385 
+1455 757659.170512 5912567.27469 -0.439911884239 
+1456 757586.063087 5912579.10565 -0.390643283818 
+1457 757558.463977 5912510.23355 -0.454714652232 
+1458 757555.790055 5912405.44838 -0.339024185785 
+1459 757471.290165 5912489.13202 -2.09029173919 
+1460 757431.417295 5912389.7631 -6.00962454403 
+1461 757422.540863 5912565.11033 -6.53801882753 
+1462 757326.956622 5912562.97225 -7.97280850767 
+1463 757540.730241 5912634.81875 -0.222212884763 
+1464 757465.240585 5912627.76191 -4.77698897789 
+1465 757508.234885 5912694.53286 -3.55608462679 
+1466 757385.776767 5911758.43637 -0.334988243572 
+1467 757346.608066 5911767.15839 -1.84876588115 
+1468 757837.080721 5911626.04239 -0.0678829582228 
+1469 757844.686961 5911577.01062 -0.070969185864 
+1470 757045.930725 5913668.6842 -2.86947918797 
+1471 757018.342602 5913691.12658 -2.75301472946 
+1472 759155.645573 5912648.16546 -0.731880108782 
+1473 759113.275316 5912615.21656 -0.804905028267 
+1474 757076.320332 5911741.72629 -0.951739266341 
+1475 757112.61421 5911788.80825 -0.926303802693 
+1476 757177.160864 5911807.39067 -2.41065618729 
+1477 757236.168216 5911839.25549 -4.15703574327 
+1478 757075.436619 5911779.93735 -0.743342469234 
+1479 757084.555643 5911824.06025 -0.918528674167 
+1480 757039.404277 5911804.17503 -1.48558664316 
+1481 757082.54574 5911871.04227 -3.18972829192 
+1482 757122.693105 5911893.1397 -2.95923645197 
+1483 757179.168091 5911870.78307 -1.02715038567 
+1484 760620.143983 5912284.71108 -11.5123084936 
+1485 758688.63875 5912170.58739 -0.398118217404 
+1486 758709.988674 5912208.15407 -0.476229468462 
+1487 758685.653556 5912242.95164 -0.476257833293 
+1488 757291.7701 5910610.35459 -0.308492891836 
+1489 757314.770892 5910579.52695 -0.310067351872 
+1490 757356.818192 5910567.68948 -0.305538287993 
+1491 757369.790907 5910513.46594 -0.276269077636 
+1492 757365.047658 5910612.30999 -0.407327312758 
+1493 757412.765607 5910630.33242 -1.13710659227 
+1494 757450.755089 5910592.48646 -1.36667066877 
+1495 757427.257096 5910680.917 -0.60504363998 
+1496 757504.367245 5910605.57626 -1.64760000311 
+1497 758043.512602 5912485.40473 -0.947728443296 
+1498 756737.183639 5912561.4651 -2.31246908252 
+1499 756754.854902 5912233.06896 -5.27950243251 
+1500 757375.345111 5912774.74778 -6.93703202184 
+1501 757390.409443 5910713.88999 -0.504081559693 
+1502 757384.489648 5910765.51852 -0.305110350219 
+1503 757436.24538 5910810.73747 -0.814496487171 
+1504 756490.590236 5912250.79387 -0.373898251932 
+1505 756505.541779 5912288.63317 -0.330445463884 
+1506 757294.540567 5910935.87388 -0.140871446243 
+1507 757334.762609 5910979.79657 -0.133398116917 
+1508 757383.769821 5910952.00897 -0.128801139453 
+1509 757451.828762 5910976.21586 -0.27034444189 
+1510 757518.454484 5910998.57352 -0.772046263514 
+1511 760618.137312 5912511.11311 -4.28923638388 
+1512 760560.091407 5912523.93651 -3.86582186928 
+1513 760576.5 5912610.0 -1.03394632669 
+1514 760496.457091 5912621.152 -2.02717263468 
+1515 760438.268566 5912594.4273 -2.84223364626 
+1516 760444.133015 5912658.36866 -1.86543809089 
+1517 757623.889139 5913348.82465 -0.593401928426 
+1518 760471.787387 5913359.12849 -0.429009275664 
+1519 760414.483839 5913371.03377 -0.195847983422 
+1520 760385.388452 5913321.69299 -0.0659958398284 
+1521 760412.37713 5913273.24205 -0.201909078997 
+1522 760488.523121 5913316.26115 -0.478689784614 
+1523 760462.318678 5913274.7556 -0.563948984664 
+1524 757689.734752 5911633.49988 -0.0509537641565 
+1525 758695.152872 5912647.52033 -0.301981945283 
+1526 759038.998863 5912717.31721 -0.718492661304 
+1527 759094.246817 5912726.38668 -1.78339974307 
+1528 759060.224417 5912672.25317 -1.12247575706 
+1529 759480.483512 5913264.12779 -2.40467341489 
+1530 759529.47535 5913254.62932 -1.42567135948 
+1531 759541.756421 5913203.05635 -0.372660740023 
+1532 759544.411947 5913142.83506 -0.655129453827 
+1533 759529.500018 5913304.47384 -2.6461229244 
+1534 759537.896966 5913360.13695 -1.71008701146 
+1535 759501.554008 5913171.11439 -0.781604647495 
+1536 759571.052094 5913326.67049 -2.16397552711 
+1537 759639.514127 5913305.48158 -0.446501444334 
+1538 759626.873563 5913238.92374 -0.504775304293 
+1539 756600.684244 5911882.46563 -0.138873114985 
+1540 756572.688437 5911928.42657 -0.0986033474801 
+1541 758770.506374 5912196.43161 -0.409212115475 
+1542 756542.033233 5912857.81621 -1.63528096639 
+1543 756566.460532 5912932.44157 -4.04855182821 
+1544 756596.657293 5912872.63109 -3.35128188701 
+1545 757117.45 5913708.0 -0.508336297405 
+1546 756880.729177 5911972.15863 -3.45593355666 
+1547 757074.564332 5912397.93281 -5.5798718378 
+1548 756985.187603 5912895.5254 -5.74685843575 
+1549 757038.477561 5912938.59589 -5.38068051297 
+1550 757113.682643 5912954.84506 -6.46578618189 
+1551 759160.608571 5912690.14144 -1.48478913466 
+1552 757474.673058 5910691.88426 -0.513225018968 
+1553 757337.756801 5910776.96021 -0.194801385433 
+1554 757318.889835 5910822.59437 -0.161561111961 
+1555 757351.137299 5910867.11274 -0.132817419247 
+1556 757298.933433 5910754.58535 -0.22923026397 
+1557 758455.540697 5912085.83942 -0.211245899809 
+1558 758411.675732 5912095.3056 -0.202466198271 
+1559 758396.007076 5912149.73031 -0.357633367934 
+1560 760006.118 5913518.14075 -2.3518431257 
+1561 756493.772315 5911958.19971 0.156947070357 
+1562 759323.909193 5912915.03992 -1.14175434093 
+1563 759349.295495 5912944.59595 -1.01841029432 
+1564 756505.038197 5912095.31274 -0.216610606528 
+1565 757600.906548 5913018.38399 -3.85154736172 
+1566 756518.602723 5912048.87481 -0.143800683143 
+1567 756823.7224 5913566.1986 -2.65612671417 
+1568 756766.151682 5913565.1626 -1.36088497984 
+1569 756820.021252 5913510.8178 -4.0312001894 
+1570 756795.181023 5913459.81929 -3.4429880909 
+1571 756789.700824 5913395.56294 -4.24387298249 
+1572 756852.316489 5913358.22503 -4.76864552405 
+1573 756777.206084 5913330.26602 -4.37947929372 
+1574 756868.662325 5913481.62994 -4.71458581662 
+1575 756907.144024 5913318.54907 -4.89401007414 
+1576 756974.079878 5913318.00114 -6.22812413924 
+1577 759654.563432 5913015.71075 -0.64747822038 
+1578 759597.879645 5913018.0759 -0.559598193905 
+1579 757080.155236 5913177.45905 -6.62280576803 
+1580 757703.106236 5911837.47301 -0.14277850189 
+1581 757711.71908 5911907.07152 -0.235157086549 
+1582 758543.505998 5912404.47917 -0.453271251386 
+1583 758490.36526 5912361.21726 -0.541856682842 
+1584 757750.40451 5911533.66573 -0.0893591471866 
+1585 757789.605936 5911545.99813 -0.0965461985401 
+1586 757929.47707 5911746.55071 0.0592611970595 
+1587 757419.889144 5911697.87847 -0.212214726223 
+1588 757479.688916 5912207.29693 -3.3538760858 
+1589 757640.147431 5910980.45055 -0.424228915481 
+1590 757612.631323 5911026.71385 -0.578188719527 
+1591 757563.096738 5911020.83023 -0.728689540219 
+1592 757522.775566 5911045.80616 -0.375454511745 
+1593 760882.771317 5912220.43889 -5.53377308932 
+1594 760821.589566 5912231.79553 -10.287868691 
+1595 760745.958268 5912253.89675 -12.9141343264 
+1596 760829.939942 5912272.14444 -7.13814667459 
+1597 758927.993277 5912599.58904 -1.94175539532 
+1598 757647.166113 5910797.86118 -0.399542226507 
+1599 757618.053239 5910840.45682 -0.538708720577 
+1600 757553.464168 5910832.02371 -0.558230725854 
+1601 757395.665563 5912629.30363 -8.01610137302 
+1602 757339.625797 5912685.92328 -8.18330696004 
+1603 757287.638016 5912629.15198 -7.68458331585 
+1604 757324.052582 5910490.62498 -0.276401408393 
+1605 756539.951843 5912273.8019 -0.489593546612 
+1606 756571.261422 5912244.22095 -0.988338185915 
+1607 756570.910401 5912293.03601 -0.517211446424 
+1608 756595.16627 5912319.69723 -0.457038425008 
+1609 756633.099656 5912313.35164 -0.594040145121 
+1610 756688.177026 5912322.96617 -1.90725068714 
+1611 756645.28607 5912275.18194 -1.04804849668 
+1612 756684.705381 5912282.94081 -2.57554288083 
+1613 756714.293466 5912251.4777 -4.75057193472 
+1614 756699.933313 5912202.41924 -4.65466554354 
+1615 756666.265749 5912161.25913 -4.36050805112 
+1616 756632.839218 5912237.78038 -1.48073051135 
+1617 756640.529456 5912195.57825 -3.80437940889 
+1618 756687.493217 5912114.3141 -3.44020396772 
+1619 756741.954294 5912104.66661 -4.08752004638 
+1620 756776.009642 5912150.51592 -5.03790773614 
+1621 756836.786586 5912157.25432 -5.40701840361 
+1622 756702.25246 5912066.13742 -2.03253469573 
+1623 756669.361894 5912030.74011 -0.69105886661 
+1624 756649.219834 5911986.9259 -0.247081891292 
+1625 756676.793808 5911949.80205 -0.291074158727 
+1626 756722.777259 5911952.90797 -0.200304410102 
+1627 756883.047584 5912019.45987 -3.48559372602 
+1628 756922.590379 5912044.66014 -4.45728846427 
+1629 756980.161778 5912024.36788 -5.68104375674 
+1630 756925.863771 5912100.46838 -4.4146978076 
+1631 756974.866742 5912143.46644 -6.07258048205 
+1632 757041.973504 5912150.60302 -6.75004778506 
+1633 757087.35483 5912090.71291 -6.85242948594 
+1634 757085.523323 5912211.83784 -6.82269999446 
+1635 756951.11228 5912198.94804 -6.20823509608 
+1636 756971.659172 5912252.32996 -6.49614747719 
+1637 757029.420946 5912266.62854 -6.59995547393 
+1638 757016.069708 5912325.55997 -6.40564878241 
+1639 756894.699726 5912209.36775 -5.91512465741 
+1640 756921.137917 5912269.5838 -6.25775993168 
+1641 756904.781892 5912322.57011 -6.1341619788 
+1642 756945.255586 5912365.45314 -5.98735892605 
+1643 757498.782807 5910729.68435 -0.494370717788 
+1644 757472.895503 5910774.363 -0.717675203821 
+1645 757493.049647 5910831.32104 -0.618424104594 
+1646 757565.337508 5913054.02679 -6.74597765827 
+1647 757582.911653 5912971.19328 -4.47713445161 
+1648 757609.605526 5912926.42717 -0.326413819213 
+1649 757658.041369 5912930.87345 -0.174391112114 
+1650 757679.71969 5912971.82868 -0.0820867307046 
+1651 756717.968097 5913315.22566 -3.61444730516 
+1652 757406.849837 5912132.44058 -6.79398174107 
+1653 759819.871823 5913584.55517 -0.390219486038 
+1654 758001.309855 5910783.04292 -0.149404114997 
+1655 757433.241626 5913287.47011 -3.86975002864 
+1656 757431.8007 5913223.09115 -6.74933918033 
+1657 757362.373637 5913214.94648 -7.1567411509 
+1658 757472.602322 5913173.21751 -7.22704850444 
+1659 757449.566378 5913114.18817 -7.67409801494 
+1660 757386.182047 5913102.61032 -7.7272845787 
+1661 757345.35334 5913152.52195 -7.50850314427 
+1662 757329.243351 5913072.34254 -7.83459591253 
+1663 757318.563152 5912994.29772 -7.86598074683 
+1664 757290.984513 5913186.10926 -7.35278107001 
+1665 758336.535554 5912396.30361 -0.875249785762 
+1666 758147.28398 5912706.77181 -0.310440215092 
+1667 758099.723795 5912720.22785 -0.318142927623 
+1668 758113.212817 5912676.45207 -0.394900352597 
+1669 758083.466914 5912624.58001 -0.513235349881 
+1670 758079.975752 5912550.25959 -0.473235941794 
+1671 758128.859913 5912633.01439 -0.498978955183 
+1672 758047.7 5912761.0 -0.22136582505 
+1673 758112.848501 5912592.81872 -0.582849793088 
+1674 758131.101665 5912544.7449 -0.549472247057 
+1675 758186.601282 5912543.4106 -0.592326451044 
+1676 757540.36544 5911326.16705 -0.0999625266019 
+1677 757894.782121 5910636.42285 -0.219207422615 
+1678 757863.81067 5910655.67636 -0.1854858898 
+1679 757894.685071 5910669.7567 -0.149206414444 
+1680 757926.978227 5910685.93374 -0.156604183351 
+1681 757966.010157 5910687.64509 -0.167369978865 
+1682 757052.518344 5913361.70379 -6.29170555979 
+1683 759192.92049 5912559.99535 -0.935027522635 
+1684 758087.261215 5912043.71757 -0.366239360889 
+1685 758040.28476 5912027.9458 -0.360834793271 
+1686 757984.737389 5912041.12775 -0.346601733563 
+1687 757948.475684 5911992.50894 -0.255882935431 
+1688 757921.470317 5911942.69217 -0.229018200282 
+1689 757644.835021 5911821.93094 -0.152119214949 
+1690 757576.538411 5911833.86676 -0.146448533823 
+1691 757708.915487 5911401.79029 -0.0563446944082 
+1692 757723.461134 5911355.99878 -0.0766992385861 
+1693 757760.596649 5911384.19887 -0.079133374592 
+1694 757558.167977 5911742.40136 -0.280730275011 
+1695 757567.892278 5911786.07619 -0.209507987217 
+1696 757520.886565 5911817.40472 -0.204776047068 
+1697 759944.727884 5912360.84993 -4.22963084054 
+1698 760046.061078 5912357.83048 -5.74809331807 
+1699 757571.104302 5910931.01574 -0.554425859464 
+1700 757540.01696 5910889.51025 -0.74289904502 
+1701 757490.223029 5910881.65193 -0.59212189139 
+1702 757458.746999 5910919.24357 -0.347099503559 
+1703 757452.593776 5910854.29383 -0.371660032274 
+1704 757407.765113 5910846.2735 -0.246361215028 
+1705 757610.171843 5910353.29226 -0.328309451412 
+1706 757603.920135 5910413.96116 -1.00250506342 
+1707 757643.886178 5910387.42296 -0.598060031591 
+1708 757544.679113 5910416.62368 -0.33929639093 
+1709 758841.714004 5912487.94296 -0.65931195636 
+1710 758827.628864 5912538.74528 -0.842735144628 
+1711 758768.967178 5912563.36775 -1.77449696028 
+1712 758718.216356 5912522.30261 -0.809468081888 
+1713 758657.373338 5912535.92306 -2.31429606151 
+1714 756719.11534 5912963.31658 -4.06566795434 
+1715 756591.656115 5912540.47285 -0.507191200023 
+1716 756586.938141 5912576.6064 -0.552810519588 
+1717 756617.668432 5912601.25413 -0.764194397585 
+1718 756638.105309 5912637.77245 -1.64435696484 
+1719 756680.133667 5912623.26715 -2.3545273569 
+1720 756569.06905 5912609.20349 -0.477131287592 
+1721 756629.462025 5912677.82553 -1.85725987197 
+1722 756651.538198 5912583.78114 -1.30428417676 
+1723 756640.461072 5912716.19791 -2.26383961686 
+1724 756612.419519 5912751.29888 -1.50755060831 
+1725 757752.259127 5912807.68893 -0.221164809346 
+1726 757660.958978 5912682.28506 -0.574883575744 
+1727 757615.637863 5912673.28349 -0.821091389343 
+1728 757179.071453 5911746.36465 -3.87226751787 
+1729 757000.302155 5911809.72113 -3.86227932267 
+1730 756978.846617 5911845.92847 -5.20234741517 
+1731 757002.392242 5911887.58725 -5.5228022134 
+1732 757553.830057 5910599.05786 -1.23581347048 
+1733 757579.12899 5910555.33795 -0.64473569183 
+1734 757553.30683 5910512.61524 -0.896840022357 
+1735 757507.185027 5910515.09205 -1.04443575554 
+1736 757480.692427 5910555.04507 -1.38673214766 
+1737 757436.079781 5910550.06307 -0.570542646644 
+1738 759130.521194 5912713.92798 -1.17525935269 
+1739 757850.460325 5910685.9593 -0.163314216164 
+1740 757847.258582 5910732.10702 -0.164926400209 
+1741 757810.022951 5910701.11352 -0.186371453452 
+1742 757778.695257 5910725.51596 -0.340830554444 
+1743 757779.260768 5910765.3628 -0.287024601749 
+1744 757585.391678 5911756.54569 -0.273795707407 
+1745 756592.73491 5912671.49688 -0.896517599644 
+1746 756557.418505 5912649.28919 -0.567638414299 
+1747 756562.538276 5912697.92682 -0.649698641351 
+1748 756527.887779 5912685.46221 -0.479046272752 
+1749 757577.594547 5912655.19914 -0.607837380882 
+1750 757543.045744 5912675.09705 -0.764383691474 
+1751 757574.984001 5912616.39062 -0.360274775513 
+1752 757547.40764 5912587.90787 -0.289797258224 
+1753 757546.778092 5912548.19421 -0.291761695339 
+1754 757507.226309 5912520.9737 -0.337004304522 
+1755 757522.718024 5912467.29055 -0.557469698523 
+1756 757476.291331 5912429.44107 -1.97476993456 
+1757 757498.451708 5912359.1644 -1.06151867743 
+1758 757466.500678 5912286.01908 -6.14256251516 
+1759 757399.770303 5912234.37403 -7.96766259651 
+1760 757311.477923 5912236.02224 -7.33809520292 
+1761 757266.780263 5912319.41308 -6.58229661505 
+1762 757585.542259 5912539.34841 -0.630716223663 
+1763 757468.322769 5912549.64082 -2.3315536053 
+1764 757620.284047 5912558.77532 -0.350654054504 
+1765 757648.535905 5912522.72362 -0.346088270608 
+1766 757685.51076 5912477.32621 -0.88571106214 
+1767 757649.94691 5912403.44769 -0.316006579623 
+1768 757743.816316 5912492.14119 -0.812368448059 
+1769 757801.325084 5912442.46393 -0.607237298218 
+1770 757889.957358 5912416.35155 -0.426780362225 
+1771 757431.968436 5912517.53081 -5.68982836338 
+1772 757385.837806 5912533.11409 -8.0054814135 
+1773 757338.478263 5912512.70646 -7.92968584583 
+1774 757274.254344 5912524.43877 -7.20386094748 
+1775 757328.482864 5912450.02716 -7.71139087944 
+1776 757302.434724 5912382.45109 -7.10915897407 
+1777 757206.493464 5912509.75007 -5.88474277376 
+1778 757374.786812 5912582.84 -8.05246608951 
+1779 757341.656812 5912625.65002 -8.00799473766 
+1780 757577.306173 5912458.20017 -0.451385068121 
+1781 757427.368724 5912469.73957 -5.80085802657 
+1782 757388.435058 5912427.67796 -7.56920812951 
+1783 757374.450791 5912368.50381 -7.94878643582 
+1784 757420.092264 5912326.83351 -7.97322484432 
+1785 757230.442686 5912381.56784 -5.68927221457 
+1786 757611.447262 5912606.937 -0.318437847558 
+1787 757514.087526 5912607.09569 -0.311621022226 
+1788 757501.635976 5912645.72578 -2.13348079022 
+1789 757464.244608 5912675.63088 -5.78477139717 
+1790 757460.117569 5912729.08938 -4.63625746184 
+1791 757477.692135 5912589.13183 -2.59292651387 
+1792 757451.454234 5912783.44025 -4.18404750526 
+1793 757495.390623 5912817.29004 -1.73068740585 
+1794 757548.726968 5912799.64247 -0.645951602519 
+1795 757484.374145 5912870.83074 -6.77608264336 
+1796 757891.960172 5912326.34212 -0.453680809962 
+1797 757827.184521 5912240.36085 -0.379809648553 
+1798 757435.274063 5912889.8075 -8.0999635419 
+1799 757477.379094 5912925.74053 -8.03095048118 
+1800 757383.689444 5912898.30157 -8.28694147221 
+1801 757323.425003 5912920.99211 -8.22538690519 
+1802 757275.127599 5912872.67425 -7.5572855522 
+1803 757301.169441 5912805.63754 -8.04204442203 
+1804 757367.000175 5912945.35035 -8.07101331467 
+1805 757397.610287 5912987.74197 -7.85872026967 
+1806 757441.158282 5913026.60605 -7.86103852511 
+1807 757595.538771 5912502.90165 -0.433179766254 
+1808 757167.695693 5912562.39212 -5.66033380954 
+1809 757555.016212 5912746.47882 -0.402466352381 
+1810 757440.780409 5912598.55594 -6.0901181982 
+1811 757129.270557 5912610.07672 -5.37992582303 
+1812 757394.456331 5912850.99086 -8.0161766482 
+1813 757362.742731 5912818.42348 -7.42094579175 
+1814 757406.614678 5912807.42646 -5.80750455196 
+1815 757540.902747 5912712.15101 -0.928380808738 
+1816 757185.866864 5912616.35893 -6.31470627133 
+1817 757232.000163 5912651.58204 -7.39500043054 
+1818 757510.79411 5912728.88322 -2.40466853532 
+1819 757413.29542 5912743.68255 -5.83142621984 
+1820 757367.412367 5912726.34359 -7.90947097878 
+1821 757309.155493 5912736.63078 -8.13477950363 
+1822 757253.096502 5912762.89241 -7.52601891308 
+1823 757206.592626 5912725.26818 -7.32576216771 
+1824 757430.529612 5912631.9868 -7.27125798199 
+1825 757410.771071 5912660.87504 -8.24019312404 
+1826 757379.689104 5912686.15414 -8.42133790513 
+1827 757226.289109 5911717.43977 -3.33442278126 
+1828 757202.181199 5912446.79597 -5.48974951172 
+1829 759274.616185 5913044.31445 -0.945482015976 
+1830 757654.414947 5913335.53373 -0.4561191118 
+1831 757242.25487 5910822.00802 -0.193137796853 
+1832 757187.8 5910794.5 -0.215610878315 
+1833 760479.077942 5913115.4933 -0.918833227546 
+1834 759952.091666 5913011.52178 -0.826100772906 
+1835 760016.21125 5913008.12662 -1.00139256743 
+1836 757344.914405 5911035.70339 -0.131660656081 
+1837 759504.120351 5913455.76955 -0.205736126189 
+1838 759546.94481 5913448.85406 -0.521135564655 
+1839 759594.739234 5913425.47028 -1.32685796493 
+1840 757608.65 5911429.5 -0.0750956859951 
+1841 757603.741966 5911399.47951 -0.0786320689435 
+1842 757575.594743 5911359.76215 -0.0891562671801 
+1843 757635.756691 5911404.22921 -0.0716333225069 
+1844 757610.590785 5911331.38281 -0.0859289559086 
+1845 757628.912776 5911290.06961 -0.0991159501978 
+1846 757673.456843 5911285.73541 -0.09868888531 
+1847 757717.07728 5911257.49797 -0.110231846151 
+1848 757606.469093 5911252.8762 -0.140185010087 
+1849 757651.554487 5911378.76445 -0.0696574569753 
+1850 757696.217656 5911215.05735 -0.124209386967 
+1851 759415.308067 5912941.40735 -0.991083604628 
+1852 759450.004697 5912938.01632 -0.489772315702 
+1853 757245.855092 5911596.60856 -0.223724374283 
+1854 757265.157555 5911631.62044 -0.40222353842 
+1855 757293.957896 5911659.3451 -0.317018284369 
+1856 757146.685004 5911656.95557 -2.37001507718 
+1857 757138.103224 5911696.89492 -3.20453901608 
+1858 756506.727418 5912943.70566 -3.11432375388 
+1859 756543.65556 5912982.03187 -3.52757490194 
+1860 756531.871715 5913032.1594 -2.82241248984 
+1861 756570.181934 5913077.31994 -3.3529585443 
+1862 756542.344617 5913132.7465 -2.18741124443 
+1863 756628.545303 5913058.72097 -4.21126333777 
+1864 756664.639317 5913110.25581 -4.88308082324 
+1865 756653.971768 5913006.61873 -3.46780220423 
+1866 757891.19725 5912174.75309 -0.347944437325 
+1867 757777.535537 5911430.03999 -0.0733792840096 
+1868 756338.431177 5913730.44371 -0.437344713775 
+1869 760103.180417 5913465.98497 -1.65591990854 
+1870 760065.140641 5913422.61887 -1.43646728884 
+1871 760065.01676 5913363.45336 -0.765548861743 
+1872 760121.126083 5913353.11174 -1.55841390303 
+1873 760141.845458 5913300.74453 -1.45659798228 
+1874 760102.051189 5913214.75773 -0.979758576234 
+1875 760152.015314 5913243.83627 -1.46366996649 
+1876 760220.693775 5913210.45119 -1.74230143013 
+1877 760154.759455 5913181.65653 -1.69640199707 
+1878 760269.464439 5913268.33682 -0.244575251244 
+1879 760153.571511 5913455.11675 -0.0225253727894 
+1880 760015.700641 5913340.00507 -0.546070483562 
+1881 759963.005185 5913344.94258 -0.520646128752 
+1882 759900.17909 5913290.2234 -0.579529923485 
+1883 760035.93991 5913291.15288 -0.734223772571 
+1884 760005.17213 5913245.91638 -0.644728646665 
+1885 759936.726925 5913218.57294 -0.568663774223 
+1886 760075.041593 5913258.18746 -0.836530746714 
+1887 760051.1242 5913213.19918 -0.790010778204 
+1888 760058.099105 5913139.59824 -0.876191288941 
+1889 759988.877636 5913121.55127 -0.707089116016 
+1890 759406.320184 5913150.9035 -2.75350550625 
+1891 759708.016068 5912359.48914 -2.50310493336 
+1892 759748.978712 5913173.71822 -0.623187878828 
+1893 759784.240353 5913202.06676 -0.485656961838 
+1894 759748.338084 5913238.92467 -0.498704073486 
+1895 759767.164635 5913301.77027 -0.430471358178 
+1896 759718.848826 5913204.04771 -0.548122687182 
+1897 759662.110636 5913193.13429 -0.553375448314 
+1898 759824.343611 5913180.22966 -0.420713128652 
+1899 759854.40885 5913146.59289 -0.614947232106 
+1900 759905.069985 5913152.99356 -0.553563534836 
+1901 759839.034829 5913222.92134 -0.442462619552 
+1902 759843.207258 5913277.3733 -0.488438892098 
+1903 759888.600725 5913236.91942 -0.459798558415 
+1904 759940.373037 5913119.67842 -0.664130994681 
+1905 759954.209656 5913169.70303 -0.66959562826 
+1906 759724.06449 5913280.43899 -0.408188836235 
+1907 759678.651764 5913282.36711 -0.410376949781 
+1908 759706.445233 5913425.51867 -1.33951980298 
+1909 759746.432182 5913468.98305 -2.65634677162 
+1910 759808.208692 5913456.7559 -0.939783607773 
+1911 759825.766661 5913394.29405 -0.483981087655 
+1912 756927.753709 5912848.68644 -4.65592277608 
+1913 756875.028239 5913217.4619 -5.34620576447 
+1914 756806.513588 5913220.99296 -5.09311890839 
+1915 756522.027542 5911967.40376 0.0320073207009 
+1916 756564.969551 5911971.01643 -0.0911178469833 
+1917 757583.466814 5911060.79251 -0.599097018297 
+1918 757579.679787 5911101.22949 -0.528080833319 
+1919 757550.012319 5911129.91701 -0.385092673629 
+1920 757494.997804 5911121.432 -0.201950326288 
+1921 757540.337732 5911176.53402 -0.235795191114 
+1922 757495.103566 5911167.54965 -0.152518221329 
+1923 757609.007972 5911126.49995 -0.422072632707 
+1924 757631.095398 5911173.13021 -0.297810851899 
+1925 757652.997734 5911117.53652 -0.30257367601 
+1926 757608.753565 5911209.90625 -0.261463696788 
+1927 757657.444962 5911076.91455 -0.250352069572 
+1928 757539.187922 5910729.34238 -0.490751629033 
+1929 757567.658361 5910762.72479 -0.378790597133 
+1930 757560.579733 5910698.25838 -0.574047345333 
+1931 757547.230599 5910662.95926 -1.20082765697 
+1932 757506.067415 5910653.67266 -1.2821178641 
+1933 757592.076608 5910677.53875 -0.587033424799 
+1934 758170.304545 5912628.85596 -0.46230132185 
+1935 758195.05247 5912597.63679 -0.508760562269 
+1936 758227.802619 5912616.56227 -0.428670482895 
+1937 758255.657866 5912649.66726 -0.331588091269 
+1938 758261.026542 5912599.68915 -0.443102336573 
+1939 758263.687665 5912562.50243 -0.542414381955 
+1940 758266.768833 5912515.73483 -0.690180622481 
+1941 758259.330145 5912463.9822 -0.959413784795 
+1942 758231.675614 5912539.3081 -0.642117120025 
+1943 758295.614189 5912586.74764 -0.447906770607 
+1944 758341.738698 5912612.64938 -0.353159112904 
+1945 758334.470644 5912571.57299 -0.453195414898 
+1946 758295.675593 5912427.5679 -1.4767908583 
+1947 758287.327196 5912374.32469 -0.711606699898 
+1948 758225.845633 5912336.06167 -0.576083995218 
+1949 758371.65018 5912586.17564 -0.376021103442 
+1950 758400.749514 5912556.51231 -0.500788411383 
+1951 758386.65 5912629.0 -0.355481590142 
+1952 758294.232317 5912664.24279 -0.287660441279 
+1953 758331.85 5912683.0 -0.217668601675 
+1954 758329.877595 5912646.85245 -0.300878995629 
+1955 758249.364071 5912417.68945 -1.30732111236 
+1956 758229.984971 5912379.07099 -0.752492620005 
+1957 757909.996049 5910713.78974 -0.126793772413 
+1958 757883.14699 5910732.55758 -0.143668417724 
+1959 757922.038956 5910743.27739 -0.133835071532 
+1960 757929.15432 5910779.21664 -0.132008448009 
+1961 757905.850986 5910807.69586 -0.135976336006 
+1962 757918.987147 5910842.3658 -0.162897336887 
+1963 757953.41407 5910748.43639 -0.143752903578 
+1964 757973.456363 5910723.94601 -0.154967077723 
+1965 757876.074352 5910790.20857 -0.163635519479 
+1966 757838.154384 5910804.34038 -0.256925727501 
+1967 757864.140476 5910759.9308 -0.172390556602 
+1968 756558.5 5912546.0 -0.34818320164 
+1969 757406.646031 5912595.47484 -7.85935212841 
+1970 756720.058375 5913099.82903 -5.24676182214 
+1971 756700.412309 5913147.90027 -4.9485451262 
+1972 757450.264422 5911098.86642 -0.122296663319 
+1973 758362.58046 5912078.93591 -0.237406506374 
+1974 758326.185828 5912073.67318 -0.223779170363 
+1975 757028.110347 5913537.29977 -4.29222118239 
+1976 756981.643323 5913509.83413 -4.90164011668 
+1977 760468.49313 5912875.59685 -3.69494719922 
+1978 756597.644855 5913531.79382 -0.324374368877 
+1979 756571.797432 5913550.24433 -0.281897935576 
+1980 757882.185215 5912540.88025 -0.606619932351 
+1981 757851.668976 5912483.52676 -0.94201367386 
+1982 756950.7 5911652.0 -0.177215146017 
+1983 760477.319211 5912275.09664 -10.6070409774 
+1984 757375.387472 5911975.02698 -2.64341809058 
+1985 757806.164351 5911299.32986 -0.101034038208 
+1986 757798.82337 5911330.22541 -0.109890512523 
+1987 757822.662775 5911363.8548 -0.0974942289532 
+1988 757775.419439 5911307.27817 -0.0840830094216 
+1989 757744.269491 5911284.7073 -0.0865999757829 
+1990 757755.768328 5911248.58081 -0.107420319439 
+1991 757311.848101 5911776.01324 -2.81584972799 
+1992 757284.078966 5911818.63431 -4.0012175382 
+1993 757272.974579 5911776.99938 -3.60136151529 
+1994 757249.870367 5911805.34814 -4.12545780435 
+1995 757213.629551 5911810.42525 -3.82870967769 
+1996 757198.008648 5911777.50045 -3.71223824263 
+1997 757201.216326 5911843.35473 -2.73711981096 
+1998 757222.854221 5911876.79169 -3.54687661863 
+1999 757263.224288 5911900.49599 -4.86996926043 
+2000 757259.294691 5911958.33315 -6.07353455183 
+2001 757195.538206 5911979.23069 -6.24811883023 
+2002 757305.555135 5912000.73194 -6.09155897806 
+2003 757278.222929 5912073.8879 -7.4182306562 
+2004 757142.68054 5912021.03157 -6.92035564134 
+2005 757153.325078 5912086.28761 -7.13053393467 
+2006 757216.149777 5912113.02056 -7.39108723869 
+2007 757195.932682 5912181.54904 -6.9756605879 
+2008 757246.048939 5912225.02585 -6.10641561942 
+2009 757337.124392 5912115.05315 -7.52265263534 
+2010 757357.896141 5912180.25319 -7.75690653917 
+2011 757100.337135 5911927.18723 -5.31848497151 
+2012 757113.088248 5911965.87675 -6.3324796593 
+2013 757153.914655 5911975.01459 -6.20853811264 
+2014 757069.22948 5911953.37381 -6.32126810248 
+2015 757040.075914 5911984.2829 -6.34829057763 
+2016 757050.750374 5912043.25729 -6.62546423287 
+2017 757031.069845 5911939.58393 -6.1308128695 
+2018 756992.067199 5911927.18838 -5.74760626263 
+2019 756962.001762 5911955.08845 -5.50609914045 
+2020 757719.127665 5911604.83598 -0.0778142437145 
+2021 757759.172306 5911610.30927 -0.133380184145 
+2022 757775.61469 5911647.79662 -0.141035289545 
+2023 757750.882131 5911680.50739 -0.141132673361 
+2024 757711.784117 5911674.693 -0.185258505994 
+2025 757728.462996 5911709.8752 -0.155463085867 
+2026 757708.75822 5911746.41823 -0.124402067975 
+2027 757712.755594 5911785.79713 -0.0992655026964 
+2028 757732.433222 5911816.21035 -0.119117847083 
+2029 757741.882091 5911860.09918 -0.166830628233 
+2030 757775.860144 5911823.0912 -0.118279308308 
+2031 757822.178592 5911834.28242 -0.103984179773 
+2032 757758.892285 5911904.19284 -0.224036624621 
+2033 757807.695775 5911910.08773 -0.233870350202 
+2034 757851.210419 5911795.77553 -0.0279803170811 
+2035 757840.902809 5911875.06745 -0.15825023265 
+2036 757882.414711 5911883.76128 -0.154988044337 
+2037 757737.583785 5911942.96374 -0.31190465758 
+2038 757753.721841 5911984.81597 -0.41331384601 
+2039 757775.465728 5912030.42182 -0.28796070616 
+2040 757841.675001 5912036.06484 -0.334320242073 
+2041 757723.901793 5912025.60144 -0.300289307465 
+2042 757684.145932 5912072.54262 -0.297828995343 
+2043 757644.725716 5912134.43766 -0.285311891981 
+2044 757665.624349 5912016.55035 -0.274901611662 
+2045 757645.720041 5911950.20676 -0.235761930292 
+2046 757599.27489 5912000.29879 -0.246627175744 
+2047 757797.259916 5912077.65062 -0.329555346138 
+2048 757783.270389 5912141.13186 -0.386338351483 
+2049 757663.545011 5912206.8835 -0.319668864494 
+2050 757608.618878 5912259.59731 -0.281873369497 
+2051 757716.064246 5912125.68857 -0.334781097109 
+2052 757613.12921 5912336.16343 -0.271798141435 
+2053 757557.10279 5912052.52158 -0.280708047111 
+2054 757568.967427 5912120.37193 -0.428500621125 
+2055 757580.412136 5911936.23141 -0.212823701848 
+2056 757779.249787 5911940.62236 -0.301367154622 
+2057 757819.706805 5911949.7946 -0.29043061673 
+2058 757843.239118 5911987.83149 -0.291756210217 
+2059 757683.428608 5911807.05979 -0.141867064194 
+2060 757530.697717 5912170.37643 -0.478167472139 
+2061 757547.458338 5912234.37523 -0.423318088496 
+2062 757475.485147 5912147.79233 -2.0930400137 
+2063 757432.076751 5912180.75975 -6.77287425819 
+2064 757450.258234 5912099.47315 -4.16463904176 
+2065 757473.442011 5912039.10761 -0.403661502285 
+2066 757398.194112 5912075.98178 -5.08038822422 
+2067 757399.208363 5912022.69913 -2.91979002114 
+2068 757991.553256 5910756.5901 -0.151468814364 
+2069 758101.462273 5912509.71019 -0.577351697417 
+2070 758085.713322 5912466.02399 -1.10429302192 
+2071 758117.261526 5912425.2199 -0.960289872347 
+2072 758048.411224 5912440.43578 -0.828866211845 
+2073 758013.010804 5912393.19357 -0.541199701725 
+2074 758000.377393 5912457.95458 -0.857283621698 
+2075 757951.55029 5912420.21195 -0.450300159623 
+2076 758043.567931 5912339.48279 -0.449631934836 
+2077 757998.313929 5912508.81355 -1.01966923074 
+2078 758162.894362 5912439.10837 -1.12508620835 
+2079 758154.579126 5912384.51816 -0.672317471768 
+2080 758177.867312 5912484.17221 -0.82023882136 
+2081 758190.789958 5912361.13938 -0.636850886757 
+2082 758150.638549 5912338.68226 -0.540909328395 
+2083 758213.744393 5912456.26063 -1.16226518686 
+2084 757923.649923 5912372.07425 -0.404368530226 
+2085 758038.43356 5912530.93802 -0.613589385002 
+2086 757995.459427 5912561.4277 -0.453598384178 
+2087 757979.401454 5912607.09005 -0.399026934675 
+2088 757937.34609 5912619.30479 -0.404078983273 
+2089 757896.579703 5912612.25289 -0.394216814798 
+2090 757867.148753 5912637.95304 -0.340324294788 
+2091 758006.44677 5912640.8967 -0.427509584837 
+2092 758046.148737 5912638.36449 -0.486630152712 
+2093 757597.254782 5910506.04885 -0.744302937876 
+2094 757640.543044 5910497.01444 -1.15980689613 
+2095 757190.335184 5912329.55708 -5.50665378393 
+2096 757136.063336 5912296.84678 -6.04126963022 
+2097 757137.570212 5912238.42276 -6.64616923327 
+2098 757112.229996 5912349.45551 -6.17580787638 
+2099 757337.078559 5912787.3622 -7.89928553973 
+2100 757359.828048 5912656.43318 -8.19549169366 
+2101 760482.678755 5913081.07999 -1.02991135446 
+2102 759916.999736 5913334.33733 -0.4635540686 
+2103 759871.980703 5913365.22488 -0.280697400833 
+2104 756600.158886 5911955.39966 -0.155844266686 
+2105 758332.658266 5912534.31689 -0.605440941682 
+2106 758345.996063 5912495.8857 -0.77523739373 
+2107 758349.555666 5912445.3071 -1.70502259513 
+2108 758302.788906 5912514.12107 -0.699503874319 
+2109 758383.163389 5912494.40144 -0.685691910799 
+2110 758380.33466 5912410.89774 -1.36567048487 
+2111 758431.007894 5912412.36453 -1.26132879845 
+2112 758371.070055 5912365.68136 -0.800909962983 
+2113 758361.333463 5912311.35404 -0.601517838055 
+2114 758415.503261 5912273.57104 -0.578324522853 
+2115 758328.51811 5912352.47746 -0.588094293759 
+2116 758470.787398 5912238.63013 -0.548154234515 
+2117 758382.23635 5912101.79187 -0.242639068785 
+2118 757251.207819 5912013.59287 -7.12972820221 
+2119 757956.849554 5912527.11042 -1.07606251922 
+2120 757914.357848 5912506.01871 -1.06509326157 
+2121 757913.512737 5912458.09514 -0.52009899205 
+2122 757614.390043 5910467.47419 -1.15318242217 
+2123 760480.150835 5913050.26843 -1.57782834305 
+2124 759941.26512 5913299.82112 -0.553551235359 
+2125 759958.708747 5913258.09596 -0.618707293924 
+2126 759886.478834 5913411.69399 -0.47092525456 
+2127 759337.991458 5913140.37481 -0.493746417296 
+2128 757911.417698 5911501.09315 -0.0871013967541 
+2129 757870.566802 5911509.80533 -0.0896524455977 
+2130 757623.96604 5911681.11044 -0.105541619495 
+2131 759400.68503 5912827.51166 -0.836428657429 
+2132 759366.183004 5912848.58732 -1.02258477504 
+2133 757910.55807 5912779.98866 -0.292443578931 
+2134 757907.077727 5911625.96462 0.0161762149237 
+2135 757916.408175 5911592.19966 -0.0198216180035 
+2136 757923.032391 5911557.04726 -0.0396193457447 
+2137 756504.376846 5911793.95127 -0.0666426958958 
+2138 756533.731738 5911795.86933 -0.0837032885035 
+2139 756558.942175 5911824.6573 -0.0982485255013 
+2140 756582.723744 5911800.35331 -0.121830136363 
+2141 760549.55 5912757.0 -0.196105308257 
+2142 760518.08022 5912696.72868 -2.70693850884 
+2143 760282.968258 5912428.25428 -5.58960557489 
+2144 760205.563544 5912459.21961 -5.59212337268 
+2145 760202.429317 5912543.17665 -3.42557323052 
+2146 760132.083568 5912423.80329 -5.95520505706 
+2147 760124.945413 5912344.04167 -6.85319523816 
+2148 760213.797558 5912252.67458 -8.33493948934 
+2149 760060.880924 5912456.79305 -3.98748125074 
+2150 760265.606865 5912361.61588 -7.10971193965 
+2151 760309.406078 5912305.99872 -8.44187211893 
+2152 760220.570325 5912316.2438 -7.74325841433 
+2153 760155.321336 5912259.76187 -7.85916688272 
+2154 757232.750165 5910626.30198 -0.288575017623 
+2155 759581.455502 5913227.77592 -0.573878767311 
+2156 759302.83274 5912888.66537 -1.21010112187 
+2157 759549.087979 5913029.09045 -0.625244824204 
+2158 759509.198165 5913060.27954 -0.77480278085 
+2159 759538.358385 5913095.44269 -0.760614356046 
+2160 759577.756636 5913114.49304 -0.65583960054 
+2161 759614.071369 5913091.80017 -0.66768957092 
+2162 758554.349122 5912344.89179 -0.552493415463 
+2163 760782.727742 5912327.00433 -8.19987162777 
+2164 760734.209698 5912328.04308 -10.3390369 
+2165 760696.266681 5912355.04352 -9.72351141081 
+2166 756847.329794 5911997.50309 -1.86336015033 
+2167 756848.532895 5912035.57599 -1.74731120634 
+2168 756817.36943 5912062.8805 -1.2233315009 
+2169 756847.702606 5912091.11281 -3.95571136673 
+2170 756885.353461 5912107.73526 -4.69713330763 
+2171 756779.994385 5912075.54327 -2.92119400046 
+2172 756783.731354 5912040.74819 -0.905610559657 
+2173 756757.56425 5912011.24279 -0.647976023998 
+2174 756719.897585 5912023.94135 -1.09331421348 
+2175 756732.419218 5911986.69787 -0.456240534978 
+2176 757950.42257 5910661.13978 -0.181348193946 
+2177 757616.038994 5912639.95256 -0.47940616476 
+2178 757643.780024 5912655.51498 -0.729684238588 
+2179 757675.96128 5912640.99569 -0.832922701756 
+2180 757280.478487 5910834.56929 -0.174655808358 
+2181 756589.583075 5912973.11366 -3.90535183013 
+2182 756487.173174 5913040.49799 -1.95743256012 
+2183 756458.729487 5913084.67915 -1.16996309502 
+2184 759929.639143 5913078.43892 -0.756499112096 
+2185 759730.16336 5913322.324 -0.401497772919 
+2186 759773.849685 5913357.38696 -0.411791353233 
+2187 759735.534612 5913360.37848 -0.484105652662 
+2188 759708.343725 5913387.30121 -0.554508309056 
+2189 759661.966992 5913379.92465 -0.894438575164 
+2190 757835.009715 5912165.08203 -0.32811195559 
+2191 757789.201131 5912196.18081 -0.320297913732 
+2192 757748.056197 5912256.83867 -0.322492104057 
+2193 757761.624 5912322.55183 -0.352992635737 
+2194 757717.08324 5912370.15325 -0.359299626707 
+2195 757822.909716 5912304.19402 -0.354595074589 
+2196 757866.008123 5911955.52786 -0.288959398702 
+2197 758010.154631 5912296.70987 -0.474686679971 
+2198 758063.850912 5912289.20082 -0.462810730825 
+2199 757956.643912 5912295.84112 -0.504709822065 
+2200 758190.008337 5912323.00606 -0.543822558067 
+2201 758221.234017 5912279.63543 -0.513614742014 
+2202 757885.571741 5912577.33512 -0.449554756178 
+2203 758459.765445 5912311.18171 -0.65369050151 
+2204 758527.548027 5912227.91798 -0.476208089877 
+2205 757845.229129 5911483.2928 -0.0728745233518 
+2206 760509.21476 5912739.70905 -3.31211110718 
+2207 756453.845582 5913130.60094 -0.898860809801 
+2208 756440.788824 5913178.56851 -0.684350334127 
+2209 756481.107363 5913218.17216 -0.889962390468 
+2210 756495.605742 5913119.58518 -1.5016254457 
+2211 757889.155591 5911929.30445 -0.241425279874 
+2212 757915.727259 5911910.8607 -0.166283640302 
+2213 757948.861242 5911903.53314 -0.125816118161 
+2214 757969.344752 5911858.42928 -0.0369949338044 
+2215 757980.898235 5911890.87932 -0.09425560834 
+2216 758009.780368 5911913.13267 -0.124152434511 
+2217 757910.355158 5912556.6481 -0.538377046229 
+2218 757914.925197 5912587.28902 -0.441897971977 
+2219 756946.23759 5913668.49321 -2.19310021666 
+2220 757913.874353 5911460.15641 -0.0874166639681 
+2221 757075.149127 5913583.92965 -2.58887040451 
+2222 757061.734024 5913554.4425 -3.7600473454 
+2223 757057.548513 5913606.40057 -3.4468467039 
+2224 758549.539096 5912095.66751 -0.227084130977 
+2225 758579.869376 5912118.08637 -0.253749765772 
+2226 758571.837394 5912152.10433 -0.301569014141 
+2227 758541.410154 5912184.77013 -0.358619862214 
+2228 760370.138814 5913407.62539 -0.0998866302471 
+2229 760372.170147 5913364.92068 -0.0543749461726 
+2230 759495.533444 5913377.22061 -0.5379436681 
+2231 759305.22424 5913098.42601 -0.586762885375 
+2232 756418.499072 5913430.28773 -0.288401885411 
+2233 756452.036474 5913443.00599 -0.343926039242 
+2234 756482.435393 5913424.22915 -0.43704933812 
+2235 756491.604625 5913369.99963 -0.585590635205 
+2236 756522.954537 5913405.06924 -0.579103614581 
+2237 756530.861578 5913366.45369 -0.73719427136 
+2238 756569.746341 5913341.7912 -1.07472982244 
+2239 756600.538838 5913368.72783 -1.23959275676 
+2240 756598.562235 5913409.47933 -0.903893099943 
+2241 756581.395394 5913464.30684 -0.568637307732 
+2242 756596.274897 5913496.42392 -0.356622345408 
+2243 756628.385812 5913473.87422 -0.667123159003 
+2244 756562.35158 5913428.24282 -0.65184693814 
+2245 756610.253413 5913330.84353 -1.8662271286 
+2246 756626.204612 5913295.07736 -2.86699087323 
+2247 756656.408017 5913320.74834 -2.86403017656 
+2248 756686.056012 5913356.47438 -2.792135379 
+2249 756635.346995 5913395.7061 -1.41434720551 
+2250 756603.358351 5913265.31201 -2.38310559795 
+2251 756561.992228 5913266.43533 -1.54491774523 
+2252 756519.275873 5913275.81341 -1.00931187238 
+2253 756638.707637 5913253.31326 -3.47747648695 
+2254 756680.024809 5913242.49104 -4.23893827057 
+2255 756649.519953 5913213.01396 -3.92041137837 
+2256 756725.793049 5913230.92517 -4.54538785916 
+2257 756658.722835 5913171.72052 -4.37054888017 
+2258 756704.050505 5913276.22182 -3.86254953365 
+2259 756732.067612 5913186.32249 -5.06723288649 
+2260 756778.277334 5913184.36101 -5.43756521407 
+2261 756548.133976 5913303.24844 -1.05892230446 
+2262 756544.249522 5913460.86183 -0.487029862577 
+2263 756572.762786 5913229.9395 -1.88731343189 
+2264 756547.438766 5913184.50863 -1.82755763671 
+2265 756590.337845 5913190.36935 -2.50243267644 
+2266 756793.452208 5913146.12116 -5.74168228727 
+2267 756772.913402 5913108.92353 -5.69648036439 
+2268 756762.201612 5913064.03123 -5.26036870866 
+2269 756823.14698 5913117.90108 -5.78771167483 
+2270 756872.971904 5913126.73353 -5.90963609076 
+2271 756927.238847 5913093.53071 -6.05263783075 
+2272 756850.638297 5913081.55105 -6.00285218216 
+2273 756798.090206 5913036.37264 -5.20596847068 
+2274 756841.378509 5913041.12888 -5.58968914554 
+2275 756573.205095 5913155.84111 -2.724097609 
+2276 756578.716602 5913116.31013 -3.48354432405 
+2277 756606.316798 5913089.83946 -4.16420626607 
+2278 756765.81005 5913223.16927 -4.75776657332 
+2279 756965.902809 5913133.99847 -5.68182903672 
+2280 756959.852466 5913191.44964 -5.98845415875 
+2281 756790.410667 5912997.38175 -4.53395695871 
+2282 756755.558022 5912978.68526 -4.25885543739 
+2283 756813.141638 5912969.19688 -4.61859306804 
+2284 756849.505573 5912970.56704 -4.74279096016 
+2285 756869.488906 5913004.86132 -5.1013821191 
+2286 756816.350216 5912933.84181 -4.69025548176 
+2287 756834.484987 5912900.72615 -5.18052827831 
+2288 756788.185196 5912913.56777 -4.73272907853 
+2289 756753.640873 5912926.65117 -4.43063958893 
+2290 756765.072339 5912884.75316 -4.67726632913 
+2291 756779.757798 5912838.61979 -4.86760618924 
+2292 756736.500866 5912861.46109 -4.68183333611 
+2293 756694.098059 5912846.56808 -3.73668675997 
+2294 756880.634022 5912954.34245 -4.9124956003 
+2295 756883.655503 5912919.34512 -5.25819460788 
+2296 756915.425853 5912949.70935 -4.75631804202 
+2297 756950.319157 5912935.14117 -4.83355829211 
+2298 756939.700558 5912978.70095 -4.68542104771 
+2299 756924.874416 5913024.00322 -5.4436470411 
+2300 756897.144396 5912887.3511 -5.3657360268 
+2301 756969.615661 5913001.28095 -5.11618761408 
+2302 757011.773883 5913019.36555 -5.40962800074 
+2303 757050.643306 5913064.02927 -6.43078557811 
+2304 757111.152591 5913039.14861 -6.19083358433 
+2305 756931.179347 5912882.84682 -5.36093585295 
+2306 756964.506138 5912862.25282 -5.28932254739 
+2307 756687.590625 5912889.76938 -4.33283163053 
+2308 756647.77572 5912906.67846 -4.31174406933 
+2309 756682.110878 5912932.19608 -4.37280479584 
+2310 756608.570089 5912924.14279 -4.37194637623 
+2311 756659.148848 5912820.72226 -2.54989251395 
+2312 756619.188987 5912800.75211 -1.65246697779 
+2313 757006.792184 5913062.94624 -6.20967404646 
+2314 756968.256971 5913081.46763 -6.06544178765 
+2315 756676.823301 5912972.72786 -3.66599769736 
+2316 756707.042688 5913008.79574 -3.92407346169 
+2317 756833.433013 5912865.09922 -5.12063117215 
+2318 756852.860611 5912835.19991 -4.82202154577 
+2319 756888.679801 5912836.9833 -4.4911972539 
+2320 756853.815564 5912800.26585 -4.2307671975 
+2321 756872.103975 5912767.14254 -3.98788445514 
+2322 757163.64002 5913071.78991 -6.48895200681 
+2323 756907.792372 5912770.72317 -3.90973917319 
+2324 756938.751251 5912804.33365 -4.17609294347 
+2325 756697.174731 5912805.85534 -2.97272122826 
+2326 756976.20142 5912783.77573 -4.1857189086 
+2327 757019.265757 5912796.75372 -4.5905909459 
+2328 757050.88654 5912827.19427 -5.33006289655 
+2329 757108.685605 5912850.09788 -6.57252615468 
+2330 756985.144461 5912930.64032 -4.96505455972 
+2331 757008.558274 5912956.42403 -4.77779747351 
+2332 757039.164663 5912973.76843 -4.75689504851 
+2333 757074.185032 5912955.49132 -5.80017118459 
+2334 757093.10452 5912904.48277 -6.52186263637 
+2335 757094.52955 5912991.57635 -5.39242585718 
+2336 757015.017902 5912913.11954 -5.58892612387 
+2337 757015.659463 5912877.94656 -5.76598470813 
+2338 757048.743031 5912905.60356 -6.02609374979 
+2339 757135.076717 5912989.35997 -6.47623316925 
+2340 757179.302894 5912955.23856 -6.77310644487 
+2341 757228.96826 5912992.08255 -7.42285380141 
+2342 757089.132678 5912815.05918 -5.46188132954 
+2343 757107.698877 5912772.05384 -6.14500726964 
+2344 757156.178204 5912747.72922 -6.98924479591 
+2345 757199.776024 5912777.77692 -6.47361089255 
+2346 756720.227483 5912929.77583 -4.33351117061 
+2347 756826.266571 5912784.77393 -4.39420827527 
+2348 756798.592748 5912797.53681 -4.34479648682 
+2349 756801.781934 5912766.62913 -4.15512029287 
+2350 756795.990352 5912719.87082 -3.89341779194 
+2351 757215.262034 5912919.40935 -6.92021815338 
+2352 757208.640151 5912867.76072 -5.75390765317 
+2353 757160.916271 5912850.15254 -6.65495199651 
+2354 757010.964826 5912987.85398 -4.72448575036 
+2355 760409.181016 5912915.70842 -1.89946102353 
+2356 760434.184006 5912945.03848 -1.84940509656 
+2357 757772.455982 5911186.70797 -0.105409547943 
+2358 757757.889922 5910567.40722 -1.46048765493 
+2359 759635.455037 5913523.26076 -0.589627894142 
+2360 759666.023939 5913508.47524 -0.676385021817 
+2361 759703.642542 5913511.08694 -0.931871759095 
+2362 759740.307655 5913505.55399 -2.01374686061 
+2363 757677.242604 5910359.27677 -0.298246597093 
+2364 756676.590227 5912378.27129 -1.1236097318 
+2365 756838.594042 5912393.6387 -5.26264973168 
+2366 757298.995181 5910715.59733 -0.271172309949 
+2367 757327.644521 5910693.78737 -0.346312653257 
+2368 757338.991829 5910656.51257 -0.411311725303 
+2369 757358.591372 5910705.19875 -0.653846923674 
+2370 756528.288343 5912120.91385 -0.86091103565 
+2371 756574.003441 5912125.15818 -1.49402475759 
+2372 756581.320305 5912171.4523 -3.03329673365 
+2373 756555.160596 5912204.91577 -2.1772877453 
+2374 756628.424712 5912041.58018 -0.366099769604 
+2375 756590.908054 5912031.30379 -0.162009255242 
+2376 756569.162339 5912004.93616 -0.123386799828 
+2377 757084.721053 5913699.6801 -0.995991181094 
+2378 756963.966136 5912070.23339 -5.09483898448 
+2379 758075.47198 5912587.71336 -0.496428860524 
+2380 758047.681569 5912565.37392 -0.475857602235 
+2381 759559.037394 5913413.03453 -0.820848935594 
+2382 759585.9351 5913393.27997 -2.20289236822 
+2383 759578.779233 5913359.91141 -2.84999395295 
+2384 759557.627031 5913382.92502 -1.48430275915 
+2385 757689.630375 5911061.63439 -0.0228707793705 
+2386 757721.951531 5911076.48174 -0.033547646247 
+2387 757725.711236 5911112.43521 -0.04770483901 
+2388 760490.619271 5912849.89637 -3.90660138924 
+2389 757843.380898 5911393.10106 -0.0649338058834 
+2390 756973.01589 5911989.22118 -5.64329197849 
+2391 760509.398554 5913067.11991 -0.344887266945 
+2392 759877.019874 5913324.31784 -0.441067053368 
+2393 756572.971458 5911854.90277 -0.106433996108 
+2394 759651.315893 5913095.26168 -0.699508222547 
+2395 759680.3112 5913121.25029 -0.639783134078 
+2396 759670.015701 5913156.88967 -0.577851975604 
+2397 759715.130896 5913120.03746 -0.63677607984 
+2398 759673.059573 5913070.14607 -0.689916180622 
+2399 756854.690137 5912126.23758 -4.90866926231 
+2400 756873.767323 5912157.92489 -5.57105572534 
+2401 756854.585716 5912195.71019 -5.6750356274 
+2402 756789.000741 5911996.84965 -0.492238534362 
+2403 756798.217828 5911963.14252 -0.475580087631 
+2404 756772.68846 5911936.26566 -0.293238633786 
+2405 756818.282152 5911986.74279 -0.750435115783 
+2406 756770.495782 5911903.53327 -0.30141251299 
+2407 759964.475175 5913091.3884 -0.728278987242 
+2408 760010.368069 5913073.08831 -0.84044444424 
+2409 756787.7227 5913251.27425 -3.95791765405 
+2410 756788.023449 5913291.51024 -4.44587102032 
+2411 756821.426422 5913321.72109 -4.77974358073 
+2412 756826.008586 5913254.06141 -5.02864700098 
+2413 756862.51113 5913251.82413 -5.14915480855 
+2414 756902.607092 5913246.96895 -4.20153263284 
+2415 756917.680455 5913205.23873 -5.56907044508 
+2416 756911.999333 5913282.30749 -4.86969368243 
+2417 756945.579435 5913295.73689 -5.25929792201 
+2418 756880.680472 5913296.55771 -4.99837846114 
+2419 756874.4048 5913331.02789 -4.78028595545 
+2420 756904.55227 5913360.93584 -4.84371508653 
+2421 756954.332648 5913363.78604 -5.87967497416 
+2422 756876.592129 5913395.07952 -4.8778296093 
+2423 756893.402108 5913440.25814 -5.18625487465 
+2424 756941.051546 5913330.90686 -5.24393952213 
+2425 756940.469141 5913442.99639 -5.69091223718 
+2426 756962.900261 5913406.402 -5.99633628854 
+2427 756840.963499 5913222.96426 -5.24038798981 
+2428 756852.851815 5913188.36656 -5.52143047243 
+2429 756818.527729 5913188.83671 -5.45861520986 
+2430 756805.630649 5913358.67081 -4.56431205563 
+2431 756829.282187 5913390.76869 -4.47884346303 
+2432 756865.455655 5913158.38047 -5.80503266765 
+2433 760044.906437 5913098.68387 -0.9111894413 
+2434 760093.859261 5913090.9227 -1.00774517343 
+2435 756795.965644 5913706.06375 -0.540689889187 
+2436 756821.37565 5913687.29431 -0.480078852532 
+2437 756855.05 5913700.0 -0.526099160663 
+2438 756720.398875 5913657.7115 -0.250414995905 
+2439 756756.823741 5913643.19289 -0.157187128743 
+2440 756761.988791 5913606.01283 -0.176060103488 
+2441 756791.363464 5913646.31528 -0.128652327528 
+2442 757690.109946 5911000.47051 -0.198493519336 
+2443 759445.550513 5913207.04212 -2.37235934855 
+2444 759467.523658 5913179.68098 -2.19861858673 
+2445 759456.116703 5913134.66865 -1.18336748702 
+2446 756666.142601 5913740.2148 -0.0991728807179 
+2447 757405.749769 5911168.18488 -0.111845686017 
+2448 757411.246256 5911127.10313 -0.116219526893 
+2449 757341.8 5911116.0 -0.123765922787 
+2450 757363.881307 5911077.02419 -0.128549168249 
+2451 757391.512586 5911048.04426 -0.135864145457 
+2452 757433.483978 5911023.22902 -0.174672437971 
+2453 757426.639526 5911059.55451 -0.138603141326 
+2454 757376.774977 5911119.97633 -0.120937140429 
+2455 758999.157922 5912518.64 -0.77426138739 
+2456 757249.572098 5910571.60793 -0.295755751201 
+2457 757706.814406 5912821.66837 -0.227085929022 
+2458 757687.138324 5912862.70867 -0.267597148062 
+2459 757674.787568 5912831.55047 -0.267108658888 
+2460 757648.148635 5912811.51634 -0.368828824986 
+2461 757619.617513 5912799.6154 -0.407878470934 
+2462 757584.178639 5912816.38972 -0.423432000726 
+2463 757042.520843 5911877.76392 -4.94423399089 
+2464 757056.176327 5911845.14978 -3.08407216821 
+2465 760524.1 5913345.0 -0.317972707542 
+2466 760922.787378 5912207.19217 -5.11269297704 
+2467 760963.72079 5912193.54747 -4.13345040274 
+2468 758877.311708 5912591.93673 -1.91077204182 
+2469 757811.491276 5910735.30892 -0.219349496557 
+2470 757796.76379 5910794.95182 -0.310305206056 
+2471 757770.588173 5910816.98324 -0.398065903524 
+2472 757747.417878 5910838.41419 -0.451248142879 
+2473 757777.615171 5910847.38275 -0.486519729016 
+2474 757760.19487 5910788.69835 -0.351990129358 
+2475 757485.392861 5912713.50519 -4.27740620565 
+2476 760141.05 5913513.0 0.471342782027 
+2477 757576.564817 5911191.52681 -0.289057845765 
+2478 757533.213161 5910629.22012 -1.57761621941 
+2479 757306.280398 5912771.26354 -8.00304045261 
+2480 757276.951012 5912784.46961 -7.73353446639 
+2481 757267.425746 5912819.80579 -7.2301494465 
+2482 757296.809454 5912842.52042 -8.10583146704 
+2483 757312.663237 5912876.79193 -8.19023481707 
+2484 757246.928023 5912793.68661 -6.87285964914 
+2485 757290.50973 5912905.59604 -8.0707979704 
+2486 757328.724268 5912827.59398 -8.01611930643 
+2487 757249.810495 5912849.3672 -6.12682834825 
+2488 757282.090109 5912751.81962 -7.93693547099 
+2489 757258.034714 5912732.32726 -7.75547096458 
+2490 757230.292511 5912743.52663 -7.50791957763 
+2491 758408.654833 5912379.24473 -0.948570367845 
+2492 758447.150393 5912359.53575 -0.567504527711 
+2493 758467.523042 5912392.11048 -0.477090038325 
+2494 758505.802932 5912396.52306 -0.559094626094 
+2495 758525.846688 5912366.7308 -0.502634466498 
+2496 758512.857607 5912333.39569 -0.608355700141 
+2497 757870.253255 5912275.30482 -0.391593926996 
+2498 757876.113761 5912224.06842 -0.361876429643 
+2499 758266.864357 5912286.15095 -0.582919230379 
+2500 758303.683657 5912255.50689 -0.559150942174 
+2501 758294.883724 5912204.42104 -0.514499036049 
+2502 758248.951769 5912194.88849 -0.375927761321 
+2503 758214.987081 5912225.52112 -0.483753075156 
+2504 758564.243587 5912215.9065 -0.439242000424 
+2505 758597.961507 5912221.64869 -0.503181275953 
+2506 758610.716809 5912249.13206 -0.552770563575 
+2507 758597.527439 5912280.57846 -0.628325907824 
+2508 758555.992011 5912284.86959 -0.593984327365 
+2509 758586.336544 5912319.71625 -0.651873942344 
+2510 758618.028999 5912340.15523 -0.72868163256 
+2511 758644.347603 5912368.59306 -0.718161099032 
+2512 758632.335568 5912408.25673 -0.759975458795 
+2513 758651.835474 5912442.28705 -0.682457665221 
+2514 758628.23751 5912480.28943 -0.793828949972 
+2515 758594.444398 5912412.20059 -0.624803479944 
+2516 758565.431923 5912431.71494 -0.502546657399 
+2517 758521.719029 5912444.4621 -1.177503837 
+2518 758560.585579 5912472.34789 -1.71965016087 
+2519 758572.518473 5912384.96481 -0.56741090594 
+2520 758647.323145 5912325.30033 -0.649717870665 
+2521 760336.573464 5913421.41816 0.0180117104053 
+2522 760303.477375 5913405.11519 -0.0514716632508 
+2523 760292.980961 5913354.60992 -0.0217363009038 
+2524 760245.717429 5913321.15148 -0.402551902571 
+2525 756611.27341 5913122.63188 -4.08284792352 
+2526 756641.462798 5913131.56368 -4.52260631814 
+2527 756635.034895 5913101.3136 -4.61000569105 
+2528 756670.802788 5913140.21827 -4.71049621155 
+2529 756939.293023 5913058.75 -5.86459499555 
+2530 756908.286735 5913067.48315 -6.08262074866 
+2531 756893.002204 5913098.52265 -6.07128709183 
+2532 756914.096699 5913123.29682 -5.97000913317 
+2533 756942.214356 5913117.92688 -5.92057295863 
+2534 759716.001826 5913480.85229 -2.75166999663 
+2535 759722.01358 5913451.32195 -2.31633163469 
+2536 759736.356465 5913425.07 -0.825984699363 
+2537 757340.9945 5912893.30411 -8.30461086387 
+2538 757352.545893 5912920.05247 -8.22133715766 
+2539 758593.327398 5912485.55423 -1.5070966507 
+2540 758567.447102 5912502.52721 -2.05303763465 
+2541 758547.366369 5912528.86445 -1.00810059044 
+2542 759293.848812 5912661.98568 -0.680411670287 
+2543 759289.95712 5912785.02739 -1.28248131739 
+2544 759277.550849 5912752.84019 -1.20677581813 
+2545 759246.226202 5912760.75883 -1.38721932984 
+2546 759212.577124 5912766.19622 -1.33912863352 
+2547 759179.780641 5912779.12288 -1.51814073285 
+2548 759218.407564 5912732.39268 -1.47035327095 
+2549 759154.103314 5912756.35115 -2.10559959541 
+2550 759160.786699 5912724.87002 -1.24225956272 
+2551 759204.347197 5912800.66693 -1.27860866603 
+2552 759229.261078 5912826.89314 -1.65704578637 
+2553 759124.725415 5912744.9157 -2.48280776033 
+2554 759259.560353 5912813.95234 -1.40553546814 
+2555 759187.676791 5912716.2863 -1.54358578776 
+2556 759152.252722 5912792.78408 -8.61915107274 
+2557 760417.183359 5913184.81709 -0.350670823832 
+2558 757669.901637 5913220.62581 -0.717590119343 
+2559 757677.933649 5913253.26326 -0.379581573826 
+2560 757656.577906 5913282.95398 -1.18911675472 
+2561 757636.878368 5913215.94142 -2.89775968133 
+2562 757614.835064 5913238.39775 -4.26566457842 
+2563 757606.586106 5913280.11744 -3.80383366796 
+2564 756351.85 5913305.5 -0.295152510506 
+2565 756373.286925 5913284.33225 -0.342478762703 
+2566 756377.725915 5913237.63988 -0.423032486815 
+2567 756384.507719 5913316.10623 -0.295007687186 
+2568 756414.852502 5913316.06821 -0.379339971607 
+2569 756433.555147 5913291.83968 -0.467508139089 
+2570 756440.058306 5913256.50095 -0.51642039839 
+2571 756473.882178 5913251.57977 -0.726371898526 
+2572 756406.739565 5913254.18419 -0.427133858771 
+2573 756503.721815 5913240.54818 -1.0196206781 
+2574 760130.295752 5912672.35366 -1.70655509428 
+2575 760083.05 5912707.5 -0.113548326022 
+2576 760079.103197 5912655.2576 -1.26168958357 
+2577 759980.65 5912650.5 -0.161109164463 
+2578 760056.153957 5912599.90219 -1.59811380664 
+2579 760078.682864 5912544.75734 -2.41864173885 
+2580 760134.112838 5912561.73608 -2.54317582111 
+2581 760167.079499 5912604.96304 -1.66894981518 
+2582 759978.408739 5912592.82981 -0.966334747619 
+2583 760043.635321 5912506.06666 -2.72302234213 
+2584 759985.055417 5912505.09789 -2.3013756794 
+2585 759878.95 5912582.5 -0.734763971345 
+2586 760017.52309 5912469.27271 -2.94751747931 
+2587 760028.209945 5912424.84336 -3.91498958561 
+2588 760079.94942 5912404.61496 -5.55569788571 
+2589 759992.039903 5912385.57906 -4.31965340937 
+2590 759989.457762 5912332.89576 -5.41553417478 
+2591 760038.368894 5912273.93645 -6.53770453632 
+2592 759921.416452 5912288.11103 -4.88077501223 
+2593 759897.537072 5912335.8688 -3.86112649794 
+2594 759799.405173 5912302.89874 -2.73338640949 
+2595 759847.029758 5912343.78312 -2.89074571152 
+2596 759855.428941 5912392.45456 -2.50109102606 
+2597 759901.514935 5912382.78912 -2.96069959795 
+2598 759938.737028 5912417.05133 -2.85308044568 
+2599 759942.592058 5912468.61675 -2.32435256961 
+2600 759895.148619 5912481.57066 -1.98433530192 
+2601 759878.737434 5912529.27003 -1.52118164531 
+2602 760072.780783 5912313.08091 -6.72960020637 
+2603 759846.348465 5912435.09565 -2.20323396823 
+2604 759935.071584 5912567.76552 -0.99883142153 
+2605 759975.150633 5912548.46523 -1.57923064953 
+2606 757108.711481 5913508.14289 -3.30013369335 
+2607 758004.437342 5912720.77656 -0.345525852033 
+2608 757982.32836 5912701.07151 -0.370615470933 
+2609 757891.901579 5910913.47013 -0.294059050737 
+2610 757905.094367 5910949.43632 -0.182275509431 
+2611 756515.751137 5911856.44787 -0.0500317606242 
+2612 757512.952575 5911939.48014 -0.259057812253 
+2613 757366.003049 5911795.42412 -2.45003488843 
+2614 757382.869238 5911826.29024 -1.74898758533 
+2615 757415.18698 5911824.46236 -0.713387546905 
+2616 757434.196213 5911796.36869 -0.381241163202 
+2617 757400.706141 5911853.31102 -0.911459878342 
+2618 757418.367879 5911880.43688 -0.578765267941 
+2619 757450.650562 5911878.58353 -0.379651784905 
+2620 757494.541466 5911863.82416 -0.241977573022 
+2621 757386.505381 5911885.57109 -2.13375020344 
+2622 757360.992091 5911926.95221 -3.07399994575 
+2623 757439.075797 5911908.77465 -0.539860543966 
+2624 757460.805216 5911942.54049 -0.359080540734 
+2625 757488.416094 5911974.22017 -0.327403206186 
+2626 757420.57864 5911949.00902 -0.805975974997 
+2627 757450.412483 5911824.33496 -0.389889729843 
+2628 757486.381139 5911828.54173 -0.266640461877 
+2629 757451.881668 5911769.56003 -0.327141714009 
+2630 757418.375565 5911766.69413 -0.301146016527 
+2631 757351.087012 5911831.65884 -3.2921548194 
+2632 757332.811687 5911863.04972 -3.85807060238 
+2633 757319.423639 5911899.80961 -4.40364212616 
+2634 757311.111818 5911837.91633 -3.9134867976 
+2635 757410.640762 5911984.00345 -0.977271709232 
+2636 757352.623363 5911891.08311 -3.70938493202 
+2637 757406.24033 5910525.77814 -0.285220147752 
+2638 757405.788281 5910489.00176 -0.253488776339 
+2639 756507.9 5912650.5 -0.349233750212 
+2640 757603.133115 5912416.90218 -0.340397219519 
+2641 757588.432737 5912374.09399 -0.29981701006 
+2642 757544.390869 5912360.91168 -0.373626006602 
+2643 757148.157125 5911730.26754 -3.08678600669 
+2644 757147.236741 5911769.769 -2.21054126779 
+2645 757175.268153 5911715.93497 -3.79121752737 
+2646 757143.300729 5911803.61129 -1.12173630831 
+2647 757117.372127 5911818.15305 -0.830084950915 
+2648 760077.670893 5913178.58395 -0.896454418702 
+2649 760096.911578 5913144.51904 -1.03083637718 
+2650 760116.302171 5913177.93757 -1.0882137795 
+2651 760039.413019 5913173.38473 -0.854333134558 
+2652 760007.523389 5913153.9241 -0.804385874092 
+2653 760022.461648 5913123.76402 -0.849494236896 
+2654 757255.58776 5911867.27287 -4.42112767903 
+2655 758131.873524 5912304.0832 -0.470835621481 
+2656 758140.590172 5912269.26433 -0.447063448577 
+2657 758135.020101 5912233.5648 -0.480109141531 
+2658 758141.727298 5912195.96507 -0.485078170248 
+2659 758101.493477 5912221.12906 -0.51671578354 
+2660 758064.929067 5912244.99305 -0.42518581678 
+2661 758044.41935 5912203.60835 -0.431110722817 
+2662 757997.584107 5912203.19182 -0.373893399704 
+2663 757950.532215 5912202.77841 -0.375157139944 
+2664 758174.8996 5912179.76204 -0.482274411284 
+2665 758178.287188 5912143.93902 -0.482452338568 
+2666 758172.847475 5912256.75289 -0.469445308393 
+2667 757977.821954 5912241.94147 -0.4349812802 
+2668 757932.315016 5912164.5233 -0.341555007813 
+2669 757900.149657 5912122.98694 -0.353182857855 
+2670 757951.318974 5912121.22108 -0.330961237056 
+2671 757998.167286 5912121.8525 -0.357592797891 
+2672 757879.048605 5912077.25041 -0.327927017454 
+2673 757905.999235 5912035.07679 -0.313260204614 
+2674 757975.246536 5912084.18623 -0.380851367912 
+2675 758097.389698 5912298.80175 -0.495624609077 
+2676 758072.776146 5912322.18168 -0.461709581231 
+2677 758077.500459 5912361.93592 -0.494522585355 
+2678 758116.590272 5912371.34812 -0.533696195884 
+2679 758045.096181 5912377.23577 -0.520425598892 
+2680 757347.447428 5912754.46768 -8.15591584732 
+2681 758443.56494 5912453.93716 -1.7204593351 
+2682 759848.612366 5913429.19937 -0.577653522759 
+2683 757889.345951 5912752.00976 -0.2803403904 
+2684 757865.346333 5912731.797 -0.286630904805 
+2685 757848.264217 5912704.6376 -0.314130565938 
+2686 757815.654892 5912706.37235 -0.333357262988 
+2687 757916.261493 5912737.2236 -0.275902868829 
+2688 760272.273779 5912245.58729 -8.79509107576 
+2689 760757.746039 5912293.76849 -11.5208913249 
+2690 760786.215504 5912263.67336 -11.9478780181 
+2691 760774.472761 5912224.25446 -13.3666592747 
+2692 760736.846875 5912189.28125 -13.7738081638 
+2693 760719.655839 5912283.35121 -12.0843572554 
+2694 760669.502006 5912254.91335 -12.419754984 
+2695 760707.620141 5912246.13241 -12.9021590609 
+2696 760732.285672 5912222.87457 -13.4989574611 
+2697 759930.215224 5913041.77723 -0.814661871089 
+2698 759912.794185 5913014.74857 -0.765167079938 
+2699 759881.684554 5913011.60531 -0.718352336945 
+2700 759847.182783 5913012.25006 -0.776392577368 
+2701 759865.267158 5913035.25531 -0.794070449404 
+2702 759865.375667 5913075.50578 -0.778471206558 
+2703 759818.758414 5913022.61784 -0.821401314092 
+2704 756433.838571 5913467.64425 -0.294236384466 
+2705 756440.84175 5913495.47788 -0.277568664796 
+2706 756473.070207 5913511.90004 -0.278184499276 
+2707 756625.755424 5912837.57731 -2.34071146996 
+2708 756824.20493 5912129.31638 -4.89855308734 
+2709 756806.368656 5912154.15082 -5.25903609079 
+2710 756787.143491 5912186.12307 -5.29808571623 
+2711 756749.56463 5912178.32917 -5.03252289176 
+2712 756818.812775 5912182.80129 -5.43060178932 
+2713 759457.266274 5913094.72708 -0.86233002278 
+2714 759474.068423 5913063.68829 -0.860693352319 
+2715 759461.612122 5913022.47289 -0.857324541314 
+2716 759473.003846 5912985.67408 -0.62893981098 
+2717 759528.65 5912947.0 0.227786645701 
+2718 759535.735048 5912995.83392 -0.564903481716 
+2719 759568.599593 5913001.94733 -0.52175245113 
+2720 759597.6 5912967.5 -0.0580851906111 
+2721 759501.688481 5912967.57669 -0.490160593189 
+2722 759474.166075 5912955.73474 -0.49565810201 
+2723 759489.236927 5913037.28756 -0.758042100365 
+2724 758482.356975 5912331.74021 -0.638736867956 
+2725 758326.561811 5912289.56917 -0.574085319581 
+2726 758527.15112 5912263.69506 -0.560686274957 
+2727 758490.274478 5912270.71462 -0.598517769183 
+2728 758452.863423 5912271.47672 -0.605560113393 
+2729 757494.135534 5912009.71155 -0.339133007106 
+2730 757515.163182 5912046.49578 -0.326030390704 
+2731 757461.763695 5912008.9049 -0.460394463526 
+2732 757435.069133 5912036.58589 -1.42923782356 
+2733 757452.427043 5912065.67139 -1.75769671601 
+2734 757484.856837 5912069.73254 -0.756132100867 
+2735 757427.249697 5912081.0264 -4.16267782159 
+2736 757466.078515 5911851.82234 -0.315003543192 
+2737 757627.074213 5912372.24816 -0.267654621805 
+2738 757660.072519 5912338.75901 -0.312695457088 
+2739 757649.275764 5912289.47389 -0.284686071191 
+2740 757690.858237 5912254.1303 -0.297809888639 
+2741 758201.46964 5912196.92418 -0.487162432747 
+2742 759424.643261 5913025.02002 -1.22129666069 
+2743 759410.664431 5912992.95101 -1.37997210313 
+2744 759405.119896 5913053.38351 -0.938378666246 
+2745 759417.434343 5913083.67187 -1.25659697231 
+2746 757660.23529 5912371.9213 -0.307925884022 
+2747 757689.526525 5912398.92221 -0.342823414827 
+2748 757673.880428 5912437.42568 -0.350087236967 
+2749 757688.166787 5912355.20266 -0.331702105454 
+2750 757634.948242 5912439.43067 -0.364146171504 
+2751 759251.54418 5912927.45962 -4.67043372074 
+2752 757757.94399 5912876.2394 -0.239741204928 
+2753 757782.073278 5912844.93929 -0.269762896377 
+2754 757723.97945 5912883.45093 -0.262128251309 
+2755 757745.1 5912941.0 -0.0630684753778 
+2756 757714.053929 5912939.24946 -0.0892286926312 
+2757 757733.669369 5912912.54488 -0.16219276344 
+2758 757354.919524 5910435.45169 -0.255475940516 
+2759 757351.038273 5910469.50128 -0.264832629195 
+2760 756472.010694 5912215.49489 -0.503816209848 
+2761 756504.03574 5912217.47394 -0.800189087515 
+2762 756524.403489 5912190.0471 -1.79051119491 
+2763 757215.772261 5911674.49909 -2.18393711506 
+2764 757188.393826 5911651.02392 -2.05040435014 
+2765 760288.385866 5912639.79012 -1.20169151516 
+2766 760324.802739 5912573.63758 -1.45809857717 
+2767 760262.66579 5912582.53127 -1.74548880433 
+2768 757940.401174 5910599.83752 -0.225127764858 
+2769 756359.957561 5913058.56633 -0.338240816828 
+2770 756405.719322 5913056.85359 -0.616729006926 
+2771 756366.933617 5913104.06158 -0.356007296183 
+2772 759945.791893 5913551.28169 -1.58235713964 
+2773 759970.8 5913572.0 -0.269323173248 
+2774 756338.778011 5913693.63037 -0.486336022386 
+2775 758038.389356 5910697.72887 -0.16957573127 
+2776 758859.100548 5912680.57623 -0.225070088817 
+2777 758849.873592 5912644.39688 -0.161840911753 
+2778 758809.627777 5912630.66296 0.000175084242553 
+2779 758778.368385 5912663.97092 -0.0709664744698 
+2780 758735.113446 5912664.07791 -0.0555829716032 
+2781 758787.265751 5912598.24295 -0.658004591844 
+2782 757072.795144 5911661.35421 -0.432016800511 
+2783 757533.354536 5913255.08591 -5.5444007135 
+2784 757493.456223 5913232.16142 -6.31824701717 
+2785 758682.6 5912131.0 -0.330063040542 
+2786 757501.681356 5911080.05937 -0.285596911468 
+2787 757067.135722 5913402.72617 -5.98107886391 
+2788 757547.654918 5910967.03561 -0.683400960619 
+2789 758719.351486 5912584.19696 -1.1072335734 
+2790 756575.222679 5912729.7071 -0.938252724785 
+2791 757548.6121 5910794.92676 -0.428766412992 
+2792 757513.028387 5910801.21199 -0.669449236533 
+2793 757577.486332 5910810.01596 -0.417711271253 
+2794 757584.967937 5910842.29673 -0.535238279043 
+2795 757560.470835 5910863.97876 -0.61403447771 
+2796 757008.821639 5912002.38648 -6.07889599328 
+2797 757014.087547 5912038.92669 -6.2420976894 
+2798 757037.151823 5912015.2654 -6.4268275916 
+2799 757789.50749 5911788.42724 -0.0554644751437 
+2800 757773.055136 5911755.25126 -0.047794955449 
+2801 757741.863069 5911743.87303 -0.0834008290838 
+2802 757876.326175 5912371.02125 -0.384504992776 
+2803 757841.828359 5912406.10967 -0.42505775891 
+2804 757850.49411 5912336.9073 -0.480500173242 
+2805 757093.229517 5912260.99107 -6.68075819454 
+2806 756775.117434 5912108.57826 -4.40044355666 
+2807 759694.998393 5913314.47566 -0.403354320085 
+2808 759663.097881 5913335.63157 -0.510278147511 
+2809 759627.375156 5913339.27563 -0.665813525768 
+2810 759603.955324 5913311.78591 -0.656190025939 
+2811 759615.859416 5913275.49479 -0.4614919394 
+2812 759648.730944 5913265.45065 -0.416755089044 
+2813 759662.094309 5913232.17127 -0.524107041225 
+2814 756560.467407 5913487.9777 -0.444029430523 
+2815 756727.950526 5913044.98911 -4.7300195563 
+2816 756857.613531 5912738.61862 -3.99502132953 
+2817 757740.077639 5911179.78813 -0.115767903188 
+2818 757711.861783 5911171.73033 -0.110838302457 
+2819 756952.377222 5912011.71714 -5.28822178843 
+2820 758676.222813 5912376.91026 -0.635617350329 
+2821 758703.446238 5912395.47653 -0.625141267969 
+2822 758733.219338 5912410.34002 -0.622561763117 
+2823 758701.130845 5912428.67291 -0.628980110871 
+2824 758703.129688 5912461.92005 -0.635303985227 
+2825 758737.985387 5912484.40783 -0.640887910623 
+2826 758703.606383 5912358.818 -0.58120287135 
+2827 758702.11531 5912325.36581 -0.527430252988 
+2828 758699.597947 5912494.87845 -0.722106600081 
+2829 758713.751302 5912294.67973 -0.503371044839 
+2830 758686.592143 5912523.74031 -1.38848226367 
+2831 758685.792538 5912562.95277 -1.88081150977 
+2832 758744.041701 5912290.33926 -0.515767728063 
+2833 758777.581055 5912312.59811 -0.557946618791 
+2834 758730.541623 5912348.19642 -0.565824208179 
+2835 760414.462056 5913229.01228 -0.241497922118 
+2836 757379.618624 5910544.48077 -0.281084377017 
+2837 757350.982758 5910536.49019 -0.288008188418 
+2838 758117.376028 5912174.61181 -0.473744835287 
+2839 758090.830744 5912155.43359 -0.429468942876 
+2840 758118.821132 5912138.38105 -0.472837240153 
+2841 758150.730342 5912117.87654 -0.434228436654 
+2842 758118.7423 5912104.28415 -0.438758148918 
+2843 758085.047455 5912083.33308 -0.43126086157 
+2844 758054.207594 5912107.24478 -0.42403645794 
+2845 758063.010178 5912169.38104 -0.443998524342 
+2846 758063.180481 5912138.31013 -0.411571858775 
+2847 758055.058586 5912061.78766 -0.40162643476 
+2848 758162.962633 5912087.03958 -0.362360722667 
+2849 758193.722652 5912077.59757 -0.27999646175 
+2850 758216.448091 5912098.34508 -0.308406109357 
+2851 758235.361383 5912132.39719 -0.402835641307 
+2852 758158.935359 5912056.00734 -0.264696789468 
+2853 758130.830746 5912041.78459 -0.291576641156 
+2854 757323.049366 5910461.5443 -0.268779005151 
+2855 760314.433426 5912695.79997 -1.66182319526 
+2856 760323.546834 5912749.83515 -1.61795504242 
+2857 760479.232264 5912936.66252 -3.23380570308 
+2858 760510.604723 5912931.61634 -1.81807510446 
+2859 756673.773852 5913701.22819 -0.227619679809 
+2860 757216.325121 5913366.12645 -5.1042992913 
+2861 757193.723996 5913322.99987 -6.52479804233 
+2862 757232.650761 5913280.24184 -6.89169599631 
+2863 757183.871197 5913355.64889 -6.17331177414 
+2864 757219.204975 5913399.2093 -3.07909435973 
+2865 757195.346085 5913420.65272 -3.46510470266 
+2866 757279.108293 5913299.56953 -6.53878484209 
+2867 757317.395824 5913276.20764 -6.54834330879 
+2868 757322.108181 5913232.52556 -7.1011802473 
+2869 757356.549353 5913256.50997 -6.74080638787 
+2870 757357.123551 5913296.58932 -5.48939383981 
+2871 757390.72366 5913240.10899 -6.84805429157 
+2872 757329.288479 5913194.06805 -7.31871133439 
+2873 760798.9 5912448.0 -3.952900454 
+2874 759247.961259 5912615.54826 -0.844836527306 
+2875 757725.74221 5911454.94731 -0.0637675205058 
+2876 758969.58695 5912689.285 -0.521625795382 
+2877 757802.364168 5910471.36569 -0.410968239315 
+2878 757709.756268 5910748.99935 -0.585332321622 
+2879 757729.274277 5910776.09249 -0.406450882422 
+2880 756615.598973 5912423.52035 -0.543854375167 
+2881 757261.533086 5910760.47258 -0.226696713258 
+2882 756609.950247 5912346.23636 -0.477784640772 
+2883 757524.308366 5913042.79764 -7.78366697903 
+2884 757522.937237 5913085.14184 -7.55163084348 
+2885 757496.637503 5913125.89922 -7.46125306467 
+2886 757488.599702 5913021.31539 -7.78780376113 
+2887 757524.207376 5913159.99123 -6.98811924677 
+2888 757574.07824 5913161.86179 -5.74367674227 
+2889 757512.835338 5912993.16135 -7.94094958376 
+2890 757542.679306 5912968.70638 -7.62726283101 
+2891 757505.717324 5912956.70804 -8.09601780647 
+2892 757419.468506 5910931.53043 -0.2018386224 
+2893 757416.5121 5910967.73142 -0.171183814978 
+2894 756714.143418 5912607.813 -2.65541734747 
+2895 756753.97951 5912599.85556 -3.28144286993 
+2896 756703.475195 5912652.43335 -3.0700205667 
+2897 756698.951135 5912691.56656 -2.94809847846 
+2898 756733.876127 5912674.18679 -3.51897747712 
+2899 756762.109263 5912693.11368 -3.8071145511 
+2900 756761.479751 5912658.0853 -3.72986663238 
+2901 756790.332166 5912638.0843 -3.76181533898 
+2902 756816.443944 5912656.15304 -3.8780943475 
+2903 756816.391795 5912623.49569 -3.8724419512 
+2904 756844.653533 5912603.37633 -3.92862009958 
+2905 756819.607366 5912587.40715 -3.65359151946 
+2906 756814.012359 5912556.85067 -2.79377284629 
+2907 757639.72462 5912592.41903 -0.356150561277 
+2908 757670.812931 5912596.3702 -0.518517767384 
+2909 757697.857723 5912574.79885 -0.75404454636 
+2910 757729.031852 5912590.78205 -0.501305407249 
+2911 757739.25807 5912560.42314 -0.426699316842 
+2912 757776.700458 5912543.09576 -0.447642834886 
+2913 757792.727474 5912496.66416 -0.690673934073 
+2914 757741.873285 5912526.3046 -0.486954859972 
+2915 757752.684795 5912612.22421 -0.381310032205 
+2916 757783.988767 5912605.99032 -0.374285065772 
+2917 757820.037522 5912597.35118 -0.38354122573 
+2918 757840.964591 5912567.27743 -0.420449474177 
+2919 757773.698058 5912634.84628 -0.36914781409 
+2920 757792.403706 5912659.27861 -0.360482804491 
+2921 757823.207285 5912655.26897 -0.357850979096 
+2922 757725.44743 5912621.24509 -0.512877144857 
+2923 757850.080398 5912536.12955 -0.606613657431 
+2924 757831.459892 5912509.24184 -0.775055398556 
+2925 757870.289482 5912510.41447 -0.824661470794 
+2926 757886.173425 5912479.52292 -0.833407837031 
+2927 757864.862471 5912446.54739 -0.647544132911 
+2928 757836.441277 5912625.49906 -0.369852066818 
+2929 757766.77556 5912510.58395 -0.589023289318 
+2930 757832.368079 5912455.79732 -0.63324999796 
+2931 757807.365701 5912471.20416 -0.824066627424 
+2932 757769.7998 5912464.09484 -0.868818373791 
+2933 757765.070721 5912423.41436 -0.497283771087 
+2934 757798.54955 5912403.72252 -0.45170854408 
+2935 757764.470952 5912370.78853 -0.418437590155 
+2936 757737.106074 5912400.36153 -0.463920355244 
+2937 757658.805256 5911201.62889 -0.199173904323 
+2938 757629.781834 5911056.50645 -0.41612169324 
+2939 758256.842106 5912354.78234 -0.618373801676 
+2940 758256.856619 5912319.73699 -0.593763480289 
+2941 758295.445046 5912069.83077 -0.202128030112 
+2942 758274.77061 5912089.23209 -0.24928609481 
+2943 758276.548192 5912121.25775 -0.348949882817 
+2944 758313.562451 5912139.67877 -0.347270077572 
+2945 757115.275706 5912000.21912 -6.71321929223 
+2946 757102.290135 5912045.7668 -6.85228894041 
+2947 756632.632601 5911958.80155 -0.216735069363 
+2948 759974.458104 5913223.46211 -0.657256763654 
+2949 757854.343768 5911540.92129 -0.0665995562124 
+2950 757822.365272 5911548.43818 -0.0781931579121 
+2951 756686.081376 5913305.65108 -3.41950924752 
+2952 756806.47208 5912852.10949 -5.14146063859 
+2953 759757.45164 5913531.66049 -1.15439269765 
+2954 756742.808943 5913682.75991 -0.253313270027 
+2955 760274.223905 5913394.8312 -0.0520017344501 
+2956 759266.333298 5912686.70242 -0.990630515493 
+2957 759234.374136 5912687.38518 -1.04291651124 
+2958 759214.507304 5912664.51435 -1.0283122739 
+2959 757599.017074 5913314.95288 -2.98378337648 
+2960 756452.866138 5913229.07219 -0.654476549951 
+2961 756490.503399 5913275.07727 -0.798692453753 
+2962 760037.740837 5912639.97075 -0.817245717953 
+2963 760016.413602 5912605.90496 -1.09018418851 
+2964 757575.116987 5912338.41896 -0.306395563835 
+2965 757591.851072 5912299.00097 -0.305482684665 
+2966 757570.016127 5912266.43983 -0.322622548738 
+2967 757264.912353 5911840.07099 -4.32748771879 
+2968 759842.52869 5913463.67783 -0.912742460308 
+2969 759864.784425 5913502.123 -2.40144109417 
+2970 759818.31401 5913495.19505 -2.44912613504 
+2971 757649.09105 5912247.12346 -0.286912152343 
+2972 757618.091805 5912218.43866 -0.312107720271 
+2973 757632.529795 5912180.05712 -0.330740864889 
+2974 757671.716831 5912166.09343 -0.32254771781 
+2975 757607.825024 5912149.01258 -0.342959791318 
+2976 757612.18347 5912106.04732 -0.354045234094 
+2977 757650.236626 5912093.74512 -0.315615858239 
+2978 757683.437148 5912109.126 -0.293727393976 
+2979 757698.309448 5912192.63456 -0.31915902012 
+2980 757724.273249 5912223.89173 -0.310432663737 
+2981 757705.597222 5912158.73998 -0.344274976722 
+2982 757761.78746 5912221.86927 -0.311790020295 
+2983 757788.435379 5912252.51357 -0.363471339904 
+2984 757771.625541 5912286.22956 -0.367777989416 
+2985 757733.188226 5912295.18375 -0.335874856405 
+2986 757573.11321 5912155.42716 -0.4025612422 
+2987 757586.828414 5912077.03569 -0.444385060376 
+2988 757593.446335 5912038.73126 -0.28344867317 
+2989 757628.537858 5912024.39493 -0.282358670726 
+2990 757634.946369 5911986.79535 -0.252841643466 
+2991 757671.686262 5911977.7331 -0.264140174424 
+2992 757685.36994 5911938.81454 -0.257858763511 
+2993 757605.765578 5911963.57732 -0.211986962601 
+2994 757552.590107 5912088.27322 -0.493666397567 
+2995 757532.762472 5912118.61697 -0.527387550598 
+2996 757501.588642 5912128.22759 -0.871949807609 
+2997 757473.573398 5912118.0455 -2.46619326981 
+2998 757442.314293 5912134.98928 -5.17578435263 
+2999 757503.529541 5912158.01331 -0.86666397035 
+3000 757505.627305 5912189.43627 -1.15482767003 
+3001 757511.57479 5912225.83861 -1.17756841899 
+3002 757520.786828 5912266.80223 -0.646067216304 
+3003 757477.686978 5912247.42733 -4.173354629 
+3004 757436.148155 5912256.3039 -7.92808457864 
+3005 757396.826054 5912280.39524 -8.03964646403 
+3006 757352.316225 5912261.73969 -7.81766893333 
+3007 757311.569155 5912293.57362 -7.32144872427 
+3008 757503.577361 5912304.47234 -1.34003643723 
+3009 757468.359765 5912328.75802 -5.3083523133 
+3010 757267.940968 5912269.6878 -6.85408777195 
+3011 757478.286489 5912177.49522 -3.04392001933 
+3012 757227.055653 5912293.60963 -6.09627868152 
+3013 757324.013488 5912339.76073 -7.52250085602 
+3014 757535.916777 5912203.20373 -0.569442349963 
+3015 757568.545461 5912208.84507 -0.350232390717 
+3016 757675.306814 5911903.65397 -0.204019712598 
+3017 757680.938317 5911867.09042 -0.166200321876 
+3018 757642.574995 5911915.52953 -0.206500378541 
+3019 757600.56535 5911893.06561 -0.188679519129 
+3020 757434.119769 5912218.53143 -7.3814253805 
+3021 757461.091512 5912366.04468 -4.45046911745 
+3022 757485.500519 5912393.71275 -1.29814700352 
+3023 757517.084958 5912420.90485 -0.436843626884 
+3024 757613.264647 5911931.19861 -0.20895907808 
+3025 757614.626 5911852.88353 -0.140601005413 
+3026 757683.539104 5912138.83634 -0.326396370512 
+3027 757349.690566 5912220.6256 -7.79624611811 
+3028 757608.773967 5911816.95413 -0.137822934234 
+3029 757791.639528 5912311.27865 -0.397614314625 
+3030 757786.995287 5912344.50874 -0.385551143453 
+3031 757817.769937 5912335.76981 -0.3860781165 
+3032 757430.956355 5912291.96642 -8.01998874529 
+3033 757429.976509 5912357.53854 -7.36542136683 
+3034 757399.709062 5912350.33849 -8.09783932422 
+3035 757389.596107 5912320.97816 -8.0402513187 
+3036 757547.058697 5912439.77351 -0.409871545722 
+3037 757523.279879 5910829.69726 -0.652033067824 
+3038 757529.572944 5910860.18452 -0.84217151261 
+3039 757604.160517 5910816.71981 -0.433384204105 
+3040 756795.21159 5912128.30025 -4.76337328253 
+3041 758679.568836 5912446.65289 -0.638601436095 
+3042 760385.848427 5913205.06903 -0.175627815701 
+3043 760339.7717 5913202.91976 -0.0892354149822 
+3044 760318.458977 5913250.50386 -0.0506841509824 
+3045 760327.406393 5913154.86907 -0.170339341075 
+3046 760277.620449 5913144.49479 -0.287590555662 
+3047 760349.521956 5913116.28516 -0.320894815398 
+3048 760341.945457 5913070.83581 -0.597504236545 
+3049 760294.678477 5913052.48072 -0.594307139799 
+3050 760389.61297 5913113.18761 -0.561260828726 
+3051 760415.723082 5913143.08448 -0.532060324893 
+3052 760241.672555 5913171.0131 -0.721540721533 
+3053 760196.294906 5913160.64732 -2.31806435294 
+3054 760184.012992 5913114.92803 -2.33033129819 
+3055 760209.415357 5913082.03676 -1.58636418328 
+3056 760200.939634 5913041.85142 -1.96350813718 
+3057 760247.353951 5913092.8515 -0.461502068298 
+3058 760230.380339 5913016.38233 -0.925691365226 
+3059 760275.837553 5913010.72717 -0.686396405172 
+3060 760166.322267 5913034.59591 -2.56986050343 
+3061 760147.566299 5913002.79018 -2.42051421824 
+3062 760138.026171 5913055.07472 -2.09627378271 
+3063 760140.839266 5913090.44167 -1.94269055228 
+3064 760103.112846 5913057.19152 -1.06206573073 
+3065 760116.061339 5912993.06236 -1.4298367236 
+3066 760258.764818 5913205.40399 -0.213410036283 
+3067 760244.019281 5913240.28695 -0.652290066418 
+3068 760206.198086 5913245.81966 -2.3477588626 
+3069 760180.216275 5913214.51633 -2.1826557281 
+3070 760232.460565 5913276.33842 -0.772654087484 
+3071 760287.757554 5913229.08474 -0.155603409096 
+3072 760217.928677 5913305.00472 -1.24763916955 
+3073 760178.835659 5913321.65185 -2.76204067027 
+3074 760212.577765 5913346.19944 -0.523349244176 
+3075 760210.152912 5913383.8167 -0.143338319077 
+3076 760233.050368 5913414.25231 -0.0567694667761 
+3077 760226.9 5913492.0 0.553861585151 
+3078 760235.415332 5913453.55651 0.194997189086 
+3079 760178.66471 5913404.33046 -0.344899636297 
+3080 760146.603481 5913387.34923 -3.0734624184 
+3081 757359.994871 5913182.06247 -7.37468440941 
+3082 757393.774359 5913196.14697 -7.28455336301 
+3083 757377.627888 5913154.92406 -7.49939971912 
+3084 757363.571132 5913125.76931 -7.62591178096 
+3085 757326.185661 5913119.89008 -7.64346177977 
+3086 757354.228646 5913094.03051 -7.75148133438 
+3087 757400.185759 5913131.7564 -7.60818489724 
+3088 757418.490682 5913105.0243 -7.73256721757 
+3089 757445.174046 5913071.81052 -7.8626388517 
+3090 757404.883377 5913069.72817 -7.85398409275 
+3091 757360.51372 5913061.55394 -7.88086777022 
+3092 757332.853894 5913032.09527 -7.89470738105 
+3093 757283.674506 5913029.08899 -7.84805013091 
+3094 757358.885616 5913000.65268 -7.83955765608 
+3095 757430.884763 5913139.86146 -7.55590457944 
+3096 757440.356358 5913170.78115 -7.33740267039 
+3097 757454.369192 5913199.92771 -7.06707913268 
+3098 757462.425935 5913143.17929 -7.48158318278 
+3099 757485.70763 5913201.74188 -6.93119561013 
+3100 757462.252144 5913230.18432 -6.43938521218 
+3101 757440.395576 5913255.10439 -5.69608465981 
+3102 757282.228617 5913075.86573 -7.79722007903 
+3103 757244.225807 5913104.54019 -7.73388261944 
+3104 757246.44136 5913157.45668 -7.49851912579 
+3105 757273.981067 5912984.47964 -7.76723020393 
+3106 757501.163552 5913177.36802 -7.04142933155 
+3107 757205.592506 5913084.08144 -7.53611968594 
+3108 757194.598744 5913043.86424 -7.03309693752 
+3109 757303.518131 5912956.48586 -8.04496721636 
+3110 757337.692 5912964.78744 -8.02120749163 
+3111 760730.351881 5912407.64941 -7.00829010269 
+3112 757586.982172 5913121.8355 -5.32902468678 
+3113 757566.306465 5913091.07636 -6.39947353468 
+3114 757796.271954 5912571.8985 -0.39614632139 
+3115 757526.445318 5912330.91222 -0.645181848678 
+3116 757671.954388 5911837.26138 -0.149234618538 
+3117 760351.980576 5913278.81376 -0.00244911088452 
+3118 756758.8 5911676.5 -0.21681404714 
+3119 756768.886134 5911740.70746 -0.95520137003 
+3120 756791.934424 5911772.18025 -1.7811442003 
+3121 756818.650887 5911793.12399 -2.53218740117 
+3122 756824.809739 5911834.95382 -0.775543227628 
+3123 756826.482143 5911761.08377 -1.50065378609 
+3124 756857.756131 5911750.8424 -1.22093093172 
+3125 756824.979597 5911875.05959 -0.594359730649 
+3126 756835.141939 5911731.21835 -0.521747489786 
+3127 756815.841719 5911703.15512 -0.287612524322 
+3128 756859.010517 5911819.67346 -2.6557248613 
+3129 756893.345382 5911836.75197 -3.59854797119 
+3130 758697.253173 5912735.45654 -0.208765410557 
+3131 758668.968732 5912709.06521 -0.210095612222 
+3132 758646.322671 5912684.6174 -0.258027724383 
+3133 758679.051944 5912677.01266 -0.27434923506 
+3134 758616.619372 5912675.02732 -0.23056213496 
+3135 758566.55 5912675.5 -0.0453583118239 
+3136 758558.399552 5912622.81528 -0.417276289015 
+3137 758556.654251 5912586.55609 -0.61036790071 
+3138 758585.038104 5912565.59904 -0.687863502223 
+3139 758627.833007 5912577.1408 -0.796796239797 
+3140 758521.95 5912631.0 -0.242684663123 
+3141 758531.682502 5912602.82823 -0.412166713185 
+3142 758625.688072 5912615.72389 -0.510428568664 
+3143 758666.703518 5912651.13 -0.330489146902 
+3144 757875.438398 5912811.8601 -0.280759435617 
+3145 756516.128343 5912343.42706 -0.252664506309 
+3146 757660.115772 5913148.68603 -0.966831148599 
+3147 757658.099438 5913113.80537 -1.1900571018 
+3148 757629.387037 5913099.28217 -3.46106454699 
+3149 757631.337473 5913163.71028 -3.31571014458 
+3150 757603.108739 5913150.36825 -4.62426085031 
+3151 757866.388636 5910441.27266 -0.375645807739 
+3152 756687.842359 5911750.28068 -0.345955312937 
+3153 757895.002144 5911680.4402 0.0671221921175 
+3154 756708.301188 5913590.67326 -0.0824132652914 
+3155 756734.795521 5913572.40535 -0.482346728231 
+3156 756743.127164 5913536.97892 -1.41270662745 
+3157 756694.556941 5913619.55953 -0.12160368611 
+3158 760661.526697 5912500.33305 -4.15352810668 
+3159 760695.75 5912529.5 -3.94236122454 
+3160 760693.026257 5912477.89448 -5.09111650485 
+3161 757908.965143 5911779.15435 0.0186468828477 
+3162 757892.265469 5911811.7685 -0.0117823195834 
+3163 757910.277006 5911844.89899 -0.0259056280889 
+3164 757943.357373 5911780.8565 0.0380685307552 
+3165 757961.696028 5911808.30533 0.0235146340493 
+3166 757948.293368 5911835.99609 -0.0197831585329 
+3167 757977.716995 5911831.50615 0.0135094612031 
+3168 756565.661062 5912326.05966 -0.395176903002 
+3169 757439.896988 5912659.59495 -7.35445723546 
+3170 757783.460834 5911691.00869 -0.0796199300407 
+3171 757803.264249 5911725.20944 -0.0275851523578 
+3172 757835.95905 5911734.73157 0.00440208532196 
+3173 757848.033531 5911764.14205 -0.00435257738785 
+3174 757908.624974 5911530.85536 -0.0704264694822 
+3175 760482.119528 5912675.59607 -3.09699985483 
+3176 759681.732095 5913405.13513 -1.19688300432 
+3177 757947.745675 5911931.91203 -0.219517108823 
+3178 757970.10415 5911961.94553 -0.21392391885 
+3179 758002.071114 5911947.48619 -0.202646992893 
+3180 760339.738605 5913349.77502 0.00943973088912 
+3181 756982.044334 5913234.44845 -6.27376805678 
+3182 756983.373119 5913276.73105 -6.31299923518 
+3183 757024.75256 5913243.84857 -5.66286078663 
+3184 757058.225499 5913215.47027 -6.79660133554 
+3185 757058.960903 5913259.34742 -6.34648076039 
+3186 757089.267851 5913280.37637 -6.67415301871 
+3187 757128.980314 5913299.51033 -6.71045384992 
+3188 757062.952507 5913298.3678 -6.57339692063 
+3189 757034.90356 5913326.2744 -6.47328144129 
+3190 757017.600089 5913356.9709 -6.32182501035 
+3191 756986.029204 5913360.96179 -6.23549276346 
+3192 757003.579739 5913328.8425 -6.45988144137 
+3193 756912.699304 5912819.1 -4.28835144845 
+3194 757033.080607 5912761.9635 -4.72204383411 
+3195 757069.432948 5912745.64191 -5.44620435619 
+3196 756960.305141 5913476.87795 -5.40848095149 
+3197 756812.670411 5913419.41091 -4.06340212228 
+3198 757472.404358 5911011.33026 -0.295006065162 
+3199 757488.112909 5910978.54027 -0.448610889475 
+3200 757471.742148 5910949.72779 -0.354503891574 
+3201 757442.796927 5910948.6965 -0.258062681862 
+3202 758970.076691 5912489.72425 -0.769534120537 
+3203 758956.302428 5912524.22072 -0.697141279625 
+3204 758927.231174 5912556.30201 -0.858153119303 
+3205 758489.942069 5912464.99273 -1.87083610152 
+3206 760029.549546 5912316.38751 -6.17438818577 
+3207 758072.551793 5912213.68677 -0.461640059379 
+3208 759838.25 5912982.5 -0.208418806801 
+3209 756781.54305 5912216.8479 -5.38330378338 
+3210 756800.260309 5912243.99433 -5.55958351233 
+3211 756837.084993 5912241.05806 -5.64950143577 
+3212 756835.348422 5912279.11211 -5.77186695186 
+3213 756814.232614 5912313.12186 -5.73737642583 
+3214 756867.853101 5912298.02428 -5.92867490039 
+3215 756867.136941 5912227.47562 -5.84727380743 
+3216 758551.134332 5912246.07039 -0.510422065821 
+3217 757431.296215 5912006.37309 -0.965360503738 
+3218 757031.405549 5913409.9804 -5.92813188295 
+3219 757017.236385 5913438.22855 -5.723915705 
+3220 757010.77822 5913468.38774 -5.42871401545 
+3221 756993.776125 5913418.24834 -5.89879147574 
+3222 757482.864958 5910802.8801 -0.895851926116 
+3223 757820.207712 5911793.37136 -0.0375458325222 
+3224 757574.465753 5913203.54448 -5.78420192517 
+3225 758230.49676 5912307.27997 -0.555818014561 
+3226 757093.07597 5912018.51493 -6.73297238773 
+3227 757690.402107 5912222.87574 -0.317888100529 
+3228 757802.410655 5912280.5297 -0.374898913005 
+3229 757229.691765 5912333.03121 -5.89918744551 
+3230 757259.479898 5912356.84448 -6.33520946476 
+3231 757266.288473 5912394.25461 -6.36594341423 
+3232 757294.704148 5912420.02514 -7.0178024508 
+3233 757237.420098 5912418.83711 -5.92016424756 
+3234 757290.464712 5912343.45994 -6.99807102746 
+3235 757233.882748 5912450.5654 -6.07300274216 
+3236 757256.871489 5912485.97028 -6.65532500843 
+3237 757300.999085 5912489.1919 -7.37419897675 
+3238 757214.596897 5912477.57025 -5.83689386471 
+3239 757180.090022 5912485.99103 -5.30564292166 
+3240 757151.098325 5912520.49368 -5.14829872633 
+3241 757102.433546 5912503.26004 -4.69368843669 
+3242 757100.033082 5912451.09134 -4.6612763175 
+3243 757059.229107 5912529.32448 -4.6616706994 
+3244 757015.810791 5912506.92967 -4.47139841593 
+3245 757014.181874 5912563.37415 -4.77419335087 
+3246 757012.342119 5912459.26424 -4.76421788369 
+3247 757061.033941 5912576.05503 -5.02199951107 
+3248 757079.566903 5912615.58733 -5.47762171062 
+3249 757037.28194 5912422.33761 -5.32419927619 
+3250 757022.147755 5912374.94128 -6.031902897 
+3251 756969.206834 5912451.98806 -4.6096384354 
+3252 756928.857916 5912472.99199 -3.52347731186 
+3253 756947.392112 5912411.44388 -5.17030995735 
+3254 756930.634963 5912515.42754 -3.65262469611 
+3255 756968.000818 5912541.00093 -4.31355159843 
+3256 756897.522592 5912443.77534 -2.85031851515 
+3257 756865.364916 5912421.87273 -3.79913060296 
+3258 757141.10281 5912429.64275 -5.03735717367 
+3259 757116.302966 5912396.01605 -5.4570657928 
+3260 756865.537489 5912456.17781 -1.97726585628 
+3261 756851.921524 5912486.26147 -2.09710459032 
+3262 756864.748689 5912524.85873 -2.68893986201 
+3263 757054.578316 5912345.88488 -6.32213090445 
+3264 756985.654889 5912354.36825 -6.24770480012 
+3265 757584.749451 5912237.24746 -0.274144252556 
+3266 757711.811565 5911867.09353 -0.174197171368 
+3267 757380.660246 5912205.90001 -7.89093581212 
+3268 757395.056857 5912170.19547 -7.60341001026 
+3269 757367.307218 5912141.34616 -7.64010947229 
+3270 757373.175365 5912104.13932 -6.89090136946 
+3271 757346.255417 5912080.21573 -6.68047586723 
+3272 757313.99323 5912058.1934 -6.72719678807 
+3273 757282.773674 5912035.64939 -7.09373208814 
+3274 757308.231622 5912093.67217 -7.46890323115 
+3275 757270.977667 5912117.52815 -7.61296766718 
+3276 757305.124856 5912144.98969 -7.6462018016 
+3277 757299.984294 5912191.08641 -6.61156105312 
+3278 758560.306315 5912553.27808 -0.830549397913 
+3279 756781.555619 5912306.26757 -5.50086937413 
+3280 756749.877098 5912321.04092 -4.88283399002 
+3281 756764.255567 5912278.06039 -5.37652343506 
+3282 756749.330719 5912354.84276 -4.74516552932 
+3283 756750.972389 5912389.08154 -4.01584691513 
+3284 756748.998274 5912424.8302 -2.75719660588 
+3285 756718.984029 5912338.46292 -3.70588629554 
+3286 756780.87004 5912373.34907 -5.00905637986 
+3287 756817.105272 5912354.97429 -5.67931532057 
+3288 756779.055092 5912441.45836 -3.10485918934 
+3289 756810.173743 5912425.23795 -3.90301519271 
+3290 756807.153013 5912390.83122 -5.17702107085 
+3291 756723.796771 5912403.52905 -2.51109891119 
+3292 756692.501853 5912352.73857 -1.83595222926 
+3293 757207.687333 5912357.64577 -5.47194649281 
+3294 757194.24145 5912393.21968 -5.24061561303 
+3295 757174.829502 5912358.54001 -5.34717016819 
+3296 757153.866856 5912328.68595 -5.72132094757 
+3297 757170.588761 5912415.68637 -5.1356517659 
+3298 757296.454869 5912452.07046 -7.20839215241 
+3299 756972.880326 5912386.97172 -5.87737892716 
+3300 757245.568599 5912090.88811 -7.48809452171 
+3301 757246.114259 5912052.07459 -7.47045496789 
+3302 757213.496746 5912078.87589 -7.33755935412 
+3303 757185.339526 5912098.23911 -7.28227702432 
+3304 757183.894882 5912140.75124 -7.33964374017 
+3305 757179.23081 5912065.74824 -7.18062500931 
+3306 757174.420449 5912032.38414 -7.01277086657 
+3307 757148.488334 5912053.58039 -7.01555349491 
+3308 757201.29598 5912012.28999 -6.98446073691 
+3309 757226.829562 5911990.81188 -6.72741879148 
+3310 757171.865936 5912000.94771 -6.77494560858 
+3311 757221.474411 5912151.83786 -7.3077590568 
+3312 757233.926261 5912188.37659 -6.0732796773 
+3313 757266.620532 5912197.8917 -5.79197177762 
+3314 757279.070681 5912228.69589 -6.57374625401 
+3315 757162.251623 5912169.31214 -7.12048177642 
+3316 757127.133152 5912195.73285 -6.95006679613 
+3317 757166.595692 5912209.82607 -6.86329710522 
+3318 757205.642476 5912220.97966 -6.62826904066 
+3319 757093.555772 5912170.78562 -6.93556847309 
+3320 757096.549478 5912130.27732 -6.96781532309 
+3321 757060.804913 5912117.73364 -6.75767356976 
+3322 757050.637528 5912081.18939 -6.64847552959 
+3323 757058.18536 5912185.17684 -6.77855362026 
+3324 757047.70165 5912223.2733 -6.71166191133 
+3325 757130.172992 5912115.03998 -7.08402383338 
+3326 757119.980043 5912083.13489 -6.98396956696 
+3327 757027.158954 5912120.28642 -6.53930678096 
+3328 757008.287017 5912148.28635 -6.51669192184 
+3329 756986.649852 5912180.03937 -6.39821156449 
+3330 757023.111671 5912178.79687 -6.64345224475 
+3331 756994.651383 5912117.52549 -6.07834622766 
+3332 756959.671139 5912111.36191 -5.08920838705 
+3333 756941.194086 5912139.75583 -5.58984454724 
+3334 756955.139403 5912167.84621 -6.03548554989 
+3335 756983.590273 5912091.1014 -5.66782348504 
+3336 756993.649395 5912061.98066 -5.91897903561 
+3337 757222.994957 5912251.47118 -6.54712758827 
+3338 757225.907402 5912026.13872 -7.15828014191 
+3339 760170.652522 5912950.49593 -2.94732717603 
+3340 760192.159301 5912973.61159 -2.62188352633 
+3341 760163.596244 5912978.62385 -2.76519565591 
+3342 760063.872551 5912948.5373 -0.887510710144 
+3343 760047.119894 5912983.99315 -0.932540448761 
+3344 760070.913354 5913018.16837 -0.998494794043 
+3345 760010.049322 5912968.37515 -0.926626722265 
+3346 757471.744511 5910363.91596 -0.218493939643 
+3347 757512.487736 5910384.35299 -0.185475025759 
+3348 757459.15 5910294.0 -0.221819925959 
+3349 757461.306936 5910329.70381 -0.221809114451 
+3350 757491.14325 5910307.81396 -0.2206652272 
+3351 757529.491454 5910308.64124 -0.222444617519 
+3352 757541.699525 5910341.98617 -0.221955747916 
+3353 757504.060423 5910424.95106 -0.25338783827 
+3354 757471.207412 5910443.80764 -0.227529117877 
+3355 757465.589795 5910480.12228 -0.209413719974 
+3356 757472.397286 5910514.24789 -0.534061099928 
+3357 757541.006387 5910372.76238 -0.191527050795 
+3358 757530.203716 5910449.24379 -0.370813889643 
+3359 757532.519026 5910484.29674 -0.721136156589 
+3360 757559.099138 5910442.5445 -0.585119341083 
+3361 758435.277908 5912531.45629 -0.571313390467 
+3362 757820.500161 5910528.32917 -0.772927317264 
+3363 757852.928241 5910519.68428 -0.500528914835 
+3364 757862.382037 5910489.86577 -0.394262357357 
+3365 758819.965092 5912386.86495 -0.620738952496 
+3366 758860.49884 5912401.94456 -0.613875774292 
+3367 756634.934014 5912520.40648 -0.640157352954 
+3368 757327.425213 5911740.00736 -1.71624947267 
+3369 757306.982487 5911713.87079 -1.27171217096 
+3370 757266.624244 5911715.39404 -2.04472755063 
+3371 757335.645566 5911711.85225 -0.870527214197 
+3372 757257.036446 5911747.51233 -3.39225053324 
+3373 757159.193601 5911902.83451 -2.34553959692 
+3374 757182.692942 5911938.33612 -4.58497216294 
+3375 757191.261846 5911900.56969 -2.41234469449 
+3376 756706.599536 5912532.44798 -1.59613085756 
+3377 757427.756736 5913321.42252 -1.70089007529 
+3378 757016.18851 5911781.11051 -1.26464825843 
+3379 759739.628709 5913391.70558 -0.564921483191 
+3380 757146.230747 5912704.18818 -6.88352179918 
+3381 757135.096318 5912661.2262 -6.2089249181 
+3382 759478.864212 5913152.85554 -0.914988725501 
+3383 757913.340237 5912286.02875 -0.443517921541 
+3384 757928.437452 5912319.86162 -0.476453741518 
+3385 758336.05318 5912216.90513 -0.518652418991 
+3386 758373.66549 5912196.02516 -0.494985211287 
+3387 758389.176667 5912236.15258 -0.512789114816 
+3388 758426.009515 5912238.20856 -0.543872884029 
+3389 757432.948505 5910475.48089 -0.233074562206 
+3390 760007.120034 5913100.64434 -0.779910853776 
+3391 758755.264111 5912592.79569 -0.833416369353 
+3392 758205.718553 5912132.70027 -0.4502995419 
+3393 757315.388041 5913164.8141 -7.44955126964 
+3394 757284.789267 5913154.37933 -7.49673145177 
+3395 757825.594637 5912428.76327 -0.475816535052 
+3396 757457.451395 5912405.53394 -3.50458499625 
+3397 757426.408275 5912427.40548 -5.69205627119 
+3398 757305.751888 5913096.33552 -7.7357819853 
+3399 757879.23911 5911784.516 -0.00203290434303 
+3400 760514.028284 5912662.46085 -1.17000613301 
+3401 757294.527346 5912315.77136 -7.04887885493 
+3402 757336.884665 5912154.57908 -7.75221562608 
+3403 757328.42852 5912182.93439 -7.51606320992 
+3404 757110.689874 5912688.68536 -6.47008224677 
+3405 757075.238037 5912689.60762 -5.94619181876 
+3406 757033.625904 5912666.94615 -5.26735225622 
+3407 756995.304854 5912645.70831 -4.69664346632 
+3408 756972.191226 5912615.36785 -4.58492923229 
+3409 756986.239606 5912583.76058 -4.68520708988 
+3410 757004.058375 5912610.60608 -4.97438867248 
+3411 760494.652604 5912975.58941 -2.31814074526 
+3412 759433.04824 5913391.67103 -0.218136335186 
+3413 759657.019447 5913575.08241 -0.339425356535 
+3414 760913.630389 5912246.59467 -3.73181324909 
+3415 757794.243536 5910664.35189 -0.565861105484 
+3416 757663.694397 5910631.46701 -1.54754262823 
+3417 757652.309459 5910598.98943 -1.40674275457 
+3418 757636.154049 5910570.51642 -1.05677859772 
+3419 757605.795361 5910569.86314 -0.808786888236 
+3420 757585.805401 5910595.12723 -0.67782451905 
+3421 757666.814182 5910662.53975 -1.64213833586 
+3422 757634.172855 5910623.52218 -1.11920427682 
+3423 757609.218858 5910640.98946 -0.721894499633 
+3424 760420.646824 5912705.48906 -0.842816687429 
+3425 760438.881713 5912747.43827 -0.656312657284 
+3426 760398.946434 5912665.25965 -1.43927109288 
+3427 760401.368791 5912620.27351 -1.80672955601 
+3428 760364.133123 5912595.23601 -1.47737360317 
+3429 760327.649713 5912615.06249 -1.31472148499 
+3430 760324.585103 5912653.73277 -1.4689756873 
+3431 760356.023871 5912681.96218 -1.48795289953 
+3432 760296.356195 5912596.40289 -1.40606845275 
+3433 760359.143887 5912557.71213 -1.52677721697 
+3434 760322.384981 5912523.4352 -2.20553031753 
+3435 760365.748777 5912513.78021 -1.77103137294 
+3436 760412.594927 5912501.60827 -2.41057927898 
+3437 760469.225673 5912505.09361 -2.91132177459 
+3438 760438.811398 5912537.45449 -2.52832041454 
+3439 760393.334106 5912463.42391 -3.32599201778 
+3440 760373.819081 5912425.30208 -5.41398283126 
+3441 760328.218565 5912421.38953 -5.47382761263 
+3442 760310.557621 5912457.5444 -4.53953989166 
+3443 760273.112128 5912465.17685 -4.86306966246 
+3444 760237.113619 5912487.41838 -4.72398367474 
+3445 760241.562052 5912436.97807 -5.72813825564 
+3446 760242.877519 5912529.67058 -3.13956624775 
+3447 760196.665417 5912500.92445 -4.70506684836 
+3448 760158.083871 5912470.89104 -5.29434589062 
+3449 760161.423648 5912527.25126 -4.08309882947 
+3450 760282.200882 5912545.08417 -2.33705449826 
+3451 760204.631259 5912417.45764 -6.15265739502 
+3452 760240.124641 5912395.00253 -6.47561912662 
+3453 760166.739924 5912402.13824 -6.35753544695 
+3454 760131.107456 5912383.69042 -6.54694843057 
+3455 760162.308457 5912358.53808 -6.94520294984 
+3456 760160.009492 5912309.06547 -7.5649859735 
+3457 760095.225739 5912368.96379 -6.28893888819 
+3458 760174.279973 5912438.00884 -5.81543126223 
+3459 760193.553844 5912340.30367 -7.32819300909 
+3460 760229.003188 5912352.91108 -7.21618681888 
+3461 760327.867554 5912488.44418 -3.13354873289 
+3462 760411.556756 5912430.65462 -5.25322110446 
+3463 760438.209062 5912405.29898 -6.52616480495 
+3464 760431.615033 5912365.47706 -8.0539503107 
+3465 760393.256126 5912355.81454 -7.91887233088 
+3466 760356.594084 5912339.78177 -7.97567890069 
+3467 760351.043413 5912297.68741 -8.95922741849 
+3468 760375.871875 5912233.03125 -10.0144136238 
+3469 760427.47857 5912326.13675 -9.09543668494 
+3470 760419.417604 5912277.16662 -10.0093240129 
+3471 760368.597968 5912382.6248 -6.90161677953 
+3472 760457.483469 5912305.58179 -9.87884085135 
+3473 760505.5568 5912315.32828 -10.1341816413 
+3474 760455.893521 5912433.05109 -5.70055807419 
+3475 760497.986588 5912442.82899 -5.90456058026 
+3476 760518.21504 5912404.58588 -7.64551742836 
+3477 760539.909456 5912443.01602 -6.30098070421 
+3478 760562.940935 5912479.1564 -5.26703314448 
+3479 760321.198476 5912339.37467 -7.79244936886 
+3480 760286.367141 5912332.91006 -7.77313396473 
+3481 760265.255444 5912291.51868 -8.33699337655 
+3482 760299.726793 5912366.30233 -7.05202578445 
+3483 760278.565282 5912393.8206 -6.49633469274 
+3484 760252.553132 5912328.19164 -7.69700981709 
+3485 760311.982812 5912394.87511 -6.22073999486 
+3486 760116.567367 5912463.09295 -5.30508086886 
+3487 760085.415297 5912489.19077 -3.65423694535 
+3488 760383.16855 5912280.55667 -9.55228706666 
+3489 760353.57466 5912263.74685 -9.52483566761 
+3490 760319.12709 5912271.94866 -9.07227477 
+3491 760398.950296 5912253.81082 -10.1274535975 
+3492 760118.617964 5912302.63413 -7.32239600142 
+3493 760190.626133 5912309.81804 -7.71812497558 
+3494 760211.601843 5912285.05392 -8.09527492597 
+3495 760240.541336 5912270.75225 -8.43578712414 
+3496 760180.181855 5912279.70604 -7.90909616495 
+3497 760545.495301 5912326.54745 -10.1238084371 
+3498 760582.256117 5912304.62377 -10.8892267118 
+3499 760617.133968 5912324.98488 -10.6491743676 
+3500 760651.220026 5912307.28305 -11.1726653222 
+3501 760231.840265 5912563.93654 -2.39422112915 
+3502 760197.50584 5912581.36532 -2.30418795262 
+3503 760232.983281 5912596.88967 -1.70605726327 
+3504 760253.959519 5912627.02478 -1.34846587457 
+3505 760234.404911 5912664.84062 -1.77322650085 
+3506 760172.779648 5912558.76578 -2.98029856203 
+3507 760270.106776 5912671.08742 -1.60995872453 
+3508 760199.081622 5912657.12602 -1.8475956218 
+3509 760164.299535 5912662.98197 -1.99437665247 
+3510 760139.434434 5912639.13731 -1.95303569218 
+3511 760109.703091 5912648.82276 -1.87082895381 
+3512 760177.393887 5912634.53332 -1.61577787406 
+3513 760283.691177 5912698.83162 -2.08434769505 
+3514 760274.41709 5912744.23197 -1.61675345728 
+3515 760301.862038 5912725.70633 -1.91361865463 
+3516 760224.05 5912773.5 0.259182243755 
+3517 760220.997444 5912731.04559 -1.19576225204 
+3518 760301.511889 5912242.04365 -9.15306920575 
+3519 760402.901366 5912583.19812 -2.00105622694 
+3520 760298.823598 5912484.41612 -3.75067538231 
+3521 760463.712502 5912374.78458 -8.05317867171 
+3522 760491.347887 5912358.30087 -8.92528632733 
+3523 760302.4 5912794.0 0.638373489062 
+3524 759355.042277 5912911.63197 -1.03745693825 
+3525 759374.399947 5912887.54455 -1.00321387768 
+3526 757562.347822 5911715.06755 -0.134257503184 
+3527 760021.616026 5913441.57018 -0.969421631443 
+3528 759818.00486 5913139.77023 -0.418199018543 
+3529 757686.220988 5911133.21806 -0.112583669377 
+3530 758148.511839 5912509.84732 -0.553378925953 
+3531 759922.126265 5913252.56791 -0.523649590362 
+3532 759925.361684 5913420.94088 -0.581406823353 
+3533 756615.817955 5913001.31886 -3.56065656512 
+3534 756610.500026 5913032.60999 -3.74442745281 
+3535 756584.893502 5913050.05259 -3.50751684294 
+3536 756554.88666 5913051.46533 -2.76288275962 
+3537 756639.540282 5913031.83132 -3.87062652981 
+3538 756419.703909 5913147.0684 -0.555184314715 
+3539 756386.326828 5913134.14424 -0.418794878805 
+3540 756361.164822 5913154.40717 -0.289985575851 
+3541 756360.627616 5913186.29323 -0.295200579715 
+3542 756388.939707 5913205.38555 -0.40867787263 
+3543 756350.101128 5913127.63615 -0.280916174697 
+3544 756340.3 5913238.5 -0.344761955091 
+3545 756361.407974 5913214.55354 -0.332894038691 
+3546 756412.896085 5913188.17167 -0.519299812343 
+3547 756480.490534 5913453.57177 -0.383689586744 
+3548 756499.982348 5913475.87939 -0.381891289832 
+3549 756662.933684 5913378.97545 -2.09769492418 
+3550 759696.552611 5913541.16874 -0.677966183242 
+3551 758624.910245 5912274.90132 -0.566940765243 
+3552 757291.511463 5911915.50482 -5.03919639345 
+3553 757284.965518 5911944.11214 -5.57646156865 
+3554 757304.737431 5911968.97572 -5.45087062983 
+3555 757339.036365 5911983.98118 -4.50807714079 
+3556 757364.755179 5912010.12725 -4.17842695716 
+3557 757333.284461 5912017.21689 -5.40270560777 
+3558 759977.303212 5913149.77388 -0.700863445955 
+3559 757913.638216 5912214.52528 -0.368611775794 
+3560 758193.158573 5912276.40325 -0.483289368224 
+3561 760646.603125 5912200.21875 -12.6806234123 
+3562 760628.523631 5912239.92887 -12.2786084162 
+3563 760579.926667 5912250.50954 -11.7665787683 
+3564 760556.359375 5912211.15625 -12.0396800419 
+3565 760537.695922 5912246.04821 -11.5298364899 
+3566 760512.204293 5912270.3345 -10.9840504272 
+3567 760466.115625 5912222.09375 -10.961562219 
+3568 760490.915143 5912244.53724 -11.0667368823 
+3569 757373.901229 5910485.73104 -0.26432782148 
+3570 757755.357557 5911157.25602 -0.0974429777868 
+3571 757248.023706 5910788.3041 -0.210037593394 
+3572 756695.830423 5913331.0676 -3.22499015016 
+3573 759898.695673 5913488.92401 -1.51909953777 
+3574 760724.25847 5912483.24755 -4.68628995199 
+3575 760750.162713 5912465.04815 -4.89156802026 
+3576 760754.4 5912498.0 -4.68298383146 
+3577 760356.213375 5913325.41126 -0.0265359847566 
+3578 757240.495903 5912516.53162 -6.58667036374 
+3579 757217.612639 5912542.63319 -6.53109493684 
+3580 757251.036115 5912547.54869 -7.1168032234 
+3581 757275.901656 5912585.40589 -7.47419532586 
+3582 757199.55305 5912569.94129 -6.31500315546 
+3583 757185.755282 5912535.08402 -5.82107923001 
+3584 757245.521744 5912612.90203 -7.24889540677 
+3585 757312.362492 5912599.07143 -7.78795081611 
+3586 757343.497504 5912590.65901 -7.97425607622 
+3587 756934.459327 5912549.92441 -4.04056294634 
+3588 756913.003382 5912577.04806 -4.0019100178 
+3589 756713.714171 5912310.56922 -3.68485377257 
+3590 756803.259976 5912456.00265 -2.85654616402 
+3591 757154.582743 5912133.01721 -7.21716707362 
+3592 757898.743083 5912252.75756 -0.389606010125 
+3593 757062.434732 5912663.58181 -5.73461926722 
+3594 760093.803392 5912337.0862 -6.6569611069 
+3595 760098.944117 5912433.42457 -5.50394210987 
+3596 760427.879078 5912565.83932 -2.44727346593 
+3597 760460.501271 5912570.16559 -2.67672074822 
+3598 760470.27804 5912601.44227 -2.97054127549 
+3599 760466.235347 5912634.05266 -3.28742601247 
+3600 757351.424658 5911956.0097 -3.44559782305 
+3601 760682.831553 5912225.65097 -13.0182608777 
+3602 760428.113558 5912822.81252 -0.70515351277 
+3603 760445.442025 5912795.30516 -0.719584826615 
+3604 759323.663269 5912860.61262 -1.1903285892 
+3605 756423.392155 5912897.20495 -0.470147145832 
+3606 756420.444106 5912931.78961 -0.599418678412 
+3607 757294.283665 5910515.07692 -0.286937679018 
+3608 760325.910562 5912927.50817 -1.44711284461 
+3609 760353.808716 5912965.16111 -0.999324787984 
+3610 760377.802865 5913004.03349 -0.795093831284 
+3611 760292.348674 5912910.24506 -1.55064109269 
+3612 760286.223484 5912875.01802 -3.2433383269 
+3613 760283.757407 5912942.19593 -0.999099580494 
+3614 760274.997328 5912974.00382 -0.779290527739 
+3615 760254.729598 5912952.47611 -1.13146361566 
+3616 760262.257603 5912893.32118 -3.28378091408 
+3617 760216.15 5912880.0 -1.67806306799 
+3618 760208.426794 5912911.69511 -3.08618080914 
+3619 760229.172354 5912932.13864 -2.42836175059 
+3620 759322.414433 5912723.42549 -1.0833503414 
+3621 759768.327551 5912348.10099 -2.57434191064 
+3622 757714.032902 5910479.30846 -0.444477493919 
+3623 757690.06332 5910448.64262 -0.276060927868 
+3624 757666.096221 5910418.69545 -0.455323456768 
+3625 757724.247272 5910511.43981 -0.5164676015 
+3626 757703.760364 5910537.18879 -0.983173368103 
+3627 757707.943192 5910420.00125 -0.279693587754 
+3628 757727.509284 5910392.80348 -0.292913451542 
+3629 757740.464363 5910419.30651 -0.275399326282 
+3630 757634.244518 5910426.35758 -0.93041316492 
+3631 757674.622504 5910477.99528 -0.792073812921 
+3632 757621.107946 5912748.72279 -0.313615077705 
+3633 757599.352878 5912722.38273 -0.363695732314 
+3634 757651.035161 5912741.14125 -0.329495119083 
+3635 760560.755459 5912568.40585 -2.66645150892 
+3636 760534.598747 5912602.08384 -1.38352946576 
+3637 760526.799017 5912633.11916 -0.633568792855 
+3638 760562.3 5912633.5 0.626679285487 
+3639 760528.409359 5912546.64924 -2.71218480084 
+3640 760500.537332 5912523.42206 -2.94790007363 
+3641 757749.142024 5910712.32643 -0.605187884521 
+3642 757810.675457 5911436.38494 -0.0670537708822 
+3643 757828.32747 5911459.5625 -0.0755247059407 
+3644 757887.947699 5910854.48719 -0.256870513867 
+3645 757852.419715 5911348.16217 -0.0898354476831 
+3646 757860.791891 5911317.83997 -0.0859247579667 
+3647 757880.186447 5912666.84173 -0.338760774024 
+3648 756477.707423 5913395.5398 -0.472313882679 
+3649 756451.08206 5913370.82025 -0.439510088371 
+3650 757005.098624 5913156.95895 -5.44740627403 
+3651 757048.408217 5913146.04208 -6.25807940396 
+3652 757059.335268 5913105.30301 -6.47481903909 
+3653 757085.599171 5913134.18249 -6.49033494135 
+3654 757130.547174 5913147.93843 -7.23766021734 
+3655 757172.339853 5913158.29866 -7.4420047146 
+3656 757085.24092 5913078.29536 -6.64802481592 
+3657 757118.291388 5913072.02285 -6.51388055019 
+3658 757152.817095 5913112.3515 -7.35484341862 
+3659 757078.458932 5913045.6573 -6.3837253823 
+3660 757183.856098 5913194.44859 -7.30264972166 
+3661 757163.043438 5913227.03219 -7.11990696729 
+3662 757209.487147 5913166.37401 -7.45567589041 
+3663 757131.231426 5913248.63854 -6.96182324372 
+3664 757196.730698 5913244.05257 -7.07194102411 
+3665 757116.256518 5913214.63739 -7.0681278572 
+3666 757232.314538 5913244.65449 -7.08334373435 
+3667 757258.905516 5913212.63202 -7.23352957109 
+3668 757197.91037 5913278.80274 -6.88409747871 
+3669 757114.015236 5913180.69686 -7.06457616491 
+3670 757090.295257 5913019.74633 -5.5792895345 
+3671 757233.760064 5913185.93369 -7.36001808817 
+3672 757262.385795 5913181.61911 -7.37664230558 
+3673 757255.466663 5913262.23102 -6.96967911975 
+3674 757146.472581 5912958.40822 -6.55590290891 
+3675 757133.979414 5912920.72038 -6.68413621641 
+3676 757133.563787 5912881.02844 -6.73670545158 
+3677 757165.237893 5912981.16553 -6.60347402946 
+3678 757197.879013 5912982.09435 -6.9721336391 
+3679 757223.58209 5912955.46928 -7.3576624966 
+3680 757204.956812 5913013.44226 -7.11738384749 
+3681 757234.892965 5913022.91884 -7.61282740453 
+3682 757185.55292 5912816.76034 -5.82734533367 
+3683 757386.813262 5911146.75466 -0.116005123816 
+3684 757593.390286 5912846.9669 -0.256060564947 
+3685 757621.475356 5912862.68382 -0.23882564522 
+3686 757563.453329 5912839.30954 -0.586437748433 
+3687 757650.973046 5912851.98303 -0.228144783455 
+3688 760137.929506 5913154.99248 -1.49449639431 
+3689 760159.659518 5913133.45146 -2.02816093239 
+3690 758303.136019 5912171.73628 -0.420309293803 
+3691 759813.499431 5913527.02558 -2.47153051874 
+3692 759789.937851 5913541.99024 -1.05903414041 
+3693 760414.407661 5913092.05202 -0.788883400073 
+3694 760632.957929 5912478.05515 -5.5634229744 
+3695 757978.764705 5911991.00874 -0.22264106272 
+3696 757025.317662 5912732.56048 -4.77943967991 
+3697 757018.992855 5912702.93334 -4.72786284595 
+3698 756892.287132 5912279.66652 -6.07773400499 
+3699 757214.907544 5911950.68197 -5.39491895998 
+3700 760943.508576 5912232.77297 -3.88163363785 
+3701 760292.571321 5912282.77987 -8.71371641156 
+3702 760370.44635 5913040.35589 -0.700024820647 
+3703 760403.352192 5913043.72649 -0.871503506005 
+3704 756529.15 5913710.0 -0.443773134199 
+3705 758796.57371 5912767.81086 -0.112998004441 
+3706 756877.792184 5911693.3669 -0.243452161415 
+3707 756361.464706 5912992.09411 -0.34639397512 
+3708 756390.744342 5912989.45543 -0.48040027785 
+3709 756418.433135 5913005.96437 -0.687506936345 
+3710 756453.267223 5912986.77496 -1.00985341124 
+3711 756478.702313 5912963.63287 -2.0555992561 
+3712 759877.98138 5913554.26835 -1.32360329139 
+3713 759851.833462 5913574.98898 -0.403963918487 
+3714 756738.652823 5911860.71077 -0.269785164625 
+3715 756763.963103 5911840.87575 -0.495907258322 
+3716 757102.642656 5911758.96514 -1.18772766703 
+3717 756653.880029 5912745.36493 -2.55662430587 
+3718 757527.617677 5912750.96978 -0.708974826878 
+3719 758363.644042 5912471.71317 -0.873679565846 
+3720 757139.156061 5913021.9624 -6.43510637435 
+3721 757121.005852 5912820.24773 -6.40295022967 
+3722 756605.666961 5912105.79458 -1.1220142296 
+3723 756643.216272 5912113.19152 -2.26722369082 
+3724 757756.7 5911082.0 -0.0297580994751 
+3725 756894.509936 5912179.46479 -5.76342242606 
+3726 756925.478591 5912181.45689 -5.95974087933 
+3727 756541.645088 5911846.39248 -0.0774854854821 
+3728 758500.874249 5912242.3165 -0.532057843448 
+3729 758489.428373 5912211.11143 -0.476564816447 
+3730 758455.229966 5912185.83033 -0.430895035842 
+3731 758471.095209 5912151.90416 -0.301952940409 
+3732 758507.974255 5912142.22125 -0.242713781858 
+3733 758478.258773 5912120.65426 -0.218144163289 
+3734 758424.84722 5912169.04566 -0.378842380197 
+3735 758397.348467 5912178.91603 -0.442826659388 
+3736 758423.093909 5912140.47498 -0.283766515105 
+3737 759441.510232 5913000.27083 -0.975638039551 
+3738 758750.77251 5912515.18261 -0.659255746123 
+3739 758782.411775 5912530.76337 -0.62372205913 
+3740 758740.578014 5912546.55976 -1.51252171895 
+3741 758711.92351 5912550.53944 -2.04925540497 
+3742 757428.802759 5910994.31669 -0.170296556191 
+3743 756776.344087 5912576.00326 -3.02923761447 
+3744 757414.259322 5913040.79682 -7.8953699649 
+3745 757415.820651 5913011.16714 -7.82063920449 
+3746 757436.952912 5912975.94843 -7.88285174372 
+3747 756790.1328 5911712.85289 -0.348057752489 
+3748 757032.054016 5913381.50906 -6.14400925902 
+3749 757371.163339 5912065.07805 -5.54570963346 
+3750 759988.002221 5912992.14602 -0.919076897748 
+3751 759986.823388 5913027.11455 -0.924107901898 
+3752 760016.559509 5913040.90158 -1.02749540488 
+3753 760041.524754 5913024.24698 -1.06725018977 
+3754 757957.680621 5912325.62969 -0.479421550396 
+3755 757952.888492 5912357.80812 -0.428345153653 
+3756 757981.454774 5912378.04074 -0.473892125727 
+3757 757985.01355 5912313.15829 -0.496215976346 
+3758 758013.185087 5912328.77988 -0.464646820679 
+3759 757984.587649 5912411.95088 -0.45162190496 
+3760 758015.055245 5912427.20514 -0.573297436132 
+3761 757949.989589 5912388.96222 -0.529461308521 
+3762 757921.520593 5912406.04788 -0.42152621948 
+3763 758009.065266 5912360.97581 -0.468659116413 
+3764 758040.632648 5912408.60045 -0.530620889055 
+3765 757974.344483 5912441.17821 -0.565455588745 
+3766 757944.299162 5912450.96914 -0.539955718532 
+3767 757899.630371 5912387.62235 -0.376038782197 
+3768 760397.626461 5912753.30858 -0.694264107279 
+3769 760360.293334 5912757.8275 -1.07457514847 
+3770 760616.355063 5912357.55921 -9.74884617698 
+3771 760592.231349 5912385.1376 -8.80920975212 
+3772 760636.317556 5912379.95287 -9.04543018248 
+3773 760446.995259 5912253.21579 -10.5801342616 
+3774 760434.052364 5912849.76596 -1.33819493004 
+3775 757571.82512 5912724.56946 -0.43484047863 
+3776 760517.301162 5912575.95232 -2.10533728681 
+3777 759139.26182 5912848.89667 -5.60592583093 
+3778 757296.724454 5913393.64412 -0.93187475431 
+3779 757960.181469 5910568.37713 -0.216625192517 
+3780 758818.102213 5912705.31967 -0.15569619687 
+3781 759478.097277 5913299.30407 -1.19552157845 
+3782 759505.647701 5913283.50392 -2.67925996834 
+3783 760827.090625 5912178.34375 -10.7405295004 
+3784 757463.007088 5910725.91399 -0.41591100526 
+3785 757435.345319 5910711.19106 -0.356980618348 
+3786 757743.129311 5911317.24939 -0.0763912480969 
+3787 757676.435222 5911738.33974 -0.219248365574 
+3788 757942.5 5911608.0 0.0113625205617 
+3789 759766.07405 5913491.07078 -2.92656063955 
+3790 759777.055021 5913461.52848 -1.45756067346 
+3791 757870.467992 5911402.67549 -0.0737687614072 
+3792 756817.566269 5913283.48717 -4.84682553036 
+3793 756947.433429 5913224.8509 -5.64197595582 
+3794 757705.65 5913226.5 -0.256912274393 
+3795 757701.95 5913278.5 -0.0945141307161 
+3796 759824.422976 5912408.1392 -2.40187671904 
+3797 758867.163791 5912620.03461 -0.425498618068 
+3798 758981.76625 5912659.75288 -0.44715338841 
+3799 757739.403232 5912461.99335 -0.819254331783 
+3800 757715.645804 5912480.86791 -1.03243990431 
+3801 757696.812534 5912511.13842 -0.772927535547 
+3802 757678.580443 5912539.60145 -0.72814017392 
+3803 757669.004371 5912501.63841 -0.707484080452 
+3804 757526.835592 5912389.13212 -0.430323911753 
+3805 760267.871025 5913068.97917 -0.423539437685 
+3806 760277.361737 5913097.88883 -0.316166730491 
+3807 760266.093567 5913039.06534 -0.522395096597 
+3808 760196.824918 5913471.06222 0.322702998394 
+3809 757695.95 5913134.0 -0.125010653499 
+3810 758499.681576 5912493.6698 -0.950460230823 
+3811 757403.9 5910338.0 -0.229632769935 
+3812 760573.515327 5912441.42227 -6.68723212336 
+3813 760602.599433 5912428.4064 -7.35593805712 
+3814 760632.61002 5912440.70463 -6.99083546725 
+3815 760658.566776 5912420.23932 -7.57975987798 
+3816 760690.542881 5912434.90596 -6.84181654953 
+3817 760219.759995 5912695.68784 -1.99528478802 
+3818 760187.430992 5912724.90882 -0.73782866665 
+3819 760157.091717 5912709.13891 -0.86206714938 
+3820 760159.85 5912745.0 0.939454928868 
+3821 756620.417892 5912970.73656 -4.04365701303 
+3822 756623.779698 5912082.23206 -0.59533124991 
+3823 757435.849076 5910342.65254 -0.225670372472 
+3824 756329.137113 5912011.3023 -0.155337438617 
+3825 756439.000645 5912012.85678 -0.0462553169879 
+3826 756392.467013 5912010.08001 -0.0868864292412 
+3827 756319.95 5913843.5 -0.787499137106 
+3828 756296.05 5913807.0 -0.481840381891 
+3829 756286.20768 5913852.97204 -0.665516519191 
+3830 756183.0 5913934.5 -0.557957428708 
+3831 756231.80185 5913919.354 -0.623063051773 
+3832 756332.861765 5913771.10471 -0.568673648749 
+3833 756418.299944 5913675.80231 -0.713577819158 
+3834 756082.940609 5914013.5229 -0.319573991723 
+3835 756106.225059 5913986.43303 -0.379555405328 
+3836 756139.4 5913954.5 -0.525328454089 
+3837 756043.1 5914153.0 -0.250743861926 
+3838 756068.1 5914095.5 -0.211293389448 
+3839 756562.938229 5913682.2748 -0.823016641164 
+3840 756468.051222 5913681.87005 -0.717986126399 
+3841 756602.101319 5913736.98896 -0.114171372004 
+3842 756604.809988 5913706.49354 -0.24211905893 
+3843 756614.957428 5913672.97416 -0.619954864293 
+3844 756631.518349 5913731.39953 -0.108022128235 
+3845 757913.24949 5910461.3611 -0.382862353612 
+3846 757884.583355 5910463.53036 -0.384351880229 
+3847 759060.926431 5912412.45821 -0.549069406852 
+3848 758740.956938 5912153.53946 -0.265088139063 
+3849 758272.0 5912726.0 -0.174188180785 
+3850 759460.444955 5913455.18737 0.0951320257357 
+3851 756477.229417 5912011.16128 0.0705417378359 
+3852 756531.593142 5911905.41609 -0.0321652206618 
+3853 756561.676078 5911899.8919 -0.0846480876405 
+3854 756493.260779 5911921.80261 0.0519729854608 
+3855 761034.813751 5912177.53455 -3.28752049072 
+3856 761007.468635 5912179.07446 -3.30778384145 
+3857 757867.95 5910966.26277 -0.154078621653 
+3858 756467.539311 5912147.18149 -0.481651427557 
+3859 759781.528932 5913597.67428 -0.431000732357 
+3860 759000.941876 5912361.90869 -0.587230687182 
+3861 758968.210468 5912332.95809 -0.520828034554 
+3862 759001.328725 5912397.15869 -0.762136622821 
+3863 758991.465917 5912434.34362 -1.02447659243 
+3864 757085.131268 5913627.21466 -2.08675927129 
+3865 759703.053531 5913003.35878 -0.497966584064 
+3866 759734.534119 5913013.08019 -0.715775121532 
+3867 759179.09844 5912844.86773 -5.79019874382 
+3868 756481.36567 5912759.32855 -0.382158423389 
+3869 756469.038495 5912799.858 -0.414399059399 
+3870 756427.2 5912800.0 -0.294308568217 
+3871 756458.41621 5912834.57601 -0.457751369224 
+3872 756500.354354 5912733.31884 -0.420604254888 
+3873 756494.697789 5912704.88838 -0.345225402364 
+3874 756424.138392 5912859.06603 -0.380827248596 
+3875 757685.76184 5913036.63509 -0.0409652531244 
+3876 757676.201251 5913004.84159 -0.0592029949592 
+3877 757645.967427 5913000.62022 0.0640852753291 
+3878 759023.26736 5912788.17083 -0.542138799352 
+3879 759021.362444 5912750.57466 -0.932466380344 
+3880 759369.131908 5913112.98746 -2.4927549669 
+3881 758975.22506 5912752.54987 -0.542681128954 
+3882 759427.500723 5912863.22257 -0.524449283377 
+3883 756462.678951 5912186.15245 -0.490298860903 
+3884 756500.596618 5912161.03424 -1.33668952789 
+3885 759122.627013 5912475.40439 -0.529063275479 
+3886 759087.583109 5912475.71566 -0.890251663923 
+3887 759057.35717 5912477.57432 -1.61913952805 
+3888 759079.918886 5912503.8818 -1.41273767511 
+3889 759171.9 5912493.5 -0.435173639076 
+3890 759140.989592 5912501.53559 -0.724670847545 
+3891 758737.581603 5912764.05944 -0.0553469940473 
+3892 757488.299243 5913300.34909 -2.7519348934 
+3893 757523.552888 5913290.38505 -4.33159365304 
+3894 757503.375943 5913265.77204 -5.09452242478 
+3895 756649.96704 5913672.88295 -0.446915475751 
+3896 758842.961786 5912226.11224 -0.42804791819 
+3897 758870.865353 5912250.88166 -0.392033794261 
+3898 758090.263318 5911960.43089 -0.119241531748 
+3899 758114.457131 5911981.92051 -0.183465740175 
+3900 758146.265849 5911982.93587 -0.0424614272786 
+3901 758169.011323 5912001.18061 -0.0299683018336 
+3902 758061.747675 5911964.87777 -0.260237742868 
+3903 758041.313343 5911989.84513 -0.30560649485 
+3904 756529.237047 5912022.62761 -0.112924312024 
+3905 758786.638171 5912737.35376 -0.149051176359 
+3906 758854.65 5912772.0 -0.137345308494 
+3907 756353.1 5912907.0 -0.294390022663 
+3908 756382.961624 5912890.68647 -0.277841057397 
+3909 760181.834486 5912923.72887 -3.06129433406 
+3910 757320.001273 5913348.35769 -4.33367482378 
+3911 757289.703251 5913332.22091 -5.33657095508 
+3912 757268.207153 5913354.87819 -4.54302577392 
+3913 757263.618102 5913322.64055 -6.12208805804 
+3914 759088.556339 5912436.81268 -0.532432387321 
+3915 759033.442985 5912452.67421 -1.35734770506 
+3916 758034.7526 5910580.00531 -0.197571547976 
+3917 757995.507067 5910590.41297 -0.20306237126 
+3918 757996.376841 5910622.87702 -0.194395519609 
+3919 757595.06013 5913375.91657 -0.433544430614 
+3920 757554.309532 5913372.47823 -0.408160854704 
+3921 757528.117621 5913351.63556 -0.662406382057 
+3922 757539.68679 5913323.35238 -2.72897851577 
+3923 757566.514124 5910280.22676 -0.227099796443 
+3924 757594.889379 5910288.809 -0.229466586896 
+3925 758507.320367 5912574.30155 -0.473948185013 
+3926 757336.803583 5911657.75212 -0.203390769923 
+3927 760489.70362 5913159.66062 -0.749117524227 
+3928 756886.931639 5913613.19588 -1.89300545695 
+3929 756866.188264 5913643.99098 -0.931239657056 
+3930 756914.46227 5913546.7635 -4.19795308679 
+3931 756950.826478 5913533.34463 -4.46756924238 
+3932 756942.24601 5913566.07383 -3.78814004499 
+3933 756956.755611 5913594.06778 -3.33930918402 
+3934 756990.705753 5913600.24617 -3.73386590974 
+3935 757010.484344 5913571.80323 -3.93016302121 
+3936 757021.254814 5913602.13344 -3.87605668755 
+3937 756877.549815 5913575.68496 -3.01530195921 
+3938 758933.228073 5912741.90899 -0.30253362482 
+3939 760473.565948 5913189.00772 -0.66962884411 
+3940 760506.55 5913218.0 -0.614650660206 
+3941 760444.96801 5913192.38357 -0.527426564481 
+3942 760482.117916 5913236.17054 -0.619846243476 
+3943 759284.479213 5912944.84165 -2.42873370051 
+3944 759300.436582 5912983.99542 -2.99179324971 
+3945 759262.95066 5912998.41309 -1.98192049597 
+3946 760499.939184 5913019.05369 -1.30141074889 
+3947 760450.344245 5912998.98391 -1.65715930161 
+3948 760419.414004 5912990.50576 -1.20051090606 
+3949 757207.191474 5911615.71918 -0.593082691089 
+3950 757408.65 5913368.0 -0.371330094453 
+3951 757374.800376 5913354.12537 -1.20533141648 
+3952 757358.286091 5913327.7156 -3.65262912608 
+3953 759417.942441 5913291.8861 -0.393028681688 
+3954 757491.765106 5911766.42426 -0.280538021414 
+3955 757190.536538 5911572.26576 -0.253451531576 
+3956 758218.376761 5912703.33098 -0.232414606591 
+3957 758203.512395 5912678.58051 -0.314073445862 
+3958 760825.45 5912380.5 -4.09227656822 
+3959 760788.711502 5912392.56914 -4.62199965885 
+3960 760787.412121 5912359.63227 -6.07915710054 
+3961 759789.157208 5912996.17242 -0.718262953295 
+3962 756925.398874 5913620.18992 -2.51839664036 
+3963 756980.351174 5913642.96611 -3.66405713091 
+3964 756642.143693 5913533.57377 -0.380220750669 
+3965 756658.174029 5913503.86848 -0.690420858267 
+3966 756565.595552 5912067.34999 -0.242149805349 
+3967 756577.403592 5912095.14811 -0.648220246714 
+3968 756391.729749 5913372.19523 -0.293316584461 
+3969 756372.45 5913402.5 -0.262017466141 
+3970 756626.232822 5911834.74021 -0.152829802732 
+3971 756547.75 5912492.5 -0.310655689171 
+3972 756529.507294 5912416.05979 -0.229655601831 
+3973 756566.677364 5912378.46355 -0.350391349167 
+3974 757448.673148 5911257.1556 -0.106408747038 
+3975 757503.531412 5911245.1837 -0.116667540561 
+3976 757486.558955 5911279.34385 -0.107013359125 
+3977 757535.599332 5911232.68681 -0.138464265885 
+3978 757511.080584 5911305.49226 -0.103631101481 
+3979 757549.203467 5911205.55847 -0.221861425315 
+3980 757736.132411 5911034.32196 -0.0435252259994 
+3981 757723.097469 5911004.9438 -0.0939239391806 
+3982 758052.726495 5911927.80599 -0.109102102798 
+3983 756467.795247 5912898.58277 -0.885948381416 
+3984 756490.007024 5912918.77522 -1.82946539713 
+3985 757830.391616 5910399.07857 -0.348735019946 
+3986 757795.410624 5910404.14098 -0.33011971315 
+3987 759640.567529 5912322.14979 -2.5029617261 
+3988 756372.952986 5912936.43472 -0.346482701672 
+3989 757778.472299 5910370.4244 -0.313547347183 
+3990 756724.310183 5913723.06001 -0.243604272457 
+3991 756742.696777 5913752.01878 -0.241834761471 
+3992 756708.5 5913790.0 -0.0933906527034 
+3993 757126.471648 5913437.06707 -5.20783012093 
+3994 757149.90266 5913378.43318 -6.01174698739 
+3995 757161.407 5913448.48015 -3.76941085648 
+3996 757116.958559 5913407.1735 -5.8508500854 
+3997 757112.841406 5913342.79187 -6.47417938125 
+3998 757083.912637 5913356.17995 -6.36217445842 
+3999 759820.691869 5913074.8651 -0.745248945797 
+4000 759809.085882 5913049.13519 -0.762022108476 
+4001 756652.810848 5911801.49906 -0.160482310987 
+4002 756672.372695 5911848.18749 -0.179710101979 
+4003 759582.981102 5913555.58248 -0.000248416652739 
+4004 759233.220005 5912571.44234 -0.586646686594 
+4005 756482.337175 5912863.44791 -0.745783342393 
+4006 756511.955884 5912858.20126 -0.865224666994 
+4007 758842.639592 5912283.5339 -0.541301157826 
+4008 758848.675169 5912319.69039 -0.60109726513 
+4009 758886.019956 5912329.83242 -0.664884182244 
+4010 758820.00565 5912342.47272 -0.637454871332 
+4011 758902.322733 5912360.83562 -0.699706789985 
+4012 758937.355319 5912366.89271 -0.695939879742 
+4013 758940.276474 5912404.63531 -0.769071663687 
+4014 758970.240659 5912411.96058 -0.897649430969 
+4015 756694.68966 5913532.71295 -0.617754727958 
+4016 756735.985764 5913483.42 -1.9629970617 
+4017 756706.42985 5913465.46486 -1.85694609617 
+4018 756762.533394 5913463.96964 -2.8903786815 
+4019 756767.47787 5913426.33525 -3.51389623994 
+4020 756735.640638 5913410.33542 -3.42679440728 
+4021 756758.431164 5913387.4344 -4.04116576059 
+4022 756754.243241 5913354.39186 -4.14882622636 
+4023 756725.098616 5913345.00333 -3.68663958877 
+4024 756747.281651 5913323.94884 -4.00492745239 
+4025 756740.268199 5913293.90247 -3.92259575068 
+4026 756706.654814 5913398.13237 -3.00284161854 
+4027 756778.978342 5913368.04351 -4.31962452916 
+4028 756683.285831 5913449.13385 -1.4867133916 
+4029 756712.79333 5913427.73526 -2.67770529777 
+4030 756628.390919 5912382.40134 -0.568614398731 
+4031 757399.9 5911226.5 -0.107941684776 
+4032 757473.094781 5911205.22828 -0.0950681597147 
+4033 757459.026894 5911177.40228 -0.105442316029 
+4034 756722.879204 5911760.39547 -0.971981994744 
+4035 756702.861342 5911819.49246 -0.170817389531 
+4036 757685.802942 5913082.80668 -0.270622364956 
+4037 757638.66633 5913056.19499 -2.63168895404 
+4038 760372.390378 5912842.17406 -1.4224316064 
+4039 760331.676072 5912852.80797 -2.60265922364 
+4040 760349.423785 5912887.90169 -2.29868805343 
+4041 760396.337885 5912857.94959 -2.24834898253 
+4042 757956.524386 5912775.79438 -0.269978650753 
+4043 757920.228652 5912689.07989 -0.334895463286 
+4044 760451.584112 5913036.17993 -1.51986381419 
+4045 757845.083378 5910917.81506 -0.314336795324 
+4046 757828.224919 5910892.83677 -0.426101570781 
+4047 757838.589255 5910851.60014 -0.36664839636 
+4048 757825.087869 5910966.63094 -0.18160201069 
+4049 758623.742922 5912122.57676 -0.286233349761 
+4050 759090.639311 5912840.74694 -0.935053895691 
+4051 759041.930573 5912837.91641 -0.18693266772 
+4052 759088.428731 5912788.96867 -1.56687511592 
+4053 759095.840925 5912758.09632 -2.67841600827 
+4054 757810.486177 5911208.09695 -0.0805744941817 
+4055 759462.909244 5913343.41868 -0.630278717067 
+4056 757104.387358 5913458.98277 -4.96291801797 
+4057 757061.506451 5913496.40659 -4.82902036993 
+4058 757076.30174 5913450.49986 -5.44674693741 
+4059 757663.194987 5911699.17459 -0.17465375781 
+4060 757616.855179 5911741.29552 -0.237003242065 
+4061 757643.031455 5911762.86141 -0.213725101163 
+4062 757652.736661 5911792.12738 -0.164324911194 
+4063 758005.108567 5910662.26198 -0.180136285682 
+4064 758750.513351 5912248.10118 -0.509205750908 
+4065 758741.351707 5912216.86644 -0.482070903142 
+4066 758719.429508 5912234.97565 -0.48056821096 
+4067 757757.798009 5910900.40126 -0.338865840126 
+4068 758238.366141 5912032.39575 -0.123123401633 
+4069 758241.49623 5912068.74059 -0.155897144174 
+4070 757815.086692 5912817.48782 -0.267084189017 
+4071 760130.251318 5912907.86779 -1.74652383806 
+4072 760109.104337 5912959.49841 -1.36750368311 
+4073 760090.025 5912900.0 -0.789763872276 
+4074 757063.341293 5913758.76621 -0.35385027529 
+4075 757010.65 5913773.5 -0.255856650658 
+4076 757696.85 5911551.0 -0.0791813530391 
+4077 757937.123806 5911698.79329 0.110850230342 
+4078 757373.844841 5910390.05941 -0.242217760064 
+4079 759774.194477 5913044.01451 -0.727169457923 
+4080 759719.690674 5913061.0556 -0.695375872423 
+4081 756642.464305 5911893.91685 -0.195647239458 
+4082 756706.776251 5911885.7939 -0.200128134985 
+4083 756708.239931 5911920.90941 -0.208125776388 
+4084 756680.426122 5911875.3599 -0.1956158225 
+4085 757559.263844 5911262.86754 -0.120938926839 
+4086 757551.044813 5911294.88457 -0.106839090082 
+4087 757799.26427 5911508.78793 -0.0984391154873 
+4088 757775.879537 5911484.82845 -0.102171313524 
+4089 759929.777972 5913505.34396 -2.50694696868 
+4090 759959.913347 5913490.41663 -2.30018595059 
+4091 759962.550817 5913457.34259 -0.896283546545 
+4092 759990.33738 5913442.91774 -0.806176124267 
+4093 759992.511119 5913413.7072 -0.684389220151 
+4094 759965.544016 5913384.5658 -0.60661898028 
+4095 759991.278434 5913363.02394 -0.582532857166 
+4096 759938.024456 5913445.20185 -0.724077318146 
+4097 759906.245587 5913446.35343 -0.696295028925 
+4098 757226.054729 5910662.31052 -0.276015196334 
+4099 757251.337832 5910677.10487 -0.274642134419 
+4100 757181.25 5910732.0 -0.241909072993 
+4101 757236.199071 5910717.26492 -0.252150809834 
+4102 757206.931199 5910717.94487 -0.249159459909 
+4103 756654.691616 5913562.06126 -0.198709532616 
+4104 760064.070359 5913515.84567 -0.404793343484 
+4105 760081.825787 5913489.50373 -1.22184516299 
+4106 760034.76422 5913508.66154 -1.86752074138 
+4107 760019.953677 5913481.65782 -3.01060169727 
+4108 757917.141241 5911414.65606 -0.0775066002584 
+4109 757910.2 5911358.0 -0.0724115707573 
+4110 759559.774199 5913494.8626 -0.429957701241 
+4111 757687.8 5911472.0 -0.0658863343677 
+4112 759346.250426 5913075.47623 -2.82634235038 
+4113 759360.08339 5913040.07468 -2.33017332223 
+4114 759111.821724 5912536.61053 -1.66083872215 
+4115 756531.160016 5913534.31672 -0.283657033775 
+4116 756499.7 5913559.5 -0.223504684925 
+4117 756472.643015 5913322.45652 -0.592378715329 
+4118 756731.410186 5911794.68436 -0.585115732892 
+4119 756761.27795 5911803.08864 -0.975645330867 
+4120 758204.16523 5912030.85306 -0.0968684835019 
+4121 757882.165663 5911721.26948 0.047579321378 
+4122 757844.112941 5911675.41755 -0.00722619261078 
+4123 757824.809492 5911701.23307 0.0190344857827 
+4124 757431.482927 5910406.14218 -0.232638850037 
+4125 757404.455071 5910438.0821 -0.242954032381 
+4126 757871.227147 5911442.25902 -0.0853214038768 
+4127 759318.291592 5913023.43501 -3.04221838332 
+4128 757788.637702 5911249.51924 -0.085639023649 
+4129 757970.017505 5910804.50677 -0.141617348283 
+4130 757969.5 5910844.0 -0.144283370066 
+4131 759366.441729 5913173.30224 -0.620853065826 
+4132 759725.759636 5912419.25598 -2.42099176938 
+4133 759759.96845 5912428.10661 -2.37005355054 
+4134 759784.108517 5912402.61827 -2.43498889931 
+4135 759714.52548 5912390.0739 -2.4730149717 
+4136 759772.496134 5912376.437 -2.51124241598 
+4137 759758.925 5912476.75 -2.23520108916 
+4138 759790.153292 5912469.09761 -2.18038842853 
+4139 759821.048247 5912456.73505 -2.15703003252 
+4140 759815.157875 5912491.05444 -2.01465308358 
+4141 759842.267613 5912514.01801 -1.79567496654 
+4142 759807.575 5912524.25 -1.88349076202 
+4143 759869.490284 5912499.06907 -1.83564776059 
+4144 757730.12084 5910880.31897 -0.412601934011 
+4145 757705.432116 5910827.19031 -0.428307956654 
+4146 757680.482601 5910804.2906 -0.403599986952 
+4147 757709.33287 5910797.89913 -0.379403997671 
+4148 757677.087805 5910866.25409 -0.567049841112 
+4149 757644.066483 5910861.37411 -0.522119880198 
+4150 757625.167926 5910889.43329 -0.491073584038 
+4151 757652.334562 5910922.83603 -0.642425581204 
+4152 757647.817335 5910951.97673 -0.506554248313 
+4153 760294.75 5913466.0 0.346273828337 
+4154 757238.85 5910895.5 -0.160816465615 
+4155 757259.063341 5910870.61614 -0.166447975231 
+4156 757270.413341 5910901.11614 -0.152915403851 
+4157 756972.842259 5911739.95252 -0.407310645375 
+4158 756937.359492 5911793.10905 -3.95663438007 
+4159 756930.98394 5911880.55583 -4.52521436074 
+4160 756927.27558 5911911.73515 -4.42085385473 
+4161 756907.482383 5911862.67716 -4.02816954659 
+4162 756951.782132 5911927.68986 -5.13213007169 
+4163 759686.3 5913612.0 -0.346617728373 
+4164 759712.274201 5913591.4545 -0.421967874278 
+4165 759716.779 5913564.39409 -0.53719404019 
+4166 759735.05 5913617.5 -0.413102593602 
+4167 757930.564736 5910892.3852 -0.228774242187 
+4168 757948.9 5910953.5 -0.136878179878 
+4169 756828.786793 5913625.11922 -0.634142400433 
+4170 756823.587394 5913595.88817 -1.3139950937 
+4171 759193.038172 5912610.67628 -1.95921565246 
+4172 757795.34705 5910918.89744 -0.3711448161 
+4173 759054.578468 5912540.08105 -0.737426881554 
+4174 759026.925551 5912529.21227 -0.726170344377 
+4175 759057.489331 5912583.57865 -0.772390488429 
+4176 759091.462674 5912588.67635 -0.652581345572 
+4177 759126.038806 5912582.49292 -0.883446070181 
+4178 759031.243212 5912604.85313 -1.21414489821 
+4179 759028.575282 5912641.67966 -1.71515391949 
+4180 758998.775401 5912578.6672 -1.05042193377 
+4181 758965.361327 5912595.81661 -2.06262619783 
+4182 758998.798684 5912548.65253 -0.80939583066 
+4183 758969.538022 5912628.06138 -1.15422219744 
+4184 758940.033204 5912626.56695 -0.634137170564 
+4185 758918.320523 5912650.36228 -0.254199937882 
+4186 758930.534481 5912683.19261 -0.401702266639 
+4187 758908.994306 5912622.27756 -0.291454638103 
+4188 758896.515996 5912670.1668 -0.255750935614 
+4189 759773.15029 5913089.10403 -0.703076429917 
+4190 759760.049952 5913111.62202 -0.702847044503 
+4191 759772.837629 5913134.23031 -0.558350006077 
+4192 758508.9 5912061.5 -0.210724624266 
+4193 757751.715576 5910668.96701 -1.06470258053 
+4194 757777.687909 5910528.19924 -0.957715383892 
+4195 757752.324177 5910621.3828 -1.53138928172 
+4196 757730.118872 5910645.11842 -1.62809792374 
+4197 757711.564373 5910593.37722 -1.55206108634 
+4198 757763.609956 5910506.9277 -0.576601087675 
+4199 757751.270156 5910459.73138 -0.284071048795 
+4200 757703.93208 5910622.54386 -1.64187273277 
+4201 758915.336952 5912292.03343 -0.491279113157 
+4202 758945.897662 5912307.16773 -0.50101248044 
+4203 758941.700542 5912277.22019 -0.452799925016 
+4204 757061.1 5911592.0 -0.202848513893 
+4205 757057.348216 5911696.80441 -0.637117573796 
+4206 758764.257057 5912378.70289 -0.572761392004 
+4207 758792.599893 5912379.44761 -0.581429069235 
+4208 758789.871683 5912452.48928 -0.617144168513 
+4209 759368.120818 5912997.89839 -1.17262370383 
+4210 756887.074394 5911927.55732 -2.94965193059 
+4211 756872.779604 5911884.91485 -1.39300483105 
+4212 756829.067514 5911925.53806 -0.669691272565 
+4213 756474.510675 5911871.4092 -0.0128996517923 
+4214 760557.707971 5912373.35431 -9.069157588 
+4215 759602.480257 5913498.08805 -0.578618320701 
+4216 759653.631468 5913459.82746 -1.75047313816 
+4217 759617.592299 5913453.95014 -0.947034406774 
+4218 759677.022383 5913438.03039 -3.1312109443 
+4219 758613.333459 5912173.83037 -0.43035339607 
+4220 758643.849947 5912222.85 -0.510944075828 
+4221 757663.116758 5910751.57453 -0.806492127821 
+4222 757666.303508 5910705.19754 -1.43294947234 
+4223 757623.556118 5910726.2264 -0.655208627216 
+4224 757601.437081 5910753.40407 -0.400383935558 
+4225 757637.894036 5910316.96234 -0.24656447072 
+4226 757629.744328 5910288.49644 -0.241483667974 
+4227 757690.512681 5910297.83206 -0.273781455353 
+4228 757742.5 5910322.0 -0.29370839559 
+4229 760502.866619 5912785.61462 -2.42545710683 
+4230 758913.816665 5912430.57692 -0.699475691518 
+4231 758922.100107 5912464.26796 -0.710023623515 
+4232 758882.606728 5912424.73544 -0.640637207421 
+4233 758858.975608 5912444.88847 -0.676503982516 
+4234 758949.855825 5912469.89576 -0.727439916155 
+4235 758892.223294 5912493.7409 -0.74711885582 
+4236 756549.535274 5912795.26131 -0.621406617503 
+4237 756521.228854 5912813.13073 -0.699740473045 
+4238 756496.641179 5912800.56663 -0.53036290866 
+4239 756536.938622 5912754.88575 -0.470118304101 
+4240 756666.226646 5912477.73477 -0.854815693133 
+4241 756693.189208 5912453.84769 -0.756322037422 
+4242 756669.686753 5912425.53973 -0.899455875525 
+4243 756723.082454 5912486.38947 -1.0588134022 
+4244 756752.80437 5912479.90108 -1.54906232699 
+4245 756777.786681 5912510.33304 -1.77381949307 
+4246 756802.16079 5912496.18325 -1.81223516495 
+4247 756877.422763 5912571.36028 -3.69147811242 
+4248 756928.499565 5912615.27994 -4.27513965501 
+4249 756875.863948 5912633.6911 -4.07957564414 
+4250 756862.883958 5912663.64343 -4.04083100276 
+4251 756905.280328 5912633.34402 -4.16667032959 
+4252 756898.183483 5912697.72771 -4.04686434356 
+4253 756927.095667 5912669.13629 -4.12938715655 
+4254 756968.653646 5912721.4255 -3.99531606474 
+4255 756960.198507 5912679.48195 -4.13002819431 
+4256 756922.339074 5912731.67001 -3.72942453253 
+4257 756750.080734 5912747.72491 -3.02365075915 
+4258 756741.653182 5912791.20055 -3.60439334526 
+4259 756766.856965 5912809.96704 -4.26353424617 
+4260 756710.781891 5912735.4921 -3.12053057577 
+4261 756684.344293 5912758.36466 -3.04201612932 
+4262 757805.844566 5912780.46371 -0.246038302629 
+4263 757771.238902 5912748.14394 -0.291830967555 
+4264 757697.742135 5912737.48798 -0.294058688839 
+4265 757694.804424 5912776.39521 -0.256007039281 
+4266 757667.151068 5912776.27648 -0.27526280418 
+4267 757550.241805 5912893.67092 -1.9822434054 
+4268 757511.591373 5912898.73665 -7.74272551169 
+4269 757571.065811 5912926.10202 -2.23382557031 
+4270 757765.147263 5912700.61849 -0.312114588409 
+4271 757730.357102 5912714.10884 -0.270935142108 
+4272 757728.341979 5912664.67499 -0.323570260186 
+4273 757866.89922 5911631.27418 -0.0224949606214 
+4274 757874.352747 5911578.70442 -0.0582754402077 
+4275 757855.660632 5911603.81881 -0.0597628261728 
+4276 757821.591131 5911598.53365 -0.0926931501667 
+4277 757802.898651 5911627.17429 -0.117168585595 
+4278 757016.047726 5913660.03838 -3.5638749021 
+4279 757012.031138 5913723.31242 -1.32428011203 
+4280 759123.920306 5912645.24498 -1.00293222827 
+4281 759091.646954 5912657.7458 -1.78722328438 
+4282 759088.509644 5912692.23431 -1.1920961009 
+4283 759068.03799 5912713.23137 -0.95857592237 
+4284 759142.156891 5912621.79385 -0.866121214065 
+4285 757089.266204 5911718.93178 -1.25937111528 
+4286 757066.047633 5911804.88158 -0.695262321388 
+4287 757096.371109 5911848.09972 -1.32498712006 
+4288 757146.377215 5911870.45911 -0.854539855231 
+4289 757156.978273 5911836.58652 -0.666751768855 
+4290 758715.899036 5912179.94495 -0.417913223542 
+4291 758694.690701 5912270.83184 -0.483098695392 
+4292 758666.665086 5912264.34932 -0.496633349353 
+4293 757290.153169 5910569.7431 -0.301039998482 
+4294 757340.211704 5910595.45466 -0.331286954054 
+4295 757373.185144 5910587.74003 -0.317544427679 
+4296 757383.091634 5910636.71756 -0.887519844003 
+4297 757393.381461 5910609.47321 -0.802431381445 
+4298 757442.785961 5910622.47686 -1.17900405283 
+4299 757435.695814 5910651.87611 -0.893031936787 
+4300 757405.996222 5910659.63977 -0.965914592317 
+4301 757473.923204 5910613.93144 -1.37425262364 
+4302 757482.370972 5910585.07029 -1.56243819648 
+4303 756755.994868 5912537.77582 -2.04885637919 
+4304 757401.412108 5910741.30522 -0.302150720794 
+4305 757367.415441 5910737.40712 -0.309833950698 
+4306 757401.134325 5910798.69592 -0.438242328402 
+4307 757428.232646 5910776.89158 -0.581605378342 
+4308 756474.9 5912306.0 -0.28230333171 
+4309 757258.6 5910949.0 -0.143308651084 
+4310 757307.473345 5910905.07597 -0.141972524683 
+4311 757321.744987 5910877.39873 -0.141641110977 
+4312 757307.165435 5910850.68173 -0.157171222725 
+4313 757323.711791 5910949.53838 -0.134496921614 
+4314 757300.986365 5910974.98517 -0.136165355862 
+4315 757280.8 5911003.5 -0.135227830514 
+4316 757314.708186 5911007.41784 -0.133586035811 
+4317 757353.947315 5910945.7536 -0.131130711881 
+4318 757367.917481 5910981.16045 -0.132030913771 
+4319 757350.296303 5911005.85101 -0.132241902172 
+4320 757379.322381 5910908.50623 -0.130997262663 
+4321 760632.25 5912554.0 -3.23284218362 
+4322 760592.348862 5912532.16598 -3.60556183893 
+4323 760587.662125 5912500.10397 -4.69921993814 
+4324 760491.3 5913395.5 -0.0877136524207 
+4325 760440.390588 5913351.86853 -0.281886422273 
+4326 760444.60154 5913384.65315 -0.23880017634 
+4327 760411.312753 5913339.6548 -0.145155219207 
+4328 760437.2 5913418.5 -0.0350087199225 
+4329 760413.872252 5913400.49527 -0.121700435051 
+4330 760413.491642 5913305.60511 -0.157757549819 
+4331 760436.905454 5913288.59807 -0.33916284883 
+4332 760466.667814 5913332.42922 -0.379138047632 
+4333 760520.2 5913280.5 -0.554469664062 
+4334 760464.407955 5913302.46138 -0.476724660114 
+4335 757663.674133 5911642.11673 -0.081294696357 
+4336 757665.35 5911601.5 -0.0724137008619 
+4337 759010.81834 5912704.71013 -0.750089827286 
+4338 759035.816691 5912688.28765 -0.728071104836 
+4339 759454.272589 5913265.0648 -1.269856149 
+4340 759470.10252 5913238.44286 -2.5903619499 
+4341 759502.640262 5913247.31343 -2.39897741128 
+4342 759557.827015 5913173.59581 -0.614174543108 
+4343 759581.478887 5913148.65974 -0.552565431265 
+4344 759616.799546 5913157.00903 -0.55499850504 
+4345 759625.417428 5913192.67878 -0.533190550008 
+4346 759610.57101 5913124.60812 -0.622963042791 
+4347 759529.474957 5913177.24338 -0.590230892252 
+4348 759643.435661 5913169.44962 -0.561355734649 
+4349 759543.89951 5913279.54445 -1.67967889494 
+4350 759519.95666 5913334.37839 -1.7692183828 
+4351 759510.82308 5913138.54613 -0.737000781603 
+4352 756599.125503 5911913.02306 -0.144821366146 
+4353 758786.417229 5912175.91016 -0.295838038659 
+4354 756540.818172 5912899.52454 -3.11553631455 
+4355 756575.092073 5912899.27139 -3.79410308653 
+4356 756567.711343 5912871.24808 -2.80366447961 
+4357 756911.116104 5911970.87666 -4.47901717086 
+4358 759144.750161 5912670.73506 -1.34640938508 
+4359 757364.7941 5910786.23282 -0.216065838423 
+4360 757309.967549 5910792.18829 -0.184558357501 
+4361 757341.051594 5910805.03966 -0.14510252884 
+4362 757346.203588 5910836.74792 -0.146998171474 
+4363 757376.060717 5910847.47993 -0.161653733645 
+4364 757325.464162 5910753.42029 -0.230912663425 
+4365 758482.869714 5912086.31371 -0.204659392641 
+4366 758415.45 5912053.0 -0.213680307916 
+4367 758360.27206 5912146.80647 -0.394131743199 
+4368 760020.0 5913553.0 0.255484957296 
+4369 759983.739638 5913536.48863 -1.15509692355 
+4370 759349.482572 5912973.82176 -1.09579208317 
+4371 759375.209747 5912944.67563 -1.04420584384 
+4372 756477.15 5912076.0 -0.160473187317 
+4373 756522.34047 5912075.16667 -0.13059834097 
+4374 756794.671807 5913580.41961 -1.19379131337 
+4375 756836.729552 5913537.51525 -3.7971000957 
+4376 756852.172394 5913509.27344 -4.48393705995 
+4377 756795.394174 5913540.27773 -3.03906217287 
+4378 756793.297543 5913492.2855 -3.66382787942 
+4379 756830.968182 5913473.93698 -4.15864385723 
+4380 756892.209763 5913510.18049 -4.86162046736 
+4381 759659.2 5912978.0 0.050694504425 
+4382 759625.707208 5913004.56674 -0.562499371831 
+4383 759623.245946 5913034.9124 -0.626742055355 
+4384 759596.290713 5913047.99684 -0.604179060132 
+4385 757771.530293 5911567.72968 -0.102412469032 
+4386 757968.95 5911737.5 0.101659861987 
+4387 757397.227023 5911686.15472 -0.261813142087 
+4388 757615.350413 5910962.69591 -0.492614695495 
+4389 757613.928601 5910996.17088 -0.547891046137 
+4390 757641.231931 5911011.98374 -0.336631054573 
+4391 757535.215588 5911020.85411 -0.692159171749 
+4392 760854.596238 5912239.13186 -6.44497436479 
+4393 760851.515743 5912203.90876 -8.50153541969 
+4394 760851.1 5912307.5 -4.67379291349 
+4395 760813.672665 5912305.89015 -7.12811573331 
+4396 757627.532323 5910779.82853 -0.435166017544 
+4397 757642.779378 5910826.1097 -0.446840398844 
+4398 757296.467657 5912673.25563 -7.89606257553 
+4399 756584.40157 5912268.72423 -0.745748837003 
+4400 756658.877456 5912328.24623 -0.654939085407 
+4401 756710.431708 5912277.49004 -4.00554418585 
+4402 756695.68034 5912230.2951 -4.15967006987 
+4403 756668.355977 5912212.53781 -3.86577595545 
+4404 756725.785889 5912220.62589 -4.9290114 
+4405 756677.418 5912186.48648 -4.44188631768 
+4406 756635.889102 5912165.28887 -4.0109161511 
+4407 756691.021179 5912144.18117 -4.31557526802 
+4408 756717.262654 5912123.8227 -4.08719904321 
+4409 756746.915957 5912136.5535 -4.65726803617 
+4410 756713.838852 5912093.91807 -3.3599283789 
+4411 756736.814601 5912075.96505 -2.98851683659 
+4412 756680.543123 5912085.83576 -2.28314991713 
+4413 756671.972918 5912003.00287 -0.354819267493 
+4414 756657.12156 5911926.30269 -0.281511861252 
+4415 756698.884885 5911964.68919 -0.228796352463 
+4416 756895.44702 5912043.62765 -3.90969430195 
+4417 756910.190943 5912020.49235 -4.35170566531 
+4418 756911.336256 5912073.32036 -4.27433671971 
+4419 756977.96128 5912219.25901 -6.44462368591 
+4420 757004.458462 5912243.65014 -6.59240834401 
+4421 756993.713441 5912287.05665 -6.487437739 
+4422 757039.414723 5912299.8708 -6.50953097663 
+4423 756951.871758 5912276.98309 -6.37392399898 
+4424 756898.571649 5912243.5797 -6.11281342873 
+4425 756935.752492 5912234.1078 -6.29425858776 
+4426 756927.509235 5912300.5681 -6.24546571704 
+4427 756882.583796 5912360.15779 -5.84528395436 
+4428 756936.442364 5912333.22983 -6.22293864354 
+4429 756914.447181 5912356.56249 -5.98932983536 
+4430 756964.619461 5912335.48576 -6.30887005345 
+4431 757498.941378 5910702.9943 -0.610120203567 
+4432 757496.604873 5910758.26145 -0.548086538555 
+4433 757571.565353 5913024.67263 -6.55421249999 
+4434 757594.678703 5913047.73815 -4.93723099754 
+4435 757607.615346 5912988.79949 -2.39313087812 
+4436 757616.568176 5912895.02442 -0.397316079283 
+4437 757608.655455 5912956.20243 -0.337894114092 
+4438 757671.614697 5912902.23899 -0.303277779318 
+4439 757656.254776 5912958.0341 -0.148511010241 
+4440 757719.5 5912994.0 -0.00836133704636 
+4441 758168.961687 5912720.95465 -0.268310287786 
+4442 758126.445035 5912723.89528 -0.264337280925 
+4443 758112.25 5912758.0 -0.193406979931 
+4444 758092.504478 5912694.03716 -0.382385467895 
+4445 758137.55319 5912683.40334 -0.362940308067 
+4446 758087.640009 5912656.65185 -0.460357598667 
+4447 758039.996712 5912697.87893 -0.380362160885 
+4448 758032.412281 5912667.01974 -0.432412542531 
+4449 758078.898726 5912740.89486 -0.283814133661 
+4450 758066.638466 5912712.88385 -0.343879160991 
+4451 758037.01325 5912730.27362 -0.2879612983 
+4452 758135.555129 5912607.06064 -0.548612843108 
+4453 758108.175781 5912617.96684 -0.546333311629 
+4454 758133.12196 5912573.01417 -0.586157835955 
+4455 757502.75 5911354.5 -0.0987816530814 
+4456 759164.408699 5912572.68394 -1.85636572352 
+4457 759169.806006 5912541.60478 -0.916892050873 
+4458 758097.655148 5912012.96066 -0.325604676903 
+4459 758068.932862 5912020.46292 -0.341091585083 
+4460 758009.336042 5912021.15752 -0.35513412397 
+4461 758018.927281 5912051.37366 -0.370373515423 
+4462 757919.192549 5911976.15504 -0.277457336453 
+4463 757920.908137 5912007.47713 -0.286871057496 
+4464 757945.33773 5912038.50022 -0.299156770714 
+4465 757895.538288 5911958.26634 -0.258823772301 
+4466 757942.380415 5911960.92445 -0.261271908862 
+4467 757688.703424 5911343.03337 -0.0812807014013 
+4468 757682.257572 5911314.07108 -0.0867005475652 
+4469 757735.953196 5911396.51158 -0.0768692818328 
+4470 757750.50453 5911358.93761 -0.0705048327054 
+4471 757537.633242 5911791.6034 -0.219674149333 
+4472 757550.82326 5911818.50003 -0.194479853442 
+4473 757534.623984 5911851.59569 -0.200589551445 
+4474 757508.20742 5911790.83968 -0.225005975776 
+4475 757597.00588 5910914.84896 -0.46225606526 
+4476 757567.156994 5910901.5774 -0.524224562751 
+4477 757539.12543 5910922.57286 -0.5802497199 
+4478 757512.763418 5910900.51345 -0.833793879863 
+4479 757485.750191 5910909.88025 -0.52839961494 
+4480 757480.225434 5910855.84564 -0.467243930809 
+4481 757457.896345 5910886.55782 -0.364878973225 
+4482 757432.562077 5910836.96623 -0.429860704564 
+4483 757427.603845 5910864.67966 -0.29346387244 
+4484 757584.663561 5910335.67137 -0.229168920899 
+4485 757596.183596 5910382.50738 -0.663373943518 
+4486 757573.822917 5910404.68568 -0.605200600057 
+4487 757635.124193 5910362.36118 -0.431389088987 
+4488 758850.66994 5912517.77977 -0.651600728441 
+4489 758811.649132 5912506.9611 -0.655693379336 
+4490 758812.499355 5912475.03204 -0.602881802433 
+4491 758803.902602 5912564.40913 -1.78752269538 
+4492 756662.987836 5912641.72814 -2.26080519207 
+4493 756537.0 5912601.0 -0.309043638808 
+4494 756615.811077 5912653.92058 -1.16710508537 
+4495 756647.568887 5912556.19674 -0.993361744515 
+4496 756672.285859 5912598.85316 -2.00591493989 
+4497 756654.795003 5912691.32666 -2.32589029519 
+4498 756617.737484 5912726.79587 -1.65652758269 
+4499 757686.778217 5912687.11112 -0.374456620511 
+4500 757662.672584 5912712.22558 -0.319446708262 
+4501 757635.865963 5912690.03121 -0.571480254224 
+4502 756983.0259 5911790.29457 -3.20587624281 
+4503 756960.139082 5911869.19033 -5.24597062685 
+4504 756956.118893 5911831.06028 -4.88755505557 
+4505 757000.818438 5911860.99336 -5.2154372928 
+4506 757526.934993 5910585.89881 -1.4962441461 
+4507 757554.064485 5910570.01383 -1.01385063982 
+4508 757531.041298 5910528.66458 -1.21069045383 
+4509 757504.920641 5910542.3506 -1.51129215862 
+4510 757456.812993 5910566.64091 -1.22804182042 
+4511 757426.599458 5910577.09252 -0.981085521644 
+4512 757835.707198 5910708.12065 -0.165023652832 
+4513 756549.066032 5912625.12571 -0.455630074305 
+4514 756567.248051 5912672.84278 -0.684731008603 
+4515 757590.68514 5912676.71826 -0.809316066119 
+4516 757520.819033 5912543.56819 -0.00873165214646 
+4517 757529.205371 5912498.2395 -0.499323684642 
+4518 757552.422263 5912477.21851 -0.476109784719 
+4519 757501.147151 5912487.96651 -0.502319189267 
+4520 757485.113381 5912460.2352 -1.01001388291 
+4521 757454.175459 5912452.43769 -3.5204633486 
+4522 757476.276652 5912519.70372 -1.75598751215 
+4523 757643.106471 5912547.56446 -0.391367474411 
+4524 757440.921948 5912544.02866 -4.92459355152 
+4525 757402.794397 5912507.23902 -7.97227622178 
+4526 757413.378626 5912538.57113 -7.06938688088 
+4527 757367.622534 5912510.22894 -8.08997657708 
+4528 757353.656779 5912542.63895 -8.22359282939 
+4529 757308.888125 5912532.37733 -7.7136809091 
+4530 757285.558691 5912554.63915 -7.54813901091 
+4531 757347.413535 5912479.14493 -7.9001345482 
+4532 757362.179287 5912448.83241 -8.0260314557 
+4533 757343.767363 5912405.32719 -7.73401190348 
+4534 757393.840418 5912560.98351 -8.03933643469 
+4535 757369.635266 5912613.0777 -8.07949580458 
+4536 757443.654373 5912492.28912 -4.92986756439 
+4537 757398.201384 5912457.68789 -7.53234397764 
+4538 757397.253745 5912394.35441 -7.72941643181 
+4539 757371.65268 5912405.40805 -7.89372982934 
+4540 757491.190697 5912621.03719 -2.40143307488 
+4541 757516.563185 5912668.5572 -2.13000500861 
+4542 757475.94305 5912651.92944 -4.49920890199 
+4543 757448.307732 5912701.28909 -6.86615674703 
+4544 757470.942924 5912758.68079 -2.89049164893 
+4545 757483.471306 5912787.85838 -2.5513158074 
+4546 757441.069438 5912755.21645 -4.32385246451 
+4547 757416.07526 5912776.19594 -5.22962261999 
+4548 757463.140658 5912813.71069 -4.59884317868 
+4549 757476.40364 5912841.28701 -5.37231180815 
+4550 757506.903018 5912845.90889 -2.87729203114 
+4551 757526.357445 5912821.45808 -1.01622592788 
+4552 757517.886891 5912790.3959 -0.88690260841 
+4553 757435.265359 5912807.08134 -5.19167830978 
+4554 757454.059744 5912865.40454 -7.84717106057 
+4555 757466.037388 5912896.39524 -7.95868420078 
+4556 757444.591801 5912921.54816 -8.06143836842 
+4557 757457.475608 5912951.09376 -7.97930832258 
+4558 757411.956397 5912909.08309 -8.20534864002 
+4559 757393.820139 5912958.23148 -7.97051194891 
+4560 757599.901399 5912475.0532 -0.494734373379 
+4561 757622.970654 5912510.31727 -0.428017322556 
+4562 757568.256037 5912774.99892 -0.403931014583 
+4563 757450.267256 5912571.68602 -4.63475228915 
+4564 757133.427616 5912574.10241 -5.23281086411 
+4565 757159.74228 5912595.11273 -5.45790644128 
+4566 757131.141622 5912543.63219 -5.09749801317 
+4567 757373.946074 5912871.20368 -8.14633319543 
+4568 757422.89246 5912861.95809 -8.0097457226 
+4569 757368.323271 5912844.71403 -7.9073421272 
+4570 757387.87469 5912825.67517 -7.10232976037 
+4571 757381.482719 5912800.17477 -6.44352292802 
+4572 757414.53488 5912833.11573 -7.03011727158 
+4573 757199.019729 5912646.95502 -6.98914266008 
+4574 757216.091847 5912621.49077 -6.94355255634 
+4575 757212.882328 5912594.09265 -6.73663058672 
+4576 757385.349425 5912748.25609 -7.06158768952 
+4577 757397.091474 5912717.18382 -7.77595056627 
+4578 757335.940727 5912718.21752 -8.14591293579 
+4579 757306.575739 5912704.18961 -8.05769249182 
+4580 757284.623876 5912722.2584 -7.93348365829 
+4581 757214.633121 5912686.81718 -7.36906032735 
+4582 757359.56561 5912701.9768 -8.26602613839 
+4583 757212.237287 5911747.50329 -3.96469436713 
+4584 757212.2 5910845.0 -0.190761369148 
+4585 757218.816398 5910811.96757 -0.203211096341 
+4586 757209.971688 5910771.2773 -0.223675745432 
+4587 760458.014003 5913131.46945 -0.831728210868 
+4588 759941.6 5912976.0 -0.54274943715 
+4589 757309.9 5911058.5 -0.131133862847 
+4590 759498.698645 5913429.12049 -0.343821940143 
+4591 759499.691098 5913488.54749 -0.0214137708515 
+4592 759523.420416 5913439.23215 -0.414779126601 
+4593 759527.69891 5913465.72688 -0.316144958963 
+4594 759576.061404 5913447.83014 -0.718459934799 
+4595 759621.048732 5913403.79073 -2.94283271623 
+4596 757575.717264 5911324.36462 -0.0968168089851 
+4597 757550.65 5911398.0 -0.0884014475896 
+4598 757544.443141 5911357.16004 -0.0942617566843 
+4599 757635.021486 5911348.35689 -0.0761069085023 
+4600 757602.201574 5911356.80502 -0.0839479312375 
+4601 757631.629739 5911315.99397 -0.0764297318856 
+4602 757606.255205 5911304.74061 -0.0976743813513 
+4603 757649.521429 5911270.80739 -0.131581906563 
+4604 757682.48335 5911251.86875 -0.124867328716 
+4605 757702.003861 5911282.02352 -0.0986277935404 
+4606 757606.364213 5911278.30781 -0.116652666858 
+4607 757720.600457 5911229.41975 -0.120043094586 
+4608 757302.7 5911612.5 -0.133098570195 
+4609 757127.562364 5911640.76451 -1.36612397128 
+4610 757158.586596 5911631.79078 -1.59465344504 
+4611 757111.498979 5911681.97851 -1.99141406041 
+4612 756514.016468 5912973.63614 -3.09544819114 
+4613 756538.797538 5912949.75904 -3.86090939491 
+4614 756527.029189 5912924.12778 -3.08881786658 
+4615 756552.892894 5913010.65218 -3.30528339125 
+4616 756521.653325 5913003.30847 -3.11704715388 
+4617 756541.206234 5913097.471 -2.66108668752 
+4618 756660.951832 5913074.43126 -4.58530453742 
+4619 756691.566651 5913084.65968 -4.96013211596 
+4620 756716.916176 5913071.38898 -4.94006522637 
+4621 757754.950739 5911440.90098 -0.0782843405097 
+4622 757759.341614 5911410.71275 -0.0703408835194 
+4623 757783.122656 5911457.40207 -0.0755081413418 
+4624 760095.965516 5913433.94685 -3.24297711881 
+4625 760071.052319 5913456.38868 -3.18205779405 
+4626 760043.98115 5913456.8294 -2.26806067236 
+4627 760048.561736 5913393.0707 -0.639681797866 
+4628 760030.449627 5913367.5792 -0.418217947141 
+4629 760037.537908 5913418.68109 -0.839744043856 
+4630 760089.925972 5913392.98409 -1.27614787496 
+4631 760089.935941 5913341.27074 -0.823256517001 
+4632 760097.961874 5913367.12896 -1.01091916052 
+4633 760116.10303 5913320.84187 -0.987666068578 
+4634 760162.799937 5913275.12639 -1.92251994473 
+4635 760178.84072 5913252.09408 -2.23561021349 
+4636 760137.084248 5913212.02691 -1.19764000604 
+4637 760124.934142 5913444.59266 -1.73264986738 
+4638 760052.151687 5913326.92636 -0.757883924911 
+4639 759987.86625 5913326.60743 -0.47692025442 
+4640 760010.912256 5913307.53667 -0.551501661337 
+4641 760007.498018 5913276.77722 -0.610646897179 
+4642 760113.73881 5913252.14013 -0.940920488378 
+4643 760133.931361 5913272.89218 -1.11125390165 
+4644 760103.751828 5913282.05795 -0.828925231458 
+4645 760065.445083 5913286.47743 -0.789029394934 
+4646 760039.471574 5913255.66914 -0.697403484485 
+4647 760020.317811 5913218.55987 -0.73400584332 
+4648 760076.135507 5913228.75408 -0.886425303873 
+4649 759670.325 5912390.75 -2.48703447326 
+4650 759676.039172 5912351.1402 -2.50203073908 
+4651 759704.102586 5912314.44937 -2.5220076487 
+4652 759773.573394 5913179.23041 -0.476157091479 
+4653 759775.310321 5913229.28292 -0.471357777217 
+4654 759751.769035 5913206.35201 -0.578590047445 
+4655 759771.146673 5913266.33466 -0.409242599697 
+4656 759804.69653 5913288.04633 -0.384401784702 
+4657 759794.999466 5913319.70966 -0.404500796101 
+4658 759722.315442 5913231.022 -0.501085006226 
+4659 759692.652681 5913187.29397 -0.547332835258 
+4660 759684.834528 5913214.81307 -0.526431788054 
+4661 759849.244663 5913172.23188 -0.509519368078 
+4662 759865.021992 5913115.91189 -0.694891026742 
+4663 759888.94664 5913130.24004 -0.645359247996 
+4664 759878.163578 5913162.26595 -0.519599416258 
+4665 759908.099175 5913191.96181 -0.48710809873 
+4666 759809.962258 5913216.89591 -0.456307722901 
+4667 759828.761485 5913251.09438 -0.458520051062 
+4668 759860.305509 5913250.86428 -0.483175193011 
+4669 759873.036148 5913277.84418 -0.545011516503 
+4670 759867.230735 5913217.83541 -0.453766448325 
+4671 759934.059568 5913148.35059 -0.626126102138 
+4672 759700.757165 5913267.24872 -0.427971812849 
+4673 759799.653274 5913420.65229 -0.652826315809 
+4674 759791.945202 5913386.9013 -0.479657878588 
+4675 759815.171599 5913361.70381 -0.431245953836 
+4676 759844.172927 5913353.83593 -0.395846912808 
+4677 756548.471489 5911946.03195 -0.0456395154942 
+4678 757586.649481 5911033.99742 -0.631746193413 
+4679 757551.551541 5911059.65605 -0.432802905309 
+4680 757577.193667 5911128.34265 -0.435348830683 
+4681 757524.198355 5911114.69564 -0.3160728515 
+4682 757522.00135 5911147.92122 -0.24125691681 
+4683 757556.38453 5911155.55186 -0.30169968604 
+4684 757515.013303 5911185.67269 -0.155492438047 
+4685 757476.08707 5911144.53432 -0.124715323222 
+4686 757610.615739 5911154.28462 -0.445909351484 
+4687 757655.482376 5911150.62669 -0.208746948604 
+4688 757594.659687 5911230.70266 -0.180639289483 
+4689 757623.806739 5911232.25225 -0.194480670047 
+4690 757569.365336 5910732.43716 -0.43184100858 
+4691 757481.662084 5910665.62391 -0.818613137325 
+4692 757621.207981 5910678.54652 -0.763225333207 
+4693 758150.966656 5912644.73296 -0.454834302227 
+4694 758183.59358 5912654.6804 -0.393809122179 
+4695 758179.871074 5912572.23116 -0.565232575981 
+4696 758198.758053 5912625.99288 -0.436670876212 
+4697 758234.683837 5912669.66741 -0.309085687831 
+4698 758275.364749 5912539.78645 -0.612201005527 
+4699 758280.311257 5912487.37739 -0.772309203826 
+4700 758250.07523 5912491.72338 -0.711410765436 
+4701 758210.678855 5912558.28386 -0.586764276673 
+4702 758207.63369 5912524.82652 -0.643844543808 
+4703 758313.852499 5912608.28875 -0.377457142348 
+4704 758288.244275 5912456.49615 -1.25508361233 
+4705 758305.962003 5912398.67891 -0.833379640431 
+4706 758275.750198 5912402.4893 -1.04521584969 
+4707 758361.28228 5912557.94078 -0.495810003917 
+4708 758398.050903 5912528.15807 -0.58977517918 
+4709 758426.25 5912578.5 -0.482222304625 
+4710 758359.506492 5912633.70112 -0.328103603179 
+4711 758277.178116 5912687.72593 -0.210319099437 
+4712 758227.025525 5912404.7276 -0.858249387375 
+4713 757844.231424 5910778.08871 -0.209877047594 
+4714 756694.695231 5913117.51362 -5.09137703461 
+4715 756725.775453 5913130.21568 -5.10329531049 
+4716 758328.3237 5912101.06456 -0.269453904229 
+4717 758326.5 5912041.5 -0.199704124138 
+4718 757011.483403 5913512.38981 -4.78140559374 
+4719 756994.899845 5913541.4631 -4.27963456428 
+4720 760443.587207 5912885.80935 -2.53984009422 
+4721 756598.278273 5913563.63651 -0.259543256544 
+4722 757791.876414 5911374.77948 -0.0919430738331 
+4723 757305.992609 5911802.555 -3.6068853293 
+4724 757237.468572 5911898.1311 -4.14376102719 
+4725 757248.495929 5911928.54738 -5.16787335392 
+4726 757088.48226 5911900.05246 -4.63528589691 
+4727 757018.101642 5911912.82967 -5.8917475339 
+4728 756981.552668 5911903.3004 -5.58097626243 
+4729 757692.453834 5911606.88593 -0.0681265125829 
+4730 757741.652555 5911589.26291 -0.0844770573936 
+4731 757715.188995 5911574.88803 -0.0789753654827 
+4732 757685.21254 5911681.85742 -0.151995494074 
+4733 757710.135292 5911649.07784 -0.102338102382 
+4734 757766.030994 5911848.16887 -0.159554940914 
+4735 757796.109603 5911840.72981 -0.138131531464 
+4736 757734.25231 5911888.37043 -0.199473071125 
+4737 757762.286469 5911877.55557 -0.18647725822 
+4738 757847.635264 5911823.27763 -0.0717312109445 
+4739 757833.783664 5911901.57089 -0.197461805924 
+4740 757811.887762 5911880.80869 -0.173889375043 
+4741 757858.948603 5911892.35501 -0.209363364135 
+4742 757864.57427 5911865.49319 -0.134590980059 
+4743 757735.990037 5911916.84679 -0.247247467362 
+4744 757733.79055 5911968.4639 -0.357499285642 
+4745 757775.890097 5912002.23306 -0.34202332863 
+4746 757809.730096 5912019.63625 -0.332394121068 
+4747 757813.863078 5912050.87205 -0.330895762057 
+4748 757843.083068 5912072.2323 -0.33974354086 
+4749 757728.709485 5911997.82245 -0.337612123519 
+4750 757748.383999 5912041.91529 -0.241733263007 
+4751 757714.595089 5912058.02511 -0.302015625507 
+4752 757718.585694 5912091.78614 -0.324696839362 
+4753 757754.822164 5912111.3544 -0.338709040572 
+4754 757687.494687 5912040.37539 -0.302417034925 
+4755 757655.710715 5912053.32446 -0.290840191502 
+4756 757696.908332 5912007.26317 -0.295706531012 
+4757 757773.242743 5912060.09061 -0.280447912029 
+4758 757804.121486 5912112.4448 -0.355244628179 
+4759 757824.763439 5912135.71325 -0.337747122621 
+4760 757746.184695 5912148.56589 -0.312145728286 
+4761 757769.853668 5912170.42127 -0.342036110518 
+4762 757561.056945 5912012.57546 -0.241130029203 
+4763 757567.538437 5911973.59314 -0.231959496526 
+4764 757547.05709 5911945.6371 -0.232093610018 
+4765 757555.97575 5911913.41928 -0.211231454453 
+4766 757528.05674 5911915.87187 -0.221776118514 
+4767 757502.42615 5911896.22436 -0.24375053752 
+4768 757526.013028 5911964.66997 -0.259000974702 
+4769 757782.345958 5911914.98932 -0.248717192045 
+4770 757776.398757 5911968.44527 -0.362665389884 
+4771 757821.518341 5911974.97168 -0.293944012342 
+4772 757865.294366 5912012.68874 -0.316941440332 
+4773 757873.570418 5912044.67154 -0.31784197304 
+4774 758104.43304 5912537.25175 -0.534172718628 
+4775 758106.001676 5912483.39187 -0.790399204134 
+4776 758073.517053 5912495.10263 -0.697385931531 
+4777 758111.773169 5912453.5745 -1.45348208332 
+4778 758084.472117 5912432.46634 -1.06035556161 
+4779 758059.410032 5912464.3852 -1.11316793814 
+4780 758028.714865 5912461.04148 -1.14638525961 
+4781 757984.576053 5912482.78483 -0.892688558925 
+4782 758171.807661 5912409.82229 -0.829233225985 
+4783 758142.723984 5912411.107 -0.707992182951 
+4784 758157.293926 5912465.98856 -1.06434455191 
+4785 758215.580859 5912358.75343 -0.643187008222 
+4786 758203.512692 5912385.1321 -0.754098402303 
+4787 758164.760563 5912360.55551 -0.535080526627 
+4788 758204.354286 5912481.20443 -0.867847592922 
+4789 758185.28199 5912456.68922 -1.20654210067 
+4790 758239.253569 5912444.08522 -1.30332972453 
+4791 758025.763855 5912506.47485 -0.946619340528 
+4792 758009.586816 5912535.80965 -0.63791409414 
+4793 758002.243809 5912589.46826 -0.462781172753 
+4794 757969.554441 5912577.97246 -0.441699435282 
+4795 757962.423532 5912627.14075 -0.405535636353 
+4796 757936.675733 5912648.06498 -0.391704611256 
+4797 757991.307251 5912665.84076 -0.432804267149 
+4798 757573.051713 5910494.41304 -0.723799579707 
+4799 757598.751785 5910534.57674 -0.701550097543 
+4800 757621.523857 5910514.10903 -1.04318755491 
+4801 757661.081608 5910525.34134 -0.948026239518 
+4802 757173.1099 5912296.75852 -5.5188731878 
+4803 757154.518217 5912268.09133 -6.24333852606 
+4804 757123.422831 5912268.43449 -6.49242131708 
+4805 757103.591278 5912294.27546 -6.50496324417 
+4806 757117.867816 5912320.30664 -6.20842869888 
+4807 757169.371359 5912240.78579 -6.55864918891 
+4808 760457.358004 5913090.82011 -0.956401101428 
+4809 759936.413452 5913355.20903 -0.4892671305 
+4810 759901.895702 5913360.5747 -0.341940661842 
+4811 758318.934084 5912447.61963 -1.49292079027 
+4812 758408.480115 5912480.33322 -0.720725303619 
+4813 758376.384872 5912438.33518 -1.98899288257 
+4814 758353.640379 5912417.99035 -1.47264153653 
+4815 758405.296191 5912424.58923 -1.74396442061 
+4816 758362.645443 5912390.96485 -0.905817088936 
+4817 758378.705213 5912336.27682 -0.623574745983 
+4818 758397.106908 5912304.91938 -0.614678192567 
+4819 758381.157103 5912274.48745 -0.571345565454 
+4820 758428.985435 5912302.55487 -0.63261204934 
+4821 758300.433335 5912349.28067 -0.646753517016 
+4822 757274.014574 5911988.70889 -6.68185101074 
+4823 757941.337911 5912505.01234 -1.17165970842 
+4824 757594.571946 5910443.57089 -1.14081361162 
+4825 759917.482751 5913308.88934 -0.521852886963 
+4826 759942.961979 5913326.80159 -0.5148067349 
+4827 759960.989126 5913283.55811 -0.575203337746 
+4828 759858.428317 5913394.94938 -0.460572487212 
+4829 757948.95 5911499.0 -0.0651981702027 
+4830 757611.547023 5911708.12107 -0.158360323774 
+4831 759434.2 5912816.0 -0.348515137962 
+4832 759397.972597 5912798.73676 -1.04300587003 
+4833 759345.15 5912813.5 -1.05660374306 
+4834 759374.031719 5912822.65741 -1.19427843608 
+4835 757922.45 5912816.5 -0.169369826001 
+4836 756485.458938 5911813.45783 -0.0541685739087 
+4837 756606.645922 5911789.85468 -0.142502088754 
+4838 760558.25 5912686.0 -0.282595618451 
+4839 759570.109526 5913201.7596 -0.551066230757 
+4840 759560.460863 5913250.87229 -0.661966416187 
+4841 759520.284734 5913033.35548 -0.716557874435 
+4842 759512.071628 5913087.56924 -0.78604147007 
+4843 759542.769146 5913062.1123 -0.724628622411 
+4844 759551.851812 5913117.80194 -0.671155603943 
+4845 759563.885713 5913092.91449 -0.712711809208 
+4846 759589.1692 5913092.3531 -0.668310285572 
+4847 760758.792333 5912342.63913 -8.57699256435 
+4848 760727.534735 5912358.82331 -8.99538279086 
+4849 760671.423045 5912372.77741 -9.20721425959 
+4850 760673.39684 5912334.828 -10.4252371541 
+4851 760706.996898 5912329.96203 -10.538303456 
+4852 756853.81535 5911971.37049 -1.94745663564 
+4853 756872.701891 5911996.25951 -3.32614674576 
+4854 756845.282176 5912063.30201 -2.35946685041 
+4855 756909.326089 5912124.82542 -5.07302667057 
+4856 756723.452975 5912050.21547 -2.16892482507 
+4857 756696.172415 5912038.80756 -1.18143883558 
+4858 756512.386721 5913051.6825 -2.49059339444 
+4859 756469.366787 5913015.68167 -1.4295286682 
+4860 756483.552982 5913069.41388 -1.71104481379 
+4861 756457.207792 5913054.38877 -1.22581086929 
+4862 759920.718402 5913102.77749 -0.704414565771 
+4863 759898.805675 5913071.65912 -0.742590208409 
+4864 759741.570094 5913299.27653 -0.399674858321 
+4865 759759.160136 5913330.94251 -0.417126386316 
+4866 759686.80079 5913373.26804 -0.598128348944 
+4867 757802.76664 5912166.87537 -0.342436830364 
+4868 757826.798673 5912202.27462 -0.35194821164 
+4869 757859.642913 5912190.023 -0.316163128463 
+4870 757725.067705 5912332.98518 -0.339496101357 
+4871 757844.349163 5911940.61439 -0.280618790059 
+4872 758039.173542 5912308.47825 -0.467024358064 
+4873 758034.359694 5912274.05503 -0.450730886366 
+4874 760498.842019 5912715.16498 -2.75718786559 
+4875 760537.004751 5912723.03672 -1.98488656551 
+4876 760478.560189 5912746.96958 -1.70481051496 
+4877 756440.403921 5913105.95078 -0.806297385521 
+4878 756428.751482 5913077.3826 -0.825589360962 
+4879 756459.896301 5913158.00875 -0.856895365617 
+4880 756470.645479 5913188.4979 -0.89278020316 
+4881 756470.52111 5913109.15383 -1.16891346411 
+4882 756513.690655 5913144.93241 -1.60046792759 
+4883 756516.150588 5913177.01198 -1.43474880152 
+4884 756514.427829 5913209.65872 -1.20817564303 
+4885 756478.210226 5913138.30286 -1.14931644216 
+4886 757927.671844 5912532.54421 -0.831606990918 
+4887 756965.434847 5913685.20515 -1.77441581344 
+4888 756932.6 5913698.0 -0.844262956692 
+4889 756919.685858 5913661.90127 -1.82594377314 
+4890 758593.1 5912084.5 -0.251233910994 
+4891 760384.4 5913439.0 0.0203239097222 
+4892 759523.33405 5913385.09198 -0.784515458544 
+4893 759469.587101 5913393.42943 -0.397253412627 
+4894 756393.6 5913458.5 -0.251713730182 
+4895 756509.360047 5913347.49019 -0.717352052176 
+4896 756538.728475 5913335.87165 -0.881074630865 
+4897 756556.143837 5913363.33004 -0.859162681457 
+4898 756600.391169 5913440.15326 -0.782307790273 
+4899 756651.656021 5913455.55741 -0.883548171568 
+4900 756533.625921 5913432.00292 -0.550590785618 
+4901 756548.219164 5913407.19318 -0.685037634748 
+4902 756662.799113 5913345.60958 -2.472342105 
+4903 756655.250629 5913417.89516 -1.49088624534 
+4904 756699.975526 5913225.1001 -4.5708375532 
+4905 756628.951665 5913186.75778 -3.57547167646 
+4906 756686.936184 5913172.70671 -4.73285746355 
+4907 756727.911827 5913259.80876 -4.1849122507 
+4908 756754.625734 5913172.46131 -5.27495948311 
+4909 756551.172746 5913212.20072 -1.59645896146 
+4910 756779.196806 5913083.70012 -5.60600084846 
+4911 756748.795354 5913090.95423 -5.3884775142 
+4912 756796.857945 5913119.97157 -5.81204062904 
+4913 756846.104522 5913133.34525 -5.67005186112 
+4914 756827.748854 5913092.81068 -5.90467719218 
+4915 756771.961701 5913039.58246 -5.07177266564 
+4916 756817.814062 5913056.22808 -5.59404358741 
+4917 756821.208122 5913025.33748 -5.17220263229 
+4918 756596.885893 5913165.60553 -3.20937196222 
+4919 756748.800993 5913242.52302 -4.280352648 
+4920 756742.603626 5913210.54734 -4.93507430008 
+4921 756946.971393 5913161.04892 -5.71341005013 
+4922 756976.558362 5913166.44192 -5.57449206078 
+4923 756864.505471 5913030.02648 -5.49840618484 
+4924 756744.917551 5912953.02493 -4.25209270504 
+4925 756781.934647 5912864.71681 -4.95979092586 
+4926 756753.623705 5912841.50767 -4.77733823049 
+4927 756864.171678 5912896.56335 -5.36910039233 
+4928 756922.500541 5912998.1491 -4.91763245194 
+4929 756894.825908 5913021.24845 -5.44040295314 
+4930 756951.140098 5913020.31165 -5.28637365001 
+4931 757040.592372 5913033.531 -5.82013429718 
+4932 756954.735191 5912903.87512 -5.60026584311 
+4933 756954.501311 5912832.79086 -4.67358887319 
+4934 756677.889079 5912866.21727 -3.72014649729 
+4935 756709.349139 5912870.95612 -4.28267511441 
+4936 756662.736627 5912886.57655 -4.0994600388 
+4937 756626.912658 5912882.60401 -3.77513464156 
+4938 756633.267445 5912926.84734 -4.3900270395 
+4939 756590.898137 5912945.45727 -4.23217194573 
+4940 756589.265003 5912788.63304 -1.16201874891 
+4941 756629.060021 5912774.21096 -1.86713764322 
+4942 756644.729319 5912799.61094 -2.07965548775 
+4943 756995.915813 5913039.62789 -5.99228399097 
+4944 757028.194639 5913084.66794 -6.26686827253 
+4945 756981.990491 5913060.69283 -6.07911360429 
+4946 756996.843492 5913091.59567 -6.0251083255 
+4947 756694.956343 5912954.48262 -4.07196906883 
+4948 756679.870752 5913023.22312 -3.64514013392 
+4949 756701.285781 5912982.92559 -3.71166957259 
+4950 756729.184567 5912990.33145 -4.054930143 
+4951 756902.93076 5912860.4835 -4.7777564304 
+4952 756672.331986 5912798.37762 -2.65176075812 
+4953 756965.057323 5912807.8649 -4.24780114561 
+4954 756950.970468 5912782.20301 -3.96920713356 
+4955 756970.568202 5912755.12759 -4.06810712928 
+4956 757002.421493 5912774.70904 -4.43726237237 
+4957 756994.231672 5912801.88499 -4.43734313833 
+4958 757044.156996 5912802.54106 -4.50113010549 
+4959 757017.748729 5912829.97322 -5.21659462059 
+4960 757075.465573 5912849.54919 -6.01561220776 
+4961 757091.665598 5912874.64612 -6.45001962012 
+4962 757093.58213 5912933.67289 -6.36293969294 
+4963 757069.350314 5912981.99468 -4.97613895924 
+4964 756994.702002 5912855.04353 -5.54848532857 
+4965 757088.223959 5912789.15651 -5.37505830931 
+4966 757138.095731 5912772.1629 -6.63790157235 
+4967 757168.841332 5912776.00866 -6.57248376518 
+4968 757127.445219 5912745.37292 -6.77070292637 
+4969 757187.15167 5912749.44121 -7.06264296575 
+4970 757174.729064 5912719.54631 -7.08773266801 
+4971 756700.023492 5912912.94241 -4.45524803498 
+4972 756816.340745 5912693.33004 -3.86671398678 
+4973 756830.812188 5912721.59263 -3.99649058648 
+4974 757185.478494 5912925.47718 -6.72333769165 
+4975 757250.284142 5912902.56099 -7.36073022929 
+4976 757197.535121 5912895.43331 -6.34003977661 
+4977 760389.349222 5912891.73147 -2.39298914117 
+4978 760385.462266 5912936.69943 -1.34852821389 
+4979 757783.693865 5910575.3872 -1.39275523986 
+4980 757743.721123 5910591.95828 -1.56159522262 
+4981 757285.891039 5910691.17147 -0.274998152439 
+4982 757314.553111 5910644.3745 -0.326504670321 
+4983 757344.27538 5910629.84626 -0.332888817406 
+4984 757353.22113 5910679.07247 -0.625862638147 
+4985 756590.665623 5912146.24998 -3.04463308829 
+4986 756559.119637 5912151.23587 -2.6650037778 
+4987 756549.437763 5912177.50775 -2.66784877833 
+4988 756580.567467 5912197.82055 -2.93139476084 
+4989 756652.658259 5912050.37837 -0.632048142636 
+4990 756628.248125 5912010.22974 -0.215521187572 
+4991 758056.420228 5912610.49737 -0.489210808248 
+4992 760504.774734 5912875.6786 -3.25006629893 
+4993 756946.470611 5911978.94354 -5.24608229045 
+4994 759849.946182 5913308.1688 -0.462860491476 
+4995 759672.823871 5913039.86617 -0.669479203194 
+4996 756749.553021 5911950.04557 -0.230789331034 
+4997 759983.707478 5913072.92404 -0.769176534042 
+4998 756797.183098 5913314.95439 -4.58182981909 
+4999 756884.906773 5913268.78443 -4.66770339127 
+5000 756847.038047 5913331.36997 -4.85766217041 
+5001 756928.771751 5913374.07526 -5.42203690993 
+5002 756878.011864 5913367.72207 -4.77797970117 
+5003 756899.941788 5913385.68041 -5.15168549749 
+5004 756896.627349 5913413.34147 -5.2228750396 
+5005 756904.200242 5913474.79821 -5.18023593977 
+5006 756865.468149 5913451.63693 -4.46370856246 
+5007 756939.659768 5913417.32832 -5.71992871823 
+5008 756965.338056 5913433.06824 -5.80149401954 
+5009 756800.147205 5913170.90884 -5.53533621415 
+5010 756853.779115 5913383.68391 -4.67107737168 
+5011 756891.218575 5913182.1991 -5.71384416374 
+5012 760036.623397 5913073.76029 -0.888320418827 
+5013 760072.184184 5913112.47242 -0.948335342789 
+5014 760067.515207 5913083.02333 -0.927221154253 
+5015 757671.158849 5910975.41145 -0.357401626245 
+5016 759489.465196 5913194.96741 -1.56605101443 
+5017 759432.932546 5913148.04368 -2.79117830515 
+5018 756685.151186 5913759.66736 -0.127458058959 
+5019 756650.0 5913772.5 -0.100944134155 
+5020 757423.451022 5911102.89149 -0.117752908438 
+5021 757342.278544 5911061.92674 -0.129989790322 
+5022 757371.319133 5911030.14718 -0.132547950019 
+5023 757406.910829 5911026.18627 -0.147285062203 
+5024 757447.936903 5911044.7598 -0.185406826215 
+5025 759021.501427 5912496.96226 -1.23901475255 
+5026 760495.702093 5913343.76442 -0.459107734996 
+5027 760513.210499 5913322.09012 -0.421562642655 
+5028 760895.757004 5912192.60223 -6.42363060098 
+5029 760959.926832 5912162.24406 -4.47287770643 
+5030 760995.55 5912224.0 -3.70887718341 
+5031 758851.935086 5912565.8409 -1.56629715099 
+5032 758883.134358 5912560.88802 -1.21200762311 
+5033 758904.87613 5912581.03564 -1.88004666884 
+5034 760115.799385 5913494.57974 0.0426240573162 
+5035 760143.431019 5913483.2191 0.338412275881 
+5036 757559.12731 5910624.806 -1.15903277944 
+5037 758437.67078 5912331.24004 -0.615093628368 
+5038 758435.88057 5912384.97278 -0.671506393503 
+5039 757836.383259 5912273.0366 -0.380390865371 
+5040 757856.844657 5912247.81775 -0.372415683517 
+5041 758246.366988 5912266.66088 -0.541054574557 
+5042 758276.865362 5912260.72581 -0.560266528193 
+5043 758285.976023 5912232.25631 -0.539357655849 
+5044 758240.350488 5912164.98749 -0.401082039102 
+5045 758241.118593 5912220.34917 -0.489677906379 
+5046 758543.695338 5912314.5666 -0.591130580182 
+5047 758585.585486 5912351.67096 -0.649697033939 
+5048 758653.622362 5912393.05264 -0.725607806415 
+5049 758622.096384 5912436.72598 -0.668203256116 
+5050 758653.150781 5912502.68829 -0.956932400152 
+5051 758619.556431 5912523.84216 -2.17775072645 
+5052 758505.219057 5912423.32856 -1.00436368066 
+5053 758532.289161 5912470.75823 -2.01282216449 
+5054 760299.842368 5913432.63281 0.0983408571688 
+5055 760307.899042 5913377.85289 -0.00447290239874 
+5056 760286.367192 5913307.6828 -0.0447311246975 
+5057 760312.603356 5913284.81264 -0.0204626011158 
+5058 760261.026875 5913349.63685 -0.132654184656 
+5059 756877.53887 5913075.76223 -6.00756327264 
+5060 759321.65 5912646.0 -0.454667816468 
+5061 759311.633398 5912682.32288 -0.708092025886 
+5062 759279.57334 5912725.67896 -1.07837461744 
+5063 759227.457399 5912853.6838 -3.00621158761 
+5064 757665.358581 5913309.64955 -0.499692986127 
+5065 757632.121424 5913272.02887 -2.79555821812 
+5066 757576.280682 5913274.09283 -4.64763131837 
+5067 760115.509943 5912701.80613 -0.546453283268 
+5068 760099.597304 5912676.74022 -1.19778601901 
+5069 760059.175 5912695.75 0.0916218858886 
+5070 760081.081296 5912622.00267 -1.74339143554 
+5071 760051.372705 5912565.77444 -1.92529584565 
+5072 760045.106907 5912536.23119 -2.34855146508 
+5073 760026.828414 5912579.68536 -1.54594563598 
+5074 760092.156734 5912582.43637 -2.18236795969 
+5075 760111.481793 5912536.64932 -2.8159099295 
+5076 760089.437658 5912517.86925 -2.94732162752 
+5077 760136.974206 5912593.73823 -1.9219389888 
+5078 759953.325 5912633.75 -0.17523761084 
+5079 760014.10432 5912520.1581 -2.26076518782 
+5080 760043.62778 5912478.40927 -3.16402086558 
+5081 759984.283274 5912471.7731 -2.69514206688 
+5082 760035.477047 5912450.09132 -3.49865201417 
+5083 760058.643373 5912426.402 -4.61818162059 
+5084 760045.074287 5912393.45168 -4.97266755781 
+5085 760020.71883 5912374.95271 -4.97369988629 
+5086 760067.731735 5912376.25508 -5.77239563282 
+5087 760000.828027 5912413.77546 -3.52444720413 
+5088 759969.396892 5912408.10405 -3.39252984244 
+5089 759947.346664 5912389.54908 -3.5879676385 
+5090 759975.293528 5912359.99492 -4.75847948509 
+5091 759950.654562 5912284.56739 -5.28324285456 
+5092 759892.178341 5912291.65468 -4.31908385346 
+5093 759809.404101 5912339.43157 -2.69831813245 
+5094 759831.172702 5912299.04853 -2.97357737729 
+5095 759869.860278 5912324.36205 -3.49298571535 
+5096 759836.509982 5912370.65894 -2.66534254668 
+5097 759881.448643 5912401.81514 -2.35404031615 
+5098 759873.572981 5912364.26302 -3.00254111242 
+5099 759916.067954 5912357.92655 -3.75162090664 
+5100 759927.845482 5912329.21932 -4.53720594151 
+5101 759911.118382 5912409.70598 -2.60787135346 
+5102 759955.125263 5912441.75296 -2.59398907415 
+5103 759953.554986 5912498.80995 -2.10739364408 
+5104 759955.226001 5912527.60694 -1.7425808547 
+5105 759919.039093 5912444.45076 -2.31539893452 
+5106 759922.873134 5912489.75386 -2.01947994723 
+5107 759871.949877 5912457.12238 -2.07944476769 
+5108 759900.258423 5912510.00157 -1.73994752643 
+5109 759855.425 5912565.25 -1.28021911018 
+5110 760067.607005 5912270.39281 -7.12830188314 
+5111 759947.900258 5912595.58221 -0.677560031585 
+5112 759902.475 5912599.75 0.0612050485015 
+5113 759901.933172 5912555.79281 -1.04805183607 
+5114 759995.708079 5912569.25743 -1.43308474496 
+5115 759961.680034 5912571.75643 -1.13944404561 
+5116 757127.286006 5913490.20507 -2.89735177321 
+5117 757486.141169 5911928.43968 -0.304078866054 
+5118 757388.186345 5911945.00188 -1.33582312191 
+5119 757334.705508 5911921.80768 -4.05186012204 
+5120 757407.759262 5910554.38647 -0.332868660402 
+5121 756532.891843 5912659.40683 -0.46521903099 
+5122 757575.332786 5912428.24123 -0.448361634866 
+5123 757582.119225 5912400.19021 -0.317392711862 
+5124 757562.68421 5912379.95665 -0.316289256213 
+5125 757171.469798 5911781.20572 -2.86094773483 
+5126 760103.353818 5913117.26707 -1.07098785542 
+5127 758081.429009 5912267.51249 -0.459502546154 
+5128 758043.57566 5912229.801 -0.443073994712 
+5129 758007.222586 5912170.90742 -0.383554208092 
+5130 757974.176771 5912189.48558 -0.352059650477 
+5131 758000.081151 5912228.87943 -0.419868763217 
+5132 757998.653938 5912266.57129 -0.476795911525 
+5133 757969.760702 5912269.8845 -0.480419027608 
+5134 757954.40642 5912229.16837 -0.415027358366 
+5135 757907.079944 5912150.84265 -0.372274064238 
+5136 757867.56296 5912144.0086 -0.323714973467 
+5137 757870.445824 5912112.70953 -0.340292892115 
+5138 757925.253906 5912108.18317 -0.342679176296 
+5139 757952.666496 5912147.63369 -0.347616652349 
+5140 757904.802515 5912064.01011 -0.310976942284 
+5141 757974.895836 5912110.20666 -0.363389342285 
+5142 757950.938373 5912094.72817 -0.348822081545 
+5143 757999.919479 5912094.97923 -0.383154948408 
+5144 758126.330833 5912347.42337 -0.508502847216 
+5145 758102.069068 5912398.46913 -0.641643415736 
+5146 758452.227719 5912428.63781 -1.60227808883 
+5147 758440.165552 5912485.33472 -0.746855555526 
+5148 759873.833302 5913434.04781 -0.580460816473 
+5149 757857.395935 5912757.29519 -0.304705415154 
+5150 757790.485696 5912722.62239 -0.327351669386 
+5151 760801.189631 5912208.2908 -12.696209768 
+5152 760796.237923 5912239.22921 -12.0812367877 
+5153 760761.143549 5912200.86819 -13.9084030472 
+5154 760689.396139 5912278.27279 -12.0734570485 
+5155 756596.412686 5912842.82397 -2.50871029586 
+5156 756721.43009 5912183.53651 -4.82781459923 
+5157 759434.305905 5913114.05358 -1.54228827504 
+5158 758353.846682 5912284.66136 -0.567152656373 
+5159 758331.135522 5912320.9115 -0.578711030499 
+5160 758296.52316 5912291.17699 -0.583367360564 
+5161 758486.94726 5912299.94042 -0.651125942442 
+5162 757409.431801 5912049.54472 -3.49978520393 
+5163 757623.323113 5912398.982 -0.306478716626 
+5164 757636.015057 5912348.05606 -0.274732749343 
+5165 757667.650111 5912311.27384 -0.303549570786 
+5166 757679.279203 5912282.64044 -0.306373705905 
+5167 757708.770049 5912278.01136 -0.314338060721 
+5168 759405.242096 5912966.4815 -1.35248554357 
+5169 757699.247845 5912425.3032 -0.37641012558 
+5170 757703.498407 5912454.25079 -0.586568722066 
+5171 757655.117902 5912465.19864 -0.590717609081 
+5172 757755.37947 5912835.74788 -0.231003518812 
+5173 757684.877981 5912942.88333 -0.101868521391 
+5174 757237.649285 5911691.89927 -2.38776754909 
+5175 757202.336709 5911700.54788 -3.60416011949 
+5176 756325.7 5913056.5 -0.25607752975 
+5177 756356.063771 5913029.94057 -0.344299859834 
+5178 756382.331969 5913044.17778 -0.467076920325 
+5179 756350.083974 5913083.36277 -0.29511261847 
+5180 756383.606174 5913078.22261 -0.462897968646 
+5181 756366.715236 5913686.75912 -0.688612115875 
+5182 758038.694111 5910669.31647 -0.177201560811 
+5183 758836.166939 5912618.72776 -0.222336758632 
+5184 758781.173677 5912635.28128 -0.0966931854042 
+5185 758802.756759 5912655.53693 -0.0734548525836 
+5186 758723.95046 5912634.51918 -0.20371850186 
+5187 758697.163075 5912613.57897 -0.386036741641 
+5188 758672.076215 5912624.35891 -0.413183383742 
+5189 758756.707652 5912650.57732 -0.0591182013437 
+5190 758756.79687 5912686.64484 -0.0479818860568 
+5191 757521.191624 5913230.07231 -6.23772432268 
+5192 757554.152838 5913229.50878 -5.88639914259 
+5193 757478.954402 5911097.6141 -0.178876201304 
+5194 757572.490276 5910957.56088 -0.644298247598 
+5195 757563.239739 5910991.67558 -0.994887820578 
+5196 757732.610659 5911768.51574 -0.0851651693415 
+5197 757900.370499 5912354.3599 -0.434966475753 
+5198 757843.764242 5912373.51018 -0.382751022049 
+5199 757868.702284 5912398.02847 -0.369806576405 
+5200 757855.634865 5912304.58607 -0.41128532707 
+5201 757874.734242 5912345.38934 -0.502077618941 
+5202 757062.287493 5912274.70129 -6.61019573118 
+5203 757067.793784 5912245.35723 -6.73571502469 
+5204 757107.21118 5912233.61834 -6.79596551862 
+5205 759667.384146 5913307.98002 -0.362766022649 
+5206 759638.268919 5913365.0483 -1.00103031143 
+5207 759598.917901 5913339.79865 -1.49917362551 
+5208 759592.254497 5913256.25171 -0.569035577027 
+5209 759674.735984 5913255.83004 -0.455928599871 
+5210 757719.090136 5911198.82811 -0.117450976011 
+5211 756952.801508 5912042.03881 -5.06018560326 
+5212 758759.667338 5912336.26954 -0.568296908913 
+5213 760442.012379 5913248.0946 -0.43312281902 
+5214 760395.272145 5913250.27172 -0.137606442265 
+5215 758106.036931 5912064.63639 -0.398226109644 
+5216 758028.655808 5912124.01816 -0.393168399122 
+5217 760337.424573 5912719.70846 -1.62220046258 
+5218 756691.417758 5913724.92199 -0.152233387864 
+5219 757213.940306 5913339.89073 -6.25234994736 
+5220 757306.166596 5913300.85963 -6.27734174172 
+5221 757290.337521 5913274.91754 -6.7240978985 
+5222 757306.787583 5913252.96802 -6.9905564772 
+5223 757292.60787 5913218.66362 -7.19262401844 
+5224 757383.803188 5913304.30408 -4.47170389718 
+5225 757332.098002 5913296.45958 -6.05721285662 
+5226 759283.8 5912598.0 -0.0270871510747 
+5227 759276.130984 5912633.6029 -0.684301904236 
+5228 759227.618284 5912634.63609 -1.81002729723 
+5229 757776.655716 5910481.11784 -0.449967274841 
+5230 757273.660246 5910732.522 -0.247746128617 
+5231 757540.416218 5913064.51352 -7.33528911964 
+5232 757478.981952 5913096.40971 -7.72098253827 
+5233 757519.680221 5913111.90414 -7.37658516839 
+5234 757466.807415 5913041.2529 -7.78040340208 
+5235 757462.951528 5913006.67713 -7.83353260007 
+5236 757549.600137 5913148.73365 -6.62940363542 
+5237 757548.835628 5913179.54355 -6.36520311149 
+5238 757434.551936 5910910.82301 -0.262345266505 
+5239 756717.045325 5912580.35481 -2.43583656664 
+5240 756764.137257 5912626.595 -3.56525955304 
+5241 757795.45714 5912523.58823 -0.503684835084 
+5242 757764.021911 5912663.75929 -0.319666852261 
+5243 757703.380425 5912637.82542 -0.544535671686 
+5244 757891.38499 5912443.06375 -0.516517333182 
+5245 757820.947964 5912391.1553 -0.415681202832 
+5246 757772.075482 5912397.0182 -0.454789040228 
+5247 757671.033077 5911226.39223 -0.161805137101 
+5248 757632.707155 5911199.28384 -0.261526623882 
+5249 757075.674731 5912061.87718 -6.78015936852 
+5250 759958.472707 5913198.79019 -0.660379624078 
+5251 759754.414958 5913560.57766 -0.625346430797 
+5252 759182.311682 5912666.294 -0.938959850407 
+5253 760052.777572 5912662.88662 -0.64610182244 
+5254 760007.975 5912667.25 0.146424081469 
+5255 760007.359752 5912635.28217 -0.548821871868 
+5256 757619.441006 5912287.47206 -0.262126351268 
+5257 757568.938983 5912312.53517 -0.333188547339 
+5258 759842.976863 5913489.08284 -2.16971242256 
+5259 757643.273378 5912222.31792 -0.311319577244 
+5260 757647.310427 5912159.56862 -0.305467844965 
+5261 757594.811283 5912125.98876 -0.397379188091 
+5262 757800.933603 5912224.51188 -0.342277621982 
+5263 757712.014449 5911934.12411 -0.26579772442 
+5264 757525.890625 5912074.53889 -0.409786415836 
+5265 757545.613819 5912145.05054 -0.366418946669 
+5266 757451.318228 5912161.03336 -4.97434073776 
+5267 757423.072816 5912154.71567 -6.69123343153 
+5268 757545.464296 5912275.15455 -0.405368651415 
+5269 757492.286415 5912272.57628 -2.78950873696 
+5270 757410.237217 5912258.14844 -8.04244255224 
+5271 757369.498213 5912283.17084 -7.92493677967 
+5272 757380.775917 5912256.26363 -8.02777107692 
+5273 757340.341297 5912288.40678 -7.66609741833 
+5274 757321.248904 5912264.78251 -7.49141779119 
+5275 757496.137319 5912331.36129 -1.99234812225 
+5276 757254.876556 5912294.25904 -6.46035736869 
+5277 757356.465336 5912341.43972 -7.92857645212 
+5278 757338.661068 5912371.10666 -7.66381146467 
+5279 757558.307178 5912181.06535 -0.36811418187 
+5280 757568.493679 5911871.60718 -0.173959657349 
+5281 757453.362912 5912198.54951 -6.18847559479 
+5282 757460.23941 5912226.44181 -6.03874327893 
+5283 757621.158714 5911877.7206 -0.185887174686 
+5284 757644.157385 5911851.48753 -0.147428619569 
+5285 757336.147547 5912242.13138 -7.67292051708 
+5286 757583.486189 5911807.93239 -0.155438743013 
+5287 757444.720999 5912315.38138 -7.68231615342 
+5288 760389.789589 5913176.79947 -0.22639537424 
+5289 760358.009449 5913176.89341 -0.150613479416 
+5290 760340.850119 5913231.96777 -0.0754071888008 
+5291 760320.975662 5913182.14033 -0.100769533797 
+5292 760306.109316 5913132.42531 -0.240656274544 
+5293 760351.430643 5913143.00925 -0.228530130537 
+5294 760364.080126 5913090.5021 -0.56064821695 
+5295 760333.21226 5913095.64784 -0.387902615443 
+5296 760323.062374 5913049.42529 -0.771312921678 
+5297 760434.762768 5913163.31011 -0.578189927154 
+5298 760250.466733 5913145.30997 -0.523946450612 
+5299 760271.448383 5913173.75243 -0.245715190519 
+5300 760215.233402 5913182.2478 -2.00817123706 
+5301 760221.818412 5913153.421 -1.54993702409 
+5302 760185.31836 5913089.68125 -2.25211192581 
+5303 760210.349422 5913109.01307 -1.93507057384 
+5304 760251.781693 5913002.88604 -0.667405108578 
+5305 760310.0896 5913001.20361 -0.741776618273 
+5306 760340.373408 5912993.40088 -0.781059509328 
+5307 760183.052056 5913186.02869 -2.22388766967 
+5308 760255.615555 5913293.85597 -0.278279749021 
+5309 760313.23778 5913214.95491 -0.108531909101 
+5310 760153.02335 5913342.96287 -2.52232700284 
+5311 760263.328887 5913452.06344 0.177882659864 
+5312 760171.904122 5913432.58244 -0.119492323526 
+5313 757406.078403 5913219.08765 -7.00133525185 
+5314 757380.492526 5913077.61532 -7.82507756672 
+5315 757307.073655 5913050.06813 -7.8989774072 
+5316 757308.94002 5913019.53644 -7.8608222051 
+5317 757383.887757 5913011.11348 -7.84276703935 
+5318 757359.32078 5913027.51025 -7.87756046175 
+5319 757423.259788 5913194.83956 -7.24142491637 
+5320 757412.422127 5913257.99955 -6.05154371036 
+5321 757268.470867 5913052.02976 -7.8714001998 
+5322 757271.319053 5913100.92723 -7.71916723241 
+5323 757254.312023 5913078.38749 -7.76034102293 
+5324 757232.022025 5913131.55577 -7.61079093048 
+5325 757218.268462 5913106.85077 -7.68634840995 
+5326 757215.468354 5913059.77055 -7.57952046536 
+5327 757278.143736 5912959.29219 -7.91269602839 
+5328 757288.665753 5912933.1749 -8.01831916332 
+5329 757594.66677 5913094.34158 -5.05109577087 
+5330 760383.358975 5913288.82027 -0.0749677783915 
+5331 756797.103654 5911838.06246 -0.595411465682 
+5332 756800.747681 5911886.53438 -0.457776582032 
+5333 756882.740781 5911799.78802 -3.60418322325 
+5334 756919.324386 5911830.19894 -4.37681718592 
+5335 758650.35 5912734.5 -0.0439774713593 
+5336 758707.992937 5912674.49044 -0.196470893447 
+5337 758655.823885 5912566.00708 -1.21001289909 
+5338 756511.807101 5912315.84231 -0.274303189188 
+5339 757889.75 5910408.5 -0.371948211641 
+5340 757837.384798 5910459.97859 -0.379296564604 
+5341 756661.555431 5911750.86906 -0.180956329994 
+5342 756694.638922 5911721.49033 -0.344035181153 
+5343 756698.482751 5913644.72832 -0.317437041746 
+5344 760643.862611 5912521.94614 -3.66404724674 
+5345 760687.908567 5912504.03923 -4.12931526409 
+5346 756543.540354 5912342.28889 -0.317289136874 
+5347 760452.740794 5912689.88238 -1.17567924273 
+5348 760315.012016 5913339.15841 0.000727991796354 
+5349 756986.944876 5913204.69319 -6.37160811804 
+5350 756966.971586 5913256.08431 -6.02227585864 
+5351 757006.520008 5913224.9661 -6.25167279162 
+5352 757010.898649 5913268.89202 -6.38737415448 
+5353 757033.334952 5913220.04147 -6.45494096834 
+5354 757046.337102 5913183.27997 -6.61915730213 
+5355 757164.875604 5913301.5435 -6.7284805395 
+5356 757063.818113 5913333.99222 -6.45862376335 
+5357 757095.46256 5912748.85592 -6.12575744886 
+5358 757500.709131 5911024.01093 -0.447990320711 
+5359 757515.561294 5910960.76729 -0.527057103838 
+5360 758995.442941 5912493.29454 -0.933655131548 
+5361 758912.626011 5912526.44757 -0.633871722395 
+5362 758464.032211 5912470.88052 -1.35786983508 
+5363 760000.984598 5912303.95234 -5.94849866135 
+5364 760049.921805 5912298.47826 -6.62079148432 
+5365 760052.430842 5912331.28196 -6.22189881 
+5366 756876.99361 5912324.32483 -5.98987966619 
+5367 756987.254457 5913482.81506 -5.28313911653 
+5368 757462.729565 5910825.6432 -0.629721746434 
+5369 757589.84674 5913182.55834 -5.21021687885 
+5370 757599.771669 5913215.03934 -4.84872892634 
+5371 757278.060965 5912499.557 -7.07769971728 
+5372 757130.946062 5912500.07292 -4.84476914188 
+5373 757086.064252 5912477.87367 -4.58248556226 
+5374 757088.590548 5912529.15395 -4.73755633806 
+5375 757044.272583 5912505.0353 -4.54793147737 
+5376 757028.537121 5912535.54268 -4.62585054559 
+5377 756997.713877 5912532.11539 -4.45712205346 
+5378 757028.248651 5912482.06563 -4.58722786464 
+5379 756996.022146 5912484.41079 -4.41772473188 
+5380 757033.189262 5912586.04017 -5.12265431278 
+5381 757057.765452 5912601.69764 -5.34725012986 
+5382 757092.103047 5912585.59999 -5.14758405221 
+5383 757106.432822 5912630.99838 -5.66226907401 
+5384 757013.081472 5912432.87824 -5.16316277571 
+5385 757070.578085 5912432.52308 -4.87938832135 
+5386 757098.5952 5912420.72577 -5.09998251519 
+5387 757046.851881 5912450.56865 -4.74892600783 
+5388 757017.846299 5912402.4292 -5.75274234488 
+5389 756954.791515 5912473.55343 -4.10588150769 
+5390 756969.244021 5912425.82728 -5.06492804446 
+5391 756938.545503 5912442.34456 -4.11759651307 
+5392 756919.774917 5912420.254 -4.41064118024 
+5393 756926.36475 5912389.37572 -5.44544682712 
+5394 756898.946451 5912513.21359 -2.86842231712 
+5395 756956.108117 5912518.29288 -4.06899992313 
+5396 756904.039044 5912468.19848 -2.78012604701 
+5397 757168.334857 5912449.9953 -5.11513265998 
+5398 757127.884379 5912454.37654 -4.75312423084 
+5399 757094.400345 5912374.47361 -5.87685279828 
+5400 757131.738048 5912371.20742 -5.69319514734 
+5401 757139.904642 5912404.56806 -5.24710826273 
+5402 756837.098806 5912537.2361 -2.51982336037 
+5403 757028.249846 5912349.1255 -6.31835401343 
+5404 757084.130413 5912335.94398 -6.35151759158 
+5405 757052.734947 5912376.45393 -5.97605824154 
+5406 757410.065721 5912200.89139 -7.69138749357 
+5407 757401.744773 5912104.33033 -6.27148211256 
+5408 757280.022511 5912141.24231 -7.59846453929 
+5409 757298.063317 5912118.80938 -7.57123389908 
+5410 757290.202116 5912166.66054 -7.19020462593 
+5411 756742.247688 5912259.18097 -5.18647306162 
+5412 756774.195182 5912252.50575 -5.48929311207 
+5413 756848.072252 5912363.06725 -5.6730483651 
+5414 756837.635263 5912421.35658 -3.87877362722 
+5415 757208.4359 5912418.49259 -5.45489849955 
+5416 757280.005428 5912472.92298 -7.00063296515 
+5417 757242.419593 5912129.19093 -7.51406421521 
+5418 757072.396196 5912148.85708 -6.895695627 
+5419 757026.677017 5912064.97504 -6.43033752156 
+5420 757249.297977 5912251.12967 -6.68916483002 
+5421 760215.628681 5912991.10177 -1.70449869773 
+5422 760086.101613 5912932.78906 -0.972198158753 
+5423 760093.135666 5913032.62798 -1.04794786981 
+5424 760035.66744 5912959.37249 -0.845247297951 
+5425 757453.298987 5910383.26156 -0.225571961157 
+5426 757497.499117 5910363.40295 -0.207841610219 
+5427 757516.5 5910267.5 -0.223128553208 
+5428 757492.764565 5910401.43257 -0.221900299419 
+5429 757460.010459 5910538.00836 -0.739832390798 
+5430 757854.720079 5910546.48553 -0.761985278164 
+5431 758807.597134 5912413.83561 -0.622430111904 
+5432 758835.321574 5912407.60381 -0.657913861599 
+5433 758845.655494 5912379.8264 -0.65362047916 
+5434 757281.396638 5911687.90873 -0.864679153179 
+5435 757176.172226 5911962.849 -5.65595861634 
+5436 756686.237472 5912551.84896 -1.55189327885 
+5437 756684.886732 5912516.07087 -1.1260730205 
+5438 757153.170809 5912679.46569 -6.64292287938 
+5439 757155.371727 5912633.01039 -5.97652293032 
+5440 757938.697275 5912274.58325 -0.473696088872 
+5441 757887.451589 5912298.1249 -0.419717460052 
+5442 758320.180337 5912195.12445 -0.492522423009 
+5443 758328.044082 5912243.06172 -0.533244091744 
+5444 758348.831551 5912195.60695 -0.488557690544 
+5445 758361.278848 5912230.21646 -0.543104259651 
+5446 758393.004252 5912211.61142 -0.501108370245 
+5447 757308.446419 5913139.38603 -7.56127701473 
+5448 757323.439477 5912210.59145 -7.47535827584 
+5449 757078.771765 5912718.29155 -5.92805743593 
+5450 757007.639224 5912668.64418 -4.77066305965 
+5451 757023.123291 5912640.70511 -5.15991702053 
+5452 760916.907631 5912274.24846 -3.81750696844 
+5453 760887.283558 5912246.3972 -4.102698031 
+5454 760444.524917 5912720.04736 -0.744586478513 
+5455 760423.967 5912677.73063 -1.23374869991 
+5456 760389.953868 5912696.07786 -1.02482717962 
+5457 760386.916583 5912642.05359 -1.66270393102 
+5458 760433.645777 5912627.0909 -2.36192062379 
+5459 760375.484367 5912618.56161 -1.59168441795 
+5460 760331.494799 5912677.65873 -1.52461312119 
+5461 760333.797586 5912548.04498 -1.74098055097 
+5462 760392.315464 5912519.79306 -1.95362464926 
+5463 760441.732122 5912489.99776 -2.95241187269 
+5464 760469.803181 5912536.1092 -2.65503332543 
+5465 760370.907717 5912483.87248 -2.14483464043 
+5466 760416.068088 5912475.90643 -3.42451522552 
+5467 760349.983212 5912435.41577 -4.8446244399 
+5468 760246.808703 5912462.8571 -5.16209647348 
+5469 760222.48639 5912510.93303 -4.11166036749 
+5470 760184.651667 5912476.55953 -5.20729816483 
+5471 760186.338977 5912523.85239 -4.22695453704 
+5472 760151.769795 5912499.54426 -4.73859050125 
+5473 760295.625677 5912521.88415 -2.59653518105 
+5474 760297.368291 5912568.51212 -1.71752299179 
+5475 760258.633928 5912415.38108 -6.04866694686 
+5476 760215.097414 5912394.7222 -6.4981517978 
+5477 760109.670838 5912404.28038 -6.144012173 
+5478 760150.214786 5912334.31035 -7.21235848103 
+5479 760148.232065 5912445.60875 -5.66080918636 
+5480 760412.808708 5912303.40303 -9.43276690558 
+5481 760352.48531 5912406.25403 -5.99634477542 
+5482 760479.574816 5912320.05007 -9.80631763867 
+5483 760486.042253 5912475.08658 -4.34270289997 
+5484 760463.384908 5912459.50751 -4.72142471718 
+5485 760497.077856 5912417.87691 -6.89081836174 
+5486 760540.308971 5912417.452 -7.31231449396 
+5487 760541.906174 5912500.29859 -4.3119534256 
+5488 760088.569062 5912461.31382 -4.60634043604 
+5489 760092.537904 5912293.98599 -7.10987960066 
+5490 760126.083226 5912263.30552 -7.58345536736 
+5491 760521.342347 5912335.83119 -9.7931530514 
+5492 760529.638032 5912306.29986 -10.4431814804 
+5493 760571.077349 5912327.66105 -10.3274894338 
+5494 760649.30671 5912277.2392 -11.8807614926 
+5495 760194.750012 5912609.22638 -1.6294502512 
+5496 760272.096385 5912607.47516 -1.4109121427 
+5497 760299.764261 5912670.0015 -1.36759645031 
+5498 760250.063419 5912760.29411 -0.650202802861 
+5499 760249.30925 5912731.14895 -1.9655904149 
+5500 760495.877013 5912386.61216 -7.97768930723 
+5501 760283.452409 5912771.90266 -0.304392932767 
+5502 760326.578877 5912778.43208 -0.635719048134 
+5503 758124.957592 5912519.88796 -0.556549304072 
+5504 758178.36608 5912514.36173 -0.644401401554 
+5505 758158.674317 5912536.70901 -0.563131958706 
+5506 759924.433128 5913279.13605 -0.605472653786 
+5507 759896.821974 5913263.04313 -0.538516316606 
+5508 757309.757677 5912031.17006 -6.35089346519 
+5509 757890.33843 5912201.45478 -0.349834279553 
+5510 757916.060976 5912186.94115 -0.359173268873 
+5511 758204.597842 5912300.5844 -0.522189613241 
+5512 760624.042187 5912202.95313 -12.5111634447 
+5513 760607.252479 5912259.12372 -11.8519923598 
+5514 760571.882018 5912277.96309 -11.3171744902 
+5515 760580.723407 5912223.29895 -12.055790132 
+5516 757175.320147 5912511.41484 -5.36699687778 
+5517 757270.742943 5912610.23727 -7.485600363 
+5518 757259.460762 5912639.47818 -7.52422679651 
+5519 757256.799001 5912670.64182 -7.621509818 
+5520 757057.696161 5912634.83532 -5.64887426122 
+5521 760654.342919 5912227.71331 -12.6177044198 
+5522 760466.275559 5912812.08989 -1.46923451137 
+5523 756400.889987 5912950.86521 -0.471274694195 
+5524 760330.218518 5912953.47803 -1.07077160454 
+5525 760377.419123 5912977.42892 -0.951135277174 
+5526 759740.012139 5912363.54142 -2.51326821773 
+5527 759727.001649 5912337.92616 -2.52927755569 
+5528 759767.637644 5912306.74895 -2.61952884888 
+5529 760590.7 5912586.5 -2.27310160977 
+5530 760557.968384 5912593.23778 -1.71928810672 
+5531 757875.09926 5912694.92374 -0.309040923409 
+5532 756421.580778 5913364.91074 -0.361504397907 
+5533 756994.479208 5913130.15154 -5.69065921633 
+5534 757023.529738 5913138.71147 -5.9148656114 
+5535 757111.212508 5913130.80257 -6.97109253728 
+5536 757148.06888 5913166.73165 -7.30339261269 
+5537 757141.045729 5913087.48586 -6.8583580634 
+5538 757178.86184 5913097.57622 -7.41736776107 
+5539 757174.58108 5913130.22522 -7.45926455327 
+5540 757139.940695 5913274.50964 -6.84119666372 
+5541 757087.24403 5913215.26435 -6.96259817493 
+5542 757118.135559 5912901.03814 -6.69632178717 
+5543 757134.796289 5912854.56677 -6.76770917328 
+5544 757159.111711 5912876.10743 -6.59404206601 
+5545 757248.473092 5912970.51038 -7.61329255944 
+5546 757261.231093 5913010.60801 -7.71344518058 
+5547 757160.283374 5912823.90108 -6.44734247812 
+5548 757209.511825 5912803.41539 -6.01269833426 
+5549 757206.536344 5912837.98725 -5.40305884487 
+5550 760169.269222 5913158.77987 -2.04086351008 
+5551 758275.157085 5912181.23694 -0.472177825741 
+5552 759815.237891 5913556.00594 -0.728314267492 
+5553 757235.026924 5911966.54068 -6.09890262254 
+5554 760423.530959 5913064.53752 -1.03705309831 
+5555 756508.620371 5913683.49281 -0.838560025847 
+5556 756406.115873 5913029.91988 -0.637818284812 
+5557 756442.240721 5912957.68118 -0.905289446209 
+5558 759865.280487 5913529.74007 -2.55232639369 
+5559 759887.487668 5913580.19613 -0.473765184998 
+5560 756761.608605 5911876.89129 -0.311102060622 
+5561 757163.761451 5913040.80109 -6.05659970832 
+5562 757137.119445 5913050.72201 -5.99582002855 
+5563 758516.799254 5912200.66404 -0.411628488663 
+5564 758448.605058 5912216.47425 -0.510687476543 
+5565 758532.771575 5912157.14673 -0.279313861049 
+5566 760420.559718 5912766.57688 -0.716862951525 
+5567 760399.145777 5912724.58921 -0.800014152996 
+5568 760379.35 5912796.0 -0.428215832375 
+5569 760446.537374 5912280.54082 -10.2068654363 
+5570 757326.131968 5913380.98889 -1.27306738269 
+5571 758790.234672 5912692.33345 -0.0892353836059 
+5572 757456.347732 5910752.50678 -0.480154283721 
+5573 756648.392014 5912978.20701 -3.726664066 
+5574 756023.028798 5914137.9133 -0.335729052095 
+5575 756590.038755 5913683.72612 -0.759233728182 
+5576 758991.7 5912306.0 -0.45485578826 
+5577 759028.225866 5912393.69465 -0.628810890359 
+5578 759201.477673 5912828.33958 -2.92098436295 
+5579 759051.889436 5912796.21301 -0.478377576927 
+5580 758843.386094 5912744.89587 -0.228709170155 
+5581 757557.400826 5913344.81886 -1.1074862203 
+5582 756849.095157 5913579.68543 -2.55970904897 
+5583 756889.462495 5913552.8727 -3.92270674619 
+5584 760437.24934 5912971.1669 -1.61039344738 
+5585 757507.337965 5911742.61574 -0.291475114686 
+5586 757465.55 5911306.5 -0.105267582422 
+5587 757852.763661 5910416.44442 -0.363940990922 
+5588 757774.397858 5910420.8129 -0.317335403026 
+5589 757747.093875 5910368.18512 -0.30027441706 
+5590 758801.501239 5912323.68998 -0.562410067194 
+5591 758876.088137 5912375.97487 -0.662010215493 
+5592 756735.909494 5913510.68574 -1.52374286755 
+5593 756791.83771 5913434.38321 -3.57782136981 
+5594 757407.994236 5911197.86099 -0.108713674499 
+5595 757948.874054 5912679.03176 -0.393795010358 
+5596 757928.150806 5912713.968 -0.32478593542 
+5597 757807.817852 5910860.40962 -0.479827713057 
+5598 757828.348276 5910828.06249 -0.366443470369 
+5599 757862.682797 5910863.05675 -0.304537642878 
+5600 759112.956 5912799.59207 -4.74078527968 
+5601 757625.974806 5911796.07553 -0.146327853679 
+5602 759943.367068 5913400.44925 -0.594731673631 
+5603 756497.502379 5913529.48046 -0.256390000724 
+5604 756490.710464 5913302.21133 -0.710551845937 
+5605 756470.943932 5913350.68695 -0.548269909104 
+5606 756447.687024 5913314.05756 -0.494147713073 
+5607 757830.628002 5911652.14977 -0.0664228282864 
+5608 757611.277741 5910866.44608 -0.55469431419 
+5609 757256.057133 5910844.44547 -0.178398372965 
+5610 759001.261528 5912640.59148 -1.4603638485 
+5611 758944.65245 5912577.64552 -1.66704061824 
+5612 758893.356076 5912274.28235 -0.459298147226 
+5613 758764.050333 5912468.64655 -0.611485483789 
+5614 758762.115829 5912436.63135 -0.638658279333 
+5615 756858.261025 5911938.61675 -1.6354406455 
+5616 759696.111179 5913456.20801 -3.02594128241 
+5617 760522.286067 5912764.90836 -2.12265785081 
+5618 758977.943269 5912460.64298 -0.984727200374 
+5619 758868.520539 5912477.32251 -0.697162921608 
+5620 756548.646437 5912827.55155 -1.06720314979 
+5621 756824.841248 5912480.18915 -2.16360494347 
+5622 756872.720384 5912710.25488 -4.0300488691 
+5623 756996.47877 5912719.40826 -4.37795495208 
+5624 756766.279554 5912722.66252 -3.59322194801 
+5625 756779.039659 5912748.67605 -3.66002612673 
+5626 757562.453389 5912867.85262 -0.871000586327 
+5627 757505.389081 5912926.05311 -7.99029243819 
+5628 757590.504151 5912906.29424 -0.514155026257 
+5629 757563.89969 5912952.08625 -4.79787110446 
+5630 759088.087522 5912629.17144 -1.05260643613 
+5631 757392.699117 5910824.12237 -0.297093014065 
+5632 757353.131476 5910896.04733 -0.115466570676 
+5633 757404.521793 5910911.07977 -0.182874549906 
+5634 760389.245867 5913387.13359 -0.110026187214 
+5635 760490.42491 5913286.03562 -0.580410925596 
+5636 759640.61089 5913215.34578 -0.536501723674 
+5637 759608.334156 5913216.36209 -0.514263932331 
+5638 757389.168508 5910877.37967 -0.170282629629 
+5639 758430.388741 5912075.65391 -0.208804367276 
+5640 758379.761106 5912128.45 -0.31482919496 
+5641 756769.567195 5913533.77167 -2.35449586705 
+5642 756820.77756 5913447.35179 -3.78830251685 
+5643 759616.095321 5913065.46818 -0.650754022687 
+5644 760808.606922 5912331.69931 -6.54164810688 
+5645 760787.170098 5912293.08976 -10.0953355254 
+5646 757315.881253 5912646.43331 -7.92687396171 
+5647 756602.901354 5912244.30006 -1.06726965031 
+5648 756660.985906 5912299.43346 -0.946826841733 
+5649 756610.314381 5912183.50747 -3.53896784357 
+5650 756922.706105 5912209.32574 -6.10049981925 
+5651 756869.449136 5912388.53947 -5.21973906283 
+5652 756987.609026 5912316.34311 -6.39027678232 
+5653 757514.778046 5911331.33268 -0.100564258459 
+5654 757966.499939 5912017.88572 -0.284937027218 
+5655 757963.752883 5912059.07761 -0.392414171324 
+5656 757662.93979 5911353.42447 -0.0652093621164 
+5657 757504.946897 5910569.67575 -1.54997208944 
+5658 757507.318568 5912445.62577 -0.666222190215 
+5659 757303.130793 5912574.33961 -7.7341404309 
+5660 757322.315007 5912422.95501 -7.49218076999 
+5661 757606.242464 5912446.24029 -0.4525400903 
+5662 757611.348628 5912533.97642 -0.438202267175 
+5663 757232.880236 5912710.69901 -7.53720552468 
+5664 756536.544669 5913071.04795 -2.55896867327 
+5665 756521.908233 5913115.74989 -1.97607493973 
+5666 756662.51825 5913046.96305 -4.20114085631 
+5667 760118.503108 5913386.33118 -2.4308619497 
+5668 759745.049915 5913264.85566 -0.447766474949 
+5669 759909.422169 5913219.24272 -0.380140565014 
+5670 759777.366569 5913435.01594 -0.850594745687 
+5671 759822.49546 5913434.3049 -0.649508910254 
+5672 759765.207202 5913382.99018 -0.527353583662 
+5673 759796.023965 5913345.05951 -0.414156485736 
+5674 757603.411563 5911181.88542 -0.330405420432 
+5675 758257.246572 5912382.22251 -0.788944419147 
+5676 757821.739865 5912088.20532 -0.332310843939 
+5677 757750.962889 5912014.3287 -0.292019965563 
+5678 757779.753228 5912099.17667 -0.359636064135 
+5679 757759.673164 5912195.18146 -0.329849918588 
+5680 757538.8574 5912030.54676 -0.268215696631 
+5681 758067.007922 5912523.82145 -0.52261186904 
+5682 757199.764108 5912289.72475 -5.86199430512 
+5683 757899.986015 5912803.62433 -0.258268283149 
+5684 760710.818143 5912384.28214 -8.34593209814 
+5685 757748.97749 5912347.5006 -0.366316611658 
+5686 757028.92611 5912854.49217 -5.77876994103 
+5687 757189.665822 5912697.06702 -7.21175245441 
+5688 757158.776067 5912933.41513 -6.62007926 
+5689 757237.050817 5912876.07982 -6.52157503469 
+5690 756734.942291 5911926.90494 -0.166607068229 
+5691 756932.452912 5913470.43679 -5.4591893618 
+5692 760989.585456 5912198.37386 -3.65801365536 
+5693 760170.838441 5913480.26111 0.294460904327 
+5694 758632.308534 5912549.15387 -1.62667346067 
+5695 758597.192555 5912511.03444 -2.18722047613 
+5696 760017.700853 5912344.54928 -5.63682422306 
+5697 759958.525883 5912333.16476 -5.03795170041 
+5698 759830.186695 5912324.57576 -2.86674990518 
+5699 757720.085133 5912251.97235 -0.307316896479 
+5700 758735.196757 5912704.3895 -0.115282530909 
+5701 760759.792036 5912401.11679 -5.9275198706 
+5702 760751.317897 5912432.53128 -5.06074126576 
+5703 760781.830899 5912422.48561 -3.92325019496 
+5704 757575.136118 5911896.37572 -0.191104973869 
+5705 760298.438526 5913025.65635 -0.681915108831 
+5706 760150.136622 5913415.06542 -1.22648223352 
+5707 756757.917222 5911708.94029 -0.374054700305 
+5708 758594.363314 5912641.27881 -0.376911371759 
+5709 757427.106789 5912112.94132 -5.63305923487 
+5710 760526.266023 5912520.88473 -3.38689089807 
+5711 760142.280962 5912286.75296 -7.66866715799 
+5712 758156.321914 5912562.19807 -0.581607772108 
+5713 759785.355734 5912327.13512 -2.6496491954 
+5714 757573.228564 5913322.94603 -2.65290884715 
+5715 758405.169449 5912120.97816 -0.259991191317 
+5716 756621.415189 5912263.41722 -0.855269388232 
+5717 759753.411296 5913444.26926 -1.14842271584 
+5718 758568.038899 5912648.29686 -0.244455508271 
+# attribute column titles ...Triangulation Vertex Titles...
+elevation
+10785 # <# of triangles>, next lines <triangle #> [<vertex #>] [<neigbouring triangle #>] [attribute of region] ...Triangulation Triangles...
+0 343 1298 345 1023 1 2116  
+1 343 345 344 -1 -1 0  
+2 2918 1121 2917 5311 5313 3902  
+3 692 2129 2205 3758 7676 538  
+4 2139 2138 341 3775 3777 3780  
+5 74 73 659 229 766 -1  
+6 1298 1299 346 963 1023 2112  
+7 2137 342 2138 3775 3778 2111  
+8 660 4278 1471 7970 2453 2451  
+9 4836 1300 2137 2111 9053 9051  
+10 5308 5056 2524 9489 9977 9976  
+11 1255 1253 3415 2017 2026 1418  
+12 353 3824 354 56 -1 7099  
+13 1837 3850 4590 7145 8574 875  
+14 1721 983 4497 8388 2948 1488  
+15 352 356 353 7099 -1 66  
+16 1836 4589 298 -1 8043 8570  
+17 903 340 339 -1 1329 9054  
+18 351 350 3825 7101 7102 -1  
+19 765 3867 3777 7177 4606 10506  
+20 350 349 697 456 7146 -1  
+21 3964 4103 713 1789 952 7365  
+22 4888 467 4889 9155 3936 -1  
+23 351 3826 352 66 -1 7103  
+24 903 904 4837 9055 9054 1330  
+25 2818 1850 603 3353 3198 9783  
+26 1436 1435 4262 7937 2381 2383  
+27 3355 1162 3354 6180 6182 6251  
+28 3120 767 3123 260 5717 5715  
+29 1557 1558 5639 10626 298 2623  
+30 879 880 1374 2258 1284 55  
+31 4207 4010 3365 10221 7829 7828  
+32 368 3145 769 108 95 1062  
+33 4881 4860 976 9096 9099 9142  
+34 4611 2782 739 2078 8610 1002  
+35 4011 4012 619 7459 10531 7454  
+36 2068 1963 1964 3429 509 3637  
+37 331 330 922 135 44 -1  
+38 337 1172 338 1865 -1 42  
+39 4275 4273 1468 10563 7964 7963  
+40 5341 903 1172 1329 10039 10038  
+41 3624 3630 1707 6723 6711 6710  
+42 337 336 1172 10039 38 -1  
+43 225 1586 4386 8174 -1 119  
+44 3706 331 922 37 6872 1058  
+45 3118 5707 334 10762 -1 6953  
+46 335 334 708 10762 10041 -1  
+47 2699 2701 2700 4887 1299 4882  
+48 3127 332 924 6873 1372 5732  
+49 1348 3646 1353 6753 2216 6754  
+50 1846 4603 4604 8596 8599 3197  
+51 4034 5342 708 10041 942 5781  
+52 347 719 348 7153 -1 2114  
+53 373 1716 1720 2939 2947 1084  
+54 838 671 1249 1199 115 579  
+55 879 604 880 8608 30 173  
+56 3824 355 354 -1 12 7100  
+57 3826 358 357 -1 7104 7103  
+58 905 4002 4035 1467 7502 7597  
+59 186 1057 187 733 -1 1637  
+60 2244 2240 4898 1025 9172 2163  
+61 1873 3073 5310 5625 3249 5623  
+62 3858 784 3883 7209 7208 7211  
+63 4716 1973 686 3736 8817 3449  
+64 1604 1491 2837 5152 2489 6603  
+65 1856 512 1857 2460 2080 5009  
+66 3826 356 352 15 23 7104  
+67 3629 3628 944 7412 6720 1411  
+68 3908 3605 814 1384 7256 7253  
+69 850 5065 2562 9502 4616 4618  
+70 4469 1692 4470 8335 1040 8333  
+71 378 3874 379 1151 -1 7190  
+72 3711 1858 4612 8613 8612 7403  
+73 1143 4111 308 -1 226 7649  
+74 379 3908 380 446 -1 7253  
+75 4004 191 190 -1 7440 647  
+76 780 1745 1746 2998 2946 817  
+77 1053 97 96 -1 1628 892  
+78 4154 295 4155 10567 7729 -1  
+79 2251 2252 1151 4640 4001 2167  
+80 741 362 361 -1 325 7159  
+81 644 2851 2850 1616 7569 5178  
+82 364 363 3883 7208 904 -1  
+83 3168 1608 579 5243 10049 485  
+84 1564 2370 741 4239 325 2637  
+85 242 3981 661 216 1554 215  
+86 3722 2371 3967 7370 7369 1320  
+87 359 3825 3851 7101 750 110  
+88 2534 2362 2361 3324 4220 4563  
+89 614 909 992 1063 5238 1342  
+90 697 1561 1915 2631 3336 456  
+91 4178 4179 1238 10568 7773 7772  
+92 2534 542 5616 10581 10580 4220  
+93 745 4733 2020 3550 3544 8850  
+94 3187 956 3186 5848 10432 7427  
+95 369 368 769 32 7377 -1  
+96 1431 1715 372 2937 1375 2373  
+97 4280 1472 4358 8122 8121 7981  
+98 855 324 323 -1 187 227  
+99 2565 387 2566 268 1291 4622  
+100 4114 574 3888 1095 7218 7768  
+101 371 370 907 104 675 -1  
+102 12 5116 13 400 -1 9596  
+103 4346 4846 2161 10634 8091 8098  
+104 3972 907 370 101 1337 7379  
+105 3527 4092 4093 7612 8647 7613  
+106 1504 366 365 -1 5002 2520  
+107 377 376 3868 7179 7182 -1  
+108 3145 5346 769 7380 32 10048  
+109 4067 1041 4144 7710 7709 7566  
+110 358 3825 359 87 -1 7102  
+111 4494 780 1718 2942 8381 817  
+112 326 325 879 7348 1284 -1  
+113 3094 1804 4559 3114 8513 5697  
+114 1314 3497 4214 6466 6423 2138  
+115 1249 672 838 1200 54 1130  
+116 2456 1359 289 117 2228 4409  
+117 289 1359 290 3807 -1 116  
+118 4099 1434 4981 2231 9337 7626  
+119 225 3164 1586 2680 43 218  
+120 2759 3569 1604 6603 5000 4999  
+121 596 3993 4056 1164 340 7417  
+122 292 4102 4100 7630 -1 7631  
+123 4465 1688 4462 2880 8326 8325  
+124 2035 2031 4738 8860 8868 8855  
+125 3607 927 287 894 1377 6678  
+126 4102 1132 4101 1786 7632 7631  
+127 5529 1513 5530 10412 10409 -1  
+128 291 1132 292 7631 -1 1785  
+129 4080 1189 583 4292 740 7589  
+130 3428 3519 5459 6508 6326 6329  
+131 4099 1132 4098 1785 7625 7627  
+132 53 1223 1225 1966 7289 724  
+133 4311 4312 1555 8130 8034 8033  
+134 4150 4151 1191 1886 7722 7721  
+135 330 1077 922 677 37 1367  
+136 1506 4309 296 -1 2521 8031  
+137 4238 3868 768 272 7889 7180  
+138 1678 1739 491 2022 2861 2863  
+139 90 89 3412 6297 1051 -1  
+140 3351 832 3350 6174 10211 6178  
+141 2226 2227 5565 10482 10481 3950  
+142 4890 2224 210 589 -1 9159  
+143 279 3923 280 6176 -1 7285  
+144 1356 1705 4484 882 8364 2222  
+145 5343 2438 729 431 10042 5790  
+146 4227 1355 277 727 2220 7869  
+147 2773 104 2772 835 5026 -1  
+148 746 360 359 -1 750 361  
+149 284 2758 285 5187 -1 4997  
+150 2441 4169 1227 7298 4380 4379  
+151 831 4484 3352 8363 1186 8364  
+152 1185 2878 2879 5237 7714 5235  
+153 5656 4467 576 2890 8329 10661  
+154 4389 4388 1589 7726 8178 1539  
+155 1921 4684 4682 3348 8753 8754  
+156 2758 4125 711 1846 4998 157  
+157 4125 2758 1109 7585 7674 156  
+158 5023 2453 2451 3446 4399 9421  
+159 272 3151 5339 10036 -1 7138  
+160 1562 2156 734 6672 2633 2632  
+161 4144 1188 1182 7717 523 7710  
+162 1925 1923 1008 3341 3351 8758  
+163 671 267 266 -1 339 579  
+164 273 3985 274 1410 -1 7404  
+165 239 238 3570 6605 6604 -1  
+166 2221 10 9 -1 368 311  
+167 4086 4085 700 3201 7600 1345  
+168 4462 4466 1687 8328 8319 2880  
+169 2686 1129 2921 4859 5321 1780  
+170 2358 4979 1250 9334 4214 2019  
+171 274 3989 275 2226 -1 7411  
+172 3898 3899 802 8311 7238 7237  
+173 3955 604 879 55 7348 7347  
+174 3859 101 100 -1 7161 872  
+175 910 995 4032 7494 3349 1343  
+176 4638 1112 4631 8651 8650 8678  
+177 911 3978 3976 10522 7385 7386  
+178 3974 303 302 -1 7382 1346  
+179 3858 363 362 -1 7159 7208  
+180 2448 1140 5020 9413 3345 4405  
+181 915 1173 764 500 1354 1353  
+182 925 837 3926 7292 7291 6215  
+183 5691 2425 3196 1304 10730 9386  
+184 317 1108 318 1373 -1 1737  
+185 4240 857 1377 1237 2265 1238  
+186 3121 3122 1154 10022 5720 5719  
+187 855 323 1853 1233 7336 98  
+188 1170 316 315 -1 668 1263  
+189 2039 4757 4750 3596 3578 8898  
+190 2458 2459 2457 2402 4410 4413  
+191 2285 1415 2284 2339 4067 2340  
+192 3880 538 649 3285 7202 401  
+193 2980 1061 5679 10706 5438 5436  
+194 33 32 4036 7503 7192 -1  
+195 2629 870 3954 1264 7346 4745  
+196 2838 2840 1051 4816 5155 1625  
+197 2763 2764 856 7337 1235 5008  
+198 3975 3976 910 7383 199 7385  
+199 3975 910 615 3349 7384 198  
+200 464 2435 465 4371 -1 4368  
+201 2607 4447 4451 8299 8298 4702  
+202 3408 4248 1399 6640 6290 6289  
+203 308 307 757 3192 226 -1  
+204 228 227 1105 5782 543 -1  
+205 4293 1488 669 2230 2485 8000  
+206 309 1099 310 1014 -1 315  
+207 4070 2753 1055 2956 7572 7571  
+208 238 237 2357 931 6605 -1  
+209 2614 2631 2613 4750 4713 4716  
+210 313 312 4335 8077 8076 -1  
+211 2865 2864 15 233 5206 1431  
+212 314 836 3526 6521 6520 9044  
+213 2216 914 3179 5834 5833 7399  
+214 313 744 2130 3761 1195 8076  
+215 242 241 3981 7396 85 -1  
+216 661 3981 2442 7397 2686 85  
+217 3337 5420 3012 5498 6149 6148  
+218 225 3165 3164 5806 119 5803  
+219 4037 1565 773 7196 7506 8267  
+220 1080 1896 4659 8707 4289 3297  
+221 3875 1000 773 7506 7193 7504  
+222 4061 4062 5601 10551 10550 585  
+223 744 4732 4059 8848 3761 8849  
+224 643 1584 1099 1014 533 2676  
+225 4778 2072 716 6987 8941 3641  
+226 757 1143 308 73 203 1039  
+227 855 3955 324 1281 98 7347  
+228 4449 4451 4450 8299 8284 8292  
+229 631 659 73 5 760 762  
+230 1988 1989 641 3482 3478 3477  
+231 19 3951 3950 7340 -1 1102  
+232 5631 4482 1704 2913 10610 8026  
+233 15 2864 868 1259 351 211  
+234 3928 549 3962 7360 918 555  
+235 3829 3827 449 -1 7105 243  
+236 408 407 2774 278 1784 -1  
+237 236 4054 237 931 -1 7539  
+238 411 410 3832 7113 7112 -1  
+239 411 450 3828 7107 -1 273  
+240 755 1470 4278 7970 7969 1035  
+241 410 409 408 -1 271 -1  
+242 2139 2140 728 980 3779 3777  
+243 3827 3829 412 7108 7106 235  
+244 3830 415 446 246 247 -1  
+245 2395 966 2394 1243 4287 4290  
+246 415 3831 446 7109 244 7111  
+247 3830 446 445 -1 7110 244  
+248 414 413 448 252 251 -1  
+249 567 3050 3051 5579 5563 1544  
+250 1587 1108 656 768 1738 1373  
+251 448 447 414 253 248 -1  
+252 3829 448 413 248 7108 7105  
+253 414 447 3831 7109 7111 251  
+254 152 4038 153 7509 -1 7507  
+255 3782 1533 606 798 2575 2569  
+256 1318 3519 3433 6329 6341 6656  
+257 645 1562 522 2634 628 2632  
+258 2569 5606 2568 10560 4629 10561  
+259 883 389 388 -1 4627 436  
+260 767 3126 3123 5723 28 5729  
+261 5368 4480 1703 2912 2909 5918  
+262 3917 263 3916 495 7272 490  
+263 2705 391 2704 4893 4892 4895  
+264 1852 792 170 808 3209 1108  
+265 570 1978 2242 3982 3985 824  
+266 2235 3649 5605 10558 9164 3968  
+267 2830 5050 2828 9472 5134 5139  
+268 2566 387 3544 -1 6556 99  
+269 180 631 5063 9498 9497 762  
+270 452 451 3832 7112 3242 -1  
+271 410 408 1868 1784 7113 241  
+272 768 3868 3872 7179 7891 137  
+273 450 411 451 7112 -1 239  
+274 2561 2562 5370 10097 10096 4616  
+275 2774 5181 1131 9725 3241 9726  
+276 2844 560 2847 5173 5172 4828  
+277 3411 123 122 -1 6295 1010  
+278 407 406 2774 9726 236 -1  
+279 453 406 405 -1 280 5027  
+280 405 3833 453 7115 279 7114  
+281 1876 3067 3068 5613 3260 3261  
+282 4006 582 4005 1487 7443 346  
+283 1010 4808 5554 6848 7520 9000  
+284 4877 3538 732 5023 9136 3913  
+285 3930 5583 4380 10515 8162 10516  
+286 382 381 942 1406 353 -1  
+287 535 2969 5258 9877 9876 5414  
+288 1937 1938 725 834 3379 3378  
+289 891 3933 3934 7305 7363 7306  
+290 687 3051 3693 5579 3173 5580  
+291 427 426 435 294 299 -1  
+292 437 426 425 -1 329 297  
+293 424 438 425 329 -1 296  
+294 435 426 436 297 -1 291  
+295 3130 59 58 -1 777 2013  
+296 438 424 423 -1 326 293  
+297 437 436 426 294 292 -1  
+298 1557 5639 213 10627 548 29  
+299 427 435 434 -1 310 291  
+300 3610 600 3703 10460 6684 7334  
+301 681 48 3956 568 8780 569  
+302 429 428 433 305 309 -1  
+303 430 429 432 309 307 -1  
+304 857 1431 1376 1340 1237 2372  
+305 434 433 428 302 310 -1  
+306 837 3371 3369 1197 1198 6215  
+307 432 431 430 -1 303 -1  
+308 909 3972 769 7377 1341 7379  
+309 433 432 429 303 302 -1  
+310 428 427 434 299 305 -1  
+311 2221 2222 10 3943 166 3941  
+312 4339 3953 86 826 7343 8083  
+313 2903 2904 1273 7911 5285 5284  
+314 418 3834 419 333 -1 7116  
+315 309 1101 1099 1041 206 5228  
+316 4603 1848 1118 3354 8596 3195  
+317 3835 417 443 7121 323 7119  
+318 443 445 444 -1 -1 324  
+319 443 3836 416 -1 324 7121  
+320 3834 442 441 -1 7117 7118  
+321 3419 3420 1733 8409 6311 6310  
+322 2863 3994 571 1435 5205 5204  
+323 442 3835 443 317 -1 7118  
+324 416 445 443 318 319 7110  
+325 361 1564 741 84 80 8148  
+326 5574 438 423 296 7122 10499  
+327 5133 5132 3757 9629 6966 9631  
+328 1724 4941 4940 2955 9256 9257  
+329 437 425 438 293 -1 292  
+330 422 421 439 335 10498 -1  
+331 439 3837 5574 10499 10498 -1  
+332 419 440 420 337 -1 333  
+333 419 3834 440 7117 332 314  
+334 3055 5303 5302 9966 9965 9967  
+335 439 421 3838 7123 -1 330  
+336 305 4598 4597 1042 -1 8584  
+337 3838 420 440 332 -1 7123  
+338 1681 896 1680 2867 3851 3431  
+339 928 671 266 163 1379 507  
+340 4058 596 4056 121 7544 1432  
+341 1517 26 25 -1 2533 3166  
+342 232 4108 233 701 -1 7643  
+343 2956 753 2542 2699 4578 5392  
+344 1834 4588 160 -1 6959 8569  
+345 1679 1680 1957 2867 1315 2864  
+346 4006 4354 582 7402 282 7445  
+347 1975 684 2222 3943 3942 7545  
+348 10 684 11 4699 -1 3943  
+349 3875 34 33 -1 7192 2807  
+350 2800 3171 1160 5820 1842 5079  
+351 15 868 16 7014 -1 233  
+352 4954 2323 1404 7926 9284 9283  
+353 382 942 3707 6877 702 286  
+354 1017 4048 1016 7527 7760 7528  
+355 5191 2784 3099 1227 5676 5046  
+356 396 713 397 1789 -1 3458  
+357 4046 4047 545 10546 7524 7523  
+358 622 3649 5532 10416 10415 10558  
+359 392 2705 2706 4894 1820 4895  
+360 1531 2155 4840 9060 9059 2582  
+361 746 1566 360 1006 148 1008  
+362 3197 1571 2431 1578 4361 7471  
+363 821 3547 3548 6561 4896 6562  
+364 9 8 3864 7171 3940 -1  
+365 398 397 1134 7634 5791 -1  
+366 3769 2856 5217 1193 9798 10358  
+367 5219 2862 612 7265 1680 9802  
+368 2223 2221 9 166 3940 3945  
+369 203 202 3896 7233 1365 -1  
+370 1952 1953 49 -1 3409 3410  
+371 684 4057 2606 1572 4699 7545  
+372 1830 5064 27 9499 375 9500  
+373 2560 850 2559 574 4614 4618  
+374 85 915 636 1053 802 670  
+375 1830 27 26 -1 3166 372  
+376 2953 3789 584 5415 5384 4223  
+377 849 31 30 -1 1224 444  
+378 1304 2562 2563 9502 9504 10097  
+379 2136 229 2135 7034 3772 3774  
+380 1230 1472 4171 2454 9818 9865  
+381 5192 5191 496 5676 9745 5922  
+382 5570 3910 818 7260 1159 7015  
+383 2366 2367 524 4236 2375 4231  
+384 241 240 3980 7394 7396 -1  
+385 5581 3921 3922 7281 10776 10511  
+386 1317 5467 3440 10317 6350 10289  
+387 16 3778 17 551 -1 7014  
+388 4029 4017 4028 7466 7489 7490  
+389 1040 1041 635 7566 1603 1611  
+390 1326 2249 2239 3976 3989 1309  
+391 1246 22 21 -1 2008 393  
+392 4594 4217 607 7845 2152 8579  
+393 1246 3921 22 7280 391 2009  
+394 5284 5283 3025 9927 5529 9929  
+395 5581 828 3920 1179 10511 5397  
+396 680 1830 1517 3166 5396 9500  
+397 4789 1092 2083 8965 3657 8963  
+398 4732 4335 1524 8079 763 8849  
+399 18 818 19 1102 -1 1159  
+400 5116 820 13 747 102 7543  
+401 1145 538 3880 192 7650 4973  
+402 2185 4865 2187 9110 3295 3868  
+403 2434 3063 5126 5605 9402 1459  
+404 402 3840 403 7125 -1 7126  
+405 454 3833 403 7114 7125 7115  
+406 5218 5018 2446 9414 9799 983  
+407 1427 3743 2905 5288 2289 6944  
+408 401 400 3839 10501 413 -1  
+409 4690 1930 1266 2049 8767 8766  
+410 3842 3843 793 7232 421 7130  
+411 3865 166 165 -1 7173 2662  
+412 3927 4587 1833 8567 3172 7294  
+413 3839 3704 401 10462 408 7124  
+414 563 1915 1916 8741 4251 3336  
+415 454 3840 455 6870 -1 7125  
+416 25 24 3919 7277 2533 -1  
+417 456 3841 457 1110 -1 7127  
+418 5555 3704 455 -1 6870 10462  
+419 3939 839 3927 7294 7293 4608  
+420 251 1654 786 480 505 2814  
+421 3844 3842 793 410 7133 7128  
+422 2143 3442 3443 6357 937 2147  
+423 459 458 460 425 -1 -1  
+424 1901 4667 4666 3269 1456 8723  
+425 460 458 457 -1 1110 423  
+426 729 564 2859 9800 7231 431  
+427 3936 3934 3935 7307 3452 7312  
+428 399 398 729 10042 1111 -1  
+429 403 405 404 -1 -1 7114  
+430 1986 1988 1985 3478 3471 3474  
+431 729 2438 564 5387 426 145  
+432 4889 466 695 7297 9157 9155  
+433 816 3339 587 5601 1156 6152  
+434 2223 755 3936 3944 7311 7172  
+435 4385 1585 794 2449 8171 1720  
+436 883 3968 389 1328 259 7372  
+437 1 0 4887 9154 9153 -1  
+438 1097 640 2377 4252 2599 449  
+439 4887 2219 660 7362 9153 9156  
+440 4103 651 1134 1790 7634 7633  
+441 2780 5336 5186 5743 2559 5040  
+442 2447 995 5594 10536 1512 7497  
+443 4217 1322 4216 7847 7846 8581  
+444 3146 31 849 377 5775 462  
+445 5019 460 2446 7134 9414 -1  
+446 3907 380 3908 74 7256 -1  
+447 463 730 464 4368 -1 1425  
+448 789 3377 1655 1248 1048 2816  
+449 1097 1098 640 2452 438 1715  
+450 653 2837 1490 5153 2487 2489  
+451 2 1098 4075 7581 -1 7971  
+452 4042 42 41 -1 7515 1907  
+453 4279 2 1 -1 7972 7971  
+454 5 1097 6 2598 -1 1717  
+455 2665 1051 2841 4816 5159 4814  
+456 1561 697 349 20 2630 90  
+457 2435 730 698 5386 914 4368  
+458 1142 755 3864 7172 7171 1035  
+459 2393 3727 2139 4709 3779 2587  
+460 3343 5424 3342 10204 6158 10205  
+461 1506 4156 4310 7731 8032 2521  
+462 31 3146 3809 7073 -1 444  
+463 2156 178 177 -1 3811 3810  
+464 789 21 20 -1 2816 2008  
+465 2304 3656 3659 6773 6801 6774  
+466 3985 5587 940 10037 7405 7404  
+467 2772 4089 1103 7608 5028 1726  
+468 3730 591 3729 10478 10480 6921  
+469 271 3845 272 5778 -1 7135  
+470 3615 3613 3614 6689 5596 6694  
+471 810 268 267 -1 1143 1255  
+472 1510 5195 4391 9754 5872 8182  
+473 1033 921 203 598 1365 1119  
+474 1071 270 269 -1 1664 1663  
+475 866 269 268 -1 1255 1664  
+476 796 1505 1605 2518 2722 2519  
+477 810 608 866 576 1255 5779  
+478 4167 249 248 -1 7752 7750  
+479 2596 5097 2603 9561 1878 9562  
+480 2068 786 1654 420 2815 3638  
+481 242 1016 243 7527 -1 630  
+482 3779 265 264 -1 7016 5017  
+483 1960 1171 1961 1863 1864 510  
+484 245 3857 2610 7158 4707 532  
+485 1608 3168 1607 5812 2721 83  
+486 713 4721 1978 8827 824 3458  
+487 1226 694 4167 7750 7752 4706  
+488 3846 5340 3151 10523 7138 6202  
+489 2036 2212 2211 3923 3920 3921  
+490 263 3917 3779 7274 7016 262  
+491 1226 4168 2610 1968 1969 7754  
+492 2356 2355 566 8824 4208 4209  
+493 1729 1730 1211 8403 2965 2964  
+494 2386 801 2385 4268 1349 4272  
+495 263 262 3916 498 262 -1  
+496 1301 259 262 499 2115 -1  
+497 676 3736 5715 10778 10777 6931  
+498 258 3916 262 495 499 7271  
+499 258 262 259 496 -1 498  
+500 764 1173 1890 1868 4387 181  
+501 1302 260 1301 -1 2115 2117  
+502 3894 3892 588 1103 7229 7225  
+503 258 257 826 1175 7271 -1  
+504 1148 585 2775 1817 5030 1097  
+505 786 252 251 -1 420 515  
+506 851 3150 3112 5776 5772 5777  
+507 928 1677 671 619 339 1380  
+508 1657 3081 3082 5640 5220 2828  
+509 1964 585 2068 3638 36 2869  
+510 4129 1171 1960 483 3422 7685  
+511 2127 82 81 -1 3755 793  
+512 254 253 252 -1 515 -1  
+513 2504 2204 2227 3953 3952 5906  
+514 4066 4064 517 2198 7563 7559  
+515 252 786 254 769 512 505  
+516 640 4279 1471 7972 2450 2452  
+517 2214 2215 2213 1106 3924 3928  
+518 3945 77 76 -1 7329 780  
+519 580 2876 3798 5230 7775 5231  
+520 35 1650 2756 9711 4992 8280  
+521 655 1695 4471 2897 7345 896  
+522 1452 4272 5242 1269 1265 7957  
+523 2472 4144 1182 161 1884 4439  
+524 663 1223 3361 614 9658 1966  
+525 1167 236 235 -1 528 7539  
+526 2545 2546 2548 4587 1030 4584  
+527 545 2609 4045 4705 7524 1005  
+528 235 1353 1167 2208 525 2216  
+529 5018 3992 461 -1 9412 9411  
+530 3965 892 3964 7365 7364 7462  
+531 3715 5331 473 1138 1390 6890  
+532 245 244 3857 7157 484 -1  
+533 643 1099 4088 1041 7603 224  
+534 232 231 2220 3938 7643 -1  
+535 846 777 3881 7205 7316 1992  
+536 230 2128 4829 9043 -1 5824  
+537 2220 1136 4108 7644 7643 1793  
+538 2128 2129 692 3 542 3759  
+539 132 3574 3576 692 -1 5796  
+540 806 2376 1916 4251 2588 1133  
+541 91 3850 92 994 -1 7143  
+542 2220 2128 692 538 3939 3938  
+543 228 1105 2134 3769 1734 204  
+544 4808 1833 687 8567 3173 9001  
+545 1107 4077 1586 7583 1736 1735  
+546 195 3847 196 645 -1 7139  
+547 650 1105 3153 5782 550 3769  
+548 1557 213 212 -1 2622 298  
+549 5343 398 3157 5791 10043 10042  
+550 3153 1159 650 7669 547 7667  
+551 17 3778 5570 10491 10490 387  
+552 1190 3170 3171 7671 5079 5816  
+553 1204 5493 3499 2135 2134 10340  
+554 1024 3900 3901 1128 7244 7241  
+555 3928 3937 549 7300 234 7296  
+556 1369 2757 2756 4995 2248 4996  
+557 221 3982 222 3930 -1 7398  
+558 2736 2620 2619 2899 4954 4725  
+559 914 3902 3903 7245 7248 7246  
+560 4069 4068 1045 7567 1613 7570  
+561 3385 2501 5442 10239 10243 9459  
+562 189 2542 5227 2699 5226 9493  
+563 881 4441 1666 1285 1172 8279  
+564 4459 1685 3903 2875 7247 5165  
+565 2035 4739 4740 8863 8855 3572  
+566 216 4717 2941 8820 5361 -1  
+567 2630 1078 656 1738 863 4748  
+568 3956 48 47 -1 7349 301  
+569 3849 48 681 301 7144 -1  
+570 217 216 1045 5361 7567 -1  
+571 881 47 46 -1 8279 7349  
+572 670 1605 1504 2518 5004 1117  
+573 5060 188 5061 9492 658 -1  
+574 2558 2559 850 373 4611 1221  
+575 3167 3166 3165 5801 5805 5810  
+576 866 608 1071 1256 1664 477  
+577 43 42 1195 1907 700 -1  
+578 3078 3076 5311 5631 9983 1911  
+579 838 267 671 163 54 1143  
+580 2942 2943 644 5178 5363 5362  
+581 1710 5031 4491 9432 6937 9435  
+582 1168 1169 647 1033 1858 672  
+583 4192 211 1247 584 7801 -1  
+584 1247 211 2224 589 3947 583  
+585 1030 4062 4061 222 7031 7555  
+586 209 208 4049 7529 3948 -1  
+587 1485 1486 723 2195 2480 794  
+588 3815 3772 4849 7002 9077 7082  
+589 2224 211 210 -1 142 584  
+590 2889 2883 2886 5244 5251 2408  
+591 2225 699 2224 3947 9159 3951  
+592 3862 3863 4014 7461 7460 618  
+593 3903 4460 628 6851 7248 2875  
+594 3848 207 206 -1 7141 2478  
+595 699 3732 1247 6925 3947 2010  
+596 205 204 4353 8111 601 -1  
+597 4091 677 4090 1774 7609 1791  
+598 921 204 203 -1 473 8111  
+599 1961 1962 781 925 3426 1863  
+600 4012 752 4013 7457 7459 7164  
+601 4353 3848 205 7141 596 2591  
+602 4209 4113 1166 731 7833 7832  
+603 3735 4367 1559 10628 6928 2626  
+604 1102 3712 648 5416 5025 10470  
+605 1034 617 1033 1119 2061 7560  
+606 1710 4489 4488 8373 9435 8374  
+607 2215 223 2216 3929 3931 3928  
+608 199 4202 4203 7819 7822 7820  
+609 4007 3897 984 10572 7447 7446  
+610 2890 5629 1647 8273 5259 10606  
+611 5452 3414 1192 4428 10259 6301  
+612 2466 3414 1593 10262 1905 1902  
+613 5453 5452 136 10260 10261 6301  
+614 3361 1223 52 724 6195 524  
+615 1339 208 2785 -1 5050 7529  
+616 4353 921 1541 1366 8112 8111  
+617 3856 3855 139 -1 10733 7156  
+618 618 3863 3862 592 10504 7167  
+619 671 1677 553 1750 1199 507  
+620 3914 195 194 -1 7267 7139  
+621 3924 279 4226 7287 7867 7285  
+622 3819 1012 3818 7089 838 6487  
+623 198 197 3860 1028 7166 -1  
+624 3621 5526 5527 10406 10408 1871  
+625 3362 565 3363 6199 1144 790  
+626 3813 3814 678 6850 7078 2124  
+627 5468 2144 3445 6362 6359 10292  
+628 645 522 3943 7324 4985 257  
+629 3608 5524 953 9970 1428 10401  
+630 242 1040 1016 1603 481 1554  
+631 70 3777 71 7177 -1 7012  
+632 1360 1434 1019 7626 1561 2378  
+633 2512 1037 2511 1595 4517 1596  
+634 928 2768 1039 5018 1177 1379  
+635 3860 752 3861 7164 7166 7168  
+636 2510 1037 5047 9466 1597 1595  
+637 823 618 3847 7140 7268 7269  
+638 2777 529 2776 5032 5031 7048  
+639 2266 2269 1426 2342 9394 4031  
+640 4284 4177 632 8306 2457 7982  
+641 4181 1111 4180 1993 7777 5881  
+642 3886 3888 3887 7219 1742 7214  
+643 2862 2866 3913 7266 7265 1809  
+644 3187 571 3997 1435 7427 5200  
+645 3847 5577 196 10502 546 7140  
+646 4817 4818 844 3905 3727 9019  
+647 4004 1683 191 1816 75 7441  
+648 1659 3095 3088 5652 3119 5667  
+649 4314 1506 4313 922 8038 8040  
+650 4072 1066 587 1156 7575 10201  
+651 2997 878 2996 5470 1987 4951  
+652 5708 760 3134 5746 10763 5748  
+653 1952 4711 1937 8808 3379 3409  
+654 3881 66 65 -1 7204 7198  
+655 810 3363 3364 6199 5779 10216  
+656 3771 1204 3770 2134 7000 7842  
+657 53 3925 54 5757 -1 7289  
+658 5061 2542 5060 9493 573 4578  
+659 3140 3141 3136 5759 5758 5749  
+660 1236 4174 4173 7765 1988 1743  
+661 3962 891 4889 7361 9157 7306  
+662 3543 5179 2771 9724 6555 5024  
+663 1950 51 1949 3408 3396 3406  
+664 5363 2590 5697 10742 4668 4673  
+665 3812 3478 3477 974 6425 7077  
+666 4132 4135 1175 10405 7688 7687  
+667 1653 102 101 -1 872 1729  
+668 315 3526 1170 1861 188 6520  
+669 3158 5344 3694 10045 2532 1293  
+670 915 85 84 -1 1353 374  
+671 4321 130 4322 8052 2531 -1  
+672 1169 1168 63 734 10509 582  
+673 876 5151 5153 4868 9671 9666  
+674 4813 4815 843 944 9010 812  
+675 371 907 3971 697 -1 101  
+676 613 4001 904 7374 1330 7434  
+677 1207 922 1077 135 1676 772  
+678 183 736 184 752 -1 730  
+679 2188 2187 3379 3872 3873 3875  
+680 4000 3999 630 1996 7432 4890  
+681 5061 187 3620 733 6703 9492  
+682 1013 5070 5074 9511 9524 1548  
+683 4133 4134 1180 7047 7690 7689  
+684 4876 4874 2206 2119 3911 9132  
+685 4141 1181 4143 7704 7708 7702  
+686 1668 4442 4444 8283 1171 2839  
+687 3540 3541 385 6551 6549 6548  
+688 5498 3517 5499 6505 10353 10351  
+689 185 184 1057 752 1637 -1  
+690 1283 657 3378 6230 6229 2083  
+691 256 867 257 1175 -1 1587  
+692 3574 3575 3576 6617 539 6612  
+693 1975 550 4057 7546 7545 3454  
+694 675 5600 2556 10548 7013 10549  
+695 215 214 1973 2625 3451 -1  
+696 4318 1508 2893 1483 5265 8045  
+697 908 3971 907 675 1338 7378  
+698 1340 639 4219 7852 972 4502  
+699 3144 1054 721 1266 10714 5764  
+700 43 1195 2607 1908 8298 577  
+701 3791 233 4108 342 7644 7038  
+702 382 3707 383 9716 -1 353  
+703 3132 57 3134 5741 5746 5739  
+704 60 788 61 729 -1 1100  
+705 1248 586 788 1101 2012 9744  
+706 486 4515 3633 8424 7009 8425  
+707 4616 532 4612 8612 3223 1472  
+708 4743 2037 5263 9887 9886 8871  
+709 2245 2247 1326 3995 3989 1477  
+710 1054 39 38 -1 1630 5764  
+711 5596 1005 2687 4861 10541 10540  
+712 982 3871 3869 7184 1061 7181  
+713 163 3961 164 827 -1 7358  
+714 5700 1248 715 5738 10747 9744  
+715 929 2723 2715 4929 815 1814  
+716 181 2552 2554 4596 4603 4598  
+717 3997 3994 955 7425 7426 1435  
+718 194 193 3885 1815 1169 -1  
+719 788 3905 3705 7252 729 1101  
+720 2090 3647 1120 4857 1764 3679  
+721 1671 1668 4446 1171 8302 8288  
+722 4598 4596 1842 8590 1042 8586  
+723 39 3144 40 3767 -1 5764  
+724 1223 53 52 -1 614 132  
+725 846 4186 2876 7788 1992 7789  
+726 4283 774 1526 1072 7980 7979  
+727 277 1355 278 1185 -1 146  
+728 2072 3760 3764 6978 6987 6979  
+729 3705 61 788 704 719 6871  
+730 183 2543 736 4582 678 996  
+731 4127 1166 4113 602 7651 7327  
+732 4235 1368 5361 10079 10078 7876  
+733 187 1057 3620 1636 681 59  
+734 63 1168 64 7315 -1 672  
+735 4832 174 173 -1 9047 9045  
+736 4052 5600 4050 10549 7532 7536  
+737 70 69 4050 7531 7012 -1  
+738 5062 2544 520 4585 9495 997  
+739 3304 3303 2006 6078 6080 1984  
+740 4080 583 2398 1047 4295 129  
+741 3980 2386 913 1349 7395 7394  
+742 863 3370 3369 10224 6209 6218  
+743 3075 1199 3074 4542 5627 1914  
+744 4831 172 2131 746 9046 -1  
+745 172 171 3882 7206 746 -1  
+746 3882 2131 172 744 745 7207  
+747 13 820 3995 986 5208 400  
+748 2546 756 2551 1036 4586 4584  
+749 792 779 3882 7207 7206 6519  
+750 359 3851 746 7147 148 87  
+751 1358 1357 276 7868 7871 2225  
+752 736 1057 184 689 678 1636  
+753 4110 979 1141 1804 1803 7844  
+754 1492 4983 4294 9341 8004 9342  
+755 220 3898 221 1351 -1 7237  
+756 4051 68 67 -1 1562 874  
+757 2539 2540 2518 4575 2933 4573  
+758 5708 834 3142 5760 5748 10764  
+759 3777 4050 675 10549 7013 7012  
+760 631 73 72 -1 761 229  
+761 72 71 631 1037 760 -1  
+762 631 180 659 767 229 269  
+763 4733 4732 1524 398 3550 8851  
+764 3878 67 66 -1 7200 7533  
+765 1338 2634 2632 3483 4753 4752  
+766 2751 74 659 5 776 771  
+767 659 180 179 -1 776 762  
+768 1108 870 656 4745 250 1737  
+769 254 786 1148 1097 1818 515  
+770 3945 848 3944 1220 1853 7329  
+771 2751 75 74 -1 766 1219  
+772 1207 621 922 6872 677 1931  
+773 775 1829 4127 3165 7678 1074  
+774 645 179 178 -1 3810 4984  
+775 307 1840 1843 1038 3192 -1  
+776 659 179 2751 4984 766 767  
+777 3131 3130 58 295 10030 5740  
+778 5349 3650 961 10064 10055 6762  
+779 4007 592 1272 2060 1588 1364  
+780 77 3945 1829 7328 3164 518  
+781 3604 177 176 -1 6671 3811  
+782 848 76 75 -1 1219 7329  
+783 2617 2614 2615 4715 4718 4722  
+784 775 2231 80 787 785 1075  
+785 775 80 79 -1 1074 784  
+786 4585 4584 294 -1 3168 8562  
+787 2231 81 80 -1 784 3961  
+788 2444 2445 3382 6237 1052 9410  
+789 662 1195 1005 7516 10540 4701  
+790 3362 1257 565 1403 625 7804  
+791 4293 2456 927 4408 7999 2485  
+792 639 2505 2504 4505 3952 4502  
+793 82 2127 4131 1077 7684 511  
+794 1486 1485 4290 7993 7994 587  
+795 4333 115 5027 9429 8074 -1  
+796 4131 1173 84 1353 1867 7686  
+797 870 317 316 -1 10519 1737  
+798 1533 4350 606 3958 255 8105  
+799 1023 88 87 -1 1568 869  
+800 3997 3998 956 10068 7427 7426  
+801 4893 2230 4590 3959 8568 9163  
+802 636 86 85 -1 374 7343  
+803 2572 778 2570 4633 4637 4631  
+804 88 763 3412 6298 6297 869  
+805 4033 2447 722 4393 7498 7497  
+806 522 1563 4370 1854 7326 2634  
+807 1855 321 3926 1020 7292 3213  
+808 171 170 792 264 7206 -1  
+809 2373 2762 4987 9349 4245 1092  
+810 4843 738 4845 9070 9069 9066  
+811 36 2752 37 4988 -1 4986  
+812 4815 4813 2110 3715 9014 674  
+813 1453 2179 5243 9847 7958 2417  
+814 167 4381 4382 8165 4923 -1  
+815 2715 2716 929 4924 715 4915  
+816 4071 157 816 820 7574 7573  
+817 1745 780 4494 111 8383 76  
+818 4071 1066 158 1655 7573 7574  
+819 5425 4124 1161 7673 10207 10206  
+820 816 157 156 -1 1155 816  
+821 4547 4546 1792 8483 8486 8489  
+822 394 4115 1979 7655 3460 7658  
+823 2281 2283 1415 2339 2344 4061  
+824 1978 570 713 952 486 265  
+825 2664 2658 1051 5155 4814 1624  
+826 86 3953 87 1568 -1 312  
+827 3866 164 3961 713 7359 7175  
+828 2698 2699 161 4883 4881 4880  
+829 1293 2172 2402 2098 3830 3843  
+830 2407 2184 689 3175 4312 3313  
+831 3877 4439 1650 4994 1071 7197  
+832 1289 4211 4210 7837 10578 2095  
+833 163 3208 2703 5892 7358 -1  
+834 1943 725 1938 288 3382 943  
+835 2772 104 1102 873 5025 147  
+836 3528 1898 536 8689 6524 8709  
+837 3865 4995 1577 4294 2662 7174  
+838 3820 3819 3818 622 7093 7088  
+839 2765 3429 3430 6330 6485 6337  
+840 1593 5453 4392 10261 8187 10262  
+841 320 319 925 1678 7291 -1  
+842 5522 3602 3603 6667 10398 10397  
+843 3817 3517 3818 6504 7089 7086  
+844 151 3602 152 1528 -1 6667  
+845 136 4394 1596 8184 4866 -1  
+846 2388 1365 126 848 9360 4274  
+847 2873 133 3575 6617 10750 -1  
+848 1365 127 126 -1 846 3784  
+849 143 973 4132 7687 1873 -1  
+850 4040 4039 1001 7508 1525 7512  
+851 898 3722 3723 1134 1540 6904  
+852 3752 2408 4997 9370 4314 9399  
+853 153 4039 154 6688 -1 7509  
+854 1003 2355 4977 1800 7514 1529  
+855 1277 1280 1276 1003 2068 2071  
+856 2857 720 2356 966 4208 6296  
+857 4707 2105 709 1209 8801 8800  
+858 1556 2366 4364 2375 2615 9821  
+859 2857 2858 3411 1010 6296 5193  
+860 799 3261 5621 10590 2275 2278  
+861 124 743 125 862 -1 5194  
+862 4992 125 743 861 9359 4275  
+863 2630 656 2629 4745 4720 567  
+864 1529 3781 4339 7020 1261 7021  
+865 3152 996 613 7434 1514 7500  
+866 1144 3104 5324 10009 10008 6262  
+867 121 3946 122 6295 -1 7330  
+868 90 685 91 7143 -1 1051  
+869 763 88 1023 799 7542 804  
+870 1053 2359 652 4219 1481 4216  
+871 79 78 1829 3164 1074 -1  
+872 3859 1653 101 667 174 7162  
+873 103 1102 104 835 -1 1725  
+874 4051 4050 68 7531 756 7534  
+875 3850 1837 4591 3181 994 13  
+876 5595 4797 2608 8978 4703 1909  
+877 5251 3859 1222 7161 9864 9863  
+878 1870 4629 4627 6522 8648 8646  
+879 5674 1926 2477 3357 10696 3358  
+880 3149 599 3150 1222 5777 5768  
+881 735 1141 94 884 883 1803  
+882 1705 601 4484 8363 144 1415  
+883 735 94 93 -1 8572 881  
+884 1141 95 94 -1 881 7438  
+885 4068 218 217 -1 7567 1833  
+886 2407 1904 4862 9103 3313 4313  
+887 4163 98 1221 889 7746 -1  
+888 293 4586 1832 6607 -1 3170  
+889 98 3413 1221 6299 887 6300  
+890 861 3341 3340 6157 1974 6155  
+891 4003 96 95 -1 7438 1628  
+892 3413 97 1053 77 1481 6300  
+893 4320 5633 1508 10614 2525 10615  
+894 288 287 927 125 4408 -1  
+895 2182 4860 4861 9100 3863 3862  
+896 1694 1695 655 521 2895 1196  
+897 1869 5035 5034 9443 7638 9441  
+898 569 2627 2616 1530 4746 4741  
+899 111 2228 4891 9160 -1 919  
+900 120 119 2391 4281 4280 -1  
+901 1232 4046 4172 7522 1556 1086  
+902 290 2154 291 7624 -1 3807  
+903 2540 602 2541 6030 4577 10738  
+904 3883 2760 364 2517 82 7209  
+905 3927 118 117 -1 7293 3172  
+906 3619 3615 771 5596 6693 6700  
+907 1518 4332 5026 2545 2553 8071  
+908 3750 3751 1834 6961 6959 6958  
+909 5055 714 2522 1912 9482 5835  
+910 2850 2849 1047 7664 1834 5179  
+911 4369 4368 105 -1 8140 2628  
+912 1553 4364 4305 8133 2514 8134  
+913 106 4104 107 3244 -1 7640  
+914 2435 698 2436 4369 4371 457  
+915 4325 718 4332 8072 8071 2549  
+916 2433 2653 3390 4792 4315 4793  
+917 4153 109 5311 9983 7728 -1  
+918 3928 3962 695 9157 7295 234  
+919 2521 2228 111 899 3954 4537  
+920 1518 4324 113 -1 8057 8058  
+921 3929 840 3928 7296 7295 7755  
+922 674 4313 1506 649 8032 8037  
+923 1560 677 4107 7641 2629 1774  
+924 119 118 1833 3172 3704 -1  
+925 3644 781 1962 599 3428 7526  
+926 664 1246 789 2008 7226 2009  
+927 2722 169 2721 939 3813 4927  
+928 4236 4239 1370 5059 1214 7886  
+929 2122 2093 500 8981 3745 8985  
+930 4378 4377 540 10630 8158 2646  
+931 4054 2357 237 208 237 7540  
+932 348 3854 1561 7152 2630 7153  
+933 1226 248 247 -1 7754 7752  
+934 1800 1812 4568 3131 3102 3107  
+935 3852 3854 719 7153 964 7149  
+936 3853 1540 3852 2589 7148 8110  
+937 3445 2143 3443 422 6359 3787  
+938 2962 2578 5070 9511 9509 5405  
+939 169 2717 2721 4917 927 -1  
+940 2743 707 3737 6932 1813 3207  
+941 3747 3118 333 -1 5713 6953  
+942 547 4034 708 51 5716 7499  
+943 4703 725 1943 834 8792 3407  
+944 2681 843 4815 674 9015 9008  
+945 36 2755 2757 4995 4986 -1  
+946 4265 1445 552 4411 7943 2387  
+947 4078 284 283 -1 7584 4997  
+948 1491 3569 2638 6602 2492 6603  
+949 4413 807 4857 8225 9094 8229  
+950 1626 4996 2175 9367 2099 10729  
+951 395 1979 4721 8827 8826 3460  
+952 713 570 3964 7364 21 824  
+953 2521 110 5054 9480 4536 3954  
+954 5634 1519 4329 8066 10617 10616  
+955 3143 3132 760 5746 9739 5742  
+956 3133 715 3131 5740 5744 10029  
+957 5129 2662 5130 4811 1707 1358  
+958 1014 3560 5511 10377 10376 6587  
+959 5567 3425 3768 6323 6995 2118  
+960 1318 5462 3438 10280 2540 6345  
+961 4325 1518 4326 8057 8061 8071  
+962 5056 1878 5057 9484 9487 9976  
+963 4213 346 1299 6 7841 7840  
+964 3852 719 561 4710 7148 935  
+965 3411 853 3947 1230 7333 7331  
+966 2356 720 5584 10517 7335 856  
+967 2683 2687 2133 4861 3768 4853  
+968 4835 40 5683 3767 10715 -1  
+969 2454 300 2449 -1 4404 6827  
+970 1592 2786 642 3447 10072 2692  
+971 1343 1036 2520 4535 4534 5132  
+972 1339 1340 4219 698 7853 2190  
+973 5494 5513 3562 6593 6589 10342  
+974 3477 3478 1309 10330 6426 665  
+975 4697 3956 3957 7350 7352 8780  
+976 4710 1951 50 -1 8804 3394  
+977 2467 5030 138 -1 4430 9434  
+978 4992 1977 2388 3457 9360 9359  
+979 4720 3774 1977 7006 3456 8825  
+980 4837 728 2140 242 3782 9055  
+981 728 3970 1539 7376 4284 1334  
+982 1134 3154 3157 5785 5791 1790  
+983 951 5018 5218 406 7414 9411  
+984 462 3992 3991 7418 7415 -1  
+985 3990 2954 730 5386 7413 1424  
+986 3993 3995 820 747 1164 7419  
+987 2860 731 2863 5204 9801 5207  
+988 5176 5177 2769 9719 9717 1409  
+989 3709 943 3708 6876 1407 10463  
+990 3778 868 3912 7263 7261 7014  
+991 3912 3913 3911 7266 1260 7264  
+992 4832 4834 175 3766 9045 3764  
+993 3524 4371 1563 1854 2635 6517  
+994 3850 4591 92 8573 541 875  
+995 4593 1838 4110 3183 7645 3180  
+996 2543 183 182 -1 4580 730  
+997 736 2544 5062 738 6702 4582  
+998 4301 4298 1494 8416 8018 1422  
+999 803 4194 2358 2020 4215 7803  
+1000 166 1577 4381 8165 -1 2662  
+1001 4347 1531 5016 8099 9407 8089  
+1002 2782 4611 1282 2081 5043 34  
+1003 1276 1280 923 1930 2069 855  
+1004 4048 244 243 -1 7527 7157  
+1005 2609 545 694 6749 4706 527  
+1006 1566 4373 360 2636 361 8149  
+1007 741 562 3884 7210 7160 4239  
+1008 3904 1566 746 361 1017 7250  
+1009 4986 2370 2371 4238 9347 4243  
+1010 2858 123 3411 277 859 5195  
+1011 1977 743 566 5192 3456 9359  
+1012 4729 2020 1524 3550 8842 8844  
+1013 2130 4830 314 9044 1195 3762  
+1014 1099 1584 310 2677 206 224  
+1015 539 3170 2022 3545 2446 5817  
+1016 697 563 746 1017 7147 3336  
+1017 746 563 3904 7249 1008 1016  
+1018 1161 283 3811 -1 7097 7584  
+1019 4486 601 4485 1415 8366 6187  
+1020 320 3926 321 807 -1 7291  
+1021 1991 863 3368 6209 1249 3484  
+1022 719 4213 2611 7841 4710 2114  
+1023 1298 346 345 -1 0 6  
+1024 5603 4115 4116 7658 10555 10554  
+1025 4898 2240 503 2161 9171 60  
+1026 99 4163 4164 7746 1961 -1  
+1027 5552 3691 859 5419 6843 10456  
+1028 197 5577 3860 7163 623 10502  
+1029 5591 4009 4011 7450 10531 10530  
+1030 2548 520 2545 4585 526 5391  
+1031 1683 4171 4456 7758 2873 2872  
+1032 3738 1712 2825 5129 5128 2930  
+1033 2776 647 1169 582 1860 7792  
+1034 1142 8 7 -1 4253 7171  
+1035 755 1142 1470 1806 240 458  
+1036 2551 756 2552 4596 1055 748  
+1037 631 71 3867 7177 4599 761  
+1038 1841 1843 1840 775 3186 3188  
+1039 1691 1143 757 226 1807 2889  
+1040 1693 4469 4470 70 8829 8334  
+1041 1101 4088 1099 533 315 7604  
+1042 4598 1842 4597 8585 336 722  
+1043 495 1692 4467 2890 8332 2891  
+1044 578 5337 2831 5756 9737 2931  
+1045 1525 5188 5187 9740 2558 9735  
+1046 888 1113 3866 7176 7359 7587  
+1047 583 2394 2398 4286 740 4287  
+1048 1655 588 789 1103 448 5678  
+1049 3084 1661 3085 10249 5646 5643  
+1050 763 4055 2230 7541 9163 7542  
+1051 3412 685 90 868 139 9162  
+1052 3382 1535 2444 4386 788 8108  
+1053 636 915 2443 1354 8085 374  
+1054 2546 2547 1007 2611 4587 4586  
+1055 2551 2552 5578 10505 7178 1036  
+1056 2440 766 3155 4377 5787 4375  
+1057 2439 698 2954 5386 4374 1971  
+1058 332 331 3706 44 6873 -1  
+1059 3124 621 1214 1944 5726 5725  
+1060 3873 1748 845 2997 3001 7189  
+1061 4238 982 3869 712 7180 7890  
+1062 3145 368 367 -1 10034 32  
+1063 992 909 3973 1341 7381 89  
+1064 377 3869 3870 7184 -1 7182  
+1065 770 4005 3983 1487 6673 7442  
+1066 817 3909 3618 7257 6701 7258  
+1067 3057 772 5303 1975 9967 9956  
+1068 3046 3806 5292 7066 9945 7067  
+1069 4644 1886 4642 3251 8677 3277  
+1070 1646 4433 4434 8266 5704 1228  
+1071 3877 1650 3876 7195 7194 831  
+1072 3879 1526 774 726 1073 1079  
+1073 3879 774 3878 7199 7200 1072  
+1074 775 79 1829 871 773 785  
+1075 2231 775 4112 3960 1076 784  
+1076 2231 4112 776 7203 3961 1075  
+1077 2127 649 4131 7686 793 7202  
+1078 65 64 3938 7315 7204 -1  
+1079 4337 1526 3879 1072 7201 8081  
+1080 2571 2570 2960 4633 5399 4003  
+1081 2564 2567 388 4627 -1 4628  
+1082 3525 593 3524 6517 6515 1109  
+1083 2132 2131 779 7207 3763 9048  
+1084 373 1968 1716 3440 53 -1  
+1085 4260 1430 2897 5271 5273 2369  
+1086 5597 4046 1232 901 10542 7523  
+1087 2474 2470 2471 4436 4438 4444  
+1088 2827 1035 2834 9788 5131 5136  
+1089 5049 2514 965 4530 4521 9471  
+1090 2745 1145 2744 4971 4970 4973  
+1091 485 4839 4342 9056 8092 9058  
+1092 2762 2373 670 2717 4244 809  
+1093 1504 2760 2761 5001 5004 5002  
+1094 3889 3890 193 1815 -1 7220  
+1095 574 4173 3888 7762 100 7763  
+1096 250 4129 1654 7682 2814 7683  
+1097 786 585 1148 504 769 3638  
+1098 1171 4130 249 -1 3425 7685  
+1099 610 1958 1959 3418 3423 3419  
+1100 3891 788 60 704 7223 2012  
+1101 788 586 3905 7251 719 705  
+1102 818 3951 19 231 399 7338  
+1103 3892 789 588 1048 502 7226  
+1104 5220 2867 5225 9814 9813 5210  
+1105 2871 5320 790 5679 2817 10000  
+1106 2213 2215 701 3931 3925 517  
+1107 3399 3162 2034 8861 6271 3570  
+1108 792 1852 1851 3210 3208 264  
+1109 792 593 3525 1082 6519 3208  
+1110 3841 460 457 425 417 4389  
+1111 399 729 3895 7231 7132 428  
+1112 2129 2949 513 2679 3758 3760  
+1113 4277 2021 794 8171 3543 7968  
+1114 531 4723 1991 3487 2444 8830  
+1115 1201 2643 2644 4772 6891 4773  
+1116 1505 4308 366 -1 2520 8030  
+1117 670 1606 1605 2718 572 2717  
+1118 797 3896 3897 7233 7446 7234  
+1119 921 1033 617 605 1366 473  
+1120 798 4624 4630 8637 10682 3245  
+1121 1198 3075 3076 5628 1911 5629  
+1122 3279 1396 3213 2303 5901 2300  
+1123 1498 5239 3376 2506 2271 9840  
+1124 3210 5412 3209 10180 5891 10181  
+1125 2737 5163 2641 4765 4769 4957  
+1126 2387 854 3529 1232 6526 4271  
+1127 511 4680 1923 8746 1756 8747  
+1128 219 3901 3900 554 7239 7243  
+1129 4458 1684 4459 8314 8313 5185  
+1130 672 1249 1251 2016 2021 115  
+1131 3622 1260 3631 6724 6706 6713  
+1132 5082 5083 2149 6444 3798 9534  
+1133 2375 2376 806 540 1318 4250  
+1134 3723 3722 3822 6903 7096 851  
+1135 1624 1625 4413 2758 9355 1752  
+1136 1623 4989 2374 2753 2754 9353  
+1137 4414 4081 1115 7596 8228 8227  
+1138 3125 473 5331 531 5722 10024  
+1139 4424 1639 5650 8248 10649 4300  
+1140 1615 4406 3723 1540 8214 8211  
+1141 1215 4160 4162 7739 7744 7740  
+1142 3214 990 3212 5899 5898 10089  
+1143 838 810 267 471 579 6200  
+1144 3362 3363 5430 10216 10215 625  
+1145 5626 3684 1448 2404 10600 6830  
+1146 2461 1446 2460 4417 4416 4419  
+1147 2776 3780 813 5037 5031 1860  
+1148 62 812 5580 7254 10510 6869  
+1149 5184 2779 5189 9742 9741 9734  
+1150 5183 2778 900 2926 9729 9730  
+1151 379 3874 3605 7191 7253 71  
+1152 3988 814 5523 7410 10399 7255  
+1153 2134 2135 3788 7034 1734 3770  
+1154 1469 4274 4275 7962 2448 2447  
+1155 3909 816 156 820 7257 6152  
+1156 816 587 1066 650 7574 433  
+1157 3617 155 3616 6696 6699 -1  
+1158 5421 771 5304 9968 1245 6154  
+1159 818 18 5570 10490 382 399  
+1160 3951 3952 862 9812 7340 7338  
+1161 1834 2697 2698 4878 4881 4879  
+1162 2702 889 2701 4887 1301 7430  
+1163 12 11 2606 4699 9596 -1  
+1164 820 4056 3993 121 986 7543  
+1165 2232 390 902 7375 1327 3963  
+1166 597 4900 2262 9176 6563 3981  
+1167 2234 3547 2233 6562 3964 2165  
+1168 2232 2233 2704 3965 9165 3962  
+1169 194 3885 3886 7213 7267 718  
+1170 3863 3915 518 9424 2246 7167  
+1171 4446 1668 4444 686 8286 721  
+1172 1666 616 881 7351 563 2843  
+1173 5716 1611 825 2725 10779 10642  
+1174 510 2880 4030 1507 4226 5239  
+1175 867 826 257 503 691 7275  
+1176 3918 827 3917 7274 7273 1600  
+1177 928 1039 673 2866 1380 634  
+1178 3779 2768 266 1379 5017 7017  
+1179 828 3919 3920 7277 395 7278  
+1180 5066 2959 555 7284 9503 4621  
+1181 3219 3221 3218 4351 5910 5913  
+1182 841 4375 4376 8153 8163 1206  
+1183 5009 1426 2429 2171 4357 9394  
+1184 2424 2420 1575 4336 4347 9377  
+1185 278 1355 4226 7866 7287 727  
+1186 3352 3351 831 7286 151 6178  
+1187 3357 1708 3347 6169 6188 8368  
+1188 5426 3346 832 6171 10208 1847  
+1189 833 3925 1225 7289 4576 7290  
+1190 3137 833 3278 5751 6031 5750  
+1191 5188 3142 578 5761 9740 5762  
+1192 3135 5708 56 10763 -1 5747  
+1193 2856 3515 5217 6497 366 6501  
+1194 3427 3426 5457 10269 10273 2542  
+1195 314 313 2130 214 1013 -1  
+1196 1695 1694 1744 2894 2995 896  
+1197 3368 3369 3371 306 6216 6209  
+1198 3369 5434 837 10223 306 10224  
+1199 1249 671 553 619 2014 54  
+1200 838 672 5430 10215 6200 115  
+1201 3942 3939 3940 7320 7317 7323  
+1202 5297 3051 4587 5580 8566 9955  
+1203 3929 466 1227 4370 7298 7297  
+1204 841 3937 5582 7313 1206 7314  
+1205 4169 4170 840 10513 7755 7753  
+1206 5582 4375 841 1182 1204 10514  
+1207 3156 5592 540 10533 1497 5789  
+1208 1027 3196 5008 1304 5916 10090  
+1209 2105 2106 709 1964 857 3712  
+1210 551 2107 3719 6898 6897 3713  
+1211 5160 2500 2725 3726 4933 9457  
+1212 2162 2495 2496 4484 9464 4485  
+1213 4513 1746 5121 2999 3002 8421  
+1214 1370 4940 4236 9255 928 9256  
+1215 846 3938 1168 7315 1858 7316  
+1216 4187 4185 529 7793 7790 1995  
+1217 4333 5635 116 10619 -1 8074  
+1218 4330 5330 1521 9791 2057 8068  
+1219 848 75 2751 771 7325 782  
+1220 3943 3944 848 770 7325 7324  
+1221 2559 2558 3794 7045 4610 574  
+1222 3150 599 5369 10095 10094 880  
+1223 2558 2561 849 4617 1224 4611  
+1224 2558 849 30 377 7045 1223  
+1225 5236 5237 2887 9836 5252 9834  
+1226 1000 3147 3148 5770 1523 5771  
+1227 3100 3099 2784 355 5677 5672  
+1228 1646 2883 4433 5245 1070 9823  
+1229 2101 2123 2391 3748 4281 1543  
+1230 853 4044 3947 1542 965 7519  
+1231 2357 2817 3570 5113 6605 4213  
+1232 2818 3529 854 1126 5114 3198  
+1233 322 1853 323 187 -1 3211  
+1234 1854 856 1853 3212 3211 3214  
+1235 2763 856 748 3214 5007 197  
+1236 604 855 3949 7336 5010 7347  
+1237 857 1376 1377 2263 185 304  
+1238 5437 857 4240 185 7894 10229  
+1239 2364 994 3291 6056 2268 6039  
+1240 4303 4245 1069 1658 8020 8019  
+1241 1910 2968 2970 5418 3323 3326  
+1242 103 1104 5559 10469 1725 -1  
+1243 2161 2394 966 245 8091 3820  
+1244 1577 4383 4382 8168 8165 8164  
+1245 3058 5421 5304 1158 5577 10198  
+1246 3056 3060 861 1458 5595 5588  
+1247 589 5225 3952 5219 7341 9813  
+1248 1655 3377 5224 6228 9811 448  
+1249 3368 1467 1991 2444 1021 6210  
+1250 1827 3370 3372 6218 3160 6213  
+1251 3805 3807 3049 1427 5576 7064  
+1252 499 3702 5296 5575 9971 6866  
+1253 3185 3183 5353 1254 10063 5846  
+1254 5351 5353 3183 1253 5837 10059  
+1255 810 866 268 475 471 477  
+1256 608 3845 1071 7135 576 7136  
+1257 2775 5182 255 9727 5030 9728  
+1258 4063 3918 867 7275 7557 1586  
+1259 868 2864 2860 5207 5199 233  
+1260 3912 3911 733 7259 7261 991  
+1261 4339 4340 1529 2566 864 8084  
+1262 3781 4055 1023 7542 1569 2567  
+1263 5585 316 1170 188 10520 10519  
+1264 870 5585 3954 1862 195 10519  
+1265 4270 1452 5242 522 5319 1267  
+1266 721 1054 1435 7937 4852 699  
+1267 1452 4270 4271 7954 7957 1265  
+1268 5685 3030 2935 5538 10719 10718  
+1269 872 5242 4272 522 5322 9845  
+1270 1771 4536 4522 8466 8443 8467  
+1271 2908 2907 1455 2420 1668 2418  
+1272 1777 3583 5516 6630 10386 5952  
+1273 1254 1741 1742 2990 6743 2985  
+1274 1961 1965 610 3437 1864 3426  
+1275 3958 134 3959 10753 7354 -1  
+1276 4392 1594 4393 8185 8187 2700  
+1277 2619 2623 2618 1986 4723 4726  
+1278 2003 3300 3301 6076 6018 3513  
+1279 2044 2990 2991 5459 8897 3589  
+1280 5277 3034 1783 8471 3073 5546  
+1281 325 324 3955 227 7348 -1  
+1282 2764 1856 4610 3218 8609 5009  
+1283 1375 739 1279 2078 2261 8605  
+1284 879 1374 326 2259 112 30  
+1285 4441 45 1666 2838 563 8281  
+1286 4694 3957 616 7351 8775 8774  
+1287 4694 4693 1934 2849 3374 8775  
+1288 1937 882 1936 2232 3378 8781  
+1289 2565 884 2567 4624 4628 4638  
+1290 902 3968 5532 7372 10416 7373  
+1291 2565 2566 2572 4631 4638 99  
+1292 2961 5604 1150 10557 5401 4002  
+1293 131 5344 3158 669 5793 10044  
+1294 3959 5701 886 5224 5225 10749  
+1295 2165 4851 4848 9082 5700 3829  
+1296 2693 2164 4851 9082 9081 3827  
+1297 3815 1305 3814 7081 7080 2122  
+1298 4395 135 5644 10636 10637 8188  
+1299 162 2699 2700 47 4885 4883  
+1300 888 4000 4079 7432 7587 1302  
+1301 819 2702 2701 1162 4882 4886  
+1302 2703 4000 888 1300 4891 7433  
+1303 3931 3932 3930 7304 3453 7302  
+1304 3196 2425 5008 9391 1208 183  
+1305 549 3932 3933 7303 7360 7304  
+1306 3963 514 4278 7969 2451 7308  
+1307 2243 893 3965 7367 7366 9174  
+1308 987 4015 3965 7462 7367 7463  
+1309 1326 3549 2249 3997 390 3996  
+1310 892 4015 651 5786 7633 7462  
+1311 4024 4025 2410 7483 4317 7480  
+1312 5006 4379 5642 8160 10633 9387  
+1313 2360 2361 3550 4221 6568 4218  
+1314 2953 895 2362 3324 4223 1960  
+1315 1957 1114 1679 2865 345 2986  
+1316 2176 1680 673 2864 2866 3851  
+1317 4373 3966 742 4240 2641 2640  
+1318 2375 806 4990 4247 9356 1133  
+1319 4407 1618 4408 8220 2100 6906  
+1320 4985 2371 3722 86 6904 9347  
+1321 4409 899 4408 2100 8216 4905  
+1322 1611 1612 5648 10644 8199 2730  
+1323 3041 506 2513 4520 5125 5561  
+1324 5033 4187 2468 2701 9438 5883  
+1325 1155 2821 2823 5121 4518 1831  
+1326 4233 986 5432 10219 6205 7830  
+1327 2232 902 822 6759 3962 1165  
+1328 389 3968 3969 7373 -1 436  
+1329 1172 903 339 17 1865 40  
+1330 903 613 904 676 24 10038  
+1331 972 996 4035 7501 1467 1466  
+1332 906 3970 972 7435 7437 7376  
+1333 4082 1115 4084 7596 7436 7594  
+1334 904 3970 728 981 9055 7374  
+1335 4002 4084 906 7591 7437 7597  
+1336 906 4081 1539 2586 7376 7591  
+1337 370 369 3972 7377 104 -1  
+1338 907 614 908 1339 697 1342  
+1339 1376 908 614 1338 2262 1340  
+1340 908 1376 1431 304 1375 1339  
+1341 3973 909 769 308 7380 1063  
+1342 614 907 909 7379 89 1338  
+1343 910 3974 995 7382 175 7383  
+1344 3975 3977 911 7598 7385 7384  
+1345 4085 4086 911 7386 7598 167  
+1346 303 3974 3976 7383 7387 178  
+1347 2765 3507 3504 6479 6331 10349  
+1348 3516 148 3517 6504 10351 -1  
+1349 2386 2385 913 3360 741 494  
+1350 913 626 2442 4381 7397 3360  
+1351 221 3898 3902 7238 7398 755  
+1352 628 3178 3179 5831 5834 5832  
+1353 1173 915 84 670 796 181  
+1354 2443 915 764 181 4383 1053  
+1355 3356 556 3355 6184 2977 2497  
+1356 1493 4300 4296 2377 8008 8013  
+1357 3560 2503 2201 9454 10377 6588  
+1358 2661 2662 5129 957 9623 9626  
+1359 3388 2114 3387 6248 6247 3730  
+1360 3387 4819 1152 9680 10246 6248  
+1361 3509 3508 1012 7087 6487 6496  
+1362 2587 804 5087 9546 4669 1768  
+1363 1085 5212 2833 5146 7453 9787  
+1364 4007 4008 592 1691 779 7447  
+1365 203 3896 1033 7234 473 369  
+1366 1541 921 617 1119 2590 616  
+1367 1982 1077 330 135 -1 3467  
+1368 621 924 3706 6873 6872 5725  
+1369 1279 1297 328 2070 7824 2072  
+1370 923 4157 1207 1936 1676 7733  
+1371 933 3123 3124 5723 5726 5724  
+1372 924 3126 3127 5729 48 5730  
+1373 318 1108 1587 250 2683 184  
+1374 925 623 3371 6216 6215 1677  
+1375 1431 372 908 7378 1340 96  
+1376 1717 780 1720 2946 2939 2942  
+1377 3607 287 286 -1 6677 125  
+1378 4293 653 1489 2487 8000 7999  
+1379 2768 928 266 339 1178 634  
+1380 928 673 1677 2860 507 1177  
+1381 2157 2718 2719 4922 4921 4919  
+1382 2713 1146 2714 4912 3814 4972  
+1383 3984 930 3983 7401 7400 6883  
+1384 3605 3606 814 7410 68 6674  
+1385 3543 3539 3540 6547 6549 6555  
+1386 4879 3538 2207 3913 3912 9138  
+1387 5294 3048 1011 6865 9948 9951  
+1388 567 5288 5289 1401 9946 5563  
+1389 3122 3128 934 1391 5721 5719  
+1390 5560 3715 473 531 6888 10472  
+1391 3128 3129 934 1392 1389 5734  
+1392 934 3129 4161 7742 7836 1391  
+1393 523 1210 4158 1937 10027 1945  
+1394 1474 3716 1478 6892 1934 2458  
+1395 487 4724 4725 8833 6859 2187  
+1396 1296 2013 2012 3526 3523 10225  
+1397 5264 2995 878 5470 9888 5467  
+1398 4804 4805 2805 5088 8993 8992  
+1399 2166 1627 2167 3832 2761 9086  
+1400 2404 1290 2403 4305 4304 2097  
+1401 5289 5288 3042 9936 9937 1388  
+1402 2523 5058 5056 9489 10052 4540  
+1403 2877 565 1257 790 5232 10035  
+1404 5588 3986 940 7405 7406 10525  
+1405 3987 941 4650 8686 1469 -1  
+1406 3988 942 381 286 7408 10399  
+1407 3709 3708 624 6676 6878 989  
+1408 3710 975 3709 10464 6878 9097  
+1409 5177 5176 383 -1 9716 988  
+1410 274 3985 3986 7405 7411 164  
+1411 3627 3628 3629 67 6721 6716  
+1412 3623 629 3622 6707 6706 6717  
+1413 1357 668 1355 2221 7869 4225  
+1414 3625 1261 4198 7812 7811 2038  
+1415 4485 601 1705 882 8365 1019  
+1416 3416 1265 3422 6316 6305 6314  
+1417 1734 2093 4799 3688 8983 2975  
+1418 1255 4195 1253 2032 11 7805  
+1419 1187 1350 4222 2214 2044 2046  
+1420 2793 1929 1186 2212 5064 2048  
+1421 4306 1021 4359 8124 8123 10611  
+1422 4301 476 4298 8009 998 3370  
+1423 1735 1163 3359 6192 2974 6183  
+1424 2954 3990 564 5196 5387 985  
+1425 3991 730 463 447 7415 7413  
+1426 3611 3612 1002 7510 6686 6685  
+1427 3807 5705 3049 9953 1251 7069  
+1428 3613 3608 953 629 6689 6680  
+1429 3609 5524 637 10401 6679 10402  
+1430 3993 3996 954 7421 7419 7417  
+1431 2865 731 2864 5207 211 5209  
+1432 596 4058 2787 7548 7424 340  
+1433 5356 3188 956 5848 10068 5851  
+1434 3185 3186 3188 5848 5852 5845  
+1435 3994 3997 571 644 322 717  
+1436 3652 3653 3651 6768 4105 6766  
+1437 3663 3665 3661 1952 6783 6788  
+1438 1422 2297 2330 4093 4100 2354  
+1439 865 3665 3669 6792 10423 1952  
+1440 5380 3409 3245 5985 10117 6292  
+1441 4578 1602 4582 8559 8558 8195  
+1442 1802 2482 2483 4459 2003 2509  
+1443 3089 3090 3744 5657 6947 5658  
+1444 3181 5350 3793 10056 4058 10057  
+1445 2532 2270 2531 4557 4556 4559  
+1446 2533 4921 962 3331 4057 4561  
+1447 4920 4908 2260 4018 9192 9216  
+1448 976 5664 4617 6540 3918 10676  
+1449 1416 4912 4910 9200 2345 2343  
+1450 3205 663 5362 10080 4848 7074  
+1451 1582 2494 2495 4482 4532 9476  
+1452 2517 1582 2516 2672 9479 4483  
+1453 782 3551 1343 7997 4534 6570  
+1454 2397 1189 4190 7796 1897 4292  
+1455 1532 4343 4342 8092 2570 8090  
+1456 4666 1898 1901 3302 424 8719  
+1457 5205 2808 1537 5097 9773 3318  
+1458 861 3060 3061 5599 6155 1246  
+1459 3063 2434 3064 5606 5603 403  
+1460 543 3073 4634 5623 5614 3252  
+1461 3688 2649 969 9616 6837 4785  
+1462 1899 4664 4661 1465 3301 8714  
+1463 970 3528 1240 7798 7431 6525  
+1464 5250 4665 1905 8729 9862 9861  
+1465 971 4661 4664 1462 8717 8708  
+1466 972 4001 996 7434 1331 7435  
+1467 972 4035 4002 58 7437 1331  
+1468 5698 470 5095 9556 4678 10744  
+1469 4650 142 3987 7409 1405 3287  
+1470 2604 5115 5111 9594 9590 9595  
+1471 5110 706 5489 10334 10333 -1  
+1472 4616 2182 532 9098 707 8621  
+1473 2770 5180 5178 5020 5019 9723  
+1474 532 3710 3711 6882 8612 6881  
+1475 2276 1861 2277 4050 4544 8622  
+1476 1330 2254 2255 4005 3445 4006  
+1477 2246 2247 2245 709 3988 3991  
+1478 1575 2416 2417 4330 4347 4331  
+1479 830 2412 2413 2363 4335 4323  
+1480 2359 4215 1321 7848 2154 1629  
+1481 1053 652 3413 6299 892 870  
+1482 1927 801 1925 3355 3351 4268  
+1483 1508 2892 2893 2911 696 10614  
+1484 2874 981 4004 7441 7440 1485  
+1485 2874 5228 981 7759 1484 5227  
+1486 4237 5620 4006 10588 7444 10589  
+1487 3983 4005 582 282 7400 1065  
+1488 983 1721 1718 8381 1489 14  
+1489 983 1718 4492 8379 2063 1488  
+1490 3861 1271 4202 7165 10503 7456  
+1491 4009 4008 984 7447 7448 7451  
+1492 4232 619 4230 7873 1494 7878  
+1493 2834 5212 4206 9787 7826 9788  
+1494 4230 1367 4232 7877 1492 2244  
+1495 2822 5614 1165 5126 2085 5123  
+1496 987 4017 4016 7467 10532 7464  
+1497 540 5641 3156 8157 1207 10630  
+1498 4903 4028 4899 7488 9173 9181  
+1499 4019 5593 4018 10534 7468 10535  
+1500 1620 2806 3040 5090 5559 5091  
+1501 858 3284 3288 6042 7901 2274  
+1502 3333 3334 3726 6143 6910 6140  
+1503 4421 1638 5652 10652 8259 8244  
+1504 5373 3243 5375 10107 10106 10102  
+1505 5651 3257 2365 6053 10651 10650  
+1506 992 579 2882 5243 7492 7381  
+1507 992 4030 2880 1174 5238 7492  
+1508 2882 1609 993 1509 5242 2724  
+1509 993 1609 4400 10645 4227 1508  
+1510 3286 3282 1395 6034 2301 6038  
+1511 510 4242 1377 7893 5239 7897  
+1512 5594 301 2447 4394 442 10537  
+1513 1922 4032 4033 7494 3350 7496  
+1514 5341 3152 613 865 10038 1866  
+1515 4034 4118 996 7501 7500 7499  
+1516 3537 3533 1865 10496 6542 6534  
+1517 4858 1860 5664 9095 10676 3226  
+1518 1419 2290 2289 4075 4112 4078  
+1519 2525 977 4918 4049 9212 4547  
+1520 2707 2311 1372 9243 4898 9259  
+1521 2321 2816 1274 10592 4145 4139  
+1522 3809 3147 32 7503 -1 7073  
+1523 1000 3148 4037 5773 7506 1226  
+1524 1001 4038 4041 7507 9330 7508  
+1525 4977 4040 1001 850 9330 9329  
+1526 1002 4040 3608 7511 6686 7512  
+1527 3616 3611 952 6690 6698 6685  
+1528 152 3602 3774 6668 7513 844  
+1529 4720 2355 1003 854 8825 8824  
+1530 2627 2615 2616 4717 898 4742  
+1531 2613 1466 1004 4719 4713 2442  
+1532 2133 1005 4042 7516 7515 4861  
+1533 2683 721 5149 4852 9663 3768  
+1534 2685 5531 2684 6756 4854 10413  
+1535 1006 5531 4043 10414 4860 6756  
+1536 1527 4282 1738 7973 4601 2565  
+1537 4358 5252 1551 5394 1979 8122  
+1538 1918 1084 4679 3340 8745 1689  
+1539 4389 980 4388 8176 154 2530  
+1540 3723 4406 898 4241 851 1140  
+1541 1613 4402 4404 8204 2734 2733  
+1542 3947 4044 600 6867 7332 1230  
+1543 2123 2101 1010 9000 3703 1229  
+1544 567 3047 3050 5573 249 1545  
+1545 3047 567 5293 9946 9947 1544  
+1546 5068 2576 3511 6494 9507 9510  
+1547 3504 3505 620 3790 6480 6479  
+1548 1013 3511 5070 6494 682 4645  
+1549 2580 5077 5074 9524 4650 9525  
+1550 4705 1665 4811 3388 9007 3731  
+1551 2666 2657 1052 4802 4818 4799  
+1552 5372 1392 3240 10385 10100 10152  
+1553 4581 1412 4573 2713 8541 6234  
+1554 1040 242 661 85 1604 630  
+1555 1016 635 4172 7761 7760 1603  
+1556 1232 4172 4067 7761 7565 901  
+1557 3857 4048 740 7528 7158 7157  
+1558 1018 4049 1339 7529 7853 7530  
+1559 1018 2226 2225 3951 7530 3949  
+1560 1360 2154 1359 3807 2229 1561  
+1561 2154 1360 1019 632 3805 1560  
+1562 67 5579 4051 10508 756 7533  
+1563 1020 5579 4052 10507 7532 10508  
+1564 4305 524 2369 4236 2512 8133  
+1565 4363 5638 1555 10613 8131 10625  
+1566 1022 4054 1167 7539 7681 7540  
+1567 1022 4128 1990 7680 3481 7681  
+1568 3953 1023 87 799 826 7344  
+1569 1023 869 3781 7020 1262 7344  
+1570 218 4120 3901 7665 7243 1833  
+1571 1156 2853 1024 8312 7244 1617  
+1572 4057 1025 2606 9597 371 7547  
+1573 4057 1026 4058 7548 7547 7546  
+1574 1026 3220 3219 5915 5910 5912  
+1575 2787 3218 3748 6955 6954 5052  
+1576 5367 1976 3196 5867 10090 8821  
+1577 5005 480 4380 8162 2657 5868  
+1578 2430 2431 1571 362 7486 4359  
+1579 2418 5000 830 9376 9374 4320  
+1580 3787 568 2026 1582 1898 7549  
+1581 1744 4060 609 7553 2995 2994  
+1582 2026 568 2025 3552 3551 1580  
+1583 3017 1031 5284 9929 5512 5510  
+1584 1030 2026 2027 9755 2884 1898  
+1585 4756 478 4749 1650 8883 5461  
+1586 3918 4063 611 2868 7276 1258  
+1587 867 256 5182 9727 7557 691  
+1588 1272 797 4007 7446 779 1590  
+1589 1034 2832 4064 2198 7560 1593  
+1590 797 1272 1033 2061 7234 1588  
+1591 2832 2833 1035 5146 5142 1593  
+1592 2821 2826 920 5147 5120 5119  
+1593 2832 1034 2833 5144 1591 1589  
+1594 2820 1155 5048 9469 9468 1831  
+1595 1037 2510 2511 4515 633 636  
+1596 1037 2512 2515 4519 3823 633  
+1597 5047 2509 2510 4512 636 9467  
+1598 1277 1278 1297 2070 2110 2073  
+1599 4205 1281 1038 2076 7823 2079  
+1600 3918 1039 827 5018 1176 7276  
+1601 2176 611 1681 2868 3851 3850  
+1602 1044 661 534 9405 1882 1604  
+1603 635 1016 1040 630 389 1555  
+1604 661 1044 1040 1611 1554 1602  
+1605 4148 1042 4145 7711 1885 2703  
+1606 2794 2793 3039 5064 5557 2705  
+1607 482 1742 1743 2991 2993 6744  
+1608 1501 1433 4300 2377 8014 4233  
+1609 4299 1552 1495 7028 8012 2499  
+1610 534 4151 1188 7723 1882 7724  
+1611 1041 1040 1044 1604 1895 389  
+1612 215 1974 4717 8820 -1 3451  
+1613 2942 4069 1045 560 1615 5363  
+1614 686 4367 2944 8137 8817 10629  
+1615 2941 2942 1045 1613 5361 5360  
+1616 3392 2850 2851 81 6258 6257  
+1617 2853 1156 2852 5183 5182 1571  
+1618 516 2664 2665 4814 5181 4815  
+1619 1048 2841 2848 5161 5176 5159  
+1620 1049 2943 2944 5364 6842 5365  
+1621 5043 2501 5443 9459 10242 4496  
+1622 2499 2940 3225 5358 3901 5359  
+1623 2502 5044 5551 9461 6841 4499  
+1624 2664 1052 2658 4802 825 4501  
+1625 2840 2838 2839 5154 5157 196  
+1626 5045 2741 2502 4964 9462 4498  
+1627 1014 2655 2656 4797 3900 1693  
+1628 4003 1053 96 77 891 7439  
+1629 979 4215 2359 1480 4216 7844  
+1630 4070 1054 38 710 7571 2380  
+1631 5149 572 2684 4854 9663 9662  
+1632 2753 38 37 -1 4988 7571  
+1633 871 1725 1445 2401 2386 2400  
+1634 4322 3635 1512 6740 2126 8052  
+1635 5465 3435 3461 6342 6394 10279  
+1636 1057 736 3620 6702 733 752  
+1637 186 185 1057 689 59 -1  
+1638 4466 3177 3178 5829 8328 8327  
+1639 3163 590 3162 5800 5799 8869  
+1640 2196 2058 4871 3616 9122 3891  
+1641 4735 4734 2030 3558 8854 3563  
+1642 478 5263 4744 9887 1650 3566  
+1643 4745 4746 2039 3580 10702 8874  
+1644 3762 2084 3761 6980 6969 6992  
+1645 2986 2054 5261 9883 9882 5468  
+1646 5143 5141 2674 4834 9651 9650  
+1647 4758 4759 2048 9113 1648 8900  
+1648 2048 5678 4758 10705 1647 8901  
+1649 3011 3000 1588 2430 5500 3622  
+1650 4749 478 4744 1642 8873 1585  
+1651 2044 4754 4755 8892 5457 8893  
+1652 2037 2032 2056 3575 3576 8871  
+1653 3017 1581 3016 5511 5510 6007  
+1654 3061 3065 587 7575 6156 5600  
+1655 4073 158 1066 818 7578 -1  
+1656 968 3064 5423 10202 5608 4366  
+1657 5422 3342 1068 6159 10200 7576  
+1658 4246 1069 4245 1240 7904 7906  
+1659 1067 5422 4072 10201 5609 7576  
+1660 2906 1384 5402 10160 2279 5290  
+1661 3262 3261 1385 5995 5996 5999  
+1662 3254 5394 3252 10148 5978 5983  
+1663 270 1071 271 7135 -1 474  
+1664 269 866 1071 576 474 475  
+1665 1072 4271 4264 7955 8394 7956  
+1666 1726 1453 4499 8392 2416 2417  
+1667 1751 2177 1749 2960 3005 2422  
+1668 1455 2909 2908 5297 1271 5294  
+1669 1752 1074 1753 3012 2423 2432  
+1670 1456 1753 1762 3013 3034 2423  
+1671 4562 1809 3775 7008 6726 6895  
+1672 1779 3585 3586 6633 8465 6634  
+1673 3092 1662 5315 9990 9992 5659  
+1674 1075 3169 4543 5814 3144 3155  
+1675 1276 1982 329 -1 2068 3467  
+1676 1077 923 1207 1370 677 2069  
+1677 623 925 1078 2682 2443 1374  
+1678 925 319 4387 8173 2682 841  
+1679 1217 3664 3660 6781 5686 6789  
+1680 2860 5219 612 367 5199 9801  
+1681 1080 1241 1892 1998 3297 4293  
+1682 4660 967 2813 1870 8706 8703  
+1683 4854 1294 2169 2763 9088 9087  
+1684 472 4993 2819 2762 8234 9361  
+1685 3332 3333 1630 9089 6139 6138  
+1686 4416 4418 1294 3836 8231 2104  
+1687 3328 1631 3331 6136 2768 2769  
+1688 3325 1633 3326 6126 1985 6125  
+1689 1918 1919 1084 3346 1538 3342  
+1690 5358 4391 1592 8744 10072 5872  
+1691 4010 592 4008 1364 7449 10528  
+1692 5433 5591 3366 7455 6206 10222  
+1693 2082 2655 1014 1627 3666 3665  
+1694 2198 2675 2676 4836 3894 4837  
+1695 3207 2661 2845 4809 5168 9621  
+1696 2656 2675 1086 9618 4798 4797  
+1697 1363 3530 5503 2236 2846 6528  
+1698 2119 4823 1090 3743 3740 9030  
+1699 3801 3800 1768 7052 7054 1709  
+1700 2191 4761 4867 8906 3880 10707  
+1701 2089 2218 2088 3934 3677 3935  
+1702 1980 2918 2923 5314 3741 5315  
+1703 1947 4706 5675 10699 10698 8798  
+1704 2679 2677 716 9654 4841 4845  
+1705 1361 1939 4698 8782 3711 2234  
+1706 1092 2078 4782 8951 8957 8963  
+1707 1093 5129 5130 957 1708 9622  
+1708 2668 1093 5130 1707 9625 4827  
+1709 1766 3800 3801 1699 7061 7055  
+1710 2919 2915 2916 5308 2089 5317  
+1711 2748 2747 5169 9702 4977 4979  
+1712 1769 2931 2932 5304 3042 5340  
+1713 2750 5661 2640 3067 3038 10670  
+1714 2049 2971 5259 9878 1770 5421  
+1715 1097 4074 1098 7579 449 1717  
+1716 2377 7 1545 -1 2599 4253  
+1717 4074 1097 5 454 7577 1715  
+1718 3 1098 4 7579 -1 7581  
+1719 1143 758 2875 1808 7649 2889  
+1720 4385 1584 1585 2676 435 8172  
+1721 4730 2021 2020 3544 8847 3542  
+1722 4076 310 1100 2677 8846 -1  
+1723 1867 4623 4621 8634 3239 8635  
+1724 4087 1125 513 3908 7602 7605  
+1725 5559 1102 103 873 1242 10470  
+1726 4089 2772 648 5025 7606 467  
+1727 648 2969 3573 5414 7606 10468  
+1728 1103 4090 1560 1774 8142 7608  
+1729 1653 3713 102 6886 667 6884  
+1730 859 3712 3713 6885 6843 2813  
+1731 227 4077 3153 1735 5782 7580  
+1732 650 4273 2134 7959 3769 1733  
+1733 650 5607 4273 10563 1732 7960  
+1734 228 2134 3788 1153 -1 543  
+1735 1107 3153 4077 1731 545 5783  
+1736 1586 4121 1107 5783 545 2681  
+1737 870 1108 317 184 797 768  
+1738 1587 656 1078 567 8175 250  
+1739 1109 4078 1161 7584 7673 7585  
+1740 4124 1162 4125 7675 7674 7672  
+1741 4182 1236 4180 7776 1993 1743  
+1742 3886 3887 823 7270 7215 642  
+1743 1236 4182 4174 7781 660 1741  
+1744 4183 4184 4181 7785 7778 7783  
+1745 1881 4095 4094 7619 9002 7617  
+1746 3052 1876 5300 3258 9962 3262  
+1747 4189 1113 4079 7587 7586 7794  
+1748 761 3865 3866 7173 7176 7174  
+1749 1967 1740 1958 3420 3419 3434  
+1750 1678 553 1677 619 2862 2042  
+1751 1153 3714 905 7592 7502 6887  
+1752 1625 1624 2947 5373 2756 1135  
+1753 5332 3125 1290 7839 10023 10024  
+1754 2175 1291 2173 3845 3848 9367  
+1755 3977 615 3979 7388 7393 7384  
+1756 511 1923 4686 3352 4449 1127  
+1757 5210 4607 1850 3205 9783 5112  
+1758 1203 4601 1846 8592 8330 1924  
+1759 1699 4476 4475 2707 8346 8347  
+1760 642 5024 3198 9422 2693 9423  
+1761 2685 2686 1120 5321 10413 4856  
+1762 2917 1285 2916 2089 5706 5320  
+1763 2202 2217 2218 3933 3935 3903  
+1764 2090 1120 2921 5321 2087 720  
+1765 2119 4781 2077 8966 3656 3740  
+1766 4793 2087 4794 3676 8973 3673  
+1767 5101 5105 1177 9582 4683 9570  
+1768 2587 5082 804 9533 1362 9534  
+1769 1064 2977 2976 5433 5452 5429  
+1770 2049 5259 2973 9879 3588 1714  
+1771 1125 4088 4623 7604 6746 7605  
+1772 667 3642 1867 8635 2893 3240  
+1773 3532 4097 2126 9660 1781 7622  
+1774 1560 4090 677 597 923 1728  
+1775 1911 4676 4828 8739 3328 3708  
+1776 4809 4826 1881 3268 9002 1777  
+1777 4826 4809 2102 3705 9036 1776  
+1778 1883 4645 4638 8678 8669 8679  
+1779 1436 4263 5150 7940 4858 2382  
+1780 5150 1129 2686 169 9665 7953  
+1781 1127 3532 2126 1773 9004 3753  
+1782 1127 4809 4094 9002 10552 9003  
+1783 452 1868 1131 3241 -1 3242  
+1784 408 2774 1868 3241 271 236  
+1785 4098 1132 291 128 7624 131  
+1786 1132 646 4101 7628 126 7627  
+1787 646 2366 5230 9821 7628 4230  
+1788 4585 3571 1831 6606 8562 8565  
+1789 397 713 4103 21 7634 356  
+1790 3154 1134 651 440 5784 982  
+1791 4092 677 4091 597 7611 7613  
+1792 4107 3527 4626 8641 8640 7641  
+1793 4126 1136 2220 537 3939 7039  
+1794 233 1137 4109 7646 -1 7038  
+1795 3791 1164 2389 4277 4276 7677  
+1796 1990 1847 4607 8604 8603 3199  
+1797 2389 3645 1137 6752 4276 3476  
+1798 1987 667 4722 8828 2892 1850  
+1799 3610 499 5306 9973 6681 6866  
+1800 637 4977 2355 854 9332 9329  
+1801 2448 2447 3683 4394 6828 4393  
+1802 5193 4685 1972 8756 9750 9749  
+1803 4110 1141 735 881 7645 753  
+1804 4003 1141 979 753 7439 7438  
+1805 4416 4417 1628 5117 2104 8232  
+1806 1470 1142 640 4252 2450 1035  
+1807 1691 757 576 3204 2888 1039  
+1808 4621 2875 758 1719 8631 8630  
+1809 3673 2866 2862 643 6808 9805  
+1810 1242 5321 5323 5681 5694 10002  
+1811 4113 1145 4112 7650 7648 4971  
+1812 498 2742 2744 4966 7652 4967  
+1813 2743 3737 2742 6933 4967 940  
+1814 929 4841 2723 9062 715 3815  
+1815 3890 3885 193 718 1094 7221  
+1816 1683 192 191 -1 647 8310  
+1817 2775 585 1032 2869 9728 504  
+1818 255 254 1148 769 5030 -1  
+1819 4115 1149 750 5107 7655 10554  
+1820 2706 393 392 -1 359 7656  
+1821 2569 884 2572 4638 4637 4629  
+1822 4879 4880 2208 3917 9138 9137  
+1823 1862 4883 4882 3914 10678 9143  
+1824 2528 2526 1864 4549 4546 4551  
+1825 5446 5445 3386 6243 6246 10248  
+1826 1152 5443 5445 6244 10246 10241  
+1827 1153 4118 4119 7660 6889 7661  
+1828 3714 1116 4082 7595 7592 4310  
+1829 547 3119 3120 5715 7662 5716  
+1830 3128 3121 933 5724 10026 5719  
+1831 1155 2820 2821 5119 1325 1594  
+1832 2513 2512 1155 9469 5125 9470  
+1833 4068 4120 218 1570 885 7568  
+1834 1047 4069 2850 7569 910 7570  
+1835 2845 2846 2839 5171 5156 5169  
+1836 2843 1684 5215 9793 2874 2876  
+1837 2672 5140 5138 9644 9640 9645  
+1838 4463 4464 2673 4833 8322 2879  
+1839 3223 3173 2034 6271 5920 5077  
+1840 4122 1159 4123 7670 5815 7669  
+1841 590 4742 4738 8868 5800 8869  
+1842 2800 1160 2799 3562 5076 350  
+1843 3823 3811 282 -1 7098 7097  
+1844 3346 1161 3823 7097 7076 10207  
+1845 747 3353 3354 6181 6180 2923  
+1846 4125 2638 711 6602 156 4763  
+1847 3346 5426 5428 10209 10210 1188  
+1848 3359 3358 3360 6189 6194 6192  
+1849 2205 3643 4126 6747 7676 6748  
+1850 2389 667 1987 1798 3476 4277  
+1851 2822 4206 1284 6204 5123 5122  
+1852 1165 2825 2824 5127 5124 10574  
+1853 3944 638 3945 7328 770 7679  
+1854 4371 4370 1563 806 993 8146  
+1855 2878 1349 482 2987 5237 1892  
+1856 4128 1167 641 3472 7680 7681  
+1857 3906 5580 63 10509 -1 10510  
+1858 846 1168 647 582 7789 1215  
+1859 3780 1169 812 7254 7018 1860  
+1860 1169 3780 2776 1147 1033 1859  
+1861 1170 3526 1694 6521 2895 668  
+1862 655 3954 5585 1264 10520 8344  
+1863 1171 1962 1961 599 483 3425  
+1864 1961 610 1960 3423 483 1274  
+1865 1172 339 338 -1 38 1329  
+1866 336 3152 5341 1514 10039 5780  
+1867 4131 84 83 -1 7684 796  
+1868 1173 649 1890 3285 500 7686  
+1869 4655 1894 4653 8693 8692 10684  
+1870 967 5209 2813 2585 1682 9781  
+1871 4136 5526 3621 624 7696 7695  
+1872 1176 4137 4138 7698 1881 -1  
+1873 143 4132 4133 7688 1879 849  
+1874 2593 5099 5098 4681 9558 9565  
+1875 2583 5072 5079 9514 4663 9515  
+1876 5102 2598 5088 4664 9543 9577  
+1877 5109 5113 2585 4695 -1 9586  
+1878 2596 2603 3796 7044 4680 479  
+1879 143 4133 4137 7698 -1 1873  
+1880 2600 5107 5105 9582 4686 4688  
+1881 1176 4138 4140 7699 7703 1872  
+1882 1044 534 1188 1610 1895 1602  
+1883 4146 1185 4147 7714 7716 2210  
+1884 4145 2472 1182 523 1885 7712  
+1885 4145 1182 4148 7717 1605 1884  
+1886 1191 4151 4152 7724 8177 134  
+1887 5608 4149 4150 7719 1901 10565  
+1888 1598 1351 4221 7857 7856 8192  
+1889 4200 3416 737 2054 7815 2045  
+1890 4146 4397 1598 2706 2210 7713  
+1891 1643 1928 949 3363 2792 2612  
+1892 1349 2878 1350 5235 2046 1855  
+1893 4221 1350 1185 5235 7856 7858  
+1894 1188 1184 4148 7718 7717 7723  
+1895 1041 1044 1188 1882 7710 1611  
+1896 1240 4190 4189 7796 7795 7797  
+1897 4190 1241 2397 4293 1454 1997  
+1898 1030 3787 2026 1580 1584 7031  
+1899 2024 2023 2025 3547 3552 2557  
+1900 1191 4388 1699 9751 8346 8177  
+1901 4150 492 5608 10564 1887 8345  
+1902 3414 2466 3700 6861 4428 612  
+1903 1193 2467 2466 6861 2695 9433  
+1904 542 2360 4216 4217 10581 4218  
+1905 5028 2466 1593 612 9430 2695  
+1906 1910 3790 5670 10782 7037 3323  
+1907 1195 42 4042 452 7516 577  
+1908 2608 2607 1195 700 4701 4704  
+1909 1288 4797 5595 876 8976 8979  
+1910 2091 2092 4448 8294 3684 2842  
+1911 3078 1198 3076 1121 578 7071  
+1912 2521 2522 714 909 4537 4536  
+1913 5035 4637 1879 9985 10735 9441  
+1914 3075 3079 1199 3250 743 5629  
+1915 798 5667 3080 8652 3243 10682  
+1916 3072 543 3070 4543 5619 3252  
+1917 5609 1831 2180 2617 10566 8563  
+1918 1554 682 4360 8125 8128 3169  
+1919 5174 5175 2763 9715 5007 9713  
+1920 3374 3373 3375 6220 6224 3504  
+1921 2001 5435 3699 10226 6092 6222  
+1922 4728 4727 2018 3536 3538 8841  
+1923 4599 4600 1844 3193 2858 8588  
+1924 4599 4601 1203 1758 8587 2858  
+1925 2284 2286 1414 2337 4066 4065  
+1926 3500 1311 3499 6470 6469 9079  
+1927 2317 2318 1413 2323 2257 4133  
+1928 1544 4937 2310 4114 8115 4115  
+1929 4250 1273 4249 7911 2062 5282  
+1930 1280 1283 923 7733 1003 2082  
+1931 621 1207 1210 1936 1944 772  
+1932 1480 1729 3378 1938 6230 2470  
+1933 5333 1214 523 1945 10025 5733  
+1934 1478 657 1474 2459 1394 2471  
+1935 1295 2011 2014 3524 2969 2108  
+1936 4157 1210 1207 1931 1370 7734  
+1937 4502 4158 1210 1393 7735 8398  
+1938 3378 1729 4502 2965 8399 1932  
+1939 935 4159 4503 1940 8840 7737  
+1940 4503 4159 1212 5736 8400 1939  
+1941 5334 4158 4504 7736 8402 10027  
+1942 4159 4160 1213 1943 7738 7737  
+1943 4160 4210 1213 7837 1942 7740  
+1944 621 1210 1214 1945 1059 1931  
+1945 523 1214 1210 1944 1393 1933  
+1946 2018 2019 4162 7744 3538 3537  
+1947 4210 4357 1546 9085 10579 7834  
+1948 1731 4728 4503 8840 8405 8841  
+1949 2798 2797 2796 3534 5071 5075  
+1950 3660 3655 3662 6785 5686 6772  
+1951 5325 5324 1218 6771 10011 10010  
+1952 865 3661 3665 1437 1439 6784  
+1953 3107 3103 5325 10010 10428 10007  
+1954 4943 2313 4945 9266 9265 2353  
+1955 1219 3656 3657 6774 6769 4107  
+1956 1420 2298 4928 4095 4068 2350  
+1957 2338 2333 1549 4162 4164 9299  
+1958 3550 1221 652 6299 6568 7748  
+1959 4164 4165 1222 9864 7747 7745  
+1960 895 2953 5251 5385 7749 1314  
+1961 99 4164 4166 7747 -1 1026  
+1962 4708 3361 1950 6195 3405 8803  
+1963 663 3810 1225 7072 1966 7074  
+1964 2109 709 2106 1209 3719 8802  
+1965 4812 2681 5147 4849 9659 9008  
+1966 663 1225 1223 132 524 1963  
+1967 2541 1225 964 7072 4577 4576  
+1968 246 2610 4168 491 -1 4707  
+1969 1226 2610 2609 4708 4706 491  
+1970 2436 2437 465 -1 4371 4373  
+1971 2439 2441 698 4369 1057 4376  
+1972 3467 1319 3466 2150 6405 6409  
+1973 3521 3464 1308 3466 6511 2128  
+1974 5421 861 3340 890 10199 10198  
+1975 772 5301 5303 5586 1067 5585  
+1976 753 2957 2958 1978 9817 5392  
+1977 4280 519 4281 7978 2564 8121  
+1978 2958 2957 1231 4591 9866 1976  
+1979 1551 1738 4358 2562 1537 4594  
+1980 528 2473 1232 10542 7565 4442  
+1981 1017 4046 4045 7524 7521 7522  
+1982 2473 2472 2471 4440 4437 4442  
+1983 875 4713 1966 3438 4435 8811  
+1984 3303 3304 3591 6083 3512 739  
+1985 3326 2005 3325 6646 1688 6088  
+1986 2618 2623 877 2185 4724 1277  
+1987 2062 2997 2996 651 5477 5472  
+1988 1236 4173 4175 7763 1989 660  
+1989 4175 4178 1236 7776 1988 7767  
+1990 4176 574 4177 7768 7771 7766  
+1991 1528 4283 4338 7980 2560 2561  
+1992 846 2876 777 8078 535 725  
+1993 4182 4180 1111 641 7780 1741  
+1994 647 4188 4186 7787 7789 7792  
+1995 4184 4185 4187 1216 7791 7784  
+1996 1240 630 3999 680 7431 7795  
+1997 4190 4191 1241 1998 1897 7797  
+1998 1241 4191 1892 7799 1681 1997  
+1999 1080 2395 2397 4288 4293 4291  
+2000 3677 3678 960 5693 6816 6815  
+2001 1660 5314 3090 5660 5655 9988  
+2002 2328 4960 959 4166 9293 9295  
+2003 2483 2485 1802 4201 1442 4461  
+2004 5549 2353 3682 4189 6826 10450  
+2005 4958 2342 2328 9295 4152 9292  
+2006 4252 1402 4256 7925 2065 2312  
+2007 2490 5663 2489 10674 4472 4475  
+2008 789 1246 21 391 464 926  
+2009 1246 664 3921 7281 393 926  
+2010 699 5565 3732 3906 595 10481  
+2011 3733 1557 4365 2622 8136 6924  
+2012 3891 1248 788 705 1100 7224  
+2013 3130 1248 59 7224 295 5738  
+2014 553 1263 1249 2016 1199 2042  
+2015 1259 4980 4197 9336 2034 7810  
+2016 1251 1249 1263 2014 2018 1130  
+2017 3415 1253 491 2043 6302 11  
+2018 1263 1253 1251 2023 2016 2043  
+2019 2358 1252 4979 9333 170 2020  
+2020 2358 4194 1252 6198 2019 999  
+2021 672 1251 1252 9333 6197 1130  
+2022 1741 491 1739 138 2988 6302  
+2023 1250 1251 1253 2018 2032 9334  
+2024 3641 1256 4193 7802 7800 2028  
+2025 4200 4196 1264 7808 2045 7816  
+2026 1255 3415 4193 6303 7807 11  
+2027 4200 4197 1258 9336 7816 7815  
+2028 3641 1349 1256 2209 2024 2987  
+2029 1264 1256 1187 2209 6304 7808  
+2030 4198 1257 4194 7804 7803 9819  
+2031 2877 5229 1262 7814 5233 5232  
+2032 1253 4195 1250 9335 2023 1418  
+2033 1258 4195 4196 7805 7816 7806  
+2034 1269 1259 4197 2015 7809 6714  
+2035 4800 2094 4801 3690 2055 3687  
+2036 3625 803 3626 6712 2037 7811  
+2037 3625 3626 1260 8986 6713 2036  
+2038 1261 3625 3622 6713 2039 1414  
+2039 1261 3622 4199 6707 9820 2038  
+2040 4199 3629 1262 10524 7814 7813  
+2041 5340 2877 940 5233 10037 10035  
+2042 1678 1263 553 2014 1750 2861  
+2043 1253 1263 491 2861 2017 2018  
+2044 4222 3421 1187 6304 1419 7859  
+2045 1264 3416 4200 1889 2025 6315  
+2046 1349 1350 1187 1419 2209 1892  
+2047 1267 3422 3423 6316 6312 6317  
+2048 2791 1929 2793 1420 5065 5061  
+2049 1933 1266 1930 409 3366 2215  
+2050 2478 5036 1931 9445 4450 3368  
+2051 1269 3417 3418 6306 6309 6307  
+2052 1643 3784 4431 7025 2612 7026  
+2053 2478 1496 4506 2978 2501 4451  
+2054 3417 737 3416 1889 6305 6307  
+2055 4800 4801 947 8987 8984 2035  
+2056 2835 3042 2557 9936 2550 5149  
+2057 1521 4331 4330 2554 1218 8069  
+2058 5612 4201 984 7448 10572 10573  
+2059 3861 5576 198 -1 7166 10503  
+2060 2833 1272 592 779 5145 5144  
+2061 1034 1033 1272 1590 5144 605  
+2062 1401 4250 4249 1929 7916 7913  
+2063 983 4492 2896 8380 2371 1489  
+2064 5623 1403 3697 6855 6853 10595  
+2065 4256 1274 4252 7917 2006 2356  
+2066 3194 1408 4958 9292 9291 2311  
+2067 4953 2326 4957 9289 4153 4146  
+2068 1277 1276 329 1675 2073 855  
+2069 923 1077 1276 3467 1003 1676  
+2070 1278 328 1297 1369 1598 -1  
+2071 1277 1038 1280 2076 855 2110  
+2072 2782 1297 1279 1369 2078 5044  
+2073 1277 329 1278 -1 1598 2068  
+2074 327 1375 4204 2261 -1 2075  
+2075 1375 327 1374 2259 2258 2074  
+2076 1281 1280 1038 2071 1599 2082  
+2077 1208 4157 1283 7733 6229 7734  
+2078 1279 739 2782 34 2072 1283  
+2079 4205 4285 1281 7984 1599 7825  
+2080 4611 1856 1857 65 8611 8610  
+2081 4611 4285 1282 7825 1002 3220  
+2082 1280 1281 1283 2083 1930 2076  
+2083 657 1283 1281 2082 2459 690  
+2084 1284 5431 4208 10217 10576 10218  
+2085 2822 1165 2823 5124 5121 1495  
+2086 2922 2910 2915 5298 5309 5323  
+2087 2090 2921 2928 5335 5334 1764  
+2088 1286 2910 2911 5296 3043 5298  
+2089 2919 2916 1285 1762 5316 1710  
+2090 1851 5168 4371 9700 8145 9701  
+2091 4209 1287 2743 4969 4968 8143  
+2092 4795 2088 2087 3676 8974 3675  
+2093 1288 4795 2091 8974 8979 8975  
+2094 5615 4212 1289 5728 10578 2601  
+2095 4211 1289 3125 5728 5727 832  
+2096 2405 938 4852 9083 2102 4309  
+2097 2406 1290 2404 1400 4307 10023  
+2098 2173 2402 2172 829 3842 3845  
+2099 4415 1626 2175 950 3849 2757  
+2100 4408 899 4407 8213 1319 1321  
+2101 2174 807 2175 3849 3848 8225  
+2102 4852 2166 2405 4303 2096 3831  
+2103 2168 2171 2172 3841 3843 3834  
+2104 4416 1628 4418 8235 1686 1805  
+2105 1621 2708 2399 3837 2750 4900  
+2106 2464 1481 2463 2473 4423 7988  
+2107 3373 1296 1482 2475 6219 3504  
+2108 4726 2011 1295 1935 8836 2109  
+2109 1482 2011 4726 2108 8837 2475  
+2110 1277 1297 1038 5044 2071 1598  
+2111 2137 1300 342 -1 7 9  
+2112 1298 4836 1299 3776 6 9051  
+2113 2611 1299 749 3776 6913 7841  
+2114 347 4213 719 1022 52 7840  
+2115 1301 262 1302 -1 501 496  
+2116 1298 343 1300 -1 9051 0  
+2117 260 1302 261 -1 -1 501  
+2118 3425 5567 5454 10486 6320 959  
+2119 2206 4874 4875 9128 7872 684  
+2120 5066 2783 5192 5922 9748 9503  
+2121 3224 5237 5369 9835 5255 5923  
+2122 1305 3815 3816 7083 5792 1297  
+2123 3160 3158 1305 2532 5792 10046  
+2124 3814 3813 1306 7001 7080 626  
+2125 4850 2165 4849 3828 9078 3829  
+2126 4322 1512 4323 8054 8056 1634  
+2127 3474 3462 3463 6396 6399 2131  
+2128 3521 3463 3464 6398 1973 6512  
+2129 1319 5480 3469 6416 2145 10315  
+2130 5463 3436 5466 10288 10287 2146  
+2131 3462 3474 724 6420 6397 2127  
+2132 3440 1316 3462 6396 2144 6413  
+2133 3482 1310 3485 6435 6442 6429  
+2134 1204 3499 3770 6470 656 553  
+2135 5493 3498 3499 6468 553 10341  
+2136 3564 1312 5515 10383 6592 -1  
+2137 5154 2693 887 9081 9672 2696  
+2138 5491 3497 1314 114 10335 6417  
+2139 1983 3473 5482 10320 10319 6411  
+2140 5483 3475 1309 6426 10321 6344  
+2141 5482 1308 3472 6415 10319 6513  
+2142 3476 5485 5500 10325 6514 10326  
+2143 3475 3474 5485 6419 6422 10323  
+2144 3462 3439 3440 6350 2132 6351  
+2145 1319 3469 3465 6401 2150 2129  
+2146 5463 3438 3436 10280 2130 10282  
+2147 3442 2143 3441 6441 6352 422  
+2148 1056 3598 3597 6660 10284 6657  
+2149 3429 2766 3428 6328 6326 6336  
+2150 1319 3465 3466 6403 1972 2145  
+2151 3773 3568 1983 6600 10489 7004  
+2152 1838 4594 607 392 3183 8578  
+2153 3472 5480 5569 10316 7005 6416  
+2154 1321 2360 2359 4219 1480 4217  
+2155 2188 4866 1323 5094 3875 9111  
+2156 5717 2535 2536 4564 10781 7036  
+2157 2809 5207 2810 2581 2580 9777  
+2158 5668 1906 4672 8731 3296 9107  
+2159 1324 2894 2895 5268 5278 2365  
+2160 2901 2902 1425 9319 5281 2364  
+2161 503 2240 2249 3976 9182 1025  
+2162 4026 4020 4029 7472 7491 3994  
+2163 2240 2244 1327 9177 3979 60  
+2164 1328 2245 2238 3974 4020 3988  
+2165 597 3547 2234 1167 3967 6561  
+2166 4896 2238 4897 9170 9169 3973  
+2167 2261 2252 2251 79 4000 4021  
+2168 1329 2250 2263 2170 4025 3999  
+2169 2253 2246 2250 3990 3999 2172  
+2170 2251 2263 2250 2168 3998 4001  
+2171 2429 1426 2428 4037 4352 1183  
+2172 2253 479 2246 3991 2169 2174  
+2173 1573 2410 4998 9371 2655 4317  
+2174 2253 2254 479 2809 2172 4005  
+2175 502 4767 2620 8918 8341 8919  
+2176 2617 2618 2621 4724 2183 4721  
+2177 4766 2612 5117 9599 8916 4711  
+2178 2624 1335 2626 4739 4734 4737  
+2179 1031 3016 3018 5462 9926 5510  
+2180 5680 4762 2053 3610 10708 4940  
+2181 1334 5680 2729 10709 4712 4940  
+2182 1337 3552 2633 3499 9602 6571  
+2183 2617 2621 1336 4751 4722 2176  
+2184 3600 5119 2622 4730 4732 6575  
+2185 2623 2626 877 4731 1986 4734  
+2186 3306 3308 1234 6151 3503 6087  
+2187 487 1998 4724 8832 1395 3498  
+2188 795 1994 1995 3486 3494 3489  
+2189 1485 2785 207 -1 7993 5050  
+2190 1339 723 1340 2191 972 2480  
+2191 723 4220 1340 2192 2190 7854  
+2192 2505 1340 4220 2191 4504 4502  
+2193 1341 2506 2507 4506 4510 4507  
+2194 2726 2727 3728 3734 6915 4934  
+2195 1487 723 1486 587 2482 7854  
+2196 2506 1342 3551 6569 4506 7855  
+2197 4291 4292 1487 7998 2483 7996  
+2198 2832 517 4064 514 1589 5143  
+2199 3276 5410 5408 6028 6022 10176  
+2200 2096 4802 3296 8989 8996 3694  
+2201 2635 3217 2067 5909 4758 3636  
+2202 3804 3022 1757 5520 7063 7062  
+2203 1346 1986 4722 2892 8336 3474  
+2204 4469 758 1691 2889 8333 8632  
+2205 2659 3207 917 5168 4805 5889  
+2206 5129 2671 1347 5167 9623 9622  
+2207 3646 234 3645 6752 6751 6754  
+2208 1985 1167 1353 528 2217 3472  
+2209 1187 1256 1349 2028 2046 2029  
+2210 1598 1185 4146 1883 1890 7856  
+2211 1352 1265 3421 6314 7859 3372  
+2212 4224 1186 1929 1420 7863 8191  
+2213 4223 1352 4222 7859 2214 8770  
+2214 4223 4222 1350 1419 7858 2213  
+2215 4692 1266 1933 2049 8771 7861  
+2216 1348 1353 235 528 -1 49  
+2217 1985 1353 1138 6753 3471 2208  
+2218 2812 2811 1538 3808 5102 2583  
+2219 2230 1534 4892 9158 9161 8106  
+2220 4227 277 276 -1 7868 146  
+2221 4225 1355 668 1413 7864 7866  
+2222 4225 1705 1356 144 7865 7864  
+2223 831 3923 3924 7285 7288 7286  
+2224 1358 4228 275 -1 10526 7871  
+2225 2363 1357 1358 751 2227 4225  
+2226 275 3989 5589 10527 10526 171  
+2227 2363 1358 945 6718 4224 2225  
+2228 2456 289 288 -1 4408 116  
+2229 1359 669 1360 2230 1560 4409  
+2230 669 1488 1360 2378 2229 205  
+2231 1432 4981 1434 118 9339 9338  
+2232 882 4696 1936 8779 1288 2238  
+2233 1941 4704 4699 8794 8787 8795  
+2234 1361 1943 1939 3382 1705 3393  
+2235 4775 4777 1363 8952 2846 8935  
+2236 5505 5503 3530 1697 2855 10365  
+2237 2379 1670 1673 8304 2852 3671  
+2238 882 4694 4696 3374 2232 8774  
+2239 4701 1935 4695 3375 8777 8788  
+2240 5522 1365 727 4274 10397 6670  
+2241 4229 1365 1303 6670 7870 3784  
+2242 3203 2455 4182 7781 7780 4406  
+2243 3366 4232 4233 7877 6205 7878  
+2244 4230 4231 1367 7884 1494 7874  
+2245 4235 4488 5619 8371 10587 7883  
+2246 518 5618 3863 7881 1170 10584  
+2247 3203 3204 5361 5884 10079 2702  
+2248 1369 2756 5173 9711 8276 556  
+2249 4438 2458 1369 4990 8276 8275  
+2250 2790 845 1747 2997 3000 7892  
+2251 666 1723 4498 8390 5058 2953  
+2252 2347 2348 2349 4195 4197 4192  
+2253 2290 1418 2288 2346 4075 2347  
+2254 2293 2325 1373 7930 4085 2368  
+2255 4934 2307 4936 9248 9247 4082  
+2256 1429 4260 4257 7933 2366 7934  
+2257 1413 4927 2317 4073 1927 9229  
+2258 1375 1374 880 30 2260 2075  
+2259 327 326 1374 1284 2075 -1  
+2260 1375 880 4609 8607 8605 2258  
+2261 4204 1375 1279 1283 7824 2074  
+2262 614 2880 1376 2263 1339 5238  
+2263 1376 2880 1377 5239 1237 2262  
+2264 2364 1379 4242 7898 7897 2268  
+2265 4241 4240 1377 185 7893 7896  
+2266 1378 4241 4243 2269 2267 7896  
+2267 3376 1378 4243 2266 7900 10230  
+2268 2364 3291 1379 6043 2264 1239  
+2269 858 4243 4241 2266 7895 7899  
+2270 4243 4244 1380 7903 7900 7899  
+2271 3376 4303 1498 5269 1123 6226  
+2272 5436 1722 4495 2950 8385 10227  
+2273 926 1715 3367 2373 8384 2936  
+2274 858 3291 3284 6057 1501 6043  
+2275 3590 799 5621 860 10591 2280  
+2276 475 3281 3280 6033 6642 10179  
+2277 1386 3256 3257 5988 10650 2281  
+2278 799 3260 3261 5995 860 5986  
+2279 1389 2906 5402 1660 10161 5291  
+2280 799 3590 3289 6644 5989 2275  
+2281 3256 1386 5392 5987 10141 2277  
+2282 1396 3210 3212 2302 2303 10181  
+2283 991 5384 3251 10124 2791 10125  
+2284 3249 5387 5384 2290 5972 10131  
+2285 5377 3255 5395 10147 10146 10109  
+2286 4421 1388 4423 8246 8245 8259  
+2287 4429 1386 4427 8253 8258 10142  
+2288 2904 4247 1398 6638 5287 5286  
+2289 1427 2905 2903 5284 5280 407  
+2290 5387 3246 5384 10124 2284 5966  
+2291 5398 5372 3241 5955 10101 10152  
+2292 5418 3323 1632 6134 10193 10192  
+2293 3258 5386 3259 10126 10159 5959  
+2294 3295 3294 800 5990 6066 6061  
+2295 1245 3404 3380 10232 4184 2310  
+2296 3238 3236 3578 5947 6620 5951  
+2297 4529 1773 4528 3051 8451 3055  
+2298 3229 2095 3012 10713 5502 3077  
+2299 4525 4527 874 2428 8444 2434  
+2300 3281 1396 3279 1122 6033 5895  
+2301 1395 3287 3286 6055 1510 6046  
+2302 3211 3212 3210 2282 5894 5897  
+2303 3213 1396 3212 2282 5899 1122  
+2304 1621 2400 2401 4299 4908 2750  
+2305 1641 3214 3698 5902 8252 5903  
+2306 1070 3587 3588 6639 7908 5965  
+2307 4251 4249 1398 5287 7912 7916  
+2308 3254 5395 3587 10147 5965 5982  
+2309 3246 5379 3251 5976 10124 5967  
+2310 3404 1245 5449 6233 10254 2295  
+2311 1408 3194 3195 5864 9305 2066  
+2312 4252 4253 1402 2314 2006 7918  
+2313 5622 4250 4252 7913 7917 10593  
+2314 1402 4253 4255 7920 7922 2312  
+2315 4254 1404 4256 7926 7925 9285  
+2316 5450 3407 5451 6288 10258 10256  
+2317 3405 3593 1411 2332 6284 6649  
+2318 2326 4955 4956 9286 9289 4150  
+2319 2320 1406 2318 4135 4134 4140  
+2320 959 2338 2337 4171 4155 4174  
+2321 2323 2324 3193 5862 5861 9283  
+2322 1912 2319 3193 4136 9241 4137  
+2323 2319 1413 2318 1927 4135 4098  
+2324 3696 1275 5623 10594 6853 5863  
+2325 1407 3406 3405 6649 5865 6283  
+2326 1408 4965 2342 4183 9292 9305  
+2327 2327 4958 4959 4152 9290 9291  
+2328 2344 4970 4969 9316 9308 9313  
+2329 2352 2487 5689 10726 9328 4469  
+2330 3674 3677 2339 6816 2608 6810  
+2331 2333 4963 2332 9301 4162 9302  
+2332 3593 5520 1411 10393 2317 10394  
+2333 3381 5439 5438 3122 6282 6236  
+2334 3248 5520 5381 6286 5968 10393  
+2335 4581 5519 5663 8196 10675 8556  
+2336 1205 2296 2295 4087 3330 4090  
+2337 1414 2286 2287 4071 4088 1925  
+2338 2294 1420 2285 9233 4067 2352  
+2339 2284 1415 2283 823 4065 191  
+2340 4923 1415 2285 191 9222 9221  
+2341 4948 2315 4949 4129 9274 9272  
+2342 4913 1426 2269 639 9201 4354  
+2343 4914 4912 1416 1449 9203 4036  
+2344 4917 2281 1415 823 9210 9209  
+2345 2273 1416 4910 1449 4033 4042  
+2346 2287 2288 1418 2253 4072 4071  
+2347 4925 1418 2290 2253 4079 5382  
+2348 1417 2282 2281 4063 9206 9275  
+2349 2307 4935 1419 9246 9318 4082  
+2350 1420 2296 2298 4091 1956 2352  
+2351 4945 2314 2529 4041 4096 4126  
+2352 1420 2294 2296 4087 2350 2338  
+2353 2313 4943 4931 9262 9238 1954  
+2354 2298 2297 1422 1438 4094 4091  
+2355 2331 2354 1422 4161 4100 4207  
+2356 4256 2323 1274 4145 2065 7926  
+2357 2900 1324 5240 5278 9842 5274  
+2358 4259 2348 2291 4194 7932 7931  
+2359 2350 1425 4972 9319 2360 5276  
+2360 4973 2350 4972 2359 9322 9321  
+2361 2899 2898 2900 5274 5279 2367  
+2362 5011 2432 962 4362 4363 4328  
+2363 2427 2413 2412 1479 4322 4353  
+2364 2902 2901 2903 5280 5285 2160  
+2365 2896 2894 1324 2159 5270 2945  
+2366 4257 4258 1429 4149 2256 7928  
+2367 2898 2899 533 7927 5275 2361  
+2368 2325 2293 2311 4084 4148 2254  
+2369 4260 4261 1430 6893 1085 7934  
+2370 2790 1724 1370 9256 5059 8391  
+2371 2897 983 2896 2063 5272 8388  
+2372 3367 1431 857 304 6207 2373  
+2373 1431 3367 1715 2273 96 2372  
+2374 2368 1433 4984 9343 4237 8005  
+2375 2366 524 4364 8133 858 383  
+2376 1489 4294 544 9341 2488 8001  
+2377 4296 4300 1433 1608 8005 1356  
+2378 1488 1434 1360 632 2230 2379  
+2379 1434 1488 4982 2486 9339 2378  
+2380 4262 1054 4070 1630 7572 7937  
+2381 4262 871 1436 2382 26 7938  
+2382 1436 871 4263 7939 1779 2381  
+2383 572 1435 1436 26 4858 9662  
+2384 1437 4263 1438 7939 2414 7940  
+2385 2919 2920 5242 9846 9845 5316  
+2386 1445 1438 871 7939 1633 2387  
+2387 1445 4265 1438 7941 2386 946  
+2388 3634 4266 1446 4417 2393 6731  
+2389 4501 1726 4500 2416 8395 3855  
+2390 2459 2460 552 7946 2402 4415  
+2391 1440 2461 2462 4418 8518 4419  
+2392 4264 1439 4500 7942 8394 7944  
+2393 1446 3632 3634 6727 2388 2403  
+2394 4553 1443 4572 8538 3135 8501  
+2395 4540 4542 1464 3154 8474 2441  
+2396 703 3686 5626 6830 10601 6833  
+2397 1814 4572 4570 8539 3133 3135  
+2398 4549 1443 4548 8501 8491 8502  
+2399 1798 4555 4556 8505 8510 2409  
+2400 1725 871 1055 7938 9708 1633  
+2401 2457 1445 1725 1633 2957 4411  
+2402 2457 2459 552 2390 4411 190  
+2403 3632 1446 1440 4419 6729 2393  
+2404 3685 1448 3684 1145 6829 8271  
+2405 1794 4562 2462 8518 4421 8519  
+2406 811 4438 1649 9710 8272 8275  
+2407 4435 1647 4437 8273 2803 8270  
+2408 527 2883 2889 590 2800 5245  
+2409 1798 4554 4555 8503 2399 3103  
+2410 5231 3113 2884 5703 2799 9824  
+2411 3746 5235 3745 9831 6948 3116  
+2412 1659 5232 2885 9828 5673 9825  
+2413 3744 481 3745 6946 6949 5657  
+2414 4271 1437 1438 2384 7955 7954  
+2415 4271 1453 4272 7958 7957 8392  
+2416 4499 4500 1726 2389 1666 8393  
+2417 1726 2179 1453 813 1666 2959  
+2418 1073 2907 2908 1271 3856 5292  
+2419 1094 2911 2909 5296 7058 5302  
+2420 1764 1455 2907 1271 5293 2421  
+2421 4523 1455 1764 2420 8440 7059  
+2422 1751 1786 2177 3079 1667 3009  
+2423 1753 1456 1752 3010 1669 1670  
+2424 1459 4519 4522 8428 8466 3015  
+2425 1782 4538 3397 3059 8469 8470  
+2426 1457 4517 4518 8429 3120 2429  
+2427 4516 1457 1753 3013 3012 2429  
+2428 4531 874 4527 2299 8449 3070  
+2429 4516 4517 1457 2426 2427 8427  
+2430 3001 1588 3000 1649 5478 5485  
+2431 3022 3023 1756 8435 5523 7062  
+2432 1074 1752 1787 3008 3032 1669  
+2433 5646 1602 4398 8553 2712 3701  
+2434 1772 4527 4525 2299 8447 8448  
+2435 1810 1461 4563 8520 2437 3050  
+2436 1815 1465 1750 3007 3136 3143  
+2437 1791 1810 4563 2435 8521 3088  
+2438 1749 1750 1463 3082 3005 3004  
+2439 1601 1969 1824 3439 3157 3441  
+2440 1789 1465 2475 4446 8480 8476  
+2441 1788 4542 4540 2395 8475 8478  
+2442 1466 2613 1467 4714 2445 1531  
+2443 623 1078 1466 4748 2445 1677  
+2444 1467 531 1991 1114 1249 4714  
+2445 623 1466 1467 2442 6210 2443  
+2446 539 2022 4277 7968 10562 1015  
+2447 1469 2949 4274 5376 1154 5378  
+2448 4276 1469 4275 1154 7964 5379  
+2449 794 1585 2950 5377 7966 435  
+2450 1471 1470 640 1806 516 7970  
+2451 4278 660 3963 7362 1306 8  
+2452 4279 640 1098 449 7971 516  
+2453 1 660 1471 8 7972 9153  
+2454 4171 1472 632 2457 7758 380  
+2455 1230 2958 5252 9866 9865 5395  
+2456 1237 4175 4176 7766 10608 7767  
+2457 632 1472 4284 7981 640 2454  
+2458 3716 1474 1201 7983 6891 1394  
+2459 657 1281 1474 7984 1934 2083  
+2460 1857 512 2645 4776 3219 65  
+2461 4286 1475 1479 4781 7986 7985  
+2462 1993 795 3372 6217 6211 3489  
+2463 1475 2644 2646 4775 2466 2963  
+2464 2654 1998 1477 3495 4794 8832  
+2465 1998 1483 1997 3496 3495 6223  
+2466 1475 2646 2647 4779 4781 2463  
+2467 1480 1478 4286 7985 2469 2471  
+2468 1479 2647 4287 4780 4425 4781  
+2469 2464 1480 4286 2467 7986 4424  
+2470 1480 1209 1729 2964 1932 4424  
+2471 657 1478 1480 2467 6230 1934  
+2472 1481 4287 1482 7987 8837 7988  
+2473 2463 1481 1295 8836 8839 2106  
+2474 1482 1202 4288 7989 6219 7987  
+2475 1482 1296 2011 3523 2109 2107  
+2476 1483 4288 4289 7989 3496 7990  
+2477 1476 1995 1997 3491 7992 2962  
+2478 207 3848 4290 7142 7993 594  
+2479 469 3601 3561 10395 -1 6666  
+2480 723 1339 1485 5050 587 2190  
+2481 4064 4065 617 2590 7560 7559  
+2482 1486 4066 1487 7563 2195 7564  
+2483 4291 1487 517 7563 7995 2197  
+2484 4220 1487 1342 7998 7855 7854  
+2485 2456 4293 669 205 4409 791  
+2486 1488 544 4982 9340 2379 2488  
+2487 1490 1489 653 1378 450 8001  
+2488 544 1488 1489 8000 2376 2486  
+2489 1604 2837 653 450 2491 64  
+2490 2836 4295 1490 8002 5153 2981  
+2491 3607 1604 653 2489 6678 6677  
+2492 1491 2638 2637 4764 5150 948  
+2493 1492 4295 4297 8003 8006 8004  
+2494 4296 2368 4983 4235 9342 8005  
+2495 4298 1493 4511 8010 8416 2496  
+2496 4298 4299 1493 8013 2495 8009  
+2497 556 3356 5429 6186 10214 1355  
+2498 1736 4509 5657 10663 10662 8413  
+2499 4691 1552 4299 1609 8011 8261  
+2500 1495 3785 1501 2511 8014 7028  
+2501 2478 4506 1732 2970 3368 2053  
+2502 948 1933 1931 3366 9445 3371  
+2503 515 4452 4454 2847 8776 8300  
+2504 4792 2077 4791 8966 2844 3656  
+2505 1069 2906 3743 5288 8020 5290  
+2506 5239 5436 3376 6225 1123 9839  
+2507 5411 4401 1613 8202 2734 6036  
+2508 2711 1620 2710 2748 4906 8218  
+2509 1802 2487 2482 4457 1442 10726  
+2510 704 4398 4579 8553 4473 3141  
+2511 1501 3785 4304 7027 8023 2500  
+2512 1501 4305 2369 1564 4233 8023  
+2513 1502 4307 4306 8028 8123 8025  
+2514 4359 1553 4305 912 8024 2614  
+2515 3784 4432 5572 8264 10495 7026  
+2516 2792 3222 4432 2708 8263 5062  
+2517 2760 365 364 -1 904 5002  
+2518 1605 1505 1504 2520 572 476  
+2519 1505 796 5338 10033 8030 476  
+2520 366 1504 1505 2518 1116 106  
+2521 1506 296 4156 7732 461 136  
+2522 4313 4317 1507 8047 8038 8037  
+2523 4319 1836 4316 8043 3178 9418  
+2524 4316 4314 1507 8038 3178 8039  
+2525 4320 1508 4317 8045 8044 893  
+2526 554 4483 4481 8361 9837 8362  
+2527 3199 1510 5358 5872 10073 5055  
+2528 2453 5024 1972 9423 4403 4392  
+2529 4477 2788 5359 10075 10074 8349  
+2530 4678 980 4389 1539 8179 9753  
+2531 4321 4322 1511 8056 8053 671  
+2532 3158 3694 1305 7081 2123 669  
+2533 3919 1517 25 341 416 7278  
+2534 3639 3640 5710 10767 10329 6346  
+2535 3400 3637 129 6734 5826 6736  
+2536 3639 3635 3776 6733 7011 6740  
+2537 3400 2142 3175 2539 6273 5826  
+2538 3598 3599 5458 6662 10271 6659  
+2539 4874 3175 2142 2537 9128 9127  
+2540 3596 1318 3438 960 6347 6656  
+2541 1516 3175 5347 3785 10265 5825  
+2542 3426 3427 5458 6327 10272 1194  
+2543 2959 1517 828 7278 10775 5396  
+2544 4329 4326 4328 8065 8060 8066  
+2545 5026 4332 1522 2552 9426 907  
+2546 5634 2228 2229 3955 10616 10617  
+2547 3577 2229 3180 3956 5836 6618  
+2548 573 5057 3117 9486 6616 9487  
+2549 4327 718 4325 915 8059 8067  
+2550 2835 2557 3941 7321 7319 2056  
+2551 3942 1523 5213 9790 9789 7322  
+2552 4332 4334 1522 10618 2545 8072  
+2553 5026 114 1518 8058 907 9427  
+2554 4331 718 4330 8067 2057 8073  
+2555 1521 2835 5213 4609 8069 5148  
+2556 4729 4336 311 -1 8843 8842  
+2557 2024 745 2023 3548 1899 8850  
+2558 1525 5187 5186 9738 5743 1045  
+2559 5186 5189 2780 5039 441 5056  
+2560 4179 1528 4338 1991 8082 7774  
+2561 4282 4283 1528 1991 7977 2565  
+2562 4358 1738 519 7973 8121 1979  
+2563 1527 2553 4053 7537 7535 4601  
+2564 5630 4280 4281 1977 7976 10609  
+2565 4282 1527 4283 7979 2561 1536  
+2566 1529 4340 4341 8086 7022 1261  
+2567 3781 606 4055 7541 1262 2575  
+2568 1530 4341 1531 8087 9059 8088  
+2569 3782 4349 1533 2576 255 7023  
+2570 1532 4342 4347 8089 8107 1455  
+2571 5637 485 4345 3299 8096 9058  
+2572 4842 2159 783 2579 9063 3812  
+2573 4844 2160 4343 3819 8090 3816  
+2574 1536 1534 4350 8106 8105 4261  
+2575 606 3781 3782 7021 255 2567  
+2576 1533 4349 1536 8104 8105 2569  
+2577 507 4595 2382 3185 4264 8580  
+2578 2443 2444 5016 4386 9408 4383  
+2579 2159 4351 783 6238 2572 3817  
+2580 2809 2810 1537 5100 5097 2157  
+2581 5207 1536 2810 5098 2157 9778  
+2582 1531 4839 2155 10623 360 9056  
+2583 2812 1537 2811 5100 2218 9773  
+2584 485 4343 4344 8097 3299 8092  
+2585 5209 2812 2813 5102 1870 9782  
+2586 1539 4081 4352 7590 7151 1336  
+2587 2393 561 3727 6912 459 7150  
+2588 1916 2104 806 2755 540 3338  
+2589 4677 3852 1540 936 8740 3335  
+2590 4065 1541 617 1366 2481 7562  
+2591 658 3848 4353 601 8112 7142  
+2592 5155 2312 2707 4120 4899 9675  
+2593 4356 575 5155 9675 9674 7885  
+2594 4615 2181 997 6535 8619 8618  
+2595 1860 4616 4615 8620 6541 8621  
+2596 4937 4936 2308 4113 9250 9249  
+2597 4356 4354 1542 7445 8117 8113  
+2598 6 1097 1545 2599 -1 454  
+2599 1097 2377 1545 1716 2598 438  
+2600 4853 4357 472 9361 8120 9085  
+2601 938 4212 5615 2094 9083 7838  
+2602 5405 3249 5388 5972 10133 10166  
+2603 4805 4806 5404 8997 10164 8994  
+2604 1205 2300 2305 4099 4092 3330  
+2605 2336 1549 2331 4160 4159 4164  
+2606 4962 1550 2333 4165 9299 6811  
+2607 2354 2332 1220 9301 4163 4207  
+2608 1550 3674 2339 2330 4168 6809  
+2609 2335 3720 3670 6900 6780 4169  
+2610 2550 1551 2555 4595 4605 4594  
+2611 2547 2549 1007 2982 1054 4589  
+2612 1928 1643 4431 2052 8262 1891  
+2613 1552 3784 3785 2793 7028 7025  
+2614 1553 4359 4361 8124 8126 2514  
+2615 4360 1556 4364 858 8134 8125  
+2616 1554 4361 4362 8127 8036 8128  
+2617 682 2180 1831 1917 6606 3169  
+2618 1704 4483 5638 8362 10625 2913  
+2619 674 4310 4311 8029 10612 8032  
+2620 2881 1556 682 8125 5240 2621  
+2621 2881 5230 1556 9821 2620 9822  
+2622 4365 1557 212 548 8135 2011  
+2623 1557 676 1558 10777 29 6924  
+2624 3736 3731 3734 6919 6927 6931  
+2625 214 2117 1973 3736 695 3448  
+2626 3386 4367 3735 603 6246 6245  
+2627 1558 5715 2117 3735 3448 10777  
+2628 1560 4368 4369 911 8142 8141  
+2629 1560 4107 4106 7642 7635 923  
+2630 348 1561 349 456 -1 932  
+2631 1915 1561 705 7152 3337 90  
+2632 2156 1562 645 257 3810 160  
+2633 3524 1562 734 160 6515 2635  
+2634 522 1562 1563 2635 806 257  
+2635 1563 1562 3524 2633 993 2634  
+2636 4373 4372 360 -1 1006 8147  
+2637 2370 1564 742 2641 4238 84  
+2638 1565 4433 1647 8265 8270 8266  
+2639 1565 4435 3877 8269 7196 8270  
+2640 4373 805 3966 7368 1317 8149  
+2641 1564 4373 742 1317 2637 8147  
+2642 1567 4170 4374 7756 8156 7757  
+2643 4377 1569 4375 8153 8152 2646  
+2644 696 2441 2440 4376 8150 4379  
+2645 1568 3155 3156 5788 8157 5787  
+2646 1569 4377 4378 930 2647 2643  
+2647 4378 4379 1569 8154 2646 8159  
+2648 4018 540 4016 10533 7465 8158  
+2649 4021 4019 4020 7470 7473 7475  
+2650 4022 4023 4024 7479 7481 7476  
+2651 4022 1573 4027 7477 7487 7481  
+2652 2418 4999 2416 9373 4331 9374  
+2653 5010 5002 2422 9382 9396 9395  
+2654 1331 2409 2410 7041 7483 3332  
+2655 4998 2430 1573 7477 2173 9372  
+2656 2422 5004 842 9384 9396 4342  
+2657 4380 1574 5005 9385 1577 8155  
+2658 5350 2417 978 4330 10056 4332  
+2659 2420 5002 2419 9379 4336 9380  
+2660 3189 504 3188 5852 5851 5854  
+2661 5001 1028 5003 9381 4339 4350  
+2662 1577 166 3865 411 837 1000  
+2663 738 2157 4384 2664 9072 9066  
+2664 1578 4384 2157 2663 4921 8169  
+2665 1578 2719 2720 4925 8166 4921  
+2666 3650 3651 5354 10065 10064 6761  
+2667 5535 3669 3653 6799 6767 10422  
+2668 1580 2059 2028 3556 2670 3619  
+2669 2991 2992 478 3566 5461 5460  
+2670 2028 2029 1580 5513 2668 8853  
+2671 4736 2032 4743 8871 8870 8859  
+2672 2519 2516 1582 1452 4532 4525  
+2673 2493 2494 541 4527 4481 4480  
+2674 2111 5038 2493 9449 9656 3724  
+2675 5037 2724 2492 4930 4478 9447  
+2676 1584 643 1585 2678 1720 224  
+2677 310 1584 1100 8172 1722 1014  
+2678 4087 1585 643 2676 7603 5377  
+2679 513 2949 2950 5378 7602 1112  
+2680 1586 3164 3161 5804 5798 119  
+2681 4121 1586 691 5798 7666 1736  
+2682 4387 1078 925 1677 1678 8175  
+2683 319 318 1587 1373 8173 -1  
+2684 3008 1758 5269 9899 9898 3075  
+2685 2010 3269 3268 6013 6008 6010  
+2686 5015 661 2442 216 9406 9405  
+2687 4390 1590 4389 8179 8178 5355  
+2688 2938 626 1927 4269 3359 8181  
+2689 1917 4679 4678 2691 8743 8745  
+2690 1590 2938 1917 5354 8743 5355  
+2691 4679 1591 4678 8742 2689 8183  
+2692 2786 1592 1084 3340 5049 970  
+2693 5358 642 3198 1760 10073 10072  
+2694 4393 471 5028 9431 9430 8186  
+2695 5028 1193 2466 1903 1905 9431  
+2696 2695 2693 5154 2137 9673 4873  
+2697 4395 5645 1596 10638 8184 10639  
+2698 5152 1594 1596 2700 8189 9667  
+2699 753 5227 2542 562 343 4579  
+2700 4392 1596 1594 2698 1276 4866  
+2701 3797 2468 4187 1324 7790 5034  
+2702 1111 3204 3203 2247 7780 10571  
+2703 4149 1042 4148 1605 7718 8193  
+2704 4396 1598 3039 2706 5556 8192  
+2705 2793 2794 1600 5068 5065 1606  
+2706 4397 3039 1598 2704 1890 8194  
+2707 4476 492 4475 8345 1759 5067  
+2708 3222 1644 4432 8264 2516 5919  
+2709 1826 2100 1825 3064 3156 3159  
+2710 4534 1772 4526 8447 8446 8450  
+2711 1075 1819 4577 8548 3158 3144  
+2712 4398 1603 5646 10640 2433 10389  
+2713 1412 5439 4573 10234 1553 3122  
+2714 3581 1393 3580 6624 6623 6631  
+2715 285 2854 286 5186 -1 5187  
+2716 2758 2759 2854 5000 5187 4998  
+2717 670 2373 1606 4242 1117 1092  
+2718 1605 1606 4399 10643 2720 1117  
+2719 5647 548 1616 2739 10780 8197  
+2720 1605 4399 1607 8198 2722 2718  
+2721 1607 825 1608 2723 485 8198  
+2722 796 1605 1607 2720 5812 476  
+2723 1609 1608 825 2721 2725 2724  
+2724 2882 1608 1609 2723 1508 5243  
+2725 825 1611 1609 8199 2723 1173  
+2726 4400 5648 1610 10644 8200 10645  
+2727 3589 3280 3285 6045 6044 6642  
+2728 3292 2364 993 7493 4227 6039  
+2729 5716 4399 5647 10643 10780 10779  
+2730 1611 1009 1612 2731 1322 2740  
+2731 1613 1612 1009 2730 2733 8202  
+2732 1612 4401 3589 8201 6641 8202  
+2733 4402 1613 1009 2731 2735 1541  
+2734 1613 4404 5411 8208 2507 1541  
+2735 4403 4402 1009 2733 8203 8206  
+2736 4405 5156 1614 8207 8210 2737  
+2737 4405 899 5156 9676 2736 8213  
+2738 1616 1617 4403 2742 8203 2739  
+2739 1617 1616 548 2719 8212 2738  
+2740 1009 1611 1616 10642 8203 2730  
+2741 4988 5649 548 8212 9352 9351  
+2742 1617 4405 4403 8210 2738 8205  
+2743 1622 4410 4412 8215 2751 8222  
+2744 1622 4856 4411 9091 8222 9092  
+2745 1619 4411 2171 2752 2746 8221  
+2746 1619 2171 2806 3840 8217 2745  
+2747 2708 2709 3040 5559 5558 4900  
+2748 1620 2709 2710 4903 2508 5559  
+2749 2169 808 2168 3834 9088 4901  
+2750 2399 2400 1621 2304 2105 3839  
+2751 4989 1622 4412 2743 8224 9093  
+2752 1292 2171 4411 2745 9091 3841  
+2753 3822 2374 4989 1136 9354 7095  
+2754 2374 4990 1623 8226 1136 9356  
+2755 2947 806 2104 2588 3710 5373  
+2756 2947 4414 1625 8228 1752 5372  
+2757 1626 4415 4083 8230 9368 2099  
+2758 1625 4415 4413 8229 1135 8230  
+2759 4083 1625 1115 8228 7594 8230  
+2760 5690 2404 4996 4306 10729 4307  
+2761 2166 2167 1293 3835 4303 1399  
+2762 2390 2819 4993 1684 9362 4279  
+2763 2170 2169 1294 1683 3836 4296  
+2764 1216 2017 2015 3530 5070 3535  
+2765 2378 1630 4418 8236 8235 6139  
+2766 1628 5211 2378 6146 8235 9785  
+2767 3332 2378 3335 4255 6145 6139  
+2768 3331 3327 3328 6128 1687 6137  
+2769 1631 3328 3329 6131 6142 1687  
+2770 3320 3321 1633 3533 6125 6113  
+2771 3319 1083 3316 3695 6107 6114  
+2772 2798 936 3226 3531 3510 5074  
+2773 2012 936 2014 3529 3524 5369  
+2774 3315 1083 3591 6645 6083 3695  
+2775 1637 5203 5202 9770 2781 9768  
+2776 4425 4419 1636 2778 2777 8249  
+2777 4423 4425 1636 2776 8245 2779  
+2778 1636 4419 4420 8238 8241 2776  
+2779 4425 4423 1640 2786 8250 2777  
+2780 809 3330 3324 6121 8239 6135  
+2781 5202 4422 1637 8242 2775 9767  
+2782 3263 5405 5403 10167 10163 6001  
+2783 3299 3250 5388 10133 10132 5974  
+2784 1639 3215 2401 5905 6909 4300  
+2785 3725 3726 5650 10648 8248 6907  
+2786 4423 4426 1640 6858 2779 8246  
+2787 1640 3698 4424 6857 8250 6858  
+2788 1641 4426 4428 8251 2789 8252  
+2789 4428 4429 1641 8258 2788 8256  
+2790 5652 3264 4430 8260 10653 10652  
+2791 5390 991 3251 2283 10136 6072  
+2792 4432 1643 949 1891 8263 7026  
+2793 3785 3784 1043 10495 7027 2613  
+2794 1600 3037 2791 5060 5065 2796  
+2795 1644 1503 4307 8028 10494 5919  
+2796 3038 3037 1600 2794 5552 2797  
+2797 3038 1645 3037 5553 2796 8355  
+2798 5329 3113 1646 9824 5704 10019  
+2799 5231 2884 2883 5247 9823 2410  
+2800 2889 2890 527 5259 2408 5257  
+2801 1448 5628 4267 7947 10600 10604  
+2802 1648 5628 4436 10604 2805 10605  
+2803 4435 4437 683 8277 8269 2407  
+2804 1649 4439 4437 8277 8274 8278  
+2805 1649 1648 4436 2802 8272 8274  
+2806 34 3876 4440 7195 -1 2807  
+2807 34 3875 3876 7193 2806 349  
+2808 2247 2951 3572 5381 9179 3992  
+2809 2258 479 2254 2174 9190 5380  
+2810 3020 5282 3004 9924 3627 9925  
+2811 3271 2009 3274 10175 6016 6014  
+2812 751 3692 5552 10456 10455 6845  
+2813 859 5558 3712 5416 1730 10467  
+2814 250 1654 251 420 -1 1096  
+2815 2068 1654 787 7682 3637 480  
+2816 789 20 3377 6227 448 464  
+2817 2869 2871 790 1105 5216 5215  
+2818 762 3095 3096 5668 5641 2822  
+2819 3101 3100 588 5677 5678 5680  
+2820 5225 2869 2870 5216 5219 9814  
+2821 2868 2872 1657 2828 5213 2829  
+2822 3095 762 3087 2824 5652 2818  
+2823 2885 2887 3106 5690 5689 5248  
+2824 762 3083 3087 5644 2822 2826  
+2825 5233 5232 2884 9826 5246 9828  
+2826 762 3082 3083 5640 2824 9998  
+2827 3084 1660 3087 5651 5644 5650  
+2828 1657 2872 3081 5223 508 2821  
+2829 5223 2872 2868 2821 5214 9810  
+2830 3398 5322 3102 10006 6269 5647  
+2831 3093 5546 3105 5687 9993 10443  
+2832 2537 1801 2483 4461 4460 4570  
+2833 5318 3091 3092 5659 9997 9996  
+2834 3673 3667 497 9809 6807 6794  
+2835 1661 2872 3393 5222 5645 5223  
+2836 4704 1946 4811 9007 9006 3399  
+2837 2112 844 2491 4476 3721 3727  
+2838 4442 1666 45 1285 8285 8287  
+2839 4442 1668 4445 2845 8287 686  
+2840 1667 4442 4443 8285 8295 8283  
+2841 1672 43 4451 8298 8292 -1  
+2842 679 2092 2091 1910 8971 3683  
+2843 616 1666 4445 8287 8772 1172  
+2844 4791 2085 4792 8968 2504 10710  
+2845 4445 1668 4693 8288 8772 2839  
+2846 5503 4775 1363 2235 1697 10361  
+2847 1673 4454 4452 2503 2848 2853  
+2848 4452 4453 1673 2852 2847 8301  
+2849 4452 1934 4693 1287 8773 8300  
+2850 4444 1667 4450 8284 8297 8283  
+2851 4449 44 1672 -1 8292 8282  
+2852 1673 4453 2379 8303 2237 2848  
+2853 4774 4454 1673 2847 8304 8932  
+2854 5503 4774 2069 8936 10361 10360  
+2855 5505 3530 5504 6529 10363 2236  
+2856 4702 1942 4701 3389 8789 8791  
+2857 1674 5505 5712 8305 10772 10365  
+2858 4599 1844 4601 8591 1924 1923  
+2859 5653 304 3978 7391 7390 10655  
+2860 673 1679 1677 2862 1380 2864  
+2861 1678 491 1263 2043 2042 138  
+2862 1679 1678 1677 1750 2860 2863  
+2863 1678 1679 1739 2865 138 2862  
+2864 1680 1679 673 2860 1316 345  
+2865 1679 1114 1739 8418 2863 1315  
+2866 673 1039 2176 3850 1316 1177  
+2867 1680 896 1957 3417 345 338  
+2868 4063 1681 611 1601 1586 7558  
+2869 1964 1032 585 1817 509 3432  
+2870 3996 2787 955 7428 7425 7424  
+2871 3190 3189 1682 10069 5853 5860  
+2872 1683 981 4171 7759 1031 7441  
+2873 4457 1683 4456 1031 8308 8310  
+2874 2842 2843 5215 1836 9794 5162  
+2875 4460 3903 1685 564 8315 593  
+2876 2847 1684 2843 1836 5172 8314  
+2877 4461 1686 4460 8316 8315 4835  
+2878 5216 5143 560 8318 4828 9795  
+2879 4464 4463 1687 8319 10657 1838  
+2880 4462 1688 4466 8327 168 123  
+2881 3695 1687 3178 8328 5832 8321  
+2882 2196 2211 4465 8325 8320 3890  
+2883 2212 2213 3177 3925 5830 3922  
+2884 2059 1030 2027 1584 3556 7555  
+2885 3019 5283 3018 9926 5515 9927  
+2886 4474 569 3954 7346 8344 4743  
+2887 1689 3025 3028 5528 7556 5529  
+2888 1691 576 1692 2890 8333 1807  
+2889 758 1143 1691 1039 2204 1719  
+2890 4467 1692 576 2888 153 1043  
+2891 3786 1692 495 1043 7030 8335  
+2892 4722 1986 1987 3473 1798 2203  
+2893 4622 667 1867 1772 3239 8828  
+2894 1744 1694 836 6521 2994 1196  
+2895 655 1170 1694 1861 896 10520  
+2896 5286 609 3028 5535 5534 9933  
+2897 4472 4471 1695 521 8337 8340  
+2898 4473 4472 1690 9932 8339 8342  
+2899 2620 1333 2619 4726 558 8918  
+2900 5100 5092 2592 -1 9568 9567  
+2901 5696 5090 2590 10742 4671 10741  
+2902 3455 3453 3454 6378 6381 3803  
+2903 3451 3458 3453 6369 6379 6388  
+2904 2788 1699 5194 9751 5054 8349  
+2905 4476 4477 1700 8351 8348 8347  
+2906 4478 1701 3038 5555 5554 8353  
+2907 3038 2795 1700 8348 5554 5552  
+2908 4481 4479 1702 5876 8358 8357  
+2909 4482 5368 1703 261 8360 8359  
+2910 1119 5359 3200 5874 8354 10074  
+2911 2893 2892 3201 5878 5877 1483  
+2912 1703 4480 4481 8356 8361 261  
+2913 4482 4483 1704 2618 232 8360  
+2914 5633 5638 554 8362 8051 10615  
+2915 5631 4306 1503 8028 8026 10611  
+2916 1707 1706 4485 8366 8370 6723  
+2917 4486 4824 3360 9032 6193 8367  
+2918 1705 668 4487 8369 8365 7864  
+2919 3630 2122 4824 3745 9033 6722  
+2920 1707 4487 2363 8369 4224 8370  
+2921 3627 3624 945 6711 6716 6709  
+2922 1163 3353 3358 6179 6192 6181  
+2923 5428 3353 747 1845 10210 10212  
+2924 5031 484 5032 9436 4432 8372  
+2925 4489 901 4490 2927 8376 6936  
+2926 2778 2781 900 8377 1150 5041  
+2927 4490 901 4208 10575 8375 2925  
+2928 1711 2781 3391 5042 6938 5036  
+2929 1711 3740 3739 6935 8378 6938  
+2930 1712 3738 3740 6935 6940 1032  
+2931 578 3139 5337 10032 1044 5761  
+2932 3139 834 3138 5754 10737 5760  
+2933 2518 965 2539 4530 757 4526  
+2934 2316 998 4948 9271 9274 5108  
+2935 488 4938 2309 9251 3235 9252  
+2936 1716 1715 926 2273 2938 3440  
+2937 1968 372 1715 96 3440 -1  
+2938 1717 1716 926 2936 2940 2939  
+2939 1716 1717 1720 1376 53 2938  
+2940 926 1722 1717 2941 2938 2950  
+2941 1718 1717 1722 2940 2943 2942  
+2942 780 1717 1718 2941 111 1376  
+2943 4496 1718 1722 2941 2951 8379  
+2944 1719 4496 2894 8386 2945 8387  
+2945 1719 2894 2896 2365 8380 2944  
+2946 1746 1720 780 1376 76 8421  
+2947 4493 373 1720 53 8382 -1  
+2948 1721 4497 1723 8389 2953 14  
+2949 1721 666 1745 2996 8383 2953  
+2950 4495 1722 926 2940 8384 2272  
+2951 4496 1722 625 10227 8386 2943  
+2952 3717 1723 1430 8389 6893 8390  
+2953 666 1721 1723 2948 2251 2949  
+2954 1724 4498 3717 8390 9257 8391  
+2955 4941 2312 4940 4122 328 9260  
+2956 1055 2753 5172 9709 9708 207  
+2957 2457 1725 710 4987 4410 2401  
+2958 3633 1727 4501 8397 8396 8424  
+2959 1726 2178 2179 3854 2417 3855  
+2960 2177 4515 1749 8425 1667 3853  
+2961 1727 2177 2178 3852 8397 3853  
+2962 1476 1996 1995 3494 2477 3492  
+2963 3716 2644 1475 2463 6892 6891  
+2964 1730 1729 1209 2470 2966 493  
+2965 4502 1729 1211 493 8398 1938  
+2966 1730 1209 4505 8404 8401 2964  
+2967 1730 4503 4504 8400 8403 8401  
+2968 1731 4505 2463 8404 8838 8405  
+2969 2017 1295 2014 1935 3530 4422  
+2970 1732 4506 4507 8407 6313 2501  
+2971 5036 3420 948 6319 9445 9444  
+2972 4507 4508 1733 8410 8409 8408  
+2973 947 3418 3419 6308 8982 6309  
+2974 4508 1735 3359 1423 6191 2976  
+2975 2093 1734 4798 8980 8981 1417  
+2976 1735 4508 4509 8411 6185 2974  
+2977 3356 3355 1163 6182 6183 1355  
+2978 1496 5657 4506 8412 2053 8406  
+2979 4510 1737 5429 10214 10213 2980  
+2980 4511 1737 4510 2979 8415 9604  
+2981 2836 916 4295 8003 2490 9605  
+2982 2549 2550 1007 4605 2611 4593  
+2983 1738 2550 2553 4593 4601 4594  
+2984 1740 4512 1114 8418 3420 8419  
+2985 1254 3415 1741 6302 1273 6303  
+2986 1958 1114 1957 1315 3418 3420  
+2987 3641 482 1349 1855 2028 6744  
+2988 1739 4512 1741 4433 2022 8418  
+2989 2469 1740 875 8811 4434 8419  
+2990 1741 2469 1742 2991 1273 4433  
+2991 1742 2469 1743 4434 1607 2990  
+2992 2470 1743 875 4434 4435 4444  
+2993 482 1743 2474 4444 5234 1607  
+2994 4060 1744 836 2894 7551 1581  
+2995 1695 1744 609 1581 9933 1196  
+2996 666 1747 1745 8422 2949 3000  
+2997 1748 1747 845 2250 1060 8423  
+2998 1746 1745 4514 8422 2999 76  
+2999 4514 5121 1746 1213 2998 3003  
+3000 2790 1747 666 2996 5058 2250  
+3001 3873 845 3872 7187 7186 1060  
+3002 374 4513 5121 1213 9607 8420  
+3003 1748 5121 4514 2999 8423 9606  
+3004 1750 1749 486 8425 3136 2438  
+3005 1751 1749 1463 2438 3011 1667  
+3006 486 3775 1815 7008 3136 7009  
+3007 1750 1465 4541 8476 3082 2436  
+3008 1463 1787 1752 2432 3011 3080  
+3009 1786 1751 1456 3010 3078 2422  
+3010 1456 1751 1752 3011 2423 3009  
+3011 1463 1752 1751 3010 3005 3008  
+3012 4516 1753 1074 1669 8426 2427  
+3013 1753 1457 1762 3030 1670 2427  
+3014 1754 4516 1763 8426 8438 8427  
+3015 4520 4519 1459 2424 3069 3016  
+3016 4519 4520 1755 10664 8432 3015  
+3017 4560 1807 4518 3120 8431 8515  
+3018 4521 4536 1781 3049 8436 8434  
+3019 3022 3396 3021 6266 5520 5523  
+3020 1460 4538 3033 5544 5521 3059  
+3021 5124 2641 5123 4765 9611 3040  
+3022 3033 3009 3021 5496 5521 5497  
+3023 3035 3005 3032 5486 5543 3074  
+3024 1759 5270 5272 9901 3628 5488  
+3025 5267 2998 5266 5474 9893 9895  
+3026 5274 3006 5273 5490 9907 9930  
+3027 2007 3311 3312 6098 6108 3514  
+3028 3231 3232 1394 5946 5937 5936  
+3029 3230 1785 3229 5933 5932 3056  
+3030 1457 1807 1762 10672 3013 3120  
+3031 1807 4561 5662 10673 10672 3121  
+3032 1791 1074 1787 2432 3081 3089  
+3033 4563 4524 1763 8439 8521 8520  
+3034 1456 1762 1764 3035 3078 1670  
+3035 1764 1762 5662 10672 8440 3034  
+3036 873 5171 3803 4978 7060 9706  
+3037 3803 3802 1765 8441 7060 7057  
+3038 5163 2750 2640 1713 9691 9690  
+3039 3800 5170 3799 9703 7052 7055  
+3040 2641 5124 2964 9613 4771 3021  
+3041 2746 2737 5164 4956 9693 3602  
+3042 2932 2933 1769 5347 1712 5343  
+3043 2912 1286 2911 2088 5307 5310  
+3044 5198 2803 5245 9852 9851 9762  
+3045 2912 5241 494 5326 5705 9843  
+3046 2802 5201 5197 9765 3651 9766  
+3047 1088 3756 3755 6981 6967 6984  
+3048 1771 4524 4526 8442 8445 8443  
+3049 4525 1781 4536 3018 8467 8444  
+3050 1810 1969 1461 8462 2435 3439  
+3051 4527 4528 1773 2297 8449 8448  
+3052 5518 3584 5517 6632 10388 10390  
+3053 5371 1774 3578 6619 5947 8453  
+3054 3579 3578 3580 6619 6624 3060  
+3055 1773 4529 3237 10099 8456 2297  
+3056 3230 3231 1785 3163 3029 5935  
+3057 1460 3396 3397 6265 3059 6266  
+3058 3401 3013 3234 5943 5942 6276  
+3059 1460 3397 4538 2425 3020 3057  
+3060 1777 3578 3579 3054 5952 6620  
+3061 1828 3238 3239 5945 3162 5950  
+3062 1778 1969 4535 3441 6636 3127  
+3063 1778 3586 4528 6635 8463 6636  
+3064 1825 2100 1601 8464 3157 2709  
+3065 1603 5517 3585 10387 10640 10388  
+3066 1458 3036 3023 5525 4768 5524  
+3067 5661 5122 2640 9610 1713 8514  
+3068 1781 874 4537 8468 6268 8444  
+3069 1459 4521 4520 8437 3015 8434  
+3070 4532 874 4531 2428 8457 8468  
+3071 5660 4532 1775 8457 8458 10669  
+3072 4532 4533 4539 8473 8472 10669  
+3073 5278 5277 1783 1280 9915 9917  
+3074 5271 3005 3035 3023 5548 9904  
+3075 1758 3008 3009 5495 5542 2684  
+3076 3235 1828 5415 10186 5941 5950  
+3077 3229 3293 2095 6065 2298 5933  
+3078 1764 1786 1456 3009 3034 5293  
+3079 1786 1073 2177 3852 2422 5292  
+3080 1788 1787 1463 3008 8477 8475  
+3081 1787 4540 1791 8474 3032 8475  
+3082 4541 1463 1750 2438 3007 8477  
+3083 4541 1789 4542 8479 8478 8476  
+3084 1442 4544 1818 3142 6896 8482  
+3085 3169 1825 1824 3157 5813 3155  
+3086 1790 2475 4544 3142 3145 4445  
+3087 1819 4547 4576 3134 8548 8489  
+3088 1791 1464 1810 3126 2437 8474  
+3089 1763 1074 1791 3032 8521 8426  
+3090 4544 4545 1792 8490 8483 8482  
+3091 1814 4547 4553 8486 3135 8488  
+3092 3775 3633 1440 6729 6726 7009  
+3093 1795 4549 4550 8492 7950 8493  
+3094 4551 703 4550 8495 8494 6833  
+3095 4552 1442 3718 6896 3124 8484  
+3096 4268 703 4267 10601 7948 8495  
+3097 1799 5627 2891 10602 8508 10603  
+3098 2983 2192 2982 5443 5442 5446  
+3099 490 5134 5133 4821 10235 9632  
+3100 1796 5201 5200 5086 10237 9765  
+3101 3031 3029 2195 5931 5540 5536  
+3102 4568 4558 1800 3108 934 8531  
+3103 4554 1798 4568 8531 8530 2409  
+3104 4555 4268 1799 10603 8505 8504  
+3105 3746 1444 4557 6951 8509 8512  
+3106 3110 2538 1804 4569 5697 3109  
+3107 1812 1800 4567 8528 8532 934  
+3108 1800 4558 1804 8511 4569 3102  
+3109 3110 1801 2538 4570 3106 3115  
+3110 2341 3678 3679 4179 10441 6818  
+3111 2484 2481 1244 4203 4462 4455  
+3112 2488 2479 2480 4452 3149 4471  
+3113 2099 1813 2486 4467 4466 8536  
+3114 4559 1804 1444 8511 8512 113  
+3115 1801 3110 3109 5698 4464 3109  
+3116 1450 5235 3746 2411 8509 9832  
+3117 5318 3094 5317 5666 9995 9997  
+3118 5234 5235 2886 9832 5250 9830  
+3119 3089 1659 3088 648 5658 9825  
+3120 1807 1457 4518 2426 3017 3030  
+3121 4561 1807 873 8515 8516 3031  
+3122 5438 5439 1412 2713 10231 2333  
+3123 5516 1392 3239 5953 10386 10385  
+3124 3718 1794 4552 8498 3095 8519  
+3125 3718 1815 1809 7008 6895 3137  
+3126 1824 1810 1464 3088 5813 3439  
+3127 1969 1778 4534 8463 8462 3062  
+3128 4564 1811 5382 10121 10120 3129  
+3129 4565 1811 4564 3128 8523 10233  
+3130 4570 4569 1813 4467 8535 8534  
+3131 1812 4572 4568 8538 934 8539  
+3132 2483 2486 1076 8533 4460 4459  
+3133 4570 4571 1814 8488 2397 8535  
+3134 4576 4547 1500 8537 8546 3087  
+3135 4572 1814 4553 3091 2394 2397  
+3136 486 1815 1750 2436 3004 3006  
+3137 1815 3718 1818 6896 3143 3125  
+3138 3582 1808 3583 6629 6622 8524  
+3139 4573 4574 1817 8543 8541 8540  
+3140 4575 3584 4574 8543 8545 8544  
+3141 4398 704 5519 8196 10392 2510  
+3142 4544 2475 1818 4446 3084 3086  
+3143 1465 1815 1818 3137 4446 2436  
+3144 4543 1819 1075 2711 1674 8481  
+3145 1790 4544 4546 8483 8487 3086  
+3146 4571 2099 1500 3148 8537 8536  
+3147 4582 1826 4577 3158 8549 8559  
+3148 2680 1500 2099 3146 4846 8546  
+3149 2480 1822 2488 4470 3112 4463  
+3150 2344 4967 4966 9310 9311 9308  
+3151 2489 4580 2488 8554 4470 8555  
+3152 1822 2484 2345 10447 4474 4463  
+3153 4966 1409 2343 4185 9312 9310  
+3154 3169 1464 4542 2395 8479 5813  
+3155 3169 1075 1825 3156 3085 1674  
+3156 1826 1825 1075 3155 3158 2709  
+3157 1601 1824 1825 3085 3064 2439  
+3158 1826 1075 4577 2711 3147 3156  
+3159 1826 1602 2100 3701 2709 8559  
+3160 4583 1827 3372 1250 6217 9714  
+3161 2645 5175 4583 9714 8561 4776  
+3162 3239 5397 1828 6069 3061 5953  
+3163 3231 3233 1785 6062 3056 5937  
+3164 77 1829 78 871 -1 780  
+3165 638 4127 1829 773 7328 7679  
+3166 1517 1830 26 375 341 396  
+3167 680 2560 5064 4615 9500 9501  
+3168 4585 294 1832 -1 6607 786  
+3169 682 1554 2180 3858 2617 1918  
+3170 293 4100 4586 7629 888 -1  
+3171 1133 2881 3571 5240 8564 9822  
+3172 1833 118 3927 905 412 924  
+3173 687 3693 4808 6848 544 290  
+3174 160 3345 3750 6164 6959 6165  
+3175 2697 689 2184 830 3867 4879  
+3176 5424 3345 159 6165 10204 10205  
+3177 3343 3344 3753 6965 6964 6160  
+3178 4319 4316 1507 2524 8048 2523  
+3179 2450 5021 5022 9417 4398 4397  
+3180 4593 4592 1838 3184 995 8577  
+3181 4593 4591 1837 875 8577 8576  
+3182 1839 4594 2381 8578 4262 8579  
+3183 1838 607 4110 7647 995 2152  
+3184 1838 4592 2381 8575 8578 3180  
+3185 4595 1839 2382 4262 2577 7849  
+3186 306 1841 1840 1038 -1 3190  
+3187 1849 757 1843 3192 3191 3204  
+3188 1843 1841 759 8589 3191 1038  
+3189 1841 1842 4600 8590 8589 3190  
+3190 1842 1841 306 3186 8585 3189  
+3191 1849 1843 759 3188 3203 3187  
+3192 1843 757 307 203 775 3187  
+3193 1844 4600 4596 8590 8593 1923  
+3194 4601 4602 1845 8601 8592 8591  
+3195 4603 4606 1848 8602 316 8595  
+3196 4468 4467 1203 10661 8330 8332  
+3197 1845 4603 1846 50 8592 8595  
+3198 603 3529 2818 1232 25 6527  
+3199 1847 1990 1989 3482 8600 1796  
+3200 4468 4605 495 3480 8332 8331  
+3201 4085 1848 700 8602 167 8762  
+3202 4689 4688 1926 3357 8765 8764  
+3203 1849 759 4599 8588 10660 3191  
+3204 757 1849 576 8329 1807 3187  
+3205 1850 4607 4604 8604 9855 1757  
+3206 2937 1924 4687 8760 3356 9857  
+3207 707 2743 5168 4969 9701 940  
+3208 593 792 1851 1108 8145 1109  
+3209 169 1852 170 264 -1 4927  
+3210 707 1851 1852 1108 4916 9701  
+3211 1854 1853 322 1233 8606 1234  
+3212 3949 1853 856 1234 7337 7336  
+3213 1855 4608 321 -1 807 3216  
+3214 856 1854 748 3215 1235 1234  
+3215 748 1854 1855 3216 6214 3214  
+3216 1855 1854 4608 8606 3213 3215  
+3217 739 4609 1856 3218 8610 8605  
+3218 1856 4609 4610 8607 1282 3217  
+3219 1857 2645 2643 4777 4773 2460  
+3220 1201 4285 4611 2081 8611 7983  
+3221 582 4614 3984 8616 7400 7402  
+3222 2181 1859 4613 3224 8615 8618  
+3223 4612 1859 4616 8620 707 3224  
+3224 1859 4612 4613 8613 3222 3223  
+3225 997 3535 3536 3227 8619 6538  
+3226 1860 4858 2182 3862 8621 1517  
+3227 3536 3535 1861 4050 10677 3225  
+3228 4882 2210 5665 10679 10678 3919  
+3229 2275 1862 2276 4048 4051 4028  
+3230 4909 2265 2263 4025 4024 9194  
+3231 2181 3821 3533 3861 6535 7092  
+3232 5666 1863 3537 6543 10680 3236  
+3233 1864 4618 4619 8624 8813 8625  
+3234 4714 1971 2528 4550 4546 3443  
+3235 488 2309 2315 4128 7094 2935  
+3236 5666 4618 1863 4052 3232 10681  
+3237 3592 490 5440 10235 4489 6585  
+3238 5138 2670 5135 4823 9635 9648  
+3239 1867 4621 4622 8631 2893 1723  
+3240 667 1164 3642 6745 1772 4277  
+3241 1131 1868 2774 1784 275 1783  
+3242 3832 1868 452 1783 270 7113  
+3243 798 3080 5706 10759 8663 1915  
+3244 4105 107 4104 913 7636 9440  
+3245 4637 4624 798 1120 8663 8662  
+3246 4624 1869 4625 8636 8639 8662  
+3247 4627 4628 1871 8664 8643 8642  
+3248 4631 1872 4632 10683 8649 8654  
+3249 5310 4633 1873 8674 61 9981  
+3250 3080 1199 3079 1914 10759 9980  
+3251 1886 4648 4642 8684 1069 8685  
+3252 543 3072 3073 5624 1460 1916  
+3253 4642 1874 4636 8660 3257 8684  
+3254 4648 2648 1874 3255 8684 3280  
+3255 2648 2650 1874 8660 3254 4787  
+3256 5309 5290 3044 5566 9941 9979  
+3257 1875 4642 4636 3253 5616 8675  
+3258 5307 5300 1876 1746 9960 9975  
+3259 3689 3063 3054 9964 5584 6839  
+3260 3068 3069 1876 9960 281 5615  
+3261 1876 3066 3067 5611 281 3262  
+3262 3066 1876 3052 1746 5570 3261  
+3263 1879 5312 3808 9984 9442 10760  
+3264 5034 2476 107 -1 9440 9443  
+3265 4094 594 4093 7615 7614 7619  
+3266 4640 1880 4639 8667 8666 8665  
+3267 2102 4810 2392 9005 9034 3705  
+3268 1881 4826 4639 3750 7617 1776  
+3269 1174 4666 4667 424 8696 8718  
+3270 2948 1884 2125 3275 3751 3272  
+3271 1883 4640 4641 8668 8680 8669  
+3272 1884 2948 4647 5375 8681 3270  
+3273 5506 2124 4825 3706 9035 9038  
+3274 4648 4646 1887 8683 3280 8685  
+3275 1884 4641 2125 9039 3270 8671  
+3276 971 4670 1901 8720 8708 8726  
+3277 4645 1886 4644 1069 8676 3278  
+3278 1886 4645 4646 8679 8685 3277  
+3279 2651 2648 1887 3280 4782 4789  
+3280 4648 1887 2648 3279 3254 3274  
+3281 2651 2652 1888 4365 4789 4788  
+3282 1888 2433 5013 9401 4784 4793  
+3283 1900 1904 4671 8728 3306 9103  
+3284 3390 2407 4997 4312 9370 6253  
+3285 649 538 1890 9409 1868 192  
+3286 538 5157 5017 9678 9409 9679  
+3287 4650 4649 142 -1 1469 8688  
+3288 5527 4651 598 -1 10408 10407  
+3289 536 4652 1892 3290 7799 8689  
+3290 4654 1892 4652 3289 8691 3298  
+3291 1893 4652 1898 8689 8719 8691  
+3292 1893 4666 4653 8718 8694 8719  
+3293 4655 1174 4656 8696 8699 8692  
+3294 4658 1896 4654 3298 8695 8704  
+3295 2187 1323 2185 3869 402 3875  
+3296 4658 5668 4672 2158 8730 8702  
+3297 1080 1892 1896 3298 220 1681  
+3298 1896 1892 4654 3290 3294 3297  
+3299 4344 4345 485 2571 2584 8094  
+3300 4348 1897 4345 10621 8094 8102  
+3301 3528 1899 4661 1462 8709 6525  
+3302 4661 1901 1898 1456 8709 8708  
+3303 970 4662 1899 3304 6525 8710  
+3304 4662 4663 1899 8714 3303 8711  
+3305 4663 4862 1900 9103 8713 8712  
+3306 1900 4671 4665 8729 8715 3283  
+3307 5669 4670 4665 8726 8716 10687  
+3308 4657 4656 493 9363 10695 3870  
+3309 4669 4668 5507 3312 10368 8725  
+3310 4669 2392 4994 4283 9364 8724  
+3311 3531 1885 2125 3751 10367 10686  
+3312 5507 4668 1903 8727 10369 3309  
+3313 4862 2184 2407 830 886 3866  
+3314 2652 508 3558 4790 6584 4788  
+3315 3558 1904 1889 4313 6584 8728  
+3316 5250 508 2948 5375 5374 9862  
+3317 4864 2185 1906 3320 9107 3868  
+3318 5205 2807 2808 5092 1457 9774  
+3319 4672 1907 5209 9782 9781 5093  
+3320 1906 2185 2807 3869 8731 3317  
+3321 5616 4216 4218 7847 4562 10581  
+3322 2188 1908 3176 5827 9111 4566  
+3323 3790 1910 2970 1241 7035 1906  
+3324 2362 895 2361 4221 88 1314  
+3325 5673 4675 4674 8736 8737 8700  
+3326 5671 2968 1910 1241 10690 4851  
+3327 2392 1882 4825 9035 9034 8724  
+3328 1911 4828 2682 3754 8733 1775  
+3329 2306 1548 4932 4109 9240 4172  
+3330 2295 2300 1205 2604 2336 4089  
+3331 4921 2415 962 4363 1446 9218  
+3332 1331 4919 2409 4011 2654 9213  
+3333 4025 2258 4907 9190 9189 7482  
+3334 1914 2429 2427 4352 4322 4356  
+3335 705 3852 4677 2589 3337 7149  
+3336 697 1915 563 414 1016 90  
+3337 4677 1915 705 2631 3335 8741  
+3338 2104 1916 1540 8740 3709 2588  
+3339 1918 1917 1008 5354 3341 8745  
+3340 1592 4679 1084 1538 2692 8744  
+3341 1923 1918 1008 3339 162 8746  
+3342 1919 1918 4680 8746 3343 1689  
+3343 4683 1919 4680 3342 8747 8750  
+3344 4681 4682 1920 8757 8749 8748  
+3345 5020 722 2448 4393 180 9415  
+3346 1084 1919 4681 8748 5049 1689  
+3347 4683 2477 1921 7392 8753 8752  
+3348 4684 1922 4682 8751 155 7496  
+3349 4032 615 910 199 175 8755  
+3350 4685 1922 4033 1513 7498 8751  
+3351 1008 1927 1925 1482 162 3359  
+3352 4686 1923 4687 8758 8760 1756  
+3353 2937 603 1850 25 5352 3356  
+3354 1118 1848 4689 8764 5353 316  
+3355 801 3529 1925 8761 1482 6526  
+3356 4687 603 2937 3353 3206 6527  
+3357 1926 4688 2477 8763 879 3202  
+3358 5674 5248 1926 8765 879 8759  
+3359 2938 1927 1008 3351 5354 2688  
+3360 2385 626 913 1350 1349 4269  
+3361 1930 1928 1268 8262 3365 8766  
+3362 4224 1266 4223 7861 7860 8767  
+3363 949 1928 1929 3364 5061 1891  
+3364 4690 1929 1928 3363 8766 7863  
+3365 1931 1930 1268 3361 3367 3366  
+3366 1930 1931 1933 2502 2049 3365  
+3367 1932 1931 1268 3365 8769 4450  
+3368 2478 1732 5036 9444 2050 2501  
+3369 1268 4431 4691 8261 8769 8262  
+3370 1932 476 4301 1422 8016 8768  
+3371 3423 1933 948 2502 6319 8771  
+3372 1352 4692 1265 6318 2211 8770  
+3373 1935 1934 515 8300 3375 8778  
+3374 4694 1934 4696 8778 2238 1287  
+3375 4695 1935 515 3373 10771 2239  
+3376 1935 1364 1936 3377 8779 8788  
+3377 1938 1936 1364 3376 3381 3378  
+3378 1936 1938 1937 288 1288 3377  
+3379 1952 1937 725 288 3412 653  
+3380 681 4697 1937 8781 8808 8780  
+3381 1939 1938 1364 3377 3383 3382  
+3382 1938 1939 1943 2234 834 3381  
+3383 1364 1942 1939 8782 3381 3389  
+3384 1942 1940 4698 8783 8782 3390  
+3385 4700 1940 1362 3390 8786 8785  
+3386 1361 2108 2105 3712 3395 3711  
+3387 4788 2083 1362 8786 8960 3657  
+3388 4814 4811 1665 1550 9013 9012  
+3389 4701 1942 1364 3383 8788 2856  
+3390 1940 1942 1362 8791 3385 3384  
+3391 1945 1944 4703 8793 8792 3403  
+3392 1953 1954 50 8804 -1 3410  
+3393 1943 1361 1945 3395 8792 2234  
+3394 1949 1951 4710 976 8806 3408  
+3395 2105 1945 1361 3393 3386 8800  
+3396 1950 1949 4707 3404 8801 663  
+3397 1955 1941 4790 8964 8809 8795  
+3398 1947 4821 2115 9683 8797 9026  
+3399 1955 1946 4704 2836 8795 8796  
+3400 5511 3225 1948 5358 5924 4819  
+3401 5675 1956 2939 3416 10698 3413  
+3402 2081 2200 4785 3898 3663 3899  
+3403 1944 1945 1949 3404 8806 3391  
+3404 4707 1949 1945 3403 8800 3396  
+3405 4708 1950 709 8801 8802 1962  
+3406 4709 51 1950 663 8805 -1  
+3407 4703 1954 725 3412 943 8793  
+3408 1949 51 1951 -1 3394 663  
+3409 4711 1952 49 370 8807 653  
+3410 1953 1952 1954 3412 3392 370  
+3411 1954 1944 4710 8806 8804 8793  
+3412 725 1954 1952 3410 3379 3407  
+3413 5675 4712 1956 8956 3401 3414  
+3414 5675 1955 4712 8809 3413 10699  
+3415 2079 4786 4782 8957 8950 8949  
+3416 4785 2939 1956 3401 8955 8954  
+3417 1959 1957 896 2867 3421 3418  
+3418 1957 1959 1958 1099 2986 3417  
+3419 1967 1958 610 1099 3437 1749  
+3420 1740 1114 1958 2986 1749 2984  
+3421 896 1963 1959 3424 3417 3429  
+3422 787 4129 1960 510 3430 7682  
+3423 610 1959 1960 3424 1864 1099  
+3424 1960 1959 1963 3421 3430 3423  
+3425 1171 249 1962 3427 1863 1098  
+3426 1961 781 1965 3433 1274 599  
+3427 249 694 1962 3428 3425 7750  
+3428 1962 694 3644 6750 925 3427  
+3429 1963 896 1964 3431 36 3421  
+3430 1960 1963 787 3637 3422 3424  
+3431 896 1681 1964 3432 3429 338  
+3432 1032 1964 1681 3431 7558 2869  
+3433 1966 1965 781 3426 10545 3438  
+3434 4713 1740 1967 1749 8812 8811  
+3435 5598 781 4047 10547 7525 10545  
+3436 1966 5598 2470 10544 4435 10545  
+3437 610 1965 1967 8812 3419 1274  
+3438 1965 1966 4713 1983 8812 3433  
+3439 1824 1969 1810 3050 3126 2439  
+3440 1716 1968 1715 2937 2936 1084  
+3441 4535 1969 1601 2439 8464 3062  
+3442 4911 4620 2268 8628 4034 9198  
+3443 4714 4715 1971 3444 3234 8814  
+3444 1971 4715 2259 8816 9187 3443  
+3445 2257 1330 2255 1476 4009 9188  
+3446 2453 1140 2451 4400 158 9413  
+3447 5193 642 2786 970 5051 9750  
+3448 2117 214 1558 8138 2627 2625  
+3449 1973 4716 1974 8818 3451 63  
+3450 1974 1046 2941 5360 8820 8818  
+3451 215 1973 1974 3449 1612 695  
+3452 3935 693 3936 7311 427 7310  
+3453 3930 480 3931 7299 1303 8162  
+3454 550 1975 4718 8819 5914 693  
+3455 4718 4719 1976 7301 8821 8819  
+3456 4720 1977 566 1011 8824 979  
+3457 2388 1977 727 7006 4274 978  
+3458 713 396 4721 8826 486 356  
+3459 750 2814 2242 5106 3982 5107  
+3460 394 1979 395 951 -1 822  
+3461 750 1978 1979 8827 7655 3982  
+3462 2925 2924 1981 5338 5328 5325  
+3463 1122 2217 4886 9152 9151 3933  
+3464 3395 2927 2930 5332 5339 6264  
+3465 2121 5244 3762 9849 6989 9850  
+3466 3469 1308 3464 1973 6401 6415  
+3467 1077 1982 1276 1675 2069 1367  
+3468 3568 3565 3566 6594 6600 6601  
+3469 5162 3749 2067 6956 9688 4947  
+3470 3557 3555 3556 3634 6580 6582  
+3471 1986 1985 1138 2217 3473 430  
+3472 1167 1985 641 3478 1856 2208  
+3473 1986 1138 1987 3475 2892 3471  
+3474 1988 1986 1346 2203 3479 430  
+3475 3645 1987 1138 3473 6751 3476  
+3476 1987 3645 2389 1797 1850 3475  
+3477 1988 3786 1989 7030 230 3479  
+3478 641 1985 1988 430 230 3472  
+3479 3786 1988 1346 3474 7029 3477  
+3480 4605 1989 495 7030 3200 8600  
+3481 1022 1990 702 8603 4212 1567  
+3482 641 1989 1990 3199 7680 230  
+3483 2634 2631 2632 4749 765 4756  
+3484 863 1991 1993 3487 6211 1021  
+3485 2967 1338 2654 4795 4794 4752  
+3486 1477 1995 1994 2188 5412 3491  
+3487 4723 1993 1991 3484 1114 8831  
+3488 1992 2967 1994 5412 3490 5413  
+3489 795 1993 1994 3490 2188 2462  
+3490 1992 1994 1993 3489 8831 3488  
+3491 1997 1995 1477 3486 3495 2477  
+3492 5125 1996 1476 2962 9614 4774  
+3493 4583 1996 1728 4774 8561 8560  
+3494 795 1995 1996 2962 8560 2188  
+3495 1998 1997 1477 3491 2464 2465  
+3496 1997 1483 4289 2476 7992 2465  
+3497 2654 1999 4724 8833 8832 4795  
+3498 1998 487 3375 6224 6223 2187  
+3499 3552 1338 2633 4753 2182 6572  
+3500 3553 4725 3552 8834 6571 6574  
+3501 3554 4822 3553 9028 6573 6576  
+3502 3338 3309 2118 3737 6150 6091  
+3503 1234 3305 3306 6085 2186 3509  
+3504 3373 3374 1296 3525 2107 1920  
+3505 1337 3600 3554 6664 6573 6575  
+3506 1235 3271 3272 6016 6581 6017  
+3507 3271 3749 3270 6957 6014 6017  
+3508 2003 3274 3275 10174 3513 6023  
+3509 1234 3302 3305 3511 3503 6079  
+3510 3226 2016 2798 5075 2772 9860  
+3511 3302 3303 3305 6081 3509 6078  
+3512 3591 2005 3303 6081 1984 6646  
+3513 3275 3300 2003 1278 3508 6025  
+3514 3311 2007 3304 6082 6080 3027  
+3515 3314 3277 1760 10251 6102 3522  
+3516 3317 3318 4807 6111 8991 3518  
+3517 5274 3010 1760 6102 9909 9908  
+3518 2007 3318 3317 3516 6104 6108  
+3519 3268 2063 5406 6009 10169 9894  
+3520 5409 2009 3276 6278 6022 10175  
+3521 5272 3027 3267 5533 3628 9905  
+3522 3313 3277 3314 3515 6103 10177  
+3523 2012 2011 1296 2475 1396 3524  
+3524 2011 2012 2014 2773 1935 3523  
+3525 3374 5435 1296 10225 3504 10226  
+3526 2945 2012 2013 1396 3528 5369  
+3527 2001 3308 3310 6087 6222 6090  
+3528 2945 2013 2004 6086 5368 3526  
+3529 2015 2014 936 2773 5074 3530  
+3530 2014 2015 2017 2764 2969 3529  
+3531 936 2945 3226 5926 2772 5369  
+3532 2390 2796 1629 3534 4279 4278  
+3533 3322 1633 3321 2770 6118 9859  
+3534 2796 2797 1629 4254 3532 1949  
+3535 2018 2017 1216 2764 3537 3536  
+3536 2017 2018 4727 1922 4422 3535  
+3537 2018 1216 2019 3539 1946 3535  
+3538 4728 2018 4162 1946 7743 1922  
+3539 2390 2019 1216 3537 4278 9362  
+3540 4993 4357 1215 7834 8119 9361  
+3541 4731 311 4076 -1 8846 8843  
+3542 4385 2021 4730 1721 8845 8171  
+3543 4277 794 4276 7966 7965 1113  
+3544 745 2020 2021 1721 3546 93  
+3545 2022 3170 2023 5816 3548 1015  
+3546 745 2021 2022 7968 3548 3544  
+3547 2025 2023 1190 5816 3553 1899  
+3548 745 2022 2023 3545 2557 3546  
+3549 4732 2024 568 3552 8848 8851  
+3550 2020 4733 1524 763 1012 93  
+3551 2801 2026 2025 1582 3553 3554  
+3552 2024 2025 568 1582 3549 1899  
+3553 2801 2025 1190 3547 5080 3551  
+3554 2801 5196 2026 9755 3551 9756  
+3555 2028 2027 501 5078 3557 3556  
+3556 2027 2028 2059 2668 2884 3555  
+3557 2030 2028 501 3555 3561 3558  
+3558 2030 4734 2028 8853 3557 1641  
+3559 2029 4734 4737 8852 8857 8853  
+3560 1580 3266 3017 6007 5710 5513  
+3561 501 2799 2030 3564 3557 5076  
+3562 3223 2799 1160 1842 5077 3564  
+3563 4734 4735 1065 8865 8852 1641  
+3564 2030 2799 3223 3562 8854 3561  
+3565 1065 4769 4737 8922 8852 8858  
+3566 478 2992 5263 5463 1642 2669  
+3567 2031 4740 4735 8865 5921 8855  
+3568 2057 1060 4770 3614 8925 3579  
+3569 3173 1160 3172 5820 5821 5077  
+3570 3399 3161 3162 5797 1107 6272  
+3571 3163 2036 4742 3574 8869 5802  
+3572 2035 4741 4739 8866 565 8867  
+3573 1059 4741 2036 3574 3920 8866  
+3574 2036 4741 4742 8867 3571 3573  
+3575 2056 2032 4769 8922 8923 1652  
+3576 2056 4770 2037 8872 1652 8925  
+3577 2038 4770 4745 3614 8882 8924  
+3578 2039 4750 5677 10703 10702 189  
+3579 1060 2057 4771 8926 8876 3568  
+3580 4746 4747 2039 8898 1643 8877  
+3581 4773 2040 4772 4831 8930 8880  
+3582 5676 4747 4748 8878 4830 10701  
+3583 2041 4750 4751 8884 3584 10703  
+3584 4754 2041 4751 3583 8887 8896  
+3585 4752 2978 2042 5432 5434 8889  
+3586 2043 5260 2975 9880 3607 9881  
+3587 2977 2978 2043 5426 5433 5432  
+3588 2974 2049 2973 1770 5425 5437  
+3589 2989 2990 2044 1279 5457 5456  
+3590 2992 2045 3018 5527 5462 5460  
+3591 1064 2988 2989 5454 8895 5455  
+3592 3019 5704 5280 8914 5517 10755  
+3593 2988 2987 2053 3609 3610 5455  
+3594 4763 1334 4768 8920 8911 8910  
+3595 2047 5676 4758 10700 10705 10701  
+3596 4750 4757 1063 8890 8884 189  
+3597 5136 2669 5135 9635 9634 4825  
+3598 4761 4760 2048 8891 8906 3879  
+3599 3227 2980 5699 5439 9698 5929  
+3600 3014 2060 5279 5506 9919 5479  
+3601 2739 5256 2971 9872 9696 9873  
+3602 2746 1767 2737 4957 3041 3886  
+3603 4752 4753 2051 8905 8889 8888  
+3604 2979 2974 2981 5440 5427 5437  
+3605 2052 2964 2965 5408 4958 4771  
+3606 5165 5164 2739 9692 9695 9694  
+3607 2975 2976 2043 5433 3586 5430  
+3608 2729 2730 2065 4950 4941 10709  
+3609 2053 2987 2994 5431 4942 3593  
+3610 2053 4762 2988 8909 3593 2180  
+3611 2993 2045 2990 5459 5458 5514  
+3612 4763 2993 2046 5458 5464 8908  
+3613 2057 2056 2033 8923 9121 8925  
+3614 4770 1060 4745 8874 3577 3568  
+3615 4871 2033 4739 8863 8862 9121  
+3616 2058 4771 4871 8926 1640 8927  
+3617 4772 2058 525 3891 8928 4831  
+3618 4746 2058 2040 4831 8877 8927  
+3619 3116 2059 1580 2668 5710 5709  
+3620 4062 2059 1689 5709 10551 7555  
+3621 2972 2050 3265 5422 6005 5420  
+3622 2999 3000 3011 1649 5501 5476  
+3623 3015 3265 2061 6004 5509 6005  
+3624 3002 3001 2061 5507 9897 5481  
+3625 5281 5266 3011 9892 5500 9922  
+3626 2998 2064 2997 5473 5472 4952  
+3627 1759 3020 3004 2810 5488 10168  
+3628 1759 5272 3267 3521 5487 3024  
+3629 2735 2064 5709 4952 10766 4949  
+3630 2733 2735 2732 9689 4946 4949  
+3631 2625 2729 2731 4941 4945 4712  
+3632 2733 2734 2064 5473 4949 4948  
+3633 1652 3269 3270 6012 10171 6013  
+3634 3556 3555 1984 6663 6577 3470  
+3635 2635 1984 5118 4740 9601 6577  
+3636 3217 2635 1335 4739 5908 2201  
+3637 2068 787 1963 3430 36 2815  
+3638 786 2068 585 509 1097 480  
+3639 1670 2380 5681 4257 8933 3671  
+3640 4775 4776 2070 8942 8935 8934  
+3641 4778 4779 2072 3647 225 8940  
+3642 4777 4778 2071 3643 8939 8938  
+3643 4778 5145 2071 3644 3642 8941  
+3644 4783 2071 5145 3643 9655 8948  
+3645 2074 4791 4781 8966 6988 8947  
+3646 3763 2073 3756 6970 6984 4844  
+3647 4780 2072 4779 3641 8943 6979  
+3648 3765 2075 3759 3652 6977 3649  
+3649 2075 3765 3766 6990 6982 3648  
+3650 2074 3765 3760 6977 8945 6988  
+3651 3767 2802 5197 3046 9758 5082  
+3652 2075 3761 3759 6971 3648 6969  
+3653 3758 3757 2197 9629 3892 6975  
+3654 2676 2677 2076 4845 4839 4838  
+3655 1497 4776 5681 10711 8967 8937  
+3656 2077 4792 2119 8969 1765 2504  
+3657 4788 4789 2083 397 3387 8961  
+3658 2078 4784 4777 8952 8939 8953  
+3659 5145 2677 2678 4840 9655 9654  
+3660 4787 2081 2079 8949 3664 3899  
+3661 4702 5504 4788 10362 8960 8790  
+3662 4784 2080 3530 6529 6528 8962  
+3663 2081 4785 4786 8955 8949 3402  
+3664 2079 5144 4787 9653 3660 8958  
+3665 2082 5144 2655 9652 1693 9653  
+3666 2200 2082 1014 1693 10376 8959  
+3667 1092 4712 4790 8809 8965 8810  
+3668 4700 2083 1941 8964 8787 8786  
+3669 1796 5441 3384 6240 9757 10237  
+3670 2084 3384 3755 3896 6980 6242  
+3671 2380 1670 2379 2237 4258 3639  
+3672 2380 2086 4792 8969 8968 8970  
+3673 2091 2087 4793 1766 8971 8974  
+3674 2086 4794 2119 8972 8969 8973  
+3675 4795 4796 2088 8977 2092 8975  
+3676 4794 2087 2088 2092 3678 1766  
+3677 2089 2088 537 8977 3682 1701  
+3678 4794 2088 1122 3934 8972 3676  
+3679 537 3647 2090 720 3682 6755  
+3680 2089 1121 2202 3902 3935 3681  
+3681 1121 2089 2090 3682 5334 3680  
+3682 537 2090 2089 3681 3677 3679  
+3683 4991 2092 679 2842 9357 4256  
+3684 4797 2091 4448 1910 8293 8979  
+3685 4446 2092 1669 4256 8290 8289  
+3686 824 4447 4448 8291 8294 8296  
+3687 2122 2094 4800 2035 8985 3746  
+3688 2093 4800 4799 8984 1417 8985  
+3689 3631 2094 946 3746 6725 3690  
+3690 2094 3631 4801 6724 2035 3689  
+3691 2095 3295 3296 6064 8989 6065  
+3692 3318 3337 1344 10712 6111 6110  
+3693 2097 4803 4804 8990 9772 8999  
+3694 4802 2096 4803 8990 3696 2200  
+3695 3316 1083 3315 2774 6105 2771  
+3696 4803 1344 4802 8988 3694 8998  
+3697 5399 5400 3259 5993 5992 10155  
+3698 5399 3263 5404 6000 10165 6001  
+3699 1803 2479 2099 4846 4466 4452  
+3700 2680 1820 4576 8547 8546 8550  
+3701 5646 2100 1602 3159 2433 10641  
+3702 2100 1779 4535 8465 8464 10641  
+3703 4044 2123 1010 1543 7520 7519  
+3704 119 1833 2101 9001 4281 924  
+3705 4809 4810 2102 3267 1777 9003  
+3706 4826 4825 2124 3273 9037 9036  
+3707 2103 4810 2126 9004 9040 9005  
+3708 1911 4675 4676 3871 1775 8736  
+3709 4352 2104 1540 3338 8110 8109  
+3710 2947 2104 509 8109 5372 2755  
+3711 1361 4698 2108 8783 3386 1705  
+3712 2105 2108 2106 3718 1209 3386  
+3713 551 4811 2107 9012 1210 9006  
+3714 2109 1224 4708 8803 8802 9009  
+3715 4813 4814 2110 9016 812 9011  
+3716 3719 843 2109 3720 3719 9010  
+3717 4699 2108 1940 8783 8785 8784  
+3718 2106 2108 551 8784 6897 3712  
+3719 3719 2109 2106 1964 6897 3716  
+3720 843 4812 2109 9009 3716 9008  
+3721 2491 4816 2112 3725 2837 3723  
+3722 2111 5146 2681 9657 9015 9656  
+3723 2110 4816 2491 3721 9014 9016  
+3724 2491 5038 2111 2674 4477 9448  
+3725 2115 2112 4816 3721 9017 9018  
+3726 5443 2725 2500 1211 10242 10241  
+3727 844 2112 4817 9018 646 2837  
+3728 2115 5159 4817 9682 9018 9683  
+3729 2116 5564 3729 10480 6914 6916  
+3730 3388 2728 2114 9024 1359 6250  
+3731 2115 1665 4705 1550 8797 9017  
+3732 483 2725 5159 4932 9027 4933  
+3733 3729 2204 3728 6915 6914 10477  
+3734 3728 2727 2116 4938 6914 2194  
+3735 5715 5640 2117 8139 2627 6930  
+3736 686 1973 2117 2625 8139 63  
+3737 4822 2118 3309 3502 6093 6020  
+3738 3273 3272 2003 6023 6018 6019  
+3739 2120 4823 4886 9030 3932 9031  
+3740 4781 2119 1090 1698 8946 1765  
+3741 2923 2925 1980 5329 1702 5325  
+3742 5244 2926 2927 5330 5084 9850  
+3743 4823 2121 1090 6991 1698 9031  
+3744 2120 2925 2926 5328 5331 5329  
+3745 4824 2122 500 929 9032 2919  
+3746 946 2094 2122 3687 6722 3689  
+3747 3946 2123 853 7519 7331 7330  
+3748 2391 2123 121 7330 4280 1229  
+3749 5669 3531 1903 10369 10687 10686  
+3750 1128 4639 4826 3268 9037 8666  
+3751 2125 1885 2948 5374 3270 3311  
+3752 1128 2124 4827 9038 8670 9037  
+3753 5602 3532 1127 1781 10552 7616  
+3754 5148 2682 4828 3328 9041 4850  
+3755 81 776 2127 3756 511 3961  
+3756 3880 2127 776 3755 7203 7202  
+3757 3174 230 2136 3774 3773 5824  
+3758 2129 513 2205 3908 3 1112  
+3759 3174 2129 2128 538 5824 5823  
+3760 2949 2129 815 5823 5376 1112  
+3761 4059 2130 744 214 223 7550  
+3762 4830 2130 1029 7550 9042 1013  
+3763 3525 2132 779 1083 6519 6518  
+3764 4832 2131 4834 9048 992 9046  
+3765 3604 2132 734 6518 6672 6671  
+3766 4834 4833 175 -1 992 9050  
+3767 5683 40 3144 723 10714 968  
+3768 2683 2133 721 5765 1533 967  
+3769 650 2134 1105 543 547 1732  
+3770 2134 1106 2135 3771 1153 7959  
+3771 4274 2135 1106 3770 7962 7961  
+3772 2136 2135 815 7961 3773 379  
+3773 3174 2136 815 3772 5823 3757  
+3774 230 229 2136 379 3757 -1  
+3775 2138 342 341 -1 4 7  
+3776 749 1299 4836 2112 9053 2113  
+3777 341 2140 2139 242 4 3781  
+3778 749 2137 2138 7 3780 9053  
+3779 2139 728 2393 4284 459 242  
+3780 749 2138 2139 4 4709 3778  
+3781 341 340 2140 3782 3777 -1  
+3782 4837 2140 340 3781 9054 980  
+3783 5617 4875 2141 9130 10582 7872  
+3784 4229 127 1365 848 2241 3910  
+3785 5347 3175 717 9127 10050 2541  
+3786 4875 4838 128 -1 9130 9129  
+3787 3445 5475 2143 6437 937 10305  
+3788 2767 3501 3450 6365 5011 6473  
+3789 2144 3447 5470 6367 6374 3791  
+3790 3508 620 3505 1547 6482 6488  
+3791 2144 3444 3447 10294 3789 10292  
+3792 5479 3486 2146 6653 10314 10313  
+3793 3454 5477 3457 10310 4667 6380  
+3794 5696 1698 5085 9540 10741 10087  
+3795 3493 2152 3459 3799 6385 6460  
+3796 2583 3487 5076 9523 9515 6446  
+3797 2147 5478 3455 6391 6381 10311  
+3798 5080 5082 2149 1132 9529 4655  
+3799 2152 3460 3459 6393 3795 6383  
+3800 2151 3480 3481 6433 6863 4863  
+3801 2151 3467 3479 6405 4863 6449  
+3802 3495 3481 2152 6439 6434 6462  
+3803 1228 3453 3455 2902 6390 6379  
+3804 2689 1595 2690 4865 3825 4871  
+3805 2154 1019 4098 7625 7624 1561  
+3806 3456 3492 5711 10769 6457 6382  
+3807 290 1359 2154 1560 902 117  
+3808 5208 1538 2811 2218 5099 10622  
+3809 4840 1354 4349 8104 8103 9779  
+3810 178 2156 645 2632 774 463  
+3811 2156 177 3604 781 6672 463  
+3812 4842 4843 2159 9069 2572 9064  
+3813 2716 2722 2721 927 4924 4926  
+3814 783 2713 2714 1382 9063 4910  
+3815 2718 4841 929 1814 4920 4919  
+3816 4844 4845 2160 9071 2573 9068  
+3817 2159 4844 4351 9067 2579 9068  
+3818 738 5643 4846 10634 9070 9072  
+3819 4343 2160 4346 8098 8097 2573  
+3820 2394 2161 860 8167 4286 1243  
+3821 4346 966 4344 8101 8097 8091  
+3822 2726 2508 505 9465 4934 3907  
+3823 2515 2519 1037 9466 1596 4525  
+3824 2689 4847 2164 9075 3827 4864  
+3825 2689 2690 5645 10638 8190 3804  
+3826 627 5684 3111 9076 7084 10716  
+3827 2164 2693 2689 4871 3824 1296  
+3828 2165 5684 4849 10716 2125 5700  
+3829 4851 2165 4850 2125 9080 1295  
+3830 1293 2402 2405 4308 4303 829  
+3831 4853 2166 4852 2102 9084 9086  
+3832 4416 2167 1627 1399 8232 8231  
+3833 4854 2168 2167 3835 9087 9088  
+3834 2171 2168 808 2749 3840 2103  
+3835 1293 2167 2168 3833 3843 2761  
+3836 4418 2170 1294 2763 1686 8236  
+3837 2169 2399 2708 2105 4901 4296  
+3838 1630 4855 2170 4297 8236 9089  
+3839 2400 2399 2170 4296 4297 2750  
+3840 2171 808 2806 5090 2746 3834  
+3841 2172 2171 1292 2752 3842 2103  
+3842 2173 2172 1292 3841 3844 2098  
+3843 2168 2172 1293 829 3835 2103  
+3844 2173 1292 2174 3846 3848 3842  
+3845 2173 1291 2402 4302 2098 1754  
+3846 1292 4856 2174 3847 3844 9091  
+3847 2174 4856 4857 9092 8225 3846  
+3848 2174 2175 2173 1754 3844 2101  
+3849 4415 2175 807 2101 8229 2099  
+3850 611 2176 1039 2866 7276 1601  
+3851 1680 2176 1681 1601 338 1316  
+3852 2178 2177 1073 3079 3854 2961  
+3853 2177 1727 4515 8424 2960 2961  
+3854 2178 1073 2179 3856 2959 3852  
+3855 2178 1726 4501 2389 8397 2959  
+3856 2908 2179 1073 3854 2418 5295  
+3857 5243 1454 2922 5323 9848 9847  
+3858 4312 2180 1554 3169 8036 8035  
+3859 1200 4156 4155 7729 7730 7731  
+3860 4939 2181 1543 8615 9253 7092  
+3861 5573 3533 3821 3231 10497 10496  
+3862 2182 4858 4860 9096 895 3226  
+3863 4859 2182 4861 895 9102 9098  
+3864 2210 4885 4881 9150 9099 3919  
+3865 975 4878 2770 9723 6879 5021  
+3866 4863 2184 4862 3313 9104 3867  
+3867 2184 4863 2697 9106 3175 3866  
+3868 4864 4865 2185 402 3317 9108  
+3869 2807 2185 1323 3295 5092 3320  
+3870 4656 4657 1895 9109 8699 3308  
+3871 493 4676 4675 3708 8700 8738  
+3872 2187 5672 3379 8732 679 6231  
+3873 2536 2188 3379 679 6232 4566  
+3874 3176 2189 4866 9112 9111 5828  
+3875 1323 2187 2188 679 2155 3295  
+3876 4595 2189 1322 5828 8581 5095  
+3877 5206 2808 2189 9112 5095 9776  
+3878 2190 4869 4868 9118 9114 9115  
+3879 1061 4760 4761 3598 10706 8904  
+3880 4868 2191 4867 1700 9114 9884  
+3881 5165 5166 1096 5448 4961 9695  
+3882 2191 5262 2982 5442 8907 9884  
+3883 2193 4870 2985 9119 3885 9120  
+3884 2933 5246 2934 5349 5347 9853  
+3885 2984 2193 2985 3883 5449 5537  
+3886 2746 2747 1767 4979 3602 4975  
+3887 4870 2194 2749 4981 4959 5348  
+3888 5200 5039 2497 9452 9764 9763  
+3889 2195 5200 2804 5086 5540 9763  
+3890 2196 1059 2211 3920 2882 9122  
+3891 525 2058 2196 1640 8320 3617  
+3892 4872 3758 2197 3653 9124 9123  
+3893 2660 2198 4873 3895 4807 9619  
+3894 4872 2198 2676 1694 4839 3895  
+3895 2198 4872 4873 9124 3893 3894  
+3896 3755 3384 3754 6241 6967 3670  
+3897 3383 2497 3592 6647 4489 10238  
+3898 4785 2200 1948 5924 8954 3402  
+3899 2200 2081 4787 3660 8959 3402  
+3900 2666 1014 2656 1627 4799 6587  
+3901 5041 2499 3225 1622 5925 4492  
+3902 2918 2202 1121 3680 2 5315  
+3903 2217 2202 1980 5315 9152 1763  
+3904 2496 2724 5161 4931 9686 4486  
+3905 4820 844 4818 646 9021 9446  
+3906 5565 591 3732 6922 2010 10482  
+3907 2508 2726 3216 4935 5907 3822  
+3908 513 1125 2205 6748 3758 1724  
+3909 1125 3642 3643 6745 6748 6746  
+3910 5617 127 4229 3784 10583 10582  
+3911 2206 5617 4876 10583 684 7872  
+3912 4885 4879 2207 1386 9150 9149  
+3913 4877 2207 3538 1386 284 9141  
+3914 4882 4883 581 9139 9144 1823  
+3915 778 3542 3546 6552 6560 6553  
+3916 2961 2573 2252 4640 4002 4636  
+3917 4880 2960 2208 5398 1822 9140  
+3918 976 4617 5665 8623 10679 1448  
+3919 4885 2210 4882 3228 9144 3864  
+3920 1059 2036 2211 489 3890 3573  
+3921 2212 2036 1058 5802 3922 489  
+3922 2213 2212 1058 3921 3924 2883  
+3923 1688 2211 2212 489 5830 8325  
+3924 2213 1058 2214 5807 517 3922  
+3925 3177 2213 701 1106 5829 2883  
+3926 1058 3163 3166 5808 5807 5802  
+3927 223 2214 3167 5810 5809 3928  
+3928 2214 223 2215 607 517 3927  
+3929 2216 223 222 -1 3930 607  
+3930 2216 222 3982 557 7399 3929  
+3931 701 2215 2216 607 5833 1106  
+3932 4886 1980 2120 5329 3739 9152  
+3933 2218 2217 1122 3463 3934 1763  
+3934 2088 2218 1122 3933 3678 1701  
+3935 2202 2218 2089 1701 3680 1763  
+3936 2219 4888 4889 22 7361 9156  
+3937 3963 2219 891 7361 7363 7362  
+3938 2128 2220 231 534 9043 542  
+3939 2220 692 4126 7676 1793 542  
+3940 9 3864 2223 7172 368 364  
+3941 2222 2221 693 3945 3942 311  
+3942 1975 2222 693 3941 7310 347  
+3943 10 2222 684 347 348 311  
+3944 3936 755 514 7969 7312 434  
+3945 693 2221 2223 368 7311 3941  
+3946 2225 4890 209 -1 3948 9159  
+3947 1247 2224 699 591 595 584  
+3948 4049 2225 209 3946 586 7530  
+3949 1018 4219 2226 7852 1559 7853  
+3950 2226 639 2227 3952 141 7852  
+3951 699 2225 2226 1559 10481 591  
+3952 2504 2227 639 3950 792 513  
+3953 5563 2227 2204 513 10477 6917  
+3954 2521 111 110 -1 953 919  
+3955 2228 714 2229 3956 2546 4537  
+3956 3180 2229 714 3955 5835 2547  
+3957 4327 2229 1520 6618 8063 8062  
+3958 2230 606 4350 798 8106 7541  
+3959 2230 557 4590 8571 801 9161  
+3960 4112 775 577 7678 7648 1075  
+3961 81 2231 776 1076 3755 787  
+3962 2233 2232 822 1327 3964 1168  
+3963 4894 390 2232 1165 9165 -1  
+3964 2233 822 2234 3966 1167 3962  
+3965 2704 2233 821 6562 4892 1168  
+3966 3648 2234 822 3964 6757 3970  
+3967 597 2234 2236 3970 3981 2165  
+3968 3648 3649 2235 266 6758 6757  
+3969 2237 1327 4901 9177 3987 3975  
+3970 3648 2236 2234 3967 3966 6758  
+3971 2237 2236 2235 6758 3972 3987  
+3972 2235 4895 2237 9167 3971 9164  
+3973 2261 2238 4896 2166 9168 4020  
+3974 2238 2245 2239 3989 9170 2164  
+3975 1327 2237 4897 9169 3977 3969  
+3976 2249 2240 2239 3979 390 2161  
+3977 4897 2239 1327 3979 3975 9170  
+3978 2241 2243 2242 3985 5106 3983  
+3979 1327 2239 2240 3976 2163 3977  
+3980 2814 1149 2262 4023 4022 5107  
+3981 4900 597 2236 3967 9175 1166  
+3982 750 2242 1978 265 3461 3459  
+3983 2241 4898 2243 9171 3978 9172  
+3984 4899 2243 503 9171 9173 9174  
+3985 570 2242 2243 3978 7366 265  
+3986 2244 2241 2262 4022 9176 9172  
+3987 2237 4901 2236 9175 3971 3969  
+3988 2246 2245 1328 2164 3990 1477  
+3989 1326 2239 2245 3974 709 390  
+3990 2250 2246 1328 3988 3998 2169  
+3991 2246 479 2247 3992 1477 2172  
+3992 479 2951 2247 2808 3991 5380  
+3993 4023 2248 3572 6609 6608 7478  
+3994 4026 894 4020 7473 2162 7485  
+3995 1326 2247 4902 9179 3996 709  
+3996 1326 4902 3549 9180 1309 3995  
+3997 4903 2249 3549 1309 6566 9182  
+3998 2251 2250 1328 3990 4000 2170  
+3999 2250 1329 2253 4004 2169 2168  
+4000 2261 2251 1328 3998 4020 2167  
+4001 2251 1151 2263 4024 2170 79  
+4002 2252 5604 2961 1292 3916 5400  
+4003 2571 1150 2570 4634 1080 5401  
+4004 2255 2253 1329 3999 9185 4005  
+4005 2253 2255 2254 1476 2174 4004  
+4006 4904 2254 1330 1476 9183 4014  
+4007 1651 2951 2258 5380 7482 5381  
+4008 4905 1329 2265 4025 9186 9185  
+4009 2255 4905 2257 4029 3445 9185  
+4010 4904 2259 4920 9216 9215 9183  
+4011 4919 2278 2409 4054 3332 4055  
+4012 2257 977 2526 4547 4551 4029  
+4013 4906 2257 2528 4551 4550 9188  
+4014 4907 2254 4904 4006 9184 9190  
+4015 4907 2256 4919 9214 9213 9184  
+4016 2259 1330 4906 9188 9187 9183  
+4017 4908 2259 963 8816 9191 9216  
+4018 4908 2266 2260 9393 1447 9191  
+4019 2278 2260 1914 4356 4054 9192  
+4020 2238 2261 1328 4000 2164 3973  
+4021 2252 2261 526 9168 5400 2167  
+4022 2814 2262 2241 3986 5106 3980  
+4023 3548 2262 1149 3980 6564 6563  
+4024 1151 4909 2263 3230 4001 9193  
+4025 2265 1329 2263 2168 3230 4008  
+4026 2573 4884 1151 9193 4640 9147  
+4027 2264 2275 2265 9211 9194 4028  
+4028 2275 2264 1862 9143 3229 4027  
+4029 4905 977 2257 4012 4009 4049  
+4030 2267 2266 963 9191 4032 9199  
+4031 2266 4912 2269 4036 639 9199  
+4032 4715 2267 963 4030 8816 9197  
+4033 4915 2273 4910 2345 9196 4044  
+4034 4911 2268 4910 9196 9195 3442  
+4035 4619 998 4620 8626 8629 8624  
+4036 4914 2269 4912 4031 2343 9201  
+4037 2432 2428 1426 2171 4354 4328  
+4038 2270 4913 2272 9204 4557 9202  
+4039 5059 2272 474 4046 9490 9491  
+4040 2530 2299 2529 4553 4552 9234  
+4041 2271 2529 2314 2351 4560 4552  
+4042 1416 2273 4916 9207 9203 2345  
+4043 2531 5059 2530 9490 4554 9491  
+4044 2273 4915 2281 9206 9209 4033  
+4045 4917 2274 4916 9208 9207 9210  
+4046 474 2272 2274 9208 4069 4039  
+4047 4914 4916 2272 9208 9204 9203  
+4048 1862 4617 2276 8622 3229 8623  
+4049 4905 4918 977 1519 4029 9186  
+4050 3535 2277 1861 1475 3227 6536  
+4051 2275 2276 2525 4544 9212 3229  
+4052 2527 1863 4618 3236 8625 4548  
+4053 2527 2525 2277 4544 4548 4545  
+4054 2278 1914 2409 4316 4011 4019  
+4055 2278 4919 4920 9214 9192 4011  
+4056 4922 5533 3650 10419 6762 9217  
+4057 2533 962 2532 4559 4558 1446  
+4058 3793 5349 3181 10058 1444 7042  
+4059 2414 2415 3793 4329 7043 4326  
+4060 2316 4950 1417 9275 4131 9276  
+4061 2283 2281 999 4063 4064 823  
+4062 4924 2282 1714 4130 9223 4076  
+4063 999 2281 2282 2348 4076 4061  
+4064 2286 2283 999 4061 4070 4065  
+4065 2283 2286 2284 1925 2339 4064  
+4066 2294 2284 1414 1925 4086 4067  
+4067 2284 2294 2285 2338 191 4066  
+4068 1420 4928 4929 9232 9233 1956  
+4069 2274 4923 474 4097 4046 9221  
+4070 2288 2286 999 4064 4074 4071  
+4071 2286 2288 2287 2346 2337 4070  
+4072 2317 2287 1418 2346 4132 4073  
+4073 2287 2317 4927 2257 4088 4072  
+4074 2289 2288 999 4070 9224 4075  
+4075 2288 2289 2290 1518 2253 4074  
+4076 4924 999 2282 4063 4062 9224  
+4077 2289 4924 2346 9223 4112 9224  
+4078 1419 2292 2290 9225 1518 9246  
+4079 4925 2290 4926 9225 9228 2347  
+4080 1373 4258 4259 7929 9227 7930  
+4081 1206 2318 2952 4133 5383 4134  
+4082 4934 4935 2307 2349 2255 9244  
+4083 4926 2292 1373 4085 9227 9225  
+4084 2293 4934 2311 9243 2368 9244  
+4085 1373 2292 2293 9245 2254 4083  
+4086 2295 2294 1414 4066 9230 4087  
+4087 2294 2295 2296 2336 2352 4086  
+4088 4927 1414 2287 2337 4073 9230  
+4089 2295 4927 2300 9229 3330 9230  
+4090 2297 2296 1205 2336 9239 4091  
+4091 2296 2297 2298 2354 2350 4090  
+4092 4932 1205 2305 2604 9240 9239  
+4093 2297 4932 2330 4109 1438 9239  
+4094 1422 2301 2298 9231 2354 4161  
+4095 4928 2298 4930 9231 9236 1956  
+4096 1421 4945 2529 2351 9235 9265  
+4097 4929 474 4923 4069 9222 4555  
+4098 4951 1413 2319 2323 4137 9278  
+4099 2300 4951 2305 9277 2604 9278  
+4100 2330 2331 1422 2355 1438 4159  
+4101 4930 2301 1421 9261 9235 9231  
+4102 2302 1220 4931 9237 9262 4163  
+4103 2301 2302 4943 9262 9261 4206  
+4104 4963 2335 1220 6780 9301 9302  
+4105 3652 3651 5534 6761 10420 1436  
+4106 3657 2304 5562 10475 6776 6774  
+4107 3652 3656 1219 1955 6766 6765  
+4108 2306 2305 1912 9277 4110 9240  
+4109 4932 1548 2330 4158 4093 3329  
+4110 4933 2306 1912 4108 9241 4147  
+4111 4964 2306 1405 4147 9303 4172  
+4112 1419 2289 2346 4077 4116 1518  
+4113 2309 2308 4936 2596 9248 9251  
+4114 4937 4938 2310 4118 1928 9250  
+4115 2707 4937 1544 1928 4899 4898  
+4116 4971 1419 2346 4112 4191 9318  
+4117 2315 1865 5573 10496 7094 9272  
+4118 4938 3821 2310 9254 4114 9252  
+4119 2310 1543 4355 8116 8115 9253  
+4120 2312 4942 2707 9259 2592 9260  
+4121 4261 2325 4952 4148 9280 7935  
+4122 2312 575 4940 9255 2955 9675  
+4123 4952 4942 1371 9258 9280 9279  
+4124 2303 4944 2313 9267 9238 9263  
+4125 4946 2279 2314 4127 4126 10417  
+4126 2314 4945 4946 9266 4125 2351  
+4127 2533 2314 2279 4125 4561 4560  
+4128 2309 4947 2315 4129 3235 9269  
+4129 4947 4949 2315 2341 4128 9270  
+4130 2282 4950 1714 9273 4062 9275  
+4131 2815 2316 1417 4060 5109 5108  
+4132 2952 2317 1418 4072 5382 4133  
+4133 2317 2952 2318 4081 1927 4132  
+4134 2320 2318 1206 4081 4138 2319  
+4135 2319 2318 1406 2319 4136 2323  
+4136 3193 2319 1406 4135 5861 2322  
+4137 4951 2319 1912 2322 9277 4098  
+4138 1206 2347 2320 4141 4134 4192  
+4139 1424 2816 2321 1521 4193 5110  
+4140 1406 2320 2321 4141 4144 2319  
+4141 2321 2320 2347 4138 4193 4140  
+4142 2322 3108 3107 10012 10427 5691  
+4143 3658 3654 5535 10422 10421 6770  
+4144 1406 2321 2323 4145 5861 4140  
+4145 1274 2323 2321 4144 1521 2356  
+4146 4953 4954 2326 4150 2067 9282  
+4147 2306 4933 1405 9281 4111 4110  
+4148 4952 2325 2311 2368 9279 4121  
+4149 4258 2325 1429 7935 2366 7930  
+4150 4955 2326 4954 4146 9284 2318  
+4151 3194 2327 4956 9288 9287 9291  
+4152 4959 4958 2328 2005 10721 2327  
+4153 4953 4957 1405 4173 9281 2067  
+4154 2342 2329 4960 9296 9295 6902  
+4155 959 2337 5686 10720 9293 2320  
+4156 5547 5543 3721 10437 6901 10445  
+4157 1410 4974 5688 10725 10724 9324  
+4158 2336 2330 1548 4109 4170 4159  
+4159 2330 2336 2331 2605 4100 4158  
+4160 2332 2331 1549 2605 4162 4207  
+4161 2354 2301 1422 4094 2355 4206  
+4162 2333 2332 1549 4160 1957 2331  
+4163 2354 1220 2302 4102 4206 2607  
+4164 1549 2336 2338 4171 1957 2605  
+4165 2333 1550 2335 4168 9302 2606  
+4166 4961 959 4960 2002 9296 4174  
+4167 5542 3676 3675 6814 10435 6812  
+4168 2339 2335 1550 4165 2608 4169  
+4169 2339 3720 2335 2609 4168 4177  
+4170 2337 2336 1548 4158 9304 4171  
+4171 2336 2337 2338 2320 4164 4170  
+4172 4964 1548 2306 3329 4111 9304  
+4173 1405 4957 4959 9290 9303 4153  
+4174 4961 2338 959 2320 4166 9298  
+4175 2338 2334 4962 9300 9299 9298  
+4176 5688 3674 3675 6809 10724 9323  
+4177 3720 2339 960 6816 10474 4169  
+4178 3679 4974 2351 4200 6819 6817  
+4179 3678 2340 3679 6817 3110 6815  
+4180 3105 1663 5316 5664 9993 5695  
+4181 3681 3108 3680 6822 6821 10013  
+4182 5357 4965 3195 9305 5866 10071  
+4183 2342 4965 3721 9306 6902 2326  
+4184 1245 3380 4968 4186 10070 2295  
+4185 3721 2343 1409 3153 6901 9306  
+4186 2344 4968 3380 4184 9313 9311  
+4187 4967 4969 2345 4188 9309 9308  
+4188 4969 2490 2345 4474 4187 9314  
+4189 3682 2353 5547 10445 10446 2004  
+4190 4947 2346 1714 9223 9270 9269  
+4191 4971 2346 2309 9269 9317 4116  
+4192 2348 2347 1206 4138 4194 2252  
+4193 2321 2347 1424 4197 4139 4141  
+4194 2291 2348 1206 4192 5383 2358  
+4195 2349 2348 1428 7931 4196 2252  
+4196 2349 1428 5625 4199 10596 4195  
+4197 1424 2347 2349 2252 4198 4193  
+4198 1424 2349 2350 10596 9321 4197  
+4199 1428 4257 5625 10598 4196 7928  
+4200 2351 4974 4976 9324 9326 4178  
+4201 2485 4975 1802 4468 2003 4465  
+4202 4976 5544 2352 10439 9328 9327  
+4203 2487 1244 2481 3111 4457 10449  
+4204 5544 3676 5543 6813 10438 10440  
+4205 4967 3682 1409 10446 9310 9309  
+4206 2301 2354 2302 4163 4103 4161  
+4207 2331 2332 2354 2607 2355 4160  
+4208 566 2857 2356 856 492 5192  
+4209 4978 2355 2356 492 4211 9332  
+4210 5584 3947 3948 7332 10518 10517  
+4211 4978 2356 1139 7335 9331 4209  
+4212 1022 702 2357 4213 7540 3481  
+4213 2817 2357 702 4212 5115 1231  
+4214 4980 2358 1250 170 9335 7810  
+4215 1259 803 2358 999 7810 6712  
+4216 979 2359 1053 870 7439 1629  
+4217 1321 4216 2360 1904 2154 7846  
+4218 2361 2360 542 1904 4220 1313  
+4219 652 2359 2360 2154 6568 870  
+4220 2534 2361 542 4218 92 88  
+4221 3550 2361 895 3324 6567 1313  
+4222 3789 2362 1909 4563 7033 4223  
+4223 2362 3789 2953 376 1314 4222  
+4224 1707 2363 945 2227 6711 2920  
+4225 668 1357 2363 2225 8369 1413  
+4226 4030 2364 510 7897 1174 7493  
+4227 993 4400 3292 8200 2728 1509  
+4228 3286 1383 3283 6040 6038 6054  
+4229 2365 3287 5413 6048 10651 6049  
+4230 646 4981 2366 4231 1787 9337  
+4231 2366 4981 2367 9338 383 4230  
+4232 2368 2367 1432 9338 4234 4237  
+4233 2369 1433 1501 1608 2512 9343  
+4234 1432 4982 2368 4235 4232 9339  
+4235 2368 4982 4983 9340 2494 4234  
+4236 524 2367 2369 9344 1564 383  
+4237 2367 2368 4984 2374 9344 4232  
+4238 2371 2370 742 2637 7370 1009  
+4239 741 2370 562 4243 1007 84  
+4240 742 3966 3967 7371 7370 1317  
+4241 898 4406 5649 10647 9345 1540  
+4242 1606 2373 4988 4245 9352 2717  
+4243 2370 4986 562 5006 4239 1009  
+4244 2761 2762 670 1092 5004 5003  
+4245 2373 4987 4988 9348 4242 809  
+4246 2375 2374 897 7095 4248 9356  
+4247 1624 4990 806 1318 5373 9355  
+4248 3966 2375 897 4246 7371 7368  
+4249 3904 2376 805 4250 7250 7249  
+4250 805 2376 2375 1133 7368 4249  
+4251 563 1916 2376 540 7249 414  
+4252 640 1142 2377 4253 438 1806  
+4253 7 2377 1142 4252 1034 1716  
+4254 3336 1629 2797 3534 6147 5116  
+4255 3336 3335 2378 2767 6146 5073  
+4256 4991 1669 2092 3685 3683 9358  
+4257 2380 2085 5681 10710 3639 8968  
+4258 4991 2380 2379 3671 9358 9357  
+4259 2380 679 4793 8971 8970 9357  
+4260 2381 4892 2384 9158 4263 4266  
+4261 1536 2383 1534 4267 2574 9778  
+4262 1839 2381 2382 4263 3185 3182  
+4263 2384 2382 2381 4262 4260 4265  
+4264 507 2382 2383 4265 5096 2577  
+4265 2383 2382 2384 4263 4267 4264  
+4266 4892 2381 557 8575 9161 4260  
+4267 2383 2384 1534 9158 4261 4265  
+4268 801 1927 2385 4269 494 1482  
+4269 626 2385 1927 4268 2688 3360  
+4270 239 2387 3724 4273 -1 4271  
+4271 2387 239 854 6604 1126 4270  
+4272 801 2386 2387 4273 6526 494  
+4273 2387 2386 3724 6908 4270 4272  
+4274 1365 2388 727 3457 2240 846  
+4275 4992 126 125 -1 862 9360  
+4276 3791 2389 1137 1797 7038 1795  
+4277 1164 667 2389 1850 1795 3240  
+4278 2796 2390 1216 3539 5070 3532  
+4279 2390 1629 2819 9786 2762 3532  
+4280 120 2391 121 3748 -1 900  
+4281 119 2101 2391 1229 900 3704  
+4282 4676 2392 2103 9005 8739 4283  
+4283 2392 4676 4994 8738 3310 4282  
+4284 728 1539 2393 4285 3779 981  
+4285 3853 2393 1539 4284 7151 7150  
+4286 2398 2394 860 3820 9366 1047  
+4287 2395 2394 583 1047 4288 245  
+4288 2397 2395 583 4287 4292 1999  
+4289 1080 4659 2396 8705 4291 220  
+4290 966 2395 2396 4291 8093 245  
+4291 1080 2396 2395 4290 1999 4289  
+4292 1189 2397 583 4288 129 1454  
+4293 1080 2397 1241 1897 1681 1999  
+4294 4995 860 1577 8164 837 9366  
+4295 4080 2398 761 9365 7588 740  
+4296 2169 2170 2399 3839 3837 2763  
+4297 2170 4855 2400 9090 3839 3838  
+4298 1081 3725 2400 4299 9090 6907  
+4299 2400 3725 2401 6909 2304 4298  
+4300 1639 4424 3215 8247 2784 1139  
+4301 2712 2401 989 5896 4909 4908  
+4302 2403 2402 1291 3845 4304 4308  
+4303 2405 2166 1293 2761 3830 2102  
+4304 2404 2403 1291 4302 4306 1400  
+4305 4212 2403 1290 1400 7839 7838  
+4306 4996 2404 1291 4304 9367 2760  
+4307 2404 5690 2406 10728 2097 2760  
+4308 2402 2403 2405 4309 3830 4302  
+4309 938 2405 2403 4308 7838 2096  
+4310 5560 1116 3714 1828 10472 10471  
+4311 2406 5560 5332 6888 10023 10471  
+4312 4997 2407 689 830 9369 3284  
+4313 1889 1904 2407 886 6253 3315  
+4314 3751 3752 4997 852 9369 6960  
+4315 5012 2433 3390 916 6254 4364  
+4316 1914 2412 2409 4318 4054 4322  
+4317 2410 1573 4024 7481 1311 2173  
+4318 3792 2409 2412 4316 4323 7041  
+4319 3792 2411 4998 9372 9371 7040  
+4320 5000 2418 2419 4334 4337 1579  
+4321 1571 4021 4027 7487 7486 7475  
+4322 2427 2412 1914 4316 3334 2363  
+4323 3792 2412 830 1479 7040 4318  
+4324 1913 2414 2413 4325 4353 4326  
+4325 2414 4999 2413 4335 4324 9373  
+4326 2415 2414 1913 4324 9397 4059  
+4327 2416 2414 978 7043 4330 9373  
+4328 2428 2432 5011 2362 9398 4037  
+4329 3793 2415 2280 9218 7042 4059  
+4330 2417 2416 978 4327 2658 1478  
+4331 2418 2416 1575 1478 4334 2652  
+4332 2417 5350 3182 10057 5838 2658  
+4333 1576 2421 2424 4346 4338 5858  
+4334 2419 2418 1575 4331 4336 4320  
+4335 4999 830 2413 1479 4325 9374  
+4336 2420 2419 1575 4334 1184 2659  
+4337 5000 2419 1572 9379 9375 4320  
+4338 2417 1576 2424 4333 4347 5838  
+4339 5001 5003 2420 9380 9377 2661  
+4340 1576 3192 3191 5856 5858 5859  
+4341 2421 3191 2426 5857 9378 5858  
+4342 2422 5003 5004 9381 2656 9382  
+4343 5010 842 2431 4361 4360 9396  
+4344 5007 2423 5004 9384 9383 9389  
+4345 2423 5005 5006 9385 9388 10731  
+4346 2424 2421 5001 9378 9377 4333  
+4347 1575 2417 2424 4338 1184 1478  
+4348 5008 5007 2426 9390 9392 9391  
+4349 5367 1027 3220 5915 10091 10090  
+4350 2426 1028 5001 2661 9378 9390  
+4351 829 3218 3221 1181 5917 6955  
+4352 2429 2428 2427 4355 3334 2171  
+4353 2413 2427 1913 4355 4324 2363  
+4354 4913 2432 1426 4037 2342 9202  
+4355 1913 2427 2428 4352 9398 4353  
+4356 1914 2260 2429 4357 3334 4019  
+4357 5009 2429 2260 4356 9393 1183  
+4358 5000 2430 2411 9372 9376 9375  
+4359 2431 2430 1572 9375 4360 1578  
+4360 5010 2431 1572 4359 9395 4343  
+4361 3197 2431 842 4343 5869 362  
+4362 2270 962 2432 2362 9202 4559  
+4363 5011 962 2415 3331 9397 2362  
+4364 5012 5014 2433 9401 4315 9400  
+4365 1888 2652 2653 4791 4793 3281  
+4366 968 3062 3064 5603 1656 4367  
+4367 3062 968 3060 5599 5598 4366  
+4368 730 2435 464 200 447 457  
+4369 698 2441 2436 4380 914 1971  
+4370 2437 1227 466 1203 -1 4373  
+4371 465 2435 2436 914 1970 200  
+4372 2439 2438 766 5790 4375 4374  
+4373 1227 2437 2436 1970 4380 4370  
+4374 2954 2438 2439 4372 1057 5387  
+4375 2440 2439 766 4372 1056 4376  
+4376 2439 2440 2441 2644 1971 4375  
+4377 3155 766 3154 5785 5784 1056  
+4378 4374 2440 1568 5787 8151 8150  
+4379 4169 2441 696 2644 7753 150  
+4380 2436 2441 1227 150 4373 4369  
+4381 4390 2442 626 1350 8181 9406  
+4382 5015 1589 4152 7726 7725 8180  
+4383 2444 2443 764 1354 4385 2578  
+4384 4340 2443 530 9408 8086 8085  
+4385 764 5017 2444 9410 4383 4387  
+4386 5016 2444 1535 1052 9407 2578  
+4387 1890 5017 764 4385 500 9409  
+4388 2745 2713 5157 4911 9679 4972  
+4389 3841 3844 460 7134 1110 7128  
+4390 793 3895 2859 7231 5197 7232  
+4391 300 3683 301 4394 -1 6827  
+4392 5024 2453 2452 9421 9422 2528  
+4393 722 2447 2448 1801 3345 805  
+4394 2447 301 3683 4391 1801 1512  
+4395 2449 299 2450 4397 4404 -1  
+4396 2454 2450 1140 4400 4405 4404  
+4397 299 5021 2450 3179 4395 9416  
+4398 5022 2451 2450 4400 3179 4399  
+4399 5022 5023 2451 158 4398 9419  
+4400 1140 2450 2451 4398 3446 4396  
+4401 3742 690 2893 5265 5264 9420  
+4402 2452 3742 3198 6942 9422 6943  
+4403 5020 2453 1972 2528 9415 9413  
+4404 2450 2454 2449 969 4395 4396  
+4405 1140 2448 2454 6828 4396 180  
+4406 2455 3203 3202 5882 10077 2242  
+4407 2455 5360 5025 10076 7764 10077  
+4408 927 2456 288 2228 894 791  
+4409 669 1359 2456 116 2485 2229  
+4410 2458 2457 710 2957 4412 190  
+4411 552 1445 2457 2401 2402 946  
+4412 2458 710 2754 4991 4990 4410  
+4413 2459 2458 3687 4414 4415 190  
+4414 3687 2458 811 8275 6835 4413  
+4415 2459 3687 2460 6831 2390 4413  
+4416 2461 2460 1447 6831 4418 1146  
+4417 4266 2460 1446 1146 2388 7946  
+4418 2461 1447 2462 4420 2391 4416  
+4419 1446 2461 1440 2391 2403 1146  
+4420 3684 2462 1447 4418 6829 6834  
+4421 1794 2462 3686 6834 8497 2405  
+4422 1295 2017 4727 3536 8839 2969  
+4423 2464 2463 1209 8404 4424 2106  
+4424 1480 2464 1209 4423 2470 2469  
+4425 2464 1479 4287 2468 7988 7986  
+4426 5029 726 2467 10732 9433 -1  
+4427 5027 2465 5026 9427 9426 9429  
+4428 1192 3414 3700 1902 6862 611  
+4429 726 3856 5692 10733 10732 7156  
+4430 3700 2467 138 977 6862 6861  
+4431 5031 2468 900 9729 9432 4432  
+4432 2468 5031 5032 2924 9438 4431  
+4433 2469 1741 4512 2988 8419 2990  
+4434 1743 2469 875 2989 2992 2991  
+4435 1966 2470 875 2992 1983 3436  
+4436 2471 2470 1233 10544 4437 1087  
+4437 2473 2471 1233 4436 4441 1982  
+4438 2474 2471 1183 4440 4443 1087  
+4439 2472 528 4144 7709 523 4442  
+4440 1183 2471 2472 1982 7712 4438  
+4441 2473 1233 5597 10543 10542 4437  
+4442 2472 2473 528 1980 4439 1982  
+4443 2474 1183 2879 7715 5234 4438  
+4444 2470 2474 1743 2993 2992 1087  
+4445 2475 1790 4543 8481 8480 3086  
+4446 1465 1818 2475 3142 2440 3143  
+4447 2477 1117 3979 7393 7392 8763  
+4448 2476 5035 5693 10735 10734 9443  
+4449 511 4686 5674 10697 10696 1756  
+4450 1931 1932 2478 4451 2050 3367  
+4451 1496 2478 1932 4450 8016 2053  
+4452 2479 1803 2480 4454 3112 3699  
+4453 2680 2479 1821 4471 4847 4846  
+4454 2481 2480 1803 4452 4456 4455  
+4455 2484 2480 2481 4454 3111 4463  
+4456 2482 2481 1803 4454 4458 4457  
+4457 2481 2482 2487 2509 4203 4456  
+4458 2486 2482 1803 4456 4466 4459  
+4459 2482 2486 2483 3132 1442 4458  
+4460 2537 2483 1076 3132 4568 2832  
+4461 2485 2483 1801 2832 10016 2003  
+4462 2484 1244 5548 10448 10447 3111  
+4463 1822 2480 2484 4455 3152 3149  
+4464 5328 1801 3109 3115 10017 10016  
+4465 4975 2485 1243 5688 9325 4201  
+4466 2099 2486 1803 4458 3699 3113  
+4467 2486 1813 4569 3130 8533 3113  
+4468 5689 1802 4975 4201 10727 10726  
+4469 5549 2487 2352 2329 10450 10449  
+4470 2489 2488 1822 3149 4472 3151  
+4471 1821 2479 2488 3112 8554 4453  
+4472 2490 2489 1822 4470 4474 2007  
+4473 704 4579 4580 8552 8555 2510  
+4474 2345 2490 1822 4472 3152 4188  
+4475 2490 1823 5663 10675 2007 9314  
+4476 2492 2491 844 2837 4478 9448  
+4477 2491 2111 4815 9015 9014 3724  
+4478 5037 2492 844 4476 9446 2675  
+4479 2492 1583 2493 4480 9449 4930  
+4480 2494 2493 1583 4479 4482 2673  
+4481 2493 541 5146 9657 9656 2673  
+4482 2495 2494 1583 4480 4484 1451  
+4483 1582 2517 5052 9477 9476 1452  
+4484 2496 2495 1583 4482 4486 1212  
+4485 2495 2162 2519 4533 4532 1212  
+4486 2724 2496 1583 4484 4930 3904  
+4487 2496 505 5046 9465 9464 9686  
+4488 3592 5040 2498 4490 6648 6647  
+4489 3592 5440 3383 10236 3897 3237  
+4490 5040 4868 2498 9118 4488 9453  
+4491 5510 1866 5135 9634 4822 10373  
+4492 2499 5041 5042 9455 9685 3901  
+4493 483 2939 2940 5356 5359 5357  
+4494 5042 5043 2500 10242 9457 9456  
+4495 1152 5158 2725 9681 10241 9680  
+4496 2501 5043 2502 9462 6841 1621  
+4497 558 3690 2944 6842 8137 5367  
+4498 2741 5045 2503 4500 4965 1626  
+4499 516 5044 2502 1623 4964 9460  
+4500 5045 5041 2503 9454 4498 9463  
+4501 1052 2664 2741 4815 4965 1624  
+4502 2505 639 1340 698 2192 792  
+4503 3216 2504 1341 4505 5907 5906  
+4504 4220 2506 2505 4507 2192 7855  
+4505 1341 2504 2505 792 4507 4503  
+4506 2506 3551 2507 6570 2193 2196  
+4507 1341 2505 2506 4504 2193 4505  
+4508 782 2509 2507 4511 6570 4512  
+4509 2509 5046 2508 9465 4511 4513  
+4510 1341 2507 2508 4511 5907 2193  
+4511 2508 2507 2509 4508 4509 4510  
+4512 2509 782 2510 4514 1597 4508  
+4513 2509 2162 5046 9464 4509 9467  
+4514 782 2520 2510 4515 4512 4534  
+4515 2510 2520 2511 4535 1595 4514  
+4516 2820 2511 1036 4535 5118 9468  
+4517 2512 2511 5048 9468 9469 633  
+4518 2823 3041 1155 5125 1325 5560  
+4519 2512 5049 2515 4521 1596 9470  
+4520 2514 2513 506 1323 4522 9471  
+4521 2515 5049 965 1089 4524 4519  
+4522 506 5050 2514 4523 4520 9472  
+4523 5050 5051 2514 4572 4522 9473  
+4524 2516 2515 965 4521 4526 4525  
+4525 2515 2516 2519 2672 3823 4524  
+4526 965 2518 2516 4528 4524 2933  
+4527 5052 541 2494 2673 9476 5885  
+4528 5053 2516 2518 4526 4531 9479  
+4529 5053 3205 2517 9477 9479 5886  
+4530 965 2514 2539 10739 2933 1089  
+4531 5053 2518 964 4575 9478 4528  
+4532 2495 2519 1582 2672 1451 4485  
+4533 5047 2519 2162 4485 9467 9466  
+4534 1343 2520 782 4514 1453 971  
+4535 2511 2520 1036 971 4516 4515  
+4536 2521 5054 2522 9481 1912 953  
+4537 714 2228 2521 919 1912 3955  
+4538 1197 2955 2522 9482 9481 5388  
+4539 2955 2523 5055 9483 9482 4540  
+4540 2955 5058 2523 1402 4539 5389  
+4541 5055 5348 3180 10053 5835 9483  
+4542 3074 1199 3073 5625 5624 743  
+4543 3070 543 3068 8659 5613 1916  
+4544 2276 2277 2525 4053 4051 1475  
+4545 2525 2527 2526 4549 4547 4053  
+4546 4714 2528 1864 1824 8813 3234  
+4547 977 2525 2526 4545 4012 1519  
+4548 1863 2527 2277 4053 6536 4052  
+4549 1864 2526 2527 4545 8625 1824  
+4550 4906 2528 1971 3234 9187 4013  
+4551 2257 2526 2528 1824 4013 4012  
+4552 2530 2529 2271 4041 4554 4040  
+4553 4930 2529 2299 4040 9236 9235  
+4554 2530 2271 2531 4556 4043 4552  
+4555 2530 474 4929 4097 9234 9490  
+4556 2532 2531 2271 4554 4558 1445  
+4557 2272 2531 2270 1445 4038 9491  
+4558 2533 2532 2271 4556 4560 4057  
+4559 2270 2532 962 4057 4362 1445  
+4560 2314 2533 2271 4558 4041 4127  
+4561 2533 2279 4921 9220 1446 4127  
+4562 4218 1908 5616 7851 3321 5827  
+4563 2362 2534 1909 4565 4222 88  
+4564 2536 2535 1908 7851 4566 2156  
+4565 1909 2534 2535 10580 7036 4563  
+4566 2188 2536 1908 4564 3322 3873  
+4567 5670 5717 1194 10781 10689 10782  
+4568 4567 2537 1076 4460 8529 8528  
+4569 2538 1800 1804 3108 3106 4571  
+4570 1801 2537 2538 4571 3109 2832  
+4571 1800 2538 2537 4570 8528 4569  
+4572 5695 2514 5051 4523 9475 10739  
+4573 2539 5695 2540 10738 757 10739  
+4574 3138 3278 602 6030 5755 6031  
+4575 964 2518 2540 757 4577 4531  
+4576 1225 2541 833 5751 1189 1967  
+4577 964 2540 2541 903 1967 4575  
+4578 2542 5061 2956 9494 343 658  
+4579 5227 753 2874 5227 9816 2699  
+4580 2554 2543 182 996 4603 4602  
+4581 2543 2545 2544 4585 4582 4583  
+4582 736 2543 2544 4581 997 730  
+4583 2545 2543 756 4602 4584 4581  
+4584 2546 2545 756 4583 748 526  
+4585 520 2544 2545 4581 1030 738  
+4586 2546 2551 2547 4597 1054 748  
+4587 2546 1007 2548 4590 526 1054  
+4588 765 2556 2547 4589 4597 4606  
+4589 2547 2556 2549 4607 2611 4588  
+4590 2555 2548 1007 4587 4605 4604  
+4591 2957 2548 1231 4604 1978 5391  
+4592 2553 2549 559 4607 7537 4593  
+4593 2549 2553 2550 2983 2982 4592  
+4594 1738 1551 2550 2610 2983 1979  
+4595 2555 1551 1231 5394 4604 2610  
+4596 2554 2552 756 1036 4602 716  
+4597 765 2547 2551 4586 7178 4588  
+4598 181 5063 2552 10505 716 9497  
+4599 631 3867 5578 10506 9498 1037  
+4600 4053 559 4052 7536 7538 7537  
+4601 1527 1738 2553 2983 2563 1536  
+4602 2543 2554 756 4596 4583 4580  
+4603 181 2554 182 4580 -1 716  
+4604 2548 2555 1231 4595 4591 4590  
+4605 1007 2550 2555 2610 4590 2982  
+4606 2556 765 3777 19 7013 4588  
+4607 2549 2556 559 10548 4592 4589  
+4608 3941 839 3939 419 7318 9954  
+4609 5213 2835 847 7319 9789 2555  
+4610 2559 3794 29 -1 7046 1221  
+4611 2561 2558 850 574 4616 1223  
+4612 28 2560 3795 4614 -1 4615  
+4613 2563 5065 680 9501 4620 9502  
+4614 3795 2560 2559 373 7046 4612  
+4615 5064 2560 28 4612 9499 3167  
+4616 2562 2561 850 4611 69 274  
+4617 849 2561 599 10096 5768 1223  
+4618 850 2560 5065 9501 69 373  
+4619 1304 3224 5370 5255 10097 9747  
+4620 2959 2563 680 4613 5396 4621  
+4621 5066 2563 2959 4620 1180 9504  
+4622 387 2565 2564 4628 -1 99  
+4623 2568 883 2567 4627 4624 4630  
+4624 884 2568 2567 4623 1289 4629  
+4625 3545 3544 386 -1 4626 6556  
+4626 386 3541 3545 6558 4625 6551  
+4627 388 2567 883 4623 259 1081  
+4628 2564 2565 2567 1289 1081 4622  
+4629 2569 2568 884 4624 1821 258  
+4630 883 2568 622 10560 10415 4623  
+4631 2566 778 2572 803 1291 6553  
+4632 1150 4117 5606 7659 10561 10557  
+4633 2960 2570 778 803 5398 1080  
+4634 1150 2569 2570 4637 4003 10561  
+4635 2573 2571 2209 5399 9147 4636  
+4636 2961 2571 2573 4635 3916 5401  
+4637 2569 2572 2570 803 4634 1821  
+4638 2565 2572 884 1821 1289 1291  
+4639 2209 4880 4884 9146 9147 9140  
+4640 2252 2573 1151 4026 79 3916  
+4641 5069 146 5253 9868 9867 -1  
+4642 3510 3509 2574 7091 6489 6490  
+4643 2576 5253 2962 9870 9509 9867  
+4644 3819 5067 2574 6493 7091 7090  
+4645 1013 3510 3511 6489 1548 6491  
+4646 145 5111 5078 9585 -1 9588  
+4647 2962 5255 2963 5403 5405 9869  
+4648 5074 5071 2579 4649 9519 9518  
+4649 5071 5072 2579 9522 4648 9513  
+4650 5075 2580 5074 1549 9519 6370  
+4651 5471 3447 5469 10294 5016 10295  
+4652 5077 3506 2581 6483 4653 9525  
+4653 5077 2581 3510 6492 6491 4652  
+4654 5471 3506 3449 6484 10298 10297  
+4655 5080 2586 5082 9533 3798 9530  
+4656 5071 2578 5073 9512 9517 9518  
+4657 2605 1123 5114 9592 4698 9526  
+4658 3487 2149 5488 10331 10332 9529  
+4659 5081 5103 2599 9579 9532 9531  
+4660 2584 5081 2586 4685 9528 9531  
+4661 2601 5109 144 -1 7705 9586  
+4662 5104 2604 1179 4689 9576 9595  
+4663 2586 2583 5079 1875 9528 9530  
+4664 5089 5088 2598 1876 9547 4682  
+4665 5477 3595 2588 9536 10310 10309  
+4666 2588 5083 5084 9535 6386 9536  
+4667 3454 3457 2147 6652 6381 3793  
+4668 5697 1178 5363 10083 664 10082  
+4669 5087 5084 2587 9535 1362 9537  
+4670 5363 2591 3206 5887 4673 10083  
+4671 2590 3206 5696 10740 2901 4673  
+4672 5097 2597 5101 9569 4683 4677  
+4673 3206 2590 5363 664 4670 4671  
+4674 5091 5697 5100 9550 9568 10082  
+4675 5093 3621 5713 10773 6704 9553  
+4676 2595 5096 5093 9559 9557 9560  
+4677 5097 5098 2597 4681 4672 9562  
+4678 2595 5698 5095 1468 9564 9557  
+4679 5107 2603 1177 9561 9582 9581  
+4680 5096 2596 3796 1878 4694 9563  
+4681 5099 2597 5098 4677 1874 4684  
+4682 5088 5089 2589 9549 9545 4664  
+4683 5097 5101 1177 1767 9561 4672  
+4684 2597 5099 5089 9566 9569 4681  
+4685 5081 804 2586 9533 4660 9571  
+4686 5106 2600 5105 1880 9578 4687  
+4687 2600 5106 5108 9580 7706 4686  
+4688 2600 4143 5107 7704 1880 7706  
+4689 1179 2604 5113 9591 9583 4662  
+4690 144 4142 4141 7707 7705 -1  
+4691 3594 5489 3492 10334 6455 6651  
+4692 3594 3457 5086 9542 9541 6652  
+4693 4139 1181 4140 7702 7699 7701  
+4694 3796 974 5096 9559 4680 7692  
+4695 5113 5112 2585 -1 1877 9591  
+4696 5103 2584 5104 9573 9576 9531  
+4697 2605 2584 5079 9528 9526 9573  
+4698 5115 2605 5114 4657 9593 9575  
+4699 684 2606 11 1163 348 371  
+4700 1025 4056 5116 7543 9597 7544  
+4701 2608 1195 662 789 4703 1908  
+4702 2607 1196 4447 8291 201 4704  
+4703 2608 662 5595 10538 876 4701  
+4704 1196 2607 2608 1908 8978 4702  
+4705 2609 740 4045 7521 527 4708  
+4706 694 1226 2609 1969 1005 487  
+4707 245 2610 246 1968 -1 484  
+4708 740 2609 2610 1969 7158 4705  
+4709 3727 749 2139 3780 459 6913  
+4710 719 2611 561 6912 964 1022  
+4711 4766 4764 2612 8921 2177 8912  
+4712 1334 2729 2625 3631 8920 2181  
+4713 2614 2613 1004 1531 4715 209  
+4714 531 1467 2613 2442 4750 2444  
+4715 2615 2614 1004 4713 4717 783  
+4716 2631 2614 1336 4722 4749 209  
+4717 2615 1004 2616 4747 1530 4715  
+4718 2617 2615 1332 4742 4721 783  
+4719 2630 1004 1466 1531 4748 4747  
+4720 2629 2616 2630 4747 863 4746  
+4721 2618 2617 1332 4718 4723 2176  
+4722 2614 2617 1336 2183 4716 783  
+4723 2619 2618 1332 4721 4954 1277  
+4724 2618 877 2621 4729 2176 1986  
+4725 2736 2628 2620 4744 558 4955  
+4726 2619 1333 2623 4733 1277 2899  
+4727 1332 2627 2736 4955 4954 4742  
+4728 4473 2620 1696 4744 8342 8341  
+4729 2622 2621 877 4724 9600 4760  
+4730 2636 2622 5119 2184 9603 4760  
+4731 5118 877 2626 2185 9601 9600  
+4732 2622 5118 3600 4740 2184 9600  
+4733 2624 2623 1333 4726 4735 4734  
+4734 2623 2624 2626 2178 2185 4733  
+4735 1333 5117 2624 4738 4733 9598  
+4736 2612 4768 2625 8920 9599 8921  
+4737 1335 2624 2625 4738 4945 2178  
+4738 2625 2624 5117 4735 9599 4737  
+4739 2635 2626 1335 2178 3636 9601  
+4740 5118 1984 3600 6663 4732 3635  
+4741 2627 569 2628 4743 4955 898  
+4742 2615 2627 1332 4727 4718 1530  
+4743 4474 2628 569 4741 2886 8343  
+4744 1696 2620 2628 4725 8343 4728  
+4745 870 2629 656 863 768 195  
+4746 569 2616 2629 4720 7346 898  
+4747 1004 2630 2616 4720 4717 4719  
+4748 2630 1466 1078 2443 567 4719  
+4749 2632 2631 1336 4716 4759 3483  
+4750 2613 2631 531 4756 4714 209  
+4751 1336 2621 2636 4760 4759 2183  
+4752 1338 2967 2634 5413 765 3485  
+4753 1338 2632 2633 4754 3499 765  
+4754 2633 2632 2636 4759 9603 4753  
+4755 4723 2634 1992 5413 8831 8830  
+4756 2631 2634 531 8830 4750 3483  
+4757 3217 2731 2732 4944 5909 5908  
+4758 3556 2635 2067 2201 6579 6577  
+4759 1336 2636 2632 4754 4749 4751  
+4760 2622 2636 2621 4751 4729 4730  
+4761 556 1737 2637 4762 4764 10214  
+4762 5120 2637 1737 4761 9604 5151  
+4763 4125 3389 2638 6252 1846 7675  
+4764 556 2637 2638 2492 6252 4761  
+4765 5163 5123 2641 3021 1125 9691  
+4766 1748 375 2639 -1 9606 7189  
+4767 1767 2748 2750 9707 9690 4979  
+4768 1458 3023 3804 7062 9612 3066  
+4769 2737 2641 2052 4771 4956 1125  
+4770 1757 5275 3115 9910 5708 9911  
+4771 2641 2964 2052 3605 4769 3040  
+4772 2643 1728 2644 9615 1115 4777  
+4773 1201 1857 2643 3219 1115 8611  
+4774 5125 1728 1996 3493 3492 9615  
+4775 2644 5125 2646 9614 2463 9615  
+4776 2645 512 5175 9715 3161 2460  
+4777 1728 2643 2645 3219 8561 4772  
+4778 4289 2646 1476 9614 7992 4779  
+4779 2646 4289 2647 7991 2466 4778  
+4780 4287 2647 1202 7991 7987 2468  
+4781 1479 1475 2647 2466 2468 2461  
+4782 1887 4647 2651 8682 3279 8683  
+4783 2649 2648 1888 4789 4784 4787  
+4784 2649 1888 5013 3282 9617 4783  
+4785 2649 3688 2650 6838 4787 1461  
+4786 2650 1877 4636 8661 8660 6838  
+4787 2648 2649 2650 4785 3255 4783  
+4788 2652 2651 508 8682 3314 3281  
+4789 1888 2648 2651 3279 3281 4783  
+4790 3558 508 1905 9862 6583 3314  
+4791 2652 1889 2653 4792 4365 6584  
+4792 3390 2653 1889 4791 6253 916  
+4793 1888 2653 2433 916 3282 4365  
+4794 2967 2654 1477 2464 5412 3485  
+4795 1338 1999 2654 3497 3485 6572  
+4796 2675 2655 1091 9652 4836 4797  
+4797 2655 2675 2656 1696 1627 4796  
+4798 2657 2656 1086 1696 4800 4799  
+4799 2656 2657 2666 1551 3900 4798  
+4800 1086 2659 2657 4803 4798 4804  
+4801 2659 2838 2658 5155 4803 4805  
+4802 1052 2657 2658 4803 1624 1551  
+4803 2658 2657 2659 4800 4801 4802  
+4804 2660 2659 1086 4800 4806 5889  
+4805 2659 917 2838 5154 4801 2205  
+4806 5127 2660 1086 4804 9618 9619  
+4807 4873 5128 2660 5890 3893 9126  
+4808 5131 2661 5128 9621 9620 9626  
+4809 2845 2661 1347 9623 5169 1695  
+4810 5131 2667 2662 9624 9626 4820  
+4811 5130 2662 5134 9624 9633 957  
+4812 2663 5134 3559 9632 4813 9633  
+4813 3559 5510 2663 10374 4812 10375  
+4814 2665 2664 1051 825 455 1618  
+4815 2664 516 2741 4964 4501 1618  
+4816 2841 1051 2840 196 5160 455  
+4817 2665 1048 3392 6257 5181 5159  
+4818 2503 2666 1052 1551 4965 6588  
+4819 2201 3225 5511 3400 10377 5925  
+4820 5131 5132 2667 9631 4810 9627  
+4821 2667 5133 5134 3099 9624 9631  
+4822 2668 5510 5135 4491 9642 10374  
+4823 5135 2670 5139 9643 9642 3238  
+4824 1866 4869 5136 9115 9634 9117  
+4825 2669 5136 5137 9637 9639 3597  
+4826 5655 1158 4464 8324 8323 9649  
+4827 1093 2668 5139 9642 4829 1708  
+4828 560 2844 5216 9796 2878 276  
+4829 5141 1093 5139 4827 9643 9646  
+4830 4748 1062 5676 10700 3582 9638  
+4831 2040 2058 4772 3617 3581 3618  
+4832 525 4462 4463 8319 8322 8326  
+4833 5140 2673 4464 1838 8324 8931  
+4834 2674 5141 5142 9647 10659 1646  
+4835 2674 1686 4461 2877 9651 10658  
+4836 2676 2675 1091 4796 4838 1694  
+4837 2675 2198 5127 9619 9618 1694  
+4838 2677 2676 1091 4836 4840 3654  
+4839 2676 2076 4872 9123 3894 3654  
+4840 2678 2677 1091 4838 4842 3659  
+4841 3764 2679 716 1704 6987 6986  
+4842 5144 2678 1091 4840 9652 8958  
+4843 2678 2079 4783 8950 9655 8958  
+4844 2679 2073 3763 3646 6974 6986  
+4845 2076 2677 2679 1704 6974 3654  
+4846 2479 2680 2099 3148 3699 4453  
+4847 4578 2680 1821 4453 8551 8550  
+4848 5362 541 3205 5885 1450 10081  
+4849 2681 5362 5147 10080 1965 10081  
+4850 2682 5148 2968 9661 4851 3754  
+4851 2682 2968 5671 3326 8733 4850  
+4852 721 1435 5149 9662 1533 1266  
+4853 2687 2683 1006 4855 10541 967  
+4854 2685 2684 572 1631 4856 1534  
+4855 1006 2683 2684 9663 6756 4853  
+4856 2686 2685 572 4854 9665 1761  
+4857 1120 3647 5531 10414 10413 720  
+4858 5150 572 1436 2383 1779 9665  
+4859 1129 2920 2921 5318 169 9846  
+4860 1006 4043 5596 7518 10541 1535  
+4861 2133 2687 1005 711 1532 967  
+4862 3489 3490 468 6452 6450 6406  
+4863 2151 3479 3480 6430 3800 3801  
+4864 4847 2689 2163 8190 9073 3824  
+4865 2691 2690 1595 3804 4870 9668  
+4866 1596 4392 136 10261 845 2700  
+4867 2695 2694 3601 10396 6590 9673  
+4868 2691 5153 5151 673 9669 9670  
+4869 5154 3500 5494 6471 10343 9672  
+4870 2696 2691 1595 4865 4877 9670  
+4871 1595 2689 2693 3827 4873 3804  
+4872 5521 5512 3561 -1 10395 4874  
+4873 2693 2695 1595 4877 4871 2696  
+4874 5521 3562 5512 10379 4872 6665  
+4875 2696 469 2692 -1 4876 6666  
+4876 2696 2692 5153 9671 9670 4875  
+4877 1595 2695 2696 6590 4870 4873  
+4878 2698 2697 819 9106 4880 1161  
+4879 1834 689 2697 3175 1161 6961  
+4880 2699 2698 819 4878 4882 828  
+4881 1834 2698 161 828 8569 1161  
+4882 2701 2699 819 4880 1301 47  
+4883 161 2699 162 1299 -1 828  
+4884 2703 2700 889 4887 7433 5892  
+4885 3208 162 2700 1299 5892 -1  
+4886 819 4863 2702 9105 1301 9106  
+4887 2700 2701 889 1162 4884 47  
+4888 4662 2702 595 9105 8711 8710  
+4889 3999 2702 970 8710 7431 7430  
+4890 889 3999 4000 680 7433 7430  
+4891 2703 888 3961 7359 7358 1302  
+4892 2705 2704 821 3965 4894 263  
+4893 2704 391 4894 -1 9165 263  
+4894 2705 821 2706 4896 359 4892  
+4895 391 2705 392 359 -1 263  
+4896 3548 2706 821 4894 363 6564  
+4897 5603 2706 1149 6564 10554 7656  
+4898 4937 2707 1372 1520 9249 4115  
+4899 5155 2707 1544 4115 9674 2592  
+4900 2708 1621 2709 4902 2747 2105  
+4901 2169 2708 808 5558 2749 3837  
+4902 1621 2712 2709 4903 4900 4908  
+4903 2709 2712 2710 4909 2748 4902  
+4904 989 3209 2710 4906 4909 5891  
+4905 2711 899 4409 1321 8218 9676  
+4906 3209 2711 2710 2508 4904 5893  
+4907 2711 1499 4404 8208 9677 5893  
+4908 2401 2712 1621 4902 2304 4301  
+4909 2710 2712 989 4301 4904 4903  
+4910 783 2445 2713 4911 3814 6237  
+4911 5157 2713 2445 4910 9678 4388  
+4912 2714 1146 2715 4914 4929 1382  
+4913 2714 2158 4842 9064 9063 4928  
+4914 2742 2715 1146 4912 4966 6933  
+4915 2715 3737 2716 6932 815 6933  
+4916 2722 707 1852 3210 4927 4926  
+4917 2718 2721 2717 939 4918 4920  
+4918 2717 168 2718 4922 4917 -1  
+4919 2718 2157 4841 9061 3815 1381  
+4920 2718 929 2721 4924 4917 3815  
+4921 2157 2719 1578 2665 2664 1381  
+4922 2718 168 2719 4925 1381 4918  
+4923 2720 167 4382 814 8166 -1  
+4924 929 2716 2721 3813 4920 815  
+4925 2719 168 2720 -1 2665 4922  
+4926 707 2722 2716 3813 6932 4916  
+4927 169 2722 1852 4916 3209 927  
+4928 2158 2714 2723 4929 9062 4913  
+4929 2715 2723 2714 4928 4912 715  
+4930 2492 2724 1583 4486 4479 2675  
+4931 2724 2203 5161 9687 3904 9447  
+4932 5159 2725 2113 9681 9682 3732  
+4933 5160 2725 483 3732 9684 1211  
+4934 2726 505 2727 4936 2194 3822  
+4935 3216 2726 2204 6915 5906 3907  
+4936 505 5161 2727 4939 4934 9686  
+4937 2203 4820 2728 9024 9687 9025  
+4938 2116 2727 2728 4939 6250 3734  
+4939 2728 2727 5161 4936 9687 4938  
+4940 4762 5680 1334 2181 8910 2180  
+4941 2731 2729 2065 3608 4944 3631  
+4942 5264 2053 2994 3609 5467 9889  
+4943 2730 5264 2734 9888 4950 9889  
+4944 2731 2065 2732 4946 4757 4941  
+4945 2625 2731 1335 5908 4737 3631  
+4946 2733 2732 2065 4944 4948 3630  
+4947 3749 5162 2066 4953 6957 3469  
+4948 2734 2733 2065 4946 4950 3632  
+4949 2735 2733 2064 3632 3629 3630  
+4950 2730 2734 2065 4948 3608 4943  
+4951 2734 878 2997 651 5473 9888  
+4952 2064 2998 5709 10765 3629 3626  
+4953 2735 2066 5162 4947 9689 10170  
+4954 1332 2736 2619 558 4723 4727  
+4955 2627 2628 2736 4725 4727 4741  
+4956 5164 2737 2052 4769 9692 3041  
+4957 5163 2737 1767 3602 9690 1125  
+4958 2965 5256 2052 9873 3605 5407  
+4959 1096 4870 2749 3887 4961 9119  
+4960 2971 2740 5166 9697 9696 4962  
+4961 2749 5165 1096 3881 4959 4980  
+4962 2971 3227 2740 9698 4960 5421  
+4963 5167 2192 2985 5449 9699 10745  
+4964 2502 2741 516 4815 4499 1626  
+4965 1052 2741 2503 4498 4818 4501  
+4966 2744 2742 1146 4914 4970 1812  
+4967 2742 498 2743 4968 1813 1812  
+4968 4209 2743 498 4967 7832 2091  
+4969 5168 2743 1287 2091 9700 3207  
+4970 2745 2744 1146 4966 4972 1090  
+4971 2744 1145 4113 1811 7652 1090  
+4972 2713 2745 1146 4970 1382 4388  
+4973 1145 2745 538 9679 401 1090  
+4974 2738 2749 2746 4975 9693 4980  
+4975 2746 2749 2747 4981 3886 4974  
+4976 2936 2747 2194 4981 5351 9702  
+4977 5170 2748 5169 1711 9705 9704  
+4978 1766 3803 5171 3036 4982 7061  
+4979 1767 2747 2748 1711 4767 3886  
+4980 2749 2738 5165 9694 4961 4974  
+4981 2747 2749 2194 3887 4976 4975  
+4982 5171 2748 1766 9704 4978 9707  
+4983 873 4560 5661 10671 10670 8515  
+4984 179 645 2751 4985 776 774  
+4985 2751 645 3943 628 7325 4984  
+4986 2752 36 2757 945 4993 811  
+4987 710 1725 5172 9708 4989 2957  
+4988 37 2752 2753 9709 1632 811  
+4989 2752 710 5172 4987 9709 4991  
+4990 2458 2754 1369 4996 2249 4412  
+4991 710 2752 2754 4993 4412 4989  
+4992 35 2756 2755 4995 -1 520  
+4993 2757 2754 2752 4991 4986 4996  
+4994 5173 1650 4439 831 8278 9711  
+4995 2756 2757 2755 945 4992 556  
+4996 1369 2754 2757 4993 556 4990  
+4997 2758 284 4078 947 7585 149  
+4998 2759 2758 711 156 4999 2716  
+4999 3569 2759 711 4998 6602 120  
+5000 2854 2759 1604 120 5186 2716  
+5001 2761 2760 784 7209 5003 1093  
+5002 1504 365 2760 2517 1093 106  
+5003 2761 784 2762 5005 4244 5001  
+5004 1504 2761 670 4244 572 1093  
+5005 3884 2762 784 5003 7211 7210  
+5006 4987 562 4986 4243 9350 9349  
+5007 5174 2763 748 1235 9712 1919  
+5008 2764 2763 512 9715 5009 197  
+5009 1856 2764 512 5008 65 1282  
+5010 2764 604 3949 1236 7337 8609  
+5011 2767 3450 5474 10304 10303 3788  
+5012 2855 5497 5460 6333 9797 10348  
+5013 2767 5496 3503 10347 6473 6477  
+5014 2766 5461 3433 6339 6328 10277  
+5015 2145 3446 3501 6365 6475 10293  
+5016 5469 2145 5471 10297 4651 10293  
+5017 3779 266 265 -1 482 1178  
+5018 1039 2768 827 7017 1600 634  
+5019 5556 2770 5178 1473 9720 6879  
+5020 5178 5180 2769 9722 9719 1473  
+5021 975 4861 4878 9101 3865 9102  
+5022 5180 732 2771 6545 9724 9133  
+5023 732 3538 3539 6546 6545 284  
+5024 5179 3543 384 6554 9721 662  
+5025 648 2772 1102 835 604 1726  
+5026 4369 2773 2772 147 5028 8140  
+5027 5181 406 453 279 9725 9726  
+5028 4369 2772 1103 467 8142 5026  
+5029 4063 5182 1032 9728 7558 7557  
+5030 255 1148 2775 504 1257 1818  
+5031 2777 2776 813 1147 5033 638  
+5032 4188 2776 529 638 7793 7792  
+5033 2778 2777 813 5031 5035 9730  
+5034 5183 2468 3797 2701 7049 9729  
+5035 5185 2778 813 5033 9733 9732  
+5036 2781 1711 4491 8378 8377 2928  
+5037 5571 813 3780 1147 7019 9733  
+5038 5700 2780 5190 5039 10748 5040  
+5039 2780 5189 5190 9742 5038 2559  
+5040 2780 5700 5336 10747 441 5038  
+5041 5184 2781 2778 2926 9732 9731  
+5042 3391 2781 754 9731 6255 2928  
+5043 4205 2782 1282 1002 7825 7823  
+5044 1297 2782 1038 7823 2110 2072  
+5045 3892 3893 664 7283 7226 7225  
+5046 3894 2784 5191 355 9746 7229  
+5047 1656 3097 3100 5672 5680 5048  
+5048 1656 5319 3097 9999 5047 5670  
+5049 4681 2786 1084 2692 3346 8749  
+5050 1339 2785 1485 2189 2480 615  
+5051 5193 2786 1920 8749 9749 3447  
+5052 3218 2787 1026 7548 5910 1575  
+5053 2787 1682 3998 7429 7428 6954  
+5054 2788 5194 5195 9752 8182 2904  
+5055 1510 3199 5359 5874 10075 2527  
+5056 754 5189 5186 2559 9736 9741  
+5057 1713 2830 2831 5138 5756 5139  
+5058 2790 666 4498 2251 8391 3000  
+5059 2790 1370 4239 928 7892 2370  
+5060 2791 3037 2792 5553 5063 2794  
+5061 949 1929 2791 2048 5063 3363  
+5062 2792 1645 3222 10093 2516 5553  
+5063 949 2791 2792 5060 8263 5061  
+5064 3039 2793 1186 1420 5556 1606  
+5065 1600 2791 2793 2048 2705 2794  
+5066 5608 2794 1599 5557 10565 10564  
+5067 492 4476 2795 8348 5069 2707  
+5068 1600 2794 2795 5069 5552 2705  
+5069 492 2795 2794 5068 10564 5067  
+5070 1216 2015 2796 5071 4278 2764  
+5071 2798 2796 2015 5070 5074 1949  
+5072 5419 2016 3322 6117 6119 10195  
+5073 1082 3335 3336 4255 10194 6144  
+5074 936 2798 2015 5071 3529 2772  
+5075 2797 2798 2016 3510 10195 1949  
+5076 2800 2799 501 3561 5081 1842  
+5077 3173 3223 1160 3562 3569 1839  
+5078 501 2027 5196 9755 5081 3555  
+5079 2800 1190 3171 552 350 5080  
+5080 1190 2800 2801 9756 3553 5079  
+5081 5196 2800 501 5076 5078 9756  
+5082 2802 3767 5199 6983 9760 3651  
+5083 1089 3030 3031 5536 9759 5538  
+5084 1770 5244 2927 3742 9761 9849  
+5085 3395 2934 5245 5346 9852 6263  
+5086 5201 2804 5200 3889 3100 5087  
+5087 5201 5198 2804 5541 5086 9766  
+5088 2805 4805 5202 8995 9770 1398  
+5089 5204 2805 5203 9770 6122 8993  
+5090 3040 2806 808 3840 5558 1500  
+5091 4409 2806 1620 1500 8218 8217  
+5092 2807 1323 2808 5094 3318 3869  
+5093 2807 1907 4672 3319 8731 9774  
+5094 4866 2808 1323 5092 2155 9112  
+5095 2189 4595 5206 8580 3877 3876  
+5096 507 2383 5207 9778 9777 4264  
+5097 1537 2808 2809 9776 2580 1457  
+5098 1536 1354 2810 5101 2581 8104  
+5099 1354 5208 2811 3808 5101 9779  
+5100 1537 2810 2811 5101 2583 2580  
+5101 1354 2811 2810 5100 5098 5099  
+5102 2812 1538 2813 5104 2585 2218  
+5103 2812 1907 5205 9774 9773 9782  
+5104 5636 2813 1538 5102 10620 8095  
+5105 4660 1897 4659 8705 8707 8706  
+5106 2242 2814 2241 4022 3978 3459  
+5107 1149 2814 750 3459 1819 3980  
+5108 2316 2815 998 8626 2934 4131  
+5109 4915 2815 1417 4131 9206 9205  
+5110 4973 2816 1424 4139 9321 5111  
+5111 2816 4973 5622 9320 10592 5110  
+5112 702 4607 5210 1757 5115 8603  
+5113 3570 2817 854 5114 6604 1231  
+5114 854 2817 2818 9784 1232 5113  
+5115 2817 702 5210 5112 9784 4213  
+5116 1629 3336 5211 6146 9786 4254  
+5117 4417 2819 1628 9785 1805 8234  
+5118 2826 2820 1036 4516 5130 5119  
+5119 2820 2826 2821 1592 1831 5118  
+5120 2822 2821 920 1592 5122 5121  
+5121 2821 2822 2823 2085 1325 5120  
+5122 4206 2822 920 5120 7826 1851  
+5123 5614 2822 1284 1851 10576 1495  
+5124 2824 2823 1165 2085 1852 5560  
+5125 3041 2513 1155 1832 4518 1323  
+5126 5613 1165 5614 1495 10577 10574  
+5127 2828 2824 2825 1852 5129 5135  
+5128 3738 2825 901 7831 6934 1032  
+5129 2828 2825 1712 1032 5134 5127  
+5130 2827 2826 1036 5118 5132 5131  
+5131 2834 2826 2827 5130 1088 5147  
+5132 1036 1343 2827 5137 5130 971  
+5133 1343 4291 2829 7995 5137 7996  
+5134 2830 2828 1712 5129 5140 267  
+5135 506 2824 2828 5127 9472 5561  
+5136 1035 2827 2829 5137 5142 1088  
+5137 1343 2829 2827 5136 5132 5133  
+5138 3741 2831 2830 5057 5140 6939  
+5139 2830 1713 5050 9473 267 5057  
+5140 3741 2830 1712 5134 6940 5138  
+5141 5187 2831 2789 6939 9738 9737  
+5142 1035 2829 2832 5143 1591 5136  
+5143 517 2832 2829 5142 7995 2198  
+5144 1272 2833 1034 1593 2061 2060  
+5145 5590 2833 592 2060 10528 7453  
+5146 5212 1035 2833 1591 1363 9788  
+5147 920 2826 2834 5131 7826 1592  
+5148 1521 5214 2835 5149 2555 9791  
+5149 2835 5214 3042 9792 2056 5148  
+5150 1491 2637 2836 5151 5152 2492  
+5151 2836 2637 5120 4762 9605 5150  
+5152 1491 2836 2837 5153 64 5150  
+5153 1490 2837 2836 5152 2490 450  
+5154 2839 2838 917 4805 5156 1625  
+5155 1051 2658 2838 4801 196 825  
+5156 2845 2839 917 5154 5168 1835  
+5157 2839 1157 2840 5158 1625 5171  
+5158 1157 2842 2840 5160 5157 5162  
+5159 2665 2841 1048 1619 4817 455  
+5160 2842 2841 2840 4816 5158 5161  
+5161 2841 2842 2848 5163 1619 5160  
+5162 2842 1157 2843 5164 2874 5158  
+5163 2842 654 2848 5174 5161 9794  
+5164 2844 2843 1157 5162 5166 5172  
+5165 2847 1685 4459 564 8314 8317  
+5166 2846 2844 1157 5164 5171 9796  
+5167 2671 5216 1347 5170 2206 9795  
+5168 2845 917 3207 2205 1695 5156  
+5169 2846 2845 1347 4809 5170 1835  
+5170 2846 1347 5216 5167 9796 5169  
+5171 2839 2846 1157 5166 5157 1835  
+5172 2844 2847 2843 2876 5164 276  
+5173 4461 2847 560 276 8318 8317  
+5174 654 2852 2848 5177 5163 5182  
+5175 1156 4120 2849 7664 5183 7665  
+5176 1048 2848 2849 5177 5179 1619  
+5177 2849 2848 2852 5174 5183 5176  
+5178 2943 2851 644 81 580 5365  
+5179 1048 2849 2850 910 6257 5176  
+5180 5044 2851 1049 5365 9461 9460  
+5181 516 2665 3392 4817 6258 1618  
+5182 2852 654 2853 5184 1617 5174  
+5183 2849 2852 1156 1617 5175 5177  
+5184 5215 2853 654 5182 9794 9793  
+5185 4458 2853 1684 9793 1129 8312  
+5186 286 2854 1604 5000 6677 2715  
+5187 2758 2854 285 2715 149 2716  
+5188 3769 835 3768 6995 10488 9798  
+5189 5497 3513 3507 6498 10349 10348  
+5190 149 5501 3523 6516 -1 10356  
+5191 5499 3513 3514 6502 10353 10352  
+5192 566 743 2857 5193 4208 1011  
+5193 2857 743 2858 5194 859 5192  
+5194 743 124 2858 5195 5193 861  
+5195 124 123 2858 1010 5194 -1  
+5196 564 3990 5218 7414 9800 1424  
+5197 2446 793 2859 4390 9799 7133  
+5198 2863 2861 5219 9802 9801 5205  
+5199 612 868 2860 1259 1680 7263  
+5200 5355 571 3187 644 5850 10067  
+5201 3661 3664 1079 5202 6783 6781  
+5202 3664 3668 1079 10066 5201 6790  
+5203 2862 3668 3666 6790 6808 6797  
+5204 3994 2863 731 987 7420 322  
+5205 571 2861 2863 5198 322 10067  
+5206 2865 15 14 -1 7423 211  
+5207 731 2860 2864 1259 1431 987  
+5208 3995 14 13 -1 747 7423  
+5209 954 731 2865 1431 7422 7420  
+5210 5220 5221 2867 9807 1104 9804  
+5211 3910 3911 589 9803 7260 7259  
+5212 2868 2869 5222 5217 5214 5213  
+5213 2868 1657 2869 5215 5212 2821  
+5214 2868 5222 5223 9808 2829 5212  
+5215 1657 2871 2869 2817 5213 9986  
+5216 2870 2869 790 2817 5218 2820  
+5217 5222 2869 2867 9814 9807 5212  
+5218 5224 2870 790 5216 9811 7342  
+5219 2870 3952 5225 1247 2820 7342  
+5220 5313 1657 3082 508 9987 9986  
+5221 1656 3101 5320 10001 5642 5680  
+5222 3393 2872 1664 9810 6259 2835  
+5223 3081 2872 1661 2835 5639 2828  
+5224 886 5701 3111 10751 9076 1294  
+5225 886 3960 3959 7354 1294 7353  
+5226 5227 5226 189 -1 562 9816  
+5227 5228 2874 753 4579 9817 1485  
+5228 1101 309 2875 5229 8630 315  
+5229 4111 2875 309 5228 -1 7649  
+5230 3798 2876 1239 7788 7050 519  
+5231 4337 2876 580 519 8080 8078  
+5232 5229 2877 1257 1403 9819 2031  
+5233 940 2877 1262 2031 7406 2041  
+5234 482 2474 2879 4443 5237 2993  
+5235 1350 2878 1185 152 1893 1892  
+5236 1183 4145 4147 7716 7715 7712  
+5237 482 2879 2878 152 1855 5234  
+5238 992 2880 614 2262 89 1507  
+5239 1377 2880 510 1174 1511 2263  
+5240 3571 2881 682 2620 6606 3171  
+5241 1133 4101 5230 7628 9822 7632  
+5242 2882 993 4030 7493 7492 1508  
+5243 579 1608 2882 2724 1506 83  
+5244 2886 2883 1451 5247 5250 590  
+5245 4433 2883 527 2408 8265 1228  
+5246 2884 852 5233 9827 2825 5703  
+5247 1451 2883 2884 2799 9826 5244  
+5248 2885 5233 2887 9827 2823 9828  
+5249 3098 1658 3096 5669 5668 5674  
+5250 5234 2886 1451 5244 9829 3118  
+5251 2886 1450 2889 5256 590 9832  
+5252 5236 2887 852 9827 9833 1225  
+5253 496 3099 3106 5675 5690 5676  
+5254 5236 3112 2888 5776 9834 9833  
+5255 3224 5369 5370 10095 4619 2121  
+5256 1450 2891 2889 5257 5251 5260  
+5257 2889 2891 2890 5261 2800 5256  
+5258 5629 1449 4269 7952 10607 10606  
+5259 1647 527 2890 2800 610 8265  
+5260 2891 1450 4557 8509 8508 5256  
+5261 2890 2891 1449 10602 10606 5257  
+5262 5238 2892 5633 10614 8051 5878  
+5263 1702 3200 3201 5875 9838 5876  
+5264 3742 2893 1509 5877 6942 4401  
+5265 4318 2893 690 4401 8049 696  
+5266 625 5239 2894 5268 8386 9839  
+5267 2901 5240 1427 9841 5280 9842  
+5268 5239 2895 2894 2159 5266 9840  
+5269 1498 4303 3743 8020 6945 2271  
+5270 1324 2898 2896 5272 2365 5274  
+5271 2897 1430 4497 8389 8388 1085  
+5272 2898 2897 2896 2371 5270 5275  
+5273 4260 2897 533 5275 7933 1085  
+5274 2900 2898 1324 5270 2357 2361  
+5275 2897 2898 533 2367 5273 5272  
+5276 1425 2350 2899 5277 5279 2359  
+5277 5624 2899 2350 5276 10599 7927  
+5278 1324 2895 5240 9841 2357 2159  
+5279 2899 2900 1425 5281 5276 2361  
+5280 2903 2901 1427 5267 2289 2364  
+5281 1425 2900 2901 9842 2160 5279  
+5282 4250 2902 1273 5285 1929 7914  
+5283 4972 2902 1423 7914 9322 9319  
+5284 2903 2905 2904 5289 313 2289  
+5285 2902 2903 1273 313 5282 2364  
+5286 4247 2904 1389 5289 7907 2288  
+5287 4249 2904 1398 2288 2307 7911  
+5288 3743 2906 2905 5291 407 2505  
+5289 1389 2904 2905 5284 5291 5286  
+5290 1384 2906 1069 2505 7906 1660  
+5291 1389 2905 2906 5288 2279 5289  
+5292 1073 1786 2907 5293 2418 3079  
+5293 1764 2907 1786 5292 3078 2420  
+5294 1455 3802 2909 7058 1668 7059  
+5295 2908 1454 2179 9847 3856 5297  
+5296 2911 2910 2909 5299 2419 2088  
+5297 1454 2908 2909 1668 5299 5295  
+5298 2915 2910 1286 2088 5308 2086  
+5299 1454 2909 2910 5296 5323 5297  
+5300 1094 3801 2914 7054 5302 7056  
+5301 3114 494 2918 5314 5313 5705  
+5302 1094 2914 2911 5307 2419 5300  
+5303 2914 2929 2912 9843 5307 5306  
+5304 2913 2932 2931 1712 5327 5305  
+5305 2913 2929 2932 5336 5304 5337  
+5306 2929 2914 1768 7054 5336 5303  
+5307 2912 2911 2914 5302 5303 3043  
+5308 2915 1286 2916 5312 1710 5298  
+5309 2922 2915 872 5317 9848 2086  
+5310 3114 1286 2912 3043 5705 5312  
+5311 2917 1121 2928 5334 5320 2  
+5312 2916 1286 3114 5310 5706 5308  
+5313 2917 3114 2918 5301 2 5706  
+5314 2923 2918 494 5301 5324 1702  
+5315 2202 2918 1980 1702 3903 3902  
+5316 2920 2919 1285 2089 5318 2385  
+5317 2915 2919 872 9845 5309 1710  
+5318 2921 2920 1285 5316 5335 4859  
+5319 1129 4270 5242 1265 9846 7953  
+5320 2917 2928 1285 5335 1762 5311  
+5321 2686 2921 1120 1764 1761 169  
+5322 872 4272 5243 7958 9848 1269  
+5323 2910 2922 1454 3857 5299 2086  
+5324 2924 2923 494 5314 5326 5325  
+5325 2923 2924 2925 3462 3741 5324  
+5326 5241 2924 494 5324 3045 9844  
+5327 2924 2913 2931 5304 5338 9844  
+5328 2926 2925 1981 3462 5330 3744  
+5329 2120 1980 2925 3741 3744 3932  
+5330 2926 1981 2927 5332 3742 5328  
+5331 2120 2926 2121 9850 9031 3744  
+5332 2930 2927 1981 5330 5341 3464  
+5333 5199 2927 2803 6264 9762 9761  
+5334 2090 2928 1121 5311 3681 2087  
+5335 1285 2928 2921 2087 5318 5320  
+5336 2932 2929 1768 5306 5342 5305  
+5337 2929 2913 5241 9844 9843 5305  
+5338 1981 2924 2931 5327 5341 3462  
+5339 3395 2930 1769 5340 6263 3464  
+5340 1769 2930 2931 5341 1712 5339  
+5341 2931 2930 1981 5332 5338 5340  
+5342 1768 3799 2932 5343 5336 7052  
+5343 2932 3799 2933 7053 3042 5342  
+5344 2936 2933 1095 7053 5350 9853  
+5345 2935 5246 2936 9853 5351 9854  
+5346 5245 2934 1089 5349 9851 5085  
+5347 1769 2933 2934 3884 6263 3042  
+5348 2194 4870 5685 9120 10719 3887  
+5349 2934 5246 1089 9854 5346 3884  
+5350 2936 1095 5169 9705 9702 5344  
+5351 2935 2936 2194 4976 10719 5345  
+5352 1850 5247 2937 9856 3353 9855  
+5353 1118 4689 5248 8765 9858 3354  
+5354 1917 2938 1008 3359 3339 2690  
+5355 2938 1590 4390 2687 8181 2690  
+5356 2940 2939 1948 8954 5358 4493  
+5357 4821 2939 483 4493 9027 9026  
+5358 3225 2940 1948 5356 3400 1622  
+5359 483 2940 2499 1622 9684 4493  
+5360 2942 2941 1046 3450 5362 1615  
+5361 216 2941 1045 1615 570 566  
+5362 2943 2942 1046 5360 5364 580  
+5363 2942 644 4069 7569 1613 580  
+5364 2944 2943 1046 5362 5366 1620  
+5365 2943 1049 2851 5180 5178 1620  
+5366 2944 1046 4716 8818 8817 5364  
+5367 5442 3690 558 4497 10240 10239  
+5368 2945 2004 2946 5370 5926 3528  
+5369 936 2012 2945 3526 3531 2773  
+5370 2946 2004 3307 6089 6127 5368  
+5371 5249 2946 1633 6126 9859 5927  
+5372 2947 509 4414 8227 2756 3710  
+5373 806 2947 1624 1752 4247 2755  
+5374 5250 2948 1885 3751 9861 3316  
+5375 4647 2948 508 3316 8682 3272  
+5376 4274 2949 815 3760 7961 2447  
+5377 2950 1585 4087 2678 7602 2449  
+5378 2949 1469 2950 5379 2679 2447  
+5379 2950 1469 4276 2448 7966 5378  
+5380 2258 2951 479 3992 2809 4007  
+5381 3572 2951 1651 4007 6608 2808  
+5382 4925 2952 1418 4132 2347 9226  
+5383 1206 2952 2291 9226 4194 4081  
+5384 3692 2953 584 376 6846 5385  
+5385 2953 3692 5251 6845 1960 5384  
+5386 730 2954 698 1057 457 985  
+5387 564 2438 2954 4374 1424 431  
+5388 3076 2955 1197 4538 5631 5630  
+5389 2955 665 5058 9488 4540 5630  
+5390 5062 2956 633 9494 9496 9495  
+5391 520 2548 2957 4591 5393 1030  
+5392 753 2956 2957 5393 1976 343  
+5393 520 2957 2956 5392 9495 5391  
+5394 1231 1551 5252 1537 9866 4595  
+5395 2958 1230 5228 9818 9817 2455  
+5396 1517 2959 680 4620 396 2543  
+5397 828 5581 5714 10776 10775 395  
+5398 2208 2960 778 4633 6560 3917  
+5399 2571 2960 2209 9140 4635 1080  
+5400 5604 2252 526 4021 10556 4002  
+5401 1150 2571 2961 4636 1292 4003  
+5402 2577 5255 5254 9869 -1 9871  
+5403 5255 2582 2963 9516 4647 9871  
+5404 5114 5073 2963 9512 9516 9592  
+5405 2578 2962 2963 4647 9512 938  
+5406 3115 2964 2642 9613 5708 9874  
+5407 2965 2050 5256 9872 4958 5410  
+5408 2964 5257 2965 5411 3605 9874  
+5409 477 5268 2966 5480 9875 9896  
+5410 2050 2965 2966 5411 5422 5407  
+5411 2966 2965 5257 5408 9875 5410  
+5412 1994 2967 1477 4794 3486 3488  
+5413 2967 1992 2634 4755 4752 3488  
+5414 535 3573 2969 1727 287 6610  
+5415 584 3789 2970 7035 6844 376  
+5416 5558 648 3712 604 2813 10468  
+5417 3691 2970 5258 5418 5419 6844  
+5418 2968 5258 2970 5417 1241 9876  
+5419 5258 859 3691 1027 5417 9877  
+5420 2972 2971 2050 9872 3621 9878  
+5421 3227 2971 2049 1714 5928 4962  
+5422 2050 2966 3265 6004 3621 5410  
+5423 2972 1124 2973 5424 9879 5508  
+5424 2975 2973 1124 5423 5428 9880  
+5425 2974 2973 5260 9880 5530 3588  
+5426 3026 2043 2978 3587 5531 9881  
+5427 2981 1061 2979 5436 3604 8904  
+5428 2986 2975 1124 5424 9918 9882  
+5429 4755 2977 1064 1769 8895 8894  
+5430 2975 5261 2976 5453 3607 9882  
+5431 2054 2994 2987 3609 9883 5466  
+5432 2978 2977 2042 8894 3585 3587  
+5433 2043 2976 2977 1769 3587 3607  
+5434 4752 2042 4751 8887 8886 3585  
+5435 2981 3026 2051 5531 5441 5440  
+5436 2979 1061 2980 193 5929 5427  
+5437 2049 2974 2979 3604 5928 3588  
+5438 5679 2982 2980 5443 193 8907  
+5439 2980 2192 5699 10745 3599 5443  
+5440 3026 2981 2974 3604 5530 5435  
+5441 2981 2051 4760 8905 8904 5435  
+5442 2982 5262 2983 9885 3098 3882  
+5443 2192 2980 2982 5438 3098 5439  
+5444 3228 1797 5039 9451 9450 5930  
+5445 3228 3029 2984 5537 5447 5931  
+5446 2192 2983 2984 5447 5449 3098  
+5447 3228 2984 2983 5446 5930 5445  
+5448 1096 5166 5167 9697 9699 3881  
+5449 2192 2984 2985 3885 4963 5446  
+5450 1124 3015 5279 9919 9918 5508  
+5451 2986 5279 5265 5506 5468 9918  
+5452 1064 2976 2987 5453 5455 1769  
+5453 2987 2976 5261 5430 9883 5452  
+5454 2989 2988 2046 8909 5456 3591  
+5455 1064 2987 2988 3593 3591 5452  
+5456 2990 2989 2046 5454 5458 3589  
+5457 2989 2044 4755 1651 8895 3589  
+5458 2993 2990 2046 5456 3612 3611  
+5459 2990 2045 2991 5460 1279 3611  
+5460 2992 2991 2045 5459 3590 2669  
+5461 2991 478 4756 1585 8897 2669  
+5462 3018 3016 2992 5511 3590 2179  
+5463 2992 1581 5263 9886 3566 5511  
+5464 4763 2046 4762 8909 8910 3612  
+5465 2993 2055 3024 5526 5514 8908  
+5466 2995 2994 2054 5431 9891 5467  
+5467 2994 2995 5264 1397 4942 5466  
+5468 5265 2054 2986 1645 5451 9891  
+5469 5265 2996 2995 5470 9891 5471  
+5470 878 2995 2996 5469 651 1397  
+5471 5265 2999 2996 5477 5469 9890  
+5472 2998 2997 2062 1987 5474 3626  
+5473 2997 2064 2734 3632 4951 3626  
+5474 5266 2998 2062 5472 9892 3025  
+5475 1652 5407 5709 10766 10765 10171  
+5476 2999 2060 3000 5479 3622 9890  
+5477 2062 2996 2999 5471 5501 1987  
+5478 3001 3000 3014 5479 5507 2430  
+5479 2060 3014 3000 5478 5476 3600  
+5480 2966 5268 2061 9897 6004 5409  
+5481 3003 3001 3002 3624 5483 5485  
+5482 3008 3002 477 9896 5494 9898  
+5483 3003 3002 5269 9898 9899 5481  
+5484 3004 3003 1758 9899 5489 9924  
+5485 1588 3001 3003 5481 5519 2430  
+5486 3032 3005 5270 9901 9900 3023  
+5487 5406 1759 3267 3628 10169 10168  
+5488 1759 3004 5270 9900 3024 3627  
+5489 3004 1758 3032 9935 9900 5484  
+5490 3006 5271 5273 9902 3026 9903  
+5491 3006 5285 3027 6027 9905 9930  
+5492 3007 5273 3013 9906 6276 9907  
+5493 3401 3010 3007 9908 6276 9912  
+5494 3115 3008 477 5482 5707 9910  
+5495 3009 3008 5275 9910 9911 3075  
+5496 3021 3009 1757 9911 5520 3022  
+5497 3009 3033 5287 5545 5542 3022  
+5498 5276 3012 5420 217 10197 5502  
+5499 5420 3314 3010 6102 10197 10196  
+5500 3011 1588 5281 9923 3625 1649  
+5501 2999 3011 2062 9892 5477 3622  
+5502 3012 5276 3229 9913 2298 5498  
+5503 5682 2095 4802 8989 8988 10713  
+5504 5277 3013 1345 9906 9914 9917  
+5505 1776 3230 3234 5934 5943 5935  
+5506 5265 5279 2060 3600 9890 5451  
+5507 2061 3001 3014 5478 5509 3624  
+5508 2972 3015 1124 5450 5423 6005  
+5509 2061 3014 3015 9919 3623 5507  
+5510 3017 3016 1031 2179 1583 1653  
+5511 1581 2992 3016 5462 1653 5463  
+5512 5284 3116 3017 5710 1583 9928  
+5513 1580 2029 3266 6006 3560 2670  
+5514 3024 2045 2993 3611 5465 5527  
+5515 3018 3024 3019 5526 2885 5527  
+5516 2055 4765 5704 10756 10755 8915  
+5517 3019 5280 3025 9921 9927 3592  
+5518 2063 5281 3020 9925 6009 9922  
+5519 3003 5282 1588 9923 5485 9924  
+5520 3022 3021 1757 5496 2202 3019  
+5521 3033 3021 1460 6266 3020 3022  
+5522 5124 3804 2642 7063 9613 9612  
+5523 3396 3022 1756 2431 6267 3019  
+5524 1458 5122 3036 9608 3066 9609  
+5525 3023 3036 5658 5551 8435 3066  
+5526 3019 3024 2055 5465 10755 5515  
+5527 2045 3024 3018 5515 3590 5514  
+5528 3028 3025 1690 9921 5534 2887  
+5529 1689 5284 3025 394 2887 9928  
+5530 3026 2974 5260 5425 9881 5440  
+5531 2051 3026 2978 5426 8889 5435  
+5532 5448 3277 3403 6280 10252 10251  
+5533 3027 2010 3267 6008 3521 6279  
+5534 5286 3028 1690 5528 9932 2896  
+5535 5601 3028 609 2896 10550 7556  
+5536 3031 3030 3029 5539 3101 5083  
+5537 2193 2984 3029 5445 5539 3885  
+5538 2935 3030 1089 5083 9854 1268  
+5539 2193 3029 3030 5536 10718 5537  
+5540 2195 2804 3031 5541 3101 3889  
+5541 5198 3031 2804 5540 5087 9759  
+5542 5287 1758 3009 3075 5497 9935  
+5543 3035 3032 1784 9934 5549 3023  
+5544 4538 3034 3033 5547 3020 8471  
+5545 3033 1784 5287 9934 5497 5547  
+5546 5277 3035 3034 5549 1280 9914  
+5547 1784 3033 3034 5544 5549 5545  
+5548 3035 1345 5271 9902 3074 9914  
+5549 1784 3034 3035 5546 5543 5547  
+5550 4518 3036 1780 9608 8431 8430  
+5551 5658 3036 1755 8430 10664 5525  
+5552 1600 2795 3038 2907 2796 5068  
+5553 1645 2792 3037 5060 2797 5062  
+5554 4478 3038 1700 2907 8351 2906  
+5555 3038 1701 4480 8356 8355 2906  
+5556 3039 1186 4396 8191 2704 5064  
+5557 2794 3039 1599 8194 5066 1606  
+5558 2708 3040 808 5090 4901 2747  
+5559 1620 3040 2709 2747 2748 1500  
+5560 2823 2824 3041 5561 4518 5124  
+5561 506 3041 2824 5560 5135 1323  
+5562 3043 3042 1270 9792 5564 9937  
+5563 3051 5288 567 1388 249 5581  
+5564 5290 3043 1270 5562 9940 9979  
+5565 5309 5291 3043 9938 9979 9978  
+5566 5290 3117 3044 9486 3256 9940  
+5567 3071 3066 939 9959 5610 5611  
+5568 3045 5291 3046 9942 9945 9943  
+5569 3045 5292 3047 5572 9947 9945  
+5570 3066 3052 5299 5583 9959 3262  
+5571 3057 3806 5298 7067 9956 5593  
+5572 3047 5292 5295 9944 9949 5569  
+5573 3047 5294 3050 9948 1544 9949  
+5574 5296 932 3049 7065 9953 9950  
+5575 3048 5296 3702 1252 6865 9952  
+5576 3806 3805 3049 1251 7065 5593  
+5577 5304 3807 3058 7068 1245 9969  
+5578 3693 3050 1011 9948 10459 5579  
+5579 3050 3693 3051 290 249 5578  
+5580 3051 687 4587 8567 1202 290  
+5581 5288 3051 2557 9955 9936 5563  
+5582 5298 3052 5301 9962 5585 5583  
+5583 3052 5298 5299 9957 5570 5582  
+5584 5550 3689 3054 3259 6840 5587  
+5585 5298 5301 772 1975 9956 5582  
+5586 5303 5301 3053 9961 9963 1975  
+5587 3688 3689 5550 5584 10452 6837  
+5588 1229 3060 3056 1246 5591 5598  
+5589 3055 864 3057 5592 9967 5590  
+5590 864 3055 3056 5591 5594 5589  
+5591 1229 3056 3055 5590 9965 5588  
+5592 3805 3057 864 5589 7064 5593  
+5593 3057 3805 3806 5576 5571 5592  
+5594 864 3056 3058 5595 7068 5590  
+5595 861 3058 3056 5594 1246 10198  
+5596 3614 771 3615 906 470 9968  
+5597 3059 3614 5305 6691 10757 6692  
+5598 3062 3060 1229 5588 5602 4367  
+5599 3061 3060 968 4367 5600 1458  
+5600 3065 3061 968 5599 5608 1654  
+5601 3341 587 3339 433 6157 6156  
+5602 3063 3062 1229 5598 5604 5603  
+5603 3062 3063 3064 1459 4366 5602  
+5604 3063 1229 5302 9965 9964 5602  
+5605 3063 969 5126 9616 403 6839  
+5606 5014 3064 2434 1459 9404 9403  
+5607 5423 688 3344 6965 10203 10202  
+5608 3065 968 5423 1656 10203 5600  
+5609 3065 1067 4072 1659 7575 6162  
+5610 939 5309 3071 9941 5567 9978  
+5611 3066 3071 3067 5621 3261 5567  
+5612 3070 3067 1878 5621 5618 5613  
+5613 3067 3070 3068 4543 281 5612  
+5614 4635 543 4634 1460 8657 8659  
+5615 3068 4635 3069 8658 3260 8659  
+5616 4636 3069 1875 8658 3257 8661  
+5617 5307 3069 1877 8661 9974 9960  
+5618 1878 5308 3070 5619 5612 9976  
+5619 3070 5308 3072 9977 1916 5618  
+5620 3044 1878 3071 5621 9941 9484  
+5621 3067 3071 1878 5620 5612 5611  
+5622 3074 3072 2524 9977 5626 5624  
+5623 3073 1873 4634 8656 1460 61  
+5624 3074 3073 3072 3252 5622 4542  
+5625 5310 3073 1199 4542 9980 61  
+5626 5058 3074 2524 5622 9489 9488  
+5627 3075 3074 665 9488 5628 743  
+5628 3076 3075 665 5627 5630 1121  
+5629 3079 3075 1198 1121 5635 1914  
+5630 2955 3076 665 5628 5389 5388  
+5631 5311 3076 1197 5388 9982 578  
+5632 108 3808 3077 5633 -1 7070  
+5633 3808 3078 3077 5634 5632 7071  
+5634 109 3077 3078 5633 9983 -1  
+5635 5312 3079 1198 5629 9984 5636  
+5636 5312 5706 3079 10759 5635 10760  
+5637 5667 4630 4632 8653 10683 10682  
+5638 5310 3080 1872 8652 9981 9980  
+5639 3083 3081 1661 5223 5643 5640  
+5640 3081 3083 3082 2826 508 5639  
+5641 5319 762 3096 2818 9999 9998  
+5642 5313 1656 5320 5221 10000 5670  
+5643 3084 3083 1661 5639 1049 5644  
+5644 3083 3084 3087 2827 2824 5643  
+5645 3393 5447 1661 10249 2835 10250  
+5646 3086 3084 3085 1049 5648 5650  
+5647 1144 5322 3398 2830 5661 10004  
+5648 3086 3085 1662 6270 5649 5646  
+5649 3091 3086 1662 5648 5659 5653  
+5650 1660 3084 3086 5646 9988 2827  
+5651 3088 3087 1660 2827 5655 5652  
+5652 3087 3088 3095 648 2822 5651  
+5653 3091 5314 3086 9988 5649 9989  
+5654 3089 1451 5232 9826 9825 9829  
+5655 3090 3088 1660 5651 2001 5658  
+5656 5234 3089 1806 6947 9830 9829  
+5657 3744 3090 481 5660 2413 1443  
+5658 3089 3088 3090 5655 1443 3119  
+5659 3092 3091 1662 5649 1673 2833  
+5660 5314 481 3090 5657 2001 9989  
+5661 3398 3085 1144 6260 5647 6270  
+5662 3092 1663 3094 5665 9997 5664  
+5663 3681 5546 5321 10443 10002 10444  
+5664 1663 3092 5316 9992 4180 5662  
+5665 3094 1663 3110 5698 5697 5662  
+5666 5317 3094 1805 8513 9994 3117  
+5667 3098 3095 1659 648 5673 5668  
+5668 3095 3098 3096 5249 2818 5667  
+5669 3097 3096 1658 5249 5671 9999  
+5670 5319 1656 5313 5642 9987 5048  
+5671 3099 3097 1658 5669 5675 5672  
+5672 3097 3099 3100 1227 5047 5671  
+5673 1659 2885 3098 5674 5667 2412  
+5674 2885 1658 3098 5249 5673 5689  
+5675 3106 3099 1658 5671 5689 5253  
+5676 5191 3099 496 5253 381 355  
+5677 2784 588 3100 2819 1227 7229  
+5678 3101 588 1655 1048 10001 2819  
+5679 1655 790 5320 1105 10001 9811  
+5680 1656 3100 3101 2819 5221 5047  
+5681 5321 3102 5323 10006 1810 5682  
+5682 5321 5315 3102 6269 5681 10003  
+5683 5447 3394 1144 6262 6260 10250  
+5684 1218 5539 5538 10430 10011 6778  
+5685 3672 3667 3671 6804 6803 6806  
+5686 1217 3660 3662 1950 6795 1679  
+5687 3105 5546 5545 6823 10014 2831  
+5688 1243 2485 5328 10016 10015 4465  
+5689 2885 3106 1658 5675 5674 2823  
+5690 496 3106 2887 2823 9836 5253  
+5691 2322 5561 3108 6899 4142 10476  
+5692 3107 5326 5323 5694 10007 10012  
+5693 960 3678 3680 6818 6822 2000  
+5694 5323 5326 1242 6824 1810 5692  
+5695 1663 3105 3109 5696 5698 4180  
+5696 5327 3109 3105 5695 10014 10017  
+5697 3094 3110 1804 3106 113 5665  
+5698 1663 3109 3110 3115 5665 5695  
+5699 3816 3111 885 6614 7085 7084  
+5700 5684 2165 4848 1295 10717 3828  
+5701 3113 3112 852 9833 5703 10019  
+5702 3112 5329 3148 10018 5772 10019  
+5703 2884 3113 852 5701 5246 2410  
+5704 1646 4434 5329 8268 2798 1070  
+5705 494 3114 2912 5310 3045 5301  
+5706 2916 3114 2917 5313 1762 5312  
+5707 3115 477 5257 9875 9874 5494  
+5708 1757 3115 2642 5406 7063 4770  
+5709 2059 3116 1689 9928 3620 3619  
+5710 1580 3017 3116 5512 3619 3560  
+5711 3117 1270 5214 9792 10021 9940  
+5712 3117 5330 3577 10020 6616 10021  
+5713 3747 333 3127 5732 5731 941  
+5714 3119 708 5707 10762 10761 5716  
+5715 3120 3119 767 6952 28 1829  
+5716 547 708 3119 5714 1829 942  
+5717 3120 3123 3121 5724 5720 28  
+5718 3120 1154 4119 7663 7662 5720  
+5719 3128 3122 3121 186 1830 1389  
+5720 1154 3120 3121 5717 186 5718  
+5721 3125 3122 934 1389 5727 5722  
+5722 5331 3122 3125 5721 1138 10022  
+5723 3123 3126 3124 5730 1371 260  
+5724 933 3121 3123 5717 1371 1830  
+5725 621 3124 924 5730 1368 1059  
+5726 1214 933 3124 1371 1059 5733  
+5727 4211 3125 934 5721 7836 2095  
+5728 3125 1289 4212 2094 7839 2095  
+5729 3126 767 3127 5731 1372 260  
+5730 924 3124 3126 5723 1372 5725  
+5731 3747 3127 767 5729 6952 5713  
+5732 333 332 3127 48 5713 -1  
+5733 5333 933 1214 5726 1933 10026  
+5734 3128 5333 3129 10025 1391 10026  
+5735 523 5334 3129 7742 10025 10027  
+5736 1212 4159 4161 7738 10028 1940  
+5737 3131 5335 57 -1 5739 10030  
+5738 1248 3130 715 5740 714 2013  
+5739 3132 3131 57 5737 703 5744  
+5740 715 3130 3131 777 956 5738  
+5741 3134 57 56 -1 10763 703  
+5742 3132 3143 3133 5763 5744 955  
+5743 5186 5336 1525 10031 2558 441  
+5744 3131 3132 3133 5742 956 5739  
+5745 55 3136 5718 10784 10783 5758  
+5746 760 3132 3134 703 652 955  
+5747 3135 5718 5708 10784 1192 10783  
+5748 760 5708 3142 758 5762 652  
+5749 54 3141 3140 659 -1 5757  
+5750 3141 833 3137 1190 5759 7290  
+5751 833 2541 3278 6030 1190 4576  
+5752 834 3136 3137 5759 5754 10764  
+5753 5694 3138 5051 5755 9474 10737  
+5754 834 3137 3138 6031 2932 5752  
+5755 5051 3138 602 4574 9475 5753  
+5756 2831 5337 1713 10736 5057 1044  
+5757 3141 54 3925 657 7290 5749  
+5758 3136 55 3140 -1 659 5745  
+5759 3136 3141 3137 5750 5752 659  
+5760 834 3139 3142 5761 758 2932  
+5761 578 3142 3139 5760 2931 1191  
+5762 760 3142 5188 1191 9739 5748  
+5763 1525 3133 3143 5742 9735 10031  
+5764 1054 3144 39 723 710 699  
+5765 5683 721 2133 3768 10715 10714  
+5766 367 4308 5338 8030 10034 -1  
+5767 5346 796 3168 5812 10049 10048  
+5768 3149 849 599 4617 880 5775  
+5769 3146 851 3147 5770 7073 5774  
+5770 3148 3147 851 5769 5772 1226  
+5771 3147 1000 4036 7504 7503 1226  
+5772 3112 3148 851 5770 506 5702  
+5773 3148 634 4037 7505 1523 10018  
+5774 851 3146 3149 5775 5777 5769  
+5775 849 3149 3146 5774 444 5768  
+5776 3112 3150 2888 10094 5254 506  
+5777 851 3149 3150 880 506 5774  
+5778 3846 272 3845 469 7136 7138  
+5779 608 810 3364 655 7137 477  
+5780 5342 3152 336 1866 10040 5781  
+5781 3152 5342 4034 51 7500 5780  
+5782 227 3153 1105 547 204 1731  
+5783 3153 1107 4121 1736 7667 1735  
+5784 3155 3154 651 1790 5788 4377  
+5785 3157 3154 766 4377 10043 982  
+5786 4015 3156 651 5788 1310 7463  
+5787 2440 3155 1568 2645 4378 1056  
+5788 651 3156 3155 2645 5784 5786  
+5789 5592 3156 987 7463 10532 1207  
+5790 766 2438 5343 145 10043 4372  
+5791 1134 3157 398 549 365 982  
+5792 1305 3816 3160 7085 2123 2122  
+5793 3159 131 3158 1293 5795 -1  
+5794 885 3574 3160 10047 7085 6612  
+5795 5345 3159 3158 5793 10046 6613  
+5796 132 5345 3574 10047 539 6613  
+5797 3161 791 3162 5799 3570 5804  
+5798 691 1586 3161 2680 6272 2681  
+5799 3163 3162 791 5797 5808 1639  
+5800 3162 590 4738 1841 8861 1639  
+5801 3166 791 3165 5806 575 5808  
+5802 3163 1058 2036 3921 3571 3926  
+5803 3165 225 224 -1 5805 218  
+5804 791 3161 3164 2680 5806 5797  
+5805 3167 3165 224 5803 5809 575  
+5806 791 3164 3165 218 5801 5804  
+5807 1058 3166 2214 5810 3924 3926  
+5808 3163 791 3166 5801 3926 5799  
+5809 223 3167 224 5805 -1 3927  
+5810 3166 3167 2214 3927 5807 575  
+5811 579 3973 5346 7380 10049 7381  
+5812 1607 3168 796 5767 2722 485  
+5813 1464 3169 1824 3085 3126 3154  
+5814 3169 1789 4543 8480 1674 8479  
+5815 4122 4123 539 5817 7668 1840  
+5816 1190 2023 3170 3545 552 3547  
+5817 4123 3170 539 1015 5815 7671  
+5818 3172 3171 4123 7671 7670 5820  
+5819 3172 1159 4121 7667 7666 7670  
+5820 1160 3171 3172 5818 3569 350  
+5821 3172 691 3173 5822 3569 7666  
+5822 3399 3173 691 5821 6272 6271  
+5823 2129 3174 815 3773 3760 3759  
+5824 230 3174 2128 3759 536 3757  
+5825 3599 3175 1516 2541 6662 6273  
+5826 2142 3400 129 2535 9057 2537  
+5827 4218 3176 1908 3322 4562 7850  
+5828 1322 2189 3176 3874 7850 3876  
+5829 3177 701 3178 5831 1638 3925  
+5830 2212 3177 1688 8327 3923 2883  
+5831 3179 3178 701 5829 5833 1352  
+5832 3695 3178 628 1352 6851 2881  
+5833 2216 3179 701 5831 3931 213  
+5834 628 3179 914 213 7248 1352  
+5835 3180 714 5055 909 4541 3956  
+5836 3577 3180 573 10053 6616 2547  
+5837 3183 5352 5351 5839 1254 5842  
+5838 2417 3182 1576 5859 4338 4332  
+5839 3181 5351 5352 5837 10061 10058  
+5840 3182 5352 3192 10060 5859 10061  
+5841 3184 5353 5354 10062 6764 10063  
+5842 5352 3183 504 5846 10060 5837  
+5843 1579 3669 5541 6792 10434 6799  
+5844 3185 3184 957 10433 5845 10063  
+5845 3186 3185 957 5844 5849 1434  
+5846 504 3183 3185 1253 5852 5842  
+5847 5540 3186 3663 5849 6787 10432  
+5848 3188 3186 956 94 1433 1434  
+5849 3663 3186 957 5845 6788 5847  
+5850 3187 5540 5355 10431 5200 10432  
+5851 3188 5356 3189 10069 2660 1433  
+5852 3185 3188 504 2660 5846 1434  
+5853 1682 3748 3190 5911 2871 6954  
+5854 504 3189 3192 5860 10060 2660  
+5855 3191 3190 829 5911 5857 5856  
+5856 3192 3190 3191 5855 4340 5860  
+5857 2426 3191 829 5855 5917 4341  
+5858 1576 3191 2421 4341 4333 4340  
+5859 3192 1576 3182 5838 5840 4340  
+5860 3189 3190 3192 5856 5854 2871  
+5861 2323 3193 1406 4136 4144 2321  
+5862 3193 2324 4933 9242 9241 2321  
+5863 1275 3696 3194 5864 9287 2324  
+5864 3194 3696 3195 6854 2311 5863  
+5865 5449 1407 3405 2325 10254 10253  
+5866 3195 5449 5357 6233 4182 10253  
+5867 1976 480 3196 10730 1576 7299  
+5868 5691 480 5005 1577 10731 10730  
+5869 5642 3197 842 4361 10633 5870  
+5870 3197 5642 5593 10632 7471 5869  
+5871 3199 3198 1509 6942 5873 10073  
+5872 5358 1510 4391 472 1690 2527  
+5873 3200 3199 1509 5871 5875 5874  
+5874 3199 3200 5359 2910 5055 5873  
+5875 3201 3200 1509 5873 5877 5263  
+5876 3200 1702 4479 2908 8354 5263  
+5877 2893 3201 1509 5875 5264 2911  
+5878 3201 2892 5238 5262 9838 2911  
+5879 1368 4231 4234 7875 7882 7876  
+5880 5360 3202 5618 7169 10584 10077  
+5881 5611 1111 4181 641 7779 10571  
+5882 1368 3202 3203 4406 10079 7882  
+5883 1597 4187 5033 1324 10570 7791  
+5884 3204 5032 5361 9436 2247 9439  
+5885 5052 3205 541 4848 4527 9477  
+5886 5053 3810 3205 7074 4529 9478  
+5887 2591 5364 3206 5888 4670 10084  
+5888 3206 5364 5365 10085 10740 5887  
+5889 2659 2660 3207 5890 2205 4804  
+5890 5128 3207 2660 5889 4807 9621  
+5891 3210 3209 989 4904 5894 1124  
+5892 2703 3208 2700 4885 4884 833  
+5893 2711 3209 1499 10180 4907 4906  
+5894 3211 3210 989 5891 5896 2302  
+5895 1396 3281 5412 6037 10181 2300  
+5896 2401 3211 989 5894 4301 5905  
+5897 3211 1397 3212 5898 2302 5904  
+5898 3214 3212 1397 5897 5902 1142  
+5899 3213 3212 990 1142 5900 2303  
+5900 3287 3213 990 5899 6048 6046  
+5901 3279 3213 1395 6046 6032 1122  
+5902 3698 3214 1397 5898 6857 2305  
+5903 1641 5366 3214 10089 2305 10088  
+5904 1397 3211 3215 5905 8247 5897  
+5905 2401 3215 3211 5904 5896 2784  
+5906 2504 3216 2204 4935 513 4503  
+5907 2508 3216 1341 4503 4510 3907  
+5908 2731 3217 1335 3636 4945 4757  
+5909 2067 3217 2732 4757 9688 2201  
+5910 3219 3218 1026 5052 1574 1181  
+5911 829 3190 3748 5853 6955 5855  
+5912 3220 1026 550 7546 5914 1574  
+5913 3219 1027 3221 5916 1181 5915  
+5914 3220 550 4718 3454 10091 5912  
+5915 1027 3219 3220 1574 4349 5913  
+5916 5008 3221 1027 5913 1208 9392  
+5917 2426 829 3221 4351 9392 5857  
+5918 1645 4480 5368 261 10093 8355  
+5919 1503 1644 3222 2708 10092 2795  
+5920 4738 3223 2034 1839 8861 8860  
+5921 3223 2031 4735 3567 8854 8860  
+5922 5191 5192 2783 2120 9746 381  
+5923 5237 3224 496 9745 9836 2121  
+5924 5511 1948 2200 3898 10376 3400  
+5925 3225 2201 5041 9454 3901 4819  
+5926 2945 2946 3226 5927 3531 5368  
+5927 3226 2946 5249 5371 9860 5926  
+5928 2049 2979 3227 5929 5421 5437  
+5929 2980 3227 2979 5928 5436 3599  
+5930 1797 3228 2983 5447 9885 5444  
+5931 3029 3228 2195 9450 3101 5445  
+5932 3230 3229 1761 9913 5934 3029  
+5933 3293 3229 1785 3029 6060 3077  
+5934 3234 3230 1761 5932 5942 5505  
+5935 3231 3230 1776 5505 5936 3056  
+5936 3232 3231 1776 5935 10668 3028  
+5937 3233 3231 1394 3028 5940 3163  
+5938 5660 1776 4533 9916 10669 10668  
+5939 3232 5660 3298 8458 5946 10668  
+5940 3235 3233 1394 5937 5944 5941  
+5941 3233 3235 5415 3076 6062 5940  
+5942 3401 3234 1761 5934 6275 3058  
+5943 1776 3234 3013 3058 8460 5505  
+5944 3236 3235 1394 5940 10189 5951  
+5945 3239 3238 1777 6620 10386 3061  
+5946 1394 3232 3298 5939 5948 3028  
+5947 3236 5371 3578 3053 2296 10098  
+5948 5416 1394 3298 5946 6071 10189  
+5949 4531 3237 1775 6070 8457 8456  
+5950 1828 3235 3238 5951 3061 3076  
+5951 3236 3238 3235 5950 5944 2296  
+5952 1777 3579 3583 6622 1272 3060  
+5953 3239 1392 5397 10150 3162 3123  
+5954 4566 1808 4564 8523 8522 8527  
+5955 4566 3241 5372 2291 10100 10104  
+5956 3243 3241 5374 10104 5960 10102  
+5957 5373 3242 5398 10153 10101 10127  
+5958 5373 5387 5385 10131 10127 10103  
+5959 3258 5398 5386 10153 2293 5991  
+5960 3247 3243 5374 5956 10105 10108  
+5961 3244 5375 5376 10107 10110 5962  
+5962 5375 3244 5378 10113 10112 5961  
+5963 3245 5376 3247 10108 10117 10111  
+5964 3410 3407 3408 6287 6294 6288  
+5965 1070 3254 3587 2308 2306 5983  
+5966 5378 3246 5387 2290 10130 5967  
+5967 3246 5378 5379 10113 2309 5966  
+5968 5382 3248 5381 2334 10119 5971  
+5969 3247 5381 5380 10118 10117 10119  
+5970 5382 3247 1015 10105 10120 10119  
+5971 5383 3248 5382 5968 10121 10123  
+5972 3249 5384 5388 10125 2602 2284  
+5973 3249 1547 5385 10129 10131 10166  
+5974 3250 3299 3264 6073 10162 2783  
+5975 4422 3263 1638 10163 8244 8243  
+5976 3251 5379 5389 10115 5980 2309  
+5977 3253 1642 3299 6073 10137 10143  
+5978 3252 5389 3254 10134 1662 10135  
+5979 5391 5396 3256 5994 10141 10138  
+5980 5391 3251 5389 5976 10135 10136  
+5981 5393 3253 5392 10140 5987 10143  
+5982 3254 1387 5395 10146 2308 10134  
+5983 5394 3254 1070 5965 10144 1662  
+5984 1387 5379 5377 10114 10146 10115  
+5985 3409 3255 3245 10109 1440 6291  
+5986 3260 799 5414 5989 10184 2278  
+5987 1386 5393 5392 5981 2281 10142  
+5988 3260 3257 3256 2277 5994 10184  
+5989 5414 799 3289 2280 10185 5986  
+5990 800 3294 3297 6068 10158 2294  
+5991 5398 3258 5397 10151 10150 5959  
+5992 5399 3259 1547 10126 10154 3697  
+5993 5401 3259 5400 3697 10157 10159  
+5994 5396 3260 3256 5988 5979 10149  
+5995 3261 3260 1385 10149 1661 2278  
+5996 1385 5394 3262 10144 1661 10145  
+5997 1384 4246 5621 10591 10590 7906  
+5998 3262 1070 4247 7908 7907 10144  
+5999 1384 3261 3262 1661 10160 10590  
+6000 5404 3263 1391 8243 10164 3698  
+6001 5405 3263 5399 3698 10154 2782  
+6002 1642 4428 4430 8255 8260 8256  
+6003 5403 3264 1638 10652 10163 10162  
+6004 2061 3265 2966 5422 5480 3623  
+6005 2972 3265 3015 3623 5508 3621  
+6006 4736 3266 2029 5513 8857 8856  
+6007 1581 3017 3266 3560 8856 1653  
+6008 3268 3267 2010 5533 2685 10169  
+6009 3020 5406 2063 3519 5518 10168  
+6010 2010 3402 3269 6026 2685 6277  
+6011 5267 3268 1652 6013 9895 9894  
+6012 3270 3269 2009 6026 6014 3633  
+6013 1652 3268 3269 2685 3633 6011  
+6014 3271 3270 2009 6012 2811 3507  
+6015 5407 3270 2066 6957 10170 10171  
+6016 3271 3274 3272 6023 3506 2811  
+6017 3749 3271 1235 3506 6956 3507  
+6018 2003 3301 3273 6075 3738 1278  
+6019 3272 3273 5508 10370 6581 3738  
+6020 4822 3273 2118 6075 3737 9029  
+6021 5508 2002 3557 6582 10371 10370  
+6022 5408 5409 3276 3520 2199 10173  
+6023 2003 3272 3274 6016 3508 3738  
+6024 5417 937 3311 6098 6096 10172  
+6025 3275 5417 3300 10190 3513 10191  
+6026 3402 2009 3269 6012 6010 6278  
+6027 5448 3027 5285 5491 9931 10252  
+6028 5408 5410 937 6099 10172 2199  
+6029 3276 3402 3403 6277 10176 6278  
+6030 602 3278 2541 5751 903 4574  
+6031 3137 3278 3138 4574 5754 1190  
+6032 3280 3279 1395 5901 6034 6033  
+6033 3279 3280 3281 2276 2300 6032  
+6034 1395 3282 3280 6045 6032 1510  
+6035 3282 994 3285 6059 6045 6041  
+6036 475 4401 5411 2507 10179 8201  
+6037 3281 5411 5412 10178 5895 10179  
+6038 3286 3283 3282 6041 1510 4228  
+6039 2364 3292 994 6059 1239 2728  
+6040 3283 1383 3284 6042 6057 4228  
+6041 994 3282 3283 6038 6056 6035  
+6042 3288 3284 1383 6040 6050 1501  
+6043 3291 858 1379 7895 2268 2274  
+6044 3589 3285 1610 6058 6641 2727  
+6045 3280 3282 3285 6035 2727 6034  
+6046 1395 3213 3287 5900 2301 5901  
+6047 3289 3290 2365 6049 10185 6052  
+6048 5413 3287 990 5900 10182 4229  
+6049 3290 3287 2365 4229 6047 6055  
+6050 3288 1383 3289 6052 6644 6042  
+6051 3288 1382 4244 7902 7901 6643  
+6052 3290 3289 1383 6050 6054 6047  
+6053 3257 5414 2365 10185 1505 10184  
+6054 1383 3286 3290 6055 6052 4228  
+6055 3287 3290 3286 6054 2301 6049  
+6056 994 3283 3291 6057 1239 6041  
+6057 3284 3291 3283 6056 6040 2274  
+6058 1610 3285 3292 6059 8200 6044  
+6059 994 3292 3285 6058 6035 6039  
+6060 3294 3293 1785 5933 10187 6061  
+6061 3295 3293 3294 6060 2294 6065  
+6062 5415 1785 3233 3163 5941 10187  
+6063 3297 3258 5401 10159 10158 10151  
+6064 5400 3296 3295 3691 6066 10156  
+6065 2095 3293 3295 6061 3691 3077  
+6066 5400 3295 800 2294 10157 6064  
+6067 4806 3296 2098 10156 8997 8996  
+6068 5415 3297 3294 5990 10187 10186  
+6069 5397 3297 1828 10186 3162 10151  
+6070 1775 3237 3298 6071 8458 5949  
+6071 5416 3298 3237 6070 10188 5948  
+6072 3299 991 5390 2791 10137 10132  
+6073 1642 3264 3299 5974 5977 8260  
+6074 2006 3302 3300 6076 10190 6078  
+6075 3301 2118 3273 6020 6018 6150  
+6076 3302 3301 3300 1278 6074 6079  
+6077 3338 3301 1234 6079 6151 6150  
+6078 3303 3302 2006 6074 739 3511  
+6079 3301 3302 1234 3509 6077 6076  
+6080 3311 3304 2006 739 6096 3514  
+6081 3303 2005 3305 6084 3511 3512  
+6082 3315 3304 2007 3514 6104 6083  
+6083 3315 3591 3304 1984 6082 2774  
+6084 2005 3307 3305 6085 6081 6088  
+6085 3305 3307 3306 6089 3503 6084  
+6086 3310 2004 2013 3528 6095 6094  
+6087 3306 3310 3308 3527 2186 6094  
+6088 3307 2005 3326 1985 6127 6084  
+6089 3306 3307 2004 5370 6094 6085  
+6090 3309 3308 2001 3527 10458 6091  
+6091 3338 3308 3309 6090 3502 6151  
+6092 5553 2001 3699 1921 6860 10458  
+6093 3309 5553 4822 10457 3737 10458  
+6094 2004 3310 3306 6087 6089 6086  
+6095 3310 2013 5435 10225 6222 6086  
+6096 5417 3311 2006 6080 10190 6024  
+6097 3312 2008 3318 6110 6108 6100  
+6098 3311 937 3312 6101 3027 6024  
+6099 937 5410 3313 10177 6101 6028  
+6100 2008 3312 3313 6101 6103 6097  
+6101 937 3313 3312 6100 6098 6099  
+6102 3010 3314 1760 3515 3517 5499  
+6103 2008 3313 3314 3522 10196 6100  
+6104 2007 3317 3315 6105 6082 3518  
+6105 3315 3317 3316 6109 3695 6104  
+6106 5204 3316 2097 6109 9772 9771  
+6107 3319 3316 1634 9771 6112 2771  
+6108 3312 3318 2007 3518 3027 6097  
+6109 3316 3317 2097 8991 6106 6105  
+6110 3337 3318 2008 6097 6148 3692  
+6111 4807 3318 1344 3692 8998 3516  
+6112 3323 3319 1634 6107 6120 10192  
+6113 3321 3320 5418 6115 10193 2770  
+6114 1083 3319 3320 6115 6124 2771  
+6115 5418 3320 3319 6114 10192 6113  
+6116 1632 3327 3321 6118 10193 6128  
+6117 3322 2016 5249 9860 9859 5072  
+6118 3327 3322 3321 3533 6116 6129  
+6119 5419 3322 1082 6129 10194 5072  
+6120 3324 3323 1634 6112 9769 6121  
+6121 3323 3324 3330 2780 6134 6120  
+6122 1634 5204 5203 5089 9769 9771  
+6123 4420 3324 1637 9768 8240 8239  
+6124 1083 3320 3325 6125 6645 6114  
+6125 1633 3325 3320 6124 2770 1688  
+6126 1633 2946 3326 6127 1688 5371  
+6127 3307 3326 2946 6126 5370 6088  
+6128 3327 1632 3328 6130 2768 6116  
+6129 3322 3327 1082 6137 6119 6118  
+6130 1632 3330 3328 6131 6128 6134  
+6131 3328 3330 3329 6135 2769 6130  
+6132 4419 3329 809 6135 8238 8237  
+6133 3334 3329 1635 8237 6143 6142  
+6134 3323 3330 1632 6130 2292 6121  
+6135 3329 3330 809 2780 6132 6131  
+6136 3331 1631 3332 6138 6145 1687  
+6137 1082 3327 3331 2768 6144 6129  
+6138 3333 3332 1631 6136 6140 1685  
+6139 2378 3332 1630 1685 2765 2767  
+6140 3334 3333 1631 6138 6142 1502  
+6141 3333 1081 4855 9090 9089 6910  
+6142 3329 3334 1631 6140 2769 6133  
+6143 3334 1635 3726 10648 1502 6133  
+6144 1082 3331 3335 6145 5073 6137  
+6145 3332 3335 3331 6144 6136 2767  
+6146 3336 2378 5211 2766 5116 4255  
+6147 3336 2797 5419 10195 10194 4254  
+6148 5420 3337 2008 6110 10196 217  
+6149 5682 3337 3012 217 10713 10712  
+6150 3301 3338 2118 3502 6075 6077  
+6151 1234 3308 3338 6091 6077 2186  
+6152 3909 3339 816 433 1155 7258  
+6153 3340 3339 817 7258 10199 6157  
+6154 5421 817 771 6693 1158 10199  
+6155 3341 861 3061 1458 6156 890  
+6156 587 3341 3061 6155 1654 5601  
+6157 3339 3340 3341 890 5601 6153  
+6158 3343 3342 1067 7576 6160 460  
+6159 159 1068 3342 1657 10204 -1  
+6160 3344 3343 1067 6158 6162 3177  
+6161 3343 1835 3345 6164 10205 6964  
+6162 3344 1067 3065 5609 10203 6160  
+6163 688 3752 3753 6962 6965 6963  
+6164 3750 3345 1835 6161 6958 3174  
+6165 160 159 3345 3176 3174 -1  
+6166 747 5425 3346 10207 10210 10206  
+6167 282 3348 3349 6172 7098 -1  
+6168 832 3352 3357 6177 10208 6178  
+6169 3347 1708 3353 6179 10212 1187  
+6170 3348 281 3350 6175 6172 -1  
+6171 3349 832 3346 1188 7076 6174  
+6172 3349 3348 3350 6170 6174 6167  
+6173 3351 5427 280 -1 6176 10211  
+6174 3349 3350 832 140 6171 6172  
+6175 5427 3350 281 6170 -1 10211  
+6176 3923 3351 280 6173 143 7286  
+6177 3357 3352 601 8363 6187 6168  
+6178 832 3351 3352 1186 6168 140  
+6179 3358 3353 1708 6169 6189 2922  
+6180 747 3354 1162 27 7672 1845  
+6181 3353 1163 3354 6182 1845 2922  
+6182 3355 3354 1163 6181 2977 27  
+6183 3356 1163 1735 1423 6185 2977  
+6184 3355 556 3389 6252 6251 1355  
+6185 4509 3356 1735 6183 2976 8413  
+6186 5429 3356 1736 8413 10213 2497  
+6187 3357 601 4486 1019 8368 6177  
+6188 3357 3347 5426 10209 10208 1187  
+6189 1708 3360 3358 1848 6179 6193  
+6190 500 4798 3359 8980 6194 8981  
+6191 3359 1734 4508 8410 2974 8980  
+6192 1163 3358 3359 1848 1423 2922  
+6193 3360 1708 4486 8368 2917 6189  
+6194 3359 3360 500 9032 6190 1848  
+6195 1950 3361 52 614 8805 1962  
+6196 3361 1224 5147 9659 9658 8803  
+6197 672 1252 3362 6198 10215 2021  
+6198 3362 1252 4194 2020 7804 6197  
+6199 3363 565 3364 6201 655 625  
+6200 810 838 5430 1200 10216 1143  
+6201 5340 3364 565 6199 10035 6202  
+6202 3364 5340 3846 488 7137 6201  
+6203 5431 3365 5432 10220 10219 7829  
+6204 1284 4206 4207 7827 10218 1851  
+6205 5432 3366 4233 2243 1326 6206  
+6206 3366 5432 5433 10220 1692 6205  
+6207 857 1381 3367 6208 2372 10229  
+6208 3367 1381 4495 8385 8384 6207  
+6209 3368 863 3369 742 1197 1021  
+6210 623 1467 3368 1249 6216 2445  
+6211 3372 863 1993 3484 2462 6218  
+6212 5174 5434 3370 10224 6213 9712  
+6213 5174 3370 1827 1250 9713 6212  
+6214 5434 748 1855 3215 10223 9712  
+6215 925 3371 837 306 182 1374  
+6216 3368 3371 623 1374 6210 1197  
+6217 3372 795 4583 8560 3160 2462  
+6218 863 3372 3370 1250 742 6211  
+6219 4288 3373 1482 2107 2474 7990  
+6220 3375 3373 1483 7990 6223 1920  
+6221 3699 3374 487 6224 6859 10226  
+6222 5435 2001 3310 3527 6095 1921  
+6223 1998 3375 1483 6220 2465 3498  
+6224 3374 3375 487 3498 6221 1920  
+6225 3376 5436 5437 10228 10230 2506  
+6226 4303 3376 1380 7900 8019 2271  
+6227 20 862 3377 6228 2816 7339  
+6228 3377 862 5224 9812 1248 6227  
+6229 1283 3378 1208 8399 2077 690  
+6230 657 1480 3378 1932 690 2471  
+6231 5672 2187 2186 9110 10692 3872  
+6232 2536 3379 1194 8732 10781 3873  
+6233 1245 5357 5449 5866 2310 10070  
+6234 1412 4581 5687 10722 10231 1553  
+6235 5383 3381 1411 6281 10123 6236  
+6236 3381 5383 5439 10122 2333 6235  
+6237 2445 783 3382 6238 788 4910  
+6238 4351 3382 783 6237 2579 8108  
+6239 3384 3383 2199 10236 6241 6240  
+6240 5441 3383 3384 6239 3669 10238  
+6241 3754 3384 2199 6239 6973 3896  
+6242 5197 3384 2084 3670 9758 9757  
+6243 5445 5444 3386 10244 1825 10245  
+6244 3385 5445 5443 1826 9459 10245  
+6245 3386 558 4367 8137 2626 10244  
+6246 3735 5446 3386 1825 2626 6926  
+6247 3387 5446 3388 10247 1359 10248  
+6248 4819 3387 2114 1359 9022 1360  
+6249 5564 918 3730 6918 10480 10479  
+6250 2728 3388 2116 6916 4938 3730  
+6251 3355 3389 1162 7675 27 6184  
+6252 556 2638 3389 4763 6184 4764  
+6253 2407 3390 1889 4792 4313 3284  
+6254 3390 2408 5012 9399 4315 9370  
+6255 754 2789 3391 6256 5042 9736  
+6256 3740 3391 2789 6255 6941 6938  
+6257 2850 3392 1048 4817 5179 1616  
+6258 516 3392 2851 1616 9460 5181  
+6259 3394 3393 1664 5222 6261 10250  
+6260 3085 5447 1144 5683 5661 10249  
+6261 3672 3394 1664 6259 6806 6805  
+6262 3104 1144 3394 5683 6805 866  
+6263 2934 3395 1769 5339 5347 5085  
+6264 2927 3395 2803 9852 5333 3464  
+6265 4521 3397 3396 3057 6267 8436  
+6266 3021 3396 1460 3057 5521 3019  
+6267 4521 3396 1756 5523 8437 6265  
+6268 4537 3397 1781 8436 3068 8469  
+6269 5315 3398 3102 2830 5682 9990  
+6270 1662 3085 3398 5661 9990 5648  
+6271 3173 3399 2034 1107 1839 5822  
+6272 691 3161 3399 3570 5822 5798  
+6273 3599 3400 3175 2537 5825 6661  
+6274 3637 1514 3636 7010 6739 6736  
+6275 3401 1761 5276 9913 9912 5942  
+6276 3013 3401 3007 5493 5492 3058  
+6277 3403 3402 2010 6010 6279 6029  
+6278 2009 3402 3276 6029 3520 6026  
+6279 3027 3403 2010 6277 5533 10252  
+6280 3403 3277 5410 10177 10176 5532  
+6281 1411 3381 3404 6282 6284 6235  
+6282 3404 3381 5438 2333 10232 6281  
+6283 3697 3406 1407 2325 6856 10255  
+6284 1411 3404 3405 10254 2317 6281  
+6285 1403 4255 3407 7923 10256 7924  
+6286 5381 5520 1400 10257 10118 2334  
+6287 3408 3407 489 7923 6289 5964  
+6288 5451 3407 3410 5964 6293 2316  
+6289 4248 3408 489 6287 7915 202  
+6290 3409 3408 1399 202 6291 6294  
+6291 3255 3409 1399 6290 6637 5985  
+6292 5380 3410 3409 6294 1440 10116  
+6293 3410 1400 5451 10257 6288 10116  
+6294 3408 3409 3410 6292 5964 6290  
+6295 3411 122 3946 867 7331 277  
+6296 2857 3411 720 7333 856 859  
+6297 88 3412 89 139 -1 804  
+6298 3412 763 4893 9163 9162 804  
+6299 1221 3413 652 1481 1958 889  
+6300 97 3413 98 889 -1 892  
+6301 5453 3414 5452 611 613 10262  
+6302 1741 3415 491 2017 2022 2985  
+6303 3415 1254 4193 7800 2026 2985  
+6304 3421 1264 1187 2029 2044 6315  
+6305 3416 3422 3417 6317 2054 1416  
+6306 3418 3417 1267 6317 6308 2051  
+6307 1269 737 3417 2054 2051 7809  
+6308 3419 3418 1267 6306 6310 2973  
+6309 1269 3418 947 2973 8987 2051  
+6310 3420 3419 1267 6308 6312 321  
+6311 3419 1733 4799 8983 8982 321  
+6312 3420 1267 3423 2047 6319 6310  
+6313 3420 1732 4507 2970 8409 9444  
+6314 1265 3416 3421 6315 2211 1416  
+6315 1264 3421 3416 6314 2045 6304  
+6316 3423 3422 1265 1416 6318 2047  
+6317 1267 3417 3422 6305 2047 6306  
+6318 3423 1265 4692 3372 8771 6316  
+6319 3423 948 3420 2971 6312 3371  
+6320 3425 5454 4876 10264 9131 2118  
+6321 3431 3426 5456 6325 10268 10269  
+6322 3603 3425 1303 9131 10398 10483  
+6323 3768 3425 5566 10483 10484 959  
+6324 1516 5455 3426 6325 10272 10265  
+6325 3426 5455 5456 10266 6321 6324  
+6326 3428 5459 3429 10274 2149 130  
+6327 5458 3427 1515 6506 10271 2542  
+6328 3433 3428 2766 2149 5014 6329  
+6329 3428 3433 3519 256 130 6328  
+6330 3430 3429 605 10274 6332 839  
+6331 3504 5496 2765 10346 1347 10347  
+6332 3431 3430 605 6330 6334 10275  
+6333 3430 5460 5497 5012 6485 10275  
+6334 3431 605 5457 10270 10269 6332  
+6335 3431 835 5217 9798 10276 10268  
+6336 2766 3429 3432 6337 6338 2149  
+6337 2765 3432 3429 6336 839 10346  
+6338 5474 2766 3432 6336 10303 10277  
+6339 5461 3435 3433 6341 5014 10278  
+6340 3434 3520 3461 6510 6342 6395  
+6341 3433 3435 1318 6345 256 6339  
+6342 3461 3435 3434 10278 6340 1635  
+6343 3436 5462 5465 10279 10286 10280  
+6344 5484 3475 5483 2140 10324 10323  
+6345 1318 3435 5462 10279 960 6341  
+6346 1056 3640 3639 2534 7011 6738  
+6347 3596 3438 3597 6349 6658 2540  
+6348 5464 3438 3437 10282 10283 6349  
+6349 3597 3438 5464 6348 10284 6347  
+6350 3439 1317 3440 386 2144 10285  
+6351 5466 3439 3462 2144 6397 10288  
+6352 3442 3441 5467 10290 10289 2147  
+6353 3440 5481 3471 6355 6413 10317  
+6354 2143 3483 3485 6442 6441 6437  
+6355 5481 1310 3471 6414 6353 6435  
+6356 3461 3442 1317 10289 6394 6510  
+6357 3442 3520 3443 6509 422 6510  
+6358 3444 3443 521 6509 6360 10291  
+6359 3443 5468 3445 627 937 10291  
+6360 3446 3444 521 6358 6364 6361  
+6361 3444 3446 5469 10293 10294 6360  
+6362 2144 3451 3445 6376 627 6388  
+6363 2150 3483 3452 10306 6392 6438  
+6364 3450 3446 521 6360 6372 6365  
+6365 3446 3450 3501 3788 5015 6364  
+6366 3502 3506 2145 10297 6475 6483  
+6367 5470 3447 5472 10295 10300 3789  
+6368 3448 5472 3486 10299 10313 10300  
+6369 3453 3458 5479 6389 10314 2903  
+6370 5075 3449 2580 6484 4650 9521  
+6371 5472 3449 919 9521 10299 10298  
+6372 521 5473 3450 10302 6364 10301  
+6373 3434 5461 5474 10277 10304 10278  
+6374 5470 3458 2144 6388 3789 10296  
+6375 3460 3452 5476 10308 10307 6392  
+6376 3445 3451 3452 10308 10305 6362  
+6377 1228 5476 3451 10308 6379 10307  
+6378 3454 3453 2146 10314 6380 2902  
+6379 1228 3451 3453 2903 3803 6377  
+6380 5477 3454 2146 6378 10309 3793  
+6381 3454 2147 3455 3797 2902 4667  
+6382 3492 3456 5478 10312 10311 3806  
+6383 2152 3484 3460 6431 3799 6439  
+6384 2148 3494 3496 6458 6464 6459  
+6385 3456 3493 3459 3795 10312 6463  
+6386 5086 2588 5084 4666 9538 9542  
+6387 1698 5365 3594 10086 9541 10087  
+6388 2144 3458 3451 2903 6362 6374  
+6389 5479 3458 3448 10296 10313 6369  
+6390 1228 3455 3459 6391 6393 3803  
+6391 3459 3455 5478 3797 10312 6390  
+6392 3452 3460 2150 6431 6363 6375  
+6393 1228 3459 3460 3799 10307 6390  
+6394 3461 1317 5465 10285 1635 6356  
+6395 3434 5473 3520 10301 6340 10302  
+6396 3463 3462 1316 2132 6398 2127  
+6397 5466 3462 724 2131 10287 6351  
+6398 3463 1316 3464 6400 2128 6396  
+6399 3463 1315 3474 6419 2127 6512  
+6400 3465 3464 1316 6398 6402 6401  
+6401 3464 3465 3469 2145 3466 6400  
+6402 1316 3471 3465 6403 6400 6413  
+6403 3465 3471 3466 6414 2150 6402  
+6404 3479 3466 1310 6414 6429 6405  
+6405 3466 3479 3467 3801 1972 6404  
+6406 3467 3490 3489 4862 6447 6449  
+6407 3470 3488 3491 6448 6598 6410  
+6408 3491 3489 3468 6450 6453 6448  
+6409 1319 3467 3488 6447 10315 1972  
+6410 5480 3488 3470 6407 10316 10315  
+6411 1983 3566 3473 10338 2139 6600  
+6412 1320 3567 3773 7004 6454 -1  
+6413 3440 3471 1316 6402 2132 6353  
+6414 3466 3471 1310 6355 6404 6403  
+6415 1308 3469 3472 6416 2141 3466  
+6416 3472 3469 5480 2129 2153 6415  
+6417 5491 5492 3497 10339 2138 10337  
+6418 3473 5491 3522 10335 10320 10337  
+6419 3474 1315 5485 10325 2143 6399  
+6420 724 3474 5484 10323 10281 2131  
+6421 3522 5500 3521 10354 6511 10355  
+6422 5485 5486 3475 6424 2143 10326  
+6423 4214 3476 1314 6514 114 10327  
+6424 5486 3477 3475 6426 6422 6425  
+6425 3477 5486 3812 10328 665 6424  
+6426 1309 3475 3477 6424 974 2140  
+6427 678 3694 4323 6849 8055 6850  
+6428 1512 5487 3478 10330 8054 10768  
+6429 1310 3482 3479 6430 6404 2133  
+6430 3479 3482 3480 6436 4863 6429  
+6431 3484 2150 3460 6392 6383 6440  
+6432 3518 3701 2688 6864 -1 6507  
+6433 3484 3481 3480 3800 6440 6439  
+6434 2152 3494 3495 6459 3802 6460  
+6435 5481 3485 1310 2133 6355 10318  
+6436 3480 3482 2150 6438 6440 6430  
+6437 3483 2143 5475 3787 10306 6354  
+6438 2150 3482 3483 6442 6363 6436  
+6439 3481 3484 2152 6383 3802 6433  
+6440 2150 3484 3480 6433 6436 6431  
+6441 2143 3485 3441 10318 2147 6354  
+6442 3483 3482 3485 2133 6354 6438  
+6443 3487 3486 919 10299 9523 10332  
+6444 2149 5083 3595 9536 10331 1132  
+6445 919 5075 5076 9520 9523 9521  
+6446 5080 3487 2583 3796 9530 9529  
+6447 3489 3488 3467 6409 6406 6448  
+6448 3488 3489 3491 6408 6407 6447  
+6449 3490 3467 2151 3801 6451 6406  
+6450 3468 3489 468 4862 -1 6408  
+6451 3701 3490 2151 6449 6863 6507  
+6452 3518 468 3490 4862 6507 -1  
+6453 3468 1320 3491 6454 6408 -1  
+6454 3773 3491 1320 6453 6412 6598  
+6455 3492 2147 3594 6652 4691 10311  
+6456 2153 3496 5711 6457 10770 6464  
+6457 3456 5711 3496 6456 6463 3806  
+6458 3494 3493 3496 6463 6384 6460  
+6459 3494 2148 3495 6461 6434 6384  
+6460 2152 3493 3494 6458 6434 3795  
+6461 2148 2688 3495 6462 6459 -1  
+6462 2688 3481 3495 3802 6461 6864  
+6463 3456 3496 3493 6458 6385 6457  
+6464 2148 3496 2153 6456 -1 6384  
+6465 3498 3497 1313 10339 6467 10341  
+6466 3497 5493 4214 10340 114 10341  
+6467 5514 3498 1313 6465 10381 10378  
+6468 3498 1484 3499 6469 2135 10378  
+6469 3500 3499 1484 6468 6471 1926  
+6470 3770 3499 1311 1926 6998 2134  
+6471 5494 3500 1484 6469 10342 4869  
+6472 3500 887 4850 9080 9079 9672  
+6473 2767 3503 3501 6476 3788 5013  
+6474 3503 5495 3502 10345 6476 6478  
+6475 2145 3501 3502 6476 6366 5015  
+6476 3502 3501 3503 6473 6474 6475  
+6477 2767 3432 5496 10346 5013 10303  
+6478 3503 620 5495 10344 6474 6480  
+6479 3504 3507 3505 6486 1547 1347  
+6480 620 3503 3504 10347 1547 6478  
+6481 912 3817 3505 6482 6486 7086  
+6482 3505 3817 3508 7087 3790 6481  
+6483 2581 3506 3502 6366 10345 4652  
+6484 2580 3449 3506 4654 9525 6370  
+6485 2765 3430 5497 6333 10349 839  
+6486 912 3505 3507 6479 6498 6481  
+6487 1012 3819 3509 7091 1361 622  
+6488 620 3508 3512 6496 10344 3790  
+6489 2574 3511 3510 4645 4642 9507  
+6490 3512 3509 3510 4642 6492 6496  
+6491 5077 3510 1013 4645 9524 4653  
+6492 3512 3510 2581 4653 6495 6490  
+6493 5068 2574 5067 4644 9508 9507  
+6494 3511 2576 5070 9509 1548 1546  
+6495 3512 2581 5495 10345 10344 6492  
+6496 3508 3509 3512 6490 6488 1361  
+6497 2855 5217 3515 1193 6499 9797  
+6498 912 3507 3513 5189 10352 6486  
+6499 2855 3515 3513 6502 10348 6497  
+6500 2856 5502 5501 6516 10357 10358  
+6501 2856 3514 3515 6502 1193 10357  
+6502 3514 3513 3515 6499 6501 5191  
+6503 5501 5498 3514 10353 10357 10356  
+6504 3818 3517 148 1348 7093 843  
+6505 5499 3517 912 7086 10352 688  
+6506 1515 3427 3519 6508 6655 6327  
+6507 3701 3518 3490 6452 6451 6432  
+6508 3519 3427 5459 10273 130 6506  
+6509 3443 3520 521 10301 6358 6357  
+6510 3442 3461 3520 6340 6357 6356  
+6511 3522 3521 1308 1973 6513 6421  
+6512 3463 3521 1315 10354 6399 2128  
+6513 3522 1308 5482 2141 10320 6511  
+6514 5500 1314 3476 6423 2142 10355  
+6515 3525 3524 734 2633 6518 1082  
+6516 5502 3523 5501 5190 6500 10359  
+6517 3524 593 4371 8145 993 1082  
+6518 2132 3525 734 6515 3765 3763  
+6519 3525 779 792 749 1109 3763  
+6520 314 3526 315 668 -1 212  
+6521 836 1694 3526 1861 212 2894  
+6522 4629 594 4627 8642 878 7615  
+6523 1870 4625 4626 8638 8646 8639  
+6524 3528 536 4191 7799 7798 836  
+6525 970 1899 3528 3301 1463 3303  
+6526 3529 801 2387 4272 1126 3355  
+6527 4687 3529 603 3198 3356 8761  
+6528 4784 3530 1363 1697 8952 3662  
+6529 5504 3530 2080 3662 10362 2855  
+6530 2125 4827 5506 9038 10367 9039  
+6531 5507 3531 5506 10367 10366 10369  
+6532 4096 1130 4091 7611 7610 7621  
+6533 535 5148 4097 9660 6610 9661  
+6534 3533 3537 3534 6543 6537 1516  
+6535 997 2181 3533 3231 6537 2594  
+6536 1863 2277 3535 4050 6539 4548  
+6537 997 3533 3534 6534 6538 6535  
+6538 997 3534 3535 6539 3225 6537  
+6539 3535 3534 1863 6543 6536 6538  
+6540 1861 4617 5664 1448 10677 8622  
+6541 3536 1860 4615 2595 8619 9095  
+6542 3537 1865 4948 9272 10680 1516  
+6543 1863 3534 3537 6534 3232 6539  
+6544 3546 3538 2208 9138 6560 6559  
+6545 732 3539 2771 6555 5022 5023  
+6546 3538 931 3539 6547 5023 6559  
+6547 3540 3539 931 6546 6548 1385  
+6548 3541 3540 931 6547 6550 687  
+6549 3543 3540 385 687 6554 1385  
+6550 3541 931 3542 6552 6558 6548  
+6551 385 3541 386 4626 -1 687  
+6552 3546 3542 931 6550 6559 3915  
+6553 778 2566 3542 6557 3915 4631  
+6554 384 3543 385 6549 -1 5024  
+6555 3539 3543 2771 662 6545 1385  
+6556 2566 3544 3545 4625 6557 268  
+6557 3545 3542 2566 6553 6556 6558  
+6558 3542 3545 3541 4626 6550 6557  
+6559 3538 3546 931 6552 6546 6544  
+6560 778 3546 2208 6544 5398 3915  
+6561 3548 3547 597 2165 6563 363  
+6562 2233 3547 821 363 3965 1167  
+6563 2262 3548 597 6561 1166 4023  
+6564 3548 1149 2706 4897 4896 4023  
+6565 4026 3549 2248 9180 7485 7484  
+6566 4903 3549 1325 7484 9181 3997  
+6567 3550 895 4165 7749 7748 4221  
+6568 2360 3550 652 1958 4219 1313  
+6569 3551 1342 4292 7998 7997 2196  
+6570 782 2507 3551 4506 1453 4508  
+6571 3553 3552 1337 2182 6573 3500  
+6572 1338 3552 1999 8834 4795 3499  
+6573 3554 3553 1337 6571 3505 3501  
+6574 3553 2000 4725 8835 3500 9028  
+6575 3600 1337 5119 9602 2184 3505  
+6576 3554 2002 4822 9029 3501 6578  
+6577 2635 3556 1984 3634 3635 4758  
+6578 2002 3554 3555 6664 6582 6576  
+6579 2067 1235 3556 6580 4758 6956  
+6580 3557 3556 1235 6579 10371 3470  
+6581 5508 1235 3272 3506 6019 10371  
+6582 3555 3557 2002 6021 6578 3470  
+6583 3558 1905 4671 8729 8728 4790  
+6584 1889 2652 3558 3314 3315 4791  
+6585 3592 3559 490 9632 3237 6648  
+6586 5509 3559 2498 6648 10372 10375  
+6587 1014 2666 3560 6588 958 3900  
+6588 2503 3560 2666 6587 4818 1357  
+6589 5494 3562 2694 6665 10343 973  
+6590 3601 2696 2695 4877 4867 6666  
+6591 5513 1484 5514 10378 10382 10342  
+6592 3565 3564 5515 2136 10384 6596  
+6593 5513 5515 3562 10383 973 10380  
+6594 3566 3565 1313 10381 6597 3468  
+6595 3563 5514 3565 10381 10384 10382  
+6596 546 3564 3565 6592 6601 -1  
+6597 3566 1313 5492 10339 10338 6594  
+6598 3773 3470 3491 6407 6454 10487  
+6599 3567 546 3568 6601 7004 -1  
+6600 3566 1983 3568 2151 3468 6411  
+6601 3565 3568 546 6599 6596 3468  
+6602 2638 3569 711 4999 1846 948  
+6603 1604 3569 1491 948 64 120  
+6604 239 3570 854 5113 4271 165  
+6605 2357 3570 238 165 208 1231  
+6606 1831 3571 682 5240 2617 1788  
+6607 1832 4586 4585 8565 3168 888  
+6608 3572 1651 4023 7479 3993 5381  
+6609 3572 2248 4902 9180 9179 3993  
+6610 4097 3573 535 5414 6533 7620  
+6611 4089 3573 1126 7620 7607 7606  
+6612 3574 885 3575 6615 692 5794  
+6613 5345 132 3159 -1 5795 5796  
+6614 5702 885 3111 5699 10751 6615  
+6615 885 5702 3575 10750 6612 6614  
+6616 3117 3577 573 5836 2548 5712  
+6617 3575 133 3576 -1 692 847  
+6618 2229 3577 1520 10020 3957 2547  
+6619 3580 3578 1774 3053 6625 3054  
+6620 3238 3578 1777 3060 5945 2296  
+6621 3582 3579 1393 6624 6627 6622  
+6622 3579 3582 3583 3138 5952 6621  
+6623 4530 3581 3580 2714 6625 6626  
+6624 3579 3580 1393 2714 6621 3054  
+6625 4530 3580 1774 6619 8454 6623  
+6626 4530 5659 3581 10666 6623 10667  
+6627 4575 3582 1393 6621 8544 8542  
+6628 4565 3582 1816 8542 8525 8524  
+6629 1808 3240 3583 6630 3138 8527  
+6630 5516 3583 3240 6629 10385 1272  
+6631 1393 3581 3584 6632 8544 2714  
+6632 5517 3584 3581 6631 10387 3052  
+6633 3586 3585 1462 8452 6635 1672  
+6634 5646 3585 1779 1672 10641 10640  
+6635 4528 3586 1462 6633 8451 3063  
+6636 3586 1778 4535 3062 8465 3063  
+6637 3255 1399 3587 6639 10147 6291  
+6638 3588 1398 4247 2288 7908 7910  
+6639 3587 1399 3588 6640 2306 6637  
+6640 4248 3588 1399 6639 202 7910  
+6641 1612 3589 1610 6044 10644 2732  
+6642 3280 3589 475 8201 2276 2727  
+6643 1382 3288 3590 6644 7905 6051  
+6644 3289 3590 3288 6643 6050 2280  
+6645 1083 3325 3591 6646 2774 6124  
+6646 3591 3325 2005 1985 3512 6645  
+6647 5040 3592 2497 3897 9452 4488  
+6648 3559 3592 2498 4488 6586 6585  
+6649 3405 3406 3593 10394 2317 2325  
+6650 5451 5520 3406 10394 10258 10257  
+6651 3594 2602 5489 10333 4691 10086  
+6652 2147 3457 3594 4692 6455 4667  
+6653 2146 3486 3595 6654 10309 3792  
+6654 3595 3486 5488 10332 10331 6653  
+6655 1515 3519 3596 6656 6658 6506  
+6656 1318 3596 3519 6655 256 2540  
+6657 1056 3776 3598 6735 2148 7011  
+6658 1515 3596 3597 6347 6660 6655  
+6659 3599 3598 1514 6735 6661 2538  
+6660 1515 3597 3598 2148 10271 6658  
+6661 3599 1514 3400 6736 6273 6659  
+6662 3599 1516 5458 10272 2538 5825  
+6663 1984 3555 3600 6664 4740 3634  
+6664 3600 3555 3554 6578 3505 6663  
+6665 2694 3562 5521 4874 10396 6589  
+6666 2696 3601 469 2479 4875 6590  
+6667 3603 3602 151 844 6669 842  
+6668 3774 3602 727 10397 7006 1528  
+6669 3603 151 5566 10484 10483 6667  
+6670 1303 1365 5522 2240 10398 2241  
+6671 2132 3604 176 781 9049 3765  
+6672 2156 3604 734 3765 160 3811  
+6673 3983 3605 770 7191 1065 7401  
+6674 3606 3605 930 7401 6675 1384  
+6675 5557 3606 930 6674 10466 10400  
+6676 5523 624 3708 1407 6874 10465  
+6677 1604 3607 286 1377 5186 2491  
+6678 653 927 3607 125 2491 7999  
+6679 637 4978 3609 10403 1429 9332  
+6680 3608 3613 3611 6690 6686 1428  
+6681 5306 5525 3610 6683 1799 9972  
+6682 953 5306 5305 9973 6691 9970  
+6683 3610 5525 3948 10404 7334 6681  
+6684 3610 3703 3702 6868 6866 300  
+6685 3611 3616 3612 6696 1426 1527  
+6686 1002 3608 3611 6680 1426 1526  
+6687 155 154 3612 6688 6696 -1  
+6688 4039 3612 154 6687 853 7510  
+6689 3613 953 3614 6691 470 1428  
+6690 952 3611 3613 6680 6694 1527  
+6691 5305 3614 953 6689 6682 5597  
+6692 5304 3614 3059 5597 9969 9968  
+6693 3619 771 817 6154 6701 906  
+6694 3613 3615 952 6700 6690 470  
+6695 3619 3618 952 6698 6700 6701  
+6696 155 3612 3616 6685 1157 6687  
+6697 156 3617 3618 6699 7257 -1  
+6698 3618 3616 952 1527 6695 6699  
+6699 3618 3617 3616 1157 6698 6697  
+6700 3615 3619 952 6695 6694 906  
+6701 817 3618 3619 6695 6693 1066  
+6702 5062 3620 736 1636 997 9496  
+6703 3620 633 5061 9494 681 9496  
+6704 5713 2594 5093 10743 4675 10774  
+6705 4136 974 4134 7692 7691 7696  
+6706 3622 3631 3623 6725 1412 1131  
+6707 4199 3622 629 1412 7813 2039  
+6708 3624 3623 946 6725 6710 6709  
+6709 3627 3623 3624 6708 2921 6717  
+6710 3630 3624 946 6708 6722 41  
+6711 945 3624 1707 41 4224 2921  
+6712 3626 803 1259 4215 6714 2036  
+6713 1260 3622 3625 2038 2037 1131  
+6714 1259 1269 3626 6715 6712 2034  
+6715 4801 3626 1269 6714 8987 8986  
+6716 3627 945 3628 6718 1411 2921  
+6717 629 3623 3627 6709 6721 1412  
+6718 945 1358 3628 6719 6716 2227  
+6719 5589 3628 1358 6718 10526 7412  
+6720 3629 944 5588 10525 10524 67  
+6721 3627 3629 629 7813 6717 1411  
+6722 2122 3630 946 6710 3746 2919  
+6723 1707 3630 1706 9033 2916 41  
+6724 3631 1260 4801 8986 3690 1131  
+6725 946 3623 3631 6706 3689 6708  
+6726 3775 1440 4562 8518 1671 3092  
+6727 3634 3632 1441 6728 6730 2393  
+6728 1441 3632 3633 6729 8396 6727  
+6729 3633 3632 1440 2403 3092 6728  
+6730 3634 1441 4500 8395 7942 6727  
+6731 3634 1439 4266 7945 2388 7942  
+6732 3776 5530 3636 6737 7010 6733  
+6733 5530 3776 3635 2536 10409 6732  
+6734 3637 3638 129 -1 2535 6739  
+6735 1514 3598 3776 6657 7010 6659  
+6736 1514 3637 3400 2535 6661 6274  
+6737 3636 5530 3638 10412 6739 6732  
+6738 5464 3640 1056 6346 10284 10283  
+6739 3636 3638 3637 6734 6274 6737  
+6740 1512 3635 3639 2536 10329 1634  
+6741 5483 3640 3437 10283 10324 10321  
+6742 1309 5487 5710 10768 10767 10330  
+6743 1254 1742 3641 6744 7800 1273  
+6744 482 3641 1742 6743 1607 2987  
+6745 3643 3642 1164 3240 6747 3909  
+6746 4623 3642 1125 3909 1771 8635  
+6747 4126 3643 1164 6745 7677 1849  
+6748 1125 3643 2205 1849 3908 3909  
+6749 545 5599 694 6750 1005 10546  
+6750 3644 694 5599 6749 7526 3428  
+6751 3646 3645 1138 3475 6753 2207  
+6752 234 1137 3645 1797 2207 7646  
+6753 1353 3646 1138 6751 2217 49  
+6754 234 3646 1348 49 -1 2207  
+6755 4043 3647 537 3679 7517 10414  
+6756 5531 1006 2684 4855 1534 1535  
+6757 3649 3648 822 3966 6759 3968  
+6758 2236 3648 2235 3968 3971 3970  
+6759 902 3649 822 6757 1327 10416  
+6760 622 4117 5605 10559 10558 7659  
+6761 3651 3650 5534 10419 4105 2666  
+6762 5349 4922 3650 4056 778 10054  
+6763 4944 3652 958 10420 9264 9263  
+6764 5354 1579 3184 10434 5841 10065  
+6765 3656 3652 2303 9263 6773 4107  
+6766 3653 3652 1219 4107 6767 1436  
+6767 3653 1219 5535 10421 2667 6766  
+6768 1579 3651 3653 1436 6799 10065  
+6769 3657 5537 1219 10426 1955 6776  
+6770 3654 3658 5539 10430 10429 4143  
+6771 5324 3662 1218 6785 1951 10009  
+6772 5536 3655 3660 1950 6782 10424  
+6773 3659 3656 2303 6765 6779 465  
+6774 3657 3656 2304 465 4106 1955  
+6775 5562 3720 5561 10474 10476 10475  
+6776 3657 5562 5537 10473 6769 4106  
+6777 3658 5537 5538 10425 10430 10426  
+6778 3655 5539 1218 5684 6785 10429  
+6779 4931 3659 2303 6773 9238 9237  
+6780 3670 1220 2335 4104 2609 6802  
+6781 3664 3661 3660 6784 1679 5201  
+6782 5536 3660 865 6784 10423 6772  
+6783 3663 3661 1079 5201 6787 1437  
+6784 865 3660 3661 6781 1952 6782  
+6785 1218 3662 3655 1950 6778 6771  
+6786 3662 3104 3671 6803 6795 10009  
+6787 5540 3663 1079 6783 10431 5847  
+6788 3663 957 3665 6791 1437 5849  
+6789 3666 3664 1217 1679 6793 6790  
+6790 3664 3666 3668 5203 5202 6789  
+6791 5541 3665 957 6788 10433 6792  
+6792 3665 5541 3669 5843 1439 6791  
+6793 3667 3666 1217 6789 6804 6794  
+6794 3673 3666 3667 6793 2834 6808  
+6795 3671 1217 3662 5686 6786 6804  
+6796 3667 1664 5223 9810 9809 6806  
+6797 2862 2861 3668 6798 5203 9802  
+6798 5355 3668 2861 6797 10067 10066  
+6799 3653 3669 1579 5843 6768 2667  
+6800 5536 3669 3654 10422 10424 10423  
+6801 2304 3659 3670 6802 6900 465  
+6802 1220 3670 3659 6801 9237 6780  
+6803 3672 3671 3104 6786 6805 5685  
+6804 3667 1217 3671 6795 5685 6793  
+6805 3394 3672 3104 6803 6262 6261  
+6806 3667 3672 1664 6261 6796 5685  
+6807 3673 497 5221 9806 9805 2834  
+6808 2862 3666 3673 6794 1809 5203  
+6809 3674 1550 3675 6811 4176 2608  
+6810 3677 3674 2340 9323 6815 2330  
+6811 4962 3675 1550 6809 2606 10435  
+6812 4961 3676 5542 4167 10436 9297  
+6813 5543 3676 2329 9297 10437 4204  
+6814 1410 3675 3676 4167 10440 10724  
+6815 3678 3677 2340 6810 4179 2000  
+6816 2339 3677 960 2000 4177 2330  
+6817 2340 4974 3679 4178 4179 10725  
+6818 3678 2341 3680 6821 5693 3110  
+6819 2351 1243 3679 10442 4178 9325  
+6820 1243 5327 5545 10014 10442 10015  
+6821 3681 3680 2341 6818 10444 4181  
+6822 960 3680 3108 4181 6899 5693  
+6823 5545 5546 2341 10444 10441 5687  
+6824 3681 1242 5326 5694 10013 10002  
+6825 2345 5548 3682 6826 9309 10447  
+6826 3682 5548 5549 10448 2004 6825  
+6827 300 2454 3683 6828 4391 969  
+6828 2448 3683 2454 6827 4405 1801  
+6829 3685 3684 1447 4420 6836 2404  
+6830 5626 3686 3684 6834 1145 2396  
+6831 1447 2460 3687 4415 6836 4416  
+6832 3685 811 4436 8272 8271 6835  
+6833 3686 703 4551 3094 8497 2396  
+6834 2462 3684 3686 6830 4421 4420  
+6835 811 3685 3687 6836 4414 6832  
+6836 1447 3687 3685 6835 6829 6831  
+6837 3689 3688 969 1461 6839 5587  
+6838 1877 2650 3688 4785 10452 4786  
+6839 3063 3689 969 6837 5605 3259  
+6840 5550 3054 3053 9963 10451 5584  
+6841 5551 2501 2502 4496 1623 10454  
+6842 1049 2944 3690 4497 10453 1620  
+6843 3713 5552 859 1027 1730 6884  
+6844 584 2970 3691 5417 6846 5415  
+6845 3692 751 5251 9863 5385 2812  
+6846 584 3691 3692 10456 5384 6844  
+6847 5554 1011 3703 6868 10460 10459  
+6848 3693 5554 4808 283 3173 10459  
+6849 4323 3694 1511 10045 8056 6427  
+6850 3814 3694 678 6427 626 7081  
+6851 4460 3695 628 5832 593 6852  
+6852 3695 4460 5654 8316 8321 6851  
+6853 5623 3697 3696 6856 2324 2064  
+6854 3195 3696 1407 6856 10253 5864  
+6855 3697 1403 5450 10256 10255 2064  
+6856 1407 3696 3697 6853 6283 6854  
+6857 4424 3698 1397 5902 8247 2787  
+6858 3698 1640 4426 2786 8252 2787  
+6859 4725 3699 487 6221 1395 6860  
+6860 3699 4725 5553 8835 6092 6859  
+6861 2467 3700 2466 1902 1903 4430  
+6862 1192 3700 138 4430 -1 4428  
+6863 2151 3481 3701 6864 6451 3800  
+6864 2688 3701 3481 6863 6462 6432  
+6865 3048 3702 1011 6868 1387 5575  
+6866 499 3610 3702 6684 1252 1799  
+6867 600 4044 5554 7520 10460 1542  
+6868 1011 3702 3703 6684 6847 6865  
+6869 812 62 3705 6871 7252 1148  
+6870 5555 455 3840 415 7126 418  
+6871 62 61 3705 729 6869 -1  
+6872 621 3706 922 44 772 1368  
+6873 332 3706 924 1368 48 1058  
+6874 942 5523 3708 6676 6877 10399  
+6875 3707 943 5177 9718 9716 6876  
+6876 943 3707 3708 6877 989 6875  
+6877 942 3708 3707 6876 353 6874  
+6878 3710 3709 624 1407 6880 1408  
+6879 975 2770 5556 5019 10464 3865  
+6880 5557 3710 624 6878 10465 6882  
+6881 3710 532 4859 9098 9097 1474  
+6882 5557 3711 3710 1474 6880 10466  
+6883 3984 3711 930 10466 1383 7403  
+6884 3713 1653 5552 10455 6843 1729  
+6885 5559 3713 3712 1730 10470 10469  
+6886 102 3713 1104 10469 -1 1729  
+6887 3715 3714 1153 1751 6889 10472  
+6888 5560 473 5332 10024 4311 1390  
+6889 4119 3715 1153 6887 1827 7663  
+6890 5331 3715 1154 7663 10022 531  
+6891 2644 3716 1201 2458 1115 2963  
+6892 1478 3716 1475 2963 7985 1394  
+6893 4261 3717 1430 2952 2369 7936  
+6894 3717 1371 4941 9258 9257 7936  
+6895 3718 1809 4562 1671 8519 3125  
+6896 1442 1818 3718 3137 3095 3084  
+6897 551 3719 2106 3719 3718 1210  
+6898 3719 2107 4813 9011 9010 1210  
+6899 960 3108 5561 5691 10474 6822  
+6900 3670 3720 2304 10475 6801 2609  
+6901 3721 1409 5547 10446 4156 4185  
+6902 2329 2342 3721 4183 10437 4154  
+6903 3822 3722 897 7369 7095 1134  
+6904 4985 3722 898 851 9345 1320  
+6905 4412 3723 712 7096 8224 8223  
+6906 3723 1618 4407 1319 8214 8223  
+6907 3726 3725 1081 4298 6910 2785  
+6908 2386 240 3724 -1 4273 7394  
+6909 2401 3725 1639 8248 2784 4299  
+6910 3726 1081 3333 6141 1502 6907  
+6911 1635 4425 5650 10649 10648 8249  
+6912 561 2611 3727 6913 2587 4710  
+6913 749 3727 2611 6912 2113 4709  
+6914 3729 3728 2116 3734 3729 3733  
+6915 2726 3728 2204 3733 4935 2194  
+6916 2116 3388 5564 10479 3729 6250  
+6917 591 2227 5563 3953 10478 10482  
+6918 3734 3730 918 6249 6929 6919  
+6919 3731 3730 3734 6918 2624 6921  
+6920 3733 3731 676 6931 6924 6923  
+6921 591 3730 3731 6919 6922 468  
+6922 591 3731 3732 6923 3906 6921  
+6923 3732 3731 3733 6920 6925 6922  
+6924 1557 3733 676 6920 2623 2011  
+6925 3732 3733 1247 8136 595 6923  
+6926 918 5446 3735 6246 6929 10247  
+6927 3736 3734 1559 6928 10778 2624  
+6928 1559 3734 3735 6929 603 6927  
+6929 918 3735 3734 6928 6918 6926  
+6930 5640 5715 1559 10778 10628 3735  
+6931 3731 3736 676 497 6920 2624  
+6932 2716 3737 707 940 4926 4915  
+6933 2715 2742 3737 1813 4915 4914  
+6934 3739 3738 901 5128 6936 6935  
+6935 3738 3739 3740 2929 2930 6934  
+6936 4489 3739 901 6934 2925 8374  
+6937 4491 3739 1710 8374 581 8378  
+6938 3391 3740 1711 2929 2928 6256  
+6939 3741 2789 2831 5141 5138 6941  
+6940 1712 3740 3741 6941 5140 2930  
+6941 2789 3741 3740 6940 6256 6939  
+6942 3198 3742 1509 5264 5871 4402  
+6943 3742 2452 5023 9421 9420 4402  
+6944 1427 2895 3743 6945 407 9841  
+6945 1498 3743 2895 6944 9840 5269  
+6946 481 5317 3745 9994 2413 9995  
+6947 3089 3744 1806 6949 5656 1443  
+6948 3745 1805 3746 6950 2411 9994  
+6949 1806 3744 3745 2413 9831 6947  
+6950 4559 3746 1805 6948 8513 8512  
+6951 1444 4556 4557 8506 3105 8507  
+6952 3119 3747 767 5731 5715 10761  
+6953 5707 3118 3747 941 10761 45  
+6954 2787 3748 1682 5853 5053 1575  
+6955 829 3748 3218 1575 4351 5911  
+6956 2067 3749 1235 6017 6579 3469  
+6957 3270 3749 2066 4947 6015 3507  
+6958 3751 3750 1835 6164 6960 908  
+6959 1834 160 3750 3174 908 344  
+6960 3751 1835 3752 6962 4314 6958  
+6961 1834 3751 689 9369 4879 908  
+6962 3753 3752 1835 6960 6964 6163  
+6963 5012 3752 688 6163 9400 9399  
+6964 3343 3753 1835 6962 6161 3177  
+6965 688 3753 3344 3177 5607 6163  
+6966 5133 3757 2199 6973 9630 327  
+6967 3754 1088 3755 3047 3896 6972  
+6968 3758 3763 1088 6984 6975 6985  
+6969 3762 3761 2075 3652 6982 1644  
+6970 3759 3756 2073 3646 6976 6971  
+6971 3756 3759 3761 3652 6981 6970  
+6972 1088 3754 3757 6973 6975 6967  
+6973 2199 3757 3754 6972 6241 6966  
+6974 2076 2679 3763 4844 6985 4845  
+6975 1088 3757 3758 3653 6968 6972  
+6976 3760 3759 2073 6970 6978 6977  
+6977 3759 3760 3765 3650 3648 6976  
+6978 3764 3760 2073 6976 6986 728  
+6979 4780 3760 2072 728 3647 8945  
+6980 2084 3755 3761 6981 1644 3670  
+6981 3756 3761 3755 6980 3047 6971  
+6982 3762 2075 3766 3649 6989 6969  
+6983 5199 3767 1770 6993 9761 5082  
+6984 1088 3763 3756 3646 3047 6968  
+6985 3763 3758 2076 9123 6974 6968  
+6986 2679 3764 2073 6978 4844 4841  
+6987 2072 3764 716 4841 225 728  
+6988 4781 3765 2074 3650 3645 8946  
+6989 3766 2121 3762 3465 6982 6991  
+6990 3765 1090 3766 6991 3649 8946  
+6991 1090 2121 3766 6989 6990 3743  
+6992 2084 3762 3767 6993 9758 1644  
+6993 1770 3767 3762 6992 9849 6983  
+6994 3769 5568 150 -1 6997 10488  
+6995 5567 3768 835 5188 10485 959  
+6996 5568 3768 151 10484 -1 10488  
+6997 5502 3769 150 6994 10359 10358  
+6998 1311 3772 3770 7000 6470 7002  
+6999 3771 1307 4214 7843 7842 7075  
+7000 3772 3771 3770 656 6998 7003  
+7001 3771 1306 3813 2124 7075 7003  
+7002 3772 1311 4849 9078 588 6998  
+7003 3771 3772 1306 7082 7001 7000  
+7004 3568 3773 3567 6412 6599 2151  
+7005 5569 1983 3472 10319 2153 10489  
+7006 1977 3774 727 6668 3457 979  
+7007 3774 1003 4041 7514 7513 8825  
+7008 1815 3775 1809 1671 3125 3006  
+7009 486 3633 3775 3092 3006 706  
+7010 1514 3776 3636 6732 6274 6735  
+7011 1056 3639 3776 2536 6657 6346  
+7012 4050 3777 70 631 737 759  
+7013 3777 675 2556 694 4606 759  
+7014 868 3778 16 387 351 990  
+7015 3910 5570 733 10491 7259 382  
+7016 263 3779 264 482 -1 490  
+7017 2768 3779 827 7274 5018 1178  
+7018 3905 3780 812 1859 7252 7019  
+7019 3780 3905 5571 7251 5037 7018  
+7020 4339 3781 869 1569 8083 864  
+7021 3781 1529 3782 7022 2575 864  
+7022 4341 3782 1529 7021 2566 8088  
+7023 4349 3782 1530 8088 8103 2569  
+7024 3783 4393 5151 8185 9666 8186  
+7025 4431 3784 1552 2613 8261 2052  
+7026 3784 1643 4432 2792 2515 2052  
+7027 3785 1043 4304 8021 2511 2793  
+7028 1552 3785 1495 2500 1609 2613  
+7029 3786 1346 4470 8336 8335 3479  
+7030 495 1989 3786 3477 2891 3480  
+7031 3787 1030 4061 585 7552 1898  
+7032 4059 3787 1029 7552 7550 7549  
+7033 3790 3789 1909 4222 10688 7035  
+7034 2135 229 3788 -1 1153 379  
+7035 3789 3790 2970 3323 5415 7033  
+7036 1909 2535 5717 2156 10688 4565  
+7037 1910 5670 4673 10689 10690 1906  
+7038 233 3791 1137 4276 1794 701  
+7039 3791 1136 4126 1793 7677 7644  
+7040 2411 3792 830 4323 9376 4319  
+7041 2409 3792 2410 9371 2654 4318  
+7042 3793 2280 5349 10054 4058 4329  
+7043 2414 3793 978 10056 4327 4059  
+7044 4139 3796 2603 1878 7701 7700  
+7045 2558 30 3794 -1 1221 1224  
+7046 2559 29 3795 -1 4614 4610  
+7047 4134 3796 1180 7700 683 7692  
+7048 529 2777 3797 7049 7790 638  
+7049 3797 2777 5183 9730 5034 7048  
+7050 4183 3798 1239 5230 7783 7051  
+7051 3798 4183 5610 7782 7775 7050  
+7052 3800 3799 1768 5342 1699 3039  
+7053 2933 3799 1095 9703 5344 5343  
+7054 1768 2914 3801 5300 1699 5306  
+7055 3800 1766 5170 9704 3039 1709  
+7056 3802 3801 1094 5300 7058 7057  
+7057 3803 3801 3802 7056 3037 7061  
+7058 2909 3802 1094 7056 2419 5294  
+7059 3802 1455 4523 2421 8441 5294  
+7060 873 3803 1765 3037 8516 3036  
+7061 1766 3801 3803 7057 4978 1709  
+7062 3022 3804 3023 4768 2431 2202  
+7063 1757 2642 3804 5522 2202 5708  
+7064 3807 3805 864 5592 7068 1251  
+7065 3806 3049 932 5574 7066 5576  
+7066 5292 3806 932 7065 9944 1068  
+7067 3806 3046 5298 9957 5571 1068  
+7068 3058 3807 864 7064 5594 5577  
+7069 3807 3059 5705 10757 1427 9969  
+7070 3808 108 5693 10734 9442 5632  
+7071 3078 3808 1198 9984 1911 5633  
+7072 1225 3810 964 9478 1967 1963  
+7073 3147 3809 3146 462 5769 1522  
+7074 663 3205 3810 5886 1963 1450  
+7075 1307 3771 3813 7001 7079 6999  
+7076 3346 3823 3349 7098 6171 1844  
+7077 3478 3812 678 7078 8055 665  
+7078 678 3812 3813 7079 626 7077  
+7079 3813 3812 1307 10328 7075 7078  
+7080 3815 3814 1306 2124 7082 1297  
+7081 3814 1305 3694 2532 6850 1297  
+7082 3772 3815 1306 7080 7003 588  
+7083 3815 627 3816 7084 2122 9077  
+7084 3111 3816 627 7083 3826 5699  
+7085 3816 885 3160 5794 5792 5699  
+7086 3517 3817 912 6481 6505 843  
+7087 3508 3817 1012 7089 1361 6482  
+7088 3819 3820 147 -1 7090 838  
+7089 3817 3818 1012 622 7087 843  
+7090 5067 3819 147 7088 9505 4644  
+7091 3509 3819 2574 4644 4642 6487  
+7092 3821 2181 4939 3860 9254 3231  
+7093 3818 148 3820 -1 838 6504  
+7094 488 2315 5573 4117 10497 3235  
+7095 2374 3822 897 6903 4246 2753  
+7096 3723 3822 712 9354 6905 1134  
+7097 3811 3823 1161 1844 1018 1843  
+7098 282 3349 3823 7076 1843 6167  
+7099 353 356 3824 7100 12 15  
+7100 355 3824 356 7099 -1 56  
+7101 3825 350 3851 7146 87 18  
+7102 358 351 3825 18 110 7103  
+7103 358 3826 351 23 7102 57  
+7104 356 3826 357 57 -1 66  
+7105 448 3829 449 235 -1 252  
+7106 3828 3827 412 243 -1 7107  
+7107 3827 3828 450 239 -1 7106  
+7108 413 412 3829 243 252 -1  
+7109 446 3831 447 253 -1 246  
+7110 445 416 3830 -1 247 324  
+7111 415 414 3831 253 246 -1  
+7112 411 3832 451 270 273 238  
+7113 1868 3832 410 238 271 3242  
+7114 403 3833 405 280 429 405  
+7115 454 453 3833 280 405 -1  
+7116 3834 418 3835 7119 7118 314  
+7117 440 3834 441 320 -1 333  
+7118 3834 3835 442 323 320 7116  
+7119 418 417 3835 317 7116 -1  
+7120 400 3843 5575 7130 10501 7131  
+7121 443 417 3836 -1 319 317  
+7122 422 5574 423 326 -1 10498  
+7123 420 3838 421 335 -1 337  
+7124 3704 3839 456 7129 -1 413  
+7125 403 3840 454 415 405 404  
+7126 5555 3840 402 404 10461 6870  
+7127 3842 3841 456 417 10500 7128  
+7128 3841 3842 3844 421 4389 7127  
+7129 5575 456 3839 7124 10501 10500  
+7130 3842 5575 3843 7120 410 10500  
+7131 400 399 3843 7132 7120 -1  
+7132 3895 3843 399 7131 1111 7232  
+7133 793 2446 3844 7134 421 5197  
+7134 2446 460 3844 4389 7133 445  
+7135 1071 3845 271 469 1663 1256  
+7136 3846 3845 608 1256 7137 5778  
+7137 3364 3846 608 7136 5779 6202  
+7138 272 3846 3151 488 159 5778  
+7139 3847 195 3914 620 7268 546  
+7140 5577 3847 618 637 10504 645  
+7141 205 3848 206 594 -1 601  
+7142 3848 658 4290 7994 2478 2591  
+7143 91 685 3850 7145 541 868  
+7144 4711 3849 681 569 8808 8807  
+7145 3850 685 4590 8568 13 7143  
+7146 350 697 3851 7147 7101 20  
+7147 746 3851 697 7146 1016 750  
+7148 3852 561 3853 7150 936 964  
+7149 3854 3852 705 3335 7152 935  
+7150 2393 3853 561 7148 2587 4285  
+7151 4352 3853 1539 4285 2586 8110  
+7152 1561 3854 705 7149 2631 932  
+7153 348 719 3854 935 932 52  
+7154 139 5030 5692 9434 10733 -1  
+7155 726 140 3855 -1 7156 -1  
+7156 726 3855 3856 617 4429 7155  
+7157 3857 244 4048 1004 1557 532  
+7158 2610 3857 740 1557 4708 484  
+7159 362 741 3858 7160 179 80  
+7160 3858 741 3884 1007 7211 7159  
+7161 1222 3859 100 174 7751 877  
+7162 1653 3859 751 9863 10455 872  
+7163 3860 5577 3862 10504 7168 1028  
+7164 752 4012 3861 7456 635 600  
+7165 1271 4201 4202 7819 1490 7818  
+7166 198 3860 3861 635 2059 623  
+7167 3915 3863 618 618 7269 1170  
+7168 752 3860 3862 7163 7460 635  
+7169 5618 3202 4234 7882 10585 5880  
+7170 1366 4013 4014 7457 7461 7458  
+7171 1142 3864 8 364 1034 458  
+7172 2223 3864 755 458 434 3940  
+7173 3866 3865 165 411 7175 1748  
+7174 3865 761 4995 9365 837 1748  
+7175 164 3866 165 7173 -1 827  
+7176 761 3866 1113 1046 7588 1748  
+7177 3777 3867 71 1037 631 19  
+7178 765 2551 5578 1055 10506 4597  
+7179 3872 3868 376 107 7186 272  
+7180 4238 3869 3868 7182 137 1061  
+7181 4005 3871 982 712 7443 7442  
+7182 377 3868 3869 7180 1064 107  
+7183 3874 3871 770 7442 7191 7190  
+7184 3871 3870 3869 1064 712 7185  
+7185 3870 3871 378 7190 -1 7184  
+7186 3873 3872 376 7179 7188 3001  
+7187 3872 845 4239 7892 7891 3001  
+7188 376 375 3873 7189 7186 -1  
+7189 1748 3873 375 7188 4766 1060  
+7190 3871 3874 378 71 7185 7183  
+7191 3605 3874 770 7183 6673 1151  
+7192 3875 33 4036 194 7504 349  
+7193 3876 3875 773 221 7194 2807  
+7194 3877 3876 773 7193 7196 1071  
+7195 3876 1650 4440 8280 2806 1071  
+7196 1565 3877 773 7194 219 2639  
+7197 3877 683 4439 8277 831 8269  
+7198 66 3881 3879 7205 7200 654  
+7199 5579 3878 774 1073 10507 7533  
+7200 66 3879 3878 1073 764 7198  
+7201 4337 3879 777 7205 8078 1079  
+7202 2127 3880 649 192 1077 3756  
+7203 3880 776 4112 1076 7650 3756  
+7204 3881 65 3938 1078 7316 654  
+7205 3879 3881 777 535 7201 7198  
+7206 792 3882 171 745 808 749  
+7207 2131 3882 779 749 1083 746  
+7208 3858 3883 363 82 179 62  
+7209 2760 3883 784 62 5001 904  
+7210 2762 3884 562 1007 9349 5005  
+7211 3858 3884 784 5005 62 7160  
+7212 4457 3889 192 -1 8310 7220  
+7213 3886 3885 785 7221 7214 1169  
+7214 3888 3886 785 7213 7218 642  
+7215 3886 823 3914 7268 7267 1742  
+7216 5025 3887 1110 7219 9425 7217  
+7217 3887 5025 3915 9424 7270 7216  
+7218 3888 785 4114 7653 100 7214  
+7219 3887 3888 1110 7762 7216 642  
+7220 3889 4457 3890 8309 1094 7212  
+7221 3890 785 3885 7213 1815 7653  
+7222 4114 3890 1147 8309 7654 7653  
+7223 60 59 3891 7224 1100 -1  
+7224 1248 3891 59 7223 2013 2012  
+7225 3892 3894 3893 7230 5045 502  
+7226 664 789 3892 1103 5045 926  
+7227 2783 555 3893 7228 7230 9503  
+7228 3922 3893 555 7227 10512 7283  
+7229 2784 3894 588 502 5677 5046  
+7230 2783 3893 3894 7225 9746 7227  
+7231 2859 3895 729 1111 426 4390  
+7232 3843 3895 793 4390 410 7132  
+7233 3897 3896 202 369 7235 1118  
+7234 1033 3896 797 1118 1590 1365  
+7235 202 201 3897 7236 7233 -1  
+7236 3897 201 5612 10573 10572 7235  
+7237 3899 3898 220 755 7242 172  
+7238 3902 3898 802 172 7245 1351  
+7239 3900 220 219 -1 1128 7242  
+7240 3899 1024 4458 8312 8311 7241  
+7241 1024 3899 3900 7242 554 7240  
+7242 220 3900 3899 7241 7237 7239  
+7243 218 3901 219 1128 -1 1570  
+7244 1024 3901 1156 7665 1571 554  
+7245 3903 3902 802 7238 7247 559  
+7246 3902 914 3982 7399 7398 559  
+7247 3903 802 4459 8313 564 7245  
+7248 914 3903 628 593 5834 559  
+7249 2376 3904 563 1017 4251 4249  
+7250 1566 3904 805 4249 8149 1008  
+7251 3905 586 5571 10492 7019 1101  
+7252 3705 3905 812 7018 6869 719  
+7253 3605 3908 379 74 1151 68  
+7254 1169 5580 812 1148 1859 10509  
+7255 3988 3907 814 7256 1152 7408  
+7256 3907 3908 814 68 7255 446  
+7257 3618 3909 156 1155 6697 1066  
+7258 3339 3909 817 1066 6153 6152  
+7259 3911 3910 733 7015 1260 5211  
+7260 589 818 3910 382 5211 7341  
+7261 3778 3912 733 1260 10491 990  
+7262 3911 2866 5220 9804 9803 7266  
+7263 868 612 3912 7264 990 5199  
+7264 3913 3912 612 7263 7265 991  
+7265 2862 3913 612 7264 367 643  
+7266 2866 3911 3913 991 643 7262  
+7267 3886 3914 194 620 1169 7215  
+7268 3847 3914 823 7215 637 7139  
+7269 618 823 3915 7270 7167 637  
+7270 3887 3915 823 7269 1742 7217  
+7271 258 826 3916 7272 498 503  
+7272 3916 826 3917 7273 262 7271  
+7273 3918 3917 826 7272 7275 1176  
+7274 3779 3917 827 1176 7017 490  
+7275 867 3918 826 7273 1175 1258  
+7276 3918 611 1039 3850 1600 1586  
+7277 3920 3919 24 416 7279 1179  
+7278 1517 3919 828 1179 2543 2533  
+7279 24 23 3920 7282 7277 -1  
+7280 22 3921 23 7282 -1 393  
+7281 3922 3921 664 2009 7283 385  
+7282 23 3921 3920 10511 7279 7280  
+7283 3893 3922 664 7281 5045 7228  
+7284 555 2959 5714 10775 10512 1180  
+7285 3924 3923 279 143 621 2223  
+7286 3351 3923 831 2223 1186 6176  
+7287 4226 279 278 -1 1185 621  
+7288 831 3924 1356 7867 8364 2223  
+7289 1225 3925 53 657 132 1189  
+7290 3141 3925 833 1189 5750 5757  
+7291 925 3926 320 1020 841 182  
+7292 1855 3926 837 182 10223 807  
+7293 3939 3927 117 905 7320 419  
+7294 3927 839 4587 8566 412 419  
+7295 3929 3928 695 918 7297 921  
+7296 3937 3928 840 921 7313 555  
+7297 466 3929 695 7295 432 1203  
+7298 3929 1227 4169 150 7755 1203  
+7299 480 1976 3931 7301 3453 5867  
+7300 5583 549 3937 555 7314 10516  
+7301 4719 3931 1976 7299 3455 8823  
+7302 3932 3931 890 8823 7303 1303  
+7303 3933 3932 890 7302 7305 1305  
+7304 549 3930 3932 1303 1305 10516  
+7305 3934 3933 890 7303 7307 289  
+7306 3933 891 3962 661 7360 289  
+7307 3934 890 3935 7309 427 7305  
+7308 3934 514 3963 1306 7363 7312  
+7309 4719 3935 890 7307 8823 8822  
+7310 1975 693 3935 3452 8822 3942  
+7311 2223 3936 693 3452 3945 434  
+7312 514 3934 3936 427 3944 7308  
+7313 5582 3937 840 7296 10513 1204  
+7314 5583 3937 841 1204 10515 7300  
+7315 1168 3938 64 1078 734 1215  
+7316 3881 3938 846 1215 535 7204  
+7317 3942 3940 116 -1 7322 1201  
+7318 3941 3939 847 7323 7319 4608  
+7319 2835 3941 847 7318 4609 2550  
+7320 3939 117 3940 -1 1201 7293  
+7321 3941 2557 5297 9955 9954 2550  
+7322 1523 3942 116 7317 10619 2551  
+7323 3939 3942 847 9789 7318 1201  
+7324 3944 3943 522 628 7326 1220  
+7325 2751 3943 848 1220 1219 4985  
+7326 4370 3944 522 7324 806 8144  
+7327 4127 3944 1166 8144 731 7679  
+7328 3945 638 1829 3165 780 1853  
+7329 76 848 3945 770 518 782  
+7330 2123 3946 121 867 3748 3747  
+7331 3411 3946 853 3747 965 6295  
+7332 3948 3947 600 1542 7334 4210  
+7333 3411 3947 720 10517 6296 965  
+7334 3610 3948 600 7332 300 6683  
+7335 5584 1139 2356 4211 966 10518  
+7336 1853 3949 855 1236 187 3212  
+7337 2764 3949 856 3212 197 5010  
+7338 3952 3951 818 1102 7341 1160  
+7339 862 20 3950 -1 7340 6227  
+7340 3950 3951 862 1160 7339 231  
+7341 589 3952 818 7338 7260 1247  
+7342 3952 2870 5224 5218 9812 5219  
+7343 4339 86 636 802 8084 312  
+7344 1023 3953 869 8083 1569 1568  
+7345 655 4471 4474 8338 8344 521  
+7346 2629 3954 569 2886 4746 195  
+7347 604 3955 855 227 1236 173  
+7348 325 3955 879 173 112 1281  
+7349 47 881 3956 7350 568 571  
+7350 3957 3956 881 7349 7351 975  
+7351 616 3957 881 7350 1172 1286  
+7352 3957 882 4697 8781 975 8774  
+7353 4847 3960 886 5225 9074 9073  
+7354 3960 3958 3959 1275 5225 7357  
+7355 5703 134 2873 -1 10754 10753  
+7356 5644 3960 2163 9073 10637 10636  
+7357 3958 3960 135 10636 -1 7354  
+7358 2703 3961 163 713 833 4891  
+7359 3866 3961 888 4891 1046 827  
+7360 3933 3962 549 234 1305 7306  
+7361 4889 891 2219 3937 3936 661  
+7362 2219 3963 660 2451 439 3937  
+7363 3934 3963 891 3937 289 7308  
+7364 3965 3964 570 952 7366 530  
+7365 4103 3964 892 530 7633 21  
+7366 2243 3965 570 7364 3985 1307  
+7367 987 3965 893 1307 7464 1308  
+7368 2375 3966 805 2640 4250 4248  
+7369 897 3722 3967 86 7371 6903  
+7370 742 3967 2371 86 4238 4240  
+7371 897 3967 3966 4240 4248 7369  
+7372 5532 3968 883 436 10415 1290  
+7373 3969 3968 902 1290 7375 1328  
+7374 3970 904 4001 676 7435 1334  
+7375 902 390 3969 -1 7373 1165  
+7376 1539 3970 906 1332 1336 981  
+7377 769 3972 369 1337 95 308  
+7378 908 372 3971 -1 697 1375  
+7379 907 3972 909 308 1342 104  
+7380 5346 3973 769 1341 108 5811  
+7381 992 3973 579 5811 1506 1063  
+7382 995 3974 302 178 7495 1343  
+7383 3976 3974 910 1343 198 1346  
+7384 3977 3975 615 199 1755 1344  
+7385 3975 911 3976 177 198 1344  
+7386 911 4086 3978 7601 177 1345  
+7387 5586 303 3976 1346 10522 -1  
+7388 615 4684 3979 8754 1755 8755  
+7389 3977 1117 4085 7599 7598 7393  
+7390 5653 3978 1676 7601 10654 2859  
+7391 5586 3978 304 2859 -1 10522  
+7392 2477 3979 1921 8754 3347 4447  
+7393 1117 3977 3979 1755 4447 7389  
+7394 2386 3980 240 384 6908 741  
+7395 3981 3980 913 741 7397 7396  
+7396 3980 3981 241 215 384 7395  
+7397 2442 3981 913 7395 1350 216  
+7398 3902 3982 221 557 1351 7246  
+7399 2216 3982 914 7246 213 3930  
+7400 3984 3983 582 1487 3221 1383  
+7401 3605 3983 930 1383 6674 6673  
+7402 4614 582 4354 346 8617 3221  
+7403 3984 1858 3711 72 6883 8616  
+7404 5587 3985 273 164 10521 466  
+7405 3986 3985 940 466 1404 1410  
+7406 5588 940 1262 5233 10524 1404  
+7407 3986 944 3989 10527 7411 10525  
+7408 3907 3988 381 1406 -1 7255  
+7409 142 141 3987 -1 1469 -1  
+7410 5523 814 3606 1384 10400 1152  
+7411 3986 3989 274 171 1410 7407  
+7412 944 3628 5589 6719 10527 67  
+7413 3991 3990 730 985 1425 7416  
+7414 3990 951 5218 983 5196 7416  
+7415 462 3991 463 1425 -1 984  
+7416 3990 3991 951 7418 7414 7413  
+7417 3996 3993 596 121 7424 1430  
+7418 3991 3992 951 9411 7416 984  
+7419 3995 3993 954 1430 7422 986  
+7420 731 954 3994 7421 5204 5209  
+7421 3994 954 3996 1430 7425 7420  
+7422 954 2865 3995 7423 7419 5209  
+7423 14 3995 2865 7422 5206 5208  
+7424 2787 3996 596 7417 1432 2870  
+7425 3994 3996 955 2870 717 7421  
+7426 3998 3997 955 717 7428 800  
+7427 3187 3997 956 800 94 644  
+7428 2787 3998 955 7426 2870 5053  
+7429 3998 1682 5356 10069 10068 5053  
+7430 2702 3999 889 4890 1162 4889  
+7431 1240 3999 970 4889 1463 1996  
+7432 4000 630 4079 7586 1300 680  
+7433 889 4000 2703 1302 4884 4890  
+7434 996 4001 613 676 865 1466  
+7435 3970 4001 972 1466 1332 7374  
+7436 905 4082 4084 1333 7597 7592  
+7437 906 972 4002 1467 1335 1332  
+7438 1141 4003 95 891 884 1804  
+7439 1053 4003 979 1804 4216 1628  
+7440 2874 4004 190 75 9815 1484  
+7441 1683 4004 981 1484 2872 647  
+7442 3871 4005 770 1065 7183 7181  
+7443 4006 4005 982 7181 7444 282  
+7444 4237 4006 982 7443 7890 1486  
+7445 4006 1542 4354 2597 346 10588  
+7446 3897 4007 797 1588 1118 609  
+7447 4008 4007 984 609 1491 1364  
+7448 984 4201 4009 7818 1491 2058  
+7449 4010 4008 985 7451 7452 1691  
+7450 4011 4009 1271 7818 7454 1029  
+7451 985 4008 4009 1491 10530 7449  
+7452 4010 985 5433 10222 10221 7449  
+7453 1085 2833 5590 5145 10529 1363  
+7454 4012 4011 1271 7450 7456 35  
+7455 619 3366 5591 1692 10531 7878  
+7456 3861 4012 1271 7454 1490 7164  
+7457 4014 4013 752 600 7460 7170  
+7458 4230 4013 1366 7170 7874 7873  
+7459 619 4012 4013 600 7873 35  
+7460 3862 4014 752 7457 7168 592  
+7461 1366 4014 3863 592 7881 7170  
+7462 3965 4015 892 1310 530 1308  
+7463 3156 4015 987 1308 5789 5786  
+7464 4017 987 893 7367 7466 1496  
+7465 4018 4016 988 7467 7468 2648  
+7466 4028 4017 893 7464 7488 388  
+7467 988 4016 4017 1496 7490 7465  
+7468 4019 4018 988 7465 7470 1499  
+7469 4018 1570 4378 8159 8158 10534  
+7470 4020 4019 988 7468 7472 2649  
+7471 1571 3197 5593 5870 10535 362  
+7472 4029 4020 988 7470 7490 2162  
+7473 4021 4020 894 3994 7474 2649  
+7474 4022 4021 894 7473 7476 7487  
+7475 4019 4021 1571 4321 10535 2649  
+7476 4023 4022 894 7474 7478 2650  
+7477 4027 1573 2430 2655 7486 2651  
+7478 4023 894 2248 7485 3993 7476  
+7479 4024 4023 1651 6608 7480 2650  
+7480 4025 4024 1651 7479 7482 1311  
+7481 4022 4024 1573 4317 2651 2650  
+7482 2258 4025 1651 7480 4007 3333  
+7483 2410 4025 1331 9189 2654 1311  
+7484 3549 4026 1325 7491 6566 6565  
+7485 2248 894 4026 3994 6565 7478  
+7486 1571 4027 2430 7477 1578 4321  
+7487 4021 4022 4027 2651 4321 7474  
+7488 4028 893 4899 9174 1498 7466  
+7489 4028 1325 4029 7491 388 9181  
+7490 4029 988 4017 7467 388 7472  
+7491 4026 4029 1325 7489 7484 2162  
+7492 2882 4030 992 1507 1506 5242  
+7493 2364 4030 993 5242 2728 4226  
+7494 4033 4032 995 175 7497 1513  
+7495 995 302 4031 -1 10536 7382  
+7496 4684 4032 1922 1513 3348 8755  
+7497 2447 4033 995 7494 442 805  
+7498 4033 722 4685 8756 3350 805  
+7499 4118 4034 547 942 7660 1515  
+7500 3152 4034 996 1515 865 5781  
+7501 4118 4035 996 1331 1515 7661  
+7502 1153 905 4035 58 7661 1751  
+7503 3147 4036 32 194 1522 5771  
+7504 3875 4036 1000 5771 221 7192  
+7505 4037 634 4434 8268 8267 5773  
+7506 773 1000 4037 1523 219 221  
+7507 4041 4038 152 254 7513 1524  
+7508 4039 4038 1001 1524 850 7509  
+7509 4039 153 4038 254 7508 853  
+7510 3612 4039 1002 7512 1426 6688  
+7511 3608 4040 637 9329 10401 1526  
+7512 4039 4040 1002 1526 7510 850  
+7513 3774 4041 152 7507 1528 7007  
+7514 4977 4041 1003 7007 854 9330  
+7515 2133 4042 41 452 9052 1532  
+7516 1195 4042 1005 1532 789 1907  
+7517 4043 537 4796 8977 10539 6755  
+7518 5596 4043 662 10538 10540 4860  
+7519 2123 4044 853 1230 3747 3703  
+7520 4044 1010 5554 283 6867 3703  
+7521 740 1017 4045 1981 4705 7528  
+7522 1017 4172 4046 901 1981 7760  
+7523 4046 5597 4047 7525 357 1086  
+7524 545 4045 4046 1981 357 527  
+7525 4047 5597 5598 10543 3435 7523  
+7526 5599 781 3644 925 6750 10547  
+7527 1016 4048 243 1004 481 354  
+7528 4048 1017 740 7521 1557 354  
+7529 1339 4049 208 586 615 1558  
+7530 2225 4049 1018 1558 1559 3948  
+7531 68 4050 69 737 -1 874  
+7532 4052 4050 1020 7534 1563 736  
+7533 5579 67 3878 764 7199 1562  
+7534 4050 4051 1020 10508 7532 874  
+7535 4053 774 1527 7979 2563 7538  
+7536 5600 4052 559 4600 10548 736  
+7537 559 4053 2553 2563 4592 4600  
+7538 774 4053 4052 4600 10507 7535  
+7539 1167 4054 236 237 525 1566  
+7540 2357 4054 1022 1566 4212 931  
+7541 2230 4055 606 2567 3958 1050  
+7542 763 1023 4055 1262 1050 869  
+7543 4056 820 5116 400 4700 1164  
+7544 4058 4056 1025 4700 7547 340  
+7545 1975 4057 684 371 347 693  
+7546 1026 4057 550 693 5912 1573  
+7547 4057 4058 1025 7544 1572 1573  
+7548 2787 4058 1026 1573 5052 1432  
+7549 3787 4059 568 8848 1580 7032  
+7550 2130 4059 1029 7032 3762 3761  
+7551 4830 4060 836 2994 9044 9042  
+7552 1029 3787 4061 7031 7554 7032  
+7553 609 4060 4061 7554 10550 1581  
+7554 4061 4060 1029 9042 7552 7553  
+7555 2059 4062 1030 585 2884 3620  
+7556 1689 3028 5601 5535 10551 2887  
+7557 5182 4063 867 1258 1587 5029  
+7558 1681 4063 1032 5029 3432 2868  
+7559 4064 4066 4065 7564 2481 514  
+7560 617 1034 4064 1589 2481 605  
+7561 1486 658 4065 7562 7564 7994  
+7562 1541 4065 658 7561 8112 2590  
+7563 1487 4066 517 514 2483 2482  
+7564 1486 4065 4066 7559 2482 7561  
+7565 1232 4067 528 7709 1980 1556  
+7566 635 1041 4067 109 7761 389  
+7567 1045 4068 217 885 570 560  
+7568 4120 4068 1047 7570 7664 1833  
+7569 2850 4069 644 5363 81 1834  
+7570 4068 4069 1047 1834 7568 560  
+7571 2753 4070 38 1630 1632 207  
+7572 4070 1055 4262 7938 2380 207  
+7573 157 4071 158 818 -1 816  
+7574 816 1066 4071 818 816 1156  
+7575 3065 4072 587 650 1654 5609  
+7576 5422 1067 3342 6158 1657 1659  
+7577 5 4 4074 7579 1717 -1  
+7578 5422 4073 1066 1655 10201 10200  
+7579 4 1098 4074 1715 7577 1718  
+7580 227 226 4077 7583 1731 -1  
+7581 1098 3 4075 -1 451 1718  
+7582 1100 4730 4731 8847 8846 8845  
+7583 1586 4077 226 7580 8174 545  
+7584 1161 4078 283 947 1018 1739  
+7585 2758 4078 1109 1739 157 4997  
+7586 4079 630 4189 7795 1747 7432  
+7587 1113 888 4079 1300 1747 1046  
+7588 761 1113 4080 7589 4295 7176  
+7589 1189 4080 1113 7588 7794 129  
+7590 4081 509 4352 8109 2586 8227  
+7591 4084 4081 906 1336 1335 7596  
+7592 3714 4082 905 7436 1751 1828  
+7593 1116 5690 4083 9368 7595 10728  
+7594 1115 4082 4083 7595 2759 1333  
+7595 1116 4083 4082 7594 1828 7593  
+7596 4084 1115 4081 1137 7591 1333  
+7597 905 4084 4002 1335 58 7436  
+7598 3977 4085 911 1345 1344 7389  
+7599 4085 1117 4688 8763 8762 7389  
+7600 4596 4086 700 167 8583 8582  
+7601 4086 1676 3978 7390 7386 8582  
+7602 4087 513 2950 2679 5377 1724  
+7603 4088 4087 643 2678 533 7605  
+7604 4623 4088 1101 1041 8634 1771  
+7605 4087 4088 1125 1771 1724 7603  
+7606 3573 4089 648 1726 1727 6611  
+7607 4090 4089 1126 6611 7609 7608  
+7608 4089 4090 1103 1728 467 7607  
+7609 4091 4090 1126 7607 7610 597  
+7610 4096 4091 1126 7609 7623 6532  
+7611 4091 1130 4092 7612 1791 6532  
+7612 4093 4092 1130 7611 7614 105  
+7613 677 4092 3527 105 7641 1791  
+7614 4094 4093 1130 7612 10553 3265  
+7615 4093 594 4629 6522 8647 3265  
+7616 1130 3532 5602 3753 10553 7621  
+7617 4639 4095 1881 1745 3268 8667  
+7618 4628 4095 1880 8667 8645 8644  
+7619 594 4094 4095 1745 8644 3265  
+7620 1126 3573 4097 6610 7623 6611  
+7621 1130 4096 3532 7622 7616 6532  
+7622 3532 4096 4097 7623 1773 7621  
+7623 1126 4097 4096 7622 7610 7620  
+7624 2154 4098 291 1785 902 3805  
+7625 4099 4098 1019 3805 7626 131  
+7626 4099 1019 1434 632 118 7625  
+7627 1132 4099 646 9337 1786 131  
+7628 4101 646 5230 1787 5241 1786  
+7629 4586 4100 1133 7630 8564 3170  
+7630 4102 1133 4100 7629 122 7632  
+7631 1132 4102 292 122 128 126  
+7632 1133 4102 4101 126 5241 7630  
+7633 651 4103 892 7365 1310 440  
+7634 397 4103 1134 440 365 1789  
+7635 4106 106 1560 8141 2629 7640  
+7636 4105 4104 1135 7639 7637 3244  
+7637 4625 4105 1135 7636 8638 8636  
+7638 4105 1869 5034 897 9440 8636  
+7639 1135 4104 4106 7640 7642 7636  
+7640 106 4106 4104 7639 913 7635  
+7641 3527 4107 677 923 7613 1792  
+7642 1135 4106 4107 2629 8640 7639  
+7643 2220 4108 232 342 534 537  
+7644 3791 4108 1136 537 7039 701  
+7645 4110 735 4593 8576 995 1803  
+7646 1137 234 4109 -1 1794 6752  
+7647 4110 607 4215 7845 7844 3183  
+7648 4113 4112 577 3960 7651 1811  
+7649 2875 4111 1143 73 1719 5229  
+7650 3880 4112 1145 1811 401 7203  
+7651 4113 577 4127 7678 731 7648  
+7652 2744 4113 498 7832 1812 4971  
+7653 3890 4114 785 7218 7221 7222  
+7654 4114 1147 4177 7770 7768 7222  
+7655 1979 4115 750 1819 3461 822  
+7656 393 2706 5603 4897 10555 1820  
+7657 4117 526 4895 9166 10559 10556  
+7658 4115 394 4116 -1 1024 822  
+7659 5606 4117 622 6760 10560 4632  
+7660 4119 4118 547 7499 7662 1827  
+7661 4035 4118 1153 1827 7502 7501  
+7662 3120 4119 547 7660 1829 5718  
+7663 3715 4119 1154 5718 6890 6889  
+7664 2849 4120 1047 7568 910 5175  
+7665 3901 4120 1156 5175 7244 1570  
+7666 3172 4121 691 2681 5821 5819  
+7667 3153 4121 1159 5819 550 5783  
+7668 5607 4122 539 5815 10562 7960  
+7669 650 1159 4122 1840 7960 550  
+7670 3172 4123 1159 1840 5819 5818  
+7671 4123 3171 3170 552 5817 5818  
+7672 1162 4124 747 10206 6180 1740  
+7673 1109 1161 4124 819 7674 1739  
+7674 4124 4125 1109 157 7673 1740  
+7675 3389 4125 1162 1740 6251 4763  
+7676 2205 4126 692 3939 3 1849  
+7677 3791 4126 1164 6747 1795 7039  
+7678 4127 577 775 3960 773 7651  
+7679 3944 4127 638 3165 1853 7327  
+7680 1990 4128 641 1856 3482 1567  
+7681 1022 1167 4128 1856 1567 1566  
+7682 1654 4129 787 3422 2815 1096  
+7683 4130 4129 250 1096 -1 7685  
+7684 82 4131 83 1867 -1 793  
+7685 4129 4130 1171 1098 510 7683  
+7686 649 1173 4131 796 1077 1868  
+7687 4135 4132 973 849 7693 666  
+7688 4133 4132 1175 666 7689 1873  
+7689 4134 4133 1175 7688 7691 683  
+7690 1180 4138 4133 7698 683 7697  
+7691 4136 4134 1175 7689 7695 6705  
+7692 4134 974 3796 4694 7047 6705  
+7693 4649 4135 973 7687 -1 8687  
+7694 4135 1891 5526 10406 10405 8687  
+7695 5526 4136 1175 7691 10405 1871  
+7696 974 4136 3621 1871 9553 6705  
+7697 4139 4138 1180 7690 7700 7699  
+7698 4137 4133 4138 7690 1872 1879  
+7699 4138 4139 4140 4693 1881 7697  
+7700 3796 4139 1180 7697 7047 7044  
+7701 2603 1181 4139 4693 7044 9581  
+7702 4141 4140 1181 4693 685 7707  
+7703 4142 1176 4140 1881 7707 -1  
+7704 1181 5107 4143 4688 685 9581  
+7705 2601 144 4141 4690 7708 4661  
+7706 5108 4143 2600 4688 4687 9584  
+7707 4141 4142 4140 7703 7702 4690  
+7708 2601 4141 4143 685 9584 7705  
+7709 4067 4144 528 4439 7565 109  
+7710 1188 4144 1041 109 1895 161  
+7711 4146 4145 1042 1605 7713 7716  
+7712 2472 4145 1183 5236 4440 1884  
+7713 4146 1042 4397 8193 1890 7711  
+7714 4147 1185 2879 152 7715 1883  
+7715 1183 4147 2879 7714 4443 5236  
+7716 4145 4146 4147 1883 5236 7711  
+7717 1188 4148 1182 1885 161 1894  
+7718 4149 4148 1184 1894 7719 2703  
+7719 4149 1184 4150 7721 1887 7718  
+7720 4149 1599 4397 8194 8193 10565  
+7721 4151 4150 1184 7719 7723 134  
+7722 4475 4150 1191 134 8346 8345  
+7723 1188 4151 1184 7721 1894 1610  
+7724 4152 4151 534 1610 7725 1886  
+7725 5015 4152 534 7724 9405 4382  
+7726 4152 1589 4388 154 8177 4382  
+7727 295 4584 5609 8563 10567 -1  
+7728 4153 5311 5054 9982 9480 917  
+7729 4156 4154 4155 78 3859 7732  
+7730 2180 1200 4155 3859 10566 8035  
+7731 4156 1200 4310 8029 461 3859  
+7732 296 4154 4156 7729 2521 -1  
+7733 1283 4157 923 1370 1930 2077  
+7734 1210 4157 1208 2077 7735 1936  
+7735 4502 1210 1208 7734 8399 1937  
+7736 4158 1211 4504 8403 1941 8398  
+7737 4160 4159 935 1939 7739 1942  
+7738 4161 4159 1213 1942 7741 5736  
+7739 4162 4160 935 7737 7743 1141  
+7740 4160 1215 4210 7834 1943 1141  
+7741 4161 1213 4211 7837 7836 7738  
+7742 4161 3129 5334 5735 10028 1392  
+7743 4162 935 4728 8840 3538 7739  
+7744 1215 4162 2019 1946 8119 1141  
+7745 4165 4164 1221 7746 7748 1959  
+7746 4164 4163 1221 887 7745 1026  
+7747 4166 4164 1222 1959 7751 1961  
+7748 3550 4165 1221 7745 1958 6567  
+7749 5251 4165 895 6567 1960 9864  
+7750 249 4167 694 487 3427 478  
+7751 1222 100 4166 -1 7747 7161  
+7752 248 1226 4167 487 478 933  
+7753 4170 4169 696 4379 7756 1205  
+7754 1226 247 4168 -1 491 933  
+7755 3929 4169 840 1205 921 7298  
+7756 4374 4170 696 7753 8150 2642  
+7757 4170 1567 5582 10514 10513 2642  
+7758 4171 632 4456 8306 1031 2454  
+7759 5228 4171 981 2872 1485 9818  
+7760 1016 4172 1017 7522 354 1555  
+7761 4067 4172 635 1555 7566 1556  
+7762 3888 4173 1110 7765 7219 1095  
+7763 4175 4173 574 1095 7766 1988  
+7764 5025 4174 2455 7781 4407 9425  
+7765 1110 4173 4174 660 9425 7762  
+7766 4176 4175 574 7763 1990 2456  
+7767 4178 4175 1237 2456 7772 1989  
+7768 574 4114 4177 7654 1990 100  
+7769 4176 1473 5630 10609 10608 7771  
+7770 4177 1147 4456 8308 8306 7654  
+7771 1473 4176 4177 1990 7982 7769  
+7772 4179 4178 1237 7767 7774 91  
+7773 4178 1238 4180 7777 7776 91  
+7774 1528 4179 1237 7772 7975 2560  
+7775 580 3798 5610 7051 10569 519  
+7776 4178 4180 1236 1741 1989 7773  
+7777 4181 4180 1238 7773 7778 641  
+7778 4183 4181 1238 7777 7782 1744  
+7779 4181 1597 5611 10570 5881 7785  
+7780 3203 4182 1111 1993 2702 2242  
+7781 4182 2455 4174 7764 1743 2242  
+7782 4183 1238 5610 10568 7051 7778  
+7783 4184 4183 1239 7050 7784 1744  
+7784 4184 1239 4185 7786 1995 7783  
+7785 4181 4184 1597 7791 7779 1744  
+7786 4186 4185 1239 7784 7788 7787  
+7787 4188 4185 4186 7786 1994 7793  
+7788 2876 4186 1239 7786 5230 725  
+7789 647 4186 846 725 1858 1994  
+7790 4187 529 3797 7048 2701 1216  
+7791 4184 4187 1597 5883 7785 1995  
+7792 2776 4188 647 1994 1033 5032  
+7793 529 4185 4188 7787 5032 1216  
+7794 4189 1189 1113 7589 1747 7796  
+7795 630 1240 4189 1896 7586 1996  
+7796 4189 4190 1189 1454 7794 1896  
+7797 4191 4190 1240 1896 7798 1997  
+7798 3528 4191 1240 7797 1463 6524  
+7799 1892 4191 536 6524 3289 1998  
+7800 3641 4193 1254 6303 6743 2024  
+7801 4365 4192 1247 583 8136 8135  
+7802 4196 4193 1256 2024 7808 7807  
+7803 4198 4194 803 999 7811 2030  
+7804 3362 4194 1257 2030 790 6198  
+7805 4196 4195 1255 1418 7807 2033  
+7806 4980 4195 1258 2033 9336 9335  
+7807 4193 4196 1255 7805 2026 7802  
+7808 1264 4196 1256 7802 2029 2025  
+7809 1269 4197 737 7815 6307 2034  
+7810 4980 1259 2358 4215 4214 2015  
+7811 3625 4198 803 7803 2036 1414  
+7812 5229 4198 1261 1414 9820 9819  
+7813 3629 4199 629 6707 6721 2040  
+7814 5229 4199 1262 2040 2031 9820  
+7815 4197 4200 737 1889 7809 2027  
+7816 4196 4200 1258 2027 2033 2025  
+7817 201 200 4203 7822 7821 -1  
+7818 4009 4201 1271 7165 7450 7448  
+7819 4203 4202 4201 7165 7821 608  
+7820 5576 4202 199 608 -1 10503  
+7821 201 4203 4201 7819 10573 7817  
+7822 199 4203 200 7817 -1 608  
+7823 2782 4205 1038 1599 5044 5043  
+7824 1279 328 4204 -1 2261 1369  
+7825 4205 1282 4285 2081 2079 5043  
+7826 2834 4206 920 5122 5147 1493  
+7827 4207 4206 1085 9787 7828 6204  
+7828 4010 4207 1085 7827 10529 31  
+7829 4207 3365 5431 6203 10218 31  
+7830 986 4233 4490 7880 8375 1326  
+7831 5613 901 2825 5128 10574 10575  
+7832 4113 4209 498 4968 7652 602  
+7833 4370 4209 1166 602 8144 8143  
+7834 4357 4210 1215 7740 3540 1947  
+7835 1546 4852 5615 9083 10579 9084  
+7836 4161 4211 934 5727 1392 7741  
+7837 4210 4211 1213 7741 1943 832  
+7838 2403 4212 938 2601 4309 4305  
+7839 3125 4212 1290 4305 1753 5728  
+7840 346 4213 347 2114 -1 963  
+7841 2611 4213 1299 963 2113 1022  
+7842 3771 4214 1204 10340 656 6999  
+7843 4214 1307 5486 10328 10327 6999  
+7844 4110 4215 979 1629 753 7647  
+7845 4217 4215 607 7647 392 7848  
+7846 4217 4216 1321 4217 7848 443  
+7847 4218 4216 1322 443 7850 3321  
+7848 4217 1321 4215 1480 7845 7846  
+7849 4217 1839 4595 3185 8581 8579  
+7850 3176 4218 1322 7847 5828 5827  
+7851 1908 2535 5616 10580 4562 4564  
+7852 2226 4219 639 698 3950 3949  
+7853 1339 4219 1018 3949 1558 972  
+7854 1487 4220 723 2191 2195 2484  
+7855 2506 4220 1342 2484 2196 4504  
+7856 1598 4221 1185 1893 2210 1888  
+7857 4221 1351 4223 7860 7858 1888  
+7858 4223 1350 4221 1893 7857 2214  
+7859 3421 4222 1352 2213 2211 2044  
+7860 4224 4223 1351 7857 7862 3362  
+7861 4692 4223 1266 3362 2215 8770  
+7862 4224 1351 4396 8192 8191 7860  
+7863 4224 1929 4690 3364 8767 2212  
+7864 1705 4225 668 2221 2918 2222  
+7865 4226 4225 1356 2222 7867 7866  
+7866 4225 4226 1355 1185 2221 7865  
+7867 3924 4226 1356 7865 7288 621  
+7868 276 1357 4227 7869 2220 751  
+7869 1355 4227 1357 7868 1413 146  
+7870 4876 4229 1303 2241 9131 10583  
+7871 1358 276 4228 -1 2224 751  
+7872 5617 2206 4875 2119 3783 3911  
+7873 4013 4230 619 1492 7459 7458  
+7874 4231 4230 1366 7458 7875 2244  
+7875 4234 4231 1366 7874 10585 5879  
+7876 4231 1368 4235 732 7884 5879  
+7877 4232 1367 4233 7879 2243 1494  
+7878 619 4232 3366 2243 7455 1492  
+7879 5619 4233 1367 7877 10587 10586  
+7880 4490 4233 1709 10586 8376 7830  
+7881 5618 1366 3863 7461 2246 10585  
+7882 1368 4234 3202 7169 5882 5879  
+7883 4235 484 4488 8372 2245 10078  
+7884 4231 4235 1367 10587 2244 7876  
+7885 575 4356 5620 8117 7888 2593  
+7886 4239 4236 768 7887 7891 928  
+7887 768 4236 4237 10589 7889 7886  
+7888 4236 575 5620 7885 10589 9255  
+7889 768 4237 4238 7890 137 7887  
+7890 982 4238 4237 7889 7444 1061  
+7891 3872 4239 768 7886 272 7187  
+7892 2790 4239 845 7187 2250 5059  
+7893 1377 4242 4241 7898 2265 1511  
+7894 4240 1378 5437 10230 1238 7896  
+7895 858 4241 1379 7898 6043 2269  
+7896 1378 4240 4241 2265 2266 7894  
+7897 2364 4242 510 1511 4226 2264  
+7898 4241 4242 1379 2264 7895 7893  
+7899 4244 4243 858 2269 7901 2270  
+7900 3376 4243 1380 2270 6226 2267  
+7901 3288 4244 858 7899 1501 6051  
+7902 4244 1382 4245 7904 7903 6051  
+7903 4244 4245 1380 8019 2270 7902  
+7904 4246 4245 1382 7902 7905 1658  
+7905 3590 4246 1382 7904 6643 10591  
+7906 1069 4246 1384 5997 5290 1658  
+7907 3262 4247 1389 5286 10161 5998  
+7908 3588 4247 1070 5998 2306 6638  
+7909 489 4253 4251 7919 7915 7920  
+7910 3588 4248 1398 7912 6638 6640  
+7911 2904 4249 1273 1929 313 5287  
+7912 4251 1398 4248 7910 7915 2307  
+7913 4252 4250 1401 2062 7918 2313  
+7914 4250 1423 2902 5283 5282 10593  
+7915 489 4251 4248 7912 6289 7909  
+7916 1401 4249 4251 2307 7919 2062  
+7917 5622 4252 1274 2065 10592 2313  
+7918 4253 4252 1401 7913 7919 2312  
+7919 4251 4253 1401 7918 7916 7909  
+7920 4255 4253 489 7909 7923 2314  
+7921 4254 1275 4955 9286 9285 10594  
+7922 4255 4254 1402 7925 2314 7924  
+7923 3407 4255 489 7920 6287 6285  
+7924 4254 4255 1403 6285 10595 7922  
+7925 4254 4256 1402 2006 7922 2315  
+7926 2323 4256 1404 2315 352 2356  
+7927 533 2899 5624 5277 10597 2367  
+7928 4258 4257 1428 4199 7929 2366  
+7929 4259 4258 1428 7928 7931 4080  
+7930 2325 4258 1373 4080 2254 4149  
+7931 2348 4259 1428 7929 4195 2358  
+7932 4259 2291 4926 9228 9227 2358  
+7933 4257 4260 533 5273 10597 2256  
+7934 4261 4260 1429 2256 7935 2369  
+7935 2325 4261 1429 7934 4149 4121  
+7936 3717 4261 1371 9280 6894 6893  
+7937 4262 1435 1054 1266 2380 26  
+7938 871 4262 1055 7572 2400 2381  
+7939 1438 4263 871 2382 2386 2384  
+7940 5150 4263 1437 2384 9664 1779  
+7941 4265 4264 1438 7955 2387 7944  
+7942 4500 1439 3634 6731 6730 2392  
+7943 4266 4265 552 946 7946 7945  
+7944 4265 1439 4264 2392 7941 7945  
+7945 4265 4266 1439 6731 7944 7943  
+7946 2460 4266 552 7943 2390 4417  
+7947 4267 5628 4269 10605 7952 2801  
+7948 4268 4267 1449 7952 7949 3096  
+7949 5627 4268 1449 7948 10602 10603  
+7950 4268 1795 4550 3093 8495 8504  
+7951 4269 1648 4437 8274 10607 10605  
+7952 1449 4267 4269 7947 5258 7948  
+7953 5150 4270 1129 5319 1780 9664  
+7954 4271 4270 1437 9664 2414 1267  
+7955 4264 4271 1438 2414 7941 1665  
+7956 4271 1072 4499 8393 8392 1665  
+7957 4271 4272 1452 522 1267 2415  
+7958 4272 1453 5243 813 5322 2415  
+7959 2134 4273 1106 7963 3770 1732  
+7960 5607 650 4122 7669 7668 1733  
+7961 2135 4274 815 5376 3772 3771  
+7962 4275 4274 1106 3771 7963 1154  
+7963 4273 4275 1106 7962 7959 39  
+7964 4276 4275 1468 39 7965 2448  
+7965 4277 4276 1468 7964 7967 3543  
+7966 2950 4276 794 3543 2449 5379  
+7967 4277 1468 5607 10563 10562 7965  
+7968 4277 2022 2021 3546 1113 2446  
+7969 755 4278 514 1306 3944 240  
+7970 1471 4278 1470 240 2450 8  
+7971 2 4279 1098 2452 451 453  
+7972 1 1471 4279 516 453 2453  
+7973 4282 519 1738 2562 1536 7978  
+7974 4284 4280 1473 10609 7982 7981  
+7975 1528 1237 4281 7976 7977 7774  
+7976 5630 4281 1237 7975 10608 2564  
+7977 1528 4281 4282 7978 2561 7975  
+7978 519 4282 4281 7977 1977 7973  
+7979 774 4283 1527 2565 7535 726  
+7980 4283 1526 4338 8081 1991 726  
+7981 4280 4284 1472 2457 97 7974  
+7982 4177 4284 1473 7974 7771 640  
+7983 1201 1474 4285 7984 3220 2458  
+7984 4285 1474 1281 2459 2079 7983  
+7985 1475 4286 1478 2467 6892 2461  
+7986 2464 4286 1479 2461 4425 2469  
+7987 1482 4287 1202 4780 2474 2472  
+7988 2464 4287 1481 2472 2106 4425  
+7989 4289 4288 1202 2474 7991 2476  
+7990 3373 4288 1483 2476 6220 6219  
+7991 4289 1202 2647 4780 4779 7989  
+7992 4289 1476 1997 2477 3496 4778  
+7993 4290 1485 207 2189 2478 794  
+7994 658 1486 4290 794 7142 7561  
+7995 2829 4291 517 2483 5143 5133  
+7996 4292 4291 1343 5133 7997 2197  
+7997 3551 4292 1343 7996 1453 6569  
+7998 1342 1487 4292 2197 6569 2484  
+7999 653 4293 927 791 6678 1378  
+8000 1488 4293 1489 1378 2488 205  
+8001 1489 1490 4294 8002 2376 2487  
+8002 4295 4294 1490 8001 2490 8004  
+8003 4297 4295 916 2981 8007 2493  
+8004 4294 4295 1492 2493 754 8002  
+8005 2368 4296 1433 2377 2374 2494  
+8006 4297 4296 1492 9342 2493 8008  
+8007 4297 916 4511 8417 8010 8003  
+8008 4296 4297 1493 8010 1356 8006  
+8009 4299 4298 476 1422 8011 2496  
+8010 4511 1493 4297 8008 8007 2495  
+8011 4299 476 4691 8768 2499 8009  
+8012 4299 1495 4300 8014 8013 1609  
+8013 4299 4300 1493 1356 2496 8012  
+8014 1501 4300 1495 8012 2500 1608  
+8015 1494 4510 4302 8414 8018 8415  
+8016 1932 4301 1496 8017 4451 3370  
+8017 1496 4301 4302 8018 8406 8016  
+8018 1494 4302 4301 8017 998 8015  
+8019 4245 4303 1380 6226 7903 1240  
+8020 3743 4303 1069 1240 2505 5269  
+8021 4307 4304 1043 7027 8027 8025  
+8022 4305 4304 1502 8025 8024 8023  
+8023 4304 4305 1501 2512 2511 8022  
+8024 4305 1502 4359 8123 2514 8022  
+8025 1502 4304 4307 8021 2513 8022  
+8026 1503 4482 5631 232 2915 8359  
+8027 4307 1043 5572 10495 10494 8021  
+8028 1503 4306 4307 2513 2795 2915  
+8029 4311 4310 1200 7731 8033 2619  
+8030 5338 4308 1505 1116 2519 5766  
+8031 1506 297 4309 -1 136 8040  
+8032 674 1506 4310 461 2619 922  
+8033 4312 4311 1200 8029 8035 133  
+8034 4311 1555 5632 10613 10612 133  
+8035 2180 4312 1200 8033 7730 3858  
+8036 4312 1554 4362 2616 8130 3858  
+8037 4317 4313 674 922 8044 2522  
+8038 4314 4313 1507 2522 2524 649  
+8039 4315 4314 4316 2524 8041 8042  
+8040 1506 4314 297 8042 8031 649  
+8041 4315 4316 298 8043 -1 8039  
+8042 297 4314 4315 8039 -1 8040  
+8043 1836 298 4316 8041 2523 16  
+8044 4320 4317 674 8037 8050 2525  
+8045 4317 1508 4318 696 8047 2525  
+8046 690 5022 4319 9418 8049 9419  
+8047 4317 4318 1507 8048 2522 8045  
+8048 1507 4318 4319 8049 3178 8047  
+8049 690 4319 4318 8048 5265 8046  
+8050 5632 4320 674 8044 10612 10624  
+8051 5633 554 5238 9837 5262 2914  
+8052 3635 4322 130 671 10411 1634  
+8053 5344 4321 1511 2531 10045 10044  
+8054 4323 1512 3478 6428 8055 2126  
+8055 678 4323 3478 8054 7077 6427  
+8056 1511 4322 4323 2126 6849 2531  
+8057 4326 1518 113 920 8065 961  
+8058 1518 114 4324 -1 920 2553  
+8059 4327 4325 1519 8061 8062 2549  
+8060 4329 4328 112 -1 8064 2544  
+8061 1519 4325 4326 961 8066 8059  
+8062 2229 4327 1519 8059 10616 3957  
+8063 4327 1520 4330 8068 8067 3957  
+8064 2228 4329 112 8060 9160 10617  
+8065 4326 113 4328 -1 2544 8057  
+8066 4326 4329 1519 954 8061 2544  
+8067 4327 4330 718 2554 2549 8063  
+8068 5330 4330 1520 8063 10020 1218  
+8069 5213 4331 1521 2057 2555 9790  
+8070 4331 1523 4334 8075 8073 9790  
+8071 4325 4332 1518 907 961 915  
+8072 4334 4332 718 915 8073 2552  
+8073 4331 4334 718 8072 2554 8070  
+8074 4333 5027 5635 9428 1217 795  
+8075 5635 4334 1523 8070 10619 10618  
+8076 313 4335 744 8849 214 210  
+8077 4336 4335 312 210 -1 8079  
+8078 2876 4337 777 7201 1992 5231  
+8079 4335 4336 1524 8842 398 8077  
+8080 4338 4337 580 5231 8082 8081  
+8081 4337 4338 1526 7980 1079 8080  
+8082 4179 4338 580 8080 10569 2560  
+8083 3953 4339 869 7020 7344 312  
+8084 4340 4339 636 7343 8085 1261  
+8085 2443 4340 636 8084 1053 4384  
+8086 4341 4340 530 4384 8087 2566  
+8087 1531 4341 530 8086 8099 2568  
+8088 3782 4341 1530 2568 7023 7022  
+8089 4347 4342 1531 9056 1001 2570  
+8090 1532 4844 4343 2573 1455 9067  
+8091 2161 966 4346 3821 103 1243  
+8092 485 4342 4343 1455 2584 1091  
+8093 4348 966 2396 4290 8102 8101  
+8094 4344 4348 4345 3300 3299 8101  
+8095 5636 1897 2813 8706 5104 10621  
+8096 4345 5636 5637 10620 2571 10621  
+8097 4343 4346 4344 3821 2584 3819  
+8098 4846 4346 2160 3819 9071 103  
+8099 5016 1531 530 8087 9408 1001  
+8100 4347 1535 4351 8108 8107 9407  
+8101 966 4348 4344 8094 3821 8093  
+8102 1897 4348 2396 8093 8705 3300  
+8103 4840 4349 1530 7023 9059 3809  
+8104 1536 4349 1354 3809 5098 2576  
+8105 1536 4350 1533 798 2576 2574  
+8106 2230 4350 1534 2574 2219 3958  
+8107 4347 4351 1532 9067 2570 8100  
+8108 3382 4351 1535 8100 1052 6238  
+8109 2104 4352 509 7590 3710 3709  
+8110 3853 4352 1540 3709 936 7151  
+8111 921 4353 204 596 598 616  
+8112 658 4353 1541 616 7562 2591  
+8113 4354 4356 4355 8118 8116 2597  
+8114 1543 4613 4614 8614 8617 8615  
+8115 2310 4355 1544 8118 1928 4119  
+8116 1543 4354 4355 8113 4119 8617  
+8117 4356 1542 5620 10588 7885 2597  
+8118 1544 4355 4356 8113 9674 8115  
+8119 4993 1215 2019 7744 9362 3540  
+8120 472 4417 4853 8233 2600 8234  
+8121 4280 4358 519 2562 1977 97  
+8122 5252 4358 1472 97 9865 1537  
+8123 4306 4359 1502 8024 2513 1421  
+8124 4361 4359 1021 1421 8127 2614  
+8125 1556 4360 682 1918 2620 2615  
+8126 4361 4360 1553 8134 2614 8128  
+8127 4362 4361 1021 8124 8132 2616  
+8128 4360 4361 1554 2616 1918 8126  
+8129 1021 5631 4363 10610 8132 10611  
+8130 4312 4362 1555 8131 133 8036  
+8131 1555 4362 4363 8132 1565 8130  
+8132 1021 4363 4362 8131 8127 8129  
+8133 4305 4364 524 2375 1564 912  
+8134 4360 4364 1553 912 8126 2615  
+8135 4192 4365 212 2622 -1 7801  
+8136 3733 4365 1247 7801 6925 2011  
+8137 2944 4367 558 6245 4497 1614  
+8138 1558 214 4366 -1 10626 3448  
+8139 5640 686 2117 3736 3735 10629  
+8140 2773 4369 105 911 -1 5026  
+8141 1560 106 4368 -1 2628 7635  
+8142 1103 1560 4369 2628 5028 1728  
+8143 4209 4370 1287 8146 2091 7833  
+8144 4370 1166 3944 7327 7326 7833  
+8145 1851 4371 593 6517 3208 2090  
+8146 4370 4371 1287 9700 8143 1854  
+8147 4373 1564 4372 8148 2636 2641  
+8148 1564 361 4372 -1 8147 325  
+8149 805 4373 1566 1006 7250 2640  
+8150 2440 4374 696 7756 2644 4378  
+8151 4377 4374 1568 4378 10631 8156  
+8152 4377 4375 1567 10514 8156 2643  
+8153 4376 4375 1569 2643 8154 1182  
+8154 4379 4376 1569 8153 2647 8161  
+8155 4376 1574 4380 2657 8163 8161  
+8156 4374 4377 1567 8152 2642 8151  
+8157 1568 3156 5641 1497 10631 2645  
+8158 4018 4378 540 930 2648 7469  
+8159 4379 4378 1570 7469 8160 2647  
+8160 5642 4379 1570 8159 10632 1312  
+8161 4376 4379 1574 9387 8155 8154  
+8162 3930 4380 480 1577 3453 285  
+8163 4376 4380 841 10515 1182 8155  
+8164 4383 1577 860 4294 8170 1244  
+8165 4382 4381 1577 1000 1244 814  
+8166 2720 4382 1578 8168 2665 4923  
+8167 860 2161 5643 10634 8170 3820  
+8168 1578 4382 4383 1244 8169 8166  
+8169 1578 4383 4384 10635 2664 8168  
+8170 4383 860 5643 8167 10635 8164  
+8171 2021 4385 794 435 1113 3542  
+8172 1584 4385 1100 8845 2677 1720  
+8173 319 1587 4387 8175 1678 2683  
+8174 1586 226 4386 -1 43 7583  
+8175 1078 4387 1587 8173 1738 2682  
+8176 4388 980 5194 9752 9751 1539  
+8177 4152 4388 1191 1900 1886 7726  
+8178 4390 4389 1589 154 8180 2687  
+8179 4389 1590 4678 8743 2530 2687  
+8180 4390 1589 5015 4382 9406 8178  
+8181 4390 626 2938 2688 5355 4381  
+8182 5195 1510 2788 10075 5054 472  
+8183 4679 4391 1591 9754 2691 8744  
+8184 4395 1596 4394 845 8188 2697  
+8185 1594 5151 4393 7024 1276 9667  
+8186 471 4393 3783 7024 -1 2694  
+8187 1593 4392 4393 1276 9430 840  
+8188 135 4395 4394 8184 -1 1298  
+8189 5152 1596 2690 10638 9668 2698  
+8190 2163 2689 5645 3825 10639 4864  
+8191 4224 4396 1186 5556 2212 7862  
+8192 1351 1598 4396 2704 7862 1888  
+8193 4149 4397 1042 7713 2703 7720  
+8194 3039 4397 1599 7720 5557 2706  
+8195 1602 4578 4579 8551 8553 1441  
+8196 5663 5519 704 3141 10674 2335  
+8197 1606 548 5647 2719 10643 9352  
+8198 825 1607 4399 2720 10779 2721  
+8199 1609 1611 5648 1322 10645 2725  
+8200 3292 4400 1610 2726 6058 4227  
+8201 3589 4401 475 6036 6642 2732  
+8202 1612 1613 4401 2507 2732 2731  
+8203 1009 1616 4403 2738 2735 2740  
+8204 4404 4402 1614 8206 8207 1541  
+8205 4405 1617 1615 8211 8209 2742  
+8206 1614 4402 4403 2735 8210 8204  
+8207 4404 1614 5156 2736 9677 8204  
+8208 4404 1499 5411 10178 2734 4907  
+8209 4405 1615 4407 8214 8213 8205  
+8210 1614 4403 4405 2742 2736 8206  
+8211 1615 1617 4406 10647 1140 8205  
+8212 1617 548 5649 2741 10647 2739  
+8213 4405 4407 899 2100 2737 8209  
+8214 3723 4407 1615 8209 1140 6906  
+8215 1618 4412 4410 2743 8220 8223  
+8216 4409 4408 1619 8219 8217 1321  
+8217 2806 4409 1619 8216 2746 5091  
+8218 4409 1620 2711 2508 4905 5091  
+8219 1619 4408 4410 8220 8221 8216  
+8220 1618 4410 4408 8219 1319 8215  
+8221 1619 4410 4411 8222 2745 8219  
+8222 1622 4411 4410 8221 2743 2744  
+8223 3723 4412 1618 8215 6906 6905  
+8224 4412 712 4989 9354 2751 6905  
+8225 4857 807 2174 2101 3847 949  
+8226 4990 4413 1623 9094 2754 9355  
+8227 4081 4414 509 5372 7590 1137  
+8228 1115 1625 4414 2756 1137 2759  
+8229 4413 4415 807 3849 949 2758  
+8230 4083 4415 1625 2758 2759 2757  
+8231 2167 4416 1294 1686 9087 3832  
+8232 4417 4416 1627 3832 8233 1805  
+8233 4853 4417 1627 8232 9086 8120  
+8234 2819 4417 472 8120 1684 5117  
+8235 2378 4418 1628 2104 2766 2765  
+8236 2170 4418 1630 2765 3838 3836  
+8237 3329 4419 1635 8249 6133 6132  
+8238 4420 4419 809 6132 8239 2778  
+8239 3324 4420 809 8238 2780 6123  
+8240 4421 4420 1637 6123 8242 8241  
+8241 4420 4421 1636 8245 2778 8240  
+8242 4421 1637 4422 2781 8244 8240  
+8243 3263 4422 1391 9767 6000 5975  
+8244 4421 4422 1638 5975 1503 8242  
+8245 4421 4423 1636 2777 8241 2286  
+8246 4426 4423 1388 2286 8251 2786  
+8247 3215 4424 1397 6857 5904 4300  
+8248 3725 5650 1639 1139 6909 2785  
+8249 4425 1635 4419 8237 2776 6911  
+8250 1640 4424 4425 10649 2779 2787  
+8251 4428 4426 1388 8246 8255 2788  
+8252 3698 4426 1641 2788 2305 6858  
+8253 5651 4427 1386 2287 10650 10183  
+8254 5366 4427 990 10182 10089 10088  
+8255 4430 4428 1388 8251 10653 6002  
+8256 4429 4428 1642 6002 8257 2789  
+8257 4429 1642 5393 10143 10142 8256  
+8258 1641 4429 4427 2287 10088 2789  
+8259 1388 4421 5652 1503 10653 2286  
+8260 1642 4430 3264 2790 6073 6002  
+8261 4431 1552 4691 2499 3369 7025  
+8262 1928 4431 1268 3369 3361 2612  
+8263 2792 4432 949 2792 5063 2516  
+8264 4432 1644 5572 10494 2515 2708  
+8265 1647 4433 527 5245 5259 2638  
+8266 4434 4433 1565 2638 8267 1070  
+8267 4037 4434 1565 8266 219 7505  
+8268 4434 634 5329 10018 5704 7505  
+8269 3877 4435 683 2803 7197 2639  
+8270 1565 1647 4435 2407 2639 2638  
+8271 3685 4436 1448 10604 2404 6832  
+8272 1649 4436 811 6832 2406 2805  
+8273 4437 1647 5629 610 10607 2407  
+8274 1649 4437 1648 7951 2805 2804  
+8275 2458 4438 811 2406 4414 2249  
+8276 5173 4438 1369 2249 2248 9710  
+8277 4437 4439 683 7197 2803 2804  
+8278 5173 4439 1649 2804 9710 4994  
+8279 881 46 4441 8281 563 571  
+8280 1650 35 4440 -1 7195 520  
+8281 45 4441 46 8279 -1 1285  
+8282 4443 44 4449 2851 8295 -1  
+8283 4442 1667 4444 2850 686 2840  
+8284 1667 4449 4450 228 2850 8295  
+8285 4442 45 4443 -1 2840 2838  
+8286 4446 4444 824 8297 8289 1171  
+8287 4442 4445 1666 2843 2838 2839  
+8288 4693 1668 1671 721 8773 2845  
+8289 2092 4446 824 8286 8294 3685  
+8290 4446 1669 4453 8303 8302 3685  
+8291 4448 4447 1196 4702 8293 3686  
+8292 4451 4449 1672 2851 2841 228  
+8293 4448 1196 4797 8978 3684 8291  
+8294 824 4448 2092 1910 8289 3686  
+8295 4443 4449 1667 8284 2840 8282  
+8296 4447 824 4450 8297 8299 3686  
+8297 4444 4450 824 8296 8286 2850  
+8298 2607 4451 43 2841 700 201  
+8299 4450 4451 4447 201 8296 228  
+8300 1934 4452 515 2503 3373 2849  
+8301 4453 4452 1671 8773 8302 2848  
+8302 4446 4453 1671 8301 721 8290  
+8303 2379 4453 1669 8290 9358 2852  
+8304 4774 1673 1670 2237 8933 2853  
+8305 1675 5712 5505 2857 10363 10364  
+8306 4177 4456 632 7758 640 7770  
+8307 4455 5653 4598 10654 8584 10655  
+8308 4457 4456 1147 7770 8309 2873  
+8309 3890 4457 1147 8308 7222 7220  
+8310 192 1683 4457 2873 7212 1816  
+8311 3899 4458 802 8313 172 7240  
+8312 2853 4458 1024 7240 1571 5185  
+8313 4458 4459 802 7247 8311 1129  
+8314 2847 4459 1684 1129 2876 5165  
+8315 4461 4460 1685 2875 8317 2877  
+8316 4460 1686 5654 10656 6852 2877  
+8317 2847 4461 1685 8315 5165 5173  
+8318 560 5143 4461 9651 5173 2878  
+8319 4463 4462 1687 168 2879 4832  
+8320 4465 525 2196 3891 2882 8326  
+8321 3695 5654 1687 10657 2881 6852  
+8322 525 4463 2673 1838 8928 4832  
+8323 5655 4464 1686 10656 10658 4826  
+8324 5140 4464 1158 4826 9644 4833  
+8325 1688 4465 2211 2882 3923 123  
+8326 525 4465 4462 123 4832 8320  
+8327 3177 4466 1688 2880 5830 1638  
+8328 1687 4466 3178 1638 2881 168  
+8329 5656 576 1849 3204 10660 153  
+8330 1203 1846 4468 8331 3196 1758  
+8331 4605 4468 1846 8330 8599 3200  
+8332 495 4467 4468 3196 3200 1043  
+8333 1692 4469 1691 2204 2888 70  
+8334 4622 4469 1693 1040 8633 8632  
+8335 3786 4470 1692 70 2891 7029  
+8336 4722 4470 1346 7029 2203 8829  
+8337 1695 5286 4472 9932 2897 9933  
+8338 4474 4471 1696 8340 8343 7345  
+8339 1690 5280 4473 9920 2898 9921  
+8340 1696 4471 4472 2897 8342 8338  
+8341 2620 4473 502 9920 2175 4728  
+8342 1696 4472 4473 2898 4728 8340  
+8343 4474 1696 2628 4744 4743 8338  
+8344 655 4474 3954 2886 1862 7345  
+8345 4150 4475 492 2707 1901 7722  
+8346 1191 1699 4475 1759 7722 1900  
+8347 4477 4476 1699 1759 8349 2905  
+8348 2795 4476 1700 2905 2907 5067  
+8349 2788 4477 1699 8347 2904 2529  
+8350 4478 4477 1119 10074 8352 8351  
+8351 4477 4478 1700 5554 2905 8350  
+8352 4479 4478 1119 8350 8354 8353  
+8353 4478 4479 1701 8357 2906 8352  
+8354 3200 4479 1119 8352 2910 5876  
+8355 3038 4480 1645 5918 2797 5555  
+8356 4481 4480 1701 5555 8357 2912  
+8357 4479 4481 1701 8356 8353 2908  
+8358 4481 1702 5238 9838 9837 2908  
+8359 5368 4482 1503 8026 10092 2909  
+8360 4483 4482 1703 2909 8361 2913  
+8361 4481 4483 1703 8360 2912 2526  
+8362 5638 4483 554 2526 2914 2618  
+8363 3352 4484 601 882 6177 151  
+8364 1356 4484 831 151 7288 144  
+8365 4485 1705 4487 2918 8370 1415  
+8366 4486 4485 1706 2916 8367 1019  
+8367 4486 1706 4824 9033 2917 8366  
+8368 4486 1708 3357 1187 6187 6193  
+8369 2363 4487 668 2918 4225 2920  
+8370 4485 4487 1707 2920 2916 8365  
+8371 4488 1709 5619 10586 2245 8373  
+8372 5031 4488 484 7883 2924 9435  
+8373 4488 4489 1709 8376 8371 606  
+8374 3739 4489 1710 606 6937 6936  
+8375 986 4490 4208 2927 10217 7830  
+8376 1709 4489 4490 2925 7880 8373  
+8377 2781 4491 900 9432 2926 5036  
+8378 3739 4491 1711 5036 2929 6937  
+8379 4496 4492 1718 1489 2943 8387  
+8380 2896 4492 1719 8387 2945 2063  
+8381 1718 1721 4494 8383 111 1488  
+8382 4513 4493 1720 2947 8421 8420  
+8383 1745 4494 1721 8381 2949 817  
+8384 3367 4495 926 2950 2273 6208  
+8385 4495 1381 5436 10228 2272 6208  
+8386 2894 4496 625 2951 5266 2944  
+8387 4496 1719 4492 8380 8379 2944  
+8388 2897 4497 983 14 2371 5271  
+8389 1430 1723 4497 2948 5271 2952  
+8390 3717 4498 1723 2251 2952 2954  
+8391 2790 4498 1724 2954 2370 5058  
+8392 4271 4499 1453 1666 2415 7956  
+8393 4500 4499 1072 7956 8394 2416  
+8394 4500 1072 4264 1665 2392 8393  
+8395 4501 4500 1441 6730 8396 2389  
+8396 3633 4501 1441 8395 6728 2958  
+8397 2178 4501 1727 2958 2961 3855  
+8398 4158 4502 1211 2965 7736 1937  
+8399 3378 4502 1208 7735 6229 1938  
+8400 4504 4503 1212 1940 8402 2967  
+8401 4503 1730 4505 2966 8405 2967  
+8402 1212 5334 4504 1941 8400 10028  
+8403 1211 1730 4504 2967 7736 493  
+8404 2463 4505 1209 2966 4423 2968  
+8405 4503 4505 1731 2968 1948 8401  
+8406 5657 1496 4302 8017 10662 2978  
+8407 4507 4506 950 8412 8408 2970  
+8408 4507 950 4508 8411 2972 8407  
+8409 3420 4507 1733 2972 321 6313  
+8410 4508 1734 1733 8983 2972 6191  
+8411 4509 4508 950 8408 10663 2976  
+8412 950 4506 5657 2978 10663 8407  
+8413 3356 4509 1736 2498 6186 6185  
+8414 4302 4510 1736 10213 10662 8015  
+8415 4511 4510 1494 8015 8416 2980  
+8416 4511 1494 4298 998 2495 8415  
+8417 5120 4511 916 8007 9605 9604  
+8418 1114 4512 1739 2988 2865 2984  
+8419 2469 4512 1740 2984 2989 4433  
+8420 4493 4513 374 3002 -1 8382  
+8421 1720 1746 4513 1213 8382 2946  
+8422 1745 1747 4514 8423 2998 2996  
+8423 1748 4514 1747 8422 2997 3003  
+8424 3633 4515 1727 3853 2958 706  
+8425 486 1749 4515 2960 706 3004  
+8426 1763 4516 1074 3012 3089 3014  
+8427 4516 1754 4517 8433 2429 3014  
+8428 1754 4522 4519 2424 8433 8438  
+8429 4518 4517 1755 8432 8430 2426  
+8430 3036 4518 1755 8429 5551 5550  
+8431 1780 4560 4518 3017 5550 10671  
+8432 1755 4517 4519 8433 3016 8429  
+8433 1754 4519 4517 8432 8427 8428  
+8434 1459 4536 4521 3018 3069 8466  
+8435 1756 3023 5658 5525 10665 2431  
+8436 3397 4521 1781 3018 6268 6265  
+8437 1756 4520 4521 3069 6267 10665  
+8438 1754 1763 4522 8439 8428 3014  
+8439 4522 1763 4524 3033 8443 8438  
+8440 4523 1764 5662 3035 8517 2421  
+8441 3802 4523 1765 8517 3037 7059  
+8442 4526 4524 1461 8520 8446 3048  
+8443 4522 4524 1771 3048 1270 8439  
+8444 1781 4525 874 2299 3068 3049  
+8445 4526 4525 1771 8467 3048 8447  
+8446 4534 4526 1461 8442 8462 2710  
+8447 4525 4526 1772 2710 2434 8445  
+8448 4528 4527 1772 2434 8450 3051  
+8449 4531 4527 1773 3051 8456 2428  
+8450 4528 1772 4534 2710 8463 8448  
+8451 4529 4528 1462 6635 8455 2297  
+8452 1462 3585 5659 10666 8455 6633  
+8453 4529 1774 5371 3053 10099 8454  
+8454 1774 4529 4530 10667 6625 8453  
+8455 5659 4529 1462 8451 8452 10667  
+8456 3237 4531 1773 8449 3055 5949  
+8457 4532 4531 1775 5949 3071 3070  
+8458 5660 1775 3298 6070 5939 3071  
+8459 4532 1782 4537 8469 8468 8472  
+8460 5278 1776 3013 5943 9917 9916  
+8461 1783 4538 4539 8470 8473 8471  
+8462 1969 4534 1461 8446 3050 3127  
+8463 4528 4534 1778 3127 3063 8450  
+8464 2100 4535 1601 3441 3064 3702  
+8465 3586 4535 1779 3702 1672 6636  
+8466 4522 4536 1459 8434 2424 1270  
+8467 4525 4536 1771 1270 8445 3049  
+8468 4532 4537 874 3068 3070 8459  
+8469 3397 4537 1782 8459 2425 6268  
+8470 4539 4538 1782 2425 8472 8461  
+8471 3034 4538 1783 8461 1280 5544  
+8472 4532 4539 1782 8470 8459 3072  
+8473 1783 4539 4533 3072 9915 8461  
+8474 1791 4540 1464 2395 3088 3081  
+8475 1787 1788 4540 2441 3081 3080  
+8476 1789 4541 1465 3007 2440 3083  
+8477 1463 4541 1788 8478 3080 3082  
+8478 4541 4542 1788 2441 8477 3083  
+8479 3169 4542 1789 3083 5814 3154  
+8480 2475 4543 1789 5814 2440 4445  
+8481 1819 4543 1790 4445 8487 3144  
+8482 4545 4544 1442 3084 8484 3090  
+8483 4546 4544 1792 3090 821 3145  
+8484 4545 1442 4552 3095 8496 8482  
+8485 4545 1793 4548 8491 8490 8496  
+8486 1792 4553 4547 3091 821 8500  
+8487 1790 4546 1819 8489 8481 3145  
+8488 4547 1814 4571 3133 8537 3091  
+8489 1819 4546 4547 821 3087 8487  
+8490 4545 4548 1792 8500 3090 8485  
+8491 4549 4548 1793 8485 8492 2398  
+8492 4550 4549 1793 8491 8494 3093  
+8493 4549 1795 4554 8503 8502 3093  
+8494 4551 4550 1793 8492 8499 3094  
+8495 4550 703 4268 3096 7950 3094  
+8496 1793 4545 4552 8484 8499 8485  
+8497 4551 1794 3686 4421 6833 8498  
+8498 1794 4551 4552 8499 3124 8497  
+8499 4552 4551 1793 8494 8496 8498  
+8500 1792 4548 4553 8501 8486 8490  
+8501 1443 4553 4548 8500 2398 2394  
+8502 4549 4554 1443 8530 2398 8493  
+8503 4555 4554 1795 8493 8504 2409  
+8504 4268 4555 1795 8503 7950 3104  
+8505 4556 4555 1799 3104 8506 2399  
+8506 4556 1799 4557 8508 6951 8505  
+8507 4556 1444 4558 8511 8510 6951  
+8508 2891 4557 1799 8506 3097 5260  
+8509 1450 3746 4557 3105 5260 3116  
+8510 4556 4558 1798 8531 2399 8507  
+8511 1804 4558 1444 8507 3114 3108  
+8512 3746 4559 1444 3114 3105 6950  
+8513 3094 4559 1805 6950 5666 113  
+8514 5122 5661 1780 10671 9608 3067  
+8515 873 1807 4560 3017 4983 3121  
+8516 873 1765 4561 10673 3121 7060  
+8517 1765 4523 5662 8440 10673 8441  
+8518 2462 4562 1440 6726 2391 2405  
+8519 3718 4562 1794 2405 3124 6895  
+8520 4524 4563 1461 2435 8442 3033  
+8521 1791 4563 1763 3033 3089 2437  
+8522 4566 4564 1015 10120 8526 5954  
+8523 4565 4564 1808 5954 8524 3129  
+8524 3582 4565 1808 8523 3138 6628  
+8525 4565 1816 5439 10234 10233 6628  
+8526 4566 1015 5374 10105 10104 8522  
+8527 1808 4566 3240 10100 6629 5954  
+8528 2537 4567 1800 3107 4571 4568  
+8529 4569 4567 1076 4568 8533 8532  
+8530 4554 4568 1443 8538 8502 3103  
+8531 4568 1798 4558 8510 3102 3103  
+8532 4567 4569 1812 8534 3107 8529  
+8533 2486 4569 1076 8529 3132 4467  
+8534 4569 4570 1812 8539 8532 3130  
+8535 4571 4570 1813 3130 8536 3133  
+8536 2099 4571 1813 8535 3113 3146  
+8537 4547 4571 1500 3146 3134 8488  
+8538 4568 4572 1443 2394 8530 3131  
+8539 4570 4572 1812 3131 8534 2397  
+8540 4574 4573 1816 10234 8545 3139  
+8541 4581 4573 1817 3139 8556 1553  
+8542 1816 3582 4575 6627 8545 6628  
+8543 1817 4574 3584 3140 10390 3139  
+8544 3584 4575 1393 6627 6631 3140  
+8545 1816 4575 4574 3140 8540 8542  
+8546 2680 4576 1500 3134 3148 3700  
+8547 4577 4576 1820 3700 8549 8548  
+8548 4576 4577 1819 2711 3087 8547  
+8549 4577 1820 4582 8558 3147 8547  
+8550 2680 4578 1820 8558 3700 4847  
+8551 4579 4578 1821 4847 8552 8195  
+8552 4579 1821 4580 8554 4473 8551  
+8553 1602 4579 4398 2510 2433 8195  
+8554 2488 4580 1821 8552 4471 3151  
+8555 704 4580 2489 3151 10674 4473  
+8556 4581 1817 5519 10391 2335 8541  
+8557 5687 1823 4970 9316 10723 10722  
+8558 4578 4582 1820 8549 8550 1441  
+8559 1602 1826 4582 3147 1441 3159  
+8560 1996 4583 795 6217 3494 3493  
+8561 2645 4583 1728 3493 4777 3161  
+8562 4584 4585 1831 1788 8563 786  
+8563 5609 4584 1831 8562 1917 7727  
+8564 1133 3571 4586 8565 7629 3171  
+8565 4585 4586 3571 8564 1788 6607  
+8566 4587 839 5297 9954 1202 7294  
+8567 687 1833 4587 412 5580 544  
+8568 4590 685 4893 9162 801 7145  
+8569 1834 161 4588 -1 344 4881  
+8570 5021 4589 1836 16 9417 9416  
+8571 4592 4590 557 3959 8575 8574  
+8572 735 93 4591 8573 8576 883  
+8573 92 4591 93 8572 -1 994  
+8574 4590 4592 1837 8577 13 8571  
+8575 2381 4592 557 8571 4266 3184  
+8576 4591 4593 735 7645 8572 3181  
+8577 4592 4593 1837 3181 8574 3180  
+8578 2381 4594 1838 2152 3184 3182  
+8579 4217 4594 1839 3182 7849 392  
+8580 4595 507 5206 9775 5095 2577  
+8581 4217 4595 1322 3876 443 7849  
+8582 4086 4596 1676 8586 7601 7600  
+8583 4596 700 4602 8594 8593 7600  
+8584 4455 4598 305 336 -1 8307  
+8585 1842 306 4597 -1 1042 3190  
+8586 4596 4598 1676 10654 8582 722  
+8587 4599 1203 5656 10661 10660 1924  
+8588 4600 4599 759 3203 8589 1923  
+8589 1841 4600 759 8588 3188 3189  
+8590 4596 4600 1842 3189 722 3193  
+8591 4602 4601 1844 2858 8593 3194  
+8592 1846 4601 1845 3194 3197 1758  
+8593 4596 4602 1844 8591 3193 8583  
+8594 4606 4602 700 8583 8602 8601  
+8595 4603 1845 4606 8601 3195 3197  
+8596 4604 4603 1118 316 8597 50  
+8597 4604 1118 5247 9856 9855 8596  
+8598 4605 4604 1847 8604 8600 8599  
+8599 4604 4605 1846 8331 50 8598  
+8600 1989 4605 1847 8598 3199 3480  
+8601 4602 4606 1845 8595 3194 8594  
+8602 700 1848 4606 3195 8594 3201  
+8603 1990 4607 702 5112 3481 1796  
+8604 4604 4607 1847 1796 8598 3205  
+8605 1375 4609 739 3217 1283 2260  
+8606 1854 322 4608 -1 3216 3211  
+8607 4610 4609 880 2260 8608 3218  
+8608 880 604 4610 8609 8607 55  
+8609 2764 4610 604 8608 5010 1282  
+8610 1856 4611 739 34 3217 2080  
+8611 4611 1857 1201 4773 3220 2080  
+8612 3711 4612 532 707 1474 72  
+8613 4613 4612 1858 72 8614 3224  
+8614 4614 4613 1858 8613 8616 8114  
+8615 2181 4613 1543 8114 3860 3222  
+8616 3984 4614 1858 8614 7403 3221  
+8617 1543 4614 4354 7402 8116 8114  
+8618 2181 4615 1859 8620 3222 2594  
+8619 3536 4615 997 2594 3225 6541  
+8620 4615 4616 1859 3223 8618 2595  
+8621 2182 4616 1860 2595 3226 1472  
+8622 2276 4617 1861 6540 1475 4048  
+8623 5665 4617 1862 4048 10678 3918  
+8624 4619 4618 998 10681 4035 3233  
+8625 2527 4618 1864 3233 4549 4052  
+8626 4620 998 2815 5108 8628 4035  
+8627 4619 1970 4714 8814 8813 8629  
+8628 2268 4620 2815 8626 9205 3442  
+8629 1970 4619 4620 4035 9198 8627  
+8630 2875 4621 1101 8634 5228 1808  
+8631 4622 4621 758 1808 8632 3239  
+8632 4469 4622 758 8631 2204 8334  
+8633 4622 1693 4722 8829 8828 8334  
+8634 4621 4623 1101 7604 8630 1723  
+8635 3642 4623 1867 1723 1772 6746  
+8636 1869 4105 4625 7637 3246 7638  
+8637 4630 4624 1870 8639 8648 1120  
+8638 4626 4625 1135 7637 8640 6523  
+8639 1870 4624 4625 3246 6523 8637  
+8640 4107 4626 1135 8638 7642 1792  
+8641 4626 3527 4629 8647 8646 1792  
+8642 4628 4627 594 6522 8644 3247  
+8643 4630 4627 1871 3247 8653 8648  
+8644 4095 4628 594 8642 7619 7618  
+8645 4628 1880 4638 8665 8664 7618  
+8646 4626 4629 1870 878 6523 8641  
+8647 4629 3527 4093 105 7615 8641  
+8648 4627 4630 1870 8637 878 8643  
+8649 1871 4631 4632 3248 8653 8650  
+8650 4638 4631 1871 8649 8664 176  
+8651 4633 4631 1112 176 8655 8654  
+8652 5667 1872 3080 5638 1915 10683  
+8653 1871 4632 4630 5637 8643 8649  
+8654 4631 4633 1872 9981 3248 8651  
+8655 4633 1112 4644 8676 8674 8651  
+8656 4643 4634 1873 5623 8673 8672  
+8657 4635 4634 1875 8672 8658 5614  
+8658 3069 4635 1875 8657 5616 5615  
+8659 543 4635 3068 5615 4543 5614  
+8660 2650 4636 1874 3253 3255 4786  
+8661 3069 4636 1877 4786 5617 5616  
+8662 4624 4637 1869 9441 3246 3245  
+8663 4637 798 5706 3243 9985 3245  
+8664 4628 4638 1871 8650 3247 8645  
+8665 4638 1880 4640 3266 8669 8645  
+8666 4640 4639 1128 3750 8668 3266  
+8667 4095 4639 1880 3266 7618 7617  
+8668 4641 4640 1128 8666 8670 3271  
+8669 4640 1883 4638 1778 8665 3271  
+8670 4641 1128 4827 3752 9039 8668  
+8671 4641 1884 4646 8681 8680 3275  
+8672 4643 1875 4634 8657 8656 8675  
+8673 1873 4644 4643 8677 8656 8674  
+8674 1873 4633 4644 8655 8673 3249  
+8675 1875 4643 4642 8677 3257 8672  
+8676 4644 1112 4645 8678 3277 8655  
+8677 4642 4643 4644 8673 1069 8675  
+8678 4638 4645 1112 8676 176 1778  
+8679 4646 4645 1883 1778 8680 3278  
+8680 4641 4646 1883 8679 3271 8671  
+8681 4646 1884 4647 3272 8683 8671  
+8682 2651 4647 508 5375 4788 4782  
+8683 4646 4647 1887 4782 3274 8681  
+8684 4642 4648 1874 3254 3253 3251  
+8685 4646 4648 1886 3251 3278 3274  
+8686 4651 4650 941 1405 -1 8690  
+8687 4135 4649 1891 8688 7694 7693  
+8688 4649 4650 1891 8690 8687 3287  
+8689 1898 4652 536 3289 836 3291  
+8690 4650 4651 1891 10407 8688 8686  
+8691 4654 4652 1893 3291 8694 3290  
+8692 4655 4653 1174 8718 3293 1869  
+8693 4654 4653 1894 1869 8695 8694  
+8694 4653 4654 1893 8691 3292 8693  
+8695 4654 1894 4658 8702 3294 8693  
+8696 1174 4667 4656 8721 3293 3269  
+8697 1895 4864 5668 9107 10685 9108  
+8698 4656 1902 4994 9364 9363 8721  
+8699 1895 4655 4656 3293 3870 10685  
+8700 5673 493 4675 3871 3325 10695  
+8701 4657 5673 4865 10694 9109 10695  
+8702 4658 1894 5668 10684 3296 8695  
+8703 4660 4658 967 8730 1682 8704  
+8704 1896 4658 4660 8703 8707 3294  
+8705 2396 4659 1897 5105 8102 4289  
+8706 1897 4660 2813 1682 8095 5105  
+8707 1896 4660 4659 5105 220 8704  
+8708 1901 4661 971 1465 3276 3302  
+8709 3528 4661 1898 3302 836 3301  
+8710 2702 4662 970 3303 4889 4888  
+8711 4663 4662 595 4888 8712 3304  
+8712 4663 595 4862 9104 3305 8711  
+8713 4663 1900 4664 8715 8714 3305  
+8714 4663 4664 1899 1462 3304 8713  
+8715 4665 4664 1900 8713 3306 8717  
+8716 5669 4665 1885 9861 10686 3307  
+8717 4664 4665 971 8726 1465 8715  
+8718 4653 4666 1174 3269 8692 3292  
+8719 1898 4666 1893 3292 3291 1456  
+8720 1901 4670 4668 8727 8723 3276  
+8721 4656 4667 1902 8722 8698 8696  
+8722 1902 4667 4668 8723 8725 8721  
+8723 1901 4668 4667 8722 424 8720  
+8724 2392 4669 1882 10368 3327 3310  
+8725 1902 4668 4669 3309 9364 8722  
+8726 4665 4670 971 3276 8717 3307  
+8727 4668 4670 1903 10687 3312 8720  
+8728 3558 4671 1904 3283 3315 6583  
+8729 4665 4671 1905 6583 1464 3306  
+8730 4658 4672 967 9781 8703 3296  
+8731 2807 4672 1906 2158 3320 5093  
+8732 3379 5672 1194 10693 6232 3872  
+8733 5671 1911 2682 3328 4851 10691  
+8734 1911 4673 4674 8735 8736 10691  
+8735 1194 4674 4673 8734 10689 10693  
+8736 1911 4674 4675 3325 3708 8734  
+8737 5673 4674 2186 10692 10694 3325  
+8738 4676 493 4994 9363 4283 3871  
+8739 4676 2103 4828 9040 1775 4282  
+8740 1540 1916 4677 8741 2589 3338  
+8741 1915 4677 1916 8740 414 3337  
+8742 1591 5195 4678 9753 2691 9754  
+8743 1590 1917 4678 2689 8179 2690  
+8744 4679 1592 4391 1690 8183 3340  
+8745 1918 4679 1917 2689 3339 1538  
+8746 1923 4680 1918 3342 3341 1127  
+8747 4683 4680 511 1127 8752 3343  
+8748 4682 4681 1919 3346 8750 3344  
+8749 2786 4681 1920 3344 5051 5049  
+8750 4682 1919 4683 3343 8753 8748  
+8751 4682 1922 4685 3350 8757 3348  
+8752 2477 4683 511 8747 10696 3347  
+8753 4682 4683 1921 3347 155 8750  
+8754 3979 4684 1921 155 7392 7388  
+8755 4032 4684 615 7388 3349 7496  
+8756 1972 4685 722 7498 9415 1802  
+8757 4682 4685 1920 9749 3344 8751  
+8758 4687 1923 1925 162 8761 3352  
+8759 5248 5674 1924 10697 9857 3358  
+8760 4686 4687 1924 3206 10697 3352  
+8761 3529 4687 1925 8758 3355 6527  
+8762 4085 4688 1848 8764 3201 7599  
+8763 2477 4688 1117 7599 4447 3357  
+8764 4688 4689 1848 3354 8762 3202  
+8765 4689 1926 5248 3358 5353 3202  
+8766 1930 4690 1928 3364 3361 409  
+8767 4224 4690 1266 409 3362 7863  
+8768 476 1932 4691 8769 8011 3370  
+8769 4691 1932 1268 3367 3369 8768  
+8770 4692 1352 4223 2213 7861 3372  
+8771 3423 4692 1933 2215 3371 6318  
+8772 4445 4693 616 8775 2843 2845  
+8773 4452 4693 1671 8288 8301 2849  
+8774 3957 4694 882 2238 7352 1286  
+8775 4693 4694 616 1286 8772 1287  
+8776 5712 515 4454 2503 10772 10771  
+8777 4695 1675 4701 8789 2239 10364  
+8778 1934 1935 4696 8779 3374 3373  
+8779 1936 4696 1935 8778 3376 2232  
+8780 4697 681 3956 301 975 3380  
+8781 882 1937 4697 3380 7352 1288  
+8782 1942 4698 1939 1705 3383 3384  
+8783 2108 4698 1940 3384 3717 3711  
+8784 2108 4699 551 8794 3718 3717  
+8785 4700 4699 1940 3717 3385 8787  
+8786 2083 4700 1362 3385 3387 3668  
+8787 4699 4700 1941 3668 2233 8785  
+8788 4701 1364 1935 3376 2239 3389  
+8789 4702 4701 1675 8777 8790 2856  
+8790 4702 1675 5504 10363 3661 8789  
+8791 1362 1942 4702 2856 8960 3390  
+8792 1945 4703 1943 943 3393 3391  
+8793 1954 4703 1944 3391 3411 3407  
+8794 4699 4704 551 9006 8784 2233  
+8795 1955 4704 1941 2233 3397 3399  
+8796 4706 1946 1955 3399 10699 8799  
+8797 2115 4705 1947 8798 3398 3731  
+8798 1947 4705 4706 8799 1703 8797  
+8799 1946 4706 4705 8798 9007 8796  
+8800 2105 4707 1945 3404 3395 857  
+8801 1950 4707 709 857 3405 3396  
+8802 2109 4708 709 3405 1964 3714  
+8803 3361 4708 1224 3714 6196 1962  
+8804 1954 4710 50 976 3392 3411  
+8805 1950 52 4709 -1 3406 6195  
+8806 1949 4710 1944 3411 3403 3394  
+8807 3849 4711 49 3409 -1 7144  
+8808 1937 4711 681 7144 3380 653  
+8809 4712 1955 4790 3397 3667 3414  
+8810 4786 4712 1092 3667 8957 8956  
+8811 1740 4713 875 1983 2989 3434  
+8812 1965 4713 1967 3434 3437 3438  
+8813 4619 4714 1864 4546 3233 8627  
+8814 4715 4714 1970 8627 8815 3443  
+8815 4715 1970 4911 9198 9197 8814  
+8816 2259 4715 963 4032 4017 3444  
+8817 2944 4716 686 63 1614 5366  
+8818 1046 1974 4716 3449 5366 3450  
+8819 4719 4718 1975 3454 8822 3455  
+8820 2941 4717 1974 1612 3450 566  
+8821 4718 1976 5367 1576 10091 3455  
+8822 3935 4719 1975 8819 7310 7309  
+8823 4719 890 3931 7302 7301 7309  
+8824 2355 4720 566 3456 492 1529  
+8825 3774 4720 1003 1529 7007 979  
+8826 395 4721 396 3458 -1 951  
+8827 1978 4721 1979 951 3461 486  
+8828 4622 4722 667 1798 2893 8633  
+8829 4722 1693 4470 1040 8336 8633  
+8830 2634 4723 531 1114 4756 4755  
+8831 1993 4723 1992 4755 3490 3487  
+8832 2654 4724 1998 2187 2464 3497  
+8833 4725 4724 1999 3497 8834 1395  
+8834 4725 1999 3552 6572 3500 8833  
+8835 4725 2000 5553 10457 6860 6574  
+8836 1295 1481 4726 8837 2108 2473  
+8837 1482 4726 1481 8836 2472 2109  
+8838 1731 2463 4727 8839 8841 2968  
+8839 1295 4727 2463 8838 2473 4422  
+8840 4503 4728 935 7743 1939 1948  
+8841 4727 4728 1731 1948 8838 1922  
+8842 4336 4729 1524 1012 8079 2556  
+8843 4731 4729 311 2556 3541 8844  
+8844 4729 4731 2020 8847 1012 8843  
+8845 4385 4730 1100 7582 8172 3542  
+8846 1100 4731 4076 3541 1722 7582  
+8847 2020 4731 4730 7582 1721 8844  
+8848 4059 4732 568 3549 7549 223  
+8849 4732 744 4335 8076 398 223  
+8850 745 2024 4733 8851 93 2557  
+8851 4732 4733 2024 8850 3549 763  
+8852 4737 4734 1065 3563 3565 3559  
+8853 2028 4734 2029 3559 2670 3558  
+8854 3223 4735 2030 1641 3564 5921  
+8855 4740 2031 2035 124 565 3567  
+8856 3266 4736 1581 8870 6007 6006  
+8857 4737 4736 2029 6006 3559 8859  
+8858 1065 4740 4769 8864 3565 8865  
+8859 4736 4737 2032 8922 2671 8857  
+8860 3223 4738 2031 124 5921 5920  
+8861 3162 4738 2034 5920 1107 5800  
+8862 4739 1059 4871 9122 3615 8866  
+8863 4740 4739 2033 3615 8864 565  
+8864 4769 4740 2033 8863 8923 8858  
+8865 4735 4740 1065 8858 3563 3567  
+8866 4739 4741 1059 3573 8862 3572  
+8867 4742 4741 2035 3572 8868 3574  
+8868 4738 4742 2035 8867 124 1841  
+8869 3163 4742 590 1841 1639 3571  
+8870 4736 4743 1581 9886 8856 2671  
+8871 2032 2037 4743 708 2671 1652  
+8872 4770 4744 2037 9887 3576 8924  
+8873 4749 4744 2038 8924 8875 1650  
+8874 4746 4745 1060 3614 8876 1643  
+8875 4749 2038 5677 8882 8885 8873  
+8876 4746 1060 4771 3579 8927 8874  
+8877 4747 4746 2040 3618 8878 3580  
+8878 4747 2040 4748 8880 3582 8877  
+8879 4747 2047 4757 8899 8898 10701  
+8880 4773 4748 2040 8878 3581 8929  
+8881 5137 4748 2672 8929 9639 9638  
+8882 5677 2038 4745 3577 10702 8875  
+8883 4756 4749 2041 8885 8896 1585  
+8884 4751 4750 1063 3596 8886 3583  
+8885 5677 2041 4749 8883 8875 10703  
+8886 4752 4751 1063 8884 8888 5434  
+8887 4754 4751 2042 5434 8892 3584  
+8888 4753 4752 1063 8886 10704 3603  
+8889 2978 4752 2051 3603 5531 3585  
+8890 1063 4757 5678 8899 10704 3596  
+8891 4753 2048 4760 3598 8905 8901  
+8892 4755 4754 2042 8887 8894 1651  
+8893 4754 2044 4756 8897 8896 1651  
+8894 2977 4755 2042 8892 5432 5429  
+8895 4755 1064 2989 3591 5457 5429  
+8896 4754 4756 2041 8883 3584 8893  
+8897 2991 4756 2044 8893 1279 5461  
+8898 4747 4757 2039 189 3580 8879  
+8899 4757 2047 5678 10705 8890 8879  
+8900 4759 4758 1062 10700 8902 1647  
+8901 5678 2048 4753 8891 10704 1648  
+8902 5136 4759 1062 8900 9637 9636  
+8903 4759 2190 4867 9114 9113 9636  
+8904 2981 4760 1061 3879 5427 5441  
+8905 4753 4760 2051 5441 3603 8891  
+8906 4867 4761 2048 3598 9113 1700  
+8907 2191 2982 5679 5438 10707 3882  
+8908 2993 4763 2055 8913 5465 3612  
+8909 2988 4762 2046 5464 5454 3610  
+8910 4762 1334 4763 3594 5464 4940  
+8911 4763 4768 4764 8921 8913 3594  
+8912 4764 4766 4765 8917 8915 4711  
+8913 2055 4763 4764 8911 8915 8908  
+8914 502 5280 5704 3592 10756 9920  
+8915 2055 4764 4765 8912 5516 8913  
+8916 5117 4767 4766 8919 2177 9598  
+8917 502 4765 4766 8912 8919 10756  
+8918 2620 4767 1333 9598 2899 2175  
+8919 502 4766 4767 8916 2175 8917  
+8920 2625 4768 1334 3594 4712 4736  
+8921 2612 4764 4768 8911 4736 4711  
+8922 4737 4769 2032 3575 8859 3565  
+8923 2033 2056 4769 3575 8864 3613  
+8924 4770 2038 4744 8873 8872 3577  
+8925 2057 4770 2056 3576 3613 3568  
+8926 4771 2057 4871 9121 3616 3579  
+8927 4746 4771 2058 3616 3618 8876  
+8928 525 2673 4772 8930 3617 8322  
+8929 4773 2672 4748 8881 8880 9645  
+8930 4772 2673 4773 8931 3581 8928  
+8931 5140 4773 2673 8930 4833 9645  
+8932 4454 4774 1674 10360 10772 2853  
+8933 5681 4774 1670 8304 3639 8936  
+8934 4776 4775 2069 10361 10711 3640  
+8935 4777 4775 2070 3640 8938 2235  
+8936 4774 5681 2069 10711 2854 8933  
+8937 4779 4776 1497 3655 8943 8942  
+8938 4778 4777 2070 8935 8940 3642  
+8939 2078 4777 2071 3642 8948 3658  
+8940 4778 2070 4779 8942 3641 8938  
+8941 5145 4778 716 225 9654 3643  
+8942 4776 4779 2070 8940 3640 8937  
+8943 4780 4779 1497 8937 8944 3647  
+8944 4780 1497 4791 8967 8947 8943  
+8945 3760 4780 2074 8947 3650 6979  
+8946 3765 4781 1090 3740 6990 6988  
+8947 4791 2074 4780 8945 8944 3645  
+8948 4783 2078 2071 8939 3644 8951  
+8949 4786 2079 2081 3660 3663 3415  
+8950 2079 4782 4783 8951 4843 3415  
+8951 2078 4783 4782 8950 1706 8948  
+8952 4777 4784 1363 6528 2235 3658  
+8953 4789 4784 2078 3658 8963 8962  
+8954 2939 4785 1948 3898 5356 3416  
+8955 4786 4785 1956 3416 8956 3663  
+8956 4712 4786 1956 8955 3413 8810  
+8957 4782 4786 1092 8810 1706 3415  
+8958 5144 2079 2678 4843 4842 3664  
+8959 2200 4787 2082 9653 3666 3899  
+8960 4702 4788 1362 3387 8791 3661  
+8961 4789 4788 2080 10362 8962 3657  
+8962 4784 4789 2080 8961 3662 8953  
+8963 1092 4789 2078 8953 1706 397  
+8964 1941 2083 4790 8965 3397 3668  
+8965 4790 2083 1092 397 3667 8964  
+8966 4791 2077 4781 1765 3645 2504  
+8967 5681 4791 1497 8944 3655 10710  
+8968 2380 4792 2085 2844 4257 3672  
+8969 2119 4792 2086 3672 3674 3656  
+8970 2380 4793 2086 8973 3672 4259  
+8971 2091 4793 679 4259 2842 3673  
+8972 2119 4794 1122 3678 9151 3674  
+8973 4793 4794 2086 3674 8970 1766  
+8974 2091 4795 2087 2092 3673 2093  
+8975 4796 4795 1288 2093 8976 3675  
+8976 4796 1288 5595 1909 10539 8975  
+8977 537 2088 4796 3675 7517 3677  
+8978 2608 4797 1196 8293 4704 876  
+8979 1288 2091 4797 3684 1909 2093  
+8980 3359 4798 1734 2975 6191 6190  
+8981 500 2093 4798 2975 6190 929  
+8982 3419 4799 947 8984 2973 6311  
+8983 1734 4799 1733 6311 8410 1417  
+8984 4799 4800 947 2055 8982 3688  
+8985 2122 4800 2093 3688 929 3687  
+8986 3626 4801 1260 6724 2037 6715  
+8987 947 4801 1269 6715 6309 2055  
+8988 5682 4802 1344 3696 10712 5503  
+8989 3296 4802 2095 5503 3691 2200  
+8990 4804 4803 2096 3694 8992 3693  
+8991 2097 3317 4807 3516 8999 6109  
+8992 4805 4804 2096 8990 8994 1398  
+8993 4804 2805 5204 5089 9772 1398  
+8994 4806 4805 2096 8992 8996 2603  
+8995 4805 1391 5202 9767 5088 10164  
+8996 3296 4806 2096 8994 2200 6067  
+8997 4806 2098 5404 10165 2603 6067  
+8998 1344 4803 4807 8999 6111 3696  
+8999 2097 4807 4803 8998 3693 8991  
+9000 1010 2101 4808 9001 283 1543  
+9001 1833 4808 2101 9000 3704 544  
+9002 4094 4809 1881 1776 1745 1782  
+9003 4810 4809 1127 1782 9004 3705  
+9004 2126 4810 1127 9003 1781 3707  
+9005 2392 4810 2103 3707 4282 3267  
+9006 4704 4811 551 3713 8794 2836  
+9007 4811 1946 4705 8799 1550 2836  
+9008 2681 4812 843 3720 944 1965  
+9009 1224 2109 4812 3720 9659 3714  
+9010 3719 4813 843 674 3716 6898  
+9011 4814 4813 2107 6898 9012 3715  
+9012 4811 4814 2107 9011 3713 3388  
+9013 4816 4814 1665 3388 9017 9016  
+9014 2491 4815 2110 812 3723 4477  
+9015 2681 4815 2111 4477 3722 944  
+9016 4814 4816 2110 3723 3715 9013  
+9017 2115 4816 1665 9013 3731 3725  
+9018 2115 4817 2112 3727 3725 3728  
+9019 4818 4817 2113 9682 9023 646  
+9020 2113 5158 4819 9680 9023 9681  
+9021 4820 4818 2114 9022 9024 3905  
+9022 2114 4818 4819 9023 6248 9021  
+9023 2113 4819 4818 9022 9019 9020  
+9024 2728 4820 2114 9021 3730 4937  
+9025 4820 2203 5037 9447 9446 4937  
+9026 2939 4821 1947 3398 10698 5357  
+9027 5159 4821 483 5357 3732 9683  
+9028 4822 2000 3553 6574 3501 10457  
+9029 3273 4822 2002 6576 10370 6020  
+9030 4886 4823 2119 1698 9151 3739  
+9031 2121 4823 2120 3739 5331 3743  
+9032 3360 4824 500 3745 6194 2917  
+9033 3630 4824 1706 8367 6723 2919  
+9034 2392 4825 2102 9036 3267 3327  
+9035 5506 4825 1882 3327 10366 3273  
+9036 4825 4826 2102 1777 9034 3706  
+9037 4826 2124 1128 3752 3750 3706  
+9038 4827 2124 5506 3273 6530 3752  
+9039 4641 4827 2125 6530 3275 8670  
+9040 2103 2126 4828 9041 8739 3707  
+9041 4828 2126 5148 9660 3754 9040  
+9042 4060 4830 1029 3762 7554 7551  
+9043 2128 231 4829 -1 536 3938  
+9044 314 4830 836 7551 212 1013  
+9045 174 4832 175 992 -1 735  
+9046 4832 4831 2131 744 3764 9047  
+9047 4831 4832 173 735 -1 9046  
+9048 2131 2132 4834 9050 3764 1083  
+9049 2132 176 4833 -1 9050 6671  
+9050 4833 4834 2132 9048 9049 3766  
+9051 1300 4836 1298 2112 2116 9  
+9052 2133 41 4835 -1 10715 7515  
+9053 749 4836 2137 9 3778 3776  
+9054 903 4837 340 3782 17 24  
+9055 728 4837 904 24 1334 980  
+9056 4342 4839 1531 2582 8089 1091  
+9057 2142 129 4838 -1 9129 5826  
+9058 5637 4839 485 1091 2571 10623  
+9059 1531 4840 1530 8103 2568 360  
+9060 5208 4840 2155 360 9780 9779  
+9061 4843 4841 2157 4919 9066 9065  
+9062 2723 4841 2158 9065 4928 1814  
+9063 2714 4842 783 2572 3814 4913  
+9064 4843 4842 2158 4913 9065 3812  
+9065 4841 4843 2158 9064 9062 9061  
+9066 738 4843 2157 9061 2663 810  
+9067 4351 4844 1532 8090 8107 3817  
+9068 4845 4844 2159 3817 9069 3816  
+9069 4843 4845 2159 9068 3812 810  
+9070 4846 4845 738 810 3818 9071  
+9071 4845 4846 2160 8098 3816 9070  
+9072 5643 738 4384 2663 10635 3818  
+9073 3960 4847 2163 4864 7356 7353  
+9074 4848 4847 886 7353 10717 9075  
+9075 4847 4848 2164 9082 3824 9074  
+9076 5684 886 3111 5224 3826 10717  
+9077 4849 627 3815 7083 588 10716  
+9078 4850 4849 1311 7002 9079 2125  
+9079 3500 4850 1311 9078 1926 6472  
+9080 4851 4850 887 6472 9081 3829  
+9081 2693 4851 887 9080 2137 1296  
+9082 4848 4851 2164 1296 9075 1295  
+9083 4852 938 5615 2601 7835 2096  
+9084 4853 4852 1546 7835 9085 3831  
+9085 4357 4853 1546 9084 1947 2600  
+9086 1627 2166 4853 3831 8233 1399  
+9087 1294 4854 2167 3833 8231 1683  
+9088 2169 2168 4854 3833 1683 2749  
+9089 3333 4855 1630 3838 1685 6141  
+9090 2400 4855 1081 6141 4298 4297  
+9091 4411 4856 1292 3846 2752 2744  
+9092 4857 4856 1622 2744 9093 3847  
+9093 4989 4857 1622 9092 2751 9353  
+9094 4413 4857 1623 9353 8226 949  
+9095 5664 1860 3536 6541 10677 1517  
+9096 4860 4858 976 10676 33 3862  
+9097 3710 4859 975 9102 1408 6881  
+9098 532 2182 4859 3863 6881 1472  
+9099 4881 976 2210 10679 3864 33  
+9100 4861 4860 2183 9142 9101 895  
+9101 4861 2183 4878 9135 5021 9100  
+9102 4861 975 4859 9097 3863 5021  
+9103 4862 1904 1900 3283 3305 886  
+9104 4863 4862 595 8712 9105 3866  
+9105 2702 4863 595 9104 4888 4886  
+9106 2697 4863 819 4886 4878 3867  
+9107 4864 1906 5668 2158 8697 3317  
+9108 4865 4864 1895 8697 9109 3868  
+9109 4657 4865 1895 9108 3870 8701  
+9110 2187 4865 2186 10694 6231 402  
+9111 3176 4866 2188 2155 3322 3874  
+9112 2808 4866 2189 3874 3877 5094  
+9113 4759 4867 2048 8906 1647 8903  
+9114 4868 4867 2190 8903 3878 3880  
+9115 5136 4869 2190 3878 9636 4824  
+9116 5262 4868 1797 9453 9885 9884  
+9117 5509 4869 1866 4824 10373 10372  
+9118 2498 4868 4869 3878 10372 4490  
+9119 2985 4870 1096 4959 9699 3883  
+9120 5685 4870 2193 3883 10718 5348  
+9121 4871 2057 2033 3613 3615 8926  
+9122 1059 2196 4871 1640 8862 3890  
+9123 3758 4872 2076 4839 6985 3892  
+9124 4873 4872 2197 3892 9125 3895  
+9125 5132 4873 2197 9124 9629 9628  
+9126 4873 1087 5128 9620 4807 9628  
+9127 3175 4874 717 9132 3785 2539  
+9128 4875 4874 2142 2539 9129 2119  
+9129 4838 4875 2142 9128 9057 3786  
+9130 2141 4875 128 3786 -1 3783  
+9131 3425 4876 1303 7870 6322 6320  
+9132 4874 4876 717 10264 9127 684  
+9133 732 5180 4878 9723 9136 5022  
+9134 4881 4877 2183 9135 9142 9141  
+9135 2183 4877 4878 9136 9101 9134  
+9136 732 4878 4877 9135 284 9133  
+9137 4880 4879 581 9149 9139 1822  
+9138 3538 4879 2208 1822 6544 1386  
+9139 4883 4880 581 9137 3914 9146  
+9140 2960 4880 2209 4639 5399 3917  
+9141 4877 4881 2207 9150 3913 9134  
+9142 4860 4881 2183 9134 9100 33  
+9143 4883 1862 2264 4028 9148 1823  
+9144 4885 4882 581 3914 9149 3919  
+9145 2264 4909 4884 9193 9148 9194  
+9146 4883 4884 4880 4639 9139 9148  
+9147 2209 4884 2573 4026 4635 4639  
+9148 2264 4884 4883 9146 9143 9145  
+9149 4879 4885 581 9144 9137 3912  
+9150 4881 4885 2207 3912 9141 3864  
+9151 1122 4886 2119 9030 8972 3463  
+9152 1980 4886 2217 3463 3903 3932  
+9153 1 4887 660 439 2453 437  
+9154 4888 4887 0 437 -1 9156  
+9155 466 4889 467 22 -1 432  
+9156 4887 4888 2219 3936 439 9154  
+9157 3962 4889 695 432 918 661  
+9158 2384 4892 1534 2219 4267 4260  
+9159 2224 4890 2225 3946 591 142  
+9160 2228 112 4891 -1 899 8064  
+9161 557 2230 4892 2219 4266 3959  
+9162 3412 4893 685 8568 1051 6298  
+9163 763 2230 4893 801 6298 1050  
+9164 4895 2235 5605 266 10559 3972  
+9165 2704 4894 2232 3963 1168 4893  
+9166 4896 4895 526 7657 9168 9167  
+9167 4895 4896 2237 9169 3972 9166  
+9168 2261 4896 526 9166 4021 3973  
+9169 4896 4897 2237 3975 9167 2166  
+9170 2239 4897 2238 2166 3974 3977  
+9171 2243 4898 503 1025 3984 3983  
+9172 2244 4898 2241 3983 3986 60  
+9173 503 4903 4899 1498 3984 9182  
+9174 893 2243 4899 3984 7488 1307  
+9175 4901 4900 2236 3981 3987 9178  
+9176 2262 4900 2244 9178 3986 1166  
+9177 1327 2244 4901 9178 3969 2163  
+9178 4900 4901 2244 9177 9176 9175  
+9179 3572 4902 2247 3995 2808 6609  
+9180 3549 4902 2248 6609 6565 3996  
+9181 4903 1325 4028 7489 1498 6566  
+9182 503 2249 4903 3997 9173 2161  
+9183 2259 4904 1330 4006 4016 4010  
+9184 4904 2256 4907 4015 4014 9215  
+9185 1329 4905 2255 4009 4004 4008  
+9186 4918 4905 2265 4008 9211 4049  
+9187 2259 4906 1971 4550 3444 4016  
+9188 1330 2257 4906 4013 4016 3445  
+9189 4025 4907 1331 9213 7483 3333  
+9190 4907 2258 2254 2809 4014 3333  
+9191 2266 4908 963 4017 4030 4018  
+9192 4920 2260 2278 4019 4055 1447  
+9193 4884 4909 1151 4024 4026 9145  
+9194 2265 4909 2264 9145 4027 3230  
+9195 4911 4910 2267 9200 9197 4034  
+9196 4910 2268 4915 9205 4033 4034  
+9197 4715 4911 2267 9195 4032 8815  
+9198 4620 4911 1970 8815 8629 3442  
+9199 2266 2267 4912 9200 4031 4030  
+9200 4912 2267 4910 9195 1449 9199  
+9201 4913 2269 4914 4036 9204 2342  
+9202 2432 4913 2270 4038 4362 4354  
+9203 4914 1416 4916 4042 4047 2343  
+9204 4913 4914 2272 4047 4038 9201  
+9205 2815 4915 2268 9196 8628 5109  
+9206 2281 4915 1417 5109 2348 4044  
+9207 4917 4916 2273 4042 9209 4045  
+9208 4916 2274 2272 4046 4047 4045  
+9209 2281 4917 2273 9207 4044 2344  
+9210 1415 2274 4917 4045 2344 9221  
+9211 2265 2275 4918 9212 9186 4027  
+9212 2525 4918 2275 9211 4051 1519  
+9213 4907 4919 1331 3332 9189 4015  
+9214 4920 4919 2256 4015 9215 4055  
+9215 4904 4920 2256 9214 9184 4010  
+9216 4908 4920 2259 4010 4017 1447  
+9217 2279 5533 4922 4056 9220 10417  
+9218 2415 4921 2280 9219 4329 3331  
+9219 2280 4921 4922 9220 10054 9218  
+9220 2279 4922 4921 9219 4561 9217  
+9221 1415 4923 2274 4069 9210 2340  
+9222 4929 4923 2285 2340 9233 4097  
+9223 2346 4924 1714 4062 4190 4077  
+9224 999 4924 2289 4077 4074 4076  
+9225 4926 2290 2292 4078 4083 4079  
+9226 2952 4925 2291 9228 5383 5382  
+9227 4259 4926 1373 4083 4080 7932  
+9228 4925 4926 2291 7932 9226 4079  
+9229 2300 4927 1413 2257 9278 4089  
+9230 1414 4927 2295 4089 4086 4088  
+9231 4930 2298 2301 4094 4101 4095  
+9232 4928 2299 4929 9234 4068 9236  
+9233 4929 2285 1420 2338 4068 9222  
+9234 2530 4929 2299 9232 4040 4555  
+9235 2529 4930 1421 4101 4096 4553  
+9236 4928 4930 2299 4553 9232 4095  
+9237 3659 4931 1220 4102 6802 6779  
+9238 2313 4931 2303 6779 4124 2353  
+9239 1205 4932 2297 4093 4090 4092  
+9240 2306 4932 2305 4092 4108 3329  
+9241 3193 4933 1912 4110 2322 5862  
+9242 4953 4933 2324 5862 9282 9281  
+9243 2311 4934 1372 9247 1520 4084  
+9244 4935 4934 2293 4084 9245 4082  
+9245 2293 2292 4935 9246 9244 4085  
+9246 1419 4935 2292 9245 4078 2349  
+9247 4934 4936 1372 9249 9243 2255  
+9248 2309 4936 2307 2255 9317 4113  
+9249 4936 4937 1372 4898 9247 2596  
+9250 4937 2308 4938 9251 4114 2596  
+9251 2309 4938 2308 9250 4113 2935  
+9252 3821 4938 488 2935 10497 4118  
+9253 1543 2310 4939 9254 3860 4119  
+9254 3821 4939 2310 9253 4118 7092  
+9255 4236 4940 575 4122 7888 1214  
+9256 1724 4940 1370 1214 2370 328  
+9257 3717 4941 1724 328 2954 6894  
+9258 4942 4941 1371 6894 4123 9260  
+9259 2707 4942 2311 9279 1520 4120  
+9260 4941 4942 2312 4120 2955 9258  
+9261 2301 4943 1421 9265 4101 4103  
+9262 4931 4943 2302 4103 4102 2353  
+9263 3652 4944 2303 4124 6765 6763  
+9264 4946 4944 958 6763 9268 9267  
+9265 4943 4945 1421 4096 9261 1954  
+9266 4946 4945 2313 1954 9267 4126  
+9267 4944 4946 2313 9266 4124 9264  
+9268 4946 958 5533 10418 10417 9264  
+9269 2346 4947 2309 4128 4191 4190  
+9270 4949 4947 1714 4190 9273 4129  
+9271 4948 998 5666 10681 10680 2934  
+9272 2315 4948 1865 6542 4117 2341  
+9273 4950 4949 1714 9270 4130 9276  
+9274 4948 4949 2316 9276 2934 2341  
+9275 1417 4950 2282 4130 2348 4060  
+9276 4949 4950 2316 4060 9274 9273  
+9277 2305 4951 1912 4137 4108 4099  
+9278 1413 4951 2300 4099 9229 4098  
+9279 4942 4952 2311 4148 9259 4123  
+9280 4261 4952 1371 4123 7936 4121  
+9281 4933 4953 1405 4153 4147 9242  
+9282 4954 4953 2324 9242 9283 4146  
+9283 2323 4954 2324 9282 2321 352  
+9284 4955 4954 1404 352 9285 4150  
+9285 4254 4955 1404 9284 2315 7921  
+9286 4956 4955 1275 7921 9287 2318  
+9287 3194 4956 1275 9286 5863 4151  
+9288 4957 4956 2327 4151 9290 9289  
+9289 4956 4957 2326 2067 2318 9288  
+9290 4959 4957 2327 9288 2327 4173  
+9291 3194 4958 2327 2327 4151 2066  
+9292 2342 4958 1408 2066 2326 2005  
+9293 5686 2328 959 2002 4155 10721  
+9294 4959 5686 4964 10720 9303 10721  
+9295 2342 4960 2328 2002 2005 4154  
+9296 4961 4960 2329 4154 9297 4166  
+9297 3676 4961 2329 9296 6813 6812  
+9298 4961 2334 2338 4175 4174 10436  
+9299 2338 4962 2333 2606 1957 4175  
+9300 4962 2334 5542 10436 10435 4175  
+9301 2332 4963 1220 4104 2607 2331  
+9302 2333 2335 4963 4104 2331 4165  
+9303 4959 4964 1405 4111 4173 9294  
+9304 1548 4964 2337 10720 4170 4172  
+9305 3195 4965 1408 2326 2311 4182  
+9306 3721 4965 2343 10071 4185 4183  
+9307 2343 5357 4968 10070 9312 10071  
+9308 2344 4969 4967 4187 3150 2328  
+9309 3682 4967 2345 4187 6825 4205  
+9310 1409 4966 4967 3150 4205 3153  
+9311 2344 4966 4968 9312 4186 3150  
+9312 2343 4968 4966 9311 3153 9307  
+9313 4970 2344 3380 4186 10723 2328  
+9314 2490 4969 1823 9316 4475 4188  
+9315 3380 5438 5687 10231 10723 10232  
+9316 1823 4969 4970 2328 8557 9314  
+9317 2309 2307 4971 9318 4191 9248  
+9318 1419 4971 2307 9317 2349 4116  
+9319 2902 4972 1425 2359 2160 5283  
+9320 5622 4973 1423 9322 10593 5111  
+9321 2350 4973 1424 5110 4198 2360  
+9322 1423 4973 4972 2360 5283 9320  
+9323 2340 3674 5688 4176 10725 6810  
+9324 4976 4974 1410 4157 9327 4200  
+9325 1243 2351 4975 10727 4465 6819  
+9326 2351 4976 5689 9328 10727 4200  
+9327 4976 1410 5544 10440 4202 9324  
+9328 4976 2352 5689 2329 9326 4202  
+9329 4040 4977 637 1800 7511 1525  
+9330 4977 1001 4041 1524 7514 1525  
+9331 4978 1139 5525 10404 10403 4211  
+9332 637 2355 4978 4209 6679 1800  
+9333 1252 1251 4979 9334 2019 2021  
+9334 1250 4979 1251 9333 2023 170  
+9335 4195 4980 1250 4214 2032 7806  
+9336 4197 4980 1258 7806 2027 2015  
+9337 4099 4981 646 4230 7627 118  
+9338 2367 4981 1432 2231 4232 4231  
+9339 1434 4982 1432 4234 2231 2379  
+9340 4983 4982 544 2486 9341 4235  
+9341 4294 4983 544 9340 2376 754  
+9342 4296 4983 1492 754 8006 2494  
+9343 1433 2369 4984 9344 2374 4233  
+9344 2367 4984 2369 9343 4236 4237  
+9345 5649 4985 898 6904 4241 10646  
+9346 4986 4985 2372 10646 9350 9347  
+9347 4985 4986 2371 1009 1320 9346  
+9348 2372 4988 4987 4245 9350 9351  
+9349 562 4987 2762 809 7210 5006  
+9350 2372 4987 4986 5006 9346 9348  
+9351 5649 4988 2372 9348 10646 2741  
+9352 1606 4988 548 2741 8197 4242  
+9353 1623 4857 4989 9093 1136 9094  
+9354 3822 4989 712 8224 7096 2753  
+9355 4990 1624 4413 1135 8226 4247  
+9356 2375 4990 2374 2754 4246 1318  
+9357 2380 4991 679 3683 4259 4258  
+9358 1669 4991 2379 4258 8303 4256  
+9359 1977 4992 743 862 1011 978  
+9360 126 4992 2388 978 846 4275  
+9361 4357 4993 472 1684 2600 3540  
+9362 2019 2390 4993 2762 8119 3539  
+9363 4656 4994 493 8738 3308 8698  
+9364 4669 4994 1902 8698 8725 3310  
+9365 761 2398 4995 9366 7174 4295  
+9366 860 4995 2398 9365 4286 4294  
+9367 2175 4996 1291 4306 1754 950  
+9368 1626 4083 5690 7593 10729 2757  
+9369 3751 4997 689 4312 6961 4314  
+9370 3390 4997 2408 852 6254 3284  
+9371 3792 4998 2410 2173 7041 4319  
+9372 2430 4998 2411 4319 4358 2655  
+9373 2416 4999 2414 4325 4327 2652  
+9374 830 4999 2418 2652 1579 4335  
+9375 2430 5000 1572 4337 4359 4358  
+9376 830 5000 2411 4358 7040 1579  
+9377 2424 5001 2420 4339 1184 4346  
+9378 2426 5001 2421 4346 4341 4350  
+9379 2419 5002 1572 9395 4337 2659  
+9380 5003 5002 2420 2659 4339 9382  
+9381 5004 5003 1028 2661 9383 4342  
+9382 5002 5003 2422 4342 2653 9380  
+9383 5004 1028 5007 9390 4344 9381  
+9384 842 5004 2423 4344 9388 2656  
+9385 5006 5005 1574 2657 9387 4345  
+9386 5691 2423 2425 9389 183 10731  
+9387 4379 5006 1574 9385 8161 1312  
+9388 842 2423 5006 4345 10633 9384  
+9389 5007 2425 2423 9386 4344 9391  
+9390 1028 2426 5007 4348 9383 4350  
+9391 5007 5008 2425 1304 9389 4348  
+9392 3221 5008 2426 4348 5917 5916  
+9393 2260 2266 5009 9394 4357 4018  
+9394 1426 5009 2266 9393 639 1183  
+9395 5002 5010 1572 4360 9379 2653  
+9396 842 5010 2422 2653 2656 4343  
+9397 2415 1913 5011 9398 4363 4326  
+9398 2428 5011 1913 9397 4355 4328  
+9399 3752 5012 2408 6254 852 6963  
+9400 5014 5012 688 6963 9403 4364  
+9401 5014 5013 2433 3282 4364 9404  
+9402 5013 2434 5126 403 9617 9404  
+9403 3064 5014 688 9400 10202 5606  
+9404 5013 5014 2434 5606 9402 9401  
+9405 661 5015 534 7725 1602 2686  
+9406 4390 5015 2442 2686 4381 8180  
+9407 4347 5016 1535 4386 8100 1001  
+9408 2443 5016 530 8099 4384 2578  
+9409 538 5017 1890 4387 3285 3286  
+9410 2444 5017 2445 9678 788 4385  
+9411 3992 5018 951 983 7418 529  
+9412 5019 5018 461 529 -1 9414  
+9413 2453 5020 1140 180 3446 4403  
+9414 5018 5019 2446 445 406 9412  
+9415 722 5020 1972 4403 8756 3345  
+9416 4589 5021 299 4397 -1 8570  
+9417 5021 1836 5022 9418 3179 8570  
+9418 4319 5022 1836 9417 2523 8046  
+9419 5023 5022 690 8046 9420 4399  
+9420 3742 5023 690 9419 4401 6943  
+9421 2453 5023 2452 6943 4392 158  
+9422 3198 5024 2452 4392 4402 1760  
+9423 1972 5024 642 1760 9750 2528  
+9424 5025 518 3915 1170 7217 10076  
+9425 4174 5025 1110 7216 7765 7764  
+9426 5027 5026 1522 2545 9428 4427  
+9427 114 5026 2465 4427 -1 2553  
+9428 5027 1522 5635 10618 8074 9426  
+9429 115 2465 5027 4427 795 -1  
+9430 4393 5028 1593 1905 8187 2694  
+9431 1193 5028 471 2694 -1 2695  
+9432 4491 5031 900 4431 8377 581  
+9433 2467 1193 5029 -1 4426 1903  
+9434 5692 5030 2467 977 10732 7154  
+9435 5031 1710 4488 606 8372 581  
+9436 5361 5032 484 2924 10078 5884  
+9437 3204 5611 5033 10570 9439 10571  
+9438 2468 5032 5033 9439 1324 4432  
+9439 3204 5033 5032 9438 5884 9437  
+9440 4105 5034 107 3264 3244 7638  
+9441 1869 4637 5035 1913 897 8662  
+9442 1879 3808 5693 7070 10735 3263  
+9443 2476 5034 5035 897 4448 3264  
+9444 3420 5036 1732 3368 6313 2971  
+9445 1931 5036 948 2971 2502 2050  
+9446 4820 5037 844 4478 3905 9025  
+9447 2724 5037 2203 9025 4931 2675  
+9448 2491 2492 5038 9449 3724 4476  
+9449 2493 5038 2492 9448 4479 2674  
+9450 3228 5039 2195 9763 5931 5444  
+9451 5040 5039 1797 5444 9453 9452  
+9452 5039 5040 2497 6647 3888 9451  
+9453 4868 5040 1797 9451 9116 4490  
+9454 2503 5041 2201 5925 1357 4500  
+9455 5042 5041 1050 9463 9456 4492  
+9456 5043 5042 1050 9455 9458 4494  
+9457 5160 5042 2500 4494 1211 9685  
+9458 5043 1050 5045 9463 9462 9456  
+9459 5443 2501 3385 561 6244 1621  
+9460 2851 5044 516 4499 6258 5180  
+9461 5551 5044 1049 5180 10453 1623  
+9462 5043 5045 2502 1626 4496 9458  
+9463 5041 5045 1050 9458 9455 4500  
+9464 2496 5046 2162 4513 1212 4487  
+9465 505 2508 5046 4509 4487 3822  
+9466 2519 5047 1037 636 3823 4533  
+9467 2162 2509 5047 1597 4533 4513  
+9468 2820 5048 2511 4517 4516 1594  
+9469 1155 2512 5048 4517 1594 1832  
+9470 2512 2513 5049 9471 4519 1832  
+9471 2514 5049 2513 9470 4520 1089  
+9472 5050 506 2828 5135 267 4522  
+9473 5051 5050 1713 5139 9474 4523  
+9474 5694 5051 1713 9473 10736 5753  
+9475 5051 602 5695 10738 4572 5755  
+9476 1582 5052 2494 4527 1451 4483  
+9477 3205 5052 2517 4483 4529 5885  
+9478 3810 5053 964 4531 7072 5886  
+9479 2516 5053 2517 4529 1452 4528  
+9480 4153 5054 110 953 -1 7728  
+9481 1197 2522 5054 4536 9982 4538  
+9482 2955 5055 2522 909 4538 4539  
+9483 5055 2523 5348 10052 4541 4539  
+9484 5057 1878 3044 5620 9486 962  
+9485 5056 573 5348 10053 10052 9487  
+9486 3117 5057 3044 9484 5566 2548  
+9487 573 5056 5057 962 2548 9485  
+9488 3074 5058 665 5389 5627 5626  
+9489 5056 5058 2524 5626 10 1402  
+9490 2530 5059 474 4039 4555 4043  
+9491 2531 2272 5059 4039 4043 4557  
+9492 187 5061 188 573 -1 681  
+9493 2542 189 5060 -1 658 562  
+9494 2956 5061 633 6703 5390 4578  
+9495 2956 5062 520 738 5393 5390  
+9496 5062 633 3620 6703 6702 5390  
+9497 180 5063 181 4598 -1 269  
+9498 5578 5063 631 269 4599 10505  
+9499 27 5064 28 4615 -1 372  
+9500 680 5064 1830 372 396 3167  
+9501 680 5065 2560 4618 3167 4613  
+9502 2562 5065 2563 4613 378 69  
+9503 2783 5066 555 1180 7227 2120  
+9504 1304 2563 5066 4621 9748 378  
+9505 147 2575 5067 9508 7090 -1  
+9506 2575 5069 5068 9510 9508 -1  
+9507 2574 5068 3511 1546 6489 6493  
+9508 2575 5068 5067 6493 9505 9506  
+9509 2962 5070 2576 6494 4643 938  
+9510 5068 5069 2576 9867 1546 9506  
+9511 5074 5070 2578 938 9518 682  
+9512 5073 2578 2963 5405 5404 4656  
+9513 5072 5071 1123 9517 9514 4649  
+9514 5079 5072 1123 9513 9526 1875  
+9515 5072 2583 5076 3796 9522 1875  
+9516 5114 2963 2582 5403 9593 5404  
+9517 1123 5071 5073 4656 9592 9513  
+9518 5071 5074 2578 9511 4656 4648  
+9519 5074 2579 5075 9520 4650 4648  
+9520 5076 5075 2579 9519 9522 6445  
+9521 3449 5075 919 6445 6371 6370  
+9522 5076 2579 5072 4649 9515 9520  
+9523 919 5076 3487 3796 6443 6445  
+9524 5074 5077 1013 6491 682 1549  
+9525 3506 5077 2580 1549 6484 4652  
+9526 2605 5079 1123 9514 4657 4697  
+9527 2582 2577 5078 -1 9585 9871  
+9528 2586 5079 2584 4697 4660 4663  
+9529 3487 5080 2149 3798 4658 6446  
+9530 2583 2586 5080 4655 6446 4663  
+9531 5103 5081 2584 4660 4696 4659  
+9532 5102 5081 2599 4659 9572 9571  
+9533 804 5082 2586 4655 4685 1768  
+9534 5083 5082 2587 1768 9535 1132  
+9535 5084 5083 2587 9534 4669 4666  
+9536 3595 5083 2588 4666 4665 6444  
+9537 5087 5085 5084 9540 4669 9544  
+9538 5084 1698 5086 9541 6386 9540  
+9539 5085 2589 5090 9549 10741 9544  
+9540 1698 5084 5085 9537 3794 9538  
+9541 3594 5086 1698 9538 6387 4692  
+9542 2588 5086 3457 4692 10310 6386  
+9543 804 5102 5088 1876 9546 9571  
+9544 5085 5087 2589 9545 9539 9537  
+9545 2589 5087 5088 9546 4682 9544  
+9546 804 5088 5087 9545 1362 9543  
+9547 5089 2598 5101 9570 9569 4664  
+9548 5089 1697 5090 9551 9549 9566  
+9549 5089 5090 2589 9539 4682 9548  
+9550 1697 5100 5697 4674 9551 9552  
+9551 5697 5090 1697 9548 9550 10742  
+9552 1697 5099 5100 9565 9550 9566  
+9553 3621 5093 974 9559 7696 4675  
+9554 5095 5092 2593 9567 9558 9556  
+9555 5698 2594 5094 -1 10744 10743  
+9556 5092 5095 470 1468 -1 9554  
+9557 5093 5698 2595 4678 4676 10743  
+9558 5098 5095 2593 9554 1874 9564  
+9559 5093 5096 974 4694 9553 4676  
+9560 5098 5096 2595 4676 9564 9563  
+9561 2603 5097 1177 4683 4679 479  
+9562 5098 5097 2596 479 9563 4677  
+9563 5096 5098 2596 9562 4680 9560  
+9564 5098 2595 5095 4678 9558 9560  
+9565 5100 5099 2593 1874 9567 9552  
+9566 5089 5099 1697 9552 9548 4684  
+9567 5100 2593 5092 9554 2900 9565  
+9568 5100 2592 5091 -1 4674 2900  
+9569 5089 5101 2597 4672 4684 9547  
+9570 5105 5101 2598 9547 9577 1767  
+9571 5081 5102 804 9543 4685 9532  
+9572 5105 5102 2599 9532 9578 9577  
+9573 5104 2584 2605 4697 9575 4696  
+9574 5106 5103 1179 9576 9580 9579  
+9575 5104 2605 5115 4698 9595 9573  
+9576 1179 5103 5104 4696 4662 9574  
+9577 5102 5105 2598 9570 1876 9572  
+9578 5105 2599 5106 9579 4686 9572  
+9579 5103 5106 2599 9578 4659 9574  
+9580 5108 5106 1179 9574 9583 4687  
+9581 2603 5107 1181 7704 7701 4679  
+9582 5105 5107 1177 4679 1767 1880  
+9583 5113 5108 1179 9580 4689 9589  
+9584 4143 5108 2601 9589 7708 7706  
+9585 5078 5111 2582 9594 9527 4646  
+9586 5113 5109 2601 4661 9589 1877  
+9587 5364 5110 2602 10333 10085 10084  
+9588 5112 5111 145 4646 -1 9590  
+9589 5113 2601 5108 9584 9583 9586  
+9590 5111 5112 2604 9591 1470 9588  
+9591 5112 5113 2604 4689 9590 4695  
+9592 5073 5114 1123 4657 9517 5404  
+9593 5115 5114 2582 9516 9594 4698  
+9594 5111 5115 2582 9593 9585 1470  
+9595 5104 5115 2604 1470 4662 9575  
+9596 12 2606 5116 9597 102 1163  
+9597 5116 2606 1025 1572 4700 9596  
+9598 4767 5117 1333 4735 8918 8916  
+9599 2625 5117 2612 2177 4736 4738  
+9600 877 5118 2622 4732 4729 4731  
+9601 2635 5118 2626 4731 4739 3635  
+9602 1337 2633 5119 9603 6575 2182  
+9603 2636 5119 2633 9602 4754 4730  
+9604 4511 5120 1737 4762 2980 8417  
+9605 2836 5120 916 8417 2981 5151  
+9606 1748 2639 5121 9607 3003 4766  
+9607 374 5121 2639 9606 -1 3002  
+9608 3036 5122 1780 8514 5550 5524  
+9609 5123 5122 1458 5524 9611 9610  
+9610 5122 5123 2640 9691 3067 9609  
+9611 5124 5123 1458 9609 9612 3021  
+9612 3804 5124 1458 9611 4768 5522  
+9613 2964 5124 2642 5522 5406 3040  
+9614 2646 5125 1476 3492 4778 4775  
+9615 1728 5125 2644 4775 4772 4774  
+9616 969 2649 5126 9617 5605 1461  
+9617 5013 5126 2649 9616 4784 9402  
+9618 2675 5127 1086 4806 1696 4837  
+9619 2198 2660 5127 4806 4837 3893  
+9620 5128 1087 5131 9627 4808 9126  
+9621 3207 5128 2661 4808 1695 5890  
+9622 2671 5129 1093 1707 9646 2206  
+9623 2661 5129 1347 2206 4809 1358  
+9624 5134 2662 2667 4810 4821 4811  
+9625 2668 5130 2663 9633 10374 1708  
+9626 5131 2662 2661 1358 4808 4810  
+9627 5132 5131 1087 9620 9628 4820  
+9628 4873 5132 1087 9627 9126 9125  
+9629 5132 2197 3757 3653 327 9125  
+9630 5133 2199 5440 10236 10235 6966  
+9631 2667 5132 5133 327 4821 4820  
+9632 3559 5134 490 3099 6585 4812  
+9633 5130 5134 2663 4812 9625 4811  
+9634 5136 5135 1866 4491 4824 3597  
+9635 5135 2669 5138 9640 3238 3597  
+9636 4759 5136 2190 9115 8903 8902  
+9637 5137 5136 1062 8902 9638 4825  
+9638 4748 5137 1062 9637 4830 8881  
+9639 2672 2669 5137 4825 8881 9640  
+9640 2672 5138 2669 9635 9639 1837  
+9641 5142 5138 1158 9644 9649 9648  
+9642 5135 5139 2668 4827 4822 4823  
+9643 5139 2670 5141 9647 4829 4823  
+9644 5138 5140 1158 8324 9641 1837  
+9645 4773 5140 2672 1837 8929 8931  
+9646 5141 2671 1093 9622 4829 9650  
+9647 5142 5141 2670 9643 9648 4834  
+9648 5138 5142 2670 9647 3238 9641  
+9649 5655 5142 1158 9641 4826 10659  
+9650 5141 5143 2671 9795 9646 1646  
+9651 4461 5143 2674 1646 4835 8318  
+9652 2655 5144 1091 4842 4796 3665  
+9653 4787 5144 2082 3665 8959 3664  
+9654 2677 5145 716 8941 1704 3659  
+9655 4783 5145 2678 3659 4843 3644  
+9656 2493 5146 2111 3722 2674 4481  
+9657 541 2681 5146 3722 4481 10081  
+9658 3361 5147 663 10080 524 6196  
+9659 4812 5147 1224 6196 9009 1965  
+9660 4097 5148 2126 9041 1773 6533  
+9661 2968 5148 535 6533 9876 4850  
+9662 572 5149 1435 4852 2383 1631  
+9663 2683 5149 2684 1631 4855 1533  
+9664 5150 1437 4270 7954 7953 7940  
+9665 572 5150 2686 1780 4856 4858  
+9666 3783 5151 876 673 -1 7024  
+9667 5152 5151 1594 8185 2698 9669  
+9668 2690 2691 5152 9669 8189 4865  
+9669 5151 5152 2691 9668 4868 9667  
+9670 2696 5153 2691 4868 4870 4876  
+9671 2692 876 5153 673 4876 -1  
+9672 3500 5154 887 2137 6472 4869  
+9673 2695 5154 2694 10343 4867 2696  
+9674 4356 5155 1544 4899 8118 2593  
+9675 2312 5155 575 2593 4122 2592  
+9676 899 2711 5156 9677 2737 4905  
+9677 4404 5156 2711 9676 4907 8207  
+9678 5017 5157 2445 4911 9410 3286  
+9679 2745 5157 538 3286 4973 4388  
+9680 4819 5158 1152 4495 1360 9020  
+9681 2113 2725 5158 4495 9020 4932  
+9682 4817 5159 2113 4932 9019 3728  
+9683 5159 2115 4821 3398 9027 3728  
+9684 483 2499 5160 9685 4933 5359  
+9685 5160 2499 5042 4492 9457 9684  
+9686 5161 505 2496 4487 3904 4936  
+9687 2728 5161 2203 4931 4937 4939  
+9688 2067 2732 5162 9689 3469 5909  
+9689 2735 5162 2732 9688 3630 4953  
+9690 2750 5163 1767 4957 4767 3038  
+9691 5163 2640 5123 9610 4765 3038  
+9692 2739 5164 2052 4956 9873 3606  
+9693 2746 5164 2738 9694 4974 3041  
+9694 5164 5165 2738 4980 9693 3606  
+9695 5166 5165 2739 3606 9696 3881  
+9696 2971 5166 2739 9695 3601 4960  
+9697 5167 5166 2740 4960 10746 5448  
+9698 3227 5699 2740 10746 4962 3599  
+9699 1096 5167 2985 4963 9119 5448  
+9700 4371 5168 1287 4969 8146 2090  
+9701 707 5168 1851 2090 3210 3207  
+9702 2936 5169 2747 1711 4976 5350  
+9703 3799 5170 1095 9705 7053 3039  
+9704 2748 5170 1766 7055 4982 4977  
+9705 1095 5170 5169 4977 5350 9703  
+9706 873 2750 5171 9707 3036 10670  
+9707 2748 5171 2750 9706 4767 4982  
+9708 1055 5172 1725 4987 2400 2956  
+9709 2752 5172 2753 2956 4988 4989  
+9710 5173 1649 4438 2406 8276 8278  
+9711 2756 1650 5173 4994 2248 520  
+9712 5174 748 5434 6214 6212 5007  
+9713 5175 5174 1827 6213 9714 1919  
+9714 5175 1827 4583 3160 3161 9713  
+9715 512 2763 5175 1919 4776 5008  
+9716 3707 5177 383 1409 702 6875  
+9717 5179 5176 2769 988 9722 9721  
+9718 5178 5177 943 6875 9720 9719  
+9719 5177 5178 2769 5020 988 9718  
+9720 5556 5178 943 9718 10463 5019  
+9721 5176 5179 384 5024 -1 9717  
+9722 5180 5179 2769 9717 5020 9724  
+9723 5180 2770 4878 3865 9133 1473  
+9724 5179 5180 2771 5022 662 9722  
+9725 1131 5181 453 5027 -1 275  
+9726 2774 406 5181 5027 275 278  
+9727 255 5182 256 1587 -1 1257  
+9728 1032 5182 2775 1257 1817 5029  
+9729 5183 900 2468 4431 5034 1150  
+9730 2777 2778 5183 1150 7049 5033  
+9731 2781 5184 754 9741 5042 5041  
+9732 5185 5184 2778 5041 5035 9734  
+9733 5571 5185 813 5035 5037 10493  
+9734 5184 5185 2779 10493 1149 9732  
+9735 3143 5188 1525 1045 5763 9739  
+9736 2789 754 5186 5056 9738 6255  
+9737 2831 5187 578 9740 1044 5141  
+9738 2789 5186 5187 2558 5141 9736  
+9739 5188 3143 760 955 5762 9735  
+9740 578 5187 5188 1045 1191 9737  
+9741 5184 5189 754 5056 9731 1149  
+9742 5190 5189 2779 1149 9743 5039  
+9743 5571 5190 2779 9742 10493 10492  
+9744 586 1248 5700 714 10748 705  
+9745 5192 496 3224 5923 9747 381  
+9746 3894 5191 2783 5922 7230 5046  
+9747 3224 1304 5192 9748 9745 4619  
+9748 5066 5192 1304 9747 9504 2120  
+9749 4685 5193 1920 5051 8757 1802  
+9750 642 5193 1972 1802 9423 3447  
+9751 4388 5194 1699 2904 1900 8176  
+9752 5195 5194 980 8176 9753 5054  
+9753 4678 5195 980 9752 2530 8742  
+9754 4391 5195 1591 8742 8183 472  
+9755 2026 5196 2027 5078 1584 3554  
+9756 2800 5196 2801 3554 5080 5081  
+9757 3384 5197 1796 9765 3669 6242  
+9758 3767 5197 2084 6242 6992 3651  
+9759 5198 1089 3031 5083 5541 9851  
+9760 5199 5198 2802 9766 5082 9762  
+9761 2927 5199 1770 6983 5084 5333  
+9762 5198 5199 2803 5333 3044 9760  
+9763 5039 5200 2195 3889 9450 3888  
+9764 5200 2497 5441 10238 10237 3888  
+9765 5197 5201 1796 3100 9757 3046  
+9766 5198 5201 2802 3046 9760 5087  
+9767 4422 5202 1391 8995 8243 2781  
+9768 5203 1637 3324 6123 9769 2775  
+9769 1634 5203 3324 9768 6120 6122  
+9770 2805 5202 5203 2775 5089 5088  
+9771 3316 5204 1634 6122 6107 6106  
+9772 4804 5204 2097 6106 3693 8993  
+9773 2812 5205 1537 1457 2583 5103  
+9774 2807 5205 1907 5103 5093 3318  
+9775 507 2809 5206 9776 8580 9777  
+9776 2808 5206 2809 9775 5097 3877  
+9777 507 5207 2809 2157 9775 5096  
+9778 1536 5207 2383 5096 4261 2581  
+9779 4840 5208 1354 5099 3809 9060  
+9780 5208 2155 5637 10623 10622 9060  
+9781 4672 5209 967 1870 8730 3319  
+9782 2812 5209 1907 3319 5103 2585  
+9783 1850 2818 5210 9784 1757 25  
+9784 2817 5210 2818 9783 5114 5115  
+9785 1628 2819 5211 9786 2766 5117  
+9786 1629 5211 2819 9785 4279 5116  
+9787 4206 5212 1085 1363 7827 1493  
+9788 2834 1035 5212 5146 1493 1088  
+9789 3942 5213 847 4609 7323 2551  
+9790 5213 1523 4331 8070 8069 2551  
+9791 5214 1521 5330 1218 10021 5148  
+9792 3042 5214 1270 5711 5562 5149  
+9793 2853 5215 1684 1836 5185 5184  
+9794 2842 5215 654 5184 5163 2874  
+9795 5216 2671 5143 9650 2878 5167  
+9796 2846 5216 2844 4828 5166 5170  
+9797 5217 2855 5460 5012 10276 6497  
+9798 3769 5217 835 6335 5188 366  
+9799 2446 2859 5218 9800 406 5197  
+9800 5218 2859 564 426 5196 9799  
+9801 2863 5219 2860 1680 987 5198  
+9802 2862 5219 2861 5198 6797 367  
+9803 3911 5220 589 9813 5211 7262  
+9804 5221 5220 2866 7262 9805 5210  
+9805 3673 5221 2866 9804 1809 6807  
+9806 5222 5221 497 6807 9808 9807  
+9807 5221 5222 2867 5217 5210 9806  
+9808 5223 5222 497 9806 9809 5214  
+9809 3667 5223 497 9808 2834 6796  
+9810 2872 5223 1664 6796 5222 2829  
+9811 5224 790 1655 5679 1248 5218  
+9812 3952 5224 862 6228 1160 7342  
+9813 5220 5225 589 1247 9803 1104  
+9814 2869 5225 2867 1104 5217 2820  
+9815 2874 190 5226 -1 9816 7440  
+9816 5226 5227 2874 4579 9815 5226  
+9817 2958 5228 753 5227 1976 5395  
+9818 5228 1230 4171 380 7759 5395  
+9819 4198 5229 1257 5232 2030 7812  
+9820 5229 1261 4199 2039 7814 7812  
+9821 1556 5230 2366 1787 858 2621  
+9822 5230 2881 1133 3171 5241 2621  
+9823 2883 1646 5231 9824 2799 1228  
+9824 3113 5231 1646 9823 2798 2410  
+9825 3089 5232 1659 2412 3119 5654  
+9826 2884 5232 1451 5654 5247 2825  
+9827 2887 5233 852 5246 5252 5248  
+9828 5232 5233 2885 5248 2412 2825  
+9829 3089 5234 1451 5250 5654 5656  
+9830 5235 5234 1806 5656 9831 3118  
+9831 5235 1806 3745 6949 2411 9830  
+9832 1450 2886 5235 3118 3116 5251  
+9833 3112 5236 852 5252 5701 5254  
+9834 5237 5236 2888 5254 9835 1225  
+9835 5237 2888 5369 10094 2121 9834  
+9836 2887 5237 496 5923 5690 1225  
+9837 4481 5238 554 8051 2526 8358  
+9838 3201 5238 1702 8358 5263 5878  
+9839 5239 625 5436 10227 2506 5266  
+9840 2895 5239 1498 1123 6945 5268  
+9841 1427 5240 2895 5278 6944 5267  
+9842 2900 5240 2901 5267 5281 2357  
+9843 2929 5241 2912 3045 5303 5337  
+9844 2924 5241 2913 5337 5327 5326  
+9845 2919 5242 872 1269 5317 2385  
+9846 1129 5242 2920 2385 4859 5319  
+9847 1454 5243 2179 813 5295 3857  
+9848 5243 2922 872 5309 5322 3857  
+9849 3762 5244 1770 5084 6993 3465  
+9850 2926 5244 2121 3465 5331 3742  
+9851 5198 5245 1089 5346 9759 3044  
+9852 3395 5245 2803 3044 6264 5085  
+9853 2936 5246 2933 3884 5344 5345  
+9854 1089 5246 2935 5345 5538 5349  
+9855 4604 5247 1850 5352 3205 8597  
+9856 1118 2937 5247 5352 8597 9858  
+9857 1924 2937 5248 9858 8759 3206  
+9858 5248 2937 1118 9856 5353 9857  
+9859 3322 5249 1633 5371 3533 6117  
+9860 3226 5249 2016 6117 3510 5927  
+9861 4665 5250 1885 5374 8716 1464  
+9862 508 5250 1905 1464 4790 3316  
+9863 3859 5251 751 6845 7162 877  
+9864 5251 1222 4165 1959 7749 877  
+9865 1230 5252 1472 8122 380 2455  
+9866 1231 5252 2958 2455 1978 5394  
+9867 5069 5253 2576 4643 9510 4641  
+9868 5254 5253 146 4641 -1 9870  
+9869 5254 5255 2962 4647 9870 5402  
+9870 5253 5254 2962 9869 4643 9868  
+9871 2582 5255 2577 5402 9527 5403  
+9872 2971 5256 2050 5407 5420 3601  
+9873 2052 5256 2739 3601 9692 4958  
+9874 3115 5257 2964 5408 5406 5707  
+9875 2966 5257 477 5707 5409 5411  
+9876 535 5258 2968 5418 9661 287  
+9877 5258 2969 859 10467 5419 287  
+9878 2971 2972 5259 9879 1714 5420  
+9879 2973 5259 2972 9878 5423 1770  
+9880 2975 5260 2973 5425 5424 3586  
+9881 3026 5260 2043 3586 5426 5530  
+9882 2986 5261 2975 5430 5428 1645  
+9883 2987 5261 2054 1645 5431 5453  
+9884 4868 5262 2191 3882 3880 9116  
+9885 1797 2983 5262 5442 9116 5930  
+9886 4743 5263 1581 5463 8870 708  
+9887 5263 2037 4744 8872 1642 708  
+9888 2734 5264 878 1397 4951 4943  
+9889 2053 5264 2730 4943 10708 4942  
+9890 2999 5265 2060 5506 5476 5471  
+9891 2054 5265 2995 5469 5466 5468  
+9892 3011 5266 2062 5474 5501 3625  
+9893 5267 5266 2063 9922 9894 3025  
+9894 3268 5267 2063 9893 3519 6011  
+9895 1652 2998 5267 3025 6011 10765  
+9896 477 3002 5268 9897 5409 5482  
+9897 2061 5268 3002 9896 3624 5480  
+9898 3008 5269 3002 5483 5482 2684  
+9899 1758 3003 5269 5483 2684 5484  
+9900 3032 5270 3004 5488 5489 5486  
+9901 5272 5270 3005 5486 9904 3024  
+9902 5273 5271 1345 5548 9906 5490  
+9903 5272 5271 3006 5490 9905 9904  
+9904 5271 5272 3005 9901 3074 9903  
+9905 3027 5272 3006 9903 5491 3521  
+9906 3013 5273 1345 9902 5504 5492  
+9907 5274 5273 3007 5492 9908 3026  
+9908 3010 5274 3007 9907 5493 3517  
+9909 5274 1760 5285 9931 9930 3517  
+9910 3115 5275 3008 5495 5494 4770  
+9911 1757 3009 5275 5495 4770 5496  
+9912 3401 5276 3010 10197 5493 6275  
+9913 3229 5276 1761 6275 5932 5502  
+9914 3035 5277 1345 5504 5548 5546  
+9915 5278 1783 4533 8473 9916 3073  
+9916 1776 5278 4533 9915 5938 8460  
+9917 3013 5277 5278 3073 8460 5504  
+9918 1124 5279 2986 5451 5428 5450  
+9919 3014 5279 3015 5450 5509 3600  
+9920 4473 5280 502 8914 8341 8339  
+9921 3025 5280 1690 8339 5528 5517  
+9922 5281 2063 5266 9893 3625 5518  
+9923 5282 5281 1588 5500 5519 9925  
+9924 3004 5282 3003 5519 5484 2810  
+9925 5281 5282 3020 2810 5518 9923  
+9926 3018 5283 1031 9929 2179 2885  
+9927 3019 3025 5283 394 2885 5517  
+9928 3116 5284 1689 5529 5709 5512  
+9929 5283 5284 1031 1583 9926 394  
+9930 5274 5285 3006 5491 3026 9909  
+9931 5448 5285 1760 9909 10251 6027  
+9932 4472 5286 1690 5534 2898 8337  
+9933 609 5286 1695 8337 2995 2896  
+9934 1784 3032 5287 9935 5545 5543  
+9935 1758 5287 3032 9934 5489 5542  
+9936 2557 3042 5288 1401 5581 2056  
+9937 5289 3042 3043 5562 9938 1401  
+9938 5291 5289 3043 9937 5565 9943  
+9939 5293 5289 3045 9943 9947 9946  
+9940 3117 5290 1270 5564 5711 5566  
+9941 5309 3044 3071 5620 5610 3256  
+9942 3046 5291 939 9978 9958 5568  
+9943 5289 5291 3045 5568 9939 9938  
+9944 5292 932 5295 9950 5572 7066  
+9945 3045 3046 5292 1068 5569 5568  
+9946 5289 5293 567 1545 1388 9939  
+9947 3045 3047 5293 1545 9939 5569  
+9948 3050 5294 1011 1387 5578 5573  
+9949 5295 5294 3047 5573 5572 9951  
+9950 5296 5295 932 9944 5574 9952  
+9951 5294 5295 3048 9952 1387 9949  
+9952 5296 3048 5295 9951 9950 5575  
+9953 5296 3049 5705 1427 9971 5574  
+9954 3941 5297 839 8566 4608 7321  
+9955 2557 3051 5297 1202 7321 5581  
+9956 5298 772 3057 1067 5571 5585  
+9957 5299 5298 3046 7067 9958 5583  
+9958 3046 939 5299 9959 9957 9942  
+9959 3066 5299 939 9958 5567 5570  
+9960 5307 1876 3069 3260 5617 3258  
+9961 5301 5300 3053 9975 5586 9962  
+9962 5300 5301 3052 5582 1746 9961  
+9963 5303 3053 3054 6840 9966 5586  
+9964 3063 5302 3054 9966 3259 5604  
+9965 1229 3055 5302 334 5604 5591  
+9966 5302 5303 3054 9963 9964 334  
+9967 3057 5303 3055 334 5589 1067  
+9968 3614 5304 771 1158 5596 6692  
+9969 3807 5304 3059 6692 7069 5577  
+9970 953 5524 5306 10402 6682 629  
+9971 499 5296 5705 9953 10758 1252  
+9972 5306 3609 5525 10403 6681 10402  
+9973 499 5305 5306 6682 1799 10758  
+9974 5550 5307 1877 5617 10452 10451  
+9975 5300 5307 3053 10451 9961 3258  
+9976 5056 5308 1878 5618 962 10  
+9977 3072 5308 2524 10 5622 5619  
+9978 5291 5309 939 5610 9942 5565  
+9979 5290 5309 3043 5565 5564 3256  
+9980 3080 5310 1199 5625 3250 5638  
+9981 5310 1872 4633 8654 3249 5638  
+9982 5311 1197 5054 9481 7728 5631  
+9983 109 3078 5311 578 917 5634  
+9984 3808 5312 1198 5635 7071 3263  
+9985 1879 4637 5706 8663 10760 1913  
+9986 1657 5313 2871 10000 5215 5220  
+9987 5319 5313 3082 5220 9998 5670  
+9988 3086 5314 1660 2001 5650 5653  
+9989 481 5314 3091 5653 9996 5660  
+9990 5315 1662 3398 6270 6269 1673  
+9991 5316 5315 3093 10003 9993 9992  
+9992 5315 5316 3092 5664 1673 9991  
+9993 3105 5316 3093 9991 2831 4180  
+9994 3745 5317 1805 5666 6948 6946  
+9995 5318 5317 481 6946 9996 3117  
+9996 3091 5318 481 9995 9989 2833  
+9997 3092 3094 5318 3117 2833 5662  
+9998 762 5319 3082 9987 2826 5641  
+9999 3097 5319 3096 5641 5669 5048  
+10000 5320 2871 5313 9986 5642 1105  
+10001 1655 5320 3101 5221 5678 5679  
+10002 3681 5321 1242 1810 6824 5663  
+10003 5315 5321 3093 10443 9991 5682  
+10004 1144 3103 5322 10005 5647 10008  
+10005 5323 5322 3103 10004 10007 10006  
+10006 5322 5323 3102 5681 2830 10005  
+10007 3107 5323 3103 10005 1953 5692  
+10008 1144 5324 3103 10010 10004 866  
+10009 3662 5324 3104 866 6786 6771  
+10010 5324 5325 3103 1953 10008 1951  
+10011 5538 5325 1218 1951 5684 10428  
+10012 3107 3108 5326 10013 5692 4142  
+10013 3681 5326 3108 10012 4181 6824  
+10014 5327 3105 5545 5687 6820 5696  
+10015 5328 5327 1243 6820 5688 10017  
+10016 1801 5328 2485 5688 4461 4464  
+10017 5327 5328 3109 4464 5696 10015  
+10018 3148 5329 634 8268 5773 5702  
+10019 3112 3113 5329 2798 5702 5701  
+10020 3577 5330 1520 8068 6618 5712  
+10021 5214 5330 3117 5712 5711 9791  
+10022 1154 3122 5331 5722 6890 186  
+10023 2406 5332 1290 1753 2097 4311  
+10024 473 3125 5332 1753 6888 1138  
+10025 3129 5333 523 1933 5735 5734  
+10026 933 5333 3128 5734 1830 5733  
+10027 5334 523 4158 1393 1941 5735  
+10028 4161 5334 1212 8402 5736 7742  
+10029 715 3133 5336 10031 10747 956  
+10030 3131 58 5335 -1 5737 777  
+10031 1525 5336 3133 10029 5763 5743  
+10032 5694 5337 3139 2931 10737 10736  
+10033 796 3145 5338 10034 2519 10048  
+10034 367 5338 3145 10033 1062 5766  
+10035 2877 5340 565 6201 1403 2041  
+10036 5587 5339 3151 159 10523 10521  
+10037 5587 5340 940 2041 466 10523  
+10038 903 5341 613 1514 1330 40  
+10039 336 5341 1172 40 42 1866  
+10040 336 335 5342 10041 5780 -1  
+10041 708 5342 335 10040 46 51  
+10042 398 5343 729 145 428 549  
+10043 766 5343 3157 549 5785 5790  
+10044 4321 5344 131 1293 -1 8053  
+10045 3694 5344 1511 8053 6849 669  
+10046 3158 3160 5345 10047 5795 2123  
+10047 3574 5345 3160 10046 5794 5796  
+10048 796 5346 3145 108 10033 5767  
+10049 579 5346 3168 5767 83 5811  
+10050 5454 5347 717 3785 10264 10263  
+10051 5455 5347 3424 10263 10266 10265  
+10052 5056 5348 2523 9483 1402 9485  
+10053 573 3180 5348 4541 9485 5836  
+10054 4922 5349 2280 7042 9219 6762  
+10055 5351 5349 961 778 10059 10058  
+10056 3793 5350 978 2658 7043 1444  
+10057 3181 3182 5350 4332 1444 10061  
+10058 5349 5351 3181 5839 4058 10055  
+10059 5353 5351 961 10055 10062 1254  
+10060 3192 5352 504 5842 5854 5840  
+10061 3181 5352 3182 5840 10057 5839  
+10062 5354 5353 961 10059 10064 5841  
+10063 3185 5353 3184 5841 5844 1253  
+10064 3650 5354 961 10062 778 2666  
+10065 3651 1579 5354 6764 2666 6768  
+10066 3668 5355 1079 10431 5202 6798  
+10067 571 5355 2861 6798 5205 5200  
+10068 3998 5356 956 1433 800 7429  
+10069 1682 3189 5356 5851 7429 2871  
+10070 4968 5357 1245 6233 4184 9307  
+10071 4965 5357 2343 9307 9306 4182  
+10072 642 5358 1592 1690 970 2693  
+10073 3199 5358 3198 2693 5871 2527  
+10074 4477 5359 1119 2910 8350 2529  
+10075 1510 5359 2788 2529 8182 5055  
+10076 5025 5360 518 10584 9424 4407  
+10077 2455 3202 5360 5880 4407 4406  
+10078 4235 5361 484 9436 7883 732  
+10079 3203 5361 1368 732 5882 2247  
+10080 5147 5362 663 1450 9658 4849  
+10081 541 5362 2681 4849 9657 4848  
+10082 1178 5697 5091 4674 -1 4668  
+10083 2591 5363 1178 4668 -1 4670  
+10084 5110 5364 2591 5887 -1 9587  
+10085 5365 5364 2602 9587 10086 5888  
+10086 3594 5365 2602 10085 6651 6387  
+10087 5696 5365 1698 6387 3794 10740  
+10088 4427 5366 1641 5903 8258 8254  
+10089 990 3214 5366 5903 8254 1142  
+10090 1027 5367 3196 1576 1208 4349  
+10091 4718 5367 3220 4349 5914 8821  
+10092 1503 3222 5368 10093 8359 5919  
+10093 1645 5368 3222 10092 5062 5918  
+10094 3150 5369 2888 9835 5776 1222  
+10095 5370 5369 599 1222 10096 5255  
+10096 2561 5370 599 10095 4617 274  
+10097 1304 5370 2562 274 378 4619  
+10098 5416 5371 3236 5947 10189 10188  
+10099 4529 5371 3237 10188 3055 8453  
+10100 4566 5372 3240 1552 8527 5955  
+10101 3241 5373 5398 5957 2291 10102  
+10102 3243 5373 3241 10101 5956 1504  
+10103 5373 1390 5387 10130 5958 10106  
+10104 4566 5374 3241 5956 5955 8526  
+10105 3247 5374 1015 8526 5970 5960  
+10106 5373 5375 1390 10112 10103 1504  
+10107 5376 5375 3243 1504 10108 5961  
+10108 3247 5376 3243 10107 5960 5963  
+10109 5377 3245 3255 5985 2285 10111  
+10110 3244 5376 5377 10111 10114 5961  
+10111 3245 5377 5376 10110 5963 10109  
+10112 5375 5378 1390 10130 10106 5962  
+10113 5379 5378 3244 5962 10114 5967  
+10114 5377 5379 3244 10113 10110 5984  
+10115 5379 1387 5389 10134 5976 5984  
+10116 3410 5380 1400 10118 6293 6292  
+10117 3245 3247 5380 5969 1440 5963  
+10118 5380 5381 1400 6286 10116 5969  
+10119 5382 5381 3247 5969 5970 5968  
+10120 4564 5382 1015 5970 8522 3128  
+10121 5383 5382 1811 3128 10122 5971  
+10122 5383 1811 5439 10233 6236 10121  
+10123 1411 3248 5383 5971 6235 10393  
+10124 3251 5384 3246 2290 2309 2283  
+10125 5388 5384 991 2283 10132 5972  
+10126 5386 1547 3259 5992 2293 10129  
+10127 5385 3242 5373 5957 5958 10128  
+10128 3242 5385 5386 10129 10153 10127  
+10129 1547 5386 5385 10128 5973 10126  
+10130 5387 1390 5378 10112 5966 10103  
+10131 3249 5385 5387 5958 2284 5973  
+10132 3299 5388 991 10125 6072 2783  
+10133 5388 3250 5405 10167 2602 2783  
+10134 3254 5389 1387 10115 5982 5978  
+10135 5391 5389 3252 5978 10138 5980  
+10136 5391 5390 3251 2791 5980 10139  
+10137 3299 5390 3253 10139 5977 6072  
+10138 5391 3252 5396 10148 5979 10135  
+10139 5390 5391 3253 10140 10137 10136  
+10140 3253 5391 5392 10141 5981 10139  
+10141 3256 5392 5391 10140 5979 2281  
+10142 4429 5393 1386 5987 2287 8257  
+10143 1642 3253 5393 5981 8257 5977  
+10144 3262 5394 1070 5983 5998 5996  
+10145 5394 1385 5396 10149 10148 5996  
+10146 5377 5395 1387 5982 5984 2285  
+10147 3587 5395 3255 2285 6637 2308  
+10148 5394 5396 3252 10138 1662 10145  
+10149 3260 5396 1385 10145 5995 5994  
+10150 5398 5397 1392 5953 10152 5991  
+10151 3297 5397 3258 5991 6063 6069  
+10152 5372 5398 1392 10150 1552 2291  
+10153 5386 5398 3242 5957 10128 5959  
+10154 5399 1547 5405 10166 6001 5992  
+10155 5400 5399 2098 10165 10156 3697  
+10156 3296 5400 2098 10155 6067 6064  
+10157 5401 5400 800 6066 10158 5993  
+10158 3297 5401 800 10157 5990 6063  
+10159 3258 3259 5401 5993 6063 2293  
+10160 1384 3262 5402 10161 1660 5999  
+10161 1389 5402 3262 10160 7907 2279  
+10162 3264 5403 3250 10167 5974 6003  
+10163 1638 3263 5403 2782 6003 5975  
+10164 5404 1391 4805 8995 2603 6000  
+10165 5399 5404 2098 8997 10155 3698  
+10166 5405 1547 3249 5973 2602 10154  
+10167 5403 5405 3250 10133 10162 2782  
+10168 1759 5406 3020 6009 3627 5487  
+10169 3268 5406 3267 5487 6008 3519  
+10170 2735 5407 2066 6015 4953 10766  
+10171 1652 3270 5407 6015 5475 3633  
+10172 5417 5408 937 6028 6024 10191  
+10173 5409 5408 3275 10191 10174 6022  
+10174 3275 3274 5409 10175 10173 3508  
+10175 2009 5409 3274 10174 2811 3520  
+10176 3403 5410 3276 2199 6029 6280  
+10177 3313 5410 3277 6280 3522 6099  
+10178 5412 5411 1499 8208 10180 6037  
+10179 475 5411 3281 6037 2276 6036  
+10180 3209 5412 1499 10178 5893 1124  
+10181 1396 5412 3210 1124 2282 5895  
+10182 990 4427 5413 10183 6048 8254  
+10183 5651 5413 4427 10182 8253 10651  
+10184 5414 3257 3260 5988 5986 6053  
+10185 3289 2365 5414 6053 5989 6047  
+10186 3297 5415 1828 3076 6069 6068  
+10187 1785 5415 3294 6068 6060 6062  
+10188 5371 5416 3237 6071 10099 10098  
+10189 1394 5416 3236 10098 5944 5948  
+10190 3300 5417 2006 6096 6074 6025  
+10191 5417 3275 5408 10173 10172 6025  
+10192 3323 5418 3319 6115 6112 2292  
+10193 3321 5418 1632 2292 6116 6113  
+10194 3336 5419 1082 6119 5073 6147  
+10195 2016 5419 2797 6147 5075 5072  
+10196 3314 5420 2008 6148 6103 5499  
+10197 5420 3010 5276 9912 5498 5499  
+10198 861 5421 3058 1245 5595 1974  
+10199 817 5421 3340 1974 6153 6154  
+10200 4073 5422 1068 1657 -1 7578  
+10201 4072 5422 1066 7578 650 1659  
+10202 688 5423 3064 1656 9403 5607  
+10203 3065 5423 3344 5607 6162 5608  
+10204 3342 5424 159 3176 6159 460  
+10205 3343 3345 5424 3176 460 6161  
+10206 4124 5425 747 6166 7672 819  
+10207 1161 3346 5425 6166 819 1844  
+10208 3357 5426 832 1188 6168 6188  
+10209 5426 3347 5428 10212 1847 6188  
+10210 5428 747 3346 6166 1847 2923  
+10211 3350 5427 3351 6173 140 6175  
+10212 3347 3353 5428 2923 10209 6169  
+10213 4510 5429 1736 6186 8414 2979  
+10214 556 5429 1737 2979 4761 2497  
+10215 3362 5430 672 1200 6197 1144  
+10216 810 5430 3363 1144 655 6200  
+10217 4208 5431 986 10219 8375 2084  
+10218 4207 5431 1284 2084 6204 7829  
+10219 5431 5432 986 1326 10217 6203  
+10220 5433 5432 3365 6203 10221 6206  
+10221 4010 5433 3365 10220 31 7452  
+10222 5591 5433 985 7452 10530 1692  
+10223 837 5434 1855 6214 7292 1198  
+10224 3369 3370 5434 6212 1198 742  
+10225 1296 5435 2013 6095 1396 3525  
+10226 3699 5435 3374 3525 6221 1921  
+10227 5436 625 1722 2951 2272 9839  
+10228 5437 5436 1381 8385 10229 6225  
+10229 5437 1381 857 6207 1238 10228  
+10230 1378 3376 5437 6225 7894 2267  
+10231 5438 1412 5687 6234 9315 3122  
+10232 3404 5438 3380 9315 2295 6282  
+10233 4565 5439 1811 10122 3129 8525  
+10234 5439 1816 4573 8540 2713 8525  
+10235 5133 5440 490 3237 3099 9630  
+10236 2199 3383 5440 4489 9630 6239  
+10237 5200 5441 1796 3669 3100 9764  
+10238 2497 3383 5441 6240 9764 3897  
+10239 3690 5442 2501 561 10454 5367  
+10240 5444 5442 558 5367 10244 10243  
+10241 2725 5443 1152 1826 4495 3726  
+10242 5043 5443 2500 3726 4494 1621  
+10243 5442 5444 3385 10245 561 10240  
+10244 558 3386 5444 6243 10240 6245  
+10245 5445 3385 5444 10243 6243 6244  
+10246 3387 1152 5445 1826 10248 1360  
+10247 3388 5446 918 6926 10479 6247  
+10248 5445 5446 3387 6247 10246 1825  
+10249 1661 5447 3085 6260 1049 5645  
+10250 3394 5447 3393 5645 6259 5683  
+10251 3277 5448 1760 9931 3515 5532  
+10252 3403 3027 5448 6027 5532 6279  
+10253 1407 5449 3195 5866 6854 5865  
+10254 3404 5449 3405 5865 6284 2310  
+10255 3697 5450 3406 10258 6283 6855  
+10256 1403 3407 5450 2316 6855 6285  
+10257 5451 1400 5520 6286 6650 6293  
+10258 5450 5451 3406 6650 10255 2316  
+10259 1192 137 5452 10260 611 -1  
+10260 136 5452 137 10259 -1 613  
+10261 4392 5453 136 613 4866 840  
+10262 1593 3414 5453 6301 840 612  
+10263 5347 5454 3424 10486 10051 10050  
+10264 4876 5454 717 10050 9132 6320  
+10265 5347 5455 1516 6324 2541 10051  
+10266 5456 5455 3424 10051 10267 6325  
+10267 5567 5456 3424 10266 10486 10485  
+10268 3431 5456 835 10485 6335 6321  
+10269 3431 5457 3426 1194 6321 6334  
+10270 5459 5457 605 6334 10274 10273  
+10271 5458 1515 3598 6660 2538 6327  
+10272 3426 5458 1516 6662 6324 2542  
+10273 5457 5459 3427 6508 1194 10270  
+10274 3429 5459 605 10270 6330 6326  
+10275 3430 3431 5460 10276 6333 6332  
+10276 5217 5460 3431 10275 6335 9797  
+10277 5461 2766 5474 6338 6373 5014  
+10278 3435 5461 3434 6373 6342 6339  
+10279 5462 3435 5465 1635 6343 6345  
+10280 3438 5462 3436 6343 2146 960  
+10281 5463 724 5484 6420 10322 10287  
+10282 3438 5463 3437 10322 6348 2146  
+10283 3640 5464 3437 6348 6741 6738  
+10284 3597 5464 1056 6738 2148 6349  
+10285 1317 3439 5465 10286 6394 6350  
+10286 5465 3439 3436 10288 6343 10285  
+10287 5463 5466 724 6397 10281 2130  
+10288 3436 3439 5466 6351 2130 10286  
+10289 3442 5467 1317 386 6356 6352  
+10290 5481 5467 3441 6352 10318 10317  
+10291 3443 3444 5468 10292 6359 6358  
+10292 2144 5468 3444 10291 3791 627  
+10293 2145 5469 3446 6361 5015 5016  
+10294 3447 3444 5469 6361 4651 3791  
+10295 3447 5471 5472 10298 6367 4651  
+10296 3458 5470 3448 10300 6389 6374  
+10297 3506 5471 2145 5016 6366 4654  
+10298 5472 5471 3449 4654 6371 10295  
+10299 3486 5472 919 6371 6443 6368  
+10300 5470 5472 3448 6368 10296 6367  
+10301 3520 5473 521 6372 6509 6395  
+10302 3434 3450 5473 6372 6395 10304  
+10303 2767 5474 3432 6338 6477 5011  
+10304 5474 3450 3434 10302 6373 5011  
+10305 3445 3452 5475 10306 3787 6376  
+10306 3483 5475 3452 10305 6363 6437  
+10307 3460 5476 1228 6377 6393 6375  
+10308 3452 3451 5476 6377 6375 6376  
+10309 3595 5477 2146 6380 6653 4665  
+10310 3457 5477 2588 4665 9542 3793  
+10311 3492 5478 2147 3797 6455 6382  
+10312 3459 5478 3456 6382 6385 6391  
+10313 3486 5479 3448 6389 6368 3792  
+10314 3453 5479 2146 3792 6378 6369  
+10315 3488 5480 1319 2129 6409 6410  
+10316 5480 3470 5569 10487 2153 6410  
+10317 5467 5481 3440 6353 386 10290  
+10318 5481 3441 3485 6441 6435 10290  
+10319 1983 5482 3472 2141 7005 2139  
+10320 3522 5482 3473 2139 6418 6513  
+10321 3640 5483 1309 2140 10767 6741  
+10322 3437 5463 5484 10281 10324 10282  
+10323 3475 5484 3474 6420 2143 6344  
+10324 5484 5483 3437 6741 10322 6344  
+10325 5500 5485 1315 6419 10354 2142  
+10326 5485 3476 5486 10327 6422 2142  
+10327 4214 5486 3476 10326 6423 7843  
+10328 3812 5486 1307 7843 7079 6425  
+10329 1512 3639 5710 2534 10768 6740  
+10330 1309 3478 5487 6428 6742 974  
+10331 3595 5488 2149 4658 6444 6654  
+10332 3486 3487 5488 4658 6654 6443  
+10333 5110 5489 2602 6651 9587 1471  
+10334 706 3492 5489 4691 1471 10336  
+10335 3522 5491 1314 2138 10355 6418  
+10336 3492 706 5490 -1 10769 10334  
+10337 5492 5491 3473 6418 10338 6417  
+10338 3566 5492 3473 10337 6411 6597  
+10339 1313 3497 5492 6417 6597 6465  
+10340 4214 5493 1204 553 7842 6466  
+10341 3497 3498 5493 2135 6466 6465  
+10342 5494 1484 5513 6591 973 6471  
+10343 5154 5494 2694 6589 9673 4869  
+10344 3512 5495 620 6478 6488 6495  
+10345 2581 3502 5495 6474 6495 6483  
+10346 2765 5496 3432 6477 6337 6331  
+10347 3503 5496 3504 6331 6480 5013  
+10348 3513 5497 2855 5012 6499 5189  
+10349 2765 5497 3507 5189 1347 6485  
+10350 149 3516 5498 10351 10356 -1  
+10351 3517 5498 3516 10350 1348 688  
+10352 3513 5499 912 6505 6498 5191  
+10353 5498 5499 3514 5191 6503 688  
+10354 3521 5500 1315 10325 6512 6421  
+10355 1314 5500 3522 6421 10335 6514  
+10356 5498 5501 149 5190 10350 6503  
+10357 2856 5501 3514 6503 6501 6500  
+10358 3769 5502 2856 6500 366 6997  
+10359 150 3523 5502 6516 6997 -1  
+10360 4774 5503 1674 10365 8932 2854  
+10361 4775 5503 2069 2854 8934 2846  
+10362 5504 2080 4788 8961 3661 6529  
+10363 5505 5504 1675 8790 8305 2855  
+10364 5712 1675 4695 8777 10771 8305  
+10365 5503 5505 1674 2857 10360 2236  
+10366 5507 5506 1882 9035 10368 6531  
+10367 5506 3531 2125 3311 6530 6531  
+10368 4669 5507 1882 10366 8724 3309  
+10369 1903 3531 5507 6531 3312 3749  
+10370 2002 5508 3273 6019 9029 6021  
+10371 1235 5508 3557 6021 6580 6581  
+10372 4869 5509 2498 6586 9118 9117  
+10373 5510 5509 1866 9117 4491 10375  
+10374 2663 5510 2668 4822 9625 4813  
+10375 5509 5510 3559 4813 6586 10373  
+10376 1014 5511 2200 5924 3666 958  
+10377 2201 5511 3560 958 1357 4819  
+10378 5514 1484 3498 6468 6467 6591  
+10379 3562 1312 5512 -1 4874 10383  
+10380 5513 3563 5515 10384 6593 10382  
+10381 3565 5514 1313 6467 6594 6595  
+10382 5513 5514 3563 6595 10380 6591  
+10383 5515 1312 3562 10379 6593 2136  
+10384 3565 5515 3563 10380 6595 6592  
+10385 1392 5516 3240 6630 1552 3123  
+10386 1777 5516 3239 3123 5945 1272  
+10387 3585 5517 3581 6632 10666 3065  
+10388 5518 5517 1603 3065 10389 3052  
+10389 4398 5518 1603 10388 2712 10392  
+10390 1817 3584 5518 3052 10391 8543  
+10391 1817 5518 5519 10392 8556 10390  
+10392 4398 5519 5518 10391 10389 3141  
+10393 1411 5520 3248 2334 10123 2332  
+10394 5520 3593 3406 6649 6650 2332  
+10395 3561 3601 5521 10396 4872 2479  
+10396 2694 5521 3601 10395 4867 6665  
+10397 3602 5522 727 2240 6668 842  
+10398 1303 5522 3603 842 6322 6670  
+10399 3988 5523 942 6874 1406 1152  
+10400 5557 5523 3606 7410 6675 10465  
+10401 637 5524 3608 629 7511 1429  
+10402 5306 5524 3609 1429 9972 9970  
+10403 4978 5525 3609 9972 6679 9331  
+10404 3948 5525 1139 9331 10518 6683  
+10405 4135 5526 1175 7695 666 7694  
+10406 5527 5526 1891 7694 10407 624  
+10407 4651 5527 1891 10406 8690 3288  
+10408 3621 5527 598 3288 10410 624  
+10409 5529 5530 3635 6733 10411 127  
+10410 3621 598 5528 -1 10773 10408  
+10411 3635 130 5529 -1 10409 8052  
+10412 3638 5530 1513 127 -1 6737  
+10413 1120 5531 2685 1534 1761 4857  
+10414 4043 5531 3647 4857 6755 1535  
+10415 622 5532 883 7372 4630 358  
+10416 3649 902 5532 1290 358 6759  
+10417 4946 5533 2279 9217 4125 9268  
+10418 5534 5533 958 9268 10420 10419  
+10419 5533 5534 3650 6761 4056 10418  
+10420 3652 5534 958 10418 6763 4105  
+10421 3658 5535 1219 6767 10426 4143  
+10422 3669 5535 3654 4143 6800 2667  
+10423 3669 5536 865 6782 1439 6800  
+10424 3654 3655 5536 6772 6800 10429  
+10425 5538 5537 2322 10473 10427 6777  
+10426 1219 5537 3658 6777 10421 6769  
+10427 2322 3107 5538 10428 10425 4142  
+10428 5538 3107 5325 1953 10011 10427  
+10429 3654 5539 3655 6778 10424 6770  
+10430 5538 5539 3658 6770 6777 5684  
+10431 5355 5540 1079 6787 10066 5850  
+10432 3186 5540 3187 5850 94 5847  
+10433 957 3184 5541 10434 6791 5844  
+10434 1579 5541 3184 10433 6764 5843  
+10435 4962 5542 3675 4167 6811 9300  
+10436 4961 5542 2334 9300 9298 6812  
+10437 3721 5543 2329 6813 6902 4156  
+10438 5544 5543 2353 10445 10439 4204  
+10439 5544 2353 2352 10450 4202 10438  
+10440 1410 3676 5544 4204 9327 6814  
+10441 2341 3679 5545 10442 6823 3110  
+10442 5545 3679 1243 6819 6820 10441  
+10443 5321 5546 3093 2831 10003 5663  
+10444 2341 5546 3681 5663 6821 6823  
+10445 5547 2353 5543 10438 4156 4189  
+10446 1409 3682 5547 4189 6901 4205  
+10447 2484 5548 2345 6825 3152 4462  
+10448 5549 5548 1244 4462 10449 6826  
+10449 2487 5549 1244 10448 4203 4469  
+10450 2353 5549 2352 4469 10439 2004  
+10451 5307 5550 3053 6840 9975 9974  
+10452 3688 5550 1877 9974 6838 5587  
+10453 1049 3690 5551 10454 9461 6842  
+10454 2501 5551 3690 10453 10239 6841  
+10455 751 5552 1653 6884 7162 2812  
+10456 3691 5552 3692 2812 6846 1027  
+10457 4822 5553 2000 8835 9028 6093  
+10458 2001 5553 3309 6093 6090 6092  
+10459 1011 5554 3693 6848 5578 6847  
+10460 5554 3703 600 300 6867 6847  
+10461 402 401 5555 10462 7126 -1  
+10462 401 3704 5555 418 10461 413  
+10463 943 3709 5556 10464 9720 989  
+10464 975 5556 3709 10463 1408 6879  
+10465 5557 624 5523 6676 10400 6880  
+10466 3711 5557 930 6675 6883 6882  
+10467 859 2969 5558 10468 2813 9877  
+10468 648 5558 2969 10467 1727 5416  
+10469 3713 5559 1104 1242 6886 6885  
+10470 1102 5559 3712 6885 604 1725  
+10471 1116 5560 2406 4311 10728 4310  
+10472 3715 5560 3714 4310 6887 1390  
+10473 2322 5537 5562 6776 10476 10425  
+10474 960 5561 3720 6775 4177 6899  
+10475 3720 5562 2304 4106 6900 6775  
+10476 2322 5562 5561 6775 5691 10473  
+10477 2204 3729 5563 10478 3953 3733  
+10478 591 5563 3729 10477 468 6917  
+10479 918 5564 3388 6916 10247 6249  
+10480 3729 5564 3730 6249 468 3729  
+10481 2226 5565 699 2010 3951 141  
+10482 591 5565 2227 141 6917 3906  
+10483 3603 5566 3425 6323 6322 6669  
+10484 151 3768 5566 6323 6669 6996  
+10485 5456 5567 835 6995 10268 10267  
+10486 5567 3424 5454 10263 2118 10267  
+10487 3470 3773 5569 10489 10316 6598  
+10488 3768 5568 3769 6994 5188 6996  
+10489 1983 5569 3773 10487 2151 7005  
+10490 17 5570 18 1159 -1 551  
+10491 733 5570 3778 551 7261 7015  
+10492 5190 5571 586 7251 10748 9743  
+10493 5571 2779 5185 9734 9733 9743  
+10494 4307 5572 1644 8264 2795 8027  
+10495 1043 3784 5572 2515 8027 2793  
+10496 3533 5573 1865 4117 1516 3861  
+10497 488 5573 3821 3861 9252 7094  
+10498 439 5574 422 7122 330 331  
+10499 438 5574 3837 331 -1 326  
+10500 456 5575 3842 7130 7127 7129  
+10501 400 5575 3839 7129 408 7120  
+10502 196 5577 197 1028 -1 645  
+10503 4202 5576 3861 2059 1490 7820  
+10504 618 3862 5577 7163 7140 618  
+10505 5578 2552 5063 4598 9498 1055  
+10506 765 5578 3867 4599 19 7178  
+10507 4052 5579 774 7199 7538 1563  
+10508 4051 5579 1020 1563 7534 1562  
+10509 63 5580 1169 7254 672 1857  
+10510 62 5580 3906 1857 -1 1148  
+10511 3921 5581 3920 395 7282 385  
+10512 5714 3922 555 7228 7284 10776  
+10513 4170 5582 840 7313 1205 7757  
+10514 5582 1567 4375 8152 1206 7757  
+10515 4380 5583 841 7314 8163 285  
+10516 549 5583 3930 285 7304 7300  
+10517 3947 5584 720 966 7333 4210  
+10518 1139 5584 3948 4210 10404 7335  
+10519 316 5585 870 1264 797 1263  
+10520 655 5585 1170 1263 2895 1862  
+10521 5339 5587 273 7404 -1 10036  
+10522 3978 5586 3976 7387 177 7391  
+10523 5587 3151 5340 488 10037 10036  
+10524 3629 5588 1262 7406 2040 6720  
+10525 944 3986 5588 1404 6720 7407  
+10526 275 5589 1358 6719 2224 2226  
+10527 944 5589 3989 2226 7407 7412  
+10528 592 4010 5590 10529 5145 1691  
+10529 1085 5590 4010 10528 7828 7453  
+10530 4009 5591 985 10222 7451 1029  
+10531 619 5591 4011 1029 35 7455  
+10532 987 4016 5592 10533 5789 1496  
+10533 540 5592 4016 10532 2648 1207  
+10534 4018 5593 1570 10632 7469 1499  
+10535 1571 5593 4019 1499 7475 7471  
+10536 995 4031 5594 10537 442 7495  
+10537 301 5594 4031 10536 -1 1512  
+10538 662 4043 5595 10539 4703 7518  
+10539 4796 5595 4043 10538 7517 8976  
+10540 1005 5596 662 7518 789 711  
+10541 1006 5596 2687 711 4853 4860  
+10542 2473 5597 1232 1086 1980 4441  
+10543 5598 5597 1233 4441 10544 7525  
+10544 2470 5598 1233 10543 4436 3436  
+10545 781 5598 1966 3436 3433 3435  
+10546 545 4047 5599 10547 6749 357  
+10547 781 5599 4047 10546 3435 7526  
+10548 2556 5600 559 7536 4607 694  
+10549 4050 5600 675 694 759 736  
+10550 4061 5601 609 5535 7553 222  
+10551 1689 5601 4062 222 3620 7556  
+10552 1127 4094 5602 10553 3753 1782  
+10553 1130 5602 4094 10552 7614 7616  
+10554 4115 5603 1149 4897 1819 1024  
+10555 393 5603 4116 1024 -1 7656  
+10556 526 4117 5604 10557 5400 7657  
+10557 1150 5604 4117 10556 4632 1292  
+10558 622 5605 3649 266 358 6760  
+10559 4895 5605 4117 6760 7657 9164  
+10560 2568 5606 622 7659 4630 258  
+10561 1150 5606 2569 258 4634 4632  
+10562 4277 5607 539 7668 2446 7967  
+10563 4273 5607 1468 7967 39 1733  
+10564 2794 5608 492 1901 5069 5066  
+10565 4149 5608 1599 5066 7720 1887  
+10566 2180 4155 5609 10567 1917 7730  
+10567 295 5609 4155 10566 78 7727  
+10568 1238 4179 5610 10569 7782 91  
+10569 580 5610 4179 10568 8082 7775  
+10570 5033 5611 1597 7779 5883 9437  
+10571 1111 5611 3204 9437 2702 5881  
+10572 3897 5612 984 2058 609 7236  
+10573 201 4201 5612 2058 7236 7821  
+10574 1165 5613 2825 7831 1852 5126  
+10575 4208 901 5613 7831 10577 2927  
+10576 1284 4208 5614 10577 5123 2084  
+10577 5613 5614 4208 10576 10575 5126  
+10578 1289 4210 5615 10579 2094 832  
+10579 5615 4210 1546 1947 7835 10578  
+10580 2534 5616 2535 7851 4565 92  
+10581 4216 5616 542 92 1904 3321  
+10582 127 5617 2141 3783 -1 3910  
+10583 4876 5617 4229 3910 7870 3911  
+10584 5618 518 5360 10076 5880 2246  
+10585 1366 5618 4234 7169 7875 7881  
+10586 4233 5619 1709 8371 7880 7879  
+10587 1367 4235 5619 2245 7879 7884  
+10588 4006 5620 1542 8117 7445 1486  
+10589 4236 5620 4237 1486 7887 7888  
+10590 1384 5621 3261 860 5999 5997  
+10591 3590 5621 4246 5997 7905 2275  
+10592 2816 5622 1274 7917 1521 5111  
+10593 4250 5622 1423 9320 7914 2313  
+10594 1275 4254 5623 10595 2324 7921  
+10595 1403 5623 4254 10594 7924 2064  
+10596 5625 2350 2349 4198 4196 10599  
+10597 533 5624 4257 10598 7933 7927  
+10598 4257 5624 5625 10599 4199 10597  
+10599 2350 5625 5624 10598 5277 10596  
+10600 1448 4267 5626 10601 1145 2801  
+10601 703 5626 4267 10600 3096 2396  
+10602 2891 5627 1449 7949 5261 3097  
+10603 1799 4268 5627 7949 3097 3104  
+10604 4436 5628 1448 2801 8271 2802  
+10605 1648 4269 5628 7947 2802 7951  
+10606 1449 5629 2890 610 5261 5258  
+10607 4437 5629 4269 5258 7951 8273  
+10608 4176 5630 1237 7976 2456 7769  
+10609 4280 5630 1473 7769 7974 2564  
+10610 4363 5631 1704 232 10625 8129  
+10611 1021 4306 5631 2915 8129 1421  
+10612 4311 5632 674 8050 2619 8034  
+10613 5638 5632 1555 8034 1565 10624  
+10614 1508 5633 2892 5262 1483 893  
+10615 5638 5633 4320 893 10624 2914  
+10616 1519 5634 2229 2546 8062 954  
+10617 4329 2228 5634 2546 954 8064  
+10618 4334 5635 1522 9428 2552 8075  
+10619 116 5635 1523 8075 7322 1217  
+10620 5637 5636 1538 5104 10622 8096  
+10621 1897 5636 4345 8096 3300 8095  
+10622 5208 5637 1538 10620 3808 9780  
+10623 5637 2155 4839 2582 9058 9780  
+10624 5638 4320 5632 8050 10613 10615  
+10625 1704 5638 4363 1565 10610 2618  
+10626 1558 4366 5639 10627 29 8138  
+10627 213 5639 4366 10626 -1 298  
+10628 1559 4367 5640 10629 6930 603  
+10629 686 5640 4367 10628 1614 8139  
+10630 540 4377 5641 10631 1497 930  
+10631 1568 5641 4377 10630 8151 8157  
+10632 5642 1570 5593 10534 5870 8160  
+10633 5006 5642 842 5869 9388 1312  
+10634 4846 5643 2161 8167 103 3818  
+10635 4383 5643 4384 9072 8169 8170  
+10636 3960 5644 135 1298 7357 7356  
+10637 2163 4395 5644 1298 7356 10639  
+10638 1596 5645 2690 3825 8189 2697  
+10639 2163 5645 4395 2697 10637 8190  
+10640 3585 5646 1603 2712 3065 6634  
+10641 5646 1779 2100 3702 3701 6634  
+10642 1616 1611 5716 1173 10780 2740  
+10643 1606 5647 4399 2729 2718 8197  
+10644 1610 5648 1612 1322 6641 2726  
+10645 1609 5648 4400 2726 1509 8199  
+10646 5649 2372 4985 9346 9345 9351  
+10647 1617 5649 4406 4241 8211 8212  
+10648 1635 5650 3726 2785 6143 6911  
+10649 4424 5650 4425 6911 8250 1139  
+10650 3257 5651 1386 8253 2277 1505  
+10651 5413 5651 2365 1505 4229 10183  
+10652 3264 5652 1638 1503 6003 2790  
+10653 1388 5652 4430 2790 8255 8259  
+10654 4598 5653 1676 7390 8586 8307  
+10655 304 5653 4455 8307 -1 2859  
+10656 1686 4464 5654 10657 8316 8323  
+10657 1687 5654 4464 10656 2879 8321  
+10658 1686 2674 5655 10659 8323 4835  
+10659 5655 2674 5142 4834 9649 10658  
+10660 4599 5656 1849 8329 3203 8587  
+10661 1203 4467 5656 153 8587 3196  
+10662 1736 5657 4302 8406 8414 2498  
+10663 950 5657 4509 2498 8411 8412  
+10664 1755 4520 5658 10665 5551 3016  
+10665 1756 5658 4520 10664 8437 8435  
+10666 3581 5659 3585 8452 10387 6626  
+10667 4529 5659 4530 6626 8454 8455  
+10668 1776 5660 3232 5939 5936 5938  
+10669 4532 5660 4533 5938 3072 3071  
+10670 873 5661 2750 1713 9706 4983  
+10671 1780 5661 4560 4983 8431 8514  
+10672 1807 5662 1762 3035 3030 3031  
+10673 5662 4561 1765 8516 8517 3031  
+10674 5663 704 2489 8555 2007 8196  
+10675 1823 4581 5663 2335 4475 10722  
+10676 4858 5664 976 1448 9096 1517  
+10677 1861 5664 3536 9095 3227 6540  
+10678 4882 5665 1862 8623 1823 3228  
+10679 976 5665 2210 3228 9099 3918  
+10680 4948 5666 3537 3232 6542 9271  
+10681 998 4618 5666 3236 9271 8624  
+10682 4630 5667 798 1915 1120 5637  
+10683 1872 5667 4632 5637 3248 8652  
+10684 1894 4655 5668 10685 8702 1869  
+10685 5668 4655 1895 8699 8697 10684  
+10686 3531 5669 1885 8716 3311 3749  
+10687 4670 5669 1903 3749 8727 3307  
+10688 3790 1909 5717 7036 10782 7033  
+10689 1194 4673 5670 7037 4567 8735  
+10690 1910 4673 5671 10691 3326 7037  
+10691 1911 5671 4673 10690 8734 8733  
+10692 2186 4674 5672 10693 6231 8737  
+10693 1194 5672 4674 10692 8735 8732  
+10694 4865 5673 2186 8737 9110 8701  
+10695 493 5673 4657 8701 3308 8700  
+10696 511 5674 2477 879 8752 4449  
+10697 1924 5674 4686 4449 8760 8759  
+10698 1947 5675 2939 3401 9026 1703  
+10699 1955 5675 4706 1703 8796 3414  
+10700 4758 5676 1062 4830 8900 3595  
+10701 4747 5676 2047 3595 8879 3582  
+10702 2039 5677 4745 8882 1643 3578  
+10703 2041 5677 4750 3578 3583 8885  
+10704 5678 4753 1063 8888 8890 8901  
+10705 2047 4758 5678 1648 8899 3595  
+10706 1061 4761 5679 10707 193 3879  
+10707 2191 5679 4761 10706 1700 8907  
+10708 2053 2730 5680 10709 2180 9889  
+10709 5680 2730 2729 3608 2181 10708  
+10710 5681 2085 4791 2844 8967 4257  
+10711 2069 5681 4776 3655 8934 8936  
+10712 3337 5682 1344 8988 3692 6149  
+10713 2095 5682 3012 6149 2298 5503  
+10714 721 5683 3144 3767 699 5765  
+10715 2133 4835 5683 968 5765 9052  
+10716 5684 627 4849 9077 3828 3826  
+10717 886 5684 4848 5700 9074 9076  
+10718 3030 5685 2193 9120 5539 1268  
+10719 2194 5685 2935 1268 5351 5348  
+10720 4964 5686 2337 4155 9304 9294  
+10721 2328 5686 4959 9294 4152 9293  
+10722 1823 5687 4581 6234 10675 8557  
+10723 5687 4970 3380 9313 9315 8557  
+10724 1410 5688 3675 4176 6814 4157  
+10725 2340 5688 4974 4157 6817 9323  
+10726 1802 5689 2487 2329 2509 4468  
+10727 5689 4975 2351 9325 9326 4468  
+10728 5690 1116 2406 10471 4307 7593  
+10729 1626 5690 4996 2760 950 9368  
+10730 480 5691 3196 183 5867 5868  
+10731 2423 5691 5005 5868 4345 9386  
+10732 726 5692 2467 9434 4426 4429  
+10733 139 5692 3856 4429 617 7154  
+10734 2476 5693 108 7070 -1 4448  
+10735 1879 5693 5035 4448 1913 9442  
+10736 5337 5694 1713 9474 5756 10032  
+10737 3138 5694 3139 10032 2932 5753  
+10738 2540 5695 602 9475 903 4573  
+10739 2514 5695 2539 4573 4530 4572  
+10740 5696 3206 5365 5888 10087 4671  
+10741 5090 5696 5085 3794 9539 2901  
+10742 5090 5697 2590 664 2901 9551  
+10743 2594 5698 5093 9557 6704 9555  
+10744 5698 5094 470 -1 1468 9555  
+10745 2192 5167 5699 10746 5439 4963  
+10746 2740 5699 5167 10745 9697 9698  
+10747 5700 715 5336 10029 5040 714  
+10748 586 5700 5190 5038 10492 9744  
+10749 3959 5703 5701 10752 1294 10753  
+10750 5702 2873 3575 847 6615 10754  
+10751 3111 5701 5702 10752 6614 5224  
+10752 5702 5701 5703 10749 10754 10751  
+10753 134 5703 3959 10749 1275 7355  
+10754 5702 5703 2873 7355 10750 10752  
+10755 2055 5704 3019 3592 5526 5516  
+10756 502 5704 4765 5516 8917 8914  
+10757 3059 5305 5705 10758 7069 5597  
+10758 5705 5305 499 9973 9971 10757  
+10759 3079 5706 3080 3243 3250 5636  
+10760 5706 5312 1879 3263 9985 5636  
+10761 3119 5707 3747 6953 6952 5714  
+10762 334 5707 708 5714 46 45  
+10763 5708 3134 56 5741 1192 652  
+10764 834 5708 3136 10784 5752 758  
+10765 1652 5709 2998 4952 9895 5475  
+10766 2735 5709 5407 5475 10170 3629  
+10767 1309 5710 3640 2534 10321 6742  
+10768 1512 5710 5487 6742 6428 10329  
+10769 3492 5490 5711 10770 3806 10336  
+10770 2153 5711 5490 10769 -1 6456  
+10771 515 5712 4695 10364 3375 8776  
+10772 1674 5712 4454 8776 8932 2857  
+10773 3621 5528 5713 10774 4675 10410  
+10774 2594 5713 5528 10773 -1 6704  
+10775 828 5714 2959 7284 2543 5397  
+10776 3922 5714 5581 5397 385 10512  
+10777 676 5715 1558 2627 2623 497  
+10778 1559 5715 3736 497 6927 6930  
+10779 4399 5716 825 1173 8198 2729  
+10780 1616 5716 5647 2729 2719 10642  
+10781 1194 5717 2536 2156 6232 4567  
+10782 3790 5717 5670 4567 1906 10688  
+10783 55 5718 3135 5747 -1 5745  
+10784 3136 5708 5718 5747 5745 10764  
+651 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Triangulation Segments...
+0 3 4 exterior
+1 9 10 exterior
+2 10 11 exterior
+3 31 30 exterior
+4 39 38 exterior
+5 46 45 exterior
+6 61 60 exterior
+7 63 64 exterior
+8 72 71 exterior
+9 73 72 exterior
+10 74 75 exterior
+11 80 79 exterior
+12 83 82 exterior
+13 85 84 exterior
+14 90 89 exterior
+15 93 92 exterior
+16 95 94 exterior
+17 100 101 exterior
+18 104 103 exterior
+19 121 122 exterior
+20 125 126 exterior
+21 140 726 open
+22 151 152 exterior
+23 161 162 exterior
+24 162 3208 exterior
+25 163 164 exterior
+26 165 166 exterior
+27 170 171 exterior
+28 174 175 exterior
+29 180 179 exterior
+30 181 180 exterior
+31 182 181 exterior
+32 185 186 exterior
+33 194 195 exterior
+34 196 197 exterior
+35 233 232 exterior
+36 235 236 exterior
+37 237 238 exterior
+38 254 255 exterior
+39 266 267 exterior
+40 267 268 exterior
+41 269 268 exterior
+42 270 271 exterior
+43 290 289 exterior
+44 309 310 exterior
+45 4204 327 exterior
+46 330 331 exterior
+47 336 337 exterior
+48 340 339 exterior
+49 342 341 exterior
+50 348 347 exterior
+51 356 357 exterior
+52 359 360 exterior
+53 370 371 exterior
+54 382 383 exterior
+55 398 399 exterior
+56 403 404 exterior
+57 405 406 exterior
+58 407 408 exterior
+59 410 411 exterior
+60 414 413 exterior
+61 421 420 exterior
+62 423 424 exterior
+63 427 428 exterior
+64 433 434 exterior
+65 436 435 exterior
+66 437 438 exterior
+67 438 3837 exterior
+68 440 441 exterior
+69 442 441 exterior
+70 448 447 exterior
+71 450 451 exterior
+72 455 3704 exterior
+73 456 457 exterior
+74 463 464 exterior
+75 464 465 exterior
+76 69 70 exterior
+77 75 76 exterior
+78 76 77 exterior
+79 77 78 exterior
+80 79 78 exterior
+81 83 84 exterior
+82 85 86 exterior
+83 1 0 exterior
+84 6 5 exterior
+85 7 8 exterior
+86 8 9 exterior
+87 13 12 exterior
+88 13 14 exterior
+89 16 17 exterior
+90 18 19 exterior
+91 22 21 exterior
+92 22 23 exterior
+93 25 24 exterior
+94 27 26 exterior
+95 37 38 exterior
+96 42 43 exterior
+97 48 47 exterior
+98 52 53 exterior
+99 74 73 exterior
+100 87 88 exterior
+101 90 91 exterior
+102 93 94 exterior
+103 96 95 exterior
+104 96 97 exterior
+105 98 97 exterior
+106 98 4163 exterior
+107 117 118 exterior
+108 124 125 exterior
+109 156 157 exterior
+110 158 157 exterior
+111 165 164 exterior
+112 169 170 exterior
+113 172 171 exterior
+114 174 173 exterior
+115 177 178 exterior
+116 183 184 exterior
+117 184 185 exterior
+118 187 188 exterior
+119 200 201 exterior
+120 206 205 exterior
+121 209 4890 exterior
+122 214 215 exterior
+123 228 227 exterior
+124 232 231 exterior
+125 237 236 exterior
+126 241 240 exterior
+127 242 241 exterior
+128 242 243 exterior
+129 248 249 exterior
+130 251 250 exterior
+131 252 251 exterior
+132 254 253 exterior
+133 258 257 exterior
+134 286 287 exterior
+135 288 289 exterior
+136 296 4309 exterior
+137 302 303 exterior
+138 307 308 exterior
+139 312 313 exterior
+140 313 314 exterior
+141 317 318 exterior
+142 320 319 exterior
+143 334 335 exterior
+144 344 343 exterior
+145 349 350 exterior
+146 362 361 exterior
+147 365 364 exterior
+148 367 368 exterior
+149 369 368 exterior
+150 381 382 exterior
+151 388 389 exterior
+152 396 395 exterior
+153 397 396 exterior
+154 400 401 exterior
+155 402 403 exterior
+156 408 409 exterior
+157 411 3828 exterior
+158 416 3836 exterior
+159 420 419 exterior
+160 422 421 exterior
+161 426 427 exterior
+162 429 430 exterior
+163 432 431 exterior
+164 432 433 exterior
+165 436 437 exterior
+166 443 442 exterior
+167 444 445 exterior
+168 449 448 exterior
+169 452 451 exterior
+170 466 467 exterior
+171 142 141 exterior
+172 152 153 exterior
+173 154 153 exterior
+174 154 155 exterior
+175 166 4381 exterior
+176 4831 172 exterior
+177 178 179 exterior
+178 176 177 exterior
+179 202 203 exterior
+180 204 203 exterior
+181 208 209 exterior
+182 244 245 exterior
+183 247 248 exterior
+184 253 252 exterior
+185 256 255 exterior
+186 266 265 exterior
+187 271 272 exterior
+188 277 278 exterior
+189 316 315 exterior
+190 316 317 exterior
+191 319 318 exterior
+192 320 321 exterior
+193 323 324 exterior
+194 324 325 exterior
+195 325 326 exterior
+196 338 337 exterior
+197 345 344 exterior
+198 354 355 exterior
+199 352 353 exterior
+200 357 358 exterior
+201 358 359 exterior
+202 353 354 exterior
+203 351 352 exterior
+204 362 363 exterior
+205 364 363 exterior
+206 366 365 exterior
+207 4308 366 exterior
+208 369 370 exterior
+209 371 3971 exterior
+210 376 375 exterior
+211 379 380 exterior
+212 378 379 exterior
+213 5176 383 exterior
+214 392 391 exterior
+215 393 392 exterior
+216 395 394 exterior
+217 404 405 exterior
+218 407 406 exterior
+219 455 454 exterior
+220 410 409 exterior
+221 413 412 exterior
+222 414 415 exterior
+223 415 3830 exterior
+224 446 445 exterior
+225 417 418 exterior
+226 419 418 exterior
+227 422 423 exterior
+228 3838 439 exterior
+229 424 425 exterior
+230 425 426 exterior
+231 428 429 exterior
+232 430 431 exterior
+233 435 434 exterior
+234 444 443 exterior
+235 447 446 exterior
+236 3827 449 exterior
+237 1131 452 exterior
+238 454 453 exterior
+239 458 457 exterior
+240 460 459 exterior
+241 459 458 exterior
+242 463 462 exterior
+243 465 2437 exterior
+244 4888 467 exterior
+245 1 2 exterior
+246 4075 2 exterior
+247 5 4 exterior
+248 12 11 exterior
+249 14 15 exterior
+250 16 15 exterior
+251 18 17 exterior
+252 21 20 exterior
+253 24 23 exterior
+254 26 25 exterior
+255 27 28 exterior
+256 3795 28 exterior
+257 3809 31 exterior
+258 32 33 exterior
+259 34 33 exterior
+260 40 39 exterior
+261 37 36 exterior
+262 41 42 exterior
+263 44 4443 exterior
+264 47 46 exterior
+265 53 54 exterior
+266 57 56 exterior
+267 59 58 exterior
+268 60 59 exterior
+269 61 62 exterior
+270 3906 62 exterior
+271 65 64 exterior
+272 66 65 exterior
+273 66 67 exterior
+274 67 68 exterior
+275 68 69 exterior
+276 70 71 exterior
+277 82 81 exterior
+278 81 80 exterior
+279 86 87 exterior
+280 88 89 exterior
+281 92 91 exterior
+282 4166 99 exterior
+283 102 101 exterior
+284 1104 102 exterior
+285 2773 104 exterior
+286 105 4368 exterior
+287 106 107 exterior
+288 110 111 exterior
+289 111 4891 exterior
+290 112 4328 exterior
+291 115 4333 exterior
+292 119 120 exterior
+293 120 121 exterior
+294 123 122 exterior
+295 127 126 exterior
+296 5109 144 exterior
+297 3820 147 exterior
+298 3516 148 exterior
+299 5568 150 exterior
+300 3855 139 exterior
+301 137 136 exterior
+302 5030 138 exterior
+303 134 3958 exterior
+304 4321 130 exterior
+305 3576 132 exterior
+306 128 4838 exterior
+307 4649 142 exterior
+308 4137 143 exterior
+309 5078 145 exterior
+310 5069 146 exterior
+311 3523 149 exterior
+312 2141 127 exterior
+313 129 3638 exterior
+314 3159 131 exterior
+315 133 2873 exterior
+316 135 4394 exterior
+317 1192 137 exterior
+318 124 123 exterior
+319 118 119 exterior
+320 3940 116 exterior
+321 160 4588 exterior
+322 2720 167 exterior
+323 2717 168 exterior
+324 159 160 exterior
+325 158 4073 exterior
+326 155 3617 exterior
+327 113 4324 exterior
+328 2465 114 exterior
+329 109 4153 exterior
+330 3077 108 exterior
+331 107 2476 exterior
+332 175 4833 exterior
+333 183 182 exterior
+334 188 5060 exterior
+335 186 187 exterior
+336 189 5226 exterior
+337 191 190 exterior
+338 191 192 exterior
+339 3889 192 exterior
+340 193 194 exterior
+341 196 195 exterior
+342 197 198 exterior
+343 5576 198 exterior
+344 200 199 exterior
+345 201 202 exterior
+346 206 207 exterior
+347 205 204 exterior
+348 207 2785 exterior
+349 210 211 exterior
+350 211 4192 exterior
+351 212 213 exterior
+352 213 4366 exterior
+353 4717 215 exterior
+354 217 216 exterior
+355 217 218 exterior
+356 219 218 exterior
+357 220 219 exterior
+358 220 221 exterior
+359 221 222 exterior
+360 222 223 exterior
+361 223 224 exterior
+362 224 225 exterior
+363 4386 225 exterior
+364 226 227 exterior
+365 3788 228 exterior
+366 230 229 exterior
+367 4829 230 exterior
+368 4109 233 exterior
+369 1348 234 exterior
+370 239 238 exterior
+371 3724 239 exterior
+372 243 244 exterior
+373 246 245 exterior
+374 4168 246 exterior
+375 4130 249 exterior
+376 257 256 exterior
+377 263 262 exterior
+378 1302 261 exterior
+379 259 1301 exterior
+380 260 261 exterior
+381 259 258 exterior
+382 263 264 exterior
+383 265 264 exterior
+384 270 269 exterior
+385 5339 272 exterior
+386 274 273 exterior
+387 274 275 exterior
+388 275 4228 exterior
+389 277 276 exterior
+390 279 280 exterior
+391 278 279 exterior
+392 280 5427 exterior
+393 281 3348 exterior
+394 282 3811 exterior
+395 283 284 exterior
+396 284 285 exterior
+397 285 286 exterior
+398 288 287 exterior
+399 291 290 exterior
+400 292 291 exterior
+401 4100 292 exterior
+402 1832 293 exterior
+403 294 4584 exterior
+404 4154 295 exterior
+405 297 4315 exterior
+406 298 4589 exterior
+407 2449 299 exterior
+408 300 301 exterior
+409 4031 301 exterior
+410 5586 303 exterior
+411 304 4455 exterior
+412 4597 305 exterior
+413 306 1840 exterior
+414 308 4111 exterior
+415 310 4076 exterior
+416 311 4336 exterior
+417 314 315 exterior
+418 4608 321 exterior
+419 322 323 exterior
+420 326 327 exterior
+421 328 1278 exterior
+422 329 1982 exterior
+423 332 331 exterior
+424 332 333 exterior
+425 3118 333 exterior
+426 335 336 exterior
+427 338 339 exterior
+428 340 341 exterior
+429 1300 342 exterior
+430 346 345 exterior
+431 347 346 exterior
+432 348 349 exterior
+433 350 351 exterior
+434 4372 360 exterior
+435 355 356 exterior
+436 372 1968 exterior
+437 373 4493 exterior
+438 374 2639 exterior
+439 376 377 exterior
+440 377 3870 exterior
+441 380 3907 exterior
+442 384 385 exterior
+443 385 386 exterior
+444 386 3544 exterior
+445 2564 387 exterior
+446 389 3969 exterior
+447 390 4894 exterior
+448 393 4116 exterior
+449 397 398 exterior
+450 401 402 exterior
+451 399 400 exterior
+452 460 5019 exterior
+453 3992 461 exterior
+454 1545 6 exterior
+455 19 3950 exterior
+456 3794 29 exterior
+457 34 4440 exterior
+458 2755 35 exterior
+459 4835 40 exterior
+460 1672 43 exterior
+461 3849 48 exterior
+462 1953 49 exterior
+463 50 1951 exterior
+464 51 4709 exterior
+465 54 3140 exterior
+466 55 3135 exterior
+467 57 5335 exterior
+468 468 3518 open
+469 469 3561 open
+470 470 5094 open
+471 471 3783 open
+472 598 4651 open
+473 726 5029 open
+474 706 5110 open
+475 941 3987 open
+476 1068 159 exterior
+477 973 143 exterior
+478 1176 4142 exterior
+479 1178 5091 open
+480 1193 471 open
+481 546 3567 open
+482 1278 329 exterior
+483 1300 343 exterior
+484 1301 260 exterior
+485 1302 262 exterior
+486 1320 3468 open
+487 1348 235 exterior
+488 1312 3564 open
+489 1513 5529 exterior
+490 876 2692 open
+491 1545 7 exterior
+492 1840 307 exterior
+493 1951 51 exterior
+494 1953 50 exterior
+495 1968 373 exterior
+496 1982 330 exterior
+497 2141 128 exterior
+498 2148 2153 open
+499 2153 5490 open
+500 2437 466 exterior
+501 2449 300 exterior
+502 2465 115 exterior
+503 2476 108 exterior
+504 2564 388 exterior
+505 2575 147 exterior
+506 2577 5254 exterior
+507 2585 5112 exterior
+508 2591 1178 open
+509 2592 5092 open
+510 2594 5528 open
+511 2639 375 exterior
+512 2688 2148 open
+513 2692 469 open
+514 2720 168 exterior
+515 2717 169 exterior
+516 2755 36 exterior
+517 2773 105 exterior
+518 1131 453 exterior
+519 2785 208 exterior
+520 3077 109 exterior
+521 3140 55 exterior
+522 3159 132 exterior
+523 3208 163 exterior
+524 3348 282 exterior
+525 1192 138 exterior
+526 3468 468 open
+527 3516 149 exterior
+528 3518 2688 open
+529 3523 150 exterior
+530 3544 387 exterior
+531 3561 5512 open
+532 3564 546 open
+533 3567 1320 open
+534 3576 133 exterior
+535 3617 156 exterior
+536 3638 1513 exterior
+537 3704 456 exterior
+538 1104 103 exterior
+539 3724 240 exterior
+540 3783 876 open
+541 3788 229 exterior
+542 3794 30 exterior
+543 3795 29 exterior
+544 3809 32 exterior
+545 3811 283 exterior
+546 3820 148 exterior
+547 3827 450 exterior
+548 3828 412 exterior
+549 3830 416 exterior
+550 3836 417 exterior
+551 3837 439 exterior
+552 3838 440 exterior
+553 3849 49 exterior
+554 3855 140 exterior
+555 3870 378 exterior
+556 3889 193 exterior
+557 3906 63 exterior
+558 3907 381 exterior
+559 3940 117 exterior
+560 3950 20 exterior
+561 3958 135 exterior
+562 3969 390 exterior
+563 3971 372 exterior
+564 3987 141 open
+565 3992 462 exterior
+566 4031 302 exterior
+567 4073 1068 exterior
+568 4075 3 exterior
+569 4076 311 exterior
+570 4100 293 exterior
+571 4109 234 exterior
+572 4111 309 exterior
+573 4116 394 exterior
+574 4130 250 exterior
+575 4137 1176 exterior
+576 4142 144 exterior
+577 4153 110 exterior
+578 4154 296 exterior
+579 4163 99 exterior
+580 4166 100 exterior
+581 4168 247 exterior
+582 4192 212 exterior
+583 4204 328 exterior
+584 4228 276 exterior
+585 4308 367 exterior
+586 4309 297 exterior
+587 4315 298 exterior
+588 4321 131 exterior
+589 4324 114 exterior
+590 4328 113 exterior
+591 4333 116 exterior
+592 4336 312 exterior
+593 4366 214 exterior
+594 4368 106 exterior
+595 4372 361 exterior
+596 4381 167 exterior
+597 4386 226 exterior
+598 4394 136 exterior
+599 4440 35 exterior
+600 4443 45 exterior
+601 1672 44 exterior
+602 4455 305 exterior
+603 4493 374 exterior
+604 4584 295 exterior
+605 1832 294 exterior
+606 4588 161 exterior
+607 4589 299 exterior
+608 4597 306 exterior
+609 4608 322 exterior
+610 4649 973 exterior
+611 4651 941 open
+612 4709 52 exterior
+613 4717 216 exterior
+614 4829 231 exterior
+615 4831 173 exterior
+616 4833 176 exterior
+617 4835 41 exterior
+618 4838 129 exterior
+619 4888 0 exterior
+620 4890 210 exterior
+621 4891 112 exterior
+622 4894 391 exterior
+623 5019 461 exterior
+624 5029 1193 open
+625 5030 139 exterior
+626 5060 189 exterior
+627 5069 2575 exterior
+628 5078 2577 exterior
+629 5092 470 open
+630 5094 2594 open
+631 5109 2585 exterior
+632 5110 2591 open
+633 5112 145 exterior
+634 5176 384 exterior
+635 2873 134 exterior
+636 5226 190 exterior
+637 5254 146 exterior
+638 3118 334 exterior
+639 5335 58 exterior
+640 3135 56 exterior
+641 5339 273 exterior
+642 5427 281 exterior
+643 5490 706 open
+644 5512 1312 open
+645 5528 598 open
+646 5529 130 exterior
+647 5568 151 exterior
+648 5576 199 exterior
+649 5586 304 exterior
+650 5091 2592 open
+468 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Mesh Vertices...
+0 756956.4 5913709.0 
+1 756979.4 5913720.0 
+2 756996.9 5913754.0 
+3 757024.4 5913793.0 
+4 757053.3 5913790.0 
+5 757091.3 5913769.0 
+6 757115.8 5913740.0 
+7 757119.1 5913676.0 
+8 757109.7 5913639.0 
+9 757099.4 5913604.0 
+10 757102.3 5913568.0 
+11 757121.9 5913544.0 
+12 757146.9 5913507.0 
+13 757173.1 5913481.0 
+14 757208.3 5913450.0 
+15 757241.3 5913424.0 
+16 757278.6 5913415.0 
+17 757313.6 5913416.0 
+18 757352.6 5913399.0 
+19 757382.1 5913381.0 
+20 757435.2 5913355.0 
+21 757469.4 5913363.0 
+22 757495.5 5913378.0 
+23 757520.6 5913393.0 
+24 757580.5 5913402.0 
+25 757622.8 5913387.0 
+26 757658.0 5913366.0 
+27 757683.9 5913344.0 
+28 757692.4 5913302.0 
+29 757711.5 5913255.0 
+30 757699.8 5913198.0 
+31 757694.5 5913161.0 
+32 757697.4 5913107.0 
+33 757703.9 5913063.0 
+34 757713.1 5913020.0 
+35 757725.9 5912968.0 
+36 757764.3 5912914.0 
+37 757795.8 5912882.0 
+38 757823.4 5912843.0 
+39 757861.6 5912840.0 
+40 757898.6 5912833.0 
+41 757946.3 5912800.0 
+42 757982.8 5912776.0 
+43 758012.8 5912752.0 
+44 758082.6 5912770.0 
+45 758141.9 5912746.0 
+46 758178.6 5912745.0 
+47 758215.3 5912735.0 
+48 758243.5 5912747.0 
+49 758300.5 5912705.0 
+50 758363.2 5912661.0 
+51 758410.1 5912597.0 
+52 758442.4 5912560.0 
+53 758478.6 5912565.0 
+54 758501.9 5912604.0 
+55 758542.0 5912658.0 
+56 758591.1 5912693.0 
+57 758630.6 5912714.0 
+58 758670.1 5912755.0 
+59 758708.4 5912767.0 
+60 758746.5 5912792.0 
+61 758777.8 5912795.0 
+62 758829.4 5912789.0 
+63 758879.9 5912755.0 
+64 758909.5 5912753.0 
+65 758947.3 5912764.0 
+66 758985.3 5912781.0 
+67 759015.4 5912826.0 
+68 759041.8 5912867.0 
+69 759094.9 5912871.0 
+70 759122.8 5912876.0 
+71 759162.0 5912871.0 
+72 759170.0 5912890.0 
+73 759193.8 5912906.0 
+74 759209.6 5912931.0 
+75 759228.0 5912954.0 
+76 759232.4 5912991.0 
+77 759235.8 5913020.0 
+78 759243.4 5913044.0 
+79 759262.3 5913073.0 
+80 759274.8 5913096.0 
+81 759304.5 5913144.0 
+82 759329.6 5913173.0 
+83 759347.1 5913190.0 
+84 759372.1 5913218.0 
+85 759389.7 5913249.0 
+86 759399.4 5913273.0 
+87 759403.4 5913314.0 
+88 759403.2 5913351.0 
+89 759403.8 5913388.0 
+90 759422.0 5913419.0 
+91 759427.9 5913448.0 
+92 759454.6 5913488.0 
+93 759493.3 5913521.0 
+94 759520.8 5913539.0 
+95 759551.9 5913558.0 
+96 759595.8 5913584.0 
+97 759632.5 5913599.0 
+98 759664.6 5913608.0 
+99 759708.0 5913616.0 
+100 759762.1 5913619.0 
+101 759799.8 5913620.0 
+102 759844.5 5913617.0 
+103 759910.8 5913595.0 
+104 759944.2 5913582.0 
+105 759997.4 5913562.0 
+106 760042.6 5913544.0 
+107 760099.1 5913521.0 
+108 760183.0 5913505.0 
+109 760270.8 5913479.0 
+110 760318.7 5913453.0 
+111 760362.4 5913449.0 
+112 760406.4 5913429.0 
+113 760468.0 5913408.0 
+114 760514.6 5913383.0 
+115 760533.6 5913307.0 
+116 760506.8 5913254.0 
+117 760506.3 5913182.0 
+118 760509.4 5913140.0 
+119 760513.4 5913097.0 
+120 760543.6 5913078.0 
+121 760517.2 5913038.0 
+122 760515.9 5912999.0 
+123 760522.7 5912961.0 
+124 760538.6 5912911.0 
+125 760533.5 5912882.0 
+126 760523.6 5912842.0 
+127 760530.7 5912799.0 
+128 760568.4 5912715.0 
+129 760548.1 5912657.0 
+130 760604.9 5912563.0 
+131 760659.6 5912545.0 
+132 760731.9 5912514.0 
+133 760776.9 5912482.0 
+134 760820.9 5912414.0 
+135 760830.0 5912347.0 
+136 760872.2 5912268.0 
+137 760914.6 5912302.0 
+138 760974.8 5912243.0 
+139 761016.3 5912205.0 
+140 761052.7 5912151.0 
+141 759608.8 5912326.0 
+142 759648.9 5912370.0 
+143 759734.6 5912453.0 
+144 759831.9 5912548.0 
+145 759926.0 5912617.0 
+146 760035.3 5912684.0 
+147 760130.8 5912731.0 
+148 760188.9 5912759.0 
+149 760259.2 5912788.0 
+150 760345.6 5912800.0 
+151 760413.1 5912792.0 
+152 760394.6 5912830.0 
+153 760352.9 5912826.0 
+154 760301.9 5912836.0 
+155 760251.9 5912865.0 
+156 760180.4 5912895.0 
+157 760150.5 5912884.0 
+158 760110.3 5912889.0 
+159 760029.2 5912933.0 
+160 759965.3 5912969.0 
+161 759917.9 5912983.0 
+162 759867.0 5912984.0 
+163 759809.5 5912981.0 
+164 759769.6 5912980.0 
+165 759723.6 5912982.0 
+166 759683.6 5912981.0 
+167 759634.8 5912975.0 
+168 759560.4 5912960.0 
+169 759496.9 5912934.0 
+170 759463.8 5912906.0 
+171 759452.2 5912877.0 
+172 759442.1 5912839.0 
+173 759426.3 5912793.0 
+174 759409.4 5912769.0 
+175 759369.2 5912796.0 
+176 759321.1 5912831.0 
+177 759294.3 5912856.0 
+178 759269.9 5912879.0 
+179 759252.7 5912892.0 
+180 759242.1 5912879.0 
+181 759254.3 5912853.0 
+182 759290.6 5912825.0 
+183 759328.1 5912797.0 
+184 759352.9 5912777.0 
+185 759381.3 5912755.0 
+186 759381.4 5912717.0 
+187 759347.9 5912694.0 
+188 759336.6 5912672.0 
+189 759306.7 5912620.0 
+190 759260.9 5912576.0 
+191 759227.4 5912544.0 
+192 759191.9 5912522.0 
+193 759151.9 5912465.0 
+194 759112.6 5912446.0 
+195 759095.4 5912412.0 
+196 759059.8 5912378.0 
+197 759036.9 5912368.0 
+198 759011.5 5912327.0 
+199 758971.9 5912285.0 
+200 758940.6 5912247.0 
+201 758907.8 5912250.0 
+202 758868.7 5912214.0 
+203 758829.6 5912201.0 
+204 758812.3 5912178.0 
+205 758784.7 5912150.0 
+206 758762.4 5912134.0 
+207 758715.3 5912140.0 
+208 758649.9 5912122.0 
+209 758612.4 5912099.0 
+210 758573.8 5912070.0 
+211 758533.9 5912064.0 
+212 758483.9 5912059.0 
+213 758442.6 5912049.0 
+214 758388.3 5912057.0 
+215 758351.5 5912047.0 
+216 758301.5 5912036.0 
+217 758265.8 5912017.0 
+218 758219.8 5912007.0 
+219 758176.5 5911973.0 
+220 758124.0 5911951.0 
+221 758079.8 5911927.0 
+222 758044.5 5911902.0 
+223 758018.3 5911866.0 
+224 757994.7 5911809.0 
+225 757972.8 5911763.0 
+226 757965.1 5911712.0 
+227 757940.1 5911668.0 
+228 757935.4 5911635.0 
+229 757949.6 5911581.0 
+230 757950.4 5911525.0 
+231 757947.5 5911473.0 
+232 757937.5 5911433.0 
+233 757923.5 5911388.0 
+234 757896.9 5911328.0 
+235 757855.8 5911253.0 
+236 757834.2 5911219.0 
+237 757810.9 5911182.0 
+238 757781.3 5911149.0 
+239 757763.1 5911109.0 
+240 757750.3 5911055.0 
+241 757752.1 5911015.0 
+242 757768.3 5910992.0 
+243 757798.1 5910985.0 
+244 757850.6 5910987.0 
+245 757885.3 5910987.0 
+246 757931.7 5910977.0 
+247 757966.1 5910930.0 
+248 757956.1 5910889.0 
+249 757951.6 5910860.0 
+250 757987.4 5910828.0 
+251 758030.8 5910795.0 
+252 758053.1 5910780.0 
+253 758083.1 5910774.0 
+254 758072.2 5910743.0 
+255 758068.3 5910706.0 
+256 758064.3 5910657.0 
+257 758058.4 5910621.0 
+258 758059.8 5910587.0 
+259 758060.1 5910536.0 
+260 758023.4 5910497.0 
+261 758005.5 5910511.0 
+262 758034.9 5910554.0 
+263 758006.9 5910564.0 
+264 757974.1 5910538.0 
+265 757933.7 5910548.0 
+266 757917.0 5910584.0 
+267 757904.9 5910572.0 
+268 757926.2 5910544.0 
+269 757945.8 5910525.0 
+270 757979.7 5910486.0 
+271 757948.6 5910460.0 
+272 757914.3 5910426.0 
+273 757865.2 5910391.0 
+274 757811.1 5910369.0 
+275 757766.6 5910340.0 
+276 757718.4 5910304.0 
+277 757684.1 5910270.0 
+278 757641.7 5910262.0 
+279 757587.9 5910260.0 
+280 757543.4 5910262.0 
+281 757489.6 5910273.0 
+282 757428.7 5910315.0 
+283 757379.1 5910361.0 
+284 757345.7 5910399.0 
+285 757317.4 5910433.0 
+286 757273.5 5910483.0 
+287 757250.6 5910515.0 
+288 757233.9 5910548.0 
+289 757217.8 5910575.0 
+290 757209.6 5910609.0 
+291 757196.3 5910662.0 
+292 757183.8 5910700.0 
+293 757178.7 5910764.0 
+294 757196.9 5910825.0 
+295 757227.5 5910865.0 
+296 757250.2 5910926.0 
+297 757267.0 5910972.0 
+298 757294.6 5911035.0 
+299 757325.2 5911082.0 
+300 757358.4 5911150.0 
+301 757377.0 5911203.0 
+302 757422.8 5911250.0 
+303 757448.7 5911284.0 
+304 757482.4 5911329.0 
+305 757523.1 5911380.0 
+306 757578.2 5911416.0 
+307 757639.1 5911443.0 
+308 757664.8 5911454.0 
+309 757710.8 5911490.0 
+310 757708.0 5911521.0 
+311 757685.7 5911581.0 
+312 757645.0 5911622.0 
+313 757618.3 5911643.0 
+314 757586.3 5911673.0 
+315 757547.1 5911692.0 
+316 757509.9 5911693.0 
+317 757471.9 5911685.0 
+318 757440.8 5911676.0 
+319 757401.5 5911661.0 
+320 757366.0 5911649.0 
+321 757324.2 5911630.0 
+322 757281.2 5911595.0 
+323 757238.5 5911562.0 
+324 757207.5 5911551.0 
+325 757177.3 5911546.0 
+326 757144.5 5911550.0 
+327 757082.9 5911576.0 
+328 757039.3 5911608.0 
+329 756980.0 5911640.0 
+330 756921.4 5911664.0 
+331 756888.5 5911666.0 
+332 756836.4 5911676.0 
+333 756787.3 5911671.0 
+334 756730.3 5911682.0 
+335 756702.6 5911693.0 
+336 756665.4 5911717.0 
+337 756641.6 5911695.0 
+338 756610.4 5911701.0 
+339 756610.0 5911740.0 
+340 756598.6 5911765.0 
+341 756557.1 5911778.0 
+342 756519.6 5911765.0 
+343 756445.7 5911774.0 
+344 756417.1 5911778.0 
+345 756420.0 5911806.0 
+346 756445.4 5911847.0 
+347 756451.1 5911894.0 
+348 756462.4 5911923.0 
+349 756463.8 5911972.0 
+350 756458.3 5911993.0 
+351 756416.3 5911997.0 
+352 756378.1 5911987.0 
+353 756345.5 5911990.0 
+354 756306.4 5911997.0 
+355 756298.8 5912022.0 
+356 756347.4 5912031.0 
+357 756381.6 5912035.0 
+358 756427.4 5912038.0 
+359 756472.7 5912037.0 
+360 756488.6 5912053.0 
+361 756465.7 5912099.0 
+362 756450.3 5912124.0 
+363 756444.8 5912165.0 
+364 756441.5 5912204.0 
+365 756451.7 5912241.0 
+366 756465.4 5912282.0 
+367 756484.4 5912330.0 
+368 756494.2 5912370.0 
+369 756506.4 5912400.0 
+370 756518.6 5912442.0 
+371 756529.0 5912470.0 
+372 756566.5 5912515.0 
+373 756550.5 5912577.0 
+374 756523.5 5912625.0 
+375 756492.3 5912676.0 
+376 756470.6 5912721.0 
+377 756442.3 5912767.0 
+378 756412.1 5912833.0 
+379 756397.2 5912869.0 
+380 756359.8 5912879.0 
+381 756346.4 5912935.0 
+382 756336.3 5912971.0 
+383 756327.6 5913025.0 
+384 756323.8 5913088.0 
+385 756329.5 5913148.0 
+386 756334.8 5913205.0 
+387 756345.8 5913272.0 
+388 756357.9 5913339.0 
+389 756366.3 5913373.0 
+390 756378.6 5913432.0 
+391 756408.6 5913485.0 
+392 756432.7 5913523.0 
+393 756470.8 5913548.0 
+394 756528.6 5913571.0 
+395 756571.5 5913582.0 
+396 756611.9 5913590.0 
+397 756636.9 5913591.0 
+398 756662.6 5913621.0 
+399 756640.1 5913642.0 
+400 756584.9 5913655.0 
+401 756537.7 5913658.0 
+402 756484.7 5913660.0 
+403 756448.5 5913655.0 
+404 756437.6 5913625.0 
+405 756404.8 5913650.0 
+406 756367.5 5913658.0 
+407 756323.8 5913660.0 
+408 756308.8 5913715.0 
+409 756289.3 5913751.0 
+410 756312.9 5913752.0 
+411 756306.9 5913786.0 
+412 756285.2 5913828.0 
+413 756264.3 5913865.0 
+414 756240.6 5913892.0 
+415 756203.3 5913923.0 
+416 756162.7 5913946.0 
+417 756116.1 5913963.0 
+418 756080.8 5913986.0 
+419 756057.4 5914024.0 
+420 756046.0 5914051.0 
+421 756030.9 5914077.0 
+422 756019.9 5914113.0 
+423 756000.5 5914149.0 
+424 755991.1 5914167.0 
+425 755997.3 5914199.0 
+426 755995.1 5914233.0 
+427 755984.7 5914263.0 
+428 755986.8 5914291.0 
+429 755978.8 5914334.0 
+430 755963.8 5914373.0 
+431 755990.4 5914386.0 
+432 755996.9 5914351.0 
+433 756005.1 5914317.0 
+434 756016.6 5914291.0 
+435 756019.6 5914262.0 
+436 756019.2 5914239.0 
+437 756027.7 5914210.0 
+438 756031.4 5914183.0 
+439 756054.8 5914123.0 
+440 756081.4 5914068.0 
+441 756105.8 5914029.0 
+442 756123.6 5914005.0 
+443 756150.0 5913988.0 
+444 756186.3 5913988.0 
+445 756191.9 5913971.0 
+446 756226.1 5913950.0 
+447 756259.5 5913927.0 
+448 756276.4 5913906.0 
+449 756309.1 5913863.0 
+450 756330.8 5913824.0 
+451 756342.5 5913797.0 
+452 756357.7 5913759.0 
+453 756394.8 5913693.0 
+454 756442.5 5913692.0 
+455 756482.9 5913705.0 
+456 756575.4 5913715.0 
+457 756579.3 5913763.0 
+458 756595.8 5913793.0 
+459 756649.6 5913787.0 
+460 756627.0 5913761.0 
+461 756673.0 5913784.0 
+462 756744.0 5913796.0 
+463 756774.0 5913763.0 
+464 756795.8 5913741.0 
+465 756828.8 5913718.0 
+466 756881.3 5913682.0 
+467 756908.8 5913687.0 
+468 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Mesh Segments...
+0 3 4 
+1 9 10 
+2 10 11 
+3 30 31 
+4 38 39 
+5 45 46 
+6 60 61 
+7 63 64 
+8 71 72 
+9 72 73 
+10 74 75 
+11 79 80 
+12 82 83 
+13 84 85 
+14 89 90 
+15 92 93 
+16 94 95 
+17 100 101 
+18 103 104 
+19 121 122 
+20 125 126 
+21 140 141 open
+22 151 152 
+23 161 162 
+24 162 163 
+25 163 164 
+26 165 166 
+27 170 171 
+28 174 175 
+29 179 180 
+30 180 181 
+31 181 182 
+32 185 186 
+33 194 195 
+34 196 197 
+35 232 233 
+36 235 236 
+37 237 238 
+38 254 255 
+39 266 267 
+40 267 268 
+41 268 269 
+42 270 271 
+43 289 290 
+44 309 310 
+45 327 328 
+46 330 331 
+47 336 337 
+48 339 340 
+49 341 342 
+50 347 348 
+51 356 357 
+52 359 360 
+53 370 371 
+54 382 383 
+55 398 399 
+56 403 404 
+57 405 406 
+58 407 408 
+59 410 411 
+60 413 414 
+61 420 421 
+62 423 424 
+63 427 428 
+64 433 434 
+65 435 436 
+66 437 438 
+67 438 439 
+68 440 441 
+69 441 442 
+70 447 448 
+71 450 451 
+72 455 456 
+73 456 457 
+74 463 464 
+75 464 465 
+76 69 70 
+77 75 76 
+78 76 77 
+79 77 78 
+80 78 79 
+81 83 84 
+82 85 86 
+83 0 1 
+84 5 6 
+85 7 8 
+86 8 9 
+87 12 13 
+88 13 14 
+89 16 17 
+90 18 19 
+91 21 22 
+92 22 23 
+93 24 25 
+94 26 27 
+95 37 38 
+96 42 43 
+97 47 48 
+98 52 53 
+99 73 74 
+100 87 88 
+101 90 91 
+102 93 94 
+103 95 96 
+104 96 97 
+105 97 98 
+106 98 99 
+107 117 118 
+108 124 125 
+109 156 157 
+110 157 158 
+111 164 165 
+112 169 170 
+113 171 172 
+114 173 174 
+115 177 178 
+116 183 184 
+117 184 185 
+118 187 188 
+119 200 201 
+120 205 206 
+121 209 210 
+122 214 215 
+123 227 228 
+124 231 232 
+125 236 237 
+126 240 241 
+127 241 242 
+128 242 243 
+129 248 249 
+130 250 251 
+131 251 252 
+132 253 254 
+133 257 258 
+134 286 287 
+135 288 289 
+136 296 297 
+137 302 303 
+138 307 308 
+139 312 313 
+140 313 314 
+141 317 318 
+142 319 320 
+143 334 335 
+144 343 344 
+145 349 350 
+146 361 362 
+147 364 365 
+148 367 368 
+149 368 369 
+150 381 382 
+151 388 389 
+152 395 396 
+153 396 397 
+154 400 401 
+155 402 403 
+156 408 409 
+157 411 412 
+158 416 417 
+159 419 420 
+160 421 422 
+161 426 427 
+162 429 430 
+163 431 432 
+164 432 433 
+165 436 437 
+166 442 443 
+167 444 445 
+168 448 449 
+169 451 452 
+170 466 467 
+171 142 141 
+172 153 152 
+173 154 153 
+174 155 154 
+175 167 166 
+176 173 172 
+177 178 179 
+178 177 176 
+179 203 202 
+180 204 203 
+181 209 208 
+182 245 244 
+183 248 247 
+184 253 252 
+185 256 255 
+186 265 266 
+187 272 271 
+188 278 277 
+189 316 315 
+190 317 316 
+191 319 318 
+192 321 320 
+193 324 323 
+194 325 324 
+195 326 325 
+196 338 337 
+197 345 344 
+198 355 354 
+199 352 353 
+200 358 357 
+201 359 358 
+202 353 354 
+203 351 352 
+204 363 362 
+205 364 363 
+206 366 365 
+207 367 366 
+208 370 369 
+209 372 371 
+210 376 375 
+211 379 380 
+212 379 378 
+213 383 384 
+214 392 391 
+215 393 392 
+216 395 394 
+217 405 404 
+218 407 406 
+219 454 455 
+220 410 409 
+221 413 412 
+222 415 414 
+223 416 415 
+224 446 445 
+225 418 417 
+226 419 418 
+227 423 422 
+228 439 440 
+229 425 424 
+230 426 425 
+231 429 428 
+232 431 430 
+233 435 434 
+234 444 443 
+235 447 446 
+236 450 449 
+237 452 453 
+238 454 453 
+239 458 457 
+240 460 459 
+241 459 458 
+242 463 462 
+243 466 465 
+244 0 467 
+245 2 1 
+246 3 2 
+247 5 4 
+248 12 11 
+249 15 14 
+250 16 15 
+251 18 17 
+252 21 20 
+253 24 23 
+254 26 25 
+255 28 27 
+256 29 28 
+257 32 31 
+258 33 32 
+259 34 33 
+260 40 39 
+261 37 36 
+262 42 41 
+263 45 44 
+264 47 46 
+265 54 53 
+266 56 57 
+267 59 58 
+268 60 59 
+269 62 61 
+270 63 62 
+271 65 64 
+272 66 65 
+273 67 66 
+274 68 67 
+275 69 68 
+276 71 70 
+277 82 81 
+278 81 80 
+279 86 87 
+280 89 88 
+281 92 91 
+282 100 99 
+283 102 101 
+284 103 102 
+285 105 104 
+286 106 105 
+287 107 106 
+288 111 110 
+289 112 111 
+290 113 112 
+291 116 115 
+292 120 119 
+293 121 120 
+294 123 122 
+295 127 126 
+296 145 144 
+297 148 147 
+298 149 148 
+299 151 150 
+300 140 139 
+301 136 137 
+302 139 138 
+303 135 134 
+304 131 130 
+305 133 132 
+306 129 128 
+307 142 143 
+308 143 144 
+309 145 146 
+310 146 147 
+311 149 150 
+312 127 128 
+313 130 129 
+314 132 131 
+315 134 133 
+316 136 135 
+317 138 137 
+318 124 123 
+319 118 119 
+320 117 116 
+321 161 160 
+322 168 167 
+323 169 168 
+324 160 159 
+325 158 159 
+326 155 156 
+327 113 114 
+328 115 114 
+329 109 110 
+330 108 109 
+331 107 108 
+332 175 176 
+333 183 182 
+334 189 188 
+335 187 186 
+336 190 189 
+337 191 190 
+338 192 191 
+339 193 192 
+340 194 193 
+341 196 195 
+342 198 197 
+343 199 198 
+344 200 199 
+345 202 201 
+346 207 206 
+347 205 204 
+348 207 208 
+349 211 210 
+350 212 211 
+351 213 212 
+352 214 213 
+353 216 215 
+354 217 216 
+355 218 217 
+356 219 218 
+357 220 219 
+358 221 220 
+359 222 221 
+360 223 222 
+361 224 223 
+362 225 224 
+363 226 225 
+364 227 226 
+365 229 228 
+366 230 229 
+367 231 230 
+368 234 233 
+369 235 234 
+370 239 238 
+371 240 239 
+372 244 243 
+373 246 245 
+374 247 246 
+375 250 249 
+376 257 256 
+377 262 263 
+378 261 262 
+379 259 260 
+380 260 261 
+381 259 258 
+382 263 264 
+383 264 265 
+384 270 269 
+385 273 272 
+386 274 273 
+387 275 274 
+388 276 275 
+389 277 276 
+390 280 279 
+391 279 278 
+392 281 280 
+393 282 281 
+394 283 282 
+395 284 283 
+396 285 284 
+397 286 285 
+398 287 288 
+399 291 290 
+400 292 291 
+401 293 292 
+402 293 294 
+403 294 295 
+404 295 296 
+405 297 298 
+406 298 299 
+407 299 300 
+408 300 301 
+409 301 302 
+410 303 304 
+411 304 305 
+412 305 306 
+413 306 307 
+414 309 308 
+415 310 311 
+416 311 312 
+417 315 314 
+418 322 321 
+419 323 322 
+420 326 327 
+421 328 329 
+422 329 330 
+423 331 332 
+424 332 333 
+425 334 333 
+426 335 336 
+427 338 339 
+428 340 341 
+429 342 343 
+430 346 345 
+431 346 347 
+432 348 349 
+433 350 351 
+434 360 361 
+435 356 355 
+436 372 373 
+437 373 374 
+438 374 375 
+439 376 377 
+440 377 378 
+441 380 381 
+442 384 385 
+443 385 386 
+444 386 387 
+445 387 388 
+446 389 390 
+447 390 391 
+448 393 394 
+449 398 397 
+450 402 401 
+451 399 400 
+452 460 461 
+453 462 461 
+454 7 6 
+455 20 19 
+456 30 29 
+457 35 34 
+458 36 35 
+459 41 40 
+460 44 43 
+461 49 48 
+462 50 49 
+463 51 50 
+464 52 51 
+465 55 54 
+466 55 56 
+467 57 58 
+0 # <# of holes>, next lines <Hole #> <x> <y> ...Mesh Holes...
+42 # <# of regions>, next lines <Region #> <x> <y> <tag>...Mesh Regions...
+0 759208.571647 5912894.47888 
+1 759226.061621 5912884.48461 
+2 759238.554461 5912890.73103 
+3 759246.050164 5912904.47316 
+4 759236.055893 5912921.96313 
+5 759221.064486 5912933.20669 
+6 759204.823795 5912914.46743 
+7 759187.33382 5912890.73103 
+8 759176.090265 5912873.24106 
+9 759176.090265 5912860.74822 
+10 759197.328092 5912845.75681 
+11 759223.563054 5912844.50753 
+12 759237.305177 5912869.49321 
+13 759243.551596 5912837.01182 
+14 759237.305177 5912814.52471 
+15 759212.319498 5912809.52758 
+16 759193.58024 5912828.26684 
+17 759163.597426 5912818.27257 
+18 759151.104587 5912827.01755 
+19 759154.852439 5912847.0061 
+20 759257.293719 5912930.70812 
+21 759258.543003 5912899.47602 
+22 759268.537274 5912900.7253 
+23 759269.786558 5912888.23247 
+24 759283.528681 5912876.98891 
+25 759301.018656 5912876.98891 
+26 759309.763643 5912893.2296 
+27 759301.018656 5912918.21528 
+28 759279.78083 5912920.71385 
+29 759289.775101 5912943.20096 
+30 759276.032978 5912958.19236 
+31 759252.296584 5912948.19809 
+32 759237.305177 5912971.93449 
+33 759249.798016 5912985.67661 
+34 759268.537274 5912979.43019 
+35 759308.51436 5912955.6938 
+36 759312.262211 5912928.20955 
+37 759327.253618 5912930.70812 
+38 759266.038707 5912830.76541 
+39 759268.537274 5912812.02615 
+40 759253.545868 5912804.53044 
+41 759143.608883 5912859.49894 
+42 # <# of regions>, next lines <Region #> [Max Area] ...Mesh Regions...
+0 
+1 
+2 
+3 
+4 
+5 
+6 
+7 
+8 
+9 
+10 
+11 
+12 
+13 
+14 
+15 
+16 
+17 
+18 
+19 
+20 
+21 
+22 
+23 
+24 
+25 
+26 
+27 
+28 
+29 
+30 
+31 
+32 
+33 
+34 
+35 
+36 
+37 
+38 
+39 
+40 
+41 
Index: /trunk/anuga_core/source/anuga/parallel/data/small.tsh
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/data/small.tsh	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/data/small.tsh	(revision 9501)
@@ -0,0 +1,163 @@
+31 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Triangulation Vertices...
+0 554.0 -242.0
+1 443.0 -190.0
+2 340.0 -184.0
+3 276.0 -237.0
+4 281.0 -347.0
+5 282.0 -380.0
+6 312.0 -425.0
+7 387.0 -472.0
+8 465.0 -487.0
+9 549.0 -469.0
+10 566.0 -413.0
+11 589.0 -359.0
+12 472.0 -258.0
+13 377.0 -411.0
+14 428.0 -257.0
+15 386.0 -278.0
+16 372.0 -325.0
+17 369.0 -371.0
+18 433.0 -422.0
+19 476.0 -361.0
+20 502.0 -304.0
+21 333.0 -225.0
+22 305.0 -244.0
+23 333.0 -270.0
+24 369.0 -237.0
+25 278.5 -292.0
+26 499.90712817 -423.516449623
+27 532.621862616 -366.885237781
+28 498.5 -216.0
+29 322.359287054 -318.872505543
+30 571.5 -300.5
+# attribute column titles ...Triangulation Vertex Titles...
+38 # <# of triangles>, next lines <triangle #> [<vertex #>] [<neigbouring triangle #>] [attribute of region] ...Triangulation Triangles...
+0 29 5 17 1 5 26 building
+1 17 5 6 -1 3 0
+2 10 11 27 28 21 -1
+3 13 17 6 1 6 -1
+4 15 23 16 24 -1 16
+5 16 29 17 0 -1 24
+6 6 7 13 37 3 -1
+7 29 23 25 9 8 24
+8 25 4 29 26 7 -1
+9 25 23 22 10 18 7
+10 22 23 21 13 11 9 building
+11 3 22 21 10 15 18
+12 21 24 2 14 15 13
+13 24 21 23 10 16 12
+14 2 24 1 27 -1 12
+15 21 2 3 -1 11 12
+16 24 23 15 4 30 13
+17 27 30 20 31 36 28 house
+18 22 3 25 -1 9 11
+19 7 8 18 35 37 -1
+20 8 9 26 23 35 -1
+21 26 10 27 2 25 23
+22 26 19 18 -1 35 25 building
+23 10 26 9 20 -1 21
+24 16 23 29 7 5 4
+25 26 27 19 36 22 21
+26 29 4 5 -1 0 8
+27 14 1 24 14 30 29 house
+28 27 11 30 -1 17 2
+29 1 14 12 -1 33 27 oval
+30 14 24 15 16 -1 27
+31 20 30 0 -1 34 17
+32 12 0 28 -1 33 34
+33 12 28 1 -1 29 32
+34 0 12 20 -1 31 32
+35 8 26 18 22 19 20
+36 27 20 19 -1 25 17
+37 18 13 7 6 19 -1
+28 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Triangulation Segments...
+0 14 12 exterior
+1 14 15 exterior
+2 16 15 exterior
+3 17 16 exterior
+4 13 17 exterior
+5 13 18 exterior
+6 19 18 exterior
+7 19 20 exterior
+8 12 20 exterior
+9 21 22
+10 23 22
+11 23 24
+12 21 24
+13 4 25 exterior
+14 7 6 exterior
+15 6 5 exterior
+16 3 2 exterior
+17 5 4 exterior
+18 8 7 exterior
+19 9 10 exterior
+20 9 8 exterior
+21 1 28 exterior
+22 2 1 exterior
+23 0 30 exterior
+24 11 10 exterior
+25 25 3 exterior
+26 28 0 exterior
+27 30 11 exterior
+25 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Mesh Vertices...
+0 554.0 -242.0
+1 443.0 -190.0
+2 340.0 -184.0
+3 276.0 -237.0
+4 281.0 -347.0
+5 282.0 -380.0
+6 312.0 -425.0
+7 387.0 -472.0
+8 465.0 -487.0
+9 549.0 -469.0
+10 566.0 -413.0
+11 589.0 -359.0
+12 472.0 -258.0
+13 377.0 -411.0
+14 428.0 -257.0
+15 386.0 -278.0
+16 372.0 -325.0
+17 369.0 -371.0
+18 433.0 -422.0
+19 476.0 -361.0
+20 502.0 -304.0
+21 333.0 -225.0
+22 305.0 -244.0
+23 333.0 -270.0
+24 369.0 -237.0
+25 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Mesh Segments...
+0 14 12
+1 15 14
+2 16 15
+3 17 16
+4 13 17
+5 18 13
+6 19 18
+7 20 19
+8 12 20
+9 22 21
+10 23 22
+11 24 23
+12 21 24
+13 3 4
+14 6 7
+15 5 6
+16 2 3
+17 4 5
+18 7 8
+19 9 10
+20 8 9
+21 0 1
+22 1 2
+23 11 0
+24 10 11
+1 # <# of holes>, next lines <Hole #> <x> <y> ...Mesh Holes...
+0 418.0 -332.0
+1 # <# of regions>, next lines <Region #> <x> <y> <tag>...Mesh Regions...
+0 334.0 -243.0
+1 # <# of regions>, next lines <Region #> [Max Area] ...Mesh Regions...
+0
+# Geo reference
+56
+0
+0
Index: /trunk/anuga_core/source/anuga/parallel/data/test-100.tsh
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/data/test-100.tsh	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/data/test-100.tsh	(revision 9501)
@@ -0,0 +1,336 @@
+96 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Triangulation Vertices...
+0 320.0 -81.0 
+1 242.0 -120.0 
+2 202.0 -186.0 
+3 227.0 -257.0 
+4 268.0 -320.0 
+5 361.0 -348.0 
+6 483.0 -348.0 
+7 533.0 -267.0 
+8 540.0 -187.0 
+9 507.0 -108.0 
+10 416.0 -77.0 
+11 389.0 -178.0 
+12 333.0 -201.0 
+13 345.0 -259.0 
+14 411.0 -273.0 
+15 445.0 -218.0 
+16 431.0 -187.0 
+17 485.5 -181.048387097 
+18 420.740802676 -132.376254181 
+19 368.0 -79.0 
+20 286.28973607 -240.905571848 
+21 272.446761118 -177.411663435 
+22 472.136950507 -272.784660314 
+23 281.0 -100.5 
+24 536.5 -227.0 
+25 461.5 -92.5 
+26 471.635543882 -137.279532474 
+27 523.5 -147.5 
+28 500.104576293 -243.968525426 
+29 506.146296881 -209.411139587 
+30 476.749236391 -222.078441109 
+31 428.0 -245.5 
+32 441.568475254 -272.892330157 
+33 422.0 -348.0 
+34 456.995452505 -313.363609224 
+35 508.0 -307.5 
+36 463.724689779 -197.852410936 
+37 456.107887128 -166.054631595 
+38 429.013922353 -159.097724475 
+39 445.760060966 -139.271586729 
+40 369.311014249 -130.449178796 
+41 314.5 -334.0 
+42 303.43395757 -286.531855213 
+43 348.813737387 -304.252586537 
+44 391.5 -315.932924732 
+45 247.5 -288.5 
+46 259.22296064 -258.450136726 
+47 214.5 -221.5 
+48 275.273713608 -282.023401713 
+49 253.451414081 -219.89527921 
+50 232.919631881 -195.063509901 
+51 222.0 -153.0 
+52 254.512091962 -150.143692098 
+53 297.67598755 -141.285941935 
+54 269.501603098 -126.253206197 
+55 284.124799572 -208.121591922 
+56 305.344576324 -182.477002286 
+57 340.328224641 -160.152016296 
+58 339.0 -230.0 
+59 314.530684814 -253.56793145 
+60 310.912652413 -220.690485708 
+61 331.474533535 -122.521436689 
+62 378.0 -266.0 
+63 432.366061633 -103.48994811 
+64 484.25 -100.25 
+65 499.125375205 -134.485602763 
+66 500.999212131 -160.308878059 
+67 503.034154992 -274.791959075 
+68 523.200056339 -245.98937993 
+69 458.220092128 -245.955891095 
+70 452.5 -348.0 
+71 483.647567027 -320.43368335 
+72 394.407784777 -147.909201571 
+73 368.441849731 -158.774049695 
+74 361.0 -189.5 
+75 395.955375712 -106.607094255 
+76 295.331137902 -313.444791968 
+77 321.704677142 -306.708964702 
+78 329.726663139 -281.084138344 
+79 337.75 -341.0 
+80 366.665881682 -322.850707148 
+81 391.5 -348.0 
+82 424.273274475 -315.29952698 
+83 234.53998515 -234.394371426 
+84 257.04991762 -196.015824339 
+85 239.944497817 -170.790747946 
+86 277.859808524 -154.319423978 
+87 315.191276731 -159.334465013 
+88 347.871082213 -138.520504813 
+89 354.878663269 -105.075647258 
+90 308.400837876 -106.551675752 
+91 374.642701975 -293.699098679 
+92 513.546294818 -183.814544609 
+93 392.0 -78.0 
+94 439.598293732 -296.819223402 
+95 407.533036224 -297.320197748 
+# attribute column titles ...Triangulation Vertex Titles...
+155 # <# of triangles>, next lines <triangle #> [<vertex #>] [<neigbouring triangle #>] [attribute of region] ...Triangulation Triangles...
+0 76 48 4 70 59 119  
+1 53 86 87 84 79 137  
+2 64 25 26 55 98 -1  
+3 46 45 48 70 66 67  
+4 52 54 1 75 77 78  
+5 43 13 78 62 123 12  
+6 86 52 21 133 136 78  
+7 49 46 20 66 68 69  
+8 72 75 40 142 114 112  
+9 88 73 40 114 141 140  
+10 3 83 47 65 -1 130  
+11 89 75 19 117 143 142  
+12 91 13 43 5 95 147  
+13 22 67 28 105 43 102  
+14 16 38 11 111 -1 54  
+15 69 28 30 40 106 43  
+16 8 92 29 100 38 148  
+17 22 32 94 152 150 42  
+18 34 70 71 47 49 109  
+19 82 94 95 45 154 129  
+20 89 0 61 93 92 143  
+21 56 21 55 27 31 136  
+22 30 36 15 50 106 39  
+23 24 68 7 30 -1 104  
+24 74 57 12 83 -1 116  
+25 25 10 63 94 33 -1  
+26 9 65 27 101 -1 97  
+27 21 84 55 132 21 76  
+28 85 2 50 72 135 134  
+29 17 37 36 52 39 48  
+30 68 67 7 103 23 105  
+31 60 56 55 21 60 88  
+32 28 68 29 104 40 105  
+33 39 25 63 25 96 55  
+34 66 65 26 98 99 101  
+35 39 37 26 99 55 51  
+36 69 15 31 -1 107 106  
+37 27 66 92 149 148 101  
+38 8 29 24 104 -1 16  
+39 17 36 30 22 41 29  
+40 28 29 30 41 15 32  
+41 17 30 29 40 100 39  
+42 32 22 69 43 107 17  
+43 69 22 28 13 15 42  
+44 31 14 32 152 107 -1  
+45 14 95 94 19 152 153  
+46 44 91 80 95 128 146  
+47 6 71 70 18 -1 108  
+48 17 66 37 99 29 149  
+49 71 22 34 150 18 110  
+50 16 15 36 22 52 -1  
+51 37 39 38 56 54 35  
+52 16 36 37 29 54 50  
+53 38 18 72 112 111 56  
+54 16 37 38 51 14 52  
+55 25 39 26 35 2 33  
+56 18 38 39 51 96 53  
+57 90 53 61 79 93 145  
+58 80 79 5 -1 126 124  
+59 41 76 4 0 -1 121  
+60 55 20 60 91 31 68  
+61 81 33 44 63 128 -1  
+62 13 59 78 90 5 87  
+63 82 44 33 61 127 154  
+64 91 14 62 -1 147 153  
+65 83 50 47 72 10 131  
+66 48 20 46 7 3 71  
+67 3 45 46 3 130 -1  
+68 55 49 20 7 60 132  
+69 49 83 46 130 7 131  
+70 4 48 45 3 -1 0  
+71 20 48 42 119 89 66  
+72 47 50 2 28 -1 65  
+73 49 84 50 135 131 132  
+74 85 52 51 77 134 133  
+75 1 54 23 80 -1 4  
+76 21 85 84 135 27 133  
+77 1 51 52 74 4 -1  
+78 86 54 52 4 6 137  
+79 87 61 53 57 1 86  
+80 53 23 54 75 137 145  
+81 58 60 59 91 87 82  
+82 60 58 12 -1 88 81  
+83 57 56 12 88 24 138  
+84 56 87 86 1 136 138  
+85 73 74 11 -1 113 116  
+86 88 61 87 79 139 92  
+87 59 13 58 -1 81 62  
+88 12 56 60 31 82 83  
+89 20 42 59 90 91 71  
+90 78 59 42 89 122 62  
+91 59 60 20 60 89 81  
+92 61 88 89 141 20 86  
+93 90 61 0 20 144 57  
+94 75 63 10 25 151 115  
+95 91 43 80 124 46 12  
+96 39 63 18 115 56 33  
+97 64 65 9 26 -1 98  
+98 65 64 26 2 34 97  
+99 26 37 66 48 34 35  
+100 17 29 92 16 149 41  
+101 27 65 66 34 37 26  
+102 22 35 67 103 13 110  
+103 35 7 67 30 102 -1  
+104 29 68 24 23 38 32  
+105 67 68 28 32 13 30  
+106 15 69 30 15 22 36  
+107 32 69 31 36 44 42  
+108 6 35 71 110 47 -1  
+109 82 70 34 18 129 127  
+110 22 71 35 108 102 49  
+111 38 72 11 113 14 53  
+112 75 72 18 53 115 8  
+113 11 72 73 114 85 111  
+114 40 73 72 113 8 9  
+115 63 75 18 112 96 94  
+116 57 74 73 85 140 24  
+117 19 75 93 151 -1 11  
+118 41 79 77 125 121 -1  
+119 48 76 42 120 71 0  
+120 42 76 77 121 122 119  
+121 41 77 76 120 59 118  
+122 42 77 78 123 90 120  
+123 43 78 77 122 125 5  
+124 79 80 43 95 125 58  
+125 77 79 43 124 123 118  
+126 81 80 5 58 -1 128  
+127 70 82 33 63 -1 109  
+128 80 81 44 61 46 126  
+129 82 34 94 150 19 109  
+130 46 83 3 10 67 69  
+131 50 83 49 69 73 65  
+132 55 84 49 73 68 27  
+133 85 21 52 6 74 76  
+134 2 85 51 74 -1 28  
+135 84 85 50 28 73 76  
+136 56 86 21 6 21 84  
+137 54 86 53 1 80 78  
+138 56 57 87 139 84 83  
+139 87 57 88 140 86 138  
+140 73 88 57 139 116 9  
+141 89 88 40 9 142 92  
+142 75 89 40 141 8 11  
+143 0 89 19 11 -1 20  
+144 0 23 90 145 93 -1  
+145 53 90 23 144 80 57  
+146 91 44 95 154 153 46  
+147 13 91 62 64 -1 12  
+148 27 92 8 16 -1 37  
+149 17 92 66 37 48 100  
+150 22 94 34 129 49 17  
+151 75 10 93 -1 117 94  
+152 14 94 32 17 44 45  
+153 91 95 14 45 64 146  
+154 44 82 95 19 146 63  
+37 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Triangulation Segments...
+0 0 19 inflow
+1 1 23 inflow
+2 2 51 inflow
+3 3 47 inflow
+4 4 45 inflow
+5 5 79 inflow
+6 6 70 outflow
+7 7 35 outflow
+8 8 24 outflow
+9 9 27 outflow
+10 10 25 outflow
+11 74 11 inner
+12 58 12 inner
+13 62 13 inner
+14 31 14 inner
+15 16 15 inner
+16 11 16 inner
+17 25 64 outflow
+18 27 8 outflow
+19 24 7 outflow
+20 31 15 inner
+21 33 81 outflow
+22 35 6 outflow
+23 19 93 inflow
+24 41 4 inflow
+25 45 3 inflow
+26 47 2 inflow
+27 51 1 inflow
+28 23 0 inflow
+29 58 13 inner
+30 62 14 inner
+31 64 9 outflow
+32 70 33 outflow
+33 74 12 inner
+34 79 41 inflow
+35 81 5 outflow
+36 93 10 inflow
+17 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Mesh Vertices...
+0 320.0 -81.0 
+1 242.0 -120.0 
+2 202.0 -186.0 
+3 227.0 -257.0 
+4 268.0 -320.0 
+5 361.0 -348.0 
+6 483.0 -348.0 
+7 533.0 -267.0 
+8 540.0 -187.0 
+9 507.0 -108.0 
+10 416.0 -77.0 
+11 389.0 -178.0 
+12 333.0 -201.0 
+13 345.0 -259.0 
+14 411.0 -273.0 
+15 445.0 -218.0 
+16 431.0 -187.0 
+17 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Mesh Segments...
+0 0 10 inflow
+1 1 0 inflow
+2 2 1 inflow
+3 3 2 inflow
+4 4 3 inflow
+5 5 4 inflow
+6 6 5 outflow
+7 7 6 outflow
+8 8 7 outflow
+9 9 8 outflow
+10 10 9 outflow
+11 12 11 inner
+12 13 12 inner
+13 14 13 inner
+14 15 14 inner
+15 16 15 inner
+16 11 16 inner
+1 # <# of holes>, next lines <Hole #> <x> <y> ...Mesh Holes...
+0 386.0 -220.0
+0 # <# of regions>, next lines <Region #> <x> <y> <tag>...Mesh Regions...
+0 # <# of regions>, next lines <Region #> [Max Area] ...Mesh Regions...
+#geo reference
+56
+0
+0
Index: /trunk/anuga_core/source/anuga/parallel/data/test-20.tsh
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/data/test-20.tsh	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/data/test-20.tsh	(revision 9501)
@@ -0,0 +1,90 @@
+23 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Triangulation Vertices...
+0 363.0 -109.0 
+1 252.0 -205.0 
+2 359.0 -310.0 
+3 520.0 -221.0 
+4 516.0 -88.0 
+5 307.5 -157.0 
+6 338.920383411 -217.208385407 
+7 305.5 -257.5 
+8 377.158518134 -181.456724092 
+9 349.332147792 -149.282483384 
+10 386.041171497 -240.011182692 
+11 405.980226399 -138.213078049 
+12 439.5 -265.5 
+13 439.5 -98.5 
+14 399.25 -287.75 
+15 294.949211613 -214.742231975 
+16 349.542810793 -266.127802335 
+17 445.589807632 -195.839294107 
+18 407.559937694 -206.79583302 
+19 479.75 -243.25 
+20 518.0 -154.5 
+21 481.738694758 -122.310490383 
+22 476.095437884 -165.18642326 
+# attribute column titles ...Triangulation Vertex Titles...
+32 # <# of triangles>, next lines <triangle #> [<vertex #>] [<neigbouring triangle #>] [attribute of region] ...Triangulation Triangles...
+0 9 6 8 20 14 7  
+1 10 14 12 -1 24 18  
+2 11 0 9 5 14 4  
+3 7 2 16 21 15 -1  
+4 13 0 11 2 29 -1  
+5 9 0 5 -1 7 2  
+6 5 15 6 19 7 16  
+7 5 6 9 0 5 6  
+8 18 12 17 27 25 24  
+9 19 3 17 30 27 -1  
+10 15 1 7 -1 19 16  
+11 22 11 17 25 30 13  
+12 10 18 8 17 20 24  
+13 21 11 22 11 31 29  
+14 11 9 8 0 17 2  
+15 16 6 7 19 3 22  
+16 15 5 1 -1 10 6  
+17 18 11 8 14 12 25  
+18 16 14 10 1 22 21  
+19 7 6 15 6 10 15  
+20 10 8 6 0 22 12  
+21 14 16 2 3 -1 18  
+22 6 16 10 18 20 15  
+23 20 4 21 26 31 -1  
+24 12 18 10 12 1 8  
+25 11 18 17 8 11 17  
+26 4 13 21 29 23 -1  
+27 17 12 19 -1 9 8  
+28 3 20 22 31 30 -1  
+29 21 13 11 4 13 26  
+30 3 22 17 11 9 28  
+31 20 21 22 13 28 23  
+12 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Triangulation Segments...
+0 1 5 exterior
+1 2 7 exterior
+2 3 19 exterior
+3 4 20 exterior
+4 0 13 exterior
+5 5 0 exterior
+6 12 14 exterior
+7 7 1 exterior
+8 14 2 exterior
+9 13 4 exterior
+10 19 12 exterior
+11 20 3 exterior
+5 0 # <# of verts> <# of vert attributes>, next lines <vertex #> <x> <y> [attributes] ...Mesh Vertices...
+0 363.0 -109.0 
+1 252.0 -205.0 
+2 359.0 -310.0 
+3 520.0 -221.0 
+4 516.0 -88.0 
+5 # <# of segments>, next lines <segment #> <vertex #>  <vertex #> [boundary tag] ...Mesh Segments...
+0 1 0 
+1 2 1 
+2 3 2 
+3 4 3 
+4 0 4 
+0 # <# of holes>, next lines <Hole #> <x> <y> ...Mesh Holes...
+0 # <# of regions>, next lines <Region #> <x> <y> <tag>...Mesh Regions...
+0 # <# of regions>, next lines <Region #> [Max Area] ...Mesh Regions...
+#geo reference
+-1
+0.0
+0.0
Index: /trunk/anuga_core/source/anuga/parallel/distribute_mesh.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/distribute_mesh.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/distribute_mesh.py	(revision 9501)
@@ -0,0 +1,1682 @@
+#########################################################
+#
+#
+#  Read in a data file and subdivide the triangle list
+#
+#
+#  The final routine, pmesh_divide_metis, does automatic
+# grid partitioning. Once testing has finished on this
+# routine the others should be removed.
+#
+#  Authors: Linda Stals and Matthew Hardy, June 2005
+#  Modified: Linda Stals, Nov 2005
+#            Jack Kelly, Nov 2005
+#            Steve Roberts, Aug 2009 (updating to numpy)
+#
+#
+#########################################################
+
+
+import sys
+from os import sep
+from sys import path
+from math import floor
+
+import numpy as num
+import numpy.lib.arraysetops as numset
+
+from anuga.abstract_2d_finite_volumes.neighbour_mesh import Mesh
+from anuga import indent
+
+try:
+    import local_config as config
+except:
+    import config as config
+
+
+verbose = False
+
+#########################################################
+#
+# If the triangles list is reordered, the quantities
+# assigned to the triangles must also be reorded.
+#
+# *) quantities contain the quantites in the old ordering
+# *) proc_sum[i] contains the number of triangles in
+# processor i
+# *) tri_index is a map from the old triangle ordering to
+# the new ordering, where the new number for triangle
+# i is proc_sum[tri_index[i][0]]+tri_index[i][1]
+#
+# -------------------------------------------------------
+#
+# *) The quantaties are returned in the new ordering
+#
+#########################################################
+
+def reorder(quantities, tri_index, proc_sum):
+
+    # Find the number triangles
+
+    N = len(tri_index)
+
+    # Temporary storage area
+
+    index = num.zeros(N, num.int)
+    q_reord = {}
+
+    # Find the new ordering of the triangles
+
+    for i in xrange(N):
+        bin = tri_index[i][0]
+        bin_off_set = tri_index[i][1]
+        index[i] = proc_sum[bin]+bin_off_set
+
+    # Reorder each quantity according to the new ordering
+
+    for k in quantities:
+        q_reord[k] = num.zeros((N, 3), num.float)
+        for i in range(N):
+            q_reord[k][index[i]]=quantities[k].vertex_values[i]
+    del index
+
+    return q_reord
+
+
+def reorder_new(quantities, epart_order, proc_sum):
+
+    # Find the number triangles
+
+    N = len(epart_order)
+
+    # Temporary storage area
+
+
+    q_reord = {}
+
+    # Reorder each quantity according to the new ordering
+
+    for k in quantities:
+        q_reord[k] = num.zeros((N, 3), num.float)
+        q_reord[k][:] = quantities[k].vertex_values[epart_order]
+        
+
+    return q_reord
+
+
+#########################################################
+#
+# Divide the mesh using a call to metis, through pymetis.
+#
+# -------------------------------------------------------
+#
+# *)  The nodes, triangles, boundary, and quantities are
+# returned. triangles_per_proc defines the subdivision.
+# The first triangles_per_proc[0] triangles are assigned
+# to processor 0, the next triangles_per_proc[1] are
+# assigned to processor 1 etc. The boundary and quantites
+# are ordered the same way as the triangles
+#
+#########################################################
+
+#path.append('..' + sep + 'pymetis')
+
+try:
+    from pymetis.metis import partMeshNodal
+except ImportError:
+    print "***************************************************"
+    print "         Metis is probably not compiled."
+    print "         Read anuga_parallel\pymetis\README"
+    print "***************************************************"
+    raise ImportError
+
+def pmesh_divide_metis(domain, n_procs):
+    # Wrapper for old pmesh_divide_metis which does not return tri_index or r_tri_index
+    nodes, ttriangles, boundary, triangles_per_proc, quantities, tri_index, r_tri_index = pmesh_divide_metis_helper(domain, n_procs)
+
+    return nodes, ttriangles, boundary, triangles_per_proc, quantities
+
+def pmesh_divide_metis_with_map(domain, n_procs):
+
+    return pmesh_divide_metis_helper(domain, n_procs)
+
+def pmesh_divide_metis_helper(domain, n_procs):
+    
+    # Initialise the lists
+    # List, indexed by processor of # triangles.
+    
+    #triangles_per_proc = []
+    
+    # List of lists, indexed by processor of vertex numbers
+    
+    #tri_list = []
+
+    # Serial to Parallel and Parallel to Serial Triangle index maps
+    tri_index = {}
+    r_tri_index = {} # reverse tri index, parallel to serial triangle index mapping
+    
+
+    # Prepare variables for the metis call
+    
+    n_tri = len(domain.triangles)
+    if n_procs != 1: #Because metis chokes on it...
+        n_vert = domain.get_number_of_nodes()
+        t_list = domain.triangles.copy()
+        t_list = num.reshape(t_list, (-1,))
+    
+        # The 1 here is for triangular mesh elements.
+        # FIXME: Should update to Metis 5
+        edgecut, epart, npart = partMeshNodal(n_tri, n_vert, t_list, 1, n_procs)
+        # print edgecut
+        # print npart
+        #print epart
+        del edgecut
+        del npart
+
+        # Sometimes (usu. on x86_64), partMeshNodal returns an array of zero
+        # dimensional arrays. Correct this.
+        if type(epart[0]) == num.ndarray:
+            epart_new = num.zeros(len(epart), num.int)
+            epart_new[:] = epart[:][0]
+#            for i in xrange(len(epart)):
+#                epart_new[i] = epart[i][0]
+            epart = epart_new
+            del epart_new
+
+
+        triangles_per_proc = num.bincount(epart)
+
+        msg =  "Metis created a partition where at least one submesh has no triangles. "
+        msg += "Try using a smaller number of mpi processes."
+        assert num.all(triangles_per_proc>0), msg
+
+        proc_sum = num.zeros(n_procs+1,num.int)
+        proc_sum[1:] = num.cumsum(triangles_per_proc)
+
+
+
+        epart_order = num.argsort(epart, kind='mergesort')
+        new_triangles = domain.triangles[epart_order]
+
+        #new_r_tri_index_flat = num.zeros((n_tri,3), num.int)
+        new_tri_index = num.zeros((n_tri,2), num.int)
+        for i in xrange(n_procs):
+            ids = num.arange(proc_sum[i],proc_sum[i+1])
+            eids = epart_order[ids]
+            nrange = num.reshape(num.arange(triangles_per_proc[i]), (-1,1))
+            nones = num.ones_like(nrange)
+            #print ids.shape
+            #print nrange.shape
+            new_tri_index[eids] = num.concatenate((i*nones, nrange), axis = 1)
+            #new_r_tri_index_flat[ids] = num.concatenate((i*nones, nrange, num.reshape(eids, (-1,1))), axis = 1)
+
+
+        if verbose:
+            from pprint import pprint
+            print 'epart'
+            pprint(epart)
+            print 'new_tri_index'
+            pprint(new_tri_index)
+
+        #print 50*'='
+        
+        new_boundary = {}
+        for b in domain.boundary:
+            t =  new_tri_index[b[0]]
+            #print t
+            new_boundary[proc_sum[t[0]]+t[1], b[1]] = domain.boundary[b]
+
+        #quantities = reorder(domain.quantities, tri_index, proc_sum)
+        new_quantities = reorder_new(domain.quantities, epart_order, proc_sum)
+
+    else:
+        new_boundary = domain.boundary.copy()
+        triangles_per_proc = [n_tri]
+        new_triangles = domain.triangles.copy()
+        new_tri_index = []
+        epart_order = []
+        
+        # This is essentially the same as a chunk of code from reorder.
+        
+        new_quantities = {}
+        for k in domain.quantities:
+            new_quantities[k] = num.zeros((n_tri, 3), num.float)
+            for i in range(n_tri):
+                new_quantities[k][i] = domain.quantities[k].vertex_values[i]
+        
+    # Extract the node list
+    new_nodes = domain.get_nodes().copy()
+    
+
+    return new_nodes, new_triangles, new_boundary, triangles_per_proc, new_quantities, new_tri_index, epart_order
+
+#########################################################
+#
+# Subdivide the domain. This module is primarily
+# responsible for building the ghost layer and
+# communication pattern
+#
+#
+#  Author: Linda Stals, June 2005
+#  Modified: Linda Stals, Nov 2005 (optimise python code)
+#            Steve Roberts, Aug 2009 (convert to numpy)
+#
+#
+#########################################################
+
+
+
+#########################################################
+#
+# Subdivide the triangles into non-overlapping domains.
+#
+#  *)  The subdivision is controlled by triangles_per_proc.
+# The first triangles_per_proc[0] triangles are assigned
+# to the first processor, the second triangles_per_proc[1]
+# are assigned to the second processor etc.
+#
+#  *) nodes, triangles and boundary contains all of the
+# nodes, triangles and boundary tag information for the
+# whole domain. The triangles should be orientated in the
+# correct way and the nodes number consecutively from 0.
+#
+# -------------------------------------------------------
+#
+#  *) A dictionary containing the full_nodes, full_triangles
+# and full_boundary information for each processor is
+# returned. The node information consists of
+# [global_id, x_coord, y_coord].
+#
+#########################################################
+
+def submesh_full(mesh, triangles_per_proc):
+
+    # Initialise
+
+
+    #print triangles_per_proc
+    
+    nodes = mesh.nodes
+    triangles = mesh.triangles
+    boundary = mesh.boundary
+
+    tlower = 0
+    nproc = len(triangles_per_proc)
+    nnodes = len(nodes)
+    node_list = []
+    triangle_list = []
+    boundary_list = []
+    submesh = {}
+
+#    node_range = num.reshape(num.arange(nnodes),(nnodes,1))
+#
+#    #print node_range
+#    tsubnodes = num.concatenate((node_range, nodes), 1)
+
+    #print node_range
+    #print nodes
+    # Loop over processors
+
+    for p in xrange(nproc):
+
+        # Find triangles on processor p
+
+        tupper = triangles_per_proc[p]+tlower
+        subtriangles = triangles[tlower:tupper]
+        triangle_list.append(subtriangles)
+
+        # Find the boundary edges on processor p
+
+        subboundary = {}
+        for k in boundary:
+            if (k[0] >=tlower and k[0] < tupper):
+                subboundary[k]=boundary[k]
+        boundary_list.append(subboundary)
+
+        # Find nodes in processor p
+
+#        nodemap = num.zeros(nnodes, 'i')
+#        for t in subtriangles:
+#            nodemap[t[0]]=1
+#            nodemap[t[1]]=1
+#            nodemap[t[2]]=1
+#
+#        y = tsubnodes.take(num.flatnonzero(nodemap),axis=0)
+
+        #node_list.append(y)
+
+        ids = num.unique(subtriangles.flat)
+
+            
+        lnodes = nodes[ids]
+#       print nodes.shape
+#       print ids.shape
+#       print lnodes.shape
+        x = num.concatenate((num.reshape(ids, (-1,1)),lnodes ), 1)
+#       print x
+#       print y
+        node_list.append(x)
+
+            
+        # Move to the next processor
+
+        tlower = tupper
+
+    # Put the results in a dictionary
+
+    submesh["full_nodes"] = node_list
+    submesh["full_triangles"] = triangle_list
+    submesh["full_boundary"] = boundary_list
+
+    # Clean up before exiting
+
+    #del (nodemap)
+
+    return submesh
+
+
+#########################################################
+#
+# Build the ghost layer of triangles
+#
+#  *) Given the triangle subpartion for the processor
+# build a ghost layer of triangles. The ghost layer
+# consists of two layers of neighbouring triangles.
+#
+#  *) The vertices in the ghost triangles must also
+# be added to the node list for the current processor
+#
+#
+# -------------------------------------------------------
+#
+#  *) The extra triangles and nodes are returned.
+#
+#  *)  The node information consists of
+# [global_id, x_coord, y_coord].
+#
+#  *) The triangle information consists of
+# [triangle number, t], where t = [v1, v2, v3].
+#
+#########################################################
+
+def ghost_layer_old(submesh, mesh, p, tupper, tlower, parameters = None):
+
+    ncoord = mesh.number_of_nodes
+    ntriangles = mesh.number_of_triangles
+
+    if parameters is None:
+        layer_width  = 2
+    else:
+        layer_width = parameters['ghost_layer_width']
+
+
+    trianglemap = num.zeros(ntriangles, num.int)
+
+    # Find the first layer of boundary triangles
+    for t in xrange(tlower, tupper):
+        
+        n = mesh.neighbours[t, 0]
+        if n >= 0:
+            if n < tlower or n >= tupper:
+                trianglemap[n] = 1
+
+        n = mesh.neighbours[t, 1]
+        if n >= 0:
+            if n < tlower or n >= tupper:
+                trianglemap[n] = 1
+
+        n = mesh.neighbours[t, 2]
+        if n >= 0:
+            if n < tlower or n >= tupper:
+                trianglemap[n] = 1
+
+
+    # Find the subsequent layers of ghost triangles
+    for i in range(layer_width-1):
+
+        for t in xrange(ntriangles):
+            if trianglemap[t]==i+1:
+
+                n = mesh.neighbours[t, 0]
+                if n >= 0:
+                    if (n < tlower or n >= tupper) and trianglemap[n] == 0:
+                        trianglemap[n] = i+2
+
+                n = mesh.neighbours[t, 1]
+                if n >= 0:
+                    if (n < tlower or n >= tupper) and trianglemap[n] == 0:
+                        trianglemap[n] = i+2
+
+                n = mesh.neighbours[t, 2]
+                if n >= 0:
+                    if (n < tlower or n >= tupper) and trianglemap[n] == 0:
+                        trianglemap[n] = i+2
+
+    # Build the triangle list and make note of the vertices
+
+
+    nodemap = num.zeros(ncoord, num.int)
+    fullnodes = submesh["full_nodes"][p]
+
+    subtriangles = []
+    for i in xrange(ntriangles):
+        if trianglemap[i] != 0:
+            t = list(mesh.triangles[i])
+            nodemap[t[0]] = 1
+            nodemap[t[1]] = 1
+            nodemap[t[2]] = 1
+
+    trilist = num.reshape(num.arange(ntriangles),(ntriangles,1))
+    tsubtriangles = num.concatenate((trilist, mesh.triangles), 1)
+    subtriangles = tsubtriangles.take(num.flatnonzero(trianglemap),axis=0)
+
+    
+    # Keep a record of the triangle vertices, if they are not already there
+
+    for n in fullnodes:
+        nodemap[int(n[0])] = 0
+
+    nodelist = num.reshape(num.arange(ncoord),(ncoord,1))
+    tsubnodes = num.concatenate((nodelist, mesh.get_nodes()), 1)
+    subnodes = tsubnodes.take(num.flatnonzero(nodemap),axis=0)
+
+    # Clean up before exiting
+
+    del (nodelist)
+    del (trilist)
+    del (tsubnodes)
+    del (nodemap)
+    del (trianglemap)
+
+    # Return the triangles and vertices sitting on the boundary layer
+
+    return subnodes, subtriangles, layer_width
+
+
+
+def ghost_layer(submesh, mesh, p, tupper, tlower, parameters = None):
+
+    ncoord = mesh.number_of_nodes
+    ntriangles = mesh.number_of_triangles
+
+    if parameters is None:
+        layer_width  = 2
+    else:
+        layer_width = parameters['ghost_layer_width']
+
+
+    full_ids = num.arange(tlower, tupper)
+
+    n0 = mesh.neighbours[full_ids, :]
+    n0 = num.unique(n0.flat)
+    n0 = num.extract(n0>=0,n0)
+    n0 = num.extract(num.logical_or(n0<tlower, tupper<= n0), n0)
+
+    layer_cells = {}
+    layer_cells[0] = n0
+
+
+    # Find the subsequent layers of ghost triangles
+    for i in range(layer_width-1):
+
+        # use previous layer as a start
+        n0 = mesh.neighbours[n0, :]
+        n0 = num.unique(n0.flat)
+        n0 = num.extract(n0>=0,n0)
+        n0 = num.extract(num.logical_or(n0<tlower, tupper<= n0), n0)
+
+        for j in xrange(i+1):
+            n0 = numset.setdiff1d(n0,layer_cells[j])
+
+        layer_cells[i+1] = n0
+
+
+    # Build the triangle list and make note of the vertices
+    new_trianglemap = layer_cells[0]
+    for i in range(layer_width-1):
+        new_trianglemap = numset.union1d(new_trianglemap,layer_cells[i+1])
+
+    new_subtriangles = num.concatenate((num.reshape(new_trianglemap, (-1,1)), mesh.triangles[new_trianglemap]), 1)
+
+
+
+
+    fullnodes = submesh["full_nodes"][p]
+    full_nodes_ids = num.array(fullnodes[:,0],num.int)
+
+    new_nodes = num.unique(mesh.triangles[new_trianglemap].flat)
+    new_nodes = numset.setdiff1d(new_nodes,full_nodes_ids)
+
+    new_subnodes = num.concatenate((num.reshape(new_nodes, (-1,1)), mesh.nodes[new_nodes]), 1)
+
+    # Clean up before exiting
+
+    del (new_nodes)
+    del (layer_cells)
+    del (n0)
+    del (new_trianglemap)
+
+    # Return the triangles and vertices sitting on the boundary layer
+
+    return new_subnodes, new_subtriangles, layer_width
+
+#########################################################
+#
+# Find the edges of the ghost trianlges that do not
+# have a neighbour in the current cell. These are
+# treated as a special type of boundary edge.
+#
+#  *) Given the ghost triangles in a particular
+# triangle, use the mesh to find its neigbours. If
+# the neighbour is not in the processor set it to
+# be a boundary edge
+#
+#  *) The vertices in the ghost triangles must also
+# be added to the node list for the current processor
+#
+#  *) The boundary edges for the ghost triangles are
+# ignored.
+#
+# -------------------------------------------------------
+#
+#  *) The type assigned to the ghost boundary edges is 'ghost'
+#
+#  *)  The boundary information is returned as a directorier
+# with the key = (triangle id, edge no) and the values
+# assigned to the key is 'ghost'
+#
+#
+#########################################################
+def is_in_processor(ghost_list, tlower, tupper, n):
+
+    return num.equal(ghost_list,n).any() or (tlower <= n and tupper > n)
+
+
+def ghost_bnd_layer_old(ghosttri, tlower, tupper, mesh, p):
+
+
+    boundary = mesh.boundary
+
+    ghost_list = []
+    subboundary = {}
+
+
+    # FIXME SR: For larger layers need to pass through the correct
+    # boundary tag!
+
+    for t in ghosttri:
+        ghost_list.append(t[0])
+    
+    for t in ghosttri:
+
+        n = mesh.neighbours[t[0], 0]
+        if not is_in_processor(ghost_list, tlower, tupper, n):
+            if boundary.has_key( (t[0], 0) ):
+                subboundary[t[0], 0] = boundary[t[0],0]
+            else:
+                subboundary[t[0], 0] = 'ghost'
+
+
+        n = mesh.neighbours[t[0], 1]
+        if not is_in_processor(ghost_list, tlower, tupper, n):
+            if boundary.has_key( (t[0], 1) ):
+                subboundary[t[0], 1] = boundary[t[0],1]
+            else:
+                subboundary[t[0], 1] = 'ghost'
+
+
+        n = mesh.neighbours[t[0], 2]
+        if not is_in_processor(ghost_list, tlower, tupper, n):
+            if boundary.has_key( (t[0], 2) ):
+                subboundary[t[0], 2] = boundary[t[0],2]
+            else:
+                subboundary[t[0], 2] = 'ghost'
+            
+    return subboundary
+
+
+def ghost_bnd_layer(ghosttri, tlower, tupper, mesh, p):
+
+
+    boundary = mesh.boundary
+
+    ghost_list = []
+    subboundary = {}
+
+
+    new_ghost_list = ghosttri[:,0]
+
+    #print new_ghost_list
+
+    # 0 edge boundaries
+    nghb0 = mesh.neighbours[new_ghost_list,0]
+    gl0 = num.extract(num.logical_or(nghb0 < tlower, nghb0 >= tupper), new_ghost_list)
+    nghb0 = mesh.neighbours[gl0,0]
+    flag = numset.in1d(nghb0,new_ghost_list)
+    gl0 = num.extract(num.logical_not(flag),gl0)
+    edge0 = 0*num.ones_like(gl0)
+    n0 = len(edge0)
+    values0 = ['ghost']*n0
+
+    # 1 edge boundary
+    nghb1 = mesh.neighbours[new_ghost_list,1]
+    gl1 = num.extract(num.logical_or(nghb1 < tlower, nghb1 >= tupper), new_ghost_list)
+    nghb1 = mesh.neighbours[gl1,1]
+    flag = numset.in1d(nghb1,new_ghost_list)
+    gl1 = num.extract(num.logical_not(flag),gl1)
+    edge1 = 1*num.ones_like(gl1)
+    n1 = len(edge1)
+    values1 = ['ghost']*n1
+
+    # 2 edge boundary
+    nghb2 = mesh.neighbours[new_ghost_list,2]
+    gl2 = num.extract(num.logical_or(nghb2 < tlower, nghb2 >= tupper), new_ghost_list)
+    nghb2 = mesh.neighbours[gl2,2]
+    flag = numset.in1d(nghb2,new_ghost_list)
+    gl2 = num.extract(num.logical_not(flag),gl2)
+    edge2 = 2*num.ones_like(gl2)
+    n2 = len(edge2)
+    values2 = ['ghost']*n2
+
+
+    gl = num.concatenate((gl0,gl1,gl2))
+    edge = num.concatenate((edge0,edge1,edge2))
+    values = values0 + values1 + values2
+#    print gl
+#    print edge
+#    print values
+
+    subboundary = dict(zip(zip(gl,edge),values))
+    #intersect with boundary 
+
+    # FIXME SR: these keys should be viewkeys but need python 2.7
+    subboundary.update( (k,boundary[k]) for k in set(subboundary.keys()) & set(boundary.keys()) )
+
+    #print subboundary
+
+
+    return subboundary
+
+#########################################################
+#
+# The ghost triangles on the current processor will need
+# to get updated information from the neighbouring
+# processor containing the corresponding full triangles.
+#
+#  *) The tri_per_proc is used to determine which
+# processor contains the full node copy.
+#
+# -------------------------------------------------------
+#
+#  *) The ghost communication pattern consists of
+# [global node number, neighbour processor number].
+#
+#########################################################
+
+def ghost_commun_pattern_old(subtri, p, tri_per_proc):
+
+    # Loop over the ghost triangles
+
+    ghost_commun = num.zeros((len(subtri), 2), num.int)
+
+    for i in xrange(len(subtri)):
+        global_no = subtri[i][0]
+
+        # Find which processor contains the full triangle
+
+        nproc = len(tri_per_proc)
+        neigh = nproc-1
+        sum = 0
+        for q in xrange(nproc-1):
+            if (global_no < sum+tri_per_proc[q]):
+                neigh = q
+                break
+            sum = sum+tri_per_proc[q]
+
+        # Keep a copy of the neighbour processor number
+
+        ghost_commun[i] = [global_no, neigh]
+
+    return ghost_commun
+
+
+
+def ghost_commun_pattern_old_2(subtri, p, tri_per_proc_range):
+
+    # Loop over the ghost triangles
+
+    ghost_commun = num.zeros((len(subtri), 2), num.int)
+
+    #print tri_per_proc_range
+    #print tri_per_proc
+    
+    for i in xrange(len(subtri)):
+        global_no = subtri[i][0]
+
+        # Find which processor contains the full triangle
+        new_neigh = num.searchsorted(tri_per_proc_range, global_no)
+
+        ghost_commun[i] = [global_no, new_neigh]
+
+    return ghost_commun
+
+
+def ghost_commun_pattern(subtri, p, tri_per_proc_range):
+
+
+    global_no = num.reshape(subtri[:,0],(-1,1))
+    neigh = num.reshape(num.searchsorted(tri_per_proc_range, global_no), (-1,1))
+
+    ghost_commun = num.concatenate((global_no, neigh), axis=1)
+
+
+    return ghost_commun
+
+#########################################################
+#
+# The full triangles in this processor must communicate
+# updated information to neighbouring processor that
+# contain ghost triangles
+#
+#  *) The ghost communication pattern for all of the
+# processor must be built before calling this processor.
+#
+#  *) The full communication pattern is found by looping
+# through the ghost communication pattern for all of the
+# processors. Recall that this information is stored in
+# the form [global node number, neighbour processor number].
+# The full communication for the neighbour processor is
+# then updated.
+#
+# -------------------------------------------------------
+#
+#  *) The full communication pattern consists of
+# [global id, [p1, p2, ...]], where p1, p2 etc contain
+# a ghost node copy of the triangle global id.
+#
+#########################################################
+
+def full_commun_pattern(submesh, tri_per_proc):
+    tlower = 0
+    nproc = len(tri_per_proc)
+    full_commun = []
+
+    # Loop over the processor
+
+    for p in xrange(nproc):
+
+        # Loop over the full triangles in the current processor
+        # and build an empty dictionary
+
+        fcommun = {}
+        tupper = tri_per_proc[p]+tlower
+        for i in xrange(tlower, tupper):
+            fcommun[i] = []
+        full_commun.append(fcommun)
+        tlower = tupper
+
+    # Loop over the processor again
+
+    for p in xrange(nproc):
+
+        # Loop over the ghost triangles in the current processor,
+        # find which processor contains the corresponding full copy
+        # and note that the processor must send updates to this
+        # processor
+
+        for g in submesh["ghost_commun"][p]:
+            neigh = g[1]
+            full_commun[neigh][g[0]].append(p)
+
+    return full_commun
+
+
+#########################################################
+#
+# Given the non-overlapping grid partition, an extra layer
+# of triangles are included to help with the computations.
+# The triangles in this extra layer are not updated by
+# the processor, their updated values must be sent by the
+# processor containing the original, full, copy of the
+# triangle. The communication pattern that controls these
+# updates must also be built.
+#
+#  *) Assumes that full triangles, nodes etc have already
+# been found and stored in submesh
+#
+#  *) See the documentation for ghost_layer,
+# ghost_commun_pattern and full_commun_pattern
+#
+# -------------------------------------------------------
+#
+#  *) The additional information is added to the submesh
+# dictionary. See the documentation for ghost_layer,
+# ghost_commun_pattern and full_commun_pattern
+#
+#  *) The ghost_triangles, ghost_nodes, ghost_boundary,
+# ghost_commun and full_commun is added to submesh
+#########################################################
+
+def submesh_ghost(submesh, mesh, triangles_per_proc, parameters = None):
+
+    nproc = len(triangles_per_proc)
+    tlower = 0
+    ghost_triangles = []
+    ghost_nodes = []
+    ghost_commun = []
+    ghost_bnd = []
+    ghost_layer_width = []
+
+    # Loop over the processors
+    triangles_per_proc_ranges = num.cumsum(triangles_per_proc) - 1
+    
+    for p in xrange(nproc):
+
+        # Find the full triangles in this processor
+
+        tupper = triangles_per_proc[p]+tlower
+
+        # Build the ghost boundary layer
+
+        [subnodes, subtri, layer_width] = \
+                   ghost_layer(submesh, mesh, p, tupper, tlower, parameters)
+        ghost_layer_width.append(layer_width)
+        ghost_triangles.append(subtri)
+        ghost_nodes.append(subnodes)
+
+
+        # Find the new boundary formed by the ghost triangles
+        
+        subbnd = ghost_bnd_layer(subtri, tlower, tupper, mesh, p)
+        ghost_bnd.append(subbnd)
+        
+        # Build the communication pattern for the ghost nodes
+        gcommun = \
+                ghost_commun_pattern(subtri, p, triangles_per_proc_ranges)
+        ghost_commun.append(gcommun)
+
+        # Move to the next processor
+
+        tlower = tupper
+
+
+    # Record the ghost layer and communication pattern
+    submesh["ghost_layer_width"] = ghost_layer_width
+    submesh["ghost_nodes"] = ghost_nodes
+    submesh["ghost_triangles"] = ghost_triangles
+    submesh["ghost_commun"] = ghost_commun
+    submesh["ghost_boundary"] = ghost_bnd
+    
+    # Build the communication pattern for the full triangles
+
+    full_commun = full_commun_pattern(submesh, triangles_per_proc)
+    submesh["full_commun"] = full_commun
+
+    # Return the submesh
+
+    return submesh
+
+
+#########################################################
+#
+# Certain quantities may be assigned to the triangles,
+# these quantities must be subdivided in the same way
+# as the triangles
+#
+#  *) The quantities are ordered in the same way as the
+# triangles
+#
+# -------------------------------------------------------
+#
+#  *) The quantites attached to the full triangles are
+# stored in full_quan
+#
+#  *) The quantities attached to the ghost triangles are
+# stored in ghost_quan
+#########################################################
+
+def submesh_quantities(submesh, quantities, triangles_per_proc):
+
+    nproc = len(triangles_per_proc)
+
+    lower = 0
+
+    # Build an empty dictionary to hold the quantites
+
+    submesh["full_quan"] = {}
+    submesh["ghost_quan"] = {}
+    for k in quantities:
+        submesh["full_quan"][k] = []
+        submesh["ghost_quan"][k] = []
+
+    # Loop trough the subdomains
+
+    for p in xrange(nproc):
+        upper =   lower+triangles_per_proc[p]
+
+        # Find the global ID of the ghost triangles
+
+        global_id = []
+        M = len(submesh["ghost_triangles"][p])
+        for j in xrange(M):
+            global_id.append(submesh["ghost_triangles"][p][j][0])
+
+        # Use the global ID to extract the quantites information from
+        # the full domain
+
+        for k in quantities:
+            submesh["full_quan"][k].append(quantities[k][lower:upper])
+            submesh["ghost_quan"][k].append(num.zeros( (M,3) , num.float))
+            for j in range(M):
+                submesh["ghost_quan"][k][p][j] = \
+                                               quantities[k][global_id[j]]
+
+        lower = upper
+
+    return submesh
+
+#########################################################
+#
+# Build the grid partition on the host.
+#
+#  *) See the documentation for submesh_ghost and
+# submesh_full
+#
+# -------------------------------------------------------
+#
+#  *) A dictionary containing the full_triangles,
+# full_nodes, full_boundary, ghost_triangles, ghost_nodes,
+# ghost_boundary, ghost_commun and full_commun and true boundary polygon is returned.
+#
+#########################################################
+
+def build_submesh(nodes, triangles, boundary, quantities,
+                  triangles_per_proc, parameters = None):
+
+    # Temporarily build the mesh to find the neighbouring
+    # triangles and true boundary polygon\
+
+    mesh = Mesh(nodes, triangles, boundary)
+    boundary_polygon = mesh.get_boundary_polygon()
+    
+
+    # Subdivide into non-overlapping partitions
+
+    submeshf = submesh_full(mesh, triangles_per_proc)
+    
+    # Add any extra ghost boundary layer information
+
+    submeshg = submesh_ghost(submeshf, mesh, triangles_per_proc, parameters)
+
+    # Order the quantities information to be the same as the triangle
+    # information
+
+    submesh = submesh_quantities(submeshg, quantities, \
+                                 triangles_per_proc)
+
+    submesh["boundary_polygon"] = boundary_polygon
+    return submesh
+
+#########################################################
+#
+#  Given the subdivision of the grid assigned to the
+# current processor convert it into a form that is
+# appropriate for the GA datastructure.
+#
+#  The main function of these modules is to change the
+# node numbering. The GA datastructure assumes they
+# are numbered consecutively from 0.
+#
+#  The module also changes the communication pattern
+# datastructure into a form needed by parallel_advection
+#
+#  Authors: Linda Stals and Matthew Hardy, June 2005
+#  Modified: Linda Stals, Nov 2005 (optimise python code)
+#            Steve Roberts, Aug 2009 (updating to numpy)
+#
+#
+#########################################################
+
+ 
+#########################################################
+# Convert the format of the data to that used by ANUGA
+#
+#
+# *) Change the nodes global ID's to an integer value,
+#starting from 0.
+#
+# *) The triangles and boundary edges must also be
+# updated accordingly.
+#
+# -------------------------------------------------------
+#
+# *) The nodes, triangles and boundary edges defined by
+# the new numbering scheme are returned
+#
+#########################################################
+
+def build_local_GA(nodes, triangles, boundaries, tri_map):
+
+    Nnodes =len(nodes)
+    Ntriangles = len(triangles)
+    
+    # Extract the nodes (using the local ID)
+    
+    GAnodes = num.take(nodes, (1, 2), 1)
+
+    # Build a global ID to local ID mapping
+
+    NGlobal = 0
+    for i in xrange(Nnodes):
+        if nodes[i][0] > NGlobal:
+            NGlobal = nodes[i][0]
+
+    node_map = -1*num.ones(int(NGlobal)+1, num.int)
+
+    num.put(node_map, num.take(nodes, (0,), 1).astype(num.int), \
+        num.arange(Nnodes))
+        
+    # Change the global IDs in the triangles to the local IDs
+
+    GAtriangles = num.zeros((Ntriangles, 3), num.int)
+    GAtriangles[:,0] = num.take(node_map, triangles[:,0])
+    GAtriangles[:,1] = num.take(node_map, triangles[:,1])
+    GAtriangles[:,2] = num.take(node_map, triangles[:,2])
+
+    # Change the triangle numbering in the boundaries
+
+    GAboundaries = {}
+    for b in boundaries:
+        GAboundaries[tri_map[b[0]], b[1]] = boundaries[b]
+        
+    
+    return GAnodes, GAtriangles, GAboundaries, node_map
+
+
+#########################################################
+# Change the communication format to that needed by the
+# parallel advection file.
+#
+# *) The index contains [global triangle no,
+# local triangle no.]
+#
+# -------------------------------------------------------
+#
+# *) The ghost_recv and full_send dictionaries are
+# returned.
+#
+# *) ghost_recv dictionary is local id, global id, value
+#
+# *) full_recv dictionary is local id, global id, value
+#
+# *) The information is ordered by the global id. This
+# means that the communication order is predetermined and
+# local and global id do not need to be
+# compared when the information is sent/received.
+#
+#########################################################
+
+def build_local_commun(tri_map, ghostc, fullc, nproc):
+
+    # Initialise
+
+    full_send = {}
+    ghost_recv = {}
+
+    # Build the ghost_recv dictionary (sort the
+    # information by the global numbering)
+    
+    ghostc = num.sort(ghostc, 0)
+    
+    for c in xrange(nproc):
+        s = ghostc[:,0]
+        d = num.compress(num.equal(ghostc[:,1],c), s)
+        if len(d) > 0:
+            ghost_recv[c] = [0, 0]
+            ghost_recv[c][1] = d
+            ghost_recv[c][0] = num.take(tri_map, d)
+            
+    # Build a temporary copy of the full_send dictionary
+    # (this version allows the information to be stored
+    # by the global numbering)
+
+    tmp_send = {}
+    for global_id in fullc:
+        for i in xrange(len(fullc[global_id])):
+            neigh = fullc[global_id][i]
+            if not tmp_send.has_key(neigh):
+                tmp_send[neigh] = []
+            tmp_send[neigh].append([global_id, \
+                                    tri_map[global_id]])
+
+    # Extract the full send information and put it in the form
+    # required for the full_send dictionary
+
+    for neigh in tmp_send:
+        neigh_commun = num.sort(tmp_send[neigh], 0)
+        full_send[neigh] = [0, 0]
+        full_send[neigh][0] = neigh_commun[:,1]
+        full_send[neigh][1] = neigh_commun[:,0]
+
+    return ghost_recv, full_send
+
+
+#########################################################
+# Convert the format of the data to that used by ANUGA
+#
+#
+# *) Change the nodes global ID's to an integer value,
+# starting from 0. The node numbering in the triangles
+# must also be updated to take this into account.
+#
+# *) The triangle number will also change, which affects
+# the boundary tag information and the communication
+# pattern.
+#
+# -------------------------------------------------------
+#
+# *) The nodes, triangles, boundary edges and communication
+# pattern defined by the new numbering scheme are returned
+#
+#########################################################
+
+def build_local_mesh(submesh, lower_t, upper_t, nproc):
+
+    # Combine the full nodes and ghost nodes
+
+    nodes = num.concatenate((submesh["full_nodes"], \
+                         submesh["ghost_nodes"]))
+
+    ghost_layer_width = submesh["ghost_layer_width"]
+    
+    # Combine the full triangles and ghost triangles
+
+    gtri =  num.take(submesh["ghost_triangles"],(1, 2, 3),1)
+    triangles = num.concatenate((submesh["full_triangles"], gtri))
+
+    # Combine the full boundaries and ghost boundaries
+
+    boundaries = submesh["full_boundary"]
+    for b in submesh["ghost_boundary"]:
+        boundaries[b]=submesh["ghost_boundary"][b]
+
+    # Make note of the new triangle numbers, including the ghost
+    # triangles
+
+    NGlobal = upper_t
+    for i in xrange(len(submesh["ghost_triangles"])):
+        id = submesh["ghost_triangles"][i][0]
+        if id > NGlobal:
+            NGlobal = id
+    #index = num.zeros(int(NGlobal)+1, num.int)
+    tri_map = -1*num.ones(int(NGlobal)+1, num.int)
+    tri_map[lower_t:upper_t]=num.arange(upper_t-lower_t)
+    for i in xrange(len(submesh["ghost_triangles"])):
+        tri_map[submesh["ghost_triangles"][i][0]] = i+upper_t-lower_t
+    
+    # Change the node numbering (and update the numbering in the
+    # triangles)
+
+    [GAnodes, GAtriangles, GAboundary, node_map] = \
+    build_local_GA(nodes, triangles, boundaries, tri_map)
+
+    # Extract the local quantities
+    
+    quantities ={}
+    for k in submesh["full_quan"]:
+        Nf = len(submesh["full_quan"][k])
+        Ng = len(submesh["ghost_quan"][k])
+        quantities[k] = num.zeros((Nf+Ng, 3), num.float)
+        quantities[k][0:Nf] = submesh["full_quan"][k] 
+        quantities[k][Nf:Nf+Ng] = submesh["ghost_quan"][k]
+                             
+    # Change the communication pattern into a form needed by
+    # the parallel_adv
+
+    gcommun = submesh["ghost_commun"]
+    fcommun = submesh["full_commun"]
+    [ghost_rec, full_send] = \
+                build_local_commun(tri_map, gcommun, fcommun, nproc)
+
+
+
+    tri_l2g  = extract_l2g_map(tri_map)
+    node_l2g = extract_l2g_map(node_map)
+     
+    return GAnodes, GAtriangles, GAboundary, quantities, ghost_rec, \
+           full_send, tri_map, node_map, tri_l2g, node_l2g, ghost_layer_width
+
+
+#########################################################
+#
+# Handle the communication between the host machine
+# (processor 0) and the processors. The host machine is
+# responsible for the doing the initial grid partitioning.
+#
+# The routines given below should be moved to the
+# build_submesh.py and build_local.py file to allow
+# overlapping of  communication and computation.
+# This should be done after more debugging.
+#
+#
+#  Author: Linda Stals, June 2005
+#  Modified: Linda Stals, Nov 2005 (optimise python code)
+#            Steve Roberts, Aug 2009 (update to numpy)
+#
+#
+#########################################################
+
+
+#########################################################
+#
+# Send the submesh to processor p.
+#
+# *) The order and form is strongly coupled with
+# rec_submesh.
+#
+# -------------------------------------------------------
+#
+# *) All of the information has been sent to processor p.
+#
+#########################################################
+
+def send_submesh(submesh, triangles_per_proc, p, verbose=True):
+
+    import pypar
+    
+    myid = pypar.rank()
+    nprocs = pypar.size()
+    
+    if verbose: print 'P%d: Sending submesh to P%d' %(myid, p)
+    
+    # build and send the tagmap for the boundary conditions
+    
+    tagmap = {}
+    counter = 1
+    for b in submesh["full_boundary"][p]:
+        bkey = submesh["full_boundary"][p][b]
+        if not tagmap.has_key(bkey):
+            tagmap[bkey] = counter
+            counter = counter+1
+    for b in submesh["ghost_boundary"][p]:
+        bkey = submesh["ghost_boundary"][p][b]
+        if not tagmap.has_key(bkey):
+            tagmap[bkey] = counter
+            counter = counter+1
+
+
+    # send boundary tags
+    pypar.send(tagmap, p)
+
+    # send the quantities key information
+    pypar.send(submesh["full_quan"].keys(), p)
+
+    # compress full_commun
+    flat_full_commun = []
+
+    for c in submesh["full_commun"][p]:
+        for i in range(len(submesh["full_commun"][p][c])):
+            flat_full_commun.append([c,submesh["full_commun"][p][c][i]])
+
+    # send the array sizes so memory can be allocated
+
+    setup_array = num.zeros((9,),num.int)
+    setup_array[0] = len(submesh["full_nodes"][p])
+    setup_array[1] = len(submesh["ghost_nodes"][p])
+    setup_array[2] = len(submesh["full_triangles"][p])
+    setup_array[3] = len(submesh["ghost_triangles"][p])
+    setup_array[4] = len(submesh["full_boundary"][p])
+    setup_array[5] = len(submesh["ghost_boundary"][p])
+    setup_array[6] = len(submesh["ghost_commun"][p])
+    setup_array[7] = len(flat_full_commun)
+    setup_array[8] = len(submesh["full_quan"])
+
+    x = num.array(setup_array, num.int)
+    pypar.send(x, p, bypass=True)
+
+
+    # ghost layer width
+    x = num.array(submesh["ghost_layer_width"][p], num.int)
+    pypar.send(x, p, bypass=True)
+
+
+    # send the number of triangles per processor
+    x = num.array(triangles_per_proc)
+    pypar.send(x, p, bypass=True)
+
+    # send the nodes
+    x = num.array(submesh["full_nodes"][p], num.float)
+    pypar.send(x, p, bypass=True)
+
+    x = num.array(submesh["ghost_nodes"][p], num.float)
+    pypar.send(x, p, bypass=True)
+
+    # send the triangles
+    x = num.array(submesh["full_triangles"][p], num.int)
+    pypar.send(x, p, bypass=True)
+
+    # send ghost triangles
+    x = num.array(submesh["ghost_triangles"][p], num.int)
+    pypar.send(x, p, bypass=True)
+
+
+    # send the boundary
+    bc = []
+    for b in submesh["full_boundary"][p]:
+        bc.append([b[0], b[1], tagmap[submesh["full_boundary"][p][b]]])
+
+    x = num.array(bc, num.int)
+    pypar.send(x, p, bypass=True)
+
+
+    bc = []
+    for b in submesh["ghost_boundary"][p]:
+        bc.append([b[0], b[1], tagmap[submesh["ghost_boundary"][p][b]]])
+
+    x = num.array(bc, num.int)
+    pypar.send(x, p, bypass=True)
+
+
+
+    # send the communication pattern
+    x = submesh["ghost_commun"][p]
+    pypar.send(x, p, bypass=True)
+
+
+    x = num.array(flat_full_commun, num.int)
+    pypar.send(x, p, bypass=True)
+
+
+    # send the quantities
+    for k in submesh["full_quan"]:
+        x = num.array(submesh["full_quan"][k][p], num.float)
+        pypar.send(x, p, bypass=True)
+        
+    for k in submesh["ghost_quan"]:
+        x = num.array(submesh["ghost_quan"][k][p], num.float)
+        pypar.send(x,p, bypass=True)
+
+
+
+#########################################################
+#
+# Receive the submesh from processor p.
+#
+# *) The order and form is strongly coupled with
+# send_submesh.
+#
+# -------------------------------------------------------
+#
+# *) All of the information has been received by the
+# processor p and passed into build_local.
+#
+# *) The information is returned in a form needed by the
+# GA datastructure.
+#
+#########################################################
+
+def rec_submesh_flat(p, verbose=True):
+
+    import pypar
+    
+    numprocs = pypar.size()
+    myid = pypar.rank()
+
+    submesh_cell = {}
+    
+    if verbose: print indent+'P%d: Receiving submesh from P%d' %(myid, p)
+
+    # receive the tagmap for the boundary conditions
+    
+    tagmap = pypar.receive(p)
+
+    itagmap = {}
+    for t in tagmap:
+        itagmap[tagmap[t]]=t
+
+    # receive the quantities key information
+    qkeys = pypar.receive(p)
+
+    # recieve information about the array sizes
+    x = num.zeros((9,),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    setup_array = x
+
+    no_full_nodes      = setup_array[0]
+    no_ghost_nodes     = setup_array[1]
+    no_full_triangles  = setup_array[2]
+    no_ghost_triangles = setup_array[3]
+    no_full_boundary   = setup_array[4]
+    no_ghost_boundary  = setup_array[5]
+    no_ghost_commun    = setup_array[6]
+    no_full_commun     = setup_array[7]
+    no_quantities      = setup_array[8]
+
+    
+    # ghost layer width
+    x = num.zeros((1,),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    submesh_cell["ghost_layer_width"] = x[0]
+
+
+    # receive the number of triangles per processor
+    x = num.zeros((numprocs,),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    triangles_per_proc = x
+
+    # receive the full nodes
+    x = num.zeros((no_full_nodes,3),num.float)
+    pypar.receive(p, buffer=x,  bypass=True)
+    submesh_cell["full_nodes"] = x
+
+
+    # receive the ghost nodes
+    x = num.zeros((no_ghost_nodes,3),num.float)
+    pypar.receive(p, buffer=x,  bypass=True)
+    submesh_cell["ghost_nodes"] = x
+    
+    # receive the full triangles
+    x = num.zeros((no_full_triangles,3),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    submesh_cell["full_triangles"] = x
+
+    
+    # receive the ghost triangles
+    x = num.zeros((no_ghost_triangles,4),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    submesh_cell["ghost_triangles"] = x
+
+
+
+    # receive the full boundary
+    x = num.zeros((no_full_boundary,3),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    bnd_c = x
+
+    submesh_cell["full_boundary"] = {}
+    for b in bnd_c:
+        submesh_cell["full_boundary"][b[0],b[1]]=itagmap[b[2]]
+
+
+    # receive the ghost boundary
+    x = num.zeros((no_ghost_boundary,3),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    bnd_c = x
+
+    submesh_cell["ghost_boundary"] = {}
+    for b in bnd_c:
+        submesh_cell["ghost_boundary"][b[0],b[1]]=itagmap[b[2]]
+
+    # receive the ghost communication pattern
+    x = num.zeros((no_ghost_commun,2),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    submesh_cell["ghost_commun"] = x
+    
+    # receive the full communication pattern
+    x = num.zeros((no_full_commun,2),num.int)
+    pypar.receive(p, buffer=x,  bypass=True)
+    full_commun = x
+
+    submesh_cell["full_commun"] = {}
+    for c in full_commun:
+        submesh_cell["full_commun"][c[0]] = []
+    for c in full_commun:
+        submesh_cell["full_commun"][c[0]].append(c[1])
+
+    # receive the quantities
+
+    submesh_cell["full_quan"]={}
+    for i in range(no_quantities):
+        x = num.zeros((no_full_triangles,3), num.float)
+        pypar.receive(p, buffer=x, bypass=True)
+        submesh_cell["full_quan"][qkeys[i]]= x
+
+    submesh_cell["ghost_quan"]={}
+    for i in range(no_quantities):
+        x = num.zeros((no_ghost_triangles,3), num.float)
+        pypar.receive(p, buffer=x, bypass=True)
+        submesh_cell["ghost_quan"][qkeys[i]]= x
+    
+    return submesh_cell, triangles_per_proc,\
+           no_full_nodes, no_full_triangles
+
+
+
+#########################################################
+#
+# Receive the submesh from processor p.
+#
+# *) The order and form is strongly coupled with
+# send_submesh.
+#
+# -------------------------------------------------------
+#
+# *) All of the information has been received by the
+# processor p and passed into build_local.
+#
+# *) The information is returned in a form needed by the
+# GA datastructure.
+#
+#########################################################
+
+def rec_submesh(p, verbose=True):
+
+    import pypar
+    
+    numproc = pypar.size()
+    myid = pypar.rank()
+
+    [submesh_cell, triangles_per_proc,\
+     number_of_full_nodes, number_of_full_triangles] = rec_submesh_flat(p,verbose)
+    
+    # find the full triangles assigned to this processor
+
+    lower_t = 0
+    for i in range(myid):
+        lower_t = lower_t+triangles_per_proc[i]
+    upper_t = lower_t+triangles_per_proc[myid]
+
+    # convert the information into a form needed by the GA
+    # datastructure
+
+    [GAnodes, GAtriangles, boundary, quantities, \
+     ghost_rec, full_send, \
+     tri_map, node_map, tri_l2g, node_l2g, \
+     ghost_layer_width] = \
+     build_local_mesh(submesh_cell, lower_t, upper_t, numproc)
+    
+    return GAnodes, GAtriangles, boundary, quantities,\
+           ghost_rec, full_send,\
+           number_of_full_nodes, number_of_full_triangles, tri_map, node_map,\
+           tri_l2g, node_l2g, ghost_layer_width
+
+
+
+
+#########################################################
+#
+# Extract the submesh that will belong to the
+# processor 0 (i.e. processor zero)
+#
+#  *) See the documentation for build_submesh
+#
+# -------------------------------------------------------
+#
+#  *) A dictionary containing the full_triangles,
+# full_nodes, full_boundary, ghost_triangles, ghost_nodes,
+# ghost_boundary, ghost_commun and full_commun belonging
+# to processor zero are returned.
+#
+#########################################################
+def extract_submesh(submesh, triangles_per_proc, p2s_map=None, p=0):
+
+    
+    submesh_cell = {}
+    submesh_cell["ghost_layer_width"] = submesh["ghost_layer_width"][p]
+    submesh_cell["full_nodes"] = submesh["full_nodes"][p]
+    submesh_cell["ghost_nodes"] = submesh["ghost_nodes"][p]
+    submesh_cell["full_triangles"] = submesh["full_triangles"][p]
+    submesh_cell["ghost_triangles"] = submesh["ghost_triangles"][p]
+    submesh_cell["full_boundary"] = submesh["full_boundary"][p]
+    submesh_cell["ghost_boundary"] = submesh["ghost_boundary"][p]
+    submesh_cell["ghost_commun"] = submesh["ghost_commun"][p]
+    submesh_cell["full_commun"] = submesh["full_commun"][p]
+    submesh_cell["full_quan"] ={}
+    submesh_cell["ghost_quan"]={}
+    for k in submesh["full_quan"]:
+        submesh_cell["full_quan"][k] = submesh["full_quan"][k][p]
+        submesh_cell["ghost_quan"][k] = submesh["ghost_quan"][k][p]
+
+
+    # FIXME SR: I think there is already a structure with this info in the mesh
+    lower_t = 0
+    for i in range(p):
+        lower_t = lower_t+triangles_per_proc[i]
+    upper_t = lower_t+triangles_per_proc[p]
+
+    numprocs = len(triangles_per_proc)
+    points, vertices, boundary, quantities, ghost_recv_dict, \
+            full_send_dict, tri_map, node_map, tri_l2g, node_l2g, \
+            ghost_layer_width = \
+            build_local_mesh(submesh_cell, lower_t, upper_t, numprocs)
+
+
+    if p2s_map is None:
+        pass
+    else:
+        try:
+            tri_l2g = p2s_map[tri_l2g]
+        except:
+            tri_l2g = p2s_map
+
+    return  points, vertices, boundary, quantities, ghost_recv_dict, \
+           full_send_dict, tri_map, node_map, tri_l2g, node_l2g, ghost_layer_width
+           
+
+
+def extract_l2g_map(map):
+    # Extract l2g data  from corresponding map
+    # Maps
+
+    import numpy as num
+
+    b = num.arange(len(map))
+
+    l_ids = num.extract(map>-1,map)
+    g_ids = num.extract(map>-1,b)
+
+
+#    print len(g_ids)
+#    print len(l_ids)
+#    print l_ids
+#    print g_ids
+
+    l2g = num.zeros_like(g_ids)
+    l2g[l_ids] = g_ids
+
+    return l2g
+
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/parallel_advection.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_advection.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_advection.py	(revision 9501)
@@ -0,0 +1,205 @@
+import sys
+
+
+"""Class Parallel_domain -
+2D triangular domains for finite-volume computations of
+the advection equation, with extra structures to allow
+communication between other Parallel_domains and itself
+
+This module contains a specialisation of class Domain from module advection.py
+
+Ole Nielsen, Stephen Roberts, Duncan Gray, Christopher Zoppou
+Geoscience Australia, 2004-2005
+"""
+
+from anuga.advection import *
+
+from anuga import Domain
+
+import numpy as num
+
+import pypar
+
+
+class Parallel_domain(Domain):
+
+    def __init__(self,
+                 coordinates,
+                 vertices,
+                 boundary = None,
+                 full_send_dict = None,
+                 ghost_recv_dict = None,
+                 velocity = None):
+
+        Domain.__init__(self,
+                        coordinates,
+                        vertices,
+                        boundary,
+                        velocity = velocity,
+                        full_send_dict=full_send_dict,
+                        ghost_recv_dict=ghost_recv_dict,
+                        processor=pypar.rank(),
+                        numproc=pypar.size()
+                        )
+
+        N = self.number_of_elements
+
+
+        self.communication_time = 0.0
+        self.communication_reduce_time = 0.0
+
+
+        print 'processor',self.processor
+        print 'numproc',self.numproc
+
+    def check_integrity(self):
+        Domain.check_integrity(self)
+
+        msg = 'Will need to check global and local numbering'
+        assert self.conserved_quantities[0] == 'stage', msg
+
+    def update_timestep(self, yieldstep, finaltime):
+
+        #LINDA:
+        # moved the calculation so that it is done after timestep
+        # has been broadcast
+        
+#        # Calculate local timestep
+#        Domain.update_timestep(self, yieldstep, finaltime)
+
+        import time
+        t0 = time.time()
+
+        # For some reason it looks like pypar only reduces numeric arrays
+        # hence we need to create some dummy arrays for communication
+        ltimestep = num.ones( 1, num.float )
+        ltimestep[0] = self.flux_timestep
+        gtimestep = num.zeros( 1, num.float ) # Buffer for results
+
+        #ltimestep = self.flux_timeste
+
+        #print self.processor, ltimestep, gtimestep
+        
+        gtimestep = pypar.reduce(ltimestep, pypar.MIN, 0, buffer=gtimestep)
+
+        #print self.processor, ltimestep, gtimestep
+        
+        pypar.broadcast(gtimestep,0)
+
+        #print self.processor, ltimestep, gtimestep
+
+        self.flux_timestep = gtimestep[0]
+        
+        self.communication_reduce_time += time.time()-t0
+
+        # LINDA:
+        # Now update time stats
+        
+        # Calculate local timestep
+        Domain.update_timestep(self, yieldstep, finaltime)
+
+    def update_ghosts(self):
+
+        # We must send the information from the full cells and
+        # receive the information for the ghost cells
+        # We have a dictionary of lists with ghosts expecting updates from
+        # the separate processors
+
+        #from Numeric import take,put
+        import numpy as num
+        import time
+        t0 = time.time()
+
+        stage_cv = self.quantities['stage'].centroid_values
+
+        # update of non-local ghost cells
+        for iproc in range(self.numproc):
+            if iproc == self.processor:
+                #Send data from iproc processor to other processors
+                for send_proc in self.full_send_dict:
+                    if send_proc != iproc:
+
+                        Idf  = self.full_send_dict[send_proc][0]
+                        Xout = self.full_send_dict[send_proc][2]
+
+                        N = len(Idf)
+
+                        #for i in range(N):
+                        #    Xout[i,0] = stage_cv[Idf[i]]
+                        Xout[:,0] = num.take(stage_cv, Idf)
+
+                        pypar.send(Xout,send_proc)
+
+
+            else:
+                #Receive data from the iproc processor
+                if  self.ghost_recv_dict.has_key(iproc):
+
+                    # LINDA:
+                    # now store ghost as local id, global id, value
+                    Idg = self.ghost_recv_dict[iproc][0]
+                    X = self.ghost_recv_dict[iproc][2]
+
+                    X = pypar.receive(iproc,X)
+                    N = len(Idg)
+
+                    num.put(stage_cv, Idg, X[:,0])
+                    #for i in range(N):
+                    #    stage_cv[Idg[i]] = X[i,0]
+
+
+        #local update of ghost cells
+        iproc = self.processor
+        if self.full_send_dict.has_key(iproc):
+
+            # LINDA:
+            # now store full as local id, global id, value
+            Idf  = self.full_send_dict[iproc][0]
+
+            # LINDA:
+            # now store ghost as local id, global id, value
+            Idg = self.ghost_recv_dict[iproc][0]
+
+            N = len(Idg)
+
+            #for i in range(N):
+            #    #print i,Idg[i],Idf[i]
+            #    stage_cv[Idg[i]] = stage_cv[Idf[i]]
+
+            num.put(stage_cv, Idg, num.take(stage_cv, Idf))
+
+
+        self.communication_time += time.time()-t0
+
+
+    ## def write_time(self):
+    ##     if self.min_timestep == self.max_timestep:
+    ##         print 'Processor %d, Time = %.4f, delta t = %.8f, steps=%d (%d)'\
+    ##               %(self.processor, self.time, self.min_timestep, self.number_of_steps,
+    ##                 self.number_of_first_order_steps)
+    ##     elif self.min_timestep > self.max_timestep:
+    ##         print 'Processor %d, Time = %.4f, steps=%d (%d)'\
+    ##               %(self.processor, self.time, self.number_of_steps,
+    ##                 self.number_of_first_order_steps)
+    ##     else:
+    ##         print 'Processor %d, Time = %.4f, delta t in [%.8f, %.8f], steps=%d (%d)'\
+    ##               %(self.processor, self.time, self.min_timestep,
+    ##                 self.max_timestep, self.number_of_steps,
+    ##                 self.number_of_first_order_steps)
+
+
+
+    ## def evolve(self, yieldstep = None, finaltime = None):
+    ##     """Specialisation of basic evolve method from parent class
+    ##     """
+
+    ##     #Initialise real time viz if requested
+    ##     if self.time == 0.0:
+    ##         pass
+
+    ##     #Call basic machinery from parent class
+    ##     for t in Domain.evolve(self, yieldstep, finaltime):
+
+    ##         #Pass control on to outer loop for more specific actions
+    ##         yield(t)
+
Index: /trunk/anuga_core/source/anuga/parallel/parallel_api.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_api.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_api.py	(revision 9501)
@@ -0,0 +1,467 @@
+"""Trying to lump parallel stuff into simpler interface
+
+
+"""
+
+import numpy as num
+
+# The abstract Python-MPI interface
+from anuga.utilities.parallel_abstraction import size, rank, get_processor_name
+from anuga.utilities.parallel_abstraction import finalize, send, receive
+from anuga.utilities.parallel_abstraction import pypar_available, barrier
+
+
+
+# ANUGA parallel engine (only load if pypar can)
+if pypar_available:
+    from anuga.parallel.sequential_distribute import sequential_distribute_dump
+    from anuga.parallel.sequential_distribute import sequential_distribute_load
+    
+    from anuga.parallel.distribute_mesh  import send_submesh
+    from anuga.parallel.distribute_mesh  import rec_submesh
+    from anuga.parallel.distribute_mesh  import extract_submesh
+
+    # Mesh partitioning using Metis
+    from anuga.parallel.distribute_mesh import build_submesh
+    from anuga.parallel.distribute_mesh import pmesh_divide_metis_with_map
+
+    from anuga.parallel.parallel_shallow_water import Parallel_domain
+    
+    
+
+from anuga.abstract_2d_finite_volumes.neighbour_mesh import Mesh
+
+#------------------------------------------------------------------------------
+# Read in processor information
+#------------------------------------------------------------------------------
+
+numprocs = size()
+myid = rank()
+processor_name = get_processor_name()
+#print 'I am processor %d of %d on node %s' %(myid, numprocs, processor_name)
+
+
+
+def distribute(domain, verbose=False, debug=False, parameters = None):
+    """ Distribute the domain to all processes
+
+    parameters allows user to change size of ghost layer
+    """
+
+    if not pypar_available or numprocs == 1 : return domain # Bypass
+
+        
+    if myid == 0:
+        from sequential_distribute import Sequential_distribute
+        partition = Sequential_distribute(domain, verbose, debug, parameters)
+
+        partition.distribute(numprocs)
+
+        kwargs, points, vertices, boundary, quantities, boundary_map, \
+                domain_name, domain_dir, domain_store, domain_store_centroids, \
+                domain_minimum_storable_height, domain_minimum_allowed_height, \
+                domain_flow_algorithm, georef = partition.extract_submesh(0)
+        
+        for p in range(1, numprocs):
+
+            tostore = partition.extract_submesh(p)
+
+            send(tostore,p)
+
+    else:
+
+        kwargs, points, vertices, boundary, quantities, boundary_map, \
+                       domain_name, domain_dir, domain_store, domain_store_centroids, \
+                       domain_minimum_storable_height, domain_minimum_allowed_height, \
+                       domain_flow_algorithm, georef = receive(0)
+
+    #---------------------------------------------------------------------------
+    # Now Create parallel domain
+    #---------------------------------------------------------------------------
+    parallel_domain = Parallel_domain(points, vertices, boundary, **kwargs)
+
+
+    #------------------------------------------------------------------------
+    # Copy in quantity data
+    #------------------------------------------------------------------------
+    for q in quantities:
+        try:
+            parallel_domain.set_quantity(q, quantities[q])
+        except KeyError:
+            #print 'Try to create quantity %s'% q
+            from anuga import Quantity
+            Q = Quantity(parallel_domain, name=q, register=True)
+            parallel_domain.set_quantity(q, quantities[q])
+
+    #------------------------------------------------------------------------
+    # Transfer boundary conditions to each subdomain
+    #------------------------------------------------------------------------
+    boundary_map['ghost'] = None  # Add binding to ghost boundary
+    parallel_domain.set_boundary(boundary_map)
+
+
+    #------------------------------------------------------------------------
+    # Transfer other attributes to each subdomain
+    #------------------------------------------------------------------------
+    parallel_domain.set_name(domain_name)
+    parallel_domain.set_datadir(domain_dir)
+    parallel_domain.set_store(domain_store)
+    parallel_domain.set_store_centroids(domain_store_centroids)
+    parallel_domain.set_minimum_storable_height(domain_minimum_storable_height)
+    parallel_domain.set_minimum_allowed_height(domain_minimum_allowed_height)
+    parallel_domain.set_flow_algorithm(domain_flow_algorithm)
+    parallel_domain.geo_reference = georef
+
+
+    return parallel_domain
+
+
+        
+        
+
+
+
+def old_distribute(domain, verbose=False, debug=False, parameters = None):
+    """ Distribute the domain to all processes
+
+    parameters values  
+    """
+
+
+    if debug:
+        verbose = True
+        
+    barrier()
+
+    # FIXME: Dummy assignment (until boundaries are refactored to
+    # be independent of domains until they are applied)
+    if myid == 0:
+        bdmap = {}
+        for tag in domain.get_boundary_tags():
+            bdmap[tag] = None
+    
+    
+        domain.set_boundary(bdmap)
+
+
+    if not pypar_available or numprocs == 1 : return domain # Bypass
+
+    # For some obscure reason this communication must happen prior to
+    # the more complex mesh distribution - Oh Well!
+    if myid == 0:
+        domain_name = domain.get_name()
+        domain_dir = domain.get_datadir()
+        domain_store = domain.get_store()
+        domain_store_centroids = domain.get_store_centroids()
+        domain_smooth = domain.smooth
+        domain_reduction = domain.reduction
+        domain_minimum_storable_height = domain.minimum_storable_height
+        domain_flow_algorithm = domain.get_flow_algorithm()
+        domain_minimum_allowed_height = domain.get_minimum_allowed_height()
+        georef = domain.geo_reference
+        number_of_global_triangles = domain.number_of_triangles
+        number_of_global_nodes = domain.number_of_nodes
+        
+        # FIXME - what other attributes need to be transferred?
+
+        for p in xrange(1, numprocs):
+            # FIXME SR: Creates cPickle dump
+            send((domain_name, domain_dir, domain_store, \
+                  domain_store_centroids, domain_smooth, domain_reduction, \
+                  domain_minimum_storable_height, domain_flow_algorithm, \
+                  domain_minimum_allowed_height, georef, \
+                  number_of_global_triangles, number_of_global_nodes), p)
+    else:
+        if verbose: print 'P%d: Receiving domain attributes' %(myid)
+
+        domain_name, domain_dir, domain_store, \
+                  domain_store_centroids, domain_smooth, domain_reduction, \
+                  domain_minimum_storable_height, domain_flow_algorithm, \
+                  domain_minimum_allowed_height, georef, \
+                  number_of_global_triangles, \
+                  number_of_global_nodes = receive(0)
+
+
+
+    # Distribute boundary conditions
+    # FIXME: This cannot handle e.g. Time_boundaries due to
+    # difficulties pickling functions
+    if myid == 0:
+        boundary_map = domain.boundary_map
+        for p in xrange(1, numprocs):
+            # FIXME SR: Creates cPickle dump
+            send(boundary_map, p)
+    else:
+        if verbose: print 'P%d: Receiving boundary map' %(myid)        
+
+        boundary_map = receive(0)
+        
+
+    send_s2p = False
+
+    if myid == 0:
+        # Partition and distribute mesh.
+        # Structures returned is in the
+        # correct form for the ANUGA data structure
+
+
+        points, vertices, boundary, quantities,\
+                ghost_recv_dict, full_send_dict,\
+                number_of_full_nodes, number_of_full_triangles,\
+                s2p_map, p2s_map, tri_map, node_map, tri_l2g, node_l2g, \
+                ghost_layer_width =\
+                distribute_mesh(domain, verbose=verbose, debug=debug, parameters=parameters)
+            
+        # Extract l2g maps
+        #tri_l2g  = extract_l2g_map(tri_map)
+        #node_l2g = extract_l2g_map(node_map)
+        #tri_l2g = p2s_map[tri_l2g]
+        
+        if debug:
+            print 'P%d' %myid
+            print 'tri_map ',tri_map
+            print 'node_map',node_map
+            print 'tri_l2g', tri_l2g
+            print 'node_l2g', node_l2g
+            print 's2p_map', s2p_map
+            print 'p2s_map', p2s_map
+
+
+        def protocol(x):
+            vanilla=False
+            import pypar
+            control_info, x = pypar.create_control_info(x, vanilla, return_object=True)
+            print 'protocol', control_info[0]
+            
+        # Send serial to parallel (s2p) and parallel to serial (p2s) triangle mapping to proc 1 .. numprocs
+
+
+        if send_s2p :
+            n = len(s2p_map)
+            s2p_map_keys_flat = num.reshape(num.array(s2p_map.keys(),num.int), (n,1) )
+            s2p_map_values_flat = num.array(s2p_map.values(),num.int)
+            s2p_map_flat = num.concatenate( (s2p_map_keys_flat, s2p_map_values_flat), axis=1 )
+
+            n = len(p2s_map)
+            p2s_map_keys_flat = num.reshape(num.array(p2s_map.keys(),num.int), (n,2) )
+            p2s_map_values_flat = num.reshape(num.array(p2s_map.values(),num.int) , (n,1))
+            p2s_map_flat = num.concatenate( (p2s_map_keys_flat, p2s_map_values_flat), axis=1 )
+
+            for p in range(1, numprocs):
+
+                # FIXME SR: Creates cPickle dump
+                send(s2p_map_flat, p)
+                # FIXME SR: Creates cPickle dump
+                #print p2s_map
+                send(p2s_map_flat, p)
+        else:
+            if verbose: print 'Not sending s2p_map and p2s_map'
+            s2p_map = None
+            p2s_map = None
+
+        if verbose: print 'Communication done'
+        
+    else:
+        # Read in the mesh partition that belongs to this
+        # processor
+        if verbose: print 'P%d: Receiving submeshes' %(myid)                
+        points, vertices, boundary, quantities,\
+                ghost_recv_dict, full_send_dict,\
+                number_of_full_nodes, number_of_full_triangles, \
+                tri_map, node_map, tri_l2g, node_l2g, ghost_layer_width =\
+                rec_submesh(0, verbose)
+
+
+
+        # Extract l2g maps
+        #tri_l2g  = extract_l2g_map(tri_map)
+        #node_l2g = extract_l2g_map(node_map)
+        #tri_l2g = p2s_map[tri_l2g]
+        
+        # Receive serial to parallel (s2p) and parallel to serial (p2s) triangle mapping
+        if send_s2p :
+            s2p_map_flat = receive(0)
+            s2p_map = dict.fromkeys(s2p_map_flat[:,0], s2p_map_flat[:,1:2])
+
+            p2s_map_flat = receive(0)
+            p2s_map_keys = [tuple(x) for x in p2s_map_flat[:,0:1]]
+
+            p2s_map = dict.fromkeys(p2s_map_keys, p2s_map_flat[:,2])
+        else:
+            s2p_map = None
+            p2s_map = None
+            
+    #------------------------------------------------------------------------
+    # Build the domain for this processor using partion structures
+    #------------------------------------------------------------------------
+
+    if verbose: print 'myid = %g, no_full_nodes = %g, no_full_triangles = %g' % (myid, number_of_full_nodes, number_of_full_triangles)
+
+    
+    domain = Parallel_domain(points, vertices, boundary,
+                             full_send_dict=full_send_dict,
+                             ghost_recv_dict=ghost_recv_dict,
+                             number_of_full_nodes=number_of_full_nodes,
+                             number_of_full_triangles=number_of_full_triangles,
+                             geo_reference=georef,
+                             number_of_global_triangles = number_of_global_triangles,
+                             number_of_global_nodes = number_of_global_nodes,
+                             s2p_map = s2p_map,
+                             p2s_map = p2s_map, ## jj added this
+                             tri_l2g = tri_l2g, ## SR added this
+                             node_l2g = node_l2g,
+                             ghost_layer_width = ghost_layer_width)
+
+    #------------------------------------------------------------------------
+    # Transfer initial conditions to each subdomain
+    #------------------------------------------------------------------------
+    for q in quantities:
+        domain.set_quantity(q, quantities[q]) 
+
+
+    #------------------------------------------------------------------------
+    # Transfer boundary conditions to each subdomain
+    #------------------------------------------------------------------------
+    boundary_map['ghost'] = None  # Add binding to ghost boundary
+    domain.set_boundary(boundary_map)
+
+
+    #------------------------------------------------------------------------
+    # Transfer other attributes to each subdomain
+    #------------------------------------------------------------------------
+    domain.set_name(domain_name)
+    domain.set_datadir(domain_dir)
+    domain.set_store(domain_store)
+    domain.set_store_centroids(domain_store_centroids)
+    domain.set_store_vertices_smoothly(domain_smooth,domain_reduction)
+    domain.set_minimum_storable_height(domain_minimum_storable_height)
+    domain.set_minimum_allowed_height(domain_minimum_allowed_height)
+    domain.set_flow_algorithm(domain_flow_algorithm)
+    domain.geo_reference = georef   
+
+    #------------------------------------------------------------------------
+    # Return parallel domain to all nodes
+    #------------------------------------------------------------------------
+    return domain    
+
+
+
+
+
+
+def distribute_mesh(domain, verbose=False, debug=False, parameters=None):
+    """ Distribute andsend the mesh info to all the processors.
+    Should only be run from processor 0 and will send info to the other
+    processors.
+    There should be a corresponding  rec_submesh called from all the other
+    processors
+    """
+
+    if debug:
+        verbose = True
+
+    numprocs = size()
+
+    
+    # Subdivide the mesh
+    if verbose: print 'Subdivide mesh'
+    new_nodes, new_triangles, new_boundary, triangles_per_proc, quantities, \
+           s2p_map, p2s_map = \
+           pmesh_divide_metis_with_map(domain, numprocs)
+
+    #PETE: s2p_map (maps serial domain triangles to parallel domain triangles)
+    #      sp2_map (maps parallel domain triangles to domain triangles)
+
+
+
+    # Build the mesh that should be assigned to each processor,
+    # this includes ghost nodes and the communication pattern
+    if verbose: print 'Build submeshes'    
+    submesh = build_submesh(new_nodes, new_triangles, new_boundary, quantities, triangles_per_proc, parameters)
+
+    if verbose:
+        for p in range(numprocs):
+            N = len(submesh['ghost_nodes'][p])                
+            M = len(submesh['ghost_triangles'][p])
+            print 'There are %d ghost nodes and %d ghost triangles on proc %d'\
+                  %(N, M, p)
+
+    #if debug:
+    #    from pprint import pprint
+    #    pprint(submesh)
+
+
+    # Send the mesh partition to the appropriate processor
+    if verbose: print 'Distribute submeshes'        
+    for p in range(1, numprocs):
+        send_submesh(submesh, triangles_per_proc, p2s_map, p, verbose)
+
+    # Build the local mesh for processor 0
+    points, vertices, boundary, quantities, \
+            ghost_recv_dict, full_send_dict, \
+            tri_map, node_map, tri_l2g, node_l2g, ghost_layer_width =\
+              extract_submesh(submesh, triangles_per_proc, p2s_map, 0)
+
+
+              
+    # Keep track of the number full nodes and triangles.
+    # This is useful later if one needs access to a ghost-free domain
+    # Here, we do it for process 0. The others are done in rec_submesh.
+    number_of_full_nodes = len(submesh['full_nodes'][0])
+    number_of_full_triangles = len(submesh['full_triangles'][0])
+        
+    #print
+    #for p in range(numprocs):
+    #    print 'Process %d:' %(p)
+    #
+    #    print 'full_triangles:'
+    #    print submesh['full_triangles'][p]
+    #
+    #    print 'full_nodes:'
+    #    print submesh['full_nodes'][p]
+    #
+    #    print 'ghost_triangles:'
+    #    print submesh['ghost_triangles'][p]#
+    #
+    #    print 'ghost_nodes:'
+    #   print submesh['ghost_nodes'][p]                                
+    #    print
+    #
+    #print 'Receive dict'
+    #print ghost_recv_dict
+    #
+    #print 'Send dict'
+    #print full_send_dict        
+
+
+    # Return structures necessary for building the parallel domain
+    return points, vertices, boundary, quantities,\
+           ghost_recv_dict, full_send_dict,\
+           number_of_full_nodes, number_of_full_triangles, \
+           s2p_map, p2s_map, tri_map, node_map, tri_l2g, node_l2g, \
+           ghost_layer_width
+    
+
+
+## def extract_l2g_map(map):
+##     # Extract l2g data  from corresponding map
+##     # Maps
+
+##     import numpy as num
+    
+##     # FIXME: this is where we loss the original order of 
+##     # sequential domain
+##     b = num.arange(len(map))
+
+##     l_ids = num.extract(map>-1,map)
+##     g_ids = num.extract(map>-1,b)
+
+## #    print len(g_ids)
+## #    print len(l_ids)
+## #    print l_ids
+
+##     l2g = num.zeros_like(g_ids)
+##     l2g[l_ids] = g_ids
+
+##     return l2g
+
Index: /trunk/anuga_core/source/anuga/parallel/parallel_boyd_box_operator.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_boyd_box_operator.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_boyd_box_operator.py	(revision 9501)
@@ -0,0 +1,326 @@
+import anuga
+import math
+import numpy
+
+from anuga.structures.boyd_box_operator import boyd_box_function 
+
+from parallel_inlet_operator import Parallel_Inlet_operator
+from parallel_structure_operator import Parallel_Structure_operator
+
+class Parallel_Boyd_box_operator(Parallel_Structure_operator):
+    """Culvert flow - transfer water from one rectangular box to another.
+    Sets up the geometry of problem
+    
+    This is the base class for culverts. Inherit from this class (and overwrite
+    compute_discharge method for specific subclasses)
+    
+    Input: Two points, pipe_size (either diameter or width, height),
+    mannings_rougness,
+    """
+
+    def __init__(self,
+                 domain,
+                 losses,
+                 width,
+                 z1=0.0,
+                 z2=0.0,
+                 height=None,
+                 end_points=None,
+                 exchange_lines=None,
+                 enquiry_points=None,
+                 invert_elevations=None,
+                 apron=0.1,
+                 manning=0.013,
+                 enquiry_gap=0.0,
+                 smoothing_timescale=0.0,
+                 use_momentum_jet=True,
+                 use_velocity_head=True,
+                 description=None,
+                 label=None,
+                 structure_type='boyd_box',
+                 logging=False,
+                 verbose=False,
+                 master_proc = 0,
+                 procs = None,
+                 inlet_master_proc = [0,0],
+                 inlet_procs = None,
+                 enquiry_proc = [0,0]):
+                     
+        Parallel_Structure_operator.__init__(self,
+                                          domain=domain,
+                                          end_points=end_points,
+                                          exchange_lines=exchange_lines,
+                                          enquiry_points=enquiry_points,
+                                          invert_elevations=invert_elevations,
+                                          width=width,
+                                          height=height,
+                                          z1=0.0,
+                                          z2=0.0,
+                                          diameter= None,
+                                          apron=apron,
+                                          manning=manning,
+                                          enquiry_gap=enquiry_gap,
+                                          description=description,
+                                          label=label,
+                                          structure_type=structure_type,
+                                          logging=logging,
+                                          verbose=verbose,
+                                          master_proc=master_proc,
+                                          procs=procs,
+                                          inlet_master_proc=inlet_master_proc,
+                                          inlet_procs=inlet_procs,
+                                          enquiry_proc=enquiry_proc)
+        
+        if isinstance(losses, dict):
+            self.sum_loss = sum(losses.values())
+        elif isinstance(losses, list):
+            self.sum_loss = sum(losses)
+        else:
+            self.sum_loss = losses
+        
+        self.use_momentum_jet = use_momentum_jet
+        self.use_velocity_head = use_velocity_head
+        
+        self.culvert_length = self.get_culvert_length()
+        self.culvert_width = self.get_culvert_width()
+        self.culvert_height = self.get_culvert_height()
+
+        self.max_velocity = 10.0
+
+        self.inlets = self.get_inlets()
+
+
+        # Stats
+        
+        self.discharge = 0.0
+        self.velocity = 0.0
+        
+        self.case = 'N/A'
+
+        self.domain=domain
+        # May/June 2014 -- allow 'smoothing ' of driving_energy, delta total energy, and outflow_enq_depth
+        self.smoothing_timescale=0.
+        self.smooth_delta_total_energy=0.
+        self.smooth_Q=0.
+        # Set them based on a call to the discharge routine with smoothing_timescale=0.
+        # [values of self.smooth_* are required in discharge_routine, hence dummy values above]
+        Qvd=self.discharge_routine()
+        self.smooth_delta_total_energy=1.0*self.delta_total_energy
+        self.smooth_Q=Qvd[0]
+        # Finally, set the smoothing timescale we actually want
+        self.smoothing_timescale=smoothing_timescale
+
+        '''
+        print "ATTRIBUTES OF PARALLEL BOYD BOX::"
+        for attr in dir(self):
+            print "obj.%s = %s" % (attr, getattr(self, attr))
+        '''
+
+
+    def parallel_safe(self):
+
+        return True
+
+
+
+    def discharge_routine(self):
+
+        import pypar
+
+        local_debug = False
+
+        #Send attributes of both enquiry points to the master proc
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq_total_energy0 = self.inlets[0].get_enquiry_total_energy()
+                enq_stage0 = self.inlets[0].get_enquiry_stage()
+            else:
+                enq_total_energy0 = pypar.receive(self.enquiry_proc[0])
+                enq_stage0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq_total_energy1 = self.inlets[1].get_enquiry_total_energy()
+                enq_stage1 = self.inlets[1].get_enquiry_stage()
+            else:
+                enq_total_energy1 = pypar.receive(self.enquiry_proc[1])
+                enq_stage1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                pypar.send(self.inlets[0].get_enquiry_total_energy(), self.master_proc)
+                pypar.send(self.inlets[0].get_enquiry_stage(), self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                pypar.send(self.inlets[1].get_enquiry_total_energy(), self.master_proc)
+                pypar.send(self.inlets[1].get_enquiry_stage(), self.master_proc)
+
+
+        # Determine the direction of the flow
+        if self.myid == self.master_proc:
+            if self.use_velocity_head:
+                self.delta_total_energy = enq_total_energy0 - enq_total_energy1
+            else:
+                self.delta_total_energy = enq_stage0 - enq_stage1
+
+        self.inflow_index = 0
+        self.outflow_index = 1
+        # master proc orders reversal if applicable
+        if self.myid == self.master_proc:
+            # May/June 2014 -- change the driving forces gradually, with forward euler timestepping 
+            #
+            forward_Euler_smooth=True
+            if(forward_Euler_smooth):
+                # To avoid 'overshoot' we ensure ts<1.
+                if(self.domain.timestep>0.):
+                    ts=self.domain.timestep/max(self.domain.timestep, self.smoothing_timescale,1.0e-06)
+                else:
+                    # This case is included in the serial version, which ensures the unit tests pass
+                    # even when domain.timestep=0.0. 
+                    # Note though the discontinuous behaviour as domain.timestep-->0. from above
+                    ts=1.0
+                self.smooth_delta_total_energy=self.smooth_delta_total_energy+\
+                                        ts*(self.delta_total_energy-self.smooth_delta_total_energy)
+            else:
+                # Use backward euler -- the 'sensible' ts limitation is different in this case
+                # ts --> Inf is reasonable and corresponds to the 'nosmoothing' case
+                ts=self.domain.timestep/max(self.smoothing_timescale, 1.0e-06)
+                self.smooth_delta_total_energy = (self.smooth_delta_total_energy+ts*(self.delta_total_energy))/(1.+ts)
+
+            # Reverse the inflow and outflow direction?
+            if self.smooth_delta_total_energy < 0:
+                self.inflow_index = 1
+                self.outflow_index = 0
+
+                #self.delta_total_energy = -self.delta_total_energy
+                self.delta_total_energy = -self.smooth_delta_total_energy
+
+                for i in self.procs:
+                    if i == self.master_proc: continue
+                    pypar.send(True, i)
+            else:
+                self.delta_total_energy = self.smooth_delta_total_energy
+                for i in self.procs:
+                    if i == self.master_proc: continue
+                    pypar.send(False, i)
+
+            #print "ZZZZ: Delta total energy = %f" %(self.delta_total_energy)
+        else:
+            reverse = pypar.receive(self.master_proc)
+
+            if reverse:
+                self.inflow_index = 1
+                self.outflow_index = 0
+
+        # Get attribute from inflow enquiry point
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[self.inflow_index]:
+                    inflow_enq_depth = self.inlets[self.inflow_index].get_enquiry_depth()
+                    inflow_enq_specific_energy = self.inlets[self.inflow_index].get_enquiry_specific_energy()
+            else:
+                    inflow_enq_depth = pypar.receive(self.enquiry_proc[self.inflow_index])
+                    inflow_enq_specific_energy = pypar.receive(self.enquiry_proc[self.inflow_index])
+        else:
+            if self.myid == self.enquiry_proc[self.inflow_index]:
+                pypar.send(self.inlets[self.inflow_index].get_enquiry_depth(), self.master_proc)
+                pypar.send(self.inlets[self.inflow_index].get_enquiry_specific_energy(), self.master_proc)
+
+        # Get attribute from outflow enquiry point
+        if self.myid == self.master_proc:
+            
+            if self.myid == self.enquiry_proc[self.outflow_index]:
+                outflow_enq_depth = self.inlets[self.outflow_index].get_enquiry_depth()
+            else:
+                outflow_enq_depth = pypar.receive(self.enquiry_proc[self.outflow_index])
+
+            #print "ZZZZZ: outflow_enq_depth = %f" %(outflow_enq_depth)
+
+        else:
+            if self.myid == self.enquiry_proc[self.outflow_index]:
+                pypar.send(self.inlets[self.outflow_index].get_enquiry_depth(), self.master_proc)
+
+
+
+
+        # Master proc computes return values
+        if self.myid == self.master_proc:
+
+            #inflow_enq_specific_energy
+
+
+            if inflow_enq_depth > 0.01: #this value was 0.01:
+                if local_debug:
+                    anuga.log.critical('Specific E & Deltat Tot E = %s, %s'
+                                 % (str(inflow_enq_specific_energy),
+                                    str(self.delta_total_energy)))
+
+                    anuga.log.critical('culvert type = %s' % str(culvert_type))
+
+                # Water has risen above inlet
+
+
+                msg = 'Specific energy at inlet is negative'
+                assert inflow_enq_specific_energy >= 0.0, msg
+
+                if self.use_velocity_head :
+                    self.driving_energy = inflow_enq_specific_energy
+                else:
+                    self.driving_energy = inflow_enq_depth
+                    
+            
+                Q, barrel_velocity, outlet_culvert_depth, flow_area, case = \
+                              boyd_box_function(depth               =self.culvert_height,
+                                                width               =self.culvert_width,
+                                                flow_width          =self.culvert_width,
+                                                length              =self.culvert_length,
+                                                driving_energy      =self.driving_energy,
+                                                delta_total_energy  =self.delta_total_energy,
+                                                outlet_enquiry_depth=outflow_enq_depth,
+                                                sum_loss            =self.sum_loss,
+                                                manning             =self.manning)
+
+                ################################################
+                # Smooth discharge. This can reduce oscillations
+                # 
+                # NOTE: The sign of smooth_Q assumes that
+                #   self.inflow_index=0 and self.outflow_index=1
+                #   , whereas the sign of Q is always positive
+                Qsign=(self.outflow_index-self.inflow_index) # To adjust sign of Q
+                if(forward_Euler_smooth):
+                    self.smooth_Q = self.smooth_Q +ts*(Q*Qsign-self.smooth_Q)
+                else: 
+                    # Try implicit euler method
+                    self.smooth_Q = (self.smooth_Q+ts*(Q*Qsign))/(1.+ts)
+                
+                if numpy.sign(self.smooth_Q)!=Qsign:
+                    # The flow direction of the 'instantaneous Q' based on the
+                    # 'smoothed delta_total_energy' is not the same as the
+                    # direction of smooth_Q. To prevent 'jumping around', let's
+                    # set Q to zero
+                    Q=0.
+                else:
+                    Q = min(abs(self.smooth_Q), Q) #abs(self.smooth_Q)
+                barrel_velocity=Q/flow_area
+            # END CODE BLOCK for DEPTH  > Required depth for CULVERT Flow
+
+            else: # self.inflow.get_enquiry_depth() < 0.01:
+                Q = barrel_velocity = outlet_culvert_depth = 0.0
+                case = 'Inlet dry'
+
+
+            self.case = case
+
+            # Temporary flow limit
+            if barrel_velocity > self.max_velocity:
+                barrel_velocity = self.max_velocity
+                Q = flow_area * barrel_velocity
+
+            
+
+            return Q, barrel_velocity, outlet_culvert_depth
+        else:
+            return None, None, None
+        
+        
Index: /trunk/anuga_core/source/anuga/parallel/parallel_boyd_pipe_operator.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_boyd_pipe_operator.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_boyd_pipe_operator.py	(revision 9501)
@@ -0,0 +1,277 @@
+import anuga
+import math
+
+from anuga.structures.boyd_pipe_operator import boyd_pipe_function
+
+from parallel_inlet_operator import Parallel_Inlet_operator
+from parallel_structure_operator import Parallel_Structure_operator
+
+class Parallel_Boyd_pipe_operator(Parallel_Structure_operator):
+    """Culvert flow - transfer water from one rectangular box to another.
+    Sets up the geometry of problem
+    
+    This is the base class for culverts. Inherit from this class (and overwrite
+    compute_discharge method for specific subclasses)
+    
+    Input: Two points, pipe_size (either diameter or width, height),
+    mannings_rougness,
+    """
+
+    def __init__(self,
+                 domain,
+                 losses,
+                 diameter,
+                 z1=0.0,
+                 z2=0.0,
+                 end_points=None,
+                 exchange_lines=None,
+                 enquiry_points=None,
+                 invert_elevations=None,
+                 apron=0.1,
+                 manning=0.013,
+                 enquiry_gap=0.0,
+                 use_momentum_jet=True,
+                 use_velocity_head=True,
+                 description=None,
+                 label=None,
+                 structure_type='boyd_pipe',
+                 logging=False,
+                 verbose=False,
+                 master_proc = 0,
+                 procs = None,
+                 inlet_master_proc = [0,0],
+                 inlet_procs = None,
+                 enquiry_proc = [0,0]):
+                     
+        Parallel_Structure_operator.__init__(self,
+                                          domain=domain,
+                                          end_points=end_points,
+                                          exchange_lines=exchange_lines,
+                                          enquiry_points=enquiry_points,
+                                          invert_elevations=invert_elevations,
+                                          width=None,
+                                          height=None,
+                                          diameter=diameter,
+                                          z1=0.0,
+                                          z2=0.0,
+                                          apron=apron,
+                                          manning=manning,
+                                          enquiry_gap=enquiry_gap,
+                                          description=description,
+                                          label=label,
+                                          structure_type=structure_type,
+                                          logging=logging,
+                                          verbose=verbose,
+                                          master_proc=master_proc,
+                                          procs=procs,
+                                          inlet_master_proc=inlet_master_proc,
+                                          inlet_procs=inlet_procs,
+                                          enquiry_proc=enquiry_proc)
+        
+        if isinstance(losses, dict):
+            self.sum_loss = sum(losses.values())
+        elif isinstance(losses, list):
+            self.sum_loss = sum(losses)
+        else:
+            self.sum_loss = losses
+        
+        self.use_momentum_jet = use_momentum_jet
+        self.use_velocity_head = use_velocity_head
+        
+        self.culvert_length = self.get_culvert_length()
+        self.culvert_width = self.get_culvert_width()
+        self.culvert_height = self.get_culvert_height()
+        self.culvert_diameter = self.get_culvert_diameter()
+
+        self.max_velocity = 10.0
+
+        self.inlets = self.get_inlets()
+
+
+        # Stats
+        
+        self.discharge = 0.0
+        self.velocity = 0.0
+        
+        self.case = 'N/A'
+
+
+        print 80*'='
+        print "DON'T USE BOYD PIPES AS ALGORITHM NOT VERIFIED YET"
+
+
+        '''
+        print "ATTRIBUTES OF PARALLEL BOYD PIPE::"
+        for attr in dir(self):
+            print "obj.%s = %s" % (attr, getattr(self, attr))
+        '''
+
+
+    def parallel_safe(self):
+        """
+        Set that operator is parallel safe
+        """
+
+        return True
+
+
+    
+    def discharge_routine(self):
+        """
+        Get info from inlets and then call sequential function
+        """
+
+        import pypar
+
+        local_debug = False
+
+        #Send attributes of both enquiry points to the master proc
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq_total_energy0 = self.inlets[0].get_enquiry_total_energy()
+                enq_stage0 = self.inlets[0].get_enquiry_stage()
+            else:
+                enq_total_energy0 = pypar.receive(self.enquiry_proc[0])
+                enq_stage0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq_total_energy1 = self.inlets[1].get_enquiry_total_energy()
+                enq_stage1 = self.inlets[1].get_enquiry_stage()
+            else:
+                enq_total_energy1 = pypar.receive(self.enquiry_proc[1])
+                enq_stage1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                pypar.send(self.inlets[0].get_enquiry_total_energy(), self.master_proc)
+                pypar.send(self.inlets[0].get_enquiry_stage(), self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                pypar.send(self.inlets[1].get_enquiry_total_energy(), self.master_proc)
+                pypar.send(self.inlets[1].get_enquiry_stage(), self.master_proc)
+
+
+        # Determine the direction of the flow
+        if self.myid == self.master_proc:
+            if self.use_velocity_head:
+                self.delta_total_energy = enq_total_energy0 - enq_total_energy1
+            else:
+                self.delta_total_energy = enq_stage0 - enq_stage1
+
+        self.inflow_index = 0
+        self.outflow_index = 1
+        # master proc orders reversal if applicable
+        if self.myid == self.master_proc:
+
+
+            # Reverse the inflow and outflow direction?
+            if self.delta_total_energy < 0:
+                self.inflow_index = 1
+                self.outflow_index = 0
+
+                self.delta_total_energy = -self.delta_total_energy
+
+                for i in self.procs:
+                    if i == self.master_proc: continue
+                    pypar.send(True, i)
+            else:
+                for i in self.procs:
+                    if i == self.master_proc: continue
+                    pypar.send(False, i)
+
+            #print "ZZZZ: Delta total energy = %f" %(self.delta_total_energy)
+        else:
+            reverse = pypar.receive(self.master_proc)
+
+            if reverse:
+                self.inflow_index = 1
+                self.outflow_index = 0
+
+        # Get attribute from inflow enquiry point
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[self.inflow_index]:
+                    inflow_enq_depth = self.inlets[self.inflow_index].get_enquiry_depth()
+                    inflow_enq_specific_energy = self.inlets[self.inflow_index].get_enquiry_specific_energy()
+            else:
+                    inflow_enq_depth = pypar.receive(self.enquiry_proc[self.inflow_index])
+                    inflow_enq_specific_energy = pypar.receive(self.enquiry_proc[self.inflow_index])
+        else:
+            if self.myid == self.enquiry_proc[self.inflow_index]:
+                pypar.send(self.inlets[self.inflow_index].get_enquiry_depth(), self.master_proc)
+                pypar.send(self.inlets[self.inflow_index].get_enquiry_specific_energy(), self.master_proc)
+
+        # Get attribute from outflow enquiry point
+        if self.myid == self.master_proc:
+            if self.myid == self.enquiry_proc[self.outflow_index]:
+                outflow_enq_depth = self.inlets[self.outflow_index].get_enquiry_depth()
+            else:
+                outflow_enq_depth = pypar.receive(self.enquiry_proc[self.outflow_index])
+
+            #print "ZZZZZ: outflow_enq_depth = %f" %(outflow_enq_depth)
+
+        else:
+            if self.myid == self.enquiry_proc[self.outflow_index]:
+                pypar.send(self.inlets[self.outflow_index].get_enquiry_depth(), self.master_proc)
+
+
+
+
+        # Master proc computes return values
+        if self.myid == self.master_proc:
+
+            #inflow_enq_specific_energy
+
+
+            if inflow_enq_depth > 0.01: #this value was 0.01:
+                if local_debug:
+                    anuga.log.critical('Specific E & Deltat Tot E = %s, %s'
+                                 % (str(inflow_enq_specific_energy),
+                                    str(self.delta_total_energy)))
+
+                    anuga.log.critical('culvert type = %s' % str(culvert_type))
+
+                # Water has risen above inlet
+
+
+                msg = 'Specific energy at inlet is negative'
+                assert inflow_enq_specific_energy >= 0.0, msg
+
+                if self.use_velocity_head :
+                    self.driving_energy = inflow_enq_specific_energy
+                else:
+                    self.driving_energy = inflow_enq_depth
+
+
+                Q, barrel_velocity, outlet_culvert_depth, flow_area, case = \
+                              boyd_pipe_function(depth               =inflow_enq_depth,
+                                                diameter             =self.culvert_diameter,
+                                                length               =self.culvert_length,
+                                                driving_energy       =self.driving_energy,
+                                                delta_total_energy   =self.delta_total_energy,
+                                                outlet_enquiry_depth =outflow_enq_depth,
+                                                sum_loss             =self.sum_loss,
+                                                manning              =self.manning)
+
+
+            # END CODE BLOCK for DEPTH  > Required depth for CULVERT Flow
+
+            else: # self.inflow.get_enquiry_depth() < 0.01:
+                Q = barrel_velocity = outlet_culvert_depth = 0.0
+                case = 'Inlet dry'
+
+
+            self.case = case
+
+            # Temporary flow limit
+            if barrel_velocity > self.max_velocity:
+                barrel_velocity = self.max_velocity
+                Q = flow_area * barrel_velocity
+
+
+
+            return Q, barrel_velocity, outlet_culvert_depth
+        else:
+            return None, None, None
Index: /trunk/anuga_core/source/anuga/parallel/parallel_generic_communications.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_generic_communications.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_generic_communications.py	(revision 9501)
@@ -0,0 +1,207 @@
+"""
+Generic implementation of update_timestep and update_ghosts for
+parallel domains (eg shallow_water or advection) 
+
+Ole Nielsen, Stephen Roberts, Duncan Gray, Christopher Zoppou
+Geoscience Australia, 2004-2010
+
+"""
+
+import numpy as num
+
+import anuga.utilities.parallel_abstraction as pypar
+
+
+
+
+def setup_buffers(domain):
+    """Buffers for synchronisation of timesteps
+    """
+
+    domain.local_timestep = num.zeros(1, num.float)
+    domain.global_timestep = num.zeros(1, num.float)
+
+    domain.local_timesteps = num.zeros(domain.numproc, num.float)
+
+    domain.communication_time = 0.0
+    domain.communication_reduce_time = 0.0
+    domain.communication_broadcast_time = 0.0
+
+
+def communicate_flux_timestep(domain, yieldstep, finaltime):
+    """Calculate local timestep
+    """
+
+    import time
+
+    #Compute minimal timestep across all processes
+    domain.local_timestep[0] = domain.flux_timestep
+    t0 = time.time()
+
+
+    import anuga.parallel.pypar_extras as par_exts
+
+    par_exts.allreduce(domain.local_timestep, pypar.MIN,
+                      buffer=domain.global_timestep,
+                      bypass=True)
+
+    domain.communication_reduce_time += time.time()-t0
+
+
+
+
+#    pypar.reduce(domain.local_timestep, pypar.MIN, 0,
+#                      buffer=domain.global_timestep,
+#                      bypass=True)
+#
+#
+#    domain.communication_reduce_time += time.time()-t0
+
+
+    #Broadcast minimal timestep to all processors
+    t0 = time.time()
+    #pypar.broadcast(domain.global_timestep, 0)#, bypass=True)
+
+    domain.communication_broadcast_time += time.time()-t0
+
+    #old_flux_timestep = domain.flux_timestep
+    domain.flux_timestep = domain.global_timestep[0]
+    
+    
+
+def communicate_ghosts_blocking(domain):
+
+    # We must send the information from the full cells and
+    # receive the information for the ghost cells
+    # We have a dictionary of lists with ghosts expecting updates from
+    # the separate processors
+
+    import numpy as num
+    import time
+    t0 = time.time()
+
+    # update of non-local ghost cells
+    for iproc in range(domain.numproc):
+        if iproc == domain.processor:
+            #Send data from iproc processor to other processors
+            for send_proc in domain.full_send_dict:
+                if send_proc != iproc:
+
+                    Idf  = domain.full_send_dict[send_proc][0]
+                    Xout = domain.full_send_dict[send_proc][2]
+
+                    for i, q in enumerate(domain.conserved_quantities):
+                        #print 'Send',i,q
+                        Q_cv =  domain.quantities[q].centroid_values
+                        Xout[:,i] = num.take(Q_cv, Idf)
+
+                    pypar.send(Xout, int(send_proc), use_buffer=True, bypass=True)
+
+
+        else:
+            #Receive data from the iproc processor
+            if  domain.ghost_recv_dict.has_key(iproc):
+
+                Idg = domain.ghost_recv_dict[iproc][0]
+                X   = domain.ghost_recv_dict[iproc][2]
+
+                X = pypar.receive(int(iproc), buffer=X, bypass=True)
+
+                for i, q in enumerate(domain.conserved_quantities):
+                    #print 'Receive',i,q
+                    Q_cv =  domain.quantities[q].centroid_values
+                    num.put(Q_cv, Idg, X[:,i])
+
+    #local update of ghost cells
+    iproc = domain.processor
+    if domain.full_send_dict.has_key(iproc):
+
+        # LINDA:
+        # now store full as local id, global id, value
+        Idf  = domain.full_send_dict[iproc][0]
+
+        # LINDA:
+        # now store ghost as local id, global id, value
+        Idg = domain.ghost_recv_dict[iproc][0]
+
+        for i, q in enumerate(domain.conserved_quantities):
+            #print 'LOCAL SEND RECEIVE',i,q
+            Q_cv =  domain.quantities[q].centroid_values
+            num.put(Q_cv, Idg, num.take(Q_cv, Idf))
+
+    domain.communication_time += time.time()-t0
+
+
+
+def communicate_ghosts_asynchronous(domain):
+
+    # We must send the information from the full cells and
+    # receive the information for the ghost cells
+    # We have a dictionary of lists with ghosts expecting updates from
+    # the separate processors
+    # Using isend and irecv
+
+    import numpy as num
+    import time
+    t0 = time.time()
+
+    # update of non-local ghost cells by copying full cell data into the
+    # Xout buffer arrays
+
+    #iproc == domain.processor
+
+    #Setup send buffer arrays for sending full data to other processors
+    for send_proc in domain.full_send_dict:
+        Idf  = domain.full_send_dict[send_proc][0]
+        Xout = domain.full_send_dict[send_proc][2]
+
+        for i, q in enumerate(domain.conserved_quantities):
+            #print 'Store send data',i,q
+            Q_cv =  domain.quantities[q].centroid_values
+            Xout[:,i] = num.take(Q_cv, Idf)
+
+
+
+#    from pprint import pprint
+#
+#    if pypar.rank() == 0:
+#        print 'Before commun 0'
+#        pprint(domain.full_send_dict)
+#
+#    if pypar.rank() == 1:
+#        print 'Before commun 1'
+#        pprint(domain.full_send_dict)
+
+
+    # Do all the comuunication using isend/irecv via the buffers in the
+    # full_send_dict and ghost_recv_dict
+    from anuga.parallel.pypar_extras import mpiextras
+
+    mpiextras.send_recv_via_dicts(domain.full_send_dict,domain.ghost_recv_dict)
+
+#
+#    if pypar.rank() == 0:
+#        print 'After commun 0'
+#        pprint(domain.ghost_recv_dict)
+#
+#    if pypar.rank() == 1:
+#        print 'After commun 1'
+#        pprint(domain.ghost_recv_dict)
+
+    # Now copy data from receive buffers to the domain
+    for recv_proc in domain.ghost_recv_dict:
+        Idg  = domain.ghost_recv_dict[recv_proc][0]
+        X    = domain.ghost_recv_dict[recv_proc][2]
+
+        #print recv_proc
+        #print X
+
+        for i, q in enumerate(domain.conserved_quantities):
+            #print 'Read receive data',i,q
+            Q_cv =  domain.quantities[q].centroid_values
+            num.put(Q_cv, Idg, X[:,i])
+
+
+    domain.communication_time += time.time()-t0
+
+
Index: /trunk/anuga_core/source/anuga/parallel/parallel_inlet.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_inlet.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_inlet.py	(revision 9501)
@@ -0,0 +1,567 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+import anuga.geometry.polygon
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+from anuga.config import velocity_protection, g
+import math
+
+import numpy as num
+from anuga.structures.inlet import Inlet
+
+
+class Parallel_Inlet(Inlet):
+    """Contains information associated with each inlet
+    """
+
+    """
+    Parallel inlet: 
+    
+    master_proc - coordinates all processors associated with this inlet
+    usually the processors with domains which contains parts of this inlet. 
+    
+    procs - is the list of all processors associated with this inlet.
+
+    (We assume that the above arguments are determined correctly by the parallel_operator_factory)
+    """
+
+    def __init__(self, domain, poly, master_proc = 0, procs = None, verbose=False):
+
+        self.domain = domain
+        self.poly = num.asarray(poly, dtype=num.float64)
+        self.verbose = verbose
+
+        self.line = True
+        if len(self.poly) > 2:
+            self.line = False
+
+        self.master_proc = master_proc
+
+        if procs is None:
+            self.procs = [self.master_proc]
+        else:
+            self.procs = procs
+
+        import pypar
+        self.myid = pypar.rank()
+
+        self.compute_triangle_indices()
+        self.compute_area()
+        #self.compute_inlet_length()
+
+
+
+    def compute_triangle_indices(self):
+
+
+        domain_centroids = self.domain.get_centroid_coordinates(absolute=True)
+        vertex_coordinates = self.domain.get_full_vertex_coordinates(absolute=True)
+
+
+        if self.line: # poly is a line
+            self.triangle_indices = line_intersect(vertex_coordinates, self.poly)
+
+        else: # poly is a polygon
+
+            tris_0 = line_intersect(vertex_coordinates, [self.poly[0],self.poly[1]])
+            tris_1 = inside_polygon(domain_centroids, self.poly)
+            self.triangle_indices = num.union1d(tris_0, tris_1)
+            #print self.triangle_indices
+
+        for i in self.triangle_indices:
+            assert self.domain.tri_full_flag[i] == 1
+            
+
+    def compute_area(self):
+
+        # Compute inlet area as the sum of areas of triangles identified
+        # by line. Must be called after compute_inlet_triangle_indices().
+        if len(self.triangle_indices) == 0:
+            region = 'Inlet line=%s' % (self.line)
+            msg = 'No triangles have been identified in region '
+            print "WARNING: " + msg
+
+        self.area = 0.0
+        for j in self.triangle_indices:
+            self.area += self.domain.areas[j]
+
+        msg = 'Inlet exchange area has area = %f' % self.area
+        assert self.area >= 0.0
+
+    def compute_inlet_length(self):
+        """ Compute the length of the inlet within this domain (as
+        defined by the input line
+        """
+
+        point0 = self.line[0]
+        point1 = self.line[1]
+
+        self.inlet_length = anuga.geometry.polygon.line_length(self.line)
+
+
+    def get_inlet_length(self):
+        # LOCAL
+        msg = "Warning: compute_inlet_length not implemented"
+        warnings.warn(msg)
+        return self.inlet_length
+
+    def get_line(self):
+        return self.line
+
+    def get_area(self):
+        # LOCAL
+        return self.area
+
+    def get_global_area(self):
+        # GLOBAL: Master processor gathers area from all child processors, and returns value
+
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+
+        import pypar
+        local_area = self.area
+        area = local_area
+
+        if self.myid == self.master_proc:
+
+            for i in self.procs:
+                if i == self.master_proc: continue
+
+                val = pypar.receive(i)
+                area = area + val
+        else:
+            pypar.send(area, self.master_proc)
+
+        return area
+
+
+    def get_areas(self):
+        # Must be called after compute_inlet_triangle_indices().
+        # LOCAL
+        
+        return self.domain.areas.take(self.triangle_indices)
+
+
+    def get_stages(self):
+        # LOCAL
+
+        return self.domain.quantities['stage'].centroid_values.take(self.triangle_indices)
+
+
+    def get_average_stage(self):
+        # LOCAL
+
+        return num.sum(self.get_stages()*self.get_areas())/self.area
+
+    def get_global_average_stage(self):
+        # GLOBAL: Master processor gathers stages from all child processors, and returns average
+
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+
+        import pypar
+        local_stage = num.sum(self.get_stages()*self.get_areas())
+        global_area = self.get_global_area()
+
+
+
+        global_stage = local_stage
+
+        if self.myid == self.master_proc:
+            for i in self.procs:
+                if i == self.master_proc: continue
+
+                val = pypar.receive(i)
+                global_stage = global_stage + val
+        else:
+            pypar.send(local_stage, self.master_proc)
+
+
+        if global_area > 0.0:
+            return global_stage/global_area
+        else:
+            return 0.0
+
+    def get_elevations(self):
+        # LOCAL
+        return self.domain.quantities['elevation'].centroid_values.take(self.triangle_indices)
+
+    def get_average_elevation(self):
+        # LOCAL
+
+        if self.area > 0:
+            return num.sum(self.get_elevations()*self.get_areas())/self.area
+        else:
+            return 0.0
+
+
+    def get_xmoms(self):
+        # LOCAL
+        return self.domain.quantities['xmomentum'].centroid_values.take(self.triangle_indices)
+
+
+    def get_average_xmom(self):
+        # LOCAL
+
+        if self.area > 0:
+            return num.sum(self.get_xmoms()*self.get_areas())/self.area
+        else:
+            return 0.0
+
+    def get_global_average_xmom(self):
+        # GLOBAL: master proc gathers all xmom values and returns average
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+
+        import pypar
+        global_area = self.get_global_area()
+        local_xmoms = num.sum(self.get_xmoms()*self.get_areas())
+        global_xmoms = local_xmoms
+
+        if self.myid == self.master_proc:
+            for i in self.procs:
+                if i == self.master_proc: continue
+
+                val = pypar.receive(i)
+                global_xmoms = global_xmoms + val
+        else:
+            pypar.send(local_xmoms, self.master_proc)
+
+
+        if global_area > 0.0:
+            return global_xmoms/global_area
+        else:
+            return 0.0
+
+
+    def get_ymoms(self):
+        # LOCAL
+        return self.domain.quantities['ymomentum'].centroid_values.take(self.triangle_indices)
+
+
+    def get_average_ymom(self):
+        # LOCAL
+        return num.sum(self.get_ymoms()*self.get_areas())/self.area
+
+    def get_global_average_ymom(self):
+        # GLOBAL: master proc gathers all ymom values and returns average
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+
+        import pypar
+        global_area = self.get_global_area()
+        local_ymoms = num.sum(self.get_ymoms()*self.get_areas())
+        global_ymoms = local_ymoms
+
+        if self.myid == self.master_proc:
+            for i in self.procs:
+                if i == self.master_proc: continue
+
+                val = pypar.receive(i)
+                global_ymoms = global_ymoms + val
+        else:
+            pypar.send(local_ymoms, self.master_proc)
+
+
+        if global_area > 0.0:
+            return global_ymoms/global_area
+        else:
+            return 0.0
+
+    def get_depths(self):
+        # LOCAL
+        return self.get_stages() - self.get_elevations()
+
+
+    def get_total_water_volume(self):
+        # LOCAL
+       return num.sum(self.get_depths()*self.get_areas())
+
+    def get_global_total_water_volume(self):
+        # GLOBAL: master proc gathers total water volumes from each proc and returns average
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+
+        import pypar
+        local_volume = num.sum(self.get_depths()*self.get_areas())
+        volume = local_volume
+
+        if self.myid == self.master_proc:
+
+            for i in self.procs:
+                if i == self.master_proc: continue
+
+                val = pypar.receive(i)
+                volume = volume + val
+        else:
+            pypar.send(volume, self.master_proc)
+
+        return volume
+
+    def get_average_depth(self):
+        # LOCAL
+
+        if self.area > 0.0:
+            return self.get_total_water_volume()/self.area
+        else:
+            return 0.0
+
+    def get_global_average_depth(self):
+        # GLOBAL: master proc gathers all depth values and returns average
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+        
+        area = self.get_global_area()
+        total_water_volume = self.get_global_total_water_volume()
+
+
+        if area > 0.0:
+            return total_water_volume / area
+        else:
+            return 0.0
+
+
+    def get_velocities(self):
+        #LOCAL
+        depths = self.get_depths()
+        u = depths*self.get_xmoms()/(depths**2 + velocity_protection)
+        v = depths*self.get_ymoms()/(depths**2 + velocity_protection)
+
+        return u, v
+
+
+    def get_xvelocities(self):
+        #LOCAL
+        depths = self.get_depths()
+        return depth*self.get_xmoms()/(depths**2 + velocity_protection)
+
+    def get_yvelocities(self):
+        #LOCAL
+        depths = self.get_depths()
+        return depths*self.get_ymoms()/(depths**2 + velocity_protection)
+
+
+    def get_average_speed(self):
+        #LOCAL
+        u, v = self.get_velocities()
+
+        average_u = num.sum(u*self.get_areas())/self.area
+        average_v = num.sum(v*self.get_areas())/self.area
+
+        return math.sqrt(average_u**2 + average_v**2)
+
+
+    def get_average_velocity_head(self):
+        #LOCAL
+        return 0.5*self.get_average_speed()**2/g
+
+
+    def get_average_total_energy(self):
+        #LOCAL
+        return self.get_average_velocity_head() + self.get_average_stage()
+
+
+    def get_average_specific_energy(self):
+        #LOCAL
+        return self.get_average_velocity_head() + self.get_average_depth()
+
+
+# Set routines (ALL LOCAL)
+
+    def set_depths(self,depth):
+
+        self.domain.quantities['stage'].centroid_values.put(self.triangle_indices, self.get_elevations() + depth)
+
+
+    def set_stages(self,stage):
+
+        self.domain.quantities['stage'].centroid_values.put(self.triangle_indices, stage)
+
+
+    def set_xmoms(self,xmom):
+
+        self.domain.quantities['xmomentum'].centroid_values.put(self.triangle_indices, xmom)
+
+
+    def set_ymoms(self,ymom):
+
+        self.domain.quantities['ymomentum'].centroid_values.put(self.triangle_indices, ymom)
+
+
+    def set_elevations(self,elevation):
+
+        self.domain.quantities['elevation'].centroid_values.put(self.triangle_indices, elevation)
+
+
+    def set_stages_evenly(self,volume):
+        """ Distribute volume of water over
+        inlet exchange region so that stage is level
+        """
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+
+        import pypar
+        centroid_coordinates = self.domain.get_full_centroid_coordinates(absolute=True)
+        areas = self.get_areas()
+        stages = self.get_stages()
+
+        stages_order = stages.argsort()
+
+        # PETE: send stages and areas, apply merging procedure
+
+        s_areas = {}
+        s_stages = {}
+        s_stages_order = {}
+        total_stages = len(stages)
+
+        if self.myid == self.master_proc:
+            s_areas[self.myid] = areas
+            s_stages[self.myid] = stages
+            s_stages_order[self.myid] = stages_order
+     
+            # Recieve areas, stages, and stages order
+            for i in self.procs:
+                if i != self.master_proc:
+                    s_areas[i] = pypar.receive(i)
+                    s_stages[i] = pypar.receive(i)
+                    s_stages_order[i] = pypar.receive(i)
+                    total_stages = total_stages + len(s_stages[i])
+
+        else:
+            # Send areas, stages, and stages order to master proc of inlet
+            pypar.send(areas, self.master_proc)
+            pypar.send(stages, self.master_proc)
+            pypar.send(stages_order, self.master_proc)
+
+        # merge sorted stage order
+        if self.myid == self.master_proc:
+            pos = {}
+            summed_volume = 0.
+            summed_areas = 0.
+            prev_stage = 0.
+            num_stages = 0.
+            first = True
+            
+            for i in self.procs:
+                pos[i] = 0
+
+            while num_stages < total_stages:
+                # Determine current minimum stage of all the processors in s_stages
+                num_stages = num_stages + 1
+                current_stage = num.finfo(num.float32).max
+                index = -1
+
+                for i in self.procs:
+                    if pos[i] >= len(s_stages[i]):
+                        continue
+                        
+                    if s_stages[i][s_stages_order[i][pos[i]]] < current_stage:
+                        current_stage = s_stages[i][s_stages_order[i][pos[i]]]
+                        index = i
+
+                # If first iteration, then only update summed_areas, position, and prev|current stage
+                
+                if first:
+                    first = False
+                    summed_areas = s_areas[index][s_stages_order[index][pos[index]]]
+                    pos[index] = pos[index] + 1
+                    prev_stage = current_stage
+                    continue
+
+                assert index >= 0, "Index out of bounds"
+
+                # Update summed volume and summed areas
+                tmp_volume = summed_volume + (summed_areas * (current_stage - prev_stage))
+
+                # Terminate if volume exceeded
+                if tmp_volume >= volume:
+                    break
+
+                summed_areas = summed_areas + s_areas[index][s_stages_order[index][pos[index]]]
+                pos[index] = pos[index] + 1
+                summed_volume = tmp_volume
+               
+                # Update position of index processor and current stage
+                prev_stage = current_stage
+
+            # Calculate new stage
+            new_stage = prev_stage + (volume - summed_volume) / summed_areas
+
+            # Send postion and new stage to all processors
+            for i in self.procs:
+                if i != self.master_proc:
+                    pypar.send(pos[i], i)
+                    pypar.send(new_stage, i)
+
+            # Update own depth
+            stages[stages_order[0:pos[self.myid]]] = new_stage
+        else:
+            pos = pypar.receive(self.master_proc)
+            new_stage = pypar.receive(self.master_proc)
+            stages[stages_order[0:pos]] = new_stage
+
+        self.set_stages(stages)
+
+        stages = self.get_stages()
+        stages_order = stages.argsort()
+
+    def set_depths_evenly(self,volume):
+        """ Distribute volume over all exchange
+        cells with equal depth of water
+        """
+        new_depth = self.get_average_depth() + (volume/self.get_area())
+        self.set_depths(new_depth)
+
+    def get_master_proc(self):
+        return self.master_proc
+
+    def parallel_safe(self):
+
+        return True
+
+    def statistics(self):
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+
+        import pypar
+
+        message = ''
+
+        tri_indices = {}
+
+        if self.myid == self.master_proc:
+            tri_indices[self.myid] = self.triangle_indices
+            
+            for proc in self.procs:
+                if proc == self.master_proc: continue
+                
+                tri_indices[proc] = pypar.receive(proc)
+
+        else:
+            pypar.send(self.triangle_indices, self.master_proc)
+
+
+        if self.myid == self.master_proc:
+            message += '=====================================\n'
+            message +=  'Inlet\n' 
+            message += '=====================================\n'
+
+            for proc in self.procs:
+                message += '======> inlet triangle indices and centres at P%d\n' %(proc)
+                message += '%s' % tri_indices[proc]
+                message += '\n'
+                
+                message += '%s' % self.domain.get_centroid_coordinates()[tri_indices[proc]]
+                message += '\n'
+                
+            message += 'line\n'
+            message += '%s' % self.line
+            message += '\n'
+
+        return message
+
+__author__="pete"
+__date__ ="$16/08/2011 6:49:42 PM$"
+
+if __name__ == "__main__":
+    print "Hello World"
Index: /trunk/anuga_core/source/anuga/parallel/parallel_inlet_enquiry.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_inlet_enquiry.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_inlet_enquiry.py	(revision 9501)
@@ -0,0 +1,228 @@
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+from anuga.config import velocity_protection, g
+import math
+
+import numpy as num
+
+import parallel_inlet
+
+class Parallel_Inlet_enquiry(parallel_inlet.Parallel_Inlet):
+    """Contains information associated with each inlet plus an enquiry point
+    """
+
+    """
+    master_proc - index of the processor which coordinates all processors 
+    associated with this inlet operator.
+    procs - list of all processors associated with this inlet operator
+    enquiry_proc - processor containing inlet enquiry point
+    """
+
+    def __init__(self, domain, polyline, enquiry_pt,
+                 invert_elevation = None,
+                 outward_culvert_vector=None,
+                 master_proc = 0,
+                 procs = None,
+                 enquiry_proc = -1,
+                 verbose=False):
+
+   
+        parallel_inlet.Parallel_Inlet.__init__(self, domain, polyline,
+                                                master_proc = master_proc, procs = procs, verbose=verbose)
+
+        import pypar
+
+        self.enquiry_pt = enquiry_pt
+        self.invert_elevation = invert_elevation
+        self.outward_culvert_vector = outward_culvert_vector
+        self.master_proc = master_proc
+
+        if procs is None:
+            self.procs = [self.master_proc]
+        else:
+            self.procs = procs
+
+        self.enquiry_proc = enquiry_proc # Processor of domain containing enquiry point
+        self.compute_enquiry_index()
+
+
+    def compute_enquiry_index(self):
+
+        # Get boundary (in absolute coordinates)
+        vertex_coordinates = self.domain.get_full_vertex_coordinates(absolute=True)
+
+        point = self.enquiry_pt
+        has_enq_point = False
+
+        try:
+            k = self.domain.get_triangle_containing_point(point)
+                
+            if self.domain.tri_full_flag[k] == 1:
+                has_enq_point = True
+            else:
+                has_enq_point = False
+        except:
+            has_enq_point = False
+
+        if has_enq_point:
+            self.enquiry_index = self.domain.get_triangle_containing_point(self.enquiry_pt)
+   
+            if self.enquiry_index in self.triangle_indices:
+                msg = 'Enquiry point %s' % (self.enquiry_pt)
+                msg += 'is in an inlet triangle'
+                import warnings
+                warnings.warn(msg)
+
+
+            if self.enquiry_proc >= 0: 
+                assert self.enquiry_proc == self.myid, "Specified enquiry proc does not match actual enquiry proc"
+            self.enquiry_proc = self.myid
+            assert self.enquiry_index >= 0, "Enquiry point inside polygon, but no triangle index found"
+        else:
+            self.enquiry_index = -1
+
+
+    def get_enquiry_position(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return self.domain.get_centroid_coordinates(absolute=True)[self.enquiry_index]
+        else:
+            return None
+
+    def get_enquiry_stage(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return self.domain.quantities['stage'].centroid_values[self.enquiry_index]
+        else:
+            return None
+
+        return None
+
+    def get_enquiry_xmom(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return self.domain.quantities['xmomentum'].centroid_values[self.enquiry_index]
+        else:
+            return None
+
+    def get_enquiry_ymom(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return self.domain.quantities['ymomentum'].centroid_values[self.enquiry_index]
+        else:
+            return None
+
+    def get_enquiry_elevation(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return self.domain.quantities['elevation'].centroid_values[self.enquiry_index]
+        else:
+            return None
+
+
+    def get_enquiry_depth(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return max(self.get_enquiry_stage() - self.get_enquiry_invert_elevation(), 0.0)
+        else:
+            return None
+
+    def get_enquiry_water_depth(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return self.get_enquiry_stage() - self.get_enquiry_elevation()
+        else:
+            return None
+
+    def get_enquiry_invert_elevation(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            if  self.invert_elevation is None:
+                return self.get_enquiry_elevation()
+            else:
+                return self.invert_elevation
+        else:
+            return None
+
+    def get_enquiry_velocity(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            depth = self.get_enquiry_water_depth()
+            u = depth*self.get_enquiry_xmom()/(depth**2 + velocity_protection)
+            v = depth*self.get_enquiry_ymom()/(depth**2 + velocity_protection)
+
+            return u, v
+        else:
+            return None
+
+
+    def get_enquiry_xvelocity(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            depth = self.get_enquiry_water_depth()
+            return depth*self.get_enquiry_xmom()/(depth**2 + velocity_protection)
+        else:
+            return None
+
+    def get_enquiry_yvelocity(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            depth = self.get_enquiry_water_depth()
+            return depth*self.get_enquiry_ymom()/(depth**2 + velocity_protection)
+        else:
+            return None
+
+    def get_enquiry_speed(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            u, v = self.get_enquiry_velocity()
+
+            return math.sqrt(u**2 + v**2)
+        else:
+            return None
+
+
+    def get_enquiry_velocity_head(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return 0.5*self.get_enquiry_speed()**2/g
+        else:
+            return None
+
+
+    def get_enquiry_total_energy(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return self.get_enquiry_velocity_head() + self.get_enquiry_stage()
+        else:
+            return None
+
+
+    def get_enquiry_specific_energy(self):
+        # WARNING: Must be called by processor containing inlet enquiry point to have effect
+
+        if self.enquiry_index >= 0:
+            return self.get_enquiry_velocity_head() + self.get_enquiry_depth()
+        else:
+            return None
+
+
+    def get_master_proc(self):
+        return self.master_proc
+
+
+    def get_enquiry_proc(self):
+        return self.enquiry_proc
Index: /trunk/anuga_core/source/anuga/parallel/parallel_inlet_operator.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_inlet_operator.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_inlet_operator.py	(revision 9501)
@@ -0,0 +1,281 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+import anuga
+import numpy
+import math
+import anuga.structures.inlet
+
+from anuga.utilities.system_tools import log_to_file
+from anuga.structures.inlet_operator import Inlet_operator
+import parallel_inlet
+
+
+class Parallel_Inlet_operator(Inlet_operator):
+    """Parallel Inlet Operator - add water to an inlet potentially 
+    shared between different parallel domains.
+
+    Sets up the geometry of problem
+
+    Inherit from this class (and overwrite
+    discharge_routine method for specific subclasses)
+
+    Input: domain, line, 
+    """
+
+    """
+    master_proc - index of the processor which coordinates all processors 
+    associated with this inlet operator.
+    procs - list of all processors associated with this inlet operator
+    
+    """
+
+    def __init__(self,
+                 domain,
+                 poly,
+                 Q = 0.0,
+                 velocity = None,
+                 default = None,
+                 description = None,
+                 label = None,
+                 logging = False,
+                 master_proc = 0,
+                 procs = None,
+                 verbose = False):
+
+        import pypar
+        self.domain = domain
+        self.domain.set_fractional_step_operator(self)
+        self.poly = numpy.array(poly, dtype='d')
+        self.master_proc = master_proc 
+
+        if procs is None:
+            self.procs = [self.master_proc]
+        else:
+            self.procs = procs
+
+        self.myid = pypar.rank()
+
+        # should set this up to be a function of time and or space)
+        self.Q = Q
+
+        if description == None:
+            self.description = ' '
+        else:
+            self.description = description
+
+
+        if label == None:
+            self.label = "inlet_%g" % Inlet_operator.counter + "_P" + str(self.myid)
+        else:
+            self.label = label + '_%g' % Inlet_operator.counter + "_P" + str(self.myid)
+
+
+        self.verbose = verbose
+
+        # Keep count of inlet operator
+
+        # Only master proc can update the static counter
+        if self.myid == master_proc:
+            Inlet_operator.counter += 1
+
+
+        n = len(self.poly)
+        self.enquiry_point = numpy.sum(self.poly,axis=1)/float(n)
+    
+
+        #self.outward_vector = self.poly
+        self.inlet = parallel_inlet.Parallel_Inlet(self.domain, self.poly, master_proc = master_proc,
+                                                    procs = procs, verbose= verbose)
+
+        if velocity is not None:
+            assert len(velocity)==2
+
+        self.velocity = velocity
+
+        self.applied_Q = 0.0
+
+        self.set_logging(logging)
+
+        self.set_default(default)
+
+    def __call__(self):
+
+        import pypar
+        volume = 0
+
+        # Need to run global command on all processors
+        current_volume = self.inlet.get_global_total_water_volume()
+        total_area = self.inlet.get_global_area()
+
+        # Only the master proc calculates the update
+        if self.myid == self.master_proc:
+            timestep = self.domain.get_timestep()
+
+            t = self.domain.get_time()
+            Q1 = self.update_Q(t)
+            Q2 = self.update_Q(t + timestep)
+
+            volume = 0.5*(Q1+Q2)*timestep
+
+
+
+            assert current_volume >= 0.0 , 'Volume of watrer in inlet negative!'
+
+            for i in self.procs:
+                if i == self.master_proc: continue
+
+                pypar.send((volume, current_volume, total_area, timestep), i)
+        else:
+            volume, current_volume, total_area, timestep = pypar.receive(self.master_proc)
+
+
+        #print self.myid, volume, current_volume, total_area, timestep
+
+        self.applied_Q = volume/timestep
+        
+        # Distribute positive volume so as to obtain flat surface otherwise
+        # just pull water off to have a uniform depth.
+        if volume >= 0.0 :
+            self.inlet.set_stages_evenly(volume)
+            self.domain.fractional_step_volume_integral+=volume
+            if self.velocity is not None:
+                # This is done locally without communication
+                depths = self.inlet.get_depths()
+                self.inlet.set_xmoms(self.inlet.get_xmoms()+depths*self.velocity[0])
+                self.inlet.set_ymoms(self.inlet.get_ymoms()+depths*self.velocity[1])
+
+        elif current_volume + volume >= 0.0 :
+            depth = (current_volume + volume)/total_area
+            self.inlet.set_depths(depth)
+            self.domain.fractional_step_volume_integral+=volume
+        else: #extracting too much water!
+            self.inlet.set_depths(0.0)
+            self.applied_Q = current_volume/timestep
+            self.domain.fractional_step_volume_integral-=current_volume
+
+
+
+    def update_Q(self, t):
+        """Virtual method allowing local modifications by writing an
+        overriding version in descendant
+        """
+        # Only one processor should call this function unless Q is parallelizable
+
+        from anuga.fit_interpolate.interpolate import Modeltime_too_early, Modeltime_too_late
+        
+        if callable(self.Q):
+            try:
+                Q = self.Q(t)
+            except Modeltime_too_early, e:
+                raise Modeltime_too_early(e)
+            except Modeltime_too_late, e:
+                Q = self.get_default(t)
+        else:
+            Q = self.Q
+
+        return Q
+    
+
+    def statistics(self):
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+
+        message = ''
+
+        inlet_stats = self.inlet.statistics()
+        
+
+        if self.myid == self.master_proc:
+            message  = '=======================================\n'
+            message += 'Parallel Inlet Operator: %s\n' % self.label
+            message += '=======================================\n'
+            
+            message += 'Description\n'
+            message += '%s' % self.description
+            message += '\n'
+
+            message += inlet_stats
+
+            message += '=====================================\n'
+
+        return message
+
+
+    def print_statistics(self):
+        # WARNING: requires synchronization, must be called by all procs associated
+        # with this inlet
+        
+        print self.statistics()
+
+
+    def print_timestepping_statistics(self):
+        # WARNING: Must be called by master proc to have any effect
+
+        if self.myid == self.master_proc:
+            message = '---------------------------------------------\n'
+            message += 'Parallel Inlet report for %s:\n' % self.label
+            message += '--------------------------------------------\n'
+            message += 'Q [m^3/s]: %.2f\n' % self.applied_Q
+        
+            print message
+
+
+    def set_logging(self, flag=True):
+        # WARNING: Must be called by master proc to have any effect
+
+        stats = self.statistics()
+        self.logging = flag
+        
+        if self.myid == self.master_proc:
+            # If flag is true open file with mode = "w" to form a clean file for logging
+            # PETE: Have to open separate file for each processor
+            if self.logging:
+                self.log_filename = self.label + '.log'
+                log_to_file(self.log_filename, stats, mode='w')
+                log_to_file(self.log_filename, 'time,Q')
+
+            #log_to_file(self.log_filename, self.culvert_type)
+
+    def log_timestepping_statistics(self):
+
+        if self.logging and self.myid == self.master_proc:
+            log_to_file(self.log_filename, self.timestepping_statistics())
+
+    def timestepping_statistics(self):
+
+        message  = '%.5f, ' % self.domain.get_time()
+        message += '%.5f, ' % self.applied_Q
+
+        return message
+
+    def log_timestepping_statistics(self):
+        # WARNING: Must be called by master proc to have any effect
+
+        if self.myid == self.master_proc:
+            if self.logging:
+                log_to_file(self.log_filename, self.timestepping_statistics())
+
+
+
+    def set_Q(self, Q):
+        # LOCAL
+        self.Q = Q
+
+    def get_Q(self):
+        # LOCAL
+        return self.Q
+
+
+    def get_inlet(self):
+        # LOCAL
+        return self.inlet
+
+    def get_line(self):
+        return self.line
+
+    def get_master_proc(self):
+        return self.master_proc
+
+    def parallel_safe(self):
+        return True
Index: /trunk/anuga_core/source/anuga/parallel/parallel_meshes.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_meshes.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_meshes.py	(revision 9501)
@@ -0,0 +1,445 @@
+"""parallel-meshes -
+2D triangular domains for parallel finite-volume computations of
+the advection equation, with extra structures to define the
+sending and receiving communications define in dictionaries
+full_send_dict and ghost_recv_dict
+
+
+Ole Nielsen, Stephen Roberts, Duncan Gray, Christopher Zoppou
+Geoscience Australia, 2005
+
+Modified by Linda Stals, March 2006, to include ghost boundaries
+
+"""
+
+
+import sys
+import numpy as num
+
+from anuga.config import epsilon
+
+
+from parallel_api import distribute
+from parallel_api import myid, numprocs, get_processor_name
+from parallel_api import send, receive
+from parallel_api import pypar_available, barrier, finalize
+
+
+
+def parallel_rectangle(m_g, n_g, len1_g=1.0, len2_g=1.0, origin_g = (0.0, 0.0)):
+
+
+    """Setup a rectangular grid of triangles
+    with m+1 by n+1 grid points
+    and side lengths len1, len2. If side lengths are omitted
+    the mesh defaults to the unit square, divided between all the
+    processors
+
+    len1: x direction (left to right)
+    len2: y direction (bottom to top)
+
+    """
+
+
+    import pypar
+    m_low, m_high = pypar.balance(m_g, numprocs, myid)
+    
+    n = n_g
+    m_low  = m_low-1
+    m_high = m_high+1
+
+    #print 'm_low, m_high', m_low, m_high
+    m = m_high - m_low
+
+    delta1 = float(len1_g)/m_g
+    delta2 = float(len2_g)/n_g
+
+    len1 = len1_g*float(m)/float(m_g)
+    len2 = len2_g
+    origin = ( origin_g[0]+float(m_low)/float(m_g)*len1_g, origin_g[1] )
+
+    #Calculate number of points
+    Np = (m+1)*(n+1)
+
+    class VIndex:
+
+        def __init__(self, n,m):
+            self.n = n
+            self.m = m
+
+        def __call__(self, i,j):
+            return j+i*(self.n+1)
+
+    class EIndex:
+
+        def __init__(self, n,m):
+            self.n = n
+            self.m = m
+
+        def __call__(self, i,j):
+            return 2*(j+i*self.n)
+
+
+    I = VIndex(n,m)
+    E = EIndex(n,m)
+
+    points = num.zeros( (Np,2), num.float)
+
+    for i in range(m+1):
+        for j in range(n+1):
+
+            points[I(i,j),:] = [i*delta1 + origin[0], j*delta2 + origin[1]]
+
+    #Construct 2 triangles per rectangular element and assign tags to boundary
+    #Calculate number of triangles
+    Nt = 2*m*n
+
+
+    elements = num.zeros( (Nt,3), num.int)
+    boundary = {}
+    Idgl = []
+    Idfl = []
+    Idgr = []
+    Idfr = []
+
+    full_send_dict = {}
+    ghost_recv_dict = {}
+    nt = -1
+    for i in range(m):
+        for j in range(n):
+
+            i1 = I(i,j+1)
+            i2 = I(i,j)
+            i3 = I(i+1,j+1)
+            i4 = I(i+1,j)
+
+            #Lower Element
+            nt = E(i,j)
+            if i == 0:
+                Idgl.append(nt)
+
+            if i == 1:
+                Idfl.append(nt)
+
+            if i == m-2:
+                Idfr.append(nt)
+
+            if i == m-1:
+                Idgr.append(nt)
+
+            if i == m-1:
+                if myid == numprocs-1:
+                    boundary[nt, 2] = 'right'
+                else:
+                    boundary[nt, 2] = 'ghost'
+        
+            if j == 0:
+                boundary[nt, 1] = 'bottom'
+            elements[nt,:] = [i4,i3,i2]
+
+            #Upper Element
+            nt = E(i,j)+1
+            if i == 0:
+                Idgl.append(nt)
+
+            if i == 1:
+                Idfl.append(nt)
+
+            if i == m-2:
+                Idfr.append(nt)
+
+            if i == m-1:
+                Idgr.append(nt)
+
+            if i == 0:
+                if myid == 0:
+                    boundary[nt, 2] = 'left'
+                else:
+                    boundary[nt, 2] = 'ghost'
+            if j == n-1:
+                boundary[nt, 1] = 'top'
+            elements[nt,:] = [i1,i2,i3]
+
+    if numprocs==1:
+        Idfl.extend(Idfr)
+        Idgr.extend(Idgl)
+
+        #print Idfl
+        #print Idgr
+        
+        Idfl = num.array(Idfl,num.int)
+        Idgr = num.array(Idgr,num.int)
+
+        #print Idfl
+        #print Idgr
+        
+        full_send_dict[myid]  = [Idfl, Idfl]
+        ghost_recv_dict[myid] = [Idgr, Idgr]
+
+
+    elif numprocs == 2:
+        Idfl.extend(Idfr)
+        Idgr.extend(Idgl)
+        Idfl = num.array(Idfl,num.int)
+        Idgr = num.array(Idgr,num.int)
+        full_send_dict[(myid-1)%numprocs]  = [Idfl, Idfl]
+        ghost_recv_dict[(myid-1)%numprocs] = [Idgr, Idgr]
+    else:
+        Idfl = num.array(Idfl,num.int)
+        Idgl = num.array(Idgl,num.int)
+
+        Idfr = num.array(Idfr,num.int)
+        Idgr = num.array(Idgr,num.int)
+
+        full_send_dict[(myid-1)%numprocs]  = [Idfl, Idfl]
+        ghost_recv_dict[(myid-1)%numprocs] = [Idgl, Idgl]
+        full_send_dict[(myid+1)%numprocs]  = [Idfr, Idfr]
+        ghost_recv_dict[(myid+1)%numprocs] = [Idgr, Idgr]
+
+
+
+    #print full_send_dict
+    #print ghost_recv_dict        
+    
+    return  points, elements, boundary, full_send_dict, ghost_recv_dict
+
+
+
+def rectangular_periodic(m, n, len1=1.0, len2=1.0, origin = (0.0, 0.0)):
+
+
+    """Setup a rectangular grid of triangles
+    with m+1 by n+1 grid points
+    and side lengths len1, len2. If side lengths are omitted
+    the mesh defaults to the unit square.
+
+    len1: x direction (left to right)
+    len2: y direction (bottom to top)
+
+    Return to lists: points and elements suitable for creating a Mesh or
+    FVMesh object, e.g. Mesh(points, elements)
+    """
+
+    delta1 = float(len1)/m
+    delta2 = float(len2)/n
+
+    #Calculate number of points
+    Np = (m+1)*(n+1)
+
+    class VIndex:
+
+        def __init__(self, n,m):
+            self.n = n
+            self.m = m
+
+        def __call__(self, i,j):
+            return j+i*(self.n+1)
+
+    class EIndex:
+
+        def __init__(self, n,m):
+            self.n = n
+            self.m = m
+
+        def __call__(self, i,j):
+            return 2*(j+i*self.n)
+
+
+    I = VIndex(n,m)
+    E = EIndex(n,m)
+
+    points = num.zeros( (Np,2), num.float)
+
+    for i in range(m+1):
+        for j in range(n+1):
+
+            points[I(i,j),:] = [i*delta1 + origin[0], j*delta2 + origin[1]]
+
+    #Construct 2 triangles per rectangular element and assign tags to boundary
+    #Calculate number of triangles
+    Nt = 2*m*n
+
+
+    elements = num.zeros( (Nt,3), num.int)
+    boundary = {}
+    ghosts = {}
+    nt = -1
+    for i in range(m):
+        for j in range(n):
+
+            i1 = I(i,j+1)
+            i2 = I(i,j)
+            i3 = I(i+1,j+1)
+            i4 = I(i+1,j)
+
+            #Lower Element
+            nt = E(i,j)
+            if i == m-1:
+                ghosts[nt] = E(1,j)
+            if i == 0:
+                ghosts[nt] = E(m-2,j)
+
+            if j == n-1:
+                ghosts[nt] = E(i,1)
+
+            if j == 0:
+                ghosts[nt] = E(i,n-2)
+
+            if i == m-1:
+                if myid == numprocs-1:
+                    boundary[nt, 2] = 'right'
+                else:
+                    boundary[nt, 2] = 'ghost'
+            if j == 0:
+                boundary[nt, 1] = 'bottom'
+            elements[nt,:] = [i4,i3,i2]
+
+            #Upper Element
+            nt = E(i,j)+1
+            if i == m-1:
+                ghosts[nt] = E(1,j)+1
+            if i == 0:
+                ghosts[nt] = E(m-2,j)+1
+
+            if j == n-1:
+                ghosts[nt] = E(i,1)+1
+
+            if j == 0:
+                ghosts[nt] = E(i,n-2)+1
+
+            if i == 0:
+                if myid == 0:
+                    boundary[nt, 2] = 'left'
+                else:
+                    boundary[nt, 2] = 'ghost'
+            if j == n-1:
+                boundary[nt, 1] = 'top'
+            elements[nt,:] = [i1,i2,i3]
+
+    #bottom left
+    nt = E(0,0)
+    nf = E(m-2,n-2)
+    ghosts[nt]   = nf
+    ghosts[nt+1] = nf+1
+
+    #bottom right
+    nt = E(m-1,0)
+    nf = E(1,n-2)
+    ghosts[nt]   = nf
+    ghosts[nt+1] = nf+1
+
+    #top left
+    nt = E(0,n-1)
+    nf = E(m-2,1)
+    ghosts[nt]   = nf
+    ghosts[nt+1] = nf+1
+
+    #top right
+    nt = E(m-1,n-1)
+    nf = E(1,1)
+    ghosts[nt]   = nf
+    ghosts[nt+1] = nf+1
+
+    return points, elements, boundary, ghosts
+
+def rectangular_periodic_lr(m, n, len1=1.0, len2=1.0, origin = (0.0, 0.0)):
+
+
+    """Setup a rectangular grid of triangles
+    with m+1 by n+1 grid points
+    and side lengths len1, len2. If side lengths are omitted
+    the mesh defaults to the unit square.
+
+    len1: x direction (left to right)
+    len2: y direction (bottom to top)
+
+    Return to lists: points and elements suitable for creating a Mesh or
+    Domain object, e.g. Mesh(points, elements)
+    """
+
+    delta1 = float(len1)/m
+    delta2 = float(len2)/n
+
+    #Calculate number of points
+    Np = (m+1)*(n+1)
+
+    class VIndex:
+
+        def __init__(self, n,m):
+            self.n = n
+            self.m = m
+
+        def __call__(self, i,j):
+            return j+i*(self.n+1)
+
+    class EIndex:
+
+        def __init__(self, n,m):
+            self.n = n
+            self.m = m
+
+        def __call__(self, i,j):
+            return 2*(j+i*self.n)
+
+
+    I = VIndex(n,m)
+    E = EIndex(n,m)
+
+    points = num.zeros( (Np,2), num.float)
+
+    for i in range(m+1):
+        for j in range(n+1):
+
+            points[I(i,j),:] = [i*delta1 + origin[0], j*delta2 + origin[1]]
+
+    #Construct 2 triangles per rectangular element and assign tags to boundary
+    #Calculate number of triangles
+    Nt = 2*m*n
+
+
+    elements = num.zeros( (Nt,3), num.int)
+    boundary = {}
+    ghosts = {}
+    nt = -1
+    for i in range(m):
+        for j in range(n):
+
+            i1 = I(i,j+1)
+            i2 = I(i,j)
+            i3 = I(i+1,j+1)
+            i4 = I(i+1,j)
+
+            #Lower Element
+            nt = E(i,j)
+            if i == m-1:
+                ghosts[nt] = E(1,j)
+            if i == 0:
+                ghosts[nt] = E(m-2,j)
+
+            if i == m-1:
+                if myid == numprocs-1:
+                    boundary[nt, 2] = 'right'
+                else:
+                    boundary[nt, 2] = 'ghost'
+            if j == 0:
+                boundary[nt, 1] = 'bottom'
+            elements[nt,:] = [i4,i3,i2]
+
+            #Upper Element
+            nt = E(i,j)+1
+            if i == m-1:
+                ghosts[nt] = E(1,j)+1
+            if i == 0:
+                ghosts[nt] = E(m-2,j)+1
+
+            if i == 0:
+                if myid == 0:
+                    boundary[nt, 2] = 'left'
+                else:
+                    boundary[nt, 2] = 'ghost'
+            if j == n-1:
+                boundary[nt, 1] = 'top'
+            elements[nt,:] = [i1,i2,i3]
+
+
+    return points, elements, boundary, ghosts
Index: /trunk/anuga_core/source/anuga/parallel/parallel_operator_factory.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_operator_factory.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_operator_factory.py	(revision 9501)
@@ -0,0 +1,795 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+
+
+import os.path
+import sys
+
+from anuga.utilities.system_tools import get_pathname_from_package
+from anuga.geometry.polygon_function import Polygon_function
+
+import anuga
+from math import pi, pow, sqrt
+import numpy as num
+from parallel_inlet_operator import Parallel_Inlet_operator
+from parallel_structure_operator import Parallel_Structure_operator
+from parallel_boyd_box_operator import Parallel_Boyd_box_operator
+from parallel_boyd_pipe_operator import Parallel_Boyd_pipe_operator
+from parallel_weir_orifice_trapezoid_operator import Parallel_Weir_orifice_trapezoid_operator#added by PM 22/10/2013
+
+from . import distribute, myid, numprocs, finalize
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+
+import anuga.structures.boyd_box_operator
+import anuga.structures.boyd_pipe_operator
+import anuga.structures.inlet_operator
+
+import anuga.structures.weir_orifice_trapezoid_operator #added by PM 22/10/2013
+
+from anuga.utilities.numerical_tools import ensure_numeric
+from anuga.parallel.parallel_shallow_water import Parallel_domain
+
+import math
+
+"""
+Factory method for Parallel Inlet_operator. All parameters are the same 
+as normal Inlet_Operators master_proc coordinates the allocation process, 
+procs contains the potential list of processors to allocate the inlet to.
+
+Returns None for calling processors not associated with inlet. Otherwise
+return an instance of Parallel_Inlet_Operator
+"""
+
+def Inlet_operator(domain, 
+                   poly,
+                   Q,
+                   velocity = None,
+                   default = None,
+                   description = None,
+                   label = None,
+                   logging = False,
+                   master_proc = 0,
+                   procs = None,
+                   verbose = False):
+
+    # If not parallel domain then allocate serial Inlet operator
+    if isinstance(domain, Parallel_domain) is False:
+        if verbose: print "Allocating non parallel inlet operator ....."
+        return anuga.structures.inlet_operator.Inlet_operator(domain,
+                                                              poly,
+                                                              Q,
+                                                              velocity = velocity,
+                                                              default = default,
+                                                              description = description,
+                                                              label = label,
+                                                              logging = logging,
+                                                              verbose = verbose)
+    
+    import pypar
+    if procs is None:
+        procs = range(0,pypar.size())
+
+    myid = pypar.rank()
+
+    poly = num.array(poly, dtype='d')
+
+    alloc, inlet_master_proc, inlet_procs, enquiry_proc = allocate_inlet_procs(domain,
+                                                                               poly,
+                                                                               master_proc = master_proc,
+                                                                               procs = procs,
+                                                                               verbose = verbose)
+
+
+
+    if alloc:
+        if verbose and myid == inlet_master_proc:
+            print "Parallel Inlet Operator ================="
+            print "Poly = " + str(poly)
+            print "Master Processor is P%d" %(inlet_master_proc)
+            print "Processors are P%s" %(inlet_procs)
+            print "========================================="
+
+        return Parallel_Inlet_operator(domain,
+                                       poly,
+                                       Q,
+                                       velocity = velocity,
+                                       default = default,
+                                       description = description,
+                                       label = label,
+                                       logging = logging,
+                                       master_proc = inlet_master_proc,
+                                       procs = inlet_procs,
+                                       verbose = verbose)
+    else:
+        return None
+
+"""
+Factory method for Parallel Boyd_box_operator. All parameters are the same 
+as normal Boyd_box_operator master_proc coordinates the allocation process,
+procs contains the potential list of processors to allocate the inlet to.
+
+Returns None for calling processors not associated with structure. Otherwise
+return an instance of Parallel Boyd_box_operator
+"""
+
+def Boyd_box_operator(domain,
+                       losses,
+                       width,
+                       height=None,
+                       z1=0.0,
+                       z2=0.0,
+                       end_points=None,
+                       exchange_lines=None,
+                       enquiry_points=None,
+                       invert_elevations=None,
+                       apron=0.1,
+                       manning=0.013,
+                       enquiry_gap=0.0,
+                       smoothing_timescale=0.0,
+                       use_momentum_jet=True,
+                       use_velocity_head=True,
+                       description=None,
+                       label=None,
+                       structure_type='boyd_box',
+                       logging=False,
+                       verbose=False,
+                       master_proc=0,
+                       procs=None):
+
+    # If not parallel domain then allocate serial Boyd box operator
+    if isinstance(domain, Parallel_domain) is False:
+        if verbose: print "Allocating non parallel boyd box operator ....."
+        return anuga.structures.boyd_box_operator.Boyd_box_operator(domain=domain,
+                                                                    losses=losses,
+                                                                    width=width,
+                                                                    height=height,
+                                                                    z1=0.0,
+                                                                    z2=0.0,
+                                                                    end_points=end_points,
+                                                                    exchange_lines=exchange_lines,
+                                                                    enquiry_points=enquiry_points,
+                                                                    invert_elevations=invert_elevations,
+                                                                    apron=apron,
+                                                                    manning=manning,
+                                                                    enquiry_gap=enquiry_gap,
+                                                                    smoothing_timescale=smoothing_timescale,
+                                                                    use_momentum_jet=use_momentum_jet,
+                                                                    use_velocity_head=use_velocity_head,
+                                                                    description=description,
+                                                                    label=label,
+                                                                    structure_type=structure_type,
+                                                                    logging=logging,
+                                                                    verbose=verbose)
+
+    import pypar
+    if procs is None:
+        procs = range(0,pypar.size())
+
+    myid = pypar.rank()
+
+    end_points = ensure_numeric(end_points)
+    exchange_lines = ensure_numeric(exchange_lines)
+    enquiry_points = ensure_numeric(enquiry_points)
+
+    if height is None:
+        height = width
+
+    diameter = None
+
+    if apron is None:
+        apron = width
+
+
+
+
+
+
+    # Calculate location of inlet enquiry points and exchange lines
+    if myid == master_proc:
+        if exchange_lines is not None:
+            exchange_lines_tmp = exchange_lines
+            enquiry_points_tmp = __process_skew_culvert(exchange_lines, end_points, enquiry_points, apron, enquiry_gap)
+
+            for i in procs:
+                if i == master_proc: continue
+                pypar.send(enquiry_points_tmp, i)
+
+        elif end_points is not None:
+            exchange_lines_tmp, enquiry_points_tmp = __process_non_skew_culvert(end_points, width, 
+                                                                                enquiry_points, apron, enquiry_gap)
+            for i in procs:
+                if i == master_proc: continue
+                pypar.send(exchange_lines_tmp, i)
+                pypar.send(enquiry_points_tmp, i)
+        else:
+            raise Exception, 'Define either exchange_lines or end_points'
+        
+    else:
+        if exchange_lines is not None:
+            exchange_lines_tmp = exchange_lines
+            enquiry_points_tmp = pypar.receive(master_proc)
+        elif end_points is not None:
+            exchange_lines_tmp = pypar.receive(master_proc)
+            enquiry_points_tmp = pypar.receive(master_proc)
+
+    # Determine processors associated with first inlet
+    line0 = exchange_lines_tmp[0] 
+    enquiry_point0 = enquiry_points_tmp[0]
+
+    alloc0, inlet0_master_proc, inlet0_procs, enquiry0_proc = allocate_inlet_procs(domain, line0, enquiry_point =  enquiry_point0,
+                                                                                   master_proc = master_proc,
+                                                                                   procs = procs, verbose=verbose)
+
+    # Determine processors associated with second inlet
+    line1 = exchange_lines_tmp[1]
+    enquiry_point1 = enquiry_points_tmp[1]
+
+    alloc1, inlet1_master_proc, inlet1_procs, enquiry1_proc = allocate_inlet_procs(domain, line1, enquiry_point =  enquiry_point1,
+                                                                                   master_proc = master_proc,
+                                                                                   procs = procs, verbose=verbose)
+
+    structure_procs = list(set(inlet0_procs + inlet1_procs))
+    inlet_master_proc = [inlet0_master_proc, inlet1_master_proc]
+    inlet_procs = [inlet0_procs, inlet1_procs]
+    enquiry_proc = [enquiry0_proc, enquiry1_proc]
+
+    if myid == master_proc and verbose:
+        print "Parallel Boyd Box Operator ============================="
+        print "Structure Master Proc is P" + str(inlet0_master_proc)
+        print "Structure Procs are P" + str(structure_procs)
+        print "Inlet Master Procs are P" + str(inlet_master_proc)
+        print "Inlet Procs are P" + str(inlet_procs[0]) + " and " + str(inlet_procs[1])
+        print "Inlet Enquiry Procs are P" + str(enquiry_proc)
+        print "Enquiry Points are " + str(enquiry_point0) + " and " + str(enquiry_point1)
+        print "Inlet Exchange Lines are " + str(line0) + " and " + str(line1)
+        print "========================================================"
+
+    if alloc0 or alloc1:
+       return Parallel_Boyd_box_operator(domain=domain,
+                                         losses=losses,
+                                         width=width,
+                                         height=height,
+                                         end_points=end_points,
+                                         exchange_lines=exchange_lines,
+                                         enquiry_points=enquiry_points,
+                                         invert_elevations=invert_elevations,
+                                         apron=apron,
+                                         manning=manning,
+                                         enquiry_gap=enquiry_gap,
+                                         smoothing_timescale=smoothing_timescale,
+                                         use_momentum_jet=use_momentum_jet,
+                                         use_velocity_head=use_velocity_head,
+                                         description=description,
+                                         label=label,
+                                         structure_type=structure_type,
+                                         logging=logging,
+                                         verbose=verbose,
+                                         master_proc = inlet0_master_proc,
+                                         procs = structure_procs,
+                                         inlet_master_proc = inlet_master_proc,
+                                         inlet_procs = inlet_procs,
+                                         enquiry_proc = enquiry_proc)
+    else:
+        return None
+
+
+
+"""
+Factory method for Parallel Boyd_pipe_operator. All parameters are the same
+as normal Boyd_pipe_operator master_proc coordinates the allocation process,
+procs contains the potential list of processors to allocate the inlet to.
+
+Returns None for calling processors not associated with structure. Otherwise
+return an instance of Parallel Boyd_pipe_operator
+"""
+
+def Boyd_pipe_operator(domain,
+                       losses,
+                       diameter,
+                       end_points=None,
+                       exchange_lines=None,
+                       enquiry_points=None,
+                       invert_elevations=None,
+                       apron=0.1,
+                       manning=0.013,
+                       enquiry_gap=0.0,
+                       use_momentum_jet=True,
+                       use_velocity_head=True,
+                       description=None,
+                       label=None,
+                       structure_type='boyd_pipe',
+                       logging=False,
+                       verbose=False,
+                       master_proc=0,
+                       procs=None):
+
+    # If not parallel domain then allocate serial Boyd box operator
+    if isinstance(domain, Parallel_domain) is False:
+        if verbose: print "Allocating non parallel boyd pipe operator ....."
+        return anuga.structures.boyd_pipe_operator.Boyd_pipe_operator(domain=domain,
+                                                                    losses=losses,
+                                                                    diameter=diameter,
+                                                                    end_points=end_points,
+                                                                    exchange_lines=exchange_lines,
+                                                                    enquiry_points=enquiry_points,
+                                                                    invert_elevations=invert_elevations,
+                                                                    apron=apron,
+                                                                    manning=manning,
+                                                                    enquiry_gap=enquiry_gap,
+                                                                    use_momentum_jet=use_momentum_jet,
+                                                                    use_velocity_head=use_velocity_head,
+                                                                    description=description,
+                                                                    label=label,
+                                                                    structure_type=structure_type,
+                                                                    logging=logging,
+                                                                    verbose=verbose)
+
+    import pypar
+    if procs is None:
+        procs = range(0,pypar.size())
+        
+    myid = pypar.rank()
+
+    end_points = ensure_numeric(end_points)
+    exchange_lines = ensure_numeric(exchange_lines)
+    enquiry_points = ensure_numeric(enquiry_points)
+
+    width = diameter
+
+    assert diameter is not None
+
+    if apron is None:
+        apron = width
+
+    # Calculate location of inlet enquiry points and exchange lines
+    if myid == master_proc:
+        if exchange_lines is not None:
+            exchange_lines_tmp = exchange_lines
+            enquiry_points_tmp = __process_skew_culvert(exchange_lines, end_points, enquiry_points, apron, enquiry_gap)
+
+            for i in procs:
+                if i == master_proc: continue
+                pypar.send(enquiry_points_tmp, i)
+
+        elif end_points is not None:
+            exchange_lines_tmp, enquiry_points_tmp = __process_non_skew_culvert(end_points, width,
+                                                                                enquiry_points, apron, enquiry_gap)
+            for i in procs:
+                if i == master_proc: continue
+                pypar.send(exchange_lines_tmp, i)
+                pypar.send(enquiry_points_tmp, i)
+        else:
+            raise Exception, 'Define either exchange_lines or end_points'
+
+    else:
+        if exchange_lines is not None:
+            exchange_lines_tmp = exchange_lines
+            enquiry_points_tmp = pypar.receive(master_proc)
+        elif end_points is not None:
+            exchange_lines_tmp = pypar.receive(master_proc)
+            enquiry_points_tmp = pypar.receive(master_proc)
+
+    # Determine processors associated with first inlet
+    line0 = exchange_lines_tmp[0]
+    enquiry_point0 = enquiry_points_tmp[0]
+
+    alloc0, inlet0_master_proc, inlet0_procs, enquiry0_proc = allocate_inlet_procs(domain, line0, enquiry_point =  enquiry_point0,
+                                                                                   master_proc = master_proc,
+                                                                                   procs = procs, verbose=verbose)
+
+    # Determine processors associated with second inlet
+    line1 = exchange_lines_tmp[1]
+    enquiry_point1 = enquiry_points_tmp[1]
+
+    alloc1, inlet1_master_proc, inlet1_procs, enquiry1_proc = allocate_inlet_procs(domain, line1, enquiry_point =  enquiry_point1,
+                                                                                   master_proc = master_proc,
+                                                                                   procs = procs, verbose=verbose)
+
+    structure_procs = list(set(inlet0_procs + inlet1_procs))
+    inlet_master_proc = [inlet0_master_proc, inlet1_master_proc]
+    inlet_procs = [inlet0_procs, inlet1_procs]
+    enquiry_proc = [enquiry0_proc, enquiry1_proc]
+
+    if myid == master_proc and verbose:
+        print "Parallel Boyd Pipe Operator ============================="
+        print "Structure Master Proc is P" + str(inlet0_master_proc)
+        print "Structure Procs are P" + str(structure_procs)
+        print "Inlet Master Procs are P" + str(inlet_master_proc)
+        print "Inlet Procs are P" + str(inlet_procs[0]) + " and " + str(inlet_procs[1])
+        print "Inlet Enquiry Procs are P" + str(enquiry_proc)
+        print "Enquiry Points are " + str(enquiry_point0) + " and " + str(enquiry_point1)
+        print "Inlet Exchange Lines are " + str(line0) + " and " + str(line1)
+        print "========================================================"
+
+    if alloc0 or alloc1:
+       return Parallel_Boyd_pipe_operator(domain=domain,
+                                         losses=losses,
+                                         diameter=diameter,
+                                         end_points=end_points,
+                                         exchange_lines=exchange_lines,
+                                         enquiry_points=enquiry_points,
+                                         invert_elevations=invert_elevations,
+                                         apron=apron,
+                                         manning=manning,
+                                         enquiry_gap=enquiry_gap,
+                                         use_momentum_jet=use_momentum_jet,
+                                         use_velocity_head=use_velocity_head,
+                                         description=description,
+                                         label=label,
+                                         structure_type=structure_type,
+                                         logging=logging,
+                                         verbose=verbose,
+                                         master_proc = inlet0_master_proc,
+                                         procs = structure_procs,
+                                         inlet_master_proc = inlet_master_proc,
+                                         inlet_procs = inlet_procs,
+                                         enquiry_proc = enquiry_proc)
+    else:
+        return None
+
+
+
+
+"""
+Factory method for Parallel Weir_orifice_trapezoid_operator. All parameters are the same 
+as normal Weir_orifice_trapezoid_operator master_proc coordinates the allocation process,
+procs contains the potential list of processors to allocate the inlet to.
+
+Returns None for calling processors not associated with structure. Otherwise
+return an instance of Parallel Weir_orifice_trapezoid_operator
+
+This was addede by PM 22/10/2013
+"""
+
+def Weir_orifice_trapezoid_operator(domain,
+                       losses,
+                       width,
+                       z1=None,
+                       z2=None,
+                       height=None,
+                       end_points=None,
+                       exchange_lines=None,
+                       enquiry_points=None,
+                       invert_elevations=None,
+                       apron=0.1,
+                       manning=0.013,
+                       enquiry_gap=0.0,
+                       use_momentum_jet=True,
+                       use_velocity_head=True,
+                       description=None,
+                       label=None,
+                       structure_type='weir_orifice_trapezoid',
+                       logging=False,
+                       verbose=False,
+                       master_proc=0,
+                       procs=None):
+
+    # If not parallel domain then allocate serial Weir orifice trapezoid operator
+    if isinstance(domain, Parallel_domain) is False:
+        if verbose: print "Allocating non parallel weir orifice trapzezoid operator ....."
+        return anuga.structures.weir_orifice_trapezoid_operator.Weir_orifice_trapezoid_operator(domain=domain,
+                                                                    losses=losses,
+                                                                    width=width,
+                                                                    height=height,
+                                                                    z1=z1,
+                                                                    z2=z2,
+                                                                    end_points=end_points,
+                                                                    exchange_lines=exchange_lines,
+                                                                    enquiry_points=enquiry_points,
+                                                                    invert_elevations=invert_elevations,
+                                                                    apron=apron,
+                                                                    manning=manning,
+                                                                    enquiry_gap=enquiry_gap,
+                                                                    use_momentum_jet=use_momentum_jet,
+                                                                    use_velocity_head=use_velocity_head,
+                                                                    description=description,
+                                                                    label=label,
+                                                                    structure_type=structure_type,
+                                                                    logging=logging,
+                                                                    verbose=verbose)
+
+    import pypar
+    if procs is None:
+        procs = range(0,pypar.size())
+
+    myid = pypar.rank()
+
+    end_points = ensure_numeric(end_points)
+    exchange_lines = ensure_numeric(exchange_lines)
+    enquiry_points = ensure_numeric(enquiry_points)
+
+    if height is None:
+        height = width
+
+    diameter = None
+
+    if apron is None:
+        apron = width
+
+
+
+
+
+
+    # Calculate location of inlet enquiry points and exchange lines
+    if myid == master_proc:
+        if exchange_lines is not None:
+            exchange_lines_tmp = exchange_lines
+            enquiry_points_tmp = __process_skew_culvert(exchange_lines, end_points, enquiry_points, apron, enquiry_gap)
+
+            for i in procs:
+                if i == master_proc: continue
+                pypar.send(enquiry_points_tmp, i)
+
+        elif end_points is not None:
+            exchange_lines_tmp, enquiry_points_tmp = __process_non_skew_culvert(end_points, width, 
+                                                                                enquiry_points, apron, enquiry_gap)
+            for i in procs:
+                if i == master_proc: continue
+                pypar.send(exchange_lines_tmp, i)
+                pypar.send(enquiry_points_tmp, i)
+        else:
+            raise Exception, 'Define either exchange_lines or end_points'
+        
+    else:
+        if exchange_lines is not None:
+            exchange_lines_tmp = exchange_lines
+            enquiry_points_tmp = pypar.receive(master_proc)
+        elif end_points is not None:
+            exchange_lines_tmp = pypar.receive(master_proc)
+            enquiry_points_tmp = pypar.receive(master_proc)
+
+    # Determine processors associated with first inlet
+    line0 = exchange_lines_tmp[0] 
+    enquiry_point0 = enquiry_points_tmp[0]
+
+    alloc0, inlet0_master_proc, inlet0_procs, enquiry0_proc = allocate_inlet_procs(domain, line0, enquiry_point =  enquiry_point0,
+                                                                                   master_proc = master_proc,
+                                                                                   procs = procs, verbose=verbose)
+
+    # Determine processors associated with second inlet
+    line1 = exchange_lines_tmp[1]
+    enquiry_point1 = enquiry_points_tmp[1]
+
+    alloc1, inlet1_master_proc, inlet1_procs, enquiry1_proc = allocate_inlet_procs(domain, line1, enquiry_point =  enquiry_point1,
+                                                                                   master_proc = master_proc,
+                                                                                   procs = procs, verbose=verbose)
+
+    structure_procs = list(set(inlet0_procs + inlet1_procs))
+    inlet_master_proc = [inlet0_master_proc, inlet1_master_proc]
+    inlet_procs = [inlet0_procs, inlet1_procs]
+    enquiry_proc = [enquiry0_proc, enquiry1_proc]
+
+    if myid == master_proc and verbose:
+        print "Parallel Weir Orifice Trapezoid Operator ============================="
+        print "Structure Master Proc is P" + str(inlet0_master_proc)
+        print "Structure Procs are P" + str(structure_procs)
+        print "Inlet Master Procs are P" + str(inlet_master_proc)
+        print "Inlet Procs are P" + str(inlet_procs[0]) + " and " + str(inlet_procs[1])
+        print "Inlet Enquiry Procs are P" + str(enquiry_proc)
+        print "Enquiry Points are " + str(enquiry_point0) + " and " + str(enquiry_point1)
+        print "Inlet Exchange Lines are " + str(line0) + " and " + str(line1)
+        print "========================================================"
+
+    if alloc0 or alloc1:
+       return Parallel_Weir_orifice_trapezoid_operator(domain=domain,
+                                         losses=losses,
+                                         width=width,
+                                         height=height,
+                                         z1=z1,
+                                         z2=z2,
+                                         end_points=end_points,
+                                         exchange_lines=exchange_lines,
+                                         enquiry_points=enquiry_points,
+                                         invert_elevations=invert_elevations,
+                                         apron=apron,
+                                         manning=manning,
+                                         enquiry_gap=enquiry_gap,
+                                         use_momentum_jet=use_momentum_jet,
+                                         use_velocity_head=use_velocity_head,
+                                         description=description,
+                                         label=label,
+                                         structure_type=structure_type,
+                                         logging=logging,
+                                         verbose=verbose,
+                                         master_proc = inlet0_master_proc,
+                                         procs = structure_procs,
+                                         inlet_master_proc = inlet_master_proc,
+                                         inlet_procs = inlet_procs,
+                                         enquiry_proc = enquiry_proc)
+    else:
+        return None
+
+
+
+
+
+def __process_non_skew_culvert(end_points, width, enquiry_points, apron, enquiry_gap):
+    """Create lines at the end of a culvert inlet and outlet.
+    At either end two lines will be created; one for the actual flow to pass through and one a little further away
+    for enquiring the total energy at both ends of the culvert and transferring flow.
+    """
+
+    culvert_vector = end_points[1] - end_points[0]
+    culvert_length = math.sqrt(num.sum(culvert_vector**2))
+    assert culvert_length > 0.0, 'The length of culvert is less than 0'
+
+    culvert_vector /= culvert_length
+
+    culvert_normal = num.array([-culvert_vector[1], culvert_vector[0]])  # Normal vector
+    w = 0.5*width*culvert_normal # Perpendicular vector of 1/2 width
+
+    exchange_lines = []
+
+    # Build exchange polyline and enquiry point
+    if enquiry_points is None:
+
+        gap = (apron + enquiry_gap)*culvert_vector
+        enquiry_points = []
+
+        for i in [0, 1]:
+            p0 = end_points[i] + w
+            p1 = end_points[i] - w
+            exchange_lines.append(num.array([p0, p1]))
+            ep = end_points[i] + (2*i - 1)*gap #(2*i - 1) determines the sign of the points
+            enquiry_points.append(ep)
+
+    else:
+        for i in [0, 1]:
+            p0 = end_points[i] + w
+            p1 = end_points[i] - w
+            exchange_lines.append(num.array([p0, p1]))
+
+    return exchange_lines, enquiry_points
+
+def __process_skew_culvert(exchange_lines, end_points, enquiry_points, apron, enquiry_gap):
+
+    """Compute skew culvert.
+    If exchange lines are given, the enquiry points are determined. This is for enquiring
+    the total energy at both ends of the culvert and transferring flow.
+    """
+
+    centre_point0 = 0.5*(exchange_lines[0][0] + exchange_lines[0][1])
+    centre_point1 = 0.5*(exchange_lines[1][0] + exchange_lines[1][1])
+
+    if end_points is None:
+        culvert_vector = centre_point1 - centre_point0
+    else:
+        culvert_vector = end_points[1] - end_points[0]
+
+    culvert_length = math.sqrt(num.sum(culvert_vector**2))
+    assert culvert_length > 0.0, 'The length of culvert is less than 0'
+
+    if enquiry_points is None:
+
+        culvert_vector /= culvert_length
+        gap = (apron + enquiry_gap)*culvert_vector
+
+        enquiry_points = []
+
+        enquiry_points.append(centre_point0 - gap)
+        enquiry_points.append(centre_point1 + gap)
+
+    return enquiry_points
+        
+
+def allocate_inlet_procs(domain, poly, enquiry_point = None, master_proc = 0, procs = None, verbose = False):
+
+
+    import pypar
+    if procs is None:
+        procs = range(0, pypar.size())
+        
+    myid = pypar.rank()
+    vertex_coordinates = domain.get_full_vertex_coordinates(absolute=True)
+    domain_centroids = domain.centroid_coordinates
+    size = 0
+    has_enq_point = False
+    numprocs = pypar.size()
+
+    inlet_procs = []
+    max_size = -1
+    inlet_master_proc = -1
+    inlet_enq_proc = -1
+
+
+
+    # Calculate the number of points of the line inside full polygon
+
+    #tri_id = line_intersect(vertex_coordinates, poly)
+
+    if len(poly) == 2: # poly is a line
+        if verbose : print "======================"
+        tri_id = line_intersect(vertex_coordinates, poly)
+    else: # poly is a polygon
+        if verbose : print "+++++++++++++++++++++++"
+        tris_0 = line_intersect(vertex_coordinates, [poly[0],poly[1]])
+        tris_1 = inside_polygon(domain_centroids, poly)
+        tri_id = num.union1d(tris_0, tris_1)
+        
+
+    if verbose:
+        print "P%d has %d triangles in poly %s" %(myid, len(tri_id), poly)
+
+    size = len(tri_id)
+
+    if enquiry_point is not None:
+        try:
+            k = domain.get_triangle_containing_point(enquiry_point)
+
+            if domain.tri_full_flag[k] == 1:
+                size = size + 1
+                has_enq_point = True
+                if verbose: print "P%d has enq point %s" %(myid, enquiry_point)
+            else:
+                if verbose: print "P%d contains ghost copy of enq point %s" %(myid, enquiry_point)
+                has_enq_point = False
+        except:
+            if verbose: print "P%d does not contain enq point %s" %(myid, enquiry_point)
+            has_enq_point = False
+
+    if myid == master_proc:
+        # Recieve size of overlap from each processor
+        # Initialize line_master_proc and inlet_procs
+
+        if size > 0:
+            inlet_procs = [master_proc]
+            max_size = size
+            inlet_master_proc = master_proc
+            if has_enq_point:
+                inlet_enq_proc = master_proc
+
+        # Recieve size of overlap
+        for i in procs:
+            if i == master_proc: continue
+            x = pypar.receive(i)
+            y = pypar.receive(i)
+
+            if x > 0:
+                inlet_procs.append(i)
+
+                # Choose inlet_master_proc as the one with the most overlap
+                if x > max_size:
+                    max_size = x
+                    inlet_master_proc = i
+
+                if y is True:
+                    assert inlet_enq_proc == -1, "Enquiry point correspond to more than one proc"
+                    inlet_enq_proc = i
+
+        assert len(inlet_procs) > 0, "Line does not intersect any domain"
+        assert inlet_master_proc >= 0, "No master processor assigned"
+
+        if enquiry_point is not None:
+            msg = "Enquiry point %s doesn't intersect mesh, maybe inside a building, try reducing enquiry_gap" % str(enquiry_point)
+            if inlet_enq_proc < 0:
+                raise Exception(msg)
+
+        # Send inlet_master_proc and inlet_procs to all processors in inlet_procs
+        for i in procs:
+            if i != master_proc:
+                pypar.send(inlet_master_proc, i)
+                pypar.send(inlet_procs, i)
+                pypar.send(inlet_enq_proc, i)
+
+    else:
+        pypar.send(size, master_proc)
+        pypar.send(has_enq_point, master_proc)
+
+        inlet_master_proc = pypar.receive(master_proc)
+        inlet_procs = pypar.receive(master_proc)
+        inlet_enq_proc = pypar.receive(master_proc)
+        if has_enq_point: assert inlet_enq_proc == myid, "Enquiry found in proc, but not declared globally"
+
+    if size > 0:
+        return True, inlet_master_proc, inlet_procs, inlet_enq_proc
+    else:
+        return False, inlet_master_proc, inlet_procs, inlet_enq_proc
+
+
+__author__="pete"
+__date__ ="$06/09/2011 1:17:57 PM$"
+
+if __name__ == "__main__":
+    print "Parallel operator factory"
Index: /trunk/anuga_core/source/anuga/parallel/parallel_shallow_water.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_shallow_water.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_shallow_water.py	(revision 9501)
@@ -0,0 +1,282 @@
+"""Class Parallel_shallow_water_domain -
+2D triangular domains for finite-volume computations of
+the shallow water equation, with extra structures to allow
+communication between other Parallel_domains and itself
+
+This module contains a specialisation of class Domain
+from module shallow_water.py
+
+Ole Nielsen, Stephen Roberts, Duncan Gray, Christopher Zoppou
+Geoscience Australia, 2004-2005
+
+"""
+
+from anuga import Domain
+
+import parallel_generic_communications as generic_comms
+
+import anuga.utilities.parallel_abstraction as pypar
+
+#from anuga.abstract_2d_finite_volumes.neighbour_mesh import Mesh
+
+import numpy as num
+from os.path import join
+
+
+#Import matplotlib
+
+
+
+class Parallel_domain(Domain):
+
+    def __init__(self, coordinates, vertices,
+                 boundary=None,
+                 full_send_dict=None,
+                 ghost_recv_dict=None,
+                 number_of_full_nodes=None,
+                 number_of_full_triangles=None,
+                 geo_reference=None,
+                 processor = None,
+                 numproc = None,
+                 number_of_global_triangles=None, ## SR added this
+                 number_of_global_nodes= None, ## SR added this
+                 s2p_map=None,
+                 p2s_map=None, #jj added this
+                 tri_l2g = None, ## SR added this
+                 node_l2g = None, #): ## SR added this
+                 ghost_layer_width = 2): ## SR added this
+
+
+
+        #-----------------------------------------
+        # Sometimes we want to manually
+        # create instances of the parallel_domain
+        # otherwise ...
+        #----------------------------------------
+        if processor is None:
+            processor = pypar.rank()
+        if numproc is None:
+            numproc = pypar.size()
+
+        Domain.__init__(self,
+                        coordinates,
+                        vertices,
+                        boundary,
+                        full_send_dict=full_send_dict,
+                        ghost_recv_dict=ghost_recv_dict,
+                        processor=processor,
+                        numproc=numproc,
+                        number_of_full_nodes=number_of_full_nodes,
+                        number_of_full_triangles=number_of_full_triangles,
+                        geo_reference=geo_reference, #) #jj added this
+                        ghost_layer_width = ghost_layer_width)
+        
+
+        self.parallel = True
+
+        # PETE: Find the number of full nodes and full triangles, this is a temporary fix
+        # until the bug with get_number_of_full_[nodes|triangles]() is fixed.
+
+        if number_of_full_nodes is not None:
+            self.number_of_full_nodes_tmp = number_of_full_nodes
+        else:
+            self.number_of_full_nodes_tmp = self.get_number_of_nodes()
+
+        if number_of_full_triangles is not None:
+            self.number_of_full_triangles_tmp = number_of_full_triangles
+        else:
+            self.number_of_full_triangles_tmp = self.get_number_of_triangles()
+
+        generic_comms.setup_buffers(self)
+
+        self.global_name = 'domain'
+
+        self.number_of_global_triangles=number_of_global_triangles
+        self.number_of_global_nodes = number_of_global_nodes
+
+        self.s2p_map = s2p_map
+        self.p2s_map = p2s_map
+
+
+        self.s2p_map = None
+        self.p2s_map = None
+
+        self.tri_l2g = tri_l2g
+        self.node_l2g = node_l2g
+
+        self.ghost_counter = 0
+
+
+    def set_name(self, name):
+        """Assign name based on processor number 
+        """
+
+        if name.endswith('.sww'):
+            name = name[:-4]
+
+        self.global_name = name
+
+        # Call parents method with processor number attached.
+        Domain.set_name(self, name + '_P%d_%d' %(self.numproc, self.processor))
+
+
+    def get_global_name(self):
+
+        return self.global_name
+
+
+    def update_timestep(self, yieldstep, finaltime):
+        """Calculate local timestep
+        """
+
+        generic_comms.communicate_flux_timestep(self, yieldstep, finaltime)
+
+        Domain.update_timestep(self, yieldstep, finaltime)
+
+
+
+    def update_ghosts(self):
+        """We must send the information from the full cells and
+        receive the information for the ghost cells
+        """
+            
+        generic_comms.communicate_ghosts_asynchronous(self)
+        #generic_comms.communicate_ghosts_blocking(self)
+
+    def apply_fractional_steps(self):
+
+        for operator in self.fractional_step_operators:
+            operator()
+
+        # PETE: Make sure that there are no deadlocks here
+
+        #self.update_ghosts()
+
+
+
+    def sww_merge(self, verbose=False, delete_old=False):
+
+        # make sure all the computations have finished
+
+        pypar.barrier()
+
+        # now on processor 0 pull all the separate sww files together
+        if self.processor == 0 and self.numproc > 1 and self.store :
+            import anuga.utilities.sww_merge as merge
+
+            global_name = join(self.get_datadir(),self.get_global_name())
+            
+            merge.sww_merge_parallel(global_name,self.numproc,verbose,delete_old)
+
+        # make sure all the merge completes on processor 0 before other
+        # processors complete (like when finalize is forgotten in main script)
+        
+        pypar.barrier()
+        
+    def write_time(self):
+
+        if self.processor == 0:
+            Domain.write_time(self)
+
+
+# =======================================================================
+# PETE: NEW METHODS FOR FOR PARALLEL STRUCTURES. Note that we assume the 
+# first "number_of_full_[nodes|triangles]" are full [nodes|triangles]
+# For full triangles it is possible to enquire self.tri_full_flag == True
+# =======================================================================
+
+    def get_number_of_full_triangles(self, *args, **kwargs):
+        return self.number_of_full_triangles_tmp
+
+    def get_full_centroid_coordinates(self, *args, **kwargs):
+        C = self.mesh.get_centroid_coordinates(*args, **kwargs)
+        return C[:self.number_of_full_triangles_tmp, :]
+
+    def get_full_vertex_coordinates(self, *args, **kwargs):
+        V = self.mesh.get_vertex_coordinates(*args, **kwargs)
+        return V[:3*self.number_of_full_triangles_tmp,:]
+
+    def get_full_triangles(self, *args, **kwargs):
+        T = self.mesh.get_triangles(*args, **kwargs)
+        return T[:self.number_of_full_triangles_tmp,:]
+
+    def get_full_nodes(self, *args, **kwargs):
+        N = self.mesh.get_nodes(*args, **kwargs)
+        return N[:self.number_of_full_nodes_tmp,:]
+
+    def get_tri_map(self):
+        return self.tri_map
+
+    def get_inv_tri_map(self):
+        return self.inv_tri_map
+
+    '''
+    Outputs domain triangulation, full triangles are shown in green while ghost triangles are shown in blue.
+    The default filename is "domain.png"
+    '''
+    def dump_triangulation(self, filename="domain.png"):
+        # Get vertex coordinates, partition full and ghost triangles based on self.tri_full_flag
+
+        try:
+            import matplotlib
+            matplotlib.use('Agg')
+            import matplotlib.pyplot as plt
+            import matplotlib.tri as tri
+        except:
+            print "Couldn't import module from matplotlib, probably you need to update matplotlib"
+            raise
+
+        vertices = self.get_vertex_coordinates()
+        full_mask = num.repeat(self.tri_full_flag == 1, 3)
+        ghost_mask = num.repeat(self.tri_full_flag == 0, 3)
+        
+        myid = pypar.rank()
+        numprocs = pypar.size()
+
+        if myid == 0:
+
+            fig = plt.figure()
+            fx = {}
+            fy = {}
+            gx = {}
+            gy = {}
+
+            # Proc 0 gathers full and ghost nodes from self and other processors
+            fx[0] = vertices[full_mask,0]
+            fy[0] = vertices[full_mask,1]
+            gx[0] = vertices[ghost_mask,0]
+            gy[0] = vertices[ghost_mask,1]
+            
+            for i in range(1,numprocs):
+                fx[i] = pypar.receive(i)
+                fy[i] = pypar.receive(i)
+                gx[i] = pypar.receive(i)
+                gy[i] = pypar.receive(i)
+
+            # Plot full triangles
+            for i in range(0, numprocs):
+                n = int(len(fx[i])/3)
+                            
+                triang = num.array(range(0,3*n))
+                triang.shape = (n, 3)
+                plt.triplot(fx[i], fy[i], triang, 'g-', linewidth = 0.5)
+
+            # Plot ghost triangles
+            for i in range(0, numprocs):
+                n = int(len(gx[i])/3)
+                if n > 0:
+                    triang = num.array(range(0,3*n))
+                    triang.shape = (n, 3)
+                    plt.triplot(gx[i], gy[i], triang, 'b--', linewidth = 0.5)
+
+            # Save triangulation to location pointed by filename
+            plt.savefig(filename, dpi=600)
+
+        else:
+            # Proc 1..numprocs send full and ghost triangles to Proc 0
+            pypar.send(vertices[full_mask,0], 0)
+            pypar.send(vertices[full_mask,1], 0)
+            pypar.send(vertices[ghost_mask,0], 0)
+            pypar.send(vertices[ghost_mask,1], 0)
+            
+
Index: /trunk/anuga_core/source/anuga/parallel/parallel_structure_operator.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_structure_operator.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_structure_operator.py	(revision 9501)
@@ -0,0 +1,1166 @@
+import anuga
+import numpy as num
+import math
+import parallel_inlet_enquiry 
+import pypar
+
+from anuga.utilities.system_tools import log_to_file
+from anuga.utilities.numerical_tools import ensure_numeric
+from anuga.structures.inlet_enquiry import Inlet_enquiry
+
+
+class Parallel_Structure_operator(anuga.Operator):
+    """Parallel Structure Operator - transfer water from one rectangular box to another.
+    Sets up the geometry of problem
+    
+    This is the base class for structures (culverts, pipes, bridges etc) that exist across multiple
+    parallel shallow water domains. Inherit from this class (and overwrite discharge_routine method 
+    for specific subclasses)
+    
+    Input: Two points, pipe_size (either diameter or width, depth),
+    mannings_rougness,
+    """ 
+
+    counter = 0
+
+    """
+     ===========================================================================================
+     PETE: Inputs to this constructor are identical to the serial
+     structure operator, except for the following arguments:
+     master_proc - the processor that coordinates all processors (with domains) associated with this structure [INT]
+     procs - the list of processors associated with thisstructure (List[INT])
+     inlet_master_proc - master_proc of the first and second inlet (List[2])
+     inlet_procs - list of processors associated with the first and second inlet (LIST[2][INT])
+     enquiry_proc - processor associated the first and second enquiry point (List[2])
+    """
+
+    def __init__(self,
+                 domain,
+                 end_points,
+                 exchange_lines,
+                 enquiry_points,
+                 invert_elevations,
+                 width,
+                 height,
+                 diameter,
+                 z1,#added by PM 22/10/2013
+                 z2,#added by PM 22/10/2013
+                 apron,
+                 manning,
+                 enquiry_gap,
+                 description,
+                 label,
+                 structure_type,
+                 logging,
+                 verbose,
+                 master_proc = 0,
+                 procs = None,
+                 inlet_master_proc = [0,0],
+                 inlet_procs = None,
+                 enquiry_proc = None):
+
+
+        self.myid = pypar.rank()
+        self.num_procs = pypar.size()
+        
+        anuga.Operator.__init__(self,domain)
+
+        # Allocate default processor associations if not specified in arguments
+        # although we assume that such associations are provided correctly by the 
+        # parallel_operator_factory.
+
+        self.master_proc = master_proc
+        self.inlet_master_proc = inlet_master_proc
+        
+        if procs is None:
+            self.procs = [master_proc]
+        else:
+            self.procs = procs
+
+        if inlet_procs is None:
+            self.inlet_procs = [[inlet_master_proc[0]],[inlet_master_proc[0]]]
+        else:
+            self.inlet_procs = inlet_procs
+
+        if enquiry_proc is None:
+            self.enquiry_proc = [[inlet_master_proc[0]],[inlet_master_proc[0]]]
+        else:
+            self.enquiry_proc = enquiry_proc
+
+        self.end_points = ensure_numeric(end_points)
+        self.exchange_lines = ensure_numeric(exchange_lines)
+        self.enquiry_points = ensure_numeric(enquiry_points)
+        self.invert_elevations = ensure_numeric(invert_elevations)
+
+        assert (width is not None and diameter is None) or (width is None and diameter is not None)
+
+        if width is None:
+            width = diameter
+
+        if diameter is None:
+            diameter = width
+
+        if height is None:
+            height = width
+
+
+
+        if apron is None:
+            apron = width
+
+        self.width  = width
+        self.height = height
+        self.diameter = diameter
+        self.z1 = z1 #added by PM 22/10/2013
+        self.z2 = z2 #added by PM 22/10/2013
+        self.apron  = apron
+        self.manning = manning
+        self.enquiry_gap = enquiry_gap
+
+        if description == None:
+            self.description = ' '
+        else:
+            self.description = description
+        
+        if label == None:
+            self.label = "structure_%g" % Parallel_Structure_operator.counter + "_P" + str(self.myid)
+        else:
+            self.label = label + '_%g' % Parallel_Structure_operator.counter + "_P" + str(self.myid)
+
+        if structure_type == None:
+            self.structure_type = 'generic structure'
+        else:
+            self.structure_type = structure_type
+            
+        self.verbose = verbose        
+        
+        # Keep count of structures
+        if self.myid == master_proc:
+            Parallel_Structure_operator.counter += 1
+
+        # Slots for recording current statistics
+        self.accumulated_flow = 0.0
+        self.discharge = 0.0
+        self.velocity = 0.0
+        self.outlet_depth = 0.0
+        self.delta_total_energy = 0.0
+        self.driving_energy = 0.0
+        
+        if exchange_lines is not None:
+            self.__process_skew_culvert()
+        elif end_points is not None:
+            self.__process_non_skew_culvert()
+        else:
+            raise Exception, 'Define either exchange_lines or end_points'
+        
+        self.inlets = []
+
+        # Allocate parallel inlet enquiry, assign None if processor is not associated with particular
+        # inlet.
+
+        if self.myid in self.inlet_procs[0]:
+            line0 = self.exchange_lines[0]
+            if self.apron is None:
+                poly0 = line0
+            else:
+                offset = -self.apron*self.outward_vector_0 
+                poly0 = num.array([ line0[0], line0[1], line0[1]+offset, line0[0]+offset])
+
+            if self.invert_elevations is None:
+                invert_elevation0 = None
+            else:
+                invert_elevation0 = self.invert_elevations[0]
+
+            enquiry_point0 = self.enquiry_points[0]
+            outward_vector0 = self.culvert_vector
+
+            self.inlets.append(parallel_inlet_enquiry.Parallel_Inlet_enquiry(
+                               self.domain,
+                               line0,
+                               enquiry_point0,
+                               invert_elevation = invert_elevation0,
+                               outward_culvert_vector = outward_vector0, 
+                               master_proc = self.inlet_master_proc[0],
+                               procs = self.inlet_procs[0],
+                               enquiry_proc = self.enquiry_proc[0],
+                               verbose = self.verbose))
+        else:
+            self.inlets.append(None)
+
+        if self.myid in self.inlet_procs[1]:
+            line1 = self.exchange_lines[1]
+            if self.apron is None:
+                poly1 = line1
+            else:
+                offset = -self.apron*self.outward_vector_1
+                poly1 = num.array([ line1[0], line1[1], line1[1]+offset, line1[0]+offset])
+
+            if self.invert_elevations is None:
+                invert_elevation1 = None
+            else:
+                invert_elevation1 = self.invert_elevations[1]
+
+
+            enquiry_point1 = self.enquiry_points[1]
+            outward_vector1  = - self.culvert_vector
+
+
+            self.inlets.append(parallel_inlet_enquiry.Parallel_Inlet_enquiry(
+                               self.domain,
+                               line1,
+                               enquiry_point1,
+                               invert_elevation = invert_elevation1,
+                               outward_culvert_vector = outward_vector1,
+                               master_proc = self.inlet_master_proc[1],
+                               procs = self.inlet_procs[1],
+                               enquiry_proc = self.enquiry_proc[1],
+                               verbose = self.verbose))
+
+        else:
+            self.inlets.append(None)
+
+        self.inflow_index = 0
+        self.outflow_index = 1
+
+        self.set_parallel_logging(logging)
+
+    def __call__(self):
+
+        timestep = self.domain.get_timestep()
+
+        Q, barrel_speed, outlet_depth = self.discharge_routine()
+
+        # Get attributes of Inflow inlet, all procs associated with inlet must call
+        if self.myid in self.inlet_procs[self.inflow_index]:
+            old_inflow_depth = self.inlets[self.inflow_index].get_global_average_depth()
+            old_inflow_stage = self.inlets[self.inflow_index].get_global_average_stage()
+            old_inflow_xmom = self.inlets[self.inflow_index].get_global_average_xmom()
+            old_inflow_ymom = self.inlets[self.inflow_index].get_global_average_ymom()
+            inflow_area = self.inlets[self.inflow_index].get_global_area()
+
+        # Master proc of inflow inlet sends attributes to master proc of structure
+        if self.myid == self.master_proc:
+            if self.myid != self.inlet_master_proc[self.inflow_index]:
+                old_inflow_depth = pypar.receive(self.inlet_master_proc[self.inflow_index])
+                old_inflow_stage = pypar.receive(self.inlet_master_proc[self.inflow_index])
+                old_inflow_xmom = pypar.receive(self.inlet_master_proc[self.inflow_index])
+                old_inflow_ymom = pypar.receive(self.inlet_master_proc[self.inflow_index])
+                inflow_area = pypar.receive(self.inlet_master_proc[self.inflow_index])
+        elif self.myid == self.inlet_master_proc[self.inflow_index]:
+            pypar.send(old_inflow_depth, self.master_proc)
+            pypar.send(old_inflow_stage, self.master_proc)
+            pypar.send(old_inflow_xmom, self.master_proc)
+            pypar.send(old_inflow_ymom, self.master_proc)
+            pypar.send(inflow_area, self.master_proc)
+
+        # Implement the update of flow over a timestep by
+        # using a semi-implict update. This ensures that
+        # the update does not create a negative depth
+        
+        # Master proc of structure only
+        if self.myid == self.master_proc:
+            if old_inflow_depth > 0.0 :
+                Q_star = Q/old_inflow_depth
+            else:
+                Q_star = 0.0
+
+            factor = 1.0/(1.0 + Q_star*timestep/inflow_area)
+
+            new_inflow_depth = old_inflow_depth*factor
+            new_inflow_xmom = old_inflow_xmom*factor
+            new_inflow_ymom = old_inflow_ymom*factor
+
+        # Master proc of structure sends new inflow attributes to all inflow inlet processors
+
+        if self.myid == self.master_proc:
+            for i in self.inlet_procs[self.inflow_index]:
+                if i == self.master_proc: continue
+                pypar.send(new_inflow_depth, i)
+                pypar.send(new_inflow_xmom, i)
+                pypar.send(new_inflow_ymom, i)
+        elif self.myid in self.inlet_procs[self.inflow_index]:
+            new_inflow_depth = pypar.receive(self.master_proc)
+            new_inflow_xmom = pypar.receive(self.master_proc)
+            new_inflow_ymom = pypar.receive(self.master_proc)
+
+        # Inflow inlet procs sets new attributes
+        if self.myid in self.inlet_procs[self.inflow_index]:
+            self.inlets[self.inflow_index].set_depths(new_inflow_depth)
+            self.inlets[self.inflow_index].set_xmoms(new_inflow_xmom)
+            self.inlets[self.inflow_index].set_ymoms(new_inflow_ymom)
+
+        # Get outflow inlet attributes, all processors associated with outflow inlet must call
+        if self.myid in self.inlet_procs[self.outflow_index]:
+            outflow_area = self.inlets[self.outflow_index].get_global_area()
+            outflow_average_depth = self.inlets[self.outflow_index].get_global_average_depth()
+            outflow_outward_culvert_vector = self.inlets[self.outflow_index].outward_culvert_vector
+
+        # Master proc of outflow inlet sends attribute to master proc of structure
+        if self.myid == self.master_proc:
+            if self.myid != self.inlet_master_proc[self.outflow_index]:
+                outflow_area = pypar.receive(self.inlet_master_proc[self.outflow_index])
+                outflow_average_depth = pypar.receive(self.inlet_master_proc[self.outflow_index])
+                outflow_outward_culvert_vector = pypar.receive(self.inlet_master_proc[self.outflow_index])
+        elif self.myid == self.inlet_master_proc[self.outflow_index]:
+            pypar.send(outflow_area, self.master_proc)
+            pypar.send(outflow_average_depth, self.master_proc)
+            pypar.send(outflow_outward_culvert_vector, self.master_proc)
+
+        # Master proc of structure computes new outflow attributes
+        if self.myid == self.master_proc:
+            loss = (old_inflow_depth - new_inflow_depth)*inflow_area
+
+            # set outflow
+            if old_inflow_depth > 0.0 :
+                timestep_star = timestep*new_inflow_depth/old_inflow_depth
+            else:
+                timestep_star = 0.0
+
+            outflow_extra_depth = Q*timestep_star/outflow_area
+            outflow_direction = - outflow_outward_culvert_vector
+            outflow_extra_momentum = outflow_extra_depth*barrel_speed*outflow_direction
+            
+            gain = outflow_extra_depth*outflow_area
+
+            # Update Stats
+            self.discharge  = Q#outflow_extra_depth*self.outflow.get_area()/timestep
+            self.velocity = barrel_speed#self.discharge/outlet_depth/self.width
+
+            new_outflow_depth = outflow_average_depth + outflow_extra_depth
+
+            if self.use_momentum_jet :
+                # FIXME (SR) Review momentum to account for possible hydraulic jumps at outlet
+                #new_outflow_xmom = outflow.get_average_xmom() + outflow_extra_momentum[0]
+                #new_outflow_ymom = outflow.get_average_ymom() + outflow_extra_momentum[1]
+
+                new_outflow_xmom = barrel_speed*new_outflow_depth*outflow_direction[0]
+                new_outflow_ymom = barrel_speed*new_outflow_depth*outflow_direction[1]
+
+            else:
+                #new_outflow_xmom = outflow.get_average_xmom()
+                #new_outflow_ymom = outflow.get_average_ymom()
+
+                new_outflow_xmom = 0.0
+                new_outflow_ymom = 0.0
+
+            # master proc of structure sends outflow attributes to all outflow procs
+            for i in self.inlet_procs[self.outflow_index]:
+                if i == self.myid: continue
+                pypar.send(new_outflow_depth, i)
+                pypar.send(new_outflow_xmom, i)
+                pypar.send(new_outflow_ymom, i)
+        # outflow inlet procs receives new outflow attributes
+        elif self.myid in self.inlet_procs[self.outflow_index]:
+            new_outflow_depth = pypar.receive(self.master_proc)
+            new_outflow_xmom = pypar.receive(self.master_proc)
+            new_outflow_ymom = pypar.receive(self.master_proc)
+
+        # outflow inlet procs sets new outflow attributes
+        if self.myid in self.inlet_procs[self.outflow_index]:
+            self.inlets[self.outflow_index].set_depths(new_outflow_depth)
+            self.inlets[self.outflow_index].set_xmoms(new_outflow_xmom)
+            self.inlets[self.outflow_index].set_ymoms(new_outflow_ymom)
+
+    def __process_non_skew_culvert(self):
+        """Create lines at the end of a culvert inlet and outlet.
+        At either end two lines will be created; one for the actual flow to pass through and one a little further away
+        for enquiring the total energy at both ends of the culvert and transferring flow.
+        """
+        
+        self.culvert_vector = self.end_points[1] - self.end_points[0]
+        self.culvert_length = math.sqrt(num.sum(self.culvert_vector**2))   
+        assert self.culvert_length > 0.0, 'The length of culvert is less than 0'
+        
+        self.culvert_vector /= self.culvert_length
+        self.outward_vector_0 =   self.culvert_vector
+        self.outward_vector_1 = - self.culvert_vector        
+        
+        culvert_normal = num.array([-self.culvert_vector[1], self.culvert_vector[0]])  # Normal vector
+        w = 0.5*self.width*culvert_normal # Perpendicular vector of 1/2 width
+
+        self.exchange_lines = []
+
+        # Build exchange polyline and enquiry point
+        if self.enquiry_points is None:
+            
+            gap = (self.apron + self.enquiry_gap)*self.culvert_vector
+            self.enquiry_points = []
+            
+            for i in [0, 1]:
+                p0 = self.end_points[i] + w
+                p1 = self.end_points[i] - w
+                self.exchange_lines.append(num.array([p0, p1]))
+                ep = self.end_points[i] + (2*i - 1)*gap #(2*i - 1) determines the sign of the points
+                self.enquiry_points.append(ep)
+            
+        else:            
+            for i in [0, 1]:
+                p0 = self.end_points[i] + w
+                p1 = self.end_points[i] - w
+                self.exchange_lines.append(num.array([p0, p1]))
+            
+  
+    def __process_skew_culvert(self):    
+        
+        """Compute skew culvert.
+        If exchange lines are given, the enquiry points are determined. This is for enquiring 
+        the total energy at both ends of the culvert and transferring flow.
+        """
+            
+        centre_point0 = 0.5*(self.exchange_lines[0][0] + self.exchange_lines[0][1])
+        centre_point1 = 0.5*(self.exchange_lines[1][0] + self.exchange_lines[1][1])
+
+        n_exchange_0 = len(self.exchange_lines[0])
+        n_exchange_1 = len(self.exchange_lines[1])
+
+        assert n_exchange_0 == n_exchange_1, 'There should be the same number of points in both exchange_lines'
+
+        if n_exchange_0 == 2:
+            
+            if self.end_points is None:
+                self.culvert_vector = centre_point1 - centre_point0
+            else:
+                self.culvert_vector = self.end_points[1] - self.end_points[0]
+
+            self.outward_vector_0 =   self.culvert_vector
+            self.outward_vector_1 = - self.culvert_vector
+
+        elif n_exchange_0 == 4:
+
+            self.outward_vector_0 = self.exchange_lines[0][3] - self.exchange_lines[0][2]
+            self.outward_vector_1 = self.exchange_lines[1][3] - self.exchange_lines[1][2]
+
+            self.culvert_vector = centre_point1 - centre_point0
+
+        else:
+            raise Exception, 'n_exchange_0 != 2 or 4'
+
+        self.culvert_length = math.sqrt(num.sum(self.culvert_vector**2))
+        assert self.culvert_length > 0.0, 'The length of culvert is less than 0'
+        self.culvert_vector /= self.culvert_length
+
+        outward_vector_0_length = math.sqrt(num.sum(self.outward_vector_0**2))
+        assert outward_vector_0_length > 0.0, 'The length of outlet_vector_0 is less than 0'
+        self.outward_vector_0 /= outward_vector_0_length
+
+        outward_vector_1_length = math.sqrt(num.sum(self.outward_vector_1**2))
+        assert outward_vector_1_length > 0.0, 'The length of outlet_vector_1 is less than 0'
+        self.outward_vector_1 /= outward_vector_1_length
+
+        
+        if self.enquiry_points is None:
+        
+
+            gap = (self.apron + self.enquiry_gap)*self.culvert_vector
+        
+            self.enquiry_points = []
+
+            self.enquiry_points.append(centre_point0 - gap)
+            self.enquiry_points.append(centre_point1 + gap)
+            
+
+    def discharge_routine(self):
+
+        msg = 'Need to impelement '
+        raise
+            
+
+    def statistics(self):
+        # Warning: requires synchronization, must be called by all procs associated
+        # with this structure
+
+        message = ' '
+
+        if self.myid == self.master_proc:
+
+            message  = '===============================================\n'
+            message += 'Parallel Structure Operator: %s\n' % self.label
+            message += '===============================================\n'
+
+            message += 'Structure Type: %s\n' % self.structure_type
+
+            message += 'Description\n'
+            message += '%s' % self.description
+            message += '\n'
+
+        #print "Structure Myids ",self.myid, self.label
+        
+        for i, inlet in enumerate(self.inlets):
+            if self.myid == self.master_proc:
+                message += '-------------------------------------\n'
+                message +=  'Inlet %i\n' %(i)
+                message += '-------------------------------------\n'
+
+            #print "*****",inlet, i,self.myid
+            if inlet is not None:
+                
+                
+                stats = inlet.statistics()
+
+            if self.myid == self.master_proc:
+                if self.myid != self.inlet_master_proc[i]:
+                    stats = pypar.receive(self.inlet_master_proc[i])                    
+            elif self.myid == self.inlet_master_proc[i]:
+                pypar.send(stats, self.master_proc)
+
+            if self.myid == self.master_proc: message += stats
+ 
+
+        if self.myid == self.master_proc: message += '=====================================\n'
+
+        return message
+
+
+    def print_statistics(self):
+        # Warning: requires synchronization, must be called by all procs associated
+        # with this structure
+
+        print self.statistics()
+
+
+    def print_timestepping_statistics(self):
+        # Warning: must be called by the master proc of this structure to obtain 
+        # meaningful output
+
+        message = ' '
+
+        if self.myid == self.master_proc:
+            message = '--------------------------------------------------\n'
+            message += 'Parallel Structure report for %s:\n' % self.label
+            message += '-------------------------------------------------\n'
+            message += 'Type: %s\n' % self.structure_type
+            message += 'Discharge [m^3/s]: %.2f\n' % self.discharge
+            message += 'Velocity  [m/s]: %.2f\n' % self.velocity
+            message += 'Inlet Driving Energy %.2f\n' % self.driving_energy
+            message += 'Delta Total Energy %.2f\n' % self.delta_total_energy
+            message += 'Control at this instant: %s\n' % self.case
+
+        print message
+
+
+    def set_parallel_logging(self, flag=True):
+        # Warning: requires synchronization, must be called by all procs associated
+        # with this structure
+
+        stats = self.statistics()
+        self.logging = flag
+
+        # If flag is true open file with mode = "w" to form a clean file for logging
+        if self.logging and self.myid == self.master_proc:
+            self.log_filename = self.label + '.log'
+            log_to_file(self.log_filename, stats, mode='w')
+            log_to_file(self.log_filename, 'time,discharge,velocity,driving_energy,delta_total_energy')
+
+            #log_to_file(self.log_filename, self.culvert_type)
+
+    def set_logging(self, flag=True):
+        # Overwrite the sequential procedure with a dummy procedure.
+        # Need to call set_parallel_logging which needs to be done later
+        # after the calculation of master processors
+
+        pass
+
+
+    def log_timestepping_statistics(self):
+
+        from anuga.utilities.system_tools import log_to_file
+        if self.logging and self.myid == self.master_proc:
+            log_to_file(self.log_filename, self.timestepping_statistics())
+
+
+
+    def timestepping_statistics(self):
+
+        message  = '%.5f, ' % self.domain.get_time()
+        message += '%.5f, ' % self.discharge
+        message += '%.5f, ' % self.velocity
+        message += '%.5f, ' % self.driving_energy
+        message += '%.5f' % self.delta_total_energy
+
+        return message
+
+
+    def get_inlets(self):
+        return self.inlets
+        
+        
+    def get_culvert_length(self):
+        return self.culvert_length
+
+
+    def get_culvert_width(self):        
+        return self.width
+        
+        
+    def get_culvert_diameter(self):
+        return self.diameter
+        
+        
+    def get_culvert_height(self):
+        return self.height
+
+    def get_culvert_z1(self): #added by PM 22/10/2013
+        return self.z1
+
+    def get_culvert_z2(self): #added by PM 22/10/2013       
+        return self.z2
+        
+    def get_culvert_apron(self):
+        return self.apron
+
+    # Get id of master proc of this structure
+    def get_master_proc(self):
+        return self.master_proc
+
+    # Get id of master proc of first and second inlet
+    def get_inlet_master_proc(self):
+        return self.inlet_master_proc
+
+    # Get id of processors associated with first and second inlet enquiry points
+    def get_enquiry_proc(self, id=None):
+
+        if id is none:
+            return self.enquiry_proc
+        else:
+            return self.enquiry_proc[id]
+
+
+    def set_culvert_height(self, height):
+
+        self.culvert_height = height
+
+    def set_culvert_width(self, width):
+
+        self.culvert_width = width
+
+    def set_culvert_z1(self, z1):#added by PM 22/10/2013 
+
+        self.culvet_z1 = z1        
+
+    def set_culvert_z2(self, z2):#added by PM 22/10/2013 
+
+        self.culvert_z2 = z2  
+        
+    def parallel_safe(self):
+        return True
+
+
+    def get_enquiry_stages(self):
+        # Should be called from all processors associated with operator
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_stage()'
+        get1 = 'self.inlets[1].get_enquiry_stage()'
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+    def get_enquiry_depths(self):
+        # Should be called from all processors associated with operator
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_depth()'
+        get1 = 'self.inlets[1].get_enquiry_depth()'
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+
+    def get_enquiry_positions(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_position()'
+        get1 = 'self.inlets[1].get_enquiry_position()'
+
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_xmoms(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_xmom()'
+        get1 = 'self.inlets[1].get_enquiry_xmom()'
+
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+    def get_enquiry_ymoms(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_ymom()'
+        get1 = 'self.inlets[1].get_enquiry_ymom()'
+
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_elevations(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_elevation()'
+        get1 = 'self.inlets[1].get_enquiry_elevation()'
+
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+
+    def get_enquiry_water_depths(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_water_depth()'
+        get1 = 'self.inlets[1].get_enquiry_water_depth()'
+
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_invert_elevations(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_invert_elevation()'
+        get1 = 'self.inlets[1].get_enquiry_invert_elevation()'
+
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_velocitys(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_velocity()'
+        get1 = 'self.inlets[1].get_enquiry_velocity()'
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_xvelocitys(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_xvelocity()'
+        get1 = 'self.inlets[1].get_enquiry_xvelocity()'
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+    def get_enquiry_yvelocitys(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_yvelocity()'
+        get1 = 'self.inlets[1].get_enquiry_yvelocity()'
+
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_speeds(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_speed()'
+        get1 = 'self.inlets[1].get_enquiry_speed()'
+
+        
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_velocity_heads(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_velocity_head()'
+        get1 = 'self.inlets[1].get_enquiry_velocity_head()'
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_total_energys(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_total_energy()'
+        get1 = 'self.inlets[1].get_enquiry_total_energy()'
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
+    def get_enquiry_specific_energys(self):
+
+        enq0 = None
+        enq1 = None
+
+        get0 = 'self.inlets[0].get_enquiry_specific_energy()'
+        get1 = 'self.inlets[1].get_enquiry_specific_energy()'
+
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+            else:
+                enq0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+            else:
+                enq1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                enq0 = eval(get0)
+                pypar.send(enq0, self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                enq1 = eval(get1)
+                pypar.send(enq1, self.master_proc)
+
+
+        return [enq0, enq1]
+
+
Index: /trunk/anuga_core/source/anuga/parallel/parallel_weir_orifice_trapezoid_operator.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/parallel_weir_orifice_trapezoid_operator.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/parallel_weir_orifice_trapezoid_operator.py	(revision 9501)
@@ -0,0 +1,275 @@
+import anuga
+import math
+
+from anuga.structures.weir_orifice_trapezoid_operator import weir_orifice_trapezoid_function 
+
+from parallel_inlet_operator import Parallel_Inlet_operator
+from parallel_structure_operator import Parallel_Structure_operator
+
+class Parallel_Weir_orifice_trapezoid_operator(Parallel_Structure_operator):
+    """Culvert flow - transfer water from one trapezoid section to another.
+    Sets up the geometry of problem
+    
+    This is the base class for culverts. Inherit from this class (and overwrite
+    compute_discharge method for specific subclasses)
+    
+    Input: Two points, pipe_size (either diameter or width, height),
+    mannings_rougness,
+    """
+
+    def __init__(self,
+                 domain,
+                 losses,
+                 width,
+                 height=None,
+                 z1=None,
+                 z2=None,
+                 end_points=None,
+                 exchange_lines=None,
+                 enquiry_points=None,
+                 invert_elevations=None,
+                 apron=0.1,
+                 manning=0.013,
+                 enquiry_gap=0.0,
+                 use_momentum_jet=True,
+                 use_velocity_head=True,
+                 description=None,
+                 label=None,
+                 structure_type='weir_orifice_trapezoid',
+                 logging=False,
+                 verbose=False,
+                 master_proc = 0,
+                 procs = None,
+                 inlet_master_proc = [0,0],
+                 inlet_procs = None,
+                 enquiry_proc = [0,0]):
+                     
+        Parallel_Structure_operator.__init__(self,
+                                          domain=domain,
+                                          end_points=end_points,
+                                          exchange_lines=exchange_lines,
+                                          enquiry_points=enquiry_points,
+                                          invert_elevations=invert_elevations,
+                                          width=width,
+                                          height=height,
+                                          z1=z1,
+                                          z2=z2,
+                                          diameter= None,
+                                          apron=apron,
+                                          manning=manning,
+                                          enquiry_gap=enquiry_gap,
+                                          description=description,
+                                          label=label,
+                                          structure_type=structure_type,
+                                          logging=logging,
+                                          verbose=verbose,
+                                          master_proc=master_proc,
+                                          procs=procs,
+                                          inlet_master_proc=inlet_master_proc,
+                                          inlet_procs=inlet_procs,
+                                          enquiry_proc=enquiry_proc)
+        
+        if isinstance(losses, dict):
+            self.sum_loss = sum(losses.values())
+        elif isinstance(losses, list):
+            self.sum_loss = sum(losses)
+        else:
+            self.sum_loss = losses
+        
+        self.use_momentum_jet = use_momentum_jet
+        self.use_velocity_head = use_velocity_head
+        
+        self.culvert_length = self.get_culvert_length()
+        self.culvert_width = self.get_culvert_width()
+        self.culvert_height = self.get_culvert_height()
+        
+        self.culvert_z1 = self.get_culvert_z1()
+        self.culvert_z2 = self.get_culvert_z2()
+        
+        self.max_velocity = 10.0
+
+        self.inlets = self.get_inlets()
+
+
+        # Stats
+        
+        self.discharge = 0.0
+        self.velocity = 0.0
+        
+        self.case = 'N/A'
+
+        '''
+        print "ATTRIBUTES OF PARALLEL WEIR ORIFICE TRAPEZOID::"
+        for attr in dir(self):
+            print "obj.%s = %s" % (attr, getattr(self, attr))
+        '''
+
+
+    def parallel_safe(self):
+
+        return True
+
+
+
+    def discharge_routine(self):
+
+        import pypar
+
+        local_debug = False
+
+        #Send attributes of both enquiry points to the master proc
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[0]:
+                enq_total_energy0 = self.inlets[0].get_enquiry_total_energy()
+                enq_stage0 = self.inlets[0].get_enquiry_stage()
+            else:
+                enq_total_energy0 = pypar.receive(self.enquiry_proc[0])
+                enq_stage0 = pypar.receive(self.enquiry_proc[0])
+
+
+            if self.myid == self.enquiry_proc[1]:
+                enq_total_energy1 = self.inlets[1].get_enquiry_total_energy()
+                enq_stage1 = self.inlets[1].get_enquiry_stage()
+            else:
+                enq_total_energy1 = pypar.receive(self.enquiry_proc[1])
+                enq_stage1 = pypar.receive(self.enquiry_proc[1])
+
+        else:
+            if self.myid == self.enquiry_proc[0]:
+                pypar.send(self.inlets[0].get_enquiry_total_energy(), self.master_proc)
+                pypar.send(self.inlets[0].get_enquiry_stage(), self.master_proc)
+
+            if self.myid == self.enquiry_proc[1]:
+                pypar.send(self.inlets[1].get_enquiry_total_energy(), self.master_proc)
+                pypar.send(self.inlets[1].get_enquiry_stage(), self.master_proc)
+
+
+        # Determine the direction of the flow
+        if self.myid == self.master_proc:
+            if self.use_velocity_head:
+                self.delta_total_energy = enq_total_energy0 - enq_total_energy1
+            else:
+                self.delta_total_energy = enq_stage0 - enq_stage1
+
+        self.inflow_index = 0
+        self.outflow_index = 1
+        # master proc orders reversal if applicable
+        if self.myid == self.master_proc:
+
+
+            # Reverse the inflow and outflow direction?
+            if self.delta_total_energy < 0:
+                self.inflow_index = 1
+                self.outflow_index = 0
+
+                self.delta_total_energy = -self.delta_total_energy
+
+                for i in self.procs:
+                    if i == self.master_proc: continue
+                    pypar.send(True, i)
+            else:
+                for i in self.procs:
+                    if i == self.master_proc: continue
+                    pypar.send(False, i)
+
+            #print "ZZZZ: Delta total energy = %f" %(self.delta_total_energy)
+        else:
+            reverse = pypar.receive(self.master_proc)
+
+            if reverse:
+                self.inflow_index = 1
+                self.outflow_index = 0
+
+        # Get attribute from inflow enquiry point
+        if self.myid == self.master_proc:
+
+            if self.myid == self.enquiry_proc[self.inflow_index]:
+                    inflow_enq_depth = self.inlets[self.inflow_index].get_enquiry_depth()
+                    inflow_enq_specific_energy = self.inlets[self.inflow_index].get_enquiry_specific_energy()
+            else:
+                    inflow_enq_depth = pypar.receive(self.enquiry_proc[self.inflow_index])
+                    inflow_enq_specific_energy = pypar.receive(self.enquiry_proc[self.inflow_index])
+        else:
+            if self.myid == self.enquiry_proc[self.inflow_index]:
+                pypar.send(self.inlets[self.inflow_index].get_enquiry_depth(), self.master_proc)
+                pypar.send(self.inlets[self.inflow_index].get_enquiry_specific_energy(), self.master_proc)
+
+        # Get attribute from outflow enquiry point
+        if self.myid == self.master_proc:
+            
+            if self.myid == self.enquiry_proc[self.outflow_index]:
+                outflow_enq_depth = self.inlets[self.outflow_index].get_enquiry_depth()
+            else:
+                outflow_enq_depth = pypar.receive(self.enquiry_proc[self.outflow_index])
+
+            #print "ZZZZZ: outflow_enq_depth = %f" %(outflow_enq_depth)
+
+        else:
+            if self.myid == self.enquiry_proc[self.outflow_index]:
+                pypar.send(self.inlets[self.outflow_index].get_enquiry_depth(), self.master_proc)
+
+
+
+
+        # Master proc computes return values
+        if self.myid == self.master_proc:
+
+            #inflow_enq_specific_energy
+
+
+            if inflow_enq_depth > 0.01: #this value was 0.01:
+                if local_debug:
+                    anuga.log.critical('Specific E & Deltat Tot E = %s, %s'
+                                 % (str(inflow_enq_specific_energy),
+                                    str(self.delta_total_energy)))
+
+                    anuga.log.critical('culvert type = %s' % str(culvert_type))
+
+                # Water has risen above inlet
+
+
+                msg = 'Specific energy at inlet is negative'
+                assert inflow_enq_specific_energy >= 0.0, msg
+
+                if self.use_velocity_head :
+                    self.driving_energy = inflow_enq_specific_energy
+                else:
+                    self.driving_energy = inflow_enq_depth
+                    
+            
+                Q, barrel_velocity, outlet_culvert_depth, flow_area, case = \
+                              weir_orifice_trapezoid_function(depth               =self.culvert_height,
+                                                width               =self.culvert_width,
+                                                z1                  =self.culvert_z1,
+                                                z2                  =self.culvert_z2,                                                
+                                                flow_width          =self.culvert_width,
+                                                length              =self.culvert_length,
+                                                driving_energy      =self.driving_energy,
+                                                delta_total_energy  =self.delta_total_energy,
+                                                outlet_enquiry_depth=outflow_enq_depth,
+                                                sum_loss            =self.sum_loss,
+                                                manning             =self.manning)
+
+                
+            # END CODE BLOCK for DEPTH  > Required depth for CULVERT Flow
+
+            else: # self.inflow.get_enquiry_depth() < 0.01:
+                Q = barrel_velocity = outlet_culvert_depth = 0.0
+                case = 'Inlet dry'
+
+
+            self.case = case
+
+            # Temporary flow limit
+            if barrel_velocity > self.max_velocity:
+                barrel_velocity = self.max_velocity
+                Q = flow_area * barrel_velocity
+
+            
+
+            return Q, barrel_velocity, outlet_culvert_depth
+        else:
+            return None, None, None
+        
+        
Index: /trunk/anuga_core/source/anuga/parallel/print_stats.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/print_stats.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/print_stats.py	(revision 9501)
@@ -0,0 +1,205 @@
+#!/usr/bin/env python
+#########################################################
+#
+#
+# Calculate and print the norms of the domain
+#
+#
+#  The routines defined here are intended for debugging
+# use. They print the norms of the quantities in the
+# domain. As opposed to the definitions given
+# in utiltites.norms these calculations take a
+# parallel domain into account.
+#
+#  Authors: Linda Stals and April 2006
+#
+#
+#########################################################
+
+import sys
+
+import pypar
+
+from numpy import array, zeros, ones, take, nonzero, float
+from anuga.utilities.norms import l1_norm, l2_norm, linf_norm
+
+#########################################################
+#
+# Find out which triangles are full triangles (only these
+# triangles should be included in the norm calculations)
+#
+# *)
+#
+# -------------------------------------------------------
+#
+# *) A 1-D array, tri_full_flag, is returned.
+#
+# *) The size of tri_full_flag is the same as the number
+# of vertices in the domain
+#
+# *) If tri_full_flag[i] = 1, then triangle number i is
+# a full triangle, if tri_full_flag[i] = 0  the triangle
+# is a ghost triangle
+#
+#########################################################
+
+def build_full_flag(domain, ghost_recv_dict):
+
+    tri_full_flag = ones(len(domain.get_triangles()), Int8)
+    for i in ghost_recv_dict.keys():
+        for id in ghost_recv_dict[i][0]:
+            tri_full_flag[id] = 0
+        
+
+    return tri_full_flag
+
+#########################################################
+#
+# Print the l1 norm of the given quantity
+#
+# *) The quantity is an array containing three columns
+#
+# -------------------------------------------------------
+#
+# *) The l1 norm is calculated along each axis
+#
+# *) The l1 norm is printed
+#
+# *) Processor 0 prints the results
+#
+#
+#########################################################
+def print_l1_stats(full_edge):
+
+    numprocs = pypar.size()
+    myid = pypar.rank()
+    
+    tri_norm = zeros(3, Float)
+    recv_norm = zeros(3, Float)
+    tri_norm[0] = l1_norm(full_edge[:, 0])
+    tri_norm[1] = l1_norm(full_edge[:, 1])
+    tri_norm[2] = l1_norm(full_edge[:, 2])
+    if myid == 0:
+        for p in range(numprocs-1):
+            pypar.receive(p+1, recv_norm)
+            tri_norm[0] = tri_norm[0]+recv_norm[0]
+            tri_norm[1] = tri_norm[1]+recv_norm[1]
+            tri_norm[2] = tri_norm[2]+recv_norm[2]
+        print 'l1_norm along each axis : [', tri_norm[0],', ', tri_norm[1], ', ', tri_norm[2], ']'
+
+    else:
+        pypar.send(tri_norm, 0)
+
+#########################################################
+#
+# Print the l2 norm of the given quantity
+#
+# *) The quantity is an array containing three columns
+#
+# -------------------------------------------------------
+#
+# *) The l2 norm is calculated along each axis
+#
+# *) The l2 norm is printed
+#
+# *) Processor 0 prints the results
+#
+#
+#########################################################
+def print_l2_stats(full_edge):
+
+    numprocs = pypar.size()
+    myid = pypar.rank()
+    
+    tri_norm = zeros(3, Float)
+    recv_norm = zeros(3, Float)
+    tri_norm[0] = pow(l2_norm(full_edge[:, 0]), 2)
+    tri_norm[1] = pow(l2_norm(full_edge[:, 1]), 2)
+    tri_norm[2] = pow(l2_norm(full_edge[:, 2]), 2)
+    if myid == 0:
+        for p in range(numprocs-1):
+            pypar.receive(p+1, recv_norm)
+            tri_norm[0] = tri_norm[0]+recv_norm[0]
+            tri_norm[1] = tri_norm[1]+recv_norm[1]
+            tri_norm[2] = tri_norm[2]+recv_norm[2]
+        print 'l2_norm along each axis : [', pow(tri_norm[0], 0.5),', ', pow(tri_norm[1], 0.5), \
+              ', ', pow(tri_norm[2], 0.5), ']'
+    else:
+        pypar.send(tri_norm, 0)
+
+
+#########################################################
+#
+# Print the linf norm of the given quantity
+#
+# *) The quantity is an array containing three columns
+#
+# -------------------------------------------------------
+#
+# *) The linf norm is calculated along each axis
+#
+# *) The linf norm is printed
+#
+# *) Processor 0 prints the results
+#
+#
+#########################################################
+def print_linf_stats(full_edge):
+
+    numprocs = pypar.size()
+    myid = pypar.rank()
+    
+    tri_norm = zeros(3, Float)
+    recv_norm = zeros(3, Float)
+        
+    tri_norm[0] = linf_norm(full_edge[:, 0])
+    tri_norm[1] = linf_norm(full_edge[:, 1])
+    tri_norm[2] = linf_norm(full_edge[:, 2])
+    if myid == 0:
+        for p in range(numprocs-1):
+            pypar.receive(p+1, recv_norm)
+            tri_norm[0] = max(tri_norm[0], recv_norm[0])
+            tri_norm[1] = max(tri_norm[1], recv_norm[1])
+            tri_norm[2] = max(tri_norm[2], recv_norm[2])
+        print 'linf_norm along each axis : [', tri_norm[0],', ', tri_norm[1], ', ', tri_norm[2], ']'
+    else:
+        pypar.send(tri_norm, 0)
+
+       
+#########################################################
+#
+# Print the norms of the quantites assigned to the domain
+# (this is useful for checking the numerical results
+# in the parallel computation)
+#
+# *) tri_full_flag states which of the triangles are
+# full triangles
+#
+#
+# -------------------------------------------------------
+#
+# *) For each quantity, the l1, l2 and linf norms are
+# printed
+#
+# *) The size of tri_full_flag is the same as the number
+# of vertices in the domain
+#
+# *) Only the full triangles are used in the norm
+# calculations
+#
+# *) Processor 0 prints the results
+#
+#########################################################
+def print_test_stats(domain, tri_full_flag):
+
+    myid = pypar.rank()
+
+    for k in domain.quantities.keys():
+        TestStage = domain.quantities[k]
+        if myid == 0:
+            print " ===== ", k, " ===== "
+        full_edge = take(TestStage.edge_values, nonzero(tri_full_flag))
+        print_l1_stats(full_edge)
+        print_l2_stats(full_edge)
+        print_linf_stats(full_edge)
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/Makefile
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/Makefile	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/Makefile	(revision 9501)
@@ -0,0 +1,49 @@
+###
+# PyMetis Makefile
+#
+
+###
+# Config
+#
+COPTIONS = -fPIC
+
+METIS_DIR = metis-4.0
+
+###
+# Build
+#
+
+pymetis: metis pymetis_module
+
+metis:
+	make -C $(METIS_DIR)
+
+pymetis_module:
+	(cd pymetis; METIS_DIR=$(METIS_DIR) python setup.py build; python get_module.py)
+
+for_win32: metis_win32 pymetis_module_win32
+
+metis_win32:
+	make -C win32 METIS_DIR=$(METIS_DIR)
+########make -C $(METIS_DIR)/Lib is implied by make -C win32
+	make -C $(METIS_DIR)/Programs
+	make -C $(METIS_DIR)/Test
+
+pymetis_module_win32:
+	(cd pymetis; METIS_DIR=$(METIS_DIR) python setup.py build --compiler=mingw32; python get_module.py)
+
+###
+# Clean
+#
+
+clean:
+	make -C $(METIS_DIR) clean
+	make -C win32 clean
+	-(cd pymetis; rm -rf build)
+	-(cd pymetis; rm *~)
+	-rm *~
+
+realclean: clean
+	make -C $(METIS_DIR) realclean
+	-rm -f metis.so
+	-rm -f metis.pyd
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/README
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/README	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/README	(revision 9501)
@@ -0,0 +1,29 @@
+PyMetis provides a python module interface to the Metis graph
+partitioning and sparse matrix ordering library.
+
+Currently only the METIS_PartMeshNodal function is implemented.
+
+Build instructions:
+Linux:
+run "make" in the top pymetis directory.
+
+Should the metis version change, the new metis package should be in a new
+subdirectory. Metis 4.0 is in metis-4.0
+
+The METIS_DIR= line in the makefile will need to be changed appropriately.
+
+64 bit users need to run `make COPTIONS="-fPIC"'
+
+Windows:
+Required: MinGW compiler, Cygwin utilities (Bash, cp, [).
+
+Run:
+
+make for_win32
+
+Other makefile targets:
+clean:
+removes all intermediate files.
+
+realclean:
+performs clean, then also removes the pymetis.so file.
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/SConscript
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/SConscript	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/SConscript	(revision 9501)
@@ -0,0 +1,17 @@
+import glob
+import sys
+
+Import('env')
+env2 = env.Copy()
+files = glob.glob(('%s/Lib/*.c' % env2['METIS_DIR']))
+if sys.platform == 'win32':
+    files += ['win32/random.c']
+env2.Append(CPPPATH=[('%s/Lib' % env2['METIS_DIR'])])
+env3 = env2.Copy()
+env2.Append(CPPFLAGS='-fPIC')
+env2.StaticLibrary(('%s/metis' % env2['METIS_DIR']), files)
+
+env3.Append(CPPPATH=['pymetis'])
+env3.Append(LIBPATH=[env2['METIS_DIR']])
+env3.Append(LIBS=['metis'])
+env3.SharedLibrary('metis', glob.glob('pymetis/*.c'))
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/__init__.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/__init__.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/__init__.py	(revision 9501)
@@ -0,0 +1,8 @@
+"""Make directory available as a Python package
+"""
+
+pass
+
+#Add path of package to PYTHONPATH to allow C-extensions to be loaded
+import sys
+sys.path += __path__
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/CHANGES
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/CHANGES	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/CHANGES	(revision 9501)
@@ -0,0 +1,149 @@
+
+METIS 4.0.1, 11/29/98
+------------------------------------------------------------------------------
+This is mostly a bug-fix release
+
+  - Fixed some bugs in the multi-constraint partitioning routines
+  - Fixed some bugs in the volume-minimization routines
+
+
+
+METIS 4.0.0, 9/20/98
+------------------------------------------------------------------------------
+METIS 4.0 contains a number of changes over the previous major release (ver 
+3.0.x). Most of these changes are concentrated on the graph and mesh 
+partitioning routines and they do not affect the sparse matrix re-ordering 
+routines. Here is a list of the major changes:
+
+  Multi-Constraint Partitioning
+  -----------------------------
+  METIS now includes partitioning routines that can be used to a partition
+  a graph in the presence of multiple balancing constraints.
+
+  Minimizing the Total Communication Volume
+  -----------------------------------------
+  METIS now includes partitioning routines whose objective is to minimize
+  the total communication volume (as opposed to minimizing the edge-cut).
+
+  Minimizing the Maximum Connectivity of the Subdomains
+  -----------------------------------------------------
+  The k-way partitioning routines in METIS can now directly minimize the number
+  of adjacent subdomains. For most graphs corresponding to finite element 
+  meshes, METIS is able to significantly reduce the maximum (and total) number of 
+  adjacent subdomains.
+
+
+
+
+METIS 3.0.6, 1/28/98
+-------------------------------------------------------------------------------
+  - Fixed some problems when too many partitions were asked, and each partition
+    end up having 0 vertices
+  - Fixed some bugs in the I/O routines
+  - Added support for the g77 compiler under Linux
+
+
+METIS 3.0.5, 12/22/97
+-------------------------------------------------------------------------------
+  - Fixed problems on 64-bit architectures (eg., -64 option on SGIs).
+  - Added some options in Makefile.in
+
+
+METIS 3.0.4, 12/1/97
+-------------------------------------------------------------------------------
+  Fixed a memory leak in the ordering code.
+
+
+METIS 3.0.3, 11/5/97
+-------------------------------------------------------------------------------
+  This is mostly a bug-fix release with just a few additions
+
+  Added functionality
+    - Added support for quadrilateral elements.
+    - Added a routine METIS_EstimateMemory that estimates the amount of
+      memory that will be allocated by METIS. This is useful in determining
+      if a problem can run on your system.
+    - Added hooks to allow PARMETIS to use the orderings produced by METIS.
+      This is hidden from the user but it will be used in the next release
+      of PARMETIS.
+
+  Bug-fixes
+    - Fixed a bug related to memory allocation. This should somewhat reduce the 
+      overall memory used by METIS.
+    - Fixed some bugs in the 'graphchk' program in the case of weighted graphs.
+    - Removed some code corresponding to unused options.
+    - Fixed some minor bugs in the node-refinement code
+      
+
+
+-------------------------------------------------------------------------------
+METIS 3.0 contains a number of changes over METIS 2.0.
+The major changes are the following:
+
+  General Changes
+  ---------------
+    1.  Added code to directly partition finite element meshes.
+
+    2.  Added code to convert finite element meshes into graphs so they
+        can be used by METIS.
+
+    1.  The names, calling sequences, and options  of the routines in 
+        METISlib have been changed.
+
+    2.  Better support has been added for Fortran programs.
+
+    3.  Eliminated the 'metis' program. The only way to tune METIS's
+        behavior is to use METISlib.
+
+    4.  Improved memory management. METIS should now only abort if truly
+        there is no more memory left in the system.
+
+
+  Graph Partitioning
+  ------------------
+    1.  Added partitioning routines that can be used to compute a partition 
+        with prescribed partition weights. For example, they can be used to 
+        compute a 3-way partition such that partition 1 has 50% of the weight, 
+        partition 2 has 20% of the way, and partition 3 has 30% of the weight. 
+
+    2.  Improved the speed of the k-way partitioning algorithm (kmetis). The
+        new code has better cache locality which dramatically improves the 
+        speed for large graphs. A factor of 4 speedup can be obtained for
+        certain graphs. METIS can now partition a 4 million node graph
+        in well under a minute on a MIPS R10000.
+
+    3.  Eliminated some of the options that were seldom used. 
+  
+
+  Fill-Reducing Orderings
+  ----------------------
+    1.  Added a node based ordering code `onmetis' that greatly improves 
+        ordering quality.
+
+    2.  Improved the quality of the orderings produced by the original
+        edge-based ordering code (it is now called 'oemetis').
+
+    3.  METIS can now analyze the graph and try to compress together 
+        nodes with identical sparsity pattern. For some problems, this 
+        significantly reduces ordering time 
+
+    4.  METIS can now prune dense columns prior to ordering. This can be
+        helpful for LP matrices.
+        
+
+  Mesh Partitioning
+  -----------------
+    1.  METIS can now directly partition the element node array of finite
+        element meshes. It produces two partitioning vectors. One for the
+        elements and one for the nodes. METIS supports the following 
+        elements: triangles, tetrahedra, hexahedra
+
+
+  Mesh-To-Graph Conversion Routines
+  ---------------------------------
+    1.  METIS now includes a number of mesh conversion functions that can 
+        be used to create the dual and nodal graphs directly from the 
+        element connectivity arrays. These are highly optimized routines. 
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/FILES
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/FILES	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/FILES	(revision 9501)
@@ -0,0 +1,16 @@
+
+The distribution of METIS 4.0 consists of a number of files arranged
+in five directories. The files contained in each directory are as follows:
+
+Doc/		Contains METIS's user manual
+
+Graphs/		Contains some small sample graphs and meshes
+		that can be used with METIS.
+
+Lib/		Contains the code for METIS's library
+
+Programs/	Contains the code for METIS's stand-alone programs
+
+Test/		Contains a comprehensive tester for METIS's partitioning
+                routines.
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/0README
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/0README	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/0README	(revision 9501)
@@ -0,0 +1,81 @@
+
+This file contains two test problems
+
+4elt.graph
+	This is a small graph corresponding to a 2D finite element mesh
+
+test.mgraph
+	This is a very small graph with two vertex weights (multi-constraint)
+
+metis.mesh
+	This is a small 2D mesh (It is a triangulation of 'METIS')
+
+
+You can use them to test the various partitioning, and ordering routines.
+For example try something like
+
+	../kmetis 4elt.graph 40
+	../onmetis 4elt.graph
+	../pmetis test.mgraph 2
+	../kmetis test.mgraph 2
+	../kmetis test.mgraph 5
+	../partnmesh metis.mesh 10
+	../partdmesh metis.mesh 10
+	../mesh2dual metis.mesh
+	../kmetis metis.mesh.dgraph 10
+
+and so on...
+
+
+You can also use the 'mtest' program that tests the various partitioning 
+routines. Here is how the correct output of 'mtest 4elt.graph' should 
+look like.
+
+prompt%: mtest 4elt.graph
+**********************************************************************
+  METIS 4.0   Copyright 1998, Regents of the University of Minnesota
+
+Graph Information ---------------------------------------------------
+  Name: 4elt.graph, #Vertices: 15606, #Edges: 45878
+
+Testing METIS_PartGraphRecursive ------------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok]
+
+Testing METIS_WPartGraphRecursive -----------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok]
+
+Testing METIS_PartGraphKway -----------------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok][7:ok][8:ok]
+
+Testing METIS_WPartGraphKway ----------------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok][7:ok][8:ok]
+
+Testing METIS_PartGraphVKway ----------------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok][7:ok]
+
+Testing METIS_WPartGraphVKway ---------------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok][7:ok]
+
+Testing METIS_mCPartGraphRecursive ----------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok][7:ok][8:ok][9:ok][10:ok]
+  [11:ok][12:ok]
+
+Testing METIS_mCPartGraphKway ---------------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok][7:ok][8:ok][9:ok][10:ok]
+  [11:ok][12:ok][13:ok][14:ok]
+
+Testing METIS_EdgeND ------------------------------------------------
+  [1:ok][2:ok][3:ok]
+
+Testing METIS_NodeND ------------------------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok][7:ok][8:ok][9:ok][10:ok]
+  [11:ok][12:ok][13:ok]
+
+Testing METIS_NodeWND -----------------------------------------------
+  [1:ok][2:ok][3:ok][4:ok][5:ok][6:ok]
+
+---------------------------------------------------------------------
+ Testing completed.
+**********************************************************************
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/4elt.graph
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/4elt.graph	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/4elt.graph	(revision 9501)
@@ -0,0 +1,15607 @@
+15606 45878
+ 2 3 6 7 
+ 1 4 6 9 
+ 1 5 7 11 
+ 2 9 12 14 
+ 3 8 11 15 
+ 1 2 7 9 13 
+ 1 3 6 11 13 17 
+ 5 10 15 18 
+ 2 4 6 13 14 19 
+ 8 16 18 21 
+ 3 5 7 15 17 23 24 
+ 4 14 20 26 33 
+ 6 7 9 17 19 22 
+ 4 9 12 19 26 27 
+ 5 8 11 18 24 28 
+ 10 21 25 32 
+ 7 11 13 22 23 31 
+ 8 10 15 21 28 30 
+ 9 13 14 22 27 29 
+ 12 33 45 
+ 10 16 18 30 32 40 
+ 13 17 19 29 31 34 
+ 11 17 24 31 35 36 
+ 11 15 23 28 35 38 
+ 16 32 61 62 
+ 12 14 27 33 39 47 
+ 14 19 26 29 37 39 
+ 15 18 24 30 38 42 
+ 19 22 27 34 37 41 
+ 18 21 28 40 42 51 
+ 17 22 23 34 36 43 44 
+ 16 21 25 40 62 70 
+ 12 20 26 45 47 69 
+ 22 29 31 41 44 46 
+ 23 24 36 38 48 50 
+ 23 31 35 43 48 54 
+ 27 29 39 41 52 53 
+ 24 28 35 42 50 56 
+ 26 27 37 47 53 66 
+ 21 30 32 51 70 76 
+ 29 34 37 46 49 52 
+ 28 30 38 51 56 60 
+ 31 36 44 54 55 63 
+ 31 34 43 46 55 57 
+ 20 33 69 120 
+ 34 41 44 49 57 58 
+ 26 33 39 66 69 91 
+ 35 36 50 54 64 65 
+ 41 46 52 58 59 
+ 35 38 48 56 65 75 
+ 30 40 42 60 76 85 
+ 37 41 49 53 59 67 
+ 37 39 52 66 67 87 
+ 36 43 48 63 64 72 
+ 43 44 57 63 68 73 
+ 38 42 50 60 75 83 
+ 44 46 55 58 68 71 
+ 46 49 57 59 71 74 
+ 49 52 58 67 74 80 
+ 42 51 56 83 85 105 
+ 25 62 150 176 
+ 25 32 61 70 133 150 
+ 43 54 55 72 73 79 84 
+ 48 54 65 72 81 82 
+ 48 50 64 75 81 99 
+ 39 47 53 87 91 113 
+ 52 53 59 80 87 104 
+ 55 57 71 73 77 78 
+ 33 45 47 91 120 168 
+ 32 40 62 76 123 133 
+ 57 58 68 74 77 86 
+ 54 63 64 79 82 88 
+ 55 63 68 78 84 89 
+ 58 59 71 80 86 93 
+ 50 56 65 83 99 108 
+ 40 51 70 85 116 123 
+ 68 71 78 86 90 
+ 68 73 77 89 90 92 
+ 63 72 84 88 94 96 
+ 59 67 74 93 104 125 
+ 64 65 82 99 101 110 
+ 64 72 81 88 97 101 
+ 56 60 75 105 108 132 
+ 63 73 79 89 94 98 
+ 51 60 76 105 116 148 
+ 71 74 77 90 93 100 
+ 53 66 67 104 113 135 
+ 72 79 82 96 97 102 
+ 73 78 84 92 95 98 
+ 77 78 86 92 100 107 
+ 47 66 69 113 168 211 
+ 78 89 90 95 103 107 
+ 74 80 86 100 124 125 
+ 79 84 96 98 109 111 
+ 89 92 98 103 106 
+ 79 88 94 102 111 112 
+ 82 88 101 102 114 
+ 84 89 94 95 106 109 
+ 65 75 81 108 110 131 141 
+ 86 90 93 107 124 127 
+ 81 82 97 110 114 122 
+ 88 96 97 112 114 118 
+ 92 95 106 107 115 121 
+ 67 80 87 125 135 173 
+ 60 83 85 132 148 200 
+ 95 98 103 109 115 117 
+ 90 92 100 103 121 127 130 
+ 75 83 99 132 141 167 
+ 94 98 106 111 117 119 
+ 81 99 101 122 131 137 
+ 94 96 109 112 119 126 
+ 96 102 111 118 126 128 
+ 66 87 91 135 211 270 
+ 97 101 102 118 122 136 
+ 103 106 117 121 129 
+ 76 85 123 148 223 
+ 106 109 115 119 129 134 
+ 102 112 114 128 136 138 
+ 109 111 117 126 134 139 
+ 45 69 168 15200 
+ 103 107 115 129 130 140 
+ 101 110 114 136 137 146 
+ 70 76 116 133 223 5176 
+ 93 100 125 127 175 203 
+ 80 93 104 124 173 203 1438 
+ 111 112 119 128 139 142 143 
+ 100 107 124 130 154 175 
+ 112 118 126 138 142 145 
+ 115 117 121 134 140 144 
+ 107 121 127 140 152 154 
+ 99 110 137 141 161 199 
+ 83 105 108 167 200 410 
+ 62 70 123 150 5176 15053 
+ 117 119 129 139 144 147 
+ 87 104 113 173 252 270 
+ 114 118 122 138 146 149 158 
+ 110 122 131 146 161 165 
+ 118 128 136 145 149 151 
+ 119 126 134 143 147 155 
+ 121 129 130 144 152 159 
+ 99 108 131 167 199 239 
+ 126 128 143 145 156 157 
+ 126 139 142 155 156 160 
+ 129 134 140 147 159 164 
+ 128 138 142 151 153 157 
+ 122 136 137 158 165 174 
+ 134 139 144 155 164 169 
+ 85 105 116 200 223 5408 
+ 136 138 151 158 163 171 
+ 61 62 133 176 15053 15123 
+ 138 145 149 153 162 163 
+ 130 140 154 159 182 190 
+ 145 151 157 162 166 
+ 127 130 152 175 190 226 
+ 139 143 147 160 169 180 
+ 142 143 157 160 170 172 
+ 142 145 153 156 166 170 
+ 136 146 149 171 174 185 
+ 140 144 152 164 182 186 
+ 143 155 156 172 180 181 
+ 131 137 165 199 201 253 
+ 151 153 163 166 177 178 
+ 149 151 162 171 178 184 
+ 144 147 159 169 186 187 
+ 137 146 161 174 201 204 
+ 153 157 162 170 177 179 
+ 108 132 141 239 410 5091 
+ 69 91 120 211 15165 15200 
+ 147 155 164 180 187 193 
+ 156 157 166 172 179 183 
+ 149 158 163 184 185 195 
+ 156 160 170 181 183 188 
+ 104 125 135 252 1438 6142 
+ 146 158 165 185 204 208 
+ 124 127 154 203 226 275 
+ 61 150 15123 
+ 162 166 178 179 189 191 
+ 162 163 177 184 191 194 
+ 166 170 177 183 189 192 
+ 155 160 169 181 193 196 210 
+ 160 172 180 188 196 198 
+ 152 159 186 190 225 244 
+ 170 172 179 188 192 197 
+ 163 171 178 194 195 209 
+ 158 171 174 195 208 216 
+ 159 164 182 187 215 225 
+ 164 169 186 193 215 219 
+ 172 181 183 197 198 207 
+ 177 179 191 192 202 205 
+ 152 154 182 226 244 361 
+ 177 178 189 194 202 206 
+ 179 183 189 197 205 213 
+ 169 180 187 210 219 233 
+ 178 184 191 206 209 214 
+ 171 184 185 209 216 229 
+ 180 181 198 210 221 231 
+ 183 188 192 207 213 218 
+ 181 188 196 207 220 221 
+ 131 141 161 239 253 4560 4672 
+ 105 132 148 410 5408 7666 
+ 161 165 204 253 295 460 
+ 189 191 205 206 212 217 
+ 124 125 175 275 1438 4201 
+ 165 174 201 208 293 295 
+ 189 192 202 212 213 222 
+ 191 194 202 214 217 224 
+ 188 197 198 218 220 230 
+ 174 185 204 216 268 293 
+ 184 194 195 214 229 235 246 
+ 180 193 196 231 233 249 
+ 91 113 168 270 15098 15165 
+ 202 205 217 222 227 
+ 192 197 205 218 222 234 243 
+ 194 206 209 224 232 235 
+ 186 187 219 225 245 264 
+ 185 195 208 229 263 268 
+ 202 206 212 224 227 228 
+ 197 207 213 230 234 238 
+ 187 193 215 233 245 262 
+ 198 207 221 230 237 240 
+ 196 198 220 231 240 247 
+ 205 212 213 227 242 243 
+ 116 123 148 5176 5408 15071 
+ 206 214 217 228 232 236 
+ 182 186 215 244 264 312 
+ 154 175 190 275 361 2535 
+ 212 217 222 228 241 242 
+ 217 224 227 236 241 
+ 195 209 216 246 263 277 
+ 207 218 220 237 238 248 
+ 196 210 221 247 249 267 
+ 214 224 235 236 250 255 
+ 193 210 219 249 262 284 
+ 213 218 238 243 254 256 
+ 209 214 232 246 255 265 
+ 224 228 232 241 250 251 
+ 220 230 240 248 259 
+ 218 230 234 248 256 261 
+ 141 167 199 4560 5091 6408 
+ 220 221 237 247 259 266 
+ 227 228 236 242 251 257 
+ 222 227 241 243 257 258 
+ 213 222 234 242 254 258 260 
+ 182 190 225 312 361 4557 
+ 215 219 262 264 302 
+ 209 229 235 265 277 296 
+ 221 231 240 266 267 287 
+ 230 237 238 259 261 279 
+ 210 231 233 267 284 301 
+ 232 236 251 255 272 280 
+ 236 241 250 257 269 272 
+ 135 173 270 6142 12330 
+ 161 199 201 460 4672 4995 
+ 234 243 256 260 271 274 
+ 232 235 250 265 280 290 
+ 234 238 254 261 271 273 
+ 241 242 251 258 269 276 
+ 242 243 257 260 276 278 
+ 237 240 248 266 279 282 
+ 243 254 258 274 278 289 
+ 238 248 256 273 279 283 
+ 219 233 245 284 302 446 
+ 216 229 268 277 307 372 
+ 215 225 245 302 312 894 
+ 235 246 255 290 296 316 
+ 240 247 259 282 287 313 
+ 231 247 249 287 301 338 
+ 208 216 263 293 372 1146 
+ 251 257 272 276 286 291 
+ 113 135 211 252 12330 15098 
+ 254 256 273 274 281 285 
+ 250 251 269 280 286 297 
+ 256 261 271 281 283 288 
+ 254 260 271 285 289 298 
+ 175 203 226 2535 4201 5293 
+ 257 258 269 278 291 292 
+ 229 246 263 296 307 348 
+ 258 260 276 289 292 304 
+ 248 259 261 282 283 311 314 
+ 250 255 272 290 297 324 
+ 271 273 285 288 294 
+ 259 266 279 313 314 346 
+ 261 273 279 288 306 310 311 
+ 233 249 262 301 446 1168 
+ 271 274 281 294 298 299 
+ 269 272 291 297 317 
+ 247 266 267 313 338 396 
+ 273 281 283 294 300 305 306 308 
+ 260 274 278 298 304 323 329 
+ 255 265 280 316 324 544 
+ 269 276 286 292 317 328 
+ 276 278 291 304 327 328 
+ 204 208 268 295 1146 2565 3697 
+ 281 285 288 299 300 303 
+ 201 204 293 460 2565 3878 
+ 246 265 277 316 348 527 
+ 272 280 286 317 324 370 
+ 274 285 289 299 319 323 337 
+ 285 294 298 303 315 319 
+ 288 294 303 305 309 
+ 249 267 284 338 882 1168 
+ 245 262 264 446 894 1987 
+ 294 299 300 309 315 318 
+ 278 289 292 327 329 344 
+ 288 300 308 309 320 
+ 283 288 308 310 321 331 
+ 263 277 348 372 612 
+ 288 305 306 320 321 
+ 300 303 305 318 320 322 
+ 283 306 311 331 342 
+ 279 283 310 314 342 353 
+ 225 244 264 894 4557 4780 
+ 266 282 287 346 396 621 
+ 279 282 311 346 353 435 
+ 299 303 318 319 325 
+ 265 290 296 527 544 813 
+ 286 291 297 328 370 428 
+ 303 309 315 322 325 326 
+ 298 299 315 325 333 337 341 
+ 305 308 309 321 322 330 332 
+ 306 308 320 331 332 336 
+ 309 318 320 326 330 334 
+ 289 298 329 337 355 356 375 
+ 280 290 297 370 544 797 
+ 315 318 319 326 333 335 
+ 318 322 325 334 335 339 
+ 292 304 328 344 397 520 
+ 291 292 317 327 428 520 
+ 289 304 323 344 355 367 
+ 320 322 332 334 340 343 
+ 306 310 321 336 342 358 368 
+ 320 321 330 336 340 350 
+ 319 325 335 341 349 351 
+ 322 326 330 339 343 347 
+ 325 326 333 339 345 349 
+ 321 331 332 350 358 363 
+ 298 319 323 341 356 366 374 
+ 267 287 301 396 882 1028 
+ 326 334 335 345 347 352 
+ 330 332 343 350 357 
+ 319 333 337 351 364 366 
+ 310 311 331 353 368 458 466 
+ 330 334 340 347 357 362 
+ 304 327 329 367 397 418 
+ 335 339 349 352 354 
+ 282 313 314 435 621 956 
+ 334 339 343 352 359 362 
+ 277 296 307 527 612 1264 
+ 333 335 345 351 354 360 
+ 332 336 340 357 363 371 
+ 333 341 349 360 364 369 
+ 339 345 347 354 359 365 
+ 311 314 342 435 458 656 
+ 345 349 352 360 365 373 
+ 323 329 367 375 409 
+ 323 337 374 375 390 405 411 
+ 340 343 350 362 371 381 382 
+ 331 336 363 368 392 393 
+ 347 352 362 365 377 378 
+ 349 351 354 369 373 376 
+ 190 226 244 2535 4557 5550 
+ 343 347 357 359 377 380 381 
+ 336 350 358 371 387 393 
+ 341 351 366 369 385 386 
+ 352 354 359 373 378 379 
+ 337 341 364 374 386 404 408 413 
+ 329 344 355 409 418 450 
+ 331 342 358 392 453 466 
+ 351 360 364 376 383 385 
+ 297 317 324 428 797 809 
+ 350 357 363 382 387 389 
+ 263 268 307 612 1146 2062 
+ 354 360 365 376 379 384 
+ 337 356 366 404 411 414 
+ 323 355 356 390 409 419 
+ 360 369 373 383 384 388 
+ 359 362 378 380 391 400 
+ 359 365 377 379 394 400 
+ 365 373 378 384 394 398 
+ 362 377 381 391 395 
+ 357 362 380 382 395 401 
+ 357 371 381 389 401 406 
+ 369 376 385 388 399 403 
+ 373 376 379 388 398 402 
+ 364 369 383 386 403 421 
+ 364 366 385 413 421 424 
+ 363 371 389 393 412 416 
+ 376 383 384 399 402 
+ 371 382 387 406 416 427 
+ 356 375 405 419 451 
+ 377 380 395 400 407 417 
+ 358 368 393 437 453 470 
+ 358 363 387 392 412 429 437 
+ 378 379 398 400 415 423 
+ 380 381 391 401 407 422 
+ 287 313 338 621 1028 1249 
+ 327 344 418 520 680 721 
+ 379 384 394 402 415 420 
+ 383 388 402 403 425 426 
+ 377 378 391 394 417 423 432 
+ 381 382 395 406 422 430 
+ 384 388 398 399 420 425 
+ 383 385 399 421 426 433 
+ 366 374 408 414 436 439 
+ 356 390 411 447 451 
+ 382 389 401 427 430 445 
+ 391 395 417 422 434 
+ 366 404 413 431 436 
+ 355 367 375 419 450 494 507 
+ 132 167 200 5091 7666 13608 
+ 356 374 405 414 447 457 
+ 387 393 416 429 444 
+ 366 386 408 424 431 438 
+ 374 404 411 439 457 464 
+ 394 398 420 423 440 441 
+ 387 389 412 427 444 459 
+ 391 400 407 432 434 448 
+ 344 367 397 450 598 680 
+ 375 390 409 451 478 494 
+ 398 402 415 425 441 442 
+ 385 386 403 424 433 454 456 
+ 395 401 407 430 434 452 
+ 394 400 415 432 440 449 
+ 386 413 421 438 454 463 
+ 399 402 420 426 442 443 
+ 399 403 425 433 443 455 
+ 389 406 416 445 459 474 
+ 317 328 370 520 809 870 
+ 393 412 437 444 479 
+ 401 406 422 445 452 473 
+ 408 413 436 438 461 
+ 400 417 423 448 449 462 
+ 403 421 426 455 456 472 
+ 407 417 422 448 452 465 
+ 314 346 353 656 908 956 
+ 404 408 431 439 461 477 
+ 392 393 429 470 479 508 
+ 413 424 431 461 463 476 
+ 404 414 436 464 477 487 
+ 415 423 441 449 468 471 
+ 415 420 440 442 467 468 
+ 420 425 441 443 467 469 
+ 425 426 442 455 469 475 
+ 412 416 429 459 479 490 
+ 406 427 430 473 474 496 
+ 262 284 302 1168 1987 3287 
+ 405 411 451 457 501 505 
+ 417 432 434 462 465 481 
+ 423 432 440 462 471 480 
+ 367 409 418 507 588 598 
+ 390 405 419 447 478 505 517 
+ 422 430 434 465 473 483 
+ 368 392 466 470 545 553 
+ 421 424 456 463 482 484 
+ 426 433 443 472 475 485 
+ 421 433 454 472 482 492 
+ 411 414 447 464 500 501 
+ 342 353 466 550 607 656 690 
+ 416 427 444 474 490 506 
+ 201 253 295 3878 4995 5317 
+ 431 436 438 476 477 486 
+ 432 448 449 480 481 495 
+ 424 438 454 476 484 493 
+ 414 439 457 487 500 518 
+ 434 448 452 481 483 499 
+ 342 368 453 458 550 553 
+ 441 442 468 469 488 489 
+ 440 441 467 471 489 491 
+ 442 443 467 475 488 497 
+ 392 437 453 508 545 559 
+ 440 449 468 480 491 498 
+ 433 455 456 485 492 504 
+ 430 445 452 483 496 525 
+ 427 445 459 496 506 526 
+ 443 455 469 485 497 503 
+ 438 461 463 486 493 502 
+ 436 439 461 486 487 511 
+ 419 451 494 517 557 
+ 429 437 444 490 508 536 
+ 449 462 471 495 498 509 
+ 448 462 465 495 499 510 
+ 454 456 484 492 515 522 
+ 452 465 473 499 525 532 
+ 454 463 482 493 515 519 
+ 455 472 475 503 504 523 
+ 461 476 477 502 511 528 
+ 439 464 477 511 518 533 
+ 467 469 489 497 512 516 
+ 467 468 488 491 512 513 
+ 444 459 479 506 536 542 
+ 468 471 489 498 513 521 
+ 456 472 482 504 522 530 
+ 463 476 484 502 514 519 
+ 409 419 478 507 557 587 
+ 462 480 481 509 510 529 
+ 445 473 474 525 526 547 
+ 469 475 488 503 516 524 
+ 471 480 491 509 521 531 
+ 465 481 483 510 532 538 
+ 457 464 501 518 552 554 
+ 447 457 500 505 548 552 
+ 476 486 493 514 528 535 
+ 475 485 497 523 524 534 
+ 472 485 492 523 530 537 
+ 447 451 501 517 548 561 
+ 459 474 490 526 542 560 
+ 409 450 494 587 588 641 
+ 437 470 479 536 559 578 
+ 480 495 498 529 531 539 
+ 481 495 499 529 538 546 
+ 477 486 487 528 533 555 565 
+ 488 489 513 516 
+ 489 491 512 521 
+ 493 502 519 535 540 
+ 482 484 519 522 541 543 
+ 488 497 512 524 
+ 451 478 505 557 561 590 
+ 464 487 500 533 554 564 
+ 484 493 514 515 540 541 
+ 327 328 397 428 721 870 920 
+ 491 498 513 531 
+ 482 492 515 530 543 551 
+ 485 503 504 534 537 549 
+ 497 503 516 534 
+ 473 483 496 532 547 563 574 
+ 474 496 506 547 560 576 
+ 296 316 348 813 1264 15299 
+ 486 502 511 535 555 15286 
+ 495 509 510 539 546 556 
+ 492 504 522 537 551 558 
+ 498 509 521 539 
+ 483 499 525 538 563 566 
+ 487 511 518 564 565 570 
+ 503 523 524 549 
+ 502 514 528 540 562 15286 
+ 479 490 508 542 578 591 
+ 504 523 530 549 558 567 
+ 499 510 532 546 566 569 
+ 509 529 531 556 
+ 514 519 535 541 562 568 
+ 515 519 540 543 568 571 
+ 490 506 536 560 581 591 
+ 515 522 541 551 571 572 
+ 290 316 324 797 813 1495 1656 
+ 453 470 553 559 633 635 
+ 510 529 538 556 569 573 
+ 496 525 526 574 576 599 
+ 501 505 552 561 583 597 
+ 523 534 537 567 
+ 458 466 553 607 642 
+ 522 530 543 558 572 575 
+ 500 501 548 554 577 583 
+ 453 466 545 550 635 642 
+ 500 518 552 564 577 585 600 
+ 511 528 565 580 584 15286 
+ 529 539 546 573 
+ 478 494 517 587 590 650 
+ 530 537 551 567 575 579 
+ 470 508 545 578 633 645 
+ 506 526 542 576 581 604 
+ 505 517 548 590 597 623 
+ 535 540 568 582 586 15286 
+ 525 532 566 574 594 605 
+ 518 533 554 570 585 602 
+ 511 533 555 570 584 592 
+ 532 538 563 569 593 594 
+ 537 549 558 579 
+ 540 541 562 571 586 589 
+ 538 546 566 573 593 596 
+ 533 564 565 592 602 
+ 541 543 568 572 589 595 
+ 543 551 571 575 595 601 
+ 546 556 569 596 
+ 525 547 563 599 605 622 
+ 551 558 572 579 601 603 
+ 526 547 560 599 604 615 
+ 552 554 583 600 606 
+ 508 536 559 591 644 645 
+ 558 567 575 603 
+ 555 582 584 608 610 15286 
+ 542 560 591 604 629 
+ 562 580 586 608 611 15286 
+ 548 552 577 597 606 618 
+ 555 565 580 592 610 614 
+ 554 564 600 602 626 627 
+ 562 568 582 589 611 613 
+ 494 507 557 641 650 672 
+ 450 507 598 641 674 696 
+ 568 571 586 595 613 616 
+ 517 557 561 623 650 673 
+ 536 542 578 581 629 644 
+ 565 570 584 602 609 614 
+ 566 569 594 596 617 619 
+ 563 566 593 605 619 628 
+ 571 572 589 601 616 620 
+ 569 573 593 617 
+ 548 561 583 618 623 634 
+ 418 450 588 680 696 753 
+ 547 574 576 615 622 625 
+ 554 577 585 606 627 631 
+ 572 575 595 603 620 624 
+ 564 570 585 592 609 626 632 
+ 575 579 601 624 
+ 560 576 581 615 629 653 
+ 563 574 594 622 628 648 
+ 577 583 600 618 630 631 
+ 458 550 642 690 714 
+ 580 582 610 611 636 638 
+ 592 602 614 632 637 
+ 580 584 608 614 638 640 
+ 582 586 608 613 636 639 
+ 307 348 372 1264 2062 2078 
+ 586 589 611 616 639 643 
+ 584 592 609 610 637 640 
+ 576 599 604 625 653 654 
+ 589 595 613 620 643 646 
+ 593 596 619 647 
+ 583 597 606 630 634 651 
+ 593 594 617 628 647 652 
+ 595 601 616 624 646 649 
+ 313 346 396 956 1249 1576 
+ 574 599 605 625 648 655 
+ 561 590 597 634 667 673 
+ 601 603 620 649 
+ 599 615 622 654 655 
+ 585 602 627 632 658 669 
+ 585 600 626 631 659 669 
+ 594 605 619 648 652 665 
+ 581 591 604 644 653 679 
+ 606 618 631 651 657 
+ 600 606 627 630 657 659 
+ 602 609 626 637 658 660 
+ 545 559 635 645 713 715 
+ 597 618 623 651 667 668 
+ 545 553 633 642 713 717 
+ 608 611 638 639 661 662 
+ 609 614 632 640 660 15287 
+ 608 610 636 640 662 664 
+ 611 613 636 643 661 663 
+ 610 614 637 638 664 15287 
+ 507 587 588 672 674 700 
+ 550 553 607 635 714 717 
+ 613 616 639 646 663 666 
+ 578 591 629 645 679 724 
+ 559 578 633 644 715 724 
+ 616 620 643 649 666 670 
+ 617 619 652 671 
+ 605 622 628 655 665 676 
+ 620 624 646 670 
+ 557 587 590 672 673 719 728 
+ 618 630 634 657 668 675 
+ 619 628 647 665 671 677 
+ 604 615 629 654 679 699 
+ 615 625 653 655 685 699 
+ 622 625 648 654 676 685 
+ 353 435 458 690 848 908 1013 
+ 630 631 651 659 675 678 
+ 626 632 660 669 681 691 
+ 627 631 657 669 678 688 
+ 632 637 658 681 682 15287 
+ 636 639 662 663 683 15288 
+ 636 638 661 664 687 15288 
+ 639 643 661 666 683 684 
+ 638 640 662 686 687 15287 
+ 628 648 652 676 677 693 
+ 643 646 663 670 684 689 
+ 623 634 668 673 695 720 
+ 634 651 667 675 695 15289 
+ 626 627 658 659 688 691 697 
+ 646 649 666 689 
+ 647 652 677 692 
+ 587 641 650 700 728 748 
+ 590 623 650 667 719 720 739 
+ 588 641 696 700 743 
+ 651 657 668 678 694 15289 
+ 648 655 665 685 693 704 
+ 652 665 671 692 693 701 
+ 657 659 675 688 694 698 
+ 629 644 653 699 724 752 
+ 397 418 598 721 753 837 949 
+ 658 660 682 691 708 712 
+ 660 681 686 707 708 15287 
+ 661 663 684 702 703 15288 
+ 663 666 683 689 702 705 
+ 654 655 676 699 704 730 
+ 664 682 687 707 709 15287 
+ 662 664 686 706 709 15288 
+ 659 669 678 697 698 710 
+ 666 670 684 705 
+ 458 607 656 714 802 848 
+ 658 669 681 697 712 718 
+ 671 677 701 15290 
+ 665 676 677 701 704 723 
+ 675 678 698 711 716 15289 
+ 667 668 711 720 726 15289 
+ 588 598 674 743 753 783 
+ 669 688 691 710 718 725 
+ 678 688 694 710 716 722 
+ 653 654 679 685 730 752 771 
+ 641 672 674 743 748 759 
+ 677 692 693 723 736 15290 
+ 683 684 703 705 729 731 
+ 683 702 706 729 732 15288 
+ 676 685 693 723 730 747 
+ 684 689 702 731 
+ 687 703 709 732 733 15288 
+ 682 686 708 709 734 735 
+ 681 682 707 712 735 738 
+ 686 687 706 707 733 734 
+ 688 697 698 722 725 727 
+ 694 695 716 726 737 15289 
+ 681 691 708 718 738 741 
+ 633 635 715 717 788 795 
+ 607 642 690 717 796 802 
+ 633 645 713 724 795 815 
+ 694 698 711 722 737 740 
+ 635 642 713 714 788 796 
+ 691 697 712 725 741 745 
+ 650 673 728 739 774 777 
+ 667 673 695 726 739 761 769 
+ 397 520 680 920 949 1104 
+ 698 710 716 727 740 742 
+ 693 701 704 736 747 757 
+ 644 645 679 715 752 815 860 
+ 697 710 718 727 745 746 
+ 695 711 720 737 749 761 
+ 710 722 725 742 746 
+ 650 672 719 748 777 794 
+ 702 703 731 732 750 751 
+ 685 699 704 747 771 780 
+ 702 705 729 750 
+ 703 706 729 733 751 754 
+ 706 709 732 734 754 755 
+ 707 709 733 735 755 758 
+ 707 708 734 738 758 760 
+ 701 723 744 757 764 15290 
+ 711 716 726 740 749 756 
+ 708 712 735 741 760 763 
+ 673 719 720 769 774 790 
+ 716 722 737 742 756 762 
+ 712 718 738 745 763 766 
+ 722 727 740 746 762 765 
+ 674 696 700 759 783 805 
+ 736 764 768 15290 
+ 718 725 741 746 766 767 
+ 725 727 742 745 765 767 
+ 704 723 730 757 780 789 
+ 672 700 728 759 794 804 
+ 726 737 756 761 770 
+ 729 731 751 772 
+ 729 732 750 754 772 773 
+ 679 699 724 771 845 860 
+ 598 680 696 783 837 864 
+ 732 733 751 755 773 775 
+ 733 734 754 758 775 776 
+ 737 740 749 762 770 779 
+ 723 736 747 764 789 792 
+ 734 735 755 760 776 778 
+ 700 743 748 804 805 
+ 735 738 758 763 778 781 
+ 720 726 749 769 770 784 
+ 740 742 756 765 779 782 
+ 738 741 760 766 781 786 
+ 736 744 757 768 792 793 
+ 742 746 762 767 782 785 
+ 741 745 763 767 786 787 
+ 745 746 765 766 785 787 
+ 744 764 791 793 
+ 720 739 761 784 790 817 
+ 749 756 761 779 784 801 
+ 699 730 752 780 839 845 
+ 750 751 773 798 
+ 751 754 772 775 798 799 
+ 719 739 777 790 820 824 
+ 754 755 773 776 799 800 
+ 755 758 775 778 800 803 
+ 719 728 774 794 820 829 
+ 758 760 776 781 803 806 
+ 756 762 770 782 801 807 
+ 730 747 771 789 831 839 
+ 760 763 778 786 806 808 
+ 762 765 779 785 807 810 
+ 696 743 753 805 864 867 
+ 761 769 770 801 817 822 
+ 765 767 782 787 810 811 
+ 763 766 781 787 808 812 
+ 766 767 785 786 811 812 
+ 713 717 795 796 840 869 
+ 747 757 780 792 825 831 
+ 739 769 774 817 824 828 
+ 768 793 814 816 
+ 757 764 789 793 818 825 
+ 764 768 791 792 816 818 
+ 728 748 777 804 829 841 
+ 713 715 788 815 840 876 
+ 714 717 788 802 869 916 
+ 324 370 544 809 1495 1882 15297 
+ 772 773 799 819 
+ 773 775 798 800 819 821 
+ 775 776 799 803 821 823 
+ 770 779 784 807 822 832 
+ 690 714 796 848 916 987 
+ 776 778 800 806 823 826 
+ 748 759 794 805 841 862 
+ 743 759 783 804 862 867 
+ 778 781 803 808 826 830 
+ 779 782 801 810 832 836 
+ 781 786 806 812 830 833 
+ 370 428 797 870 1443 15297 
+ 782 785 807 811 835 836 
+ 785 787 810 812 834 835 
+ 786 787 808 811 833 834 
+ 316 527 544 1656 2019 15299 
+ 791 816 827 838 
+ 715 724 795 860 876 923 
+ 791 793 814 818 838 843 
+ 769 784 790 822 828 854 15291 
+ 792 793 816 825 843 851 
+ 798 799 821 844 
+ 774 777 824 829 859 865 
+ 799 800 819 823 844 846 
+ 784 801 817 832 854 855 
+ 800 803 821 826 846 847 
+ 774 790 820 828 859 863 
+ 789 792 818 831 851 866 
+ 803 806 823 830 847 849 
+ 814 838 842 853 
+ 790 817 824 863 15291 
+ 777 794 820 841 865 877 
+ 806 808 826 833 849 850 
+ 780 789 825 839 866 883 
+ 801 807 822 836 855 858 
+ 808 812 830 834 850 852 
+ 811 812 833 835 852 856 
+ 810 811 834 836 856 857 
+ 807 810 832 835 857 858 
+ 680 753 864 949 994 
+ 814 816 827 843 853 868 
+ 771 780 831 845 883 909 
+ 788 795 869 876 922 
+ 794 804 829 862 877 891 
+ 827 853 861 873 
+ 816 818 838 851 868 879 
+ 819 821 846 871 
+ 752 771 839 860 909 954 
+ 821 823 844 847 871 872 
+ 823 826 846 849 872 874 
+ 656 690 802 987 1013 1149 
+ 826 830 847 850 874 878 
+ 830 833 849 852 878 880 
+ 818 825 843 866 879 892 
+ 833 834 850 856 880 881 
+ 827 838 842 868 873 887 
+ 817 822 855 888 901 15291 
+ 822 832 854 858 886 888 
+ 834 835 852 857 881 884 
+ 835 836 856 858 884 885 
+ 832 836 855 857 885 886 
+ 820 824 863 865 897 898 
+ 724 752 815 845 923 954 1043 
+ 842 873 875 889 
+ 804 805 841 867 891 948 
+ 824 828 859 897 902 15291 
+ 753 783 837 867 994 15292 
+ 820 829 859 877 895 898 
+ 825 831 851 883 892 913 
+ 783 805 862 864 948 15292 
+ 838 843 853 879 887 899 
+ 788 796 840 916 922 974 
+ 428 520 809 920 1408 1443 
+ 844 846 872 893 
+ 846 847 871 874 893 896 
+ 842 853 861 887 889 903 
+ 847 849 872 878 896 900 
+ 861 889 890 906 
+ 795 815 840 922 923 975 
+ 829 841 865 891 895 928 
+ 849 850 874 880 900 904 
+ 843 851 868 892 899 914 
+ 850 852 878 881 904 907 
+ 852 856 880 884 907 910 
+ 301 338 1028 1168 2171 2700 
+ 831 839 866 909 913 945 
+ 856 857 881 885 910 911 
+ 857 858 884 886 911 912 
+ 855 858 885 888 912 915 
+ 853 868 873 899 903 917 
+ 854 855 886 901 915 927 
+ 861 873 875 903 906 919 
+ 875 905 906 921 
+ 841 862 877 928 948 965 
+ 851 866 879 913 914 935 
+ 871 872 896 924 
+ 264 302 312 1987 4780 4973 
+ 865 877 898 928 934 
+ 872 874 893 900 924 925 
+ 859 863 898 902 939 941 
+ 859 865 895 897 934 941 
+ 868 879 887 914 917 932 
+ 874 878 896 904 925 929 
+ 854 888 926 927 944 15291 
+ 863 897 926 933 939 15291 
+ 873 887 889 917 919 937 
+ 878 880 900 907 929 930 
+ 890 918 921 938 
+ 875 889 890 919 921 940 
+ 880 881 904 910 930 936 
+ 435 656 956 1013 1439 1544 
+ 839 845 883 945 954 1000 
+ 881 884 907 911 936 942 
+ 884 885 910 912 942 943 
+ 885 886 911 915 943 946 
+ 866 883 892 935 945 964 
+ 879 892 899 932 935 950 
+ 886 888 912 927 946 955 
+ 796 802 869 974 987 1067 
+ 887 899 903 932 937 951 
+ 905 931 938 952 
+ 889 903 906 937 940 957 
+ 520 721 870 1104 1375 1408 
+ 890 905 906 938 940 958 
+ 840 869 876 974 975 993 
+ 815 860 876 975 1043 1053 
+ 893 896 925 953 
+ 896 900 924 929 953 959 
+ 901 902 933 944 960 15291 
+ 888 901 915 944 955 966 
+ 877 891 895 934 965 979 
+ 900 904 925 930 959 961 
+ 904 907 929 936 961 963 
+ 918 947 952 968 
+ 899 914 917 950 951 967 
+ 902 926 939 960 976 
+ 895 898 928 941 978 979 
+ 892 913 914 950 964 970 
+ 907 910 930 942 963 969 
+ 903 917 919 951 957 972 
+ 905 918 921 952 958 973 
+ 897 902 933 941 976 981 
+ 906 919 921 957 958 977 
+ 897 898 934 939 978 981 
+ 910 911 936 943 969 971 
+ 911 912 942 946 971 980 
+ 901 926 927 960 966 982 
+ 883 909 913 964 1000 1011 
+ 912 915 943 955 980 985 
+ 931 962 968 986 
+ 862 867 891 965 1034 1072 15292 
+ 680 721 837 994 1104 1143 1275 
+ 914 932 935 967 970 983 
+ 917 932 937 967 972 990 
+ 918 931 938 968 973 992 
+ 924 925 959 988 
+ 845 860 909 1000 1043 1088 
+ 915 927 946 966 985 995 
+ 346 435 621 908 1544 1576 1895 
+ 919 937 940 972 977 998 
+ 921 938 940 973 977 997 
+ 925 929 953 961 988 989 
+ 926 933 944 976 982 991 
+ 929 930 959 963 989 996 
+ 947 984 986 1001 
+ 930 936 961 969 996 999 
+ 913 935 945 970 1008 1011 
+ 891 928 948 979 1027 1034 
+ 927 944 955 982 995 1004 
+ 932 950 951 983 990 1003 
+ 931 947 952 986 992 1007 
+ 936 942 963 971 999 1005 
+ 935 950 964 983 1008 1009 
+ 942 943 969 980 1005 1010 
+ 937 951 957 990 998 1017 
+ 938 952 958 992 997 1012 
+ 869 916 922 993 1067 1074 
+ 876 922 923 993 1053 1071 
+ 933 939 960 981 991 1021 1025 
+ 940 957 958 997 998 1022 
+ 934 941 979 981 1018 1020 
+ 928 934 965 978 1020 1027 
+ 943 946 971 985 1010 1014 
+ 939 941 976 978 1018 1025 
+ 944 960 966 991 1004 1006 
+ 950 967 970 1003 1009 
+ 962 1001 1002 1015 
+ 946 955 980 995 1014 1023 
+ 947 962 968 1001 1007 1016 
+ 802 848 916 1067 1149 1200 
+ 953 959 989 1019 
+ 959 961 988 996 1019 1026 
+ 951 967 972 1003 1017 1038 
+ 960 976 982 1006 1021 1030 
+ 952 968 973 1007 1012 1029 
+ 922 974 975 1071 1074 
+ 837 864 949 1143 1170 15292 
+ 955 966 985 1004 1023 1032 
+ 961 963 989 999 1026 1031 
+ 958 973 977 1012 1022 1041 
+ 957 972 977 1017 1022 1048 
+ 963 969 996 1005 1031 1035 
+ 909 945 954 1011 1073 1088 
+ 962 984 986 1015 1016 1036 
+ 984 1015 1024 1039 
+ 967 983 990 1009 1038 1040 
+ 966 982 995 1006 1032 1033 
+ 969 971 999 1010 1035 1042 
+ 982 991 1004 1030 1033 
+ 968 986 992 1016 1029 1037 
+ 964 970 1009 1011 1044 1054 
+ 970 983 1003 1008 1040 1044 
+ 971 980 1005 1014 1042 1045 
+ 945 964 1000 1008 1054 1073 
+ 973 992 997 1029 1041 1047 
+ 656 848 908 1149 1433 1439 
+ 980 985 1010 1023 1045 1051 
+ 984 1001 1002 1036 1039 1052 
+ 986 1001 1007 1036 1037 1050 
+ 972 990 998 1038 1048 1086 
+ 978 981 1020 1025 1049 1060 
+ 988 989 1026 1055 
+ 978 979 1018 1027 1049 1078 
+ 976 991 1025 1030 1061 1075 
+ 977 997 998 1041 1048 1069 
+ 985 995 1014 1032 1051 1057 
+ 1002 1039 1046 1059 
+ 976 981 1018 1021 1060 1075 
+ 989 996 1019 1031 1055 1058 
+ 965 979 1020 1034 1078 1121 
+ 338 396 882 1249 2073 2171 
+ 992 1007 1012 1037 1047 1056 
+ 991 1006 1021 1033 1061 1062 
+ 996 999 1026 1035 1058 1064 
+ 995 1004 1023 1033 1057 1063 
+ 1004 1006 1030 1032 1062 1063 
+ 948 965 1027 1072 1121 1165 
+ 999 1005 1031 1042 1064 15293 
+ 1001 1015 1016 1050 1052 1065 
+ 1007 1016 1029 1050 1056 1066 
+ 990 1003 1017 1040 1086 1090 
+ 1002 1015 1024 1052 1059 1070 
+ 1003 1009 1038 1044 1080 1090 
+ 997 1012 1022 1047 1069 1077 
+ 1005 1010 1035 1045 1076 15293 
+ 860 923 954 1053 1088 1159 1204 
+ 1008 1009 1040 1054 1080 1085 
+ 1010 1014 1042 1051 1076 1082 
+ 1024 1059 1068 1083 
+ 1012 1029 1041 1056 1077 1079 
+ 998 1017 1022 1069 1086 1114 
+ 1018 1020 1060 1078 1100 
+ 1016 1036 1037 1065 1066 1081 
+ 1014 1023 1045 1057 1082 1089 
+ 1015 1036 1039 1065 1070 1087 
+ 923 975 1043 1071 1159 1179 
+ 1008 1011 1044 1073 1085 1112 
+ 1019 1026 1058 1091 
+ 1029 1037 1047 1066 1079 1084 
+ 1023 1032 1051 1063 1089 1092 
+ 1026 1031 1055 1064 1091 1094 
+ 1024 1039 1046 1070 1083 1095 
+ 1018 1025 1049 1075 1100 1110 
+ 1021 1030 1062 1075 1098 1108 
+ 1030 1033 1061 1063 1096 1098 
+ 1032 1033 1057 1062 1092 1096 
+ 1031 1035 1058 1094 1101 15293 
+ 1036 1050 1052 1081 1087 1099 
+ 1037 1050 1056 1081 1084 1093 
+ 916 974 987 1074 1200 1240 
+ 1046 1083 1097 1109 
+ 1022 1041 1048 1077 1114 1115 
+ 1039 1052 1059 1087 1095 1107 
+ 975 993 1053 1074 1162 1179 
+ 948 1034 1165 1170 1236 15292 
+ 1000 1011 1054 1088 1112 1183 
+ 974 993 1067 1071 1162 1240 
+ 1021 1025 1060 1061 1108 1110 1129 
+ 1042 1045 1082 1106 1113 15293 
+ 1041 1047 1069 1079 1103 1115 
+ 1020 1027 1049 1100 1121 1135 
+ 1047 1056 1077 1084 1102 1103 
+ 1040 1044 1085 1090 1117 1130 
+ 1050 1065 1066 1093 1099 1111 
+ 1045 1051 1076 1089 1113 1119 
+ 1046 1059 1068 1095 1109 1120 
+ 1056 1066 1079 1093 1102 1105 
+ 1044 1054 1080 1112 1117 
+ 1017 1038 1048 1090 1114 1137 1147 
+ 1052 1065 1070 1099 1107 1116 
+ 954 1000 1043 1073 1183 1204 1226 
+ 1051 1057 1082 1092 1119 1123 
+ 1038 1040 1080 1086 1130 1137 
+ 1055 1058 1094 1124 
+ 1057 1063 1089 1096 1123 1127 
+ 1066 1081 1084 1105 1111 1118 
+ 1058 1064 1091 1101 1124 1132 
+ 1059 1070 1083 1107 1120 1131 
+ 1062 1063 1092 1098 1127 1133 
+ 1068 1109 1122 1136 
+ 1061 1062 1096 1108 1133 1141 
+ 1065 1081 1087 1111 1116 1128 
+ 1049 1060 1078 1110 1134 1135 
+ 1064 1094 1106 1132 1139 15293 
+ 1079 1084 1103 1105 1125 1126 
+ 1077 1079 1102 1115 1125 1138 
+ 721 920 949 1275 1375 1471 
+ 1084 1093 1102 1118 1126 
+ 1076 1101 1113 1139 1144 15293 
+ 1070 1087 1095 1116 1131 1142 
+ 1061 1075 1098 1129 1141 1154 
+ 1068 1083 1097 1120 1136 1145 
+ 1060 1075 1100 1129 1134 1155 
+ 1081 1093 1099 1118 1128 1140 
+ 1054 1073 1085 1117 1160 1183 
+ 1076 1082 1106 1119 1144 1151 
+ 1048 1069 1086 1115 1147 1169 1176 
+ 1069 1077 1103 1114 1138 1169 
+ 1087 1099 1107 1128 1142 1153 
+ 1080 1085 1112 1130 1160 1174 
+ 1093 1105 1111 1126 1140 1148 
+ 1082 1089 1113 1123 1151 1158 
+ 1083 1095 1109 1131 1145 1157 
+ 1027 1034 1078 1135 1165 1186 1234 
+ 1097 1136 1152 1164 
+ 1089 1092 1119 1127 1158 1161 
+ 1091 1094 1132 1166 
+ 1102 1103 1126 1138 1150 1156 
+ 1102 1105 1118 1125 1148 1150 
+ 1092 1096 1123 1133 1161 1171 
+ 1099 1111 1116 1140 1153 1163 
+ 1075 1108 1110 1154 1155 1178 
+ 1080 1090 1117 1137 1174 1188 
+ 1095 1107 1120 1142 1157 1172 
+ 1094 1101 1124 1139 1166 1173 
+ 1096 1098 1127 1141 1171 1177 
+ 1100 1110 1135 1155 1167 
+ 1078 1100 1121 1134 1167 1186 
+ 1097 1109 1122 1145 1164 1180 
+ 1086 1090 1130 1147 1188 1189 
+ 1103 1115 1125 1156 1169 1187 
+ 1101 1106 1132 1144 1173 1182 
+ 1111 1118 1128 1148 1163 1175 
+ 1098 1108 1133 1154 1177 1190 
+ 1107 1116 1131 1153 1172 1184 
+ 949 994 1170 1275 1354 1412 
+ 1106 1113 1139 1151 1182 1193 
+ 1109 1120 1136 1157 1180 1192 
+ 268 293 372 2062 3697 4176 
+ 1086 1114 1137 1176 1189 1201 
+ 1118 1126 1140 1150 1175 1181 
+ 848 987 1013 1200 1433 1493 
+ 1125 1126 1148 1156 1181 1185 
+ 1113 1119 1144 1158 1193 1197 
+ 1122 1164 1191 1198 
+ 1116 1128 1142 1163 1184 1195 
+ 1108 1129 1141 1178 1190 1194 
+ 1110 1129 1134 1167 1178 1196 
+ 1125 1138 1150 1185 1187 
+ 1120 1131 1145 1172 1192 1199 
+ 1119 1123 1151 1161 1197 1203 
+ 1043 1053 1179 1204 1285 1314 
+ 1112 1117 1174 1183 1224 1242 
+ 1123 1127 1158 1171 1203 1205 
+ 1071 1074 1179 1240 1253 1297 
+ 1128 1140 1153 1175 1195 1202 
+ 1122 1136 1152 1180 1198 1206 
+ 1034 1072 1121 1234 1236 1291 
+ 1124 1132 1173 1207 
+ 1134 1135 1155 1186 1196 1222 
+ 284 301 446 882 2700 3287 4501 
+ 1114 1115 1138 1176 1187 1214 1216 
+ 994 1072 1143 1236 1349 1354 15292 
+ 1127 1133 1161 1177 1205 1211 
+ 1131 1142 1157 1184 1199 1209 
+ 1132 1139 1166 1182 1207 1212 
+ 1117 1130 1160 1188 1224 1230 
+ 1140 1148 1163 1181 1202 1208 
+ 1114 1147 1169 1201 1214 1228 
+ 1133 1141 1171 1190 1211 1221 
+ 1129 1154 1155 1194 1196 1217 
+ 1053 1071 1159 1162 1253 1285 
+ 1136 1145 1164 1192 1206 1215 
+ 1148 1150 1175 1185 1208 1210 
+ 1139 1144 1173 1193 1212 1223 
+ 1073 1088 1112 1160 1226 1242 1263 
+ 1142 1153 1172 1195 1209 1218 
+ 1150 1156 1181 1187 1210 1213 
+ 1121 1135 1167 1222 1234 1273 
+ 1138 1156 1169 1185 1213 1216 
+ 1130 1137 1174 1189 1220 1230 
+ 1137 1147 1188 1201 1220 1225 
+ 1141 1154 1177 1194 1221 1227 
+ 1152 1198 1219 1233 
+ 1145 1157 1180 1199 1215 1231 
+ 1144 1151 1182 1197 1223 1232 
+ 1154 1178 1190 1217 1227 
+ 1153 1163 1184 1202 1218 1229 
+ 1155 1167 1178 1217 1222 1252 
+ 1151 1158 1193 1203 1232 1237 
+ 1152 1164 1191 1206 1233 1239 
+ 1157 1172 1192 1209 1231 1238 
+ 987 1067 1149 1240 1382 1493 
+ 1147 1176 1189 1225 1228 1241 
+ 1163 1175 1195 1208 1229 1235 
+ 1158 1161 1197 1205 1237 1243 
+ 1043 1088 1159 1226 1314 1329 1369 
+ 1161 1171 1203 1211 1243 1250 
+ 1164 1180 1198 1215 1239 1248 
+ 1166 1173 1212 1251 
+ 1175 1181 1202 1210 1235 1244 
+ 1172 1184 1199 1218 1238 1247 
+ 1181 1185 1208 1213 1244 1245 
+ 1171 1177 1205 1221 1250 1258 
+ 1173 1182 1207 1223 1251 1257 
+ 1185 1187 1210 1216 1245 1255 
+ 1169 1176 1216 1228 1261 1265 
+ 1180 1192 1206 1231 1248 1262 
+ 1169 1187 1213 1214 1255 1261 
+ 1178 1194 1196 1227 1252 1266 
+ 1184 1195 1209 1229 1247 1260 
+ 1191 1233 1254 1268 
+ 1188 1189 1225 1230 1246 1259 
+ 1177 1190 1211 1227 1258 1267 
+ 1167 1186 1196 1252 1273 1311 
+ 1182 1193 1212 1232 1257 1270 
+ 1160 1174 1230 1242 1279 1294 
+ 1189 1201 1220 1241 1246 1256 
+ 1088 1183 1204 1263 1319 1329 
+ 1190 1194 1217 1221 1266 1267 
+ 1176 1201 1214 1241 1265 1271 
+ 1195 1202 1218 1235 1260 1269 
+ 1174 1188 1220 1224 1259 1279 
+ 1192 1199 1215 1238 1262 1272 
+ 1193 1197 1223 1237 1270 1276 
+ 1191 1198 1219 1239 1268 1274 
+ 1121 1165 1186 1273 1291 1345 
+ 1202 1208 1229 1244 1269 1277 
+ 1072 1165 1170 1291 1349 1356 
+ 1197 1203 1232 1243 1276 1283 
+ 1199 1209 1231 1247 1272 1281 
+ 1198 1206 1233 1248 1274 1282 
+ 1067 1074 1162 1200 1297 1382 1383 
+ 1201 1225 1228 1256 1271 1278 
+ 1160 1183 1224 1263 1294 1306 
+ 1203 1205 1237 1250 1283 1287 
+ 1208 1210 1235 1245 1277 1286 
+ 1210 1213 1244 1255 1286 1288 
+ 1220 1225 1256 1259 1280 1284 
+ 1209 1218 1238 1260 1281 1292 
+ 1206 1215 1239 1262 1282 1290 
+ 396 621 1028 1576 2073 2193 
+ 1205 1211 1243 1258 1287 1296 
+ 1207 1212 1257 1293 
+ 1196 1217 1222 1266 1308 1311 
+ 1162 1179 1285 1297 1357 
+ 1219 1268 1289 1299 
+ 1213 1216 1245 1261 1288 1295 
+ 1225 1241 1246 1278 1284 
+ 1212 1223 1251 1270 1293 1301 
+ 1211 1221 1250 1267 1296 1304 
+ 1220 1230 1246 1279 1280 1303 
+ 1218 1229 1247 1269 1292 1298 
+ 1214 1216 1255 1265 1295 1300 
+ 1215 1231 1248 1272 1290 1302 
+ 1183 1226 1242 1306 1319 
+ 348 527 612 2078 2587 15299 
+ 1214 1228 1261 1271 1300 1307 
+ 1217 1227 1252 1267 1308 1309 
+ 1221 1227 1258 1266 1304 1309 
+ 1219 1233 1254 1274 1299 1310 
+ 1229 1235 1260 1277 1298 1305 
+ 1223 1232 1257 1276 1301 15294 
+ 1228 1241 1265 1278 1307 1312 
+ 1231 1238 1262 1281 1302 1315 
+ 1186 1222 1234 1311 1345 1363 
+ 1233 1239 1268 1282 1310 1317 
+ 949 1104 1143 1412 1471 1551 
+ 1232 1237 1270 1283 1318 15294 
+ 1235 1244 1269 1286 1305 15295 
+ 1241 1256 1271 1284 1312 1316 
+ 1224 1230 1259 1294 1303 1325 
+ 1246 1259 1284 1303 1313 
+ 1238 1247 1272 1292 1315 1324 
+ 1239 1248 1274 1290 1317 1320 
+ 1237 1243 1276 1287 1318 1322 
+ 1246 1256 1278 1280 1313 1316 
+ 1159 1179 1253 1314 1357 1381 
+ 1244 1245 1277 1288 1321 15295 
+ 1243 1250 1283 1296 1322 1327 
+ 1245 1255 1286 1295 1321 1330 
+ 1254 1299 1323 1328 
+ 1248 1262 1282 1302 1320 1326 
+ 1165 1234 1236 1345 1356 1387 
+ 1247 1260 1281 1298 1324 1332 
+ 1251 1257 1301 1331 
+ 1224 1242 1279 1306 1325 1361 1368 
+ 1255 1261 1288 1300 1330 1339 
+ 1250 1258 1287 1304 1327 1336 
+ 1162 1240 1253 1357 1383 1418 
+ 1260 1269 1292 1305 1332 1334 
+ 1254 1268 1289 1310 1328 1337 
+ 1261 1265 1295 1307 1339 1343 
+ 1257 1270 1293 1331 1340 15294 
+ 1262 1272 1290 1315 1326 1338 
+ 1259 1279 1280 1313 1325 1333 
+ 1258 1267 1296 1309 1336 1341 
+ 1269 1277 1298 1334 1335 15295 
+ 1242 1263 1294 1319 1361 1374 
+ 1265 1271 1300 1312 1343 1347 
+ 1252 1266 1309 1311 1346 1355 
+ 1266 1267 1304 1308 1341 1346 
+ 1268 1274 1299 1317 1337 1342 
+ 1222 1252 1273 1308 1355 1363 1385 
+ 1271 1278 1307 1316 1347 1353 
+ 1280 1284 1303 1316 1333 1344 
+ 1159 1204 1285 1369 1381 1423 
+ 1272 1281 1302 1324 1338 1352 
+ 1278 1284 1312 1313 1344 1353 
+ 1274 1282 1310 1320 1342 1351 
+ 1276 1283 1322 1350 1359 15294 
+ 1226 1263 1306 1329 1374 1398 
+ 1282 1290 1317 1326 1351 1358 
+ 1286 1288 1330 1348 1366 15295 
+ 1283 1287 1318 1327 1359 1365 
+ 1289 1328 1360 1364 
+ 1281 1292 1315 1332 1352 1372 
+ 1279 1294 1303 1333 1367 1368 
+ 1290 1302 1320 1338 1358 1362 
+ 1287 1296 1322 1336 1365 1373 
+ 1289 1299 1323 1337 1364 1371 
+ 1204 1226 1319 1369 1398 1425 
+ 1288 1295 1321 1339 1366 1379 
+ 1293 1301 1340 1378 
+ 1292 1298 1324 1334 1372 1391 
+ 1303 1313 1325 1344 1367 1380 
+ 1298 1305 1332 1335 1377 1391 
+ 1305 1334 1348 1377 15295 
+ 1296 1304 1327 1341 1373 1384 
+ 1299 1310 1328 1342 1371 1376 
+ 1302 1315 1326 1352 1362 1370 
+ 1295 1300 1330 1343 1379 1390 
+ 1301 1331 1350 1378 1389 15294 
+ 1304 1309 1336 1346 1384 1394 
+ 1310 1317 1337 1351 1376 1386 
+ 1300 1307 1339 1347 1390 1392 
+ 1313 1316 1333 1353 1380 1395 
+ 1234 1273 1291 1363 1387 1414 1444 
+ 1308 1309 1341 1355 1394 1401 
+ 1307 1312 1343 1353 1388 1392 
+ 1321 1335 1366 1377 1403 15295 
+ 1170 1236 1354 1356 1475 1510 
+ 1318 1340 1359 1389 1397 15294 
+ 1317 1320 1342 1358 1386 1393 
+ 1315 1324 1338 1370 1372 1400 
+ 1312 1316 1344 1347 1388 1395 
+ 1143 1170 1349 1412 1510 1563 
+ 1308 1311 1346 1385 1401 1416 
+ 1236 1291 1349 1387 1475 1479 
+ 1253 1285 1297 1381 1418 1446 
+ 1320 1326 1351 1362 1393 1396 
+ 1318 1322 1350 1365 1397 1404 
+ 1323 1364 1402 1405 
+ 1294 1306 1368 1374 1410 1440 
+ 1326 1338 1358 1370 1396 1399 
+ 1273 1311 1345 1385 1414 1430 
+ 1323 1328 1360 1371 1405 1406 
+ 1322 1327 1359 1373 1404 1409 
+ 1321 1330 1348 1379 1403 1419 
+ 1325 1333 1368 1380 1413 1415 
+ 1294 1325 1361 1367 1410 1413 
+ 1204 1314 1329 1423 1425 1474 
+ 1338 1352 1362 1399 1400 1407 
+ 1328 1337 1364 1376 1406 1411 
+ 1324 1332 1352 1391 1400 1435 
+ 1327 1336 1365 1384 1409 1421 
+ 1306 1319 1361 1398 1440 1459 
+ 920 1104 1408 1471 1710 1766 
+ 1337 1342 1371 1386 1411 1417 
+ 1334 1335 1348 1391 1403 1432 
+ 1331 1340 1389 1424 
+ 1330 1339 1366 1390 1419 1428 
+ 1333 1344 1367 1395 1415 1437 
+ 1285 1314 1357 1423 1446 1481 
+ 1200 1240 1383 1493 1534 1595 
+ 1240 1297 1382 1418 1485 1534 
+ 1336 1341 1373 1394 1421 1431 
+ 1311 1355 1363 1416 1430 1450 
+ 1342 1351 1376 1393 1417 1422 
+ 1291 1345 1356 1444 1473 1479 
+ 1347 1353 1392 1395 1420 1447 
+ 1340 1350 1378 1397 1424 1436 
+ 1339 1343 1379 1392 1428 1429 
+ 1332 1334 1372 1377 1432 1435 1467 
+ 1343 1347 1388 1390 1420 1429 
+ 1351 1358 1386 1396 1422 1426 
+ 1341 1346 1384 1401 1431 15296 
+ 1344 1353 1380 1388 1437 1447 
+ 1358 1362 1393 1399 1426 1427 
+ 1350 1359 1389 1404 1436 1442 
+ 1319 1329 1374 1425 1459 1489 
+ 1362 1370 1396 1407 1427 1434 
+ 1352 1370 1372 1407 1435 1448 
+ 1346 1355 1394 1416 1453 15296 
+ 1360 1405 1441 1445 
+ 1348 1366 1377 1419 1432 1462 
+ 1359 1365 1397 1409 1442 1451 
+ 1360 1364 1402 1406 1445 1449 
+ 1364 1371 1405 1411 1449 1452 
+ 1370 1399 1400 1434 1448 
+ 870 920 1375 1443 1766 1962 
+ 1365 1373 1404 1421 1451 1458 
+ 1361 1368 1413 1440 1465 
+ 1371 1376 1406 1417 1452 1455 
+ 1143 1275 1354 1551 1563 1664 
+ 1367 1368 1410 1415 1454 1465 
+ 1345 1363 1430 1444 1472 1497 
+ 1367 1380 1413 1437 1454 1463 
+ 1355 1385 1401 1450 1453 1476 
+ 1376 1386 1411 1422 1455 1457 
+ 1297 1357 1383 1446 1485 1540 
+ 1366 1379 1403 1428 1462 1482 
+ 1388 1392 1429 1447 1469 
+ 1373 1384 1409 1431 1458 1466 
+ 1386 1393 1417 1426 1457 1460 
+ 1314 1369 1381 1474 1481 1513 
+ 1378 1389 1436 1468 
+ 1329 1369 1398 1474 1489 1509 
+ 1393 1396 1422 1427 1460 1461 
+ 1396 1399 1426 1434 1456 1461 
+ 1379 1390 1419 1429 1482 1484 
+ 1390 1392 1420 1428 1469 1484 
+ 1363 1385 1414 1450 1470 1472 
+ 1384 1394 1421 1466 1477 15296 
+ 1377 1391 1403 1462 1467 1527 
+ 1013 1149 1439 1493 1751 1812 
+ 1399 1407 1427 1448 1456 1464 
+ 1372 1391 1400 1448 1467 1480 1504 
+ 1389 1397 1424 1442 1468 1478 
+ 1380 1395 1415 1447 1463 1490 
+ 125 173 203 4201 6142 7847 14856 
+ 908 1013 1433 1544 1812 1903 
+ 1361 1374 1410 1459 1465 1502 
+ 1402 1445 1483 15298 
+ 1397 1404 1436 1451 1478 1486 
+ 809 870 1408 1962 1984 15297 
+ 1345 1387 1414 1473 1497 1516 
+ 1402 1405 1441 1449 1487 15298 
+ 1357 1381 1418 1481 1540 1562 
+ 1388 1395 1420 1437 1469 1490 1518 
+ 1400 1407 1434 1435 1464 1480 
+ 1405 1406 1445 1452 1487 1491 
+ 1385 1416 1430 1470 1476 1496 
+ 1404 1409 1442 1458 1486 1498 
+ 1406 1411 1449 1455 1491 1494 
+ 1401 1416 1476 1488 1503 15296 
+ 1413 1415 1463 1465 1492 
+ 1411 1417 1452 1457 1494 1499 
+ 1427 1434 1461 1464 1500 
+ 1417 1422 1455 1460 1499 1501 
+ 1409 1421 1451 1466 1498 1507 
+ 1374 1398 1440 1489 1502 1549 
+ 1422 1426 1457 1461 1501 1505 
+ 1426 1427 1456 1460 1500 1505 
+ 1403 1419 1432 1482 1527 1533 
+ 1415 1437 1454 1490 1492 1517 
+ 1434 1448 1456 1480 1500 1508 
+ 1410 1413 1440 1454 1492 1502 1530 
+ 1421 1431 1458 1477 1507 1511 
+ 1391 1432 1435 1504 1527 1542 
+ 1424 1436 1478 1512 
+ 1420 1429 1447 1484 1518 1536 
+ 1430 1450 1472 1496 1506 
+ 1104 1275 1375 1551 1701 1710 
+ 1414 1430 1470 1497 1506 1522 
+ 1387 1444 1479 1516 1524 
+ 1369 1423 1425 1509 1513 1539 
+ 1349 1356 1479 1510 1552 1615 
+ 1416 1450 1453 1496 1503 1514 
+ 1431 1466 1488 1511 1521 15296 
+ 1436 1442 1468 1486 1512 1519 
+ 1356 1387 1473 1475 1524 1552 
+ 1435 1448 1464 1504 1508 
+ 1381 1423 1446 1513 1562 1580 
+ 1419 1428 1462 1484 1533 1538 
+ 1441 1515 1520 15298 
+ 1428 1429 1469 1482 1536 1538 
+ 1383 1418 1534 1540 1567 
+ 1442 1451 1478 1498 1519 1529 
+ 1445 1449 1491 1523 1525 15298 
+ 1453 1477 1503 1521 1532 15296 
+ 1398 1425 1459 1509 1549 1573 
+ 1437 1447 1463 1517 1518 1564 
+ 1449 1452 1487 1494 1525 1528 
+ 1454 1463 1465 1517 1530 
+ 1149 1200 1382 1433 1595 1725 1751 
+ 1452 1455 1491 1499 1528 1531 
+ 544 797 1656 1882 2219 2312 
+ 1450 1470 1476 1506 1514 1526 
+ 1414 1444 1472 1516 1522 1557 
+ 1451 1458 1486 1507 1529 1537 
+ 1455 1457 1494 1501 1531 1535 
+ 1456 1461 1464 1505 1508 1546 15300 
+ 1457 1460 1499 1505 1535 1541 
+ 1440 1459 1465 1530 1549 1607 
+ 1453 1476 1488 1514 1532 1543 
+ 1435 1467 1480 1508 1542 1550 
+ 1460 1461 1500 1501 1541 15300 
+ 1470 1472 1496 1522 1526 1548 
+ 1458 1466 1498 1511 1537 1547 
+ 1464 1480 1500 1504 1546 1550 
+ 1425 1474 1489 1539 1573 1583 
+ 1349 1354 1475 1563 1615 1669 
+ 1466 1477 1507 1521 1547 1555 
+ 1468 1478 1519 1554 
+ 1423 1474 1481 1539 1580 1596 
+ 1476 1496 1503 1526 1543 1545 
+ 1483 1520 1553 1556 
+ 1444 1473 1497 1524 1557 1577 
+ 1463 1490 1492 1530 1564 1601 
+ 1447 1469 1490 1536 1564 1604 
+ 1478 1486 1512 1529 1554 1560 
+ 1483 1515 1523 1556 1558 15298 
+ 1477 1488 1511 1532 1555 1565 
+ 1472 1497 1506 1548 1557 1598 
+ 1487 1520 1525 1558 1559 15298 
+ 1473 1479 1516 1552 1577 1582 
+ 1487 1491 1523 1528 1559 1561 
+ 1496 1506 1514 1545 1548 1569 
+ 1432 1462 1467 1533 1542 1578 1587 
+ 1491 1494 1525 1531 1561 1566 
+ 1486 1498 1519 1537 1560 1570 
+ 1465 1492 1502 1517 1601 1607 
+ 1494 1499 1528 1535 1566 1568 
+ 1488 1503 1521 1543 1565 1571 
+ 1462 1482 1527 1538 1578 1592 
+ 1382 1383 1485 1567 1595 1639 
+ 1499 1501 1531 1541 1568 1572 
+ 1469 1484 1518 1538 1604 1606 
+ 1498 1507 1529 1547 1570 1575 
+ 1482 1484 1533 1536 1592 1606 
+ 1474 1509 1513 1583 1596 
+ 1418 1446 1485 1562 1567 1618 1643 
+ 1501 1505 1535 1572 1579 15300 
+ 1467 1504 1527 1550 1587 1605 
+ 1503 1514 1532 1545 1571 1574 
+ 908 956 1439 1895 1903 2125 
+ 1514 1526 1543 1569 1574 
+ 1500 1508 1550 1591 1611 15300 
+ 1507 1511 1537 1555 1575 1581 
+ 1506 1522 1526 1569 1598 1599 
+ 1459 1489 1502 1573 1607 1634 
+ 1504 1508 1542 1546 1605 1611 
+ 1275 1412 1471 1664 1701 1707 
+ 1475 1479 1524 1582 1615 1627 
+ 1515 1556 1584 1585 
+ 1512 1519 1560 1589 
+ 1511 1521 1547 1565 1581 1593 
+ 1515 1520 1553 1558 1585 1586 
+ 1497 1516 1522 1577 1598 1614 
+ 1520 1523 1556 1559 1586 1588 
+ 1523 1525 1558 1561 1588 1590 
+ 1519 1529 1554 1570 1589 1600 
+ 1525 1528 1559 1566 1590 1594 
+ 1446 1481 1540 1580 1618 1644 
+ 1354 1412 1510 1664 1669 1760 
+ 1490 1517 1518 1601 1604 1665 
+ 1521 1532 1555 1571 1593 1603 
+ 1528 1531 1561 1568 1594 1597 
+ 1485 1534 1540 1639 1643 
+ 1531 1535 1566 1572 1597 1602 
+ 1526 1545 1548 1574 1599 1608 
+ 1529 1537 1560 1575 1600 1610 
+ 1532 1543 1565 1574 1603 1609 
+ 1535 1541 1568 1579 1602 1612 
+ 1489 1509 1549 1583 1634 1661 
+ 1543 1545 1569 1571 1608 1609 
+ 1537 1547 1570 1581 1610 1613 
+ 621 956 1249 1895 2193 2805 
+ 1516 1524 1557 1582 1614 1631 
+ 1527 1533 1587 1592 1629 1648 
+ 1541 1572 1591 1612 1616 15300 
+ 1481 1513 1562 1596 1644 1670 
+ 1547 1555 1575 1593 1613 1622 
+ 1524 1552 1577 1627 1631 
+ 1509 1539 1573 1596 1661 1672 
+ 1553 1585 1617 1621 
+ 1553 1556 1584 1586 1621 15301 
+ 1556 1558 1585 1588 1619 15301 
+ 1527 1542 1578 1605 1629 1642 
+ 1558 1559 1586 1590 1619 1620 
+ 1554 1560 1600 1626 
+ 1559 1561 1588 1594 1620 1623 
+ 1546 1579 1611 1616 1635 15300 
+ 1533 1538 1578 1606 1648 1667 
+ 1555 1565 1581 1603 1622 1628 
+ 1561 1566 1590 1597 1623 1624 
+ 1382 1493 1534 1639 1725 1730 
+ 1513 1539 1580 1583 1670 1672 
+ 1566 1568 1594 1602 1624 1625 
+ 1522 1548 1557 1599 1614 1640 1662 
+ 1548 1569 1598 1608 1637 1640 
+ 1560 1570 1589 1610 1626 1632 
+ 1517 1530 1564 1607 1665 1694 
+ 1568 1572 1597 1612 1625 1630 
+ 1565 1571 1593 1609 1628 1633 
+ 1518 1536 1564 1606 1665 1676 
+ 1542 1550 1587 1611 1642 1645 
+ 1536 1538 1592 1604 1667 1676 
+ 1502 1530 1549 1601 1634 1694 1708 
+ 1569 1574 1599 1609 1637 1638 
+ 1571 1574 1603 1608 1633 1638 
+ 1570 1575 1600 1613 1632 1641 
+ 1546 1550 1591 1605 1635 1645 1659 
+ 1572 1579 1602 1616 1630 1636 
+ 1575 1581 1610 1622 1641 1647 
+ 1557 1577 1598 1631 1662 1677 
+ 1475 1510 1552 1627 1669 1698 1752 
+ 1579 1591 1612 1635 1636 1658 
+ 1584 1621 1654 1657 
+ 1540 1562 1643 1644 1688 
+ 1586 1588 1620 1652 1653 15301 
+ 1588 1590 1619 1623 1651 1652 
+ 1584 1585 1617 1655 1657 15301 
+ 1581 1593 1613 1628 1647 1663 
+ 1590 1594 1620 1624 1649 1651 
+ 1594 1597 1623 1625 1646 1649 
+ 1597 1602 1624 1630 1646 1650 
+ 1589 1600 1632 1666 
+ 1552 1582 1615 1631 1685 1698 
+ 1593 1603 1622 1633 1663 1668 
+ 1578 1587 1642 1648 1681 
+ 1602 1612 1625 1636 1650 1660 
+ 1577 1582 1614 1627 1677 1685 
+ 1600 1610 1626 1641 1666 1673 
+ 1603 1609 1628 1638 1668 1671 
+ 1549 1573 1607 1661 1708 1729 
+ 1591 1611 1616 1658 1659 1683 
+ 1612 1616 1630 1658 1660 
+ 1599 1608 1638 1640 1674 1679 
+ 1608 1609 1633 1637 1671 1674 
+ 1534 1567 1595 1643 1720 1730 
+ 1598 1599 1637 1662 1679 1695 
+ 1610 1613 1632 1647 1673 1680 
+ 1587 1605 1629 1645 1681 1697 
+ 1540 1567 1618 1639 1688 1720 
+ 1562 1580 1618 1670 1688 1739 
+ 1605 1611 1642 1659 1697 1703 
+ 1624 1625 1649 1650 1675 1678 
+ 1613 1622 1641 1663 1680 1689 
+ 1578 1592 1629 1667 1681 1705 
+ 1623 1624 1646 1651 1678 1682 
+ 1625 1630 1646 1660 1675 1693 
+ 1620 1623 1649 1652 1682 1684 
+ 1619 1620 1651 1653 1684 1686 
+ 1619 1652 1655 1686 1687 15301 
+ 1617 1657 1691 1692 
+ 1621 1653 1657 1687 1690 15301 
+ 544 813 1495 2019 2219 2790 
+ 1617 1621 1654 1655 1690 1692 
+ 1616 1635 1636 1660 1683 1712 
+ 1611 1635 1645 1683 1703 
+ 1630 1636 1650 1658 1693 1712 
+ 1573 1583 1634 1672 1729 1755 
+ 1598 1614 1640 1677 1695 1709 
+ 1622 1628 1647 1668 1689 1696 
+ 1412 1551 1563 1707 1760 1802 
+ 1564 1601 1604 1676 1694 1756 1761 
+ 1626 1632 1673 1700 
+ 1592 1606 1648 1676 1705 1735 
+ 1628 1633 1663 1671 1696 1699 
+ 1510 1563 1615 1752 1760 1833 
+ 1580 1596 1644 1672 1739 1758 
+ 1633 1638 1668 1674 1699 1704 
+ 1583 1596 1661 1670 1755 1758 
+ 1632 1641 1666 1680 1700 1706 
+ 1637 1638 1671 1679 1704 1711 
+ 1646 1650 1678 1693 1702 
+ 1604 1606 1665 1667 1735 1756 
+ 1614 1631 1662 1685 1709 1726 
+ 1646 1649 1675 1682 1702 1713 
+ 1637 1640 1674 1695 1711 1724 
+ 1641 1647 1673 1689 1706 1715 
+ 1629 1642 1648 1697 1705 1733 
+ 1649 1651 1678 1684 1713 1714 
+ 1635 1658 1659 1703 1712 1740 
+ 1651 1652 1682 1686 1714 1716 
+ 1627 1631 1677 1698 1726 1741 
+ 1652 1653 1684 1687 1716 1717 
+ 1653 1655 1686 1690 1717 1718 
+ 1618 1643 1644 1720 1739 1788 
+ 1647 1663 1680 1696 1715 1723 
+ 1655 1657 1687 1692 1718 1719 
+ 1654 1692 1721 1722 
+ 1654 1657 1690 1691 1719 1721 
+ 1650 1660 1675 1702 1712 1728 
+ 1601 1607 1665 1708 1761 1768 
+ 1640 1662 1679 1709 1724 1734 
+ 1663 1668 1689 1699 1723 1727 
+ 1642 1645 1681 1703 1733 1747 
+ 1615 1627 1685 1741 1752 1791 
+ 1668 1671 1696 1704 1727 1731 
+ 1666 1673 1706 1732 
+ 1471 1551 1707 1710 1832 1890 
+ 1675 1678 1693 1713 1728 1736 
+ 1645 1659 1683 1697 1740 1747 
+ 1671 1674 1699 1711 1731 1737 
+ 1648 1667 1681 1733 1735 1794 
+ 1673 1680 1700 1715 1732 1738 
+ 1551 1664 1701 1802 1832 
+ 1607 1634 1694 1729 1768 1787 
+ 1662 1677 1695 1726 1734 1759 
+ 1375 1471 1701 1766 1890 1919 
+ 1674 1679 1704 1724 1737 1749 
+ 1658 1660 1683 1693 1728 1740 1784 
+ 1678 1682 1702 1714 1736 1744 
+ 1682 1684 1713 1716 1742 1744 
+ 1680 1689 1706 1723 1738 1746 
+ 1684 1686 1714 1717 1742 1743 
+ 1686 1687 1716 1718 1743 1745 
+ 1687 1690 1717 1719 1745 1748 
+ 1690 1692 1718 1721 1748 1750 
+ 1639 1643 1688 1730 1788 1858 
+ 1691 1692 1719 1722 1750 1753 
+ 1691 1721 1753 1754 
+ 1689 1696 1715 1727 1746 1757 
+ 1679 1695 1711 1734 1749 1762 
+ 1493 1595 1730 1751 1924 1972 
+ 1677 1685 1709 1741 1759 1776 
+ 1696 1699 1723 1731 1757 1763 
+ 1693 1702 1712 1736 1782 1784 1789 
+ 1634 1661 1708 1755 1787 1815 
+ 1595 1639 1720 1725 1858 1924 
+ 1699 1704 1727 1737 1763 1765 
+ 1700 1706 1738 1764 
+ 1681 1697 1705 1747 1794 1805 
+ 1695 1709 1724 1759 1762 1771 
+ 1667 1676 1705 1756 1794 1822 
+ 1702 1713 1728 1744 1778 1782 
+ 1704 1711 1731 1749 1765 1769 
+ 1706 1715 1732 1746 1764 1767 
+ 1644 1670 1688 1758 1788 1819 
+ 1683 1703 1712 1747 1784 1806 1813 
+ 1685 1698 1726 1776 1791 1823 
+ 1714 1716 1743 1744 1772 1775 
+ 1716 1717 1742 1745 1770 1772 
+ 1713 1714 1736 1742 1775 1778 
+ 1717 1718 1743 1748 1770 1773 
+ 1715 1723 1738 1757 1767 1779 
+ 1697 1703 1733 1740 1805 1806 
+ 1718 1719 1745 1750 1773 1774 
+ 1711 1724 1737 1762 1769 1783 
+ 1719 1721 1748 1753 1774 1777 
+ 1433 1493 1725 1812 1972 2060 
+ 1615 1669 1698 1791 1833 1864 
+ 1721 1722 1750 1754 1777 1780 
+ 1722 1753 1780 1781 
+ 1661 1672 1729 1758 1815 1828 
+ 1665 1676 1735 1761 1818 1822 
+ 1723 1727 1746 1763 1779 1785 
+ 1670 1672 1739 1755 1819 1828 
+ 1709 1726 1734 1771 1776 1801 
+ 1563 1664 1669 1802 1833 1900 
+ 1665 1694 1756 1768 1818 1825 
+ 1724 1734 1749 1771 1783 1786 
+ 1727 1731 1757 1765 1785 1790 
+ 1732 1738 1767 1792 
+ 1731 1737 1763 1769 1790 1793 
+ 1375 1408 1710 1919 1962 2147 
+ 1738 1746 1764 1779 1792 1799 
+ 1694 1708 1761 1787 1825 1830 
+ 1737 1749 1765 1783 1793 1804 
+ 1743 1745 1772 1773 1795 1797 
+ 1734 1759 1762 1786 1801 1808 
+ 1742 1743 1770 1775 1795 1796 
+ 1745 1748 1770 1774 1797 1798 
+ 1748 1750 1773 1777 1798 1800 
+ 1742 1744 1772 1778 1796 1809 
+ 1726 1741 1759 1801 1823 1835 
+ 1750 1753 1774 1780 1800 1803 
+ 1736 1744 1775 1782 1809 1816 
+ 1746 1757 1767 1785 1799 1811 
+ 1753 1754 1777 1781 1803 1807 
+ 1754 1780 1807 1810 
+ 1728 1736 1778 1789 1816 1821 
+ 1749 1762 1769 1786 1804 1814 
+ 1712 1728 1740 1789 1813 1820 
+ 1757 1763 1779 1790 1811 1817 
+ 1762 1771 1783 1808 1814 
+ 1708 1729 1768 1815 1830 1892 
+ 1688 1720 1739 1819 1858 1914 
+ 1728 1782 1784 1820 1821 
+ 1763 1765 1785 1793 1817 1824 
+ 1698 1741 1752 1823 1864 15302 
+ 1764 1767 1799 1831 
+ 1765 1769 1790 1804 1824 1837 
+ 1705 1733 1735 1805 1822 1907 1922 
+ 1770 1772 1796 1797 1826 1827 
+ 1772 1775 1795 1809 1826 1836 
+ 1770 1773 1795 1798 1827 1829 
+ 1773 1774 1797 1800 1829 1834 
+ 1767 1779 1792 1811 1831 1840 
+ 1774 1777 1798 1803 1834 1838 
+ 1759 1771 1776 1808 1835 1845 1861 
+ 1664 1707 1760 1832 1900 1950 
+ 1777 1780 1800 1807 1838 1841 
+ 1769 1783 1793 1814 1837 1842 
+ 1733 1747 1794 1806 1897 1922 
+ 1740 1747 1805 1813 1873 1897 
+ 1780 1781 1803 1810 1841 1843 
+ 1771 1786 1801 1814 1844 1845 
+ 1775 1778 1796 1816 1836 1839 
+ 1781 1807 1843 1846 
+ 1779 1785 1799 1817 1840 1847 
+ 1433 1439 1751 1903 2060 2263 
+ 1740 1784 1806 1820 1856 1873 
+ 1783 1786 1804 1808 1842 1844 
+ 1729 1755 1787 1828 1892 1927 
+ 1778 1782 1809 1821 1839 1848 1850 
+ 1785 1790 1811 1824 1847 1849 
+ 1756 1761 1822 1825 1876 1891 
+ 1739 1758 1788 1828 1914 1937 
+ 1784 1789 1813 1821 1851 1856 
+ 1782 1789 1816 1820 1848 1851 
+ 1735 1756 1794 1818 1876 1907 
+ 1741 1776 1791 1835 1889 15302 
+ 1790 1793 1817 1837 1849 1860 
+ 1761 1768 1818 1830 1891 1893 
+ 1795 1796 1827 1836 1853 1854 
+ 1795 1797 1826 1829 1854 1855 
+ 1755 1758 1815 1819 1927 1937 
+ 1797 1798 1827 1834 1855 1857 
+ 1768 1787 1825 1892 1893 
+ 1792 1799 1840 1863 
+ 1701 1707 1802 1890 1950 2018 
+ 1669 1752 1760 1864 1900 1981 
+ 1798 1800 1829 1838 1857 1859 
+ 1776 1801 1823 1861 1880 1889 
+ 1796 1809 1826 1839 1852 1853 
+ 1793 1804 1824 1842 1860 1865 
+ 1800 1803 1834 1841 1859 1862 
+ 1809 1816 1836 1850 1852 
+ 1799 1811 1831 1847 1863 1867 
+ 1803 1807 1838 1843 1862 1866 
+ 1804 1814 1837 1844 1865 1869 
+ 1807 1810 1841 1846 1866 1870 
+ 1808 1814 1842 1845 1869 1871 
+ 1801 1808 1844 1861 1871 1887 
+ 1810 1843 1870 1872 
+ 1811 1817 1840 1849 1867 1874 
+ 1816 1821 1850 1851 1868 1877 
+ 1817 1824 1847 1860 1874 1883 
+ 1816 1839 1848 1852 1868 1875 
+ 1820 1821 1848 1856 1877 1886 
+ 1836 1839 1850 1853 1875 1878 
+ 1826 1836 1852 1854 1878 1879 
+ 1826 1827 1853 1855 1879 1881 
+ 1827 1829 1854 1857 1881 1884 
+ 1813 1820 1851 1873 1886 1921 
+ 1829 1834 1855 1859 1884 1885 
+ 1720 1730 1788 1914 1924 1997 
+ 1834 1838 1857 1862 1885 1888 
+ 1824 1837 1849 1865 1883 1896 
+ 1801 1835 1845 1880 1887 1909 
+ 1838 1841 1859 1866 1888 1894 
+ 1831 1840 1867 1899 
+ 1752 1791 1833 1980 1981 15302 
+ 1837 1842 1860 1869 1896 1902 
+ 1841 1843 1862 1870 1894 1901 
+ 1840 1847 1863 1874 1899 1905 
+ 1848 1850 1875 1877 1898 
+ 1842 1844 1865 1871 1902 1906 
+ 1843 1846 1866 1872 1901 1904 
+ 1844 1845 1869 1887 1906 1918 
+ 1846 1870 1904 1908 
+ 1806 1813 1856 1897 1921 1948 
+ 1847 1849 1867 1883 1905 1913 
+ 1850 1852 1868 1878 1898 1911 
+ 1818 1822 1891 1907 1961 
+ 1848 1851 1868 1886 1898 1916 
+ 1852 1853 1875 1879 1911 1912 
+ 1853 1854 1878 1881 1912 1915 
+ 1835 1861 1889 1909 1920 
+ 1854 1855 1879 1884 1910 1915 
+ 797 1495 2261 2312 3001 15297 
+ 1849 1860 1874 1896 1913 1925 
+ 1855 1857 1881 1885 1910 1917 
+ 1857 1859 1884 1888 1917 1923 
+ 1851 1856 1877 1916 1921 1951 
+ 1845 1861 1871 1909 1918 1931 
+ 1859 1862 1885 1894 1923 1926 
+ 1823 1835 1880 1920 1933 15302 
+ 1701 1710 1832 1919 2018 2083 
+ 1818 1825 1876 1893 1961 1986 
+ 1787 1815 1830 1893 1927 2012 2034 
+ 1825 1830 1891 1892 1986 2012 
+ 1862 1866 1888 1901 1926 1928 
+ 956 1544 1576 2125 2805 2889 
+ 1860 1865 1883 1902 1925 1930 
+ 1805 1806 1873 1922 1948 1978 
+ 1868 1875 1877 1911 1916 1929 
+ 1863 1867 1905 1934 
+ 1760 1802 1833 1950 1981 2026 
+ 1866 1870 1894 1904 1928 1932 
+ 1865 1869 1896 1906 1930 1938 
+ 1439 1544 1812 2125 2263 2489 
+ 1870 1872 1901 1908 1932 1939 
+ 1867 1874 1899 1913 1934 1941 
+ 1869 1871 1902 1918 1938 1946 
+ 1794 1822 1876 1922 1961 1991 
+ 1872 1904 1939 1944 
+ 1861 1880 1887 1920 1931 1942 
+ 1881 1884 1915 1917 1935 1936 
+ 1875 1878 1898 1912 1929 1945 
+ 1878 1879 1911 1915 1940 1945 
+ 1874 1883 1905 1925 1941 1949 
+ 1788 1819 1858 1937 1997 2037 
+ 1879 1881 1910 1912 1936 1940 
+ 1877 1886 1898 1929 1951 1963 
+ 1884 1885 1910 1923 1935 1943 
+ 1871 1887 1906 1931 1946 1954 
+ 1710 1766 1890 2083 2147 
+ 1880 1889 1909 1933 1942 1958 
+ 1856 1873 1886 1948 1951 1967 
+ 1794 1805 1897 1907 1978 1991 2027 
+ 1885 1888 1917 1926 1943 1947 
+ 1725 1730 1858 1972 1997 2063 
+ 1883 1896 1913 1930 1949 1953 
+ 1888 1894 1923 1928 1947 1952 
+ 1815 1828 1892 1937 2034 2056 
+ 1894 1901 1926 1932 1952 1957 
+ 1898 1911 1916 1945 1963 1973 
+ 1896 1902 1925 1938 1953 1959 
+ 1887 1909 1918 1942 1954 1955 
+ 1901 1904 1928 1939 1957 1960 
+ 1889 1920 1958 1980 1993 15302 
+ 1899 1905 1941 15303 
+ 1910 1917 1936 1943 1956 1968 
+ 1910 1915 1935 1940 1956 
+ 1819 1828 1914 1927 2037 2056 
+ 1902 1906 1930 1946 1959 1966 
+ 1904 1908 1932 1944 1960 1965 
+ 1912 1915 1936 1945 1956 1979 
+ 1905 1913 1934 1949 1969 15303 
+ 1909 1920 1931 1955 1958 1974 
+ 1917 1923 1935 1947 1968 1970 
+ 1908 1939 1965 1971 
+ 1911 1912 1929 1940 1973 1979 1995 
+ 1906 1918 1938 1954 1966 1977 
+ 1923 1926 1943 1952 1964 1970 
+ 1873 1897 1921 1967 1978 2007 
+ 1913 1925 1941 1953 1969 1976 
+ 1802 1832 1900 2018 2026 2116 
+ 1886 1916 1921 1963 1967 1983 
+ 1926 1928 1947 1957 1964 1975 
+ 1925 1930 1949 1959 1976 15304 
+ 1918 1931 1946 1955 1977 1982 
+ 1931 1942 1954 1974 1982 
+ 1935 1936 1940 1968 1979 2004 
+ 1928 1932 1952 1960 1975 1985 
+ 1920 1933 1942 1974 1993 2000 
+ 1930 1938 1953 1966 1990 15304 
+ 1932 1939 1957 1965 1985 1989 
+ 1876 1891 1907 1986 1991 2066 2079 
+ 1408 1443 1766 1984 2147 2685 2755 
+ 1916 1929 1951 1973 1983 1999 
+ 1947 1952 1970 1975 1988 
+ 1939 1944 1960 1971 1989 1994 
+ 1938 1946 1959 1977 1990 1998 
+ 1921 1948 1951 1983 2007 2009 
+ 1935 1943 1956 1970 2004 2006 
+ 1941 1949 1976 1992 1996 15303 
+ 1943 1947 1964 1968 1988 2006 
+ 1944 1965 1994 15305 
+ 1725 1751 1924 2060 2063 2195 
+ 1929 1945 1963 1995 1999 2008 
+ 1942 1955 1958 1982 2000 2003 
+ 1952 1957 1964 1985 1988 15306 
+ 1949 1953 1969 1996 2001 15304 
+ 1946 1954 1966 1982 1998 2002 
+ 1897 1922 1948 2007 2027 2058 
+ 1940 1945 1956 1995 2004 2011 
+ 1864 1933 1981 1993 2046 2085 15302 
+ 1833 1864 1900 1980 2026 2085 2117 
+ 1954 1955 1974 1977 2002 2003 
+ 1951 1963 1967 1999 2009 2014 
+ 1443 1962 2261 2755 3305 15297 
+ 1957 1960 1975 1989 2005 15306 
+ 1891 1893 1961 2012 2079 2082 
+ 302 446 894 3287 4973 5181 
+ 1964 1970 1975 2006 2020 15306 
+ 1960 1965 1985 1994 2005 2013 
+ 1959 1966 1998 2010 2016 15304 
+ 1907 1922 1961 2027 2066 2086 
+ 1969 1996 2015 15303 
+ 1933 1958 1980 2000 2040 2046 
+ 1965 1971 1989 2013 2017 15305 
+ 1945 1973 1979 2008 2011 2021 
+ 1969 1976 1992 2001 2015 2024 
+ 1858 1914 1924 2037 2063 2131 
+ 1966 1977 1990 2002 2016 2025 
+ 1963 1973 1983 2008 2014 2022 
+ 1958 1974 1993 2003 2035 2040 
+ 1976 1996 2010 2024 2030 15304 
+ 1977 1982 1998 2003 2025 2029 
+ 1974 1982 2000 2002 2029 2035 
+ 1956 1968 1979 2006 2011 2042 2052 
+ 1985 1989 2013 2028 2033 15306 
+ 1968 1970 1988 2004 2020 2052 2057 
+ 1948 1967 1978 2009 2053 2058 
+ 1973 1995 1999 2021 2022 2031 
+ 1967 1983 2007 2014 2048 2053 
+ 1990 2001 2016 2030 2036 15304 
+ 1979 1995 2004 2021 2032 2042 
+ 1892 1893 1986 2034 2082 2095 
+ 1989 1994 2005 2017 2033 2038 
+ 1983 1999 2009 2022 2041 2048 
+ 1992 1996 2024 2043 
+ 1990 1998 2010 2025 2036 2044 
+ 1994 2013 2023 2038 2045 15305 
+ 1832 1890 1950 2083 2116 2207 
+ 813 1656 2447 2790 3675 15299 
+ 1988 2006 2028 2057 2065 15306 
+ 1995 2008 2011 2031 2032 2047 
+ 1999 2008 2014 2031 2039 2041 
+ 2017 2045 2049 15305 
+ 1996 2001 2015 2030 2043 2050 
+ 1998 2002 2016 2029 2044 2051 
+ 1900 1950 1981 2116 2117 2214 
+ 1922 1978 1991 2058 2086 2114 
+ 2005 2020 2033 2065 2068 15306 
+ 2002 2003 2025 2035 2051 2067 
+ 2001 2010 2024 2036 2050 2055 
+ 2008 2021 2022 2039 2047 2054 
+ 2011 2021 2042 2047 2061 
+ 2005 2013 2028 2038 2068 2070 
+ 1892 1927 2012 2056 2095 2128 
+ 2000 2003 2029 2040 2067 2084 
+ 2010 2016 2030 2044 2055 2064 
+ 1914 1937 1997 2056 2131 2155 
+ 2013 2017 2033 2045 2070 2071 
+ 2022 2031 2041 2054 2059 
+ 1993 2000 2035 2046 2084 2099 
+ 2014 2022 2039 2048 2059 2072 
+ 2004 2011 2032 2052 2061 2074 
+ 2015 2024 2050 2075 
+ 2016 2025 2036 2051 2064 2069 
+ 2017 2023 2038 2049 2071 2077 
+ 1980 1993 2040 2085 2099 2133 
+ 2021 2031 2032 2054 2061 2076 
+ 2009 2014 2041 2053 2072 2096 
+ 2023 2045 2077 2080 
+ 2024 2030 2043 2055 2075 2081 
+ 2025 2029 2044 2067 2069 2088 
+ 2004 2006 2042 2057 2074 2093 2098 
+ 2007 2009 2048 2058 2096 2102 
+ 2031 2039 2047 2059 2076 2089 
+ 2030 2036 2050 2064 2081 2087 
+ 1927 1937 2034 2037 2128 2155 2190 
+ 2006 2020 2052 2065 2093 2094 
+ 1978 2007 2027 2053 2102 2114 2141 
+ 2039 2041 2054 2072 2089 2090 
+ 1751 1812 1972 2195 2263 2540 
+ 2032 2042 2047 2074 2076 2092 
+ 372 612 1146 2078 4176 4383 15374 
+ 1924 1972 1997 2131 2195 2326 
+ 2036 2044 2055 2069 2087 2091 
+ 2020 2028 2057 2068 2094 2100 
+ 1961 1991 2079 2086 2150 2174 
+ 2029 2035 2051 2084 2088 2109 
+ 2028 2033 2065 2070 2097 2100 
+ 2044 2051 2064 2088 2091 
+ 2033 2038 2068 2071 2097 2101 
+ 2038 2045 2070 2077 2101 2103 
+ 2041 2048 2059 2090 2096 2107 
+ 1028 1249 2171 2193 3690 3813 
+ 2042 2052 2061 2092 2098 2106 
+ 2043 2050 2081 2105 
+ 2047 2054 2061 2089 2092 2110 
+ 2045 2049 2071 2080 2103 2104 
+ 612 1264 2062 2587 4169 4383 
+ 1961 1986 2066 2082 2154 2174 
+ 2049 2077 2104 2108 
+ 2050 2055 2075 2087 2105 2112 
+ 1986 2012 2079 2095 2154 2163 
+ 1890 1919 2018 2147 2207 2364 
+ 2035 2040 2067 2099 2109 2134 
+ 1980 1981 2046 2117 2133 2203 
+ 1991 2027 2066 2114 2150 2165 
+ 2055 2064 2081 2091 2112 2120 
+ 2051 2067 2069 2091 2109 2121 
+ 2054 2059 2076 2090 2110 2115 
+ 2059 2072 2089 2107 2115 
+ 2064 2069 2087 2088 2120 2121 
+ 2061 2074 2076 2106 2110 2122 
+ 2052 2057 2094 2098 2111 2113 
+ 2057 2065 2093 2100 2113 2123 
+ 2012 2034 2082 2128 2160 2163 
+ 2048 2053 2072 2102 2107 2132 2142 
+ 2068 2070 2100 2101 2118 2130 
+ 2052 2074 2093 2106 2111 2119 2126 
+ 2040 2046 2084 2133 2134 2177 
+ 2065 2068 2094 2097 2123 2130 2146 
+ 2070 2071 2097 2103 2118 2124 2136 
+ 2053 2058 2096 2141 2142 2166 
+ 2071 2077 2101 2104 2124 2129 
+ 2077 2080 2103 2108 2129 2135 
+ 2075 2081 2112 2137 
+ 2074 2092 2098 2122 2126 2138 
+ 2072 2090 2096 2115 2132 2140 
+ 2080 2104 2135 2137 
+ 2067 2084 2088 2121 2134 2162 
+ 2076 2089 2092 2115 2122 2144 2148 
+ 2093 2098 2113 2119 2127 
+ 2081 2087 2105 2120 2137 2159 
+ 2093 2094 2111 2123 2127 2139 
+ 2027 2058 2086 2141 2165 2181 
+ 2089 2090 2107 2110 2140 2148 
+ 1950 2018 2026 2207 2214 2356 
+ 1981 2026 2085 2203 2214 2333 
+ 2097 2101 2130 2136 2145 
+ 2098 2111 2126 2127 15307 
+ 2087 2091 2112 2121 2159 2178 
+ 2088 2091 2109 2120 2162 2178 
+ 2092 2106 2110 2138 2144 2157 
+ 2094 2100 2113 2139 2146 2149 2152 
+ 2101 2103 2129 2136 2143 
+ 1544 1895 1903 2489 2889 2990 
+ 2098 2106 2119 2138 2156 15307 
+ 2111 2113 2119 2139 2151 15307 
+ 2034 2056 2095 2160 2190 2223 
+ 2103 2104 2124 2135 2143 2153 
+ 2097 2100 2118 2145 2146 2176 
+ 1997 2037 2063 2155 2326 2553 
+ 2096 2107 2140 2142 2167 2185 
+ 2046 2085 2099 2177 2203 2244 
+ 2084 2099 2109 2162 2177 2206 
+ 2104 2108 2129 2137 2153 2161 
+ 2101 2118 2124 2143 2145 2158 
+ 2105 2108 2112 2135 2159 2161 2189 
+ 2106 2122 2126 2156 2157 2169 
+ 2113 2123 2127 2149 2151 2164 
+ 2107 2115 2132 2148 2167 2175 
+ 2058 2102 2114 2166 2181 2201 2224 
+ 2096 2102 2132 2166 2185 2188 
+ 2124 2129 2136 2153 2158 2168 
+ 2110 2122 2148 2157 2172 2180 
+ 2118 2130 2136 2158 2176 2182 
+ 2100 2123 2130 2152 2173 2176 
+ 1766 1919 1962 2083 2364 2685 3003 
+ 2110 2115 2140 2144 2175 2180 
+ 2123 2139 2152 2164 2170 
+ 2066 2086 2165 2174 2213 2239 
+ 2127 2139 2164 2179 2183 15307 
+ 2123 2146 2149 2170 2173 
+ 2129 2135 2143 2161 2168 2184 
+ 2079 2082 2163 2174 2251 2255 
+ 2037 2056 2131 2190 2367 2553 
+ 2126 2138 2169 2179 2187 15307 
+ 2122 2138 2144 2169 2172 2186 
+ 2136 2143 2145 2168 2182 2192 
+ 2112 2120 2137 2178 2189 2217 
+ 2095 2128 2163 2223 2241 
+ 2135 2137 2153 2184 2189 
+ 2109 2121 2134 2178 2206 2230 
+ 2082 2095 2154 2160 2241 2255 
+ 2139 2149 2151 2170 2183 2191 
+ 2086 2114 2150 2181 2213 2242 
+ 2102 2141 2142 2188 2201 2210 
+ 2132 2140 2175 2185 2199 2211 
+ 2143 2153 2158 2184 2192 2202 
+ 2138 2156 2157 2186 2187 2197 
+ 2149 2152 2164 2173 2191 2196 
+ 882 1028 2073 2700 3813 4525 
+ 2144 2157 2180 2186 2194 
+ 2146 2152 2170 2176 2196 2198 
+ 2066 2079 2150 2154 2239 2251 2294 
+ 2140 2148 2167 2180 2199 2204 
+ 2130 2145 2146 2173 2182 2198 2205 
+ 2099 2133 2134 2206 2244 2284 
+ 2120 2121 2159 2162 2217 2230 2272 
+ 2151 2156 2183 2187 2200 2208 15307 
+ 2144 2148 2172 2175 2194 2204 
+ 2114 2141 2165 2224 2242 2286 
+ 2145 2158 2176 2192 2205 2218 
+ 2151 2164 2179 2191 2200 2212 
+ 2153 2161 2168 2189 2202 2226 
+ 2132 2142 2167 2188 2211 2216 2227 
+ 2157 2169 2172 2194 2197 2209 
+ 2156 2169 2179 2197 2208 2215 
+ 2142 2166 2185 2210 2216 2221 
+ 2137 2159 2161 2184 2217 2226 2254 
+ 2056 2128 2155 2223 2345 2367 
+ 2164 2170 2183 2196 2212 2220 
+ 2158 2168 2182 2202 2218 2229 
+ 1249 1576 2073 2805 3690 3839 
+ 2172 2180 2186 2204 2209 2228 
+ 1972 2060 2063 2326 2540 2724 
+ 2170 2173 2191 2198 2220 2225 
+ 2169 2186 2187 2209 2215 2222 
+ 2173 2176 2196 2205 2225 2232 
+ 2167 2175 2204 2211 2238 2247 
+ 2179 2183 2208 2212 2233 2234 
+ 2141 2166 2210 2224 2240 2260 
+ 2168 2184 2192 2226 2229 2253 
+ 2085 2117 2133 2244 2333 2373 
+ 2175 2180 2194 2199 2228 2247 15308 
+ 2176 2182 2198 2218 2232 2245 
+ 2134 2162 2177 2230 2284 2319 
+ 2018 2083 2116 2356 2364 2650 
+ 2179 2187 2200 2215 2233 2235 
+ 2186 2194 2197 2222 2228 2237 
+ 2166 2188 2201 2221 2236 2240 
+ 2167 2185 2199 2227 2238 2248 
+ 2183 2191 2200 2220 2234 2243 
+ 2150 2165 2239 2242 2285 
+ 2026 2116 2117 2333 2356 2557 
+ 2187 2197 2208 2222 2231 2235 
+ 2185 2188 2221 2227 2246 2249 
+ 2159 2178 2189 2254 2272 2306 
+ 2182 2192 2205 2229 2245 2256 
+ 1495 1656 2312 2790 3581 3809 
+ 2191 2196 2212 2225 2243 2252 
+ 2188 2210 2216 2236 2246 
+ 2197 2209 2215 2231 2237 2250 
+ 2128 2160 2190 2241 2345 2350 
+ 2141 2181 2201 2260 2286 2297 
+ 2196 2198 2220 2232 2252 2262 
+ 2184 2189 2202 2253 2254 2277 
+ 2185 2211 2216 2248 2249 2259 
+ 2194 2204 2209 2237 2267 2278 15308 
+ 2192 2202 2218 2253 2256 2275 
+ 2162 2178 2206 2272 2319 2346 
+ 2215 2222 2235 2250 2257 
+ 2198 2205 2225 2245 2262 2271 
+ 2200 2208 2234 2235 2264 2265 
+ 2200 2212 2233 2243 2265 2268 
+ 2208 2215 2231 2233 2257 2264 
+ 2210 2221 2240 2246 2270 2276 
+ 2209 2222 2228 2250 2267 2269 
+ 2199 2211 2247 2248 2273 2274 
+ 2150 2174 2213 2285 2294 2327 
+ 2201 2210 2236 2260 2276 2290 
+ 2160 2163 2223 2255 2350 2377 
+ 2165 2181 2213 2285 2286 2352 
+ 2212 2220 2234 2252 2268 2282 
+ 2133 2177 2203 2284 2373 15309 
+ 2205 2218 2232 2256 2271 2288 
+ 2216 2221 2236 2249 2258 2270 
+ 2199 2204 2238 2273 2287 15308 
+ 2211 2227 2238 2259 2274 2283 
+ 2216 2227 2246 2258 2259 2266 
+ 2222 2231 2237 2257 2269 2279 
+ 2154 2174 2255 2294 2414 2418 
+ 2220 2225 2243 2262 2282 2289 
+ 2202 2226 2229 2275 2277 2295 
+ 2189 2217 2226 2277 2306 2314 2329 
+ 2154 2163 2241 2251 2377 2414 
+ 2218 2229 2245 2275 2288 2302 
+ 2231 2235 2250 2264 2279 2291 
+ 2246 2249 2266 2270 2281 
+ 2227 2248 2249 2266 2280 2283 
+ 2201 2224 2240 2290 2297 2323 
+ 1882 1984 3001 3305 15297 15355 
+ 2225 2232 2252 2271 2289 2299 
+ 1812 1903 2060 2489 2540 3033 3271 
+ 2233 2235 2257 2265 2291 2296 
+ 2233 2234 2264 2268 2296 2301 
+ 2249 2258 2259 2280 2281 2292 
+ 2228 2237 2269 2278 2293 2303 
+ 2234 2243 2265 2282 2301 2311 
+ 2237 2250 2267 2279 2293 2305 
+ 2236 2246 2258 2276 2281 2308 2310 
+ 2232 2245 2262 2288 2299 2317 
+ 2178 2217 2230 2306 2346 2371 
+ 2238 2247 2274 2287 2307 2309 
+ 2238 2248 2273 2283 2304 2309 
+ 2229 2253 2256 2295 2302 2325 
+ 2236 2240 2270 2290 2310 2320 
+ 2226 2253 2254 2295 2314 2321 
+ 2228 2267 2300 2303 2316 15308 
+ 2250 2257 2269 2291 2305 2315 
+ 2259 2266 2283 2292 2298 
+ 2258 2266 2270 2292 2308 2313 
+ 2243 2252 2268 2289 2311 2324 
+ 2248 2259 2274 2280 2298 2304 
+ 2177 2206 2244 2319 2449 15309 
+ 2213 2239 2242 2327 2352 2393 
+ 2181 2224 2242 2297 2352 2376 2429 
+ 2247 2273 2300 2307 2318 15308 
+ 2245 2256 2271 2302 2317 2336 
+ 2252 2262 2282 2299 2324 2335 
+ 2240 2260 2276 2320 2323 2344 
+ 2257 2264 2279 2296 2315 2332 
+ 2266 2280 2281 2298 2313 2322 
+ 2267 2269 2303 2305 2330 
+ 2174 2239 2251 2327 2418 2443 
+ 2253 2275 2277 2321 2325 2347 
+ 2264 2265 2291 2301 2332 2338 
+ 2224 2260 2286 2323 2376 2379 
+ 2280 2283 2292 2304 2322 2328 
+ 2262 2271 2289 2317 2335 2357 
+ 2278 2287 2316 2318 2334 2341 15308 
+ 2265 2268 2296 2311 2338 2351 
+ 2256 2275 2288 2325 2336 2363 
+ 2267 2278 2293 2316 2330 2349 
+ 2274 2283 2298 2309 2328 2331 
+ 2269 2279 2293 2315 2330 2362 
+ 2217 2254 2272 2329 2371 2398 
+ 2273 2287 2309 2318 2339 2340 
+ 2270 2281 2310 2313 2342 2343 
+ 2273 2274 2304 2307 2331 2340 2353 
+ 2270 2276 2308 2320 2343 2355 
+ 2268 2282 2301 2324 2351 2360 
+ 1495 1882 2219 3001 3581 15350 
+ 2281 2292 2308 2322 2342 2348 
+ 2254 2277 2321 2329 2375 2400 
+ 2279 2291 2305 2332 2362 2372 
+ 2278 2300 2303 2341 2349 2361 
+ 2271 2288 2299 2336 2357 2383 
+ 2287 2300 2307 2334 2337 2339 
+ 2206 2230 2284 2346 2449 2507 
+ 2276 2290 2310 2344 2355 2374 
+ 2277 2295 2314 2347 2375 
+ 2292 2298 2313 2328 2348 2354 
+ 2260 2290 2297 2344 2379 2388 
+ 2282 2289 2311 2335 2360 2378 
+ 2275 2295 2302 2347 2363 2392 
+ 2063 2131 2195 2553 2724 2909 
+ 2239 2285 2294 2393 2443 2499 
+ 2298 2304 2322 2331 2354 2359 
+ 2254 2306 2314 2398 2400 
+ 2293 2303 2305 2349 2362 2387 
+ 2304 2309 2328 2353 2359 2369 
+ 2291 2296 2315 2338 2372 2386 
+ 2117 2203 2214 2373 2557 2638 2776 
+ 2300 2318 2337 2341 2365 2368 
+ 2289 2299 2324 2357 2378 2401 
+ 2288 2302 2317 2363 2383 2408 
+ 2318 2334 2339 2358 2365 
+ 2296 2301 2332 2351 2386 2394 
+ 2307 2318 2337 2340 2358 2366 
+ 2307 2309 2339 2353 2366 2370 
+ 2300 2316 2334 2361 2368 2384 
+ 2308 2313 2343 2348 2380 2381 
+ 2308 2310 2342 2355 2381 2390 
+ 2290 2320 2323 2374 2388 2403 
+ 2190 2223 2350 2367 2590 2742 
+ 2230 2272 2319 2371 2505 2507 
+ 2295 2321 2325 2375 2392 2417 
+ 2313 2322 2342 2354 2380 2385 
+ 2303 2316 2330 2361 2387 2397 
+ 2223 2241 2345 2377 2495 2590 
+ 2301 2311 2338 2360 2394 2405 
+ 2242 2285 2286 2393 2429 2480 2518 
+ 2309 2331 2340 2369 2370 2389 
+ 2322 2328 2348 2359 2385 2391 
+ 2310 2320 2343 2374 2390 2402 
+ 2116 2207 2214 2557 2650 2852 
+ 2299 2317 2335 2383 2401 2427 
+ 2337 2339 2365 2366 2382 
+ 2328 2331 2354 2369 2391 2399 
+ 2311 2324 2351 2378 2405 2421 
+ 2316 2341 2349 2384 2397 2407 
+ 2305 2315 2330 2372 2387 2415 2422 
+ 2302 2325 2336 2392 2408 2436 
+ 2083 2147 2207 2650 3003 3250 
+ 2334 2337 2358 2368 2382 2395 
+ 2339 2340 2358 2370 2382 2396 
+ 2155 2190 2345 2553 2742 2945 
+ 2334 2341 2365 2384 2395 2404 
+ 2331 2353 2359 2389 2399 2409 
+ 2340 2353 2366 2389 2396 2406 
+ 2272 2306 2346 2398 2505 2517 
+ 2315 2332 2362 2386 2415 2428 
+ 2203 2244 2333 2596 2638 15309 
+ 2320 2344 2355 2402 2403 2426 
+ 2314 2321 2347 2400 2417 2446 
+ 2286 2297 2379 2429 2454 2469 
+ 2241 2255 2350 2414 2495 2577 
+ 2324 2335 2360 2401 2421 2441 
+ 2297 2323 2376 2388 2434 2454 
+ 2342 2348 2381 2385 2411 2412 
+ 2342 2343 2380 2390 2411 2416 
+ 2358 2365 2366 2395 2396 2410 
+ 2317 2336 2357 2408 2427 2455 
+ 2341 2361 2368 2404 2407 2419 
+ 2348 2354 2380 2391 2412 2413 
+ 2332 2338 2372 2394 2428 2433 
+ 2330 2349 2362 2397 2422 2432 
+ 2323 2344 2379 2403 2434 2451 
+ 2353 2369 2370 2406 2409 2423 
+ 2343 2355 2381 2402 2416 2430 
+ 2354 2359 2385 2399 2413 2420 
+ 2325 2347 2363 2417 2436 15310 
+ 2285 2327 2352 2480 2499 2543 
+ 2338 2351 2386 2405 2433 2453 
+ 2365 2368 2382 2404 2410 2424 
+ 2366 2370 2382 2406 2410 2425 
+ 2349 2361 2387 2407 2432 2435 
+ 2306 2329 2371 2400 2477 2517 
+ 2359 2369 2391 2409 2420 2431 
+ 2314 2329 2375 2398 2446 2477 
+ 2335 2357 2378 2427 2441 2467 
+ 2355 2374 2390 2426 2430 2450 
+ 2344 2374 2388 2426 2451 2460 
+ 2368 2384 2395 2419 2424 2437 
+ 2351 2360 2394 2421 2453 2465 
+ 2370 2389 2396 2423 2425 2438 
+ 2361 2384 2397 2419 2435 2445 
+ 2336 2363 2383 2436 2455 2482 
+ 2369 2389 2399 2423 2431 2442 
+ 2382 2395 2396 2424 2425 2439 
+ 2380 2381 2412 2416 2440 2448 
+ 2380 2385 2411 2413 2440 2444 
+ 2385 2391 2412 2420 2444 2452 
+ 2251 2255 2377 2418 2577 2578 2608 
+ 2362 2372 2422 2428 2464 2468 
+ 2381 2390 2411 2430 2448 2456 
+ 2347 2375 2392 2446 2503 15310 
+ 2251 2294 2414 2443 2578 2614 
+ 2384 2404 2407 2437 2445 2462 
+ 2391 2399 2413 2431 2452 2457 
+ 2360 2378 2405 2441 2465 2481 
+ 2362 2387 2415 2432 2464 2485 
+ 2389 2406 2409 2438 2442 2461 
+ 2395 2404 2410 2437 2439 2459 
+ 2396 2406 2410 2438 2439 2458 
+ 2374 2402 2403 2450 2460 2472 
+ 2357 2383 2401 2455 2467 2492 
+ 2372 2386 2415 2433 2468 2479 
+ 2286 2352 2376 2469 2518 2522 
+ 2390 2402 2416 2450 2456 2466 
+ 2399 2409 2420 2442 2457 2463 
+ 2387 2397 2422 2435 2470 2485 
+ 2386 2394 2428 2453 2479 2488 
+ 2379 2388 2451 2454 2490 2494 
+ 2397 2407 2432 2445 2470 2475 
+ 2363 2392 2408 2482 2515 15310 
+ 2404 2419 2424 2459 2462 2474 
+ 2406 2423 2425 2458 2461 2473 
+ 2410 2424 2425 2458 2459 2471 
+ 2411 2412 2444 2448 
+ 2378 2401 2421 2467 2481 2504 
+ 2409 2423 2431 2461 2463 2476 
+ 2294 2327 2418 2499 2611 2614 
+ 2412 2413 2440 2452 
+ 2407 2419 2435 2462 2475 2478 
+ 2375 2400 2417 2477 2503 2534 
+ 2019 2587 3675 15299 15364 
+ 2411 2416 2440 2456 
+ 2284 2319 2507 2606 2641 15309 
+ 2402 2426 2430 2466 2472 2484 
+ 2388 2403 2434 2460 2490 2491 
+ 2413 2420 2444 2457 
+ 2394 2405 2433 2465 2488 2500 
+ 2376 2379 2434 2469 2494 2509 
+ 2383 2408 2427 2482 2492 2521 
+ 2416 2430 2448 2466 
+ 2420 2431 2452 2463 
+ 2425 2438 2439 2471 2473 15311 
+ 2424 2437 2439 2471 2474 2483 
+ 2403 2426 2451 2472 2491 2498 
+ 2423 2438 2442 2473 2476 2486 
+ 2419 2437 2445 2474 2478 2487 
+ 2431 2442 2457 2476 
+ 2415 2422 2468 2485 2508 2513 
+ 2405 2421 2453 2481 2500 2519 
+ 2430 2450 2456 2484 
+ 2401 2427 2441 2492 2504 2526 
+ 2415 2428 2464 2479 2508 2516 
+ 2376 2429 2454 2509 2522 2537 
+ 2432 2435 2475 2485 2502 2510 
+ 2439 2458 2459 2483 15311 15312 
+ 2426 2450 2460 2484 2498 2506 
+ 2438 2458 2461 2486 2497 15311 
+ 2437 2459 2462 2483 2487 2496 
+ 2435 2445 2470 2478 2493 2502 
+ 2442 2461 2463 2486 
+ 2398 2400 2446 2517 2534 2571 
+ 2445 2462 2475 2487 2493 2501 
+ 2428 2433 2468 2488 2516 2523 
+ 2352 2393 2518 2543 2551 2581 
+ 2421 2441 2465 2504 2519 2539 
+ 2408 2436 2455 2515 2521 2548 
+ 2459 2471 2474 2496 2511 15312 
+ 2450 2466 2472 2506 
+ 2422 2432 2464 2470 2510 2513 2532 
+ 2461 2473 2476 2497 
+ 2462 2474 2478 2496 2501 2514 
+ 2433 2453 2479 2500 2523 2536 
+ 1903 2125 2263 2990 3033 3393 
+ 2434 2451 2491 2494 2527 2530 
+ 2451 2460 2490 2498 2527 2529 
+ 2427 2455 2467 2521 2526 2554 
+ 2475 2478 2501 2502 2520 
+ 2434 2454 2490 2509 2530 2541 
+ 2350 2377 2577 2590 2692 
+ 2474 2483 2487 2511 2514 2525 
+ 2473 2486 2512 15311 
+ 2460 2472 2491 2506 2529 2531 
+ 2327 2393 2443 2543 2611 2612 
+ 2453 2465 2488 2519 2536 2550 
+ 2478 2487 2493 2514 2520 2528 
+ 2470 2475 2493 2510 2520 2533 
+ 2417 2446 2534 2546 2591 15310 
+ 2441 2467 2481 2526 2539 2561 
+ 2346 2371 2507 2517 2639 2674 
+ 2472 2484 2498 2531 
+ 2319 2346 2449 2505 2641 2674 2713 
+ 2464 2468 2513 2516 2545 2547 
+ 2454 2469 2494 2537 2541 2558 
+ 2470 2485 2502 2532 2533 2549 
+ 2483 2496 2524 2525 2538 15312 
+ 2497 2524 15311 15312 
+ 2464 2485 2508 2532 2545 2559 
+ 2487 2496 2501 2525 2528 2542 
+ 2436 2482 2546 2548 2585 15310 
+ 2468 2479 2508 2523 2547 2556 
+ 2371 2398 2477 2505 2571 2639 2669 
+ 2352 2429 2480 2522 2551 2576 2593 
+ 2465 2481 2500 2539 2550 2572 
+ 2493 2501 2502 2528 2533 2544 
+ 2455 2482 2492 2548 2554 2583 
+ 2429 2469 2518 2537 2575 2576 
+ 2479 2488 2516 2536 2556 2567 
+ 2511 2512 2538 15312 
+ 2496 2511 2514 2538 2542 2552 
+ 2467 2492 2504 2554 2561 15313 
+ 2490 2491 2529 2530 2563 2564 
+ 2501 2514 2520 2542 2544 2555 
+ 2491 2498 2527 2531 2562 2563 
+ 2490 2494 2527 2541 2564 2573 
+ 2498 2506 2529 2562 
+ 2485 2510 2513 2549 2559 2568 2569 
+ 2502 2510 2520 2544 2549 2560 
+ 2446 2477 2503 2571 2591 2637 
+ 226 275 361 5293 5550 6549 
+ 2488 2500 2523 2550 2567 2582 
+ 2469 2509 2522 2558 2575 2586 
+ 2511 2524 2525 2552 
+ 2481 2504 2519 2561 2572 2595 
+ 2060 2195 2263 2724 3271 3518 
+ 2494 2509 2530 2558 2573 2580 
+ 2514 2525 2528 2552 2555 2566 
+ 2393 2480 2499 2581 2612 2658 
+ 2520 2528 2533 2555 2560 2570 
+ 2508 2513 2547 2559 2584 2588 
+ 2503 2515 2585 2591 2630 15310 
+ 2508 2516 2545 2556 2584 2592 
+ 2482 2515 2521 2583 2585 2625 
+ 2510 2532 2533 2560 2569 2574 
+ 2500 2519 2536 2572 2582 2603 
+ 2480 2518 2581 2593 2618 
+ 2525 2538 2542 2566 
+ 2131 2155 2326 2367 2909 2945 3134 
+ 2492 2521 2526 2583 2621 15313 
+ 2528 2542 2544 2566 2570 2579 
+ 2516 2523 2547 2567 2592 2602 
+ 2214 2333 2356 2776 2852 3019 
+ 2509 2537 2541 2580 2586 2599 
+ 2513 2532 2545 2568 2588 15314 
+ 2533 2544 2549 2570 2574 2589 
+ 2504 2526 2539 2595 2623 15313 
+ 2529 2531 2563 2598 
+ 2527 2529 2562 2564 2598 2601 
+ 2527 2530 2563 2573 2601 2605 
+ 293 295 3697 3878 4830 4888 
+ 2542 2552 2555 2579 
+ 2523 2536 2556 2582 2602 2615 
+ 2532 2559 2569 2597 15314 
+ 2532 2549 2568 2574 2594 2597 
+ 2544 2555 2560 2579 2589 2600 
+ 2477 2517 2534 2637 2669 2695 
+ 2519 2539 2550 2595 2603 2629 
+ 2530 2541 2564 2580 2605 2609 
+ 2549 2560 2569 2589 2594 2604 
+ 2522 2537 2576 2586 2607 2610 
+ 2518 2522 2575 2593 2607 2624 
+ 2377 2414 2495 2608 2692 2759 
+ 2414 2418 2608 2614 2680 2687 
+ 2555 2566 2570 2600 
+ 2541 2558 2573 2599 2609 2628 
+ 2480 2543 2551 2618 2658 2666 
+ 2536 2550 2567 2603 2615 2635 
+ 2521 2548 2554 2621 2625 15315 
+ 2545 2547 2588 2592 2620 2626 
+ 2515 2546 2548 2625 2630 2665 
+ 2537 2558 2575 2599 2610 2622 
+ 1264 2078 2447 4169 15299 15364 
+ 2545 2559 2584 2619 2620 15314 
+ 2560 2570 2574 2600 2604 2613 
+ 2345 2350 2495 2692 2742 2811 
+ 2503 2534 2546 2630 2637 2671 
+ 2547 2556 2584 2602 2626 2632 
+ 2518 2551 2576 2618 2624 2645 
+ 2569 2574 2597 2604 2616 2627 
+ 2539 2561 2572 2623 2629 2651 
+ 2373 2606 2638 2753 2834 15309 
+ 2568 2569 2594 2616 2617 15314 
+ 2562 2563 2601 2634 
+ 2558 2580 2586 2622 2628 2631 
+ 2570 2579 2589 2613 
+ 2563 2564 2598 2605 2634 2642 
+ 2556 2567 2592 2615 2632 2648 
+ 2550 2572 2582 2629 2635 2659 
+ 2574 2589 2594 2613 2627 2633 
+ 2564 2573 2601 2609 2642 2647 
+ 2449 2596 2641 2752 2753 15309 
+ 2575 2576 2610 2624 2636 2657 
+ 2414 2577 2578 2680 2754 2759 
+ 2573 2580 2605 2628 2647 2652 
+ 2575 2586 2607 2622 2636 2646 
+ 2443 2499 2612 2614 2715 2716 
+ 2499 2543 2611 2658 2697 2715 
+ 2589 2600 2604 2633 
+ 2418 2443 2578 2611 2687 2716 2740 
+ 2567 2582 2602 2635 2648 2664 
+ 2594 2597 2617 2627 2640 2644 
+ 2597 2616 2619 2640 2643 15314 
+ 2551 2581 2593 2645 2666 2690 
+ 2588 2617 2620 2643 2649 15314 
+ 2584 2588 2619 2626 2649 2656 
+ 2554 2583 2653 2688 15313 15315 
+ 2586 2599 2610 2631 2646 2655 
+ 2561 2595 2651 2653 2676 15313 
+ 2576 2593 2607 2645 2657 2673 
+ 2548 2583 2585 2665 2703 15315 
+ 2584 2592 2620 2632 2656 2662 
+ 2594 2604 2616 2633 2644 2654 
+ 2580 2599 2609 2631 2652 2661 
+ 2572 2595 2603 2651 2659 2679 
+ 2546 2585 2591 2665 2671 2701 
+ 2599 2622 2628 2655 2661 
+ 2592 2602 2626 2648 2662 2675 
+ 2604 2613 2627 2654 
+ 2598 2601 2642 2672 
+ 2582 2603 2615 2659 2664 2684 
+ 2607 2610 2646 2657 2670 
+ 2534 2571 2591 2671 2695 2712 
+ 2333 2373 2596 2776 2834 2923 
+ 2505 2517 2669 2674 2761 2768 
+ 2616 2617 2643 2644 2660 2663 
+ 2449 2507 2606 2713 2752 2809 
+ 2601 2605 2634 2647 2672 2678 
+ 2617 2619 2640 2649 2660 2667 
+ 2616 2627 2640 2654 2663 2668 
+ 2593 2618 2624 2673 2690 2711 
+ 2610 2622 2636 2655 2670 2677 
+ 2605 2609 2642 2652 2678 2683 
+ 2602 2615 2632 2664 2675 2694 
+ 2619 2620 2643 2656 2667 2681 
+ 2207 2356 2364 2852 3250 3316 
+ 2595 2623 2629 2676 2679 2699 
+ 2609 2628 2647 2661 2683 2686 
+ 2621 2623 2676 2688 2705 15313 
+ 2627 2633 2644 2668 
+ 2622 2631 2646 2661 2677 2691 
+ 2620 2626 2649 2662 2681 2693 
+ 2607 2624 2636 2670 2673 2702 
+ 2543 2581 2612 2666 2697 2726 2736 
+ 2603 2629 2635 2679 2684 2706 
+ 2640 2643 2663 2667 2682 
+ 2628 2631 2652 2655 2686 2691 
+ 2626 2632 2656 2675 2693 2698 
+ 2640 2644 2660 2668 2682 2689 
+ 2615 2635 2648 2684 2694 2707 
+ 2585 2625 2630 2701 2703 2738 
+ 2581 2618 2658 2690 2726 2729 
+ 2643 2649 2660 2681 2682 2696 
+ 2644 2654 2663 2689 
+ 2517 2571 2639 2695 2764 2768 
+ 2636 2646 2657 2677 2702 2710 
+ 2591 2630 2637 2701 2712 2732 
+ 2634 2642 2678 2708 
+ 2624 2645 2657 2702 2711 2746 
+ 2505 2507 2639 2713 2761 2774 
+ 2632 2648 2662 2694 2698 15316 
+ 2623 2651 2653 2699 2705 2721 
+ 2646 2655 2670 2691 2710 2717 
+ 2642 2647 2672 2683 2708 2714 
+ 2629 2651 2659 2699 2706 2725 
+ 2578 2608 2687 2750 2754 
+ 2649 2656 2667 2693 2696 2709 2722 
+ 2660 2663 2667 2689 2696 2704 
+ 2647 2652 2678 2686 2714 2719 
+ 2635 2659 2664 2706 2707 2735 
+ 1962 2147 2755 3003 3755 3759 
+ 2652 2661 2683 2691 2718 2719 
+ 2578 2614 2680 2740 2750 2757 
+ 2621 2653 2705 2727 2734 15315 
+ 2663 2668 2682 2704 
+ 2618 2645 2666 2711 2729 2733 
+ 2655 2661 2677 2686 2717 2718 
+ 2495 2577 2590 2759 2811 2870 
+ 2656 2662 2681 2698 2709 2720 
+ 2648 2664 2675 2707 2728 15316 
+ 2571 2637 2669 2712 2762 2764 
+ 2667 2681 2682 2704 2722 2723 
+ 2612 2658 2715 2736 2766 
+ 2662 2675 2693 2720 2731 15316 
+ 2651 2676 2679 2721 2725 2741 
+ 882 1168 2171 4501 4525 4893 
+ 2630 2665 2671 2732 2738 2778 
+ 2657 2670 2673 2710 2746 2747 
+ 2625 2665 2727 2738 2787 2801 15315 
+ 2682 2689 2696 2723 
+ 2653 2676 2688 2721 2734 2739 
+ 2659 2679 2684 2725 2735 2749 
+ 2664 2684 2694 2728 2735 2760 
+ 2672 2678 2714 2743 
+ 2681 2693 2720 2722 2730 2737 
+ 2670 2677 2702 2717 2747 15318 
+ 2645 2673 2690 2733 2746 2758 
+ 2637 2671 2695 2732 2762 2771 
+ 2507 2641 2674 2774 2809 2828 2868 
+ 2678 2683 2708 2719 2743 2745 
+ 2611 2612 2697 2716 2766 2784 2817 
+ 2611 2614 2715 2740 2784 2788 
+ 2677 2691 2710 2718 2748 15318 
+ 2686 2691 2717 2719 2748 15320 
+ 2683 2686 2714 2718 2745 15320 
+ 2693 2698 2709 2731 2737 15319 
+ 2676 2699 2705 2739 2741 2756 
+ 2681 2696 2709 2723 2730 15317 
+ 2696 2704 2722 15317 
+ 2195 2326 2540 2909 3336 3518 
+ 2679 2699 2706 2741 2749 2779 
+ 2658 2666 2729 2736 2765 2772 
+ 2688 2703 2734 2783 2787 15315 
+ 2694 2707 2744 2760 2773 15316 
+ 2666 2690 2726 2733 2765 2767 
+ 2709 2722 2737 2751 15317 
+ 2698 2720 2744 2763 15316 15319 
+ 2671 2701 2712 2771 2778 2807 
+ 2690 2711 2729 2758 2767 2769 
+ 2688 2705 2727 2739 2775 2783 
+ 2684 2706 2707 2749 2760 2785 2789 
+ 2658 2697 2726 2766 2772 2798 
+ 2709 2720 2730 2751 2770 15319 
+ 2665 2701 2703 2778 2801 15322 
+ 2705 2721 2734 2756 2775 
+ 2614 2687 2716 2757 2788 2819 
+ 2699 2721 2725 2756 2779 2795 
+ 2345 2367 2590 2811 2945 3067 3137 
+ 2708 2714 2745 2782 
+ 2728 2731 2763 2773 2781 15316 
+ 2714 2719 2743 2782 2786 15320 
+ 2673 2702 2711 2747 2758 2799 2804 
+ 2702 2710 2746 2794 2799 15318 
+ 2717 2718 2791 2793 15318 15320 
+ 2706 2725 2735 2779 2785 2816 
+ 2680 2687 2754 2757 2831 2856 
+ 2730 2737 2770 2777 15317 
+ 2606 2641 2753 2809 2854 2901 
+ 2596 2606 2752 2834 2901 2960 
+ 2608 2680 2750 2759 2856 2905 
+ 1962 1984 2685 3305 3759 3960 
+ 2721 2739 2741 2775 2795 2813 
+ 2687 2740 2750 2819 2831 
+ 2711 2733 2746 2769 2804 2808 
+ 2577 2608 2692 2754 2870 2905 2973 
+ 2707 2728 2735 2773 2789 2792 
+ 2639 2674 2768 2774 2857 2863 
+ 2695 2712 2764 2771 2829 2847 
+ 2731 2744 2780 2781 15319 15321 
+ 2669 2695 2762 2768 2847 15323 
+ 2726 2729 2767 2772 2797 2803 
+ 2697 2715 2736 2798 2817 2823 
+ 2729 2733 2765 2769 2803 2806 
+ 2639 2669 2761 2764 2863 15323 
+ 2733 2758 2767 2806 2808 
+ 2737 2751 2777 2780 2796 15319 
+ 2712 2732 2762 2807 2829 
+ 2726 2736 2765 2797 2798 2824 
+ 2728 2744 2760 2781 2792 2802 
+ 2674 2713 2761 2828 2857 
+ 2734 2739 2756 2783 2813 2821 
+ 2333 2557 2638 2923 3019 3122 
+ 2751 2770 2796 
+ 2701 2732 2738 2807 2850 15322 
+ 2725 2741 2749 2795 2816 2841 
+ 2763 2770 2796 2800 15319 15321 
+ 2744 2763 2773 2802 2810 15321 
+ 2743 2745 2786 2822 
+ 2727 2734 2775 2787 2821 2826 
+ 2715 2716 2788 2817 2849 2862 
+ 2735 2749 2789 2812 2816 2839 
+ 2745 2782 2791 2822 2827 15320 
+ 2703 2727 2783 2801 2826 2837 
+ 2716 2740 2784 2819 2849 2861 
+ 2735 2760 2785 2792 2812 2815 
+ 1656 2019 2219 3675 3809 4157 
+ 2748 2786 2793 2827 2832 15320 
+ 2760 2773 2789 2802 2815 2820 
+ 2748 2791 2794 2832 2835 15318 
+ 2747 2793 2799 2835 2840 15318 
+ 2741 2756 2779 2813 2841 2858 
+ 2770 2777 2780 2800 2818 
+ 2765 2772 2803 2824 2833 
+ 2736 2766 2772 2823 2824 2866 
+ 2746 2747 2794 2804 2840 2842 
+ 2780 2796 2814 2818 15321 
+ 2703 2738 2787 2837 2855 15322 
+ 2773 2781 2792 2810 2820 2825 
+ 2765 2767 2797 2806 2833 2838 
+ 2746 2758 2799 2808 2842 2846 
+ 1576 1895 2193 2889 3839 3931 4130 
+ 2767 2769 2803 2808 2838 2845 
+ 2732 2771 2778 2829 2850 2882 
+ 2758 2769 2804 2806 2845 2846 
+ 2641 2713 2752 2854 2868 2916 
+ 2781 2802 2814 2825 2830 15321 
+ 2590 2692 2742 2870 3008 3067 
+ 2785 2789 2815 2839 2843 
+ 2756 2775 2795 2821 2858 2860 
+ 2800 2810 2818 2830 2836 15321 
+ 2789 2792 2812 2820 2843 2844 
+ 2749 2779 2785 2839 2841 2867 2879 
+ 2715 2766 2784 2823 2862 2880 2900 
+ 2796 2800 2814 2836 
+ 2740 2757 2788 2831 2861 2898 
+ 2792 2802 2815 2825 2844 2848 
+ 2775 2783 2813 2826 2860 2869 
+ 2782 2786 2827 2859 
+ 2766 2798 2817 2866 2880 
+ 2772 2797 2798 2833 2866 2877 
+ 2802 2810 2820 2830 2848 2851 
+ 2783 2787 2821 2837 2869 2875 
+ 2786 2791 2822 2832 2859 2872 
+ 2713 2774 2857 2868 15326 
+ 2762 2771 2807 2847 2882 15325 
+ 2810 2814 2825 2836 2851 2853 
+ 2750 2757 2819 2856 2898 2944 
+ 2791 2793 2827 2835 2872 2874 
+ 2797 2803 2824 2838 2877 2881 
+ 2596 2638 2753 2923 2960 3057 
+ 2793 2794 2832 2840 2874 2878 
+ 2814 2818 2830 2853 
+ 2787 2801 2826 2855 2875 2885 
+ 2803 2806 2833 2845 2881 2886 
+ 2785 2812 2816 2843 2864 2867 
+ 2794 2799 2835 2842 2878 2883 
+ 2779 2795 2816 2858 2879 2887 
+ 2799 2804 2840 2846 2883 2884 
+ 2812 2815 2839 2844 2864 2865 
+ 2815 2820 2843 2848 2865 2871 
+ 2806 2808 2838 2846 2886 2888 
+ 2804 2808 2842 2845 2884 2888 
+ 2762 2764 2829 2957 15323 15325 
+ 2820 2825 2844 2851 2871 2873 
+ 2784 2788 2861 2862 2902 2939 
+ 2778 2807 2882 2896 2925 15322 
+ 2825 2830 2848 2853 2873 2876 
+ 2356 2557 2650 3019 3316 3404 
+ 2830 2836 2851 2876 
+ 2752 2809 2901 2916 15329 
+ 2801 2837 2885 2893 2899 15322 
+ 2750 2754 2831 2905 2944 2998 
+ 2761 2774 2828 2863 2952 15326 
+ 2795 2813 2841 2860 2887 2906 2907 2935 
+ 2822 2827 2872 2903 
+ 2813 2821 2858 2869 2907 2918 
+ 2788 2819 2849 2898 2939 2965 
+ 2784 2817 2849 2900 2902 2936 
+ 2761 2768 2857 2952 3005 15323 
+ 2839 2843 2865 2867 2890 2891 
+ 2843 2844 2864 2871 2890 2892 
+ 2798 2823 2824 2877 2880 2929 2930 
+ 2816 2839 2864 2879 2891 2895 
+ 2713 2809 2828 2916 3002 15326 
+ 2821 2826 2860 2875 2912 2918 
+ 2692 2759 2811 2973 3008 3066 
+ 2844 2848 2865 2873 2892 2894 
+ 2827 2832 2859 2874 2903 2908 
+ 2848 2851 2871 2876 2894 2897 
+ 2832 2835 2872 2878 2908 2920 
+ 2826 2837 2869 2885 2912 2915 
+ 2851 2853 2873 2897 
+ 2824 2833 2866 2881 2930 2932 
+ 2835 2840 2874 2883 2920 2924 
+ 2816 2841 2867 2887 2895 2904 15324 
+ 2817 2823 2866 2900 2929 2941 
+ 2833 2838 2877 2886 2931 2932 
+ 2807 2829 2850 2925 2971 15325 
+ 2840 2842 2878 2884 2924 2926 
+ 2842 2846 2883 2888 2926 2928 
+ 2837 2855 2875 2899 2915 2922 
+ 2838 2845 2881 2888 2931 2934 
+ 2841 2858 2879 2906 2921 15324 
+ 2845 2846 2884 2886 2928 2934 
+ 1895 2125 2805 2990 3748 3931 
+ 2864 2865 2891 2892 2910 2913 
+ 2864 2867 2890 2895 2910 2911 
+ 2865 2871 2890 2894 2913 2917 
+ 2855 2896 2899 2933 2938 15322 
+ 2871 2873 2892 2897 2917 2919 
+ 2867 2879 2891 2904 2911 2914 
+ 2850 2893 2925 2938 2968 15322 
+ 2873 2876 2894 2919 
+ 2819 2831 2861 2944 2965 3011 
+ 2855 2885 2893 2922 2933 
+ 2817 2862 2880 2936 2941 2955 
+ 2752 2753 2854 2960 3125 15329 
+ 2849 2862 2936 2939 2967 
+ 2859 2872 2908 2954 
+ 2879 2895 2914 2927 2937 15324 
+ 2754 2759 2856 2973 2998 3060 
+ 2858 2887 2921 2935 2943 
+ 2858 2860 2918 2935 2951 2959 
+ 2872 2874 2903 2920 2954 2963 
+ 2326 2553 2724 3134 3336 3496 
+ 2890 2891 2911 2913 2942 15327 
+ 2891 2895 2910 2914 2940 2942 
+ 2869 2875 2915 2918 2949 2956 15328 
+ 2890 2892 2910 2917 2946 15327 
+ 2895 2904 2911 2937 2940 
+ 2875 2885 2912 2922 2953 2956 
+ 2809 2854 2868 3002 3083 15329 
+ 2892 2894 2913 2919 2946 2947 
+ 2860 2869 2907 2912 2949 2951 2974 
+ 2894 2897 2917 2947 
+ 2874 2878 2908 2924 2963 2972 
+ 2887 2906 2927 2943 2948 15324 
+ 2885 2899 2915 2933 2953 2962 
+ 2638 2776 2834 3057 3122 3206 
+ 2878 2883 2920 2926 2972 2975 
+ 2850 2882 2896 2968 2971 3010 
+ 2883 2884 2924 2928 2975 2977 
+ 2904 2921 2937 2948 2950 15324 
+ 2884 2888 2926 2934 2977 2979 
+ 2866 2880 2930 2941 2986 2989 
+ 2866 2877 2929 2932 2982 2986 
+ 2881 2886 2932 2934 2984 2985 
+ 2877 2881 2930 2931 2982 2985 
+ 2893 2899 2922 2938 2962 2970 
+ 2886 2888 2928 2931 2979 2984 
+ 2858 2906 2907 2943 2959 2981 
+ 2862 2900 2902 2955 2967 2999 
+ 2904 2914 2927 2940 2950 2958 
+ 2893 2896 2933 2968 2970 2992 
+ 2849 2861 2902 2965 2967 3007 
+ 2911 2914 2937 2942 2958 2961 
+ 2880 2900 2929 2955 2978 2989 
+ 2910 2911 2940 2961 2964 15327 
+ 2906 2921 2935 2948 2976 2981 
+ 2831 2856 2898 2998 3011 3068 
+ 2367 2553 2742 3134 3137 3311 3483 
+ 2913 2917 2947 2966 2969 15327 
+ 2917 2919 2946 2969 
+ 2921 2927 2943 2950 2976 2983 
+ 2912 2918 2974 2987 15328 
+ 2927 2937 2948 2958 2983 2988 
+ 2907 2918 2959 2974 2980 15330 
+ 2857 2863 3005 3044 3077 15326 
+ 2915 2922 2956 2962 3000 3014 
+ 2903 2908 2963 3009 
+ 2900 2936 2941 2978 2999 3024 
+ 2912 2915 2953 2994 3000 15328 
+ 2847 3015 3030 15323 15325 15331 
+ 2937 2940 2950 2961 2988 2991 
+ 2907 2935 2951 2980 2981 2996 
+ 2753 2834 2901 3057 3125 3169 
+ 2940 2942 2958 2964 2991 2993 
+ 2922 2933 2953 2970 3014 3029 
+ 2908 2920 2954 2972 3009 3018 
+ 2942 2961 2966 2993 2995 15327 
+ 2861 2898 2939 3007 3011 3062 
+ 2946 2964 2969 2995 2997 15327 
+ 2902 2936 2939 2999 3007 3046 
+ 2896 2925 2938 2992 3010 3031 
+ 2946 2947 2966 2997 
+ 2933 2938 2962 2992 3027 3029 
+ 2882 2925 3010 3015 3042 15325 
+ 2920 2924 2963 2975 3018 3028 
+ 2759 2870 2905 3060 3066 3140 
+ 2918 2949 2951 2987 3004 15330 
+ 2924 2926 2972 2977 3028 3032 
+ 2943 2948 2981 2983 3012 3013 
+ 2926 2928 2975 2979 3032 3035 
+ 2941 2955 2989 3024 3040 
+ 2928 2934 2977 2984 3035 3039 
+ 2951 2959 2996 3006 15330 
+ 2935 2943 2959 2976 2996 3012 3020 
+ 2930 2932 2985 2986 3037 3043 
+ 2948 2950 2976 2988 3013 3016 
+ 2931 2934 2979 2985 3039 3045 
+ 2931 2932 2982 2984 3043 3045 
+ 2929 2930 2982 2989 3037 3038 
+ 2949 2974 2994 3004 3034 15328 
+ 2950 2958 2983 2991 3016 3017 
+ 2929 2941 2978 2986 3038 3040 
+ 2125 2489 2889 3393 3716 3748 
+ 2958 2961 2988 2993 3017 3021 
+ 2938 2968 2970 3027 3031 
+ 2961 2964 2991 2995 3021 3023 
+ 2956 2987 3000 3034 3036 15328 
+ 2964 2966 2993 2997 3023 3026 
+ 2959 2980 2981 3006 3020 3022 
+ 2966 2969 2995 3026 
+ 2856 2905 2944 3060 3068 3141 
+ 2936 2955 2967 3024 3046 3065 
+ 2953 2956 2994 3014 3036 3056 
+ 1882 2261 2312 3994 15350 15355 
+ 2868 2916 3044 3083 3136 15326 
+ 2147 2364 2685 3250 3755 3760 
+ 2974 2987 3025 3034 3055 15330 
+ 2863 2952 3030 3077 3127 15323 15334 
+ 2980 2996 3022 3025 3041 15330 
+ 2939 2965 2967 3046 3062 3100 
+ 2811 2870 3066 3067 3159 3193 
+ 2954 2963 3018 3064 
+ 2925 2968 2971 3031 3042 3069 3082 
+ 2898 2944 2965 3062 3068 3120 
+ 2976 2981 3013 3020 3047 3051 
+ 2976 2983 3012 3016 3047 3048 
+ 2953 2962 3000 3029 3056 3059 
+ 2957 2971 3042 3073 3089 15325 15331 
+ 2983 2988 3013 3017 3048 3049 
+ 2988 2991 3016 3021 3049 3052 
+ 2963 2972 3009 3028 3064 3072 
+ 2557 2776 2852 3122 3404 3407 
+ 2981 2996 3012 3022 3050 3051 
+ 2991 2993 3017 3023 3052 3053 
+ 2996 3006 3020 3041 3050 
+ 2993 2995 3021 3026 3053 3054 
+ 2955 2978 2999 3040 3065 3087 
+ 3004 3006 3041 3055 3058 15330 
+ 2995 2997 3023 3054 
+ 2970 2992 3029 3031 3061 3063 
+ 2972 2975 3018 3032 3072 3081 
+ 2962 2970 3014 3027 3059 3061 3070 
+ 2957 3005 3112 15323 15331 15334 
+ 2968 2992 3010 3027 3063 3082 
+ 2975 2977 3028 3035 3081 3085 
+ 2263 2489 3271 3393 3596 3667 
+ 2987 2994 3004 3036 3055 3080 3084 
+ 2977 2979 3032 3039 3085 3092 
+ 2994 3000 3034 3056 3080 3086 
+ 2982 2986 3038 3043 3093 3097 
+ 2986 2989 3037 3040 3090 3093 
+ 2979 2984 3035 3045 3092 3095 
+ 2978 2989 3024 3038 3087 3090 
+ 3006 3022 3025 3050 3058 15332 
+ 2971 3010 3015 3069 3089 3110 
+ 2982 2985 3037 3045 3097 3099 
+ 2952 3002 3077 3136 3192 15326 
+ 2984 2985 3039 3043 3095 3099 
+ 2967 2999 3007 3065 3100 3118 
+ 3012 3013 3048 3051 3071 15333 
+ 3013 3016 3047 3049 3074 15333 
+ 3016 3017 3048 3052 3074 3076 
+ 3020 3022 3041 3051 3075 15332 
+ 3012 3020 3047 3050 3071 3075 
+ 3017 3021 3049 3053 3076 3078 
+ 3021 3023 3052 3054 3078 3079 
+ 3023 3026 3053 3079 
+ 3004 3025 3034 3058 3084 3088 
+ 3000 3014 3036 3059 3086 3094 
+ 2834 2923 2960 3169 3206 3268 3304 
+ 3025 3041 3055 3088 3096 15332 
+ 3014 3029 3056 3070 3094 3098 
+ 2905 2973 2998 3140 3141 3202 
+ 3027 3029 3063 3070 3091 
+ 2965 3007 3011 3100 3120 3168 
+ 3027 3031 3061 3082 3091 3104 
+ 3009 3018 3072 3117 
+ 2999 3024 3046 3087 3118 3144 
+ 2870 2973 3008 3140 3159 3226 
+ 2742 2811 3008 3137 3193 3196 
+ 2944 2998 3011 3120 3141 3225 
+ 3010 3042 3082 3110 3119 
+ 3029 3059 3061 3091 3098 3109 
+ 3047 3051 3075 3102 3103 15333 
+ 3018 3028 3064 3081 3117 3129 
+ 3015 3089 3114 3146 15331 
+ 3048 3049 3076 3105 3106 15333 
+ 3050 3051 3071 3101 3102 15332 
+ 3049 3052 3074 3078 3106 3107 
+ 2952 3005 3044 3127 3192 3204 
+ 3052 3053 3076 3079 3107 3108 
+ 3053 3054 3078 3108 
+ 3034 3036 3084 3086 3113 3116 
+ 3028 3032 3072 3085 3129 3139 
+ 3010 3031 3063 3069 3104 3119 3135 
+ 2916 3002 3136 3158 3210 15329 
+ 3034 3055 3080 3088 3113 3115 
+ 3032 3035 3081 3092 3139 3142 
+ 3036 3056 3080 3094 3116 3123 
+ 3024 3040 3065 3090 3144 3147 
+ 3055 3058 3084 3096 3115 3121 
+ 3015 3042 3073 3110 3114 3143 
+ 3038 3040 3087 3093 3147 3151 
+ 3061 3063 3070 3104 3109 3111 
+ 3035 3039 3085 3095 3142 3149 
+ 3037 3038 3090 3097 3151 3152 
+ 3056 3059 3086 3098 3123 3126 
+ 3039 3045 3092 3099 3149 3150 
+ 3058 3088 3101 3121 3124 15332 
+ 3037 3043 3093 3099 3152 3153 
+ 3059 3070 3094 3109 3126 3138 
+ 3043 3045 3095 3097 3150 3153 
+ 3007 3046 3062 3118 3168 3191 
+ 3075 3096 3102 3124 3128 15332 
+ 3071 3075 3101 3103 3128 3130 
+ 3071 3102 3105 3130 3131 15333 
+ 3063 3082 3091 3111 3135 3148 
+ 3074 3103 3106 3131 15333 15335 
+ 3074 3076 3105 3107 3133 15335 
+ 3076 3078 3106 3108 3132 3133 
+ 3078 3079 3107 3132 
+ 3070 3091 3098 3111 3138 3145 
+ 3042 3069 3089 3119 3143 3167 
+ 3091 3104 3109 3145 3148 
+ 3030 3146 3176 15331 15334 15337 
+ 3080 3084 3115 3116 3154 15336 
+ 3073 3089 3143 3146 3171 
+ 3084 3088 3113 3121 3154 3155 
+ 3080 3086 3113 3123 3156 15336 
+ 3064 3072 3129 3172 
+ 3046 3065 3100 3144 3191 3198 
+ 3069 3082 3110 3135 3167 3173 
+ 3011 3062 3068 3168 3225 3247 
+ 3088 3096 3115 3124 3155 3157 
+ 2776 2923 3019 3206 3407 3413 
+ 3086 3094 3116 3126 3156 3161 
+ 3096 3101 3121 3128 3157 3160 
+ 2901 2960 3158 3169 3254 3267 15329 
+ 3094 3098 3123 3138 3161 3170 
+ 3005 3077 3174 3204 3223 15334 
+ 3101 3102 3124 3130 3160 3163 
+ 3072 3081 3117 3139 3172 3180 
+ 3102 3103 3128 3131 3163 3165 
+ 3103 3105 3130 3165 3166 15335 
+ 3107 3108 3133 3162 
+ 3106 3107 3132 3162 3164 15335 
+ 2553 2909 2945 3483 3496 3574 
+ 3082 3104 3119 3148 3173 3188 
+ 3002 3044 3083 3192 3210 3251 
+ 2742 2945 3067 3196 3311 3323 
+ 3098 3109 3126 3145 3170 3175 
+ 3081 3085 3129 3142 3180 3190 
+ 2973 3060 3066 3202 3226 3284 
+ 2998 3060 3068 3202 3225 3262 
+ 3085 3092 3139 3149 3190 3195 
+ 3089 3110 3114 3167 3171 3197 
+ 3065 3087 3118 3147 3198 3200 
+ 3109 3111 3138 3148 3175 3189 
+ 3073 3112 3114 3171 3176 3217 15331 
+ 3087 3090 3144 3151 3200 3203 
+ 3104 3111 3135 3145 3188 3189 
+ 3092 3095 3142 3150 3195 3199 
+ 3095 3099 3149 3153 3199 3201 
+ 3090 3093 3147 3152 3203 3208 
+ 3093 3097 3151 3153 3208 3209 
+ 3097 3099 3150 3152 3201 3209 
+ 3113 3115 3155 3178 3179 15336 
+ 3115 3121 3154 3157 3179 3182 
+ 3116 3123 3161 3177 3181 15336 
+ 3121 3124 3155 3160 3182 15338 
+ 3083 3125 3210 3267 3303 15329 
+ 3008 3066 3193 3226 3263 
+ 3124 3128 3157 3163 3186 15338 
+ 3123 3126 3156 3170 3181 3194 
+ 3132 3133 3164 3183 
+ 3128 3130 3160 3165 3186 3187 
+ 3133 3162 3166 3183 3184 15335 
+ 3130 3131 3163 3166 3185 3187 
+ 3131 3164 3165 3184 3185 15335 
+ 3110 3119 3143 3173 3197 3224 
+ 3062 3100 3120 3191 3247 3282 
+ 2960 3057 3125 3254 3268 3320 
+ 3126 3138 3161 3175 3194 3205 
+ 3114 3143 3146 3197 3217 3234 
+ 3117 3129 3180 3227 
+ 3119 3135 3167 3188 3224 3228 
+ 3127 3207 3223 3233 15334 15337 
+ 3138 3145 3170 3189 3205 3229 
+ 3112 3146 3207 3217 3245 15337 
+ 3156 3178 3181 3212 3213 15336 
+ 3154 3177 3179 3213 3215 15336 
+ 3154 3155 3178 3182 3215 3219 
+ 3129 3139 3172 3190 3227 3235 
+ 3156 3161 3177 3194 3211 3212 
+ 3155 3157 3179 3219 3221 15338 
+ 3162 3164 3184 3214 
+ 3164 3166 3183 3185 3214 3216 
+ 3165 3166 3184 3187 3216 3218 
+ 3160 3163 3187 3220 3222 15338 
+ 3163 3165 3185 3186 3218 3220 
+ 3135 3148 3173 3189 3228 3231 
+ 3145 3148 3175 3188 3229 3231 
+ 3139 3142 3180 3195 3235 3246 
+ 3100 3118 3168 3198 3261 3282 
+ 3044 3077 3136 3204 3251 3313 15340 
+ 3008 3067 3159 3196 3263 3298 
+ 3161 3170 3181 3205 3211 3230 
+ 3142 3149 3190 3199 3246 3248 
+ 3067 3137 3193 3298 3323 
+ 3143 3167 3171 3224 3234 3257 
+ 3118 3144 3191 3200 3260 3261 
+ 3149 3150 3195 3201 3248 3252 
+ 3144 3147 3198 3203 3256 3260 
+ 3150 3153 3199 3209 3252 3253 
+ 3060 3140 3141 3262 3284 3334 
+ 3147 3151 3200 3208 3256 3259 
+ 3077 3127 3192 3223 3288 15340 
+ 3170 3175 3194 3229 3230 3249 
+ 2923 3057 3122 3304 3387 3413 
+ 3174 3176 3233 3245 3264 15337 
+ 3151 3152 3203 3209 3258 3259 
+ 3152 3153 3201 3208 3253 3258 
+ 3083 3136 3158 3251 3303 15343 
+ 3181 3194 3212 3230 3232 
+ 3177 3181 3211 3213 3232 3237 
+ 3177 3178 3212 3215 3237 3240 
+ 3183 3184 3216 3236 
+ 3178 3179 3213 3219 3240 3244 
+ 3184 3185 3214 3218 3236 3238 
+ 3146 3171 3176 3234 3245 3270 
+ 3185 3187 3216 3220 3238 3239 
+ 3179 3182 3215 3221 3243 3244 
+ 3186 3187 3218 3222 3239 3241 
+ 3182 3219 3222 3242 3243 15338 
+ 3186 3220 3221 3241 3242 15338 
+ 3127 3174 3204 3233 3288 15339 
+ 3167 3173 3197 3228 3257 3283 
+ 3068 3120 3141 3247 3262 3327 3329 
+ 3066 3140 3159 3263 3284 3333 
+ 3172 3180 3235 3280 
+ 3173 3188 3224 3231 3281 3283 
+ 3175 3189 3205 3231 3249 3278 3279 
+ 3194 3205 3211 3232 3249 3255 
+ 3188 3189 3228 3229 3279 3281 
+ 3211 3212 3230 3237 3255 3265 
+ 3174 3207 3223 3264 15339 
+ 3171 3197 3217 3257 3270 3293 
+ 3180 3190 3227 3246 3280 3286 
+ 3214 3216 3238 3266 
+ 3212 3213 3232 3240 3265 3273 
+ 3216 3218 3236 3239 3266 3269 
+ 3218 3220 3238 3241 3269 3272 
+ 3213 3215 3237 3244 3273 3277 
+ 3220 3222 3239 3242 3272 3274 
+ 3221 3222 3241 3243 3274 3275 
+ 3219 3221 3242 3244 3275 3276 
+ 3215 3219 3240 3243 3276 3277 
+ 3176 3207 3217 3264 3270 3308 
+ 3190 3195 3235 3248 3286 3294 
+ 3120 3168 3225 3282 3329 3339 
+ 3195 3199 3246 3252 3294 3301 
+ 3205 3229 3230 3255 3278 3285 
+ 2364 2650 3003 3316 3760 3777 
+ 3136 3192 3210 3313 3335 15343 
+ 3199 3201 3248 3253 3301 3302 
+ 3201 3209 3252 3258 3302 3306 
+ 3125 3169 3267 3320 3363 
+ 3230 3232 3249 3265 3285 3289 
+ 3200 3203 3259 3260 3310 3312 
+ 3197 3224 3234 3283 3293 15341 
+ 3208 3209 3253 3259 3306 3309 
+ 3203 3208 3256 3258 3309 3310 
+ 3198 3200 3256 3261 3312 3321 
+ 3191 3198 3260 3282 3321 3332 
+ 3141 3202 3225 3327 3334 3378 
+ 3159 3193 3226 3298 3333 3370 
+ 3207 3233 3245 3308 3331 15339 
+ 3232 3237 3255 3273 3289 3295 
+ 3236 3238 3269 3290 
+ 3125 3158 3254 3303 3363 3405 
+ 3057 3169 3304 3320 15345 
+ 3238 3239 3266 3272 3290 3291 
+ 3217 3234 3245 3293 3307 3308 
+ 2263 2540 3033 3518 3667 3869 
+ 3239 3241 3269 3274 3291 3292 
+ 3237 3240 3265 3277 3295 3300 
+ 3241 3242 3272 3275 3292 3296 
+ 3242 3243 3274 3276 3296 3297 
+ 3243 3244 3275 3277 3297 3299 
+ 3240 3244 3273 3276 3299 3300 
+ 3229 3249 3279 3285 3314 3317 
+ 3229 3231 3278 3281 3314 3330 
+ 3227 3235 3286 15344 
+ 3228 3231 3279 3283 3330 3338 
+ 3168 3191 3247 3261 3332 3339 3356 
+ 3224 3228 3257 3281 3338 3361 15341 
+ 3140 3202 3226 3333 3334 3390 
+ 3249 3255 3278 3289 3317 3318 
+ 3235 3246 3280 3294 3337 15344 
+ 446 1168 1987 4501 5174 5181 
+ 3204 3223 3341 3354 15339 15340 
+ 3255 3265 3285 3295 3318 15342 
+ 3266 3269 3291 3315 
+ 3269 3272 3290 3292 3315 3319 
+ 3272 3274 3291 3296 3319 3322 
+ 3234 3257 3270 3307 3342 15341 
+ 3246 3248 3286 3301 3337 3343 
+ 3265 3273 3289 3300 3328 15342 
+ 3274 3275 3292 3297 3322 3324 
+ 3275 3276 3296 3299 3324 3325 
+ 3193 3196 3263 3323 3370 3432 
+ 3276 3277 3297 3300 3325 3326 
+ 3273 3277 3295 3299 3326 3328 
+ 3248 3252 3294 3302 3343 3347 
+ 3252 3253 3301 3306 3347 3355 
+ 3158 3210 3267 3405 3458 15343 
+ 3057 3206 3268 3387 3424 15345 
+ 1984 2261 2755 3960 4172 15355 
+ 3253 3258 3302 3309 3355 3359 
+ 3270 3293 3308 3342 3358 
+ 3245 3264 3270 3307 3331 3358 3386 
+ 3258 3259 3306 3310 3359 3360 
+ 3256 3259 3309 3312 3360 3362 
+ 2945 3137 3323 3483 3501 3606 
+ 3256 3260 3310 3321 3362 3366 
+ 3192 3251 3335 3365 3383 15340 
+ 3278 3279 3317 3330 3353 3357 
+ 3290 3291 3319 3340 
+ 2650 2852 3250 3404 3777 3788 
+ 3278 3285 3314 3318 3348 3353 
+ 3285 3289 3317 3348 3349 15342 
+ 3291 3292 3315 3322 3340 3344 
+ 3169 3254 3268 3363 3438 15345 
+ 3260 3261 3312 3332 3366 3374 
+ 3292 3296 3319 3324 3344 3345 
+ 3137 3196 3298 3311 3432 3501 
+ 3296 3297 3322 3325 3345 3346 
+ 3297 3299 3324 3326 3346 3350 
+ 3299 3300 3325 3328 3350 3351 
+ 3225 3262 3329 3372 3378 3423 
+ 3295 3300 3326 3351 3352 15342 
+ 3225 3247 3327 3339 3372 3385 
+ 3279 3281 3314 3338 3357 3364 
+ 3264 3308 3341 3386 3397 15339 
+ 3261 3282 3321 3356 3374 3389 
+ 3226 3263 3284 3370 3390 3461 
+ 3202 3262 3284 3378 3390 3440 
+ 3251 3313 3383 3398 15343 
+ 2724 2909 3496 3518 3767 3782 
+ 3286 3294 3343 3376 3388 15344 
+ 3281 3283 3330 3361 3364 3382 
+ 3247 3282 3329 3356 3385 3401 
+ 3315 3319 3344 3367 
+ 3288 3331 3354 3397 3410 15339 
+ 3293 3307 3358 3369 3392 15341 
+ 3294 3301 3337 3347 3388 3395 
+ 3319 3322 3340 3345 3367 3368 
+ 3322 3324 3344 3346 3368 3371 
+ 3324 3325 3345 3350 3371 3373 
+ 3301 3302 3343 3355 3395 3400 
+ 3317 3318 3349 3353 3380 3381 
+ 3318 3348 3352 3379 3380 15342 
+ 3325 3326 3346 3351 3373 3375 
+ 3326 3328 3350 3352 3375 3377 
+ 3328 3349 3351 3377 3379 15342 
+ 3314 3317 3348 3357 3381 3384 
+ 3288 3341 3365 3410 3417 15340 
+ 3302 3306 3347 3359 3400 3408 
+ 3282 3332 3339 3389 3401 3418 
+ 3314 3330 3353 3364 3384 3391 
+ 3307 3308 3342 3386 3392 3460 
+ 3306 3309 3355 3360 3408 3414 
+ 3309 3310 3359 3362 3414 3421 
+ 3283 3338 3369 3382 3403 15341 15346 
+ 3310 3312 3360 3366 3421 3426 
+ 3254 3267 3320 3405 3438 3484 
+ 3330 3338 3357 3382 3391 3394 
+ 3313 3354 3383 3417 3420 15340 
+ 3312 3321 3362 3374 3425 3426 
+ 3340 3344 3368 3396 
+ 3344 3345 3367 3371 3396 3399 
+ 3342 3361 3392 3403 3428 15341 
+ 3263 3298 3333 3432 3461 3529 
+ 3345 3346 3368 3373 3399 3402 
+ 3327 3329 3385 3423 3436 
+ 3346 3350 3371 3375 3402 3406 
+ 3321 3332 3366 3389 3425 3427 
+ 3350 3351 3373 3377 3406 3409 
+ 3337 3388 3437 15344 
+ 3351 3352 3375 3379 3409 3412 
+ 3262 3327 3334 3423 3440 3477 
+ 3349 3352 3377 3380 3412 3415 
+ 3348 3349 3379 3381 3415 3416 
+ 3348 3353 3380 3384 3416 3419 
+ 3338 3361 3364 3394 3411 15346 
+ 3313 3335 3365 3398 3420 3463 
+ 3353 3357 3381 3391 3419 3422 
+ 3329 3339 3372 3401 3436 3448 
+ 3308 3331 3358 3397 3460 3469 
+ 3206 3304 3413 3424 3548 
+ 3337 3343 3376 3395 3437 3446 
+ 3332 3356 3374 3418 3427 3453 
+ 3284 3333 3334 3440 3461 3505 
+ 3357 3364 3384 3394 3422 3429 
+ 3342 3358 3369 3428 3460 3462 
+ 2489 2990 3033 3596 3716 3817 
+ 3364 3382 3391 3411 3429 3430 
+ 3343 3347 3388 3400 3446 3459 
+ 3367 3368 3399 3433 
+ 3331 3341 3386 3410 3469 15347 
+ 3335 3383 3458 3463 3514 15343 
+ 3368 3371 3396 3402 3433 3434 
+ 3347 3355 3395 3408 3459 3464 
+ 3339 3356 3385 3418 3448 3456 
+ 3371 3373 3399 3406 3434 3439 
+ 3361 3369 3428 3431 3444 15346 
+ 2852 3019 3316 3407 3788 3802 
+ 3267 3303 3363 3458 3484 3525 
+ 3373 3375 3402 3409 3439 3441 
+ 3019 3122 3404 3413 3623 3802 
+ 3355 3359 3400 3414 3464 3470 
+ 3375 3377 3406 3412 3441 3442 
+ 3341 3354 3397 3417 3486 15347 
+ 3382 3394 3430 3435 15346 
+ 3377 3379 3409 3415 3442 3445 
+ 3122 3206 3387 3407 3548 3623 
+ 3359 3360 3408 3421 3470 3472 
+ 3379 3380 3412 3416 3445 3447 
+ 3380 3381 3415 3419 3447 3450 
+ 3354 3365 3410 3420 3479 3486 
+ 3356 3389 3401 3453 3456 3485 
+ 3381 3384 3416 3422 3450 3451 
+ 3365 3383 3417 3463 3479 
+ 3360 3362 3414 3426 3472 3480 
+ 3384 3391 3419 3429 3451 3452 
+ 3327 3372 3378 3436 3477 15349 
+ 3304 3387 3548 3556 15345 15348 
+ 3366 3374 3426 3427 3466 3481 
+ 3362 3366 3421 3425 3480 3481 
+ 3374 3389 3425 3453 3466 
+ 3369 3392 3403 3444 3462 3473 
+ 3391 3394 3422 3430 3452 3457 
+ 3394 3411 3429 3435 3454 3457 
+ 3403 3443 3444 3449 15346 
+ 3298 3323 3370 3501 3529 3538 
+ 3396 3399 3434 3465 
+ 3399 3402 3433 3439 3465 3467 
+ 3411 3430 3443 3454 3455 15346 
+ 3372 3385 3423 3448 3517 15349 
+ 3376 3388 3446 3494 
+ 3320 3363 3484 3541 15345 15348 
+ 3402 3406 3434 3441 3467 3471 
+ 3334 3378 3390 3477 3505 3532 
+ 3406 3409 3439 3442 3471 3474 
+ 3409 3412 3441 3445 3474 3478 
+ 3431 3435 3449 3455 3468 15346 
+ 3403 3428 3431 3449 3473 3475 
+ 3412 3415 3442 3447 3478 3482 
+ 3388 3395 3437 3459 3494 3498 
+ 3415 3416 3445 3450 3482 3487 
+ 3385 3401 3436 3456 3513 3517 
+ 3431 3443 3444 3468 3475 
+ 3416 3419 3447 3451 3487 3488 
+ 3419 3422 3450 3452 3488 3490 
+ 3422 3429 3451 3457 3489 3490 
+ 3389 3418 3427 3466 3485 3500 
+ 3430 3435 3455 3457 3476 3491 
+ 3435 3443 3454 3468 3476 
+ 3401 3418 3448 3485 3513 
+ 3429 3430 3452 3454 3489 3491 
+ 3303 3398 3405 3514 3525 3591 15343 
+ 3395 3400 3446 3464 3498 3508 
+ 3358 3386 3392 3462 3469 3515 3524 
+ 3333 3370 3390 3505 3529 3611 
+ 3392 3428 3460 3473 3504 3515 
+ 3383 3398 3420 3479 3514 3540 
+ 3400 3408 3459 3470 3508 3516 
+ 3433 3434 3467 3493 
+ 3425 3427 3453 3481 3500 3523 
+ 3434 3439 3465 3471 3493 3495 
+ 3443 3449 3455 3475 3476 3492 
+ 3386 3397 3460 3524 3537 15347 
+ 3408 3414 3464 3472 3516 3520 
+ 3439 3441 3467 3474 3495 3497 
+ 3414 3421 3470 3480 3520 3522 
+ 3428 3444 3462 3475 3504 3512 
+ 3441 3442 3471 3478 3497 3499 
+ 3444 3449 3468 3473 3492 3512 
+ 3454 3455 3468 3491 3492 3503 
+ 3378 3423 3440 3532 3555 15349 
+ 3442 3445 3474 3482 3499 3502 
+ 3417 3420 3463 3486 3540 3551 
+ 3421 3426 3472 3481 3522 3527 
+ 3425 3426 3466 3480 3523 3527 
+ 3445 3447 3478 3487 3502 3507 
+ 2945 3134 3311 3574 3606 3714 3771 
+ 3363 3405 3438 3525 3541 3584 
+ 3418 3453 3456 3500 3513 3559 
+ 3410 3417 3479 3543 3551 15347 
+ 3447 3450 3482 3488 3507 3509 
+ 3450 3451 3487 3490 3509 3511 
+ 3452 3457 3490 3491 3506 3510 
+ 3451 3452 3488 3489 3510 3511 
+ 3454 3457 3476 3489 3503 3506 
+ 3468 3475 3476 3503 3512 15351 
+ 3465 3467 3495 3519 
+ 3437 3446 3498 3539 
+ 3467 3471 3493 3497 3519 3521 
+ 2909 3134 3336 3574 3773 3782 
+ 3471 3474 3495 3499 3521 3526 
+ 3446 3459 3494 3508 3539 3545 
+ 3474 3478 3497 3502 3526 3528 
+ 3453 3466 3485 3523 3559 3566 
+ 3311 3323 3432 3538 3606 3630 
+ 3478 3482 3499 3507 3528 3531 
+ 3476 3491 3492 3506 3530 15351 
+ 3462 3473 3512 3515 3544 3550 
+ 3390 3440 3461 3532 3611 3616 
+ 3489 3491 3503 3510 3530 3534 
+ 3482 3487 3502 3509 3531 3533 
+ 3459 3464 3498 3516 3545 3554 
+ 3487 3488 3507 3511 3533 3535 
+ 3489 3490 3506 3511 3534 3536 
+ 3488 3490 3509 3510 3535 3536 
+ 3473 3475 3492 3504 3544 3547 15351 
+ 3448 3456 3485 3517 3559 3573 
+ 3398 3458 3463 3540 3591 3604 
+ 3460 3462 3504 3524 3550 3564 
+ 3464 3470 3508 3520 3554 3560 
+ 3436 3448 3513 3569 3573 15349 
+ 2540 2724 3271 3336 3767 3869 3898 
+ 3493 3495 3521 3542 
+ 3470 3472 3516 3522 3560 3565 
+ 3495 3497 3519 3526 3542 3546 
+ 3472 3480 3520 3527 3565 3567 
+ 3466 3481 3500 3527 3566 3570 
+ 3460 3469 3515 3537 3564 3577 
+ 3405 3458 3484 3584 3591 3627 
+ 3497 3499 3521 3528 3546 3549 
+ 3480 3481 3522 3523 3567 3570 
+ 3499 3502 3526 3531 3549 3553 
+ 3370 3432 3461 3538 3611 3632 
+ 3503 3506 3534 3552 3558 15351 
+ 3502 3507 3528 3533 3553 3557 
+ 3440 3477 3505 3555 3613 3616 
+ 3507 3509 3531 3535 3557 3561 
+ 3506 3510 3530 3536 3558 3562 
+ 3509 3511 3533 3536 3561 3563 
+ 3510 3511 3534 3535 3562 3563 
+ 3469 3524 3543 3577 3594 15347 
+ 3432 3501 3529 3630 3632 
+ 3494 3498 3545 3582 
+ 3463 3479 3514 3551 3604 3617 
+ 3438 3484 3556 3584 3624 15348 
+ 3519 3521 3546 3568 
+ 3486 3537 3551 3594 3622 15347 
+ 3504 3512 3547 3550 3576 3580 
+ 3498 3508 3539 3554 3582 3588 
+ 3521 3526 3542 3549 3568 3571 
+ 3512 3544 3552 3576 3578 15351 
+ 3387 3413 3424 3556 3623 3648 3749 
+ 3526 3528 3546 3553 3571 3572 
+ 3504 3515 3544 3564 3580 3589 
+ 3479 3486 3540 3543 3617 3622 
+ 3530 3547 3558 3578 3583 15351 
+ 3528 3531 3549 3557 3572 3575 
+ 3508 3516 3545 3560 3588 3593 
+ 3477 3532 3569 3598 3613 15349 
+ 3424 3541 3548 3624 3648 15348 
+ 3531 3533 3553 3561 3575 3579 
+ 3530 3534 3552 3562 3583 3586 
+ 3485 3500 3513 3566 3573 3614 3633 
+ 3516 3520 3554 3565 3593 3597 
+ 3533 3535 3557 3563 3579 3585 
+ 3534 3536 3558 3563 3586 3587 
+ 3535 3536 3561 3562 3585 3587 
+ 3515 3524 3550 3577 3589 3600 
+ 3520 3522 3560 3567 3597 3602 
+ 3500 3523 3559 3570 3612 3614 
+ 3522 3527 3565 3570 3602 3609 
+ 3542 3546 3571 3590 
+ 3517 3555 3573 3598 3619 15349 
+ 3523 3527 3566 3567 3609 3612 
+ 3546 3549 3568 3572 3590 3592 
+ 3549 3553 3571 3575 3592 3595 
+ 3513 3517 3559 3569 3619 3633 
+ 3134 3483 3496 3771 3773 3829 
+ 3553 3557 3572 3579 3595 3599 
+ 3544 3547 3578 3580 3608 15352 
+ 3524 3537 3564 3594 3600 3641 
+ 3547 3552 3576 3583 3607 15352 
+ 3557 3561 3575 3585 3599 3601 
+ 3544 3550 3576 3589 3603 3608 
+ 2219 2312 3809 4134 4251 15350 
+ 3539 3545 3588 3620 
+ 3552 3558 3578 3586 3607 3610 
+ 3484 3525 3541 3624 3627 3663 
+ 3561 3563 3579 3587 3601 3605 
+ 3558 3562 3583 3587 3610 15353 
+ 3562 3563 3585 3586 3605 15353 
+ 3545 3554 3582 3593 3620 3629 
+ 3550 3564 3580 3600 3603 3626 
+ 3568 3571 3592 3615 
+ 3458 3514 3525 3604 3627 3671 3680 
+ 3571 3572 3590 3595 3615 3618 
+ 3554 3560 3588 3597 3629 3639 
+ 3537 3543 3577 3622 3641 3657 
+ 3572 3575 3592 3599 3618 3621 
+ 3033 3393 3667 3817 3889 
+ 3560 3565 3593 3602 3639 3642 
+ 3555 3569 3613 3619 3659 
+ 3575 3579 3595 3601 3621 3625 
+ 3564 3577 3589 3626 3641 3646 
+ 3579 3585 3599 3605 3625 3628 
+ 3565 3567 3597 3609 3642 3645 
+ 3580 3589 3608 3626 3638 
+ 3514 3540 3591 3617 3671 15354 
+ 3585 3587 3601 3628 3631 15353 
+ 3311 3483 3501 3630 3714 3769 
+ 3578 3583 3610 3636 3637 15352 
+ 3576 3580 3603 3635 3638 15352 
+ 3567 3570 3602 3612 3645 3649 
+ 3583 3586 3607 3634 3636 15353 
+ 3461 3505 3529 3616 3632 3705 3722 
+ 3566 3570 3609 3614 3649 3651 
+ 3532 3555 3598 3616 3659 3673 
+ 3559 3566 3612 3633 3651 3666 
+ 3590 3592 3618 3640 
+ 3505 3532 3611 3613 3673 3705 
+ 3540 3551 3604 3622 3686 15354 
+ 3592 3595 3615 3621 3640 3643 
+ 3569 3573 3598 3633 3659 3684 
+ 3582 3588 3629 3661 
+ 3595 3599 3618 3625 3643 3644 
+ 3543 3551 3594 3617 3657 3686 3699 
+ 3407 3413 3548 3749 3802 3867 
+ 3541 3556 3584 3648 3663 3693 
+ 3599 3601 3621 3628 3644 3647 
+ 3589 3600 3603 3638 3646 3655 
+ 3525 3584 3591 3663 3680 3708 
+ 3601 3605 3625 3631 3647 3650 
+ 3588 3593 3620 3639 3661 3664 
+ 3501 3538 3606 3632 3720 3769 
+ 3605 3628 3634 3650 3652 15353 
+ 3529 3538 3611 3630 3720 3722 
+ 3559 3573 3614 3619 3666 3684 3700 
+ 3610 3631 3636 3652 3653 15353 
+ 3608 3637 3638 3654 3658 15352 
+ 3607 3610 3634 3637 3653 3656 
+ 3607 3635 3636 3656 3658 15352 
+ 3603 3608 3626 3635 3654 3655 
+ 3593 3597 3629 3642 3664 3669 
+ 3615 3618 3643 3660 
+ 3577 3594 3600 3646 3657 3676 3691 
+ 3597 3602 3639 3645 3669 3674 
+ 3618 3621 3640 3644 3660 3662 
+ 3621 3625 3643 3647 3662 3665 
+ 3602 3609 3642 3649 3674 3685 
+ 3600 3626 3641 3655 3676 3679 
+ 3625 3628 3644 3650 3665 3668 
+ 3548 3556 3624 3693 3749 3779 
+ 3609 3612 3645 3651 3685 3689 
+ 3628 3631 3647 3652 3668 3670 
+ 3612 3614 3649 3666 3689 3696 
+ 3631 3634 3650 3653 3670 3672 
+ 3634 3636 3652 3656 3672 3677 
+ 3635 3638 3655 3658 3681 3683 
+ 3626 3638 3646 3654 3679 3681 
+ 3636 3637 3653 3658 3677 3682 
+ 3594 3622 3641 3691 3699 3719 
+ 3635 3637 3654 3656 3682 3683 
+ 3598 3613 3619 3673 3684 3725 
+ 3640 3643 3662 3678 
+ 3620 3629 3664 3694 
+ 3643 3644 3660 3665 3678 3687 
+ 3584 3624 3627 3693 3708 3718 
+ 3629 3639 3661 3669 3694 3702 
+ 3644 3647 3662 3668 3687 3688 
+ 3614 3633 3651 3696 3700 3709 
+ 3033 3271 3596 3869 3889 3979 
+ 3647 3650 3665 3670 3688 3692 
+ 3639 3642 3664 3674 3702 3711 
+ 3650 3652 3668 3672 3692 3695 
+ 3591 3604 3680 3729 3734 15354 
+ 3652 3653 3670 3677 3695 3698 
+ 3613 3616 3659 3705 3725 3795 
+ 3642 3645 3669 3685 3711 3715 
+ 2019 2447 2790 4157 4463 15364 
+ 3641 3646 3679 3691 3712 3724 
+ 3653 3656 3672 3682 3698 3703 
+ 3660 3662 3687 3701 
+ 3646 3655 3676 3681 3710 3712 
+ 3591 3627 3671 3708 3734 3750 
+ 3654 3655 3679 3683 3706 3710 
+ 3656 3658 3677 3683 3703 3704 
+ 3654 3658 3681 3682 3704 3706 
+ 3619 3633 3659 3700 3725 3754 
+ 3645 3649 3674 3689 3715 3723 
+ 3617 3622 3699 3732 3738 15354 
+ 3662 3665 3678 3688 3701 3707 
+ 3665 3668 3687 3692 3707 3713 
+ 3649 3651 3685 3696 3723 3730 
+ 2073 2193 3813 3839 4440 4509 
+ 3641 3657 3676 3719 3724 3741 
+ 3668 3670 3688 3695 3713 3717 
+ 3624 3648 3663 3718 3779 3783 
+ 3661 3664 3702 3735 
+ 3670 3672 3692 3698 3717 3721 
+ 3651 3666 3689 3709 3730 3739 
+ 293 1146 2565 4176 4830 5050 
+ 3672 3677 3695 3703 3721 3726 
+ 3622 3657 3686 3719 3738 3746 
+ 3633 3666 3684 3709 3744 3754 
+ 3678 3687 3707 3727 
+ 3664 3669 3694 3711 3735 3743 
+ 3677 3682 3698 3704 3726 3728 
+ 3682 3683 3703 3706 3728 3733 
+ 3611 3616 3673 3722 3795 3798 
+ 3681 3683 3704 3710 3733 3736 
+ 3687 3688 3701 3713 3727 3731 
+ 3627 3663 3680 3718 3750 3766 
+ 3666 3696 3700 3739 3744 
+ 3679 3681 3706 3712 3736 3740 
+ 3669 3674 3702 3715 3743 3751 
+ 3676 3679 3710 3724 3740 3747 
+ 3688 3692 3707 3717 3731 3737 
+ 3483 3606 3769 3771 3856 3885 
+ 3674 3685 3711 3723 3751 3756 
+ 2990 3393 3748 3817 4044 4097 
+ 3692 3695 3713 3721 3737 3742 
+ 3663 3693 3708 3766 3783 
+ 3657 3691 3699 3741 3746 3765 
+ 3630 3632 3722 3769 3811 3862 
+ 3695 3698 3717 3726 3742 3745 
+ 3611 3632 3705 3720 3798 3811 
+ 3685 3689 3715 3730 3756 3762 
+ 3676 3691 3712 3741 3747 3764 
+ 3659 3673 3684 3754 3795 3807 
+ 3698 3703 3721 3728 3745 3753 
+ 3701 3707 3731 3752 
+ 3703 3704 3726 3733 3753 3758 
+ 3671 3732 3734 3781 15354 15356 
+ 3689 3696 3723 3739 3762 3768 
+ 3707 3713 3727 3737 3752 3757 
+ 3686 3729 3738 15354 15356 15357 
+ 3704 3706 3728 3736 3758 3761 
+ 3671 3680 3729 3750 3781 3791 
+ 3694 3702 3743 3778 
+ 3706 3710 3733 3740 3761 3770 
+ 3713 3717 3731 3742 3757 3763 
+ 3686 3699 3732 3746 3789 15357 
+ 3696 3709 3730 3744 3768 3774 
+ 3710 3712 3736 3747 3770 3776 
+ 3691 3719 3724 3764 3765 3786 
+ 3717 3721 3737 3745 3763 3772 
+ 3702 3711 3735 3751 3778 3790 
+ 3700 3709 3739 3754 3774 3799 
+ 3721 3726 3742 3753 3772 3775 
+ 3699 3719 3738 3765 3784 3789 
+ 3712 3724 3740 3764 3776 3792 
+ 2889 2990 3716 3931 4097 4203 
+ 3548 3623 3648 3779 3867 3924 
+ 3680 3708 3734 3766 3791 3804 
+ 3711 3715 3743 3756 3790 3797 
+ 3727 3731 3757 3780 
+ 3726 3728 3745 3758 3775 3785 
+ 3684 3700 3725 3744 3799 3807 3841 
+ 2685 3003 3759 3760 4129 4193 
+ 3715 3723 3751 3762 3797 3801 
+ 3731 3737 3752 3763 3780 3787 
+ 3728 3733 3753 3761 3785 3793 
+ 2685 2755 3755 3960 4193 4294 
+ 3003 3250 3755 3777 4065 4129 
+ 3733 3736 3758 3770 3793 3796 
+ 3723 3730 3756 3768 3801 3810 
+ 3737 3742 3757 3772 3787 3794 
+ 3724 3741 3747 3786 3792 3806 
+ 3719 3741 3746 3784 3786 3808 
+ 3708 3718 3750 3783 3804 3837 
+ 3336 3518 3782 3898 3916 4002 
+ 3730 3739 3762 3774 3800 3810 
+ 3606 3630 3714 3720 3862 3885 3921 
+ 3736 3740 3761 3776 3796 3805 
+ 3483 3574 3714 3829 3856 3928 
+ 3742 3745 3763 3775 3794 3803 
+ 3496 3574 3782 3829 3958 3964 
+ 3739 3744 3768 3799 3800 3825 
+ 3745 3753 3772 3785 3803 3812 
+ 3740 3747 3770 3792 3805 3815 
+ 3250 3316 3760 3788 4065 4072 
+ 3735 3743 3790 3824 
+ 3648 3693 3749 3783 3870 3924 
+ 3752 3757 3787 3814 
+ 3729 3734 3791 3827 3831 15356 
+ 3336 3496 3767 3773 3916 3958 
+ 3693 3718 3766 3779 3837 3870 
+ 3746 3765 3789 3808 3819 
+ 3753 3758 3775 3793 3812 3816 
+ 3741 3764 3765 3806 3808 3822 
+ 3757 3763 3780 3794 3814 3818 
+ 3316 3404 3777 3802 4036 4072 
+ 3738 3746 3784 3819 3848 15357 
+ 3743 3751 3778 3797 3824 3830 
+ 3734 3750 3781 3804 3827 3838 
+ 3747 3764 3776 3806 3815 3820 
+ 3758 3761 3785 3796 3816 3821 
+ 3763 3772 3787 3803 3818 3823 
+ 3673 3705 3725 3798 3807 3880 3891 
+ 3761 3770 3793 3805 3821 3826 
+ 3751 3756 3790 3801 3830 3842 
+ 3705 3722 3795 3811 3865 3891 
+ 3744 3754 3774 3825 3841 3857 
+ 3768 3774 3810 3825 3844 
+ 3756 3762 3797 3810 3842 3843 
+ 3404 3407 3623 3788 3867 4014 4036 
+ 3772 3775 3794 3812 3823 3828 
+ 3750 3766 3791 3837 3838 
+ 3770 3776 3796 3815 3826 3832 
+ 3764 3786 3792 3820 3822 3834 
+ 3725 3754 3795 3841 3880 3892 
+ 3765 3784 3786 3819 3822 3840 
+ 2219 2790 3581 4157 4251 4365 
+ 3762 3768 3800 3801 3843 3844 
+ 3720 3722 3798 3862 3865 
+ 3775 3785 3803 3816 3828 3836 
+ 2073 2171 3690 4509 4525 4706 
+ 3780 3787 3818 3833 
+ 3776 3792 3805 3820 3832 3835 
+ 3785 3793 3812 3821 3836 3847 
+ 3393 3596 3716 3889 3996 4044 
+ 3787 3794 3814 3823 3833 3845 
+ 3784 3789 3808 3840 3848 3863 
+ 3792 3806 3815 3834 3835 3846 
+ 3793 3796 3816 3826 3847 3849 
+ 3786 3806 3808 3834 3840 3851 
+ 3794 3803 3818 3828 3845 3850 
+ 3778 3790 3830 3861 
+ 3774 3799 3800 3844 3857 3871 
+ 3796 3805 3821 3832 3849 3852 
+ 3781 3791 3831 3838 3864 3886 
+ 3803 3812 3823 3836 3850 3853 
+ 3574 3771 3773 3928 3964 3987 
+ 3790 3797 3824 3842 3861 3868 
+ 3781 3827 3864 3874 15356 15358 
+ 3805 3815 3826 3835 3852 3854 
+ 3814 3818 3845 3858 
+ 3806 3820 3822 3846 3851 3859 
+ 3815 3820 3832 3846 3854 3855 
+ 3812 3816 3828 3847 3853 3860 
+ 3766 3783 3804 3838 3870 3912 
+ 3791 3804 3827 3837 3886 3912 
+ 2193 2805 3690 4130 4440 4467 
+ 3808 3819 3822 3851 3863 3872 
+ 3754 3799 3807 3857 3892 3899 
+ 3797 3801 3830 3843 3868 3877 
+ 3801 3810 3842 3844 3876 3877 
+ 3800 3810 3825 3843 3871 3876 
+ 3818 3823 3833 3850 3858 15359 
+ 3820 3834 3835 3855 3859 
+ 3816 3821 3836 3849 3860 3866 
+ 3789 3819 3863 3910 15357 15358 15360 
+ 3821 3826 3847 3852 3866 3875 
+ 3823 3828 3845 3853 3873 15359 
+ 3822 3834 3840 3859 3872 3883 
+ 3826 3832 3849 3854 3875 3879 
+ 3828 3836 3850 3860 3873 3881 
+ 3832 3835 3852 3855 3879 3882 
+ 3835 3846 3854 3859 3882 3884 
+ 3714 3771 3885 3928 3973 
+ 3799 3825 3841 3871 3899 3907 
+ 3833 3845 3887 15359 
+ 3834 3846 3851 3855 3883 3884 
+ 3836 3847 3853 3866 3881 3888 
+ 3824 3830 3868 3896 
+ 3720 3769 3811 3865 3921 3953 
+ 3819 3840 3848 3872 3908 3910 
+ 3827 3831 3874 3886 3897 
+ 3798 3811 3862 3891 3948 3953 
+ 3847 3849 3860 3875 3888 3893 
+ 3623 3749 3802 3924 4014 4026 
+ 3830 3842 3861 3877 3896 3906 
+ 3271 3518 3667 3898 3979 4093 4133 
+ 3779 3783 3837 3912 3924 3962 
+ 3825 3844 3857 3876 3907 3911 
+ 3840 3851 3863 3883 3904 3908 
+ 3850 3853 3881 3890 3894 15359 
+ 3831 3864 3897 3915 15358 15360 
+ 3849 3852 3866 3879 3893 3895 
+ 3843 3844 3871 3877 3911 3913 
+ 3842 3843 3868 3876 3906 3913 
+ 295 460 2565 4888 5317 5611 
+ 3852 3854 3875 3882 3895 3900 
+ 3795 3807 3891 3892 3940 3944 
+ 3853 3860 3873 3888 3894 3902 
+ 3854 3855 3879 3884 3900 3901 
+ 3851 3859 3872 3884 3903 3904 
+ 3855 3859 3882 3883 3901 3903 
+ 3714 3769 3856 3921 3973 4003 
+ 3827 3838 3864 3897 3912 3930 
+ 3858 3890 3905 15359 
+ 3860 3866 3881 3893 3902 3909 
+ 3596 3667 3817 3979 3996 4108 
+ 3873 3887 3894 3905 3914 15359 
+ 3795 3798 3865 3880 3944 3948 
+ 3807 3841 3880 3899 3940 3941 
+ 3866 3875 3888 3895 3909 3917 
+ 3873 3881 3890 3902 3914 3918 
+ 3875 3879 3893 3900 3917 3919 
+ 3861 3868 3906 3934 
+ 3864 3874 3886 3915 3930 3935 
+ 3518 3767 3869 4002 4093 4118 
+ 3841 3857 3892 3907 3941 3942 
+ 3879 3882 3895 3901 3919 3920 
+ 3882 3884 3900 3903 3920 3923 
+ 3881 3888 3894 3909 3918 3922 
+ 3883 3884 3901 3904 3923 3926 
+ 3872 3883 3903 3908 3926 3932 
+ 3887 3890 3914 3925 
+ 3868 3877 3896 3913 3934 3938 
+ 3857 3871 3899 3911 3942 3946 
+ 3863 3872 3904 3910 3932 15361 
+ 3888 3893 3902 3917 3922 3929 
+ 3848 3863 3908 3927 3957 15360 15361 
+ 3871 3876 3907 3913 3945 3946 
+ 3837 3838 3870 3886 3930 3962 4004 
+ 3876 3877 3906 3911 3938 3945 
+ 3890 3894 3905 3918 3925 3933 
+ 3874 3897 3927 3935 3951 15360 
+ 3767 3782 3958 4002 4064 
+ 3893 3895 3909 3919 3929 3936 
+ 3894 3902 3914 3922 3933 3937 
+ 3895 3900 3917 3920 3936 3939 
+ 3900 3901 3919 3923 3939 3943 
+ 3769 3862 3885 3953 4003 4058 
+ 3902 3909 3918 3929 3937 3947 
+ 3901 3903 3920 3926 3943 3950 
+ 3749 3779 3867 3870 3962 4026 4052 
+ 3905 3914 3933 3949 
+ 3903 3904 3923 3932 3950 3954 
+ 3910 3915 3951 3957 3967 15360 
+ 3771 3829 3856 3973 3987 4048 
+ 3909 3917 3922 3936 3947 3952 
+ 3886 3897 3912 3935 4004 15362 
+ 2805 2889 3748 4130 4203 4357 
+ 3904 3908 3926 3954 3959 15361 
+ 3914 3918 3925 3937 3949 3955 
+ 3896 3906 3938 3969 
+ 3897 3915 3930 3951 15362 
+ 3917 3919 3929 3939 3952 3956 
+ 3918 3922 3933 3947 3955 3961 
+ 3906 3913 3934 3945 3969 3975 
+ 3919 3920 3936 3943 3956 3963 
+ 3880 3892 3941 3944 3985 3988 
+ 3892 3899 3940 3942 3984 3985 
+ 3899 3907 3941 3946 3982 3984 
+ 3920 3923 3939 3950 3963 3965 
+ 3880 3891 3940 3948 3988 3997 
+ 3911 3913 3938 3946 3975 3978 
+ 3907 3911 3942 3945 3978 3982 
+ 3922 3929 3937 3952 3961 3966 
+ 3865 3891 3944 3953 3997 4006 
+ 3925 3933 3955 3968 
+ 3923 3926 3943 3954 3965 3971 
+ 3915 3927 3935 3967 3981 15362 
+ 3929 3936 3947 3956 3966 3972 
+ 3862 3865 3921 3948 4006 4050 4058 
+ 3926 3932 3950 3959 3971 3976 
+ 3933 3937 3949 3961 3968 3974 
+ 3936 3939 3952 3963 3972 3977 
+ 3910 3927 3967 3970 3990 3993 15361 
+ 3773 3782 3916 3964 4064 4099 
+ 3932 3954 3970 3976 3986 15361 
+ 2755 3305 3759 4172 4294 4436 
+ 3937 3947 3955 3966 3974 3980 
+ 3870 3912 3924 4004 4052 4066 
+ 3939 3943 3956 3965 3977 3983 
+ 3773 3829 3958 3987 4099 4100 
+ 3943 3950 3963 3971 3983 3992 
+ 3947 3952 3961 3972 3980 3989 
+ 3927 3951 3957 3981 3993 3998 
+ 3949 3955 3974 3991 
+ 3934 3938 3975 4009 
+ 3957 3959 3986 3990 3995 15361 
+ 3950 3954 3965 3976 3992 4000 
+ 3952 3956 3966 3977 3989 3999 
+ 3856 3885 3928 4003 4048 4083 
+ 3955 3961 3968 3980 3991 4001 
+ 3938 3945 3969 3978 4009 4020 
+ 3954 3959 3971 3986 4000 4005 
+ 3956 3963 3972 3983 3999 15363 
+ 3945 3946 3975 3982 4020 4024 
+ 3667 3869 3889 4108 4133 4220 
+ 3961 3966 3974 3989 4001 4008 
+ 3951 3967 3998 4007 4018 15362 
+ 3942 3946 3978 3984 4024 4028 
+ 3963 3965 3977 3992 4012 15363 
+ 3941 3942 3982 3985 4028 4034 
+ 3940 3941 3984 3988 4031 4034 
+ 3959 3970 3976 3995 4005 4011 
+ 3829 3928 3964 4048 4100 4109 
+ 3940 3944 3985 3997 4031 4035 
+ 3966 3972 3980 3999 4008 4015 
+ 3957 3970 3993 3995 4010 4013 
+ 3968 3974 4001 4016 
+ 3965 3971 3983 4000 4012 4019 
+ 3957 3967 3990 3998 4013 4017 
+ 3001 4134 4323 4485 15350 15355 
+ 3970 3986 3990 4010 4011 
+ 3817 3889 4044 4108 4190 
+ 3944 3948 3988 4006 4035 4037 
+ 3967 3981 3993 4017 4018 
+ 3972 3977 3989 4015 4021 15363 
+ 3971 3976 3992 4005 4019 4022 
+ 3974 3980 3991 4008 4016 4023 
+ 3767 3898 3916 4064 4118 4178 
+ 3885 3921 3973 4058 4083 4115 
+ 3912 3930 3962 4007 4057 4066 4084 15362 
+ 3976 3986 4000 4011 4022 4025 
+ 3948 3953 3997 4037 4050 4069 
+ 3981 4004 4018 4042 4057 15362 
+ 3980 3989 4001 4015 4023 4032 
+ 3969 3975 4020 4054 
+ 3990 3995 4011 4013 4027 4033 
+ 3986 3995 4005 4010 4025 4033 
+ 3983 3992 4019 4030 4038 15363 
+ 3990 3993 4010 4017 4027 4029 
+ 3802 3867 4026 4036 4150 4179 
+ 3989 3999 4008 4021 4032 4040 
+ 3991 4001 4023 4039 
+ 3993 3998 4013 4018 4029 4047 
+ 3981 3998 4007 4017 4042 4047 
+ 3992 4000 4012 4022 4038 4041 
+ 3975 3978 4009 4024 4054 4060 
+ 3999 4015 4030 4040 4045 15363 
+ 4000 4005 4019 4025 4041 4043 
+ 4001 4008 4016 4032 4039 4046 
+ 3978 3982 4020 4028 4060 4067 
+ 4005 4011 4022 4033 4043 4049 
+ 3867 3924 4014 4052 4145 4150 
+ 4010 4013 4029 4033 4051 4053 
+ 3982 3984 4024 4034 4067 4073 
+ 4013 4017 4027 4047 4051 
+ 4012 4021 4038 4045 4055 15363 
+ 3985 3988 4034 4035 4076 4078 
+ 4008 4015 4023 4040 4046 4056 
+ 4010 4011 4025 4027 4049 4053 
+ 3984 3985 4028 4031 4073 4078 
+ 3988 3997 4031 4037 4075 4076 
+ 3788 3802 4014 4072 4179 4248 
+ 3997 4006 4035 4069 4075 
+ 4012 4019 4030 4041 4055 4059 
+ 4016 4023 4046 4061 
+ 4015 4021 4032 4045 4056 4062 
+ 4019 4022 4038 4043 4059 4063 
+ 4007 4018 4047 4057 4081 4088 
+ 4022 4025 4041 4049 4063 4068 
+ 3716 3817 3996 4097 4190 4296 
+ 4021 4030 4040 4055 4062 4070 
+ 4023 4032 4039 4056 4061 4071 
+ 4017 4018 4029 4042 4051 4080 4081 
+ 3928 3973 3987 4083 4109 4138 
+ 4025 4033 4043 4053 4068 4074 
+ 3953 4006 4058 4069 4113 4125 
+ 4027 4029 4047 4053 4077 4080 
+ 3924 3962 4026 4066 4141 4145 
+ 4027 4033 4049 4051 4074 4077 
+ 4009 4020 4060 4094 
+ 4030 4038 4045 4059 4070 4079 
+ 4032 4040 4046 4062 4071 4082 
+ 4004 4007 4042 4084 4088 4105 
+ 3921 3953 4003 4050 4115 4125 4162 
+ 4038 4041 4055 4063 4079 4085 
+ 4020 4024 4054 4067 4094 4101 
+ 4039 4046 4071 4086 
+ 4040 4045 4056 4070 4082 4087 
+ 4041 4043 4059 4068 4085 4089 
+ 3916 3958 4002 4099 4178 4202 
+ 3760 3777 4072 4129 4253 4353 
+ 3962 4004 4052 4084 4141 4142 
+ 4024 4028 4060 4073 4101 4107 
+ 4043 4049 4063 4074 4089 4090 
+ 4006 4037 4050 4075 4113 4120 
+ 4045 4055 4062 4079 4087 4092 
+ 4046 4056 4061 4082 4086 4091 
+ 3777 3788 4036 4065 4248 4253 
+ 4028 4034 4067 4078 4107 4112 
+ 4049 4053 4068 4077 4090 4095 
+ 4035 4037 4069 4076 4120 15366 
+ 4031 4035 4075 4078 4119 15366 
+ 4051 4053 4074 4080 4095 15365 
+ 4031 4034 4073 4076 4112 4119 
+ 4055 4059 4070 4085 4092 4096 
+ 4047 4051 4077 4081 4102 15365 
+ 4042 4047 4080 4088 4102 4110 
+ 4056 4062 4071 4087 4091 4098 
+ 3973 4003 4048 4115 4138 4166 
+ 4004 4057 4066 4105 4137 4142 
+ 4059 4063 4079 4089 4096 4103 
+ 4061 4071 4091 4104 
+ 4062 4070 4082 4092 4098 4106 
+ 4042 4057 4081 4105 4110 4121 
+ 4063 4068 4085 4090 4103 4111 
+ 4068 4074 4089 4095 4111 4117 
+ 4071 4082 4086 4098 4104 4114 
+ 4070 4079 4087 4096 4106 4116 
+ 3869 3898 4118 4133 4264 4276 
+ 4054 4060 4101 4135 
+ 4074 4077 4090 4117 4122 15365 
+ 4079 4085 4092 4103 4116 4123 
+ 3716 3748 4044 4203 4296 4387 
+ 4082 4087 4091 4106 4114 4124 
+ 3958 3964 4064 4100 4202 4227 
+ 3964 3987 4099 4109 4206 4227 
+ 4060 4067 4094 4107 4135 4146 
+ 4080 4081 4110 4126 4132 15365 
+ 4085 4089 4096 4111 4123 4128 
+ 4086 4091 4114 4127 
+ 4057 4084 4088 4121 4137 4151 
+ 4087 4092 4098 4116 4124 4131 
+ 4067 4073 4101 4112 4146 4153 
+ 3889 3979 3996 4190 4220 4278 
+ 3987 4048 4100 4138 4206 4210 
+ 4081 4088 4102 4121 4132 4143 
+ 4089 4090 4103 4117 4128 4136 
+ 4073 4078 4107 4119 4153 4159 
+ 4050 4069 4120 4125 4171 4175 
+ 4091 4098 4104 4124 4127 4139 
+ 4003 4058 4083 4162 4166 4207 
+ 4092 4096 4106 4123 4131 4140 
+ 4090 4095 4111 4122 4136 4144 
+ 3898 4002 4093 4178 4264 4286 
+ 4076 4078 4112 4159 4164 15366 
+ 4069 4075 4113 4168 4171 15366 
+ 4088 4105 4110 4143 4151 
+ 4095 4117 4126 4144 4148 15365 
+ 4096 4103 4116 4128 4140 4149 
+ 4098 4106 4114 4131 4139 4147 
+ 4050 4058 4113 4162 4175 4196 
+ 4102 4122 4132 4148 4154 15365 
+ 4104 4114 4139 4152 
+ 4103 4111 4123 4136 4149 4155 
+ 3755 3760 4065 4193 4353 4428 
+ 2805 3839 3931 4357 4467 4528 
+ 4106 4116 4124 4140 4147 4156 
+ 4102 4110 4126 4143 4154 4158 
+ 3869 3979 4093 4220 4276 4287 
+ 3581 3994 4251 4485 4522 15350 
+ 4094 4101 4146 4181 
+ 4111 4117 4128 4144 4155 4160 
+ 4084 4105 4142 4151 4180 4191 
+ 4048 4083 4109 4166 4199 4210 
+ 4114 4124 4127 4147 4152 4161 
+ 4116 4123 4131 4149 4156 4165 
+ 4052 4066 4142 4145 4218 4255 
+ 4066 4084 4137 4141 4191 4218 
+ 4110 4121 4132 4151 4158 4163 
+ 4117 4122 4136 4148 4160 4167 
+ 4026 4052 4141 4150 4255 4263 
+ 4101 4107 4135 4153 4181 4189 
+ 4124 4131 4139 4156 4161 4170 
+ 4122 4126 4144 4154 4167 4174 
+ 4123 4128 4140 4155 4165 4173 
+ 4014 4026 4145 4179 4263 4269 
+ 4105 4121 4137 4143 4163 4180 4185 
+ 4127 4139 4161 4177 
+ 4107 4112 4146 4159 4189 4198 
+ 4126 4132 4148 4158 4174 4184 
+ 4128 4136 4149 4160 4173 15367 
+ 4131 4140 4147 4165 4170 4183 
+ 2790 3675 3809 4365 4463 4600 
+ 4132 4143 4154 4163 4182 4184 
+ 4112 4119 4153 4164 4198 4205 
+ 4136 4144 4155 4167 4187 15367 
+ 4139 4147 4152 4170 4177 4186 
+ 4058 4115 4125 4196 4207 4238 
+ 4143 4151 4158 4182 4185 
+ 4119 4159 4168 4205 4213 15366 
+ 4140 4149 4156 4173 4183 4188 
+ 4083 4115 4138 4199 4207 4237 
+ 4144 4148 4160 4174 4187 4192 
+ 4120 4164 4171 4213 4219 15366 
+ 2078 2587 4383 4762 4894 15364 
+ 4147 4156 4161 4183 4186 4194 
+ 4113 4120 4168 4175 4219 4226 
+ 3305 3960 4323 4436 4535 15355 
+ 4149 4155 4165 4188 4195 15367 
+ 4148 4154 4167 4184 4192 4197 
+ 4113 4125 4171 4196 4226 4233 
+ 1146 2062 3697 5050 5180 15374 
+ 4152 4161 4186 4200 
+ 4002 4064 4118 4202 4286 4343 
+ 4014 4036 4150 4248 4269 4346 
+ 4137 4151 4185 4191 4216 4217 
+ 4135 4146 4189 4225 
+ 4158 4163 4184 4185 4209 4212 
+ 4156 4165 4170 4188 4194 4204 
+ 4154 4158 4174 4182 4197 4209 
+ 4151 4163 4180 4182 4212 4216 
+ 4161 4170 4177 4194 4200 4211 
+ 4160 4167 4192 4208 4214 15367 
+ 4165 4173 4183 4195 4204 4215 
+ 4146 4153 4181 4198 4225 4234 
+ 3996 4044 4108 4278 4296 4433 
+ 4137 4142 4180 4217 4218 4240 
+ 4167 4174 4187 4197 4214 4221 
+ 3755 3759 4129 4294 4428 4526 
+ 4170 4183 4186 4204 4211 4222 
+ 4173 4188 4208 4215 4223 15367 
+ 4125 4162 4175 4233 4238 4243 
+ 4174 4184 4192 4209 4221 4228 
+ 4153 4159 4189 4205 4234 4241 
+ 4138 4166 4210 4237 4262 
+ 4177 4186 4211 4224 
+ 203 275 1438 5293 7003 7847 
+ 4064 4099 4178 4227 4316 4343 
+ 3748 3931 4097 4357 4387 4503 
+ 4183 4188 4194 4215 4222 4229 
+ 4159 4164 4198 4213 4241 4249 
+ 4100 4109 4210 4227 4277 4330 
+ 4115 4162 4166 4237 4238 4265 
+ 4187 4195 4214 4223 4230 15367 
+ 4182 4184 4197 4212 4228 4232 
+ 4109 4138 4199 4206 4262 4277 
+ 4186 4194 4200 4222 4224 4231 
+ 4182 4185 4209 4216 4232 4247 
+ 4164 4168 4205 4219 4249 4257 
+ 4187 4192 4208 4221 4230 4235 
+ 4188 4195 4204 4223 4229 4236 
+ 4180 4185 4212 4217 4246 4247 
+ 4180 4191 4216 4240 4246 
+ 4141 4142 4191 4240 4255 4267 4293 
+ 4168 4171 4213 4226 4257 4260 
+ 3979 4108 4133 4278 4287 4373 
+ 4192 4197 4214 4228 4235 4242 
+ 4194 4204 4211 4229 4231 4239 
+ 4195 4208 4215 4230 4236 4244 
+ 4200 4211 4231 4245 
+ 4181 4189 4234 4268 
+ 4171 4175 4219 4233 4260 4270 
+ 4099 4100 4202 4206 4316 4330 
+ 4197 4209 4221 4232 4242 4252 
+ 4204 4215 4222 4236 4239 4250 
+ 4208 4214 4223 4235 4244 4254 
+ 4211 4222 4224 4239 4245 4256 
+ 4209 4212 4228 4247 4252 4261 
+ 4175 4196 4226 4243 4270 4283 
+ 4189 4198 4225 4241 4268 4280 
+ 4214 4221 4230 4242 4254 4259 
+ 4215 4223 4229 4244 4250 4258 
+ 4166 4199 4207 4262 4265 4324 
+ 4162 4196 4207 4243 4265 4274 4301 
+ 4222 4229 4231 4250 4256 4266 
+ 4191 4217 4218 4246 4267 4279 
+ 4198 4205 4234 4249 4280 4292 
+ 4221 4228 4235 4252 4259 4273 
+ 4196 4233 4238 4274 4283 
+ 4223 4230 4236 4254 4258 4272 
+ 4224 4231 4256 4271 
+ 4216 4217 4240 4247 4279 4282 
+ 4212 4216 4232 4246 4261 4282 4289 
+ 4036 4072 4179 4253 4346 4441 4451 
+ 4205 4213 4241 4257 4292 4298 
+ 4229 4236 4239 4258 4266 4275 
+ 3581 3809 4134 4365 4522 4577 
+ 4228 4232 4242 4261 4273 4281 
+ 4065 4072 4248 4353 4451 
+ 4230 4235 4244 4259 4272 4284 
+ 4141 4145 4218 4263 4293 4335 4358 
+ 4231 4239 4245 4266 4271 4285 
+ 4213 4219 4249 4260 4298 4304 
+ 4236 4244 4250 4272 4275 4288 
+ 4235 4242 4254 4273 4284 4291 
+ 4219 4226 4257 4270 4304 4307 
+ 4232 4247 4252 4281 4289 4290 
+ 4199 4210 4237 4277 4324 4332 
+ 4145 4150 4255 4269 4358 15368 
+ 4093 4118 4276 4286 4397 4399 
+ 4207 4237 4238 4301 4324 4333 
+ 4239 4250 4256 4275 4285 4295 
+ 4218 4240 4279 4293 4311 
+ 4225 4234 4280 4314 
+ 4150 4179 4263 4346 15368 
+ 4226 4233 4260 4283 4307 4313 
+ 4245 4256 4285 4297 
+ 4244 4254 4258 4284 4288 4299 
+ 4242 4252 4259 4281 4291 4300 
+ 4238 4243 4283 4301 4318 
+ 4250 4258 4266 4288 4295 4302 
+ 4093 4133 4264 4287 4399 4402 
+ 4206 4210 4262 4330 4332 4372 
+ 4108 4190 4220 4373 4433 4457 
+ 4240 4246 4267 4282 4310 4311 
+ 4234 4241 4268 4292 4314 4322 
+ 4252 4261 4273 4290 4300 4303 
+ 4246 4247 4279 4289 4308 4310 
+ 4233 4243 4270 4274 4313 4318 
+ 4254 4259 4272 4291 4299 4306 
+ 4256 4266 4271 4295 4297 4305 
+ 4118 4178 4264 4343 4397 4416 
+ 4133 4220 4276 4373 4402 
+ 4258 4272 4275 4299 4302 4312 
+ 4247 4261 4282 4290 4308 4309 
+ 4261 4281 4289 4303 4309 
+ 4259 4273 4284 4300 4306 4315 
+ 4241 4249 4280 4298 4322 4331 
+ 4218 4255 4267 4311 4335 4340 
+ 3759 3960 4193 4436 4526 4589 
+ 4266 4275 4285 4302 4305 4317 
+ 4044 4097 4190 4387 4433 4511 
+ 4271 4285 4305 4319 
+ 4249 4257 4292 4304 4331 4339 
+ 4272 4284 4288 4306 4312 4321 
+ 4273 4281 4291 4303 4315 4320 
+ 4238 4265 4274 4318 4333 4350 
+ 4275 4288 4295 4312 4317 4325 
+ 4281 4290 4300 4309 4320 4326 
+ 4257 4260 4298 4307 4339 4347 
+ 4285 4295 4297 4317 4319 4327 
+ 4284 4291 4299 4315 4321 4328 
+ 4260 4270 4304 4313 4347 4348 
+ 4282 4289 4309 4310 4329 4336 
+ 4289 4290 4303 4308 4326 4329 
+ 4279 4282 4308 4311 4336 4341 
+ 4267 4279 4293 4310 4340 4341 
+ 4288 4299 4302 4321 4325 4334 
+ 4270 4283 4307 4318 4348 4351 
+ 4268 4280 4322 4356 
+ 4291 4300 4306 4320 4328 4337 
+ 4202 4227 4330 4343 4400 4417 
+ 4295 4302 4305 4325 4327 4338 
+ 4274 4283 4301 4313 4350 4351 
+ 4297 4305 4327 4342 
+ 4300 4303 4315 4326 4337 4344 
+ 4299 4306 4312 4328 4334 4345 
+ 4280 4292 4314 4331 4356 4367 
+ 3994 4172 4485 4535 4661 15355 
+ 4237 4262 4265 4332 4333 4381 4391 
+ 4302 4312 4317 4334 4338 4349 
+ 4303 4309 4320 4329 4344 4355 
+ 4305 4317 4319 4338 4342 4352 
+ 4306 4315 4321 4337 4345 4354 
+ 4308 4309 4326 4336 4355 4363 
+ 4206 4227 4277 4316 4372 4400 4420 
+ 4292 4298 4322 4339 4367 4374 
+ 4262 4277 4324 4372 4391 4409 
+ 4265 4301 4324 4350 4381 4386 
+ 4312 4321 4325 4345 4349 4359 
+ 4255 4293 4340 4358 4385 4411 
+ 4308 4310 4329 4341 4363 4364 
+ 4315 4320 4328 4344 4354 4360 
+ 4317 4325 4327 4349 4352 4361 
+ 4298 4304 4331 4347 4374 4376 
+ 4293 4311 4335 4341 4366 4385 
+ 4310 4311 4336 4340 4364 4366 
+ 4319 4327 4352 4362 
+ 4178 4202 4286 4316 4416 4417 4468 
+ 4320 4326 4337 4355 4360 4369 
+ 4321 4328 4334 4354 4359 4368 
+ 4179 4248 4269 4441 4458 15368 
+ 4304 4307 4339 4348 4376 4384 
+ 4307 4313 4347 4351 4384 4388 
+ 4325 4334 4338 4359 4361 4370 
+ 4301 4318 4333 4351 4386 4390 
+ 4313 4318 4348 4350 4388 4390 
+ 4327 4338 4342 4361 4362 4371 
+ 4065 4129 4253 4428 4451 4537 
+ 4328 4337 4345 4360 4368 4375 
+ 4326 4329 4344 4363 4369 4378 
+ 4314 4322 4367 4396 
+ 3931 4130 4203 4503 4528 4573 
+ 4255 4263 4335 4411 4446 15368 
+ 4334 4345 4349 4368 4370 4377 
+ 4337 4344 4354 4369 4375 4380 
+ 4338 4349 4352 4370 4371 4379 
+ 4342 4352 4371 4382 
+ 4329 4336 4355 4364 4378 4392 
+ 4336 4341 4363 4366 4392 15369 
+ 3809 4157 4251 4577 4600 
+ 4340 4341 4364 4385 15369 
+ 4322 4331 4356 4374 4396 4405 
+ 4345 4354 4359 4375 4377 4389 
+ 4344 4355 4360 4378 4380 4395 
+ 4349 4359 4361 4377 4379 4393 
+ 4352 4361 4362 4379 4382 4394 
+ 4277 4330 4332 4409 4420 4439 
+ 4220 4278 4287 4402 4457 4489 
+ 4331 4339 4367 4376 4405 4412 
+ 4354 4360 4368 4380 4389 4398 
+ 4339 4347 4374 4384 4412 4418 
+ 4359 4368 4370 4389 4393 4403 
+ 4355 4363 4369 4392 4395 4401 
+ 4361 4370 4371 4393 4394 4404 
+ 4360 4369 4375 4395 4398 4407 
+ 4324 4333 4386 4391 4430 4438 
+ 4362 4371 4394 4406 
+ 2062 2078 4169 4894 5221 15374 
+ 4347 4348 4376 4388 4418 4423 
+ 4335 4340 4366 4411 4448 15369 
+ 4333 4350 4381 4390 4429 4430 
+ 4097 4203 4296 4503 4511 4583 
+ 4348 4351 4384 4390 4423 4426 
+ 4368 4375 4377 4398 4403 4410 
+ 4350 4351 4386 4388 4426 4429 
+ 4324 4332 4381 4409 4438 4450 
+ 4363 4364 4378 4401 4408 15369 
+ 4370 4377 4379 4403 4404 4413 
+ 4371 4379 4382 4404 4406 4414 
+ 4369 4378 4380 4401 4407 4415 
+ 4356 4367 4405 4434 
+ 4264 4286 4399 4416 4488 4493 
+ 4375 4380 4389 4407 4410 4419 
+ 4264 4276 4397 4402 4493 4502 
+ 4316 4330 4417 4420 4453 4475 
+ 4378 4392 4395 4408 4415 4421 
+ 4276 4287 4373 4399 4489 4502 
+ 4377 4389 4393 4410 4413 4422 
+ 4379 4393 4394 4413 4414 4424 
+ 4367 4374 4396 4412 4434 4444 
+ 4382 4394 4414 4425 
+ 4380 4395 4398 4415 4419 4427 
+ 4392 4401 4421 4445 15369 
+ 4332 4372 4391 4439 4450 4465 
+ 4389 4398 4403 4419 4422 4431 
+ 4335 4358 4385 4446 4448 4492 
+ 4374 4376 4405 4418 4444 4456 
+ 4393 4403 4404 4422 4424 4435 
+ 4394 4404 4406 4424 4425 4437 
+ 4395 4401 4407 4421 4427 4432 
+ 4286 4343 4397 4468 4488 4514 
+ 4316 4343 4400 4468 4475 4513 
+ 4376 4384 4412 4423 4456 4461 
+ 4398 4407 4410 4427 4431 4442 
+ 4330 4372 4400 4439 4453 4476 
+ 4401 4408 4415 4432 4445 4454 
+ 4403 4410 4413 4431 4435 4443 
+ 4384 4388 4418 4426 4461 4466 
+ 4404 4413 4414 4435 4437 4447 
+ 4406 4414 4437 4449 
+ 4388 4390 4423 4429 4466 4471 
+ 4407 4415 4419 4432 4442 4452 
+ 4129 4193 4353 4526 4537 4647 
+ 4386 4390 4426 4430 4471 4477 
+ 4381 4386 4429 4438 4477 4480 
+ 4410 4419 4422 4442 4443 4455 
+ 4415 4421 4427 4452 4454 
+ 4190 4278 4296 4457 4511 4554 4603 
+ 4396 4405 4444 4474 
+ 4413 4422 4424 4443 4447 4459 
+ 3960 4172 4294 4535 4589 4664 
+ 4414 4424 4425 4447 4449 4460 
+ 4381 4391 4430 4450 4480 4487 
+ 4372 4409 4420 4465 4476 4479 
+ 3690 3839 4467 4509 4685 4715 
+ 4248 4346 4451 4458 4551 4567 
+ 4419 4427 4431 4452 4455 4462 
+ 4422 4431 4435 4455 4459 4464 
+ 4405 4412 4434 4456 4474 4486 
+ 4408 4421 4448 4454 4481 4495 15369 
+ 4358 4411 4458 4492 4517 15368 
+ 4424 4435 4437 4459 4460 4469 
+ 4385 4411 4445 4492 4495 4523 15369 
+ 4425 4437 4460 4472 
+ 4391 4409 4438 4465 4487 4496 
+ 4248 4253 4353 4441 4537 4567 4628 
+ 4427 4432 4442 4454 4462 4473 
+ 4400 4420 4475 4476 4497 
+ 4421 4432 4445 4452 4473 4481 
+ 4431 4442 4443 4462 4464 4470 
+ 4412 4418 4444 4461 4486 4491 
+ 4278 4373 4433 4489 4554 4563 
+ 4346 4441 4446 4517 4551 15368 
+ 4435 4443 4447 4464 4469 4478 
+ 4437 4447 4449 4469 4472 4483 
+ 4418 4423 4456 4466 4491 4499 
+ 4442 4452 4455 4470 4473 4484 
+ 3675 4157 4600 4762 4851 15364 
+ 4443 4455 4459 4470 4478 4482 
+ 4409 4439 4450 4479 4496 4507 
+ 4423 4426 4461 4471 4499 4506 
+ 3839 4130 4440 4528 4679 4685 
+ 4343 4416 4417 4513 4514 4538 
+ 4447 4459 4460 4478 4483 4490 
+ 4455 4462 4464 4482 4484 
+ 4426 4429 4466 4477 4506 4510 
+ 4449 4460 4483 4494 
+ 4452 4454 4462 4481 4484 4498 
+ 4434 4444 4486 4512 
+ 4400 4417 4453 4497 4513 4545 
+ 4420 4439 4453 4479 4497 4505 4521 
+ 4429 4430 4471 4480 4510 4515 
+ 4459 4464 4469 4482 4490 4500 
+ 4439 4465 4476 4505 4507 
+ 4430 4438 4477 4487 4515 4520 
+ 4445 4454 4473 4495 4498 4531 
+ 4464 4470 4478 4484 4500 4504 
+ 4460 4469 4472 4490 4494 4508 
+ 4462 4470 4473 4482 4498 4504 
+ 3994 4134 4323 4522 4661 4745 
+ 4444 4456 4474 4491 4512 4518 
+ 4438 4450 4480 4496 4520 4530 
+ 4397 4416 4493 4514 4544 4562 
+ 4373 4402 4457 4502 4563 4578 
+ 4469 4478 4483 4500 4508 4516 
+ 4456 4461 4486 4499 4518 4529 
+ 4411 4446 4448 4517 4523 4559 
+ 4397 4399 4488 4502 4562 4566 
+ 4472 4483 4508 4519 
+ 4445 4448 4481 4523 4531 4543 
+ 4450 4465 4487 4507 4530 4534 
+ 4453 4475 4476 4521 4545 4546 
+ 4473 4481 4484 4504 4527 4531 
+ 4461 4466 4491 4506 4529 15370 
+ 4478 4482 4490 4504 4516 4524 
+ 1168 2700 3287 4893 5174 5290 
+ 4399 4402 4489 4493 4566 4578 
+ 4203 4357 4387 4573 4583 4667 
+ 4482 4484 4498 4500 4524 4527 
+ 4476 4479 4507 4521 4532 
+ 4466 4471 4499 4510 4536 15370 
+ 4465 4479 4496 4505 4532 4534 
+ 4483 4490 4494 4516 4519 4533 
+ 3690 3813 4440 4706 4715 4827 
+ 4471 4477 4506 4515 4536 4541 
+ 4296 4387 4433 4583 4603 4644 
+ 4474 4486 4518 4540 
+ 4417 4468 4475 4538 4545 4565 
+ 4416 4468 4488 4538 4544 4571 
+ 4477 4480 4510 4520 4541 4547 
+ 4490 4500 4508 4524 4533 4539 
+ 4446 4458 4492 4551 4559 4579 4594 
+ 4486 4491 4512 4529 4540 4549 
+ 4494 4508 4533 4542 
+ 4480 4487 4515 4530 4547 4550 
+ 4476 4497 4505 4532 4546 4552 
+ 4134 4251 4485 4577 4745 4796 
+ 4448 4492 4495 4543 4559 4576 
+ 4500 4504 4516 4527 4539 4548 
+ 2171 2700 3813 4706 4893 4958 
+ 4193 4294 4428 4589 4647 4690 
+ 4498 4504 4524 4531 4548 4553 
+ 4130 4357 4467 4573 4675 4679 
+ 4491 4499 4518 4549 4556 15370 
+ 4487 4496 4520 4534 4550 4558 
+ 4481 4495 4498 4527 4543 4553 4570 
+ 4505 4507 4521 4534 4552 4561 
+ 4508 4516 4519 4539 4542 4555 
+ 4496 4507 4530 4532 4558 4561 
+ 4172 4323 4436 4661 4664 4776 
+ 4506 4510 4541 4564 4569 15370 
+ 4353 4428 4451 4628 4647 4701 
+ 4468 4513 4514 4565 4571 4596 
+ 4516 4524 4533 4548 4555 4568 
+ 4512 4518 4549 4574 
+ 4510 4515 4536 4547 4569 4575 
+ 4519 4533 4555 4572 
+ 4495 4523 4531 4570 4576 4591 
+ 4488 4514 4562 4571 4595 
+ 4475 4497 4513 4546 4565 4586 4601 
+ 4497 4521 4545 4552 4585 4586 
+ 4515 4520 4541 4550 4575 4580 
+ 4524 4527 4539 4553 4568 4581 
+ 4518 4529 4540 4556 4574 4582 
+ 4520 4530 4547 4558 4580 15371 
+ 4441 4458 4517 4567 4594 4632 4654 
+ 4521 4532 4546 4561 4585 4587 
+ 4527 4531 4548 4570 4581 4593 
+ 4433 4457 4563 4603 4641 4646 
+ 4533 4539 4542 4568 4572 4584 
+ 4529 4549 4564 4582 4588 15370 
+ 244 312 361 4780 5550 6345 6996 
+ 4530 4534 4550 4561 4590 15371 
+ 4492 4517 4523 4576 4579 4592 
+ 199 239 4672 6408 6740 7295 
+ 4532 4534 4552 4558 4587 4590 
+ 4488 4493 4544 4566 4595 4615 
+ 4457 4489 4554 4578 4641 4652 
+ 4536 4556 4569 4588 4597 15370 
+ 4513 4538 4545 4596 4601 4614 
+ 4493 4502 4562 4578 4615 4649 
+ 4441 4451 4551 4628 4654 4695 
+ 4539 4548 4555 4581 4584 4599 
+ 4536 4541 4564 4575 4597 4602 
+ 4531 4543 4553 4591 4593 4607 
+ 4514 4538 4544 4595 4596 4617 
+ 4542 4555 4584 4598 
+ 4357 4503 4528 4667 4675 4730 
+ 4540 4549 4582 4604 
+ 4541 4547 4569 4580 4602 4606 
+ 4523 4543 4559 4591 4592 4605 
+ 4251 4365 4522 4600 4796 4869 
+ 4489 4502 4563 4566 4649 4652 
+ 4517 4559 4592 4594 4608 
+ 4547 4550 4575 4606 4609 15371 
+ 4548 4553 4568 4593 4599 4611 
+ 4549 4556 4574 4588 4604 4610 
+ 4387 4503 4511 4644 4667 4731 
+ 4555 4568 4572 4598 4599 4612 
+ 4546 4552 4586 4587 4618 4621 
+ 4545 4546 4585 4601 4621 4629 
+ 4552 4561 4585 4590 4616 4618 
+ 4556 4564 4582 4597 4610 4619 
+ 4294 4436 4526 4664 4690 4751 
+ 4558 4561 4587 4613 4616 15371 
+ 4543 4570 4576 4605 4607 4622 
+ 4559 4576 4579 4605 4608 4620 
+ 4553 4570 4581 4607 4611 4626 
+ 4517 4551 4579 4608 4632 4643 
+ 4544 4562 4571 4615 4617 4642 
+ 4538 4565 4571 4614 4617 4634 
+ 4564 4569 4588 4602 4619 4623 
+ 4572 4584 4612 4624 
+ 4568 4581 4584 4611 4612 4627 
+ 4157 4365 4463 4577 4851 4869 
+ 4545 4565 4586 4614 4629 4635 
+ 4569 4575 4597 4606 4623 4630 
+ 4433 4511 4554 4644 4646 4709 
+ 4574 4582 4610 4631 
+ 4576 4591 4592 4620 4622 4625 
+ 4575 4580 4602 4609 4630 4633 
+ 4570 4591 4593 4622 4626 4636 
+ 4579 4592 4594 4620 4643 4655 
+ 4580 4606 4613 4633 4638 15371 
+ 4582 4588 4604 4619 4631 4637 
+ 4581 4593 4599 4626 4627 4640 
+ 4584 4598 4599 4624 4627 4639 
+ 4590 4609 4616 4638 4645 15371 
+ 4565 4596 4601 4634 4635 4659 
+ 4562 4566 4595 4642 4649 4702 
+ 4587 4590 4613 4618 4645 4650 
+ 4571 4595 4596 4634 4642 4669 
+ 4585 4587 4616 4621 4650 4656 
+ 4588 4597 4610 4623 4637 4651 
+ 4592 4605 4608 4625 4653 4655 
+ 4585 4586 4618 4629 4656 4660 
+ 4591 4605 4607 4625 4636 4648 
+ 4597 4602 4619 4630 4651 4658 
+ 4598 4612 4639 4657 
+ 4605 4620 4622 4648 4653 
+ 4593 4607 4611 4636 4640 4663 
+ 4599 4611 4612 4639 4640 4662 
+ 4451 4537 4567 4695 4701 4744 
+ 4586 4601 4621 4635 4660 4668 
+ 4602 4606 4623 4633 4658 4665 
+ 4604 4610 4637 4666 
+ 4551 4594 4643 4654 4703 4711 
+ 4606 4609 4630 4638 4665 4671 
+ 4596 4614 4617 4659 4669 4682 
+ 4601 4614 4629 4659 4668 4670 
+ 4607 4622 4626 4648 4663 4673 
+ 4610 4619 4631 4651 4666 4674 
+ 4609 4613 4633 4645 4671 4676 
+ 4612 4624 4627 4657 4662 4677 
+ 4611 4626 4627 4662 4663 4678 
+ 4554 4563 4646 4652 4733 4742 
+ 4595 4615 4617 4669 4702 4712 
+ 4594 4608 4632 4655 4697 4703 
+ 4511 4583 4603 4709 4731 4768 
+ 4613 4616 4638 4650 4676 4681 
+ 4554 4603 4641 4709 4742 
+ 4428 4526 4537 4690 4701 4794 4799 
+ 4622 4625 4636 4653 4673 4680 
+ 4566 4578 4615 4652 4702 4737 
+ 4616 4618 4645 4656 4681 4684 
+ 4619 4623 4637 4658 4674 4683 
+ 4563 4578 4641 4649 4733 4737 
+ 4620 4625 4648 4655 4680 4686 
+ 4551 4567 4632 4695 4711 4739 
+ 4608 4620 4643 4653 4686 4697 
+ 4618 4621 4650 4660 4684 4689 
+ 4624 4639 4677 4687 
+ 4623 4630 4651 4665 4683 4688 
+ 4614 4634 4635 4670 4682 4693 
+ 4621 4629 4656 4668 4689 4694 
+ 4323 4485 4535 4745 4776 4892 
+ 4627 4639 4640 4677 4678 4692 
+ 4626 4636 4640 4673 4678 4691 
+ 4436 4535 4589 4751 4776 4844 
+ 4630 4633 4658 4671 4688 4696 
+ 4631 4637 4674 4698 
+ 4503 4573 4583 4730 4731 4795 
+ 4629 4635 4660 4670 4694 4699 
+ 4617 4634 4642 4682 4712 4718 
+ 4635 4659 4668 4693 4699 
+ 4633 4638 4665 4676 4696 4700 
+ 199 253 4560 4995 6562 6740 
+ 4636 4648 4663 4680 4691 4704 
+ 4637 4651 4666 4683 4698 4705 
+ 4528 4573 4679 4730 4804 
+ 4638 4645 4671 4681 4700 4707 
+ 4639 4657 4662 4687 4692 4708 
+ 4640 4662 4663 4691 4692 4710 
+ 4467 4528 4675 4685 4804 4821 
+ 4648 4653 4673 4686 4704 4716 
+ 4645 4650 4676 4684 4707 4713 
+ 4634 4659 4669 4693 4718 4721 
+ 4651 4658 4674 4688 4705 4714 
+ 4650 4656 4681 4689 4713 4717 
+ 4440 4467 4679 4715 4821 4823 
+ 4653 4655 4680 4697 4716 4728 
+ 4657 4677 4708 4720 
+ 4658 4665 4683 4696 4714 4719 
+ 4656 4660 4684 4694 4717 4722 
+ 4526 4589 4647 4751 4794 4835 
+ 4663 4673 4678 4704 4710 4724 
+ 4662 4677 4678 4708 4710 4726 
+ 4659 4670 4682 4699 4721 4723 
+ 4660 4668 4689 4699 4722 4725 
+ 4567 4628 4654 4739 4744 4777 
+ 4665 4671 4688 4700 4719 4727 
+ 4643 4655 4686 4703 4728 4738 
+ 4666 4674 4705 4729 
+ 4668 4670 4693 4694 4723 4725 
+ 4671 4676 4696 4707 4727 4732 
+ 4537 4628 4647 4744 4799 4824 
+ 4615 4642 4649 4712 4737 4766 4779 
+ 4632 4643 4697 4711 4738 4755 
+ 4673 4680 4691 4716 4724 4736 
+ 4674 4683 4698 4714 4729 4734 
+ 3813 4509 4525 4827 4958 5028 
+ 4676 4681 4700 4713 4732 4735 
+ 4677 4687 4692 4720 4726 15372 
+ 4603 4644 4646 4742 4768 4808 
+ 4678 4691 4692 4724 4726 4740 
+ 4632 4654 4703 4739 4755 4773 
+ 4642 4669 4702 4718 4761 4766 
+ 4681 4684 4707 4717 4735 4743 
+ 4683 4688 4705 4719 4734 4741 
+ 4440 4509 4685 4823 4827 4947 
+ 4680 4686 4704 4728 4736 4749 
+ 4684 4689 4713 4722 4743 4746 
+ 4669 4682 4712 4721 4754 4761 
+ 4688 4696 4714 4727 4741 4747 
+ 4687 4708 4748 15372 
+ 4682 4693 4718 4723 4753 4754 
+ 4689 4694 4717 4725 4746 4750 
+ 4693 4699 4721 4725 4752 4753 
+ 4691 4704 4710 4736 4740 4759 
+ 4694 4699 4722 4723 4750 4752 
+ 4692 4708 4710 4740 4758 15372 
+ 4696 4700 4719 4732 4747 4756 
+ 4686 4697 4716 4738 4749 4764 
+ 4698 4705 4734 4757 
+ 4573 4667 4675 4795 4804 4913 
+ 4583 4644 4667 4768 4795 4877 
+ 4700 4707 4727 4735 4756 4760 
+ 4641 4652 4737 4742 4816 4836 
+ 4705 4714 4729 4741 4757 4763 
+ 4707 4713 4732 4743 4760 4765 
+ 4704 4716 4724 4749 4759 4770 
+ 4649 4652 4702 4733 4779 4812 4816 
+ 4697 4703 4728 4755 4764 4783 
+ 4654 4695 4711 4773 4777 4806 
+ 4710 4724 4726 4758 4759 4772 
+ 4714 4719 4734 4747 4763 4769 
+ 4641 4646 4709 4733 4808 4836 
+ 4713 4717 4735 4746 4765 4771 
+ 4628 4695 4701 4777 4824 4840 
+ 4485 4522 4661 4796 4892 4976 
+ 4717 4722 4743 4750 4771 4774 
+ 4719 4727 4741 4756 4769 4775 
+ 4720 4767 4782 15372 
+ 4716 4728 4736 4764 4770 4787 
+ 4722 4725 4746 4752 4774 4778 
+ 4589 4664 4690 4835 4844 4898 
+ 4723 4725 4750 4753 4778 4781 
+ 4721 4723 4752 4754 4781 4786 
+ 4718 4721 4753 4761 4786 4790 
+ 4703 4711 4738 4773 4783 4800 
+ 4727 4732 4747 4760 4775 4785 
+ 4729 4734 4763 4784 
+ 4726 4740 4767 4772 4788 15372 
+ 4724 4736 4740 4770 4772 4791 
+ 4732 4735 4756 4765 4785 4789 
+ 4712 4718 4754 4766 4790 4802 
+ 4169 4463 4851 4894 5272 5282 15364 
+ 4734 4741 4757 4769 4784 4792 
+ 4728 4738 4749 4783 4787 4803 
+ 4735 4743 4760 4771 4789 4793 
+ 4702 4712 4761 4779 4802 4819 
+ 4748 4758 4782 4788 4801 15372 
+ 4644 4709 4731 4808 4877 4883 
+ 4741 4747 4763 4775 4792 4797 
+ 4736 4749 4759 4787 4791 4809 
+ 4743 4746 4765 4774 4793 4798 
+ 4740 4758 4759 4788 4791 4807 
+ 4711 4739 4755 4800 4806 4833 
+ 4746 4750 4771 4778 4798 4805 
+ 4747 4756 4769 4785 4797 15373 
+ 4535 4661 4664 4844 4892 5012 
+ 4695 4739 4744 4806 4840 4857 
+ 4750 4752 4774 4781 4805 4810 
+ 4702 4737 4766 4812 4819 4853 
+ 312 894 4557 4973 6102 6345 
+ 4752 4753 4778 4786 4810 4814 
+ 4748 4767 4801 4815 
+ 4738 4755 4764 4800 4803 4828 
+ 4757 4763 4792 4811 
+ 4756 4760 4775 4789 4813 15373 
+ 4753 4754 4781 4790 4814 4818 
+ 4749 4764 4770 4803 4809 4826 
+ 4758 4767 4772 4801 4807 4822 
+ 4760 4765 4785 4793 4813 4817 
+ 4754 4761 4786 4802 4818 4831 
+ 4759 4770 4772 4807 4809 4829 
+ 4763 4769 4784 4797 4811 4820 
+ 4765 4771 4789 4798 4817 4825 
+ 4647 4690 4799 4835 4884 15375 
+ 4667 4730 4731 4877 4913 4966 
+ 4522 4577 4745 4869 4976 5213 
+ 4769 4775 4792 4820 4832 15373 
+ 4771 4774 4793 4805 4825 4834 
+ 4647 4701 4794 4824 4884 4902 
+ 4755 4773 4783 4828 4833 4855 
+ 4767 4782 4788 4815 4822 4838 
+ 4761 4766 4790 4819 4831 4841 
+ 4764 4783 4787 4826 4828 4848 
+ 4675 4679 4730 4821 4913 4941 
+ 4774 4778 4798 4810 4834 4839 
+ 4739 4773 4777 4833 4857 4870 
+ 4772 4788 4791 4822 4829 4845 
+ 4709 4742 4768 4836 4883 4911 
+ 4770 4787 4791 4826 4829 4847 
+ 4778 4781 4805 4814 4839 4842 
+ 4784 4792 4820 4843 
+ 4737 4779 4816 4853 4865 
+ 4785 4789 4817 4837 4846 15373 
+ 4781 4786 4810 4818 4842 4849 
+ 4782 4801 4838 4850 
+ 4733 4737 4812 4836 4865 4921 
+ 4789 4793 4813 4825 4846 4852 
+ 4786 4790 4814 4831 4849 4856 
+ 4766 4779 4802 4841 4853 4858 
+ 4792 4797 4811 4832 4843 4854 
+ 4679 4685 4804 4823 4941 4953 
+ 4788 4801 4807 4838 4845 4860 
+ 4685 4715 4821 4947 4953 
+ 4701 4744 4799 4840 4902 4933 
+ 4793 4798 4817 4834 4852 4859 
+ 4787 4803 4809 4847 4848 4866 
+ 4509 4706 4715 4947 5028 5107 
+ 4783 4800 4803 4848 4855 4872 
+ 4791 4807 4809 4845 4847 4863 
+ 2565 3697 4888 5050 5372 5652 
+ 4790 4802 4818 4841 4856 4864 
+ 4797 4820 4837 4854 4861 15373 
+ 4773 4800 4806 4855 4870 4882 
+ 4798 4805 4825 4839 4859 4862 
+ 4690 4751 4794 4898 4954 15375 
+ 4733 4742 4808 4816 4911 4921 
+ 4813 4832 4846 4861 4867 15373 
+ 4801 4815 4822 4850 4860 4873 
+ 4805 4810 4834 4842 4862 4868 
+ 4744 4777 4824 4857 4926 4933 
+ 4802 4819 4831 4858 4864 4871 
+ 4810 4814 4839 4849 4868 4875 
+ 4811 4820 4854 4874 
+ 4664 4751 4776 4898 5010 5012 
+ 4807 4822 4829 4860 4863 4878 
+ 4813 4817 4837 4852 4867 4876 
+ 4809 4826 4829 4863 4866 4887 
+ 4803 4826 4828 4866 4872 4889 
+ 4814 4818 4842 4856 4875 4880 
+ 4815 4838 4873 4886 
+ 4463 4600 4762 4869 5255 5272 
+ 4817 4825 4846 4859 4876 4879 
+ 4779 4812 4819 4858 4865 4885 4904 
+ 4820 4832 4843 4861 4874 4881 
+ 4800 4828 4833 4872 4882 4901 
+ 4818 4831 4849 4864 4880 4891 
+ 4777 4806 4840 4870 4924 4926 
+ 4819 4841 4853 4871 4885 
+ 4825 4834 4852 4862 4879 4890 
+ 4822 4838 4845 4873 4878 4896 
+ 4832 4837 4854 4867 4881 4895 
+ 4834 4839 4859 4868 4890 4899 
+ 4829 4845 4847 4878 4887 4905 
+ 4831 4841 4856 4871 4891 4897 
+ 4812 4816 4853 4904 4921 4943 
+ 4826 4847 4848 4887 4889 4907 
+ 4837 4846 4861 4876 4895 4900 
+ 4839 4842 4862 4875 4899 4903 
+ 4577 4600 4796 4851 5213 5255 
+ 4806 4833 4857 4882 4924 4927 
+ 4841 4858 4864 4885 4897 4909 
+ 4828 4848 4855 4889 4901 4914 
+ 4838 4850 4860 4886 4896 4912 
+ 4843 4854 4881 4906 
+ 4842 4849 4868 4880 4903 4910 
+ 4846 4852 4867 4879 4900 4908 
+ 4731 4768 4795 4883 4966 5026 
+ 4845 4860 4863 4896 4905 4918 
+ 4852 4859 4876 4890 4908 4915 
+ 4849 4856 4875 4891 4910 4917 
+ 4854 4861 4874 4895 4906 4916 
+ 4833 4855 4870 4901 4927 4932 
+ 4768 4808 4877 4911 4991 5026 
+ 4794 4799 4902 4940 4960 15375 
+ 4853 4858 4871 4904 4909 4931 
+ 4850 4873 4912 4922 
+ 4847 4863 4866 4905 4907 4925 
+ 2565 3878 4830 5611 5652 
+ 4848 4866 4872 4907 4914 4928 
+ 4859 4862 4879 4899 4915 15376 
+ 4856 4864 4880 4897 4917 4919 
+ 4661 4745 4776 4976 5012 5096 
+ 2700 4501 4525 4958 5290 5355 5486 
+ 4169 4383 4762 5221 5282 5498 
+ 4861 4867 4881 4900 4916 4923 
+ 4860 4873 4878 4912 4918 4934 
+ 4864 4871 4891 4909 4919 4920 
+ 4751 4835 4844 4954 5010 5018 
+ 4862 4868 4890 4903 4929 15376 
+ 4867 4876 4895 4908 4923 4930 
+ 4855 4872 4882 4914 4932 4937 
+ 4799 4824 4884 4933 4940 4978 
+ 4868 4875 4899 4910 4929 4935 
+ 4853 4865 4885 4931 4943 4982 
+ 4863 4878 4887 4918 4925 4942 
+ 4874 4881 4916 4936 
+ 4866 4887 4889 4925 4928 4946 
+ 4876 4879 4900 4915 4930 4938 
+ 4871 4885 4897 4920 4931 4944 
+ 4875 4880 4903 4917 4935 4939 
+ 4808 4836 4883 4921 4991 5003 
+ 4873 4886 4896 4922 4934 4951 
+ 4730 4795 4804 4941 4966 5080 5105 
+ 4872 4889 4901 4928 4937 4945 
+ 4879 4890 4908 4938 4948 15376 
+ 4881 4895 4906 4923 4936 4949 
+ 4880 4891 4910 4919 4939 4950 
+ 4878 4896 4905 4934 4942 4957 
+ 4891 4897 4917 4920 4950 4952 
+ 4897 4909 4919 4944 4952 
+ 4816 4836 4865 4911 4943 5000 5003 
+ 4886 4912 4951 4959 
+ 4895 4900 4916 4930 4949 4956 
+ 4857 4870 4926 4927 4975 4985 
+ 4887 4905 4907 4942 4946 4963 
+ 4840 4857 4924 4933 4985 4992 
+ 4870 4882 4924 4932 4970 4975 
+ 4889 4907 4914 4945 4946 4964 
+ 4899 4903 4935 4955 4961 15376 
+ 4900 4908 4923 4938 4956 4962 
+ 4885 4904 4909 4944 4977 4982 
+ 4882 4901 4927 4937 4965 4970 
+ 4824 4840 4902 4926 4978 4992 15377 
+ 4896 4912 4918 4951 4957 4972 
+ 4903 4910 4929 4939 4961 4968 
+ 4906 4916 4949 4969 
+ 4901 4914 4932 4945 4965 4967 
+ 4908 4915 4930 4948 4962 4971 
+ 4910 4917 4935 4950 4968 4974 
+ 4884 4902 4960 4978 5013 
+ 4804 4821 4913 4953 5105 5131 
+ 4905 4918 4925 4957 4963 4986 
+ 4865 4904 4921 4982 5000 5027 
+ 4909 4920 4931 4952 4977 4983 
+ 4914 4928 4937 4964 4967 4984 
+ 4907 4925 4928 4963 4964 4987 
+ 4715 4823 4827 4953 5107 5173 
+ 4915 4938 4955 4971 4980 15376 
+ 4916 4923 4936 4956 4969 4979 
+ 4917 4919 4939 4952 4974 4981 
+ 4912 4922 4934 4959 4972 4988 
+ 4919 4920 4944 4950 4981 4983 
+ 4821 4823 4941 4947 5131 5173 
+ 4835 4898 4993 5018 5033 15375 
+ 4929 4948 4961 4980 4989 15376 
+ 4923 4930 4949 4962 4979 4990 
+ 4918 4934 4942 4972 4986 4998 
+ 4525 4706 4893 5028 5190 5355 
+ 4922 4951 4988 4999 
+ 4884 4940 4993 5013 5044 15375 
+ 4929 4935 4955 4968 4989 4994 
+ 4930 4938 4956 4971 4990 4996 
+ 4925 4942 4946 4986 4987 5005 
+ 4928 4945 4946 4984 4987 5004 
+ 4932 4937 4967 4970 4997 5007 
+ 4795 4877 4913 5026 5080 5112 
+ 4937 4945 4965 4984 4997 
+ 4935 4939 4961 4974 4994 5002 
+ 4936 4949 4979 5001 
+ 4927 4932 4965 4975 5007 5017 
+ 4938 4948 4962 4980 4996 5006 
+ 4934 4951 4957 4988 4998 5015 
+ 894 1987 4780 5181 6066 6102 
+ 4939 4950 4968 4981 5002 5008 
+ 4924 4927 4970 4985 5017 5023 
+ 4745 4796 4892 5096 5213 5309 
+ 4931 4944 4982 4983 5016 5020 
+ 4902 4933 4940 5013 5066 15377 
+ 4949 4956 4969 4990 5001 5011 
+ 4948 4955 4971 4989 5006 5014 
+ 4950 4952 4974 4983 5008 5009 
+ 4904 4931 4943 4977 5020 5027 5041 
+ 4944 4952 4977 4981 5009 5016 
+ 4945 4964 4967 4997 5004 5019 
+ 4924 4926 4975 4992 5023 5032 
+ 4942 4957 4963 4998 5005 5024 
+ 4946 4963 4964 5004 5005 5025 
+ 4951 4959 4972 4999 5015 5029 
+ 4955 4961 4980 4994 5014 5021 
+ 4956 4962 4979 4996 5011 5022 
+ 4883 4911 5003 5026 5068 5093 
+ 4926 4933 4985 5032 5038 15377 
+ 4954 4960 5033 5044 5069 15375 
+ 4961 4968 4989 5002 5021 5031 
+ 253 460 4672 5317 6494 6562 
+ 4962 4971 4990 5006 5022 5030 
+ 4965 4967 4984 5007 5019 5034 
+ 4957 4972 4986 5015 5024 5037 
+ 4959 4988 5029 5040 
+ 4921 4943 5003 5027 5060 5082 
+ 4969 4979 5011 5035 
+ 4968 4974 4994 5008 5031 5036 
+ 4911 4921 4991 5000 5068 5082 
+ 4964 4984 4987 5019 5025 5043 
+ 4963 4986 4987 5024 5025 5045 
+ 4971 4980 4996 5014 5030 5039 
+ 4965 4970 4997 5017 5034 5049 
+ 4974 4981 5002 5009 5036 5042 
+ 4981 4983 5008 5016 5042 5048 
+ 4844 4898 5012 5018 5123 5160 
+ 4979 4990 5001 5022 5035 5046 
+ 4776 4844 4892 5010 5096 5160 5223 
+ 4940 4960 4978 5044 5066 5100 
+ 4980 4989 5006 5021 5039 5047 
+ 4972 4988 4998 5029 5037 5052 
+ 4977 4983 5009 5020 5048 5051 
+ 4970 4975 5007 5023 5049 5055 
+ 4898 4954 5010 5033 5101 5123 
+ 4984 4997 5004 5034 5043 5057 
+ 4977 4982 5016 5041 5051 5062 
+ 4989 4994 5014 5031 5047 5054 
+ 4990 4996 5011 5030 5046 5053 
+ 4975 4985 5017 5032 5055 5064 
+ 4986 4998 5005 5037 5045 15378 
+ 4987 5004 5005 5043 5045 5059 
+ 4877 4883 4966 4991 5093 5112 5149 
+ 4943 4982 5000 5041 5060 5070 
+ 4706 4827 4958 5107 5190 5256 
+ 4988 4999 5015 5040 5052 5061 
+ 4996 5006 5022 5039 5053 5056 
+ 4994 5002 5021 5036 5054 5058 
+ 4985 4992 5023 5038 5064 5072 
+ 4954 4993 5018 5069 5101 
+ 4997 5007 5019 5049 5057 5076 
+ 5001 5011 5046 5063 
+ 5002 5008 5031 5042 5058 5065 
+ 4998 5015 5024 5052 5074 15378 
+ 4992 5032 5072 5078 15377 
+ 5006 5014 5030 5047 5056 5067 
+ 4999 5029 5061 5077 
+ 4982 5020 5027 5062 5070 5086 
+ 5008 5009 5036 5048 5065 5071 
+ 5004 5019 5025 5057 5059 5083 
+ 4960 4993 5013 5069 5100 5134 
+ 5005 5024 5025 5059 5081 15378 
+ 5011 5022 5035 5053 5063 5073 
+ 5014 5021 5039 5054 5067 5075 
+ 5009 5016 5042 5051 5071 5079 
+ 5007 5017 5034 5055 5076 5092 
+ 3697 4176 4830 5180 5372 5667 
+ 5016 5020 5048 5062 5079 5087 
+ 5015 5029 5037 5061 5074 5088 
+ 5022 5030 5046 5056 5073 5084 
+ 5021 5031 5047 5058 5075 5085 
+ 5017 5023 5049 5064 5092 5113 
+ 5030 5039 5053 5067 5084 5089 
+ 5019 5034 5043 5076 5083 5104 
+ 5031 5036 5054 5065 5085 5090 
+ 5025 5043 5045 5081 5083 5102 
+ 5000 5027 5070 5082 5094 5114 
+ 5029 5040 5052 5077 5088 5103 
+ 5020 5041 5051 5086 5087 5106 
+ 5035 5046 5073 5095 
+ 5023 5032 5055 5072 5113 5130 
+ 5036 5042 5058 5071 5090 5097 
+ 4978 5013 5078 5100 5151 5164 15377 
+ 5039 5047 5056 5075 5089 5099 
+ 4991 5003 5082 5093 5136 5155 
+ 4993 5033 5044 5101 5134 5170 
+ 5027 5041 5060 5086 5094 5109 
+ 5042 5048 5065 5079 5097 5110 
+ 5032 5038 5064 5078 5130 5143 
+ 5046 5053 5063 5084 5095 5108 
+ 5037 5052 5088 5098 5115 15378 
+ 5047 5054 5067 5085 5099 5111 
+ 5034 5049 5057 5092 5104 5126 
+ 5040 5061 5103 5119 
+ 5038 5066 5072 5143 5151 15377 
+ 5048 5051 5071 5087 5110 5117 
+ 4913 4966 5105 5112 5218 5228 
+ 5045 5059 5098 5102 5121 15378 
+ 5000 5003 5060 5068 5114 5136 5141 
+ 5043 5057 5059 5102 5104 5125 
+ 5053 5056 5073 5089 5108 5116 
+ 5054 5058 5075 5090 5111 5118 
+ 5041 5062 5070 5106 5109 5120 
+ 5051 5062 5079 5106 5117 5127 
+ 5052 5061 5074 5103 5115 5129 
+ 5056 5067 5084 5099 5116 5122 
+ 5058 5065 5085 5097 5118 15379 
+ 167 239 410 6408 13608 14718 
+ 5049 5055 5076 5113 5126 5153 
+ 4991 5026 5068 5149 5155 5191 
+ 5060 5070 5109 5114 5124 
+ 5063 5073 5108 5128 
+ 4892 4976 5012 5223 5309 5375 
+ 5065 5071 5090 5110 5132 15379 
+ 5074 5081 5115 5121 5140 15378 
+ 5067 5075 5089 5111 5122 5133 
+ 5013 5044 5066 5134 5164 5200 
+ 5018 5033 5069 5123 5170 5203 
+ 5059 5081 5083 5121 5125 5146 
+ 5061 5077 5088 5119 5129 5145 
+ 5057 5076 5083 5125 5126 5148 
+ 4913 4941 5080 5131 5228 5300 
+ 5062 5086 5087 5120 5127 5138 
+ 4827 4947 5028 5173 5256 5336 
+ 5073 5084 5095 5116 5128 5137 
+ 5070 5086 5094 5120 5124 5135 
+ 5071 5079 5097 5117 5132 5142 
+ 5075 5085 5099 5118 5133 5139 
+ 4966 5026 5080 5149 5207 5218 5231 
+ 5055 5064 5092 5130 5153 5183 
+ 5060 5082 5094 5124 5141 5154 
+ 5074 5088 5098 5129 5140 5157 
+ 5084 5089 5108 5122 5137 5147 
+ 5079 5087 5110 5127 5142 5152 
+ 5085 5090 5111 5139 5150 15379 
+ 5077 5103 5145 5158 
+ 5086 5106 5109 5135 5138 5144 
+ 5081 5098 5102 5140 5146 5166 
+ 5089 5099 5116 5133 5147 5156 
+ 5010 5018 5101 5160 5203 5241 
+ 5094 5109 5114 5135 5154 5161 
+ 5083 5102 5104 5146 5148 5171 
+ 5076 5092 5104 5148 5153 5178 
+ 5087 5106 5117 5138 5152 5163 
+ 5095 5108 5137 5162 
+ 5088 5103 5115 5145 5157 5175 
+ 5064 5072 5113 5143 5183 5192 
+ 4941 4953 5105 5173 5300 5365 
+ 5097 5110 5142 5159 5169 15379 
+ 5099 5111 5122 5139 5156 5167 
+ 5044 5069 5100 5170 5200 5229 
+ 5109 5120 5124 5144 5161 5165 
+ 5068 5082 5141 5155 5194 5212 
+ 5108 5116 5128 5147 5162 5172 
+ 5106 5120 5127 5144 5163 5168 
+ 5111 5118 5133 5150 5167 5177 
+ 5098 5115 5121 5157 5166 5184 
+ 5082 5114 5136 5154 5194 5201 
+ 5110 5117 5132 5152 5169 5179 
+ 5072 5078 5130 5151 5192 5209 
+ 5120 5135 5138 5165 5168 
+ 5103 5119 5129 5158 5175 5187 
+ 5102 5121 5125 5166 5171 5188 
+ 5116 5122 5137 5156 5172 5182 
+ 5104 5125 5126 5171 5178 5195 
+ 5026 5093 5112 5191 5207 5243 
+ 5118 5139 5159 5177 5185 15379 
+ 5066 5078 5143 5164 5209 5222 
+ 5117 5127 5142 5163 5179 5186 
+ 5092 5113 5126 5178 5183 5210 
+ 5114 5124 5141 5161 5201 5202 
+ 5068 5093 5136 5191 5212 5238 
+ 5122 5133 5147 5167 5182 5189 
+ 5115 5129 5140 5175 5184 5205 
+ 5119 5145 5187 5204 
+ 5132 5150 5169 5185 5197 15379 
+ 5010 5012 5123 5223 5241 5334 
+ 5124 5135 5154 5165 5196 5202 
+ 5128 5137 5172 5199 
+ 5127 5138 5152 5168 5186 5193 
+ 5066 5100 5151 5200 5222 5266 
+ 5135 5144 5161 5168 5196 5198 
+ 5121 5140 5146 5184 5188 5215 
+ 5133 5139 5156 5177 5189 5206 
+ 5138 5144 5163 5165 5193 5198 
+ 5132 5142 5159 5179 5197 5208 
+ 5069 5101 5134 5203 5229 5262 
+ 5125 5146 5148 5188 5195 5217 
+ 5137 5147 5162 5182 5199 5211 
+ 4947 4953 5107 5131 5336 5365 5416 
+ 3287 4501 5181 5290 5828 5952 
+ 5129 5145 5157 5187 5205 5219 
+ 123 133 223 15053 15071 15220 
+ 5139 5150 5167 5185 5206 5214 
+ 5126 5148 5153 5195 5210 5226 
+ 5142 5152 5169 5186 5208 5216 
+ 4176 5050 5528 5667 5905 15374 
+ 1987 3287 4973 5174 5952 6066 6276 
+ 5147 5156 5172 5189 5211 5220 
+ 5113 5130 5153 5192 5210 5239 5249 
+ 5140 5157 5166 5205 5215 5233 
+ 5150 5159 5177 5197 5214 5225 
+ 5152 5163 5179 5193 5216 5224 
+ 5145 5158 5175 5204 5219 5236 
+ 5146 5166 5171 5215 5217 5242 
+ 5156 5167 5182 5206 5220 5230 
+ 4958 5028 5256 5355 5387 
+ 5093 5149 5155 5238 5243 5278 
+ 5130 5143 5183 5209 5239 5248 
+ 5163 5168 5186 5198 5224 5227 
+ 5136 5141 5201 5212 5250 5260 
+ 5148 5171 5178 5217 5226 5246 
+ 5161 5165 5198 5202 5232 5237 
+ 5159 5169 5185 5208 5225 5235 
+ 5165 5168 5193 5196 5227 5232 
+ 5162 5172 5211 5234 
+ 5100 5134 5164 5229 5266 5274 
+ 5141 5154 5194 5202 5244 5250 
+ 5154 5161 5196 5201 5237 5244 
+ 5101 5123 5170 5241 5262 5284 
+ 5158 5187 5236 5251 
+ 5157 5175 5184 5219 5233 5253 
+ 5167 5177 5189 5214 5230 5240 
+ 5112 5149 5231 5243 5276 
+ 5169 5179 5197 5216 5235 5245 
+ 5143 5151 5192 5222 5248 5257 
+ 5153 5178 5183 5226 5249 5258 
+ 5172 5182 5199 5220 5234 5247 
+ 5136 5155 5194 5238 5260 5277 
+ 4796 4869 4976 5255 5309 5549 5559 
+ 5177 5185 5206 5225 5240 5252 
+ 5166 5184 5188 5233 5242 5264 
+ 5179 5186 5208 5224 5245 5254 
+ 5171 5188 5195 5242 5246 5269 
+ 5080 5112 5228 5231 5301 15380 
+ 5175 5187 5205 5236 5253 5268 
+ 5182 5189 5211 5230 5247 5259 
+ 4383 4894 5498 5528 5763 15374 
+ 5151 5164 5209 5257 5266 5310 
+ 5012 5096 5160 5334 5375 5432 
+ 5186 5193 5216 5227 5254 5261 
+ 5185 5197 5214 5235 5252 5263 
+ 5178 5195 5210 5246 5258 5275 
+ 5193 5198 5224 5232 5261 5265 
+ 5080 5105 5218 5300 5398 15380 
+ 5134 5170 5200 5262 5274 5311 
+ 5189 5206 5220 5240 5259 5267 
+ 5112 5207 5218 5276 5301 
+ 5196 5198 5227 5237 5265 5270 
+ 5184 5205 5215 5253 5264 5283 
+ 5199 5211 5247 5271 
+ 5197 5208 5225 5245 5263 5273 
+ 5187 5204 5219 5251 5268 5285 
+ 5196 5202 5232 5244 5270 5280 
+ 5155 5191 5212 5277 5278 5315 
+ 5183 5192 5248 5249 5295 5302 
+ 5206 5214 5230 5252 5267 5279 
+ 5123 5160 5203 5284 5334 5400 
+ 5188 5215 5217 5264 5269 5292 
+ 5149 5191 5207 5276 5278 5319 
+ 5201 5202 5237 5250 5280 5287 
+ 5208 5216 5235 5254 5273 5281 
+ 5195 5217 5226 5269 5275 5298 
+ 5211 5220 5234 5259 5271 5286 
+ 5192 5209 5239 5257 5302 5307 
+ 5183 5210 5239 5258 5291 5295 
+ 5194 5201 5244 5260 5287 5297 
+ 5204 5236 5285 5299 
+ 5214 5225 5240 5263 5279 5288 
+ 5205 5219 5233 5268 5283 5304 
+ 5216 5224 5245 5261 5281 5289 
+ 4851 4869 5213 5272 5549 5583 
+ 5028 5107 5190 5336 5387 5446 
+ 5209 5222 5248 5307 5310 
+ 5210 5226 5249 5275 5291 5305 
+ 5220 5230 5247 5267 5286 5294 
+ 5194 5212 5250 5277 5297 5318 
+ 5224 5227 5254 5265 5289 5296 
+ 5170 5203 5229 5284 5311 5335 
+ 5225 5235 5252 5273 5288 5303 
+ 5215 5233 5242 5283 5292 5314 
+ 5227 5232 5261 5270 5296 5306 
+ 5164 5200 5222 5274 5310 5339 
+ 5230 5240 5259 5279 5294 5308 
+ 5219 5236 5253 5285 5304 5320 
+ 5217 5242 5246 5292 5298 5323 
+ 5232 5237 5265 5280 5306 5316 
+ 5234 5247 5286 5312 
+ 4762 4851 5255 5282 5583 5609 
+ 5235 5245 5263 5281 5303 5313 
+ 5200 5229 5266 5311 5339 5384 
+ 5226 5246 5258 5298 5305 5328 
+ 5207 5231 5243 5301 5319 5353 
+ 5212 5238 5260 5315 5318 5340 
+ 5191 5238 5243 5315 5319 5343 
+ 5240 5252 5267 5288 5308 5321 
+ 5237 5244 5270 5287 5316 5324 
+ 5245 5254 5273 5289 5313 5322 
+ 4762 4894 5272 5498 5609 5647 
+ 5233 5253 5264 5304 5314 5330 
+ 5203 5241 5262 5335 5400 
+ 5236 5251 5268 5299 5320 5331 
+ 5247 5259 5271 5294 5312 5325 
+ 5244 5250 5280 5297 5324 5333 
+ 5252 5263 5279 5303 5321 5326 
+ 5254 5261 5281 5296 5322 5327 
+ 4501 4893 5174 5486 5828 5831 
+ 5249 5258 5295 5305 5329 
+ 5242 5264 5269 5314 5323 5341 
+ 275 2535 4201 6549 7003 11051 
+ 5259 5267 5286 5308 5325 5332 
+ 5239 5249 5291 5302 5329 5350 
+ 5261 5265 5289 5306 5327 5337 
+ 5250 5260 5287 5318 5333 5348 
+ 5246 5269 5275 5323 5328 5351 
+ 5251 5285 5331 5346 
+ 5105 5131 5228 5365 5398 5423 
+ 5218 5231 5276 5353 5402 15380 
+ 5239 5248 5295 5307 5350 5369 
+ 5263 5273 5288 5313 5326 5338 
+ 5253 5268 5283 5320 5330 5349 
+ 5258 5275 5291 5328 5329 5356 
+ 5265 5270 5296 5316 5337 5344 
+ 5248 5257 5302 5310 5369 5382 
+ 5267 5279 5294 5321 5332 5342 
+ 4976 5096 5213 5375 5559 5568 
+ 5222 5257 5266 5307 5339 5382 5389 
+ 5229 5262 5274 5335 5384 5420 
+ 5271 5286 5325 5345 
+ 5273 5281 5303 5322 5338 5347 
+ 5264 5283 5292 5330 5341 5359 
+ 5238 5277 5278 5340 5343 5364 
+ 5270 5280 5306 5324 5344 5352 
+ 460 3878 4995 5611 6494 6507 
+ 5260 5277 5297 5340 5348 5366 
+ 5243 5276 5278 5343 5353 5385 
+ 5268 5285 5304 5331 5349 5362 
+ 5279 5288 5308 5326 5342 5354 
+ 5281 5289 5313 5327 5347 5357 
+ 5269 5292 5298 5341 5351 5368 
+ 5280 5287 5316 5333 5352 5361 
+ 5286 5294 5312 5332 5345 5358 
+ 5288 5303 5321 5338 5354 5360 
+ 5289 5296 5322 5337 5357 5363 
+ 5275 5298 5305 5351 5356 5378 
+ 5291 5295 5305 5350 5356 5379 
+ 5283 5304 5314 5349 5359 5376 
+ 5285 5299 5320 5346 5362 5373 
+ 5294 5308 5325 5342 5358 5367 
+ 5287 5297 5324 5348 5361 5377 
+ 5160 5223 5241 5400 5432 5492 
+ 5262 5284 5311 5400 5420 
+ 5107 5173 5256 5416 5446 5503 
+ 5296 5306 5327 5344 5363 5370 
+ 5303 5313 5326 5347 5360 5371 
+ 5266 5274 5310 5384 5389 5447 
+ 5277 5315 5318 5364 5366 5393 
+ 5292 5314 5323 5359 5368 5386 
+ 5308 5321 5332 5354 5367 5374 
+ 5278 5315 5319 5364 5385 5403 
+ 5306 5316 5337 5352 5370 5381 
+ 5312 5325 5358 5380 
+ 5299 5331 5373 5391 
+ 5313 5322 5338 5357 5371 5383 
+ 5297 5318 5333 5366 5377 5396 
+ 5304 5320 5330 5362 5376 5395 
+ 5295 5302 5329 5369 5379 5425 
+ 5298 5323 5328 5368 5378 5399 
+ 5316 5324 5344 5361 5381 5390 
+ 5276 5301 5319 5385 5402 5440 
+ 5321 5326 5342 5360 5374 5388 
+ 4893 4958 5190 5387 5486 5625 5679 
+ 5305 5328 5329 5378 5379 5412 
+ 5322 5327 5347 5363 5383 5392 
+ 5325 5332 5345 5367 5380 5394 
+ 5314 5330 5341 5376 5386 5407 
+ 5326 5338 5354 5371 5388 5397 
+ 5324 5333 5352 5377 5390 5405 
+ 5320 5331 5349 5373 5395 5410 
+ 5327 5337 5357 5370 5392 5401 
+ 5315 5340 5343 5393 5403 5406 
+ 5131 5173 5300 5416 5423 5518 5520 
+ 5318 5340 5348 5393 5396 5419 
+ 5332 5342 5358 5374 5394 5404 
+ 5323 5341 5351 5386 5399 15381 
+ 5302 5307 5350 5382 5425 5433 
+ 5337 5344 5363 5381 5401 5411 
+ 5338 5347 5360 5383 5397 5409 
+ 4830 5050 5652 5667 5974 
+ 5331 5346 5362 5391 5410 5421 
+ 5342 5354 5367 5388 5404 5413 
+ 5096 5223 5309 5432 5568 5580 
+ 5330 5349 5359 5395 5407 5424 
+ 5333 5348 5361 5396 5405 5415 
+ 5328 5351 5356 5399 5412 5428 
+ 5329 5350 5356 5412 5425 5445 
+ 5345 5358 5394 5414 
+ 5344 5352 5370 5390 5411 5417 
+ 5307 5310 5369 5389 5433 5441 
+ 5347 5357 5371 5392 5409 5418 
+ 5274 5311 5339 5420 5447 5509 
+ 5319 5343 5353 5403 5440 5464 
+ 5341 5359 5368 5407 5435 15381 
+ 5190 5256 5355 5446 5578 5625 
+ 5354 5360 5374 5397 5413 5422 
+ 5310 5339 5382 5441 5447 5477 
+ 5352 5361 5381 5405 5417 5429 
+ 5346 5373 5421 5437 
+ 5357 5363 5383 5401 5418 5427 
+ 5340 5364 5366 5406 5419 5434 
+ 5358 5367 5380 5404 5414 5426 
+ 5349 5362 5376 5410 5424 5439 
+ 5348 5366 5377 5415 5419 5430 
+ 5360 5371 5388 5409 5422 5431 
+ 5228 5300 5423 5493 5521 15380 
+ 5351 5368 5378 5428 5443 15381 
+ 5241 5284 5334 5335 5420 5492 5553 
+ 5363 5370 5392 5411 5427 5436 
+ 5301 5353 5440 5493 5516 15380 
+ 5343 5364 5385 5406 5449 5464 
+ 5367 5374 5394 5413 5426 5438 
+ 5361 5377 5390 5415 5429 5442 
+ 5364 5393 5403 5434 5449 
+ 5359 5376 5386 5424 5435 5453 
+ 148 200 223 7666 15071 15133 
+ 5371 5383 5397 5418 5431 5444 
+ 5362 5373 5395 5421 5439 5454 
+ 5370 5381 5401 5417 5436 5448 
+ 5356 5378 5379 5428 5445 5462 
+ 5374 5388 5404 5422 5438 5451 
+ 5380 5394 5426 5452 
+ 5377 5396 5405 5430 5442 5450 
+ 5173 5336 5365 5503 5520 5566 
+ 5381 5390 5411 5429 5448 5456 
+ 5383 5392 5409 5427 5444 5455 
+ 5366 5393 5396 5430 5434 5457 5459 
+ 5311 5335 5384 5400 5509 5553 5582 
+ 5373 5391 5410 5437 5454 5467 
+ 5388 5397 5413 5431 5451 5458 
+ 5300 5365 5398 5518 5521 
+ 5376 5395 5407 5439 5453 5468 
+ 5350 5369 5379 5433 5445 5474 5482 
+ 5394 5404 5414 5438 5452 5460 
+ 5392 5401 5418 5436 5455 5463 
+ 5378 5399 5412 5443 5462 5471 
+ 5390 5405 5417 5442 5456 5465 
+ 5396 5415 5419 5450 5459 
+ 5397 5409 5422 5444 5458 5466 
+ 5223 5334 5375 5492 5580 5585 
+ 5369 5382 5425 5441 5474 5480 
+ 5393 5406 5419 5449 5457 5473 
+ 5386 5407 5453 5461 5476 15381 
+ 5401 5411 5427 5448 5463 5469 
+ 5391 5421 5467 5478 
+ 5404 5413 5426 5451 5460 5470 
+ 5395 5410 5424 5454 5468 5484 
+ 5353 5385 5402 5464 5516 5540 
+ 5382 5389 5433 5477 5480 
+ 5405 5415 5429 5450 5465 5472 
+ 5399 5428 5461 5471 5487 15381 
+ 5409 5418 5431 5455 5466 5475 
+ 5379 5412 5425 5462 5482 5497 
+ 5256 5336 5387 5503 5578 5634 
+ 5339 5384 5389 5477 5509 5536 
+ 5411 5417 5436 5456 5469 5479 
+ 5403 5406 5434 5464 5473 5501 
+ 5415 5430 5442 5459 5472 5488 
+ 5413 5422 5438 5458 5470 5481 
+ 5414 5426 5460 5485 
+ 5407 5424 5435 5468 5476 5495 
+ 5410 5421 5439 5467 5484 5499 
+ 5418 5427 5444 5463 5475 5489 
+ 5417 5429 5448 5465 5479 5490 
+ 5419 5434 5459 5473 5483 
+ 5422 5431 5451 5466 5481 5491 
+ 5419 5430 5450 5457 5483 5488 
+ 5426 5438 5452 5470 5485 5494 
+ 5435 5443 5476 5487 5506 15381 
+ 5412 5428 5445 5471 5497 5505 
+ 5427 5436 5455 5469 5489 5496 
+ 5385 5403 5440 5449 5501 5540 5561 
+ 5429 5442 5456 5472 5490 5500 
+ 5431 5444 5458 5475 5491 5504 
+ 5421 5437 5454 5478 5499 5510 
+ 5424 5439 5453 5484 5495 5512 
+ 5436 5448 5463 5479 5496 5508 
+ 5438 5451 5460 5481 5494 5507 
+ 5428 5443 5462 5487 5505 5513 
+ 5442 5450 5465 5488 5500 5502 
+ 5434 5449 5457 5483 5501 5519 
+ 5425 5433 5480 5482 5538 5541 
+ 5444 5455 5466 5489 5504 5511 
+ 5435 5453 5461 5495 5506 5524 
+ 5389 5441 5447 5480 5536 5548 
+ 5437 5467 5510 5527 
+ 5448 5456 5469 5490 5508 5515 
+ 5433 5441 5474 5477 5541 5548 
+ 5451 5458 5470 5491 5507 5514 
+ 5425 5445 5474 5497 5523 5538 
+ 5457 5459 5473 5488 5519 5526 
+ 5439 5454 5468 5499 5512 5530 
+ 5452 5460 5494 5517 
+ 4893 5290 5355 5679 5831 5863 
+ 5443 5461 5471 5506 5513 5534 
+ 5450 5459 5472 5483 5502 5526 5531 
+ 5455 5463 5475 5496 5511 5522 
+ 5456 5465 5479 5500 5515 5525 
+ 5458 5466 5481 5504 5514 5529 
+ 5334 5400 5432 5553 5585 5607 
+ 5398 5402 5516 5521 5621 5629 15380 
+ 5460 5470 5485 5507 5517 5532 
+ 5453 5468 5476 5512 5524 5545 
+ 5463 5469 5489 5508 5522 5535 
+ 5445 5462 5482 5505 5523 5537 
+ 4894 5221 5282 5647 5763 5889 
+ 5454 5467 5484 5510 5530 5546 
+ 5465 5472 5490 5502 5525 5533 
+ 5449 5464 5473 5519 5561 5577 
+ 5472 5488 5500 5531 5533 
+ 5336 5416 5446 5566 5634 5682 
+ 5466 5475 5491 5511 5529 5539 
+ 5462 5471 5497 5513 5537 5544 
+ 5461 5476 5487 5524 5534 5554 
+ 5470 5481 5494 5514 5532 5542 
+ 5469 5479 5496 5515 5535 5543 
+ 5384 5420 5447 5536 5582 5608 
+ 5467 5478 5499 5527 5546 5556 
+ 5475 5489 5504 5522 5539 5547 
+ 5468 5484 5495 5530 5545 5560 
+ 5471 5487 5505 5534 5544 5562 
+ 5481 5491 5507 5529 5542 5551 
+ 5479 5490 5508 5525 5543 5552 
+ 5402 5440 5493 5540 5620 5621 
+ 5485 5494 5532 5555 
+ 5365 5423 5520 5521 5636 5641 
+ 5473 5483 5501 5526 5577 5592 
+ 5365 5416 5518 5566 5641 5672 
+ 5398 5423 5493 5518 5629 5636 
+ 5489 5496 5511 5535 5547 5557 
+ 5482 5497 5537 5538 5574 
+ 5476 5495 5506 5545 5554 5572 
+ 5490 5500 5515 5533 5552 5558 
+ 5483 5488 5519 5531 5570 5592 
+ 5478 5510 5556 5571 
+ 5180 5221 5763 5905 6206 15374 
+ 5491 5504 5514 5539 5551 5563 
+ 5484 5499 5512 5546 5560 5575 
+ 5488 5502 5526 5533 5564 5570 
+ 5494 5507 5517 5542 5555 5565 
+ 5500 5502 5525 5531 5558 5564 
+ 5487 5506 5513 5554 5562 5581 
+ 5496 5508 5522 5543 5557 5567 
+ 5447 5477 5509 5548 5608 5635 
+ 5497 5505 5523 5544 5569 5574 
+ 5474 5482 5523 5541 5574 5595 
+ 5504 5511 5529 5547 5563 5573 
+ 5440 5464 5516 5561 5620 5623 
+ 5474 5480 5538 5548 5595 5650 
+ 5507 5514 5532 5551 5565 5576 
+ 5508 5515 5535 5552 5567 5579 
+ 5505 5513 5537 5562 5569 5587 
+ 5495 5512 5524 5560 5572 5590 
+ 5499 5510 5530 5556 5575 5591 
+ 5511 5522 5539 5557 5573 5584 
+ 5477 5480 5536 5541 5635 5650 
+ 5213 5255 5559 5583 5790 5820 
+ 361 2535 4557 6549 6996 8429 
+ 5514 5529 5542 5563 5576 5586 
+ 5515 5525 5543 5558 5579 5588 
+ 5400 5420 5492 5582 5607 5664 5670 
+ 5506 5524 5534 5572 5581 5598 
+ 5517 5532 5565 5589 
+ 5510 5527 5546 5571 5591 5600 
+ 5522 5535 5547 5567 5584 5593 
+ 5525 5533 5552 5564 5588 5594 
+ 5213 5309 5549 5568 5764 5790 
+ 5512 5530 5545 5575 5590 5602 
+ 5464 5501 5540 5577 5623 5628 
+ 5513 5534 5544 5581 5587 5605 
+ 5529 5539 5551 5573 5586 5596 
+ 5531 5533 5558 5570 5594 5599 
+ 5532 5542 5555 5576 5589 5597 
+ 5416 5503 5520 5672 5682 
+ 5535 5543 5557 5579 5593 5601 
+ 5309 5375 5559 5580 5734 5764 
+ 5537 5544 5574 5587 5604 
+ 5526 5531 5564 5592 5599 5617 
+ 5527 5556 5600 5612 
+ 5524 5545 5554 5590 5598 5613 
+ 5539 5547 5563 5584 5596 5603 
+ 5523 5537 5538 5569 5595 5604 5631 
+ 5530 5546 5560 5591 5602 5616 
+ 5542 5551 5565 5586 5597 5606 
+ 5501 5519 5561 5592 5628 5639 
+ 5387 5446 5625 5634 5742 5761 
+ 5543 5552 5567 5588 5601 5610 
+ 5375 5432 5568 5585 5707 5734 
+ 5534 5554 5562 5598 5605 5622 
+ 5420 5509 5553 5608 5664 5694 
+ 5255 5272 5549 5609 5820 5848 
+ 5547 5557 5573 5593 5603 5614 
+ 5432 5492 5580 5607 5701 5707 
+ 5551 5563 5576 5596 5606 5615 
+ 5544 5562 5569 5604 5605 5637 
+ 5552 5558 5579 5594 5610 5618 
+ 5555 5565 5597 5619 
+ 5545 5560 5572 5602 5613 5633 
+ 5546 5556 5575 5600 5616 5632 
+ 5519 5526 5570 5577 5617 5639 5651 
+ 5557 5567 5584 5601 5614 5624 
+ 5558 5564 5588 5599 5618 5627 
+ 5538 5541 5574 5631 5650 5676 
+ 5563 5573 5586 5603 5615 5626 
+ 5565 5576 5589 5606 5619 5630 
+ 5554 5572 5581 5613 5622 5643 
+ 5564 5570 5594 5617 5627 5644 
+ 5556 5571 5591 5612 5632 5646 
+ 5567 5579 5593 5610 5624 5638 
+ 5560 5575 5590 5616 5633 5648 
+ 5573 5584 5596 5614 5626 5640 
+ 5569 5574 5587 5631 5637 5658 
+ 5562 5581 5587 5622 5637 5656 
+ 5576 5586 5597 5615 5630 5642 
+ 5492 5553 5585 5670 5701 
+ 5509 5536 5582 5635 5688 5694 
+ 5272 5282 5583 5647 5848 5870 
+ 5579 5588 5601 5618 5638 5645 
+ 3878 4888 5317 5652 6391 6507 
+ 5571 5600 5646 5657 
+ 5572 5590 5598 5633 5643 5660 
+ 5584 5593 5603 5624 5640 5649 
+ 5586 5596 5606 5626 5642 5653 
+ 5575 5591 5602 5632 5648 5662 
+ 5570 5592 5599 5644 5651 5666 
+ 5588 5594 5610 5627 5645 5655 
+ 5589 5597 5630 5654 
+ 5516 5540 5621 5623 5691 5699 
+ 5493 5516 5620 5629 5699 5713 
+ 5581 5598 5605 5643 5656 5669 
+ 5540 5561 5620 5628 5686 5691 
+ 5593 5601 5614 5638 5649 5659 
+ 5355 5387 5578 5679 5761 5784 
+ 5596 5603 5615 5640 5653 5661 
+ 5594 5599 5618 5644 5655 5665 
+ 5561 5577 5623 5639 5678 5686 
+ 5493 5521 5621 5636 5713 5726 
+ 5597 5606 5619 5642 5654 5663 
+ 5574 5595 5604 5658 5676 5700 
+ 5591 5600 5616 5646 5662 5674 
+ 5590 5602 5613 5648 5660 5675 
+ 5446 5503 5578 5682 5742 5803 
+ 5536 5548 5608 5650 5688 5711 
+ 5518 5521 5629 5641 5726 5745 
+ 5587 5604 5605 5656 5658 5684 
+ 5601 5610 5624 5645 5659 5668 
+ 5577 5592 5628 5651 5678 5681 
+ 5603 5614 5626 5649 5661 5671 
+ 5518 5520 5636 5672 5745 5825 
+ 5606 5615 5630 5653 5663 5673 
+ 5598 5613 5622 5660 5669 5689 
+ 5599 5617 5627 5665 5666 5685 
+ 5610 5618 5638 5655 5668 5677 
+ 5600 5612 5632 5657 5674 5690 
+ 5282 5498 5609 5870 5889 
+ 5602 5616 5633 5662 5675 5693 
+ 5614 5624 5640 5659 5671 5680 
+ 5541 5548 5595 5635 5676 5711 5728 
+ 5592 5617 5639 5666 5681 5696 
+ 4830 4888 5372 5611 5974 6391 6710 
+ 5615 5626 5642 5661 5673 5683 
+ 5619 5630 5663 5687 
+ 5618 5627 5645 5665 5677 5692 
+ 5605 5622 5637 5669 5684 5703 
+ 5612 5646 5690 5702 
+ 5604 5631 5637 5684 5700 5717 
+ 5624 5638 5649 5668 5680 5695 
+ 5613 5633 5643 5675 5689 5708 
+ 5626 5640 5653 5671 5683 5697 
+ 5616 5632 5648 5674 5693 5710 
+ 5630 5642 5654 5673 5687 5698 
+ 5553 5582 5670 5694 5736 5759 
+ 5627 5644 5655 5685 5692 5705 
+ 5617 5644 5651 5685 5696 5709 
+ 5050 5180 5372 5905 5974 6160 
+ 5638 5645 5659 5677 5695 5704 
+ 5622 5643 5656 5689 5703 5718 
+ 5553 5607 5664 5701 5759 5785 
+ 5640 5649 5661 5680 5697 5706 
+ 5520 5566 5641 5682 5825 5841 
+ 5642 5653 5663 5683 5698 5712 
+ 5632 5646 5662 5690 5710 5722 
+ 5633 5648 5660 5693 5708 5723 
+ 5595 5631 5650 5700 5728 5743 
+ 5645 5655 5668 5692 5704 5715 
+ 5628 5639 5681 5686 5729 5746 
+ 5355 5486 5625 5784 5851 5863 
+ 5649 5659 5671 5695 5706 5716 
+ 5639 5651 5678 5696 5714 5729 
+ 5503 5566 5634 5672 5803 5841 
+ 5653 5661 5673 5697 5712 5719 
+ 5637 5656 5658 5703 5717 5733 
+ 5644 5665 5666 5705 5709 5720 
+ 5623 5628 5678 5691 5746 5757 
+ 5654 5663 5698 5721 
+ 5608 5635 5694 5711 5775 5792 
+ 5643 5660 5669 5708 5718 5735 
+ 5646 5657 5674 5702 5722 5732 
+ 5620 5623 5686 5699 5757 5767 
+ 5655 5665 5677 5705 5715 5724 
+ 5648 5662 5675 5710 5723 5740 
+ 5582 5608 5664 5688 5736 5775 
+ 5659 5668 5680 5704 5716 5727 
+ 5651 5666 5681 5709 5714 5725 
+ 5661 5671 5683 5706 5719 5730 
+ 5663 5673 5687 5712 5721 5731 
+ 5620 5621 5691 5713 5767 5780 
+ 5631 5658 5676 5717 5743 5753 
+ 5585 5607 5670 5707 5785 5810 
+ 5657 5690 5732 5748 
+ 5656 5669 5684 5718 5733 5750 
+ 5668 5677 5695 5715 5727 5738 
+ 5665 5685 5692 5720 5724 5737 
+ 5671 5680 5697 5716 5730 5741 
+ 5580 5585 5701 5734 5810 5888 
+ 5660 5675 5689 5723 5735 5754 
+ 5666 5685 5696 5720 5725 5739 
+ 5662 5674 5693 5722 5740 5756 
+ 5635 5650 5688 5728 5792 5804 
+ 5673 5683 5698 5719 5731 5744 
+ 5621 5629 5699 5726 5780 5809 
+ 5681 5696 5725 5729 5749 
+ 5677 5692 5704 5724 5738 5751 
+ 5680 5695 5706 5727 5741 5752 
+ 5658 5684 5700 5733 5753 5774 
+ 5669 5689 5703 5735 5750 5769 
+ 5683 5697 5712 5730 5744 5755 
+ 5685 5705 5709 5737 5739 5747 
+ 5687 5698 5731 5758 
+ 5674 5690 5710 5732 5756 5770 
+ 5675 5693 5708 5740 5754 5773 
+ 5692 5705 5715 5737 5751 5762 
+ 5696 5709 5714 5739 5749 5760 
+ 5629 5636 5713 5745 5809 5816 
+ 5695 5704 5716 5738 5752 5765 
+ 5650 5676 5711 5743 5804 5808 
+ 5678 5681 5714 5746 5749 5791 
+ 5697 5706 5719 5741 5755 5766 
+ 5698 5712 5721 5744 5758 5768 
+ 5690 5702 5722 5748 5770 5779 
+ 5684 5703 5717 5750 5774 5781 
+ 5568 5580 5707 5764 5888 5934 
+ 5689 5708 5718 5754 5769 5782 
+ 5664 5694 5759 5775 5834 
+ 5705 5720 5724 5747 5762 5772 
+ 5704 5715 5727 5751 5765 5776 
+ 5709 5720 5725 5747 5760 5771 
+ 5693 5710 5723 5756 5773 5786 
+ 5706 5716 5730 5752 5766 5777 
+ 5578 5634 5761 5803 5871 5903 
+ 5676 5700 5728 5753 5807 5808 
+ 5712 5719 5731 5755 5768 5778 
+ 5636 5641 5726 5816 5825 5891 
+ 5678 5686 5729 5757 5791 5813 
+ 5720 5737 5739 5771 5772 
+ 5702 5732 5779 5793 
+ 5714 5725 5729 5760 5791 5796 
+ 5703 5718 5733 5769 5781 5798 
+ 5715 5724 5738 5762 5776 5783 
+ 5716 5727 5741 5765 5777 5787 
+ 5700 5717 5743 5774 5794 5807 
+ 5708 5723 5735 5773 5782 5805 
+ 5719 5730 5744 5766 5778 5788 
+ 5710 5722 5740 5770 5786 5802 
+ 5686 5691 5746 5767 5813 5837 
+ 5721 5731 5768 5789 
+ 5664 5670 5736 5785 5834 5883 
+ 5725 5739 5749 5771 5796 5797 
+ 5578 5625 5742 5784 5871 5892 
+ 5724 5737 5751 5772 5783 5795 
+ 5221 5498 5528 5889 6206 6248 
+ 5559 5568 5734 5790 5934 5995 
+ 5727 5738 5752 5776 5787 5800 
+ 5730 5741 5755 5777 5788 5801 
+ 5691 5699 5757 5780 5837 5860 
+ 5731 5744 5758 5778 5789 5806 
+ 5718 5735 5750 5782 5798 5817 
+ 5722 5732 5756 5779 5802 5815 
+ 5739 5747 5760 5772 5797 5799 
+ 5737 5747 5762 5771 5795 5799 
+ 5723 5740 5754 5786 5805 5819 
+ 5717 5733 5753 5781 5794 5818 
+ 5688 5694 5736 5792 5834 5878 
+ 5738 5751 5765 5783 5800 5811 
+ 5741 5752 5766 5787 5801 5812 
+ 5744 5755 5768 5788 5806 5814 
+ 5732 5748 5770 5793 5815 5827 
+ 5699 5713 5767 5809 5860 5897 
+ 5733 5750 5774 5798 5818 5830 
+ 5735 5754 5769 5805 5817 5832 
+ 5751 5762 5776 5795 5811 5821 
+ 5625 5679 5761 5851 5892 5913 
+ 5670 5701 5759 5810 5883 5933 
+ 5740 5756 5773 5802 5819 5833 
+ 5752 5765 5777 5800 5812 5822 
+ 5755 5766 5778 5801 5814 5823 
+ 5758 5768 5806 5824 
+ 5549 5559 5764 5820 5995 6058 
+ 5729 5746 5749 5796 5813 5850 5858 
+ 5688 5711 5775 5804 5878 5916 
+ 5748 5779 5827 5842 
+ 5753 5774 5807 5818 5840 
+ 5762 5772 5783 5799 5821 5826 
+ 5749 5760 5791 5797 5839 5850 
+ 5760 5771 5796 5799 5829 5839 
+ 5750 5769 5781 5817 5830 5849 
+ 5771 5772 5795 5797 5826 5829 
+ 5765 5776 5787 5811 5822 5835 
+ 5766 5777 5788 5812 5823 5836 
+ 5756 5770 5786 5815 5833 5845 
+ 5634 5682 5742 5841 5903 5969 
+ 5711 5728 5792 5808 5896 5916 
+ 5754 5773 5782 5819 5832 5847 
+ 5768 5778 5789 5814 5824 5838 
+ 5743 5753 5794 5808 5840 5864 
+ 5728 5743 5804 5807 5864 5896 
+ 5713 5726 5780 5816 5895 5897 
+ 5701 5707 5785 5888 5933 
+ 5776 5783 5800 5821 5835 5843 
+ 5777 5787 5801 5822 5836 5844 
+ 5746 5757 5791 5837 5858 5882 
+ 5778 5788 5806 5823 5838 5846 
+ 5770 5779 5802 5827 5845 5856 
+ 5726 5745 5809 5891 5895 
+ 5769 5782 5798 5832 5849 5862 
+ 5774 5781 5794 5830 5840 5859 
+ 5773 5786 5805 5833 5847 5861 
+ 5549 5583 5790 5848 6058 6141 
+ 5783 5795 5811 5826 5843 5852 
+ 5787 5800 5812 5835 5844 5853 
+ 5788 5801 5814 5836 5846 5854 
+ 5789 5806 5838 5855 
+ 5641 5672 5745 5841 5891 5976 6020 
+ 5795 5799 5821 5829 5852 5857 
+ 5779 5793 5815 5842 5856 5869 
+ 5174 5290 5831 5952 6127 6203 
+ 5797 5799 5826 5839 5857 5867 
+ 5781 5798 5818 5849 5859 5877 
+ 5290 5486 5828 5863 6127 6131 
+ 5782 5805 5817 5847 5862 5875 
+ 5786 5802 5819 5845 5861 5873 
+ 5736 5759 5775 5878 5883 5954 
+ 5800 5811 5822 5843 5853 5865 
+ 5801 5812 5823 5844 5854 5866 
+ 5757 5767 5813 5860 5882 5915 
+ 5806 5814 5824 5846 5855 5868 
+ 5796 5797 5829 5850 5867 5879 
+ 5794 5807 5818 5859 5864 5893 
+ 5672 5682 5803 5825 5969 6020 
+ 5793 5827 5869 5880 
+ 5811 5821 5835 5852 5865 5872 
+ 5812 5822 5836 5853 5866 5874 
+ 5802 5815 5833 5856 5873 5887 
+ 5814 5823 5838 5854 5868 5876 
+ 5805 5819 5832 5861 5875 5890 
+ 5583 5609 5820 5870 6141 6180 
+ 5798 5817 5830 5862 5877 5898 
+ 5791 5796 5839 5858 5879 5899 
+ 5679 5784 5863 5913 6055 
+ 5821 5826 5843 5857 5872 5881 
+ 5822 5835 5844 5865 5874 5884 
+ 5823 5836 5846 5866 5876 5885 
+ 5824 5838 5868 5886 
+ 5815 5827 5845 5869 5887 5904 
+ 5826 5829 5852 5867 5881 5894 
+ 5791 5813 5850 5882 5899 5918 
+ 5818 5830 5840 5877 5893 5912 
+ 5767 5780 5837 5897 5915 5949 
+ 5819 5833 5847 5873 5890 5906 
+ 5817 5832 5849 5875 5898 5907 
+ 5486 5679 5831 5851 6055 6131 6201 
+ 5807 5808 5840 5893 5896 5945 
+ 5835 5843 5853 5872 5884 5900 
+ 5836 5844 5854 5874 5885 5901 
+ 5829 5839 5857 5879 5894 5909 
+ 5838 5846 5855 5876 5886 5902 
+ 5827 5842 5856 5880 5904 5914 
+ 5609 5647 5848 5889 6180 6225 
+ 5742 5761 5892 5903 5991 
+ 5843 5852 5865 5881 5900 5908 
+ 5833 5845 5861 5887 5906 5919 
+ 5844 5853 5866 5884 5901 5910 
+ 5832 5847 5862 5890 5907 5923 
+ 5846 5854 5868 5885 5902 5911 
+ 5830 5849 5859 5898 5912 5926 
+ 5775 5792 5834 5916 5954 5992 
+ 5839 5850 5867 5899 5909 5925 
+ 5842 5869 5914 5924 
+ 5852 5857 5872 5894 5908 5917 
+ 5813 5837 5858 5915 5918 5940 
+ 5759 5785 5834 5933 5954 6034 
+ 5853 5865 5874 5900 5910 5920 
+ 5854 5866 5876 5901 5911 5921 
+ 5855 5868 5902 5922 
+ 5845 5856 5873 5904 5919 5931 
+ 5707 5734 5810 5933 5934 6064 
+ 5498 5647 5763 5870 6225 6248 
+ 5847 5861 5875 5906 5923 5932 
+ 5745 5816 5825 5895 5976 5984 
+ 5761 5784 5871 5913 5991 6022 
+ 5840 5859 5864 5912 5945 5953 
+ 5857 5867 5881 5909 5917 5930 
+ 5809 5816 5891 5897 5972 5984 
+ 5804 5808 5864 5916 5945 5982 
+ 5780 5809 5860 5895 5949 5972 5996 
+ 5849 5862 5877 5907 5926 5936 
+ 5850 5858 5879 5918 5925 5941 
+ 5865 5872 5884 5908 5920 5927 
+ 5866 5874 5885 5910 5921 5928 
+ 5868 5876 5886 5911 5922 5929 
+ 5742 5803 5871 5969 5991 6068 
+ 5856 5869 5887 5914 5931 5939 
+ 5180 5528 5667 6160 6206 6522 
+ 5861 5873 5890 5919 5932 5943 
+ 5862 5875 5898 5923 5936 5944 
+ 5872 5881 5900 5917 5927 5937 
+ 5867 5879 5894 5925 5930 5942 
+ 5874 5884 5901 5920 5928 5935 
+ 5876 5885 5902 5921 5929 5938 
+ 5859 5877 5893 5926 5953 5960 
+ 5784 5851 5892 6022 6055 
+ 5869 5880 5904 5924 5939 5951 
+ 5837 5860 5882 5940 5949 5973 
+ 5792 5804 5878 5896 5982 5992 6029 
+ 5881 5894 5908 5930 5937 5950 
+ 5858 5882 5899 5940 5941 5965 
+ 5873 5887 5906 5931 5943 5955 
+ 5884 5900 5910 5927 5935 5948 
+ 5885 5901 5911 5928 5938 5946 
+ 5886 5902 5929 5947 
+ 5875 5890 5907 5932 5944 5959 
+ 5880 5914 5951 5961 
+ 5879 5899 5909 5941 5942 5962 
+ 5877 5898 5912 5936 5960 5970 
+ 5900 5908 5920 5937 5948 5958 
+ 5901 5910 5921 5935 5946 5957 
+ 5902 5911 5922 5938 5947 5956 
+ 5894 5909 5917 5942 5950 5963 
+ 5887 5904 5919 5939 5955 5967 
+ 5890 5906 5923 5943 5959 5971 
+ 5785 5810 5883 5888 6034 6064 6135 
+ 5734 5764 5888 5995 6064 6199 
+ 5910 5920 5928 5948 5957 5964 
+ 5898 5907 5926 5944 5970 5975 
+ 5908 5917 5927 5950 5958 5968 
+ 5911 5921 5929 5946 5956 5966 
+ 5904 5914 5931 5951 5967 5981 
+ 5882 5915 5918 5965 5973 6003 
+ 5899 5918 5925 5962 5965 5990 
+ 5909 5925 5930 5962 5963 5980 
+ 5906 5919 5932 5955 5971 5985 
+ 5907 5923 5936 5959 5975 5986 
+ 5864 5893 5896 5953 5982 6012 6027 
+ 5921 5928 5938 5957 5966 5978 
+ 5922 5929 5956 5977 
+ 5920 5927 5935 5958 5964 5979 
+ 5860 5897 5915 5973 5996 6017 
+ 5917 5930 5937 5963 5968 5983 
+ 5914 5924 5939 5961 5981 5993 
+ 5174 5181 5828 6203 6276 6418 
+ 5893 5912 5945 5960 6005 6012 
+ 5834 5878 5883 5992 6034 6090 
+ 5919 5931 5943 5967 5985 5998 
+ 5929 5938 5947 5966 5977 5987 
+ 5928 5935 5946 5964 5978 5988 
+ 5927 5937 5948 5968 5979 5989 
+ 5923 5932 5944 5971 5986 5999 
+ 5912 5926 5953 5970 6005 6006 
+ 5924 5951 5993 6002 
+ 5925 5941 5942 5980 5990 6004 
+ 5930 5942 5950 5980 5983 5994 
+ 5935 5948 5957 5979 5988 5997 
+ 5918 5940 5941 5990 6003 6025 
+ 5938 5946 5956 5978 5987 6000 
+ 5931 5939 5955 5981 5998 6011 
+ 5937 5950 5958 5983 5989 6001 
+ 5803 5841 5903 6020 6068 6175 
+ 5926 5936 5960 5975 6006 6009 
+ 5932 5943 5959 5985 5999 6014 
+ 5895 5897 5984 5996 6036 6098 
+ 5915 5940 5949 6003 6017 6049 
+ 5372 5652 5667 6160 6710 6724 
+ 5936 5944 5970 5986 6009 6015 
+ 5825 5891 5984 6020 6122 6138 
+ 5947 5956 5987 6007 
+ 5946 5957 5966 5988 6000 6008 
+ 5948 5958 5964 5989 5997 6010 
+ 5942 5962 5963 5994 6004 6016 
+ 5939 5951 5967 5993 6011 6024 
+ 5896 5916 5945 6027 6029 6062 
+ 5950 5963 5968 5994 6001 6013 
+ 5891 5895 5972 5976 6098 6122 
+ 5943 5955 5971 5998 6014 6028 
+ 5944 5959 5975 5999 6015 6026 
+ 5956 5966 5977 6000 6007 6019 
+ 5957 5964 5978 5997 6008 6021 
+ 5958 5968 5979 6001 6010 6023 
+ 5941 5962 5965 6004 6025 6035 
+ 5871 5892 5903 6022 6068 6153 
+ 5878 5916 5954 6029 6090 6107 
+ 5951 5961 5981 6002 6024 6033 
+ 5963 5980 5983 6013 6016 6018 
+ 5764 5790 5934 6058 6199 6302 
+ 5897 5949 5972 6017 6036 6070 
+ 5964 5979 5988 6010 6021 6030 
+ 5955 5967 5985 6011 6028 6040 
+ 5959 5971 5986 6014 6026 6041 
+ 5966 5978 5987 6008 6019 6031 
+ 5968 5983 5989 6013 6023 6032 
+ 5961 5993 6033 6048 
+ 5940 5965 5973 6025 6049 6081 
+ 5962 5980 5990 6016 6035 6039 
+ 5953 5960 6006 6012 6046 6050 
+ 5960 5970 6005 6009 6044 6046 
+ 5977 5987 6019 6037 
+ 5978 5988 6000 6021 6031 6038 
+ 5970 5975 6006 6015 6044 6045 
+ 5979 5989 5997 6023 6030 6043 
+ 5967 5981 5998 6024 6040 6053 
+ 5945 5953 6005 6027 6050 6059 
+ 5983 5994 6001 6018 6032 6042 
+ 5971 5985 5999 6028 6041 6057 
+ 5975 5986 6009 6026 6045 6056 
+ 5980 5994 6004 6018 6039 6047 
+ 5949 5973 5996 6049 6070 6092 
+ 5994 6013 6016 6042 6047 
+ 5987 6000 6007 6031 6037 6051 
+ 5825 5841 5969 5976 6138 6175 6234 
+ 5988 5997 6008 6030 6038 6052 
+ 5892 5913 5991 6055 6153 6237 
+ 5989 6001 6010 6032 6043 6054 
+ 5981 5993 6011 6033 6053 6065 
+ 5965 5990 6003 6035 6079 6081 
+ 5986 5999 6015 6041 6056 6067 
+ 5945 5982 6012 6059 6062 6085 
+ 5985 5998 6014 6040 6057 6069 
+ 5916 5982 5992 6062 6107 6119 
+ 5997 6010 6021 6043 6052 6060 
+ 6000 6008 6019 6038 6051 6061 
+ 6001 6013 6023 6042 6054 6063 
+ 5993 6002 6024 6048 6065 6077 
+ 5883 5933 5954 6090 6135 6190 
+ 5990 6004 6025 6039 6079 6087 
+ 5972 5996 6070 6094 6098 
+ 6007 6019 6051 6072 
+ 6008 6021 6031 6052 6061 6073 
+ 6004 6016 6035 6047 6076 6087 
+ 5998 6011 6028 6053 6069 6088 
+ 5999 6014 6026 6057 6067 6089 
+ 6013 6018 6032 6047 6063 6071 
+ 6010 6023 6030 6054 6060 6075 
+ 6006 6009 6045 6046 6074 6078 
+ 6009 6015 6044 6056 6074 6083 
+ 6005 6006 6044 6050 6078 6080 
+ 6016 6018 6039 6042 6071 6076 
+ 6002 6033 6077 6093 
+ 5973 6003 6017 6081 6092 6120 
+ 6005 6012 6046 6059 6080 6082 
+ 6019 6031 6037 6061 6072 6084 
+ 6021 6030 6038 6060 6073 6086 
+ 6011 6024 6040 6065 6088 6099 
+ 6023 6032 6043 6063 6075 6091 
+ 5851 5863 5913 6022 6201 6237 
+ 6015 6026 6045 6067 6083 6100 
+ 6014 6028 6041 6069 6089 6101 
+ 5790 5820 5995 6141 6302 6447 
+ 6012 6027 6050 6082 6085 6109 
+ 6030 6043 6052 6075 6086 6095 
+ 6031 6038 6051 6073 6084 6097 
+ 5982 6027 6029 6085 6119 6123 
+ 6032 6042 6054 6071 6091 6096 
+ 5888 5933 5934 6135 6199 6318 
+ 6024 6033 6053 6077 6099 6111 
+ 4973 5181 6102 6276 6767 6884 
+ 6026 6041 6056 6089 6100 6113 
+ 5903 5969 5991 6153 6175 6269 
+ 6028 6040 6057 6088 6101 6115 
+ 5996 6017 6036 6092 6094 6132 
+ 6042 6047 6063 6076 6096 6103 
+ 6037 6051 6084 6104 
+ 6038 6052 6061 6086 6097 6105 
+ 6044 6045 6078 6083 6106 
+ 6043 6054 6060 6091 6095 6108 
+ 6039 6047 6071 6087 6103 6114 
+ 6033 6048 6065 6093 6111 6121 
+ 6044 6046 6074 6080 6106 6110 
+ 6025 6035 6081 6087 6143 6148 
+ 6046 6050 6078 6082 6110 6112 
+ 6003 6025 6049 6079 6120 6148 6163 
+ 6050 6059 6080 6109 6112 
+ 6045 6056 6074 6100 6106 6124 
+ 6051 6061 6072 6097 6104 6116 
+ 6027 6059 6062 6109 6123 6144 
+ 6052 6060 6073 6095 6105 6117 
+ 6035 6039 6076 6079 6114 6143 
+ 6040 6053 6069 6099 6115 6129 
+ 6041 6057 6067 6101 6113 6130 
+ 5954 5992 6034 6107 6190 6211 
+ 6054 6063 6075 6096 6108 6118 
+ 6017 6049 6070 6120 6132 6155 
+ 6048 6077 6121 6133 
+ 6036 6070 6098 6132 6154 
+ 6060 6075 6086 6108 6117 6125 
+ 6063 6071 6091 6103 6118 6128 
+ 6061 6073 6084 6105 6116 6126 
+ 5972 5984 6036 6094 6122 6154 6220 
+ 6053 6065 6088 6111 6129 6140 
+ 6056 6067 6083 6113 6124 6145 
+ 6057 6069 6089 6115 6130 6146 
+ 4780 4973 6066 6345 6884 7178 
+ 6071 6076 6096 6114 6128 6139 
+ 6072 6084 6116 6134 
+ 6073 6086 6097 6117 6126 6136 
+ 6074 6078 6083 6110 6124 6147 
+ 5992 6029 6090 6119 6207 6211 
+ 6075 6091 6095 6118 6125 6137 
+ 6059 6082 6085 6112 6144 6172 
+ 6078 6080 6106 6112 6147 6165 
+ 6065 6077 6099 6121 6140 6152 
+ 6080 6082 6109 6110 6165 6172 
+ 6067 6089 6100 6130 6145 6161 
+ 6076 6087 6103 6139 6143 6157 
+ 6069 6088 6101 6129 6146 6156 
+ 6084 6097 6104 6126 6134 6149 
+ 6086 6095 6105 6125 6136 6150 
+ 6091 6096 6108 6128 6137 6151 
+ 6029 6062 6107 6123 6186 6207 
+ 6049 6081 6092 6155 6163 6191 
+ 6077 6093 6111 6133 6152 6164 
+ 5976 5984 6098 6138 6220 6246 
+ 6062 6085 6119 6144 6186 
+ 6083 6100 6106 6145 6147 6170 
+ 6095 6108 6117 6137 6150 6159 
+ 6097 6105 6116 6136 6149 6158 
+ 5828 5831 6131 6203 6335 6360 
+ 6096 6103 6118 6139 6151 6162 
+ 6088 6099 6115 6140 6156 6169 
+ 6089 6101 6113 6146 6161 6173 
+ 5831 5863 6127 6201 6335 6350 
+ 6070 6092 6094 6154 6155 6193 
+ 6093 6121 6164 6171 
+ 6104 6116 6149 6166 
+ 5933 6034 6064 6190 6318 6324 
+ 6105 6117 6126 6150 6158 6167 
+ 6108 6118 6125 6151 6159 6168 
+ 5976 6020 6122 6234 6246 6289 
+ 6103 6114 6128 6157 6162 6174 
+ 6099 6111 6129 6152 6169 6178 
+ 5820 5848 6058 6180 6447 6490 
+ 173 252 1438 12330 14856 15094 
+ 6079 6087 6114 6148 6157 6181 6182 
+ 6085 6109 6123 6172 6186 6244 
+ 6100 6113 6124 6161 6170 6188 
+ 6101 6115 6130 6156 6173 6183 
+ 6106 6110 6124 6165 6170 6195 
+ 6079 6081 6143 6163 6181 6196 
+ 6116 6126 6134 6158 6166 6176 
+ 6117 6125 6136 6159 6167 6177 
+ 6118 6128 6137 6162 6168 6179 
+ 6111 6121 6140 6164 6178 6187 
+ 5991 6022 6068 6237 6269 6346 
+ 6094 6098 6132 6193 6220 6255 
+ 6092 6120 6132 6191 6193 6241 
+ 6115 6129 6146 6169 6183 6198 
+ 6114 6139 6143 6174 6182 6192 
+ 6126 6136 6149 6167 6176 6184 
+ 6125 6137 6150 6168 6177 6185 
+ 5667 5905 5974 6522 6724 
+ 6113 6130 6145 6173 6188 6204 
+ 6128 6139 6151 6174 6179 6189 
+ 6081 6120 6148 6191 6196 6219 
+ 6121 6133 6152 6171 6187 6202 
+ 6110 6112 6147 6172 6195 6238 
+ 6134 6149 6176 6194 
+ 6136 6150 6158 6177 6184 6197 
+ 6137 6151 6159 6179 6185 6200 
+ 6129 6140 6156 6178 6198 6212 
+ 6124 6145 6147 6188 6195 6224 
+ 6133 6164 6202 6213 
+ 6109 6112 6144 6165 6238 6244 
+ 6130 6146 6161 6183 6204 6216 
+ 6139 6157 6162 6189 6192 6208 
+ 5969 6020 6068 6234 6269 6353 6400 
+ 6149 6158 6166 6184 6194 6205 
+ 6150 6159 6167 6185 6197 6210 
+ 6140 6152 6169 6187 6212 6221 
+ 6151 6162 6168 6189 6200 6214 
+ 5848 5870 6141 6225 6490 6630 
+ 6143 6148 6182 6196 6215 6223 
+ 6143 6157 6181 6192 6209 6215 
+ 6146 6156 6173 6198 6216 6230 
+ 6158 6167 6176 6197 6205 6217 
+ 6159 6168 6177 6200 6210 6218 
+ 6119 6123 6144 6207 6244 6287 
+ 6152 6164 6178 6202 6221 6233 
+ 6145 6161 6170 6204 6224 6240 
+ 6162 6174 6179 6208 6214 6226 
+ 6034 6090 6135 6211 6324 6328 
+ 6120 6155 6163 6219 6241 6267 
+ 6157 6174 6182 6208 6209 6222 
+ 6132 6154 6155 6241 6255 6281 
+ 6166 6176 6205 6227 
+ 6147 6165 6170 6224 6238 6260 
+ 6148 6163 6181 6219 6223 6232 
+ 6167 6177 6184 6210 6217 6228 
+ 6156 6169 6183 6212 6230 6242 
+ 5934 5995 6064 6302 6318 6435 
+ 6168 6179 6185 6214 6218 6231 
+ 5863 6055 6131 6237 6350 6390 
+ 6164 6171 6187 6213 6233 6245 
+ 5828 5952 6127 6360 6418 6455 
+ 6161 6173 6188 6216 6240 6252 
+ 6176 6184 6194 6217 6227 6235 
+ 5528 5763 5905 6248 6522 7007 7248 
+ 6107 6119 6186 6211 6287 6316 
+ 6174 6189 6192 6222 6226 6236 
+ 6182 6192 6215 6222 6229 
+ 6177 6185 6197 6218 6228 6239 
+ 6090 6107 6190 6207 6316 6328 
+ 6169 6178 6198 6221 6242 6253 
+ 6171 6202 6245 6254 
+ 6179 6189 6200 6226 6231 6247 
+ 6181 6182 6209 6223 6229 6249 
+ 6173 6183 6204 6230 6252 6262 
+ 6184 6197 6205 6228 6235 6250 
+ 6185 6200 6210 6231 6239 6251 
+ 6163 6191 6196 6232 6266 6267 
+ 6098 6122 6154 6246 6255 6311 6322 
+ 6178 6187 6212 6233 6253 6265 
+ 6192 6208 6209 6229 6236 6243 
+ 6181 6196 6215 6232 6249 6256 
+ 6170 6188 6195 6240 6260 6275 
+ 5870 5889 6180 6248 6630 6811 
+ 6189 6208 6214 6236 6247 6257 
+ 6194 6205 6235 6258 
+ 6197 6210 6217 6239 6250 6259 
+ 6209 6215 6222 6243 6249 6261 
+ 6183 6198 6216 6242 6262 6271 
+ 6200 6214 6218 6247 6251 6263 
+ 6196 6219 6223 6256 6266 
+ 6187 6202 6221 6245 6265 6272 
+ 6020 6138 6175 6289 6353 6382 
+ 6205 6217 6227 6250 6258 6268 
+ 6208 6222 6226 6243 6257 6264 
+ 6022 6055 6153 6201 6346 6390 6471 
+ 6165 6172 6195 6244 6260 6317 6319 
+ 6210 6218 6228 6251 6259 6270 
+ 6188 6204 6224 6252 6275 6285 
+ 6155 6191 6193 6267 6281 6300 
+ 6198 6212 6230 6253 6271 6278 
+ 6222 6229 6236 6261 6264 
+ 6144 6172 6186 6238 6287 6319 
+ 6202 6213 6233 6254 6272 6279 
+ 6122 6138 6220 6289 6311 6340 
+ 6214 6226 6231 6257 6263 6273 
+ 5763 5889 6206 6225 6811 7007 
+ 6215 6223 6229 6256 6261 6283 6294 
+ 6217 6228 6235 6259 6268 6274 
+ 6218 6231 6239 6263 6270 6277 
+ 6204 6216 6240 6262 6285 6291 
+ 6212 6221 6242 6265 6278 6292 
+ 6213 6245 6279 6290 
+ 6154 6193 6220 6281 6322 6341 
+ 6223 6232 6249 6266 6293 6294 
+ 6226 6236 6247 6264 6273 6280 
+ 6227 6235 6268 6282 
+ 6228 6239 6250 6270 6274 6286 
+ 6195 6224 6238 6275 6315 6317 
+ 6229 6243 6249 6264 6283 6284 
+ 6216 6230 6252 6271 6291 6297 
+ 6231 6247 6251 6273 6277 6288 
+ 6236 6243 6257 6261 6280 6284 
+ 6221 6233 6253 6272 6292 6298 
+ 6219 6232 6256 6267 6293 6305 
+ 6191 6219 6241 6266 6300 6305 6321 
+ 6235 6250 6258 6274 6282 6295 
+ 6068 6153 6175 6346 6400 6454 
+ 6239 6251 6259 6277 6286 6296 
+ 6230 6242 6262 6278 6297 6306 
+ 6233 6245 6265 6279 6298 6307 
+ 6247 6257 6263 6280 6288 6299 
+ 6250 6259 6268 6286 6295 6301 
+ 6224 6240 6260 6285 6315 6323 
+ 5181 5952 6066 6418 6767 6815 
+ 6251 6263 6270 6288 6296 6303 
+ 6242 6253 6271 6292 6306 6313 
+ 6245 6254 6272 6290 6307 6314 
+ 6257 6264 6273 6284 6299 6304 
+ 6193 6241 6255 6300 6341 6354 
+ 6258 6268 6295 6308 
+ 6249 6261 6284 6294 6309 6326 
+ 6261 6264 6280 6283 6304 6309 
+ 6240 6252 6275 6291 6323 6325 
+ 6259 6270 6274 6296 6301 6310 
+ 6186 6207 6244 6316 6319 6431 6453 
+ 6263 6273 6277 6299 6303 6312 
+ 6138 6234 6246 6340 6382 6411 
+ 6254 6279 6314 6332 
+ 6252 6262 6285 6297 6325 6331 
+ 6253 6265 6278 6298 6313 6333 
+ 6256 6266 6294 6305 6330 
+ 6249 6256 6283 6293 6326 6330 6359 
+ 6268 6274 6282 6301 6308 6320 
+ 6270 6277 6286 6303 6310 6327 
+ 6262 6271 6291 6306 6331 6338 
+ 6265 6272 6292 6307 6333 6339 
+ 6273 6280 6288 6304 6312 6329 
+ 6241 6267 6281 6321 6354 6366 
+ 6274 6286 6295 6310 6320 6334 
+ 5995 6058 6199 6435 6447 6581 
+ 6277 6288 6296 6312 6327 6336 
+ 6280 6284 6299 6309 6329 6337 
+ 6266 6267 6293 6321 6330 6344 
+ 6271 6278 6297 6313 6338 6348 
+ 6272 6279 6298 6314 6339 6349 
+ 6282 6295 6320 6342 
+ 6283 6284 6304 6326 6337 6351 
+ 6286 6296 6301 6327 6334 6343 
+ 6220 6246 6322 6340 6373 6377 
+ 6288 6299 6303 6329 6336 6347 
+ 6278 6292 6306 6333 6348 6357 
+ 6279 6290 6307 6332 6349 6356 
+ 6260 6275 6317 6323 6371 6381 
+ 6207 6211 6287 6328 6453 6464 
+ 6238 6260 6315 6319 6381 6402 
+ 6064 6135 6199 6324 6435 6517 6558 
+ 6238 6244 6287 6317 6402 6431 
+ 6295 6301 6308 6334 6342 6352 
+ 6267 6300 6305 6344 6366 6379 
+ 6220 6255 6311 6341 6373 6389 
+ 6275 6285 6315 6325 6363 6371 
+ 6135 6190 6318 6328 6484 6517 
+ 6285 6291 6323 6331 6361 6363 
+ 6283 6294 6309 6351 6359 6374 
+ 6296 6303 6310 6336 6343 6355 
+ 6190 6211 6316 6324 6464 6484 
+ 6299 6304 6312 6337 6347 6358 
+ 6293 6294 6305 6344 6359 6369 
+ 6291 6297 6325 6338 6361 6365 
+ 6290 6314 6356 6367 
+ 6292 6298 6313 6339 6357 6368 
+ 6301 6310 6320 6343 6352 6362 
+ 6127 6131 6350 6360 6552 6569 
+ 6303 6312 6327 6347 6355 6364 
+ 6304 6309 6329 6351 6358 6370 
+ 6297 6306 6331 6348 6365 6375 
+ 6298 6307 6333 6349 6368 6378 
+ 6246 6289 6311 6377 6411 6436 
+ 6255 6281 6322 6354 6389 6409 
+ 6308 6320 6352 15382 
+ 6310 6327 6334 6355 6362 6372 
+ 6305 6321 6330 6369 6379 
+ 4557 4780 6102 6996 7178 8355 
+ 6153 6237 6269 6454 6471 6540 
+ 6312 6329 6336 6358 6364 6376 
+ 6306 6313 6338 6357 6375 6384 
+ 6307 6314 6339 6356 6378 6385 
+ 6131 6201 6335 6390 6569 6604 
+ 6309 6326 6337 6370 6374 6386 
+ 6320 6334 6342 6362 6380 15382 
+ 6175 6234 6382 6400 6476 6530 
+ 6281 6300 6341 6366 6409 6422 
+ 6327 6336 6343 6364 6372 6383 
+ 6314 6332 6349 6367 6385 6394 
+ 6313 6333 6348 6368 6384 6395 
+ 6329 6337 6347 6370 6376 6387 
+ 6294 6326 6330 6369 6374 6404 6412 
+ 6127 6203 6335 6455 6552 6573 
+ 6325 6331 6363 6365 6393 6396 
+ 6334 6343 6352 6372 6380 6388 
+ 6323 6325 6361 6371 6393 6403 
+ 6336 6347 6355 6376 6383 6392 
+ 6331 6338 6361 6375 6396 6399 
+ 6300 6321 6354 6379 6422 6432 
+ 6332 6356 6394 6405 
+ 6333 6339 6357 6378 6395 6406 
+ 6330 6344 6359 6379 6412 6428 
+ 6337 6351 6358 6386 6387 6401 
+ 6315 6323 6363 6381 6403 6413 
+ 6343 6355 6362 6383 6388 6398 
+ 6311 6322 6377 6389 6419 6426 
+ 6326 6351 6359 6386 6404 6414 
+ 6338 6348 6365 6384 6399 6416 
+ 6347 6358 6364 6387 6392 6407 
+ 6311 6340 6373 6426 6436 
+ 6339 6349 6368 6385 6406 6417 
+ 6321 6344 6366 6369 6428 6432 
+ 6352 6362 6388 6397 6410 15382 
+ 6315 6317 6371 6402 6413 6445 
+ 6234 6289 6353 6411 6476 6512 
+ 6355 6364 6372 6392 6398 6415 
+ 6348 6357 6375 6395 6416 6424 
+ 6349 6356 6378 6394 6417 6427 
+ 6351 6370 6374 6401 6414 6423 
+ 6358 6370 6376 6401 6407 6421 
+ 6362 6372 6380 6398 6410 6420 
+ 6322 6341 6373 6409 6419 6462 
+ 6201 6237 6350 6471 6604 6643 
+ 5611 5652 6507 6710 7436 7933 
+ 6364 6376 6383 6407 6415 6425 
+ 6361 6363 6396 6403 6429 6433 
+ 6356 6367 6385 6405 6427 6440 
+ 6357 6368 6384 6406 6424 6441 
+ 6361 6365 6393 6399 6429 6438 
+ 6380 6410 6430 15382 
+ 6372 6383 6388 6415 6420 6434 
+ 6365 6375 6396 6416 6438 6448 
+ 6175 6269 6353 6454 6530 6563 
+ 6370 6386 6387 6421 6423 6442 
+ 6317 6319 6381 6431 6445 6496 6514 
+ 6363 6371 6393 6413 6433 6437 
+ 6359 6374 6412 6414 6439 6452 
+ 6367 6394 6440 6450 
+ 6368 6378 6395 6417 6441 6451 
+ 6376 6387 6392 6421 6425 6443 
+ 239 4560 5091 7295 14718 14884 
+ 6341 6354 6389 6422 6462 6488 
+ 6380 6388 6397 6420 6430 6444 
+ 6289 6340 6382 6436 6512 6526 
+ 6359 6369 6404 6428 6452 6473 
+ 6371 6381 6403 6437 6445 6468 
+ 6374 6386 6404 6423 6439 6446 
+ 6383 6392 6398 6425 6434 6449 
+ 6375 6384 6399 6424 6448 6460 
+ 6378 6385 6406 6427 6451 6463 
+ 5952 6203 6276 6455 6685 6815 6912 
+ 6373 6389 6426 6462 6499 
+ 6388 6398 6410 6434 6444 6456 
+ 6387 6401 6407 6442 6443 6458 
+ 6354 6366 6409 6432 6488 6519 
+ 6386 6401 6414 6442 6446 6457 
+ 6384 6395 6416 6441 6460 6472 
+ 6392 6407 6415 6443 6449 6461 
+ 6373 6377 6419 6436 6499 6531 
+ 6385 6394 6417 6440 6463 6474 
+ 6369 6379 6412 6432 6473 6504 
+ 6393 6396 6433 6438 6459 6469 
+ 6397 6410 6444 6465 
+ 6287 6319 6402 6453 6514 6532 
+ 6366 6379 6422 6428 6504 6519 
+ 6393 6403 6429 6437 6459 6466 
+ 6398 6415 6420 6449 6456 6470 
+ 6199 6302 6318 6558 6581 6649 
+ 6340 6377 6411 6426 6526 6531 
+ 6403 6413 6433 6466 6468 
+ 6396 6399 6429 6448 6469 6481 
+ 6404 6414 6446 6452 6467 
+ 6394 6405 6427 6450 6474 6483 
+ 6395 6406 6424 6451 6472 6485 
+ 6401 6421 6423 6457 6458 6475 
+ 6407 6421 6425 6458 6461 6478 
+ 6410 6420 6430 6456 6465 6479 
+ 6381 6402 6413 6468 6496 6508 
+ 6414 6423 6439 6457 6467 6477 
+ 6058 6141 6302 6490 6581 6721 6765 
+ 6399 6416 6438 6460 6481 6493 
+ 6415 6425 6434 6461 6470 6482 
+ 6405 6440 6483 6495 
+ 6406 6417 6441 6463 6485 6497 
+ 6404 6412 6439 6467 6473 6487 
+ 6287 6316 6431 6464 6532 6560 6571 
+ 6269 6346 6400 6540 6563 6619 
+ 6203 6360 6418 6573 6685 
+ 6420 6434 6444 6470 6479 6486 
+ 6423 6442 6446 6475 6477 6480 
+ 6421 6442 6443 6475 6478 6489 
+ 6429 6433 6466 6469 6491 
+ 6416 6424 6448 6472 6493 6505 
+ 6425 6443 6449 6478 6482 6492 
+ 6389 6409 6419 6488 6499 6543 
+ 6417 6427 6451 6474 6497 6506 
+ 6316 6328 6453 6484 6571 6608 
+ 6430 6444 6479 6498 
+ 6433 6437 6459 6468 6491 6510 
+ 6439 6446 6452 6477 6487 6500 
+ 6413 6437 6445 6466 6508 6510 
+ 6429 6438 6459 6481 6491 6513 
+ 6434 6449 6456 6482 6486 6502 
+ 6237 6346 6390 6540 6643 6686 
+ 6424 6441 6460 6485 6505 6518 
+ 6412 6428 6452 6487 6504 6523 
+ 6427 6440 6463 6483 6506 6516 
+ 6442 6457 6458 6480 6489 6501 
+ 6353 6382 6512 6530 6590 
+ 6446 6457 6467 6480 6500 6503 
+ 6443 6458 6461 6489 6492 6509 
+ 6444 6456 6465 6486 6498 6511 
+ 6457 6475 6477 6501 6503 
+ 6438 6448 6469 6493 6513 15383 
+ 6449 6461 6470 6492 6502 6515 
+ 6440 6450 6474 6495 6516 6525 
+ 6324 6328 6464 6517 6608 6647 
+ 6441 6451 6472 6497 6518 6527 
+ 6456 6470 6479 6502 6511 6521 
+ 6452 6467 6473 6500 6523 6541 
+ 6409 6422 6462 6519 6543 6570 
+ 6458 6475 6478 6501 6509 6520 
+ 6141 6180 6447 6630 6721 6882 
+ 6459 6466 6469 6510 6513 6536 
+ 6461 6478 6482 6509 6515 6524 
+ 6448 6460 6481 6505 6539 15383 
+ 4995 5317 6507 6562 8232 11299 
+ 6450 6483 6525 6535 
+ 6402 6445 6508 6514 6578 6580 
+ 6451 6463 6485 6506 6527 6538 
+ 6465 6479 6511 6528 
+ 6419 6426 6462 6531 6543 6613 
+ 6467 6477 6487 6503 6533 6541 
+ 6475 6480 6489 6503 6520 6529 
+ 6470 6482 6486 6515 6521 6534 
+ 6477 6480 6500 6501 6529 6533 
+ 6428 6432 6473 6519 6523 6555 6575 
+ 6460 6472 6493 6518 6539 6546 
+ 6463 6474 6497 6516 6538 6545 
+ 5317 5611 6391 6494 7436 8232 
+ 6445 6468 6496 6510 6576 6580 
+ 6478 6489 6492 6520 6524 6537 
+ 6466 6468 6491 6508 6536 6576 
+ 6479 6486 6498 6521 6528 6542 
+ 6382 6411 6476 6526 6590 6622 
+ 6469 6481 6491 6536 6557 15383 
+ 6402 6431 6496 6532 6572 6578 
+ 6482 6492 6502 6524 6534 6544 
+ 6474 6483 6506 6525 6545 6551 
+ 6318 6324 6484 6558 6647 6699 
+ 6472 6485 6505 6527 6546 6556 
+ 6422 6432 6488 6504 6570 6575 6602 
+ 6489 6501 6509 6529 6537 6547 
+ 6486 6502 6511 6534 6542 6548 
+ 5905 6160 6206 6724 7248 7709 
+ 6473 6487 6504 6541 6555 6568 
+ 6492 6509 6515 6537 6544 6550 
+ 6483 6495 6516 6535 6551 6561 
+ 6411 6436 6512 6531 6622 6632 
+ 6485 6497 6518 6538 6556 6565 
+ 6498 6511 6542 6553 
+ 6501 6503 6520 6533 6547 6554 
+ 6353 6400 6476 6563 6590 6660 
+ 6426 6436 6499 6526 6613 6632 
+ 6431 6453 6514 6560 6572 6589 
+ 6500 6503 6529 6541 6554 6566 
+ 6502 6515 6521 6544 6548 6559 
+ 6495 6525 6561 6579 
+ 6491 6510 6513 6557 6576 6594 
+ 6509 6520 6524 6547 6550 6564 
+ 6497 6506 6527 6545 6565 6582 
+ 6493 6505 6546 6574 6585 15383 
+ 6346 6454 6471 6619 6686 6692 
+ 6487 6500 6523 6533 6566 6568 6595 
+ 6511 6521 6528 6548 6553 6567 
+ 6462 6488 6499 6570 6613 6635 
+ 6515 6524 6534 6550 6559 6577 
+ 6506 6516 6538 6551 6582 6587 
+ 6505 6518 6539 6556 6585 6591 
+ 6520 6529 6537 6554 6564 6583 
+ 6521 6534 6542 6559 6567 6584 
+ 2535 5293 5550 8429 11051 14806 
+ 6524 6537 6544 6564 6577 6586 
+ 6516 6525 6545 6561 6587 6596 
+ 6335 6360 6569 6573 6708 6730 
+ 6528 6542 6567 6588 
+ 6529 6533 6547 6566 6583 6593 
+ 6504 6523 6568 6575 6603 
+ 6518 6527 6546 6565 6591 6598 
+ 6513 6536 6574 6594 6606 15383 
+ 6318 6435 6517 6649 6699 6770 
+ 6534 6544 6548 6577 6584 6592 
+ 6453 6532 6571 6589 6644 6667 
+ 6525 6535 6551 6579 6596 6600 
+ 4672 4995 6494 6740 11299 13260 
+ 6400 6454 6530 6619 6660 6738 
+ 6537 6547 6550 6583 6586 6599 
+ 6527 6538 6556 6582 6598 6605 
+ 6533 6541 6554 6593 6595 6610 
+ 6542 6548 6553 6584 6588 6597 
+ 6523 6541 6555 6595 6603 6631 
+ 6335 6350 6552 6604 6730 6776 
+ 6488 6519 6543 6602 6635 6655 
+ 6453 6464 6560 6608 6644 6676 
+ 6514 6532 6578 6589 6620 6651 
+ 6360 6455 6552 6685 6708 6852 
+ 6539 6557 6585 6606 6614 15383 
+ 6504 6519 6555 6602 6603 6627 
+ 6508 6510 6536 6580 6594 6636 6641 
+ 6544 6550 6559 6586 6592 6601 
+ 6496 6514 6572 6580 6620 6638 
+ 6535 6561 6600 6611 
+ 6496 6508 6576 6578 6636 6638 
+ 6302 6435 6447 6649 6750 6765 
+ 6538 6545 6565 6587 6605 6616 
+ 6547 6554 6564 6593 6599 6609 
+ 6548 6559 6567 6592 6597 6607 
+ 6539 6546 6574 6591 6614 6618 
+ 6550 6564 6577 6599 6601 6615 
+ 6545 6551 6582 6596 6616 6621 
+ 6553 6567 6597 6612 
+ 6532 6560 6572 6651 6667 
+ 6476 6512 6530 6622 6660 6743 
+ 6546 6556 6585 6598 6618 6625 
+ 6559 6577 6584 6601 6607 6617 
+ 6554 6566 6583 6609 6610 6624 
+ 6536 6557 6576 6606 6641 6648 
+ 6541 6566 6568 6610 6631 6637 
+ 6551 6561 6587 6600 6621 6628 
+ 6567 6584 6588 6607 6612 6623 
+ 6556 6565 6591 6605 6625 6633 
+ 6564 6583 6586 6609 6615 6626 
+ 6561 6579 6596 6611 6628 6639 
+ 6577 6586 6592 6615 6617 6629 
+ 6519 6570 6575 6627 6655 6665 
+ 6555 6568 6575 6627 6631 6658 
+ 6350 6390 6569 6643 6776 6810 
+ 6565 6582 6598 6616 6633 6645 
+ 6557 6574 6594 6614 6648 6654 
+ 6584 6592 6597 6617 6623 6634 
+ 6464 6484 6571 6647 6676 6751 
+ 6583 6593 6599 6624 6626 6642 
+ 6566 6593 6595 6624 6637 6653 
+ 6579 6600 6639 6652 
+ 6588 6597 6623 6640 
+ 6499 6531 6543 6632 6635 6747 6757 
+ 6574 6585 6606 6618 6654 6659 
+ 6586 6599 6601 6626 6629 6646 
+ 6582 6587 6605 6621 6645 6657 
+ 6592 6601 6607 6629 6634 6650 
+ 6585 6591 6614 6625 6659 6662 
+ 6454 6540 6563 6692 6738 6791 
+ 6572 6578 6638 6651 6687 
+ 6587 6596 6616 6628 6657 6663 
+ 6512 6526 6590 6632 6743 6762 
+ 6597 6607 6612 6634 6640 6656 
+ 6593 6609 6610 6642 6653 6666 
+ 6591 6598 6618 6633 6662 6669 
+ 6599 6609 6615 6642 6646 6661 
+ 6575 6602 6603 6658 6665 6679 
+ 6596 6600 6621 6639 6663 6670 
+ 6601 6615 6617 6646 6650 6664 
+ 6180 6225 6490 6811 6882 7112 
+ 6568 6595 6603 6637 6658 6680 6690 
+ 6526 6531 6613 6622 6747 6762 
+ 6598 6605 6625 6645 6669 6674 
+ 6607 6617 6623 6650 6656 6668 
+ 6543 6570 6613 6655 6745 6757 
+ 6576 6580 6638 6641 6712 6714 
+ 6595 6610 6631 6653 6671 6680 
+ 6578 6580 6620 6636 6687 6714 
+ 6600 6611 6628 6652 6670 6678 
+ 6612 6623 6656 6672 
+ 6576 6594 6636 6648 6701 6712 
+ 6609 6624 6626 6661 6666 6675 
+ 6390 6471 6604 6686 6809 6810 
+ 6560 6571 6667 6676 6764 
+ 6605 6616 6633 6657 6674 6683 
+ 6615 6626 6629 6661 6664 6673 
+ 6484 6517 6608 6699 6751 6830 
+ 6594 6606 6641 6654 6697 6701 
+ 6435 6558 6581 6750 6770 6825 
+ 6617 6629 6634 6664 6668 6677 
+ 6572 6589 6620 6667 6687 6773 
+ 6611 6639 6678 6684 
+ 6610 6624 6637 6666 6671 6681 
+ 6606 6614 6648 6659 6694 6697 
+ 6570 6602 6635 6665 6734 6745 
+ 6623 6634 6640 6668 6672 6682 
+ 6616 6621 6645 6663 6683 6691 
+ 6603 6627 6631 6679 6690 6716 
+ 6614 6618 6654 6662 6694 6696 
+ 6530 6563 6590 6738 6743 6863 
+ 6626 6642 6646 6673 6675 6688 
+ 6618 6625 6659 6669 6696 6703 
+ 6621 6628 6657 6670 6691 6702 
+ 6629 6646 6650 6673 6677 6689 
+ 6602 6627 6655 6679 6729 6734 
+ 6624 6642 6653 6675 6681 6693 
+ 6560 6589 6644 6651 6764 6773 
+ 6634 6650 6656 6677 6682 6695 
+ 6625 6633 6662 6674 6703 6707 
+ 6628 6639 6663 6678 6702 6709 
+ 6637 6653 6680 6681 6698 
+ 6640 6656 6682 6700 
+ 6646 6661 6664 6688 6689 6704 
+ 6633 6645 6669 6683 6707 6715 
+ 6642 6661 6666 6688 6693 6705 
+ 6571 6608 6644 6751 6764 6854 
+ 6650 6664 6668 6689 6695 6706 
+ 6639 6652 6670 6684 6709 6717 
+ 6627 6658 6665 6716 6729 
+ 6631 6637 6671 6690 6698 6723 
+ 6653 6666 6671 6693 6698 6711 
+ 6656 6668 6672 6695 6700 6713 
+ 6645 6657 6674 6691 6715 6722 
+ 6652 6678 6717 6726 
+ 6418 6455 6573 6852 6912 7030 
+ 6471 6540 6643 6692 6809 6845 
+ 6620 6638 6651 6714 6773 6801 
+ 6661 6673 6675 6704 6705 6718 
+ 6664 6673 6677 6704 6706 6720 
+ 6631 6658 6680 6716 6723 6761 
+ 6657 6663 6683 6702 6722 6728 
+ 6540 6619 6686 6791 6845 
+ 6666 6675 6681 6705 6711 6719 
+ 6654 6659 6696 6697 6732 6739 
+ 6668 6677 6682 6706 6713 6725 
+ 6659 6662 6694 6703 6732 6736 
+ 6648 6654 6694 6701 6739 6744 
+ 6671 6680 6681 6711 6723 6735 
+ 6517 6558 6647 6770 6830 6915 
+ 6672 6682 6713 6727 
+ 6641 6648 6697 6712 6744 6756 
+ 6663 6670 6691 6709 6728 6741 
+ 6662 6669 6696 6707 6736 6742 
+ 6673 6688 6689 6718 6720 6731 
+ 6675 6688 6693 6718 6719 6733 
+ 6677 6689 6695 6720 6725 6737 
+ 6669 6674 6703 6715 6742 6753 
+ 6552 6573 6730 6852 6892 
+ 6670 6678 6702 6717 6741 6752 
+ 5652 5974 6391 6724 7933 8666 
+ 6681 6693 6698 6719 6735 6748 
+ 6636 6641 6701 6714 6756 6794 
+ 6682 6695 6700 6725 6727 6746 
+ 6636 6638 6687 6712 6794 6801 6838 
+ 6674 6683 6707 6722 6753 6759 
+ 6658 6679 6690 6729 6761 6784 
+ 6678 6684 6709 6726 6752 6760 
+ 6688 6704 6705 6731 6733 6754 
+ 6693 6705 6711 6733 6748 6749 
+ 6689 6704 6706 6731 6737 6755 
+ 6447 6490 6765 6882 6987 
+ 6683 6691 6715 6728 6759 6768 
+ 6680 6690 6698 6735 6761 6786 
+ 5974 6160 6522 6710 7709 8666 
+ 6695 6706 6713 6737 6746 6758 
+ 6684 6717 6760 6771 
+ 6700 6713 6746 6763 
+ 6691 6702 6722 6741 6768 15384 
+ 6665 6679 6716 6734 6784 6799 
+ 6552 6569 6708 6776 6892 6941 
+ 6704 6718 6720 6754 6755 6769 
+ 6694 6696 6736 6739 6777 6780 
+ 6705 6718 6719 6749 6754 6766 
+ 6655 6665 6729 6745 6799 6821 
+ 6698 6711 6723 6748 6779 6786 
+ 6696 6703 6732 6742 6777 6781 
+ 6706 6720 6725 6755 6758 6772 
+ 6563 6619 6660 6791 6863 6936 
+ 6694 6697 6732 6744 6778 6780 
+ 4560 4672 6562 7295 13260 14209 
+ 6702 6709 6728 6752 6785 15384 
+ 6703 6707 6736 6753 6781 6788 
+ 6590 6622 6660 6762 6863 6972 
+ 6697 6701 6739 6756 6778 6783 
+ 6635 6655 6734 6757 6821 6851 
+ 6713 6725 6727 6758 6763 6775 
+ 6613 6632 6757 6762 6905 6937 
+ 6711 6719 6735 6749 6774 6779 
+ 6719 6733 6748 6766 6774 
+ 6581 6649 6765 6825 15386 
+ 6608 6647 6676 6830 6854 6970 
+ 6709 6717 6741 6760 6785 6790 
+ 6707 6715 6742 6759 6788 6792 
+ 6718 6731 6733 6766 6769 6782 
+ 6720 6731 6737 6769 6772 6787 
+ 6701 6712 6744 6783 6794 6822 
+ 6613 6635 6745 6747 6851 6905 
+ 6725 6737 6746 6772 6775 6789 
+ 6715 6722 6753 6768 6792 6798 
+ 6717 6726 6752 6771 6790 6797 
+ 6690 6716 6723 6784 6786 6829 6833 
+ 6622 6632 6743 6747 6937 6972 
+ 6727 6746 6775 6793 
+ 6644 6667 6676 6773 6854 6895 
+ 6447 6581 6721 6750 6987 15386 
+ 6733 6749 6754 6774 6782 6795 
+ 6066 6276 6815 6884 7528 7730 
+ 6722 6728 6759 6798 6804 15384 
+ 6731 6754 6755 6782 6787 6796 
+ 6558 6649 6699 6825 6915 7006 
+ 6726 6760 6797 6805 
+ 6737 6755 6758 6787 6789 6800 
+ 6651 6667 6687 6764 6801 6895 6928 
+ 6748 6749 6766 6779 6795 6802 
+ 6746 6758 6763 6789 6793 6803 
+ 6569 6604 6730 6810 6941 6998 
+ 6732 6736 6780 6781 6813 6816 
+ 6739 6744 6780 6783 6806 6807 
+ 6735 6748 6774 6786 6802 6826 
+ 6732 6739 6777 6778 6807 6813 
+ 6736 6742 6777 6788 6816 6818 
+ 6754 6766 6769 6795 6796 6808 
+ 6744 6756 6778 6806 6822 
+ 6716 6729 6761 6799 6833 6848 
+ 6741 6752 6790 6812 6819 15384 
+ 6723 6735 6761 6779 6826 6829 
+ 6755 6769 6772 6796 6800 6814 
+ 6742 6753 6781 6792 6818 6824 
+ 6758 6772 6775 6800 6803 6817 
+ 6752 6760 6785 6797 6819 6827 
+ 6619 6692 6738 6845 6936 6961 
+ 6753 6759 6788 6798 6824 6832 
+ 6763 6775 6803 6820 
+ 6712 6714 6756 6822 6838 6862 
+ 6766 6774 6782 6802 6808 6823 
+ 6769 6782 6787 6808 6814 6828 
+ 6760 6771 6790 6805 6827 6835 
+ 6759 6768 6792 6804 6832 6836 
+ 6729 6734 6784 6821 6848 6871 
+ 6772 6787 6789 6814 6817 6831 
+ 6687 6714 6773 6838 6922 6928 
+ 6774 6779 6795 6823 6826 6840 
+ 6775 6789 6793 6817 6820 6834 
+ 6768 6798 6812 6836 6843 15384 
+ 6771 6797 6835 6842 
+ 6778 6783 6807 6822 6837 6853 
+ 6778 6780 6806 6813 6837 6844 
+ 6782 6795 6796 6823 6828 6839 
+ 6643 6686 6810 6845 7008 7078 
+ 6604 6643 6776 6809 6998 7078 
+ 6225 6248 6630 7007 7112 7455 
+ 6785 6804 6819 6843 6850 15384 
+ 6777 6780 6807 6816 6844 6849 
+ 6787 6796 6800 6828 6831 6841 
+ 6276 6418 6767 6912 7437 7528 
+ 6777 6781 6813 6818 6849 6855 
+ 6789 6800 6803 6831 6834 6846 
+ 6781 6788 6816 6824 6855 6860 
+ 6785 6790 6812 6827 6850 6856 
+ 6793 6803 6834 6847 
+ 6734 6745 6799 6851 6871 6908 
+ 6756 6783 6794 6806 6853 6862 6883 
+ 6795 6802 6808 6839 6840 6857 
+ 6788 6792 6818 6832 6860 6864 
+ 6649 6750 6770 7006 15386 
+ 6779 6786 6802 6829 6840 6869 6875 
+ 6790 6797 6819 6835 6856 6865 
+ 6796 6808 6814 6839 6841 6858 
+ 6761 6786 6826 6833 6869 6876 
+ 6647 6699 6751 6915 6970 7130 
+ 6800 6814 6817 6841 6846 6859 
+ 6792 6798 6824 6836 6864 6866 
+ 6761 6784 6829 6848 6876 6889 
+ 6803 6817 6820 6846 6847 6861 
+ 6797 6805 6827 6842 6865 6867 
+ 6798 6804 6832 6843 6866 6874 
+ 6806 6807 6844 6853 6868 
+ 6714 6794 6801 6862 6922 6927 
+ 6808 6823 6828 6857 6858 6872 
+ 6802 6823 6826 6857 6875 6879 
+ 6814 6828 6831 6858 6859 6870 
+ 6805 6835 6867 6878 
+ 6804 6812 6836 6850 6874 6880 
+ 6807 6813 6837 6849 6868 6881 
+ 6686 6692 6791 6809 6961 7008 
+ 6817 6831 6834 6859 6861 6873 
+ 6820 6834 6861 6877 
+ 6784 6799 6833 6871 6889 6913 
+ 6813 6816 6844 6855 6881 6890 
+ 6812 6819 6843 6856 6880 6887 
+ 6745 6757 6821 6905 6908 6967 
+ 6573 6685 6708 6892 7030 7117 
+ 6806 6822 6837 6868 6883 6902 
+ 6676 6751 6764 6895 6970 7058 
+ 6816 6818 6849 6860 6890 6894 
+ 6819 6827 6850 6865 6887 6893 
+ 6823 6839 6840 6872 6879 6891 
+ 6828 6839 6841 6870 6872 6885 
+ 6831 6841 6846 6870 6873 6886 
+ 6818 6824 6855 6864 6894 6896 
+ 6834 6846 6847 6873 6877 6888 
+ 6794 6822 6838 6883 6927 15385 
+ 6660 6738 6743 6936 6972 7151 
+ 6824 6832 6860 6866 6896 6899 
+ 6827 6835 6856 6867 6893 6897 
+ 6832 6836 6864 6874 6899 6904 
+ 6835 6842 6865 6878 6897 6907 
+ 6837 6844 6853 6881 6902 6910 
+ 6826 6829 6875 6876 6911 6916 
+ 6841 6858 6859 6885 6886 6898 
+ 6799 6821 6848 6908 6913 6945 
+ 6839 6857 6858 6885 6891 6901 
+ 6846 6859 6861 6886 6888 6900 
+ 6836 6843 6866 6880 6904 6914 
+ 6826 6840 6869 6879 6909 6911 
+ 6829 6833 6869 6889 6916 6924 
+ 6847 6861 6888 6903 
+ 6842 6867 6907 6919 
+ 6840 6857 6875 6891 6906 6909 
+ 6843 6850 6874 6887 6914 6921 
+ 6844 6849 6868 6890 6910 6925 
+ 6490 6630 6721 6987 7112 7332 
+ 6822 6853 6862 6902 6946 15385 
+ 6066 6102 6767 7178 7730 7911 
+ 6858 6870 6872 6898 6901 6917 
+ 6859 6870 6873 6898 6900 6918 
+ 6850 6856 6880 6893 6921 6926 
+ 6861 6873 6877 6900 6903 6920 
+ 6833 6848 6876 6913 6924 6943 
+ 6849 6855 6881 6894 6925 6934 
+ 6857 6872 6879 6901 6906 6923 
+ 6708 6730 6852 6941 7117 7177 
+ 6856 6865 6887 6897 6926 6930 
+ 6855 6860 6890 6896 6934 6939 
+ 6764 6773 6854 6928 7058 7081 
+ 6860 6864 6894 6899 6939 6942 
+ 6865 6867 6893 6907 6930 6940 
+ 6870 6885 6886 6917 6918 6931 
+ 6864 6866 6896 6904 6942 6944 
+ 6873 6886 6888 6918 6920 6933 
+ 6872 6885 6891 6917 6923 6932 
+ 6853 6868 6883 6910 6946 6947 
+ 6877 6888 6920 6935 
+ 6866 6874 6899 6914 6944 6951 
+ 6747 6757 6851 6937 6967 7071 7105 
+ 6879 6891 6909 6923 6929 
+ 6867 6878 6897 6919 6940 6948 
+ 6821 6851 6871 6945 6967 6986 
+ 6875 6879 6906 6911 6929 6938 
+ 6868 6881 6902 6925 6947 6957 
+ 6869 6875 6909 6916 6938 6954 
+ 6418 6685 6815 7030 7315 7437 
+ 6848 6871 6889 6943 6945 6968 
+ 6874 6880 6904 6921 6951 6955 
+ 6699 6770 6830 7006 7130 7326 
+ 6869 6876 6911 6924 6954 6960 
+ 6885 6898 6901 6931 6932 6949 
+ 6886 6898 6900 6931 6933 6950 
+ 6878 6907 6948 6956 
+ 6888 6900 6903 6933 6935 6952 
+ 6880 6887 6914 6926 6955 6958 
+ 6801 6838 6927 6928 7016 7039 
+ 6891 6901 6906 6929 6932 6953 
+ 6876 6889 6916 6943 6960 6974 
+ 6881 6890 6910 6934 6957 6971 
+ 6887 6893 6921 6930 6958 6966 
+ 6838 6862 6922 7005 7016 15385 
+ 6773 6801 6895 6922 7039 7081 
+ 6906 6909 6923 6938 6953 6959 
+ 6893 6897 6926 6940 6966 6969 
+ 6898 6917 6918 6949 6950 6962 
+ 6901 6917 6923 6949 6953 6964 
+ 6900 6918 6920 6950 6952 6963 
+ 6890 6894 6925 6939 6971 6977 
+ 6903 6920 6952 6965 
+ 6738 6791 6863 6961 7148 7151 
+ 6747 6762 6905 6972 7105 7195 
+ 6909 6911 6929 6954 6959 6990 
+ 6894 6896 6934 6942 6977 6980 
+ 6897 6907 6930 6948 6969 6973 
+ 6730 6776 6892 6998 7177 7243 
+ 6896 6899 6939 6944 6980 6983 
+ 6889 6913 6924 6968 6974 7001 
+ 6899 6904 6942 6951 6983 6984 
+ 6871 6908 6913 6968 6986 7004 
+ 6883 6902 6947 6981 6994 15385 
+ 6902 6910 6946 6957 6981 6993 
+ 6907 6919 6940 6956 6973 6982 
+ 6917 6931 6932 6962 6964 6979 
+ 6918 6931 6933 6962 6963 6975 
+ 6904 6914 6944 6955 6984 6985 
+ 6920 6933 6935 6963 6965 6976 
+ 6923 6929 6932 6959 6964 6978 
+ 6911 6916 6938 6960 6990 6999 
+ 6914 6921 6951 6958 6985 6988 
+ 6919 6948 6982 6989 
+ 6910 6925 6947 6971 6993 7018 
+ 6921 6926 6955 6966 6988 6997 
+ 6929 6938 6953 6978 6990 7009 
+ 6916 6924 6954 6974 6999 7013 
+ 6791 6845 6936 7008 7148 7196 
+ 6931 6949 6950 6975 6979 6995 
+ 6933 6950 6952 6975 6976 6992 
+ 6932 6949 6953 6978 6979 7000 
+ 6935 6952 6976 6991 
+ 6926 6930 6958 6969 6997 7002 
+ 6851 6905 6908 6986 7049 7071 
+ 6913 6943 6945 7001 7004 7035 
+ 6930 6940 6966 6973 7002 7011 
+ 6751 6830 6854 7058 7130 7280 
+ 6925 6934 6957 6977 7018 7026 
+ 6743 6762 6863 6937 7151 7195 7322 
+ 6940 6948 6969 6982 7011 7015 
+ 6924 6943 6960 7001 7013 7031 
+ 6950 6962 6963 6992 6995 7012 
+ 6952 6963 6965 6991 6992 7010 
+ 6934 6939 6971 6980 7026 7028 
+ 6953 6959 6964 7000 7009 7017 
+ 6949 6962 6964 6995 7000 7014 
+ 6939 6942 6977 6983 7028 7029 
+ 6946 6947 6993 6994 7033 
+ 6948 6956 6973 6989 7015 7019 
+ 6942 6944 6980 6984 7023 7029 
+ 6944 6951 6983 6985 7022 7023 
+ 6951 6955 6984 6988 7022 7024 
+ 6908 6945 6967 7004 7047 7049 
+ 6721 6765 6882 7332 7379 15386 
+ 6955 6958 6985 6997 7024 7034 
+ 6956 6982 7019 7032 
+ 6938 6954 6959 6999 7009 7027 7040 
+ 6965 6976 7010 7020 
+ 6963 6975 6976 7010 7012 7021 
+ 6947 6957 6981 7018 7033 7073 
+ 6946 6981 7005 7033 7052 15385 
+ 6962 6975 6979 7012 7014 7025 
+ 4557 5550 6345 8355 8429 13856 14069 
+ 6958 6966 6988 7002 7034 7038 
+ 6776 6810 6941 7078 7243 7316 
+ 6954 6960 6990 7013 7027 7037 
+ 6964 6978 6979 7014 7017 7036 
+ 6943 6968 6974 7031 7035 7062 
+ 6966 6969 6997 7011 7038 7043 
+ 4201 5293 7847 11051 14945 
+ 6945 6968 6986 7035 7047 7074 
+ 6927 6994 7016 7052 7077 15385 
+ 6770 6825 6915 7326 7346 15386 
+ 6206 6248 6811 7248 7455 8151 
+ 6809 6845 6961 7078 7196 7249 
+ 6959 6978 6990 7017 7040 7048 
+ 6976 6991 6992 7020 7021 7041 
+ 6969 6973 7002 7015 7043 7045 
+ 6975 6992 6995 7021 7025 7042 
+ 6960 6974 6999 7031 7037 7046 
+ 6979 6995 7000 7025 7036 7044 
+ 6973 6982 7011 7019 7045 7050 
+ 6922 6927 7005 7039 7077 7096 
+ 6978 7000 7009 7036 7048 7056 
+ 6957 6971 6993 7026 7073 7100 
+ 6982 6989 7015 7032 7050 7057 
+ 6991 7010 7041 7051 
+ 6992 7010 7012 7041 7042 7053 
+ 6984 6985 7023 7024 7060 7064 
+ 6983 6984 7022 7029 7064 7072 
+ 6985 6988 7022 7034 7060 7063 
+ 6995 7012 7014 7042 7044 7055 
+ 6971 6977 7018 7028 7090 7100 
+ 6990 6999 7037 7040 7054 7061 
+ 6977 6980 7026 7029 7080 7090 
+ 6980 6983 7023 7028 7072 7080 
+ 6685 6852 6912 7117 7269 7315 
+ 6974 7001 7013 7046 7062 7085 
+ 6989 7019 7057 7065 
+ 6981 6993 6994 7052 7073 7104 
+ 6988 6997 7024 7038 7063 7070 
+ 6968 7001 7004 7062 7074 7108 
+ 7000 7014 7017 7044 7056 7059 
+ 6999 7013 7027 7046 7061 7075 
+ 6997 7002 7034 7043 7070 7076 
+ 6922 6928 7016 7081 7096 7186 
+ 6990 7009 7027 7048 7054 7066 
+ 7010 7020 7021 7051 7053 7067 
+ 7012 7021 7025 7053 7055 7069 
+ 7002 7011 7038 7045 7076 7082 
+ 7014 7025 7036 7055 7059 7068 
+ 7011 7015 7043 7050 7082 7086 
+ 7013 7031 7037 7075 7085 
+ 6986 7004 7049 7074 7118 
+ 7009 7017 7040 7056 7066 7079 
+ 6967 6986 7047 7071 7118 7155 
+ 7015 7019 7045 7057 7086 7091 
+ 7020 7041 7067 7084 
+ 6994 7005 7033 7077 7104 7128 
+ 7021 7041 7042 7067 7069 7088 
+ 7027 7040 7061 7066 7092 
+ 7025 7042 7044 7068 7069 7089 
+ 7017 7036 7048 7059 7079 7083 
+ 7019 7032 7050 7065 7091 7093 
+ 6854 6895 6970 7081 7280 7285 
+ 7036 7044 7056 7068 7083 7087 
+ 7022 7024 7063 7064 7094 7097 
+ 7027 7037 7054 7075 7092 7113 
+ 7001 7031 7035 7085 7108 7125 
+ 7024 7034 7060 7070 7094 7102 
+ 7022 7023 7060 7072 7097 7107 
+ 7032 7057 7093 7101 
+ 7040 7048 7054 7079 7092 7103 
+ 7041 7051 7053 7084 7088 7095 
+ 7044 7055 7059 7087 7089 7099 
+ 7042 7053 7055 7088 7089 7098 
+ 7034 7038 7063 7076 7102 7106 
+ 6905 6967 7049 7105 7155 7214 
+ 7023 7029 7064 7080 7107 7121 
+ 6993 7018 7033 7100 7104 7154 
+ 7004 7035 7047 7108 7118 7152 
+ 7037 7046 7061 7085 7113 7131 
+ 7038 7043 7070 7082 7106 7110 
+ 7005 7016 7052 7096 7128 7150 
+ 6809 6810 6998 7008 7249 7316 7438 
+ 7048 7056 7066 7083 7103 7111 
+ 7028 7029 7072 7090 7121 7134 
+ 6895 6928 7039 7058 7186 7285 
+ 7043 7045 7076 7086 7110 7116 
+ 7056 7059 7079 7087 7111 7115 
+ 7051 7067 7095 7109 
+ 7031 7046 7062 7075 7125 7131 
+ 7045 7050 7082 7091 7116 7120 
+ 7059 7068 7083 7099 7115 
+ 7053 7067 7069 7095 7098 7114 
+ 7055 7068 7069 7098 7099 7119 
+ 7026 7028 7080 7100 7134 7159 
+ 7050 7057 7086 7093 7120 7122 
+ 7054 7061 7066 7103 7113 7138 
+ 7057 7065 7091 7101 7122 7124 
+ 7060 7063 7097 7102 7126 7127 
+ 7067 7084 7088 7109 7114 7123 
+ 7016 7039 7077 7150 7186 7211 
+ 7060 7064 7094 7107 7126 7132 
+ 7069 7088 7089 7114 7119 7129 
+ 7068 7087 7089 7115 7119 7137 
+ 7018 7026 7073 7090 7154 7159 7198 
+ 7065 7093 7124 7133 
+ 7063 7070 7094 7106 7127 7136 
+ 7066 7079 7092 7111 7138 7143 
+ 7033 7052 7073 7128 7154 7183 
+ 6905 6937 7071 7195 7214 7334 
+ 7070 7076 7102 7110 7136 7140 
+ 7064 7072 7097 7121 7132 7145 
+ 7035 7062 7074 7125 7152 7167 
+ 7084 7095 7123 7135 
+ 7076 7082 7106 7116 7140 7141 
+ 7079 7083 7103 7115 7142 7143 
+ 6630 6811 6882 7332 7455 8166 
+ 7061 7075 7092 7131 7138 7174 
+ 7088 7095 7098 7123 7129 7139 
+ 7083 7087 7099 7111 7137 7142 
+ 7082 7086 7110 7120 7141 7144 
+ 6852 6892 7030 7177 7269 7376 
+ 7047 7049 7074 7152 7155 7199 
+ 7089 7098 7099 7129 7137 7146 
+ 7086 7091 7116 7122 7144 7147 
+ 7072 7080 7107 7134 7145 7161 
+ 7091 7093 7120 7124 7147 7153 
+ 7095 7109 7114 7135 7139 7149 
+ 7093 7101 7122 7133 7153 7157 
+ 7062 7085 7108 7131 7167 7185 
+ 7094 7097 7127 7132 7156 7158 
+ 7094 7102 7126 7136 7158 7166 
+ 7052 7077 7104 7150 7183 7202 
+ 7098 7114 7119 7139 7146 7162 
+ 6830 6915 6970 7280 7326 7608 
+ 7075 7085 7113 7125 7174 7185 7216 
+ 7097 7107 7126 7145 7156 7164 
+ 7101 7124 7157 7163 
+ 7080 7090 7121 7159 7161 7188 
+ 7109 7123 7149 7160 
+ 7102 7106 7127 7140 7166 7168 
+ 7099 7115 7119 7142 7146 7172 7175 
+ 7092 7103 7113 7143 7174 7191 
+ 7114 7123 7129 7149 7162 7165 
+ 7106 7110 7136 7141 7168 7170 
+ 7110 7116 7140 7144 7170 7171 
+ 7111 7115 7137 7143 7172 7181 
+ 7103 7111 7138 7142 7181 7191 
+ 7116 7120 7141 7147 7171 7176 
+ 7107 7121 7132 7161 7164 7169 
+ 7119 7129 7137 7162 7175 7180 
+ 7120 7122 7144 7153 7176 7179 
+ 6936 6961 7151 7196 7380 7395 
+ 7123 7135 7139 7160 7165 7173 
+ 7077 7096 7128 7202 7211 7239 
+ 6863 6936 6972 7148 7322 7395 7557 
+ 7074 7108 7118 7167 7199 7218 
+ 7122 7124 7147 7157 7179 7182 
+ 7073 7100 7104 7183 7198 7226 
+ 7049 7071 7118 7199 7214 7259 
+ 7126 7132 7158 7164 7184 
+ 7124 7133 7153 7163 7182 7190 
+ 7126 7127 7156 7166 7184 7201 
+ 7090 7100 7134 7188 7198 7222 
+ 7135 7149 7173 7187 
+ 7121 7134 7145 7169 7188 7197 
+ 7129 7139 7146 7165 7180 7189 
+ 7133 7157 7190 7192 
+ 7132 7145 7156 7169 7184 7194 
+ 7139 7149 7162 7173 7189 7193 
+ 7127 7136 7158 7168 7201 7224 
+ 7108 7125 7152 7185 7218 7227 
+ 7136 7140 7166 7170 7215 7224 
+ 7145 7161 7164 7194 7197 
+ 7140 7141 7168 7171 7207 7215 
+ 7141 7144 7170 7176 7204 7207 
+ 7137 7142 7175 7181 7208 7219 
+ 7149 7160 7165 7187 7193 7200 
+ 7113 7131 7138 7191 7216 7231 
+ 7137 7146 7172 7180 7203 7208 
+ 7144 7147 7171 7179 7204 7205 
+ 6892 6941 7117 7243 7376 7460 
+ 6102 6345 6884 7911 8355 10635 
+ 7147 7153 7176 7182 7205 7209 
+ 7146 7162 7175 7189 7203 7206 
+ 7142 7143 7172 7191 7219 7233 
+ 7153 7157 7179 7190 7209 7213 
+ 7104 7128 7154 7202 7226 7251 
+ 7156 7158 7164 7194 7201 7232 
+ 7125 7131 7167 7216 7227 7260 
+ 7039 7081 7096 7211 7285 7381 
+ 7160 7173 7200 7210 
+ 7134 7159 7161 7197 7222 7230 
+ 7162 7165 7180 7193 7206 7212 
+ 7157 7163 7182 7192 7213 7217 
+ 7138 7143 7174 7181 7231 7233 7257 
+ 7163 7190 7217 7221 
+ 7165 7173 7189 7200 7212 7220 
+ 7164 7169 7184 7197 7232 7246 
+ 6937 6972 7105 7322 7334 7430 
+ 6961 7008 7148 7249 7380 7451 
+ 7161 7169 7188 7194 7230 7246 
+ 7100 7154 7159 7222 7226 7275 7300 
+ 7118 7152 7155 7218 7259 7267 
+ 7173 7187 7193 7210 7220 7225 
+ 7158 7166 7184 7224 7232 7279 
+ 7128 7150 7183 7239 7251 7276 
+ 7175 7180 7206 7208 7223 7228 
+ 7171 7176 7205 7207 7234 7242 
+ 7176 7179 7204 7209 7234 7235 
+ 7180 7189 7203 7212 7223 7229 
+ 7170 7171 7204 7215 7242 7250 
+ 7172 7175 7203 7219 7228 7240 
+ 7179 7182 7205 7213 7235 7238 
+ 7187 7200 7225 7236 
+ 7096 7150 7186 7239 7349 7381 
+ 7189 7193 7206 7220 7229 7237 
+ 7182 7190 7209 7217 7238 7241 
+ 7071 7105 7155 7259 7334 7357 
+ 7168 7170 7207 7224 7250 7286 
+ 7131 7174 7185 7231 7260 7287 
+ 7190 7192 7213 7221 7241 7245 
+ 7152 7167 7199 7227 7267 7281 
+ 7172 7181 7208 7233 7240 7253 
+ 7193 7200 7212 7225 7237 7247 
+ 7192 7217 7245 7252 
+ 7159 7188 7198 7230 7275 7278 
+ 7203 7206 7228 7229 7244 
+ 7166 7168 7201 7215 7279 7286 
+ 7200 7210 7220 7236 7247 7254 
+ 7154 7183 7198 7251 7300 7324 
+ 7167 7185 7218 7260 7281 7323 
+ 7203 7208 7223 7240 7244 7255 
+ 7206 7212 7223 7237 7244 7256 
+ 7188 7197 7222 7246 7278 7304 
+ 7174 7191 7216 7257 7287 7297 
+ 7184 7194 7201 7246 7279 7311 
+ 7181 7191 7219 7253 7257 7271 
+ 7204 7205 7235 7242 7258 7265 
+ 7205 7209 7234 7238 7258 7262 
+ 7210 7225 7254 7261 
+ 7212 7220 7229 7247 7256 7263 
+ 7209 7213 7235 7241 7262 7264 
+ 7150 7202 7211 7276 7349 
+ 7208 7219 7228 7253 7255 7268 
+ 7213 7217 7238 7245 7264 7266 
+ 7204 7207 7234 7250 7265 7273 
+ 6941 6998 7177 7316 7460 7551 
+ 7223 7228 7229 7255 7256 7270 
+ 7217 7221 7241 7252 7266 7272 
+ 7194 7197 7230 7232 7304 7311 
+ 7220 7225 7237 7254 7263 7274 
+ 6206 6522 7007 7709 8151 10752 
+ 7008 7078 7196 7438 7451 7571 
+ 7207 7215 7242 7273 7286 7299 
+ 7183 7202 7226 7276 7324 7328 
+ 7221 7245 7272 7277 
+ 7219 7233 7240 7268 7271 7290 
+ 7225 7236 7247 7261 7274 7282 
+ 7228 7240 7244 7268 7270 7293 
+ 7229 7237 7244 7263 7270 7283 
+ 7191 7231 7233 7271 7297 7302 
+ 7234 7235 7262 7265 7284 7288 
+ 7155 7199 7214 7267 7329 7357 
+ 7185 7216 7227 7287 7323 7351 
+ 7236 7254 7282 7292 
+ 7235 7238 7258 7264 7288 7291 
+ 7237 7247 7256 7274 7283 7296 
+ 7238 7241 7262 7266 7291 7294 
+ 7234 7242 7258 7273 7284 7289 
+ 7241 7245 7264 7272 7294 7298 
+ 7199 7218 7259 7281 7329 7340 
+ 7240 7253 7255 7290 7293 7314 
+ 7030 7117 7315 7376 7609 
+ 7244 7255 7256 7283 7293 7307 
+ 7233 7253 7257 7290 7302 7310 
+ 7245 7252 7266 7277 7298 7306 
+ 7242 7250 7265 7289 7299 7308 
+ 7247 7254 7263 7282 7296 7305 
+ 7198 7222 7278 7300 7345 
+ 7202 7239 7251 7328 7349 7368 
+ 7252 7272 7306 7312 
+ 7222 7230 7275 7304 7345 7371 
+ 7201 7224 7232 7286 7311 7352 7359 
+ 6970 7058 7130 7285 7592 7608 
+ 7218 7227 7267 7323 7340 7383 
+ 7254 7261 7274 7292 7305 7313 
+ 7256 7263 7270 7296 7307 7317 
+ 7258 7265 7288 7289 7301 7303 
+ 7058 7081 7186 7280 7381 7549 7592 
+ 7215 7224 7250 7279 7299 7339 7352 
+ 7216 7231 7260 7297 7348 7351 
+ 7258 7262 7284 7291 7301 7309 
+ 7265 7273 7284 7303 7308 
+ 7253 7268 7271 7310 7314 7337 
+ 7262 7264 7288 7294 7309 7318 
+ 7261 7282 7313 7319 
+ 7255 7268 7270 7307 7314 7331 
+ 7264 7266 7291 7298 7318 7321 
+ 4560 6408 6740 14209 14884 
+ 7263 7274 7283 7305 7317 7325 
+ 7231 7257 7287 7302 7348 7353 
+ 7266 7272 7294 7306 7321 7327 
+ 7250 7273 7286 7308 7338 7339 
+ 7198 7226 7275 7324 7345 7407 
+ 7284 7288 7303 7309 7320 
+ 7257 7271 7297 7310 7353 7361 
+ 7284 7289 7301 7308 7320 7330 
+ 7230 7246 7278 7311 7371 7384 
+ 7274 7282 7296 7313 7325 7335 
+ 7272 7277 7298 7312 7327 7336 
+ 7270 7283 7293 7317 7331 7341 
+ 7273 7289 7299 7303 7330 7338 
+ 7288 7291 7301 7318 7320 7333 
+ 7271 7290 7302 7337 7361 
+ 7232 7246 7279 7304 7359 7384 
+ 7277 7306 7336 7343 
+ 7282 7292 7305 7319 7335 7342 
+ 7268 7290 7293 7331 7337 7360 
+ 6912 7030 7269 7437 7609 8118 
+ 6998 7078 7243 7438 7551 7660 
+ 7283 7296 7307 7325 7341 7350 
+ 7291 7294 7309 7321 7333 7344 
+ 7292 7313 7342 7347 
+ 7301 7303 7309 7330 7333 7354 
+ 7294 7298 7318 7327 7344 7355 
+ 6972 7151 7195 7430 7557 7645 7669 
+ 7227 7260 7281 7351 7383 7414 
+ 7226 7251 7300 7328 7407 7408 
+ 7296 7305 7317 7335 7350 7356 
+ 6915 7006 7130 7346 7608 8108 
+ 7298 7306 7321 7336 7355 7358 
+ 7251 7276 7324 7368 7408 
+ 7259 7267 7340 7357 7404 7415 
+ 7303 7308 7320 7338 7354 7374 
+ 7293 7307 7314 7341 7360 7365 
+ 6882 6987 7112 7379 8166 10539 
+ 7309 7318 7320 7344 7354 7363 
+ 7105 7195 7214 7357 7430 7505 7523 
+ 7305 7313 7325 7342 7356 7362 
+ 7306 7312 7327 7343 7358 7364 
+ 7290 7310 7314 7360 7361 7390 
+ 7299 7308 7330 7339 7374 7378 
+ 7286 7299 7338 7352 7378 7388 
+ 7267 7281 7329 7383 7404 
+ 7307 7317 7331 7350 7365 7369 
+ 7313 7319 7335 7347 7362 7366 
+ 7312 7336 7364 7367 
+ 7318 7321 7333 7355 7363 7370 
+ 7275 7278 7300 7371 7407 7449 
+ 7006 7326 7379 8108 8722 15386 
+ 7319 7342 7366 7372 
+ 7287 7297 7351 7353 7389 7402 
+ 7211 7239 7276 7368 7381 7425 
+ 7317 7325 7341 7356 7369 7373 
+ 7260 7287 7323 7348 7402 7414 
+ 7279 7286 7339 7359 7388 7400 
+ 7297 7302 7348 7361 7389 7397 
+ 7320 7330 7333 7363 7374 7385 
+ 7321 7327 7344 7358 7370 7375 
+ 7325 7335 7350 7362 7373 7377 
+ 7214 7259 7329 7334 7415 7505 
+ 7327 7336 7355 7364 7375 7382 
+ 7279 7311 7352 7384 7400 7434 
+ 7314 7331 7337 7365 7390 7394 
+ 7302 7310 7337 7353 7390 7397 7412 
+ 7335 7342 7356 7366 7377 7386 
+ 7333 7344 7354 7370 7385 7393 
+ 7336 7343 7358 7367 7382 7387 
+ 7331 7341 7360 7369 7392 7394 
+ 7342 7347 7362 7372 7386 7391 
+ 7343 7364 7387 7396 
+ 7276 7328 7349 7408 7425 7487 
+ 7341 7350 7365 7373 7392 7399 
+ 7344 7355 7363 7375 7393 7401 
+ 7278 7304 7345 7384 7449 7486 
+ 7347 7366 7391 7398 
+ 7350 7356 7369 7377 7399 7403 
+ 7330 7338 7354 7378 7385 7417 7423 
+ 7355 7358 7370 7382 7401 7406 
+ 7117 7177 7269 7460 7609 7753 
+ 7356 7362 7373 7386 7403 7405 
+ 7338 7339 7374 7388 7423 7428 
+ 6987 7332 7346 8722 10539 15386 
+ 7148 7196 7395 7451 7591 7639 
+ 7186 7211 7285 7349 7425 7514 7549 
+ 7358 7364 7375 7387 7406 7409 
+ 7281 7323 7340 7404 7414 7506 
+ 7304 7311 7359 7371 7434 7486 
+ 7354 7363 7374 7393 7417 7421 
+ 7362 7366 7377 7391 7405 7410 
+ 7364 7367 7382 7396 7409 7411 
+ 7339 7352 7378 7400 7428 7444 
+ 7348 7353 7397 7402 7427 7433 
+ 7337 7360 7361 7394 7412 7431 7447 
+ 7366 7372 7386 7398 7410 7413 
+ 7365 7369 7394 7399 7416 7418 
+ 7363 7370 7385 7401 7421 7424 
+ 7360 7365 7390 7392 7418 7431 
+ 7148 7151 7380 7557 7591 7670 
+ 7367 7387 7411 7419 
+ 7353 7361 7389 7412 7427 7441 
+ 7372 7391 7413 7420 
+ 7369 7373 7392 7403 7416 7422 
+ 7352 7359 7388 7434 7444 7468 
+ 7370 7375 7393 7406 7424 7429 
+ 7348 7351 7389 7414 7433 7473 
+ 7373 7377 7399 7405 7422 7426 
+ 7329 7340 7383 7415 7506 7525 
+ 7377 7386 7403 7410 7426 7432 
+ 7375 7382 7401 7409 7429 7435 
+ 7300 7324 7345 7408 7449 7545 7603 
+ 7324 7328 7368 7407 7487 7545 
+ 7382 7387 7406 7411 7435 7440 
+ 7386 7391 7405 7413 7432 7439 
+ 7387 7396 7409 7419 7440 7443 
+ 7361 7390 7397 7441 7447 7463 
+ 7391 7398 7410 7420 7439 7442 
+ 7323 7351 7383 7402 7473 7506 7563 
+ 7329 7357 7404 7505 7525 7579 
+ 7392 7399 7418 7422 7445 7446 
+ 7374 7385 7421 7423 7453 7459 
+ 7392 7394 7416 7431 7445 7456 
+ 7396 7411 7443 7450 
+ 7398 7413 7442 7448 
+ 7385 7393 7417 7424 7453 7454 
+ 7399 7403 7416 7426 7446 7452 
+ 7374 7378 7417 7428 7459 7476 
+ 7393 7401 7421 7429 7454 7458 
+ 7349 7368 7381 7487 7514 7570 
+ 7403 7405 7422 7432 7452 7457 
+ 7389 7397 7433 7441 7464 7469 
+ 7378 7388 7423 7444 7476 7500 
+ 7401 7406 7424 7435 7458 7462 
+ 7195 7322 7334 7523 7640 7645 
+ 7390 7394 7418 7447 7456 7466 
+ 7405 7410 7426 7439 7457 7461 
+ 7389 7402 7427 7464 7473 
+ 7359 7384 7400 7468 7486 7550 
+ 7406 7409 7429 7440 7462 7465 
+ 6391 6507 7933 8232 13750 
+ 6815 6912 7315 7528 8118 8472 
+ 7078 7249 7316 7571 7660 7808 
+ 7410 7413 7432 7442 7461 7467 
+ 7409 7411 7435 7443 7465 7470 
+ 7397 7412 7427 7463 7469 7485 
+ 7413 7420 7439 7448 7467 7471 
+ 7411 7419 7440 7450 7470 7474 
+ 7388 7400 7428 7468 7500 7521 
+ 7416 7418 7446 7456 7472 7477 
+ 7416 7422 7445 7452 7472 7475 
+ 7390 7412 7431 7463 7466 7495 7498 
+ 7420 7442 7471 7479 
+ 7345 7371 7407 7486 7603 7607 
+ 7419 7443 7474 7483 
+ 7196 7249 7380 7571 7639 7703 
+ 7422 7426 7446 7457 7475 7482 
+ 7417 7421 7454 7459 7480 7481 
+ 7421 7424 7453 7458 7481 7484 
+ 6811 7007 7112 8151 8166 10767 
+ 7418 7431 7445 7466 7477 7478 
+ 7426 7432 7452 7461 7482 7488 
+ 7424 7429 7454 7462 7484 7489 
+ 7417 7423 7453 7476 7480 7508 
+ 7177 7243 7376 7551 7753 7852 
+ 7432 7439 7457 7467 7488 7490 
+ 7429 7435 7458 7465 7489 7491 
+ 7412 7441 7447 7485 7495 7509 
+ 7427 7433 7469 7473 7493 7517 
+ 7435 7440 7462 7470 7491 7496 
+ 7431 7447 7456 7478 7494 7498 
+ 7439 7442 7461 7471 7490 7497 
+ 7400 7434 7444 7521 7550 
+ 7427 7441 7464 7485 7493 7507 
+ 7440 7443 7465 7474 7496 7501 
+ 7442 7448 7467 7479 7497 7502 
+ 7445 7446 7475 7477 7499 7503 
+ 7402 7414 7433 7464 7517 7563 7583 
+ 7443 7450 7470 7483 7501 7512 
+ 7446 7452 7472 7482 7503 7510 
+ 7423 7428 7459 7500 7508 7526 
+ 7445 7456 7472 7478 7492 7499 
+ 7456 7466 7477 7492 7494 
+ 7448 7471 7502 7511 
+ 7453 7459 7481 7504 7508 
+ 7453 7454 7480 7484 7504 7513 
+ 7452 7457 7475 7488 7510 7515 
+ 7450 7474 7512 7519 
+ 7454 7458 7481 7489 7513 7516 
+ 7441 7463 7469 7507 7509 7534 
+ 7371 7384 7434 7449 7550 7607 7634 
+ 7368 7408 7425 7545 7570 7679 
+ 7457 7461 7482 7490 7515 7522 
+ 7458 7462 7484 7491 7516 7524 
+ 7461 7467 7488 7497 7522 7527 
+ 7462 7465 7489 7496 7524 7529 
+ 7477 7478 7494 7499 7518 7520 
+ 7464 7469 7507 7517 7560 
+ 7466 7478 7492 7498 7518 7530 
+ 7447 7463 7498 7509 7536 7540 
+ 7465 7470 7491 7501 7529 7533 
+ 7467 7471 7490 7502 7527 7532 
+ 7447 7466 7494 7495 7530 7536 
+ 7472 7477 7492 7503 7520 7531 
+ 7428 7444 7476 7521 7526 7562 7573 
+ 7470 7474 7496 7512 7533 7538 
+ 7471 7479 7497 7511 7532 7535 
+ 7472 7475 7499 7510 7531 7539 
+ 7480 7481 7508 7513 7541 7544 
+ 7334 7357 7415 7523 7579 7672 7696 
+ 7383 7404 7414 7525 7563 7654 7684 
+ 7469 7485 7493 7534 7560 
+ 7459 7476 7480 7504 7526 7542 7544 
+ 7463 7485 7495 7534 7540 7574 
+ 7475 7482 7503 7515 7539 7547 
+ 7479 7502 7535 7543 
+ 7474 7483 7501 7519 7538 7546 
+ 7481 7484 7504 7516 7541 7548 
+ 7381 7425 7549 7570 7729 
+ 7482 7488 7510 7522 7547 7553 
+ 7484 7489 7513 7524 7548 7554 
+ 7464 7473 7493 7560 7583 7596 
+ 7492 7494 7520 7530 7537 
+ 7483 7512 7546 7555 
+ 7492 7499 7518 7531 7537 7552 
+ 7444 7468 7500 7550 7573 7616 
+ 7488 7490 7515 7527 7553 7556 
+ 7334 7430 7505 7640 7672 7713 
+ 7489 7491 7516 7529 7554 7558 
+ 7404 7415 7506 7579 7681 7684 
+ 7476 7500 7508 7542 7562 7565 
+ 7490 7497 7522 7532 7556 7559 
+ 6767 6815 7437 7730 8472 8881 
+ 7491 7496 7524 7533 7558 7561 
+ 7494 7498 7518 7536 7537 7566 7576 
+ 7499 7503 7520 7539 7552 7567 
+ 7497 7502 7527 7535 7559 7564 
+ 7496 7501 7529 7538 7561 7569 
+ 7485 7507 7509 7560 7574 7621 
+ 7502 7511 7532 7543 7564 7572 
+ 7495 7498 7530 7540 7576 7580 
+ 7518 7520 7530 7552 7566 
+ 7501 7512 7533 7546 7569 7575 
+ 7503 7510 7531 7547 7567 7581 
+ 7495 7509 7536 7574 7580 
+ 7504 7513 7544 7548 7578 7584 
+ 7508 7526 7544 7565 7568 
+ 7511 7535 7572 7577 
+ 7504 7508 7541 7542 7568 7578 
+ 7407 7408 7487 7603 7679 7772 
+ 7512 7519 7538 7555 7575 7582 
+ 7510 7515 7539 7553 7581 7585 
+ 7513 7516 7541 7554 7584 7586 
+ 7285 7381 7514 7592 7729 7963 
+ 7434 7468 7486 7521 7616 7634 7674 
+ 7243 7316 7460 7660 7852 7966 
+ 7520 7531 7537 7566 7567 7595 
+ 7515 7522 7547 7556 7585 7587 
+ 7516 7524 7548 7558 7586 7589 
+ 7519 7546 7582 7588 
+ 7522 7527 7553 7559 7587 7590 
+ 7151 7322 7395 7669 7670 7884 
+ 7524 7529 7554 7561 7589 7594 
+ 7527 7532 7556 7564 7590 7593 
+ 7493 7507 7517 7534 7596 7621 7628 
+ 7529 7533 7558 7569 7594 7598 
+ 7500 7526 7565 7573 7602 7612 
+ 7414 7473 7506 7583 7638 7654 
+ 7532 7535 7559 7572 7593 7597 
+ 7526 7542 7562 7568 7600 7602 
+ 7530 7537 7552 7576 7595 7614 
+ 7531 7539 7552 7581 7595 7606 
+ 7542 7544 7565 7578 7600 7610 
+ 7533 7538 7561 7575 7598 7601 
+ 7425 7487 7514 7679 7729 7794 
+ 7249 7438 7451 7703 7808 7832 
+ 7535 7543 7564 7577 7597 7599 
+ 7500 7521 7562 7612 7616 7644 
+ 7509 7534 7540 7580 7621 7631 
+ 7538 7546 7569 7582 7601 7605 
+ 7530 7536 7566 7580 7614 7629 
+ 7543 7572 7599 7604 
+ 7541 7544 7568 7584 7610 7613 
+ 7415 7505 7525 7681 7696 
+ 7536 7540 7574 7576 7629 7631 
+ 7539 7547 7567 7585 7606 7615 
+ 7546 7555 7575 7588 7605 7611 
+ 7473 7517 7563 7596 7630 7638 
+ 7541 7548 7578 7586 7613 7617 
+ 7547 7553 7581 7587 7615 7623 
+ 7548 7554 7584 7589 7617 7620 
+ 7553 7556 7585 7590 7619 7623 
+ 7555 7582 7611 7618 
+ 7554 7558 7586 7594 7620 7625 
+ 7556 7559 7587 7593 7619 7622 
+ 7380 7395 7639 7670 7873 7874 
+ 7280 7285 7549 7608 7963 8358 
+ 7559 7564 7590 7597 7622 7624 
+ 7558 7561 7589 7598 7625 7627 
+ 7552 7566 7567 7606 7614 7652 
+ 7517 7560 7583 7628 7630 7661 
+ 7564 7572 7593 7599 7624 7626 
+ 7561 7569 7594 7601 7627 7633 
+ 7572 7577 7597 7604 7626 7632 
+ 7565 7568 7602 7610 7637 7646 
+ 7569 7575 7598 7605 7633 7635 
+ 7562 7565 7600 7612 7637 7642 
+ 7407 7449 7545 7607 7772 7778 
+ 7577 7599 7632 7636 
+ 7575 7582 7601 7611 7635 7641 
+ 7567 7581 7595 7615 7652 7655 
+ 7449 7486 7603 7634 7771 7778 
+ 7130 7280 7326 7592 8108 8358 9530 
+ 7269 7315 7376 7753 8118 8739 
+ 7568 7578 7600 7613 7646 7665 
+ 7582 7588 7605 7618 7641 7643 
+ 7562 7573 7602 7642 7644 7667 
+ 7578 7584 7610 7617 7657 7665 
+ 7566 7576 7595 7629 7652 7685 
+ 7581 7585 7606 7623 7655 7662 
+ 7521 7550 7573 7644 7674 7683 
+ 7584 7586 7613 7620 7651 7657 
+ 7588 7611 7643 7650 
+ 7587 7590 7622 7623 7647 7656 
+ 7586 7589 7617 7625 7651 7653 
+ 7534 7560 7574 7628 7631 7694 7724 
+ 7590 7593 7619 7624 7647 7648 
+ 7585 7587 7615 7619 7656 7662 
+ 7593 7597 7622 7626 7648 7649 
+ 7589 7594 7620 7627 7653 7659 
+ 7597 7599 7624 7632 7649 7658 
+ 7594 7598 7625 7633 7659 7663 
+ 7560 7596 7621 7661 7694 
+ 7576 7580 7614 7631 7685 7706 
+ 7583 7596 7638 7661 7690 
+ 7574 7580 7621 7629 7706 7724 
+ 7599 7604 7626 7636 7658 7664 
+ 7598 7601 7627 7635 7663 7668 
+ 7486 7550 7607 7674 7761 7771 
+ 7601 7605 7633 7641 7668 7673 
+ 7604 7632 7664 7671 
+ 7600 7602 7642 7646 7698 
+ 7563 7583 7630 7654 7690 7718 
+ 7380 7451 7591 7703 7874 7905 
+ 7430 7523 7645 7713 7814 7858 
+ 7605 7611 7635 7643 7673 7675 
+ 7602 7612 7637 7667 7698 
+ 7611 7618 7641 7650 7675 7677 
+ 7573 7612 7616 7667 7683 7710 
+ 7322 7430 7640 7669 7858 7872 
+ 7600 7610 7637 7665 7698 7715 
+ 7619 7622 7648 7656 7676 7682 
+ 7622 7624 7647 7649 7676 7678 
+ 7624 7626 7648 7658 7678 7680 
+ 7618 7643 7677 7687 
+ 7617 7620 7653 7657 7686 7692 
+ 7595 7606 7614 7655 7685 7727 7745 
+ 7620 7625 7651 7659 7686 7689 
+ 7506 7563 7638 7684 7718 7754 
+ 7606 7615 7652 7662 7712 7727 
+ 7619 7623 7647 7662 7682 7699 
+ 7613 7617 7651 7665 7692 7695 
+ 7626 7632 7649 7664 7680 7688 
+ 7625 7627 7653 7663 7689 7691 
+ 7316 7438 7551 7808 7966 8100 
+ 7596 7628 7630 7690 7694 7736 
+ 7615 7623 7655 7656 7699 7712 
+ 7627 7633 7659 7668 7691 7697 
+ 7632 7636 7658 7671 7688 7693 
+ 7610 7613 7646 7657 7695 7715 
+ 200 410 5408 13608 15133 15144 
+ 7612 7642 7644 7698 7710 7747 
+ 7633 7635 7663 7673 7697 7701 
+ 7322 7557 7645 7872 7884 7984 
+ 7395 7557 7591 7873 7884 7995 
+ 7636 7664 7693 7700 
+ 7505 7523 7696 7713 7807 7819 
+ 7635 7641 7668 7675 7701 7704 
+ 7550 7616 7634 7683 7738 7761 
+ 7641 7643 7673 7677 7704 7708 
+ 7647 7648 7678 7682 7702 7705 
+ 7643 7650 7675 7687 7708 7714 
+ 7648 7649 7676 7680 7705 7707 
+ 7487 7545 7570 7772 7794 7937 
+ 7649 7658 7678 7688 7707 7711 
+ 7525 7579 7684 7696 7844 7866 
+ 7647 7656 7676 7699 7702 7717 
+ 7616 7644 7674 7710 7738 7756 
+ 7506 7525 7654 7681 7754 7844 7867 
+ 7614 7629 7652 7706 7745 7770 
+ 7651 7653 7689 7692 7720 7722 
+ 7650 7677 7714 7721 
+ 7658 7664 7680 7693 7711 7716 
+ 7653 7659 7686 7691 7720 7725 
+ 7630 7638 7661 7718 7736 7767 
+ 7659 7663 7689 7697 7725 7728 
+ 7651 7657 7686 7695 7719 7722 
+ 7664 7671 7688 7700 7716 7726 
+ 7621 7628 7661 7724 7736 7777 
+ 7657 7665 7692 7715 7719 7741 
+ 7505 7579 7672 7681 7819 7866 
+ 7663 7668 7691 7701 7728 7732 
+ 7637 7642 7646 7667 7715 7747 7764 
+ 7656 7662 7682 7712 7717 7749 
+ 7671 7693 7726 7733 
+ 7668 7673 7697 7704 7732 7734 
+ 7676 7682 7705 7717 7723 
+ 7451 7571 7639 7832 7905 7934 
+ 7673 7675 7701 7708 7734 7737 
+ 7676 7678 7702 7707 7723 7731 
+ 7629 7631 7685 7724 7770 7800 
+ 7678 7680 7705 7711 7731 7735 
+ 7675 7677 7704 7714 7737 7740 
+ 6522 6724 7248 8666 10752 12141 
+ 7644 7667 7683 7747 7756 7804 
+ 7680 7688 7707 7716 7735 7739 
+ 7655 7662 7699 7727 7749 7765 
+ 7523 7640 7672 7807 7814 7891 
+ 7677 7687 7708 7721 7740 7743 
+ 7646 7665 7695 7698 7741 7764 7779 
+ 7688 7693 7711 7726 7739 7744 
+ 7682 7699 7702 7723 7742 7749 
+ 7638 7654 7690 7754 7767 7799 
+ 7692 7695 7722 7741 7746 
+ 7686 7689 7722 7725 7751 7755 
+ 7687 7714 7743 7750 
+ 7686 7692 7719 7720 7746 7751 
+ 7702 7705 7717 7731 7742 7748 
+ 7621 7631 7694 7706 7777 7800 7841 
+ 7689 7691 7720 7728 7755 7758 
+ 7693 7700 7716 7733 7744 7752 
+ 7652 7655 7712 7745 7765 7785 
+ 7691 7697 7725 7732 7758 7759 
+ 7514 7549 7570 7794 7963 8177 
+ 6767 6884 7528 7911 8881 10857 11227 
+ 7705 7707 7723 7735 7748 7757 
+ 7697 7701 7728 7734 7759 7762 
+ 7700 7726 7752 7760 
+ 7701 7704 7732 7737 7762 7766 
+ 7707 7711 7731 7739 7757 7763 
+ 7661 7690 7694 7767 7777 7805 
+ 7704 7708 7734 7740 7766 7769 
+ 7674 7683 7756 7761 7834 7835 
+ 7711 7716 7735 7744 7763 7768 
+ 7708 7714 7737 7743 7769 7774 
+ 7695 7715 7719 7746 7779 7784 
+ 7717 7723 7748 7749 7773 7780 
+ 7714 7721 7740 7750 7774 7776 
+ 7716 7726 7739 7752 7768 7775 
+ 7652 7685 7727 7770 7785 7811 
+ 7719 7722 7741 7751 7784 7787 
+ 7667 7698 7710 7764 7804 7824 
+ 7723 7731 7742 7757 7773 7783 
+ 7699 7712 7717 7742 7765 7780 7795 
+ 7721 7743 7776 7782 
+ 7720 7722 7746 7755 7787 7788 
+ 7726 7733 7744 7760 7775 7781 
+ 7376 7460 7609 7852 8739 8918 
+ 7654 7684 7718 7799 7842 7867 
+ 7720 7725 7751 7758 7788 7790 
+ 7683 7710 7738 7804 7835 
+ 7731 7735 7748 7763 7783 7786 
+ 7725 7728 7755 7759 7790 7791 
+ 7728 7732 7758 7762 7791 7793 
+ 7733 7752 7781 7789 
+ 7634 7674 7738 7771 7834 7897 
+ 7732 7734 7759 7766 7793 7796 
+ 7735 7739 7757 7768 7786 7792 
+ 7698 7715 7747 7779 7824 7828 
+ 7712 7727 7749 7785 7795 7813 
+ 7734 7737 7762 7769 7796 7798 
+ 7690 7718 7736 7799 7805 7838 
+ 7739 7744 7763 7775 7792 7797 
+ 7737 7740 7766 7774 7798 7801 
+ 7685 7706 7745 7800 7811 7856 
+ 7607 7634 7761 7778 7897 7924 
+ 7545 7603 7679 7778 7937 8045 8145 
+ 7742 7748 7780 7783 7810 
+ 7740 7743 7769 7776 7801 7802 
+ 7744 7752 7768 7781 7797 7803 
+ 7743 7750 7774 7782 7802 7806 
+ 7694 7724 7736 7805 7841 7859 
+ 7603 7607 7771 7772 7924 8045 
+ 7715 7741 7764 7784 7828 7830 
+ 7742 7749 7773 7795 7810 7836 
+ 7752 7760 7775 7789 7803 7809 
+ 7750 7776 7806 7812 
+ 7748 7757 7773 7786 7810 7817 
+ 7741 7746 7779 7787 7827 7830 
+ 7727 7745 7765 7811 7813 7846 
+ 7757 7763 7783 7792 7816 7817 
+ 7746 7751 7784 7788 7827 7831 
+ 7751 7755 7787 7790 7826 7831 
+ 7760 7781 7809 7815 
+ 7755 7758 7788 7791 7820 7826 
+ 7758 7759 7790 7793 7820 7821 
+ 7763 7768 7786 7797 7816 7818 
+ 7759 7762 7791 7796 7821 7823 
+ 7570 7679 7729 7937 8177 8194 
+ 7749 7765 7780 7813 7836 7855 
+ 7762 7766 7793 7798 7823 7825 
+ 7768 7775 7792 7803 7818 7822 
+ 7766 7769 7796 7801 7825 7829 
+ 7718 7754 7767 7838 7842 7869 
+ 7706 7724 7770 7841 7856 7908 
+ 7769 7774 7798 7802 7829 15387 
+ 7774 7776 7801 7806 7837 15387 
+ 7775 7781 7797 7809 7822 7833 
+ 7710 7747 7756 7824 7835 7926 7955 
+ 7736 7767 7777 7838 7859 7886 
+ 7776 7782 7802 7812 7837 7840 
+ 7672 7713 7819 7891 7936 8028 
+ 7438 7571 7660 7832 8100 8337 8426 
+ 7781 7789 7803 7815 7833 7839 
+ 7773 7780 7783 7817 7836 7854 7878 
+ 7745 7770 7785 7846 7856 7929 
+ 7782 7806 7840 7843 
+ 7765 7785 7795 7846 7855 7890 
+ 7640 7713 7858 7891 8049 
+ 7789 7809 7839 7848 
+ 7786 7792 7817 7818 7845 7850 
+ 7783 7786 7810 7816 7850 7854 
+ 7792 7797 7816 7822 7845 7849 
+ 7672 7696 7807 7866 7936 8007 
+ 7790 7791 7821 7826 7853 7862 
+ 7791 7793 7820 7823 7853 7857 
+ 7797 7803 7818 7833 7849 7851 
+ 7793 7796 7821 7825 7857 7860 
+ 7747 7764 7804 7828 7913 7926 
+ 7796 7798 7823 7829 7860 7863 
+ 7788 7790 7820 7831 7862 7870 
+ 7784 7787 7830 7831 7882 7887 
+ 7764 7779 7824 7830 7895 7913 
+ 7798 7801 7825 7863 7864 15387 
+ 7779 7784 7827 7828 7887 7895 
+ 7787 7788 7826 7827 7870 7882 
+ 7571 7703 7808 7934 8307 8337 
+ 7803 7809 7822 7839 7851 7861 
+ 7738 7761 7835 7897 7942 
+ 7738 7756 7804 7834 7942 7955 
+ 7780 7795 7810 7855 7878 7888 
+ 7802 7806 7840 7865 7868 15387 
+ 7767 7799 7805 7869 7886 7923 
+ 7809 7815 7833 7848 7861 7871 
+ 7806 7812 7837 7843 7868 7875 
+ 7724 7777 7800 7859 7908 7961 7987 
+ 7754 7799 7867 7869 7916 7969 
+ 7812 7840 7875 7881 
+ 7681 7684 7866 7867 8018 8037 
+ 7816 7818 7849 7850 7876 7877 
+ 7785 7811 7813 7890 7929 7952 
+ 1438 4201 7003 14856 14945 15069 
+ 7815 7839 7871 7883 
+ 7818 7822 7845 7851 7877 7879 
+ 7816 7817 7845 7854 7876 7880 
+ 7822 7833 7849 7861 7879 7885 
+ 7460 7551 7753 7966 8918 9066 
+ 7820 7821 7857 7862 7893 7896 
+ 7810 7817 7850 7878 7880 7889 
+ 7795 7813 7836 7888 7890 7914 
+ 7770 7800 7811 7908 7929 7965 
+ 7821 7823 7853 7860 7896 7900 
+ 7640 7645 7814 7872 8049 8140 8176 
+ 7777 7805 7841 7886 7961 7967 
+ 7823 7825 7857 7863 7900 7901 
+ 7833 7839 7851 7871 7885 7892 
+ 7820 7826 7853 7870 7893 7925 
+ 7825 7829 7860 7864 7901 7902 
+ 7829 7863 7865 7902 7903 15387 
+ 7837 7864 7868 7903 7904 15387 
+ 7681 7696 7819 7844 8007 8037 8152 8198 
+ 7684 7754 7842 7844 7969 8009 8018 
+ 7837 7840 7865 7875 7904 7907 
+ 7799 7838 7842 7916 7923 7939 
+ 7826 7831 7862 7882 7925 7931 
+ 7839 7848 7861 7883 7892 7906 
+ 7645 7669 7858 7984 8139 8140 
+ 7591 7670 7874 7995 8189 8246 
+ 7591 7639 7873 7905 8189 8219 
+ 7840 7843 7868 7881 7907 7912 
+ 7845 7850 7877 7880 7894 7898 
+ 7845 7849 7876 7879 7894 7899 
+ 7810 7836 7854 7888 7889 7915 7917 
+ 7849 7851 7877 7885 7899 7910 
+ 7850 7854 7876 7889 7898 7909 
+ 7843 7875 7912 7920 
+ 7827 7831 7870 7887 7931 7953 
+ 7848 7871 7906 7919 
+ 7557 7669 7670 7984 7995 8311 8350 
+ 7851 7861 7879 7892 7910 7918 
+ 7805 7838 7859 7923 7967 8001 
+ 7827 7830 7882 7895 7953 7973 
+ 7836 7855 7878 7914 7915 7935 7940 
+ 7854 7878 7880 7909 7917 7922 
+ 7813 7846 7855 7914 7952 7970 
+ 7713 7807 7814 8028 8049 8155 
+ 7861 7871 7885 7906 7918 7930 
+ 7853 7862 7896 7925 7945 
+ 7876 7877 7898 7899 7921 7927 
+ 7828 7830 7887 7913 7973 7994 
+ 7853 7857 7893 7900 7945 7964 
+ 7761 7771 7834 7924 7942 8109 8117 
+ 7876 7880 7894 7909 7927 7932 
+ 7877 7879 7894 7910 7921 7928 
+ 7857 7860 7896 7901 7958 7964 
+ 7860 7863 7900 7902 7951 7958 
+ 7863 7864 7901 7903 7947 7951 
+ 7864 7865 7902 7904 7943 7947 
+ 7865 7868 7903 7907 7943 7944 
+ 7639 7703 7874 7934 8219 8224 
+ 7871 7883 7892 7919 7930 7941 
+ 7868 7875 7904 7912 7944 7949 
+ 7800 7841 7856 7965 7987 8000 
+ 7880 7889 7898 7922 7932 7938 
+ 7879 7885 7899 7918 7928 15388 
+ 6884 7178 7730 10635 10857 11933 
+ 7875 7881 7907 7920 7949 7954 
+ 7824 7828 7895 7926 7994 8034 
+ 7855 7888 7890 7935 7970 7974 
+ 7878 7888 7917 7940 7948 
+ 7842 7869 7939 7969 8006 
+ 7878 7889 7915 7922 7948 7950 
+ 7885 7892 7910 7930 7956 15388 
+ 7883 7906 7941 7960 
+ 7881 7912 7954 7959 
+ 7894 7899 7927 7928 7946 
+ 7889 7909 7917 7938 7950 
+ 7838 7869 7886 7939 7996 8001 
+ 7771 7778 7897 8045 8109 8212 
+ 7862 7870 7893 7931 7945 8003 
+ 7804 7824 7913 7955 8034 8095 
+ 7894 7898 7921 7932 7946 7957 
+ 7899 7910 7921 7946 7962 15388 
+ 7811 7846 7856 7952 7965 8027 8046 
+ 7892 7906 7918 7941 7956 7972 
+ 7870 7882 7925 7953 8003 8016 
+ 7898 7909 7927 7938 7957 7968 
+ 6391 6710 7436 8666 13750 14308 
+ 7703 7832 7905 8224 8307 
+ 7888 7914 7940 7971 7974 
+ 7807 7819 8007 8028 8110 
+ 7679 7772 7794 8145 8194 8306 
+ 7909 7922 7932 7950 7968 7975 
+ 7869 7916 7923 7996 8006 
+ 7888 7915 7935 7948 7971 7976 
+ 7906 7919 7930 7960 7972 7980 
+ 7834 7835 7897 7955 8117 8119 
+ 7903 7904 7944 7947 7982 7985 
+ 7904 7907 7943 7949 7981 7982 
+ 7893 7896 7925 7964 8003 8015 
+ 7921 7927 7928 7957 7962 7979 
+ 7902 7903 7943 7951 7985 7989 
+ 7915 7917 7940 7950 7976 7977 
+ 7907 7912 7944 7954 7981 7983 
+ 7917 7922 7938 7948 7975 7977 
+ 7901 7902 7947 7958 7989 7999 
+ 7846 7890 7929 7970 8033 8046 
+ 7882 7887 7931 7973 8016 8026 
+ 7912 7920 7949 7959 7983 7986 
+ 7804 7835 7926 7942 8095 8119 
+ 7918 7930 7972 7978 7988 15388 
+ 7927 7932 7946 7968 7979 7991 
+ 7900 7901 7951 7964 7999 8021 
+ 7920 7954 7986 7990 
+ 7919 7941 7980 7993 
+ 7841 7859 7967 7987 8030 8047 
+ 7928 7946 7978 7979 7992 15388 
+ 7549 7592 7729 8177 8358 9305 
+ 7896 7900 7945 7958 8015 8021 
+ 7856 7908 7929 8000 8027 8044 
+ 7551 7660 7852 8100 8935 9066 
+ 7859 7886 7961 8001 8030 8083 
+ 7932 7938 7957 7975 7991 8004 
+ 7842 7867 7916 8006 8009 8075 8081 
+ 7890 7914 7952 7974 7998 8025 8033 
+ 7935 7940 7974 7976 8002 15389 
+ 7930 7941 7956 7980 7988 7997 
+ 7887 7895 7953 7994 8026 8054 
+ 7914 7935 7970 7971 7998 15389 
+ 7938 7950 7968 7977 8004 8013 
+ 7940 7948 7971 7977 8002 8019 
+ 7948 7950 7975 7976 8013 8019 
+ 7956 7962 7988 7992 8005 15388 
+ 7946 7957 7962 7991 7992 15390 
+ 7941 7960 7972 7993 7997 8012 
+ 7944 7949 7982 7983 8008 8010 
+ 7943 7944 7981 7985 8010 8014 
+ 7949 7954 7981 7986 8008 8011 
+ 7669 7872 7884 8139 8350 8432 
+ 7943 7947 7982 7989 8014 8022 
+ 7954 7959 7983 7990 8011 8017 
+ 7841 7908 7961 8000 8047 8064 
+ 7956 7972 7978 7997 8005 8020 
+ 7947 7951 7985 7999 8022 8038 
+ 7959 7986 8017 8023 
+ 7957 7968 7979 8004 8039 15390 
+ 7962 7978 7979 8005 8024 15390 
+ 7960 7980 8012 8029 
+ 7895 7913 7973 8034 8054 8106 
+ 7670 7873 7884 8246 8311 8439 
+ 7923 7939 8001 8006 8089 8093 
+ 7972 7980 7988 8012 8020 8035 
+ 7970 7974 8025 8031 15389 
+ 7951 7958 7989 8021 8038 8057 
+ 7908 7965 7987 8044 8064 8074 
+ 7886 7923 7967 7996 8083 8093 8162 
+ 7971 7976 8019 8032 8036 15389 
+ 7925 7931 7945 8015 8016 8088 8091 
+ 7968 7975 7991 8013 8039 8051 
+ 7978 7988 7992 8020 8024 8041 
+ 7916 7939 7969 7996 8081 8089 
+ 7819 7866 7936 8110 8198 8243 
+ 7981 7983 8010 8011 8042 8043 
+ 7867 7969 8018 8075 8136 8142 
+ 7981 7982 8008 8014 8040 8043 
+ 7983 7986 8008 8017 8042 8048 
+ 7980 7993 7997 8029 8035 8052 
+ 7975 7977 8004 8019 8051 8058 
+ 7982 7985 8010 8022 8040 8050 
+ 7945 7964 8003 8021 8088 8099 
+ 7931 7953 8003 8026 8091 8097 
+ 7986 7990 8011 8023 8048 8055 
+ 7844 7867 8009 8037 8128 8136 
+ 7976 7977 8002 8013 8036 8058 8069 
+ 7988 7997 8005 8035 8041 8056 
+ 7958 7964 7999 8015 8057 8099 
+ 7985 7989 8014 8038 8050 8059 
+ 7990 8017 8055 8060 
+ 7992 8005 8041 8053 8063 15390 
+ 7970 7998 8031 8033 8061 8076 
+ 7953 7973 8016 8054 8097 8113 
+ 7929 7965 8044 8046 8124 8132 
+ 7807 7891 7936 8110 8155 8236 
+ 7993 8012 8052 8065 
+ 7961 7967 8047 8083 8114 
+ 7998 8025 8032 8061 8066 15389 
+ 8002 8031 8036 8066 8067 15389 
+ 7952 7970 8025 8046 8076 8120 
+ 7913 7926 7994 8095 8106 8171 
+ 7997 8012 8020 8052 8056 8071 
+ 8002 8019 8032 8067 8069 
+ 7844 7866 8018 8128 8152 8223 
+ 7989 7999 8022 8057 8059 8072 
+ 7991 8004 8051 8053 8078 8082 15390 
+ 8010 8014 8043 8050 8062 8070 
+ 8005 8020 8024 8056 8063 8077 
+ 8008 8011 8043 8048 8068 8073 
+ 8008 8010 8040 8042 8062 8068 
+ 7965 8000 8027 8074 8124 8129 
+ 7772 7778 7924 8145 8212 8417 
+ 7929 7952 8027 8033 8120 8132 8168 
+ 7961 7987 8030 8064 8114 8143 
+ 8011 8017 8042 8055 8073 8080 
+ 7814 7858 7891 8155 8176 8305 8333 
+ 8014 8022 8040 8059 8070 8079 
+ 8004 8013 8039 8058 8078 8084 
+ 8012 8029 8035 8065 8071 8086 
+ 8024 8039 8063 8082 8090 15390 
+ 7973 7994 8026 8106 8113 8157 
+ 8017 8023 8048 8060 8080 8087 
+ 8020 8035 8041 8071 8077 8094 
+ 7999 8021 8038 8072 8099 8102 8141 
+ 8013 8019 8051 8069 8084 8096 
+ 8022 8038 8050 8072 8079 8092 
+ 8023 8055 8087 8098 
+ 8025 8031 8066 8076 8112 
+ 8040 8043 8068 8070 8085 
+ 8024 8041 8053 8077 8090 8103 
+ 7987 8000 8047 8074 8143 8160 
+ 8029 8052 8086 8107 
+ 8031 8032 8061 8067 8104 8112 
+ 8032 8036 8066 8069 8104 8111 
+ 8042 8043 8062 8073 8085 8101 
+ 8019 8036 8058 8067 8096 8111 
+ 8040 8050 8062 8079 8085 8105 
+ 8035 8052 8056 8086 8094 8116 
+ 8038 8057 8059 8092 8102 
+ 8042 8048 8068 8080 8101 8115 
+ 8000 8044 8064 8129 8160 
+ 7969 8009 8081 8138 8142 8182 
+ 8025 8033 8061 8112 8120 8170 
+ 8041 8056 8063 8094 8103 8123 
+ 8039 8051 8082 8084 8122 8125 
+ 8050 8059 8070 8092 8105 8127 
+ 8048 8055 8073 8087 8115 8126 
+ 7969 8006 8075 8089 8138 8161 
+ 8039 8053 8078 8090 8121 8122 
+ 7967 8001 8030 8114 8162 8216 
+ 8051 8058 8078 8096 8125 8134 
+ 8062 8068 8070 8101 8105 8130 
+ 8052 8065 8071 8107 8116 8133 
+ 8055 8060 8080 8098 8126 8135 
+ 8003 8015 8091 8099 8179 8187 
+ 7996 8006 8081 8093 8161 8190 
+ 8053 8063 8082 8103 8121 8131 
+ 8003 8016 8088 8097 8179 8184 
+ 8059 8072 8079 8102 8127 8147 
+ 7996 8001 8089 8162 8190 8213 
+ 8056 8071 8077 8116 8123 8137 
+ 7926 7955 8034 8119 8171 8291 15393 
+ 8058 8069 8084 8111 8134 8146 
+ 8016 8026 8091 8113 8184 8186 
+ 8060 8087 8135 8144 
+ 8015 8021 8057 8088 8141 8187 8206 
+ 7660 7808 7966 8426 8742 8935 
+ 8068 8073 8085 8115 8130 8149 
+ 8057 8072 8092 8141 8147 
+ 8063 8077 8090 8123 8131 8148 
+ 8066 8067 8111 8112 8154 8183 
+ 8070 8079 8085 8127 8130 8167 
+ 7994 8034 8054 8157 8171 8188 
+ 8065 8086 8133 8153 
+ 7326 7346 7608 8722 9530 11037 
+ 7897 7924 8117 8212 8401 8405 
+ 7936 8007 8028 8236 8243 8364 
+ 8067 8069 8096 8104 8146 8154 
+ 8061 8066 8076 8104 8170 8183 
+ 8026 8054 8097 8157 8186 8202 
+ 8030 8047 8083 8143 8216 8252 
+ 8073 8080 8101 8126 8149 8159 
+ 8071 8086 8094 8133 8137 8158 
+ 7897 7942 8109 8119 8344 8401 
+ 7315 7437 7609 8472 8739 11028 11079 
+ 7942 7955 8095 8117 8344 15393 
+ 8033 8046 8076 8168 8170 8204 
+ 8082 8090 8122 8131 8150 8156 
+ 8078 8082 8121 8125 8156 8164 
+ 8077 8094 8103 8137 8148 8163 
+ 8027 8044 8129 8132 8193 8200 
+ 8078 8084 8122 8134 8164 8172 
+ 8080 8087 8115 8135 8159 8169 
+ 8079 8092 8105 8147 8167 8201 
+ 8018 8037 8136 8223 8229 
+ 8044 8074 8124 8160 8193 8276 
+ 8085 8101 8105 8149 8167 8181 
+ 8090 8103 8121 8148 8150 8165 
+ 8027 8046 8124 8168 8200 8220 
+ 8086 8107 8116 8153 8158 8174 
+ 8084 8096 8125 8146 8172 8191 
+ 8087 8098 8126 8144 8169 8175 
+ 8009 8018 8128 8142 8229 8233 
+ 8094 8116 8123 8158 8163 8178 
+ 8075 8081 8161 8182 8209 
+ 7872 7984 8140 8420 8432 
+ 7858 7872 8139 8176 8420 8452 
+ 8057 8099 8102 8147 8206 8214 
+ 8009 8075 8136 8182 8233 8244 
+ 8047 8064 8114 8160 8252 8285 
+ 8098 8135 8175 8185 
+ 7772 7937 8045 8306 8417 8519 
+ 8096 8111 8134 8154 8191 8203 
+ 8092 8102 8127 8141 8201 8214 
+ 8103 8123 8131 8163 8165 8180 
+ 8101 8115 8130 8159 8181 15391 
+ 8121 8131 8156 8165 8173 
+ 7007 7248 7455 10752 10767 12039 
+ 7866 8037 8198 8223 8296 
+ 8107 8133 8174 8196 
+ 8104 8111 8146 8183 8203 8215 
+ 7891 8028 8049 8236 8333 8393 
+ 8121 8122 8150 8164 8173 8192 
+ 8054 8106 8113 8188 8202 8208 
+ 8116 8133 8137 8174 8178 8197 
+ 8115 8126 8149 8169 8205 15391 
+ 8064 8074 8129 8143 8276 8285 
+ 8081 8089 8138 8190 8209 8247 
+ 8001 8083 8093 8213 8216 8293 
+ 8123 8137 8148 8178 8180 8199 
+ 8122 8125 8156 8172 8192 8207 
+ 8131 8148 8150 8173 8180 8195 
+ 7112 7332 7455 10539 10767 15544 
+ 8105 8127 8130 8181 8201 8226 
+ 8046 8120 8132 8204 8220 8249 
+ 8126 8135 8159 8175 8205 8210 
+ 8076 8112 8120 8183 8204 8234 8241 
+ 8034 8095 8106 8188 8262 8291 
+ 8125 8134 8164 8191 8207 8227 
+ 8150 8156 8165 8192 8195 8211 
+ 8133 8153 8158 8196 8197 8221 
+ 8135 8144 8169 8185 8210 8222 
+ 7858 8049 8140 8305 8410 8452 
+ 7729 7794 7963 8194 9305 15422 
+ 8137 8158 8163 8197 8199 8218 
+ 8088 8091 8184 8187 8264 8290 
+ 8148 8163 8165 8195 8199 8217 
+ 8130 8149 8167 8226 8228 15391 
+ 8075 8138 8142 8209 8244 8269 
+ 8104 8112 8154 8170 8215 8241 8242 
+ 8091 8097 8179 8186 8261 8264 
+ 8144 8175 8222 8225 
+ 8097 8113 8184 8202 8260 8261 
+ 8088 8099 8179 8206 8290 8308 
+ 8106 8157 8171 8208 8257 8262 
+ 7873 7874 8219 8246 8458 8517 
+ 8089 8093 8161 8213 8247 8284 
+ 8134 8146 8172 8203 8227 8237 
+ 8156 8164 8173 8207 8211 8230 
+ 8124 8129 8200 8276 15392 
+ 7794 7937 8177 8306 15422 
+ 8165 8173 8180 8211 8217 8231 
+ 8153 8174 8221 8240 
+ 8158 8174 8178 8218 8221 8238 
+ 7866 8007 8152 8243 8296 8373 
+ 8163 8178 8180 8217 8218 8235 
+ 8124 8132 8193 8220 8273 15392 
+ 8127 8147 8167 8214 8226 8275 8279 
+ 8113 8157 8186 8208 8255 8260 
+ 8146 8154 8191 8215 8237 8248 
+ 8120 8168 8170 8234 8249 8268 
+ 8159 8169 8210 8239 8245 15391 
+ 8099 8141 8187 8214 8297 8308 
+ 8164 8172 8192 8227 8230 8254 
+ 8157 8188 8202 8255 8257 
+ 8138 8161 8182 8247 8269 8327 
+ 8169 8175 8205 8222 8245 8250 
+ 8173 8192 8195 8230 8231 8251 
+ 7924 8045 8109 8405 8417 8521 
+ 8093 8162 8190 8284 8293 8335 
+ 8141 8147 8201 8206 8275 8297 
+ 8154 8183 8203 8242 8248 8263 
+ 8083 8114 8162 8252 8293 8346 
+ 8180 8195 8199 8231 8235 8253 
+ 8178 8197 8199 8235 8238 8256 
+ 7874 7905 8189 8224 8517 8534 
+ 8132 8168 8200 8249 8273 8274 
+ 8174 8196 8197 8238 8240 8259 
+ 8175 8185 8210 8225 8250 8258 
+ 8037 8128 8152 8229 8296 8381 
+ 7905 7934 8219 8307 8534 8645 
+ 8185 8222 8258 8265 
+ 8167 8181 8201 8228 8270 8279 
+ 8172 8191 8207 8237 8254 8272 8289 
+ 8181 8226 8239 8270 8277 15391 
+ 8128 8136 8223 8233 8377 8381 
+ 8192 8207 8211 8251 8254 8266 
+ 8195 8211 8217 8251 8253 8271 
+ 6494 6507 7436 11299 13750 14955 
+ 8136 8142 8229 8244 8367 8377 
+ 8170 8204 8241 8268 8280 8316 
+ 8199 8217 8218 8253 8256 8278 
+ 8028 8110 8155 8364 8393 8441 
+ 8191 8203 8227 8248 8267 8272 
+ 8197 8218 8221 8256 8259 8283 
+ 8205 8228 8245 8277 8287 15391 
+ 8196 8221 8259 8286 
+ 8170 8183 8234 8242 8280 8281 
+ 8183 8215 8241 8263 8281 8282 
+ 8007 8110 8198 8364 8373 8535 
+ 8142 8182 8233 8269 8367 
+ 8205 8210 8239 8250 8287 8292 
+ 7873 7995 8189 8439 8458 8630 
+ 8161 8190 8209 8284 8327 8370 
+ 8203 8215 8237 8263 8267 8288 
+ 8168 8204 8220 8268 8274 8321 
+ 8210 8222 8245 8258 8292 8298 
+ 8211 8230 8231 8266 8271 8294 
+ 8114 8143 8216 8285 8346 8380 
+ 8217 8231 8235 8271 8278 8299 
+ 8207 8227 8230 8266 8289 8295 
+ 8202 8208 8257 8260 8322 8336 
+ 8218 8235 8238 8278 8283 8300 
+ 8188 8208 8255 8262 8322 8328 
+ 8222 8225 8250 8265 8298 8302 
+ 8221 8238 8240 8283 8286 8303 
+ 8186 8202 8255 8261 8329 8336 
+ 8184 8186 8260 8264 8329 8349 
+ 8171 8188 8257 8291 8328 8374 
+ 8215 8242 8248 8282 8288 8313 
+ 8179 8184 8261 8290 8349 8388 
+ 8225 8258 8302 8309 
+ 8230 8251 8254 8294 8295 8304 
+ 8237 8248 8272 8288 8301 8319 
+ 8204 8234 8249 8316 8321 8357 
+ 8182 8209 8244 8327 8367 8479 
+ 8226 8228 8277 8279 8312 8330 
+ 8231 8251 8253 8294 8299 8314 
+ 8227 8237 8267 8289 8301 8310 
+ 8200 8220 8274 8343 8371 15392 
+ 8220 8249 8273 8321 8343 
+ 8201 8214 8279 8297 8348 8362 
+ 8129 8160 8193 8285 8391 8418 15392 
+ 8228 8239 8270 8287 8312 8317 
+ 8235 8253 8256 8299 8300 8318 
+ 8201 8226 8270 8275 8330 8348 
+ 8234 8241 8281 8316 8334 
+ 8241 8242 8280 8282 8323 8334 
+ 8242 8263 8281 8313 8323 
+ 8238 8256 8259 8300 8303 8324 
+ 8190 8213 8247 8335 8370 
+ 8143 8160 8252 8276 8380 8418 
+ 8240 8259 8303 8326 
+ 8239 8245 8277 8292 8317 8325 
+ 8248 8263 8267 8313 8319 
+ 8227 8254 8272 8295 8310 8315 
+ 8179 8187 8264 8308 8388 8416 
+ 8095 8171 8262 8374 8450 15393 
+ 8245 8250 8287 8298 8325 8332 
+ 8162 8213 8216 8335 8346 8444 
+ 8251 8266 8271 8304 8314 8331 
+ 8254 8266 8289 8304 8315 8320 
+ 8152 8198 8223 8373 8381 8470 
+ 8206 8214 8275 8308 8362 8400 
+ 8250 8258 8292 8302 8332 8338 
+ 8253 8271 8278 8314 8318 8339 
+ 8256 8278 8283 8318 8324 8342 
+ 8267 8272 8310 8319 8340 
+ 8258 8265 8298 8309 8338 8345 
+ 8259 8283 8286 8324 8326 8347 
+ 8266 8294 8295 8320 8331 8341 
+ 8049 8176 8333 8410 8456 8461 
+ 7937 8145 8194 8519 15422 
+ 7832 7934 8224 8337 8643 8645 
+ 8187 8206 8290 8297 8400 8416 
+ 8265 8302 8345 8354 
+ 8272 8289 8301 8315 8340 8351 
+ 7884 7995 8350 8439 8586 8601 
+ 8270 8277 8317 8330 8352 8359 
+ 8263 8282 8288 8319 8323 8361 
+ 8271 8294 8299 8331 8339 8356 
+ 8289 8295 8310 8320 8351 8353 
+ 8234 8268 8280 8334 8357 8384 
+ 8277 8287 8312 8325 8352 8360 
+ 8278 8299 8300 8339 8342 8363 
+ 8267 8288 8301 8313 8340 8361 8386 
+ 8295 8304 8315 8341 8353 
+ 8249 8268 8274 8343 8357 8397 
+ 8255 8257 8328 8336 8390 8404 
+ 8281 8282 8313 8334 8361 8395 
+ 8283 8300 8303 8342 8347 8365 
+ 8287 8292 8317 8332 8360 8366 
+ 8286 8303 8347 8369 
+ 8209 8247 8269 8370 8462 8479 
+ 8257 8262 8322 8374 8390 
+ 8260 8261 8336 8349 8407 
+ 8270 8279 8312 8348 8359 8387 
+ 8294 8304 8314 8341 8356 8368 
+ 8292 8298 8325 8338 8366 8372 
+ 8049 8155 8305 8393 8461 8495 
+ 8280 8281 8316 8323 8384 8395 
+ 8213 8284 8293 8370 8444 8453 
+ 8255 8260 8322 8329 8404 8407 
+ 7808 7832 8307 8426 8643 8701 
+ 8298 8302 8332 8345 8372 8376 
+ 8299 8314 8318 8356 8363 8375 
+ 8301 8310 8319 8351 8386 8399 
+ 8304 8320 8331 8353 8368 8379 
+ 8300 8318 8324 8363 8365 8378 
+ 8273 8274 8321 8371 8397 8436 
+ 8117 8119 8401 8516 8624 15393 
+ 8302 8309 8338 8354 8376 8382 
+ 8216 8252 8293 8380 8444 8464 
+ 8303 8324 8326 8365 8369 8385 
+ 8275 8279 8330 8362 8387 8413 
+ 8261 8264 8329 8388 8407 8477 
+ 7884 7984 8311 8432 8601 8688 
+ 8310 8315 8340 8353 8394 8399 
+ 8312 8317 8359 8360 8383 8389 
+ 8315 8320 8341 8351 8379 8394 
+ 8309 8345 8382 8392 
+ 6345 6996 7178 10635 13535 13856 
+ 8314 8331 8339 8368 8375 15394 
+ 8268 8316 8321 8384 8397 8433 
+ 7592 7608 7963 9305 9530 10946 
+ 8312 8330 8352 8383 8387 
+ 8317 8325 8352 8366 8389 8396 
+ 8313 8319 8323 8386 8395 8423 
+ 8275 8297 8348 8400 8413 8455 
+ 8318 8339 8342 8375 8378 8398 
+ 8110 8236 8243 8441 8535 8573 
+ 8324 8342 8347 8378 8385 8402 
+ 8325 8332 8360 8372 8396 8403 
+ 8233 8244 8269 8377 8479 8507 
+ 8331 8341 8356 8379 8408 15394 
+ 8326 8347 8385 8406 
+ 8247 8284 8327 8335 8453 8462 
+ 8273 8343 8391 8436 15392 15395 
+ 8332 8338 8366 8376 8403 8409 
+ 8198 8243 8296 8470 8535 8613 
+ 8262 8291 8328 8390 8450 8460 
+ 8339 8356 8363 8398 8411 15394 
+ 8338 8345 8372 8382 8409 8412 
+ 8229 8233 8367 8381 8507 8529 
+ 8342 8363 8365 8398 8402 8414 
+ 8341 8353 8368 8394 8408 8427 
+ 8252 8285 8346 8418 8464 8498 
+ 8223 8229 8296 8377 8470 8529 8556 
+ 8345 8354 8376 8392 8412 8419 
+ 8352 8359 8387 8389 8415 8421 
+ 8316 8334 8357 8395 8433 8469 
+ 8347 8365 8369 8402 8406 8422 
+ 8319 8340 8361 8399 8423 8442 
+ 8330 8348 8359 8383 8413 8421 8435 
+ 8264 8290 8349 8416 8477 8536 
+ 8352 8360 8383 8396 8415 8425 
+ 8322 8328 8374 8404 8460 8474 
+ 8276 8371 8418 8499 15392 15395 
+ 8354 8382 8419 8424 
+ 8155 8236 8333 8441 8495 8539 
+ 8351 8353 8379 8399 8427 8447 
+ 8323 8334 8361 8384 8423 8469 8486 
+ 8360 8366 8389 8403 8425 8430 
+ 8321 8343 8357 8433 8436 8491 
+ 8363 8375 8378 8411 8414 8431 
+ 8340 8351 8386 8394 8442 8447 
+ 8297 8308 8362 8416 8455 8511 
+ 8109 8117 8344 8405 8624 8690 
+ 8365 8378 8385 8414 8422 8434 
+ 8366 8372 8396 8409 8430 8437 
+ 8322 8336 8390 8407 8474 8490 
+ 8109 8212 8401 8521 8690 
+ 8369 8385 8422 8438 
+ 8329 8336 8349 8404 8477 8490 
+ 8368 8379 8427 8428 8448 15394 
+ 8372 8376 8403 8412 8437 8440 
+ 8176 8305 8452 8456 8676 
+ 8375 8398 8428 8431 8445 15394 
+ 8376 8382 8409 8419 8440 8443 
+ 8348 8362 8387 8435 8455 8465 
+ 8378 8398 8402 8431 8434 8449 
+ 8383 8389 8421 8425 8446 8457 
+ 8290 8308 8388 8400 8511 8536 
+ 8045 8145 8212 8519 8521 8816 
+ 8276 8285 8380 8391 8498 8499 8564 
+ 8382 8392 8412 8424 8443 8451 
+ 8139 8140 8432 8452 8728 8856 
+ 8383 8387 8415 8435 8446 
+ 8385 8402 8406 8434 8438 8454 
+ 8361 8386 8395 8442 8486 8492 
+ 8392 8419 8451 8459 
+ 8389 8396 8415 8430 8457 8463 
+ 7808 8100 8337 8701 8742 9359 
+ 8379 8394 8408 8447 8448 8480 
+ 8408 8411 8445 8448 8467 15394 
+ 5550 6549 6996 14069 14806 14963 
+ 8396 8403 8425 8437 8463 8468 
+ 8398 8411 8414 8445 8449 8466 
+ 7984 8139 8350 8420 8688 8856 
+ 8357 8384 8397 8469 8491 8548 
+ 8402 8414 8422 8449 8454 8471 
+ 8387 8413 8421 8446 8465 8476 
+ 8343 8371 8397 8491 8532 15395 
+ 8403 8409 8430 8440 8468 8473 
+ 8406 8422 8454 8475 
+ 7995 8246 8311 8586 8630 8835 
+ 8409 8412 8437 8443 8473 8478 
+ 8236 8364 8393 8539 8573 8589 
+ 8386 8399 8423 8447 8492 8501 
+ 8412 8419 8440 8451 8478 8481 
+ 8293 8335 8346 8453 8464 8585 8587 
+ 8411 8428 8431 8466 8467 8482 
+ 8415 8421 8435 8457 8476 8485 
+ 8394 8399 8427 8442 8480 8501 8510 
+ 8408 8427 8428 8467 8480 8489 
+ 8414 8431 8434 8466 8471 8483 
+ 8291 8374 8460 8516 8649 15393 15397 
+ 8419 8424 8443 8459 8481 8484 
+ 8140 8176 8410 8420 8676 8728 
+ 8335 8370 8444 8462 8585 8598 
+ 8422 8434 8438 8471 8475 8487 
+ 8362 8400 8413 8465 8504 8511 15396 
+ 8305 8410 8461 8544 8676 
+ 8415 8425 8446 8463 8485 8493 
+ 8189 8246 8517 8630 8778 
+ 8424 8451 8484 8488 
+ 8374 8390 8450 8474 8542 15397 
+ 8305 8333 8456 8495 8544 8608 
+ 8327 8370 8453 8479 8598 8615 
+ 8425 8430 8457 8468 8493 8494 
+ 8346 8380 8444 8498 8587 8617 
+ 8413 8435 8455 8476 8504 8508 
+ 8431 8445 8449 8482 8483 8496 
+ 8428 8445 8448 8482 8489 8502 
+ 8430 8437 8463 8473 8494 8497 
+ 8384 8395 8433 8486 8543 8548 
+ 8296 8373 8381 8556 8613 8699 
+ 8434 8449 8454 8483 8487 8500 
+ 7437 7528 8118 8881 11028 11137 
+ 8437 8440 8468 8478 8497 8503 
+ 8390 8404 8460 8490 8542 8568 
+ 8438 8454 8487 8505 
+ 8435 8446 8465 8485 8508 8523 
+ 8349 8388 8407 8490 8536 8580 8626 
+ 8440 8443 8473 8481 8503 8506 
+ 8269 8327 8367 8462 8507 8615 8629 
+ 8427 8447 8448 8489 8510 8520 
+ 8443 8451 8478 8484 8506 8509 
+ 8445 8466 8467 8496 8502 8514 
+ 8449 8466 8471 8496 8500 8512 
+ 8451 8459 8481 8488 8509 8513 
+ 8446 8457 8476 8493 8523 8524 
+ 8395 8423 8469 8492 8543 8569 
+ 8454 8471 8475 8500 8505 8515 
+ 8459 8484 8513 8518 
+ 8448 8467 8480 8502 8520 8522 
+ 8404 8407 8474 8477 8568 8580 
+ 8397 8433 8436 8532 8548 8592 
+ 8423 8442 8486 8501 8555 8569 
+ 8457 8463 8485 8494 8524 8526 
+ 8463 8468 8493 8497 8525 8526 
+ 8333 8393 8461 8539 8608 8693 
+ 8466 8482 8483 8512 8514 8527 
+ 8468 8473 8494 8503 8525 8528 
+ 8380 8418 8464 8564 8617 8656 
+ 8391 8418 8564 8574 8662 15395 
+ 8471 8483 8487 8512 8515 8530 
+ 8442 8447 8492 8510 8554 8555 
+ 8467 8482 8489 8514 8522 8531 
+ 8473 8478 8497 8506 8528 8533 
+ 8455 8465 8508 8540 15396 
+ 8475 8487 8515 8537 
+ 8478 8481 8503 8509 8533 8538 
+ 8367 8377 8479 8529 8629 8655 
+ 8465 8476 8504 8523 8540 8551 
+ 8481 8484 8506 8513 8538 8541 
+ 8447 8480 8501 8520 8554 8560 
+ 8400 8416 8455 8536 8611 8642 15396 
+ 8483 8496 8500 8527 8530 8545 
+ 8484 8488 8509 8518 8541 8546 
+ 8482 8496 8502 8527 8531 8547 
+ 8487 8500 8505 8530 8537 8549 
+ 8344 8450 8624 8649 8779 15393 
+ 8189 8219 8458 8534 8778 8942 
+ 8488 8513 8546 8550 
+ 8145 8306 8417 8816 10106 15422 
+ 8480 8489 8510 8522 8553 8560 
+ 8212 8405 8417 8690 8816 9209 
+ 8489 8502 8520 8531 8552 8553 
+ 8476 8485 8508 8524 8551 8571 8583 
+ 8485 8493 8523 8526 8566 8571 
+ 8494 8497 8526 8528 8558 8559 
+ 8493 8494 8524 8525 8559 8566 
+ 8496 8512 8514 8545 8547 8557 
+ 8497 8503 8525 8533 8558 8562 
+ 8377 8381 8507 8556 8655 8670 
+ 8500 8512 8515 8545 8549 8561 
+ 8502 8514 8522 8547 8552 8563 
+ 8436 8491 8574 8592 8652 15395 
+ 8503 8506 8528 8538 8562 8565 
+ 8219 8224 8517 8645 8942 9424 
+ 8243 8364 8373 8573 8613 8842 8861 
+ 8388 8416 8477 8511 8626 8642 8695 
+ 8505 8515 8549 8567 
+ 8506 8509 8533 8541 8565 8570 
+ 8393 8441 8495 8589 8693 8755 
+ 8504 8508 8551 8579 15396 
+ 8509 8513 8538 8546 8570 8572 
+ 8460 8474 8568 8658 8663 15397 
+ 8469 8486 8548 8569 8610 8634 
+ 8456 8461 8608 8676 8703 
+ 8512 8527 8530 8557 8561 8575 
+ 8513 8518 8541 8550 8572 8577 
+ 8514 8527 8531 8557 8563 8576 
+ 8433 8469 8491 8543 8592 8634 8661 
+ 8515 8530 8537 8561 8567 8581 
+ 8518 8546 8577 8582 
+ 8508 8523 8540 8579 8583 15398 
+ 8522 8531 8553 8563 8578 8584 
+ 8520 8522 8552 8560 8584 8588 
+ 8501 8510 8555 8560 8597 8622 
+ 8492 8501 8554 8569 8622 8633 
+ 8381 8470 8529 8670 8699 8774 
+ 8527 8545 8547 8575 8576 8591 
+ 8525 8528 8559 8562 8594 8595 
+ 8525 8526 8558 8566 8595 8602 
+ 8510 8520 8553 8554 8588 8597 8612 
+ 8530 8545 8549 8575 8581 8593 
+ 8528 8533 8558 8565 8594 8596 
+ 8531 8547 8552 8576 8578 8590 
+ 8418 8498 8499 8656 8662 8733 
+ 8533 8538 8562 8570 8596 8600 
+ 8524 8526 8559 8571 8602 8606 
+ 8537 8549 8581 8603 
+ 8474 8490 8542 8580 8663 8691 
+ 8486 8492 8543 8555 8610 8633 8668 
+ 8538 8541 8565 8572 8600 8604 
+ 8523 8524 8566 8583 8606 8618 
+ 8541 8546 8570 8577 8604 8607 
+ 8364 8441 8535 8589 8818 8842 
+ 8499 8532 8652 8662 8780 15395 
+ 8545 8557 8561 8591 8593 8614 
+ 8547 8557 8563 8590 8591 8609 
+ 8546 8550 8572 8582 8607 8616 
+ 8552 8563 8584 8590 8599 
+ 8540 8551 8625 15396 15398 15400 
+ 8477 8490 8568 8626 8691 8738 
+ 8549 8561 8567 8593 8603 8620 
+ 8550 8577 8616 8621 
+ 8523 8551 8571 8618 8628 15398 
+ 8552 8553 8578 8588 8599 8605 
+ 8444 8453 8587 8598 8758 8772 
+ 8311 8439 8601 8835 8927 
+ 8444 8464 8585 8617 8758 8762 
+ 8553 8560 8584 8605 8612 8619 
+ 8441 8539 8573 8755 8818 
+ 8563 8576 8578 8599 8609 8623 
+ 8557 8575 8576 8609 8614 8627 
+ 8491 8532 8548 8652 8661 8718 
+ 8561 8575 8581 8614 8620 8632 
+ 8558 8562 8595 8596 8635 8636 
+ 8558 8559 8594 8602 8636 8639 
+ 8562 8565 8594 8600 8635 8637 
+ 8554 8560 8612 8622 8665 15401 
+ 8453 8462 8585 8615 8772 8800 
+ 8578 8584 8590 8605 8623 8631 
+ 8565 8570 8596 8604 8637 8640 
+ 8311 8350 8586 8688 8927 9139 
+ 8559 8566 8595 8606 8639 15399 
+ 8567 8581 8620 8644 
+ 8570 8572 8600 8607 8640 8646 
+ 8584 8588 8599 8619 8631 8638 
+ 8566 8571 8602 8618 8647 15399 
+ 8572 8577 8604 8616 8646 8648 
+ 8461 8495 8544 8693 8703 8841 
+ 8576 8590 8591 8623 8627 8641 
+ 8543 8569 8634 8668 8698 
+ 8511 8625 8642 8705 8726 15396 
+ 8560 8588 8597 8619 8653 15401 
+ 8373 8470 8535 8699 8861 8911 
+ 8575 8591 8593 8627 8632 8650 
+ 8462 8479 8598 8629 8800 8821 
+ 8577 8582 8607 8621 8648 8654 
+ 8464 8498 8587 8656 8762 8777 
+ 8571 8583 8606 8628 8647 8651 
+ 8588 8605 8612 8638 8653 
+ 8581 8593 8603 8632 8644 8659 
+ 8582 8616 8654 8660 
+ 8554 8555 8597 8633 8665 8679 
+ 8590 8599 8609 8631 8641 8657 
+ 8344 8401 8516 8690 8779 9129 9162 
+ 8579 8611 8700 8705 15396 15400 
+ 8477 8536 8580 8695 8738 8802 
+ 8591 8609 8614 8641 8650 8667 
+ 8583 8618 8651 8664 8672 15398 
+ 8479 8507 8615 8655 8793 8821 
+ 8246 8439 8458 8778 8835 9382 
+ 8599 8605 8623 8638 8657 8669 
+ 8593 8614 8620 8650 8659 8671 
+ 8555 8569 8622 8668 8679 8709 
+ 8543 8548 8610 8661 8698 8734 
+ 8594 8596 8636 8637 8674 8677 
+ 8594 8595 8635 8639 8677 8682 
+ 8596 8600 8635 8640 8674 8675 
+ 8605 8619 8631 8653 8669 8689 
+ 8595 8602 8636 8682 8684 15399 
+ 8600 8604 8637 8646 8675 8678 
+ 8609 8623 8627 8657 8667 8673 
+ 8511 8536 8611 8695 8726 8768 
+ 8307 8337 8645 8701 9296 9719 
+ 8603 8620 8659 8680 
+ 8224 8307 8534 8643 9424 9719 
+ 8604 8607 8640 8648 8678 8681 
+ 8606 8618 8651 8683 8685 15399 
+ 8607 8616 8646 8654 8681 8687 
+ 8450 8516 8730 8779 8846 15397 
+ 8614 8627 8632 8667 8671 8686 
+ 8618 8628 8647 8672 8683 
+ 8532 8574 8592 8718 8780 8837 
+ 8612 8619 8638 8689 8704 15401 
+ 8616 8621 8648 8660 8687 8692 
+ 8507 8529 8629 8670 8793 8799 
+ 8498 8564 8617 8733 8777 8792 
+ 8623 8631 8641 8669 8673 8694 
+ 8542 8663 8730 8756 15397 
+ 8620 8632 8644 8671 8680 8697 
+ 8621 8654 8692 8696 
+ 8548 8592 8634 8718 8734 8798 
+ 8499 8564 8574 8733 8780 8838 
+ 8542 8568 8658 8691 8756 8789 
+ 8628 8672 8706 8711 15398 15400 
+ 8597 8622 8679 8707 8737 15401 
+ 6710 6724 7709 7933 12141 14308 
+ 8627 8641 8650 8673 8686 8702 
+ 8569 8610 8633 8698 8709 8749 
+ 8631 8638 8657 8689 8694 8710 
+ 8529 8556 8655 8774 8799 
+ 8632 8650 8659 8686 8697 8708 
+ 8628 8651 8664 8683 8711 8723 
+ 8641 8657 8667 8694 8702 8712 
+ 8635 8637 8675 8677 8714 8721 
+ 8637 8640 8674 8678 8713 8714 
+ 8410 8452 8456 8544 8703 8728 8990 9658 
+ 8635 8636 8674 8682 8721 8725 
+ 8640 8646 8675 8681 8713 8715 
+ 8622 8633 8665 8709 8737 8759 
+ 8644 8659 8697 8716 
+ 8646 8648 8678 8687 8715 8717 
+ 8636 8639 8677 8684 8725 8727 
+ 8647 8651 8672 8685 8723 8735 
+ 8639 8682 8685 8727 8731 15399 
+ 8647 8683 8684 8731 8735 15399 
+ 8650 8667 8671 8702 8708 8719 
+ 8648 8654 8681 8692 8717 8720 
+ 8350 8432 8601 8856 9139 9604 
+ 8638 8653 8669 8704 8710 8740 
+ 8401 8405 8521 8624 9162 9209 
+ 8568 8580 8663 8738 8789 8867 
+ 8654 8660 8687 8696 8720 8724 
+ 8495 8539 8608 8755 8841 8999 
+ 8657 8669 8673 8710 8712 8732 
+ 8536 8626 8642 8768 8802 8847 
+ 8660 8692 8724 15402 
+ 8659 8671 8680 8708 8716 8729 
+ 8610 8634 8668 8734 8749 8781 
+ 8470 8556 8613 8774 8911 8998 
+ 8625 8705 8706 8743 8765 15400 
+ 8337 8426 8643 9296 9359 
+ 8667 8673 8686 8712 8719 8736 
+ 8544 8608 8676 8841 8990 
+ 8653 8689 8707 8740 8767 15401 
+ 8611 8625 8700 8726 8765 8808 
+ 8664 8700 8711 8743 8745 15400 
+ 8665 8704 8737 8767 8773 15401 
+ 8671 8686 8697 8719 8729 8741 
+ 8633 8668 8679 8749 8759 8803 
+ 8669 8689 8694 8732 8740 8751 
+ 8664 8672 8706 8723 8745 8766 
+ 8673 8694 8702 8732 8736 8744 
+ 8675 8678 8714 8715 8748 8752 
+ 8674 8675 8713 8721 8752 8760 
+ 8678 8681 8713 8717 8748 8750 
+ 8680 8697 8729 8746 
+ 8681 8687 8715 8720 8747 8750 
+ 8592 8652 8661 8798 8837 8898 
+ 8686 8702 8708 8736 8741 8754 
+ 8687 8692 8717 8724 8747 8753 
+ 8674 8677 8714 8725 8760 8764 
+ 7346 7379 8108 10539 11037 11903 
+ 8672 8683 8711 8735 8766 8786 
+ 8692 8696 8720 8753 8757 15402 
+ 8677 8682 8721 8727 8764 8769 
+ 8611 8642 8705 8768 8808 8851 
+ 8682 8684 8725 8731 8769 8776 
+ 8420 8452 8676 8856 9658 9840 
+ 8697 8708 8716 8741 8746 8763 
+ 8649 8658 8756 8846 8853 15397 
+ 8684 8685 8727 8735 8776 8782 
+ 8694 8710 8712 8744 8751 8771 
+ 8564 8656 8662 8792 8838 8922 
+ 8634 8661 8698 8781 8798 8868 
+ 8683 8685 8723 8731 8782 8786 
+ 8702 8712 8719 8744 8754 8770 
+ 8665 8679 8707 8759 8773 8796 
+ 8580 8626 8691 8802 8867 8969 
+ 7609 7753 8118 8918 11034 11079 
+ 8689 8704 8710 8751 8767 8783 
+ 8708 8719 8729 8754 8763 8775 
+ 8100 8426 8935 9359 10199 
+ 8700 8706 8745 8765 8804 8810 
+ 8712 8732 8736 8770 8771 8791 
+ 8706 8711 8743 8766 8804 8820 
+ 8716 8729 8763 8785 
+ 8717 8720 8750 8753 8784 8788 
+ 8713 8715 8750 8752 8790 8797 
+ 8668 8698 8709 8781 8803 8872 8877 
+ 8715 8717 8747 8748 8788 8790 
+ 8710 8732 8740 8771 8783 8806 
+ 8713 8714 8748 8760 8797 8805 
+ 8720 8724 8747 8757 8784 8787 
+ 8719 8736 8741 8770 8775 8794 
+ 8539 8589 8693 8818 8999 9246 
+ 8658 8663 8730 8789 8853 8895 
+ 8724 8753 8761 8787 8795 15402 
+ 8585 8587 8762 8772 8976 9031 
+ 8679 8709 8737 8796 8803 8828 
+ 8714 8721 8752 8764 8805 8809 
+ 8757 8795 8801 15402 
+ 8587 8617 8758 8777 8939 8976 
+ 8729 8741 8746 8775 8785 8807 
+ 8721 8725 8760 8769 8809 8813 
+ 8700 8705 8743 8808 8810 8850 
+ 8711 8723 8745 8786 8820 8862 
+ 8704 8707 8740 8773 8783 8814 8834 
+ 8642 8695 8726 8847 8851 8912 
+ 8725 8727 8764 8776 8813 8819 
+ 8736 8744 8754 8791 8794 8811 
+ 8732 8744 8751 8791 8806 8815 
+ 8585 8598 8758 8800 9031 9078 
+ 8707 8737 8767 8796 8814 8817 
+ 8556 8670 8699 8799 8998 9101 
+ 8741 8754 8763 8794 8807 8812 
+ 8727 8731 8769 8782 8819 8832 
+ 8617 8656 8762 8792 8939 8949 
+ 8458 8517 8630 8942 9382 9994 
+ 8516 8624 8649 8846 9049 9129 
+ 8574 8652 8662 8837 8838 9039 9041 
+ 8698 8734 8749 8868 8872 8905 
+ 8731 8735 8776 8786 8832 8858 
+ 8740 8751 8767 8806 8830 8834 
+ 8747 8753 8787 8788 8824 15403 
+ 8746 8763 8807 8823 
+ 8723 8735 8766 8782 8858 8862 
+ 8753 8757 8784 8795 8822 15403 
+ 8747 8750 8784 8790 8824 8827 
+ 8663 8691 8756 8867 8895 9074 
+ 8748 8750 8788 8797 8827 8833 
+ 8744 8770 8771 8811 8815 8829 
+ 8656 8733 8777 8922 8949 
+ 8629 8655 8799 8821 9133 9170 
+ 8754 8770 8775 8811 8812 8826 
+ 8757 8761 8787 8801 8822 8825 
+ 8737 8759 8773 8817 8828 8848 
+ 8748 8752 8790 8805 8833 8839 
+ 8661 8718 8734 8868 8898 8982 
+ 8655 8670 8774 8793 9101 9133 
+ 8598 8615 8772 8821 9078 9090 
+ 8761 8795 8825 8831 
+ 8626 8695 8738 8847 8969 9008 
+ 8709 8749 8759 8828 8877 8886 
+ 8743 8745 8810 8820 8852 
+ 8752 8760 8797 8809 8839 8844 
+ 8751 8771 8783 8815 8830 8840 
+ 8763 8775 8785 8812 8823 8836 
+ 8705 8726 8765 8850 8851 8919 
+ 8760 8764 8805 8813 8844 8854 
+ 8743 8765 8804 8850 8852 8883 
+ 8770 8791 8794 8826 8829 8843 
+ 8775 8794 8807 8826 8836 8845 
+ 8764 8769 8809 8819 8854 8870 
+ 8767 8773 8817 8834 8849 8869 
+ 8771 8791 8806 8829 8840 8860 
+ 8417 8519 8521 9209 10106 10288 
+ 8773 8796 8814 8848 8849 8880 
+ 8573 8589 8755 8842 9246 9308 
+ 8769 8776 8813 8832 8870 8875 
+ 8745 8766 8804 8852 8862 8915 
+ 8615 8629 8793 8800 9090 9170 
+ 8787 8795 8825 8855 8857 15403 
+ 8785 8807 8836 15404 
+ 8784 8788 8827 8863 8871 15403 
+ 8795 8801 8822 8831 8855 8859 
+ 8794 8811 8812 8843 8845 8864 
+ 8788 8790 8824 8833 8871 8876 
+ 8759 8796 8803 8848 8886 8893 
+ 8791 8811 8815 8843 8860 8873 
+ 8783 8806 8834 8840 8866 8878 
+ 8801 8825 8859 8865 
+ 8776 8782 8819 8858 8875 8903 
+ 8790 8797 8827 8839 8876 8882 
+ 8767 8783 8814 8830 8869 8878 8887 
+ 8439 8586 8630 8927 9382 9947 
+ 8807 8812 8823 8845 8874 15404 
+ 8652 8718 8780 8898 9041 9098 
+ 8662 8733 8780 8922 9039 9163 
+ 8797 8805 8833 8844 8882 8889 
+ 8806 8815 8830 8860 8866 8879 
+ 8608 8693 8703 8990 8999 9437 
+ 8535 8573 8818 8861 9308 9364 
+ 8811 8826 8829 8864 8873 8884 
+ 8805 8809 8839 8854 8889 8904 
+ 8812 8826 8836 8864 8874 8885 
+ 8649 8730 8779 8853 9028 9049 9117 
+ 8695 8768 8802 8912 9008 9017 
+ 8796 8817 8828 8880 8893 8909 
+ 8814 8817 8869 8880 8891 
+ 8765 8808 8810 8883 8919 8962 
+ 8726 8768 8808 8912 8919 8984 
+ 8804 8810 8820 8883 8915 8943 
+ 8730 8756 8846 8895 9028 
+ 8809 8813 8844 8870 8904 8916 
+ 8822 8825 8857 8859 8890 8894 
+ 8420 8432 8688 8728 9604 9840 10227 
+ 8822 8855 8863 8894 8900 15403 
+ 8782 8786 8832 8862 8903 8975 
+ 8825 8831 8855 8865 8890 8892 
+ 8815 8829 8840 8873 8879 8901 15405 
+ 8535 8613 8842 8911 9364 9423 
+ 8766 8786 8820 8858 8915 8975 9012 
+ 8824 8857 8871 8900 8906 15403 
+ 8826 8843 8845 8884 8885 8902 
+ 8831 8859 8892 8897 
+ 8830 8840 8878 8879 8888 8899 
+ 8691 8738 8789 8969 9074 15437 
+ 8734 8781 8798 8905 8977 8982 
+ 8814 8834 8849 8887 8891 8917 
+ 8813 8819 8854 8875 8916 8930 
+ 8824 8827 8863 8876 8906 8910 
+ 8749 8781 8877 8905 8934 8967 8986 
+ 8829 8843 8860 8884 8907 15405 
+ 8836 8845 8885 8896 15404 15406 
+ 8819 8832 8870 8903 8930 8945 
+ 8827 8833 8871 8882 8910 8925 
+ 8749 8803 8872 8886 8934 8948 
+ 8830 8834 8866 8887 8899 8914 
+ 8840 8860 8866 8888 8901 8908 
+ 8817 8848 8849 8891 8909 8926 
+ 7528 7730 8472 11137 11227 
+ 8833 8839 8876 8889 8925 8946 
+ 8810 8850 8852 8943 8962 
+ 8843 8864 8873 8902 8907 8920 
+ 8845 8864 8874 8902 8921 15406 
+ 8803 8828 8877 8893 8948 8979 
+ 8834 8869 8878 8914 8917 8947 
+ 8866 8879 8899 8908 8913 
+ 8839 8844 8882 8904 8946 15408 
+ 8855 8859 8892 8894 8929 15407 
+ 8849 8869 8880 8917 8926 8953 
+ 8859 8865 8890 8897 8928 8929 
+ 8828 8848 8886 8909 8979 8988 
+ 8855 8857 8890 8900 8940 15407 
+ 8756 8789 8853 9028 9074 9274 
+ 8874 8937 15404 15406 
+ 8865 8892 8928 8933 
+ 8718 8798 8837 8982 9098 9167 
+ 8866 8878 8888 8913 8914 8931 
+ 8857 8863 8894 8906 8940 8951 
+ 8860 8879 8908 8923 8924 15405 
+ 8864 8884 8885 8920 8921 8938 
+ 8832 8858 8875 8945 8975 9011 
+ 8844 8854 8889 8916 8985 15408 
+ 8781 8868 8872 8967 8977 9021 
+ 8863 8871 8900 8910 8951 8957 
+ 8873 8884 8920 8932 8944 15405 
+ 8879 8888 8901 8913 8924 8936 
+ 8848 8880 8893 8926 8988 8989 
+ 8871 8876 8906 8925 8957 15410 
+ 8613 8699 8861 8998 9423 9524 
+ 8768 8847 8851 8984 9017 9068 
+ 8888 8899 8908 8931 8936 8954 
+ 8878 8887 8899 8931 8947 8955 
+ 8820 8852 8862 8943 9012 9050 
+ 8854 8870 8904 8930 8985 9019 
+ 8869 8887 8891 8947 8953 8972 
+ 7753 7852 8739 9066 10971 11034 
+ 8808 8850 8851 8962 8984 9146 15421 
+ 8884 8902 8907 8938 8944 8959 
+ 8885 8902 8938 8950 8960 15406 
+ 8733 8792 8838 8949 9163 9247 
+ 8901 8924 8932 8941 8952 15405 
+ 8901 8908 8923 8936 8941 8956 
+ 8876 8882 8910 8946 8997 15410 
+ 8880 8891 8909 8953 8989 9000 
+ 8586 8601 8835 9139 9947 10103 
+ 8892 8897 8929 8933 8963 8964 
+ 8890 8892 8928 8964 8970 15407 
+ 8870 8875 8916 8945 9010 9019 
+ 8899 8913 8914 8954 8955 8965 
+ 8907 8923 8944 8952 8958 15405 
+ 8897 8928 8963 8966 
+ 8872 8877 8948 8986 9003 
+ 7966 8100 8742 9066 10199 10889 
+ 8908 8913 8924 8954 8956 8968 
+ 8896 8950 8974 15406 
+ 8902 8920 8921 8959 8960 15409 
+ 8762 8777 8949 8976 9262 9458 
+ 8894 8900 8951 8978 8987 15407 
+ 8923 8924 8952 8956 8961 
+ 8517 8534 8778 9424 9994 10403 
+ 8852 8883 8915 8962 9050 15418 
+ 8907 8920 8932 8958 8959 8971 
+ 8875 8903 8930 9010 9011 
+ 8882 8889 8925 8997 9026 15408 
+ 8887 8914 8917 8955 8972 8983 9007 
+ 8877 8886 8934 8979 9003 9024 
+ 8777 8792 8922 8939 9247 9262 
+ 8921 8937 8960 8974 8981 15406 
+ 8900 8906 8940 8957 8987 9001 
+ 8923 8932 8941 8958 8961 8973 
+ 8891 8917 8926 8972 9000 9018 
+ 8913 8931 8936 8965 8968 8992 
+ 8914 8931 8947 8965 8983 
+ 8924 8936 8941 8961 8968 8980 
+ 8906 8910 8951 9001 9023 15410 
+ 8932 8944 8952 8971 8973 15411 
+ 8920 8938 8944 8971 8991 15409 
+ 8921 8938 8950 8981 15409 15412 
+ 8941 8952 8956 8973 8980 8993 
+ 8850 8883 8919 8943 15418 15421 
+ 8928 8933 8964 8966 8994 8996 
+ 8928 8929 8963 8970 8996 9004 
+ 8931 8954 8955 8983 8992 9016 
+ 8933 8963 8994 8995 
+ 8872 8905 8986 9021 9035 9079 
+ 8936 8954 8956 8980 8992 9005 
+ 8738 8802 8867 9008 9325 15437 
+ 8929 8964 8978 9004 9014 15407 
+ 8944 8958 8959 8991 9002 15411 
+ 8917 8947 8953 9007 9018 9047 
+ 8952 8958 8961 8993 9006 15411 
+ 8937 8950 8981 9009 
+ 8858 8862 8903 9011 9012 9137 15424 
+ 8758 8762 8939 9031 9458 9584 
+ 8868 8905 8982 9021 9057 9124 
+ 8940 8970 8987 9014 9034 15407 
+ 8886 8893 8948 8988 9024 9054 9084 
+ 8956 8961 8968 8993 9005 9015 
+ 8950 8960 8974 9009 9022 15412 
+ 8798 8868 8898 8977 9124 9167 9188 
+ 8947 8955 8965 9007 9016 9043 
+ 8851 8912 8919 9068 9146 9226 
+ 8904 8916 9019 9063 9123 15408 
+ 8872 8934 8967 9003 9035 9065 
+ 8940 8951 8978 9001 9034 9048 
+ 8893 8909 8979 8989 9038 9044 9054 
+ 8909 8926 8988 9000 9038 15413 
+ 8676 8703 8841 9437 9658 9934 
+ 8959 8971 9002 9013 9033 15409 
+ 8954 8965 8968 9005 9016 9040 
+ 8961 8973 8980 9006 9015 9029 
+ 8963 8966 8995 8996 9025 9030 
+ 8966 8994 9025 9027 
+ 8963 8964 8994 9004 9030 9036 
+ 8925 8946 9026 9081 15410 15414 
+ 8699 8774 8911 9101 9524 9748 
+ 8693 8755 8841 9246 9437 9979 
+ 8926 8953 8989 9018 9061 15413 
+ 8951 8957 8987 9023 9048 9073 
+ 8971 8991 9020 9032 9033 15411 
+ 8934 8948 8986 9024 9065 9119 
+ 8964 8970 8996 9014 9036 9052 
+ 8968 8980 8992 9015 9040 9042 
+ 8973 8993 9020 9029 9037 15411 
+ 8947 8972 8983 9043 9047 9088 
+ 8802 8847 8969 9017 9294 9325 
+ 8974 8981 9022 9045 
+ 8930 8945 9011 9019 9134 9158 
+ 8903 8945 8975 9010 9134 15424 
+ 8862 8915 8975 9050 9137 9198 
+ 8991 9033 9053 9058 15409 15412 
+ 8970 8978 9004 9034 9052 9069 
+ 8980 8993 9005 9029 9042 9055 
+ 8965 8983 8992 9040 9043 9067 
+ 8847 8912 9008 9068 9294 9367 
+ 8953 8972 9000 9047 9061 15417 
+ 8916 8930 8985 9010 9123 9158 
+ 9002 9006 9032 9037 9051 15411 
+ 8905 8967 8977 9057 9079 9112 
+ 8981 9009 9045 9059 9072 15412 
+ 8957 9001 9073 9099 15410 15414 
+ 8948 8979 9003 9084 9109 9119 
+ 8994 8995 9027 9030 9046 9056 
+ 8946 8997 9063 9081 15408 15423 
+ 8995 9025 9045 9046 
+ 8846 8853 8895 9117 9274 15451 
+ 8993 9006 9015 9037 9055 9062 
+ 8994 8996 9025 9036 9056 9064 
+ 8758 8772 8976 9078 9543 9584 
+ 9002 9020 9033 9051 9060 
+ 8991 9002 9013 9032 9053 9060 9070 
+ 8978 8987 9014 9048 9069 9096 
+ 8967 8986 9065 9079 9114 
+ 8996 9004 9030 9052 9064 9082 
+ 9006 9020 9029 9051 9062 9071 
+ 8988 8989 9044 9075 9077 15413 
+ 8780 8838 9041 9163 9255 9389 9472 
+ 8992 9005 9016 9042 9067 9083 9087 
+ 8780 8837 9039 9098 9255 9316 
+ 9005 9015 9040 9055 9083 9085 
+ 8983 9007 9016 9067 9088 9097 
+ 8988 9038 9054 9075 9106 
+ 9009 9022 9027 9046 9072 15415 
+ 9025 9027 9045 9056 9076 15415 
+ 8972 9007 9018 9088 9116 15417 
+ 8987 9001 9034 9073 9096 15425 
+ 8779 8846 9117 9129 9550 9661 
+ 8915 8943 9012 9198 9236 15418 
+ 9020 9032 9037 9060 9071 15416 
+ 9004 9014 9036 9069 9082 15419 
+ 9013 9033 9058 9070 9080 
+ 8979 8988 9044 9084 9106 9155 
+ 9015 9029 9042 9062 9085 9092 
+ 9025 9030 9046 9064 9076 9086 
+ 8977 9021 9112 9124 9130 
+ 9013 9053 9059 9080 9089 15412 
+ 9022 9058 9072 9089 9094 15412 
+ 9032 9033 9051 9070 9091 15416 
+ 9000 9018 9093 9113 15413 15417 
+ 9029 9037 9055 9071 9092 9095 
+ 8985 9026 9123 9182 15408 15423 
+ 9030 9036 9056 9082 9086 9103 
+ 8986 9003 9035 9114 9119 9166 
+ 7852 7966 8918 8935 10889 10971 
+ 9016 9040 9043 9087 9097 9102 
+ 8912 8984 9017 9226 9367 
+ 9014 9034 9052 9096 9141 15419 
+ 9033 9053 9060 9080 9091 9100 
+ 9037 9051 9062 9095 9104 15416 
+ 9022 9045 9059 9094 9105 15415 
+ 9001 9023 9048 9099 9160 15425 
+ 8789 8867 8895 9274 15437 15475 
+ 9038 9044 9077 9106 9132 9136 
+ 9046 9056 9086 9107 9108 15415 
+ 9038 9075 9093 9132 9143 15413 
+ 8772 8800 9031 9090 9543 9649 
+ 8967 9021 9035 9112 9114 9195 
+ 9053 9058 9070 9089 9100 9111 
+ 8997 9026 9128 9156 15414 15423 
+ 9036 9052 9064 9103 9126 15419 
+ 9040 9042 9085 9087 9110 15420 
+ 8979 9024 9054 9109 9155 9179 
+ 9042 9055 9083 9092 9110 9118 
+ 9056 9064 9076 9103 9107 9121 
+ 9040 9067 9083 9102 9120 15420 
+ 9007 9043 9047 9097 9116 9154 9165 
+ 9058 9059 9080 9094 9111 9122 
+ 8800 8821 9078 9170 9649 9731 
+ 9060 9070 9100 9115 9127 15416 
+ 9055 9062 9085 9095 9118 9125 
+ 9061 9077 9113 9143 9161 15413 
+ 9059 9072 9089 9105 9122 9138 
+ 9062 9071 9092 9104 9125 9135 
+ 9034 9048 9069 9141 9184 15425 
+ 9043 9067 9088 9102 9140 9154 
+ 8837 8898 9041 9167 9316 9433 
+ 9023 9073 9128 9160 9190 15414 
+ 9070 9080 9091 9111 9127 9144 
+ 8774 8799 8998 9133 9748 9970 
+ 9067 9087 9097 9120 9140 9147 
+ 9064 9082 9086 9121 9126 9145 
+ 9071 9095 9115 9135 9148 15416 
+ 9072 9094 9108 9138 9151 15415 
+ 9044 9054 9075 9136 9155 9174 
+ 9076 9086 9108 9121 9153 15427 
+ 9076 9105 9107 9151 15415 15427 
+ 9024 9084 9119 9179 9183 
+ 9083 9085 9118 9131 9142 15420 
+ 9080 9089 9100 9122 9144 9152 
+ 9021 9057 9079 9130 9195 9220 
+ 9061 9093 9149 9161 9192 15417 
+ 9035 9065 9079 9166 9195 9228 
+ 9091 9104 9127 9148 9159 15416 
+ 9047 9088 9149 9165 9185 15417 
+ 8846 9028 9049 9550 15451 
+ 9085 9092 9110 9125 9142 9157 
+ 9003 9024 9065 9109 9166 9183 9231 
+ 9087 9102 9147 9150 15420 
+ 9086 9103 9107 9145 9153 
+ 9089 9094 9111 9138 9152 15426 
+ 8985 9019 9063 9158 9182 9269 9273 
+ 8977 8982 9057 9130 9188 9234 9250 
+ 9092 9095 9118 9135 9157 9169 
+ 9082 9103 9145 9164 9172 15419 
+ 9091 9100 9115 9144 9159 9171 
+ 9081 9099 9156 9190 9208 15414 
+ 8624 8779 9049 9162 9661 9964 
+ 9057 9112 9124 9220 9234 
+ 9110 9142 9150 9168 15420 
+ 9075 9077 9136 9143 9187 9191 
+ 8793 8799 9101 9170 9809 9970 
+ 9010 9011 9158 9289 9301 15424 
+ 9095 9104 9125 9148 9169 9175 
+ 9075 9106 9132 9174 9191 
+ 8975 9012 9198 9280 9312 15424 
+ 9094 9105 9122 9151 9176 15426 
+ 8601 8688 8927 9604 10103 10240 
+ 9097 9102 9147 9154 9173 9181 
+ 9069 9096 9164 9184 9221 15419 
+ 9110 9118 9131 9157 9168 9180 
+ 9077 9093 9132 9161 9187 9201 
+ 9100 9111 9127 9152 9171 9178 
+ 9103 9121 9126 9153 9172 9177 
+ 8919 8984 9226 9352 9468 15421 
+ 9102 9120 9140 9150 9173 9189 
+ 9104 9115 9135 9159 9175 9186 
+ 9113 9116 9185 9192 9217 15417 
+ 9120 9131 9147 9168 9189 9200 15420 
+ 9105 9108 9138 9176 9193 15427 
+ 9111 9122 9144 9178 9196 15426 
+ 9107 9121 9145 9177 9194 15427 
+ 9088 9097 9140 9165 9181 9202 
+ 9054 9084 9106 9174 9179 9229 9238 
+ 9081 9128 9208 9213 15423 
+ 9118 9125 9142 9169 9180 9197 
+ 9010 9019 9123 9134 9273 9301 
+ 9115 9127 9148 9171 9186 9199 
+ 9073 9099 9190 9214 9257 15425 
+ 9093 9113 9143 9192 9201 9223 
+ 8624 8690 9129 9209 9964 10325 
+ 8838 8922 9039 9247 9472 9605 
+ 9126 9141 9172 9221 9227 15419 
+ 9088 9116 9154 9185 9202 9225 
+ 9065 9114 9119 9228 9231 9264 
+ 8898 8982 9098 9188 9321 9368 9433 
+ 9131 9142 9150 9180 9200 9207 
+ 9125 9135 9157 9175 9197 9203 
+ 8793 8821 9090 9133 9731 9809 
+ 9127 9144 9159 9178 9199 9206 
+ 9126 9145 9164 9177 9215 9227 
+ 9140 9147 9181 9189 9219 
+ 9106 9136 9155 9191 9229 9232 
+ 9135 9148 9169 9186 9203 9210 
+ 9138 9151 9193 9204 9211 15426 
+ 9145 9153 9172 9194 9212 9215 
+ 9144 9152 9171 9196 9206 9216 
+ 9084 9109 9155 9183 9238 9261 
+ 9142 9157 9168 9197 9207 15428 
+ 9140 9154 9173 9202 9219 9243 
+ 9063 9123 9213 9269 15423 15435 
+ 9109 9119 9179 9231 9261 9275 
+ 9096 9141 9214 9221 9279 15425 
+ 9116 9149 9165 9217 9225 9235 
+ 9148 9159 9175 9199 9210 15429 
+ 9132 9143 9191 9201 9218 9222 
+ 8982 9124 9167 9250 9310 9321 
+ 9147 9150 9173 9200 9219 9239 
+ 9099 9128 9160 9208 9257 9298 
+ 9132 9136 9174 9187 9222 9232 
+ 9113 9149 9161 9217 9223 9260 
+ 9151 9176 9205 9211 15427 15430 
+ 9153 9177 9205 9212 9224 15427 
+ 9079 9112 9114 9220 9228 9346 9347 
+ 9152 9178 9204 9216 15426 15431 
+ 9157 9169 9180 9203 9230 15428 
+ 9012 9050 9137 9236 9312 9366 
+ 9159 9171 9186 9206 9233 15429 
+ 9150 9168 9189 9207 9237 9239 
+ 9143 9161 9187 9218 9223 9242 
+ 9154 9165 9181 9225 9243 9256 
+ 9169 9175 9197 9210 9230 15432 
+ 9176 9196 9211 9240 15426 15431 
+ 9193 9194 9224 9241 15427 15430 
+ 9171 9178 9199 9216 9233 9244 
+ 9168 9180 9200 9237 9245 15428 
+ 9128 9156 9190 9213 9298 15439 
+ 8521 8690 8816 9162 10288 10325 
+ 9175 9186 9203 9249 15429 15432 
+ 9176 9193 9204 9240 9248 15430 
+ 9177 9194 9215 9224 9252 
+ 9156 9182 9208 15423 15435 15439 
+ 9160 9184 9257 9279 9340 15425 
+ 9172 9177 9212 9227 9252 9290 
+ 9178 9196 9206 9244 9253 15431 
+ 9149 9185 9192 9235 9260 9284 
+ 9187 9201 9222 9242 9254 
+ 9173 9181 9189 9239 9243 9266 9268 
+ 9112 9130 9195 9234 9342 9346 
+ 9141 9164 9184 9227 9279 9319 
+ 9187 9191 9218 9232 9254 9265 
+ 9161 9192 9201 9242 9260 9270 
+ 9194 9205 9212 9241 9252 
+ 9165 9185 9202 9235 9256 9277 
+ 8984 9068 9146 9367 9468 9680 
+ 9164 9172 9215 9221 9290 9319 
+ 9114 9166 9195 9264 9333 9347 
+ 9155 9174 9232 9238 9297 9307 
+ 9197 9203 9251 9263 15428 15432 
+ 9119 9166 9183 9264 9275 9309 
+ 9174 9191 9222 9229 9265 9307 
+ 9199 9206 9244 9259 9271 15429 
+ 9124 9130 9220 9250 9339 9342 
+ 9185 9217 9225 9277 9284 
+ 9050 9198 9287 9366 15418 15455 
+ 9200 9207 9239 9245 9267 9272 
+ 9155 9179 9229 9261 9297 9327 
+ 9189 9200 9219 9237 9266 9267 
+ 9204 9211 9248 15431 15433 15434 
+ 9205 9224 9252 9258 9278 15430 
+ 9201 9218 9223 9254 9270 9288 
+ 9181 9202 9219 9256 9268 9295 
+ 9206 9216 9233 9253 9271 9282 
+ 9207 9237 9251 9272 9281 15428 
+ 8755 8818 8999 9308 9979 10207 
+ 8922 8949 9163 9262 9605 9692 
+ 9211 9240 9258 9283 15430 15434 
+ 9210 9259 9276 9286 15429 15432 
+ 9124 9188 9234 9310 9339 9358 
+ 9230 9245 9263 9281 9291 15428 
+ 9212 9215 9224 9241 9278 9290 9311 
+ 9216 9244 9282 9292 15431 15433 
+ 9218 9222 9242 9265 9288 9328 
+ 9039 9041 9316 9389 9517 
+ 9202 9225 9243 9277 9295 15436 
+ 9160 9190 9214 9298 9340 15448 
+ 9241 9248 9278 9283 9293 15430 
+ 9233 9249 9271 9286 9299 15429 
+ 9192 9217 9223 9270 9284 9320 9329 
+ 9179 9183 9238 9275 9327 9365 9374 9377 
+ 8939 8949 9247 9458 9692 9974 
+ 9230 9251 9276 9291 9304 15432 
+ 9166 9228 9231 9309 9333 15441 
+ 9222 9232 9254 9307 9328 9338 
+ 9219 9239 9267 9268 9285 9300 
+ 9237 9239 9266 9272 9300 9303 
+ 9219 9243 9266 9285 9295 9302 
+ 9123 9182 9273 15435 15446 15457 
+ 9223 9242 9260 9288 9313 9320 
+ 9233 9244 9259 9282 9299 9314 
+ 9237 9245 9267 9281 9303 9315 
+ 9123 9158 9269 9301 9411 15446 
+ 8895 9028 9074 9885 15451 15475 
+ 9183 9231 9261 9309 9365 9371 
+ 9249 9263 9286 9304 9317 15432 
+ 9225 9235 9256 9284 9349 15436 
+ 9241 9252 9258 9293 9311 9322 
+ 9184 9214 9221 9319 9340 9387 
+ 9137 9289 9312 9452 9482 15424 
+ 9245 9251 9272 9291 9315 9323 
+ 9244 9253 9271 9292 9314 9324 
+ 9248 9258 9293 9318 15434 15438 
+ 9217 9235 9260 9277 9329 9349 9351 
+ 9266 9268 9300 9302 9326 
+ 9249 9259 9276 9299 9317 9330 
+ 9236 9352 9533 15418 15421 15455 
+ 9242 9254 9270 9313 9328 9335 
+ 9134 9280 9301 9478 9482 15424 
+ 9215 9227 9252 9311 9319 9344 9369 
+ 9251 9263 9281 9304 9323 9332 
+ 9253 9282 9306 9324 9334 15433 
+ 9258 9278 9283 9322 15438 
+ 9008 9017 9325 9367 9640 9698 
+ 9243 9256 9268 9302 9343 9354 15436 
+ 8643 8701 9359 9719 10573 10666 
+ 9229 9238 9307 9327 9362 9375 
+ 9190 9208 9257 9510 15439 15448 
+ 9259 9271 9286 9314 9330 9337 
+ 9266 9267 9285 9303 9326 9331 
+ 9134 9158 9273 9289 9411 9478 
+ 9268 9285 9295 9326 9336 9343 
+ 9267 9272 9300 9315 9331 15440 
+ 9263 9276 9291 9317 9332 9341 
+ 7963 8177 8358 10865 10946 11175 15422 
+ 9292 9318 9334 9348 15433 15434 
+ 9229 9232 9265 9297 9338 9362 15444 
+ 8818 8842 9246 9364 9835 10207 
+ 9231 9264 9275 9370 9371 15441 
+ 9188 9250 9321 9358 9401 
+ 9252 9278 9290 9322 9344 15443 
+ 9137 9198 9280 9366 9452 9538 
+ 9270 9288 9320 9335 9345 
+ 9271 9282 9299 9324 9337 9350 
+ 9272 9281 9303 9323 15440 15442 
+ 9041 9098 9255 9433 9517 9656 
+ 9276 9286 9304 9330 9341 9353 
+ 9283 9306 9348 9355 15434 15438 
+ 9221 9227 9279 9290 9369 9387 15450 
+ 9260 9270 9313 9329 9345 9357 
+ 9167 9188 9310 9368 9401 9408 
+ 9278 9293 9311 9360 15438 15443 
+ 9281 9291 9315 9332 9361 15442 
+ 9282 9292 9314 9334 9350 9363 
+ 8969 9008 9294 9640 9761 15437 
+ 9285 9300 9302 9331 9336 9356 
+ 9238 9261 9297 9374 9375 9395 
+ 9254 9265 9288 9335 9338 9383 9388 
+ 9260 9284 9320 9351 9357 15445 
+ 9286 9299 9317 9337 9353 9373 
+ 9300 9303 9326 9356 9372 15440 
+ 9291 9304 9323 9341 9361 9376 
+ 9228 9264 9347 9404 15441 15452 
+ 9292 9306 9324 9348 9363 9381 
+ 9288 9313 9328 9345 9383 9386 
+ 9302 9326 9343 9356 9380 
+ 9299 9314 9330 9350 9373 9385 
+ 9265 9307 9328 9388 9400 15444 
+ 9234 9250 9342 9358 9457 9466 
+ 9214 9257 9279 9387 9462 15448 
+ 9304 9317 9332 9353 9376 9390 
+ 9220 9234 9339 9346 9457 9487 
+ 9295 9302 9336 9354 9380 9396 
+ 9290 9311 9369 9402 15443 
+ 9313 9320 9335 9357 9379 9386 
+ 9195 9220 9342 9347 9421 9487 9488 
+ 9195 9228 9333 9346 9421 15452 
+ 9306 9318 9334 9355 9381 9394 
+ 9277 9284 9351 9378 9399 9413 15436 
+ 9314 9324 9337 9363 9385 9393 
+ 9284 9329 9349 9399 9405 15445 
+ 9146 9287 9468 9533 15421 15474 
+ 9317 9330 9341 9373 9390 9398 
+ 9295 9343 9378 9396 9416 15436 
+ 9318 9348 9360 9394 9403 15438 
+ 9326 9331 9336 9372 9380 9392 
+ 9320 9329 9345 9379 9397 15445 
+ 9250 9310 9339 9401 9466 9484 
+ 8426 8701 8742 9296 10199 10666 
+ 9322 9355 9403 9409 15438 15443 
+ 9323 9332 9376 9391 15442 15447 
+ 9297 9307 9375 9419 15444 15449 
+ 9324 9334 9350 9381 9393 9406 
+ 8842 8861 9308 9423 9835 9941 
+ 9261 9275 9371 9377 9414 9428 
+ 9198 9236 9312 9538 9612 15455 
+ 9017 9068 9226 9294 9680 9698 9863 
+ 9167 9321 9408 9433 9586 9632 
+ 9290 9319 9344 9402 9465 15450 
+ 9309 9371 9415 9427 15441 
+ 9275 9309 9365 9370 9427 9428 
+ 9331 9356 9384 9392 9407 15440 
+ 9330 9337 9353 9385 9398 9410 
+ 9261 9327 9377 9395 9420 9426 
+ 9297 9327 9362 9395 9419 9431 
+ 9332 9341 9361 9390 9417 15447 
+ 9261 9365 9374 9414 9426 
+ 9349 9354 9413 9416 9436 15436 
+ 9345 9357 9386 9397 9412 
+ 9336 9343 9356 9392 9396 9418 
+ 9334 9348 9363 9394 9406 15454 
+ 8630 8778 8835 9947 9994 10462 
+ 9328 9335 9386 9388 9422 9430 
+ 9372 9391 9407 9425 15440 15442 
+ 9337 9350 9373 9393 9410 9429 
+ 9335 9345 9379 9383 9412 9422 
+ 9279 9319 9340 9462 15450 15462 
+ 9328 9338 9383 9400 9430 9439 
+ 9039 9255 9472 9517 9671 
+ 9341 9353 9376 9398 9417 9432 
+ 9361 9384 9425 9434 15442 15447 
+ 9356 9372 9380 9407 9418 9440 
+ 9350 9363 9385 9406 9429 15456 
+ 9348 9355 9381 9403 9444 15454 
+ 9327 9374 9375 9420 9431 9442 
+ 9343 9354 9380 9416 9418 9453 
+ 9357 9379 9412 9438 15445 15453 
+ 9353 9373 9390 9410 9432 9441 
+ 9349 9351 9405 9413 9445 9450 
+ 9338 9388 9435 9439 9456 15444 
+ 9310 9321 9358 9408 9484 9512 
+ 9344 9369 9409 9465 9469 15443 
+ 9355 9360 9394 9409 9444 9463 
+ 9333 9415 9479 9494 15441 15452 
+ 9351 9399 9445 9449 15445 15453 
+ 9363 9381 9393 15454 15456 15458 
+ 9372 9384 9392 9425 9440 9447 
+ 9321 9368 9401 9512 9586 
+ 9360 9402 9403 9463 9469 15443 
+ 9373 9385 9398 9429 9441 9451 
+ 9273 9301 9478 9534 15446 15473 
+ 9379 9386 9397 9422 9438 9446 
+ 9349 9378 9399 9436 9450 9470 
+ 9365 9377 9426 9428 9454 9501 
+ 9370 9404 9427 9479 9480 15441 
+ 9354 9378 9396 9436 9453 9459 
+ 9376 9390 9432 9443 9455 15447 
+ 9380 9392 9396 9440 9453 9471 
+ 9362 9375 9431 9461 15449 15459 
+ 9374 9395 9426 9442 9448 
+ 9346 9347 9488 9502 15452 
+ 9383 9386 9412 9430 9446 9460 
+ 8861 8911 9364 9524 9941 9988 
+ 8534 8645 8942 9719 10403 10548 
+ 9384 9391 9407 9434 9447 9464 
+ 9374 9377 9414 9420 9448 9454 
+ 9370 9371 9415 9428 9480 9490 
+ 9365 9371 9414 9427 9490 9501 
+ 9385 9393 9410 9451 9475 15456 
+ 9383 9388 9422 9439 9460 9477 
+ 9375 9395 9419 9442 9476 15459 
+ 9390 9398 9417 9441 9455 9473 
+ 9098 9167 9316 9368 9632 9656 9815 
+ 9391 9425 9443 9464 9481 15447 
+ 9400 9456 9474 9492 15444 15449 
+ 9378 9413 9416 9459 9470 9493 
+ 8841 8990 8999 9934 9979 10343 
+ 9397 9412 9446 9467 9483 15453 
+ 9388 9400 9430 9456 9477 9495 
+ 9392 9407 9418 9447 9471 9489 
+ 9398 9410 9432 9451 9473 9485 
+ 9395 9420 9431 9448 9476 9486 
+ 9417 9434 9455 9481 15447 15461 
+ 9394 9403 9463 15454 15460 15464 
+ 9399 9405 9449 9450 9496 9500 
+ 9412 9422 9438 9460 9483 9498 
+ 9407 9425 9440 9464 9489 9503 
+ 9420 9426 9442 9454 9486 9499 
+ 9405 9445 9467 9496 9504 15453 
+ 9399 9413 9445 9470 9500 9509 
+ 9410 9429 9441 9475 9485 9507 
+ 9280 9312 9482 9538 9645 
+ 9396 9416 9418 9459 9471 9511 9518 
+ 9414 9426 9448 9499 9501 9525 
+ 9417 9432 9443 9473 9506 15461 
+ 9400 9435 9439 9492 9495 9520 
+ 9339 9342 9466 9487 9595 9615 
+ 8939 8976 9262 9584 9917 9974 
+ 9416 9436 9453 9493 9518 9521 
+ 9422 9430 9446 9477 9498 15463 
+ 9419 9474 9505 9515 15449 15459 
+ 9340 9387 9581 9597 15448 15462 
+ 9403 9409 9444 9469 9545 15464 
+ 9425 9434 9447 9481 9503 9516 
+ 9369 9402 9469 9568 9569 15450 
+ 9339 9358 9457 9484 9595 9600 
+ 9438 9449 9483 9504 9514 15453 
+ 9146 9226 9352 9680 15474 15480 
+ 9402 9409 9463 9465 9545 9569 
+ 9413 9436 9450 9493 9509 9523 
+ 9418 9440 9453 9489 9511 9522 
+ 9039 9163 9389 9605 9671 9824 
+ 9432 9441 9455 9485 9506 9513 
+ 9435 9461 9492 9515 9531 15449 
+ 9429 9451 9491 9507 9532 15456 
+ 9431 9442 9486 9497 9519 15459 
+ 9430 9439 9460 9495 9528 15463 
+ 9289 9301 9411 9482 9676 15473 
+ 9404 9415 9480 9494 9553 9572 
+ 9415 9427 9479 9490 9548 9553 
+ 9434 9443 9464 9516 9526 15461 
+ 9280 9289 9452 9478 9645 9676 9742 
+ 9438 9446 9467 9498 9514 9527 
+ 9358 9401 9466 9512 9600 9623 
+ 9441 9451 9473 9507 9513 9529 
+ 9442 9448 9476 9499 9519 9536 
+ 9342 9346 9457 9488 9614 9615 9663 
+ 9346 9421 9487 9502 9582 9614 
+ 9440 9447 9471 9503 9522 9535 
+ 9427 9428 9480 9501 9548 9559 
+ 9475 9508 9532 9546 15456 15458 
+ 9435 9456 9474 9520 9531 9554 
+ 9436 9459 9470 9521 9523 9547 
+ 9404 9479 9502 9572 9587 15452 
+ 9439 9456 9477 9520 9528 9551 
+ 9445 9449 9500 9504 9537 9540 
+ 9476 9505 9519 9539 15459 
+ 9446 9460 9483 9527 9542 15463 
+ 9448 9454 9486 9525 9536 9565 
+ 9445 9450 9496 9509 9537 9541 
+ 9414 9428 9454 9490 9525 9559 9575 
+ 9421 9488 9494 9582 9587 15452 
+ 9447 9464 9489 9516 9535 9556 
+ 9449 9467 9496 9514 9540 9549 
+ 9461 9497 9515 9539 9557 15459 
+ 9455 9473 9513 9544 9561 15461 
+ 9451 9475 9485 9529 9532 9566 
+ 9491 9546 9570 15458 15460 15465 
+ 9450 9470 9500 9523 9541 9558 
+ 9298 9552 9581 9697 9714 15439 15448 
+ 9453 9471 9518 9522 9555 9562 
+ 9401 9408 9484 9586 9623 9666 
+ 9473 9485 9506 9529 9560 9561 
+ 9467 9483 9504 9527 9549 9563 
+ 9461 9474 9505 9531 9557 9573 
+ 9464 9481 9503 9526 9556 9567 
+ 9255 9316 9389 9656 9671 9822 
+ 9453 9459 9511 9521 9555 9574 
+ 9476 9486 9497 9536 9539 9571 
+ 9456 9492 9495 9551 9554 9579 
+ 9459 9493 9518 9547 9574 9580 
+ 9471 9489 9511 9535 9562 9576 
+ 9470 9493 9509 9547 9558 9578 
+ 8911 8998 9423 9748 9988 9999 
+ 9454 9499 9501 9565 9575 9593 
+ 9481 9516 9544 9567 15461 15468 
+ 9483 9498 9514 9542 9563 9577 
+ 9477 9495 9551 9564 9583 15463 
+ 9485 9507 9513 9560 9566 15466 
+ 7608 8108 8358 10946 11037 11492 
+ 9474 9492 9515 9554 9573 9588 
+ 9475 9491 9507 9546 9566 9585 
+ 9287 9352 9744 15455 15474 15478 
+ 9411 9727 15446 15457 15473 15476 
+ 9489 9503 9522 9556 9576 15467 
+ 9486 9499 9519 9565 9571 9592 
+ 9496 9500 9540 9541 
+ 9312 9366 9452 9612 9645 9702 
+ 9497 9505 9519 9557 9571 9589 
+ 9496 9504 9537 9549 
+ 9500 9509 9537 9558 
+ 9498 9527 9564 9577 9591 15463 
+ 9031 9078 9584 9649 9922 10049 
+ 9506 9526 9561 9619 15461 15468 
+ 9463 9469 9569 9599 9637 9659 15464 
+ 9491 9508 9532 9570 9585 9603 
+ 9493 9521 9523 9578 9580 9596 
+ 9480 9490 9553 9559 9610 9611 
+ 9504 9514 9540 9563 
+ 9049 9117 9661 10042 10046 15451 
+ 9495 9520 9528 9579 9583 9601 
+ 9510 9714 9755 15435 15439 15457 15476 
+ 9479 9480 9548 9572 9611 9622 
+ 9492 9520 9531 9579 9588 15469 
+ 9511 9518 9562 9574 9590 9594 
+ 9503 9516 9535 9567 9607 15467 
+ 9505 9515 9539 9573 9589 9602 
+ 9509 9523 9541 9578 
+ 9490 9501 9548 9575 9610 9617 
+ 9513 9529 9561 9613 15466 
+ 9506 9513 9544 9560 9613 9619 
+ 9511 9522 9555 9576 9594 9608 
+ 9514 9527 9549 9577 
+ 9528 9542 9583 9591 9606 15463 
+ 9499 9525 9536 9592 9593 9620 
+ 9507 9529 9532 9585 9598 15466 
+ 9516 9526 9556 9607 15468 
+ 9465 9569 9644 9650 15450 15462 15472 
+ 9465 9469 9545 9568 9637 9650 
+ 9508 9546 9603 15465 15470 
+ 9519 9536 9539 9589 9592 9616 
+ 9479 9494 9553 9587 9622 9652 
+ 9515 9531 9557 9588 9602 9618 
+ 9518 9521 9555 9580 9590 9609 
+ 9501 9525 9559 9593 9617 9627 
+ 9522 9535 9562 9608 9621 15467 
+ 9527 9542 9563 9591 
+ 9523 9547 9558 9596 
+ 9520 9551 9554 9601 9625 15469 
+ 9521 9547 9574 9596 9609 15471 
+ 9462 9510 9597 9684 9697 15448 
+ 9488 9502 9587 9614 9646 9667 
+ 9528 9551 9564 9601 9606 9624 
+ 8976 9031 9458 9543 9917 9922 10108 
+ 9532 9546 9566 9598 9603 9628 
+ 9368 9408 9512 9632 9666 9715 
+ 9494 9502 9572 9582 9646 9652 
+ 9531 9554 9573 9618 9631 15469 
+ 9539 9557 9571 9602 9616 9630 
+ 9555 9574 9594 9609 9626 
+ 9542 9564 9577 9606 
+ 9536 9565 9571 9616 9620 9636 
+ 9525 9565 9575 9620 9627 9641 
+ 9555 9562 9590 9608 9626 9633 
+ 9457 9466 9600 9615 9678 9688 
+ 9547 9578 9580 15471 
+ 9462 9581 9684 9686 15462 15472 
+ 9566 9585 9628 9629 15466 
+ 9545 9659 15464 15465 15470 15477 
+ 9466 9484 9595 9623 9678 9696 
+ 9551 9579 9583 9624 9625 9638 
+ 9557 9573 9589 9618 9630 9639 
+ 9546 9570 9585 9628 9654 15470 
+ 8688 8856 9139 10227 10240 10518 
+ 9163 9247 9472 9692 9824 9951 
+ 9564 9583 9591 9624 
+ 9556 9567 9647 9651 9675 15467 15468 
+ 9562 9576 9594 9621 9633 9643 
+ 9574 9580 9590 9626 9635 15471 
+ 9548 9559 9611 9617 9634 9648 
+ 9548 9553 9610 9622 9634 9657 
+ 9366 9538 9702 9771 15455 15478 
+ 9560 9561 9619 9629 9668 15466 
+ 9487 9488 9582 9663 9667 9703 
+ 9457 9487 9595 9663 9688 9712 
+ 9571 9589 9592 9630 9636 9653 
+ 9559 9575 9610 9627 9648 9664 
+ 9573 9588 9602 9631 9639 9655 
+ 9544 9561 9613 9651 9668 9707 15468 
+ 9565 9592 9593 9636 9641 9665 
+ 9576 9608 9643 9647 9672 15467 
+ 9553 9572 9611 9652 9657 9681 
+ 9484 9512 9600 9666 9696 9721 
+ 9583 9601 9606 9638 
+ 9579 9601 9638 9642 9660 15469 
+ 9590 9594 9609 9633 9635 9662 
+ 9575 9593 9617 9641 9664 9674 
+ 9585 9598 9603 9629 9654 9689 9701 
+ 9598 9613 9628 9668 9689 15466 
+ 9589 9602 9616 9639 9653 9669 
+ 9588 9618 9642 9655 9670 15469 
+ 9368 9433 9586 9715 9784 9815 
+ 9594 9608 9626 9643 9662 9673 
+ 9610 9611 9648 9657 9679 
+ 9609 9626 9662 15471 
+ 9592 9616 9620 9653 9665 9677 
+ 9545 9569 9650 9659 9711 9726 
+ 9601 9624 9625 9660 
+ 9602 9618 9630 9655 9669 9682 
+ 9294 9325 9698 9761 9948 
+ 9593 9620 9627 9665 9674 9690 
+ 9625 9631 9660 9670 9683 15469 
+ 9608 9621 9633 9672 9673 9685 
+ 9568 9650 9699 9700 15472 
+ 9452 9482 9538 9702 9742 9808 
+ 9582 9587 9652 9667 9713 9722 
+ 9607 9621 9672 9675 9691 15467 
+ 9610 9617 9634 9664 9679 9695 
+ 9078 9090 9543 9731 10049 10141 
+ 9568 9569 9637 9644 9699 9711 
+ 9607 9619 9675 9707 9718 15468 
+ 9572 9587 9622 9646 9681 9713 9720 
+ 9616 9630 9636 9669 9677 9694 
+ 9603 9628 9701 9716 15470 15477 
+ 9618 9631 9639 9670 9682 9693 
+ 9316 9433 9517 9815 9822 9923 
+ 9611 9622 9634 9679 9681 9710 
+ 8676 8728 8990 9840 9934 10471 10478 
+ 9545 9599 9637 9726 9734 15477 
+ 9625 9638 9642 9683 
+ 9049 9129 9550 9964 10042 10184 
+ 9626 9633 9635 9673 9687 
+ 9487 9614 9615 9703 9712 9739 
+ 9617 9627 9648 9674 9695 9708 
+ 9620 9636 9641 9677 9690 9706 
+ 9512 9586 9623 9715 9721 9766 
+ 9582 9614 9646 9703 9722 9740 
+ 9613 9619 9629 9689 9707 9730 
+ 9630 9639 9653 9682 9694 9709 
+ 9631 9642 9655 9683 9693 9705 
+ 9389 9472 9517 9822 9824 9992 
+ 9621 9643 9647 9685 9691 9704 
+ 9633 9643 9662 9685 9687 
+ 9627 9641 9664 9690 9708 9725 
+ 9607 9647 9651 9691 9718 9728 
+ 9478 9482 9742 9829 15473 15483 
+ 9636 9653 9665 9694 9706 9724 
+ 9595 9600 9688 9696 9750 9764 
+ 9634 9648 9657 9695 9710 9729 
+ 9226 9367 9468 9863 9912 15480 
+ 9622 9652 9657 9710 9720 9737 
+ 9639 9655 9669 9693 9709 9723 
+ 9642 9660 9670 9705 
+ 9581 9597 9686 9697 9747 9782 
+ 9643 9672 9673 9687 9704 9717 
+ 9597 9684 9700 9747 9749 15472 
+ 9662 9673 9685 9717 
+ 9595 9615 9678 9712 9750 9762 
+ 9628 9629 9668 9701 9730 9743 
+ 9641 9665 9674 9706 9725 9735 
+ 9647 9672 9675 9704 9728 9736 
+ 9247 9262 9605 9951 9974 10160 
+ 9655 9670 9682 9705 9723 9732 
+ 9653 9669 9677 9709 9724 9733 
+ 9648 9664 9679 9708 9729 9738 
+ 9600 9623 9678 9721 9753 9764 
+ 9510 9581 9684 9714 9782 9807 
+ 9294 9367 9640 9863 9948 10061 
+ 9644 9650 9700 9711 9760 9773 
+ 9644 9686 9699 9749 9760 15472 
+ 9628 9654 9689 9716 9743 15482 
+ 9538 9612 9645 9771 9808 9865 
+ 9614 9663 9667 9739 9740 9768 
+ 9672 9685 9691 9717 9736 15479 
+ 9670 9683 9693 9732 
+ 9665 9677 9690 9724 9735 9745 
+ 9619 9651 9668 9718 9730 9757 9765 
+ 9664 9674 9695 9725 9738 9746 
+ 9669 9682 9694 9723 9733 9741 
+ 9657 9679 9681 9729 9737 9752 
+ 9637 9650 9699 9726 9773 9783 
+ 9615 9663 9688 9739 9762 9779 
+ 9646 9652 9720 9722 9756 9758 
+ 9510 9552 9697 9755 9807 9860 
+ 9586 9632 9666 9766 9784 9831 
+ 9654 9701 9734 9789 15477 15482 
+ 9685 9687 9704 15479 
+ 9651 9675 9707 9728 9757 9763 
+ 8643 8645 9296 9424 10548 10573 
+ 9652 9681 9713 9737 9756 9769 
+ 9623 9666 9696 9753 9766 9793 
+ 9646 9667 9713 9740 9758 9775 
+ 9682 9693 9709 9732 9741 9751 
+ 9677 9694 9706 9733 9745 9754 
+ 9674 9690 9708 9735 9746 9759 
+ 9637 9659 9711 9734 9783 9804 
+ 9534 9816 9879 15473 15476 15483 
+ 9675 9691 9718 9736 9763 9767 
+ 9679 9695 9710 9738 9752 15481 
+ 9668 9689 9707 9743 9765 9777 
+ 9090 9170 9649 9809 10141 10242 
+ 9693 9705 9723 9751 
+ 9694 9709 9724 9741 9754 9770 
+ 9659 9716 9726 9789 9804 15477 
+ 9690 9706 9725 9745 9759 9774 
+ 9691 9704 9728 9767 9772 15479 
+ 9681 9710 9720 9752 9769 9780 
+ 9695 9708 9729 9746 9778 15481 
+ 9663 9703 9712 9768 9779 9800 
+ 9667 9703 9722 9768 9775 9786 
+ 9709 9723 9733 9751 9770 9776 
+ 9482 9645 9676 9808 9829 9891 
+ 9689 9701 9730 9777 9791 15482 
+ 9533 9802 9839 9900 15474 15478 
+ 9706 9724 9735 9754 9774 9781 
+ 9708 9725 9738 9759 9778 9785 
+ 9684 9686 9749 9782 9811 
+ 8998 9101 9524 9970 9999 10161 
+ 9686 9700 9747 9760 9811 9847 
+ 9678 9688 9762 9764 9817 9820 
+ 9723 9732 9741 9776 
+ 9710 9729 9737 9780 9790 15481 
+ 9696 9721 9764 9793 9818 
+ 9724 9733 9745 9770 9781 9787 
+ 9552 9714 9816 9860 9913 15476 
+ 9713 9720 9758 9769 9797 9801 
+ 9707 9718 9763 9765 9794 9798 
+ 9713 9722 9756 9775 9788 9797 
+ 9725 9735 9746 9774 9785 9796 
+ 9699 9700 9749 9773 9847 9859 
+ 9325 9640 9935 9948 10123 15437 
+ 9688 9712 9750 9779 9820 9833 
+ 9718 9728 9757 9767 9792 9794 
+ 9678 9696 9750 9753 9817 9818 
+ 9707 9730 9757 9777 9798 9806 
+ 9666 9715 9721 9793 9831 9854 
+ 9728 9736 9763 9772 9792 9795 
+ 9703 9739 9740 9786 9800 9821 
+ 9720 9737 9756 9780 9801 9810 
+ 9733 9741 9754 9776 9787 9799 
+ 9612 9702 9839 9865 9977 15478 
+ 9736 9767 9795 15479 
+ 9699 9711 9760 9783 9859 15484 
+ 9735 9745 9759 9781 9796 9805 
+ 9722 9740 9758 9786 9788 9812 
+ 9741 9751 9770 9799 
+ 9730 9743 9765 9791 9806 9819 
+ 9738 9746 9785 9803 9813 15481 
+ 9712 9739 9762 9800 9833 9848 
+ 9737 9752 9769 9790 9810 9825 
+ 9745 9754 9774 9787 9805 9814 
+ 9684 9697 9747 9807 9811 9890 
+ 9711 9726 9773 9804 9853 15484 
+ 9632 9715 9815 9831 9949 15487 
+ 9746 9759 9778 9796 9813 9827 
+ 9740 9768 9775 9812 9821 9843 
+ 9754 9770 9781 9799 9814 9826 
+ 9758 9775 9797 9812 9834 
+ 9716 9734 9804 9823 9846 9855 15482 
+ 9752 9780 9803 9825 9838 15481 
+ 9743 9777 9819 9823 9842 15482 
+ 9763 9767 9794 9795 9828 9830 
+ 9721 9753 9766 9818 9854 9892 
+ 9757 9763 9792 9798 9830 9832 
+ 9767 9772 9792 9828 
+ 9759 9774 9785 9805 9827 9837 
+ 9756 9758 9788 9801 9834 9841 
+ 9757 9765 9794 9806 9832 9836 
+ 9770 9776 9787 9826 
+ 9739 9768 9779 9821 9848 9864 
+ 9756 9769 9797 9810 9841 9850 
+ 9744 9900 9944 15474 15480 
+ 9778 9790 9813 9838 9849 15481 
+ 9726 9734 9783 9789 9853 9855 9870 
+ 9774 9781 9796 9814 9837 9845 
+ 9765 9777 9798 9819 9836 9844 
+ 9697 9714 9782 9860 9890 9942 
+ 9645 9702 9742 9865 9891 9938 
+ 9133 9170 9731 9970 10242 10293 
+ 9769 9780 9801 9825 9850 9857 
+ 9747 9749 9782 9847 9890 9998 
+ 9775 9786 9788 9834 9843 9862 
+ 9778 9785 9803 9827 9849 9856 
+ 9781 9787 9805 9826 9845 9851 
+ 9433 9632 9656 9784 9923 10025 15487 
+ 9727 9755 9879 9913 9968 15476 
+ 9750 9764 9818 9820 9872 9875 
+ 9753 9764 9793 9817 9872 9892 
+ 9777 9791 9806 9842 9844 9852 
+ 9750 9762 9817 9833 9875 9882 
+ 9768 9786 9800 9843 9864 9880 
+ 9517 9656 9671 9923 9992 10068 10072 
+ 9789 9791 9842 9846 9871 15482 15485 
+ 9472 9605 9671 9951 9992 10063 
+ 9780 9790 9810 9838 9857 9869 
+ 9787 9799 9814 9851 
+ 9785 9796 9813 9837 9856 9867 
+ 9792 9795 9830 9858 
+ 9676 9742 9891 9932 9980 15483 
+ 9792 9794 9828 9832 9858 9861 
+ 9715 9766 9784 9854 9949 9956 
+ 9794 9798 9830 9836 9861 9866 
+ 9762 9779 9820 9848 9882 9888 
+ 9788 9797 9812 9841 9862 9877 
+ 9308 9364 9941 10207 10327 
+ 9798 9806 9832 9844 9866 9868 
+ 9796 9805 9827 9845 9867 9876 
+ 9790 9803 9825 9849 9869 9881 
+ 9744 9771 9900 9977 10037 15478 
+ 8728 8856 9658 10227 10471 10568 
+ 9797 9801 9834 9850 9877 9884 
+ 9791 9819 9823 9852 9871 9878 
+ 9786 9812 9821 9862 9880 9894 
+ 9806 9819 9836 9852 9868 9873 
+ 9805 9814 9837 9851 9876 9883 
+ 9789 9823 9855 9887 9889 15485 
+ 9749 9760 9811 9859 9943 9998 
+ 9779 9800 9833 9864 9888 9905 
+ 9803 9813 9838 9856 9881 9886 
+ 9801 9810 9841 9857 9884 9895 
+ 9814 9826 9845 9883 
+ 9819 9842 9844 9873 9878 
+ 9783 9804 9870 9874 9903 15484 
+ 9766 9793 9831 9892 9956 15491 
+ 9789 9804 9846 9870 9889 9899 
+ 9813 9827 9849 9867 9886 9897 
+ 9810 9825 9850 9869 9895 9904 
+ 9828 9830 9861 9893 
+ 9760 9773 9847 9874 9921 9943 15484 
+ 9714 9755 9807 9913 9942 9993 
+ 9830 9832 9858 9866 9893 9898 
+ 9812 9834 9843 9877 9894 9910 
+ 9367 9680 9698 9912 10061 10091 
+ 9800 9821 9848 9880 9905 9914 
+ 9702 9771 9808 9938 9977 10045 
+ 9832 9836 9861 9868 9898 9901 
+ 9827 9837 9856 9876 9897 9907 
+ 9836 9844 9866 9873 9901 9906 
+ 9825 9838 9857 9881 9904 9911 
+ 9804 9853 9855 9899 9903 9916 
+ 9823 9842 9878 9896 9902 15485 
+ 9817 9818 9875 9892 9909 9933 
+ 9844 9852 9868 9878 9906 9908 
+ 9853 9859 9903 9921 15484 
+ 9817 9820 9872 9882 9909 9915 
+ 9837 9845 9867 9883 9907 15486 
+ 9834 9841 9862 9884 9910 9920 
+ 9842 9852 9871 9873 9902 9908 
+ 9727 9816 9932 9968 10019 15483 
+ 9821 9843 9864 9894 9914 9927 
+ 9838 9849 9869 9886 9911 9918 
+ 9820 9833 9875 9888 9915 9926 
+ 9845 9851 9876 15486 
+ 9841 9850 9877 9895 9920 9928 
+ 9274 10046 10139 10326 15451 15475 
+ 9849 9856 9881 9897 9918 9924 
+ 9846 9889 9896 9919 9929 15485 
+ 9833 9848 9882 9905 9926 15488 
+ 9846 9855 9887 9899 9919 
+ 9782 9807 9811 9942 9998 10006 
+ 9742 9808 9829 9938 9980 10020 
+ 9793 9818 9854 9872 9933 9975 15491 
+ 9858 9861 9898 9925 
+ 9843 9862 9880 9910 9927 9945 
+ 9850 9857 9884 9904 9928 9937 
+ 9871 9887 9902 9929 9940 15485 
+ 9856 9867 9886 9907 9924 9931 
+ 9861 9866 9893 9901 9925 9930 
+ 9855 9870 9889 9916 9919 9950 
+ 9744 9802 9839 9944 10037 10087 
+ 9866 9868 9898 9906 9930 9936 
+ 9871 9878 9896 9908 9940 9946 
+ 9853 9870 9874 9916 9921 9966 
+ 9857 9869 9895 9911 9937 15490 
+ 9848 9864 9888 9914 9955 15488 
+ 9868 9873 9901 9908 9936 15489 
+ 9867 9876 9897 9931 9939 15486 
+ 9873 9878 9902 9906 9946 15489 
+ 9872 9875 9915 9933 9953 
+ 9862 9877 9894 9920 9945 9954 
+ 9869 9881 9904 9918 9952 15490 
+ 9680 9863 9944 10091 10111 15480 
+ 9755 9816 9860 9968 9993 10035 
+ 9864 9880 9905 9927 9955 9961 
+ 9875 9882 9909 9926 9953 9962 
+ 9870 9899 9903 9950 9966 
+ 9458 9584 9974 10108 10235 
+ 9881 9886 9911 9924 9952 9957 
+ 9887 9889 9899 9929 9950 9984 
+ 9877 9884 9910 9928 9954 9959 
+ 9859 9874 9903 9943 9966 15493 
+ 9543 9584 10049 10108 10194 
+ 9656 9815 9822 10025 10068 10098 
+ 9886 9897 9918 9931 9957 9960 
+ 9893 9898 9930 9958 
+ 9882 9888 9915 9962 9976 15488 
+ 9880 9894 9914 9945 9961 9971 
+ 9884 9895 9920 9937 9959 9967 
+ 9887 9896 9919 9940 9982 9984 
+ 9898 9901 9925 9936 9958 9963 
+ 9897 9907 9924 9939 9960 9965 
+ 9829 9879 9980 10019 10078 15483 
+ 9872 9892 9909 9953 9975 9990 
+ 8990 9437 9658 10343 10478 10526 
+ 9761 10123 10139 10287 15437 15475 
+ 9901 9906 9930 9963 9969 15489 
+ 9895 9904 9928 9967 9972 15490 
+ 9808 9865 9891 10020 10045 
+ 9907 9931 9965 15486 
+ 9896 9902 9929 9946 9982 15492 
+ 9364 9423 9835 9988 10322 10327 
+ 9807 9860 9890 9993 10006 10041 
+ 9847 9859 9921 9998 10051 15493 
+ 9802 9900 9912 10087 10111 15480 
+ 9894 9910 9927 9954 9971 9981 
+ 9902 9908 9940 9973 15489 15492 
+ 8835 8927 9382 10103 10462 10731 
+ 9640 9698 9761 10061 10123 10220 
+ 9784 9831 9956 10004 10008 15487 
+ 9899 9916 9919 9966 9984 10009 
+ 9605 9692 9824 10063 10160 10239 
+ 9911 9918 9957 9978 9983 15490 
+ 9909 9915 9933 9962 9990 10000 
+ 9910 9920 9945 9959 9981 9989 
+ 9905 9914 9961 9985 9996 15488 
+ 9831 9854 9949 10008 10021 15491 
+ 9918 9924 9952 9960 9983 9986 
+ 9925 9930 9963 9987 
+ 9920 9928 9954 9967 9989 9997 
+ 9924 9931 9957 9965 9986 9991 
+ 9914 9927 9955 9971 9996 10003 
+ 9915 9926 9953 9976 10000 10010 
+ 9930 9936 9958 9969 9987 9995 
+ 9129 9162 9661 10184 10325 10538 
+ 9931 9939 9960 9991 
+ 9903 9916 9921 9950 10009 10029 15493 
+ 9928 9937 9959 9972 9997 10002 
+ 9816 9879 9913 10019 10035 10089 
+ 9936 9963 9973 9995 10001 15489 
+ 9101 9133 9748 9809 10161 10293 10407 
+ 9927 9945 9961 9981 10003 10012 
+ 9937 9967 9978 10002 10005 15490 
+ 9946 9969 10001 10007 15489 15492 
+ 9262 9458 9692 9917 10160 10235 10357 
+ 9892 9933 9990 10027 10032 15491 
+ 9926 9962 9985 10010 10018 15488 
+ 9771 9839 9865 10037 10045 10142 
+ 9952 9972 9983 10005 10011 15490 
+ 8999 9246 9437 10207 10343 10614 
+ 9829 9891 9932 10020 10078 10137 
+ 9945 9954 9971 9989 10012 10017 
+ 9929 9940 9984 10014 10022 15492 
+ 9952 9957 9978 9986 10011 10013 
+ 9919 9929 9950 9982 10009 10022 10034 
+ 9955 9976 9996 10018 10026 15488 
+ 9957 9960 9983 9991 10013 10015 
+ 9958 9963 9995 10016 
+ 9423 9524 9941 9999 10322 10351 
+ 9954 9959 9981 9997 10017 10023 
+ 9933 9953 9975 10000 10032 10038 
+ 9960 9965 9986 10015 
+ 9671 9822 9824 10063 10072 10177 
+ 9860 9913 9942 10035 10041 10088 
+ 8778 8942 9382 10403 10462 10896 
+ 9963 9969 9987 10001 10016 10024 
+ 9955 9961 9985 10003 10026 10033 
+ 9959 9967 9989 10002 10023 10028 
+ 9811 9847 9890 9943 10006 10051 10092 10135 
+ 9524 9748 9988 10161 10351 
+ 9953 9962 9990 10010 10038 10047 
+ 9969 9973 9995 10007 10024 10030 
+ 9967 9972 9997 10005 10028 10031 
+ 9961 9971 9996 10012 10033 10043 
+ 9949 10008 10056 10100 15487 
+ 9972 9978 10002 10011 10031 10036 
+ 9890 9942 9998 10041 10092 
+ 9973 10001 10014 10030 10040 15492 
+ 9949 9956 10004 10021 10056 10069 
+ 9950 9966 9984 10029 10034 10060 
+ 9962 9976 10000 10018 10047 10052 
+ 9978 9983 10005 10013 10036 10039 
+ 9971 9981 10003 10017 10043 10048 
+ 9983 9986 10011 10015 10039 10044 
+ 9982 10007 10022 10040 10050 15492 
+ 9986 9991 10013 10044 
+ 9987 9995 10024 15494 
+ 9981 9989 10012 10023 10048 10053 
+ 9976 9985 10010 10026 10052 10057 
+ 9879 9932 9968 10078 10089 10155 
+ 9891 9938 9980 10045 10137 10190 
+ 9956 10008 10027 10069 10073 15491 
+ 9982 9984 10014 10034 10050 10058 
+ 9989 9997 10017 10028 10053 10055 
+ 9995 10001 10016 10030 10054 15494 
+ 9815 9923 10098 10100 10152 15487 
+ 9985 9996 10018 10033 10057 10065 
+ 9975 10021 10032 10073 10074 15491 
+ 9997 10002 10023 10031 10055 10059 
+ 9966 10009 10060 10085 10114 15493 
+ 10001 10007 10024 10040 10054 10062 
+ 10002 10005 10028 10036 10059 10064 
+ 9975 9990 10027 10038 10074 10079 
+ 9996 10003 10026 10043 10065 10070 
+ 9984 10009 10022 10058 10060 10075 
+ 9913 9968 9993 10088 10089 10136 
+ 10005 10011 10031 10039 10064 10066 
+ 9839 9900 9977 10087 10142 10216 
+ 9990 10000 10032 10047 10079 10082 
+ 10011 10013 10036 10044 10066 10067 
+ 10007 10014 10030 10050 10062 10071 
+ 9942 9993 10006 10088 10092 10133 
+ 9550 9661 10046 10184 10376 10393 
+ 10003 10012 10033 10048 10070 10077 
+ 10013 10015 10039 10067 
+ 9865 9938 9977 10020 10142 10190 
+ 9550 9885 10042 10326 10393 15451 
+ 10000 10010 10038 10052 10082 10086 
+ 10012 10017 10043 10053 10077 10081 
+ 9543 9649 9922 10141 10194 10339 
+ 10014 10022 10040 10058 10071 10080 
+ 9943 9998 10085 10135 10156 15493 
+ 10010 10018 10047 10057 10086 10093 
+ 10017 10023 10048 10055 10081 10084 
+ 10024 10030 10062 10076 10083 15494 
+ 10023 10028 10053 10059 10084 10090 
+ 10004 10008 10069 10100 10128 10167 
+ 10018 10026 10052 10065 10093 10099 
+ 10022 10034 10050 10075 10080 15495 
+ 10028 10031 10055 10064 10090 10094 
+ 10009 10029 10034 10075 10104 10114 
+ 9698 9863 9948 10091 10220 10280 
+ 10030 10040 10054 10071 10083 10095 
+ 9824 9951 9992 10177 10239 10271 
+ 10031 10036 10059 10066 10094 10096 
+ 10026 10033 10057 10070 10099 10102 
+ 10036 10039 10064 10067 10096 10097 
+ 10039 10044 10066 10097 
+ 9822 9923 10072 10098 10210 10212 
+ 10008 10021 10056 10073 10105 10128 
+ 10033 10043 10065 10077 10102 10110 
+ 10040 10050 10062 10080 10095 10101 
+ 9822 9992 10068 10177 10212 
+ 10021 10027 10069 10074 10105 10115 
+ 10027 10032 10073 10079 10115 10116 
+ 10034 10058 10060 10104 10107 15495 
+ 10054 10083 10109 15494 
+ 10043 10048 10070 10081 10110 10113 
+ 9932 9980 10019 10137 10155 10222 
+ 10032 10038 10074 10082 10116 10119 
+ 10050 10058 10071 10101 10112 15495 
+ 10048 10053 10077 10084 10113 10117 
+ 10038 10047 10079 10086 10119 10126 
+ 10054 10062 10076 10095 10109 10118 
+ 10053 10055 10081 10090 10117 10120 
+ 10029 10051 10114 10156 10162 15493 
+ 10047 10052 10082 10093 10126 10129 
+ 9900 9944 10037 10111 10216 10277 
+ 9993 10035 10041 10133 10136 10175 
+ 9968 10019 10035 10136 10155 10188 
+ 10055 10059 10084 10094 10120 10122 
+ 9863 9912 10061 10111 10280 10334 
+ 9998 10006 10041 10133 10135 10174 
+ 10052 10057 10086 10099 10129 10131 
+ 10059 10064 10090 10096 10122 10125 
+ 10062 10071 10083 10101 10118 10127 
+ 10064 10066 10094 10097 10124 10125 
+ 10066 10067 10096 10124 
+ 9923 10025 10068 10152 10208 10210 
+ 10057 10065 10093 10102 10131 10134 
+ 10004 10025 10056 10152 10167 15487 15497 
+ 10071 10080 10095 10112 10127 10132 
+ 10065 10070 10099 10110 10134 10140 
+ 8927 9139 9947 10240 10703 10731 
+ 10060 10075 10107 10114 10130 10146 
+ 10069 10073 10115 10128 10153 
+ 8519 8816 10288 10842 10897 15422 
+ 10075 10104 10121 10130 15495 
+ 9584 9917 9922 10194 10235 10363 
+ 10076 10083 10118 10138 
+ 10070 10077 10102 10113 10140 10144 
+ 9912 9944 10087 10091 10277 10334 
+ 10080 10101 10121 10132 10143 15495 
+ 10077 10081 10110 10117 10144 10147 
+ 10029 10060 10085 10104 10146 10162 10171 
+ 10073 10074 10105 10116 10153 10157 
+ 10074 10079 10115 10119 10157 10158 
+ 10081 10084 10113 10120 10147 10149 
+ 10083 10095 10109 10127 10138 10148 
+ 10079 10082 10116 10126 10158 10159 
+ 10084 10090 10117 10122 10149 10150 
+ 10107 10112 10130 10143 10145 15495 
+ 10090 10094 10120 10125 10150 10154 
+ 9761 9935 9948 10220 10287 10361 
+ 10096 10097 10125 10151 
+ 10094 10096 10122 10124 10151 10154 
+ 10082 10086 10119 10129 10159 10163 
+ 10095 10101 10118 10132 10148 15496 
+ 10056 10069 10105 10153 10167 10196 
+ 10086 10093 10126 10131 10163 10164 
+ 10104 10107 10121 10145 10146 
+ 10093 10099 10129 10134 10164 10166 
+ 10101 10112 10127 10143 10165 15496 
+ 10041 10088 10092 10174 10175 10206 
+ 10099 10102 10131 10140 10166 10169 
+ 9998 10051 10092 10156 10174 10221 10225 
+ 10035 10088 10089 10175 10188 10214 
+ 9980 10020 10078 10190 10222 10299 
+ 10109 10118 10148 10168 
+ 9885 9935 10287 10326 10475 15475 
+ 10102 10110 10134 10144 10169 10172 
+ 9649 9731 10049 10242 10339 10537 
+ 9977 10037 10045 10190 10216 10286 
+ 10112 10121 10132 10145 10165 10170 
+ 10110 10113 10140 10147 10172 10176 
+ 10121 10130 10143 10146 10170 10173 
+ 10104 10114 10130 10145 10171 10173 
+ 10113 10117 10144 10149 10176 10178 
+ 10118 10127 10138 10168 10179 15496 
+ 10117 10120 10147 10150 10178 10181 
+ 10120 10122 10149 10154 10181 10182 
+ 10124 10125 10154 10180 
+ 10025 10098 10100 10208 10217 15497 
+ 10105 10115 10128 10157 10196 10218 
+ 10122 10125 10150 10151 10180 10182 
+ 10019 10078 10089 10188 10222 10257 
+ 10051 10085 10135 10162 10221 10237 
+ 10115 10116 10153 10158 10189 10218 
+ 10116 10119 10157 10159 10186 10189 
+ 10119 10126 10158 10163 10185 10186 
+ 9692 9951 9974 10239 10357 10473 
+ 9748 9970 9999 10351 10407 10414 
+ 10085 10114 10156 10171 10211 10237 
+ 10126 10129 10159 10164 10185 10187 
+ 10129 10131 10163 10166 10187 10191 
+ 10132 10143 10170 10183 10192 15496 
+ 10131 10134 10164 10169 10191 10195 
+ 10056 10100 10128 10196 10263 15497 
+ 10138 10148 10179 10193 
+ 10134 10140 10166 10172 10195 10197 
+ 10143 10145 10165 10173 10192 10200 
+ 10114 10146 10162 10173 10209 10211 
+ 10140 10144 10169 10176 10197 10198 
+ 10145 10146 10170 10171 10200 10209 
+ 10092 10133 10135 10206 10225 10243 
+ 10088 10133 10136 10206 10214 10236 
+ 10144 10147 10172 10178 10198 10202 
+ 9992 10063 10072 10212 10271 10300 
+ 10147 10149 10176 10181 10202 10203 
+ 10148 10168 10183 10193 10205 15496 
+ 10151 10154 10182 10201 
+ 10149 10150 10178 10182 10203 10204 
+ 10150 10154 10180 10181 10201 10204 
+ 10165 10179 10192 10205 10215 15496 
+ 9661 9964 10042 10376 10538 
+ 10159 10163 10186 10187 10213 10219 
+ 10158 10159 10185 10189 10213 10234 
+ 10163 10164 10185 10191 10219 10223 
+ 10089 10136 10155 10214 10257 10262 
+ 10157 10158 10186 10218 10234 10246 
+ 10020 10045 10137 10142 10286 10299 10359 
+ 10164 10166 10187 10195 10223 10226 
+ 10165 10170 10183 10200 10215 10228 
+ 10168 10179 10205 10224 
+ 9922 10049 10108 10339 10363 10488 
+ 10166 10169 10191 10197 10226 10229 
+ 10128 10153 10167 10218 10263 10270 
+ 10169 10172 10195 10198 10229 10231 
+ 10172 10176 10197 10202 10231 10232 
+ 8742 8935 9359 10666 10889 11074 
+ 10170 10173 10192 10209 10228 10241 
+ 10180 10182 10204 10230 
+ 10176 10178 10198 10203 10232 10233 
+ 10178 10181 10202 10204 10233 15498 
+ 10181 10182 10201 10203 10230 15498 
+ 10179 10183 10193 10215 10224 10238 
+ 10133 10174 10175 10236 10243 10258 
+ 9246 9308 9835 9979 10327 10614 10698 
+ 10098 10152 10210 10217 10283 10294 
+ 10171 10173 10200 10211 10241 10249 
+ 10068 10098 10208 10212 10294 10312 
+ 10162 10171 10209 10237 10249 10264 
+ 10068 10072 10177 10210 10300 10312 
+ 10185 10186 10219 10234 10244 
+ 10136 10175 10188 10236 10261 10262 
+ 10183 10192 10205 10228 10238 10245 
+ 10037 10087 10142 10277 10286 10386 
+ 10152 10208 10274 10283 15497 
+ 10153 10157 10189 10196 10246 10270 10278 
+ 10185 10187 10213 10223 10244 10247 
+ 9948 10061 10123 10280 10361 10415 
+ 10135 10156 10225 10237 10265 10268 
+ 10078 10137 10155 10257 10299 10319 
+ 10187 10191 10219 10226 10247 10250 
+ 10193 10205 10238 10248 
+ 10135 10174 10221 10243 10265 10269 
+ 10191 10195 10223 10229 10250 10252 
+ 8856 9604 9840 10518 10568 10710 
+ 10192 10200 10215 10241 10245 10259 
+ 10195 10197 10226 10231 10252 10254 
+ 10201 10204 10251 15498 
+ 10197 10198 10229 10232 10254 10256 
+ 10198 10202 10231 10233 10255 10256 
+ 10202 10203 10232 10253 10255 15498 
+ 10186 10189 10213 10244 10246 10266 
+ 9917 9974 10108 10357 10363 10463 
+ 10175 10206 10214 10258 10261 10267 
+ 10156 10162 10211 10221 10264 10268 10296 
+ 10205 10215 10224 10245 10248 10260 
+ 9951 10063 10160 10271 10439 10473 
+ 9139 9604 10103 10518 10661 10703 
+ 10200 10209 10228 10249 10259 10272 
+ 9731 9809 10141 10293 10537 10570 
+ 10174 10206 10225 10258 10269 10292 10305 
+ 10213 10219 10234 10247 10266 10273 
+ 10215 10228 10238 10259 10260 10275 
+ 10189 10218 10234 10266 10278 10295 
+ 10219 10223 10244 10250 10273 10279 
+ 10224 10238 10260 15499 
+ 10209 10211 10241 10264 10272 10297 
+ 10223 10226 10247 10252 10279 10282 
+ 10230 10253 10276 15498 
+ 10226 10229 10250 10254 10282 10284 
+ 10233 10251 10255 10276 10281 15498 
+ 10229 10231 10252 10256 10284 10285 
+ 10232 10233 10253 10256 10281 15500 
+ 10231 10232 10254 10255 10285 15500 
+ 10155 10188 10222 10262 10309 10319 10323 
+ 10206 10236 10243 10267 10291 10292 
+ 10228 10241 10245 10272 10275 10290 
+ 10238 10245 10248 10275 10289 15499 
+ 10214 10236 10262 10267 10298 10301 
+ 10188 10214 10257 10261 10301 10309 
+ 10167 10196 10270 10274 10340 10353 15497 
+ 10211 10237 10249 10296 10297 15501 
+ 10221 10225 10268 10269 10302 10303 
+ 10234 10244 10246 10273 10295 10304 
+ 10236 10258 10261 10291 10298 10318 
+ 10221 10237 10265 10296 10303 10320 
+ 10225 10243 10265 10302 10305 
+ 10196 10218 10263 10278 10329 10340 
+ 10063 10177 10239 10300 10422 10439 
+ 10241 10249 10259 10290 10297 10314 
+ 10244 10247 10266 10279 10304 10311 
+ 10217 10263 10283 10353 10360 15497 
+ 10245 10259 10260 10289 10290 10308 
+ 10251 10253 10281 10306 
+ 10087 10111 10216 10334 10386 10482 
+ 10218 10246 10270 10295 10329 10330 
+ 10247 10250 10273 10282 10311 10315 
+ 10061 10091 10220 10334 10415 15505 
+ 10253 10255 10276 10306 10310 15500 
+ 10250 10252 10279 10284 10315 10317 
+ 10208 10217 10274 10294 10360 10374 
+ 10252 10254 10282 10285 10316 10317 
+ 10254 10256 10284 10313 10316 15500 
+ 10142 10190 10216 10359 10386 10458 
+ 9935 10123 10139 10361 10475 10496 
+ 8816 9209 10106 10325 10875 10897 
+ 10260 10275 10307 10308 10321 15499 
+ 10259 10272 10275 10308 10314 10324 
+ 10258 10267 10292 10318 10328 
+ 10243 10258 10291 10305 10328 10344 
+ 9809 9970 10242 10407 10570 10621 
+ 10208 10210 10283 10312 10374 10400 
+ 10246 10266 10278 10304 10330 10336 
+ 10237 10264 10268 10320 15501 15502 
+ 10249 10264 10272 10314 10332 15501 
+ 10261 10267 10301 10318 10331 
+ 10137 10190 10222 10319 10359 10409 10426 
+ 10177 10212 10271 10312 10412 10422 
+ 10261 10262 10298 10309 10331 10348 
+ 10265 10269 10303 10305 10354 10355 
+ 10265 10268 10302 10320 10341 10354 
+ 10266 10273 10295 10311 10336 10345 
+ 10243 10269 10292 10302 10344 10355 
+ 10276 10281 10310 10333 
+ 10289 10321 10335 15499 
+ 10275 10289 10290 10321 10324 10337 
+ 10257 10262 10301 10323 10348 10352 
+ 10281 10306 10313 10333 10338 15500 
+ 10273 10279 10304 10315 10345 10350 
+ 10210 10212 10294 10300 10400 10412 
+ 10285 10310 10316 10338 10342 15500 
+ 10272 10290 10297 10324 10332 10346 
+ 10279 10282 10311 10317 10349 10350 
+ 10284 10285 10313 10317 10342 10347 
+ 10282 10284 10315 10316 10347 10349 
+ 10267 10291 10298 10328 10331 10362 
+ 10222 10257 10299 10323 10382 10409 
+ 10268 10296 10303 10341 10364 15502 
+ 10289 10307 10308 10335 10337 10356 
+ 9941 9988 10327 10351 10639 10751 
+ 10257 10309 10319 10352 10382 15503 
+ 10290 10308 10314 10337 10346 10358 
+ 9162 9209 9964 10288 10538 10823 10875 
+ 9885 10046 10139 10393 10475 10644 10677 
+ 9835 9941 10207 10322 10698 10751 
+ 10291 10292 10318 10344 10362 10384 
+ 10270 10278 10330 10340 10383 10395 
+ 10278 10295 10329 10336 10377 10383 
+ 10298 10301 10318 10348 10362 10389 
+ 10297 10314 10346 10365 10367 15501 
+ 10306 10310 10338 10366 
+ 10091 10111 10277 10280 10482 10596 15505 
+ 10307 10321 10356 10368 
+ 10295 10304 10330 10345 10377 10379 
+ 10308 10321 10324 10356 10358 10370 
+ 10310 10313 10333 10342 10366 10372 
+ 10049 10141 10194 10488 10537 10662 
+ 10263 10270 10329 10353 10395 10405 
+ 10303 10320 10354 10364 10381 
+ 10313 10316 10338 10347 10372 10373 
+ 9437 9934 9979 10526 10614 10744 
+ 10292 10305 10328 10355 10384 10397 
+ 10304 10311 10336 10350 10379 10380 
+ 10314 10324 10332 10358 10365 10371 
+ 10316 10317 10342 10349 10373 10375 
+ 10301 10309 10331 10352 10389 10394 
+ 10315 10317 10347 10350 10375 10378 
+ 10311 10315 10345 10349 10378 10380 
+ 9988 9999 10161 10322 10414 10592 10639 
+ 10309 10323 10348 10394 15503 
+ 10263 10274 10340 10360 10405 10424 
+ 10302 10303 10341 10355 10381 10406 
+ 10302 10305 10344 10354 10397 10406 
+ 10321 10335 10337 10368 10370 10388 
+ 9974 10160 10235 10463 10473 10590 
+ 10324 10337 10346 10370 10371 10387 
+ 10190 10286 10299 10426 10458 10494 
+ 10274 10283 10353 10374 10424 10442 
+ 10123 10220 10287 10415 10496 10511 
+ 10318 10328 10331 10384 10389 10435 
+ 10108 10194 10235 10463 10488 10521 
+ 10320 10341 10381 10385 10401 15502 
+ 10332 10346 10367 10371 10390 10391 
+ 10333 10338 10372 10398 
+ 10332 10365 10369 10391 10392 15501 
+ 10335 10356 10388 10402 
+ 10367 10385 10392 10396 15501 15502 
+ 10337 10356 10358 10387 10388 15504 
+ 10346 10358 10365 10387 10390 10399 
+ 10338 10342 10366 10373 10398 10404 
+ 10342 10347 10372 10375 10404 10408 
+ 10283 10294 10360 10400 10442 10468 
+ 10347 10349 10373 10378 10408 10410 
+ 10042 10184 10393 10538 10618 
+ 10330 10336 10379 10383 10418 10425 
+ 10349 10350 10375 10380 10410 10413 
+ 10336 10345 10377 10380 10416 10418 
+ 10345 10350 10378 10379 10413 10416 
+ 10341 10354 10364 10401 10406 10427 
+ 10319 10323 10409 10434 10449 15503 
+ 10329 10330 10377 10395 10425 10430 
+ 10328 10344 10362 10397 10435 10446 
+ 10364 10369 10396 10401 10420 15502 
+ 10216 10277 10286 10458 10482 10559 
+ 10358 10370 10371 10399 10421 15504 
+ 10356 10368 10370 10402 10423 15504 
+ 10331 10348 10362 10394 10435 10451 
+ 10365 10371 10391 10399 10411 
+ 10365 10367 10390 10392 10411 10417 
+ 10367 10369 10391 10396 10417 10419 
+ 10042 10046 10326 10376 10618 10644 
+ 10348 10352 10389 10444 10451 15503 
+ 10329 10340 10383 10405 10430 10452 
+ 10369 10385 10392 10419 10420 
+ 10344 10355 10384 10406 10446 10454 
+ 10366 10372 10404 10429 
+ 10371 10387 10390 10411 10421 10428 
+ 10294 10312 10374 10412 10468 10486 
+ 10364 10381 10385 10420 10427 10440 
+ 10368 10388 10423 10431 
+ 8942 9424 9994 10548 10896 10930 
+ 10372 10373 10398 10408 10429 10433 
+ 10340 10353 10395 10424 10452 10464 
+ 10354 10355 10381 10397 10427 10454 10466 
+ 9970 10161 10293 10414 10621 10625 
+ 10373 10375 10404 10410 10433 10437 
+ 10299 10319 10382 10426 10449 10465 
+ 10375 10378 10408 10413 10437 10438 
+ 10390 10391 10399 10417 10428 10436 
+ 10300 10312 10400 10422 10486 10510 
+ 10378 10380 10410 10416 10438 10443 
+ 10161 10351 10407 10592 10625 
+ 10220 10280 10361 10511 10576 15505 
+ 10379 10380 10413 10418 10443 10447 
+ 10391 10392 10411 10419 10436 10441 
+ 10377 10379 10416 10425 10447 10453 
+ 10392 10396 10417 10420 10441 10445 
+ 10385 10396 10401 10419 10440 10445 
+ 10387 10399 10428 10432 10448 15504 
+ 10271 10300 10412 10439 10510 10555 
+ 10388 10402 10431 10432 10450 15504 
+ 10353 10360 10405 10442 10464 10490 
+ 10377 10383 10418 10430 10453 10457 
+ 10299 10359 10409 10465 10494 10527 
+ 10381 10401 10406 10440 10466 10477 
+ 10399 10411 10421 10436 10448 10456 
+ 10398 10404 10433 10455 
+ 10383 10395 10425 10452 10457 10480 
+ 10402 10423 10450 10459 
+ 10421 10423 10448 10450 10460 15504 
+ 10404 10408 10429 10437 10455 10461 
+ 10382 10444 10449 10493 15503 
+ 10362 10384 10389 10446 10451 10500 10501 
+ 10411 10417 10428 10441 10456 10469 
+ 10408 10410 10433 10438 10461 10467 
+ 10410 10413 10437 10443 10467 10470 
+ 10239 10271 10422 10473 10555 10605 
+ 10401 10420 10427 10445 10477 10485 
+ 10417 10419 10436 10445 10469 10481 
+ 10360 10374 10424 10468 10490 10520 
+ 10413 10416 10438 10447 10470 10472 
+ 10394 10434 10451 10493 10503 15503 
+ 10419 10420 10440 10441 10481 10485 
+ 10384 10397 10435 10454 10500 10504 
+ 10416 10418 10443 10453 10472 10479 
+ 10421 10428 10432 10456 10460 10474 
+ 10382 10409 10434 10465 10493 10515 
+ 10423 10431 10432 10459 10460 10476 
+ 10389 10394 10435 10444 10501 10503 
+ 10395 10405 10430 10464 10480 10497 
+ 10418 10425 10447 10457 10479 10483 
+ 10397 10406 10446 10466 10504 10508 
+ 10429 10433 10461 10484 
+ 10428 10436 10448 10469 10474 10487 
+ 10425 10430 10453 10480 10483 10498 
+ 10286 10359 10386 10494 10559 10579 
+ 10431 10450 10476 10489 
+ 10432 10448 10450 10474 10476 10491 
+ 10433 10437 10455 10467 10484 10492 
+ 9382 9947 9994 10731 10896 10934 
+ 10235 10357 10363 10521 10590 10643 
+ 10405 10424 10452 10490 10497 10550 
+ 10409 10426 10449 10515 10527 
+ 10406 10427 10454 10477 10508 10513 
+ 10437 10438 10461 10470 10492 10495 
+ 10374 10400 10442 10486 10520 10554 
+ 10436 10441 10456 10481 10487 10502 
+ 10438 10443 10467 10472 10495 10499 
+ 9658 9840 10478 10568 10802 10846 
+ 10443 10447 10470 10479 10499 10505 
+ 10160 10239 10357 10439 10590 10605 10727 
+ 10448 10456 10460 10487 10491 10506 
+ 10139 10287 10326 10496 10674 10677 
+ 10450 10459 10460 10489 10491 10507 
+ 10427 10440 10466 10485 10513 10522 
+ 9658 9934 10471 10526 10802 10804 
+ 10447 10453 10472 10483 10505 10509 
+ 10430 10452 10457 10497 10498 10516 
+ 10441 10445 10469 10485 10502 10517 
+ 10277 10334 10386 10559 10596 10671 
+ 10453 10457 10479 10498 10509 10512 
+ 10455 10461 10492 10514 
+ 10440 10445 10477 10481 10517 10522 10532 
+ 10400 10412 10468 10510 10554 10577 
+ 10456 10469 10474 10502 10506 10519 
+ 10194 10339 10363 10521 10662 10664 
+ 10459 10476 10507 10523 
+ 10424 10442 10464 10520 10550 10562 
+ 10460 10474 10476 10506 10507 10524 
+ 10461 10467 10484 10495 10514 10525 
+ 10434 10444 10449 10503 10515 10575 10585 
+ 10359 10426 10458 10527 10579 10609 
+ 10467 10470 10492 10499 10525 10528 
+ 10287 10361 10475 10511 10651 10674 
+ 10452 10464 10480 10516 10550 10552 
+ 10457 10480 10483 10512 10516 10531 
+ 10470 10472 10495 10505 10528 10529 
+ 10435 10446 10501 10504 10540 10543 
+ 10435 10451 10500 10503 10540 10560 
+ 10469 10481 10487 10517 10519 10530 
+ 10444 10451 10493 10501 10560 10575 
+ 10446 10454 10500 10508 10543 10545 
+ 10472 10479 10499 10509 10529 10535 
+ 10474 10487 10491 10519 10524 10533 
+ 10476 10489 10491 10523 10524 10534 
+ 10454 10466 10504 10513 10542 10545 
+ 10479 10483 10505 10512 10535 10536 
+ 10412 10422 10486 10555 10577 10627 
+ 10361 10415 10496 10576 10651 
+ 10483 10498 10509 10531 10536 
+ 10466 10477 10508 10522 10542 10544 
+ 10484 10492 10525 10541 
+ 10449 10465 10493 10527 10585 10602 
+ 10480 10497 10498 10531 10552 10558 
+ 10481 10485 10502 10530 10532 10546 
+ 9604 10227 10240 10661 10710 10854 
+ 10487 10502 10506 10530 10533 10547 
+ 10442 10468 10490 10554 10562 10569 
+ 10363 10463 10488 10643 10664 
+ 10477 10485 10513 10532 10544 10556 
+ 10489 10507 10534 10549 
+ 10491 10506 10507 10533 10534 10551 
+ 10492 10495 10514 10528 10541 10553 
+ 9934 10343 10478 10744 10804 
+ 10426 10465 10494 10515 10602 10609 
+ 10495 10499 10525 10529 10553 10557 
+ 10499 10505 10528 10535 10557 10561 
+ 10502 10517 10519 10546 10547 15506 
+ 10498 10512 10516 10536 10558 10567 
+ 10485 10517 10522 10546 10556 10565 
+ 10506 10519 10524 10547 10551 10563 
+ 10507 10523 10524 10549 10551 10564 
+ 10505 10509 10529 10536 10561 10566 
+ 10509 10512 10531 10535 10566 10567 
+ 10141 10242 10339 10570 10662 10777 10792 
+ 9964 10184 10325 10376 10618 10822 10823 
+ 7332 7379 8166 8722 11903 13752 15544 
+ 10500 10501 10543 10560 10578 10595 
+ 10514 10525 10553 10572 
+ 10508 10513 10544 10545 10586 10593 
+ 10500 10504 10540 10545 10578 10589 
+ 10513 10522 10542 10556 10571 10586 
+ 10504 10508 10542 10543 10589 10593 
+ 10517 10530 10532 10565 10574 15506 
+ 10519 10530 10533 10563 10580 15506 
+ 9424 9719 10403 10573 10930 10975 
+ 10523 10534 10564 10581 
+ 10464 10490 10497 10552 10562 10606 10610 
+ 10524 10533 10534 10563 10564 10582 
+ 10497 10516 10550 10558 10600 10606 
+ 10525 10528 10541 10557 10572 10583 
+ 10468 10486 10520 10569 10577 10608 10638 
+ 10422 10439 10510 10605 10627 10672 
+ 10522 10532 10544 10565 10571 10584 
+ 10528 10529 10553 10561 10583 10587 
+ 10516 10531 10552 10567 10597 10600 
+ 10386 10458 10482 10579 10665 10671 
+ 10501 10503 10540 10575 10595 10617 
+ 10529 10535 10557 10566 10587 10594 
+ 10490 10520 10550 10569 10610 10620 
+ 10533 10547 10551 10580 10582 10601 
+ 10534 10549 10551 10581 10582 10599 
+ 10532 10546 10556 10574 10584 10588 
+ 10535 10536 10561 10567 10594 10598 
+ 10531 10536 10558 10566 10597 10598 
+ 9840 10227 10471 10710 10846 10903 
+ 10520 10554 10562 10608 10620 
+ 10242 10293 10537 10621 10775 10792 
+ 10544 10556 10584 10586 10604 
+ 10541 10553 10583 10607 
+ 9296 9719 10548 10666 10975 11036 
+ 10546 10565 10588 10591 10603 15506 
+ 10493 10503 10560 10585 10617 10637 
+ 10415 10511 10651 10685 10749 15505 
+ 10486 10510 10554 10627 10638 10675 
+ 10540 10543 10589 10595 10622 
+ 10458 10494 10559 10609 10653 10665 
+ 10547 10563 10591 10601 10613 15506 
+ 10549 10564 10599 10612 
+ 10551 10563 10564 10599 10601 10616 
+ 10553 10557 10572 10587 10607 10615 
+ 10556 10565 10571 10588 10604 10611 
+ 10493 10515 10575 10602 10637 10648 
+ 10542 10544 10571 10593 10604 10628 
+ 10557 10561 10583 10594 10615 10619 
+ 10565 10574 10584 10603 10611 
+ 10543 10545 10578 10593 10622 10631 
+ 10357 10463 10473 10643 10727 10747 
+ 10574 10580 10603 10613 10623 15506 
+ 10351 10414 10625 10639 10725 10814 
+ 10542 10545 10586 10589 10628 10631 
+ 10561 10566 10587 10598 10619 10624 
+ 10540 10560 10578 10617 10622 10649 
+ 10334 10482 10671 10685 10738 15505 
+ 10558 10567 10598 10600 10626 10632 
+ 10566 10567 10594 10597 10624 10626 
+ 10564 10581 10582 10612 10616 10629 
+ 10552 10558 10597 10606 10632 10642 
+ 10563 10580 10582 10613 10616 10630 
+ 10515 10527 10585 10609 10648 10660 
+ 10574 10588 10591 10611 10623 10633 
+ 10571 10584 10586 10611 10628 10636 
+ 10439 10473 10555 10672 10727 10739 
+ 10550 10552 10600 10610 10642 10652 
+ 10572 10583 10615 10634 
+ 10554 10569 10620 10638 10669 
+ 10494 10527 10579 10602 10653 10660 10684 
+ 10550 10562 10606 10620 10652 10657 
+ 10584 10588 10603 10604 10633 10636 
+ 10581 10599 10629 10640 
+ 10580 10591 10601 10623 10630 10646 
+ 9979 10207 10343 10698 10744 10917 10939 
+ 10583 10587 10607 10619 10634 10641 
+ 10582 10599 10601 10629 10630 10645 
+ 10560 10575 10595 10637 10649 10676 
+ 10376 10393 10538 10644 10816 10822 
+ 10587 10594 10615 10624 10641 10647 
+ 10562 10569 10608 10610 10657 10669 
+ 10293 10407 10570 10625 10775 10784 
+ 10578 10589 10595 10631 10649 10678 
+ 10591 10603 10613 10633 10646 10656 
+ 10594 10598 10619 10626 10647 10650 
+ 10407 10414 10592 10621 10725 10784 
+ 10597 10598 10624 10632 10650 10655 
+ 10510 10555 10577 10672 10675 10726 
+ 10586 10593 10604 10631 10636 10681 10682 
+ 10599 10612 10616 10640 10645 10654 
+ 10601 10613 10616 10645 10646 10659 
+ 10589 10593 10622 10628 10678 10681 
+ 10597 10600 10626 10642 10655 10668 
+ 10603 10611 10623 10636 10656 10670 
+ 10607 10615 10641 10658 
+ 7178 7911 8355 11933 13535 14090 
+ 10604 10611 10628 10633 10670 10682 
+ 10575 10585 10617 10648 10676 10688 
+ 10554 10577 10608 10669 10675 10704 
+ 10322 10351 10592 10751 10814 10893 
+ 10612 10629 10654 10663 
+ 10615 10619 10634 10647 10658 10667 
+ 10600 10606 10632 10652 10668 10686 
+ 10463 10521 10590 10664 10747 10795 
+ 10326 10393 10618 10677 10816 10859 
+ 10616 10629 10630 10654 10659 15507 
+ 10613 10623 10630 10656 10659 10679 
+ 10619 10624 10641 10650 10667 10673 
+ 10585 10602 10637 10660 10688 10693 
+ 10595 10617 10622 10676 10678 10716 
+ 10624 10626 10647 10655 10673 10680 
+ 10496 10511 10576 10674 10749 10793 
+ 10606 10610 10642 10657 10686 10695 
+ 10579 10609 10665 10684 10709 10713 
+ 10629 10640 10645 10663 10683 15507 
+ 10626 10632 10650 10668 10680 10689 
+ 10623 10633 10646 10670 10679 10694 
+ 10610 10620 10652 10669 10695 10715 
+ 10634 10641 10667 10687 
+ 10630 10645 10646 10679 10691 15507 
+ 10602 10609 10648 10684 10693 10700 
+ 10240 10518 10703 10854 10952 
+ 10339 10488 10537 10664 10761 10777 10844 
+ 10640 10654 10683 10690 
+ 10488 10521 10643 10662 10761 10795 
+ 10559 10579 10653 10671 10709 10743 
+ 9296 9359 10199 10573 11036 11074 11267 
+ 10641 10647 10658 10673 10687 10692 
+ 10632 10642 10655 10686 10689 10699 
+ 10608 10620 10638 10657 10704 10715 
+ 10633 10636 10656 10682 10694 10711 
+ 10482 10559 10596 10665 10738 10743 10788 
+ 10555 10605 10627 10726 10739 10773 
+ 10647 10650 10667 10680 10692 10696 
+ 10475 10496 10651 10677 10793 10843 
+ 10577 10627 10638 10704 10726 10748 
+ 10617 10637 10649 10688 10716 10721 
+ 10326 10475 10644 10674 10843 10859 
+ 10622 10631 10649 10681 10716 10735 
+ 10646 10656 10659 10691 10694 10705 
+ 10650 10655 10673 10689 10696 10701 
+ 10628 10631 10678 10682 10720 10735 
+ 10628 10636 10670 10681 10711 10720 
+ 10654 10663 10690 10697 10702 15507 
+ 10609 10653 10660 10700 10713 10733 
+ 10576 10596 10738 10749 10818 15505 
+ 10642 10652 10668 10695 10699 10717 
+ 10658 10667 10692 10706 
+ 10637 10648 10676 10693 10721 10729 
+ 10655 10668 10680 10699 10701 10707 
+ 10663 10683 10702 10708 
+ 10659 10679 10697 10705 10714 15507 
+ 10667 10673 10687 10696 10706 10712 
+ 10648 10660 10688 10700 10729 10734 
+ 10656 10670 10679 10705 10711 15508 
+ 10652 10657 10686 10715 10717 10740 
+ 10673 10680 10692 10701 10712 10718 
+ 10683 10691 10702 10714 10719 15507 
+ 10207 10327 10614 10751 10939 10958 
+ 10668 10686 10689 10707 10717 10724 
+ 10660 10684 10693 10733 10734 
+ 10680 10689 10696 10707 10718 10723 
+ 10683 10690 10697 10708 10719 10722 
+ 10103 10240 10661 10731 10952 11019 
+ 10638 10669 10675 10715 10748 10764 
+ 10679 10691 10694 10714 10732 15508 
+ 10687 10692 10712 10728 
+ 10689 10699 10701 10723 10724 
+ 10690 10702 10722 10730 
+ 10653 10665 10713 10743 10750 
+ 10227 10518 10568 10854 10903 10984 
+ 10670 10682 10694 10720 10754 10758 15508 
+ 10692 10696 10706 10718 10728 10737 
+ 10653 10684 10709 10733 10750 10768 
+ 10691 10697 10705 10719 10732 10736 
+ 10657 10669 10695 10704 10740 10764 10785 
+ 10649 10676 10678 10721 10735 10769 10781 
+ 10686 10695 10699 10724 10740 10745 10763 
+ 10696 10701 10712 10723 10737 10741 
+ 10697 10702 10714 10722 10736 15509 
+ 10681 10682 10711 10735 10758 10774 
+ 10676 10688 10716 10729 10769 10772 
+ 10702 10708 10719 10730 10746 15509 
+ 10701 10707 10718 10724 10741 10742 
+ 10699 10707 10717 10723 10742 10745 
+ 10592 10625 10784 10814 10907 
+ 10627 10672 10675 10748 10773 10827 
+ 10473 10590 10605 10739 10747 10840 10862 
+ 10706 10712 10737 10753 
+ 10688 10693 10721 10734 10770 10772 
+ 10708 10722 10746 10756 
+ 9947 10103 10462 10703 10934 11019 11072 
+ 10705 10714 10736 10755 10757 15508 
+ 10684 10700 10713 10734 10768 10779 
+ 10693 10700 10729 10733 10770 10779 
+ 10678 10681 10716 10720 10774 10781 10798 
+ 10714 10719 10732 10757 10759 15509 
+ 10712 10718 10728 10741 10753 10760 
+ 10596 10671 10685 10788 10818 15511 
+ 10605 10672 10727 10773 10840 10852 
+ 10695 10715 10717 10763 10785 10796 
+ 10718 10723 10737 10742 10760 10765 
+ 10723 10724 10741 10745 10762 10765 
+ 10665 10671 10709 10750 10788 10820 10853 
+ 10343 10526 10614 10804 10917 10961 
+ 10717 10724 10742 10762 10763 10783 
+ 10722 10730 10756 10766 10771 15509 
+ 10590 10643 10727 10795 10862 10887 
+ 10675 10704 10726 10764 10827 10829 
+ 10576 10651 10685 10793 10818 10908 
+ 10709 10713 10743 10768 10820 
+ 10322 10327 10639 10698 10893 10958 10990 
+ 7248 7709 8151 12039 12141 13965 
+ 10728 10737 10760 10782 
+ 10711 10755 10758 10786 10789 15508 
+ 10732 10754 10757 10776 10786 15508 
+ 10730 10746 10771 10780 
+ 10732 10736 10755 10759 10776 10778 
+ 10711 10720 10754 10774 10789 10799 
+ 10736 10757 10766 10778 10787 15509 
+ 10737 10741 10753 10765 10782 10790 
+ 10662 10664 10795 10844 10921 
+ 10742 10745 10765 10783 10791 
+ 10717 10740 10745 10783 10796 10805 
+ 10704 10715 10748 10785 10829 10832 
+ 10741 10742 10760 10762 10790 10791 
+ 10746 10759 10771 10787 10794 15509 
+ 7455 8151 8166 12039 15544 15579 
+ 10713 10733 10750 10779 10820 10861 
+ 10716 10721 10772 10781 10811 10821 
+ 10729 10734 10772 10779 10847 15510 
+ 10746 10756 10766 10780 10794 10801 
+ 10721 10729 10769 10770 10811 15510 
+ 10672 10726 10739 10827 10852 10870 
+ 10720 10735 10758 10798 10799 10809 
+ 10570 10621 10784 10792 10911 10936 
+ 10755 10757 10778 10786 10797 10800 
+ 10537 10662 10792 10844 10937 10945 
+ 10757 10759 10776 10787 10797 10803 
+ 10733 10734 10768 10770 10847 10861 
+ 10756 10771 10801 10806 
+ 10716 10735 10769 10798 10821 10831 
+ 10753 10760 10790 10808 
+ 10745 10762 10763 10791 10805 10812 
+ 10621 10625 10725 10775 10907 10911 
+ 10715 10740 10764 10796 10832 10834 
+ 10754 10755 10776 10789 10800 10807 
+ 10759 10766 10778 10794 10803 10810 
+ 10671 10738 10743 10853 10883 15511 
+ 10754 10758 10786 10799 10807 10813 
+ 10760 10765 10782 10791 10808 10815 
+ 10762 10765 10783 10790 10812 10815 
+ 10537 10570 10775 10777 10936 10945 
+ 10651 10674 10749 10843 10908 10951 
+ 10766 10771 10787 10801 10810 10819 
+ 10643 10664 10747 10761 10887 10921 10944 
+ 10740 10763 10785 10805 10834 10839 
+ 10776 10778 10800 10803 10817 
+ 10735 10774 10781 10809 10830 10831 
+ 10758 10774 10789 10809 10813 10826 
+ 10776 10786 10797 10807 10817 10824 
+ 10771 10780 10794 10806 10819 10825 
+ 10471 10478 10804 10846 11012 11014 
+ 10778 10787 10797 10810 10817 10828 
+ 10478 10526 10744 10802 10961 11014 
+ 10763 10783 10796 10812 10839 10845 
+ 10780 10801 10825 10833 
+ 10786 10789 10800 10813 10824 10835 
+ 10782 10790 10815 10836 
+ 10774 10798 10799 10826 10830 10838 
+ 10787 10794 10803 10819 10828 10837 
+ 10769 10772 10821 10850 10873 15510 
+ 10783 10791 10805 10815 10845 10848 
+ 10789 10799 10807 10826 10835 10849 
+ 10592 10639 10725 10893 10907 10988 
+ 10790 10791 10808 10812 10836 10848 
+ 10618 10644 10822 10859 10981 11007 
+ 10797 10800 10803 10824 10828 10841 
+ 10685 10738 10749 10908 15511 15514 
+ 10794 10801 10810 10825 10837 10851 
+ 10743 10750 10768 10853 10861 10900 
+ 10769 10781 10811 10831 10850 10864 
+ 10538 10618 10816 10823 10981 11010 
+ 10325 10538 10822 10875 11010 11076 
+ 10800 10807 10817 10835 10841 10855 
+ 10801 10806 10819 10833 10851 10860 
+ 10799 10809 10813 10838 10849 10863 
+ 10726 10748 10773 10829 10870 10891 10904 
+ 10803 10810 10817 10837 10841 10856 
+ 10748 10764 10827 10832 10885 10891 
+ 10798 10809 10831 10838 10858 
+ 10781 10798 10821 10830 10858 10864 10874 
+ 10764 10785 10829 10834 10881 10885 
+ 10806 10825 10860 10866 
+ 10785 10796 10832 10839 10880 10881 
+ 10807 10813 10824 10849 10855 10867 
+ 10808 10815 10848 10872 
+ 10810 10819 10828 10851 10856 10868 
+ 10809 10826 10830 10858 10863 10871 
+ 10796 10805 10834 10845 10879 10880 
+ 10727 10739 10852 10862 10920 10932 
+ 10817 10824 10828 10855 10856 10869 
+ 10106 10865 10897 11294 11322 15422 
+ 10674 10677 10793 10859 10951 10999 
+ 10662 10761 10777 10921 10937 10966 
+ 10805 10812 10839 10848 10877 10879 
+ 10471 10568 10802 10903 11012 11049 
+ 10770 10779 10861 10873 10914 15510 
+ 10812 10815 10836 10845 10872 10877 
+ 10813 10826 10835 10863 10867 10876 
+ 10811 10821 10864 10873 10892 
+ 10819 10825 10837 10860 10868 15512 
+ 10739 10773 10840 10870 10920 15513 
+ 10743 10788 10820 10883 10900 10928 
+ 10518 10661 10710 10952 10984 11070 
+ 10824 10835 10841 10867 10869 10878 
+ 10828 10837 10841 10868 10869 10884 
+ 7730 7911 11227 11933 13414 
+ 10830 10831 10838 10871 10874 10882 
+ 10644 10677 10816 10843 10999 11007 
+ 10825 10833 10851 10866 10888 15512 
+ 10768 10779 10820 10847 10900 10914 10954 
+ 10727 10747 10840 10887 10932 10950 
+ 10826 10838 10849 10871 10876 10890 
+ 10821 10831 10850 10874 10892 10905 
+ 9305 10842 11175 11322 15422 
+ 10833 10860 10888 10895 
+ 10835 10849 10855 10876 10878 10886 
+ 10837 10851 10856 10884 10898 15512 
+ 10841 10855 10856 10878 10884 10894 
+ 10773 10827 10852 10904 10931 15513 
+ 10838 10858 10863 10882 10890 10899 
+ 10836 10848 10877 10906 
+ 10811 10847 10850 10892 10914 10933 15510 
+ 10831 10858 10864 10882 10905 10909 
+ 10288 10325 10823 10897 11076 11198 
+ 10849 10863 10867 10886 10890 10902 
+ 10845 10848 10872 10879 10906 10913 
+ 10855 10867 10869 10886 10894 10901 
+ 10839 10845 10877 10880 10913 10915 
+ 10834 10839 10879 10881 10915 10918 
+ 10832 10834 10880 10885 10918 10922 
+ 10858 10871 10874 10899 10909 
+ 10788 10853 10928 10943 15511 
+ 10856 10868 10869 10894 10898 10912 
+ 10829 10832 10881 10891 10922 10925 
+ 10867 10876 10878 10901 10902 
+ 10747 10795 10862 10944 10950 10979 
+ 10860 10866 10895 10910 10919 15512 
+ 8935 9066 10199 10971 11074 11573 11578 
+ 10863 10871 10876 10899 10902 10916 
+ 10827 10829 10885 10904 10925 10935 
+ 10850 10864 10873 10905 10933 10942 
+ 10639 10751 10814 10988 10990 11048 
+ 10869 10878 10884 10901 10912 10923 
+ 10866 10888 10919 10924 
+ 9994 10403 10462 10930 10934 11179 11182 
+ 10106 10288 10842 10875 11198 11294 
+ 10868 10884 10910 10912 10927 15512 
+ 10871 10882 10890 10909 10916 10929 
+ 10820 10853 10861 10928 10954 10996 
+ 10878 10886 10894 10902 10923 10926 
+ 10876 10886 10890 10901 10916 10926 
+ 10568 10710 10846 10984 11049 11092 
+ 10827 10870 10891 10931 10935 10955 
+ 10864 10874 10892 10909 10940 10942 
+ 10872 10877 10913 10938 
+ 10725 10784 10814 10911 10988 11045 
+ 10749 10793 10818 10951 11025 11029 15514 
+ 10874 10882 10899 10905 10929 10940 
+ 10888 10898 10919 10927 10941 15512 
+ 10775 10784 10907 10936 11035 11045 
+ 10884 10894 10898 10923 10927 10948 
+ 10877 10879 10906 10915 10938 10947 
+ 10847 10861 10873 10933 10954 10983 
+ 10879 10880 10913 10918 10947 10953 
+ 10890 10899 10902 10926 10929 10959 
+ 10614 10744 10939 10961 11091 11097 
+ 10880 10881 10915 10922 10953 10957 
+ 10888 10895 10910 10924 10941 10949 
+ 10840 10852 10932 10969 10985 15513 
+ 10761 10795 10844 10944 10966 11001 
+ 10881 10885 10918 10925 10957 10960 
+ 10894 10901 10912 10926 10948 10963 
+ 10895 10919 10949 10956 
+ 10885 10891 10922 10935 10960 10962 
+ 10901 10902 10916 10923 10959 10963 
+ 10898 10910 10912 10941 10948 10965 
+ 10853 10883 10900 10943 10996 11005 
+ 10899 10909 10916 10940 10959 10970 
+ 10403 10548 10896 10975 11182 11215 
+ 10870 10904 10955 10964 10967 15513 
+ 10840 10862 10920 10950 10985 10997 
+ 10873 10892 10914 10942 10983 10991 
+ 10462 10731 10896 11072 11179 11204 
+ 10891 10904 10925 10955 10962 10968 
+ 10775 10792 10911 10945 11035 11040 
+ 10777 10844 10945 10966 11027 11047 
+ 10906 10913 10947 10972 
+ 10614 10698 10917 10958 11091 11131 
+ 10905 10909 10929 10942 10970 10986 
+ 10910 10919 10927 10949 10965 10973 
+ 10892 10905 10933 10940 10986 10991 
+ 10883 10928 11005 11015 15511 15514 
+ 10795 10887 10921 10979 11001 11026 
+ 10777 10792 10936 10937 11040 11047 
+ 8358 9305 9530 11175 11492 11859 
+ 10913 10915 10938 10953 10972 10977 
+ 10912 10923 10927 10963 10965 10982 
+ 10919 10924 10941 10956 10973 10974 
+ 10862 10887 10932 10979 10997 11020 
+ 10793 10843 10908 10999 11025 11065 
+ 10661 10703 10854 11019 11070 11149 
+ 10915 10918 10947 10957 10977 10980 
+ 10861 10900 10914 10983 10996 11039 
+ 10904 10931 10935 10964 10968 10976 
+ 10924 10949 10974 10978 
+ 10918 10922 10953 10960 10980 10987 
+ 10698 10751 10939 10990 11095 11131 
+ 10916 10926 10929 10963 10970 10995 
+ 10922 10925 10957 10962 10987 10992 
+ 10744 10804 10917 11014 11097 11102 
+ 10925 10935 10960 10968 10989 10992 
+ 10923 10926 10948 10959 10982 10995 11008 
+ 10931 10955 10967 10976 10993 
+ 10927 10941 10948 10973 10982 10998 
+ 10844 10921 10937 11001 11027 11052 
+ 10931 10964 10969 10993 11002 15513 
+ 10935 10955 10962 10976 10989 10994 
+ 10920 10967 10985 11002 11043 15513 
+ 10929 10940 10959 10986 10995 11022 
+ 8918 9066 10889 11034 11578 11733 
+ 10938 10947 10977 11004 
+ 10941 10949 10965 10974 10998 11000 
+ 10949 10956 10973 10978 11000 11006 
+ 10548 10573 10930 11036 11215 11271 
+ 10955 10964 10968 10993 10994 11003 
+ 10947 10953 10972 10980 11004 11013 
+ 10956 10974 11006 11009 
+ 10887 10944 10950 11020 11026 11059 
+ 10953 10957 10977 10987 11013 11016 
+ 10816 10822 11007 11010 11139 11158 
+ 10948 10963 10965 10998 11008 11021 
+ 10914 10933 10954 10991 11039 11042 
+ 10710 10854 10903 11070 11092 11176 
+ 10920 10932 10969 10997 11043 11044 
+ 10940 10942 10970 10991 11022 11030 
+ 10957 10960 10980 10992 11016 11018 
+ 10814 10893 10907 11045 11048 11120 
+ 10962 10968 10992 10994 11011 11017 
+ 10751 10893 10958 11048 11095 11121 
+ 10933 10942 10983 10986 11030 11042 
+ 10960 10962 10987 10989 11017 11018 
+ 10964 10967 10976 11002 11003 11023 
+ 10968 10976 10989 11003 11011 
+ 10959 10963 10970 11008 11022 11033 
+ 10900 10928 10954 11005 11039 11071 11103 
+ 10932 10950 10985 11020 11044 11058 
+ 10965 10973 10982 11000 11021 11024 
+ 10843 10859 10951 11007 11065 11141 
+ 10973 10974 10998 11006 11024 11031 
+ 10921 10944 10966 11026 11052 11062 
+ 10967 10969 10993 11023 11043 11057 
+ 10976 10993 10994 11011 11023 11032 
+ 10972 10977 11013 11046 
+ 10928 10943 10996 11015 11068 11071 
+ 10974 10978 11000 11009 11031 11038 
+ 10816 10859 10981 10999 11141 11158 
+ 10963 10982 10995 11021 11033 11056 
+ 10978 11006 11038 11041 
+ 10822 10823 10981 11076 11139 11180 
+ 10989 10994 11003 11017 11032 11050 
+ 10802 10846 11014 11049 11125 11157 
+ 10977 10980 11004 11016 11046 11053 
+ 10802 10804 10961 11012 11102 11125 11132 
+ 10943 11005 11029 11068 11093 15514 
+ 10980 10987 11013 11018 11053 11055 
+ 10989 10992 11011 11018 11050 11054 
+ 10987 10992 11016 11017 11054 11055 
+ 10703 10731 10952 11072 11149 11239 
+ 10950 10979 10997 11058 11059 11080 
+ 10982 10998 11008 11024 11056 11060 
+ 10970 10986 10995 11030 11033 11075 11078 
+ 10993 11002 11003 11032 11057 11063 
+ 10998 11000 11021 11031 11060 11061 
+ 10908 10951 11029 11065 11122 11136 
+ 10944 10979 11001 11059 11062 11085 
+ 10937 10966 11047 11052 11108 11109 
+ 8118 8472 11079 11137 12969 13265 
+ 10908 11015 11025 11093 11122 15514 
+ 10986 10991 11022 11042 11075 11086 
+ 11000 11006 11024 11038 11061 11064 
+ 11003 11011 11023 11050 11063 11069 
+ 10995 11008 11022 11056 11078 11083 
+ 8739 8918 10971 11079 11733 12178 
+ 10911 10936 11040 11045 11142 11150 
+ 10573 10666 10975 11267 11271 11445 
+ 8108 8722 9530 11492 11903 13212 
+ 11006 11009 11031 11041 11064 11067 
+ 10954 10983 10996 11042 11101 11103 
+ 10936 10945 11035 11047 11115 11150 
+ 11009 11038 11066 11067 
+ 10983 10991 11030 11039 11086 11101 
+ 10969 10985 11002 11044 11057 11084 11090 
+ 10985 10997 11043 11058 11084 11088 
+ 10907 10911 10988 11035 11120 11142 11184 
+ 11004 11013 11053 11073 
+ 10937 10945 11027 11040 11109 11115 
+ 10893 10988 10990 11120 11121 11145 
+ 10846 10903 11012 11092 11157 11206 
+ 11011 11017 11032 11054 11069 11077 
+ 5293 6549 7003 14806 14945 15040 
+ 10966 11001 11027 11062 11106 11108 
+ 11013 11016 11046 11055 11073 11081 
+ 11017 11018 11050 11055 11077 11082 
+ 11016 11018 11053 11054 11081 11082 
+ 11008 11021 11033 11060 11083 11087 
+ 11002 11023 11043 11063 11090 11099 
+ 10997 11020 11044 11080 11088 11107 
+ 10979 11020 11026 11080 11085 11105 
+ 11021 11024 11056 11061 11087 11089 
+ 11024 11031 11060 11064 11089 11094 
+ 11001 11026 11052 11085 11106 11124 
+ 11023 11032 11057 11069 11099 11104 
+ 11031 11038 11061 11067 11094 11098 
+ 10951 10999 11025 11136 11141 11188 
+ 11041 11067 11096 11100 
+ 11038 11041 11064 11066 11098 11100 
+ 11005 11015 11071 11093 11165 
+ 11032 11050 11063 11077 11104 11110 
+ 10854 10952 10984 11149 11176 11304 
+ 10996 11005 11068 11103 11165 11169 
+ 10731 10934 11019 11204 11239 11302 
+ 11046 11053 11081 11112 
+ 10199 10666 10889 11267 11573 11599 
+ 11022 11030 11078 11086 11113 11118 
+ 10823 10875 11010 11180 11198 11337 
+ 11050 11054 11069 11082 11110 11114 
+ 11022 11033 11075 11083 11111 11113 
+ 8118 8739 11028 11034 12178 12969 
+ 11020 11058 11059 11105 11107 11128 
+ 11053 11055 11073 11082 11112 11116 
+ 11054 11055 11077 11081 11114 11116 
+ 11033 11056 11078 11087 11111 11119 
+ 11043 11044 11088 11090 11126 11130 
+ 11026 11059 11062 11105 11124 11144 
+ 11030 11042 11075 11101 11118 11148 
+ 11056 11060 11083 11089 11117 11119 
+ 11044 11058 11084 11107 11123 11126 
+ 11060 11061 11087 11094 11117 11127 
+ 11043 11057 11084 11099 11130 11138 
+ 10917 10939 11097 11131 11216 11238 
+ 10903 10984 11049 11176 11206 11273 
+ 11015 11029 11068 11122 11165 11212 
+ 11061 11064 11089 11098 11127 11133 
+ 10958 10990 11121 11131 11200 11220 
+ 11066 11100 11129 11134 
+ 10917 10961 11091 11102 11216 11222 11249 
+ 11064 11067 11094 11100 11133 11135 
+ 11057 11063 11090 11104 11138 11143 
+ 11066 11067 11096 11098 11134 11135 
+ 11039 11042 11086 11103 11148 11183 
+ 10961 11014 11097 11132 11195 11222 
+ 10996 11039 11071 11101 11169 11183 
+ 11063 11069 11099 11110 11143 11147 
+ 11059 11080 11085 11128 11144 11160 
+ 11052 11062 11108 11124 11185 11186 
+ 11058 11080 11088 11123 11128 11151 
+ 11027 11052 11106 11109 11171 11185 
+ 11027 11047 11108 11115 11171 11178 
+ 11069 11077 11104 11114 11147 11153 
+ 11078 11083 11113 11119 11140 11146 
+ 11073 11081 11116 11155 
+ 11075 11078 11111 11118 11146 11152 
+ 11077 11082 11110 11116 11153 11156 
+ 11040 11047 11109 11150 11178 11190 
+ 11081 11082 11112 11114 11155 11156 
+ 11087 11089 11119 11127 11154 11159 
+ 11075 11086 11113 11148 11152 11172 
+ 11083 11087 11111 11117 11140 11154 
+ 10988 11045 11048 11145 11184 11211 11243 
+ 10990 11048 11095 11145 11200 11218 
+ 11025 11029 11093 11136 11212 11225 
+ 11088 11107 11126 11151 11162 
+ 11062 11085 11106 11144 11186 11191 
+ 11012 11014 11132 11157 11224 11254 
+ 11084 11088 11123 11130 11162 11163 
+ 11089 11094 11117 11133 11159 11166 
+ 11080 11105 11107 11151 11160 11174 
+ 11096 11134 11161 11164 
+ 11084 11090 11126 11138 11163 11168 
+ 10939 10958 11091 11095 11220 11238 11291 
+ 11014 11102 11125 11195 11224 
+ 11094 11098 11127 11135 11166 11170 
+ 11096 11100 11129 11135 11164 11167 
+ 11098 11100 11133 11134 11167 11170 
+ 11025 11065 11122 11188 11225 
+ 8472 8881 11028 11227 13265 13426 
+ 11090 11099 11130 11143 11168 11177 
+ 10981 11010 11158 11180 11310 11348 
+ 11111 11119 11146 11154 11173 
+ 10999 11007 11065 11158 11188 11316 
+ 11035 11045 11150 11184 11240 11261 
+ 11099 11104 11138 11147 11177 11181 
+ 11085 11105 11124 11160 11191 11201 
+ 11048 11120 11121 11211 11218 11234 
+ 11111 11113 11140 11152 11173 11193 
+ 11104 11110 11143 11153 11181 11187 
+ 11086 11101 11118 11172 11183 11213 
+ 10952 11019 11070 11239 11304 11355 
+ 11035 11040 11115 11142 11190 11240 11247 
+ 11107 11123 11128 11162 11174 15515 
+ 11113 11118 11146 11172 11193 11196 
+ 11110 11114 11147 11156 11187 11192 
+ 11117 11119 11140 11159 11173 11189 
+ 11112 11116 11156 15516 
+ 11114 11116 11153 11155 11192 15516 
+ 11012 11049 11125 11206 11254 11314 
+ 10981 11007 11139 11141 11316 11348 
+ 11117 11127 11154 11166 11189 11203 
+ 11105 11128 11144 11174 11201 11209 
+ 11129 11164 11194 11199 
+ 11123 11126 11151 11163 11197 15515 
+ 11126 11130 11162 11168 11197 11205 
+ 11129 11134 11161 11167 11199 11202 
+ 11068 11071 11093 11169 11212 11260 
+ 11127 11133 11159 11170 11203 11208 
+ 11134 11135 11164 11170 11202 11207 
+ 11130 11138 11163 11177 11205 11210 
+ 11071 11103 11165 11183 11260 11264 
+ 11133 11135 11166 11167 11207 11208 
+ 11108 11109 11178 11185 11226 11232 
+ 11118 11148 11152 11196 11213 
+ 11140 11146 11154 11189 11193 11233 
+ 11128 11151 11160 11209 11217 15515 
+ 9305 10865 10946 11322 11859 12320 
+ 10984 11070 11092 11273 11304 11365 
+ 11138 11143 11168 11181 11210 11214 
+ 11109 11115 11171 11190 11219 11232 
+ 10896 10934 11182 11204 11407 11410 
+ 11010 11076 11139 11310 11337 
+ 11143 11147 11177 11187 11214 11221 
+ 10896 10930 11179 11215 11407 11462 
+ 11101 11103 11148 11169 11213 11255 11264 
+ 11045 11120 11142 11243 11261 11289 
+ 11106 11108 11171 11186 11226 11230 11237 
+ 11106 11124 11185 11191 11230 11236 
+ 11147 11153 11181 11192 11221 11228 
+ 11065 11136 11141 11225 11316 11353 
+ 11154 11159 11173 11203 11233 11245 
+ 11115 11150 11178 11219 11247 11263 
+ 11124 11144 11186 11201 11236 11244 
+ 11153 11156 11187 11228 11231 15516 
+ 11146 11152 11173 11196 11233 11246 
+ 11161 11199 11223 11235 
+ 11102 11132 11222 11224 11287 
+ 11152 11172 11193 11213 11246 11256 
+ 11162 11163 11205 11229 11242 15515 
+ 10875 10897 11076 11294 11337 11621 
+ 11161 11164 11194 11202 11235 11241 
+ 11095 11121 11218 11220 11280 11312 
+ 11144 11160 11191 11209 11244 11252 
+ 11164 11167 11199 11207 11241 11248 
+ 11159 11166 11189 11208 11245 11253 
+ 10934 11072 11179 11302 11410 11426 
+ 11163 11168 11197 11210 11242 11251 
+ 11049 11092 11157 11273 11314 11372 
+ 11167 11170 11202 11208 11248 11250 
+ 11166 11170 11203 11207 11250 11253 
+ 11160 11174 11201 11217 11252 11258 
+ 11168 11177 11205 11214 11251 11257 
+ 11120 11145 11234 11243 11295 11297 
+ 11093 11122 11165 11225 11260 11364 11375 
+ 11148 11172 11183 11196 11255 11256 11266 
+ 11177 11181 11210 11221 11257 11265 
+ 10930 10975 11182 11271 11462 11500 
+ 11091 11097 11238 11249 11323 11335 
+ 11174 11209 11229 11258 11269 15515 
+ 11121 11145 11200 11234 11280 11286 
+ 11178 11190 11232 11263 11281 
+ 11095 11131 11200 11291 11312 11354 
+ 11181 11187 11214 11228 11265 11272 
+ 11097 11102 11195 11249 11287 11334 
+ 11194 11235 11259 11270 
+ 11125 11132 11195 11254 11287 11347 
+ 11122 11136 11188 11212 11353 11364 
+ 11171 11185 11232 11237 11274 11282 
+ 7730 8881 10857 11137 13414 13426 
+ 11187 11192 11221 11231 11272 11275 
+ 11197 11217 11242 11269 11278 15515 
+ 11185 11186 11236 11237 11262 11268 
+ 11192 11228 11275 15516 
+ 11171 11178 11219 11226 11281 11282 
+ 11173 11189 11193 11245 11246 11298 11306 
+ 11145 11211 11218 11286 11297 
+ 11194 11199 11223 11241 11270 11277 
+ 11186 11191 11230 11244 11268 11276 
+ 11185 11226 11230 11262 11274 
+ 11091 11131 11216 11291 11335 11373 
+ 11019 11072 11149 11302 11355 11443 
+ 11142 11150 11247 11261 11327 11339 
+ 11199 11202 11235 11248 11277 11279 
+ 11197 11205 11229 11251 11278 11283 
+ 11120 11184 11211 11289 11295 11308 
+ 11191 11201 11236 11252 11276 11285 
+ 11189 11203 11233 11253 11301 11306 
+ 11193 11196 11233 11256 11296 11298 
+ 11150 11190 11240 11263 11325 11327 
+ 11202 11207 11241 11250 11279 11284 
+ 11097 11216 11222 11323 11334 11382 
+ 11207 11208 11248 11253 11284 11290 
+ 11205 11210 11242 11257 11283 11293 
+ 11201 11209 11244 11258 11285 11300 
+ 11203 11208 11245 11250 11290 11301 
+ 11125 11157 11224 11314 11347 11389 
+ 11183 11213 11264 11266 11303 15517 
+ 11196 11213 11246 11266 11288 11296 
+ 11210 11214 11251 11265 11293 11305 
+ 11209 11217 11252 11269 11300 11311 
+ 11223 11270 11292 11307 
+ 11165 11169 11212 11264 11375 11385 
+ 11142 11184 11240 11289 11339 11362 
+ 11230 11237 11268 11274 11309 
+ 11190 11219 11247 11281 11325 11331 
+ 11169 11183 11255 11260 11385 15517 
+ 11214 11221 11257 11272 11305 11313 
+ 11213 11255 11256 11288 11303 11320 
+ 10666 11036 11074 11445 11599 11664 
+ 11230 11236 11262 11276 11309 11318 
+ 11217 11229 11258 11278 11311 11317 
+ 11223 11235 11259 11277 11307 11315 
+ 10975 11036 11215 11445 11500 11630 
+ 11221 11228 11265 11275 11313 11319 
+ 11092 11176 11206 11365 11372 11434 
+ 11226 11237 11262 11282 11309 11338 
+ 11228 11231 11272 11319 
+ 11236 11244 11268 11285 11318 11328 
+ 11235 11241 11270 11279 11315 11321 
+ 11229 11242 11269 11283 11317 11324 
+ 11241 11248 11277 11284 11321 11326 
+ 11200 11218 11286 11312 11358 11381 
+ 11219 11232 11263 11282 11331 11341 
+ 11226 11232 11274 11281 11338 11341 
+ 11242 11251 11278 11293 11324 11333 
+ 11248 11250 11279 11290 11326 11332 
+ 11244 11252 11276 11300 11328 11336 
+ 11218 11234 11280 11297 11346 11358 
+ 11195 11222 11224 11334 11347 11405 
+ 11256 11266 11296 11320 11329 
+ 11184 11243 11261 11308 11362 11367 
+ 11250 11253 11284 11301 11332 11344 
+ 11131 11220 11238 11354 11373 11412 
+ 11259 11307 11330 11340 
+ 11251 11257 11283 11305 11333 11343 
+ 10842 10897 11198 11322 11621 11962 
+ 11211 11243 11297 11308 11351 11359 
+ 11246 11256 11288 11298 11329 11342 
+ 11211 11234 11286 11295 11346 11351 
+ 11233 11246 11296 11306 11342 11360 
+ 6494 6562 8232 13260 14955 15024 
+ 11252 11258 11285 11311 11336 11345 
+ 11245 11253 11290 11306 11344 11357 
+ 11072 11204 11239 11426 11443 11506 
+ 11255 11266 11320 11349 15517 
+ 11070 11149 11176 11355 11365 11491 11514 
+ 11257 11265 11293 11313 11343 11352 
+ 11233 11245 11298 11301 11357 11360 11383 
+ 11259 11270 11292 11315 11340 11350 
+ 11243 11289 11295 11359 11367 
+ 11262 11268 11274 11318 11338 11374 11390 
+ 11139 11180 11337 11348 11556 11680 
+ 11258 11269 11300 11317 11345 11356 
+ 11200 11220 11280 11354 11381 11411 
+ 11265 11272 11305 11319 11352 11361 
+ 11157 11206 11254 11372 11389 11498 
+ 11270 11277 11307 11321 11350 11363 
+ 11141 11158 11188 11348 11353 11520 11534 
+ 11269 11278 11311 11324 11356 11366 
+ 11268 11276 11309 11328 11371 11374 
+ 11272 11275 11313 11361 
+ 11266 11288 11303 11329 11349 11368 
+ 11277 11279 11315 11326 11363 11370 
+ 10842 10865 11175 11294 11962 12320 
+ 11216 11249 11335 11382 11404 
+ 11278 11283 11317 11333 11366 11377 
+ 11247 11263 11327 11331 11397 11408 
+ 11279 11284 11321 11332 11370 11376 
+ 11240 11247 11325 11339 11408 11423 
+ 11276 11285 11318 11336 11371 11379 
+ 11288 11296 11320 11342 11368 11378 
+ 11292 11340 11369 11380 
+ 11263 11281 11325 11341 11396 11397 
+ 11284 11290 11326 11344 11376 11384 
+ 11283 11293 11324 11343 11377 11386 
+ 11222 11249 11287 11382 11405 11437 
+ 11216 11238 11323 11373 11404 11438 
+ 11285 11300 11328 11345 11379 11387 
+ 11076 11180 11198 11310 11621 11680 
+ 11274 11282 11309 11341 11390 11403 11406 
+ 11240 11261 11327 11362 11423 11441 
+ 11292 11307 11330 11350 11380 11391 
+ 11281 11282 11331 11338 11396 11406 
+ 11296 11298 11329 11360 11378 11395 
+ 11293 11305 11333 11352 11386 11394 
+ 11290 11301 11332 11357 11384 11388 
+ 11300 11311 11336 11356 11387 11393 
+ 11286 11297 11351 11358 11392 11421 
+ 11224 11254 11287 11389 11405 11485 
+ 11139 11158 11310 11316 11534 11556 
+ 11303 11320 11368 11398 11427 15517 
+ 11307 11315 11340 11363 11391 11399 
+ 11295 11297 11346 11359 11392 11422 
+ 11305 11313 11343 11361 11394 11401 
+ 11188 11225 11316 11364 11518 11520 
+ 11220 11291 11312 11411 11412 11458 
+ 11149 11239 11304 11443 11491 11545 
+ 11311 11317 11345 11366 11393 11402 
+ 11301 11306 11344 11383 11388 11416 
+ 11280 11286 11346 11381 11421 11447 
+ 11295 11308 11351 11367 11422 11431 
+ 11298 11306 11342 11383 11395 11414 
+ 11313 11319 11352 11401 
+ 11261 11289 11339 11367 11440 11441 
+ 11315 11321 11350 11370 11399 11409 
+ 11212 11225 11353 11375 11518 15519 
+ 11176 11273 11304 11434 11514 11548 
+ 11317 11324 11356 11377 11402 11415 
+ 11289 11308 11359 11362 11431 11440 
+ 11320 11329 11349 11378 11398 11413 
+ 11330 11380 11400 11417 
+ 11321 11326 11363 11376 11409 11419 
+ 11318 11328 11374 11379 11418 11420 
+ 11206 11273 11314 11434 11498 11531 
+ 11238 11291 11335 11412 11438 11472 
+ 11309 11318 11371 11390 11418 11430 
+ 11212 11260 11364 11385 11508 15519 
+ 11326 11332 11370 11384 11419 11425 
+ 11324 11333 11366 11386 11415 11429 
+ 11329 11342 11368 11395 11413 11432 
+ 11328 11336 11371 11387 11420 11428 
+ 11330 11340 11369 11391 11417 11433 
+ 11280 11312 11358 11411 11447 11489 
+ 11249 11323 11334 11404 11437 11473 
+ 11306 11357 11360 11414 11416 15518 
+ 11332 11344 11376 11388 11424 11425 
+ 11260 11264 11375 11427 11508 11513 15517 
+ 11333 11343 11377 11394 11429 11436 
+ 11336 11345 11379 11393 11428 11435 
+ 11344 11357 11384 11416 11424 
+ 11254 11314 11347 11485 11498 11538 
+ 11309 11338 11374 11403 11430 11442 
+ 11340 11350 11380 11399 11433 11444 
+ 11346 11351 11421 11422 11455 
+ 11345 11356 11387 11402 11435 11448 
+ 11343 11352 11386 11401 11436 11449 
+ 11342 11360 11378 11414 11432 11446 
+ 11331 11341 11397 11406 11456 11466 
+ 11325 11331 11396 11408 11466 11481 
+ 11349 11368 11413 11427 11451 
+ 11350 11363 11391 11409 11444 11453 
+ 11369 11417 11439 11452 
+ 11352 11361 11394 11449 
+ 11356 11366 11393 11415 11448 11454 
+ 11338 11390 11406 11442 11450 
+ 11323 11335 11382 11438 11473 11510 
+ 11287 11334 11347 11437 11485 11551 
+ 11338 11341 11396 11403 11450 11456 
+ 11179 11182 11410 11462 11583 11730 
+ 11325 11327 11397 11423 11481 11490 
+ 11363 11370 11399 11419 11453 11461 
+ 11179 11204 11407 11426 11583 11591 
+ 11312 11354 11381 11458 11486 11489 
+ 11291 11354 11373 11458 11472 11501 
+ 11368 11378 11398 11432 11451 11468 
+ 11360 11383 11395 11446 11470 15518 
+ 11366 11377 11402 11429 11454 11463 
+ 11357 11383 11388 11424 11457 15518 
+ 11369 11380 11400 11433 11452 11469 
+ 11371 11374 11420 11430 11459 11460 
+ 11370 11376 11409 11425 11461 11467 
+ 11371 11379 11418 11428 11459 11464 
+ 11346 11358 11392 11447 11455 11478 
+ 11351 11359 11392 11431 11455 11482 11484 
+ 11327 11339 11408 11441 11490 11532 
+ 11384 11388 11416 11425 11457 11465 
+ 11376 11384 11419 11424 11465 11467 
+ 11204 11302 11410 11506 11591 11603 
+ 11349 11385 11398 11451 11495 11513 15517 
+ 11379 11387 11420 11435 11464 11475 
+ 11377 11386 11415 11436 11463 11476 
+ 11374 11390 11418 11442 11460 11471 
+ 11359 11367 11422 11440 11484 11523 
+ 11378 11395 11413 11446 11468 11483 
+ 11380 11391 11417 11444 11469 11479 
+ 11273 11365 11372 11531 11548 11549 
+ 11387 11393 11428 11448 11475 11480 
+ 11386 11394 11429 11449 11476 11487 
+ 11334 11382 11405 11473 11551 11567 
+ 11335 11373 11404 11472 11510 11542 
+ 11400 11452 11474 11488 
+ 11362 11367 11431 11441 11519 11523 
+ 11339 11362 11423 11440 11519 11532 
+ 11390 11403 11430 11450 11471 11477 
+ 11239 11302 11355 11506 11545 11618 
+ 11391 11399 11433 11453 11479 11496 
+ 11036 11267 11271 11630 11664 11868 
+ 11395 11414 11432 11470 11483 
+ 11358 11381 11421 11478 11489 11553 
+ 11393 11402 11435 11454 11480 11493 
+ 11394 11401 11436 11487 
+ 11403 11406 11442 11456 11477 11497 
+ 11398 11413 11427 11468 11495 11502 
+ 11400 11417 11439 11469 11488 11503 
+ 11399 11409 11444 11461 11496 11509 
+ 11402 11415 11448 11463 11493 11504 
+ 11392 11421 11422 11478 11482 11525 
+ 11396 11406 11450 11466 11497 11517 
+ 11416 11424 11465 11522 11528 15518 
+ 11354 11411 11412 11486 11501 11544 
+ 11418 11420 11460 11464 11499 11505 
+ 11418 11430 11459 11471 11494 11499 
+ 11409 11419 11453 11467 11509 11515 
+ 11182 11215 11407 11500 11730 11738 
+ 11415 11429 11454 11476 11504 11516 
+ 11420 11428 11459 11475 11505 11511 
+ 11424 11425 11457 11467 11526 11528 
+ 11396 11397 11456 11481 11517 11563 
+ 11419 11425 11461 11465 11515 11526 
+ 11413 11432 11451 11483 11502 11529 
+ 11417 11433 11452 11479 11503 11521 
+ 11414 11446 11483 11522 11547 15518 
+ 11430 11442 11460 11477 11494 11512 
+ 11373 11412 11438 11501 11542 11574 
+ 11382 11404 11437 11510 11567 11597 
+ 11439 11488 11507 11527 
+ 11428 11435 11464 11480 11511 11524 
+ 11429 11436 11463 11487 11516 11530 
+ 11442 11450 11471 11497 11512 11535 
+ 11421 11447 11455 11525 11553 11558 
+ 11433 11444 11469 11496 11521 11536 
+ 11435 11448 11475 11493 11524 11533 
+ 11397 11408 11466 11490 11555 11563 
+ 11422 11455 11484 11525 11550 
+ 11432 11446 11468 11470 11529 11547 
+ 11422 11431 11482 11523 11550 11560 
+ 11347 11389 11405 11538 11551 11584 
+ 11411 11458 11489 11544 11577 
+ 11436 11449 11476 11530 
+ 11439 11452 11474 11503 11527 11540 
+ 11381 11411 11447 11486 11553 11577 11588 
+ 11408 11423 11481 11532 11555 11575 
+ 11304 11355 11514 11545 11633 11674 
+ 9530 10946 11037 11859 13212 13588 
+ 11448 11454 11480 11504 11533 11543 
+ 11460 11471 11499 11512 11537 
+ 11427 11451 11502 11513 11546 
+ 11444 11453 11479 11509 11536 11554 
+ 11450 11456 11477 11517 11535 11568 
+ 11314 11372 11389 11531 11538 11634 11644 
+ 11459 11460 11494 11505 11537 11541 
+ 11215 11271 11462 11630 11738 11896 
+ 11412 11458 11472 11544 11574 11595 
+ 11451 11468 11495 11529 11546 11569 
+ 11452 11469 11488 11521 11540 11559 
+ 11454 11463 11493 11516 11543 11557 
+ 11459 11464 11499 11511 11541 11552 
+ 11302 11426 11443 11603 11618 11690 
+ 11474 11527 11539 11561 
+ 11375 11385 11513 11607 11648 15519 
+ 11453 11461 11496 11515 11554 11565 
+ 11404 11438 11473 11542 11597 11655 
+ 11464 11475 11505 11524 11552 11562 
+ 11471 11477 11494 11535 11537 11564 
+ 11385 11427 11495 11508 11546 11607 11611 
+ 11304 11365 11491 11548 11633 11651 
+ 11461 11467 11509 11526 11565 11581 
+ 11463 11476 11504 11530 11557 11566 
+ 11456 11466 11497 11563 11568 11594 
+ 11353 11364 11520 11763 11951 15519 
+ 11440 11441 11523 11532 11587 11608 
+ 11316 11353 11518 11534 11951 
+ 11469 11479 11503 11536 11559 11570 
+ 11457 11470 11528 11547 11620 11643 15518 
+ 11431 11440 11484 11519 11560 11587 11605 
+ 11475 11480 11511 11533 11562 15520 
+ 11455 11478 11482 11550 11558 11579 
+ 11465 11467 11515 11528 11581 11598 
+ 11474 11488 11507 11540 11561 11576 
+ 11457 11465 11522 11526 11598 11620 
+ 11468 11483 11502 11547 11569 11616 
+ 11476 11487 11516 11566 
+ 11372 11434 11498 11549 11644 11656 
+ 11423 11441 11490 11519 11575 11608 11624 
+ 11480 11493 11524 11543 11580 15520 
+ 11316 11348 11520 11556 11951 12643 
+ 11477 11497 11512 11564 11568 11589 
+ 11479 11496 11521 11554 11570 11585 
+ 11494 11499 11512 11541 11564 11572 
+ 11389 11485 11498 11584 11634 11645 
+ 11507 11561 11571 11586 
+ 11488 11503 11527 11559 11576 11592 
+ 11499 11505 11537 11552 11572 11582 
+ 11438 11472 11510 11574 11647 11655 
+ 11493 11504 11533 11557 11580 11590 
+ 11458 11486 11501 11577 11595 11619 
+ 11355 11443 11491 11618 11674 11744 
+ 11495 11502 11513 11569 11611 11614 
+ 11470 11483 11522 11529 11616 11643 
+ 11365 11434 11514 11549 11651 11660 
+ 11434 11531 11548 11656 11660 
+ 11482 11484 11525 11560 11579 11596 
+ 11405 11437 11485 11567 11584 11669 11699 
+ 11505 11511 11541 11562 11582 11593 
+ 11447 11478 11489 11558 11588 11617 11640 
+ 11496 11509 11536 11565 11585 11606 
+ 11481 11490 11563 11575 11622 11627 
+ 11310 11348 11534 11680 12643 
+ 11504 11516 11543 11566 11590 11602 
+ 11478 11525 11553 11579 11612 11617 
+ 11503 11521 11540 11570 11592 11610 
+ 11484 11523 11550 11596 11605 15521 
+ 11507 11527 11539 11576 11586 11609 
+ 11511 11524 11552 11593 11601 15520 
+ 11466 11481 11517 11555 11594 11622 11636 
+ 11512 11535 11537 11572 11589 11604 
+ 11509 11515 11554 11581 11606 11626 
+ 11516 11530 11557 11602 
+ 11437 11473 11551 11597 11669 11675 
+ 11497 11517 11535 11589 11594 11650 
+ 11502 11529 11546 11614 11616 15522 
+ 11521 11536 11559 11585 11610 11625 
+ 11539 11586 11600 11623 
+ 11537 11541 11564 11582 11604 11615 
+ 10889 11074 11578 11599 12469 12876 
+ 11472 11501 11542 11595 11647 11701 
+ 11490 11532 11555 11624 11627 11653 
+ 11527 11540 11561 11592 11609 11632 
+ 11486 11489 11544 11588 11619 11639 
+ 10889 10971 11573 11733 12876 13315 
+ 11525 11550 11558 11596 11612 11628 
+ 11533 11543 11590 11613 11629 15520 
+ 11515 11526 11565 11598 11626 11652 
+ 11541 11552 11572 11593 11615 11631 
+ 11407 11410 11591 11730 11809 11880 
+ 11485 11538 11551 11645 11677 11699 
+ 11536 11554 11570 11606 11625 11646 
+ 11539 11561 11571 11609 11623 11642 
+ 11519 11523 11605 11608 11658 11661 
+ 11489 11553 11577 11639 11640 11685 
+ 11535 11564 11568 11604 11650 15523 
+ 11543 11557 11580 11602 11629 11641 
+ 11410 11426 11583 11603 11728 11809 
+ 11540 11559 11576 11610 11632 11649 
+ 11552 11562 11582 11601 11631 11638 
+ 11517 11563 11568 11636 11650 11671 
+ 11501 11544 11574 11619 11684 11701 
+ 11550 11560 11579 11628 11637 15521 
+ 11473 11510 11567 11655 11675 11711 
+ 11526 11528 11581 11620 11652 11682 
+ 11074 11267 11573 11664 12331 12469 
+ 11571 11623 11635 11657 
+ 11562 11593 11613 11638 11654 15520 
+ 11557 11566 11590 11641 
+ 11426 11506 11591 11690 11728 11804 
+ 11564 11572 11589 11615 11659 15523 
+ 11523 11560 11587 11661 11673 15521 
+ 11554 11565 11585 11626 11646 11662 
+ 11508 11513 11611 11648 11689 11710 
+ 11519 11532 11587 11624 11658 11678 11702 
+ 11561 11576 11586 11632 11642 15524 
+ 11559 11570 11592 11625 11649 11667 
+ 11513 11546 11607 11614 11681 11689 
+ 11558 11579 11617 11628 11666 11672 
+ 11580 11601 11629 11654 11663 15520 
+ 11546 11569 11611 11681 15522 
+ 11572 11582 11604 11631 11659 11665 
+ 11529 11547 11569 11643 11722 15522 
+ 11553 11558 11612 11640 11672 11692 
+ 11443 11506 11545 11690 11744 11829 
+ 11544 11577 11595 11639 11684 11694 
+ 11522 11528 11598 11643 11682 11717 
+ 11198 11294 11337 11680 11962 13075 
+ 11555 11563 11627 11636 11687 11691 
+ 11571 11586 11600 11642 11657 11683 
+ 11532 11575 11608 11653 11678 11688 
+ 11570 11585 11610 11646 11667 11693 
+ 11565 11581 11606 11652 11662 15525 
+ 11555 11575 11622 11653 11687 11695 
+ 11579 11596 11612 11637 11666 11670 
+ 11580 11590 11613 11641 11663 11686 
+ 11271 11445 11500 11868 11896 12269 
+ 11582 11593 11615 11638 11665 11679 
+ 11576 11592 11609 11649 11698 15524 
+ 11491 11514 11651 11674 11805 11843 
+ 11498 11538 11644 11645 11754 11779 
+ 11600 11657 11668 11700 
+ 11563 11594 11622 11671 11691 11707 
+ 11596 11628 11670 11676 15521 
+ 11593 11601 11631 11654 11679 11697 
+ 11577 11588 11619 11685 11694 11696 
+ 11553 11588 11617 11685 11692 11712 
+ 11590 11602 11629 11686 
+ 11586 11609 11623 11683 11704 15524 
+ 11522 11547 11616 11620 11717 11722 11815 
+ 11498 11531 11634 11656 11779 11788 
+ 11538 11584 11634 11677 11754 11759 
+ 11585 11606 11625 11662 11693 11705 
+ 11542 11574 11655 11701 11760 11773 
+ 11508 11607 11710 11763 11835 15519 
+ 11592 11610 11632 11667 11698 11713 
+ 11568 11589 11594 11671 11731 11739 15523 
+ 11514 11548 11633 11660 11805 11861 
+ 11581 11598 11626 11682 11721 15525 
+ 11575 11624 11627 11688 11695 11709 
+ 11601 11613 11638 11663 11697 11706 
+ 11510 11542 11597 11647 11711 11760 11794 
+ 11531 11549 11644 11660 11788 11813 
+ 11600 11623 11635 11683 11700 11716 
+ 11587 11608 11661 11702 11725 11729 
+ 11604 11615 11665 11708 11714 15523 
+ 11548 11549 11651 11656 11813 11861 
+ 11587 11605 11658 11673 11729 11736 
+ 11606 11626 11646 11705 11715 15525 
+ 11613 11629 11654 11686 11706 11726 
+ 11267 11445 11599 11868 12164 12331 
+ 11615 11631 11659 11679 11708 11718 
+ 11612 11628 11670 11672 11720 11732 
+ 11610 11625 11649 11693 11713 11742 
+ 11635 11700 11703 11734 
+ 11551 11567 11675 11699 11758 11768 
+ 11628 11637 11666 11676 11720 11723 
+ 11594 11636 11650 11707 11739 11756 
+ 11612 11617 11666 11692 11732 11745 
+ 11605 11661 11676 11735 11736 15521 
+ 11491 11545 11633 11744 11843 11918 
+ 11567 11597 11669 11711 11758 11791 
+ 11637 11670 11673 11723 11735 15521 
+ 11584 11645 11699 11759 11782 
+ 11608 11624 11688 11702 11719 11727 
+ 11631 11638 11665 11697 11718 11737 
+ 11310 11337 11556 11621 12643 13075 
+ 11611 11614 11689 11786 11803 15522 
+ 11598 11620 11652 11717 11721 11771 
+ 11623 11642 11657 11704 11716 11746 
+ 11595 11619 11694 11701 11780 11795 
+ 11588 11639 11640 11696 11712 11749 
+ 11629 11641 11663 11726 
+ 11622 11627 11691 11695 11740 11743 
+ 11624 11653 11678 11709 11719 11724 
+ 11607 11611 11681 11710 11786 11789 
+ 11506 11603 11618 11804 11829 11984 
+ 11622 11636 11687 11707 11743 11752 
+ 11617 11640 11672 11712 11745 11764 
+ 11625 11646 11667 11705 11742 11762 
+ 11619 11639 11684 11696 11765 11780 
+ 11627 11653 11687 11709 11740 11748 
+ 11639 11685 11694 11749 11765 
+ 11638 11654 11679 11706 11737 11747 
+ 11632 11649 11713 11741 11769 15524 
+ 11551 11584 11669 11677 11768 11782 11814 
+ 11635 11657 11668 11716 11734 11761 
+ 11574 11595 11647 11684 11773 11795 11830 
+ 11608 11658 11678 11725 11727 11755 11757 
+ 11668 11734 11772 15526 
+ 11642 11683 11741 11746 11785 15524 
+ 11646 11662 11693 11715 11762 11778 
+ 11654 11663 11697 11726 11747 11770 
+ 11636 11671 11691 11752 11756 11790 
+ 11659 11665 11714 11718 11766 11767 
+ 11653 11688 11695 11724 11748 11753 
+ 11607 11648 11689 11789 11835 
+ 11597 11655 11675 11791 11794 11842 
+ 11640 11685 11692 11749 11764 11811 
+ 11649 11667 11698 11742 11769 11806 
+ 11659 11708 11731 11766 11775 15523 
+ 11662 11705 11778 11787 15525 
+ 11657 11683 11700 11746 11761 11797 
+ 11620 11643 11682 11771 11815 11885 
+ 11665 11679 11708 11737 11767 11776 
+ 11678 11688 11724 11727 11750 11751 
+ 11666 11670 11723 11732 11777 11784 
+ 11652 11682 11771 11787 11860 15525 
+ 11616 11643 11803 11815 11956 15522 
+ 11670 11676 11720 11735 11777 11781 
+ 11688 11709 11719 11751 11753 
+ 11658 11702 11729 11757 11774 
+ 11663 11686 11706 11770 
+ 11678 11702 11719 11750 11755 
+ 11591 11603 11804 11809 12010 
+ 11658 11661 11725 11736 11774 11810 
+ 11407 11462 11583 11738 11880 12208 12232 
+ 11650 11714 11739 11775 11796 11816 15523 
+ 11666 11672 11720 11745 11784 11808 
+ 10971 11034 11578 12178 13315 13654 
+ 11668 11700 11703 11761 11772 11812 
+ 11673 11676 11723 11736 11781 11818 
+ 11661 11673 11729 11735 11810 11818 
+ 11679 11697 11718 11747 11776 11799 
+ 11462 11500 11730 11896 12232 12409 
+ 11650 11671 11731 11756 11796 11802 11849 
+ 11687 11695 11743 11748 11792 11798 
+ 11698 11704 11769 11785 11826 15524 
+ 11667 11693 11713 11762 11806 11841 
+ 11687 11691 11740 11752 11792 15528 
+ 11545 11618 11674 11829 11918 12045 
+ 11672 11692 11732 11764 11808 11867 
+ 11683 11704 11716 11785 11797 11836 
+ 11697 11706 11737 11770 11799 11820 
+ 11695 11709 11740 11753 11798 11801 
+ 11685 11696 11712 11765 11811 11857 
+ 11719 11727 11751 11755 11793 11800 
+ 11719 11724 11750 11753 11793 11807 
+ 11691 11707 11743 11790 11851 15528 
+ 11709 11724 11748 11751 11801 11807 
+ 11634 11645 11759 11779 11895 12004 
+ 11702 11727 11750 11757 11800 15527 
+ 11671 11707 11739 11790 11802 11827 
+ 11702 11725 11755 11774 11824 15527 
+ 11669 11675 11768 11791 11834 11852 
+ 11645 11677 11754 11782 11881 11895 
+ 11647 11655 11773 11794 11892 11893 
+ 11700 11716 11734 11797 11812 11848 
+ 11693 11705 11742 11778 11841 11887 
+ 11518 11648 11835 11951 12361 15519 
+ 11692 11712 11745 11811 11867 11878 
+ 11694 11696 11749 11780 11857 11858 
+ 11708 11714 11767 11775 11819 11821 
+ 11708 11718 11766 11776 11819 11833 
+ 11669 11699 11758 11814 11834 11844 
+ 11698 11713 11741 11806 11826 11876 
+ 11706 11726 11747 11820 
+ 11682 11717 11721 11860 11885 11942 
+ 11703 11734 11812 11817 11853 15526 
+ 11647 11701 11760 11830 11892 11922 
+ 11725 11729 11757 11810 11824 11840 
+ 11714 11731 11766 11816 11821 11825 
+ 11718 11737 11767 11799 11833 11846 
+ 11720 11723 11781 11784 11832 11850 
+ 11705 11715 11762 11787 11887 11941 
+ 11634 11644 11754 11788 11971 12004 
+ 11684 11694 11765 11795 11858 11901 
+ 11723 11735 11777 11818 11850 11865 
+ 11677 11699 11759 11814 11881 11906 
+ 11817 11831 11866 15526 
+ 11720 11732 11777 11808 11832 11855 
+ 11704 11741 11746 11826 11836 11884 
+ 11681 11689 11789 11803 11974 
+ 11715 11721 11778 11860 11941 15525 
+ 11644 11656 11779 11813 11971 12014 
+ 11689 11710 11786 11835 11974 12230 
+ 11707 11752 11756 11827 11851 15529 
+ 11675 11711 11758 11842 11852 11902 
+ 11740 11743 11798 11828 11845 15528 
+ 11750 11751 11800 11807 11823 11838 
+ 11655 11711 11760 11842 11893 11923 
+ 11684 11701 11780 11830 11901 11929 
+ 11731 11739 11816 11839 11849 11872 
+ 11716 11746 11761 11836 11848 11894 
+ 11740 11748 11792 11801 11828 11847 
+ 11737 11747 11776 11820 11846 15530 
+ 11750 11755 11793 11822 11823 11837 15527 
+ 11748 11753 11798 11807 11847 11854 
+ 11739 11756 11827 11849 11862 11873 
+ 11681 11722 11786 11956 11974 12095 15522 
+ 11603 11690 11728 11984 12010 12239 
+ 11633 11651 11843 11861 12106 12119 
+ 11713 11742 11769 11841 11876 11939 
+ 11751 11753 11793 11801 11838 11854 11863 
+ 11732 11745 11784 11855 11867 11897 
+ 11583 11591 11728 11880 12010 12191 
+ 11729 11736 11774 11818 11840 11889 11891 
+ 11712 11749 11764 11857 11878 11927 
+ 11734 11761 11772 11848 11853 11905 
+ 11656 11660 11788 11861 12014 12074 
+ 11699 11768 11782 11844 11906 11945 
+ 11643 11717 11722 11885 11956 12006 
+ 11731 11775 11796 11825 11839 11856 
+ 11772 11783 11853 11866 11910 15526 
+ 11735 11736 11781 11810 11865 11889 11917 
+ 11766 11767 11821 11833 11874 11883 
+ 11747 11770 11799 15530 
+ 11766 11775 11819 11825 11869 11874 
+ 11800 11824 11837 11871 11879 15527 
+ 11793 11800 11837 11838 11864 
+ 11757 11774 11822 11840 11879 11908 15527 
+ 11775 11816 11821 11856 11869 
+ 11741 11769 11785 11876 11884 11946 
+ 11756 11790 11802 11870 11873 15529 
+ 11792 11798 11845 11847 11890 
+ 11618 11690 11744 11984 12045 12248 
+ 11701 11773 11795 11922 11929 11992 
+ 11783 11866 11877 11919 
+ 11777 11784 11850 11855 11900 
+ 11767 11776 11819 11846 11883 11899 
+ 11758 11768 11844 11852 11914 11940 
+ 11648 11710 11763 11789 12230 12361 
+ 11746 11785 11797 11884 11894 11948 
+ 11800 11822 11823 11864 11871 11875 
+ 11793 11807 11823 11863 11864 11886 
+ 11796 11816 11856 11872 11888 
+ 11774 11810 11824 11891 11908 11931 
+ 11742 11762 11806 11887 11939 12013 
+ 11711 11791 11794 11902 11923 11965 
+ 11633 11674 11805 11918 12106 12138 
+ 11768 11814 11834 11940 11945 
+ 11792 11828 11882 11890 11920 15528 
+ 11776 11799 11833 11899 11932 15530 
+ 11798 11801 11828 11854 11890 11909 
+ 11761 11797 11812 11894 11905 11960 
+ 11739 11796 11802 11862 11872 11911 11921 
+ 11777 11781 11832 11865 11900 11944 
+ 11752 11790 11882 11926 11972 15528 15529 
+ 11758 11791 11834 11902 11914 11982 
+ 11772 11812 11817 11905 11910 11968 
+ 11801 11807 11847 11863 11909 11924 
+ 11784 11808 11832 11897 11900 11947 
+ 11816 11825 11839 11869 11888 11907 
+ 11749 11765 11811 11858 11927 11959 11967 
+ 11765 11780 11857 11901 11967 11991 
+ 10946 11175 11492 12320 13588 13730 
+ 11721 11771 11787 11941 11942 12067 
+ 11651 11660 11805 11813 12074 12119 12279 
+ 11802 11849 11873 11911 11913 
+ 11807 11838 11854 11886 11924 11934 
+ 11823 11837 11838 11875 11886 11898 
+ 11781 11818 11850 11917 11944 11969 
+ 11783 11817 11831 11910 11919 11973 
+ 11745 11764 11808 11878 11897 11983 12020 
+ 11445 11630 11664 12164 12269 12600 
+ 11821 11825 11856 11874 11907 11928 
+ 11827 11873 11912 11916 15529 
+ 11822 11837 11875 11879 11904 11915 
+ 11796 11839 11849 11888 11921 11935 
+ 11802 11827 11862 11870 11912 11913 
+ 11819 11821 11869 11883 11928 11943 
+ 11837 11864 11871 11898 11904 
+ 11769 11806 11826 11939 11946 12015 
+ 11831 11919 11930 11979 
+ 11764 11811 11867 11927 11983 11990 
+ 11822 11824 11871 11908 11915 11938 
+ 11583 11730 11809 12191 12208 12366 
+ 11759 11782 11895 11906 11994 12054 
+ 11845 11851 11920 11952 11972 15528 
+ 11819 11833 11874 11899 11943 11955 
+ 11785 11826 11836 11946 11948 12016 
+ 11717 11771 11815 11942 12006 12041 
+ 11838 11863 11864 11898 11925 11934 
+ 11762 11778 11841 11941 12013 12140 
+ 11839 11856 11872 11907 11935 11949 
+ 11810 11818 11891 11917 11957 11975 
+ 11828 11845 11847 11909 11920 11954 11978 
+ 11810 11840 11889 11931 11957 11970 
+ 11760 11773 11893 11922 12035 12064 
+ 11760 11794 11892 11923 12035 12047 
+ 11797 11836 11848 11948 11960 12023 
+ 11754 11759 11881 12004 12054 12149 
+ 11500 11630 11738 12269 12409 12725 
+ 11808 11855 11867 11947 12003 12020 
+ 11864 11875 11886 11904 11925 11937 
+ 11833 11846 11883 11932 11955 11989 
+ 11832 11850 11855 11944 11947 11986 
+ 11780 11795 11858 11929 11991 12076 
+ 11791 11842 11852 11965 11982 12053 
+ 8722 10539 11037 13212 13752 14084 
+ 11871 11875 11898 11915 11936 11937 
+ 11812 11848 11853 11960 11968 12032 
+ 11782 11814 11881 11945 11994 12058 
+ 11856 11869 11888 11928 11949 11976 
+ 11824 11840 11879 11931 11938 11993 12007 
+ 11847 11854 11890 11924 11978 11985 
+ 11817 11853 11866 11968 11973 12033 
+ 11849 11862 11913 11921 11958 11963 
+ 11870 11873 11913 11916 11953 11964 
+ 11862 11873 11911 11912 11953 11958 
+ 11834 11852 11940 11982 12040 
+ 11871 11879 11904 11936 11938 11950 
+ 11870 11912 11926 11964 11988 15529 
+ 11818 11865 11889 11969 11975 12009 
+ 11674 11744 11843 12045 12138 12282 
+ 11831 11866 11877 11973 11979 12031 
+ 11845 11882 11890 11952 11954 12002 
+ 11849 11872 11911 11935 11963 11981 
+ 11773 11830 11892 11992 12064 12086 
+ 11794 11842 11893 11965 12028 12047 
+ 11854 11863 11909 11934 11980 11985 
+ 11886 11898 11934 11937 11966 11977 
+ 11851 11916 11972 11988 12027 15529 
+ 11811 11857 11878 11959 11990 12030 
+ 11869 11874 11907 11943 11976 11998 
+ 11795 11830 11901 11992 12076 12077 
+ 11877 11979 11987 12037 
+ 11840 11891 11908 11970 11993 12008 
+ 11846 11899 11989 15530 
+ 7911 10635 10857 13414 14090 14593 
+ 11863 11886 11924 11925 11977 11980 15531 
+ 11872 11888 11921 11949 11981 12000 
+ 11904 11915 11937 11950 11961 
+ 11898 11904 11925 11936 11961 11966 
+ 11879 11908 11915 11950 12001 12007 
+ 11806 11841 11876 12013 12015 12109 
+ 11834 11844 11914 11945 12040 12113 
+ 11778 11787 11860 11887 12067 12140 12231 
+ 11771 11860 11885 12041 12067 12152 
+ 11874 11883 11928 11955 11998 12012 
+ 11850 11865 11900 11969 11986 12034 12036 
+ 11814 11844 11906 11940 12058 12113 
+ 11826 11876 11884 12015 12016 12085 
+ 11855 11897 11900 11986 12003 12022 
+ 11836 11884 11894 12016 12023 12090 
+ 11888 11907 11935 11976 12000 12018 
+ 11915 11936 11938 11961 11995 12001 
+ 11518 11520 11534 11763 12361 12643 13136 
+ 11882 11920 11972 12002 12052 
+ 11912 11913 11958 11964 11997 12011 
+ 11890 11920 11978 12002 12019 
+ 11883 11899 11943 11989 12012 12048 
+ 11722 11803 11815 12006 12095 12300 
+ 11889 11891 11970 11975 12021 12024 
+ 11911 11913 11953 11963 11997 12005 
+ 11857 11927 11967 12030 12079 
+ 11848 11894 11905 12023 12032 12108 
+ 11936 11937 11950 11966 11995 11999 
+ 11294 11322 11621 12320 13075 13578 
+ 11911 11921 11958 11981 12005 15532 
+ 11912 11916 11953 11988 12011 12046 
+ 11842 11902 11923 12028 12053 12116 
+ 11925 11937 11961 11977 11996 11999 
+ 11857 11858 11959 11991 12079 12111 
+ 11853 11905 11910 12032 12033 12110 
+ 11865 11917 11944 12009 12036 12059 
+ 11891 11931 11957 12008 12021 12038 
+ 11779 11788 12004 12014 12244 12285 
+ 11851 11882 11926 11952 12027 12052 12120 
+ 11866 11910 11919 12031 12033 12105 
+ 11786 11789 11803 12095 12230 12329 
+ 11889 11917 11957 12009 12024 12051 
+ 11907 11928 11949 11998 12018 12049 
+ 11925 11934 11966 11996 12017 15531 
+ 11890 11909 11954 11985 12019 12056 
+ 11877 11919 11930 12031 12037 12097 
+ 11924 11934 11985 12043 12055 15531 
+ 11921 11935 11963 12000 12050 15532 
+ 11852 11902 11914 12040 12053 12136 
+ 11867 11878 11990 12020 12092 12103 
+ 11690 11804 11829 12239 12248 12502 
+ 11909 11924 11978 11980 12043 12056 
+ 11900 11944 11947 12022 12034 12062 
+ 11930 12037 12044 12096 
+ 11916 11926 11964 12027 12046 12081 
+ 11899 11932 11955 12048 
+ 11878 11927 11983 12030 12092 12130 
+ 11858 11901 11967 12076 12111 12153 
+ 11830 11922 11929 12077 12086 12159 
+ 11908 11931 12007 12008 12060 12066 
+ 11881 11906 12054 12058 12160 
+ 11950 11961 11999 12001 12026 12029 
+ 11966 11977 11999 12017 12025 
+ 11953 11958 12005 12011 12042 
+ 11928 11943 11976 12012 12049 12071 
+ 11961 11966 11995 11996 12025 12029 
+ 11935 11949 11981 12018 12050 12068 
+ 11938 11950 11995 12007 12026 12057 
+ 11920 11952 11954 12019 12052 12080 
+ 11897 11947 12020 12022 12082 12101 
+ 11754 11779 11895 11971 12149 12244 12303 
+ 11958 11963 11997 12042 12069 15532 
+ 11815 11885 11956 12041 12300 12317 
+ 11908 11938 11993 12001 12057 12066 12089 
+ 11931 11970 11993 12038 12060 12070 
+ 11917 11969 11975 12051 12059 12084 
+ 11728 11804 11809 12191 12239 12413 
+ 11953 11964 11997 12042 12046 12075 
+ 11943 11955 11998 12048 12071 12104 
+ 11841 11887 11939 12109 12140 12225 
+ 11788 11813 11971 12074 12285 12315 
+ 11876 11939 11946 12085 12109 12168 
+ 11884 11946 11948 12085 12090 12169 
+ 11977 11996 12025 12065 12073 15531 
+ 11949 11976 12000 12049 12068 12094 
+ 11954 11978 12002 12056 12080 12112 
+ 11867 11897 11983 12003 12101 12103 12157 
+ 11957 11970 12024 12038 12072 12078 
+ 11947 11986 12003 12062 12082 15533 
+ 11894 11948 11960 12090 12108 12183 
+ 11957 11975 12021 12051 12072 12083 
+ 11996 11999 12017 12029 12061 12065 
+ 11995 12001 12029 12057 12063 
+ 11926 11972 11988 12081 12120 12133 
+ 11923 11965 12047 12116 12174 
+ 11995 11999 12025 12026 12061 12063 
+ 11927 11959 11990 12079 12130 12167 
+ 11919 11973 11979 12097 12105 12171 
+ 11905 11960 11968 12108 12110 12188 
+ 11910 11968 11973 12105 12110 12180 
+ 11944 11986 12036 12062 12091 12100 
+ 11892 11893 12047 12064 12195 12206 
+ 11944 11969 12034 12059 12091 12107 
+ 11930 11979 11987 12096 12097 12166 
+ 11970 12008 12021 12070 12078 12088 
+ 8151 10752 10767 13965 14823 15579 
+ 11914 11940 11982 12113 12136 12223 
+ 11885 11942 12006 12152 12317 
+ 11997 12005 12011 12069 12075 12114 
+ 11980 11985 12055 12056 12099 12129 
+ 11987 12096 12102 15534 
+ 11744 11829 11918 12248 12282 12511 
+ 11964 11988 12011 12075 12081 12124 
+ 11893 11923 12028 12035 12174 12195 
+ 11955 11989 12012 12104 
+ 11976 11998 12018 12071 12094 12131 
+ 11981 12000 12068 12093 12126 15532 
+ 11975 12009 12024 12083 12084 12118 
+ 11952 11972 12002 12080 12120 12147 12162 
+ 11902 11965 11982 12116 12136 12219 
+ 11881 11895 11994 12149 12160 12280 
+ 11980 12043 12073 12099 12125 15531 
+ 11978 11985 12019 12043 12112 12129 12143 
+ 12001 12007 12026 12063 12089 12115 12117 
+ 11906 11945 11994 12113 12160 12256 
+ 11969 12009 12036 12084 12107 12132 
+ 11993 12008 12066 12070 12121 12127 
+ 12025 12029 12063 12065 12087 12098 
+ 11986 12022 12034 12100 12123 15533 
+ 12026 12029 12057 12061 12098 12115 
+ 11892 11922 12035 12086 12206 12277 
+ 12017 12025 12061 12073 12087 12122 
+ 11993 12007 12060 12089 12127 12142 
+ 11860 11941 11942 12152 12231 12295 
+ 12000 12018 12050 12094 12126 12150 
+ 12005 12042 12093 12114 12146 15532 
+ 12008 12038 12060 12088 12121 12128 
+ 11998 12012 12049 12104 12131 12155 
+ 12021 12024 12078 12083 
+ 12017 12055 12065 12122 12125 12137 15531 
+ 11813 11861 12014 12279 12315 12462 
+ 12011 12042 12046 12114 12124 12156 
+ 11901 11929 11991 12077 12153 12210 12237 
+ 11929 11992 12076 12159 12196 12210 
+ 12021 12038 12072 12088 
+ 11959 11967 12030 12111 12167 12193 
+ 12002 12019 12052 12112 12145 12162 
+ 11988 12027 12046 12124 12133 12173 
+ 12003 12022 12101 12135 12165 15533 
+ 12024 12051 12072 12118 
+ 12009 12051 12059 12118 12132 12151 
+ 11946 12015 12016 12168 12169 12226 
+ 11922 11992 12064 12159 12242 12277 
+ 12061 12065 12098 12122 12139 
+ 12038 12070 12078 12128 
+ 12007 12057 12066 12117 12142 12158 
+ 11948 12016 12023 12169 12183 12253 
+ 12034 12036 12100 12107 12134 12148 
+ 11983 11990 12103 12130 12185 12215 
+ 12050 12069 12126 12146 12176 15532 
+ 12018 12049 12068 12131 12150 12181 
+ 11803 11956 11974 12300 12329 12482 
+ 11987 12037 12044 12166 12222 15534 
+ 11979 12031 12037 12166 12171 12234 
+ 12061 12063 12087 12115 12139 12144 
+ 12043 12055 12125 12129 15535 
+ 12034 12062 12091 12123 12134 12161 
+ 12003 12020 12082 12157 12165 12209 
+ 12044 12163 12213 15534 
+ 11983 12020 12092 12157 12185 12218 
+ 12012 12048 12071 12155 
+ 11973 12031 12033 12171 12180 12245 
+ 11805 11843 12119 12138 12338 12425 
+ 12036 12059 12091 12132 12148 12172 
+ 11960 12023 12032 12183 12188 12274 
+ 11939 12013 12015 12168 12225 12240 
+ 11968 12032 12033 12180 12188 12261 
+ 11967 11991 12079 12153 12193 12241 
+ 12019 12056 12080 12143 12145 12199 
+ 11940 11945 12040 12058 12223 12256 12412 
+ 12042 12069 12075 12146 12156 12186 
+ 12057 12063 12098 12117 12144 12154 
+ 11965 12028 12053 12174 12219 12286 
+ 12057 12089 12115 12154 12158 
+ 12051 12083 12084 12151 
+ 11805 11861 12106 12279 12425 12496 
+ 11972 12027 12052 12133 12147 12207 12220 
+ 12060 12070 12127 12128 12170 12175 
+ 12065 12073 12087 12137 12139 12177 
+ 12062 12100 12135 12161 12179 15533 
+ 12046 12075 12081 12156 12173 12202 
+ 12055 12073 12099 12137 12184 15535 
+ 12050 12068 12093 12150 12176 12198 
+ 12060 12066 12121 12142 12175 12187 
+ 12070 12088 12121 12170 
+ 12043 12056 12099 12143 12192 12197 15535 
+ 11990 12030 12092 12167 12215 12243 
+ 12049 12071 12094 12155 12181 12211 
+ 12059 12084 12107 12151 12172 12189 
+ 12027 12081 12120 12173 12207 12233 
+ 12091 12100 12148 12161 12182 
+ 12082 12123 12165 12179 12212 15533 
+ 11982 12040 12053 12219 12223 12322 
+ 12073 12122 12125 12177 12184 12200 
+ 11843 11918 12106 12282 12338 12456 
+ 12087 12098 12122 12144 12177 12190 
+ 11887 11941 12013 12225 12231 12389 15542 
+ 7709 8666 10752 13965 14308 14913 
+ 12066 12089 12127 12158 12187 12201 
+ 12056 12112 12129 12197 12199 12228 
+ 12098 12115 12139 12154 12190 12194 
+ 12080 12112 12162 12199 12204 
+ 12069 12093 12114 12176 12186 12221 
+ 12052 12120 12162 12217 12220 
+ 12091 12107 12134 12172 12182 12205 
+ 11895 12004 12054 12280 12303 12420 
+ 12068 12094 12126 12181 12198 12229 
+ 12084 12118 12132 12189 
+ 11942 12041 12067 12295 12317 15543 
+ 11991 12076 12111 12237 12241 12314 
+ 12115 12117 12144 12158 12194 12203 
+ 12071 12104 12131 12211 
+ 12075 12114 12124 12186 12202 12236 
+ 12020 12101 12103 12209 12218 12258 
+ 12089 12117 12142 12154 12201 12203 
+ 11992 12077 12086 12196 12242 12272 
+ 11994 12054 12058 12256 12280 12393 
+ 12100 12123 12134 12179 12182 15536 
+ 12052 12080 12145 12147 12204 12217 
+ 12102 12213 12214 12265 
+ 11664 11868 12331 12600 12906 
+ 12082 12101 12135 12209 12212 12252 
+ 12037 12096 12097 12222 12234 12291 
+ 12030 12079 12130 12193 12243 12278 
+ 12015 12085 12109 12226 12240 12284 
+ 12016 12085 12090 12226 12253 12325 
+ 12121 12128 12175 12216 
+ 12031 12097 12105 12234 12245 12304 
+ 12107 12132 12148 12189 12205 12235 
+ 12081 12124 12133 12202 12233 12255 
+ 12028 12047 12116 12195 12286 12334 
+ 12121 12127 12170 12187 12216 12224 
+ 12093 12126 12146 12198 12221 12250 
+ 12122 12137 12139 12190 12200 12238 
+ 11034 11079 11733 12969 13654 14023 
+ 12123 12135 12161 12212 12251 15536 
+ 12033 12105 12110 12245 12261 12333 
+ 12094 12131 12150 12211 12229 12259 
+ 12134 12148 12161 12205 12247 15536 
+ 12023 12090 12108 12253 12274 15539 
+ 12125 12137 12200 12227 12266 15535 
+ 12092 12103 12215 12218 12262 12293 
+ 12114 12146 12156 12221 12236 12268 
+ 12127 12142 12175 12201 12224 12246 
+ 12032 12108 12110 12261 12274 12351 
+ 12132 12151 12172 12235 
+ 12139 12144 12177 12194 12238 12249 
+ 11809 11880 12010 12366 12413 12581 
+ 12129 12197 12227 12257 15535 
+ 12079 12111 12167 12241 12278 12327 
+ 12144 12154 12190 12203 12249 12254 
+ 12035 12047 12174 12206 12334 12352 
+ 12077 12159 12210 12272 12308 
+ 12129 12143 12192 12228 12257 12260 
+ 12126 12150 12176 12229 12250 12283 
+ 12112 12143 12145 12204 12228 12264 12292 
+ 12137 12177 12184 12238 12266 12273 
+ 12142 12158 12187 12203 12246 12271 
+ 12124 12156 12173 12236 12255 12288 
+ 12154 12158 12194 12201 12254 12271 
+ 12145 12162 12199 12217 12264 12270 
+ 12148 12172 12182 12235 12247 12275 
+ 12035 12064 12195 12277 12352 12383 
+ 12120 12133 12220 12233 12302 12305 
+ 11730 11880 12232 12366 12700 12759 
+ 12101 12157 12165 12252 12258 12299 
+ 12076 12077 12196 12237 12308 12339 
+ 12131 12155 12181 12259 
+ 12135 12165 12179 12251 12252 12296 
+ 12102 12163 12265 12276 12323 15534 
+ 12163 12263 12265 12310 
+ 12092 12130 12185 12243 12293 12318 
+ 12170 12175 12224 12267 
+ 12147 12162 12204 12220 12270 12281 
+ 12103 12157 12185 12258 12262 12301 
+ 12053 12116 12136 12286 12322 12460 
+ 12120 12147 12207 12217 12281 12302 
+ 12146 12176 12186 12250 12268 12297 
+ 12096 12166 12276 12291 12348 15534 
+ 12040 12113 12136 12322 12412 12487 
+ 12175 12187 12216 12246 12267 12287 
+ 12013 12109 12140 12240 12354 12389 
+ 12085 12168 12169 12284 12325 15541 
+ 12184 12192 12257 12266 12294 15535 
+ 12143 12197 12199 12260 12292 12306 
+ 12150 12181 12198 12259 12283 15537 
+ 11789 11835 11974 12329 12361 12887 13168 
+ 11941 12067 12140 12295 12476 15542 
+ 11730 11738 12208 12409 12759 12888 
+ 12133 12173 12207 12255 12305 12312 
+ 12097 12166 12171 12291 12304 12364 
+ 12172 12189 12205 12275 
+ 12156 12186 12202 12268 12288 12311 
+ 12076 12153 12210 12314 12339 12394 
+ 12177 12190 12200 12249 12273 12298 
+ 11804 11984 12010 12413 12502 12675 
+ 12109 12168 12225 12284 12354 12397 
+ 12111 12153 12193 12314 12327 12387 
+ 12086 12159 12272 12277 12390 12404 
+ 12130 12167 12215 12278 12318 12350 
+ 11971 12004 12285 12303 12513 12528 
+ 12105 12171 12180 12304 12333 12388 
+ 12187 12201 12224 12271 12287 12290 
+ 12182 12205 12275 12289 12316 15536 
+ 11829 11984 12045 12502 12511 12792 
+ 12190 12194 12238 12254 12298 12307 
+ 12176 12198 12221 12283 12297 12332 
+ 12179 12212 12289 12296 12335 15536 
+ 12165 12209 12212 12296 12299 12343 
+ 12090 12169 12183 12325 12441 15539 
+ 12194 12203 12249 12271 12307 12342 
+ 12173 12202 12233 12288 12312 12341 
+ 12058 12113 12160 12393 12412 12512 
+ 12192 12197 12227 12260 12294 12321 
+ 12157 12209 12218 12299 12301 12349 
+ 12181 12211 12229 15537 
+ 12197 12228 12257 12306 12321 12324 
+ 12110 12180 12188 12333 12351 12424 
+ 12185 12218 12293 12301 12344 
+ 12214 12309 12310 12353 
+ 12199 12204 12270 12292 12337 12340 
+ 12163 12213 12214 12310 12323 12367 
+ 12184 12200 12227 12273 12294 12326 12346 
+ 12216 12224 12287 12319 
+ 12186 12221 12236 12297 12311 12347 
+ 11630 11868 11896 12600 12725 13015 
+ 12204 12217 12264 12281 12313 12340 
+ 12201 12203 12246 12254 12290 12342 15538 
+ 12159 12196 12242 12308 12368 12390 
+ 12200 12238 12266 12298 12326 12328 
+ 12108 12183 12188 12351 12450 15539 
+ 12205 12235 12247 12316 
+ 12213 12222 12323 12348 12391 15534 
+ 12064 12086 12206 12242 12383 12404 12453 
+ 12167 12193 12243 12327 12350 12400 
+ 11861 12074 12119 12462 12496 12638 
+ 12054 12149 12160 12393 12420 12546 
+ 12217 12220 12270 12302 12313 12345 
+ 11918 12045 12138 12456 12511 12668 
+ 12198 12229 12250 12332 12358 15537 
+ 12168 12226 12240 12397 15541 
+ 11971 12014 12244 12315 12513 12542 
+ 12116 12174 12219 12334 12440 12460 
+ 12224 12246 12267 12290 12319 12336 
+ 12202 12236 12255 12311 12341 12359 
+ 12247 12251 12316 12335 12360 15536 
+ 12246 12271 12287 12336 15538 
+ 12166 12222 12234 12348 12364 12415 
+ 12199 12228 12264 12306 12337 12370 
+ 12185 12215 12262 12318 12344 12377 
+ 12227 12257 12266 12321 12346 12357 
+ 12067 12152 12231 12476 12549 15543 
+ 12212 12251 12252 12335 12343 12373 
+ 12221 12250 12268 12332 12347 12371 
+ 12238 12249 12273 12307 12328 12356 
+ 12209 12252 12258 12343 12349 12382 
+ 11956 12006 12095 12317 12482 13041 
+ 12218 12258 12262 12344 12349 12384 
+ 12207 12220 12281 12305 12345 12376 12381 
+ 12004 12149 12244 12420 12519 12528 
+ 12171 12234 12245 12364 12388 12445 
+ 12207 12233 12302 12312 12374 12376 
+ 12228 12260 12292 12324 12362 12370 
+ 12249 12254 12298 12342 12356 15540 
+ 12196 12210 12272 12339 12368 12416 
+ 12263 12353 12355 12399 
+ 12214 12263 12265 12353 12367 12406 
+ 12236 12268 12288 12347 12359 12385 
+ 12233 12255 12305 12341 12374 12386 
+ 12270 12281 12340 12345 12365 
+ 12153 12237 12241 12387 12394 12455 
+ 12014 12074 12285 12462 12542 12652 
+ 12247 12275 12289 12360 
+ 12006 12041 12152 12300 13041 15543 
+ 12215 12243 12293 12350 12377 12418 
+ 12267 12287 12336 12369 
+ 11175 11322 11859 11962 13578 13730 
+ 12257 12260 12294 12324 12357 12363 
+ 12136 12219 12223 12460 12487 12555 
+ 12213 12265 12276 12367 12391 12433 
+ 12260 12306 12321 12362 12363 
+ 12169 12226 12253 12441 12532 15541 
+ 12266 12273 12328 12346 12375 12379 
+ 12193 12241 12278 12387 12400 12459 
+ 12273 12298 12326 12356 12372 12375 
+ 11974 12095 12230 12482 12887 
+ 252 270 6142 15094 15098 15170 
+ 11599 11664 12164 12469 12906 13213 
+ 12250 12283 12297 12358 12371 12403 
+ 12180 12245 12261 12388 12424 12486 
+ 12174 12195 12286 12352 12440 12463 
+ 12251 12289 12296 12360 12373 12408 
+ 12287 12290 12319 12369 12378 15538 
+ 12264 12292 12340 12370 12395 12401 
+ 12106 12138 12425 12456 12650 
+ 12210 12237 12308 12394 12416 12471 
+ 12264 12270 12313 12337 12365 12380 12395 
+ 12255 12288 12312 12359 12386 12410 
+ 12254 12271 12307 12392 12422 15538 15540 
+ 12252 12296 12299 12373 12382 12421 
+ 12262 12293 12301 12377 12384 12432 
+ 12281 12302 12313 12365 12381 12396 
+ 12266 12294 12326 12357 12379 12398 
+ 12268 12297 12311 12371 12385 12414 
+ 12222 12276 12291 12391 12415 12466 
+ 12258 12299 12301 12382 12384 12431 
+ 12243 12278 12318 12400 12418 12473 
+ 12188 12261 12274 12424 12450 12521 
+ 12195 12206 12334 12383 12463 12501 
+ 12263 12309 12310 12399 12406 12446 
+ 12225 12240 12389 12397 12523 
+ 12309 12399 12402 12443 
+ 12298 12307 12328 12372 12407 15540 
+ 12294 12321 12346 12363 12398 12411 
+ 12283 12332 12403 15537 
+ 12288 12311 12341 12385 12410 12434 
+ 12289 12316 12335 12408 
+ 11763 11835 11951 12230 13136 13168 
+ 12306 12324 12363 12370 12419 12428 
+ 12321 12324 12357 12362 12411 12419 
+ 12234 12291 12304 12415 12445 12499 
+ 12313 12340 12345 12380 12396 12405 
+ 11880 12191 12208 12581 12700 12889 
+ 12265 12310 12323 12406 12433 12467 
+ 12272 12308 12390 12416 12481 
+ 12319 12336 12378 12427 
+ 12292 12306 12337 12362 12401 12428 12439 
+ 12297 12332 12347 12403 12414 12449 
+ 12328 12356 12375 12407 12423 
+ 12296 12335 12343 12408 12421 12454 
+ 12305 12312 12376 12386 12437 12442 
+ 12326 12328 12372 12379 12423 12429 
+ 12302 12305 12374 12381 12430 12437 
+ 12293 12318 12344 12418 12432 12479 
+ 12336 12369 12392 12427 12451 15538 
+ 12326 12346 12375 12398 12429 12436 
+ 12340 12365 12395 12405 12417 
+ 12302 12345 12376 12396 12430 12435 
+ 12299 12343 12349 12421 12431 12474 
+ 12206 12277 12352 12453 12501 12547 
+ 12301 12344 12349 12431 12432 12480 
+ 12311 12347 12359 12414 12434 12461 
+ 12312 12341 12374 12410 12442 12458 
+ 12241 12314 12327 12455 12459 12525 
+ 12245 12304 12333 12445 12486 12539 
+ 12140 12225 12354 12523 12628 15542 
+ 12242 12272 12368 12404 12481 12520 
+ 12276 12323 12348 12433 12466 12506 
+ 12342 12378 12422 12451 12475 15538 
+ 12160 12256 12280 12512 12546 12609 
+ 12237 12314 12339 12455 12471 12530 
+ 12337 12340 12380 12401 12417 12438 
+ 12345 12365 12381 12405 12426 12435 
+ 12240 12284 12354 12523 12605 15541 
+ 12346 12357 12379 12411 12436 12452 
+ 12309 12353 12355 12443 12446 12489 
+ 12278 12327 12350 12459 12473 12527 
+ 12337 12370 12395 12438 12439 12465 
+ 12355 12443 12447 12491 
+ 12332 12358 12371 12449 
+ 12242 12277 12390 12453 12520 12563 
+ 12365 12380 12396 12417 12426 12448 
+ 12310 12353 12367 12446 12467 15545 
+ 12356 12372 12423 12444 12457 15540 
+ 12335 12360 12373 12454 
+ 11738 11896 12232 12725 12888 13094 
+ 12341 12359 12386 12434 12458 12483 
+ 12357 12363 12398 12419 12452 12464 
+ 12113 12223 12256 12487 12512 12606 12633 
+ 12010 12191 12239 12581 12675 12818 
+ 12347 12371 12385 12449 12461 12493 
+ 12291 12348 12364 12466 12499 12554 
+ 12308 12339 12368 12471 12481 12540 
+ 12380 12395 12405 12438 12448 12468 
+ 12318 12350 12377 12473 12479 12533 
+ 12362 12363 12411 12428 12464 12478 
+ 12149 12280 12303 12519 12546 12676 
+ 12343 12373 12382 12454 12474 12508 
+ 12342 12392 12444 12475 12488 15540 
+ 12372 12375 12407 12429 12457 12472 
+ 12261 12333 12351 12486 12521 12577 
+ 12106 12119 12338 12496 12650 12804 
+ 12396 12405 12435 12448 12470 
+ 12369 12378 12451 12485 
+ 12362 12370 12419 12439 12478 12490 
+ 12375 12379 12423 12436 12472 12484 
+ 12376 12381 12435 12437 12477 12492 
+ 12349 12382 12384 12474 12480 12524 
+ 12344 12377 12384 12479 12480 15546 
+ 12323 12367 12391 12467 12506 12544 
+ 12359 12385 12410 12461 12483 12505 
+ 12381 12396 12426 12430 12470 12477 
+ 12379 12398 12429 12452 12484 12497 
+ 12374 12376 12430 12442 12492 12504 
+ 12395 12401 12417 12465 12468 12495 
+ 12370 12401 12428 12465 12490 12503 
+ 12286 12334 12460 12463 12601 12621 
+ 12253 12325 12532 12561 12686 15539 
+ 12374 12386 12437 12458 12504 12509 
+ 12355 12399 12402 12489 12491 12531 
+ 12407 12422 12457 12488 12500 15540 
+ 12304 12364 12388 12499 12539 12583 
+ 12353 12399 12406 12489 12538 15545 
+ 12402 12491 12494 12534 
+ 12405 12417 12426 12468 12470 12498 
+ 12371 12403 12414 12493 
+ 12274 12351 12521 12561 12636 15539 
+ 12378 12392 12427 12475 12485 12514 12517 
+ 12398 12411 12436 12464 12497 12507 
+ 12277 12383 12404 12547 12563 12620 
+ 12373 12408 12421 12508 
+ 12314 12387 12394 12525 12530 12594 
+ 12138 12282 12338 12650 12668 12762 
+ 12407 12423 12444 12472 12500 12510 
+ 12386 12410 12442 12483 12509 12529 
+ 12327 12387 12400 12525 12527 12588 
+ 12219 12286 12322 12440 12555 12621 12665 
+ 12385 12414 12434 12493 12505 12537 
+ 12074 12279 12315 12638 12652 12803 
+ 12334 12352 12440 12501 12571 12601 
+ 12411 12419 12452 12478 12507 12518 
+ 12401 12438 12439 12495 12503 12522 
+ 12348 12391 12415 12506 12554 12595 
+ 12367 12406 12433 12544 12568 15545 
+ 12417 12438 12448 12495 12498 12515 
+ 11573 11599 12331 12876 13213 13437 
+ 12426 12435 12448 12477 12498 12516 
+ 12339 12394 12416 12530 12540 12598 
+ 12423 12429 12457 12484 12510 12526 
+ 12350 12400 12418 12527 12533 12586 
+ 12382 12421 12431 12508 12524 12565 
+ 12392 12422 12451 12488 12517 12536 
+ 12231 12295 12549 12733 12736 15542 
+ 12430 12435 12470 12492 12516 12552 
+ 12419 12428 12464 12490 12518 12535 
+ 12377 12418 12432 12533 12584 15546 
+ 12384 12431 12432 12524 12578 15546 
+ 12368 12390 12416 12520 12540 12590 
+ 12095 12300 12329 12887 13041 
+ 12410 12434 12458 12505 12529 12553 
+ 12429 12436 12472 12497 12526 12543 
+ 12427 12451 12514 12545 
+ 12333 12388 12424 12539 12577 12622 
+ 12223 12322 12412 12555 12633 12673 
+ 12422 12444 12475 12500 12536 12548 
+ 12399 12443 12446 12531 12538 12570 
+ 12428 12439 12478 12503 12535 15547 
+ 12402 12443 12447 12531 12534 12573 
+ 12430 12437 12477 12504 12552 12557 
+ 12414 12449 12461 12537 
+ 12447 12534 12541 12574 
+ 12438 12465 12468 12515 12522 12550 
+ 12119 12279 12425 12638 12731 12804 
+ 12436 12452 12484 12507 12543 12556 
+ 12448 12468 12470 12515 12516 12551 
+ 12364 12415 12445 12554 12583 12632 
+ 12444 12457 12488 12510 12548 12560 
+ 12352 12383 12463 12547 12571 12630 
+ 11984 12239 12248 12675 12792 12971 
+ 12439 12465 12490 12522 12564 15547 
+ 12437 12442 12492 12509 12557 12562 
+ 12434 12461 12483 12537 12553 12576 
+ 12391 12433 12466 12544 12595 12623 
+ 12452 12464 12497 12518 12556 12566 
+ 12421 12454 12474 12565 
+ 12442 12458 12504 12529 12562 12572 
+ 12457 12472 12500 12526 12560 12569 
+ 12045 12248 12282 12668 12792 13011 
+ 12256 12393 12412 12606 12609 12710 
+ 12244 12285 12528 12542 12702 12739 
+ 12451 12485 12517 12545 12558 12567 
+ 12468 12495 12498 12550 12551 12559 
+ 12470 12477 12498 12551 12552 12585 
+ 12451 12475 12514 12536 12567 12579 
+ 12464 12478 12507 12535 12566 12575 
+ 12303 12420 12528 12676 12701 
+ 12390 12404 12481 12563 12590 12644 
+ 12351 12424 12450 12577 12636 12678 
+ 12465 12495 12503 12550 12564 12580 
+ 12354 12389 12397 12605 12628 12781 
+ 12431 12474 12480 12565 12578 12619 
+ 12387 12455 12459 12588 12594 12654 
+ 12472 12484 12510 12543 12569 12582 
+ 12400 12459 12473 12586 12588 12647 
+ 12244 12303 12513 12519 12701 12702 
+ 12458 12483 12509 12553 12572 12596 
+ 12394 12455 12471 12594 12598 12661 
+ 12443 12489 12491 12570 12573 12610 
+ 12325 12441 12605 12686 12850 15541 
+ 12418 12473 12479 12584 12586 12641 
+ 12447 12491 12494 12573 12574 12612 
+ 12478 12490 12518 12575 12587 15547 
+ 12475 12488 12517 12548 12579 12591 
+ 12461 12493 12505 12576 
+ 12446 12489 12570 12589 12613 15545 
+ 12388 12445 12486 12583 12622 12666 
+ 12416 12471 12481 12590 12598 12659 
+ 12494 12574 15548 15550 
+ 12285 12315 12513 12652 12739 12832 
+ 12484 12497 12526 12556 12582 12597 
+ 12433 12467 12506 12568 12623 12642 
+ 12485 12514 12558 12599 
+ 12280 12393 12420 12609 12676 12828 
+ 12383 12453 12501 12620 12630 12697 
+ 12488 12500 12536 12560 12591 12603 
+ 12295 12476 12733 12913 15543 
+ 12495 12515 12522 12559 12580 12593 
+ 12498 12515 12516 12559 12585 12592 
+ 12477 12492 12516 12557 12585 12615 15549 
+ 12483 12505 12529 12576 12596 12617 
+ 12415 12466 12499 12595 12632 12680 
+ 12322 12460 12487 12665 12673 12753 
+ 12497 12507 12543 12566 12597 12607 
+ 12492 12504 12552 12562 12604 15549 
+ 12514 12545 12567 12599 12608 
+ 12515 12550 12551 12592 12593 
+ 12500 12510 12548 12569 12603 12614 
+ 12441 12450 12636 12686 12777 15539 
+ 12504 12509 12557 12572 12604 12616 
+ 12404 12453 12520 12620 12644 12707 
+ 12503 12522 12580 12602 12618 15547 
+ 12474 12508 12524 12619 
+ 12507 12518 12556 12575 12607 15551 
+ 12514 12517 12558 12579 12608 12624 
+ 12467 12544 12589 12642 12660 15545 
+ 12510 12526 12560 12582 12614 12625 
+ 12489 12531 12538 12610 12613 12646 
+ 12463 12501 12601 12630 12703 
+ 12509 12529 12562 12596 12616 12629 
+ 12491 12531 12534 12610 12612 15553 
+ 12494 12534 12541 12612 12655 15550 
+ 12518 12535 12566 12587 12627 15551 
+ 12505 12537 12553 12617 
+ 12424 12486 12521 12622 12678 12708 
+ 12480 12524 12619 12631 12677 15546 
+ 12517 12536 12567 12591 12624 12634 
+ 12522 12550 12564 12593 12618 12626 
+ 12191 12366 12413 12818 12889 13057 
+ 12526 12543 12569 12597 12625 12637 
+ 12445 12499 12539 12632 12666 12723 
+ 12479 12533 12631 12641 12693 15546 
+ 12516 12551 12552 12592 12615 12635 12648 
+ 12473 12527 12533 12641 12647 12705 
+ 12535 12575 12602 12627 12640 15547 
+ 12459 12525 12527 12647 12654 12713 
+ 12538 12568 12613 12660 15545 15555 
+ 12481 12520 12540 12644 12659 12719 
+ 12536 12548 12579 12603 12634 12645 
+ 12551 12559 12585 12593 12635 15552 
+ 12550 12559 12580 12592 12626 15552 
+ 12455 12525 12530 12654 12661 12720 
+ 12466 12506 12554 12623 12680 12714 
+ 12529 12553 12572 12617 12629 12656 
+ 12543 12556 12582 12607 12637 12651 
+ 12471 12530 12540 12659 12661 12724 
+ 12545 12558 12608 12662 15554 
+ 11868 12164 12269 12906 13015 13210 
+ 12440 12463 12571 12621 12703 12752 
+ 12564 12587 12618 12640 12657 15547 
+ 12548 12560 12591 12614 12645 12663 
+ 12557 12562 12616 12639 12658 15549 
+ 12397 12523 12532 12781 12850 12907 15541 
+ 12412 12512 12633 12710 12746 12811 
+ 12556 12566 12597 12651 12664 15551 
+ 12558 12567 12599 12624 12669 15554 
+ 12393 12512 12546 12710 12821 12828 
+ 12531 12570 12573 12646 12689 15553 
+ 12649 12653 12687 15548 
+ 12534 12573 12574 12655 15553 15556 
+ 12538 12570 12589 12646 12685 15555 
+ 12560 12569 12603 12625 12663 12670 
+ 12552 12585 12639 12648 12671 15549 
+ 12562 12572 12604 12629 12658 12672 
+ 12553 12576 12596 12656 
+ 12564 12580 12602 12626 12657 12667 
+ 12524 12565 12578 12677 
+ 12453 12547 12563 12697 12707 12780 
+ 12440 12460 12601 12665 12752 12797 
+ 12486 12539 12577 12666 12708 12750 
+ 12506 12544 12595 12642 12714 12737 
+ 12567 12579 12608 12634 12669 12681 
+ 12569 12582 12614 12637 12670 12682 
+ 12580 12593 12618 12667 12679 15552 
+ 12575 12587 12640 12674 12684 15551 
+ 12389 12523 12736 12781 12927 15542 
+ 12572 12596 12616 12656 12672 12692 
+ 12501 12547 12571 12697 12703 12778 
+ 12578 12584 12677 12693 12742 15546 
+ 12499 12554 12583 12680 12723 12779 
+ 12412 12487 12606 12673 12746 12791 
+ 12579 12591 12624 12645 12681 12691 
+ 12585 12592 12648 12688 12696 15552 
+ 12450 12521 12561 12678 12777 12795 
+ 12582 12597 12625 12651 12682 12695 
+ 12279 12462 12496 12731 12803 12892 
+ 12604 12615 12658 12671 12694 15549 
+ 12587 12602 12627 12657 12684 12699 
+ 12533 12584 12586 12693 12705 12760 
+ 12544 12568 12623 12660 12737 12745 
+ 11534 11556 11680 11951 13075 13136 13616 
+ 12520 12563 12590 12707 12719 12788 
+ 12591 12603 12634 12663 12691 12704 
+ 12570 12610 12613 12685 12689 15557 
+ 12527 12586 12588 12705 12713 12770 
+ 12585 12615 12635 12671 12696 12709 
+ 12611 12683 12687 12722 
+ 12338 12425 12456 12762 12804 12952 
+ 12597 12607 12637 12664 12695 12706 
+ 12315 12462 12542 12803 12832 12949 
+ 12611 12687 12690 12727 15548 15550 
+ 12525 12588 12594 12713 12720 12782 
+ 12574 12612 12690 12734 15550 15556 
+ 12596 12617 12629 12692 
+ 12602 12618 12640 12667 12699 12711 
+ 12604 12616 12639 12672 12694 12712 
+ 12540 12590 12598 12719 12724 12793 
+ 12568 12589 12642 12743 12745 15555 
+ 12530 12594 12598 12720 12724 12790 
+ 12599 12698 12718 15554 
+ 12603 12614 12645 12670 12704 12716 
+ 12607 12651 12674 12706 12717 15551 
+ 12460 12555 12621 12753 12797 12860 
+ 12539 12583 12622 12723 12750 12817 
+ 12618 12626 12657 12679 12711 12721 
+ 12282 12456 12511 12762 12999 13011 
+ 12608 12624 12681 12698 12735 15554 
+ 12614 12625 12663 12682 12716 12726 
+ 12615 12639 12648 12694 12709 12728 
+ 12616 12629 12658 12692 12712 12730 
+ 12487 12555 12633 12753 12791 12857 
+ 12627 12664 12684 12717 12729 15551 
+ 12239 12413 12502 12818 12971 13059 
+ 12420 12519 12546 12701 12828 12933 
+ 12578 12619 12631 12742 
+ 12521 12577 12636 12708 12794 12795 
+ 12626 12667 12688 12721 12732 15552 
+ 12554 12595 12632 12714 12779 12825 
+ 12624 12634 12669 12691 12735 12757 
+ 12625 12637 12670 12695 12726 12741 
+ 12649 12715 12722 12756 
+ 12627 12640 12674 12699 12729 12744 
+ 12613 12646 12738 15555 15557 
+ 12441 12532 12561 12777 12850 12958 
+ 12611 12649 12653 12722 12727 12765 
+ 12635 12679 12696 12732 12747 15552 
+ 12610 12646 12740 12769 15553 15557 
+ 12653 12655 12727 12734 12771 15550 
+ 12634 12645 12681 12704 12757 12758 
+ 12629 12656 12672 12730 
+ 12584 12631 12641 12742 12760 12807 
+ 12639 12658 12671 12712 12728 12749 
+ 12637 12651 12682 12706 12741 12751 
+ 12635 12648 12688 12709 12747 12755 
+ 12547 12620 12630 12778 12780 12858 
+ 12662 12669 12718 12735 12761 15554 
+ 12640 12657 12684 12711 12744 12754 
+ 12208 12366 12759 12889 13046 13109 
+ 12519 12528 12676 12702 12910 12933 
+ 12513 12528 12701 12739 12910 12919 
+ 12571 12601 12630 12752 12778 12849 
+ 12645 12663 12691 12716 12758 12763 
+ 12586 12641 12647 12760 12770 12829 
+ 12651 12664 12695 12717 12751 12764 
+ 12563 12620 12644 12780 12788 12862 
+ 12577 12622 12678 12750 12794 12824 
+ 12648 12671 12696 12728 12755 12768 
+ 12512 12606 12609 12811 12821 12836 
+ 12657 12667 12699 12721 12754 12766 
+ 12658 12672 12694 12730 12749 12767 
+ 12588 12647 12654 12770 12782 12842 
+ 12595 12623 12680 12737 12825 12840 
+ 12683 12748 12756 12786 
+ 12663 12670 12704 12726 12763 12772 
+ 12664 12674 12706 12729 12764 12773 
+ 12662 12698 12761 12776 
+ 12590 12644 12659 12788 12793 12863 
+ 12594 12654 12661 12782 12790 12851 
+ 12667 12679 12711 12732 12766 12774 
+ 12649 12683 12687 12756 12765 12796 
+ 12583 12632 12666 12779 12817 12884 
+ 12598 12659 12661 12790 12793 12861 
+ 11896 12269 12409 13015 13094 13233 
+ 12670 12682 12716 12741 12772 12785 
+ 12653 12687 12690 12765 12771 12808 
+ 12671 12694 12709 12749 12768 12784 
+ 12674 12684 12717 12744 12773 12787 
+ 12672 12692 12712 12767 
+ 12496 12638 12804 12892 12986 
+ 12679 12688 12721 12747 12774 12789 
+ 12476 12549 12736 12913 12975 
+ 12655 12690 12771 12783 12819 15556 
+ 12669 12681 12698 12757 12761 12805 
+ 12476 12628 12733 12927 12975 13032 15542 
+ 12623 12642 12714 12745 12838 12840 
+ 12685 12743 12801 12815 15555 15557 
+ 12513 12542 12702 12832 12919 12923 
+ 12689 12769 12783 12831 15553 15556 
+ 12682 12695 12726 12751 12785 12799 
+ 12631 12677 12693 12807 
+ 12660 12738 12745 12815 12820 15555 
+ 12684 12699 12729 12754 12787 12798 
+ 12642 12660 12737 12743 12820 12838 
+ 12606 12633 12791 12811 12879 
+ 12688 12696 12732 12755 12789 12800 
+ 12715 12775 12786 12816 
+ 12694 12712 12728 12767 12784 12802 
+ 12622 12666 12708 12817 12824 12895 
+ 12695 12706 12741 12764 12799 12810 
+ 12601 12621 12703 12797 12849 12905 
+ 12555 12665 12673 12857 12860 12937 
+ 12699 12711 12744 12766 12798 12809 
+ 12696 12709 12747 12768 12800 12812 
+ 12683 12715 12722 12786 12796 12830 
+ 12681 12691 12735 12758 12805 12833 12866 
+ 12691 12704 12757 12763 12813 12833 
+ 12208 12232 12700 12888 13109 13166 
+ 12641 12693 12705 12807 12829 12873 
+ 12698 12718 12735 12776 12805 12827 
+ 12456 12650 12668 12952 12999 
+ 12704 12716 12758 12772 12813 12814 
+ 12706 12717 12751 12773 12810 12822 
+ 12687 12722 12727 12796 12808 12841 
+ 12711 12721 12754 12774 12809 15558 
+ 12712 12730 12749 12802 
+ 12709 12728 12755 12784 12812 12823 
+ 12689 12740 12801 12831 12859 15557 
+ 12647 12705 12713 12829 12842 12891 
+ 12690 12727 12734 12808 12819 12853 
+ 12716 12726 12763 12785 12814 12826 
+ 12717 12729 12764 12787 12822 12834 
+ 12721 12732 12766 12789 12835 15558 
+ 12748 12806 12816 12845 
+ 12718 12761 12827 12839 
+ 12561 12636 12686 12795 12926 12958 
+ 12630 12697 12703 12849 12858 12922 
+ 12632 12680 12723 12825 12884 12946 
+ 12620 12697 12707 12858 12862 12929 
+ 12523 12605 12628 12907 12927 13031 
+ 12654 12713 12720 12842 12851 12904 
+ 12734 12740 12819 12831 12871 15556 
+ 12728 12749 12768 12802 12823 12837 
+ 12726 12741 12772 12799 12826 12844 
+ 12715 12748 12756 12816 12830 12854 
+ 12729 12744 12773 12798 12834 12843 
+ 12644 12707 12719 12862 12863 12930 
+ 12732 12747 12774 12800 12835 12846 
+ 12661 12720 12724 12851 12861 12917 
+ 12633 12673 12746 12857 12879 12954 
+ 12248 12502 12511 12971 13011 13200 
+ 12659 12719 12724 12861 12863 12925 
+ 12678 12708 12795 12824 12909 12959 
+ 12636 12678 12777 12794 12909 12926 
+ 12722 12756 12765 12830 12841 12870 
+ 12621 12665 12752 12860 12905 12968 
+ 12744 12754 12787 12809 12843 12852 
+ 12741 12751 12785 12810 12844 12856 
+ 12747 12755 12789 12812 12846 12848 
+ 12738 12769 12815 12859 15557 15559 
+ 12749 12767 12784 12837 
+ 12462 12638 12652 12892 12949 13029 
+ 12425 12496 12650 12731 12952 12986 13120 
+ 12735 12757 12761 12827 12866 12874 
+ 12775 12837 12845 12869 
+ 12693 12742 12760 12873 
+ 12727 12765 12771 12841 12853 12882 
+ 12754 12766 12798 12852 12865 15558 
+ 12751 12764 12799 12822 12856 12868 
+ 12606 12710 12746 12836 12879 12948 
+ 12755 12768 12800 12823 12848 12855 
+ 12758 12763 12814 12833 12847 
+ 12763 12772 12813 12826 12847 12864 
+ 12738 12743 12801 12820 12896 15559 
+ 12748 12775 12786 12845 12854 12878 
+ 12666 12723 12750 12884 12895 13001 
+ 12413 12581 12675 13057 13059 13172 
+ 12734 12771 12783 12853 12871 12900 
+ 12743 12745 12815 12838 12896 12903 
+ 12609 12710 12828 12836 12990 13013 
+ 12764 12773 12810 12834 12868 12875 
+ 12768 12784 12812 12837 12855 12867 
+ 12708 12750 12794 12895 12959 
+ 12680 12714 12779 12840 12946 12960 
+ 12772 12785 12814 12844 12864 12880 
+ 12761 12776 12805 12839 12874 12883 
+ 12546 12609 12676 12821 12933 13013 13053 
+ 12705 12760 12770 12873 12891 12943 
+ 12756 12786 12796 12854 12870 15561 
+ 12740 12769 12783 12859 12871 12915 
+ 12542 12652 12739 12923 12949 13045 
+ 12757 12758 12813 12847 12866 12877 
+ 12773 12787 12822 12843 12875 15560 
+ 12774 12789 12846 12872 12881 15558 
+ 12710 12811 12821 12948 12990 
+ 12784 12802 12806 12823 12867 12869 12886 
+ 12737 12745 12820 12840 12903 12931 
+ 12776 12827 12883 12885 
+ 12714 12737 12825 12838 12931 12960 
+ 12765 12796 12808 12870 12882 12911 
+ 12713 12770 12782 12891 12904 12965 
+ 12787 12798 12834 12852 12893 15560 
+ 12785 12799 12826 12856 12880 12899 
+ 12775 12806 12816 12869 12878 12901 
+ 12789 12800 12835 12848 12881 12894 
+ 12813 12814 12833 12864 12877 12890 
+ 12800 12812 12846 12855 12894 12897 
+ 12703 12752 12778 12905 12922 12985 
+ 12532 12605 12686 12907 12958 13085 13126 
+ 12720 12782 12790 12904 12917 12974 
+ 12798 12809 12843 12865 12893 12902 
+ 12771 12808 12819 12882 12900 12928 
+ 12786 12816 12830 12878 12914 15561 
+ 12812 12823 12848 12867 12897 12898 
+ 12799 12810 12844 12868 12899 12908 
+ 12673 12753 12791 12937 12954 13012 
+ 12697 12778 12780 12922 12929 12997 
+ 12769 12801 12831 12915 12955 15559 
+ 12665 12753 12797 12937 12968 13018 
+ 12724 12790 12793 12917 12925 12987 
+ 12707 12780 12788 12929 12930 13000 
+ 12719 12788 12793 12925 12930 12994 
+ 12814 12826 12847 12880 12890 12920 
+ 12809 12852 12872 12902 12912 15558 
+ 12757 12805 12833 12874 12877 12940 12947 
+ 12823 12837 12855 12886 12898 15562 
+ 12810 12822 12856 12875 12908 12916 
+ 12806 12837 12845 12886 12901 12918 
+ 12796 12830 12841 12911 15561 15563 
+ 12783 12819 12831 12900 12915 12967 
+ 12835 12865 12881 12912 12921 15558 
+ 12760 12807 12829 12943 
+ 12805 12827 12866 12883 12934 12940 
+ 12822 12834 12868 12916 12924 15560 
+ 11573 11578 12469 13315 13437 13684 
+ 12833 12847 12866 12890 12941 12947 
+ 12816 12845 12854 12901 12914 12942 
+ 12746 12791 12811 12948 12954 13016 
+ 12826 12844 12864 12899 12920 12953 
+ 12835 12846 12872 12894 12921 12935 
+ 12808 12841 12853 12911 12928 12963 
+ 12827 12839 12874 12885 12934 12938 
+ 12723 12779 12817 12946 13001 13063 
+ 12839 12883 12938 12944 
+ 12837 12867 12869 12918 12936 15562 
+ 12230 12329 12482 13041 13168 13498 
+ 12232 12409 12759 13094 13166 13267 
+ 12366 12581 12700 13046 13057 13154 
+ 12847 12864 12877 12920 12941 
+ 12770 12829 12842 12943 12965 13008 
+ 12638 12731 12803 12986 13029 13099 
+ 12843 12852 12902 12932 12945 15560 
+ 12846 12848 12881 12897 12935 12951 
+ 12750 12817 12824 12959 13001 13078 
+ 12815 12820 12903 12972 12982 15559 
+ 12848 12855 12894 12898 12950 12951 
+ 12855 12867 12897 12939 12950 15562 
+ 12844 12856 12880 12908 12953 12961 
+ 12819 12853 12871 12928 12967 12983 
+ 12845 12869 12878 12918 12942 12957 
+ 12852 12865 12893 12912 12945 12956 
+ 12820 12838 12896 12931 12982 12998 
+ 12782 12842 12851 12965 12974 13017 
+ 12752 12797 12849 12968 12985 13030 
+ 12164 12331 12600 13210 13213 13401 
+ 12605 12781 12850 13031 13085 
+ 12856 12868 12899 12916 12961 12962 
+ 12794 12795 12926 12959 13061 
+ 12701 12702 12919 12933 13098 13110 
+ 12841 12870 12882 12963 12981 15563 
+ 12865 12872 12902 12921 12956 12970 
+ 12549 12733 12975 13041 13371 15543 
+ 12854 12878 12942 12964 12976 15561 
+ 12831 12859 12871 12955 12967 13009 
+ 12868 12875 12908 12924 12962 12966 
+ 12790 12851 12861 12974 12987 13028 
+ 12869 12886 12901 12936 12957 12973 
+ 12702 12739 12910 12923 13060 13110 
+ 12864 12880 12890 12941 12953 12995 
+ 12872 12881 12912 12935 12970 12980 
+ 12778 12849 12858 12985 12997 13040 
+ 12739 12832 12919 13045 13060 
+ 12875 12916 12932 12966 12977 15560 
+ 12793 12861 12863 12987 12994 13035 
+ 12777 12795 12909 12958 13061 13096 
+ 12628 12736 12781 13031 13032 13128 
+ 12853 12882 12900 12963 12983 13002 
+ 12780 12858 12862 12997 13000 13044 
+ 12788 12862 12863 12994 13000 13042 
+ 12838 12840 12903 12960 12998 13025 
+ 12893 12924 12945 12977 15560 15564 
+ 12676 12701 12828 12910 13053 13098 13123 
+ 12874 12883 12938 12940 12988 12996 
+ 12881 12894 12921 12951 12980 12991 
+ 12886 12918 12939 12973 12993 15562 
+ 12753 12857 12860 13012 13018 13076 
+ 12883 12885 12934 12944 12988 12989 
+ 12898 12936 12950 12978 12993 15562 
+ 12866 12874 12934 12947 12996 13005 
+ 12877 12890 12920 12947 12995 13006 
+ 12878 12901 12914 12957 12976 12979 
+ 12829 12873 12891 13008 
+ 12885 12938 12989 12992 
+ 12893 12902 12932 12956 15564 
+ 12779 12825 12884 12960 13063 13067 
+ 12866 12877 12940 12941 13005 13006 
+ 12811 12836 12879 12990 13016 13071 
+ 12652 12803 12832 13029 13045 13143 
+ 12897 12898 12939 12951 12978 12984 
+ 12894 12897 12935 12950 12984 12991 
+ 12650 12762 12804 12999 13120 13158 
+ 12880 12899 12920 12961 12995 13036 
+ 12791 12857 12879 13012 13016 13077 
+ 12859 12915 12972 13009 13033 15559 
+ 12902 12912 12945 12970 13097 15564 
+ 12901 12918 12942 12973 12979 13003 
+ 12686 12777 12850 12926 13096 13126 
+ 12794 12824 12895 12909 13061 13078 
+ 12825 12840 12931 12946 13025 13067 
+ 12899 12908 12953 12962 13022 13036 
+ 12908 12916 12961 12966 13007 13022 
+ 12882 12911 12928 12981 13002 15565 
+ 12914 12976 13004 13010 15561 15563 
+ 12842 12891 12904 13008 13017 13055 
+ 12916 12924 12962 12977 13007 
+ 12871 12900 12915 12983 13009 13038 
+ 12797 12860 12905 13018 13030 13081 
+ 11028 11079 12178 13265 14023 14169 
+ 12912 12921 12956 12980 13097 
+ 12502 12675 12792 13059 13200 13230 
+ 12896 12955 12982 13033 13049 15559 
+ 12918 12936 12957 12993 13003 13021 
+ 12851 12904 12917 13017 13028 13073 
+ 12733 12736 12913 13032 13371 
+ 12914 12942 12964 12979 13010 13014 
+ 12924 12932 12966 13007 13023 15564 
+ 12939 12950 12984 12993 13019 13039 
+ 12942 12957 12976 13003 13014 
+ 12921 12935 12970 12991 13058 13097 
+ 12911 12963 13004 13034 15563 15565 
+ 12896 12903 12972 12998 13049 13051 
+ 12900 12928 12967 13002 13038 13047 
+ 12950 12951 12978 12991 13019 
+ 12849 12905 12922 13030 13040 13088 
+ 12731 12804 12892 13099 13120 13186 
+ 12861 12917 12925 13028 13035 13080 
+ 12934 12938 12989 12996 13020 13026 
+ 12938 12944 12988 12992 13020 13024 
+ 12821 12836 12948 13013 13071 13107 
+ 12935 12951 12980 12984 13019 13058 
+ 12944 12989 13024 13027 
+ 12936 12939 12973 12978 13021 13039 
+ 12863 12925 12930 13035 13042 13086 
+ 12920 12941 12953 13006 13036 13056 
+ 12934 12940 12988 13005 13026 13037 
+ 12858 12922 12929 13040 13044 13092 
+ 12903 12931 12982 13025 13051 13069 
+ 12668 12762 12952 13011 13158 13183 
+ 12862 12929 12930 13042 13044 13091 
+ 12817 12884 12895 13063 13078 13146 
+ 12928 12963 12983 13047 13050 15565 
+ 12957 12973 12979 13014 13021 13052 
+ 12964 12981 13010 13034 13048 15563 
+ 12940 12947 12996 13006 13037 13054 
+ 12941 12947 12995 13005 13054 13056 
+ 12962 12966 12977 13022 13023 13043 
+ 12891 12943 12965 13055 
+ 12915 12955 12967 13033 13038 13089 
+ 12964 12976 13004 13014 13048 13074 
+ 12511 12668 12792 12999 13183 13200 13295 
+ 12857 12937 12954 13076 13077 13125 
+ 12821 12828 12990 13053 13107 13141 
+ 12976 12979 13003 13010 13052 13074 
+ 12269 12600 12725 13210 13233 13367 
+ 12879 12948 12954 13071 13077 13121 
+ 12904 12965 12974 13055 13073 13104 
+ 12860 12937 12968 13076 13081 13130 
+ 12978 12984 12991 13039 13058 15567 
+ 12988 12989 13024 13026 13062 13065 
+ 12973 12993 13003 13039 13052 13083 
+ 12961 12962 13007 13036 13043 13064 
+ 12977 13007 13043 13079 15564 
+ 12989 12992 13020 13027 13065 13068 
+ 12931 12960 12998 13067 13069 13112 
+ 12988 12996 13020 13037 13062 13070 
+ 12992 13024 13068 13072 
+ 12917 12974 12987 13073 13080 13113 
+ 12803 12892 12949 13099 13143 13196 
+ 12905 12968 12985 13081 13088 13134 
+ 12781 12907 12927 13085 13128 13194 
+ 12736 12927 12975 13128 13371 
+ 12955 12972 13009 13049 13089 13114 
+ 12981 13004 13048 13066 13082 15565 
+ 12925 12987 12994 13080 13086 13127 
+ 12953 12961 12995 13022 13056 13064 13105 13106 
+ 12996 13005 13026 13054 13070 13084 
+ 12967 12983 13009 13047 13089 13115 
+ 12978 12993 13019 13021 13083 15567 
+ 12922 12985 12997 13088 13092 13139 
+ 12300 12317 12482 12887 12913 13371 13498 15543 
+ 12930 12994 13000 13086 13091 13133 
+ 13007 13022 13023 13064 13079 13100 
+ 12929 12997 13000 13091 13092 15568 
+ 12832 12923 12949 13060 13143 13203 
+ 12700 12889 13109 13154 13225 
+ 12983 13002 13038 13050 13108 13115 
+ 13004 13010 13034 13074 13082 13142 
+ 12972 12982 13033 13051 13114 13118 
+ 13002 13047 13066 13108 15565 
+ 12982 12998 13049 13069 13111 13118 
+ 13003 13014 13021 13074 13083 13124 
+ 12828 12933 13013 13123 13141 13180 
+ 13005 13006 13037 13056 13084 13093 13102 
+ 12965 13008 13017 13104 
+ 12995 13006 13036 13054 13093 13105 
+ 12581 12818 12889 13154 13172 13239 
+ 12980 12991 13019 13097 13156 15567 
+ 12675 12818 12971 13172 13230 13279 
+ 12919 12923 13045 13110 13185 13203 
+ 12909 12926 12959 13078 13096 13224 
+ 13020 13026 13065 13070 13087 13090 
+ 12884 12946 13001 13067 13146 13153 
+ 13022 13036 13043 13100 13106 
+ 13020 13024 13062 13068 13090 13095 
+ 13034 13050 13082 13108 13119 15565 
+ 12946 12960 13025 13063 13112 13153 13159 
+ 13024 13027 13065 13072 13095 13101 
+ 12998 13025 13051 13111 13112 
+ 13026 13037 13062 13084 13087 15566 
+ 12948 12990 13016 13107 13121 13160 
+ 13027 13068 13101 13103 
+ 12974 13017 13028 13104 13113 13144 
+ 13010 13014 13048 13052 13124 13142 
+ 11621 11680 11962 12643 13578 13616 13931 
+ 12937 13012 13018 13125 13130 13170 
+ 12954 13012 13016 13121 13125 13167 
+ 12895 12959 13001 13061 13146 13224 13247 
+ 13023 13043 13097 13100 13152 15564 
+ 12987 13028 13035 13113 13127 13155 
+ 12968 13018 13030 13130 13134 13175 
+ 13034 13048 13066 13119 13142 
+ 13021 13039 13052 13124 13151 15567 
+ 13037 13054 13070 13102 13116 15566 
+ 12850 12907 13031 13126 13194 13235 
+ 12994 13035 13042 13127 13133 13164 
+ 13062 13070 13090 13117 15566 
+ 12985 13030 13040 13134 13139 13178 
+ 13009 13033 13038 13114 13115 13176 
+ 13062 13065 13087 13095 13117 13129 
+ 13000 13042 13044 13133 13173 15568 
+ 12997 13040 13044 13139 13177 15568 
+ 13054 13056 13102 13105 13122 13131 
+ 12409 12725 12888 13233 13267 13370 
+ 13065 13068 13090 13101 13129 13132 
+ 12926 12958 13061 13126 13224 13261 
+ 12956 12970 12980 13058 13079 13152 13156 13214 15564 
+ 12910 12933 13110 13123 13202 13218 
+ 12892 12986 13029 13186 13196 13238 
+ 13043 13064 13079 13106 13149 13152 
+ 13068 13072 13095 13103 13132 13137 
+ 13054 13084 13093 13116 13122 13135 
+ 13072 13101 13137 13138 
+ 13017 13055 13073 13144 
+ 13036 13056 13093 13106 13131 13148 
+ 13036 13064 13100 13105 13148 13149 
+ 12990 13013 13071 13141 13160 13195 
+ 13047 13050 13066 13115 13119 13171 13187 
+ 12700 12759 13046 13166 13225 13297 
+ 12910 12919 13060 13098 13185 13218 
+ 13051 13069 13112 13118 13165 13181 
+ 13025 13067 13069 13111 13159 13165 
+ 13028 13073 13080 13144 13155 13182 
+ 13033 13049 13089 13118 13176 13189 
+ 13038 13047 13089 13108 13176 13187 
+ 13084 13102 13135 13140 13150 15566 
+ 13087 13090 13129 13140 13147 15566 
+ 13049 13051 13111 13114 13181 13189 
+ 13066 13082 13108 13142 13171 
+ 12804 12952 12986 13158 13186 13282 13292 
+ 13016 13071 13077 13160 13167 13204 
+ 13093 13102 13131 13135 13145 
+ 12933 13053 13098 13180 13202 13222 
+ 13052 13074 13083 13142 13151 13198 
+ 13012 13076 13077 13167 13170 13206 
+ 12850 12958 13085 13096 13235 13261 
+ 13035 13080 13086 13155 13164 13192 
+ 12927 13031 13032 13194 13371 13387 
+ 13090 13095 13117 13132 13147 13157 
+ 13018 13076 13081 13170 13175 13207 
+ 13093 13105 13122 13145 13148 13174 
+ 13095 13101 13129 13137 13157 13161 
+ 13042 13086 13091 13164 13173 13201 
+ 13030 13081 13088 13175 13178 13209 
+ 13102 13116 13122 13145 13150 13169 
+ 11951 12361 12643 13168 13616 13680 
+ 13101 13103 13132 13138 13161 13163 
+ 13103 13137 13162 13163 
+ 13040 13088 13092 13177 13178 13208 
+ 13116 13117 13147 13150 13179 15566 
+ 13013 13053 13107 13180 13195 13231 
+ 13048 13074 13082 13119 13124 13171 13198 13249 
+ 12949 13029 13045 13196 13203 13288 
+ 13073 13104 13113 13182 
+ 13122 13131 13135 13169 13174 
+ 13001 13063 13078 13153 13247 13259 
+ 13117 13129 13140 13157 13179 13184 
+ 13105 13106 13131 13149 13174 13199 
+ 13100 13106 13148 13152 13199 13215 
+ 13116 13135 13140 13169 13179 13197 
+ 13083 13124 13156 13198 13236 15567 
+ 13079 13097 13100 13149 13214 13215 
+ 13063 13067 13146 13159 13259 15569 
+ 12889 13046 13057 13225 13239 13291 
+ 13080 13113 13127 13182 13192 13219 
+ 13058 13097 13151 13214 13236 15567 
+ 13129 13132 13147 13161 13184 13188 
+ 12952 12999 13120 13183 13266 13292 
+ 13067 13112 13153 13165 13227 15569 
+ 13071 13107 13121 13195 13204 13240 
+ 13132 13137 13157 13163 13188 13190 
+ 13138 13163 13191 13193 
+ 13137 13138 13161 13162 13190 13193 
+ 13086 13127 13133 13192 13201 13229 
+ 13111 13112 13159 13181 13216 13227 
+ 12759 12888 13109 13267 13297 13390 
+ 13077 13121 13125 13204 13206 13243 
+ 12230 12361 12887 13136 13498 13680 
+ 13135 13145 13150 13174 13197 13228 
+ 13076 13125 13130 13206 13207 13245 
+ 13108 13119 13142 13187 13249 13251 
+ 12818 13057 13059 13239 13279 13323 
+ 13091 13133 13201 13205 13234 15568 
+ 13131 13145 13148 13169 13199 13228 
+ 13081 13130 13134 13207 13209 13246 
+ 13089 13114 13115 13187 13189 13237 13258 
+ 13092 13139 13205 13208 13241 15568 
+ 13088 13134 13139 13208 13209 13244 
+ 13140 13147 13150 13184 13197 13211 
+ 13053 13123 13141 13222 13231 13264 
+ 13111 13118 13165 13189 13216 13232 
+ 13113 13144 13155 13219 
+ 12999 13011 13158 13266 13295 13334 
+ 13147 13157 13179 13188 13211 13217 
+ 13060 13110 13203 13218 13290 13294 
+ 12986 13099 13120 13238 13282 13293 
+ 13108 13115 13171 13176 13251 13258 
+ 13157 13161 13184 13190 13217 13220 
+ 13114 13118 13176 13181 13232 13237 
+ 13161 13163 13188 13193 13220 13223 
+ 13162 13193 13221 13226 
+ 13127 13155 13164 13219 13229 13256 
+ 13162 13163 13190 13191 13223 13226 
+ 13031 13085 13128 13235 13352 13387 
+ 13107 13141 13160 13231 13240 13271 
+ 13029 13099 13143 13238 13288 13301 
+ 13150 13169 13179 13211 13228 13242 
+ 13124 13142 13151 13236 13249 13325 
+ 13148 13149 13174 13215 13228 13262 
+ 12792 12971 13011 13230 13295 13418 13433 
+ 13133 13164 13173 13229 13234 13263 
+ 13098 13123 13218 13222 13257 13270 
+ 13045 13060 13143 13185 13288 13294 13321 
+ 13121 13160 13167 13240 13243 13275 
+ 13173 13177 13234 13241 13268 15568 
+ 13125 13167 13170 13243 13245 13277 
+ 13130 13170 13175 13245 13246 13276 
+ 13139 13177 13178 13241 13244 13272 
+ 13134 13175 13178 13244 13246 13274 
+ 12600 12906 13015 13367 13401 13523 
+ 13179 13184 13197 13217 13242 13248 
+ 11037 11492 11903 13588 14084 14344 
+ 12331 12469 12906 13401 13437 13629 
+ 13097 13152 13156 13215 13236 13298 13350 
+ 13149 13152 13199 13214 13262 13298 
+ 13165 13181 13227 13232 13269 
+ 13184 13188 13211 13220 13248 13250 
+ 13098 13110 13185 13202 13257 13286 13290 
+ 13155 13182 13192 13256 
+ 13188 13190 13217 13223 13250 13252 
+ 13191 13226 13253 13255 
+ 13123 13180 13202 13264 13270 13300 
+ 13190 13193 13220 13226 13252 13254 
+ 13061 13078 13096 13247 13261 13356 13382 
+ 13046 13109 13154 13291 13297 13420 
+ 13191 13193 13221 13223 13254 13255 
+ 13159 13165 13216 13269 13310 15569 
+ 13169 13174 13197 13199 13242 13262 13287 
+ 13164 13192 13201 13256 13263 13289 
+ 12971 13059 13200 13279 13384 13433 
+ 13141 13180 13195 13264 13271 13305 
+ 13181 13189 13216 13237 13269 13285 
+ 12725 13015 13094 13367 13370 13484 
+ 13173 13201 13205 13263 13268 13296 
+ 13085 13126 13194 13261 13352 13358 
+ 13151 13156 13198 13214 13325 13350 
+ 13176 13189 13232 13258 13285 13299 
+ 13099 13186 13196 13293 13301 13345 
+ 13057 13154 13172 13291 13323 13330 
+ 13160 13195 13204 13271 13275 13309 
+ 13177 13205 13208 13268 13272 13302 
+ 13197 13211 13228 13248 13278 13287 
+ 13167 13204 13206 13275 13277 13313 
+ 13178 13208 13209 13272 13274 13306 
+ 13170 13206 13207 13276 13277 13312 
+ 13175 13207 13209 13274 13276 13308 
+ 13078 13146 13224 13259 13351 13356 
+ 13211 13217 13242 13250 13273 13278 
+ 13142 13171 13198 13251 13325 13346 
+ 13217 13220 13248 13252 13273 15570 
+ 13171 13187 13249 13258 13328 13346 
+ 13220 13223 13250 13254 13280 15570 
+ 13221 13255 13281 13284 
+ 13223 13226 13252 13255 13280 13283 
+ 13221 13226 13253 13254 13283 13284 
+ 13192 13219 13229 13289 
+ 13202 13218 13270 13286 13318 
+ 13176 13187 13237 13251 13299 13328 
+ 13146 13153 13247 13342 13351 15569 
+ 6562 6740 11299 14209 15024 15057 
+ 13096 13126 13224 13235 13358 13382 
+ 13199 13215 13228 13287 13298 15571 
+ 13201 13229 13234 13289 13296 13320 
+ 13180 13222 13231 13300 13305 13332 
+ 11028 11137 12969 13426 14169 14468 
+ 13158 13183 13292 13334 13378 
+ 12888 13094 13166 13370 13390 13475 
+ 13205 13234 13241 13296 13302 13324 
+ 13216 13227 13232 13285 13310 13357 
+ 13202 13222 13257 13300 13318 13338 
+ 13195 13231 13240 13305 13309 13337 
+ 13208 13241 13244 13302 13306 13329 
+ 13248 13250 13278 13303 13304 15570 
+ 13209 13244 13246 13306 13308 13331 
+ 13204 13240 13243 13309 13313 13340 
+ 13207 13245 13246 13308 13312 13336 
+ 13206 13243 13245 13312 13313 13339 
+ 13242 13248 13273 13287 13304 13319 
+ 13059 13172 13230 13323 13384 13424 
+ 13252 13254 13283 13307 13314 15570 
+ 13253 13284 13311 13316 
+ 13120 13186 13292 13293 13363 13386 
+ 13254 13255 13280 13284 13314 13317 
+ 13253 13255 13281 13283 13316 13317 
+ 13232 13237 13269 13299 13348 13357 
+ 13218 13257 13290 13318 13347 
+ 13228 13242 13262 13278 13319 13349 15571 
+ 13143 13196 13203 13301 13321 13385 13391 
+ 13229 13256 13263 13320 
+ 13185 13218 13286 13294 13347 13361 
+ 13154 13225 13239 13330 13420 13435 
+ 13120 13158 13266 13282 13378 13386 
+ 13186 13238 13282 13345 13360 13363 
+ 13185 13203 13290 13321 13361 13389 
+ 13011 13183 13200 13334 13418 13487 
+ 13234 13263 13268 13320 13324 13353 
+ 13109 13166 13225 13390 13420 13479 
+ 13214 13215 13262 13350 13393 15571 
+ 13237 13258 13285 13328 13348 13365 
+ 13222 13264 13270 13332 13338 13373 
+ 13196 13238 13288 13345 13385 13399 
+ 13241 13268 13272 13324 13329 13359 
+ 13273 13304 13307 13322 13326 15570 
+ 13273 13278 13303 13319 13322 13327 
+ 13231 13264 13271 13332 13337 13375 
+ 13244 13272 13274 13329 13331 13366 
+ 13280 13303 13314 13326 13333 15570 
+ 13246 13274 13276 13331 13336 13368 
+ 13240 13271 13275 13337 13340 13377 
+ 13227 13269 13342 13357 13445 15569 
+ 13281 13316 13335 13343 
+ 13245 13276 13277 13336 13339 13374 
+ 13243 13275 13277 13339 13340 13376 
+ 13280 13283 13307 13317 13333 13341 
+ 11578 11733 12876 13654 13684 14021 
+ 13281 13284 13311 13317 13343 13344 
+ 13283 13284 13314 13316 13341 13344 
+ 13257 13270 13286 13338 13347 13383 
+ 13278 13287 13304 13327 13349 13354 
+ 13263 13289 13296 13353 
+ 13203 13288 13294 13389 13391 13419 
+ 13303 13304 13326 13327 13355 
+ 13172 13239 13279 13330 13424 13432 
+ 13268 13296 13302 13353 13359 13392 
+ 13198 13236 13249 13346 13350 13423 13494 
+ 13303 13307 13322 13333 13355 13362 
+ 13304 13319 13322 13354 13355 13364 
+ 13251 13258 13299 13346 13365 13388 
+ 13272 13302 13306 13359 13366 13395 
+ 13239 13291 13323 13432 13435 
+ 13274 13306 13308 13366 13368 13396 
+ 13264 13300 13305 13373 13375 13406 
+ 13307 13314 13326 13341 13362 13372 
+ 13183 13266 13295 13378 13453 13487 
+ 13311 13343 13369 13379 
+ 13276 13308 13312 13368 13374 13400 
+ 13271 13305 13309 13375 13377 13407 
+ 13270 13300 13318 13373 13383 13410 
+ 13277 13312 13313 13374 13376 13404 
+ 13275 13309 13313 13376 13377 13405 
+ 13314 13317 13333 13344 13372 13380 
+ 13259 13310 13351 13445 13461 15569 
+ 13311 13316 13335 13344 13379 13381 
+ 13316 13317 13341 13343 13380 13381 
+ 13238 13293 13301 13360 13399 13417 
+ 13249 13251 13325 13328 13388 13423 
+ 13286 13290 13318 13361 13383 13411 
+ 13285 13299 13357 13365 13403 
+ 13287 13319 13354 13397 13408 15571 
+ 13214 13236 13298 13325 13393 13474 13494 
+ 13247 13259 13342 13356 13461 
+ 13194 13235 13358 13387 13610 
+ 13296 13320 13324 13392 
+ 13319 13327 13349 13364 13397 
+ 13322 13326 13327 13362 13364 13394 
+ 13224 13247 13351 13382 13461 13532 
+ 13269 13285 13310 13348 13403 13445 13459 
+ 13235 13261 13352 13382 13610 
+ 13302 13324 13329 13392 13395 13421 
+ 13293 13345 13363 13417 13422 
+ 13290 13294 13347 13389 13411 13430 
+ 13326 13333 13355 13372 13394 13398 
+ 13282 13293 13360 13386 13422 13444 
+ 13327 13354 13355 13394 13397 13413 
+ 13299 13328 13348 13388 13403 13428 
+ 13306 13329 13331 13395 13396 13425 
+ 13015 13210 13233 13484 13523 13604 
+ 13308 13331 13336 13396 13400 13429 
+ 13335 13379 13402 13412 
+ 13094 13233 13267 13475 13484 13557 
+ 12913 12975 13032 13041 13128 13387 13498 13811 
+ 13333 13341 13362 13380 13398 13409 
+ 13300 13332 13338 13406 13410 13441 
+ 13312 13336 13339 13400 13404 13431 
+ 13305 13332 13337 13406 13407 13439 
+ 13313 13339 13340 13404 13405 13436 
+ 13309 13337 13340 13405 13407 13438 
+ 13266 13292 13334 13386 13453 13456 
+ 13335 13343 13369 13381 13412 13416 
+ 13341 13344 13372 13381 13409 13415 
+ 13343 13344 13379 13380 13415 13416 
+ 13224 13261 13356 13358 13532 13610 
+ 13318 13338 13347 13410 13411 13443 
+ 13230 13279 13424 13433 13509 
+ 13288 13301 13391 13399 13446 13452 
+ 13282 13292 13363 13378 13444 13456 
+ 13128 13194 13352 13371 13610 13811 
+ 13328 13346 13365 13423 13428 
+ 13294 13321 13361 13419 13430 13455 
+ 13166 13267 13297 13475 13479 13537 
+ 13288 13321 13385 13419 13446 13457 
+ 13324 13353 13359 13421 
+ 13298 13350 13408 13466 13474 15571 
+ 13355 13362 13364 13398 13413 13427 
+ 13329 13359 13366 13421 13425 13451 
+ 13331 13366 13368 13425 13429 13454 
+ 13349 13354 13364 13408 13413 13450 13462 
+ 13362 13372 13394 13409 13427 13440 
+ 13301 13345 13385 13417 13452 13458 
+ 13336 13368 13374 13429 13431 13460 
+ 12906 13210 13213 13523 13629 13681 
+ 13369 13412 13434 13442 
+ 13348 13357 13365 13428 13459 13502 
+ 13339 13374 13376 13431 13436 13463 
+ 13340 13376 13377 13436 13438 13465 
+ 13332 13373 13375 13439 13441 13468 
+ 13337 13375 13377 13438 13439 13467 
+ 13349 13393 13397 13462 13466 15571 
+ 13372 13380 13398 13415 13440 13447 
+ 13338 13373 13383 13441 13443 13472 
+ 13347 13361 13383 13430 13443 13471 
+ 13369 13379 13402 13416 13442 13448 
+ 13364 13394 13397 13427 13450 
+ 10857 11227 11933 13426 14593 14738 
+ 13380 13381 13409 13416 13447 13449 
+ 13379 13381 13412 13415 13448 13449 
+ 13345 13360 13399 13422 13458 13470 
+ 13200 13295 13433 13487 13555 13558 
+ 13321 13389 13391 13455 13457 13485 
+ 13225 13291 13297 13435 13479 13561 13581 
+ 13359 13392 13395 13451 
+ 13360 13363 13417 13444 13470 13489 
+ 13325 13346 13388 13428 13494 13525 
+ 13279 13323 13384 13432 13509 13520 
+ 13366 13395 13396 13451 13454 13478 
+ 11137 11227 13265 13414 14468 14738 
+ 13394 13398 13413 13440 13450 13469 
+ 13365 13388 13403 13423 13502 13525 
+ 13368 13396 13400 13454 13460 13483 
+ 13361 13389 13411 13455 13471 13491 
+ 13374 13400 13404 13460 13463 13486 
+ 13323 13330 13424 13435 13520 13540 
+ 13200 13230 13384 13418 13509 13555 13583 
+ 13402 13442 13464 13473 
+ 13291 13330 13420 13432 13540 13581 
+ 13376 13404 13405 13463 13465 13488 
+ 12469 12876 13213 13629 13684 13854 
+ 13377 13405 13407 13465 13467 13490 
+ 13375 13406 13407 13467 13468 13493 
+ 13398 13409 13427 13447 13469 13476 
+ 13373 13406 13410 13468 13472 13495 
+ 13402 13412 13434 13448 13473 13477 
+ 13383 13410 13411 13471 13472 13496 
+ 13363 13386 13422 13456 13489 13506 
+ 13310 13342 13357 13459 13461 13552 13575 
+ 13385 13391 13452 13457 13482 13497 
+ 13409 13415 13440 13449 13476 13481 
+ 13412 13416 13442 13449 13477 13480 
+ 13415 13416 13447 13448 13480 13481 
+ 13397 13413 13427 13462 13469 13501 
+ 13395 13421 13425 13478 
+ 13385 13399 13446 13458 13482 13499 
+ 13334 13378 13456 13487 13524 13571 
+ 13396 13425 13429 13478 13483 13503 
+ 13389 13419 13430 13485 13491 13516 
+ 13378 13386 13444 13453 13506 13524 
+ 13391 13419 13446 13485 13497 13515 
+ 13399 13417 13452 13470 13499 13512 
+ 13357 13403 13445 13502 13552 
+ 13400 13429 13431 13483 13486 13507 
+ 13342 13351 13356 13445 13532 13575 
+ 13397 13408 13450 13466 13501 13550 
+ 13404 13431 13436 13486 13488 13513 
+ 13434 13473 13492 13500 
+ 13405 13436 13438 13488 13490 13514 
+ 13393 13408 13462 13474 13550 13607 
+ 13407 13438 13439 13490 13493 13517 
+ 13406 13439 13441 13493 13495 13519 
+ 13427 13440 13450 13476 13501 13505 
+ 13417 13422 13458 13489 13512 13527 
+ 13411 13430 13443 13491 13496 13518 
+ 13410 13441 13443 13495 13496 13522 
+ 13434 13442 13464 13477 13500 13504 
+ 13350 13393 13466 13494 13607 
+ 13267 13370 13390 13537 13557 13602 
+ 13440 13447 13469 13481 13505 13510 
+ 13442 13448 13473 13480 13504 13508 
+ 13425 13451 13454 13503 
+ 13297 13390 13420 13537 13561 13582 
+ 13448 13449 13477 13481 13508 13511 
+ 13447 13449 13476 13480 13510 13511 
+ 13446 13452 13497 13499 13526 
+ 13429 13454 13460 13503 13507 13529 
+ 13233 13367 13370 13557 13604 13674 
+ 13419 13455 13457 13515 13516 13538 
+ 13431 13460 13463 13507 13513 13530 
+ 13295 13334 13418 13453 13558 13571 13617 
+ 13436 13463 13465 13513 13514 13533 
+ 13422 13444 13470 13506 13527 13551 
+ 13438 13465 13467 13514 13517 13536 
+ 13430 13455 13471 13516 13518 13542 
+ 13464 13500 13521 13528 
+ 13439 13467 13468 13517 13519 13541 
+ 13325 13350 13423 13474 13525 13607 13699 
+ 13441 13468 13472 13519 13522 13545 
+ 13443 13471 13472 13518 13522 13546 
+ 13446 13457 13482 13515 13526 13548 
+ 12887 13041 13168 13371 13680 13811 14098 
+ 13452 13458 13482 13512 13526 13549 
+ 13464 13473 13492 13504 13528 13531 
+ 13450 13462 13469 13505 13550 13564 
+ 13403 13428 13459 13525 13552 13635 
+ 13454 13478 13483 13529 
+ 13473 13477 13500 13508 13531 13534 
+ 13469 13476 13501 13510 13543 13564 
+ 13444 13456 13489 13524 13551 13580 
+ 13460 13483 13486 13529 13530 13553 
+ 13477 13480 13504 13511 13534 13539 
+ 13384 13424 13433 13520 13583 13600 13605 
+ 13476 13481 13505 13511 13543 13544 
+ 13480 13481 13508 13510 13539 13544 
+ 13458 13470 13499 13527 13549 13562 
+ 13463 13486 13488 13530 13533 13556 
+ 13465 13488 13490 13533 13536 13560 
+ 13457 13485 13497 13538 13548 13570 
+ 13455 13485 13491 13538 13542 13566 
+ 13467 13490 13493 13536 13541 13563 
+ 13471 13491 13496 13542 13546 13568 
+ 13468 13493 13495 13541 13545 13565 
+ 13424 13432 13509 13540 13587 13600 
+ 13492 13528 13547 13554 
+ 13472 13495 13496 13545 13546 13569 
+ 13210 13367 13401 13604 13681 13731 
+ 13453 13456 13506 13571 13580 13614 
+ 13423 13428 13494 13502 13635 13699 
+ 13482 13497 13499 13548 13549 13574 
+ 13470 13489 13512 13551 13562 13586 
+ 13492 13500 13521 13531 13554 13559 
+ 13483 13503 13507 13553 
+ 13486 13507 13513 13553 13556 13579 
+ 13500 13504 13528 13534 13559 13567 
+ 13356 13382 13461 13575 13610 13709 
+ 13488 13513 13514 13556 13560 13585 
+ 13504 13508 13531 13539 13567 13572 
+ 8355 10635 13856 14090 14887 14914 
+ 13490 13514 13517 13560 13563 13589 
+ 13390 13475 13479 13582 13602 13657 
+ 13485 13515 13516 13566 13570 13595 
+ 13508 13511 13534 13544 13572 13576 
+ 13432 13435 13520 13581 13587 13641 
+ 13493 13517 13519 13563 13565 13590 
+ 13491 13516 13518 13566 13568 13594 
+ 13505 13510 13544 13564 13577 
+ 13510 13511 13539 13543 13576 13577 
+ 13495 13519 13522 13565 13569 13592 
+ 13496 13518 13522 13568 13569 13593 
+ 13521 13554 13573 13584 
+ 13497 13515 13526 13570 13574 13597 
+ 13499 13512 13526 13562 13574 13596 
+ 13462 13466 13501 13564 13607 13663 
+ 13489 13506 13527 13580 13586 13611 
+ 13445 13459 13502 13575 13635 13706 
+ 13507 13529 13530 13579 
+ 13521 13528 13547 13559 13584 13591 
+ 13418 13433 13558 13583 13648 13651 
+ 13513 13530 13533 13579 13585 13603 
+ 13370 13475 13484 13602 13674 13748 
+ 13418 13487 13555 13617 13648 13683 
+ 13528 13531 13554 13567 13591 13598 
+ 13514 13533 13536 13585 13589 13609 
+ 13420 13479 13581 13582 13676 13687 
+ 13512 13527 13549 13586 13596 13619 
+ 13517 13536 13541 13589 13590 13615 
+ 13501 13505 13543 13550 13577 13663 
+ 13519 13541 13545 13590 13592 13618 
+ 13516 13538 13542 13594 13595 13622 
+ 13531 13534 13559 13572 13598 13601 
+ 13518 13542 13546 13593 13594 13621 
+ 13522 13545 13546 13592 13593 13620 
+ 13515 13538 13548 13595 13597 13623 
+ 13453 13487 13524 13614 13617 13647 13653 
+ 13534 13539 13567 13576 13601 13606 
+ 13547 13584 13599 13613 
+ 13526 13548 13549 13596 13597 13625 
+ 13445 13461 13532 13552 13706 13709 
+ 13539 13544 13572 13577 13606 13612 
+ 13543 13544 13564 13576 13612 13663 
+ 11962 12320 13075 13730 13931 14292 
+ 13530 13553 13556 13603 
+ 13506 13524 13551 13611 13614 13637 
+ 13420 13435 13540 13561 13641 13676 13696 
+ 13479 13537 13561 13657 13687 
+ 13433 13509 13555 13605 13651 13666 
+ 13547 13554 13573 13591 13613 13624 
+ 13533 13556 13560 13603 13609 13628 
+ 13527 13551 13562 13611 13619 13636 
+ 13520 13540 13600 13641 13655 
+ 11492 11859 13212 13730 14344 14483 
+ 13536 13560 13563 13609 13615 13631 
+ 13541 13563 13565 13615 13618 13632 
+ 13554 13559 13584 13598 13624 13627 
+ 13545 13565 13569 13618 13620 13638 
+ 13546 13568 13569 13620 13621 13640 
+ 13542 13566 13568 13621 13622 13642 
+ 13538 13566 13570 13622 13623 13643 
+ 13549 13562 13574 13619 13625 13644 
+ 13548 13570 13574 13623 13625 13645 
+ 13559 13567 13591 13601 13627 13630 
+ 13573 13613 13626 13634 
+ 13509 13520 13587 13605 13655 13660 
+ 13567 13572 13598 13606 13630 13633 
+ 13475 13537 13557 13657 13732 13748 
+ 13556 13579 13585 13628 
+ 13367 13484 13523 13674 13731 13776 
+ 13509 13583 13600 13660 13666 
+ 13572 13576 13601 13612 13633 13639 
+ 13466 13474 13494 13550 13663 13699 13791 
+ 410 5091 7666 14718 15121 15144 
+ 13560 13585 13589 13628 13631 13650 
+ 13352 13358 13382 13387 13532 13709 13811 13885 
+ 13551 13580 13586 13636 13637 13659 
+ 13576 13577 13606 13639 13663 13677 
+ 13573 13584 13599 13624 13634 13646 
+ 13524 13571 13580 13637 13647 13671 
+ 13563 13589 13590 13631 13632 13656 
+ 12643 13075 13136 13680 13931 14161 
+ 13487 13558 13571 13653 13683 13700 
+ 13565 13590 13592 13632 13638 13658 
+ 13562 13586 13596 13636 13644 13667 
+ 13569 13592 13593 13638 13640 13661 
+ 13568 13593 13594 13640 13642 13665 
+ 13566 13594 13595 13642 13643 13668 
+ 13570 13595 13597 13643 13645 13669 
+ 13584 13591 13613 13627 13646 13652 
+ 13574 13596 13597 13644 13645 13670 
+ 13599 13634 13649 13664 
+ 13591 13598 13624 13630 13652 13662 
+ 13585 13603 13609 13650 
+ 13213 13401 13437 13681 13854 13876 
+ 13598 13601 13627 13633 13662 13672 
+ 13589 13609 13615 13650 13656 13679 
+ 13590 13615 13618 13656 13658 13682 
+ 13601 13606 13630 13639 13672 13673 
+ 13599 13613 13626 13646 13664 13675 
+ 13502 13525 13552 13699 13706 13832 
+ 13586 13611 13619 13659 13667 13690 
+ 13580 13611 13614 13659 13671 13689 
+ 13592 13618 13620 13658 13661 13685 
+ 13606 13612 13633 13673 13677 
+ 13593 13620 13621 13661 13665 13688 
+ 13540 13581 13587 13655 13696 13744 
+ 13594 13621 13622 13665 13668 13691 
+ 13595 13622 13623 13668 13669 13693 
+ 13596 13619 13625 13667 13670 13692 
+ 13597 13623 13625 13669 13670 13694 
+ 13613 13624 13634 13652 13675 13686 
+ 13571 13614 13653 13671 13697 13708 
+ 13555 13558 13651 13683 13723 13740 
+ 13626 13664 13678 13695 
+ 13609 13628 13631 13679 
+ 13555 13583 13648 13666 13723 13726 
+ 13624 13627 13646 13662 13686 13698 
+ 13571 13617 13647 13700 13708 13725 
+ 11733 12178 13315 14021 14023 14374 
+ 13587 13600 13641 13660 13722 13744 
+ 13615 13631 13632 13679 13682 13702 
+ 13537 13582 13602 13687 13732 13759 
+ 13618 13632 13638 13682 13685 13707 
+ 13611 13636 13637 13689 13690 13712 
+ 13600 13605 13655 13666 13720 13722 
+ 13620 13638 13640 13685 13688 13710 
+ 13627 13630 13652 13672 13698 13701 
+ 13550 13564 13577 13607 13612 13677 13766 13791 
+ 13626 13634 13649 13675 13695 13703 
+ 13621 13640 13642 13688 13691 13711 
+ 13583 13605 13651 13660 13720 13726 
+ 13619 13636 13644 13690 13692 13714 
+ 13622 13642 13643 13691 13693 13713 
+ 13623 13643 13645 13693 13694 13715 
+ 13625 13644 13645 13692 13694 13716 
+ 13614 13637 13647 13689 13697 13718 
+ 13630 13633 13662 13673 13701 13705 
+ 13633 13639 13672 13677 13705 13736 
+ 13484 13557 13604 13748 13776 13823 
+ 13634 13646 13664 13686 13703 13717 
+ 13561 13581 13687 13696 13773 13777 
+ 13612 13639 13663 13673 13736 13766 
+ 13649 13695 13704 13719 
+ 13631 13650 13656 13702 
+ 13136 13168 13498 13616 14098 14161 
+ 13401 13523 13629 13731 13876 13897 
+ 13632 13656 13658 13702 13707 13724 
+ 13558 13617 13648 13700 13740 13770 
+ 12876 13315 13437 13854 14021 14159 
+ 13638 13658 13661 13707 13710 13728 
+ 13646 13652 13675 13698 13717 13721 
+ 13561 13582 13657 13676 13759 13777 
+ 13640 13661 13665 13710 13711 13733 
+ 13637 13659 13671 13712 13718 13737 
+ 13636 13659 13667 13712 13714 13738 
+ 13642 13665 13668 13711 13713 13735 
+ 13644 13667 13670 13714 13716 13741 
+ 13643 13668 13669 13713 13715 13739 
+ 13645 13669 13670 13715 13716 13742 
+ 13649 13664 13678 13703 13719 13729 
+ 13581 13641 13676 13744 13773 13793 
+ 13647 13671 13708 13718 13743 
+ 13652 13662 13686 13701 13721 13734 
+ 13494 13525 13607 13635 13791 13832 13945 
+ 13617 13653 13683 13725 13767 13770 
+ 13662 13672 13698 13705 13734 13745 
+ 13656 13679 13682 13724 
+ 13664 13675 13695 13717 13729 13746 
+ 13678 13719 13727 13747 
+ 13672 13673 13701 13736 13745 
+ 13552 13575 13635 13709 13832 13902 
+ 13658 13682 13685 13724 13728 13749 
+ 13647 13653 13697 13725 13743 13758 
+ 13532 13575 13610 13706 13885 13902 
+ 13661 13685 13688 13728 13733 13753 
+ 13665 13688 13691 13733 13735 13755 
+ 13659 13689 13690 13737 13738 13760 
+ 13668 13691 13693 13735 13739 13757 
+ 13667 13690 13692 13738 13741 13762 
+ 13669 13693 13694 13739 13742 13761 
+ 13670 13692 13694 13741 13742 13763 
+ 13675 13686 13703 13721 13746 13751 
+ 13671 13689 13697 13737 13743 13764 
+ 13678 13695 13704 13729 13747 13756 
+ 13660 13666 13722 13726 13779 13788 
+ 13686 13698 13717 13734 13751 13765 
+ 13655 13660 13720 13744 13774 13788 
+ 13648 13651 13726 13740 13794 13798 
+ 13682 13702 13707 13749 
+ 13653 13700 13708 13758 13767 13778 
+ 13651 13666 13720 13723 13779 13794 
+ 13704 13747 13754 13769 
+ 13685 13707 13710 13749 13753 13772 
+ 13695 13703 13719 13746 13756 13768 
+ 11859 12320 13578 13588 14292 14483 
+ 13523 13604 13681 13776 13897 13917 
+ 13602 13657 13748 13759 13829 13850 
+ 13688 13710 13711 13753 13755 13775 
+ 13698 13701 13721 13745 13765 13771 
+ 13691 13711 13713 13755 13757 13780 
+ 13673 13677 13705 13745 13766 13862 
+ 13689 13712 13718 13760 13764 13784 
+ 13690 13712 13714 13760 13762 13785 
+ 13693 13713 13715 13757 13761 13782 
+ 13648 13683 13723 13770 13798 13808 
+ 13692 13714 13716 13762 13763 13787 
+ 13694 13715 13716 13761 13763 13786 
+ 13697 13708 13718 13758 13764 13789 
+ 13641 13655 13696 13722 13774 13793 13812 
+ 13701 13705 13734 13736 13771 13862 
+ 13703 13717 13729 13751 13768 13783 
+ 13704 13719 13727 13756 13769 13790 
+ 13557 13602 13674 13732 13823 13850 13894 
+ 13707 13724 13728 13772 
+ 7436 7933 8232 14308 14955 15001 
+ 13717 13721 13746 13765 13783 13792 
+ 10539 11903 14084 14768 15544 15601 
+ 13710 13728 13733 13772 13775 13797 
+ 13727 13769 13781 13795 
+ 13711 13733 13735 13775 13780 13799 
+ 13719 13729 13747 13768 13790 13796 
+ 13713 13735 13739 13780 13782 13801 
+ 13708 13725 13743 13778 13789 13807 
+ 13657 13687 13732 13777 13829 13840 
+ 13712 13737 13738 13784 13785 13803 
+ 13715 13739 13742 13782 13786 13802 
+ 13714 13738 13741 13785 13787 13804 
+ 13716 13741 13742 13786 13787 15572 
+ 13718 13737 13743 13784 13789 13805 
+ 13721 13734 13751 13771 13792 13800 
+ 13663 13677 13736 13791 13862 14018 
+ 13700 13725 13770 13778 13818 13826 
+ 13729 13746 13756 13783 13796 13809 
+ 13727 13747 13754 13790 13795 13810 
+ 13683 13700 13740 13767 13808 13826 13836 
+ 13734 13745 13765 13800 13862 
+ 13728 13749 13753 13797 
+ 13676 13696 13777 13793 13857 13858 
+ 13722 13744 13788 13812 13837 
+ 13733 13753 13755 13797 13799 13816 
+ 13604 13674 13731 13823 13917 13928 
+ 13676 13687 13759 13773 13840 13858 
+ 13725 13758 13767 13807 13813 13818 
+ 13720 13726 13788 13794 13830 13833 
+ 13735 13755 13757 13799 13801 13817 
+ 13754 13795 13806 13815 
+ 13739 13757 13761 13801 13802 13820 
+ 13746 13751 13768 13792 13809 13814 
+ 13737 13760 13764 13803 13805 13822 
+ 13738 13760 13762 13803 13804 13824 
+ 13742 13761 13763 13802 15572 15573 
+ 13741 13762 13763 13804 13825 15572 
+ 13720 13722 13774 13779 13833 13837 
+ 13743 13758 13764 13805 13807 13821 
+ 13747 13756 13769 13796 13810 13819 
+ 13607 13663 13699 13766 13945 14018 
+ 13751 13765 13783 13800 13814 13828 
+ 13696 13744 13773 13812 13857 13889 
+ 13723 13726 13779 13798 13830 13835 13859 
+ 13754 13769 13781 13810 13815 13831 
+ 13756 13768 13790 13809 13819 13834 
+ 13753 13772 13775 13816 
+ 13723 13740 13794 13808 13835 13849 
+ 13755 13775 13780 13816 13817 13839 
+ 13765 13771 13792 13828 13862 
+ 13757 13780 13782 13817 13820 13842 
+ 13761 13782 13786 13820 13844 15573 
+ 13760 13784 13785 13822 13824 13845 
+ 13762 13785 13787 13824 13825 13847 
+ 13764 13784 13789 13821 13822 13843 
+ 13781 13815 13827 13841 
+ 13758 13778 13789 13813 13821 13838 
+ 13740 13770 13798 13836 13849 13866 
+ 13768 13783 13796 13814 13834 13848 
+ 13769 13790 13795 13819 13831 13851 
+ 13371 13387 13498 13610 13885 14098 14198 
+ 13744 13774 13793 13837 13882 13889 
+ 13778 13807 13818 13838 13853 
+ 13783 13792 13809 13828 13848 13855 
+ 13781 13795 13806 13831 13841 13860 
+ 13775 13797 13799 13839 
+ 13780 13799 13801 13839 13842 13865 
+ 13767 13778 13813 13826 13853 13861 
+ 13790 13796 13810 13834 13851 13864 
+ 13782 13801 13802 13842 13844 13867 
+ 13789 13805 13807 13838 13843 13863 
+ 13784 13803 13805 13843 13845 13868 
+ 13674 13748 13776 13894 13928 13954 
+ 13785 13803 13804 13845 13847 13870 
+ 13787 13804 13846 13847 13871 15572 
+ 13767 13770 13818 13836 13861 13877 
+ 13806 13841 13852 13872 
+ 13792 13800 13814 13855 13862 13881 
+ 13732 13759 13840 13850 13916 13939 
+ 13779 13794 13833 13859 13873 13883 
+ 13795 13810 13815 13851 13860 13875 
+ 13635 13699 13706 13902 13945 14079 
+ 13779 13788 13830 13837 13883 13899 
+ 13796 13809 13819 13848 13864 13878 
+ 13794 13798 13849 13859 13880 
+ 13770 13808 13826 13866 13877 13904 
+ 13774 13788 13812 13833 13882 13899 
+ 13807 13813 13821 13853 13863 13879 
+ 13799 13816 13817 13865 
+ 13759 13777 13829 13858 13916 13922 
+ 13806 13815 13827 13860 13872 13884 
+ 13801 13817 13820 13865 13867 13888 
+ 13805 13821 13822 13863 13868 13886 
+ 13802 13820 13867 13869 13890 15573 
+ 13803 13822 13824 13868 13870 13891 
+ 13825 13869 13871 13892 15572 15573 
+ 13804 13824 13825 13870 13871 13893 
+ 13809 13814 13834 13855 13878 13887 
+ 13798 13808 13835 13866 13880 13903 
+ 13732 13748 13829 13894 13939 13960 
+ 13810 13819 13831 13864 13875 13895 
+ 13827 13872 13874 13898 
+ 13813 13818 13838 13861 13879 13896 
+ 13437 13629 13684 13876 14103 14159 
+ 13814 13828 13848 13881 13887 13900 
+ 6996 8355 13535 14069 14909 14914 
+ 13773 13793 13858 13889 13933 13943 
+ 13773 13777 13840 13857 13922 13933 
+ 13794 13830 13835 13873 13880 13905 
+ 13815 13831 13841 13875 13884 13906 
+ 13818 13826 13853 13877 13896 13910 
+ 13736 13745 13766 13771 13800 13828 13881 13993 14018 
+ 13821 13838 13843 13879 13886 13907 
+ 13819 13834 13851 13878 13895 13908 
+ 13817 13839 13842 13888 
+ 13808 13836 13849 13903 13904 13927 
+ 13820 13842 13844 13888 13890 13911 
+ 13822 13843 13845 13886 13891 13909 
+ 13844 13846 13890 13892 13913 15573 
+ 13824 13845 13847 13891 13893 13914 
+ 13825 13846 13847 13892 13893 13915 
+ 13827 13841 13852 13884 13898 13912 
+ 13830 13859 13883 13905 13921 
+ 13852 13898 13901 13918 
+ 13831 13851 13860 13895 13906 13919 
+ 13629 13681 13854 13897 14024 14103 
+ 13826 13836 13861 13904 13910 13932 
+ 13834 13848 13864 13887 13908 13920 
+ 13838 13853 13863 13896 13907 13923 
+ 13835 13849 13859 13903 13905 13925 
+ 13828 13855 13862 13900 13993 
+ 13812 13837 13889 13899 13951 13952 
+ 13830 13833 13873 13899 13921 13940 
+ 13841 13860 13872 13906 13912 13929 
+ 13610 13709 13811 13902 14162 14198 
+ 13843 13863 13868 13907 13909 13930 
+ 13848 13855 13878 13900 13920 13926 
+ 13842 13865 13867 13911 
+ 13793 13812 13857 13882 13943 13952 13970 
+ 13844 13867 13869 13911 13913 13934 
+ 13845 13868 13870 13909 13914 13935 
+ 13846 13869 13871 13913 13915 13936 
+ 13847 13870 13871 13914 13915 13937 
+ 13748 13823 13850 13954 13960 13999 
+ 13851 13864 13875 13908 13919 13938 
+ 13853 13861 13879 13910 13923 13942 
+ 13681 13731 13876 13917 14024 14036 
+ 13852 13872 13874 13912 13918 13941 
+ 13833 13837 13882 13883 13940 13947 13951 
+ 13855 13881 13887 13926 13993 
+ 13874 13918 13924 13944 
+ 13706 13709 13832 13885 14079 14162 
+ 13849 13866 13880 13925 13927 13949 
+ 13836 13866 13877 13927 13932 13955 
+ 13859 13873 13880 13921 13925 13946 
+ 13860 13875 13884 13919 13929 15575 
+ 13863 13879 13886 13923 13930 13948 
+ 13864 13878 13895 13920 13938 13950 
+ 13868 13886 13891 13930 13935 13953 
+ 13861 13877 13896 13932 13942 13962 
+ 13867 13888 13890 13934 
+ 13872 13884 13898 13929 13941 13956 
+ 13869 13890 13892 13934 13936 13957 
+ 13870 13891 13893 13935 13937 13958 
+ 13871 13892 13893 13936 13937 13959 
+ 13829 13840 13922 13939 13981 14013 
+ 13731 13776 13897 13928 14036 14058 
+ 13874 13898 13901 13941 13944 13963 
+ 13875 13895 13906 13938 13964 15575 
+ 13878 13887 13908 13926 13950 13961 
+ 13873 13883 13905 13940 13946 13966 
+ 13840 13858 13916 13933 13981 13983 
+ 13879 13896 13907 13942 13948 13968 
+ 13901 13944 13967 15574 
+ 13880 13903 13905 13946 13949 13971 
+ 13887 13900 13920 13961 13993 
+ 13866 13903 13904 13949 13955 13974 
+ 13776 13823 13917 13954 14043 14058 
+ 13884 13906 13912 13956 13972 15575 
+ 13886 13907 13909 13948 13953 13973 
+ 13075 13578 13616 14161 14292 14569 
+ 13877 13904 13910 13955 13962 13982 
+ 13857 13858 13922 13943 13983 13992 
+ 13890 13911 13913 13957 
+ 13891 13909 13914 13953 13958 13975 
+ 13892 13913 13915 13957 13959 13976 
+ 13893 13914 13915 13958 13959 13977 
+ 13895 13908 13919 13950 13964 13978 
+ 13829 13850 13916 13960 14013 14015 
+ 13883 13899 13921 13947 13966 13979 
+ 13898 13912 13918 13956 13963 13980 
+ 13896 13910 13923 13962 13968 13985 
+ 13857 13889 13933 13970 13992 14003 
+ 13901 13918 13924 13963 13967 13984 
+ 13699 13791 13832 14018 14079 14220 
+ 13905 13921 13925 13966 13971 13988 
+ 13899 13940 13951 13979 13990 
+ 13907 13923 13930 13968 13973 13991 
+ 13903 13925 13927 13971 13974 13994 
+ 13908 13920 13938 13961 13978 14132 
+ 13882 13899 13947 13952 13990 14000 
+ 13882 13889 13951 13970 14000 14011 
+ 13909 13930 13935 13973 13975 13996 
+ 13823 13894 13928 13999 14028 14043 
+ 13904 13927 13932 13974 13982 13998 
+ 13912 13929 13941 13972 13980 13995 
+ 13913 13934 13936 13976 
+ 13914 13935 13937 13975 13977 13997 
+ 13915 13936 13937 13976 13977 15576 
+ 13850 13894 13939 13999 14015 14051 
+ 13920 13926 13950 13993 14132 
+ 13910 13932 13942 13982 13985 14005 
+ 13918 13941 13944 13980 13984 14001 
+ 13919 13938 13978 13986 14002 15575 
+ 10752 12039 12141 14823 14913 14968 
+ 13921 13940 13946 13979 13988 14004 
+ 13924 13944 13984 13987 14006 15574 
+ 13923 13942 13948 13985 13991 14009 
+ 13987 13989 14008 15574 
+ 13889 13943 13952 14003 14011 14032 
+ 13925 13946 13949 13988 13994 14012 
+ 13929 13956 13986 13995 14010 15575 
+ 13930 13948 13953 13991 13996 14014 
+ 13927 13949 13955 13994 13998 14020 
+ 13935 13953 13958 13996 13997 14016 
+ 13936 13957 13959 15576 
+ 13937 13958 13959 13997 14017 15576 
+ 13938 13950 13964 14002 14132 
+ 13940 13947 13966 13990 14004 14022 
+ 13941 13956 13963 13995 14001 14019 
+ 13916 13922 13983 14013 14054 15577 
+ 13932 13955 13962 13998 14005 14026 
+ 13922 13933 13981 13992 14031 15577 
+ 13944 13963 13967 14001 14006 14025 
+ 13942 13962 13968 14005 14009 14034 
+ 13964 13972 14002 14010 14027 15575 
+ 13967 13969 14006 14008 14030 15574 
+ 13946 13966 13971 14004 14012 14035 
+ 13969 14007 14008 14033 
+ 13947 13951 13979 14000 14022 15578 
+ 13948 13968 13973 14009 14014 14037 
+ 13933 13943 13983 14003 14031 14042 
+ 13862 13881 13900 13926 13961 14018 14132 14288 
+ 13949 13971 13974 14012 14020 14041 
+ 13956 13972 13980 14010 14019 14038 
+ 13953 13973 13975 14014 14016 14039 
+ 13958 13975 13977 14016 14017 14040 
+ 13955 13974 13982 14020 14026 14045 
+ 13894 13954 13960 14028 14051 14076 
+ 13951 13952 13990 14011 14047 15578 
+ 13963 13980 13984 14019 14025 14044 
+ 13964 13978 13986 14027 14132 
+ 13943 13970 13992 14032 14042 14057 
+ 13966 13979 13988 14022 14035 14049 
+ 13962 13982 13985 14026 14034 14050 
+ 13967 13984 13987 14025 14030 14048 
+ 13989 14029 14033 14052 
+ 13969 13987 13989 14030 14033 14053 
+ 13968 13985 13991 14034 14037 14056 
+ 13972 13986 13995 14027 14038 14055 
+ 13952 13970 14000 14032 14047 14064 
+ 13971 13988 13994 14035 14041 14060 
+ 13916 13939 13981 14015 14054 14072 14092 
+ 13973 13991 13996 14037 14039 14059 
+ 13939 13960 14013 14051 14072 14106 
+ 13975 13996 13997 14039 14040 14061 
+ 13977 13997 14040 15576 
+ 13766 13791 13862 13945 13993 14220 14288 
+ 13980 13995 14001 14038 14044 14062 
+ 13974 13994 13998 14041 14045 14065 
+ 13315 13654 13684 14159 14374 14433 
+ 13979 13990 14004 14049 14063 15578 
+ 12178 12969 13654 14169 14374 14725 14744 
+ 13876 13897 14036 14103 14150 14202 
+ 13984 14001 14006 14044 14048 14068 
+ 13982 13998 14005 14045 14050 14071 
+ 13986 14002 14010 14055 14132 
+ 13954 13999 14043 14076 14095 
+ 14007 14046 14052 14070 
+ 13987 14006 14008 14048 14053 14073 
+ 13983 13992 14042 14067 14075 15577 
+ 13970 14003 14011 14057 14064 14091 
+ 13989 14007 14008 14052 14053 14074 
+ 13985 14005 14009 14050 14056 14077 
+ 13988 14004 14012 14049 14060 14078 
+ 13897 13917 14024 14058 14150 14158 
+ 13991 14009 14014 14056 14059 14081 
+ 13995 14010 14019 14055 14062 14080 
+ 13996 14014 14016 14059 14061 14083 
+ 13997 14016 14017 14061 
+ 13994 14012 14020 14060 14065 14087 
+ 13992 14003 14031 14057 14067 14088 
+ 13928 13954 14028 14058 14095 14140 
+ 14001 14019 14025 14062 14068 14089 
+ 13998 14020 14026 14065 14071 14094 
+ 14029 14066 14070 14093 
+ 14000 14011 14064 14082 14102 15578 
+ 14006 14025 14030 14068 14073 14096 
+ 14004 14022 14035 14063 14078 14097 
+ 14005 14026 14034 14071 14077 14101 
+ 13960 13999 14015 14076 14106 14128 
+ 14007 14029 14033 14070 14074 14099 
+ 14008 14030 14033 14073 14074 14100 
+ 13981 14013 14085 14092 14108 15577 
+ 14010 14027 14038 14080 14132 14143 
+ 14009 14034 14037 14077 14081 14104 
+ 14003 14032 14042 14088 14091 14116 
+ 13917 13928 14036 14043 14140 14158 14189 
+ 14014 14037 14039 14081 14083 14107 
+ 14012 14035 14041 14078 14087 14110 
+ 14016 14039 14040 14083 
+ 14019 14038 14044 14080 14089 14109 
+ 14022 14049 14082 14097 14114 15578 
+ 14011 14032 14047 14091 14102 14123 
+ 14020 14041 14045 14087 14094 14115 
+ 14046 14086 14093 14112 
+ 14031 14042 14075 14088 14111 
+ 14025 14044 14048 14089 14096 14113 
+ 6996 8429 13856 14909 14963 14979 
+ 14029 14046 14052 14093 14099 14117 
+ 14026 14045 14050 14094 14101 14120 
+ 14013 14015 14092 14106 14119 14137 
+ 14030 14048 14053 14096 14100 14118 
+ 14033 14052 14053 14099 14100 14122 
+ 14031 14067 14085 14111 14124 15577 
+ 13999 14028 14051 14095 14128 14145 
+ 14034 14050 14056 14101 14104 14125 
+ 14035 14049 14060 14097 14110 14126 
+ 13832 13902 13945 14162 14220 14360 
+ 14038 14055 14062 14109 14143 
+ 14037 14056 14059 14104 14107 14127 
+ 14047 14063 14102 14114 14131 15578 
+ 14039 14059 14061 14107 
+ 11903 13212 13752 14344 14768 14883 
+ 14054 14075 14108 14124 14135 15577 
+ 14066 14105 14112 14129 
+ 14041 14060 14065 14110 14115 14134 
+ 14042 14057 14067 14111 14116 14136 
+ 14044 14062 14068 14109 14113 14130 
+ 10635 11933 13535 14593 14887 14951 
+ 14032 14057 14064 14116 14123 14146 
+ 14013 14054 14072 14108 14119 14133 
+ 14046 14066 14070 14112 14117 14138 
+ 14045 14065 14071 14115 14120 14142 
+ 14028 14043 14076 14140 14145 14179 
+ 14048 14068 14073 14113 14118 14141 
+ 14049 14063 14078 14114 14126 14147 
+ 13498 13680 13811 14161 14198 14599 14674 
+ 14052 14070 14074 14117 14122 14144 
+ 14053 14073 14074 14118 14122 15580 
+ 14050 14071 14077 14120 14125 14148 
+ 14047 14064 14082 14123 14131 14154 
+ 13854 13876 14024 14159 14202 14376 
+ 14056 14077 14081 14125 14127 14151 
+ 14086 14121 14129 14149 
+ 14015 14051 14072 14128 14137 14176 
+ 14059 14081 14083 14127 
+ 14054 14085 14092 14133 14135 14153 
+ 14062 14080 14089 14130 14143 14221 
+ 14060 14078 14087 14126 14134 14156 
+ 14067 14075 14088 14124 14136 14152 
+ 14066 14086 14093 14129 14138 14157 
+ 14068 14089 14096 14130 14141 14160 
+ 14063 14082 14097 14131 14147 14165 
+ 14065 14087 14094 14134 14142 14163 
+ 14057 14088 14091 14136 14146 14164 
+ 14070 14093 14099 14138 14144 15581 
+ 14073 14096 14100 14141 14166 15580 
+ 14072 14092 14133 14137 14167 
+ 14071 14094 14101 14142 14148 14170 
+ 14105 14139 14149 15582 
+ 14074 14099 14100 14144 14171 15580 
+ 14064 14091 14102 14146 14154 14174 
+ 14075 14085 14111 14135 14152 14168 
+ 14077 14101 14104 14148 14151 14173 
+ 14078 14097 14110 14147 14156 14175 
+ 14081 14104 14107 14151 
+ 14051 14076 14106 14145 14176 14193 
+ 14086 14105 14112 14149 14157 15584 
+ 14089 14109 14113 14160 14221 
+ 14082 14102 14114 14154 14165 14183 
+ 13950 13961 13978 13993 14002 14027 14055 14143 14288 14415 
+ 14092 14108 14119 14153 14167 14172 
+ 14087 14110 14115 14156 14163 14180 
+ 14085 14108 14124 14153 14168 14182 
+ 14088 14111 14116 14152 14164 14177 
+ 14072 14106 14119 14167 14176 14187 
+ 14093 14112 14117 14157 14181 15581 
+ 14121 14155 14178 15582 
+ 14043 14058 14095 14179 14189 14216 
+ 14096 14113 14118 14160 14166 14184 
+ 14094 14115 14120 14163 14170 14186 
+ 14055 14080 14109 14132 14221 14415 
+ 14099 14117 14122 14171 15581 15585 
+ 14076 14095 14128 14179 14193 14223 
+ 14091 14116 14123 14164 14174 14192 
+ 14097 14114 14126 14165 14175 14194 
+ 14101 14120 14125 14170 14173 14191 
+ 14105 14121 14129 14190 15582 15584 
+ 14024 14036 14158 14202 14284 14287 
+ 14104 14125 14127 14173 
+ 14111 14124 14136 14168 14177 14195 
+ 14108 14133 14135 14172 14182 14196 
+ 14102 14123 14131 14174 14183 14204 
+ 14139 14178 14197 15583 
+ 14110 14126 14134 14175 14180 14203 
+ 14112 14129 14138 14181 14200 15584 
+ 14036 14058 14150 14189 14271 14287 
+ 13684 13854 14021 14103 14376 14433 14530 
+ 14113 14130 14141 14184 14221 
+ 13616 13680 13931 14098 14569 14674 
+ 13885 13902 14079 14198 14360 14498 
+ 14115 14134 14142 14180 14186 14206 
+ 14116 14136 14146 14177 14192 14208 
+ 14114 14131 14147 14183 14194 14211 
+ 14118 14141 14184 14188 15580 15586 
+ 14119 14133 14137 14172 14187 14199 
+ 14124 14135 14152 14182 14195 14210 
+ 12969 13265 14023 14468 14725 14902 
+ 14120 14142 14148 14186 14191 14213 
+ 14122 14144 14188 14214 15580 15585 
+ 14133 14153 14167 14196 14199 
+ 14125 14148 14151 14191 
+ 14123 14146 14154 14192 14204 14219 
+ 14126 14147 14156 14194 14203 14218 
+ 14106 14128 14137 14187 14193 14234 14244 
+ 14136 14152 14164 14195 14208 14224 
+ 14139 14155 14197 14205 14222 15582 
+ 14095 14140 14145 14216 14223 14248 
+ 14134 14156 14163 14203 14206 14228 
+ 14138 14157 14200 14207 14225 15581 
+ 14135 14153 14168 14196 14210 14226 
+ 14131 14154 14165 14204 14211 14230 
+ 14141 14160 14166 14221 15586 
+ 14201 14212 14227 15583 
+ 14142 14163 14170 14206 14213 15587 
+ 14137 14167 14176 14199 14231 14234 
+ 14166 14171 14214 14235 15580 15586 
+ 14058 14140 14158 14216 14259 14271 
+ 14149 14205 14217 14233 15582 15584 
+ 14148 14170 14173 14213 
+ 14146 14164 14174 14208 14219 14237 
+ 14128 14145 14176 14223 14244 14264 
+ 14147 14165 14175 14211 14218 14239 
+ 14152 14168 14177 14210 14224 14241 
+ 14153 14172 14182 14199 14226 14232 
+ 14155 14178 14212 14222 14238 15583 
+ 13811 13885 14098 14162 14498 14599 
+ 14167 14172 14187 14196 14231 14232 
+ 14157 14181 14217 14225 14242 15584 
+ 14185 14215 14227 14240 
+ 14024 14103 14150 14284 14376 
+ 14156 14175 14180 14218 14228 14245 
+ 14154 14174 14183 14219 14230 14247 
+ 14178 14190 14222 14233 14246 15582 
+ 14163 14180 14186 14228 14249 15587 
+ 14181 14225 14236 14251 15581 15585 
+ 14164 14177 14192 14224 14237 14252 
+ 6740 7295 13260 14884 15057 15086 
+ 14168 14182 14195 14226 14241 14254 
+ 14165 14183 14194 14230 14239 14257 
+ 14185 14197 14227 14238 14250 15583 
+ 14170 14186 14191 15587 
+ 14171 14188 14235 14236 14258 15585 
+ 14201 14229 14240 14253 
+ 14140 14179 14189 14248 14259 14270 
+ 14190 14200 14233 14242 14256 15584 
+ 14175 14194 14203 14239 14245 14261 
+ 14174 14192 14204 14237 14247 14262 
+ 13945 14018 14079 14288 14360 14475 
+ 14109 14130 14143 14160 14184 14415 15586 15588 
+ 14178 14197 14205 14238 14246 15589 
+ 14145 14179 14193 14248 14264 14285 
+ 14177 14195 14208 14241 14252 14267 
+ 14181 14200 14207 14242 14251 14265 
+ 14182 14196 14210 14232 14254 14260 
+ 14185 14201 14212 14240 14250 14263 
+ 14180 14203 14206 14245 14249 14272 
+ 14215 14243 14253 14266 
+ 14183 14204 14211 14247 14257 14274 
+ 14187 14199 14232 14234 14269 14275 
+ 14196 14199 14226 14231 14260 14269 
+ 14190 14205 14217 14246 14256 14273 
+ 14176 14187 14231 14244 14275 14289 
+ 14188 14214 14258 14277 15586 15588 
+ 14207 14214 14251 14258 15585 15590 
+ 14192 14208 14219 14252 14262 14280 
+ 14197 14212 14222 14250 14276 15589 
+ 14194 14211 14218 14257 14261 14282 
+ 14201 14215 14227 14253 14263 14278 
+ 14195 14210 14224 14254 14267 14283 
+ 14200 14217 14225 14256 14265 14279 
+ 14229 14255 14266 14281 
+ 14176 14193 14234 14264 14289 14305 
+ 14203 14218 14228 14261 14272 14290 
+ 14205 14222 14233 14273 14286 15589 
+ 14204 14219 14230 14262 14274 14293 
+ 14179 14216 14223 14270 14285 14304 
+ 14206 14228 14272 15587 
+ 14212 14227 14238 14263 14276 14291 
+ 14207 14225 14236 14265 14298 15590 
+ 14208 14224 14237 14267 14280 14300 
+ 14215 14229 14240 14266 14278 14294 
+ 14210 14226 14241 14260 14283 14295 
+ 14243 14268 14281 14297 
+ 14217 14233 14242 14273 14279 14296 
+ 14211 14230 14239 14274 14282 14301 
+ 14214 14235 14236 14277 14306 15590 
+ 14189 14216 14270 14271 14326 14347 
+ 14226 14232 14254 14269 14295 14303 
+ 14218 14239 14245 14282 14290 14310 
+ 14219 14237 14247 14280 14293 14311 
+ 14227 14240 14250 14278 14291 15592 
+ 14193 14223 14244 14285 14305 14321 
+ 14225 14242 14251 14279 14298 14309 
+ 14229 14243 14253 14281 14294 14307 
+ 14224 14241 14252 14283 14300 14315 
+ 14255 14297 14312 15591 
+ 14231 14232 14260 14275 14303 14316 
+ 14216 14248 14259 14304 14326 
+ 14158 14189 14259 14287 14347 14380 
+ 14228 14245 14249 14290 
+ 14233 14246 14256 14286 14296 14314 
+ 14230 14247 14257 14293 14301 14319 
+ 14231 14234 14269 14289 14316 14327 
+ 14238 14250 14291 14302 14317 15589 
+ 14235 14258 14306 14407 14415 15588 
+ 14240 14253 14263 14294 14318 15592 
+ 14242 14256 14265 14296 14309 15593 
+ 14237 14252 14262 14300 14311 14325 
+ 14243 14255 14266 14297 14307 14320 
+ 14239 14257 14261 14301 14310 14328 
+ 14241 14254 14267 14295 14315 14324 
+ 14150 14202 14287 14376 14388 
+ 14223 14248 14264 14304 14321 14338 
+ 14246 14273 14302 14314 15589 15594 
+ 14150 14158 14271 14284 14380 14388 14443 
+ 13993 14018 14132 14220 14415 14475 14694 
+ 14234 14244 14275 14305 14327 14341 
+ 14245 14261 14272 14310 
+ 14250 14263 14276 14317 14329 15592 
+ 13578 13730 13931 14483 14569 14858 
+ 14247 14262 14274 14311 14319 14333 
+ 14253 14266 14278 14307 14318 14331 
+ 14254 14260 14283 14303 14324 14335 
+ 14256 14273 14279 14314 14332 15593 
+ 14255 14268 14281 14312 14320 14334 
+ 14251 14265 14309 14330 14342 15590 
+ 14313 14322 14336 15591 
+ 14252 14267 14280 14315 14325 14340 
+ 14257 14274 14282 14319 14328 14345 
+ 14276 14286 14317 14339 15589 15594 
+ 14260 14269 14295 14316 14335 14349 
+ 14248 14270 14285 14326 14338 14361 
+ 14244 14264 14289 14321 14341 14359 
+ 14258 14277 14330 14407 15590 
+ 14266 14281 14294 14320 14331 14346 
+ 7933 8666 12141 13750 14913 15001 15008 
+ 14265 14279 14298 14342 14348 15593 
+ 14261 14282 14290 14328 
+ 14262 14280 14293 14325 14333 14354 
+ 14268 14297 14322 14334 14351 15591 
+ 14299 14323 14336 14353 
+ 14273 14286 14296 14332 14350 15594 
+ 14267 14283 14300 14324 14340 14357 
+ 14269 14275 14303 14327 14349 14362 
+ 14276 14291 14302 14329 14339 14355 
+ 14278 14294 14331 14343 14358 15592 
+ 14274 14293 14301 14333 14345 14364 
+ 14281 14297 14307 14334 14346 14363 
+ 14264 14285 14305 14338 14359 14375 
+ 14299 14312 14336 14351 14365 15591 
+ 14313 14337 14353 14368 
+ 14283 14295 14315 14335 14357 14370 
+ 14280 14300 14311 14340 14354 14372 
+ 14259 14270 14304 14347 14361 14390 
+ 14275 14289 14316 14341 14362 14377 
+ 14282 14301 14310 14345 
+ 14291 14317 14343 14355 14369 15592 
+ 14298 14306 14342 14407 15590 15596 
+ 14294 14307 14318 14346 14358 14373 
+ 14296 14314 14350 14356 14371 15593 
+ 14293 14311 14319 14354 14364 14384 
+ 14297 14312 14320 14351 14363 14378 
+ 14295 14303 14324 14349 14370 14385 
+ 14299 14313 14322 14353 14365 14381 
+ 14323 14352 14368 14386 
+ 14285 14304 14321 14361 14375 14398 
+ 14302 14317 14355 14366 14379 15594 
+ 14300 14315 14325 14357 14372 14389 
+ 14289 14305 14327 14359 14377 14393 
+ 14298 14309 14330 14348 14395 15596 
+ 14318 14329 14358 14369 14382 15592 
+ 13212 13588 14084 14483 14883 14923 
+ 14301 14319 14328 14364 
+ 14307 14320 14331 14363 14373 14391 
+ 14259 14271 14326 14380 14390 14419 
+ 14309 14342 14356 14387 14395 15593 
+ 14303 14316 14335 14362 14385 14400 
+ 14314 14332 14366 14371 14392 15594 
+ 14312 14322 14334 14365 14378 14394 
+ 14337 14367 14386 14401 
+ 14313 14323 14336 14368 14381 15595 
+ 14311 14325 14333 14372 14384 14402 
+ 14317 14329 14339 14369 14379 14396 
+ 14332 14348 14371 14387 15593 
+ 14315 14324 14340 14370 14389 14403 
+ 14318 14331 14343 14373 14382 14397 
+ 14305 14321 14341 14375 14393 14409 
+ 14079 14162 14220 14475 14498 14667 
+ 14304 14326 14338 14390 14398 14418 
+ 14316 14327 14349 14377 14400 14412 
+ 14320 14334 14346 14378 14391 14405 
+ 14319 14333 14345 14384 
+ 14322 14336 14351 14381 14394 14408 
+ 14339 14350 14379 14392 14404 15594 
+ 14352 14383 14401 14414 
+ 14323 14337 14353 14386 14413 15595 
+ 14329 14343 14355 14382 14396 14406 
+ 14324 14335 14357 14385 14403 14416 
+ 14332 14350 14356 14387 14392 14423 
+ 14325 14340 14354 14389 14402 14417 
+ 14331 14346 14358 14391 14397 14410 
+ 13654 14021 14023 14433 14697 14744 
+ 14321 14338 14359 14398 14409 14430 
+ 14103 14159 14202 14284 14388 14530 14562 14658 
+ 14327 14341 14362 14393 14412 14426 
+ 14334 14351 14363 14394 14405 14421 
+ 14339 14355 14366 14396 14404 14422 
+ 14271 14287 14347 14419 14443 14463 
+ 14336 14353 14365 14408 14424 15595 
+ 14343 14358 14369 14397 14406 14420 
+ 14367 14399 14414 14427 
+ 14333 14354 14364 14402 
+ 14335 14349 14370 14400 14416 14431 
+ 14337 14352 14368 14401 14413 15597 
+ 14348 14356 14371 14395 14423 14462 
+ 14284 14287 14376 14443 14562 
+ 14340 14357 14372 14403 14417 14432 
+ 14326 14347 14361 14418 14419 14439 
+ 14346 14363 14373 14405 14410 14428 
+ 14350 14366 14371 14404 14423 14429 
+ 14341 14359 14377 14409 14426 14444 
+ 14351 14365 14378 14408 14421 14436 
+ 14342 14348 14387 14462 15596 
+ 14355 14369 14379 14406 14422 14435 
+ 14358 14373 14382 14410 14420 14434 
+ 14338 14361 14375 14418 14430 14450 
+ 14383 14411 14427 14441 
+ 14349 14362 14385 14412 14431 14445 
+ 14352 14367 14386 14414 14442 15597 
+ 14354 14372 14384 14417 
+ 14357 14370 14389 14416 14432 14448 
+ 14366 14379 14392 14422 14429 14440 
+ 14363 14378 14391 14421 14428 14446 
+ 14369 14382 14396 14420 14435 14447 
+ 14277 14306 14330 14415 14536 14634 15596 
+ 14365 14381 14394 14424 14436 14451 
+ 14359 14375 14393 14430 14444 14460 
+ 14373 14391 14397 14428 14434 14449 
+ 14399 14425 14441 14455 
+ 14362 14377 14400 14426 14445 14457 
+ 14368 14386 14437 14453 15595 15597 
+ 14367 14383 14401 14427 14442 14456 
+ 14132 14143 14221 14277 14288 14407 14634 14694 15588 
+ 14370 14385 14403 14431 14448 14459 
+ 14372 14389 14402 14432 
+ 14361 14390 14398 14439 14450 14470 
+ 14347 14380 14390 14439 14463 14473 
+ 14382 14397 14406 14434 14447 14454 
+ 14378 14394 14405 14436 14446 14461 
+ 14379 14396 14404 14435 14440 14458 
+ 14371 14387 14392 14429 14462 14477 
+ 14381 14408 14437 14451 14465 15595 
+ 14411 14438 14455 14472 
+ 14377 14393 14412 14444 14457 14478 
+ 14383 14399 14414 14441 14456 14474 
+ 14391 14405 14410 14446 14449 14464 
+ 14392 14404 14423 14440 14469 14477 
+ 14375 14398 14409 14450 14460 14482 
+ 14385 14400 14416 14445 14459 14479 
+ 14389 14403 14417 14448 
+ 14021 14159 14374 14530 14697 14723 
+ 14397 14410 14420 14449 14454 14466 
+ 14396 14406 14422 14447 14458 14476 
+ 14394 14408 14421 14451 14461 14481 
+ 14413 14424 14453 14465 15595 15598 
+ 14425 14452 14472 14488 
+ 14390 14418 14419 14470 14473 14492 
+ 14404 14422 14429 14458 14469 14480 
+ 14399 14411 14427 14455 14474 14489 
+ 14401 14414 14456 14471 14487 15597 
+ 14287 14380 14388 14463 14533 14562 
+ 14393 14409 14426 14460 14478 14493 
+ 14400 14412 14431 14457 14479 14491 
+ 14405 14421 14428 14461 14464 14490 
+ 14406 14420 14435 14454 14476 14485 
+ 14403 14416 14432 14459 
+ 14410 14428 14434 14464 14466 14486 
+ 14398 14418 14430 14470 14482 14499 
+ 14408 14424 14436 14465 14481 14494 
+ 14438 14467 14488 14500 
+ 14413 14437 14471 14497 15597 15598 
+ 14420 14434 14447 14466 14485 15599 
+ 14411 14425 14441 14472 14489 14503 
+ 14414 14427 14442 14474 14487 14502 
+ 14412 14426 14445 14478 14491 14506 
+ 14422 14435 14440 14476 14480 14495 
+ 14416 14431 14448 14479 
+ 14409 14430 14444 14482 14493 14508 
+ 14421 14436 14446 14481 14490 14504 
+ 14387 14395 14423 14477 14536 14538 15596 
+ 14380 14419 14443 14473 14509 14533 
+ 14428 14446 14449 14486 14490 14505 
+ 14424 14437 14451 14494 14507 15598 
+ 14434 14449 14454 14486 14501 15599 
+ 14452 14484 14500 14512 
+ 13265 13426 14169 14738 14902 14965 
+ 14429 14440 14477 14480 14520 
+ 14418 14439 14450 14492 14499 14517 
+ 14442 14453 14487 14497 14511 15597 
+ 14425 14438 14455 14488 14503 14515 
+ 14419 14439 14463 14492 14509 14514 
+ 14427 14441 14456 14489 14502 14513 
+ 14220 14288 14360 14667 14694 
+ 14435 14447 14458 14485 14495 14531 
+ 14423 14429 14462 14469 14520 14538 
+ 14426 14444 14457 14493 14506 14519 
+ 14431 14445 14459 14491 
+ 14440 14458 14469 14495 14520 
+ 14436 14451 14461 14494 14504 14518 
+ 14430 14450 14460 14499 14508 14525 
+ 13588 13730 14292 14344 14858 14923 
+ 14467 14496 14512 14524 
+ 14447 14454 14476 14531 15599 
+ 14449 14464 14466 14501 14505 14516 
+ 14442 14456 14471 14502 14511 14527 
+ 14438 14452 14472 14500 14515 14529 
+ 14441 14455 14474 14503 14513 14528 
+ 14446 14461 14464 14504 14505 14526 
+ 14445 14457 14479 14506 
+ 14439 14470 14473 14514 14517 14534 
+ 14444 14460 14478 14508 14519 15600 
+ 14451 14465 14481 14507 14518 14532 
+ 14458 14476 14480 14520 14531 14613 
+ 14484 14510 14524 14539 
+ 14453 14471 14511 14521 14537 15598 
+ 14162 14198 14360 14599 14667 14842 
+ 14450 14470 14482 14517 14525 14545 
+ 14452 14467 14488 14512 14529 14543 
+ 14466 14486 14516 14523 15599 
+ 14456 14474 14487 14513 14527 14542 
+ 14455 14472 14489 14515 14528 14544 
+ 14461 14481 14490 14518 14526 14546 
+ 14464 14486 14490 14516 14526 14540 
+ 14457 14478 14491 14519 
+ 14465 14494 14521 14532 14547 15598 
+ 14460 14482 14493 14525 14551 15600 
+ 14463 14473 14514 14533 14541 
+ 14496 14522 14539 14552 
+ 14471 14487 14497 14527 14537 14550 
+ 14467 14484 14500 14524 14543 14554 
+ 14474 14489 14502 14528 14542 14553 
+ 14473 14492 14509 14534 14541 14556 
+ 14472 14488 14503 14529 14544 14555 
+ 14486 14501 14505 14523 14540 14549 
+ 14470 14492 14499 14534 14545 14561 
+ 14481 14494 14504 14532 14546 14557 
+ 14478 14493 14506 15600 
+ 14469 14477 14480 14495 14538 14613 
+ 14497 14507 14537 14547 14560 15598 
+ 14510 14535 14552 14563 
+ 14501 14516 14531 14549 14558 15599 
+ 14484 14496 14512 14539 14554 14566 
+ 14482 14499 14508 14545 14551 14568 
+ 14490 14504 14505 14540 14546 14565 
+ 14487 14502 14511 14542 14550 14564 
+ 14489 14503 14513 14544 14553 14567 
+ 14488 14500 14515 14543 14555 14570 
+ 14159 14376 14433 14658 14723 14799 
+ 14476 14485 14495 14523 14558 14613 15599 
+ 14494 14507 14518 14547 14557 14571 
+ 14443 14463 14509 14541 14562 14573 14659 
+ 14492 14514 14517 14556 14561 14577 
+ 14522 14548 14563 14576 
+ 14407 14462 14538 14634 14731 15596 
+ 14497 14511 14521 14550 14560 14574 
+ 14462 14477 14520 14536 14613 14731 
+ 14496 14510 14524 14552 14566 14579 
+ 14505 14516 14526 14549 14565 14575 
+ 14509 14514 14533 14556 14573 
+ 14502 14513 14527 14553 14564 14578 
+ 14500 14512 14529 14554 14570 14583 
+ 14503 14515 14528 14555 14567 14581 
+ 14499 14517 14525 14561 14568 14585 
+ 14504 14518 14526 14557 14565 14586 
+ 14507 14521 14532 14560 14571 14582 
+ 14535 14559 14576 14589 
+ 14516 14523 14540 14558 14575 14584 
+ 14511 14527 14537 14564 14574 14588 
+ 14508 14525 14568 15600 
+ 14510 14522 14539 14563 14579 14591 
+ 14513 14528 14542 14567 14578 14590 
+ 14512 14524 14543 14566 14583 14592 
+ 14515 14529 14544 14570 14581 14594 
+ 14514 14534 14541 14573 14577 14597 
+ 14518 14532 14546 14571 14586 14598 
+ 14523 14531 14549 14584 14613 14624 
+ 14548 14572 14589 14600 
+ 14521 14537 14547 14574 14582 14595 
+ 14517 14534 14545 14577 14585 14601 
+ 14376 14388 14443 14533 14658 14659 14715 
+ 14522 14535 14552 14576 14591 14606 
+ 14527 14542 14550 14578 14588 14603 
+ 14526 14540 14546 14575 14586 14608 
+ 14524 14539 14554 14579 14592 14607 
+ 14528 14544 14553 14581 14590 14604 
+ 14525 14545 14551 14585 
+ 13931 14161 14292 14674 14858 14922 
+ 14529 14543 14555 14583 14594 14609 
+ 14532 14547 14557 14582 14598 14605 
+ 14559 14580 14600 14611 
+ 14533 14541 14556 14597 14651 14659 
+ 14537 14550 14560 14588 14595 14612 
+ 14540 14549 14565 14584 14608 14621 
+ 14535 14548 14563 14589 14606 14617 
+ 14534 14556 14561 14597 14601 14620 
+ 14542 14553 14564 14590 14603 14616 
+ 14539 14552 14566 14591 14607 14618 
+ 14572 14587 14611 14622 
+ 14544 14555 14567 14594 14604 14619 
+ 14547 14560 14571 14595 14605 14615 
+ 14543 14554 14570 14592 14609 14623 
+ 14549 14558 14575 14621 14624 
+ 14545 14561 14568 14601 
+ 14546 14557 14565 14598 14608 14633 
+ 14580 14596 14622 14626 
+ 14550 14564 14574 14603 14612 14625 
+ 14548 14559 14576 14600 14617 14629 
+ 14553 14567 14578 14604 14616 14627 
+ 14552 14563 14579 14606 14618 14630 
+ 14554 14566 14583 14607 14623 14631 
+ 11933 13414 14090 14738 14951 14974 
+ 14555 14570 14581 14609 14619 14632 
+ 14560 14574 14582 14612 14615 14628 
+ 14587 14602 14626 14635 
+ 14556 14573 14577 14620 14651 
+ 14557 14571 14586 14605 14633 15602 
+ 14098 14198 14498 14674 14842 14921 
+ 14559 14572 14589 14611 14629 14637 
+ 14561 14577 14585 14620 
+ 14596 14610 14635 14640 
+ 14564 14578 14588 14616 14625 14636 
+ 14567 14581 14590 14619 14627 14639 
+ 14571 14582 14598 14615 14638 15602 
+ 14563 14576 14591 14617 14630 14643 
+ 14566 14579 14592 14618 14631 14641 
+ 14565 14575 14586 14621 14633 14647 
+ 14570 14583 14594 14623 14632 14644 
+ 14602 14614 14640 14646 
+ 14572 14580 14600 14622 14637 14648 
+ 14574 14588 14595 14625 14628 14645 
+ 14495 14520 14531 14538 14558 14624 14704 14731 
+ 14610 14620 14646 14650 
+ 14582 14595 14605 14628 14638 14642 
+ 14578 14590 14603 14627 14636 14649 
+ 14576 14589 14606 14629 14643 14654 
+ 14579 14591 14607 14630 14641 14653 
+ 14581 14594 14604 14632 14639 14652 
+ 14577 14597 14601 14614 14650 14651 14668 
+ 14575 14584 14608 14624 14647 14671 
+ 14580 14587 14611 14626 14648 14657 
+ 14583 14592 14609 14631 14644 14656 
+ 14558 14584 14613 14621 14671 14704 
+ 14588 14603 14612 14636 14645 14660 
+ 14587 14596 14622 14635 14657 14662 
+ 14590 14604 14616 14639 14649 14661 
+ 14595 14612 14615 14642 14645 14655 
+ 14589 14600 14617 14637 14654 14664 
+ 14591 14606 14618 14643 14653 14663 
+ 14592 14607 14623 14641 14656 14665 
+ 14594 14609 14619 14644 14652 14666 
+ 14586 14598 14608 14647 14679 15602 
+ 14407 14415 14536 14694 14731 14868 
+ 14596 14602 14626 14640 14662 14669 
+ 14603 14616 14625 14649 14660 14673 
+ 14600 14611 14629 14648 14664 14678 
+ 14605 14615 14642 14670 14686 15602 
+ 14604 14619 14627 14652 14661 14672 
+ 14602 14610 14635 14646 14669 14675 
+ 14607 14618 14631 14653 14665 14676 
+ 14615 14628 14638 14655 14670 
+ 14606 14617 14630 14654 14663 14680 
+ 14609 14623 14632 14656 14666 14681 
+ 14612 14625 14628 14655 14660 14677 
+ 14610 14614 14640 14650 14675 14682 
+ 14608 14621 14633 14671 14679 14696 
+ 14611 14622 14637 14657 14678 14685 
+ 14616 14627 14636 14661 14673 14683 
+ 14614 14620 14646 14668 14682 14689 
+ 14573 14597 14620 14659 14668 14713 
+ 14619 14632 14639 14666 14672 14687 
+ 14618 14630 14641 14663 14676 14688 
+ 14617 14629 14643 14664 14680 14691 
+ 14628 14642 14645 14670 14677 14684 
+ 14623 14631 14644 14665 14681 14690 
+ 14622 14626 14648 14662 14685 14693 
+ 14376 14530 14562 14715 14799 14809 
+ 14533 14562 14573 14651 14713 14715 14739 
+ 14625 14636 14645 14673 14677 14695 
+ 14627 14639 14649 14672 14683 14692 
+ 14626 14635 14657 14669 14693 14698 
+ 14630 14643 14653 14680 14688 14700 
+ 14629 14637 14654 14678 14691 14703 
+ 14631 14641 14656 14676 14690 14699 
+ 14632 14644 14652 14681 14687 14701 
+ 14360 14475 14498 14694 14842 14911 
+ 14620 14650 14651 14689 14713 14721 
+ 14635 14640 14662 14675 14698 14706 
+ 14638 14642 14655 14684 14686 14702 
+ 14621 14624 14647 14696 14704 14728 
+ 14639 14652 14661 14687 14692 14705 
+ 14636 14649 14660 14683 14695 14709 
+ 14098 14161 14569 14599 14921 14922 
+ 14640 14646 14669 14682 14706 14710 
+ 14641 14653 14665 14688 14699 14707 
+ 14645 14655 14660 14684 14695 14708 
+ 14637 14648 14664 14685 14703 14712 
+ 14633 14647 14686 14696 14732 15602 
+ 14643 14654 14663 14691 14700 14717 
+ 14644 14656 14666 14690 14701 14716 
+ 14646 14650 14675 14689 14710 14711 
+ 14649 14661 14673 14692 14709 14719 
+ 14655 14670 14677 14702 14708 14714 
+ 14648 14657 14678 14693 14712 14724 
+ 14638 14670 14679 14702 14732 14740 15602 
+ 14652 14666 14672 14701 14705 14720 
+ 14653 14663 14676 14700 14707 14722 
+ 14650 14668 14682 14711 14721 
+ 14656 14665 14681 14699 14716 14727 
+ 14654 14664 14680 14703 14717 14729 
+ 14661 14672 14683 14705 14719 14726 
+ 14657 14662 14685 14698 14724 14730 
+ 14288 14415 14475 14634 14667 14868 14911 
+ 14660 14673 14677 14708 14709 14736 
+ 14647 14671 14679 14728 14732 14753 
+ 14374 14433 14723 14744 14874 14890 
+ 14662 14669 14693 14706 14730 14737 
+ 14665 14676 14690 14707 14727 14733 
+ 14663 14680 14688 14717 14722 14735 
+ 14666 14681 14687 14716 14720 15603 
+ 14670 14684 14686 14714 14740 
+ 14664 14678 14691 14712 14729 14743 
+ 14613 14624 14671 14728 14731 14782 
+ 14672 14687 14692 14720 14726 14734 
+ 14669 14675 14698 14710 14737 14742 
+ 14676 14688 14699 14722 14733 14741 
+ 14677 14684 14695 14714 14736 15604 
+ 14673 14683 14695 14719 14736 14747 
+ 14675 14682 14706 14711 14742 14745 
+ 14682 14689 14710 14721 14745 14746 
+ 14678 14685 14703 14724 14743 14752 
+ 14651 14659 14668 14721 14739 14757 14763 
+ 14684 14702 14708 14740 14756 15604 
+ 14562 14658 14659 14739 14790 14809 
+ 14681 14690 14701 14727 14754 15603 
+ 14680 14691 14700 14729 14735 14755 
+ 5091 6408 13608 14884 15106 15121 
+ 14683 14692 14709 14726 14747 14749 
+ 14687 14701 14705 14734 14750 15603 
+ 14668 14689 14711 14713 14746 14757 
+ 14688 14700 14707 14735 14741 14748 
+ 14433 14530 14697 14799 14874 14906 
+ 14685 14693 14712 14730 14752 14759 
+ 14023 14169 14744 14886 14902 14933 
+ 14692 14705 14719 14734 14749 14751 
+ 14690 14699 14716 14733 14754 14760 
+ 14671 14696 14704 14753 14782 14788 
+ 14691 14703 14717 14743 14755 14765 
+ 14693 14698 14724 14737 14759 14764 
+ 14536 14538 14613 14634 14704 14782 14868 14870 
+ 14679 14686 14696 14740 14753 14776 14785 
+ 14699 14707 14727 14741 14760 14761 
+ 14705 14720 14726 14750 14751 14758 
+ 14700 14717 14722 14748 14755 15605 
+ 14695 14708 14709 14747 14775 14778 15604 
+ 14698 14706 14730 14742 14764 14766 
+ 13414 13426 14468 14593 14965 14974 15017 
+ 14659 14713 14715 14763 14787 14790 
+ 14686 14702 14714 14732 14756 14776 
+ 14707 14722 14733 14748 14761 14762 
+ 14706 14710 14737 14745 14766 14769 
+ 14703 14712 14729 14752 14765 14774 
+ 14023 14374 14697 14725 14886 14890 
+ 14710 14711 14742 14746 14769 14771 
+ 14711 14721 14745 14757 14771 14777 
+ 14709 14719 14736 14749 14778 14779 
+ 14722 14735 14741 14762 14770 15605 
+ 14719 14726 14747 14751 14772 14779 
+ 14720 14734 14758 14767 14773 15603 
+ 14726 14734 14749 14758 14772 
+ 14712 14724 14743 14759 14774 14783 
+ 14696 14728 14732 14785 14788 
+ 14716 14727 14760 14767 14786 15603 
+ 14717 14729 14735 14765 14784 15605 
+ 14714 14740 14775 14776 14805 15604 
+ 14713 14721 14746 14763 14777 14780 
+ 14734 14750 14751 14772 14773 14781 
+ 14724 14730 14752 14764 14783 14791 
+ 14727 14733 14754 14761 14786 14793 
+ 14733 14741 14760 14762 14789 14793 
+ 14741 14748 14761 14770 14789 
+ 14713 14739 14757 14780 14787 14794 
+ 14730 14737 14759 14766 14791 14795 
+ 14729 14743 14755 14774 14784 14804 
+ 14737 14742 14764 14769 14795 14798 
+ 14750 14754 14773 14786 14802 15603 
+ 13752 14084 14883 14964 14993 15601 
+ 14742 14745 14766 14771 14798 14800 
+ 14748 14762 14789 14792 14797 15605 
+ 14745 14746 14769 14777 14800 14801 
+ 14749 14751 14758 14779 14781 14808 
+ 14750 14758 14767 14781 14802 14803 
+ 14743 14752 14765 14783 14804 14810 
+ 14736 14756 14778 14805 14816 15604 
+ 14732 14740 14756 14785 14805 14814 
+ 14746 14757 14771 14780 14796 14801 
+ 14736 14747 14775 14779 14815 14816 
+ 14747 14749 14772 14778 14808 14815 
+ 14757 14763 14777 14794 14796 14807 
+ 14758 14772 14773 14803 14808 
+ 14704 14728 14731 14788 14850 14870 
+ 14752 14759 14774 14791 14810 14813 
+ 14755 14765 14792 14804 14819 15605 
+ 14732 14753 14776 14788 14814 14830 
+ 14754 14760 14767 14793 14802 14825 
+ 14739 14763 14790 14794 14811 14820 
+ 14728 14753 14782 14785 14830 14850 
+ 14761 14762 14770 14793 14797 14812 
+ 14715 14739 14787 14809 14820 14849 
+ 14759 14764 14783 14795 14813 14822 
+ 14770 14784 14797 14817 14819 15605 
+ 14760 14761 14786 14789 14812 14825 14829 
+ 14763 14780 14787 14807 14811 14821 
+ 14764 14766 14791 14798 14822 14827 
+ 14777 14780 14801 14807 14818 
+ 14770 14789 14792 14812 14817 
+ 14766 14769 14795 14800 14827 14828 
+ 14530 14658 14723 14809 14895 14906 
+ 14769 14771 14798 14801 14824 14828 
+ 14771 14777 14796 14800 14818 14824 
+ 14767 14773 14786 14803 14825 14826 
+ 14773 14781 14802 14808 14826 14832 
+ 14765 14774 14784 14810 14819 14834 
+ 14756 14775 14776 14814 14816 14837 
+ 6549 8429 11051 14963 15040 15073 
+ 14780 14794 14796 14818 14821 14833 
+ 14772 14779 14781 14803 14815 14832 14845 
+ 14658 14715 14790 14799 14849 14895 
+ 14774 14783 14804 14813 14834 14839 
+ 14787 14794 14820 14821 14831 
+ 14789 14793 14797 14817 14829 14835 
+ 14783 14791 14810 14822 14838 14839 
+ 14776 14785 14805 14830 14837 14851 
+ 14778 14779 14808 14816 14845 14852 
+ 14775 14778 14805 14815 14837 14852 
+ 14792 14797 14812 14819 14835 14836 
+ 14796 14801 14807 14824 14833 14840 
+ 14784 14792 14804 14817 14834 14836 14847 
+ 14787 14790 14811 14831 14849 14855 
+ 14794 14807 14811 14831 14833 14846 
+ 14791 14795 14813 14827 14838 14841 
+ 12039 13965 14938 14968 15016 15579 
+ 14800 14801 14818 14828 14840 14843 
+ 14786 14793 14802 14826 14829 14848 14853 
+ 14802 14803 14825 14832 14848 
+ 14795 14798 14822 14828 14841 14844 
+ 14798 14800 14824 14827 14843 14844 
+ 14793 14812 14825 14835 14853 14854 
+ 14785 14788 14814 14850 14851 14867 
+ 14811 14820 14821 14846 14855 
+ 14803 14808 14826 14845 14848 14861 
+ 14807 14818 14821 14840 14846 14859 
+ 14804 14810 14819 14839 14847 14864 
+ 14812 14817 14829 14836 14854 14857 
+ 14817 14819 14835 14847 14857 14862 
+ 14805 14814 14816 14851 14852 14876 
+ 14813 14822 14839 14841 14865 14869 
+ 14810 14813 14834 14838 14864 14869 
+ 14818 14824 14833 14843 14859 14866 
+ 14822 14827 14838 14844 14860 14865 
+ 14498 14599 14667 14911 14921 14985 
+ 14824 14828 14840 14844 14863 14866 
+ 14827 14828 14841 14843 14860 14863 
+ 14808 14815 14832 14852 14861 14877 
+ 14821 14831 14833 14855 14859 14873 
+ 14819 14834 14836 14862 14864 14871 
+ 14825 14826 14832 14853 14861 14875 
+ 14790 14809 14820 14855 14895 14904 
+ 14782 14788 14830 14867 14870 14896 
+ 14814 14830 14837 14867 14876 14882 
+ 14815 14816 14837 14845 14876 14877 14892 
+ 14825 14829 14848 14854 14875 14878 
+ 14829 14835 14853 14857 14872 14878 
+ 14820 14831 14846 14849 14873 14904 
+ 1438 6142 7847 15069 15094 15125 
+ 14835 14836 14854 14862 14872 15606 
+ 14292 14483 14569 14922 14923 14991 
+ 14833 14840 14846 14866 14873 14885 
+ 14841 14844 14863 14865 14879 
+ 14832 14845 14848 14875 14877 14894 
+ 14836 14847 14857 14871 14880 15606 
+ 14843 14844 14860 14866 14879 14881 
+ 14834 14839 14847 14869 14871 14889 
+ 14838 14841 14860 14869 14879 14888 
+ 14840 14843 14859 14863 14881 14885 
+ 14830 14850 14851 14882 14896 
+ 14634 14694 14731 14870 14911 14944 14973 
+ 14838 14839 14864 14865 14888 14889 14901 
+ 14731 14782 14850 14868 14896 14944 
+ 14847 14862 14864 14880 14889 14893 
+ 14854 14857 14878 14891 14898 15606 
+ 14846 14855 14859 14885 14904 14907 
+ 14697 14723 14890 14906 14943 14956 
+ 14848 14853 14861 14878 14894 14900 
+ 14837 14851 14852 14882 14892 14903 
+ 14845 14852 14861 14892 14894 14905 
+ 14853 14854 14872 14875 14898 14900 
+ 14860 14863 14865 14881 14888 14897 
+ 14862 14871 14891 14893 15606 
+ 14863 14866 14879 14885 14897 14899 
+ 14851 14867 14876 14896 14903 14912 
+ 14084 14344 14768 14923 14993 15018 
+ 6408 7295 14209 14718 15086 15106 
+ 14859 14866 14873 14881 14899 14907 
+ 14725 14744 14890 14933 14939 
+ 13535 14090 14914 14951 15006 15014 
+ 14865 14869 14879 14897 14901 14918 
+ 14864 14869 14871 14893 14901 14910 
+ 14697 14744 14874 14886 14939 14943 
+ 14872 14880 14893 14898 14908 15606 
+ 14852 14876 14877 14903 14905 14917 
+ 14871 14880 14889 14891 14908 14910 
+ 14861 14875 14877 14900 14905 14915 
+ 14799 14809 14849 14904 14906 14935 14950 
+ 14850 14867 14870 14882 14912 14944 
+ 14879 14881 14888 14899 14916 14918 
+ 14872 14878 14891 14900 14908 14920 
+ 14881 14885 14897 14907 14916 14919 
+ 14875 14878 14894 14898 14915 14920 14925 
+ 14869 14888 14889 14910 14918 14926 
+ 14169 14468 14725 14933 14965 14975 
+ 14876 14882 14892 14912 14917 14928 
+ 14849 14855 14873 14895 14907 14929 14935 
+ 14877 14892 14894 14915 14917 14924 
+ 14723 14799 14874 14895 14950 14956 
+ 14873 14885 14899 14904 14919 14929 
+ 14891 14893 14898 14910 14920 14927 
+ 13856 14069 14914 14979 14994 15028 
+ 14889 14893 14901 14908 14926 14927 
+ 14667 14694 14842 14868 14973 14985 
+ 14882 14896 14903 14928 14944 14948 
+ 12141 13965 14308 14968 15008 15031 
+ 13535 13856 14887 14909 14994 15006 
+ 14894 14900 14905 14924 14925 14930 
+ 14897 14899 14918 14919 14931 
+ 14892 14903 14905 14924 14928 14932 
+ 14888 14897 14901 14916 14926 14931 14941 
+ 14899 14907 14916 14929 14931 14936 
+ 14898 14900 14908 14925 14927 14934 
+ 14599 14674 14842 14922 14985 15002 
+ 14569 14674 14858 14921 14991 15002 
+ 14344 14483 14858 14883 14991 15018 
+ 14905 14915 14917 14930 14932 14937 
+ 14900 14915 14920 14930 14934 14940 
+ 14901 14910 14918 14927 14941 14942 
+ 14908 14910 14920 14926 14934 14942 
+ 14903 14912 14917 14932 14946 14948 
+ 14904 14907 14919 14935 14936 14952 
+ 14915 14924 14925 14937 14940 14947 
+ 14916 14918 14919 14936 14941 14953 
+ 14917 14924 14928 14937 14946 14949 
+ 14725 14886 14902 14939 14975 14978 
+ 14920 14925 14927 14940 14942 14957 
+ 14895 14904 14929 14950 14952 14961 
+ 14919 14929 14931 14952 14953 14958 
+ 14924 14930 14932 14947 14949 14954 
+ 14823 14964 15016 15034 15579 15601 
+ 14886 14890 14933 14943 14978 14989 
+ 14925 14930 14934 14947 14957 14959 
+ 14918 14926 14931 14942 14953 14962 
+ 14926 14927 14934 14941 14957 14962 14967 
+ 14874 14890 14939 14956 14986 14989 
+ 14868 14870 14896 14912 14948 14973 14981 
+ 7003 7847 11051 15040 15069 15093 
+ 14928 14932 14948 14949 14971 
+ 14930 14937 14940 14954 14959 14960 
+ 14912 14928 14944 14946 14971 14981 
+ 14932 14937 14946 14954 14971 
+ 14895 14906 14935 14956 14961 14976 14983 
+ 14090 14593 14887 14974 15014 15025 
+ 14929 14935 14936 14958 14961 14966 
+ 14931 14936 14941 14958 14962 14969 
+ 14937 14947 14949 14960 14971 
+ 8232 11299 13750 15001 15024 15067 15085 
+ 14874 14906 14943 14950 14983 14986 
+ 14934 14940 14942 14959 14967 14972 
+ 14936 14952 14953 14966 14969 
+ 14940 14947 14957 14960 14970 14972 
+ 14947 14954 14959 14970 14971 
+ 14935 14950 14952 14966 14976 14980 
+ 14941 14942 14953 14967 14969 14977 
+ 8429 14069 14806 14979 15051 15073 
+ 14768 14938 14993 15034 15036 15601 
+ 14468 14738 14902 14975 15017 15022 
+ 14952 14958 14961 14969 14980 14987 
+ 14942 14957 14962 14972 14977 14988 
+ 13965 14823 14913 15016 15031 15046 
+ 14953 14958 14962 14966 14977 14987 
+ 14959 14960 14971 14972 14982 14984 
+ 14946 14948 14949 14954 14960 14970 14981 14982 14990 
+ 14957 14959 14967 14970 14984 14988 
+ 14868 14911 14944 14981 14985 15021 15035 
+ 14593 14738 14951 15017 15025 15041 
+ 14902 14933 14965 14978 15020 15022 
+ 14950 14961 14980 14983 14995 15000 
+ 14962 14967 14969 14987 14988 14997 14998 
+ 14933 14939 14975 14989 15015 15020 
+ 14069 14909 14963 15028 15051 
+ 14961 14966 14976 14987 14995 14999 
+ 14944 14948 14971 14973 14990 15021 
+ 14970 14971 14984 14990 14992 
+ 14950 14956 14976 14986 15000 15003 
+ 14970 14972 14982 14988 14992 14996 
+ 14842 14911 14921 14973 15002 15035 15048 
+ 14943 14956 14983 14989 15003 15004 
+ 14966 14969 14977 14980 14997 14999 
+ 14967 14972 14977 14984 14996 14998 
+ 14939 14943 14978 14986 15004 15015 
+ 14971 14981 14982 14992 15009 15021 
+ 14858 14922 14923 15002 15018 15047 
+ 14982 14984 14990 14996 15005 15009 
+ 14768 14883 14964 15018 15036 15044 
+ 14909 14914 15006 15028 15049 
+ 14976 14980 14999 15000 15012 15013 
+ 14984 14988 14992 14998 15005 15007 
+ 14977 14987 14998 14999 15010 15011 
+ 14977 14988 14996 14997 15007 15010 
+ 14980 14987 14995 14997 15011 15013 
+ 14976 14983 14995 15003 15012 15019 
+ 13750 14308 14955 15008 15059 15067 
+ 14921 14922 14985 14991 15047 15048 
+ 14983 14986 15000 15004 15019 15023 
+ 14986 14989 15003 15015 15023 15032 
+ 14992 14996 15007 15009 15033 
+ 14887 14914 14994 15014 15049 15052 
+ 14996 14998 15005 15010 15033 
+ 14308 14913 15001 15031 15059 15060 
+ 14990 14992 15005 15021 15033 15055 
+ 14997 14998 15007 15011 15030 15033 
+ 14997 14999 15010 15013 15026 15030 
+ 14995 15000 15013 15019 15027 15029 
+ 14995 14999 15011 15012 15026 15027 
+ 14887 14951 15006 15025 15052 15056 
+ 14978 14989 15004 15020 15032 15037 
+ 14823 14938 14968 15034 15046 15061 
+ 14738 14965 14974 15022 15041 15050 15062 
+ 14883 14923 14991 14993 15044 15047 15063 
+ 15000 15003 15012 15023 15029 15038 
+ 14975 14978 15015 15022 15037 15042 
+ 14973 14981 14990 15009 15035 15055 
+ 14965 14975 15017 15020 15042 15050 
+ 15003 15004 15019 15032 15038 
+ 11299 13260 14955 15057 15085 15110 
+ 14951 14974 15014 15041 15056 
+ 15011 15013 15027 15030 15039 15043 
+ 15012 15013 15026 15029 15039 
+ 14909 14979 14994 15049 15051 15075 
+ 15012 15019 15027 15038 15039 
+ 15010 15011 15026 15033 15043 
+ 14913 14968 15008 15046 15060 15068 
+ 15004 15015 15023 15037 15038 15045 
+ 15005 15007 15009 15010 15030 15043 15055 
+ 14938 14964 15016 15036 15061 15066 
+ 14973 14985 15021 15048 15055 15081 
+ 14964 14993 15034 15044 15066 15076 
+ 15015 15020 15032 15042 15045 15054 
+ 15019 15023 15029 15032 15039 15045 15058 
+ 15026 15027 15029 15038 15043 15058 
+ 11051 14806 14945 15073 15093 15129 
+ 14974 15017 15025 15056 15062 15072 
+ 15020 15022 15037 15050 15054 15064 
+ 15026 15030 15033 15039 15055 15058 15077 
+ 14993 15018 15036 15063 15076 
+ 15032 15037 15038 15054 15058 15065 
+ 14968 15016 15031 15061 15068 15078 
+ 14991 15002 15018 15048 15063 15087 
+ 14985 15002 15035 15047 15081 15087 
+ 14994 15006 15028 15052 15075 15089 
+ 15017 15022 15042 15062 15064 15074 
+ 14963 14979 15028 15073 15075 15102 
+ 15006 15014 15049 15056 15084 15089 
+ 133 150 5176 15123 15220 15242 
+ 15037 15042 15045 15064 15065 15070 
+ 15009 15021 15033 15035 15043 15077 15081 
+ 15014 15025 15041 15052 15072 15084 
+ 13260 14209 15024 15086 15110 15141 
+ 15038 15039 15043 15045 15065 15077 15079 
+ 15001 15008 15060 15067 15083 15092 
+ 15008 15031 15059 15068 15083 15088 
+ 15016 15034 15046 15066 15078 15090 
+ 15017 15041 15050 15072 15074 15091 
+ 15018 15044 15047 15076 15087 15105 
+ 15042 15050 15054 15070 15074 15082 
+ 15045 15054 15058 15070 15079 15080 
+ 15034 15036 15061 15076 15090 15103 
+ 14955 15001 15059 15085 15092 15109 
+ 15031 15046 15060 15078 15088 15095 
+ 7847 14856 14945 15093 15125 15135 
+ 15054 15064 15065 15080 15082 
+ 223 5176 5408 15133 15218 15220 
+ 15041 15056 15062 15084 15091 15101 
+ 14806 14963 15040 15051 15102 15129 15146 
+ 15050 15062 15064 15082 15091 15100 
+ 15028 15049 15051 15089 15102 15117 
+ 15036 15044 15063 15066 15103 15105 
+ 15043 15055 15058 15079 15081 15097 15104 
+ 15046 15061 15068 15090 15095 15108 
+ 15058 15065 15077 15080 15096 15097 
+ 15065 15070 15079 15082 15096 15099 
+ 15035 15048 15055 15077 15087 15104 15116 
+ 15064 15070 15074 15080 15099 15100 
+ 15059 15060 15088 15092 15107 
+ 15052 15056 15072 15089 15101 15112 
+ 14955 15024 15067 15109 15110 15131 
+ 14209 14884 15057 15106 15141 15161 
+ 15047 15048 15063 15081 15105 15116 15128 
+ 15060 15068 15083 15095 15107 15111 
+ 15049 15052 15075 15084 15112 15117 
+ 15061 15066 15078 15103 15108 15124 
+ 15062 15072 15074 15100 15101 15113 
+ 15059 15067 15083 15107 15109 15119 
+ 14945 15040 15069 15129 15135 15162 
+ 6142 12330 14856 15125 15170 15186 
+ 15068 15078 15088 15108 15111 15114 
+ 15079 15080 15097 15099 15115 
+ 15077 15079 15096 15104 15115 15118 
+ 211 270 12330 15165 15170 15223 
+ 15080 15082 15096 15100 15115 15120 
+ 15074 15082 15091 15099 15113 15120 
+ 15072 15084 15091 15112 15113 15132 
+ 15051 15073 15075 15117 15146 15147 
+ 15066 15076 15090 15105 15124 15136 
+ 15077 15081 15097 15116 15118 15126 
+ 15063 15076 15087 15103 15128 15136 
+ 14718 14884 15086 15121 15161 15179 
+ 15083 15088 15092 15111 15119 15122 
+ 15078 15090 15095 15114 15124 15130 
+ 15067 15085 15092 15119 15131 15137 
+ 15024 15057 15085 15131 15141 15156 
+ 15088 15095 15107 15114 15122 15127 
+ 15084 15089 15101 15117 15132 15142 
+ 15091 15100 15101 15120 15132 15143 
+ 15095 15108 15111 15127 15130 
+ 15096 15097 15099 15118 15120 15134 15139 
+ 15081 15087 15104 15126 15128 15140 
+ 15075 15089 15102 15112 15142 15147 
+ 15097 15104 15115 15126 15134 
+ 15092 15107 15109 15122 15137 15138 
+ 15099 15100 15113 15115 15139 15143 
+ 13608 14718 15106 15144 15179 15199 
+ 15107 15111 15119 15127 15138 15145 
+ 150 176 15053 15242 
+ 15090 15103 15108 15130 15136 15154 
+ 14856 15069 15094 15135 15185 15186 
+ 15104 15116 15118 15134 15140 15148 
+ 15111 15114 15122 15130 15145 15150 
+ 15087 15105 15116 15136 15140 15153 
+ 15040 15073 15093 15146 15162 15182 
+ 15108 15114 15124 15127 15150 15154 
+ 15085 15109 15110 15137 15152 15156 
+ 15101 15112 15113 15142 15143 15155 
+ 5408 7666 15071 15144 15212 15218 
+ 15115 15118 15126 15139 15148 15151 
+ 15069 15093 15125 15162 15185 
+ 15103 15105 15124 15128 15153 15154 15167 
+ 15109 15119 15131 15138 15149 15152 
+ 15119 15122 15137 15145 15149 
+ 15115 15120 15134 15143 15151 15159 
+ 15116 15126 15128 15148 15153 15157 
+ 15057 15086 15110 15156 15161 15173 
+ 15112 15117 15132 15147 15155 15164 
+ 15113 15120 15132 15139 15155 15159 
+ 7666 13608 15121 15133 15199 15212 
+ 15122 15127 15138 15149 15150 15158 
+ 15073 15102 15129 15147 15175 15182 
+ 15102 15117 15142 15146 15164 15175 
+ 15126 15134 15140 15151 15157 15160 
+ 15137 15138 15145 15152 15158 15163 
+ 15127 15130 15145 15154 15158 15168 
+ 15134 15139 15148 15159 15160 15166 
+ 15131 15137 15149 15156 15163 15172 
+ 15128 15136 15140 15157 15167 15171 
+ 15124 15130 15136 15150 15167 15168 15183 
+ 15132 15142 15143 15159 15164 15176 
+ 15110 15131 15141 15152 15172 15173 15181 
+ 15140 15148 15153 15160 15169 15171 
+ 15145 15149 15150 15163 15168 15174 
+ 15139 15143 15151 15155 15166 15176 15178 
+ 15148 15151 15157 15166 15169 
+ 15086 15106 15141 15173 15179 15192 
+ 15093 15129 15135 15182 15185 15207 
+ 15149 15152 15158 15172 15174 15177 
+ 15142 15147 15155 15175 15176 15191 
+ 168 211 15098 15200 15223 15249 
+ 15151 15159 15160 15169 15178 15180 
+ 15136 15153 15154 15171 15183 15188 
+ 15150 15154 15158 15174 15183 15190 
+ 15157 15160 15166 15171 15180 15184 
+ 12330 15094 15098 15186 15223 15229 
+ 15153 15157 15167 15169 15184 15188 
+ 15152 15156 15163 15177 15181 15187 
+ 15141 15156 15161 15181 15192 15193 
+ 15158 15163 15168 15177 15189 15190 
+ 15146 15147 15164 15182 15191 15202 
+ 15155 15159 15164 15178 15191 15194 
+ 15163 15172 15174 15187 15189 
+ 15159 15166 15176 15180 15194 15196 
+ 15106 15121 15161 15192 15199 15208 
+ 15166 15169 15178 15184 15196 
+ 15156 15172 15173 15187 15193 15195 
+ 15129 15146 15162 15175 15202 15207 
+ 15154 15167 15168 15188 15190 15198 
+ 15169 15171 15180 15188 15196 15203 
+ 15125 15135 15162 15186 15207 15222 
+ 15094 15125 15170 15185 15222 15229 
+ 15172 15177 15181 15189 15195 15197 
+ 15167 15171 15183 15184 15198 15203 
+ 15174 15177 15187 15190 15197 15201 
+ 15168 15174 15183 15189 15198 15201 
+ 15164 15175 15176 15194 15202 15209 
+ 15161 15173 15179 15193 15205 15208 
+ 15173 15181 15192 15195 15204 15205 
+ 15176 15178 15191 15196 15209 15210 
+ 15181 15187 15193 15197 15204 15206 
+ 15178 15180 15184 15194 15203 15210 
+ 15187 15189 15195 15201 15206 15211 
+ 15183 15188 15190 15201 15203 15214 15216 
+ 15121 15144 15179 15208 15212 15230 15237 
+ 120 168 15165 15249 15268 
+ 15189 15190 15197 15198 15211 15214 
+ 15175 15182 15191 15207 15209 15225 
+ 15184 15188 15196 15198 15210 15216 15221 
+ 15193 15195 15205 15206 15213 
+ 15192 15193 15204 15208 15213 15217 
+ 15195 15197 15204 15211 15213 15215 
+ 15162 15182 15185 15202 15222 15225 15238 
+ 15179 15192 15199 15205 15217 15230 
+ 15191 15194 15202 15210 15225 15227 
+ 15194 15196 15203 15209 15221 15227 
+ 15197 15201 15206 15214 15215 15219 
+ 15133 15144 15199 15218 15237 15248 
+ 15204 15205 15206 15215 15217 15224 
+ 15198 15201 15211 15216 15219 15226 
+ 15206 15211 15213 15219 15224 15228 
+ 15198 15203 15214 15221 15226 15231 
+ 15205 15208 15213 15224 15230 15233 
+ 15071 15133 15212 15220 15248 15260 
+ 15211 15214 15215 15226 15228 15232 
+ 5176 15053 15071 15218 15242 15260 15270 
+ 15203 15210 15216 15227 15231 15235 
+ 15185 15186 15207 15229 15238 15246 
+ 15098 15165 15170 15229 15249 15252 
+ 15213 15215 15217 15228 15233 15234 
+ 15202 15207 15209 15227 15238 15240 
+ 15214 15216 15219 15231 15232 15236 
+ 15209 15210 15221 15225 15235 15240 
+ 15215 15219 15224 15232 15234 
+ 15170 15186 15222 15223 15246 15252 
+ 15199 15208 15217 15233 15237 15244 
+ 15216 15221 15226 15235 15236 15239 
+ 15219 15226 15228 15234 15236 15241 
+ 15217 15224 15230 15234 15243 15244 
+ 15224 15228 15232 15233 15241 15243 
+ 15221 15227 15231 15239 15240 15247 
+ 15226 15231 15232 15239 15241 15245 
+ 15199 15212 15230 15244 15248 15256 
+ 15207 15222 15225 15240 15246 15255 15259 
+ 15231 15235 15236 15245 15247 15250 
+ 15225 15227 15235 15238 15247 15255 
+ 15232 15234 15236 15243 15245 15251 
+ 15053 15123 15220 15270 
+ 15233 15234 15241 15244 15251 15254 
+ 15230 15233 15237 15243 15254 15256 
+ 15236 15239 15241 15250 15251 15253 
+ 15222 15229 15238 15252 15259 15265 
+ 15235 15239 15240 15250 15255 15257 
+ 15212 15218 15237 15256 15260 15267 
+ 15165 15200 15223 15252 15268 15269 
+ 15239 15245 15247 15253 15257 
+ 15241 15243 15245 15253 15254 15258 
+ 15223 15229 15246 15249 15265 15269 
+ 15245 15250 15251 15257 15258 15261 
+ 15243 15244 15251 15256 15258 15262 
+ 15238 15240 15247 15257 15259 15263 
+ 15237 15244 15248 15254 15262 15267 
+ 15247 15250 15253 15255 15261 15263 15266 
+ 15251 15253 15254 15261 15262 15264 
+ 15238 15246 15255 15263 15265 15271 
+ 15218 15220 15248 15267 15270 15275 
+ 15253 15257 15258 15264 15266 
+ 15254 15256 15258 15264 15267 15273 
+ 15255 15257 15259 15266 15271 15272 
+ 15258 15261 15262 15266 15273 15274 
+ 15246 15252 15259 15269 15271 15276 
+ 15257 15261 15263 15264 15272 15274 
+ 15248 15256 15260 15262 15273 15275 15277 
+ 15200 15249 15269 15281 
+ 15249 15252 15265 15268 15276 15281 
+ 15220 15242 15260 15275 
+ 15259 15263 15265 15272 15276 15280 
+ 15263 15266 15271 15274 15278 15280 
+ 15262 15264 15267 15274 15277 15279 
+ 15264 15266 15272 15273 15278 15279 
+ 15260 15267 15270 15277 
+ 15265 15269 15271 15280 15281 15285 
+ 15267 15273 15275 15279 15282 
+ 15272 15274 15279 15280 15283 15284 
+ 15273 15274 15277 15278 15282 15283 
+ 15271 15272 15276 15278 15284 15285 
+ 15268 15269 15276 15285 
+ 15277 15279 15283 
+ 15278 15279 15282 15284 
+ 15278 15280 15283 15285 
+ 15276 15280 15281 15284 
+ 528 535 555 562 580 582 
+ 637 640 660 664 682 686 
+ 661 662 683 687 703 706 
+ 668 675 694 695 711 
+ 692 701 736 744 
+ 817 828 854 863 901 902 926 
+ 864 867 948 994 1072 1170 
+ 1035 1042 1064 1076 1101 1106 
+ 1270 1276 1301 1318 1340 1350 
+ 1277 1286 1305 1321 1335 1348 
+ 1394 1401 1431 1453 1477 1488 
+ 797 809 1443 1882 1984 2261 
+ 1441 1445 1483 1487 1520 1523 
+ 527 813 1264 2019 2447 2587 
+ 1500 1505 1541 1546 1579 1591 
+ 1585 1586 1619 1621 1653 1655 
+ 1791 1823 1864 1889 1933 1980 
+ 1934 1941 1969 1992 
+ 1953 1959 1976 1990 2001 2010 
+ 1971 1994 2017 2023 
+ 1975 1985 1988 2005 2020 2028 
+ 2119 2126 2127 2151 2156 2179 
+ 2204 2228 2247 2278 2287 2300 
+ 2244 2284 2373 2449 2596 2606 
+ 2392 2417 2436 2503 2515 2546 
+ 2458 2471 2473 2497 2512 15312 
+ 2471 2483 2511 2512 2524 15311 
+ 2526 2554 2561 2621 2623 2653 
+ 2559 2568 2588 2597 2617 2619 
+ 2583 2621 2625 2688 2703 2727 
+ 2675 2694 2698 2728 2731 2744 
+ 2722 2723 2730 2751 
+ 2710 2717 2747 2748 2793 2794 
+ 2720 2731 2737 2763 2770 2780 
+ 2718 2719 2745 2748 2786 2791 
+ 2763 2780 2781 2800 2810 2814 
+ 2738 2778 2801 2850 2855 2893 2896 
+ 2764 2768 2847 2863 2957 3005 3030 
+ 2879 2887 2904 2921 2927 
+ 2829 2847 2882 2957 2971 3015 
+ 2828 2857 2868 2952 3002 3044 
+ 2910 2913 2942 2946 2964 2966 
+ 2912 2949 2956 2987 2994 
+ 2854 2901 2916 3083 3125 3158 
+ 2951 2974 2980 3004 3006 3025 
+ 2957 3015 3030 3073 3112 3146 
+ 3041 3050 3058 3075 3096 3101 
+ 3047 3048 3071 3074 3103 3105 
+ 3005 3030 3112 3127 3174 15337 
+ 3105 3106 3131 3133 3164 3166 
+ 3113 3116 3154 3156 3177 3178 
+ 3112 3174 3176 3207 15334 
+ 3157 3160 3182 3186 3221 3222 
+ 3223 3233 3264 3288 3331 3341 
+ 3192 3204 3288 3313 3354 3365 
+ 3257 3283 3293 3342 3361 3369 
+ 3289 3295 3318 3328 3349 3352 
+ 3210 3251 3303 3335 3398 3458 
+ 3280 3286 3337 3376 
+ 3268 3304 3320 3424 3438 15348 
+ 3361 3382 3403 3411 3431 3435 3443 
+ 3397 3410 3469 3486 3537 3543 
+ 3424 3438 3541 3556 15345 
+ 3423 3436 3477 3517 3555 3569 
+ 2312 3001 3581 3994 4134 
+ 3492 3503 3512 3530 3547 3552 
+ 3576 3578 3607 3608 3635 3637 
+ 3586 3587 3605 3610 3631 3634 
+ 3604 3617 3671 3686 3729 3732 
+ 2261 3001 3305 3994 4172 4323 
+ 3729 3732 3781 3831 15357 15358 
+ 3732 3738 3789 3848 15356 15358 
+ 3831 3848 3874 15356 15357 15360 
+ 3845 3850 3858 3873 3887 3890 
+ 3848 3874 3910 3915 3927 15358 
+ 3908 3910 3932 3957 3959 3970 
+ 3930 3935 3951 3981 4004 4007 
+ 3977 3983 3999 4012 4021 4030 
+ 2447 2587 3675 4169 4463 4762 
+ 4077 4080 4095 4102 4122 4126 
+ 4075 4076 4119 4120 4164 4168 
+ 4155 4160 4173 4187 4195 4208 
+ 4263 4269 4346 4358 4446 4458 
+ 4364 4366 4385 4392 4408 4445 4448 
+ 4499 4506 4529 4536 4556 4564 
+ 4550 4558 4580 4590 4609 4613 
+ 4708 4720 4726 4748 4758 4767 
+ 4775 4785 4797 4813 4832 4837 
+ 2062 4176 4383 5180 5221 5528 
+ 4794 4835 4884 4954 4960 4993 
+ 4890 4899 4915 4929 4948 4955 
+ 4933 4978 4992 5038 5066 5078 
+ 5024 5037 5045 5074 5081 5098 
+ 5090 5097 5118 5132 5150 5159 
+ 5218 5228 5301 5398 5402 5493 
+ 5368 5386 5399 5435 5443 5461 
+ 6342 6352 6380 6397 
+ 6481 6493 6513 6539 6557 6574 
+ 6728 6741 6768 6785 6804 6812 
+ 6862 6883 6927 6946 6994 7005 
+ 6750 6765 6825 6987 7006 7346 7379 
+ 7801 7802 7829 7837 7864 7865 
+ 7910 7918 7928 7956 7962 7978 
+ 7971 7974 7998 8002 8031 8032 
+ 7979 7991 7992 8024 8039 8053 
+ 8149 8159 8181 8205 8228 8239 
+ 8193 8200 8273 8276 8371 8391 
+ 8095 8119 8291 8344 8450 8516 
+ 8356 8368 8375 8408 8411 8428 
+ 8371 8391 8436 8499 8532 8574 
+ 8455 8504 8511 8540 8579 8611 8625 
+ 8450 8460 8542 8649 8658 8730 
+ 8551 8579 8583 8628 8664 15400 
+ 8602 8606 8639 8647 8684 8685 
+ 8579 8625 8664 8700 8706 15398 
+ 8597 8612 8653 8665 8704 8707 
+ 8696 8724 8757 8761 
+ 8784 8787 8822 8824 8857 8863 
+ 8823 8836 8874 8896 
+ 8860 8873 8901 8907 8923 8932 
+ 8874 8885 8896 8921 8937 8950 
+ 8890 8894 8929 8940 8970 8978 
+ 8889 8904 8946 8985 9026 9063 
+ 8938 8959 8960 8991 9013 15412 
+ 8910 8925 8957 8997 9023 15414 
+ 8958 8971 8973 9002 9006 9020 
+ 8960 8981 9013 9022 9058 9059 15409 
+ 8989 9000 9038 9061 9077 9093 
+ 8997 9023 9081 9099 9128 15410 
+ 9045 9046 9072 9076 9105 9108 
+ 9051 9060 9071 9091 9104 9115 
+ 9018 9047 9061 9113 9116 9149 
+ 8943 8962 9050 9236 9287 15421 
+ 9052 9069 9082 9126 9141 9164 
+ 9083 9087 9110 9120 9131 9150 
+ 8919 8962 9146 9287 9352 15418 
+ 8177 8194 8306 8519 9305 10106 10842 10865 
+ 9026 9063 9081 9156 9182 9213 
+ 8975 9011 9134 9137 9280 9289 
+ 9048 9073 9096 9160 9184 9214 
+ 9122 9138 9152 9176 9196 9204 
+ 9107 9108 9151 9153 9193 9194 9205 
+ 9180 9197 9207 9230 9245 9251 
+ 9186 9199 9210 9233 9249 9259 
+ 9193 9205 9211 9241 9248 9258 
+ 9196 9204 9216 9240 9253 15433 
+ 9203 9210 9230 9249 9263 9276 
+ 9240 9253 9292 9306 15431 15434 
+ 9240 9248 9283 9306 9318 15433 
+ 9182 9213 9269 9552 15439 15457 
+ 9256 9277 9295 9349 9354 9378 
+ 8867 8969 9074 9325 9761 9935 15475 
+ 9283 9293 9318 9322 9355 9360 
+ 9208 9213 9298 9510 9552 15435 
+ 9303 9315 9331 9372 9384 15442 
+ 9264 9309 9333 9370 9404 9415 
+ 9315 9323 9361 9384 9391 15440 
+ 9311 9322 9344 9360 9402 9409 
+ 9307 9338 9362 9400 9435 15449 
+ 9329 9351 9357 9397 9405 15453 
+ 9269 9273 9411 9534 15457 
+ 9361 9376 9391 9417 9434 9443 
+ 9257 9298 9340 9462 9510 9581 
+ 9362 9419 9435 9461 9474 15444 
+ 9319 9369 9387 9465 9568 15462 
+ 9028 9117 9274 9550 9885 10046 
+ 9333 9347 9404 9421 9494 9502 
+ 9397 9405 9438 9449 9467 15445 
+ 9381 9394 9406 9444 15458 15460 
+ 9236 9287 9366 9533 9612 15478 
+ 9393 9406 9429 9475 9491 15458 
+ 9269 9534 9552 15435 15446 15476 
+ 9406 9491 9508 15454 15456 15460 
+ 9419 9431 9461 9476 9497 9505 
+ 9444 9508 15454 15458 15464 15465 
+ 9443 9455 9481 9506 9526 9544 
+ 9387 9462 9568 9597 15450 15472 
+ 9460 9477 9498 9528 9542 9564 
+ 9444 9463 9545 9599 15460 15465 
+ 9508 9570 9599 15460 15464 15470 
+ 9529 9560 9566 9598 9613 9629 
+ 9535 9556 9576 9607 9621 9647 
+ 9526 9544 9567 9607 9619 9651 
+ 9554 9579 9588 9625 9631 9642 
+ 9570 9599 9603 9654 15465 15477 
+ 9580 9596 9609 9635 
+ 9568 9597 9644 9686 9700 15462 
+ 9411 9478 9534 9676 9727 15483 
+ 9352 9468 9533 9744 9802 15480 
+ 9074 9274 9885 9935 10139 15437 
+ 9534 9552 9727 9755 9816 15457 
+ 9599 9654 9659 9716 9734 15470 
+ 9533 9612 9744 9771 9839 15455 
+ 9704 9717 9736 9772 
+ 9468 9680 9802 9912 9944 15474 
+ 9729 9738 9752 9778 9790 9803 
+ 9701 9716 9743 9789 9791 9823 
+ 9676 9727 9829 9879 9932 15473 
+ 9773 9783 9853 9859 9874 
+ 9823 9846 9871 9887 9896 
+ 9876 9883 9907 9939 
+ 9784 9815 9949 10004 10025 10100 
+ 9888 9905 9926 9955 9976 9985 
+ 9906 9908 9936 9946 9969 9973 
+ 9904 9911 9937 9952 9972 9978 
+ 9854 9892 9956 9975 10021 10027 
+ 9940 9946 9973 9982 10007 10014 
+ 9921 9943 9966 10029 10051 10085 
+ 10016 10024 10054 10076 
+ 10058 10075 10080 10107 10112 10121 
+ 10127 10132 10148 10165 10179 10183 
+ 10100 10152 10167 10217 10263 10274 
+ 10203 10204 10230 10233 10251 10253 
+ 10248 10260 10289 10307 
+ 10255 10256 10281 10285 10310 10313 
+ 10264 10296 10297 10332 10367 10369 15502 
+ 10296 10320 10364 10369 10385 15501 
+ 10323 10352 10382 10394 10434 10444 
+ 10370 10387 10388 10421 10423 10432 
+ 10280 10334 10415 10576 10596 10685 
+ 10530 10546 10547 10574 10580 10591 
+ 10645 10654 10659 10683 10691 10697 
+ 10694 10705 10711 10732 10754 10755 
+ 10719 10722 10736 10746 10759 10766 
+ 10770 10772 10811 10847 10873 
+ 10738 10788 10818 10883 10943 15514 
+ 10851 10860 10868 10888 10898 10910 
+ 10852 10870 10920 10931 10967 10969 
+ 10818 10908 10943 11015 11029 15511 
+ 11151 11162 11174 11197 11217 11229 
+ 11155 11156 11192 11231 
+ 11255 11264 11303 11349 11385 11427 
+ 11383 11414 11416 11457 11470 11522 
+ 11364 11375 11508 11518 11648 11763 
+ 11524 11533 11562 11580 11601 11613 
+ 11560 11596 11605 11637 11673 11676 
+ 11569 11614 11616 11681 11722 11803 
+ 11589 11604 11650 11659 11714 11731 
+ 11609 11632 11642 11698 11704 11741 
+ 11626 11652 11662 11715 11721 11787 
+ 11703 11772 11783 11817 
+ 11755 11757 11800 11822 11824 
+ 11743 11752 11792 11845 11851 11882 
+ 11790 11827 11851 11870 11916 11926 
+ 11799 11820 11846 11932 
+ 11934 11977 11980 12017 12055 12073 
+ 11963 11981 12005 12050 12069 12093 
+ 12022 12062 12082 12123 12135 
+ 12044 12096 12102 12213 12222 12276 
+ 12099 12125 12129 12184 12192 12227 
+ 12161 12179 12182 12247 12251 12289 
+ 12229 12259 12283 12358 
+ 12271 12290 12336 12342 12378 12392 
+ 12183 12253 12274 12441 12450 12561 
+ 12307 12342 12356 12407 12422 12444 
+ 12226 12284 12325 12397 12532 12605 
+ 12140 12231 12389 12476 12628 12736 
+ 12152 12295 12317 12549 12913 13041 
+ 8166 10539 10767 13752 15579 15601 
+ 12406 12446 12467 12538 12568 12589 
+ 12432 12479 12480 12578 12584 12631 
+ 12490 12503 12535 12564 12587 12602 
+ 12541 12611 12653 15550 
+ 12552 12557 12604 12615 12639 
+ 12541 12574 12653 12655 12690 15548 
+ 12566 12575 12607 12627 12664 12674 
+ 12592 12593 12626 12635 12679 12688 
+ 12573 12610 12612 12689 12740 15556 
+ 12599 12608 12662 12669 12698 
+ 12589 12613 12660 12685 12738 12743 
+ 12612 12655 12734 12740 12783 15553 
+ 12646 12685 12689 12738 12769 12801 
+ 12766 12774 12809 12835 12865 12872 
+ 12801 12815 12859 12896 12955 12972 
+ 12834 12843 12875 12893 12924 12932 
+ 12830 12854 12870 12914 12964 15563 
+ 12867 12886 12898 12936 12939 
+ 12870 12911 12964 12981 13004 15561 
+ 12932 12945 12956 12977 13023 13079 13097 
+ 12963 12981 13002 13034 13050 13066 
+ 13070 13084 13087 13116 13117 13140 
+ 13019 13039 13058 13083 13151 13156 
+ 13044 13091 13092 13173 13177 13205 
+ 13153 13159 13227 13259 13310 13342 
+ 13250 13252 13273 13280 13303 13307 
+ 13262 13287 13298 13349 13393 13408 
+ 13763 13786 13787 13825 13846 15573 
+ 13786 13802 13844 13846 13869 15572 
+ 13924 13967 13969 13987 
+ 13906 13919 13929 13964 13972 13986 
+ 13959 13976 13977 14017 
+ 13981 13983 14031 14054 14075 14085 
+ 13990 14000 14022 14047 14063 14082 
+ 10767 12039 14823 14938 15544 15601 
+ 14100 14118 14122 14166 14171 14188 
+ 14117 14138 14144 14181 14207 15585 
+ 14121 14139 14149 14178 14190 14205 
+ 14155 14185 14197 14212 
+ 14129 14149 14157 14190 14200 14217 
+ 14144 14171 14207 14214 14236 15581 
+ 14166 14184 14188 14221 14235 15588 
+ 14186 14206 14213 14249 
+ 14221 14235 14277 14415 15586 
+ 14222 14238 14246 14276 14286 14302 
+ 14236 14251 14258 14298 14306 14330 
+ 14268 14299 14312 14322 
+ 14263 14278 14291 14318 14329 14343 
+ 14279 14296 14309 14332 14348 14356 
+ 14286 14302 14314 14339 14350 14366 
+ 14353 14368 14381 14413 14424 14437 
+ 14330 14342 14395 14407 14462 14536 
+ 14386 14401 14413 14442 14453 14471 
+ 14437 14453 14465 14497 14507 14521 
+ 14454 14466 14485 14501 14523 14531 
+ 14493 14508 14519 14551 
+ 13752 14768 14938 14964 15544 15579 
+ 14598 14605 14633 14638 14679 14686 
+ 14701 14716 14720 14750 14754 14767 
+ 14708 14714 14736 14756 14775 
+ 14735 14748 14755 14770 14784 14792 
+ 14857 14862 14872 14880 14891 
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/metis.mesh
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/metis.mesh	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/metis.mesh	(revision 9501)
@@ -0,0 +1,7435 @@
+7434 1
+ 3708 57 2094
+ 25 308 2956
+ 2411 1300 2468
+ 1246 3012 3401
+ 3765 920 2854
+ 54 613 3240
+ 89 2428 4
+ 544 545 2198
+ 3721 8 1879
+ 826 2760 3239
+ 3047 1564 3916
+ 2086 1466 3119
+ 87 88 3004
+ 1425 1879 3139
+ 957 2775 2199
+ 2033 1418 3718
+ 2243 280 28
+ 962 1638 2942
+ 271 272 2256
+ 1008 1645 3104
+ 3269 246 247
+ 2066 20 256
+ 272 17 1771
+ 103 104 1755
+ 2040 1430 3732
+ 2223 3064 36
+ 1255 2946 2947
+ 254 3509 253
+ 581 582 2059
+ 455 456 3837
+ 274 2070 273
+ 32 3729 3082
+ 33 377 2776
+ 424 425 2879
+ 31 2274 325
+ 3648 467 468
+ 3938 943 2413
+ 1339 2291 3560
+ 2893 430 431
+ 611 612 3197
+ 1309 3652 2716
+ 1088 2230 2833
+ 449 450 2441
+ 3899 40 427
+ 453 2930 452
+ 1054 1775 2407
+ 427 428 2508
+ 575 576 3777
+ 129 130 2086
+ 477 3949 2340
+ 3327 1520 3817
+ 1626 444 445
+ 404 35 2623
+ 554 2927 553
+ 2232 1094 2835
+ 309 1751 308
+ 619 1721 3461
+ 280 3005 279
+ 3 57 3708
+ 138 139 1761
+ 1178 2094 2723
+ 1836 59 60
+ 1179 1836 2742
+ 61 2027 1
+ 62 63 2339
+ 63 64 3051
+ 64 65 3585
+ 65 66 3429
+ 66 67 2422
+ 67 68 1738
+ 68 69 2545
+ 69 70 2017
+ 164 165 2791
+ 70 71 3516
+ 71 72 2343
+ 72 73 3893
+ 630 631 2101
+ 631 55 3058
+ 2812 73 74
+ 1749 2812 3965
+ 768 2090 3699
+ 1753 3031 3968
+ 2491 77 78
+ 1649 78 79
+ 2153 79 80
+ 1467 3838 3143
+ 2418 81 82
+ 1265 2418 3165
+ 2471 748 3194
+ 2 85 2483
+ 85 86 1788
+ 86 87 2312
+ 5 3593 94
+ 100 6 2429
+ 3493 89 90
+ 2424 90 91
+ 3567 91 92
+ 2131 92 93
+ 1723 2131 3745
+ 96 2132 3746
+ 2226 1015 2425
+ 97 2132 96
+ 2110 1332 3597
+ 99 2425 98
+ 2953 104 7
+ 6 101 4023
+ 101 102 2994
+ 102 103 2415
+ 3212 1415 4019
+ 3282 7 105
+ 4019 105 106
+ 3212 106 107
+ 116 117 3734
+ 117 118 2802
+ 118 119 3847
+ 119 120 3210
+ 120 121 2652
+ 121 122 3851
+ 122 123 3217
+ 123 124 2655
+ 2041 1420 3722
+ 128 2041 127
+ 13 193 3738
+ 57 58 2094
+ 130 131 3024
+ 131 132 2541
+ 132 9 3572
+ 1761 1095 2500
+ 1971 9 133
+ 134 3903 133
+ 135 3546 134
+ 136 2448 135
+ 825 2588 3295
+ 1381 1761 3524
+ 2065 140 141
+ 3757 141 142
+ 3761 1095 2693
+ 1122 1969 3826
+ 1321 1720 3227
+ 144 2134 143
+ 3579 889 1677
+ 146 2319 145
+ 147 2790 146
+ 148 2767 147
+ 3705 148 149
+ 12 150 149
+ 149 150 3705
+ 150 151 3705
+ 151 152 2767
+ 152 153 2758
+ 153 154 2279
+ 11 156 2499
+ 2270 157 158
+ 2768 159 160
+ 3706 160 161
+ 10 162 161
+ 2726 158 159
+ 163 2768 3706
+ 1745 1205 2923
+ 164 1695 2768
+ 2270 158 2726
+ 2318 165 166
+ 166 167 1678
+ 167 168 2135
+ 168 169 2524
+ 169 170 3750
+ 170 171 2053
+ 1574 735 3761
+ 172 173 3406
+ 173 174 2372
+ 174 175 1856
+ 1624 1112 2570
+ 2460 178 3
+ 179 2284 16
+ 180 181 2844
+ 181 182 2397
+ 182 183 3001
+ 183 184 1843
+ 184 185 2583
+ 185 186 1918
+ 186 187 3290
+ 187 188 1920
+ 188 189 2554
+ 189 190 1700
+ 190 191 2546
+ 191 192 1928
+ 192 13 3302
+ 126 2033 125
+ 3722 127 2041
+ 196 3717 2798
+ 3718 125 2033
+ 2033 1420 2798
+ 2655 124 3718
+ 1423 2652 3851
+ 3211 198 199
+ 2652 121 3851
+ 2035 115 116
+ 2034 1421 3848
+ 1419 2037 3723
+ 202 3216 201
+ 2037 113 114
+ 3847 2802 118
+ 1416 2038 3724
+ 204 3733 2034
+ 2038 111 112
+ 3733 205 2797
+ 1426 2803 3720
+ 1419 2035 2797
+ 2036 1424 2803
+ 3736 207 2799
+ 1424 2392 3716
+ 1416 2037 2799
+ 2392 107 108
+ 210 3731 2804
+ 3731 211 2036
+ 2803 3716 109
+ 212 2036 211
+ 214 1579 2654
+ 215 3397 3215
+ 3397 216 14
+ 243 21 2883
+ 2955 230 15
+ 14 217 2954
+ 217 218 1756
+ 218 219 2527
+ 219 220 1997
+ 220 221 3521
+ 221 222 1956
+ 222 223 2555
+ 223 224 1713
+ 224 225 2537
+ 225 226 1944
+ 226 227 3292
+ 227 228 1982
+ 228 229 2549
+ 1203 1925 2846
+ 1428 2946 3726
+ 2039 1428 2801
+ 234 18 3725
+ 235 2940 18
+ 2645 236 237
+ 1898 237 238
+ 957 1807 2940
+ 809 2107 2769
+ 2374 251 19
+ 1433 4032 3895
+ 241 3157 240
+ 242 2262 241
+ 243 3425 242
+ 21 244 2883
+ 3270 244 245
+ 1810 245 246
+ 22 2882 247
+ 22 248 2882
+ 2374 1202 2638
+ 2168 1202 2919
+ 254 255 2669
+ 1852 19 252
+ 1212 1852 2944
+ 255 20 1747
+ 2881 259 23
+ 24 2884 263
+ 256 257 2786
+ 257 258 1696
+ 258 259 3192
+ 2171 1215 3096
+ 3268 260 261
+ 1811 261 262
+ 3271 262 263
+ 1239 2171 3130
+ 265 3267 264
+ 2568 267 268
+ 3267 265 1782
+ 1618 1107 3606
+ 269 3446 268
+ 17 3378 1771
+ 2256 1553 3981
+ 17 273 2942
+ 3243 274 275
+ 3815 275 276
+ 2817 276 16
+ 351 352 2603
+ 29 277 2000
+ 277 278 3266
+ 278 279 1989
+ 298 299 3671
+ 28 281 2807
+ 281 282 3306
+ 285 3502 284
+ 1688 1285 3341
+ 2341 1131 1799
+ 285 286 1800
+ 286 287 3000
+ 287 288 2099
+ 288 289 2518
+ 289 290 3362
+ 290 291 3078
+ 291 292 2122
+ 292 293 2730
+ 2109 758 2455
+ 26 2231 303
+ 295 296 2286
+ 296 297 3124
+ 297 298 2538
+ 3359 299 27
+ 1645 297 2538
+ 715 1597 2970
+ 2095 301 302
+ 233 234 2040
+ 305 3728 2800
+ 304 2800 3727
+ 2801 3726 231
+ 3037 377 378
+ 2528 309 310
+ 1995 310 311
+ 1977 761 2874
+ 1957 312 313
+ 2556 313 314
+ 1714 314 315
+ 2536 315 316
+ 1945 316 317
+ 1985 747 2823
+ 1981 318 319
+ 2997 319 320
+ 2210 320 321
+ 3101 321 32
+ 3719 33 3081
+ 1417 3082 3729
+ 2653 322 323
+ 3214 323 324
+ 31 326 3424
+ 1950 1022 2126
+ 328 1950 327
+ 329 30 2597
+ 328 329 3127
+ 1190 1950 3127
+ 2126 327 1950
+ 2847 331 332
+ 3500 332 333
+ 334 2924 333
+ 335 3974 334
+ 336 2413 335
+ 358 2281 357
+ 29 1815 2085
+ 356 2941 355
+ 355 4016 354
+ 1408 2408 3488
+ 2383 343 344
+ 3310 344 345
+ 2476 345 346
+ 4009 1187 2901
+ 2395 347 348
+ 3504 348 29
+ 1878 352 36
+ 35 349 3166
+ 349 350 2419
+ 350 351 3428
+ 1438 3813 3404
+ 342 2408 341
+ 3512 710 2759
+ 2224 1439 3405
+ 338 2409 337
+ 2409 1407 3487
+ 713 3831 1728
+ 1864 1072 2507
+ 1864 1323 3393
+ 360 1864 359
+ 1774 1072 2482
+ 1322 2030 3392
+ 1794 364 365
+ 2030 1322 3748
+ 1298 3415 3551
+ 2100 367 368
+ 1298 3551 3029
+ 325 3849 324
+ 1813 784 2610
+ 386 2676 385
+ 2697 1544 3629
+ 417 418 3438
+ 2635 371 3629
+ 381 382 3582
+ 3629 372 2697
+ 34 381 1743
+ 3213 374 375
+ 1422 2697 3850
+ 2653 3729 322
+ 1216 2879 3854
+ 3037 378 379
+ 3936 379 380
+ 3203 380 34
+ 383 384 1869
+ 3276 386 387
+ 3178 416 3554
+ 3825 39 3178
+ 437 39 3825
+ 394 395 3077
+ 395 396 3304
+ 396 397 2296
+ 1512 45 2895
+ 399 3945 2469
+ 3555 465 2684
+ 459 1792 458
+ 586 587 3376
+ 403 2289 402
+ 2005 1126 2577
+ 408 2005 407
+ 42 510 3877
+ 510 511 2400
+ 408 409 2608
+ 2029 413 414
+ 3602 984 2345
+ 1330 3511 2905
+ 2578 411 412
+ 414 415 3476
+ 415 37 3363
+ 383 2288 382
+ 1209 3841 3154
+ 3554 416 417
+ 3841 1011 1869
+ 1119 3915 2880
+ 1002 2857 2177
+ 421 3414 420
+ 424 2879 1854
+ 423 1791 422
+ 515 516 3436
+ 1916 405 406
+ 3804 426 38
+ 1819 2754 3952
+ 1798 1184 2774
+ 394 2154 393
+ 2754 391 392
+ 1511 1161 2269
+ 429 2651 428
+ 3059 431 432
+ 2102 390 391
+ 483 3479 45
+ 2282 433 434
+ 3622 925 2014
+ 436 437 3756
+ 2112 1271 3580
+ 2071 1324 2102
+ 2784 388 389
+ 1324 2866 2784
+ 481 482 2928
+ 2929 50 438
+ 440 44 3308
+ 441 3314 44
+ 1183 1932 3314
+ 2315 1036 2251
+ 443 3336 442
+ 2236 445 446
+ 487 3085 37
+ 488 1976 487
+ 448 3866 2520
+ 448 2520 447
+ 2209 694 1737
+ 451 1775 450
+ 2067 612 41
+ 3944 553 2927
+ 2930 51 452
+ 454 40 3309
+ 1171 3229 3686
+ 46 455 2200
+ 2623 1498 3583
+ 402 1868 401
+ 1193 1848 3946
+ 461 3413 460
+ 1010 1570 2630
+ 2853 1001 2176
+ 3092 1118 2794
+ 3945 399 400
+ 1010 3842 1868
+ 3555 464 465
+ 2469 398 399
+ 1208 3842 3439
+ 43 466 1816
+ 466 467 2581
+ 2093 740 3278
+ 2058 1595 3556
+ 472 2058 471
+ 3613 1278 2761
+ 720 1882 1698
+ 47 3432 593
+ 473 474 1941
+ 474 475 3480
+ 1171 2612 3693
+ 478 479 3283
+ 477 2340 48
+ 1895 479 49
+ 439 2929 438
+ 3261 49 480
+ 482 50 2928
+ 429 430 3375
+ 484 485 3953
+ 486 2885 485
+ 1538 925 2893
+ 443 444 2813
+ 488 489 3896
+ 1235 1874 3233
+ 48 3628 490
+ 413 2745 412
+ 1469 1905 3683
+ 2347 493 494
+ 2810 494 495
+ 3596 495 496
+ 1708 496 497
+ 1116 1708 2474
+ 1904 498 499
+ 1079 1904 2683
+ 1757 500 501
+ 1073 2206 2433
+ 2355 502 503
+ 1875 503 504
+ 2606 504 505
+ 3749 505 506
+ 3075 506 507
+ 2910 507 508
+ 2721 852 2896
+ 3388 509 42
+ 1752 229 230
+ 3749 506 3075
+ 1563 512 513
+ 669 2335 3800
+ 3203 34 2783
+ 3264 513 514
+ 3558 514 515
+ 517 518 2371
+ 518 519 3260
+ 2573 1259 2969
+ 2571 660 3951
+ 3641 519 520
+ 3291 318 1981
+ 1487 521 522
+ 3111 522 523
+ 3522 312 1957
+ 1647 524 525
+ 2549 229 1752
+ 2764 526 527
+ 1528 527 528
+ 3292 227 1982
+ 2937 529 530
+ 3144 530 531
+ 3521 221 1956
+ 976 1622 2254
+ 1606 533 534
+ 2050 1093 3408
+ 2521 535 536
+ 3035 536 537
+ 845 3013 3221
+ 2814 538 539
+ 2962 539 540
+ 3492 100 2429
+ 933 1492 2110
+ 1332 2110 3799
+ 545 546 3998
+ 546 547 2057
+ 547 548 1517
+ 548 54 2522
+ 549 1798 52
+ 2590 551 53
+ 827 2958 3538
+ 552 2590 53
+ 2927 554 51
+ 179 180 2844
+ 56 555 2699
+ 555 556 1475
+ 556 557 2987
+ 557 558 2864
+ 561 2544 560
+ 562 3711 3473
+ 1726 2714 3843
+ 3302 13 2167
+ 3711 562 563
+ 2086 1490 3868
+ 3290 187 1920
+ 2261 565 566
+ 3020 566 567
+ 769 1838 3857
+ 2364 568 569
+ 3891 569 570
+ 1258 1970 3299
+ 3107 888 1556
+ 1593 572 573
+ 3147 573 574
+ 576 577 3777
+ 577 578 2647
+ 3266 278 1989
+ 1129 2060 2519
+ 3566 578 579
+ 2625 579 580
+ 582 583 2501
+ 583 584 3122
+ 2191 1132 2897
+ 2794 885 3771
+ 2146 3744 3122
+ 586 3694 585
+ 3545 588 589
+ 3317 589 590
+ 923 3515 1793
+ 698 1339 2525
+ 3280 590 591
+ 3280 591 592
+ 3786 1440 3246
+ 594 3646 47
+ 595 3209 594
+ 606 2459 2920
+ 597 3806 596
+ 598 3333 597
+ 599 2124 598
+ 2145 1312 3418
+ 601 2145 600
+ 602 2295 601
+ 3182 1741 3668
+ 604 2239 603
+ 605 2909 604
+ 606 2920 605
+ 1565 1082 2459
+ 1443 3932 3358
+ 609 3067 608
+ 610 2580 609
+ 611 2019 610
+ 84 2127 83
+ 3311 922 2827
+ 1497 975 2354
+ 3435 1497 3940
+ 616 3435 615
+ 1687 1089 2922
+ 618 2741 617
+ 619 3461 618
+ 620 2984 619
+ 621 2984 620
+ 622 2671 621
+ 1967 1148 3645
+ 624 1847 623
+ 625 2856 624
+ 626 3536 625
+ 627 3475 626
+ 628 3933 627
+ 1659 1164 2782
+ 630 1659 629
+ 634 1555 633
+ 635 3320 634
+ 636 2462 635
+ 637 3073 636
+ 2092 1697 3796
+ 639 2092 638
+ 2097 1337 3300
+ 3697 2097 3134
+ 1060 2089 2303
+ 643 2624 642
+ 644 2899 643
+ 645 3992 644
+ 646 3992 645
+ 1764 705 1506
+ 648 3667 647
+ 649 2915 648
+ 2480 1447 3623
+ 56 2480 650
+ 2779 41 491
+ 492 1905 491
+ 2051 55 632
+ 1555 1061 2516
+ 3751 501 502
+ 1562 1032 2449
+ 733 1640 3153
+ 623 3892 622
+ 655 1683 3185
+ 642 3134 641
+ 1082 1565 2694
+ 2239 1371 3411
+ 3492 99 100
+ 544 2633 543
+ 294 295 3357
+ 1731 293 294
+ 3225 587 588
+ 458 1853 457
+ 3265 516 517
+ 424 1854 423
+ 1431 2648 2980
+ 596 2729 595
+ 2458 508 509
+ 937 1494 1998
+ 3335 947 2728
+ 2349 1361 3337
+ 2988 652 2513
+ 2728 1356 3335
+ 3525 558 559
+ 560 3958 559
+ 3272 1099 3519
+ 1845 666 2438
+ 3505 1630 3862
+ 656 2991 1935
+ 990 2454 2182
+ 2681 916 3657
+ 2862 511 512
+ 912 3109 2335
+ 1721 1115 2735
+ 617 3034 616
+ 3396 28 1970
+ 575 2644 574
+ 1664 570 571
+ 3095 1241 2996
+ 1631 567 568
+ 1314 673 2640
+ 3060 564 565
+ 1315 2129 3658
+ 2603 352 1878
+ 581 3329 580
+ 3004 88 2302
+ 3387 870 3859
+ 1492 540 541
+ 793 3526 3223
+ 2225 1750 3898
+ 593 3743 592
+ 177 178 3032
+ 176 177 4013
+ 3967 171 172
+ 2308 1930 3158
+ 3035 537 538
+ 1372 681 2660
+ 3303 534 535
+ 3927 682 2552
+ 1622 531 532
+ 3835 683 2689
+ 1387 655 2103
+ 1693 1130 3667
+ 1672 1154 3123
+ 2979 727 1533
+ 2968 528 529
+ 1368 686 2673
+ 3038 525 526
+ 3930 687 2547
+ 2386 523 524
+ 3834 688 2664
+ 3045 520 521
+ 3853 689 2649
+ 900 3228 2062
+ 1515 690 1906
+ 2283 1273 3763
+ 2565 691 1769
+ 2842 1475 3467
+ 3 3708 2891
+ 2072 1131 2359
+ 2718 693 2047
+ 2426 1252 2795
+ 807 2529 2702
+ 2453 776 3496
+ 1865 970 2361
+ 2215 1305 3541
+ 2598 911 2116
+ 2907 1404 3691
+ 2907 697 1975
+ 1849 3150 3591
+ 659 3946 3449
+ 2808 652 1687
+ 1658 1104 2865
+ 1120 1785 3801
+ 3273 1617 3798
+ 973 3838 2136
+ 4034 2542 3463
+ 1156 3355 3047
+ 613 2354 3240
+ 2001 865 1903
+ 3372 1889 3805
+ 1065 2695 2404
+ 1364 2497 2563
+ 1590 1068 2195
+ 1282 1780 2589
+ 2156 684 2753
+ 3316 706 1705
+ 1618 1128 3275
+ 1993 707 3275
+ 1808 235 236
+ 1949 1111 2007
+ 3281 709 2321
+ 353 354 3472
+ 361 362 1774
+ 971 1774 2030
+ 282 283 3698
+ 2939 283 284
+ 366 367 1724
+ 365 366 2390
+ 2012 356 357
+ 1323 2263 3830
+ 1384 996 2162
+ 714 3665 3052
+ 658 2727 1795
+ 303 3354 302
+ 951 3535 2235
+ 2399 791 3074
+ 1891 663 2493
+ 1017 3669 2505
+ 1998 1494 3244
+ 2733 937 1871
+ 3236 1442 3769
+ 632 2516 2051
+ 1371 2015 3103
+ 978 3163 2081
+ 1431 2980 3675
+ 754 2249 1496
+ 1611 1153 2932
+ 1099 3272 2711
+ 1277 2290 3453
+ 4028 723 1919
+ 3588 657 1329
+ 98 3568 97
+ 1035 1711 2485
+ 3048 1437 3605
+ 726 1833 2681
+ 795 2433 2206
+ 1302 2376 3114
+ 3519 1099 2348
+ 3197 612 2067
+ 727 1666 3482
+ 1987 1349 3417
+ 1987 729 2215
+ 2103 655 3137
+ 1387 2103 2706
+ 1879 8 3855
+ 564 1577 2990
+ 2448 136 1844
+ 1293 2672 3642
+ 1934 1354 3904
+ 1722 2744 3382
+ 1197 2044 3989
+ 1683 1148 3185
+ 1881 732 2672
+ 137 1844 136
+ 1510 1008 2297
+ 3046 1105 2194
+ 1900 2854 3656
+ 3533 679 2466
+ 1576 3219 3486
+ 1059 1835 2204
+ 2463 951 3448
+ 1389 2515 3614
+ 2179 1237 3390
+ 1152 1595 2093
+ 1143 2135 2524
+ 1745 741 2627
+ 2543 142 143
+ 1965 742 2276
+ 3095 902 1866
+ 672 2996 2678
+ 1958 1024 3542
+ 673 3852 2714
+ 2574 1071 2387
+ 992 1750 2225
+ 2073 1042 3638
+ 682 4005 2378
+ 2074 1044 3640
+ 687 4004 2379
+ 748 3910 2259
+ 1473 2054 3624
+ 749 2853 2176
+ 460 2615 459
+ 3188 1189 1805
+ 422 2616 421
+ 3616 909 2016
+ 1710 1231 2744
+ 2520 1531 3599
+ 447 3416 446
+ 753 3469 3135
+ 2502 1763 3097
+ 1941 1557 3762
+ 1395 2249 3828
+ 1049 1867 2650
+ 2575 1653 3547
+ 2136 841 3383
+ 670 3457 2202
+ 806 2454 1639
+ 1109 1639 3754
+ 1340 2820 2841
+ 1961 1340 3423
+ 2080 3651 3923
+ 1561 693 2718
+ 1084 1981 2997
+ 688 3768 2573
+ 2244 25 2956
+ 686 3753 2687
+ 810 2833 2230
+ 2265 1260 3759
+ 2247 14 2954
+ 681 3773 2670
+ 811 2836 2233
+ 677 3664 2532
+ 1333 3594 3365
+ 1584 1192 2839
+ 2795 766 2426
+ 2165 766 2208
+ 2849 1196 2918
+ 767 2750 3258
+ 2906 716 2157
+ 717 3707 3129
+ 1866 743 3990
+ 999 2211 2816
+ 1103 1989 3005
+ 4012 1125 2357
+ 3423 921 1961
+ 1553 1188 2698
+ 1214 3022 3506
+ 965 2525 2445
+ 2879 425 3364
+ 660 3692 3180
+ 1218 3013 2850
+ 3151 2461 1319
+ 1329 657 1939
+ 2298 1393 3164
+ 1363 2550 2934
+ 667 2981 1706
+ 1232 2472 2988
+ 1934 777 2917
+ 2267 726 1680
+ 3637 2736 667
+ 1305 1674 3187
+ 1154 1586 2734
+ 1968 1210 2604
+ 970 1706 2045
+ 1058 1903 3033
+ 730 1379 1955
+ 1946 1291 3534
+ 2752 729 3417
+ 2858 18 1807
+ 1457 3959 3887
+ 3385 712 2682
+ 370 2084 369
+ 785 3587 2992
+ 3594 1034 2510
+ 2155 483 484
+ 433 3617 432
+ 2539 1103 3994
+ 1196 2189 2918
+ 1228 2047 3207
+ 1012 1771 2467
+ 2031 1178 3689
+ 692 3631 2411
+ 1137 2586 2133
+ 2133 1621 3098
+ 1240 2399 3074
+ 3184 791 2089
+ 2990 563 564
+ 1435 1139 3298
+ 3223 2382 1220
+ 2250 1220 2959
+ 677 2532 3888
+ 2959 794 2250
+ 2304 726 2267
+ 2260 2991 656
+ 796 2478 3539
+ 662 2762 1972
+ 2317 1277 2548
+ 2317 797 1504
+ 718 3909 2220
+ 696 2385 3760
+ 3293 799 2831
+ 1033 1668 2396
+ 3393 359 1864
+ 800 3294 2832
+ 1763 1192 2828
+ 1141 2853 2447
+ 3625 33 2776
+ 689 3853 2695
+ 3632 725 2594
+ 3632 1508 3237
+ 1375 3264 3558
+ 700 1785 3450
+ 2237 1848 3447
+ 3503 2848 3790
+ 1639 1109 2622
+ 2454 990 2087
+ 1927 954 3027
+ 954 3113 3027
+ 808 2859 1587
+ 2978 1291 3090
+ 1366 1898 3312
+ 2531 1746 3356
+ 2947 25 2244
+ 2834 810 2229
+ 3274 14 2247
+ 2835 811 2232
+ 3995 994 2488
+ 2503 3675 661
+ 813 3647 1365
+ 1906 1365 3647
+ 1920 1024 2363
+ 1023 1918 2362
+ 815 2366 1343
+ 688 3834 3768
+ 2369 1087 1851
+ 1043 2367 1913
+ 1347 2167 2562
+ 1025 1928 2370
+ 2589 739 1772
+ 1636 2806 1037
+ 1305 2215 3248
+ 1452 3552 2444
+ 3128 670 1717
+ 2657 820 3752
+ 265 266 1782
+ 267 3040 266
+ 248 249 3132
+ 3132 249 250
+ 2806 1636 3189
+ 1705 706 3072
+ 824 2949 2463
+ 2241 1380 4015
+ 732 2142 1596
+ 981 4017 2026
+ 2011 1211 3057
+ 177 3032 4013
+ 827 3538 3287
+ 550 3044 549
+ 439 3963 2929
+ 3817 828 3327
+ 2188 1390 2783
+ 1009 1655 1909
+ 2186 906 1951
+ 561 1542 2544
+ 2740 1534 3549
+ 1409 1888 3765
+ 735 2076 1575
+ 3955 738 1787
+ 742 1999 2338
+ 2077 735 1574
+ 1607 1065 2668
+ 2819 834 1573
+ 1113 1635 2478
+ 1507 1026 2220
+ 2388 1481 3741
+ 2388 836 1526
+ 2300 694 1873
+ 2313 837 1594
+ 3238 666 2477
+ 607 1565 2459
+ 1956 1042 2557
+ 1091 2559 1991
+ 840 2560 1401
+ 1304 1994 2306
+ 1477 1923 3129
+ 1265 2127 3626
+ 3763 915 2283
+ 2009 3811 3883
+ 3931 693 2666
+ 1877 2841 758
+ 844 2792 3791
+ 677 2169 4007
+ 1509 2994 3964
+ 3013 845 3979
+ 2302 88 4
+ 1353 2128 3434
+ 2550 1363 3247
+ 3289 847 1531
+ 2423 706 2931
+ 1048 1550 2914
+ 1653 755 3547
+ 2090 1754 3914
+ 2379 1476 2540
+ 2908 850 3816
+ 1899 1442 3236
+ 901 1861 3897
+ 1614 495 3596
+ 668 3179 2449
+ 2378 1488 2504
+ 681 2670 2561
+ 2511 1975 3778
+ 1857 1402 2299
+ 1548 2518 3362
+ 2069 855 3433
+ 856 2680 3507
+ 856 2327 3563
+ 3171 857 3008
+ 939 3672 1885
+ 3150 678 3591
+ 1567 3208 3827
+ 2993 871 1495
+ 2646 1041 2540
+ 3230 2104 1078
+ 1650 715 2020
+ 861 3456 3353
+ 1408 2383 3939
+ 2413 1407 3938
+ 3352 1682 3957
+ 1478 2679 2904
+ 2888 671 2851
+ 2357 1483 4012
+ 1270 2352 3793
+ 3986 652 2808
+ 851 2781 1899
+ 2998 876 1500
+ 2619 1038 2504
+ 1350 1592 3224
+ 1671 3531 3774
+ 2003 1620 3595
+ 2701 868 3982
+ 1284 1685 3222
+ 346 1629 2476
+ 1770 702 3774
+ 1290 2257 2147
+ 2649 689 2533
+ 1495 980 3091
+ 2381 1201 3049
+ 2465 872 1736
+ 873 2967 4027
+ 671 2113 2111
+ 2162 874 1662
+ 3136 1384 2162
+ 2359 1414 2661
+ 2072 875 3279
+ 1535 2673 2686
+ 1500 976 3087
+ 1846 1198 3076
+ 3076 877 3775
+ 2780 1178 2031
+ 2933 878 3996
+ 1434 3140 3167
+ 3529 879 2855
+ 880 3043 1551
+ 1654 1150 2657
+ 2685 1432 3427
+ 1558 673 2427
+ 1658 719 2877
+ 3011 882 3688
+ 1698 987 3028
+ 598 2124 3333
+ 3161 1179 2515
+ 1938 1006 2753
+ 2630 461 462
+ 2965 749 1767
+ 1801 750 3120
+ 420 2629 419
+ 2171 1239 3079
+ 821 3130 2171
+ 1027 2512 2427
+ 1019 1556 3006
+ 1720 154 155
+ 2406 742 1730
+ 1678 167 2135
+ 156 1715 2499
+ 873 3466 2967
+ 711 3651 3315
+ 1661 281 3306
+ 1690 1285 3687
+ 2161 3803 3911
+ 1346 2434 3452
+ 2195 1299 3497
+ 65 3429 3585
+ 3041 1506 3615
+ 61 3654 2027
+ 1727 730 3993
+ 1692 1130 2320
+ 1672 696 2444
+ 653 1735 3670
+ 1164 1486 2330
+ 1773 898 1783
+ 1450 2787 3861
+ 1824 1464 3459
+ 2446 1173 3036
+ 3036 900 2446
+ 1784 1643 3196
+ 1955 1379 2190
+ 1689 181 2397
+ 3990 1241 3095
+ 2973 990 1858
+ 651 3696 2618
+ 1626 445 2236
+ 488 3896 1976
+ 2886 1587 4025
+ 808 2437 2530
+ 1264 2587 3331
+ 738 3219 1886
+ 2617 841 3131
+ 2082 1156 2696
+ 1532 3359 3540
+ 3501 715 1650
+ 1765 1028 2751
+ 3202 751 2016
+ 1760 3037 3936
+ 1364 2272 2497
+ 3065 798 2116
+ 1386 2116 2636
+ 669 3534 1617
+ 1568 3109 3823
+ 1598 1220 3873
+ 1939 913 1911
+ 3873 657 2869
+ 1391 3576 3907
+ 1397 1951 691
+ 9 3794 2950
+ 3696 651 2442
+ 1560 3183 3491
+ 917 2093 1595
+ 1609 2564 3508
+ 2926 721 1744
+ 1171 1824 3229
+ 1089 1687 2472
+ 663 1825 3680
+ 1317 2018 2738
+ 2566 2018 665
+ 1961 707 3810
+ 255 1747 2669
+ 1717 670 2202
+ 2708 1717 3311
+ 923 3577 1823
+ 47 2180 3432
+ 2913 434 435
+ 3580 924 2112
+ 1862 430 2893
+ 484 3953 2155
+ 2008 1286 3451
+ 745 2008 2662
+ 2358 1365 2936
+ 2936 927 2358
+ 1337 2097 3173
+ 3010 1727 3993
+ 2016 1451 3202
+ 623 1847 2253
+ 1896 1148 2715
+ 1809 777 2728
+ 3081 33 3625
+ 2649 1360 3853
+ 658 3465 3887
+ 708 3712 3350
+ 933 1455 2722
+ 794 2130 4029
+ 1121 1806 3016
+ 2090 934 1749
+ 1733 1889 3372
+ 655 1967 3137
+ 2939 1876 3789
+ 1980 936 1800
+ 1174 1871 3105
+ 1871 1170 2733
+ 938 1923 1753
+ 717 2739 3371
+ 939 1493 3084
+ 727 3672 1533
+ 2724 3368 1541
+ 1517 940 2057
+ 2011 1359 3569
+ 826 3239 2011
+ 2725 1453 3328
+ 726 1947 3190
+ 1198 1937 3070
+ 862 2022 3199
+ 2023 861 3200
+ 1922 1187 3089
+ 945 2360 1857
+ 1651 945 2059
+ 2006 1111 2455
+ 2109 946 3678
+ 2728 777 2049
+ 947 1867 2843
+ 948 1597 1933
+ 860 2719 3935
+ 1033 1724 3106
+ 784 2048 3415
+ 2438 666 3238
+ 610 2019 2580
+ 2235 1355 3448
+ 705 2481 3242
+ 2086 130 3024
+ 2983 952 2637
+ 1704 2637 731
+ 3019 1704 731
+ 2872 1936 685
+ 3885 954 2618
+ 1393 2443 3164
+ 2132 1723 3746
+ 2231 26 1925
+ 3528 956 3501
+ 1729 2107 3094
+ 3350 2775 708
+ 2672 732 3642
+ 958 3610 2076
+ 1292 3295 2142
+ 2163 1311 3349
+ 960 2841 2820
+ 658 2007 1583
+ 961 3048 2174
+ 1437 3048 3146
+ 3259 3039 1414
+ 273 2070 2942
+ 2106 240 3157
+ 1366 2106 3633
+ 804 3174 2266
+ 1740 964 2309
+ 965 1615 3449
+ 1339 2445 2525
+ 966 1665 3750
+ 680 2572 3254
+ 2241 739 1790
+ 818 2452 1387
+ 2065 141 3757
+ 3148 1122 2091
+ 1769 691 2867
+ 1459 969 2365
+ 970 2045 2187
+ 994 1935 2356
+ 799 3293 2246
+ 2010 1739 2871
+ 2012 357 2281
+ 1728 3343 3884
+ 1828 3129 3339
+ 841 2136 3987
+ 3149 1432 3875
+ 565 2261 3060
+ 820 2708 2184
+ 1470 3240 3458
+ 976 1500 2873
+ 866 1612 2771
+ 2025 725 3632
+ 1608 977 2909
+ 3163 1437 720
+ 3103 978 2295
+ 2088 738 1886
+ 832 2141 3462
+ 980 1495 2986
+ 1616 980 2840
+ 2091 1122 2338
+ 1962 2332 741
+ 2342 819 3226
+ 1076 2203 2778
+ 2490 654 1536
+ 1361 2974 3337
+ 2345 1369 3602
+ 2345 984 2139
+ 1191 2085 2331
+ 2166 1446 2750
+ 1312 2081 2957
+ 1267 1832 2225
+ 1882 961 1872
+ 3481 883 3028
+ 988 3288 2321
+ 3288 988 2223
+ 989 1681 2759
+ 1438 3353 3813
+ 1281 3142 3133
+ 668 2377 3179
+ 3864 1283 3168
+ 3864 991 2752
+ 992 1837 1915
+ 1837 992 2729
+ 1789 2093 3858
+ 661 3093 1887
+ 1601 2187 2989
+ 656 3995 1569
+ 995 3453 2290
+ 751 3370 1817
+ 2162 1662 3136
+ 769 2211 1838
+ 1787 738 3795
+ 737 1632 2075
+ 836 2674 3801
+ 808 3575 2859
+ 2111 996 1942
+ 2173 2889 1270
+ 1000 1943 2113
+ 1839 1000 2213
+ 1853 1214 3159
+ 2176 1001 3812
+ 2177 2857 750
+ 3025 1002 1854
+ 1003 1386 2385
+ 2252 1003 2242
+ 2594 725 1540
+ 2293 1004 2260
+ 1005 1628 2403
+ 3043 1005 2353
+ 3614 884 2748
+ 2423 2931 1412
+ 1007 1539 2205
+ 812 2648 1431
+ 2297 860 1510
+ 1650 2020 4020
+ 3951 660 1884
+ 829 1909 1655
+ 1901 462 463
+ 885 2632 3380
+ 2631 886 3679
+ 419 1902 418
+ 1012 2121 2120
+ 271 2256 3981
+ 1013 3137 2659
+ 1742 1013 2576
+ 2443 775 2925
+ 724 2118 2046
+ 2461 1461 2675
+ 955 1472 2046
+ 1845 1016 2217
+ 757 2214 2032
+ 1017 1870 1952
+ 1276 2505 3669
+ 1018 1809 3926
+ 2414 663 1891
+ 1019 1664 2737
+ 672 1556 2679
+ 2238 759 3050
+ 855 2069 3700
+ 1975 697 3900
+ 577 2647 1663
+ 877 3285 3781
+ 326 2126 3424
+ 1023 1843 2583
+ 743 2152 3241
+ 1920 188 2554
+ 1024 2292 3542
+ 1025 1700 2546
+ 744 2292 3715
+ 835 2185 2710
+ 798 2285 3976
+ 1027 1726 2639
+ 888 2512 3608
+ 2751 1536 654
+ 1822 2303 3412
+ 2607 823 3319
+ 1550 1029 2592
+ 2542 797 3463
+ 756 3997 2082
+ 2004 659 3820
+ 3495 1906 690
+ 1708 1116 2896
+ 1716 2376 2523
+ 1668 1033 3106
+ 1724 1033 2390
+ 2196 785 2189
+ 1701 1034 3135
+ 2477 666 1711
+ 1549 1035 2667
+ 2813 1626 2818
+ 490 2732 489
+ 2765 730 1727
+ 684 3201 2806
+ 2619 866 3822
+ 1712 1038 2709
+ 2663 863 3787
+ 864 2280 3674
+ 1560 3491 2217
+ 1224 2150 2304
+ 2646 859 3701
+ 1718 1041 2720
+ 1956 222 2555
+ 3638 2336 746
+ 1043 1713 2537
+ 746 2336 3589
+ 1957 313 2556
+ 3640 2337 747
+ 1045 1714 2536
+ 747 2337 3590
+ 1046 3588 2489
+ 2700 1046 2495
+ 1047 1873 2209
+ 837 2725 3328
+ 1550 2592 848
+ 692 2411 1699
+ 2534 755 1653
+ 1842 4011 3191
+ 2249 1395 2380
+ 2713 858 3779
+ 1051 1891 2125
+ 717 2398 3707
+ 2278 732 1596
+ 1856 1052 2372
+ 2464 895 1790
+ 1780 3055 739
+ 776 2934 2451
+ 1227 2161 3911
+ 2606 505 3749
+ 718 2221 3909
+ 3220 1555 3785
+ 1643 1056 3053
+ 3307 1057 2406
+ 981 1999 4017
+ 2513 652 3986
+ 1889 1058 3033
+ 2566 665 1860
+ 1460 2566 2770
+ 1060 1603 3184
+ 1734 3412 1028
+ 1984 719 1658
+ 851 1899 3220
+ 2312 87 3004
+ 748 2436 3430
+ 1063 2976 2323
+ 1399 2976 3421
+ 3578 735 1575
+ 1844 1064 2448
+ 2563 704 1805
+ 689 2695 1607
+ 1066 1815 2000
+ 2750 1066 2166
+ 1067 2178 1738
+ 1485 849 2575
+ 1068 2178 2456
+ 66 2422 3429
+ 2788 853 3874
+ 681 2561 2660
+ 2347 494 2810
+ 2377 1280 3179
+ 1887 1505 3999
+ 1892 918 1926
+ 2482 361 1774
+ 2010 1072 1739
+ 1073 2193 2492
+ 1073 2492 2206
+ 2842 848 3881
+ 692 2470 3871
+ 1075 2824 2533
+ 871 2824 3869
+ 2778 779 2350
+ 1076 2410 3363
+ 2208 766 1954
+ 752 2439 1874
+ 2104 736 3970
+ 1510 860 3384
+ 2683 500 1757
+ 1116 1904 2255
+ 2435 891 3954
+ 3301 873 4027
+ 1970 28 2807
+ 1662 1081 3145
+ 1082 2694 2613
+ 977 1608 2025
+ 2891 1491 3639
+ 1083 1900 2075
+ 3634 931 2140
+ 1084 2628 3890
+ 1085 1751 2528
+ 761 2417 3477
+ 1086 1752 2955
+ 762 2416 3912
+ 1087 1752 2416
+ 1851 3561 4018
+ 1088 1751 2417
+ 3913 2417 761
+ 2517 777 1934
+ 1640 2922 3153
+ 1090 2649 1529
+ 688 2573 3091
+ 1091 1756 2527
+ 763 2420 3478
+ 1092 1756 2420
+ 3905 2420 763
+ 2415 103 1755
+ 1093 2421 3408
+ 1094 1755 2953
+ 764 2421 3906
+ 2500 138 1761
+ 1844 1095 2098
+ 1096 2673 1535
+ 683 2582 3087
+ 2412 1228 3017
+ 707 2743 1543
+ 1098 2334 2084
+ 371 2635 370
+ 2348 903 3519
+ 1099 2711 2119
+ 2995 2720 850
+ 2687 1977 4000
+ 1973 2660 3947
+ 1492 933 2722
+ 2999 2709 853
+ 2670 1983 3985
+ 3991 1839 770
+ 3994 2691 770
+ 1104 1658 2877
+ 3498 2181 699
+ 1561 3433 3710
+ 2194 1105 2207
+ 2346 736 3950
+ 3156 1106 2727
+ 2690 921 1747
+ 3115 3485 887
+ 2483 85 1788
+ 2259 1108 2436
+ 2779 491 1905
+ 757 2325 3754
+ 1503 2995 850
+ 876 2911 3934
+ 2007 658 1949
+ 2222 1338 3712
+ 1963 732 2278
+ 175 2570 1856
+ 1113 1803 2910
+ 2185 1703 2710
+ 1114 1808 2645
+ 957 3205 1729
+ 2643 723 1628
+ 2671 1115 2984
+ 2474 498 1904
+ 1679 1116 2255
+ 1827 1117 3878
+ 2688 1117 2535
+ 1118 1792 2615
+ 749 3092 1767
+ 3915 750 1801
+ 1791 1119 2616
+ 2793 804 2266
+ 2674 1120 3801
+ 1121 1759 2887
+ 934 3016 1806
+ 2338 981 2091
+ 1965 2276 3826
+ 1687 2922 872
+ 1104 1702 2465
+ 2352 1270 2816
+ 1478 3169 2679
+ 1269 2888 2851
+ 697 2964 4012
+ 2437 1309 2530
+ 3367 782 2860
+ 2332 1962 4037
+ 2091 981 3808
+ 1128 2121 3548
+ 771 3606 2373
+ 1129 2992 2621
+ 767 2918 2519
+ 2320 896 1692
+ 823 2634 3319
+ 2359 875 2072
+ 1799 1131 3923
+ 1132 1405 3422
+ 1767 1405 2965
+ 1133 2662 2509
+ 745 2662 1908
+ 980 1647 2840
+ 1985 1134 3550
+ 1135 2284 2844
+ 769 2593 2287
+ 2863 785 1701
+ 2971 900 2062
+ 1884 1137 3703
+ 1137 1758 3174
+ 2949 824 1683
+ 2614 1138 2375
+ 1769 969 2351
+ 1117 2431 3878
+ 2771 976 1606
+ 1986 1140 3581
+ 1141 3584 3340
+ 801 2897 2479
+ 2514 750 2857
+ 3180 3692 1613
+ 1665 966 1962
+ 890 2703 1745
+ 2543 143 2134
+ 1965 1144 2890
+ 2595 2170 783
+ 932 2773 1978
+ 2296 1512 2895
+ 396 2296 3304
+ 830 3331 2587
+ 1147 2430 3204
+ 824 3026 2715
+ 1733 935 3645
+ 1878 36 3064
+ 1878 1149 2384
+ 2108 1551 3128
+ 617 2741 3034
+ 2052 2640 3562
+ 672 2678 1556
+ 1152 2093 3278
+ 1595 1152 2602
+ 1153 1611 2355
+ 1494 2932 3244
+ 1586 2350 779
+ 2013 1514 3170
+ 3120 750 1709
+ 1499 2631 3679
+ 2082 907 3355
+ 3253 1859 3262
+ 1157 2713 3779
+ 805 2848 2237
+ 1158 1695 2791
+ 1695 1158 2726
+ 1159 1694 2758
+ 1694 1159 2790
+ 2071 435 436
+ 924 1863 3489
+ 1862 925 3490
+ 52 2269 486
+ 3194 1353 2641
+ 1517 2724 940
+ 744 3410 2212
+ 2639 3843 881
+ 1486 2181 3498
+ 628 2782 3933
+ 1165 2785 3206
+ 1874 2526 752
+ 2624 1166 2301
+ 1692 896 1821
+ 2426 766 2165
+ 2313 1394 3250
+ 1722 751 1817
+ 1783 1168 3536
+ 2601 942 3758
+ 778 2902 2361
+ 3386 3780 653
+ 1274 2733 2868
+ 1171 3686 2612
+ 754 3229 1824
+ 1602 865 2001
+ 1820 1172 2201
+ 1173 2219 3166
+ 801 2479 2446
+ 1174 1484 3176
+ 1871 1174 3780
+ 3001 183 1843
+ 1960 3241 1023
+ 2441 3866 449
+ 1176 1775 2451
+ 2897 801 1907
+ 2447 1177 2484
+ 2723 59 1836
+ 3689 2656 789
+ 2742 1 3865
+ 2656 1179 3161
+ 2584 979 2141
+ 1787 1180 1930
+ 1181 3819 3039
+ 3433 1181 2069
+ 1182 1855 3698
+ 711 1690 2148
+ 828 3600 3342
+ 442 2275 441
+ 2774 52 1798
+ 427 2508 3899
+ 944 2003 3325
+ 800 2832 2263
+ 2831 799 2396
+ 2068 943 3193
+ 3595 713 2003
+ 345 2476 3310
+ 3374 2120 771
+ 1272 2789 3485
+ 2894 2487 790
+ 1805 1189 3251
+ 2847 330 331
+ 1190 1519 2055
+ 1732 2331 3921
+ 2085 1191 3504
+ 2839 2502 765
+ 927 2197 3744
+ 813 3973 1914
+ 965 1848 2237
+ 3078 291 2122
+ 2892 1194 2104
+ 1018 1842 2333
+ 3573 2125 3592
+ 1034 1701 2196
+ 2855 1331 3529
+ 2960 664 2044
+ 734 2137 1820
+ 1669 1198 3070
+ 1937 1198 3974
+ 2028 1199 3171
+ 1605 939 3084
+ 1200 2776 3037
+ 1444 2776 3186
+ 1201 1640 2809
+ 699 3049 3175
+ 2919 963 2168
+ 250 2638 1644
+ 1925 1203 2170
+ 1807 1203 2858
+ 1873 1047 2725
+ 2618 1394 3181
+ 1205 1745 2627
+ 11 2499 2322
+ 1206 1936 2872
+ 4036 3027 807
+ 1207 1709 2514
+ 2571 1207 2585
+ 3439 463 464
+ 401 3155 400
+ 2756 417 3438
+ 385 3154 384
+ 2981 1630 3496
+ 2045 2605 780
+ 1211 2011 3218
+ 1963 2760 4026
+ 3141 758 2109
+ 252 2944 1852
+ 2051 1061 3867
+ 631 3058 2101
+ 3159 456 457
+ 772 3506 3022
+ 887 3485 2789
+ 3126 3096 1696
+ 1216 1940 3764
+ 3025 3764 2277
+ 1814 1704 3019
+ 2129 2535 674
+ 2429 6 2307
+ 1319 2429 3151
+ 1219 2302 2428
+ 2302 1219 3245
+ 1598 914 2692
+ 793 3223 3080
+ 1221 3391 3086
+ 1167 2529 2426
+ 1594 837 2079
+ 1833 916 2681
+ 1772 967 2452
+ 3389 1223 3201
+ 1711 666 2150
+ 2267 1224 2304
+ 1225 2658 2633
+ 1441 2172 3326
+ 1502 838 1996
+ 1016 2438 2214
+ 1816 1227 2314
+ 893 3346 1777
+ 3017 2579 788
+ 3284 3017 788
+ 1229 3515 3150
+ 858 3208 2898
+ 3050 759 1980
+ 2238 3050 3809
+ 1231 1710 3175
+ 751 3382 2016
+ 3249 930 2049
+ 2192 1089 2951
+ 1233 2498 2574
+ 1233 2387 2626
+ 2600 1193 2450
+ 1376 3503 3790
+ 1235 2236 3416
+ 1874 1235 2526
+ 1236 1749 3031
+ 768 3699 1923
+ 2434 893 3117
+ 1007 2205 2179
+ 1238 2012 3343
+ 2012 1238 2941
+ 1239 1782 3040
+ 2789 2171 887
+ 3198 663 2414
+ 2216 1240 2398
+ 3095 1866 3990
+ 902 3095 2287
+ 1242 2478 3152
+ 1113 2478 2185
+ 3098 790 2133
+ 1990 1243 2586
+ 1244 1874 2439
+ 1976 1244 3085
+ 2665 1189 2405
+ 1573 834 2078
+ 1246 1924 3012
+ 1924 1246 3051
+ 3270 245 1810
+ 243 2883 3425
+ 1696 1249 3126
+ 1782 1248 3267
+ 3192 259 2881
+ 821 3126 3351
+ 1202 2168 3083
+ 3071 4024 822
+ 2829 2492 778
+ 2829 1935 1251
+ 1252 2426 2529
+ 2795 1252 2837
+ 1253 1987 2215
+ 1972 1253 3513
+ 1254 2210 3101
+ 2210 1254 2628
+ 2245 1255 2834
+ 3730 25 2947
+ 1256 1974 3440
+ 3857 1256 2593
+ 1257 2248 3232
+ 1257 2247 2836
+ 1970 1081 2972
+ 2243 1258 2691
+ 3919 815 3879
+ 1988 1090 2969
+ 1260 1851 4018
+ 1260 2582 3759
+ 1261 2325 3305
+ 611 3197 2019
+ 1262 2070 3243
+ 2080 2805 3651
+ 712 1953 2682
+ 3285 1813 3781
+ 3431 1860 665
+ 1264 2430 2587
+ 841 3987 3131
+ 1564 3355 3626
+ 1266 2275 3336
+ 3628 1266 2251
+ 1267 2225 3347
+ 594 3209 3646
+ 1268 2139 3800
+ 2345 1268 3322
+ 1125 2213 2815
+ 864 2357 2280
+ 2816 1124 2352
+ 1039 2173 2663
+ 3059 432 3617
+ 786 2948 2112
+ 1272 2373 2553
+ 1272 2066 2789
+ 3121 2283 842
+ 9 2950 3572
+ 1274 2868 3564
+ 1274 2096 3563
+ 3618 935 2234
+ 2659 1275 3655
+ 1779 701 2505
+ 2739 1276 3371
+ 2548 1277 3453
+ 1005 2403 2317
+ 917 1595 3321
+ 1941 2761 473
+ 3279 875 2412
+ 2121 1012 2467
+ 1280 2182 2457
+ 852 1562 2151
+ 2087 728 4021
+ 757 3142 2214
+ 2748 884 1780
+ 684 2156 3389
+ 2005 1283 2860
+ 2123 2608 409
+ 3313 869 2852
+ 868 3222 1685
+ 1688 3052 3665
+ 1182 1690 3088
+ 1286 1826 3361
+ 3066 1286 2008
+ 1287 1903 3118
+ 1056 3069 1646
+ 1288 2246 3293
+ 2021 1288 3257
+ 2871 710 3512
+ 2010 1289 3294
+ 3526 793 2172
+ 2147 2257 676
+ 1291 1617 3534
+ 782 2978 3090
+ 1292 2142 3832
+ 825 3295 2114
+ 1963 1112 2760
+ 1293 1781 3894
+ 924 1819 2154
+ 786 2821 2569
+ 3797 2014 786
+ 1146 2218 2569
+ 2823 747 4030
+ 2664 1296 3834
+ 1297 4031 3920
+ 1913 3920 4031
+ 3029 2100 368
+ 784 3415 2334
+ 2456 755 2235
+ 705 1764 2481
+ 3426 789 2468
+ 3400 1300 3631
+ 3186 802 2042
+ 1254 2024 3634
+ 2449 1032 2376
+ 1302 3114 2119
+ 1303 2305 3927
+ 1991 1303 3478
+ 2874 761 3477
+ 2547 1304 3930
+ 2215 911 2598
+ 819 3187 3611
+ 1030 2268 3338
+ 2083 3256 756
+ 3668 2087 2973
+ 2711 1858 668
+ 3889 982 2029
+ 1076 2778 2410
+ 1309 2437 3652
+ 1309 1916 2530
+ 958 2158 3610
+ 1310 2466 2921
+ 3349 833 2163
+ 2228 3684 3690
+ 2081 720 3988
+ 599 3418 2124
+ 1313 1958 3542
+ 2389 1313 3852
+ 1314 1960 2389
+ 743 3324 2052
+ 1315 1929 3603
+ 1315 3658 2212
+ 2843 1867 4010
+ 2887 3407 849
+ 3373 831 3286
+ 920 2738 2018
+ 1318 2050 3408
+ 3334 1318 3664
+ 3151 774 2461
+ 2429 1319 3492
+ 1320 2443 2925
+ 1014 2443 2227
+ 1321 1730 3537
+ 2322 3307 11
+ 3607 799 2246
+ 363 3392 2030
+ 1072 2010 2507
+ 972 2281 3830
+ 3445 389 390
+ 2866 1324 3756
+ 1325 1861 3379
+ 2234 3379 781
+ 3441 770 2402
+ 1921 1326 3140
+ 3395 746 1986
+ 2073 1327 2305
+ 2306 840 2074
+ 2540 687 2379
+ 3470 1911 775
+ 2489 1329 3470
+ 2905 2123 410
+ 3226 1330 2578
+ 3015 3856 675
+ 2849 1331 3015
+ 3799 2110 542
+ 2130 3597 4029
+ 3594 2510 675
+ 765 1333 2360
+ 1334 2539 787
+ 2620 1334 787
+ 3557 2258 773
+ 905 2886 3235
+ 3662 1978 3663
+ 2199 3663 783
+ 901 1697 2092
+ 2097 3300 640
+ 1831 3030 932
+ 2222 3712 708
+ 3560 1917 3966
+ 2291 1339 698
+ 3810 707 2820
+ 3423 1340 2841
+ 2657 1150 2108
+ 2657 1341 4001
+ 1024 1958 2363
+ 1960 1023 2362
+ 1343 1945 3291
+ 815 1343 2368
+ 1344 2369 816
+ 2367 1344 816
+ 3356 946 2222
+ 809 2531 2107
+ 1346 2045 3803
+ 695 1346 3452
+ 1347 2562 817
+ 1929 1025 2370
+ 3976 2285 3499
+ 2116 1348 2598
+ 1591 3360 3367
+ 912 3273 1987
+ 1350 3997 2268
+ 701 3172 2349
+ 1351 2197 3464
+ 2146 927 3744
+ 1352 2610 3116
+ 2126 1352 3424
+ 3194 748 3430
+ 2641 1353 3709
+ 1354 1934 2917
+ 3904 1354 3680
+ 1355 2650 3007
+ 1049 2650 2534
+ 2044 930 3989
+ 3335 1356 3772
+ 1357 2719 3062
+ 860 3935 2175
+ 2869 657 2700
+ 2440 1358 2495
+ 3032 178 2460
+ 3218 2011 941
+ 1360 1988 3792
+ 802 3860 2042
+ 3463 797 3747
+ 2349 3337 701
+ 3972 1202 2374
+ 1362 1746 2531
+ 3247 847 2550
+ 2209 1363 2453
+ 1364 2404 2876
+ 704 2563 2497
+ 1365 1906 3495
+ 813 1365 2358
+ 3312 239 2106
+ 2769 1366 3821
+ 3636 761 1977
+ 2830 1367 3753
+ 1368 2229 2830
+ 762 3635 1979
+ 3877 510 2400
+ 796 3539 2345
+ 3605 803 2293
+ 2174 1370 3704
+ 2015 803 2164
+ 602 3411 2295
+ 1372 3773 681
+ 764 3643 1973
+ 3644 763 1983
+ 2233 1373 2826
+ 3650 830 3263
+ 831 3549 2766
+ 1990 2586 804
+ 2793 3442 3574
+ 1883 805 2600
+ 1376 1641 2713
+ 1684 1052 2588
+ 1966 3460 825
+ 2513 1820 3249
+ 1232 2988 2517
+ 2659 3655 4014
+ 3844 1379 730
+ 3615 705 2063
+ 3598 1380 2241
+ 3524 140 2065
+ 2693 1761 3659
+ 1830 1468 3178
+ 2676 1382 2756
+ 2684 465 45
+ 1208 2755 2677
+ 2064 1080 2967
+ 1942 996 3466
+ 3961 2827 702
+ 1385 2054 2184
+ 1003 2252 3065
+ 2385 1386 3760
+ 1387 2452 2614
+ 1742 2706 1013
+ 3323 979 1971
+ 1388 3546 3462
+ 3614 2515 884
+ 3742 1389 3316
+ 1390 2188 3918
+ 3517 3918 829
+ 1391 2850 3013
+ 1391 3979 3576
+ 3014 1219 2642
+ 676 1797 2147
+ 1393 775 2443
+ 775 1393 3470
+ 1394 1927 4036
+ 3181 1394 2313
+ 3459 899 2291
+ 754 3828 2249
+ 1396 794 2692
+ 677 4007 2324
+ 2283 915 4022
+ 2311 842 3811
+ 1398 1130 2634
+ 1938 1398 3925
+ 1737 694 2976
+ 752 3421 2056
+ 1042 2073 2557
+ 2559 1400 839
+ 1401 1995 3522
+ 1401 1957 2558
+ 1402 2747 854
+ 945 2299 1604
+ 908 1532 2095
+ 956 3528 2231
+ 1404 2511 854
+ 879 3691 2747
+ 2632 1498 3380
+ 2219 1132 3422
+ 1406 2828 2975
+ 2971 1406 4006
+ 943 1937 2413
+ 3957 862 3199
+ 861 3353 3200
+ 1922 944 2383
+ 1888 692 2061
+ 1083 2933 1900
+ 2259 867 3262
+ 1162 1770 2471
+ 3969 654 2490
+ 2548 1411 3747
+ 2931 1006 1938
+ 2423 1412 2607
+ 1413 2470 2740
+ 2738 1413 3373
+ 3259 759 3039
+ 1228 2661 2047
+ 215 216 3397
+ 215 3215 214
+ 208 209 3735
+ 209 210 2804
+ 376 2393 375
+ 376 33 3719
+ 2391 197 198
+ 2391 1418 3717
+ 206 207 3736
+ 208 3735 2799
+ 193 194 2796
+ 2798 1420 3737
+ 204 2034 203
+ 202 203 3848
+ 373 374 3850
+ 372 373 2697
+ 201 2394 200
+ 200 3846 199
+ 212 213 3739
+ 213 214 2654
+ 1425 2041 3721
+ 2796 194 3737
+ 209 2804 3735
+ 210 211 3731
+ 204 205 3733
+ 3736 2797 206
+ 307 2039 306
+ 1428 2039 3730
+ 1430 2040 2800
+ 1429 2846 3727
+ 305 306 3728
+ 3728 306 2039
+ 2980 2294 3675
+ 812 1431 2707
+ 3468 674 1827
+ 566 1516 2261
+ 2262 1247 3071
+ 2168 3895 4032
+ 2907 1434 3167
+ 1446 2166 2717
+ 2009 691 2565
+ 2637 1435 3298
+ 3331 830 2344
+ 1436 3685 2496
+ 1437 2164 3605
+ 720 1437 3146
+ 3404 2224 340
+ 1438 2408 3200
+ 2409 1439 3199
+ 2224 3405 339
+ 3246 1440 3648
+ 2602 3246 469
+ 3326 2172 793
+ 3080 3326 793
+ 1964 865 2945
+ 1287 3118 2781
+ 3358 1996 838
+ 609 1443 3067
+ 1200 2876 3186
+ 3863 3420 931
+ 1445 2146 585
+ 813 1914 2450
+ 1331 2849 3258
+ 3770 2166 787
+ 1447 3319 2915
+ 1530 1029 3776
+ 1919 723 2643
+ 622 3892 2671
+ 3902 2290 4028
+ 929 1919 3971
+ 899 1464 3532
+ 1214 3861 2787
+ 1451 2016 3901
+ 1812 995 3471
+ 3474 819 2342
+ 696 3836 2444
+ 1453 2725 3505
+ 1453 1894 3328
+ 3056 895 2464
+ 2339 1454 3654
+ 1455 3888 2982
+ 2169 1455 933
+ 3007 664 2960
+ 2463 1456 3026
+ 3465 948 3444
+ 1949 3887 3959
+ 3666 868 3288
+ 353 3472 2223
+ 3234 792 2351
+ 2990 1459 3711
+ 1460 2018 2566
+ 737 3656 2770
+ 1461 2298 724
+ 774 1461 2461
+ 1462 2342 3226
+ 2029 982 3673
+ 928 2097 3697
+ 2301 1463 2624
+ 3138 2612 476
+ 1464 2200 3532
+ 1741 1465 3695
+ 3696 1465 3676
+ 3119 129 2086
+ 3855 1466 3807
+ 3143 2153 80
+ 1467 2418 3131
+ 3231 387 388
+ 437 3825 2866
+ 3683 493 2347
+ 806 4003 2457
+ 1470 3458 3387
+ 54 1470 2522
+ 1471 1014 2424
+ 955 3523 2131
+ 2046 2675 724
+ 97 3568 2132
+ 3624 2054 702
+ 1473 3624 2567
+ 1474 2561 2792
+ 2982 1474 844
+ 2592 1530 3881
+ 1534 2740 3467
+ 3550 1134 3042
+ 2540 1476 2646
+ 1051 2125 3573
+ 1923 3573 768
+ 1478 2904 863
+ 2352 1478 863
+ 1479 2223 3402
+ 1149 3064 2863
+ 1480 2321 2621
+ 3587 1480 2992
+ 1481 511 2862
+ 984 1481 2388
+ 2316 1482 2996
+ 769 1482 3110
+ 1483 2357 864
+ 1663 1021 2875
+ 1484 2220 2285
+ 2252 1174 3176
+ 2017 1485 2575
+ 2343 3516 71
+ 1710 898 2330
+ 882 1486 2838
+ 2819 1573 3702
+ 1686 2986 3869
+ 3581 1140 3054
+ 2504 1488 2619
+ 1489 2999 853
+ 2561 1489 2788
+ 1490 2541 3121
+ 3868 1490 3121
+ 1491 2780 878
+ 3639 1491 878
+ 2792 1572 3791
+ 2110 1492 541
+ 1493 939 2938
+ 3670 1493 2952
+ 3244 718 1998
+ 856 1494 2327
+ 1495 871 2986
+ 2573 1495 3091
+ 3591 678 3530
+ 754 1496 2564
+ 3752 820 2184
+ 614 3940 2354
+ 1010 1868 2289
+ 885 3380 3771
+ 1743 1499 3679
+ 1869 1011 2288
+ 1500 876 2873
+ 2582 1500 3087
+ 1501 3865 3399
+ 884 1501 3068
+ 1502 2401 838
+ 1502 1996 3381
+ 1503 850 2908
+ 686 2687 2686
+ 2542 1030 3338
+ 2353 1504 3457
+ 1505 3681 3783
+ 926 3999 2509
+ 1506 705 3615
+ 3056 1246 3401
+ 1507 2591 835
+ 2710 1507 835
+ 1508 2293 803
+ 3237 1508 803
+ 2994 102 2415
+ 3221 1509 3653
+ 1731 1510 3384
+ 1008 1510 2286
+ 2774 1184 2508
+ 1161 1511 2651
+ 2895 1146 2296
+ 2469 1512 3922
+ 3831 1513 2701
+ 1284 3222 2494
+ 1514 2734 3086
+ 685 3391 2837
+ 1515 2446 2971
+ 1515 1906 2966
+ 3427 1432 3149
+ 1631 2639 4008
+ 3859 870 2724
+ 547 1517 2057
+ 3297 2179 740
+ 1789 993 3297
+ 2055 1022 3437
+ 332 3500 2847
+ 2943 1524 3327
+ 2928 1520 3942
+ 3962 453 454
+ 1521 1931 2958
+ 3963 439 440
+ 828 3342 2943
+ 1523 3044 3943
+ 3287 1523 2590
+ 2340 1524 2943
+ 478 3949 477
+ 1525 2590 3944
+ 827 3601 3818
+ 1526 836 2811
+ 669 1526 2551
+ 3245 3014 846
+ 1062 3682 3840
+ 1041 1623 2764
+ 1582 2908 3816
+ 1529 2533 2824
+ 1090 1529 2993
+ 2480 1530 3776
+ 1530 2699 3881
+ 1531 847 3599
+ 2441 1531 3866
+ 3671 299 3359
+ 908 2095 3612
+ 727 1885 3672
+ 2979 1533 3113
+ 1534 557 2864
+ 2740 3549 831
+ 1535 2686 2911
+ 1096 1535 2998
+ 3767 3494 791
+ 1952 983 3767
+ 2709 1588 3874
+ 1572 2792 3604
+ 1538 431 3059
+ 786 2014 2948
+ 1539 695 2205
+ 2488 1539 2648
+ 2912 2485 795
+ 1642 1004 2912
+ 1541 2641 676
+ 940 1541 2257
+ 1542 2344 830
+ 1374 2544 3650
+ 707 1993 2743
+ 2985 1543 843
+ 2697 373 3850
+ 2599 1544 31
+ 3364 426 3804
+ 1216 3854 1940
+ 1039 1610 2644
+ 3510 1546 3777
+ 1547 2950 3794
+ 1886 915 3112
+ 1020 2099 2518
+ 855 3553 2892
+ 1549 838 2401
+ 725 1549 2667
+ 3072 706 2423
+ 2914 1550 848
+ 3128 2353 670
+ 880 1551 2108
+ 1552 3046 843
+ 2611 1552 843
+ 1012 2120 3374
+ 270 3981 2698
+ 1554 781 3379
+ 3173 1554 3366
+ 1555 2516 633
+ 851 3785 3069
+ 1556 888 3006
+ 2904 2679 1019
+ 3762 918 1941
+ 2612 3480 475
+ 1558 2427 2512
+ 1151 3562 3107
+ 2908 1582 3377
+ 1622 2873 3934
+ 1560 728 2977
+ 1833 1040 3183
+ 3970 736 3344
+ 693 1561 2666
+ 2151 2457 1070
+ 1032 1562 2721
+ 1563 513 3264
+ 1120 2674 3442
+ 2127 1564 3626
+ 1859 1156 3047
+ 3358 838 2694
+ 608 1565 607
+ 1021 2647 3566
+ 1604 854 3784
+ 3827 3208 858
+ 592 1567 3280
+ 3322 1268 3109
+ 1242 3152 2762
+ 1569 2488 812
+ 3009 1569 812
+ 3413 461 2630
+ 885 3619 2632
+ 3620 886 2631
+ 420 3414 2629
+ 2814 1572 3604
+ 1572 2962 3791
+ 2078 834 2665
+ 1573 3045 3702
+ 2077 1311 3684
+ 833 3349 2693
+ 1575 2076 3348
+ 2609 3348 832
+ 3369 906 2186
+ 1835 1059 3219
+ 3234 2117 792
+ 2990 1577 3234
+ 3216 1421 3210
+ 201 1578 2394
+ 3215 1415 3212
+ 213 2654 3739
+ 1580 123 2655
+ 1423 3217 3211
+ 1581 375 2393
+ 3213 1581 3214
+ 2968 1582 3816
+ 2911 3377 1559
+ 1583 960 2985
+ 3156 1583 843
+ 1584 690 2975
+ 765 2197 2839
+ 1585 2463 2949
+ 2481 1585 3242
+ 1586 2444 3552
+ 2734 1586 779
+ 1587 700 4025
+ 808 1587 2437
+ 1038 1599 3928
+ 1588 3035 3874
+ 1589 3114 3171
+ 939 1885 2938
+ 3984 2195 894
+ 3012 3984 894
+ 3417 1349 3360
+ 2752 1591 3864
+ 1592 907 3224
+ 1779 1592 3172
+ 1593 2737 572
+ 1610 2663 3787
+ 2079 942 2903
+ 3181 1594 3518
+ 3556 2602 470
+ 1595 2058 3321
+ 2142 959 3832
+ 2588 1596 3295
+ 1597 715 1933
+ 860 1597 2719
+ 1220 2382 3873
+ 914 2869 3907
+ 2771 1606 3822
+ 1599 2521 3928
+ 1877 758 3141
+ 254 1600 3509
+ 2989 2187 695
+ 994 2989 1539
+ 1602 2808 2945
+ 2201 2001 1058
+ 1060 1825 3198
+ 1603 2414 3570
+ 2625 1604 3784
+ 2059 945 3329
+ 1605 897 2013
+ 939 1605 1936
+ 1606 2254 533
+ 1606 3303 3822
+ 1065 1805 2668
+ 1075 1607 2819
+ 2025 2613 725
+ 605 1608 2909
+ 3229 754 2564
+ 918 3762 3508
+ 3147 1610 3787
+ 1039 2644 3674
+ 1611 502 2355
+ 856 3507 2932
+ 1612 866 3054
+ 683 1612 2689
+ 1142 2277 3332
+ 964 1613 2258
+ 3565 2896 852
+ 2151 3829 852
+ 1615 2445 3340
+ 3449 1615 3584
+ 1616 859 3042
+ 688 1616 2664
+ 2978 782 3798
+ 2335 1617 3273
+ 1961 921 2690
+ 1128 1618 2432
+ 3710 855 2892
+ 3710 1619 3983
+ 1620 2901 869
+ 2494 1620 869
+ 1621 2133 3265
+ 1621 2371 3098
+ 3144 1622 3934
+ 2254 1622 532
+ 2840 1647 3701
+ 1041 2764 1528
+ 1624 3032 3239
+ 176 4013 2570
+ 1803 2185 835
+ 1055 1625 2591
+ 1626 904 2818
+ 444 1626 2813
+ 1627 558 3525
+ 1147 2766 3788
+ 1628 723 2403
+ 880 1628 3043
+ 1629 346 347
+ 869 2901 2852
+ 1630 2453 3496
+ 1630 2981 3862
+ 3020 1631 4008
+ 1667 1027 2364
+ 1632 737 3782
+ 2308 3782 997
+ 1633 3651 2805
+ 3341 1633 3345
+ 2696 3872 1634
+ 1671 922 3872
+ 1635 509 3388
+ 2478 1635 3539
+ 1636 2900 896
+ 1398 2320 1130
+ 1637 3223 3526
+ 913 3956 3296
+ 1638 2072 3279
+ 2942 1638 3378
+ 1639 2622 806
+ 1281 3133 2454
+ 1640 733 2809
+ 872 1640 2381
+ 2713 1157 3503
+ 590 1641 3317
+ 1642 2206 2991
+ 1540 2912 1004
+ 1643 703 3196
+ 901 3897 3053
+ 1644 3083 4035
+ 250 1644 3132
+ 1008 2286 3124
+ 908 2538 1532
+ 3785 1555 3320
+ 1056 1646 2462
+ 1647 2386 524
+ 1647 3038 3701
+ 1976 904 3419
+ 2251 1036 2732
+ 938 1753 2491
+ 973 1649 2153
+ 4020 908 3612
+ 3501 1650 3528
+ 3464 765 2360
+ 3122 2501 583
+ 3658 674 3468
+ 881 2685 3427
+ 1653 2575 849
+ 2475 1653 849
+ 1654 2657 3752
+ 616 1654 3435
+ 1655 1009 1893
+ 829 1655 2002
+ 1656 51 2930
+ 2927 1656 3601
+ 1657 2929 3600
+ 50 1657 2928
+ 1658 2865 882
+ 1984 1658 3011
+ 3688 882 2838
+ 629 1659 2782
+ 3954 891 3345
+ 1974 1080 2817
+ 3960 3088 892
+ 1768 1081 3108
+ 1662 874 2972
+ 3136 1662 3145
+ 2875 1021 1483
+ 577 1663 3777
+ 1664 3891 570
+ 2737 1664 571
+ 1665 169 3750
+ 1143 1962 3162
+ 1666 727 2979
+ 903 1666 3676
+ 2364 1027 1631
+ 2512 1667 3608
+ 1668 712 3003
+ 2396 1668 2831
+ 1669 712 3385
+ 3076 1669 3285
+ 1670 3282 3397
+ 3232 1670 3274
+ 3872 922 1634
+ 2827 1671 3774
+ 1154 2013 3123
+ 3023 1672 897
+ 1673 142 2543
+ 742 1965 2890
+ 1674 991 3511
+ 3187 1674 3611
+ 3187 819 3474
+ 3760 1675 3836
+ 3428 351 2603
+ 3036 1676 3228
+ 2134 1677 2704
+ 145 1677 144
+ 2135 1143 2703
+ 3527 1678 890
+ 1679 2255 722
+ 2523 1679 722
+ 1680 3190 2601
+ 1073 1680 2193
+ 3353 989 3813
+ 1289 3512 3456
+ 1682 3257 3455
+ 2759 1682 3352
+ 1683 824 2715
+ 2375 1683 655
+ 2588 825 3195
+ 173 1684 3406
+ 1685 1284 3281
+ 868 1685 3288
+ 3111 1686 3869
+ 980 1686 2386
+ 1687 652 2472
+ 2916 1687 872
+ 1688 3341 891
+ 2064 714 3052
+ 2397 1175 3063
+ 3403 1689 3063
+ 1690 711 3315
+ 3088 1690 3687
+ 1691 3676 3885
+ 3676 1691 3696
+ 1821 896 3010
+ 2763 1692 646
+ 1130 2763 3667
+ 2634 1693 3319
+ 1694 152 2758
+ 147 1694 2790
+ 2768 163 164
+ 2318 1158 2791
+ 1696 2786 257
+ 1249 1696 3192
+ 1056 2462 3073
+ 901 2092 3366
+ 987 1826 3028
+ 3102 1698 3028
+ 2914 848 2842
+ 692 1699 2470
+ 1700 190 2546
+ 1024 1700 2292
+ 2196 2510 1034
+ 3469 1701 3135
+ 1702 719 3769
+ 872 2465 2916
+ 1703 2762 662
+ 2326 1703 662
+ 3807 1466 2983
+ 953 3807 1814
+ 3072 1550 1048
+ 3161 1389 3742
+ 1706 1210 2605
+ 667 1706 3637
+ 3117 893 3948
+ 3278 1707 3786
+ 1708 497 2474
+ 1614 3596 3565
+ 1709 750 2514
+ 2188 1709 3918
+ 1710 699 3175
+ 898 1710 2744
+ 2150 1040 2304
+ 2485 1711 3002
+ 1712 2709 2999
+ 682 1712 2552
+ 1713 224 2537
+ 1042 1713 2336
+ 1714 315 2536
+ 1044 1714 2337
+ 1715 156 157
+ 890 1715 2712
+ 1716 3008 857
+ 2376 1716 857
+ 1717 2202 922
+ 1341 1717 4001
+ 1718 2720 2995
+ 687 1718 2547
+ 1719 268 3446
+ 3079 1719 3115
+ 3537 889 2749
+ 3227 1720 155
+ 1721 2735 880
+ 2108 1829 880
+ 1817 929 3409
+ 898 1722 3018
+ 3745 2131 93
+ 95 3746 3593
+ 1724 949 3106
+ 366 1724 2390
+ 3853 1360 2870
+ 2404 2695 3860
+ 1726 673 2714
+ 2639 1726 3843
+ 1727 3010 896
+ 1037 1727 2900
+ 1728 3884 713
+ 868 2701 3222
+ 1729 1114 2107
+ 957 1729 2775
+ 1730 2704 889
+ 3537 1730 889
+ 1731 2730 293
+ 1510 1731 3357
+ 3921 709 3281
+ 2852 1732 3313
+ 1733 734 2201
+ 935 1733 3372
+ 1734 1765 909
+ 1201 3252 2271
+ 1735 1003 3023
+ 2952 653 3670
+ 1736 872 2381
+ 1104 1736 2181
+ 694 2323 2976
+ 3247 1737 3713
+ 1738 2422 67
+ 2017 1067 2545
+ 1072 1774 3330
+ 710 1739 2021
+ 1740 1120 2793
+ 700 3450 2309
+ 1741 903 3676
+ 916 2977 3695
+ 2576 730 2765
+ 2706 1742 3714
+ 1743 2783 34
+ 3582 1743 381
+ 2926 917 3321
+ 993 1744 3681
+ 1745 3162 741
+ 890 1745 2923
+ 2531 809 3937
+ 19 1746 3660
+ 2669 1747 3975
+ 2553 1747 20
+ 2609 832 3462
+ 135 1748 3546
+ 934 1806 2812
+ 3031 3965 75
+ 1750 1915 883
+ 3898 1750 3066
+ 1751 309 2528
+ 2417 1751 1085
+ 1752 230 2955
+ 2416 1752 1086
+ 3968 3031 76
+ 938 2491 3339
+ 1195 2333 2906
+ 768 1754 2090
+ 1755 104 2953
+ 1093 1755 2421
+ 1756 218 2527
+ 2420 1756 1091
+ 1757 501 3751
+ 2680 1757 3507
+ 1137 1884 3740
+ 964 3180 1613
+ 1759 716 3191
+ 2887 1759 3407
+ 2043 3517 910
+ 2272 1760 910
+ 1761 139 3524
+ 833 2693 3659
+ 1762 1057 3099
+ 2026 1762 741
+ 1763 1034 3097
+ 753 1763 2828
+ 2481 1764 3535
+ 3497 1764 3833
+ 1765 1734 1028
+ 3471 1765 654
+ 1766 2170 2595
+ 715 1766 3520
+ 1767 2794 3771
+ 1132 2965 1405
+ 3108 1081 1661
+ 1688 2746 1285
+ 2867 1436 2344
+ 3100 2351 792
+ 2471 1410 3910
+ 3387 2567 870
+ 2467 3284 788
+ 272 1771 2256
+ 2241 4015 967
+ 1223 1772 3021
+ 1773 2330 898
+ 627 1773 3475
+ 1774 362 2030
+ 1072 3330 1739
+ 1775 2441 450
+ 2407 1775 451
+ 1776 2237 2848
+ 2525 1776 3484
+ 1777 2581 467
+ 893 1777 3948
+ 1778 2263 2832
+ 713 1778 2935
+ 1779 841 1592
+ 701 1779 3172
+ 1780 884 3068
+ 2589 1780 739
+ 1781 3057 3158
+ 3894 2158 958
+ 1782 266 3040
+ 1782 3130 3351
+ 3018 1722 1168
+ 626 1783 3536
+ 1287 2781 3544
+ 1643 1784 1056
+ 3450 1120 1740
+ 2329 1785 700
+ 1786 958 2076
+ 959 1786 2077
+ 738 2088 3795
+ 997 1787 1930
+ 1788 86 2312
+ 2436 1788 1062
+ 3858 1744 993
+ 1518 3297 993
+ 1790 895 3598
+ 1053 1790 3055
+ 1791 1854 3814
+ 422 1791 2616
+ 3812 1001 1853
+ 1840 1118 2615
+ 1793 1229 1567
+ 3432 1793 3743
+ 2396 799 3607
+ 364 1794 3392
+ 1795 1106 2346
+ 658 1795 3465
+ 3979 845 3334
+ 1796 2324 3576
+ 1797 3434 3978
+ 913 2147 3255
+ 1798 549 3044
+ 2958 1798 3538
+ 1799 711 2148
+ 936 1980 3571
+ 936 1876 3502
+ 3000 1800 286
+ 1801 2861 886
+ 1841 1119 2880
+ 1802 2380 698
+ 1157 3484 1776
+ 3075 507 2910
+ 1625 1803 835
+ 1804 3021 818
+ 1037 3714 1742
+ 1805 704 3188
+ 834 3251 2665
+ 1121 2343 3893
+ 934 2812 1749
+ 1807 18 2940
+ 1807 2199 3061
+ 1808 236 2645
+ 957 1808 3205
+ 1809 947 3926
+ 1354 2917 3630
+ 1810 246 3269
+ 3071 1247 4024
+ 1811 3268 261
+ 3271 1811 262
+ 3471 995 1451
+ 2548 1812 3969
+ 1813 1263 3514
+ 2126 4033 1352
+ 1814 3019 1217
+ 817 1814 3941
+ 2085 985 2331
+ 2000 1815 29
+ 1816 2407 43
+ 2581 1816 466
+ 3370 1449 929
+ 1722 1817 1168
+ 2155 925 3622
+ 2269 1161 2885
+ 1819 1160 2754
+ 924 2154 3621
+ 1820 2513 1172
+ 734 1820 2201
+ 1821 2899 644
+ 1692 1821 3992
+ 1822 733 2192
+ 3627 1822 919
+ 1823 2626 678
+ 923 1823 3515
+ 1824 1171 3693
+ 899 3459 1464
+ 3198 1603 1060
+ 919 3904 3627
+ 1826 987 2503
+ 3361 1826 661
+ 1827 674 2535
+ 792 2117 3878
+ 3339 1649 973
+ 2739 1828 973
+ 1829 1721 880
+ 618 1829 2741
+ 1830 1382 3276
+ 1468 1830 3231
+ 3030 1831 3543
+ 3662 3350 1831
+ 2225 745 3347
+ 595 1832 3209
+ 3183 1040 3491
+ 1222 3657 2442
+ 2748 3908 1006
+ 706 1834 2931
+ 3219 1059 3486
+ 2204 1835 3955
+ 1836 60 2742
+ 789 2656 3161
+ 1837 986 1915
+ 597 1837 3806
+ 1838 1942 873
+ 2593 769 3857
+ 1839 874 1943
+ 770 1839 2213
+ 1840 460 3413
+ 2794 1840 3619
+ 1841 2880 3620
+ 421 1841 3414
+ 1842 3926 4011
+ 1018 2333 3318
+ 1843 184 2583
+ 2152 1843 1023
+ 1844 137 2500
+ 1064 1844 2098
+ 1845 2150 666
+ 2214 2438 1226
+ 1846 3076 3775
+ 333 1846 3500
+ 3409 1168 1817
+ 3971 2253 929
+ 1848 3449 3946
+ 805 2237 3447
+ 3591 1496 1050
+ 1229 1849 3208
+ 1850 2368 1084
+ 2969 3890 760
+ 4018 762 2961
+ 816 1851 3880
+ 1852 946 1746
+ 19 1852 1746
+ 1853 1001 3022
+ 1792 1853 458
+ 1854 1002 3814
+ 423 1854 1791
+ 3698 283 2939
+ 3306 1855 3960
+ 1856 3661 1052
+ 174 1856 2372
+ 1857 675 3856
+ 854 2299 1402
+ 1858 990 2377
+ 1307 1858 3272
+ 1859 2 2483
+ 1156 1859 3253
+ 1860 3755 906
+ 1576 1860 906
+ 2757 703 1643
+ 3366 1861 901
+ 3490 1818 1161
+ 430 1862 3375
+ 1863 434 2913
+ 1819 3489 1160
+ 1864 360 2482
+ 1323 2507 3839
+ 1865 1706 970
+ 1169 1865 2902
+ 1866 902 3063
+ 743 1866 2152
+ 1867 664 2650
+ 1316 4010 2475
+ 1868 3155 401
+ 1010 2289 1498
+ 2288 1011 1499
+ 3154 1869 384
+ 1870 983 1952
+ 701 1870 2505
+ 1871 937 3105
+ 3386 1871 3780
+ 1872 961 3009
+ 987 1872 2707
+ 1873 694 2209
+ 2313 3160 837
+ 1874 3419 904
+ 3233 1874 904
+ 1875 504 2606
+ 2221 1875 1055
+ 3502 1800 936
+ 3789 1876 936
+ 3141 1212 3882
+ 921 1877 3975
+ 3064 1479 2863
+ 1136 1878 2384
+ 1879 3855 953
+ 1879 2167 3139
+ 1880 905 1545
+ 2716 1880 38
+ 1881 958 1786
+ 959 1881 1786
+ 1882 1872 987
+ 1698 1882 987
+ 1883 1234 3225
+ 1376 3790 3545
+ 3740 1758 1137
+ 790 2487 3703
+ 1885 727 1589
+ 1199 1885 1589
+ 1886 1576 3369
+ 3763 3112 915
+ 3093 993 3681
+ 926 1887 3999
+ 3996 878 3400
+ 1888 2061 3765
+ 1889 1733 1058
+ 2757 1325 3805
+ 3207 693 3931
+ 1097 1890 1552
+ 2493 1018 3318
+ 1754 3592 1195
+ 1892 721 2926
+ 918 1892 3613
+ 1893 3917 2894
+ 1655 1893 3845
+ 1894 3862 667
+ 942 1894 3758
+ 1895 1524 3283
+ 1520 1895 3261
+ 1896 1197 2137
+ 2473 1896 734
+ 1146 2569 2821
+ 395 1897 3077
+ 1898 238 3312
+ 809 2769 3821
+ 3236 3769 719
+ 1555 3220 1061
+ 1900 1409 2854
+ 1083 2075 1959
+ 1901 463 3439
+ 1010 1901 3842
+ 2629 1571 1011
+ 3438 1902 3841
+ 1903 865 3118
+ 3033 1903 3196
+ 1904 499 2683
+ 2255 1904 1079
+ 1905 492 3683
+ 806 2622 4003
+ 1906 3647 1031
+ 1515 2966 801
+ 2966 1906 1031
+ 1177 1907 2705
+ 1908 1133 3577
+ 3347 1908 3454
+ 1909 829 3177
+ 1009 1909 3951
+ 1910 2486 771
+ 2373 1910 771
+ 1911 913 1392
+ 775 1911 2642
+ 1912 1045 2366
+ 2264 1296 3919
+ 1913 816 3920
+ 746 4031 2822
+ 1914 1445 3694
+ 1234 1914 3376
+ 1915 986 3102
+ 992 1915 1750
+ 1916 2716 405
+ 2577 1916 406
+ 1917 3506 3966
+ 3532 1450 3870
+ 1918 186 3290
+ 814 2362 1342
+ 2643 1115 3886
+ 1449 1919 929
+ 2554 1700 1024
+ 1342 2363 814
+ 1921 3994 3441
+ 787 1921 3140
+ 1922 3089 944
+ 3939 2383 944
+ 1923 1236 1753
+ 3129 1923 938
+ 1924 3585 3984
+ 64 1924 3051
+ 1925 26 2846
+ 783 2170 3061
+ 2574 2387 1233
+ 1892 1926 721
+ 1927 3027 4036
+ 651 2618 3181
+ 1928 192 3302
+ 817 2370 1347
+ 1929 817 3603
+ 3715 1929 3410
+ 1930 2466 679
+ 997 1930 2308
+ 2958 827 3818
+ 40 1931 3309
+ 1932 1522 3308
+ 2275 1183 3314
+ 3520 1766 1145
+ 948 1933 3444
+ 1934 3904 919
+ 2951 1934 919
+ 2356 1935 2829
+ 656 1935 3995
+ 1936 1605 685
+ 1533 3443 3113
+ 1937 943 3070
+ 335 1937 3974
+ 2753 684 3189
+ 1412 1938 823
+ 1939 2382 3956
+ 1329 1939 1911
+ 3235 1545 905
+ 773 1940 3557
+ 1941 918 3613
+ 3480 1941 474
+ 3466 996 1384
+ 999 1942 1838
+ 1943 996 2113
+ 1839 1943 1000
+ 1944 226 3292
+ 1043 1944 2367
+ 1945 317 3291
+ 1045 1945 2366
+ 1946 998 2859
+ 2149 1291 3575
+ 1947 2903 942
+ 3190 1947 942
+ 1238 2701 3982
+ 355 1948 4016
+ 1949 3959 932
+ 1111 1949 3030
+ 1950 328 3127
+ 1022 1950 3437
+ 2496 1264 3331
+ 691 1951 3685
+ 3767 983 1536
+ 1017 1952 2399
+ 1953 949 2682
+ 1668 1953 712
+ 1954 2506 1076
+ 1077 1954 2159
+ 1955 2190 928
+ 2301 1955 3697
+ 2555 1713 1042
+ 1400 2557 839
+ 2556 1714 1044
+ 1401 2558 840
+ 3542 744 2777
+ 814 1958 2389
+ 2891 3639 1083
+ 941 1959 2075
+ 1960 814 2389
+ 3241 1960 3324
+ 2690 1107 1618
+ 707 1961 1618
+ 4037 1966 1127
+ 1665 1962 1143
+ 2278 1052 3661
+ 4026 2760 826
+ 1964 3118 865
+ 1702 1964 1123
+ 1965 968 1673
+ 1144 1965 1673
+ 4037 966 3460
+ 1127 1966 2114
+ 1148 2473 3645
+ 3137 1967 3618
+ 2314 1054 1816
+ 2605 1968 780
+ 1969 1122 2163
+ 1969 3483 3977
+ 2807 1661 1081
+ 3299 1970 2972
+ 3794 979 1547
+ 3323 1971 3903
+ 1972 912 1987
+ 662 1972 3513
+ 1973 1372 2660
+ 1318 2845 2532
+ 2817 1080 1660
+ 2284 1256 3440
+ 3900 1483 1021
+ 1404 1975 2511
+ 1976 1648 904
+ 487 1976 3085
+ 2874 1304 2547
+ 1367 1977 2687
+ 1978 2595 783
+ 932 1978 3662
+ 1979 1368 2673
+ 1260 2961 2582
+ 2341 1799 3571
+ 1230 1980 1800
+ 1981 319 2997
+ 1343 1981 2368
+ 1982 228 2549
+ 1344 1982 2369
+ 2878 1303 2552
+ 1373 1983 2670
+ 3236 1061 1899
+ 1213 1984 3011
+ 1985 3394 747
+ 2664 2823 1296
+ 2822 1297 2689
+ 1327 1986 2378
+ 1987 3417 729
+ 1972 1987 1253
+ 1988 760 3792
+ 1090 1988 2649
+ 1989 279 3005
+ 1334 1989 2539
+ 3558 515 3436
+ 3574 1990 804
+ 1991 839 2305
+ 763 3478 2878
+ 1992 290 3078
+ 1548 1992 3553
+ 3548 2121 788
+ 2743 1993 1097
+ 1994 1085 2560
+ 2306 1994 840
+ 1995 311 3522
+ 1085 1995 2560
+ 1996 3358 3932
+ 1502 3381 1226
+ 1997 220 3521
+ 1091 1997 2559
+ 1998 718 1484
+ 1174 3105 1484
+ 1999 742 2406
+ 1762 4017 1057
+ 2000 277 3266
+ 1066 2000 2620
+ 2001 1903 1058
+ 1602 2001 1172
+ 2002 1655 3802
+ 829 2002 3517
+ 3325 1185 2023
+ 2003 3089 4009
+ 3820 1907 1031
+ 1193 2596 2450
+ 2005 2577 407
+ 2608 2005 408
+ 2006 960 2007
+ 758 2006 2455
+ 2007 1111 2006
+ 1583 2007 960
+ 2008 3451 926
+ 2662 2008 926
+ 2009 1397 691
+ 1435 2565 1139
+ 2010 2871 1289
+ 800 2010 3294
+ 2011 3569 941
+ 826 2011 3057
+ 2012 972 3343
+ 356 2012 2941
+ 2013 1154 1514
+ 1605 3170 685
+ 2014 925 1538
+ 1271 2948 3059
+ 2164 978 3103
+ 977 2015 3824
+ 2016 909 3901
+ 995 3202 1451
+ 2545 1067 1738
+ 3516 2017 70
+ 2018 3204 665
+ 920 2018 1460
+ 2019 3398 950
+ 3932 2580 950
+ 2020 2970 1008
+ 2020 3104 4020
+ 2021 3257 710
+ 971 2021 1739
+ 2022 862 2143
+ 943 3938 3193
+ 3939 944 3325
+ 861 2023 2144
+ 2024 32 3082
+ 3634 2024 3863
+ 2613 2025 3609
+ 977 2025 3237
+ 2026 741 2332
+ 981 2026 3808
+ 2027 2464 1053
+ 1501 3399 3068
+ 2028 1170 3386
+ 2952 2028 653
+ 2745 2029 3673
+ 3476 2029 414
+ 2030 362 363
+ 971 2030 3748
+ 1178 2656 3689
+ 878 2031 3400
+ 2032 3381 950
+ 3305 2032 3398
+ 2033 126 3722
+ 195 2798 3737
+ 2802 3734 117
+ 203 2034 3848
+ 2035 3723 115
+ 3734 2035 116
+ 2036 212 3739
+ 3720 2803 110
+ 2037 3724 113
+ 3723 2037 114
+ 2038 3720 111
+ 3724 2038 112
+ 2039 307 3730
+ 3732 2801 232
+ 2040 3732 233
+ 3725 2040 234
+ 2041 128 3721
+ 193 2796 3738
+ 2042 2870 931
+ 1444 2042 3420
+ 2043 380 3203
+ 1760 2043 910
+ 2044 664 3772
+ 930 2044 1356
+ 2045 780 3803
+ 695 2187 1346
+ 2675 2046 3586
+ 2046 2118 3523
+ 2047 1414 3819
+ 3207 2047 693
+ 3415 2048 3551
+ 3514 2048 784
+ 2049 930 1356
+ 2517 2049 777
+ 3408 764 2845
+ 845 2050 3334
+ 3867 1984 1213
+ 55 2051 3058
+ 2052 1314 2640
+ 1241 2772 2678
+ 2053 171 3967
+ 966 2053 3460
+ 2054 1385 3961
+ 975 2054 3458
+ 2055 3775 877
+ 1022 3781 1813
+ 2208 1954 1077
+ 2825 2439 1077
+ 2057 940 4002
+ 546 2057 3998
+ 2058 3556 471
+ 2761 2058 472
+ 3329 945 1604
+ 2501 2059 582
+ 2060 2331 985
+ 2519 2060 985
+ 2061 692 3871
+ 920 2061 2738
+ 2062 2384 753
+ 2828 2062 753
+ 3242 1585 2949
+ 967 2063 2614
+ 2064 3136 714
+ 1080 2064 3052
+ 3757 1673 968
+ 3977 2065 968
+ 2066 2553 20
+ 2786 2066 256
+ 2067 41 2779
+ 3305 2325 757
+ 3193 2022 1186
+ 1669 2068 712
+ 2069 2238 1020
+ 3553 855 3700
+ 2070 274 3243
+ 962 2070 2805
+ 2071 2102 1160
+ 1863 2913 1160
+ 2072 1638 962
+ 2080 2072 962
+ 1042 2336 3638
+ 839 2073 2305
+ 2558 1957 1044
+ 1328 2074 3394
+ 2075 1900 737
+ 941 2075 1632
+ 2076 1310 3348
+ 1786 2076 735
+ 2077 1786 735
+ 1311 2077 3349
+ 3641 3260 519
+ 1573 2078 3641
+ 2079 1894 942
+ 1594 2903 1222
+ 2080 1131 2072
+ 2805 2080 962
+ 2115 986 2957
+ 978 2081 3766
+ 3355 1564 3047
+ 756 2082 2696
+ 2083 756 1634
+ 922 2083 1634
+ 2084 3029 369
+ 1098 2084 2635
+ 2085 1815 985
+ 29 2085 3504
+ 2086 3868 952
+ 1466 2086 952
+ 2087 990 2973
+ 728 2217 4021
+ 2088 1547 979
+ 3795 2088 979
+ 2089 791 3494
+ 2303 2089 1028
+ 2090 3914 934
+ 1236 2090 1749
+ 3808 2026 1127
+ 2163 1122 3148
+ 2092 3796 638
+ 3300 2092 639
+ 2093 917 3858
+ 740 2093 1789
+ 2094 58 2723
+ 1491 2094 2780
+ 2095 3540 301
+ 3354 2095 302
+ 2680 856 3563
+ 722 2096 3564
+ 2097 928 3173
+ 641 2097 640
+ 2098 1095 3761
+ 1064 2098 3578
+ 2099 3000 287
+ 1020 2518 3700
+ 2100 949 1724
+ 367 2100 1724
+ 2101 3011 3688
+ 630 2101 1659
+ 2102 3445 390
+ 2754 2102 391
+ 3137 1275 2659
+ 1387 2706 818
+ 2104 2122 1078
+ 736 2104 3230
+ 2919 1202 3972
+ 809 2105 3937
+ 2106 963 3633
+ 240 2106 239
+ 2107 1345 3094
+ 1898 2769 1114
+ 2108 1150 1829
+ 1341 2108 3128
+ 2109 2455 3559
+ 1212 3678 1852
+ 2110 541 542
+ 933 2110 3597
+ 2111 1942 999
+ 2889 2111 999
+ 2112 924 3621
+ 786 2112 2821
+ 2113 996 2111
+ 1000 2113 2888
+ 2114 1966 825
+ 2572 2114 3254
+ 2115 720 1698
+ 986 2115 3102
+ 2116 798 3976
+ 2636 2116 911
+ 2117 1577 974
+ 1827 2117 974
+ 2118 1014 1471
+ 2046 3523 955
+ 2119 1589 727
+ 1099 2119 3482
+ 2120 2432 771
+ 1012 3374 1553
+ 3548 1993 1128
+ 2120 2121 1128
+ 2122 292 2730
+ 1194 2122 2104
+ 2123 409 410
+ 991 2123 3511
+ 2124 2957 986
+ 1837 3333 986
+ 2125 1891 1195
+ 1051 3573 1477
+ 2126 1022 4033
+ 327 2126 326
+ 2127 3165 83
+ 3916 2127 84
+ 2128 1062 3840
+ 3434 2128 846
+ 3941 1814 1217
+ 3658 2129 674
+ 2130 794 1396
+ 933 2130 2169
+ 2131 3567 92
+ 955 2131 1723
+ 2132 1472 955
+ 1723 2132 955
+ 2133 790 3703
+ 3265 2133 1243
+ 2134 144 1677
+ 889 2704 1677
+ 2135 168 2524
+ 1678 2703 890
+ 3383 1779 1276
+ 973 2136 2739
+ 2137 930 1820
+ 1896 2137 734
+ 2138 1139 2431
+ 1217 2688 2535
+ 2139 984 1526
+ 669 2139 1526
+ 2140 931 3876
+ 2628 2140 760
+ 2141 979 3323
+ 2921 2141 832
+ 2142 732 1881
+ 959 2142 1881
+ 2143 1186 2022
+ 3455 2143 862
+ 2144 3456 861
+ 1185 2144 2023
+ 3766 2081 1312
+ 600 2145 3418
+ 2146 584 585
+ 927 2146 4038
+ 3255 3978 1392
+ 3296 2147 913
+ 2148 1690 1182
+ 1799 2148 936
+ 3575 1291 1946
+ 1126 2530 1916
+ 2150 1845 1040
+ 1711 2150 1224
+ 2151 1562 1280
+ 1614 3829 1070
+ 2152 1866 1175
+ 1843 2152 1175
+ 2153 1649 79
+ 973 2153 3838
+ 2154 3952 393
+ 3077 2154 394
+ 2155 1818 925
+ 483 2155 3479
+ 2156 1006 3908
+ 3201 684 3389
+ 2157 716 1759
+ 1121 3016 1759
+ 2158 1781 679
+ 2158 3533 3610
+ 2159 1954 1076
+ 2439 2825 1244
+ 2160 275 3815
+ 3345 2160 3954
+ 2161 1227 3346
+ 2434 2161 893
+ 2162 996 1943
+ 874 2162 1943
+ 3148 680 3690
+ 1969 2163 833
+ 2164 803 3605
+ 978 2164 3163
+ 2208 2056 1063
+ 2300 2323 694
+ 2166 1066 2620
+ 2717 3770 1434
+ 2167 1879 953
+ 2562 2167 953
+ 2168 963 3895
+ 2638 3083 1644
+ 2169 2130 1396
+ 3888 2169 677
+ 2170 1766 956
+ 1925 2170 956
+ 2171 3079 887
+ 821 2171 3096
+ 2172 1441 4002
+ 2257 2172 940
+ 2173 1039 2851
+ 2889 2173 671
+ 2174 656 1569
+ 961 2174 3009
+ 3230 2175 3950
+ 1731 3384 1078
+ 3812 1792 1118
+ 749 2176 3092
+ 2177 750 3915
+ 1791 3814 1119
+ 2178 755 2456
+ 1738 2178 1068
+ 2179 3390 740
+ 1007 2179 1518
+ 2180 3454 923
+ 1793 3432 923
+ 2181 1736 699
+ 882 2865 1486
+ 2182 806 2457
+ 990 2182 2377
+ 2183 985 1815
+ 1066 2183 1815
+ 2184 2054 975
+ 1497 2184 975
+ 2185 1242 1703
+ 1113 2185 1803
+ 2186 915 1886
+ 1397 2186 1951
+ 2187 2045 1346
+ 970 2187 1601
+ 2188 1155 1709
+ 829 3918 3177
+ 2189 785 2992
+ 2849 2918 767
+ 2190 781 1554
+ 928 2190 3173
+ 1132 2479 2897
+ 749 2191 2447
+ 2951 2472 1232
+ 1822 2192 919
+ 2193 1680 1169
+ 778 2193 2902
+ 2207 736 2346
+ 843 2194 3156
+ 2195 1068 2456
+ 894 2195 3497
+ 2196 1701 785
+ 1196 2196 2189
+ 2197 765 3464
+ 1584 2197 927
+ 2198 1225 3677
+ 3998 2198 545
+ 3061 1203 1807
+ 957 2199 1807
+ 2200 3138 46
+ 3837 2200 455
+ 2201 1172 2001
+ 1733 2201 1058
+ 2202 1306 2083
+ 922 2202 2083
+ 2203 779 2778
+ 766 2506 1954
+ 2204 3955 997
+ 737 2204 3782
+ 2205 695 3452
+ 2179 2205 1237
+ 2206 1251 2991
+ 795 2206 1642
+ 2207 1105 3344
+ 2194 2207 1106
+ 2208 1077 2056
+ 2165 2208 1063
+ 2209 3247 1363
+ 1047 2209 2453
+ 2210 321 3101
+ 1084 2210 2628
+ 2211 999 1838
+ 1124 2211 3110
+ 2212 1652 1163
+ 1313 2777 2714
+ 2815 1269 2357
+ 770 2213 2402
+ 2214 1226 2032
+ 1016 2214 3142
+ 2215 729 3248
+ 911 2215 3541
+ 2216 1017 2399
+ 717 2216 2398
+ 2963 1281 2087
+ 1560 2217 728
+ 2218 45 3479
+ 786 2569 3797
+ 2219 35 3166
+ 2446 2479 1173
+ 2220 1026 2285
+ 718 2220 1484
+ 2221 1153 1875
+ 1507 3909 1055
+ 2222 946 3559
+ 3094 2222 708
+ 2223 988 3402
+ 353 2223 36
+ 2224 989 3352
+ 340 2224 339
+ 2225 1832 992
+ 745 2225 3898
+ 2226 2461 1015
+ 99 2226 2425
+ 2227 1320 3493
+ 2424 2227 90
+ 2228 959 3684
+ 3254 2228 680
+ 2229 810 2830
+ 2416 1086 3912
+ 1088 2417 3913
+ 810 2230 2830
+ 2231 1403 3354
+ 956 2231 1925
+ 2232 811 2826
+ 2421 1094 3906
+ 1092 2420 3905
+ 811 2233 2826
+ 2234 935 3372
+ 3655 2234 781
+ 2235 755 2534
+ 951 2235 3448
+ 2236 446 3416
+ 1626 3233 904
+ 3447 1848 1193
+ 965 2237 1776
+ 3809 1230 2099
+ 1181 2238 2069
+ 2239 977 3824
+ 603 2239 3411
+ 2240 447 2520
+ 2526 2240 1165
+ 2241 967 1772
+ 739 2241 1772
+ 2242 1003 1735
+ 653 2242 1735
+ 2243 28 3396
+ 1103 2243 2691
+ 2956 1751 1088
+ 3929 2833 810
+ 2245 15 2946
+ 810 2834 3929
+ 2246 1288 2021
+ 971 2246 2021
+ 2954 1756 1092
+ 1257 2836 3924
+ 2248 7 3232
+ 811 2835 3924
+ 2249 2380 1050
+ 1496 2249 1050
+ 2250 794 2658
+ 1220 2250 3223
+ 2732 1036 1648
+ 2731 1266 3628
+ 3065 1386 1003
+ 1174 2252 2242
+ 2253 1847 929
+ 623 2253 3892
+ 2254 532 533
+ 976 2254 1606
+ 2255 1079 2096
+ 722 2255 2096
+ 2256 1771 1012
+ 1553 2256 1012
+ 2257 1541 676
+ 2172 2257 1290
+ 2258 3332 773
+ 964 2258 2309
+ 2259 3531 867
+ 748 2259 2436
+ 2260 1004 1642
+ 3704 2260 656
+ 2261 3149 974
+ 1577 3060 974
+ 3071 822 4032
+ 241 2262 1433
+ 2263 3839 800
+ 972 2263 1778
+ 3919 1296 4030
+ 1259 3879 1850
+ 3880 1851 1260
+ 1297 2265 3835
+ 2266 1758 964
+ 1740 2266 964
+ 2267 1680 1073
+ 3002 2433 795
+ 3256 3338 2268
+ 2349 2268 1030
+ 2885 1161 1818
+ 2774 2269 52
+ 2270 1158 2712
+ 157 2270 1715
+ 1201 2809 3252
+ 1231 2271 3616
+ 2272 1200 1760
+ 2497 2272 910
+ 2273 772 3022
+ 1141 2273 2853
+ 2274 3849 325
+ 1544 2274 31
+ 2275 442 3336
+ 1183 2275 2731
+ 2276 2338 1122
+ 1965 3826 968
+ 2277 1002 3025
+ 1142 3332 3692
+ 2278 1596 1052
+ 1963 3661 1112
+ 2279 154 1720
+ 1159 2279 2749
+ 2851 671 2173
+ 3510 864 3674
+ 2281 358 3393
+ 2012 2281 972
+ 2282 434 1863
+ 924 2282 1863
+ 4022 2186 1397
+ 842 2283 3883
+ 2284 179 2844
+ 2593 2284 1135
+ 2285 1026 3499
+ 3176 2285 798
+ 2286 1510 295
+ 1008 3124 1645
+ 2287 1482 769
+ 902 2287 3403
+ 2288 3582 382
+ 1869 2288 383
+ 2289 1868 402
+ 3583 2289 403
+ 2290 2403 723
+ 995 2290 3902
+ 2291 899 3560
+ 1395 2291 698
+ 2292 1700 1025
+ 3410 744 3715
+ 2293 1508 1004
+ 1370 2293 2260
+ 2294 1518 993
+ 661 2294 3093
+ 2295 978 2145
+ 601 2295 2145
+ 3304 1146 1897
+ 3922 2296 397
+ 2297 1008 2970
+ 860 2297 1597
+ 2298 3164 724
+ 1046 2298 1461
+ 2299 854 1604
+ 1857 2299 945
+ 2323 1167 2165
+ 1204 2300 1873
+ 2301 730 1955
+ 1463 2301 3697
+ 2302 4 2428
+ 1527 2302 3245
+ 3412 733 1822
+ 1060 2303 1822
+ 2304 1040 1833
+ 726 2304 1833
+ 2305 1327 4005
+ 1991 2305 1303
+ 2306 2074 1328
+ 3930 2306 4004
+ 2307 6 4023
+ 845 3221 3653
+ 3158 1930 679
+ 1632 2308 1211
+ 2309 2258 1335
+ 700 2309 4025
+ 2310 995 3902
+ 751 2310 3370
+ 3811 2009 1435
+ 731 2637 3298
+ 2312 3004 3682
+ 1788 2312 1062
+ 2313 3250 1204
+ 1873 3160 1204
+ 2314 780 1968
+ 1054 2314 1968
+ 2813 2818 1036
+ 1266 2315 2251
+ 2316 672 3169
+ 1482 2316 3110
+ 2317 2548 797
+ 1005 2317 3980
+ 2318 166 1678
+ 1158 2318 3527
+ 2319 1159 3579
+ 145 2319 1677
+ 2320 1398 3189
+ 896 2320 1636
+ 2321 709 2621
+ 988 2321 3402
+ 2322 1205 3099
+ 3227 11 3307
+ 2323 2300 1167
+ 1063 2323 2165
+ 2324 1796 677
+ 914 2324 2692
+ 2325 1261 2067
+ 1109 2325 2067
+ 2326 1026 1703
+ 3513 2326 662
+ 2327 1494 937
+ 2733 2327 937
+ 2872 2837 1252
+ 807 2328 2529
+ 2329 998 1785
+ 1587 2329 700
+ 2330 1773 1164
+ 3498 2330 1486
+ 3921 2060 709
+ 1191 2331 1732
+ 4037 1962 966
+ 2026 2332 1127
+ 2333 1842 716
+ 1195 2906 1754
+ 2334 1298 2084
+ 1352 3116 2599
+ 2335 669 1617
+ 912 2335 3273
+ 2336 1713 1043
+ 1913 3589 1043
+ 2337 1714 1045
+ 1912 3590 1045
+ 2338 2276 742
+ 981 2338 1999
+ 2339 1246 3056
+ 62 2339 3654
+ 2943 3327 828
+ 48 2340 2731
+ 2341 1980 759
+ 1131 2341 3259
+ 2342 3673 982
+ 3552 2342 982
+ 3893 1806 1121
+ 1485 2343 1121
+ 2344 1542 969
+ 2867 2344 969
+ 2345 2139 1268
+ 796 2345 3322
+ 2346 1357 3062
+ 2207 2346 1106
+ 2810 1614 1070
+ 1469 2347 1070
+ 2348 1099 3482
+ 903 2348 1666
+ 2349 1350 2268
+ 1361 2349 4034
+ 2350 3552 982
+ 1308 2350 3889
+ 2351 969 1459
+ 1769 3100 1139
+ 2352 1124 3169
+ 3793 2352 863
+ 2353 1005 3980
+ 670 2353 3457
+ 3240 975 3458
+ 614 2354 613
+ 2355 503 1875
+ 1153 2355 1875
+ 2356 778 2361
+ 994 2356 1601
+ 2357 1125 2815
+ 2280 2357 1269
+ 2358 927 4038
+ 813 2358 3973
+ 2359 1131 3259
+ 875 2359 2661
+ 2360 1333 3365
+ 1651 2360 945
+ 2361 970 1601
+ 2356 2361 1601
+ 2362 1918 1342
+ 1960 2362 814
+ 2363 1958 814
+ 1920 2363 1342
+ 2364 1631 568
+ 1667 2364 569
+ 2365 969 1542
+ 561 3473 1542
+ 2366 1945 1343
+ 1912 2366 815
+ 2367 1944 1344
+ 1913 2367 816
+ 2368 1981 1084
+ 815 2368 1850
+ 2369 1982 1087
+ 816 2369 1851
+ 2370 1928 1347
+ 1929 2370 817
+ 2371 1621 517
+ 3260 2371 518
+ 2372 1052 1684
+ 173 2372 1684
+ 2373 1107 2553
+ 1910 2373 1272
+ 2374 2638 251
+ 3660 2374 19
+ 2375 1138 1683
+ 1387 2375 655
+ 2376 1032 2523
+ 3114 2376 857
+ 2377 2182 1280
+ 1858 2377 668
+ 2378 3581 1488
+ 682 2378 2504
+ 2379 1328 1985
+ 1476 2379 3550
+ 2380 1395 698
+ 1050 2380 1802
+ 2381 1640 1201
+ 1736 3049 699
+ 2382 1637 3956
+ 657 2382 1939
+ 2383 3488 343
+ 1922 2383 344
+ 2384 1149 3469
+ 1136 2384 2062
+ 2385 696 1672
+ 1003 2385 3023
+ 2386 1686 523
+ 980 2386 1647
+ 2387 1071 3530
+ 1233 2626 2509
+ 2388 3741 836
+ 984 2388 1526
+ 2389 1958 1313
+ 1314 3852 673
+ 2390 1033 1794
+ 365 2390 1794
+ 2391 3717 197
+ 1580 2391 198
+ 2392 1579 107
+ 3716 2392 108
+ 2393 376 3719
+ 1581 2393 2653
+ 2394 1578 2652
+ 200 2394 3846
+ 2395 1191 2852
+ 347 2395 1629
+ 3607 1322 1794
+ 1033 2396 1794
+ 2397 182 3001
+ 3403 3063 902
+ 2398 3570 1051
+ 1477 3707 1051
+ 2399 1952 791
+ 2216 2399 1240
+ 2400 511 1481
+ 984 3602 1481
+ 2401 2477 1035
+ 1549 2401 1035
+ 2402 2213 1125
+ 3167 2964 697
+ 2403 2290 1277
+ 2317 2403 1277
+ 2404 802 2876
+ 1065 2404 2563
+ 2405 2894 790
+ 1245 3098 2371
+ 2406 1730 1321
+ 1999 2406 1057
+ 2407 451 43
+ 1054 2407 1816
+ 2408 3404 341
+ 3488 2408 342
+ 2409 3487 337
+ 3405 2409 338
+ 2410 1308 3476
+ 1076 3363 2159
+ 2411 2468 1048
+ 1699 2411 1048
+ 2412 875 2661
+ 1279 2412 3284
+ 2413 1937 335
+ 3487 2413 336
+ 2414 1891 1051
+ 1603 3570 3074
+ 2415 1755 1093
+ 3653 1509 3964
+ 3912 1086 2229
+ 1087 2416 3561
+ 3477 1085 1994
+ 1088 3913 2230
+ 2418 3143 81
+ 3165 2418 82
+ 2419 350 3428
+ 900 3036 3228
+ 3478 1091 1991
+ 1092 3905 2233
+ 2421 1755 1094
+ 2232 3906 1094
+ 2422 1738 1068
+ 1590 2422 1068
+ 2423 2607 1029
+ 1550 2423 1029
+ 2424 1014 2227
+ 1471 2424 3567
+ 2425 1015 3586
+ 98 2425 3568
+ 2795 2837 1221
+ 1167 2426 2165
+ 2427 673 1726
+ 1027 2427 1726
+ 2428 89 3493
+ 1219 2428 2925
+ 2429 2307 1218
+ 3151 2429 1218
+ 2430 1264 3431
+ 1147 3204 3286
+ 2431 1139 3100
+ 2138 2431 1117
+ 2432 1618 3606
+ 1128 2432 2120
+ 2433 1224 2267
+ 1073 2433 2267
+ 2434 1346 2161
+ 1237 3117 3390
+ 2435 1688 891
+ 1080 2435 1660
+ 2436 1108 1788
+ 2128 3430 1062
+ 2437 2886 905
+ 3652 2437 905
+ 3238 1502 1226
+ 1845 2438 1016
+ 2439 752 2056
+ 1077 2439 2056
+ 3907 3576 914
+ 774 2440 2495
+ 2441 1775 1176
+ 3289 2441 1176
+ 3518 1594 1222
+ 3695 3657 916
+ 2443 1320 2227
+ 3164 2443 1014
+ 2444 1586 1154
+ 1672 2444 1154
+ 2445 772 3340
+ 965 2445 1615
+ 2446 900 2971
+ 801 2446 1515
+ 2447 2191 1177
+ 1141 2447 2484
+ 2448 1064 1748
+ 135 2448 1748
+ 2449 2376 1302
+ 668 2449 2711
+ 2450 2596 813
+ 1234 2450 1914
+ 2451 1775 1054
+ 1968 2604 1054
+ 2452 967 2614
+ 3021 2452 818
+ 2453 2934 776
+ 1047 2453 3505
+ 2454 806 2182
+ 1281 2454 2087
+ 2455 1111 3543
+ 3559 2455 1338
+ 2456 2235 1299
+ 2195 2456 1299
+ 2457 1469 1070
+ 1280 2457 2151
+ 2458 509 1635
+ 1113 2458 1635
+ 2920 1082 3609
+ 607 2459 606
+ 2460 3 1959
+ 941 3569 1959
+ 2461 2675 1015
+ 1319 2461 2226
+ 2462 1646 635
+ 1056 3073 1697
+ 2463 1585 951
+ 824 2463 3026
+ 2464 1790 1053
+ 1454 2464 2027
+ 2916 1702 1123
+ 1104 2465 1736
+ 2466 1930 1180
+ 3348 2921 832
+ 2467 1771 1279
+ 2121 2467 788
+ 2468 789 3742
+ 1048 2468 1705
+ 2469 1383 2684
+ 398 2469 3922
+ 2470 1699 1074
+ 2740 2470 1074
+ 2471 1770 1410
+ 1162 2471 3194
+ 2472 652 2988
+ 1089 2472 2951
+ 2473 1148 1896
+ 1733 2473 734
+ 2474 497 498
+ 1116 2474 1904
+ 2475 1049 1653
+ 3407 2475 849
+ 2476 2901 1187
+ 1922 3310 1187
+ 2477 1711 1035
+ 1502 2477 2401
+ 2478 796 3152
+ 2185 2478 1242
+ 2479 1132 2219
+ 1173 2479 2219
+ 2480 3623 650
+ 1530 2480 56
+ 3535 1764 3497
+ 1585 2481 951
+ 2482 1072 1864
+ 361 2482 360
+ 2483 1788 1108
+ 1859 2483 1108
+ 2484 2705 659
+ 1141 2484 3584
+ 2485 3002 795
+ 1035 2485 1540
+ 2486 1910 1188
+ 1553 2486 1188
+ 2487 2894 3917
+ 1884 2487 1009
+ 2488 994 1539
+ 812 2488 2648
+ 2489 1393 2298
+ 1046 2489 2298
+ 2490 1536 983
+ 2974 2490 983
+ 2491 3968 77
+ 1649 2491 78
+ 2492 2193 778
+ 2206 2492 1251
+ 2493 3630 1018
+ 1891 3318 1195
+ 2494 1513 3595
+ 3313 2494 869
+ 2495 1046 1461
+ 774 2495 1461
+ 2496 1951 906
+ 1264 2496 3755
+ 2497 910 2002
+ 704 2497 3802
+ 2498 3783 721
+ 2574 2498 721
+ 2499 2923 1205
+ 2322 2499 1205
+ 2500 1095 1844
+ 138 2500 137
+ 2501 1351 3464
+ 2059 2501 1651
+ 2502 1333 765
+ 1763 2502 1192
+ 2503 987 2707
+ 1826 2503 661
+ 2504 1038 1712
+ 682 2504 1712
+ 2505 1870 1017
+ 1779 2505 1276
+ 2506 1221 2203
+ 1076 2506 2203
+ 2507 2010 800
+ 1864 2507 1323
+ 3899 1184 1931
+ 1511 2508 428
+ 3999 2498 1233
+ 1133 2509 2626
+ 2510 2196 1196
+ 675 2510 3015
+ 3778 1975 1021
+ 854 2511 3784
+ 2512 1027 1667
+ 3107 2512 888
+ 3986 1602 1172
+ 1378 2513 3249
+ 2514 2857 1142
+ 2585 2514 1142
+ 2515 1179 3865
+ 884 2515 1501
+ 2516 1061 2051
+ 633 2516 632
+ 2517 1378 2049
+ 1232 2517 1934
+ 2518 2099 288
+ 3362 2518 289
+ 2519 985 2183
+ 767 2519 2183
+ 2520 3599 1165
+ 2240 2520 1165
+ 2521 1599 535
+ 1588 2521 536
+ 1470 3387 3859
+ 548 2522 1517
+ 2523 1032 1679
+ 1716 2523 722
+ 2524 169 1665
+ 1143 2524 1665
+ 2525 965 1776
+ 698 2525 3484
+ 2526 1235 2240
+ 3206 2526 1165
+ 2527 219 1997
+ 1091 2527 1997
+ 2528 310 1995
+ 1085 2528 1995
+ 2702 1167 2300
+ 1252 2529 2328
+ 2530 1126 2149
+ 808 2530 2149
+ 2531 3356 1345
+ 2107 2531 1345
+ 2532 2845 1101
+ 3888 2532 1101
+ 2533 689 1607
+ 1075 2533 1607
+ 2534 1355 2235
+ 1049 2534 1653
+ 2535 1117 1827
+ 1217 2535 2129
+ 2536 316 1945
+ 1045 2536 1945
+ 2537 225 1944
+ 1043 2537 1944
+ 2538 298 3671
+ 1645 2538 908
+ 2539 1989 1103
+ 787 2539 1921
+ 2540 1041 1718
+ 687 2540 1718
+ 2541 1273 3121
+ 131 2541 3024
+ 3338 1306 3457
+ 797 2542 1504
+ 2543 2134 1144
+ 1673 2543 1144
+ 3650 1542 830
+ 560 2544 3958
+ 2545 1738 68
+ 2017 2545 69
+ 2546 191 1928
+ 1025 2546 1928
+ 2547 1718 1100
+ 2874 2547 1100
+ 2548 3969 1411
+ 797 2548 3747
+ 2549 1752 1087
+ 1982 2549 1087
+ 2550 847 3289
+ 1363 2934 2453
+ 2551 1526 998
+ 1946 2551 998
+ 2552 1712 1102
+ 2878 2552 1102
+ 2553 1107 1747
+ 1272 2553 2066
+ 2554 189 1700
+ 1920 2554 1024
+ 2555 223 1713
+ 1956 2555 1042
+ 2556 314 1714
+ 1957 2556 1044
+ 2557 2073 839
+ 1956 2557 1400
+ 2558 1044 2074
+ 840 2558 2074
+ 2559 1997 1400
+ 1991 2559 839
+ 2560 1995 1401
+ 1994 2560 840
+ 2561 2788 1069
+ 2792 2561 1069
+ 2562 953 1814
+ 817 2562 1814
+ 2563 1805 1065
+ 1364 2563 2404
+ 2564 3530 1071
+ 3508 2564 1071
+ 2565 1769 1139
+ 2009 2565 1435
+ 2566 3486 1059
+ 2770 2566 1059
+ 2567 1770 1162
+ 870 2567 3368
+ 2568 268 1719
+ 887 3079 3115
+ 2569 2218 1295
+ 1146 2821 1897
+ 2570 1112 1856
+ 176 2570 175
+ 2571 1909 1207
+ 660 2571 2585
+ 2572 1127 2114
+ 2091 2572 680
+ 2573 2969 1090
+ 1495 2573 1090
+ 2574 721 1926
+ 1071 2574 1926
+ 2575 3547 1067
+ 2017 2575 1067
+ 2576 1013 3844
+ 1742 2765 1037
+ 2577 1126 1916
+ 407 2577 406
+ 2578 2905 411
+ 2745 2578 412
+ 2579 1890 1097
+ 1993 2579 1097
+ 2580 2019 950
+ 609 2580 1443
+ 2581 3346 1227
+ 1816 2581 1227
+ 2582 2961 1096
+ 1500 2582 1096
+ 2583 185 1918
+ 1023 2583 1918
+ 2584 2141 1180
+ 1787 2584 1180
+ 2585 1207 2514
+ 660 2585 3692
+ 2586 1243 2133
+ 804 2586 3174
+ 2587 2430 1147
+ 830 2587 3263
+ 2588 1052 1596
+ 3406 3195 1377
+ 2589 1772 1223
+ 1282 3389 2156
+ 2590 3943 551
+ 3944 2590 552
+ 2591 1625 835
+ 1055 2591 1507
+ 2592 1029 1530
+ 848 2592 3881
+ 2593 1256 2284
+ 2287 2593 1135
+ 2594 1540 1004
+ 1508 2594 1004
+ 2595 1978 1145
+ 1766 2595 1145
+ 2596 1193 2004
+ 1031 2596 2004
+ 2597 30 330
+ 2847 2597 330
+ 3513 1348 2326
+ 2215 2598 1253
+ 2599 3116 1098
+ 1544 2599 1098
+ 2600 2450 1234
+ 1883 2600 1234
+ 2601 3758 1169
+ 1680 2601 1169
+ 2602 1152 3786
+ 470 2602 469
+ 2603 1878 1136
+ 1676 2603 1136
+ 2604 776 2451
+ 1054 2604 2451
+ 2605 1210 1968
+ 1706 2605 2045
+ 3749 1625 1055
+ 1875 2606 1055
+ 2607 1412 823
+ 1029 2607 3776
+ 3168 2123 991
+ 2005 2608 1283
+ 2609 1748 1064
+ 3578 2609 1064
+ 2610 784 3116
+ 1813 2610 1022
+ 2611 1097 1552
+ 1543 2611 843
+ 2612 475 476
+ 2612 3138 3693
+ 2613 1549 725
+ 1608 3609 2025
+ 2614 2063 1138
+ 1387 2614 2375
+ 2615 1792 459
+ 1840 2615 460
+ 2616 1119 1841
+ 421 2616 1841
+ 2617 907 1592
+ 841 2617 1592
+ 2618 954 1927
+ 1394 2618 1927
+ 2619 3054 866
+ 1038 2619 1599
+ 2620 2000 1334
+ 2166 2620 787
+ 2621 709 2060
+ 1129 2621 2060
+ 2622 1109 1905
+ 1469 4003 1905
+ 2623 3583 404
+ 3422 2623 35
+ 2624 1463 642
+ 1166 2624 2899
+ 2625 1566 579
+ 1604 2625 580
+ 2626 2387 678
+ 1133 2626 1823
+ 2627 741 1762
+ 1205 2627 3099
+ 2628 1254 2140
+ 1084 3890 1850
+ 2629 1011 1902
+ 419 2629 1902
+ 2630 462 1901
+ 1010 2630 1901
+ 2631 1499 1011
+ 1571 2631 1011
+ 2632 1570 1010
+ 1498 2632 1010
+ 2633 3799 543
+ 3677 2633 544
+ 2634 1130 1693
+ 3925 2634 823
+ 2635 2084 370
+ 1098 2635 1544
+ 3541 3187 1675
+ 696 3760 3836
+ 2637 952 2311
+ 1435 2637 2311
+ 2638 1202 3083
+ 251 2638 250
+ 2639 881 4008
+ 1027 2639 1631
+ 2640 673 1558
+ 2052 3562 1151
+ 2641 3709 676
+ 1162 2641 3368
+ 2642 2925 775
+ 1392 2642 1911
+ 2643 2735 1115
+ 1919 3886 1448
+ 2644 1610 574
+ 1546 2644 575
+ 2645 237 1898
+ 1114 2645 1898
+ 2646 3042 859
+ 1041 2646 1623
+ 3566 3778 1021
+ 1663 2647 1021
+ 2648 1539 1007
+ 2980 2648 1007
+ 2649 1988 1360
+ 1529 2649 2533
+ 2650 664 3007
+ 2534 2650 1355
+ 2651 1511 428
+ 1161 3375 1862
+ 2652 1578 120
+ 2394 2652 1423
+ 2653 2393 1417
+ 1581 2653 323
+ 2654 1579 2392
+ 1424 2654 2392
+ 2655 1418 2391
+ 1580 2655 2391
+ 2656 1178 1836
+ 1179 2656 1836
+ 2657 2108 1341
+ 820 2657 4001
+ 2658 1332 2633
+ 2250 2658 1225
+ 3655 781 4014
+ 1013 2659 3844
+ 2660 2561 1474
+ 1973 3947 1101
+ 2661 1414 2047
+ 2412 2661 1228
+ 2662 926 2509
+ 1908 2662 1133
+ 3793 2173 1270
+ 1039 2663 1610
+ 2664 1616 1134
+ 2823 2664 1134
+ 2665 2405 1245
+ 2078 2665 1245
+ 2666 3983 1105
+ 1552 2666 3046
+ 2667 1035 1540
+ 725 2667 1540
+ 2668 1805 3251
+ 2819 2668 834
+ 3975 1747 921
+ 254 2669 1600
+ 3985 1983 1102
+ 2561 2670 1489
+ 2671 3886 1115
+ 621 2671 2984
+ 2672 1293 3894
+ 1881 2672 958
+ 2673 686 2686
+ 1979 2673 1096
+ 2674 836 3741
+ 3264 3442 1563
+ 2675 1461 724
+ 1472 3586 2046
+ 2676 386 3276
+ 1209 2676 2756
+ 2677 1383 3945
+ 1208 2677 3155
+ 2678 2772 1151
+ 1556 2678 1151
+ 2679 1556 1019
+ 672 2679 3169
+ 2680 2096 1079
+ 1757 2680 1079
+ 2681 1222 1947
+ 726 2681 1947
+ 2682 949 2048
+ 1263 2682 2048
+ 2683 499 500
+ 1079 2683 1757
+ 2684 45 1512
+ 2469 2684 1512
+ 2685 1163 1652
+ 1432 2685 3468
+ 2686 1503 1110
+ 2911 2686 1110
+ 4000 1977 1100
+ 2686 2687 1503
+ 2688 731 2138
+ 1117 2688 2138
+ 2689 1612 1140
+ 2822 2689 1140
+ 2690 1747 1107
+ 1961 2690 1618
+ 2691 1258 3991
+ 1103 2691 3994
+ 2692 2324 1396
+ 2959 2692 794
+ 2693 1095 1761
+ 1381 3659 1761
+ 2694 838 1549
+ 2613 2694 1549
+ 2695 1725 3860
+ 1607 2695 1065
+ 3253 867 3872
+ 756 2696 1634
+ 2697 1422 2274
+ 1544 2697 2274
+ 3446 1188 1719
+ 270 2698 269
+ 2699 1530 56
+ 1475 2699 555
+ 2700 657 3588
+ 1358 2700 2495
+ 3982 1948 1238
+ 3343 2701 1238
+ 2702 2529 1167
+ 1204 2702 2300
+ 2703 1143 1745
+ 2135 2703 1678
+ 2704 2890 1144
+ 2134 2704 1144
+ 2705 1907 3820
+ 1177 2705 2484
+ 2706 2103 1013
+ 818 2706 3714
+ 2707 1872 812
+ 2503 2707 1431
+ 3311 1717 922
+ 2184 2708 1385
+ 2709 1038 3928
+ 853 2709 3874
+ 2710 1703 1026
+ 1507 2710 1026
+ 2711 2449 1302
+ 2119 2711 1302
+ 2712 1715 2270
+ 890 2712 3527
+ 2713 3827 858
+ 1157 3779 1802
+ 2714 2777 1163
+ 3843 2714 1163
+ 2715 1148 1683
+ 1896 3026 1197
+ 2716 38 405
+ 1309 2716 1916
+ 2717 3691 879
+ 3529 2717 879
+ 2718 3819 1181
+ 1561 2718 3433
+ 2719 1597 948
+ 3062 2719 948
+ 2720 1041 1528
+ 850 2720 3816
+ 2721 1562 852
+ 1032 2721 1679
+ 2722 2982 844
+ 3791 2722 844
+ 2723 58 59
+ 1178 2723 1836
+ 2724 870 3368
+ 940 2724 1541
+ 2725 1047 3505
+ 1873 2725 3160
+ 2726 159 1695
+ 2270 2726 1158
+ 2727 1106 1795
+ 1583 2727 658
+ 2728 2049 1356
+ 1809 2728 947
+ 2729 992 1832
+ 595 2729 1832
+ 2730 1731 1078
+ 2122 2730 1078
+ 2731 2340 1183
+ 1266 2731 2275
+ 2732 3896 489
+ 2251 2732 490
+ 2733 1170 2868
+ 2327 2733 1274
+ 2734 779 3086
+ 1154 2734 1514
+ 2735 2643 1628
+ 880 2735 1628
+ 2736 1894 667
+ 1169 2736 1865
+ 2737 571 572
+ 1019 2737 1593
+ 2738 3871 1413
+ 1317 2738 3373
+ 2739 2136 1276
+ 1828 2739 717
+ 2740 1074 3467
+ 3373 2740 831
+ 2741 1829 1150
+ 1654 3034 1150
+ 2742 60 1
+ 1179 2742 3865
+ 2743 1097 2611
+ 1543 2743 2611
+ 3382 751 1722
+ 898 2744 1722
+ 2745 1462 2578
+ 2029 2745 413
+ 2746 1688 3665
+ 892 2746 1768
+ 2747 1404 854
+ 879 2747 2855
+ 2748 1780 1282
+ 1834 2748 1006
+ 2749 889 3579
+ 1720 2749 2279
+ 2750 767 2183
+ 1066 2750 2183
+ 2751 1028 3494
+ 1765 2751 654
+ 2752 991 1674
+ 729 2752 3248
+ 2753 1398 1938
+ 2156 2753 1006
+ 2754 1160 2102
+ 3952 2754 392
+ 2755 464 3555
+ 2677 2755 1383
+ 2756 1382 3554
+ 1209 3438 3841
+ 2757 1643 3897
+ 1325 2757 1861
+ 2758 153 2279
+ 1159 2758 2279
+ 2759 710 3257
+ 989 2759 3352
+ 2760 1112 1624
+ 1963 4026 3642
+ 2761 1278 2058
+ 473 2761 472
+ 2762 1568 3823
+ 1242 2762 1703
+ 2763 1130 1692
+ 647 2763 646
+ 2764 1623 526
+ 1528 2764 527
+ 2765 1727 1037
+ 2576 2765 1742
+ 2766 1627 3788
+ 831 2766 3286
+ 2767 152 1694
+ 147 2767 1694
+ 2768 1695 159
+ 163 3706 162
+ 2769 2107 1114
+ 1366 2769 1898
+ 2770 1059 2204
+ 737 2770 2204
+ 2771 1612 976
+ 866 2771 3822
+ 2772 743 2052
+ 1151 2772 2052
+ 2773 3444 1145
+ 1978 2773 1145
+ 2774 2508 1511
+ 2269 2774 1511
+ 2775 1729 708
+ 2199 2775 1336
+ 2776 377 3037
+ 3186 2776 1200
+ 2777 744 2212
+ 1163 2777 2212
+ 2778 2350 1308
+ 2410 2778 1308
+ 2779 1905 1109
+ 2067 2779 1109
+ 2780 2094 1178
+ 878 2780 2031
+ 2781 1442 1899
+ 3196 3544 1784
+ 3933 1164 1773
+ 629 2782 628
+ 2783 1743 1155
+ 2188 2783 1155
+ 2784 3231 388
+ 1324 2784 3445
+ 2785 847 3713
+ 3206 2785 1399
+ 2786 1696 1215
+ 2066 2786 1215
+ 2787 1450 3837
+ 3159 2787 456
+ 2788 1489 853
+ 1069 2788 3604
+ 2789 2066 1215
+ 2171 2789 1215
+ 2790 1159 2319
+ 146 2790 2319
+ 2791 1695 164
+ 2318 2791 165
+ 2792 1069 3604
+ 1474 2792 844
+ 2793 1120 3442
+ 1740 2793 2266
+ 2794 1118 1840
+ 885 2794 3619
+ 2795 1221 2506
+ 766 2795 2506
+ 2796 1420 2041
+ 1425 2796 2041
+ 2797 2035 1427
+ 206 2797 205
+ 2798 195 196
+ 2033 2798 1418
+ 2799 2037 1419
+ 208 2799 207
+ 2800 2040 1429
+ 305 2800 304
+ 2801 231 232
+ 2039 2801 1430
+ 2802 1421 2034
+ 1427 2802 2034
+ 2803 109 110
+ 2036 2803 1426
+ 2804 1426 2038
+ 1416 2804 2038
+ 2805 2070 1262
+ 3345 2805 1262
+ 2806 1804 1037
+ 684 2806 3189
+ 2807 281 1661
+ 1970 2807 1081
+ 2808 1687 1123
+ 2945 2808 1123
+ 2809 733 3412
+ 909 3252 1734
+ 2810 495 1614
+ 2347 2810 1070
+ 2811 1785 998
+ 1526 2811 998
+ 2812 1806 73
+ 3965 2812 74
+ 2813 1036 2315
+ 443 2813 2315
+ 2814 1537 538
+ 1572 2814 539
+ 2815 2213 1000
+ 1269 2815 2888
+ 2816 2211 1124
+ 999 2816 2889
+ 2817 3815 276
+ 1974 2817 16
+ 2818 904 1648
+ 1036 2818 1648
+ 2819 1607 2668
+ 1075 2819 3702
+ 2820 707 1543
+ 960 2820 2985
+ 2821 2112 1294
+ 1897 2821 1294
+ 2822 1140 1986
+ 746 2822 1986
+ 4030 1912 3919
+ 1985 2823 1134
+ 2824 1075 3702
+ 2993 2824 871
+ 2825 1077 2159
+ 37 2825 2159
+ 2826 1373 3773
+ 2232 2826 1372
+ 2827 922 1671
+ 702 2827 3774
+ 2828 1192 2975
+ 2062 2828 1406
+ 2829 1251 2492
+ 2356 2829 778
+ 2830 2230 1367
+ 1368 3753 686
+ 2831 1668 1186
+ 2143 2831 1186
+ 2832 2144 1185
+ 1778 2832 1185
+ 2833 1255 2244
+ 1088 2833 2244
+ 2834 2229 1086
+ 2245 2834 1086
+ 2835 1094 2248
+ 1257 2835 2248
+ 2836 2247 1092
+ 2233 2836 1092
+ 2837 2872 685
+ 1221 2837 3391
+ 2838 1486 1164
+ 1659 2838 1164
+ 2839 2197 1584
+ 2502 2839 1192
+ 2840 3701 859
+ 1616 2840 859
+ 2841 960 2006
+ 758 2841 2006
+ 2842 3467 1074
+ 1699 2842 1074
+ 4010 1867 1049
+ 4011 2843 1316
+ 2844 181 1689
+ 1135 2844 3403
+ 2845 764 1973
+ 1101 2845 1973
+ 2846 26 3727
+ 18 2858 3725
+ 2847 1519 1190
+ 2597 2847 1190
+ 2848 805 3790
+ 1776 2848 1157
+ 3258 3529 1331
+ 1196 2849 3015
+ 2850 1391 2440
+ 774 2850 2440
+ 2851 1039 2280
+ 1269 2851 2280
+ 2852 1629 2395
+ 1732 2852 1191
+ 2853 2273 1001
+ 2447 2853 749
+ 2854 920 1460
+ 1900 3656 737
+ 2855 2747 1402
+ 3015 1331 3856
+ 2856 1168 1847
+ 624 2856 1847
+ 2857 1002 2277
+ 1142 2857 2277
+ 2858 1203 2846
+ 1429 2858 2846
+ 2859 998 2329
+ 1587 2859 2329
+ 3090 2149 1126
+ 2005 2860 1126
+ 2861 3120 1155
+ 1743 2861 1155
+ 2862 512 1563
+ 2674 3741 1563
+ 2863 1479 3587
+ 1149 2863 3469
+ 2864 558 1627
+ 2766 3549 1627
+ 2865 1104 2181
+ 1486 2865 2181
+ 2866 1468 2784
+ 437 2866 3756
+ 2867 691 3685
+ 1769 2867 969
+ 2868 1170 1716
+ 722 3564 1716
+ 2869 2700 1358
+ 1598 2869 914
+ 2870 1360 3876
+ 1725 2870 2042
+ 2871 1739 710
+ 3456 3512 1681
+ 2872 1252 2328
+ 1206 2872 2328
+ 2873 876 3934
+ 976 2873 1622
+ 3477 1994 1304
+ 1977 2874 1100
+ 2875 1483 864
+ 3510 2875 864
+ 2876 1200 2272
+ 1364 2876 2272
+ 2877 719 1702
+ 1104 2877 1702
+ 2878 1102 1983
+ 763 2878 1983
+ 3364 1545 3854
+ 1854 2879 1216
+ 2880 1801 886
+ 3620 2880 886
+ 2881 23 260
+ 1249 2881 3268
+ 2882 248 3132
+ 247 2882 3269
+ 2883 244 3270
+ 2262 3425 1247
+ 2884 1248 3271
+ 264 2884 24
+ 2885 3953 485
+ 2269 2885 486
+ 3235 1335 3557
+ 1587 2886 2437
+ 2887 849 1485
+ 1121 2887 1485
+ 2888 2815 1000
+ 671 2888 2113
+ 2889 2816 1270
+ 2111 2889 671
+ 2890 2704 1730
+ 742 2890 1730
+ 2891 1083 1959
+ 3 2891 1959
+ 2892 1992 1194
+ 1619 2892 3970
+ 2893 431 1538
+ 1862 2893 925
+ 2894 2405 1189
+ 1893 2894 1189
+ 2895 45 2218
+ 1146 2895 2218
+ 2896 1116 1679
+ 2721 2896 1679
+ 2897 1907 1177
+ 2191 2897 1177
+ 2898 1849 1050
+ 1802 2898 1050
+ 2899 2624 643
+ 1166 2899 1821
+ 2900 1727 896
+ 1037 2900 1636
+ 2901 2476 1629
+ 2852 2901 1629
+ 2902 1865 2361
+ 1169 2902 2193
+ 2903 1947 1222
+ 2079 2903 1594
+ 2904 1019 1593
+ 863 2904 3787
+ 2905 410 411
+ 1330 2905 2578
+ 2906 2333 716
+ 1754 2906 3914
+ 2907 1975 1404
+ 1434 3691 2717
+ 2908 3377 1110
+ 1503 2908 1110
+ 2909 977 2239
+ 604 2909 2239
+ 2910 508 2458
+ 1113 2910 2458
+ 2911 1110 3377
+ 2998 2911 876
+ 2912 1540 2485
+ 1642 2912 795
+ 2913 435 2071
+ 1160 2913 2071
+ 2914 2842 1699
+ 1048 2914 1699
+ 2915 1693 648
+ 3623 2915 649
+ 2916 2465 1702
+ 1687 2916 1123
+ 2917 777 1809
+ 1018 3630 1809
+ 2918 2189 1129
+ 2519 2918 1129
+ 3972 1362 2105
+ 963 2919 2105
+ 2920 2459 1082
+ 605 2920 1608
+ 2921 2466 1180
+ 2141 2921 1180
+ 2922 1089 3153
+ 872 2922 1640
+ 2923 2499 1715
+ 890 2923 1715
+ 2924 1198 1846
+ 333 2924 1846
+ 2925 2642 1219
+ 1320 2925 2428
+ 2926 3858 917
+ 1892 2926 1278
+ 2927 51 1656
+ 1525 2927 3601
+ 2928 3817 1520
+ 481 2928 3942
+ 2929 1522 3600
+ 50 2929 1657
+ 2930 453 3962
+ 3818 2930 1521
+ 2931 1834 1006
+ 1412 2931 1938
+ 2932 1153 3244
+ 856 2932 1494
+ 3996 1888 1409
+ 1900 2933 1409
+ 2934 2550 1176
+ 2451 2934 1176
+ 2935 2003 713
+ 1185 2935 1778
+ 3495 690 1584
+ 927 2936 1584
+ 2937 1582 529
+ 1559 2937 530
+ 2938 1885 1199
+ 2952 2938 1199
+ 2939 284 1876
+ 1182 2939 3789
+ 2940 235 1808
+ 957 2940 1808
+ 2941 1238 1948
+ 355 2941 1948
+ 2942 2070 962
+ 17 2942 3378
+ 2943 1932 1183
+ 2340 2943 1183
+ 2944 252 253
+ 1212 3509 3882
+ 2945 1123 1964
+ 1602 2945 865
+ 2946 1255 2245
+ 3726 2946 15
+ 2947 2946 1428
+ 1255 2947 2244
+ 2948 2014 1538
+ 2112 2948 1271
+ 2949 1683 1138
+ 3242 2949 1138
+ 3763 1547 3112
+ 2541 3572 1273
+ 2951 1232 1934
+ 2192 2951 919
+ 2952 1493 2938
+ 2028 2952 1199
+ 2953 7 2248
+ 1094 2953 2248
+ 2954 217 1756
+ 2247 2954 1092
+ 2955 15 2245
+ 1086 2955 2245
+ 2956 308 1751
+ 2244 2956 1088
+ 2957 2124 1312
+ 2115 3988 720
+ 2958 1931 1184
+ 1798 2958 1184
+ 2959 1220 1598
+ 2692 2959 1598
+ 2960 2044 1197
+ 3026 2960 1197
+ 2961 762 1979
+ 1096 2961 1979
+ 2962 1572 539
+ 1492 2962 540
+ 2963 2217 1016
+ 1281 2963 3142
+ 2964 1326 2402
+ 1125 2964 2402
+ 2965 1132 2191
+ 749 2965 2191
+ 2966 1031 1907
+ 801 2966 1907
+ 2967 1080 1974
+ 2064 3466 1384
+ 2968 1528 528
+ 1582 2968 529
+ 2969 1259 1850
+ 1988 2969 760
+ 2970 2020 715
+ 2297 2970 1597
+ 2971 2062 1406
+ 1515 4006 690
+ 2972 1081 1662
+ 3299 2972 874
+ 2973 1858 1307
+ 2087 3668 728
+ 2974 1411 2490
+ 3337 2974 983
+ 2975 1192 1584
+ 4006 2975 690
+ 2976 1063 3421
+ 3713 2976 1399
+ 2977 916 3183
+ 1741 2977 728
+ 2978 1617 1291
+ 2149 3090 1291
+ 2979 3113 954
+ 3885 2979 954
+ 2980 1007 1518
+ 2294 2980 1518
+ 2981 3496 1210
+ 1706 2981 1210
+ 2982 1101 3947
+ 1455 2982 2722
+ 2983 1466 952
+ 1704 2983 2637
+ 2984 1115 1721
+ 619 2984 1721
+ 2985 2820 1543
+ 1583 2985 843
+ 2986 871 3869
+ 980 2986 1686
+ 2987 1475 556
+ 1534 2987 557
+ 2988 2513 1378
+ 2517 2988 1378
+ 2989 695 1539
+ 1601 2989 994
+ 2990 3234 1459
+ 563 2990 3711
+ 2991 1251 1935
+ 1642 2991 2260
+ 2992 1480 2621
+ 2189 2992 1129
+ 2993 1529 2824
+ 1090 2993 1495
+ 3964 2415 1093
+ 2307 4023 1509
+ 2995 4000 1100
+ 1718 2995 1100
+ 2996 1241 2678
+ 2316 2996 672
+ 2997 320 2210
+ 1084 2997 2210
+ 2998 1535 2911
+ 1096 2998 1500
+ 2999 3985 1102
+ 1712 2999 1102
+ 3000 2099 1230
+ 1800 3000 1230
+ 3001 1843 1175
+ 2397 3001 1175
+ 3002 1711 1224
+ 2433 3002 1224
+ 3003 1186 1668
+ 2068 3003 712
+ 3004 2302 1527
+ 3682 3004 1527
+ 3005 280 2243
+ 1103 3005 2243
+ 3006 888 3608
+ 1019 3006 1664
+ 3007 2960 1456
+ 2463 3448 1456
+ 3008 1716 1170
+ 2028 3008 1170
+ 3009 2174 1569
+ 1872 3009 812
+ 3010 3993 1166
+ 1821 3010 1166
+ 3011 1658 882
+ 1213 3011 2101
+ 3012 894 3833
+ 3041 3401 1506
+ 3221 1218 2307
+ 3576 3979 1796
+ 3014 2642 1392
+ 1797 3978 3255
+ 3856 1331 2855
+ 1196 3015 2510
+ 3016 934 2157
+ 1759 3016 2157
+ 3017 1228 1890
+ 2579 3017 1890
+ 3018 1168 1783
+ 898 3018 1783
+ 3019 731 2688
+ 1217 3019 2688
+ 3020 1516 566
+ 1631 3020 567
+ 3021 1772 2452
+ 1223 3021 1804
+ 3022 1214 1853
+ 2273 3022 1001
+ 3023 2385 1672
+ 3649 3023 897
+ 3024 2541 1490
+ 2086 3024 1490
+ 3025 1854 1216
+ 2277 3764 773
+ 3026 1456 2960
+ 2715 3026 1896
+ 3027 1206 2328
+ 807 3027 2328
+ 3481 1826 1286
+ 3102 3028 883
+ 3029 368 369
+ 1298 3029 2084
+ 3030 1949 932
+ 1338 3543 3712
+ 3031 75 76
+ 1236 3031 1753
+ 3032 2460 1359
+ 3239 3032 1359
+ 3033 3196 703
+ 3805 3033 703
+ 3034 2741 1150
+ 616 3034 1654
+ 3035 1588 536
+ 1537 3035 538
+ 3036 1173 2419
+ 1676 3036 2419
+ 3037 379 3936
+ 1200 3037 1760
+ 3038 1647 525
+ 1623 3038 526
+ 3039 759 2238
+ 1181 3039 2238
+ 3040 267 2568
+ 1239 3040 2568
+ 3041 1380 3598
+ 3401 3041 895
+ 3042 1134 1616
+ 1476 3042 2646
+ 3043 1628 1005
+ 1551 3043 2353
+ 3044 550 3943
+ 3538 3044 1523
+ 3045 3641 520
+ 1487 3045 521
+ 3046 2666 1105
+ 843 3046 2194
+ 3047 3916 2
+ 1859 3047 2
+ 3048 1370 2174
+ 3146 3048 961
+ 3049 1201 2271
+ 2381 3049 1736
+ 3050 1980 1230
+ 2238 3809 1020
+ 3051 1246 2339
+ 63 3051 2339
+ 3052 1688 2435
+ 1080 3052 2435
+ 3053 1056 1697
+ 901 3053 1697
+ 3054 1140 1612
+ 1488 3054 2619
+ 3055 1790 739
+ 1053 3055 3068
+ 3056 2464 1454
+ 2339 3056 1454
+ 3057 1211 3158
+ 826 3057 3277
+ 3058 2051 1213
+ 2101 3058 1213
+ 3617 2282 1271
+ 1538 3059 2948
+ 3060 2261 974
+ 564 3060 1577
+ 3061 2199 783
+ 1203 3061 2170
+ 3062 948 3465
+ 2346 3062 1795
+ 3063 1175 1866
+ 2397 3063 1689
+ 3064 2223 1479
+ 1878 3064 1149
+ 3065 2252 798
+ 1386 3065 2116
+ 3066 1750 883
+ 1286 3066 3481
+ 3067 1443 3358
+ 608 3067 1565
+ 3068 3399 1053
+ 1780 3068 3055
+ 3069 1056 1784
+ 851 3069 3544
+ 3070 943 2068
+ 1669 3070 2068
+ 4024 3270 1810
+ 2262 3071 1433
+ 3072 2423 1550
+ 1705 3072 1048
+ 3073 2462 636
+ 3796 3073 637
+ 3074 791 3184
+ 1240 3074 3570
+ 3075 2910 1803
+ 1625 3075 1803
+ 3076 1198 1669
+ 877 3076 3285
+ 3077 1897 1294
+ 2154 3077 1294
+ 3078 2122 1194
+ 1992 3078 1194
+ 3079 1239 2568
+ 1719 3079 2568
+ 3080 2250 1225
+ 2198 3080 1225
+ 3081 3625 1301
+ 3082 3081 1301
+ 3082 1417 3081
+ 2024 3082 1301
+ 3083 2168 822
+ 4035 3083 822
+ 3084 3649 897
+ 1605 3084 897
+ 3085 1244 2825
+ 37 3085 2825
+ 3086 779 2203
+ 1221 3086 2203
+ 3087 976 1612
+ 683 3087 1612
+ 3088 3687 892
+ 1182 3088 1855
+ 4009 1620 2003
+ 944 3089 2003
+ 3090 1126 2860
+ 782 3090 2860
+ 3091 980 1616
+ 688 3091 1616
+ 3092 2176 1118
+ 1767 3092 2794
+ 3093 2294 993
+ 1887 3093 1505
+ 3094 1345 2222
+ 1729 3094 708
+ 3095 2996 1482
+ 2287 3095 1482
+ 3096 1215 1696
+ 821 3096 3126
+ 3097 1034 3594
+ 2502 3097 1333
+ 3098 1245 2405
+ 790 3098 2405
+ 3099 2627 1762
+ 2322 3099 1057
+ 3100 1769 2351
+ 2431 3100 792
+ 3101 32 2024
+ 1254 3101 2024
+ 3102 2115 1698
+ 1915 3102 883
+ 3103 2295 1371
+ 2164 3103 2015
+ 3104 2020 1008
+ 908 3104 1645
+ 3105 937 1998
+ 1484 3105 1998
+ 3106 949 1953
+ 1668 3106 1953
+ 3107 1558 2512
+ 1151 3107 1556
+ 3108 3960 892
+ 1768 3108 892
+ 3109 1268 2335
+ 3823 3109 912
+ 3110 2316 1124
+ 769 3110 2211
+ 3111 1487 522
+ 1686 3111 523
+ 3112 1547 2088
+ 1886 3112 2088
+ 3113 3443 1206
+ 3027 3113 1206
+ 3114 857 3171
+ 2119 3114 1589
+ 3115 1719 1188
+ 1910 3115 1188
+ 3116 784 2334
+ 1098 3116 2334
+ 3948 3786 1707
+ 2434 3117 1237
+ 3118 1964 1442
+ 2781 3118 1442
+ 3119 1466 3855
+ 129 3119 8
+ 3120 1709 1155
+ 1801 3120 2861
+ 3121 1273 2283
+ 3868 3121 842
+ 3122 1351 2501
+ 2146 3122 584
+ 3123 2013 897
+ 1672 3123 897
+ 3124 2286 296
+ 1645 3124 297
+ 3125 1810 1250
+ 1644 4035 3132
+ 3126 1249 1811
+ 1248 3351 1811
+ 3127 329 2597
+ 1190 3127 2597
+ 3128 1551 2353
+ 1341 3128 1717
+ 3129 938 3339
+ 717 3129 1828
+ 3351 1248 1782
+ 1239 3130 1782
+ 3131 2418 1265
+ 2617 3131 1265
+ 3132 4035 1250
+ 2882 3132 1250
+ 3133 757 3754
+ 2454 3133 1639
+ 3134 2097 641
+ 1463 3134 642
+ 3135 1034 1763
+ 753 3135 1763
+ 3136 3145 714
+ 1384 3136 2064
+ 3137 3618 1275
+ 2103 3137 1013
+ 3138 476 46
+ 1464 3138 2200
+ 3139 2167 13
+ 3738 3139 13
+ 3140 1326 3167
+ 787 3140 3770
+ 3141 2109 1212
+ 1877 3882 1600
+ 3142 2963 1016
+ 3133 3142 757
+ 3143 80 81
+ 1467 3143 2418
+ 3144 1559 530
+ 1622 3144 531
+ 3145 1081 1768
+ 714 3145 3665
+ 3146 961 1882
+ 720 3146 1882
+ 3147 1593 573
+ 1610 3147 574
+ 3148 2091 680
+ 2163 3690 1311
+ 3149 3875 974
+ 1516 3149 2261
+ 3150 1823 678
+ 1229 3150 1849
+ 3151 1218 2850
+ 774 3151 2850
+ 3152 796 3322
+ 2762 3152 1568
+ 3153 1089 2192
+ 733 3153 2192
+ 3154 385 2676
+ 1209 3154 2676
+ 3155 2677 400
+ 1208 3155 3842
+ 3156 2194 1106
+ 1583 3156 2727
+ 3157 241 1433
+ 2106 3895 963
+ 3158 1211 2308
+ 1781 3158 679
+ 3159 1214 2787
+ 1853 3159 457
+ 3160 2725 837
+ 1204 3160 2313
+ 3161 2515 1389
+ 1705 3742 3316
+ 3162 1962 741
+ 1143 3162 1745
+ 3163 2164 1437
+ 2081 3163 720
+ 3164 1014 2118
+ 724 3164 2118
+ 3165 82 83
+ 1265 3165 2127
+ 3166 349 2419
+ 1173 3166 2419
+ 3167 1326 2964
+ 2907 3167 697
+ 3168 1283 2608
+ 2123 3168 2608
+ 3169 1478 2352
+ 2316 3169 1124
+ 3170 1514 3391
+ 2013 3170 1605
+ 3171 3008 2028
+ 1589 3171 1199
+ 3172 1592 1350
+ 2349 3172 1350
+ 3173 2190 1554
+ 1337 3173 3366
+ 3174 2586 1137
+ 2266 3174 1758
+ 3175 3049 2271
+ 1231 3175 2271
+ 3176 1484 2285
+ 2252 3176 798
+ 3177 1709 1207
+ 1909 3177 1207
+ 3178 39 416
+ 1830 3178 1382
+ 3179 1280 1562
+ 2449 3179 1562
+ 3180 964 1758
+ 660 3180 3740
+ 3181 2313 1594
+ 651 3181 3518
+ 3182 903 1741
+ 728 3668 1741
+ 3183 1560 2977
+ 1833 3183 916
+ 3184 2089 1060
+ 3074 3184 1603
+ 3185 1148 1967
+ 655 3185 1967
+ 3186 2876 802
+ 1444 3186 2042
+ 3474 1452 3836
+ 1305 3187 3541
+ 3188 704 3845
+ 1189 3188 1893
+ 3189 1636 2320
+ 2753 3189 1398
+ 3190 942 2601
+ 726 3190 1680
+ 3191 1316 1759
+ 1842 3191 716
+ 3192 1696 258
+ 1249 3192 2881
+ 3193 1186 3003
+ 2068 3193 3003
+ 3430 2128 1353
+ 1162 3194 2641
+ 3195 3460 1377
+ 2588 3195 1684
+ 3196 1903 1287
+ 3544 3196 1287
+ 3197 2067 1261
+ 2019 3197 1261
+ 3198 1825 663
+ 1603 3198 2414
+ 3199 2022 1407
+ 2409 3199 1407
+ 3200 2408 1408
+ 2023 3200 1408
+ 3201 1223 1804
+ 2806 3201 1804
+ 3202 995 2310
+ 751 3202 2310
+ 3203 2783 1390
+ 2043 3203 1390
+ 3204 2430 665
+ 1317 3204 2018
+ 3205 1808 1114
+ 1729 3205 1114
+ 3206 1399 3421
+ 2526 3206 752
+ 3931 1552 1890
+ 1228 3207 1890
+ 3208 1849 2898
+ 1229 3208 1567
+ 3209 1832 1267
+ 2180 3646 1267
+ 3210 1421 3847
+ 1578 3210 120
+ 3211 1580 198
+ 1423 3211 3846
+ 1415 3282 4019
+ 1579 3212 107
+ 3213 375 1581
+ 1422 3213 3214
+ 3214 1581 323
+ 1422 3214 3849
+ 3215 3212 1579
+ 214 3215 1579
+ 3216 3210 1578
+ 201 3216 1578
+ 3217 123 1580
+ 3211 3217 1580
+ 3218 941 1632
+ 1211 3218 1632
+ 3219 1576 1886
+ 1835 3219 738
+ 3220 1899 1061
+ 851 3220 3785
+ 3221 3013 1218
+ 1509 3221 2307
+ 3222 2701 1513
+ 2494 3222 1513
+ 3223 1637 2382
+ 3080 3223 2250
+ 3224 907 2082
+ 1350 3224 3997
+ 3225 3376 587
+ 3545 3225 588
+ 3611 1674 3511
+ 1462 3226 2578
+ 3227 155 11
+ 1321 3227 3307
+ 3228 1676 1136
+ 2062 3228 1136
+ 3229 2564 1609
+ 1557 3686 3762
+ 3230 1078 2175
+ 1357 3950 2175
+ 3231 1830 387
+ 1468 3231 2784
+ 3232 7 3282
+ 1257 3232 3274
+ 3233 1626 2236
+ 1235 3233 2236
+ 3234 1577 2117
+ 1459 3234 2351
+ 3235 2886 1335
+ 1545 3235 1940
+ 3236 719 1984
+ 1061 3236 1984
+ 3237 803 2015
+ 977 3237 2015
+ 3238 2477 1502
+ 2438 3238 1226
+ 3239 1359 2011
+ 1624 3239 2760
+ 3240 2354 975
+ 54 3240 1470
+ 3241 2152 1023
+ 743 3241 3324
+ 3242 1138 2063
+ 705 3242 2063
+ 3243 275 2160
+ 1262 3243 2160
+ 3244 1153 2221
+ 718 3244 2221
+ 3245 1219 3014
+ 3840 3245 846
+ 3648 1440 1777
+ 469 3246 468
+ 3247 2209 1737
+ 847 3247 3713
+ 3248 2752 1674
+ 1305 3248 1674
+ 3249 1820 930
+ 1378 3249 2049
+ 3250 807 2702
+ 1204 3250 2702
+ 3251 1189 2665
+ 2668 3251 834
+ 3252 2809 1734
+ 2271 3252 909
+ 3253 3262 867
+ 1156 3253 2696
+ 3254 2114 1292
+ 2228 3254 1292
+ 3255 2147 1797
+ 913 3255 1392
+ 3256 2268 756
+ 1306 3256 2083
+ 3257 1288 3455
+ 2759 3257 1682
+ 3258 2849 767
+ 1446 3258 2750
+ 3259 2341 759
+ 2359 3259 1414
+ 3260 2078 1245
+ 2371 3260 1245
+ 3261 1895 49
+ 3942 3261 480
+ 3262 1859 1108
+ 2259 3262 1108
+ 3263 2587 1147
+ 1374 3263 3788
+ 3264 514 3558
+ 3442 3264 1375
+ 3265 3436 516
+ 1621 3265 517
+ 3266 1989 1334
+ 2000 3266 1334
+ 3267 1248 2884
+ 264 3267 2884
+ 3268 2881 260
+ 1249 3268 1811
+ 3269 2882 1250
+ 1810 3269 1250
+ 3270 4024 1247
+ 2883 3270 1247
+ 3271 1248 1811
+ 2884 3271 263
+ 3272 1858 2711
+ 1307 3272 3519
+ 3273 3798 1349
+ 1987 3273 1349
+ 3274 1670 14
+ 1257 3274 2247
+ 3275 707 1618
+ 1993 3275 1128
+ 3276 1382 2676
+ 1830 3276 387
+ 3277 3057 1781
+ 1293 3277 1781
+ 3278 740 3390
+ 1152 3278 3786
+ 3279 2412 1279
+ 3378 3279 1279
+ 3827 2713 1641
+ 590 3280 1641
+ 3281 1284 1732
+ 1685 3281 2321
+ 3282 1415 3397
+ 3232 3282 1670
+ 3283 1524 3949
+ 1895 3283 479
+ 3284 2412 3017
+ 1279 3284 2467
+ 3285 3385 1263
+ 1813 3285 1263
+ 3286 2766 1147
+ 1317 3286 3204
+ 3287 2590 1525
+ 827 3287 3601
+ 3288 1685 2321
+ 1458 3288 2223
+ 3289 1531 2441
+ 2550 3289 1176
+ 3290 1920 1342
+ 1918 3290 1342
+ 3291 317 318
+ 1343 3291 1981
+ 3292 1982 1344
+ 1944 3292 1344
+ 3293 2831 2143
+ 1288 3293 2143
+ 3294 1289 2144
+ 2832 3294 2144
+ 3295 1596 2142
+ 2114 3295 1292
+ 3296 3526 1290
+ 2147 3296 1290
+ 3297 1518 2179
+ 1789 3297 740
+ 3298 1139 2138
+ 731 3298 2138
+ 3299 874 1839
+ 1258 3299 3991
+ 3300 1337 2092
+ 640 3300 639
+ 3301 1838 873
+ 1256 4027 1974
+ 3302 2167 1347
+ 1928 3302 1347
+ 3303 1606 534
+ 1599 3303 535
+ 3304 2296 1146
+ 395 3304 1897
+ 3305 757 2032
+ 1261 3305 3398
+ 3306 282 3698
+ 1661 3306 3960
+ 3307 2322 1057
+ 1321 3307 2406
+ 3308 1522 3963
+ 1932 3308 44
+ 3309 1931 1521
+ 454 3309 3962
+ 3310 2476 1187
+ 344 3310 1922
+ 3311 2827 1385
+ 2708 3311 1385
+ 3312 238 239
+ 1366 3312 2106
+ 3313 1732 1284
+ 2494 3313 1284
+ 3314 1932 44
+ 2275 3314 441
+ 3315 3341 1285
+ 1690 3315 1285
+ 3614 2748 1834
+ 706 3316 1834
+ 3317 1641 1376
+ 589 3317 3545
+ 3318 2333 1195
+ 2493 3318 1891
+ 3319 1693 2915
+ 2607 3319 1447
+ 3320 1555 634
+ 1646 3320 635
+ 3321 2058 1278
+ 2926 3321 1278
+ 3322 3109 1568
+ 3152 3322 1568
+ 3323 3903 1388
+ 3462 3323 1388
+ 3324 1960 1314
+ 2052 3324 1314
+ 3325 2003 2935
+ 1185 3325 2935
+ 3326 3080 2198
+ 1441 3326 2198
+ 3327 1524 1895
+ 1520 3327 1895
+ 3328 1894 2079
+ 837 3328 2079
+ 3329 1604 580
+ 2059 3329 581
+ 3330 1774 971
+ 1739 3330 971
+ 3331 2344 1436
+ 2496 3331 1436
+ 3332 2277 773
+ 1613 3332 2258
+ 3333 2124 986
+ 597 3333 1837
+ 3334 2050 1318
+ 1796 3664 677
+ 3772 664 1867
+ 947 3335 1867
+ 3336 443 2315
+ 1266 3336 2315
+ 3337 983 1870
+ 701 3337 1870
+ 3338 3256 1306
+ 2542 3338 1504
+ 3339 2491 1649
+ 1828 3339 973
+ 3340 772 2273
+ 1141 3340 2273
+ 3341 3315 1633
+ 891 3341 3345
+ 3342 1522 1932
+ 2943 3342 1932
+ 3343 972 3884
+ 2701 3343 1728
+ 3983 1561 3710
+ 2207 3344 736
+ 3345 1633 2805
+ 2160 3345 1262
+ 3346 2581 1777
+ 2161 3346 893
+ 3347 745 1908
+ 1267 3347 3454
+ 3348 1310 2921
+ 1575 3348 2609
+ 3349 2077 1574
+ 2693 3349 1574
+ 3662 1831 932
+ 2775 3350 1336
+ 3351 3130 821
+ 1811 3351 3126
+ 3957 1682 3455
+ 2224 3352 1439
+ 3353 1681 989
+ 3200 3353 1438
+ 3354 1403 2095
+ 2231 3354 303
+ 3355 907 3626
+ 2082 3355 1156
+ 3356 1746 946
+ 1345 3356 2222
+ 3357 1731 294
+ 1510 3357 295
+ 3358 2694 1565
+ 3067 3358 1565
+ 3359 27 300
+ 3540 3359 300
+ 3798 1617 2978
+ 3367 3360 782
+ 3361 661 1887
+ 1286 3361 3451
+ 3362 290 1992
+ 1548 3362 1992
+ 3363 2410 415
+ 2159 3363 37
+ 3364 425 426
+ 1545 3804 1880
+ 3365 675 1857
+ 2360 3365 1857
+ 3366 1554 1861
+ 1337 3366 2092
+ 3367 2860 1283
+ 1591 3367 3864
+ 3368 2567 1162
+ 1541 3368 2641
+ 3369 1576 906
+ 1886 3369 2186
+ 3370 2310 1449
+ 1817 3370 929
+ 3669 1017 2216
+ 717 3371 2216
+ 3372 3805 1325
+ 2234 3372 1325
+ 3373 1413 2740
+ 1317 3373 3286
+ 3374 771 2486
+ 1553 3374 2486
+ 3375 1161 2651
+ 429 3375 2651
+ 3376 3694 586
+ 1234 3376 3225
+ 3377 1582 2937
+ 1559 3377 2937
+ 3378 1638 3279
+ 1771 3378 1279
+ 3379 1861 1554
+ 1325 3379 2234
+ 3380 1498 2623
+ 1405 3380 2623
+ 3381 3932 950
+ 1226 3381 2032
+ 3382 2744 1231
+ 3616 3382 1231
+ 3383 841 1779
+ 2136 3383 1276
+ 3384 860 2175
+ 1078 3384 2175
+ 3385 2682 1263
+ 1669 3385 3285
+ 3386 1170 1871
+ 2028 3386 653
+ 3387 1473 2567
+ 1470 3859 2522
+ 3388 42 3877
+ 3539 3388 1369
+ 3389 1282 2589
+ 1223 3389 2589
+ 3390 3117 1707
+ 3278 3390 1707
+ 3391 685 3170
+ 3086 3391 1514
+ 3392 363 364
+ 1322 3392 1794
+ 3393 1323 2281
+ 359 3393 358
+ 3394 2074 3640
+ 1328 3394 1985
+ 3395 1986 1327
+ 2073 3395 1327
+ 3396 1970 1258
+ 2243 3396 1258
+ 3397 1415 3215
+ 1670 3397 14
+ 3398 2032 950
+ 1261 3398 2019
+ 3399 1 2027
+ 1053 3399 2027
+ 3400 2031 1300
+ 1888 3631 692
+ 3401 3012 1506
+ 3056 3401 895
+ 3402 2321 1480
+ 1479 3402 3587
+ 3403 2287 1135
+ 1689 3403 2844
+ 3404 340 341
+ 1438 3404 2408
+ 3405 1439 2409
+ 339 3405 338
+ 3406 1684 3195
+ 172 3406 3967
+ 3407 1759 1316
+ 2475 3407 1316
+ 3408 2421 764
+ 1318 3408 2845
+ 3409 929 1847
+ 1168 3409 1847
+ 3410 1929 1315
+ 2212 3410 1315
+ 3411 1371 2295
+ 603 3411 602
+ 3412 2303 1028
+ 2809 3412 1734
+ 3413 2630 1570
+ 3619 3413 1570
+ 3414 3620 1571
+ 2629 3414 1571
+ 3551 2048 949
+ 2334 3415 1298
+ 3416 447 2240
+ 1235 3416 2240
+ 3417 3360 1591
+ 2752 3417 1591
+ 3418 1312 2124
+ 600 3418 599
+ 3419 1874 1244
+ 1976 3419 1244
+ 3420 2042 931
+ 1444 3420 3625
+ 3421 1063 2056
+ 3206 3421 752
+ 3422 1405 2623
+ 2219 3422 35
+ 3423 2841 1877
+ 921 3423 1877
+ 3424 1352 2599
+ 31 3424 2599
+ 3425 2883 1247
+ 242 3425 2262
+ 3426 2468 1300
+ 2031 3426 1300
+ 3427 3149 1516
+ 3020 4008 1516
+ 3428 2603 1676
+ 2419 3428 1676
+ 3429 2422 1590
+ 3984 3585 1590
+ 3430 2436 1062
+ 3194 3430 1353
+ 3431 1264 3755
+ 2430 3431 665
+ 3432 2180 923
+ 593 3432 3743
+ 3433 855 3710
+ 1181 3433 2718
+ 3434 846 3978
+ 676 3709 1797
+ 3435 3752 1497
+ 615 3435 3940
+ 3436 3265 1243
+ 1990 3436 1243
+ 3437 1950 1190
+ 2055 3437 1190
+ 3438 418 1902
+ 2756 3438 1209
+ 3439 464 2755
+ 1208 3439 2755
+ 3440 1974 16
+ 2284 3440 16
+ 3441 2402 1326
+ 1921 3441 1326
+ 3442 2674 1563
+ 3574 3442 1375
+ 3443 939 1936
+ 1206 3443 1936
+ 3444 1933 1145
+ 1457 3444 2773
+ 3445 2784 389
+ 1324 3445 2102
+ 3446 269 2698
+ 1188 3446 2698
+ 3447 1193 2600
+ 805 3447 2600
+ 3448 1355 3007
+ 1456 3448 3007
+ 3449 1848 965
+ 659 3449 3584
+ 3450 1785 1120
+ 2309 3450 1740
+ 3451 3361 1887
+ 926 3451 1887
+ 3452 2434 1237
+ 2205 3452 1237
+ 3453 995 1812
+ 2548 3453 1812
+ 3454 1908 923
+ 1267 3454 2180
+ 3455 1288 2143
+ 3957 3455 862
+ 3456 1681 3353
+ 1289 3456 2144
+ 3457 1504 3338
+ 2202 3457 1306
+ 3458 2054 1473
+ 3387 3458 1473
+ 3459 2291 1395
+ 3828 3459 1395
+ 3460 2053 1377
+ 825 3460 3195
+ 3461 1721 1829
+ 618 3461 1829
+ 3462 2141 3323
+ 2609 3462 1748
+ 3747 2974 1361
+ 2542 4034 1030
+ 3464 2360 1651
+ 2501 3464 1651
+ 3465 1795 3062
+ 1457 3465 3444
+ 3466 2064 2967
+ 1942 3466 873
+ 3467 1475 2987
+ 1534 3467 2987
+ 3468 3875 1432
+ 1652 3468 2685
+ 3469 2863 1701
+ 2384 3469 753
+ 3470 1329 1911
+ 2489 3470 1393
+ 3471 1451 1765
+ 3969 3471 654
+ 4016 1948 3666
+ 2223 3472 1458
+ 3473 2365 1542
+ 562 3473 561
+ 3474 2342 1452
+ 3187 3474 1675
+ 3475 1773 1783
+ 626 3475 1783
+ 3476 1308 2029
+ 2410 3476 415
+ 3477 2417 1085
+ 2874 3477 1304
+ 3478 2420 1091
+ 2878 3478 1303
+ 3479 2155 1295
+ 2218 3479 1295
+ 3480 2612 1557
+ 1941 3480 1557
+ 3481 3066 883
+ 1826 3481 3028
+ 3482 2119 727
+ 2348 3482 1666
+ 3977 968 1969
+ 833 3483 1969
+ 3484 1157 1802
+ 698 3484 1802
+ 3485 3115 1910
+ 1272 3485 1910
+ 3486 2566 1860
+ 1576 3486 1860
+ 3487 1407 2413
+ 337 3487 336
+ 3488 342 343
+ 1408 3488 2383
+ 3489 1863 1160
+ 924 3489 1819
+ 3490 925 1818
+ 1862 3490 1161
+ 3491 1040 1845
+ 2217 3491 1845
+ 3492 1319 2226
+ 99 3492 2226
+ 3493 1320 2428
+ 2227 3493 90
+ 3494 1536 2751
+ 2089 3494 1028
+ 3495 1584 2936
+ 1365 3495 2936
+ 3496 776 2604
+ 1210 3496 2604
+ 3497 1299 3535
+ 894 3497 3833
+ 3498 699 1710
+ 2330 3498 1710
+ 3499 1026 2326
+ 1348 3499 2326
+ 3500 3775 1519
+ 2847 3500 1519
+ 3501 956 1766
+ 715 3501 1766
+ 3502 1876 284
+ 1800 3502 285
+ 3503 1376 2713
+ 2848 3503 1157
+ 3504 1191 2395
+ 348 3504 2395
+ 3505 2453 1630
+ 1453 3505 3862
+ 3506 772 3966
+ 1450 3861 3870
+ 3507 3751 1611
+ 2932 3507 1611
+ 3508 1071 1926
+ 918 3508 1926
+ 3509 1212 2944
+ 253 3509 2944
+ 3510 1663 2875
+ 1546 3510 3674
+ 3511 2123 2905
+ 3611 3511 1330
+ 3512 2759 1681
+ 2871 3512 1289
+ 3513 1253 2598
+ 1348 3513 2598
+ 3514 1263 2048
+ 1813 3514 784
+ 3515 1823 3150
+ 1793 3515 1229
+ 3516 2343 1485
+ 2017 3516 1485
+ 3517 2002 910
+ 1390 3517 2043
+ 3518 1222 2442
+ 651 3518 2442
+ 3519 903 3182
+ 1307 3519 3182
+ 3520 1145 1933
+ 715 3520 1933
+ 3521 1956 1400
+ 1997 3521 1400
+ 3522 311 312
+ 1401 3522 1957
+ 3523 2118 1471
+ 2131 3523 1471
+ 3524 139 140
+ 1381 3524 2065
+ 3525 559 3958
+ 3788 3525 1374
+ 3526 2172 1290
+ 1637 3526 3296
+ 3527 2712 1158
+ 1678 3527 2318
+ 3528 3612 1403
+ 2231 3528 1403
+ 3529 3258 1446
+ 2717 3529 1446
+ 3530 2564 1496
+ 2387 3530 678
+ 3531 3872 867
+ 1410 3531 2259
+ 3532 2200 1450
+ 1917 3870 3861
+ 3533 2158 679
+ 1310 3533 2466
+ 3534 669 2551
+ 1946 3534 2551
+ 3535 1299 2235
+ 2481 3535 951
+ 3536 1168 2856
+ 625 3536 2856
+ 3537 2749 1720
+ 1321 3537 1720
+ 3538 1798 3044
+ 3287 3538 1523
+ 3539 1635 3388
+ 2345 3539 1369
+ 3540 300 301
+ 1532 3540 2095
+ 3541 1675 2636
+ 911 3541 2636
+ 3542 2292 744
+ 1313 3542 2777
+ 3543 1338 2455
+ 3030 3543 1111
+ 3544 2781 851
+ 1784 3544 3069
+ 3545 1883 3225
+ 1376 3545 3317
+ 3546 1748 3462
+ 134 3546 3903
+ 3547 755 2178
+ 1067 3547 2178
+ 3548 788 2579
+ 1993 3548 2579
+ 3549 1534 2864
+ 1627 3549 2864
+ 3550 3042 1476
+ 1985 3550 2379
+ 3551 949 2100
+ 3029 3551 2100
+ 3552 1452 2342
+ 1586 3552 2350
+ 3553 1992 2892
+ 1548 3553 3700
+ 3554 1382 3178
+ 2756 3554 417
+ 3555 2684 1383
+ 2755 3555 1383
+ 3556 1595 2602
+ 471 3556 470
+ 3557 1940 3235
+ 2258 3557 1335
+ 3558 3436 1990
+ 1375 3558 1990
+ 3559 1338 2222
+ 2109 3559 946
+ 3560 899 3870
+ 1339 3560 3966
+ 3561 2416 762
+ 1087 3561 1851
+ 3562 2640 1558
+ 3107 3562 1558
+ 3563 2327 1274
+ 2680 3563 2096
+ 3564 2868 1716
+ 1274 3564 2096
+ 3565 1708 2896
+ 1614 3565 3829
+ 3566 2647 578
+ 1566 3566 579
+ 3567 2424 91
+ 1471 3567 2131
+ 3568 2425 1472
+ 2132 3568 1472
+ 3569 1359 2460
+ 1959 3569 2460
+ 3570 2414 1051
+ 1240 3570 2398
+ 3571 1799 936
+ 2341 3571 1980
+ 3572 2950 1273
+ 132 3572 2541
+ 3573 3592 768
+ 1477 3573 1923
+ 3574 1375 1990
+ 2793 3574 804
+ 3575 1946 2859
+ 2149 3575 808
+ 3576 2324 914
+ 1391 3907 2440
+ 3577 1133 1823
+ 1908 3577 923
+ 3578 2098 735
+ 2609 3578 1575
+ 3579 1677 2319
+ 2749 3579 1159
+ 3580 1271 2282
+ 924 3580 2282
+ 3581 3054 1488
+ 1986 3581 2378
+ 3582 2288 1499
+ 1743 3582 1499
+ 3583 1498 2289
+ 404 3583 403
+ 3584 2484 659
+ 3340 3584 1615
+ 3585 3429 1590
+ 64 3585 1924
+ 3586 1472 2425
+ 2675 3586 1015
+ 3587 3402 1480
+ 2863 3587 785
+ 3588 1329 2489
+ 2700 3588 1046
+ 3589 2336 1043
+ 746 3589 4031
+ 3590 2337 1045
+ 747 3590 4030
+ 3591 3530 1496
+ 1849 3591 1050
+ 3592 2125 1195
+ 768 3592 1754
+ 3593 3745 94
+ 95 3593 5
+ 3594 675 3365
+ 3097 3594 1333
+ 3595 1620 2494
+ 713 3595 3831
+ 3596 496 1708
+ 3565 3596 1708
+ 3597 1332 4029
+ 933 3597 2130
+ 3598 2241 1790
+ 3041 3598 895
+ 3599 847 2785
+ 1165 3599 2785
+ 3600 1522 3342
+ 1657 3817 2928
+ 3818 1656 2930
+ 1525 3601 3287
+ 3602 1369 2400
+ 1481 3602 2400
+ 3603 817 3941
+ 1315 3603 2129
+ 3604 2788 1537
+ 2814 3604 1537
+ 3605 2293 1370
+ 3048 3605 1370
+ 3606 1107 2373
+ 2432 3606 771
+ 3607 3748 1322
+ 2396 3607 1794
+ 3608 1667 3891
+ 3006 3608 1664
+ 3609 1608 2920
+ 2613 3609 1082
+ 3610 3533 1310
+ 2076 3610 1310
+ 3611 1330 3226
+ 819 3611 3226
+ 3612 2095 1403
+ 1650 3612 3528
+ 3613 1892 1278
+ 1941 3613 2761
+ 3614 1834 3316
+ 1389 3614 3316
+ 3615 4015 1380
+ 3041 3615 1380
+ 3616 2271 909
+ 3382 3616 2016
+ 3617 433 2282
+ 3059 3617 1271
+ 3618 3645 935
+ 1275 3618 2234
+ 3619 1840 3413
+ 2632 3619 1570
+ 3620 2631 1571
+ 1841 3620 3414
+ 3621 2154 1294
+ 2112 3621 1294
+ 3622 3797 1295
+ 2155 3622 1295
+ 3623 1447 2915
+ 650 3623 649
+ 3624 702 1770
+ 2567 3624 1770
+ 3625 2776 1444
+ 1301 3625 3420
+ 3626 907 2617
+ 1265 3626 2617
+ 3627 1825 1060
+ 1822 3627 1060
+ 3628 2251 490
+ 2731 3628 48
+ 3629 1544 2635
+ 372 3629 371
+ 3630 2917 1809
+ 1354 3630 3680
+ 3631 1300 2411
+ 3400 3631 1888
+ 3632 2594 1508
+ 2025 3632 3237
+ 3633 963 2105
+ 809 3821 2105
+ 3634 3863 931
+ 1254 3634 2140
+ 3635 2229 1368
+ 1979 3635 1368
+ 3636 1977 1367
+ 2230 3636 1367
+ 3637 1706 1865
+ 2736 3637 1865
+ 3638 746 3395
+ 2073 3638 3395
+ 3639 878 2933
+ 1083 3639 2933
+ 3640 1044 2337
+ 3394 3640 747
+ 3641 2078 3260
+ 1573 3641 3045
+ 3642 732 1963
+ 1293 3642 4026
+ 3643 2232 1372
+ 1973 3643 1372
+ 3644 1983 1373
+ 2233 3644 1373
+ 3645 2473 1733
+ 1967 3645 3618
+ 3646 3209 1267
+ 47 3646 2180
+ 3647 813 2596
+ 1031 3647 2596
+ 3648 1777 467
+ 3246 3648 468
+ 3649 1735 3023
+ 1493 3649 3084
+ 3650 2544 1542
+ 1374 3650 3263
+ 3651 1633 3315
+ 3923 3651 711
+ 3652 905 1880
+ 2716 3652 1880
+ 3653 1093 2050
+ 845 3653 2050
+ 3654 1454 2027
+ 62 3654 61
+ 3655 1275 2234
+ 2659 4014 1379
+ 3656 2854 1460
+ 2770 3656 1460
+ 3695 1465 2442
+ 2681 3657 1222
+ 3658 3468 1652
+ 2212 3658 1652
+ 3659 1381 3483
+ 833 3659 3483
+ 3660 1746 1362
+ 2374 3660 1362
+ 3661 1856 1112
+ 2278 3661 1963
+ 3662 3663 1336
+ 3350 3662 1336
+ 3663 1978 783
+ 1336 3663 2199
+ 3664 1318 2532
+ 3334 3664 1796
+ 3665 3145 1768
+ 2746 3665 1768
+ 3666 3288 1458
+ 4016 3666 1458
+ 3667 2763 647
+ 1693 3667 648
+ 3668 2973 1307
+ 3182 3668 1307
+ 3669 2216 3371
+ 1276 3669 3371
+ 3670 1735 3649
+ 1493 3670 3649
+ 3671 3359 1532
+ 2538 3671 1532
+ 3672 939 3443
+ 1533 3672 3443
+ 3673 2342 1462
+ 2745 3673 1462
+ 3674 2280 1039
+ 1546 3674 2644
+ 3675 2294 661
+ 1431 3675 2503
+ 3676 1465 1741
+ 3885 3676 1666
+ 3677 1225 2633
+ 2198 3677 544
+ 3678 946 1852
+ 2109 3678 1212
+ 3679 886 2861
+ 1743 3679 2861
+ 3680 3630 2493
+ 663 3680 2493
+ 3783 1744 721
+ 3093 3681 1505
+ 3682 1527 3840
+ 2312 3682 1062
+ 3683 492 493
+ 1469 3683 2347
+ 3684 1311 3690
+ 2077 3684 959
+ 3685 1951 2496
+ 2867 3685 1436
+ 3686 3229 1609
+ 2612 3686 1557
+ 3687 1285 2746
+ 892 3687 2746
+ 3688 2838 1659
+ 2101 3688 1659
+ 3689 789 3426
+ 2031 3689 3426
+ 3690 2163 3148
+ 2228 3690 680
+ 3691 1404 2747
+ 2907 3691 1434
+ 3692 2585 1142
+ 1613 3692 3332
+ 3693 3138 1464
+ 1824 3693 1464
+ 3694 1445 585
+ 1914 3694 3376
+ 3695 2977 1741
+ 3657 3695 2442
+ 3696 1691 2618
+ 1465 3696 2442
+ 3697 1955 928
+ 1463 3697 3134
+ 3698 2939 1182
+ 3306 3698 1855
+ 3699 2090 1236
+ 1923 3699 1236
+ 3700 2069 1020
+ 1548 3700 2518
+ 3701 3038 1623
+ 2646 3701 1623
+ 3702 3045 1487
+ 2824 3702 1487
+ 3703 2487 1884
+ 2133 3703 1137
+ 3704 1370 2260
+ 2174 3704 656
+ 3705 151 2767
+ 148 3705 2767
+ 3706 2768 160
+ 162 3706 161
+ 3707 2398 1051
+ 3129 3707 1477
+ 3708 2094 1491
+ 2891 3708 1491
+ 3709 1353 3434
+ 1797 3709 3434
+ 3710 2892 1619
+ 3344 3983 1619
+ 3711 1459 2365
+ 3473 3711 2365
+ 3712 3543 1831
+ 3350 3712 1831
+ 3713 1737 2976
+ 2785 3713 1399
+ 3714 1037 1804
+ 818 3714 1804
+ 3715 2292 1025
+ 1929 3715 1025
+ 3716 108 109
+ 1424 3716 2803
+ 3717 1418 2798
+ 197 3717 196
+ 3718 1418 2655
+ 125 3718 124
+ 3719 3081 1417
+ 2393 3719 1417
+ 3720 110 111
+ 1426 3720 2038
+ 3721 128 8
+ 1425 3721 1879
+ 3722 1420 2033
+ 127 3722 126
+ 3723 114 115
+ 1419 3723 2035
+ 3724 112 113
+ 1416 3724 2037
+ 3725 2858 1429
+ 2040 3725 1429
+ 3726 15 231
+ 1428 3726 2801
+ 3727 26 304
+ 1429 3727 2800
+ 3728 2039 1430
+ 2800 3728 1430
+ 3729 32 322
+ 1417 3729 2653
+ 3730 307 25
+ 1428 3730 2947
+ 3731 2036 1426
+ 2804 3731 1426
+ 3732 1430 2801
+ 233 3732 232
+ 3733 2797 1427
+ 2034 3733 1427
+ 3734 2802 1427
+ 2035 3734 1427
+ 3735 2804 1416
+ 2799 3735 1416
+ 3736 2799 1419
+ 2797 3736 1419
+ 3737 1420 2796
+ 195 3737 194
+ 3738 2796 1425
+ 3139 3738 1425
+ 3739 2654 1424
+ 2036 3739 1424
+ 3740 1884 660
+ 1758 3740 3180
+ 3741 1481 2862
+ 1563 3741 2862
+ 3742 1705 2468
+ 3161 3742 789
+ 3743 1793 1567
+ 592 3743 1567
+ 3744 2197 1351
+ 3122 3744 1351
+ 3745 93 94
+ 1723 3745 3593
+ 3746 1723 3593
+ 96 3746 95
+ 3747 1411 2974
+ 3463 3747 1361
+ 3748 3607 2246
+ 971 3748 2246
+ 3749 3075 1625
+ 2606 3749 1055
+ 3750 170 2053
+ 966 3750 2053
+ 3751 502 1611
+ 1757 3751 3507
+ 3752 2184 1497
+ 1654 3752 3435
+ 3753 1367 2687
+ 2830 3753 1368
+ 3754 2325 1109
+ 3133 3754 1639
+ 3755 2496 906
+ 3431 3755 1860
+ 3756 1324 2071
+ 436 3756 2071
+ 3757 142 1673
+ 2065 3757 968
+ 3758 1894 2736
+ 1169 3758 2736
+ 3759 2582 683
+ 3835 3759 683
+ 3760 1386 2636
+ 1675 3760 2636
+ 3761 2693 1574
+ 2098 3761 735
+ 3762 3686 1609
+ 3508 3762 1609
+ 3763 1273 2950
+ 1547 3763 2950
+ 3764 1940 773
+ 1216 3764 3025
+ 3765 2061 920
+ 1409 3765 2854
+ 3766 1312 2145
+ 978 3766 2145
+ 3767 1536 3494
+ 1952 3767 791
+ 3768 2264 1259
+ 2573 3768 1259
+ 3769 1442 1964
+ 1702 3769 1964
+ 3770 3140 1434
+ 2166 3770 2717
+ 3771 3380 1405
+ 1767 3771 1405
+ 3772 1356 2044
+ 3335 3772 1867
+ 3773 1373 2670
+ 2826 3773 1372
+ 3774 3531 1410
+ 1770 3774 1410
+ 3775 2055 1519
+ 1846 3775 3500
+ 3776 2607 1447
+ 2480 3776 1447
+ 3777 1546 575
+ 3510 3777 1663
+ 3778 3566 1566
+ 2511 3778 1566
+ 3779 858 2898
+ 1802 3779 2898
+ 3780 1174 2242
+ 653 3780 2242
+ 3781 1022 2055
+ 877 3781 2055
+ 3782 2204 997
+ 1632 3782 2308
+ 3783 3681 1744
+ 1505 3783 2498
+ 3784 2511 1566
+ 2625 3784 1566
+ 3785 3320 1646
+ 3069 3785 1646
+ 3786 3948 1440
+ 2602 3786 3246
+ 3787 2904 1593
+ 3147 3787 1593
+ 3788 1627 3525
+ 1147 3788 3263
+ 3789 936 2148
+ 1182 3789 2148
+ 3790 805 1883
+ 3545 3790 1883
+ 3791 2962 1492
+ 2722 3791 1492
+ 3792 760 2140
+ 1360 3792 3876
+ 3793 863 2663
+ 2173 3793 2663
+ 3794 9 1971
+ 979 3794 1971
+ 3795 979 2584
+ 1787 3795 2584
+ 3796 1697 3073
+ 638 3796 637
+ 3797 2569 1295
+ 2014 3797 3622
+ 3798 782 3360
+ 1349 3798 3360
+ 3799 542 543
+ 1332 3799 2633
+ 3800 2335 1268
+ 669 3800 2139
+ 3801 1785 2811
+ 836 3801 2811
+ 3802 3845 704
+ 2002 3802 2497
+ 3803 780 3911
+ 1346 3803 2161
+ 3804 38 1880
+ 3364 3804 1545
+ 3805 1889 3033
+ 2757 3805 703
+ 3806 1837 2729
+ 596 3806 2729
+ 3807 2983 1704
+ 1814 3807 1704
+ 3808 1127 2572
+ 2091 3808 2572
+ 3809 3050 1230
+ 1020 3809 2099
+ 3810 2820 1340
+ 1961 3810 1340
+ 3811 842 3883
+ 2311 3811 1435
+ 3812 1853 1792
+ 2176 3812 1118
+ 3813 989 2224
+ 3404 3813 2224
+ 3814 1002 2177
+ 1119 3814 2177
+ 3815 2817 1660
+ 3954 3815 1660
+ 3816 2720 1528
+ 2968 3816 1528
+ 3817 1657 3600
+ 828 3817 3600
+ 3818 3601 1656
+ 2958 3818 1521
+ 3819 1414 3039
+ 2047 3819 2718
+ 3820 1031 2004
+ 2705 3820 659
+ 3821 1366 3633
+ 2105 3821 3633
+ 3822 3303 1599
+ 2619 3822 1599
+ 3823 912 1972
+ 2762 3823 1972
+ 3824 2015 1371
+ 2239 3824 1371
+ 3825 3178 1468
+ 2866 3825 1468
+ 3826 2276 1122
+ 968 3826 1969
+ 3827 1641 3280
+ 1567 3827 3280
+ 3828 754 1824
+ 3459 3828 1824
+ 3829 3565 852
+ 1070 3829 2151
+ 3830 2281 1323
+ 972 3830 2263
+ 3831 3595 1513
+ 1728 3831 2701
+ 3832 959 2228
+ 1292 3832 2228
+ 3833 1764 1506
+ 3012 3833 1506
+ 3834 1296 2264
+ 3768 3834 2264
+ 3835 2265 3759
+ 1297 3835 2689
+ 3836 1675 3474
+ 2444 3836 1452
+ 3837 1450 2200
+ 2787 3837 456
+ 3838 2153 3143
+ 3987 3838 1467
+ 3839 2507 800
+ 1323 3839 2263
+ 3840 1527 3245
+ 2128 3840 846
+ 3841 1902 1011
+ 3154 3841 1869
+ 3842 1901 3439
+ 1868 3842 3155
+ 3843 1163 2685
+ 881 3843 2685
+ 3844 2659 1379
+ 2576 3844 730
+ 3845 1893 3188
+ 1655 3845 3802
+ 3846 3211 199
+ 1423 3846 2394
+ 3847 1421 2802
+ 3210 3847 119
+ 3848 1421 3216
+ 202 3848 3216
+ 3849 3214 324
+ 1422 3849 2274
+ 3850 374 3213
+ 1422 3850 3213
+ 3851 122 3217
+ 1423 3851 3217
+ 3852 1313 2714
+ 2389 3852 1314
+ 3853 2870 1725
+ 2695 3853 1725
+ 3854 1545 1940
+ 3364 3854 2879
+ 3855 3807 953
+ 3119 3855 8
+ 3856 2855 1402
+ 1857 3856 1402
+ 3857 1838 3301
+ 1256 3857 3301
+ 3858 2926 1744
+ 1789 3858 993
+ 3859 2724 1517
+ 2522 3859 1517
+ 3860 1725 2042
+ 2404 3860 802
+ 3861 1214 3506
+ 1917 3861 3506
+ 3862 2981 667
+ 1453 3862 1894
+ 3863 2024 1301
+ 3420 3863 1301
+ 3864 3367 1283
+ 991 3864 3168
+ 3865 1 3399
+ 2515 3865 1501
+ 3866 1531 2520
+ 449 3866 448
+ 3867 1061 1984
+ 2051 3867 1213
+ 3868 842 2311
+ 952 3868 2311
+ 3869 2824 1487
+ 3111 3869 1487
+ 3870 1917 3560
+ 3532 3870 899
+ 3871 2470 1413
+ 2061 3871 2738
+ 3872 2696 3253
+ 1671 3872 3531
+ 3873 2382 657
+ 1598 3873 2869
+ 3874 3035 1537
+ 2788 3874 1537
+ 3875 3468 1827
+ 974 3875 1827
+ 3876 3792 2140
+ 2870 3876 931
+ 3877 2400 1369
+ 3388 3877 1369
+ 3878 2431 792
+ 1827 3878 2117
+ 3879 815 1850
+ 2264 3879 1259
+ 3880 1260 2265
+ 816 3880 3920
+ 3881 2699 1475
+ 2842 3881 1475
+ 3882 3509 1600
+ 3141 3882 1877
+ 3883 2283 1397
+ 2009 3883 1397
+ 3884 972 1778
+ 713 3884 1778
+ 3885 1666 2979
+ 1691 3885 2618
+ 3886 2671 1448
+ 2643 3886 1919
+ 3887 1949 658
+ 1457 3887 3465
+ 3888 1101 2982
+ 2169 3888 1455
+ 3889 2350 982
+ 1308 3889 2029
+ 3890 2628 760
+ 1850 3890 2969
+ 3891 1667 569
+ 3608 3891 1664
+ 3892 2253 1448
+ 2671 3892 1448
+ 3893 2343 72
+ 1806 3893 73
+ 3894 1781 2158
+ 2672 3894 958
+ 3895 2106 3157
+ 1433 3895 3157
+ 3896 2732 1648
+ 1976 3896 1648
+ 3897 1861 2757
+ 3053 3897 1643
+ 3898 3066 2008
+ 745 3898 2008
+ 3899 2508 1184
+ 40 3899 1931
+ 3900 4012 1483
+ 1975 3900 1021
+ 3901 909 1765
+ 1451 3901 1765
+ 3902 4028 1449
+ 2310 3902 1449
+ 3903 1971 133
+ 1388 3903 3546
+ 3904 3680 1825
+ 3627 3904 1825
+ 3905 763 3644
+ 2233 3905 3644
+ 3906 2232 3643
+ 764 3906 3643
+ 3907 2869 1358
+ 2440 3907 1358
+ 3908 2748 1282
+ 2156 3908 1282
+ 3909 2221 1055
+ 2220 3909 1507
+ 3910 1410 2259
+ 2471 3910 748
+ 3911 780 2314
+ 1227 3911 2314
+ 3912 2229 3635
+ 762 3912 3635
+ 3913 761 3636
+ 2230 3913 3636
+ 3914 2906 2157
+ 934 3914 2157
+ 3915 1801 2880
+ 2177 3915 1119
+ 3916 1564 2127
+ 2 3916 84
+ 3917 1893 1009
+ 2487 3917 1009
+ 3918 1709 3177
+ 1390 3918 3517
+ 3919 1912 815
+ 2264 3919 3879
+ 3920 3880 2265
+ 1297 3920 2265
+ 3921 2331 2060
+ 1732 3921 3281
+ 3922 1512 2296
+ 398 3922 397
+ 3923 711 1799
+ 2080 3923 1131
+ 3924 2836 811
+ 1257 3924 2835
+ 3925 1398 2634
+ 1938 3925 823
+ 3926 947 4011
+ 1018 3926 1842
+ 3927 4005 682
+ 1303 3927 2552
+ 3928 2521 1588
+ 2709 3928 1588
+ 3929 2834 1255
+ 2833 3929 1255
+ 3930 1304 2306
+ 687 3930 4004
+ 3931 2666 1552
+ 3207 3931 1890
+ 3932 1443 2580
+ 1996 3932 3381
+ 3933 2782 1164
+ 627 3933 1773
+ 3934 2911 1559
+ 3144 3934 1559
+ 3935 2719 1357
+ 2175 3935 1357
+ 3936 380 2043
+ 1760 3936 2043
+ 3937 2105 1362
+ 2531 3937 1362
+ 3938 1407 2022
+ 3193 3938 2022
+ 3939 3325 2023
+ 1408 3939 2023
+ 3940 1497 2354
+ 615 3940 614
+ 3941 1217 2129
+ 3603 3941 2129
+ 3942 1520 3261
+ 481 3942 480
+ 3943 550 551
+ 1523 3943 2590
+ 3944 552 553
+ 1525 3944 2927
+ 3945 1383 2469
+ 2677 3945 400
+ 3946 659 2004
+ 1193 3946 2004
+ 3947 2660 1474
+ 2982 3947 1474
+ 3948 1777 1440
+ 3117 3948 1707
+ 3949 1524 2340
+ 3283 3949 478
+ 3950 1357 2346
+ 3230 3950 736
+ 3951 1884 1009
+ 2571 3951 1909
+ 3952 392 393
+ 1819 3952 2154
+ 3953 2885 1818
+ 2155 3953 1818
+ 3954 2160 3815
+ 2435 3954 1660
+ 3955 1835 738
+ 997 3955 1787
+ 3956 1637 3296
+ 1939 3956 913
+ 3957 3199 1439
+ 3352 3957 1439
+ 3958 2544 1374
+ 3525 3958 1374
+ 3959 1457 2773
+ 932 3959 2773
+ 3960 1855 3088
+ 1661 3960 3108
+ 3961 1385 2827
+ 2054 3961 702
+ 3962 3309 1521
+ 2930 3962 1521
+ 3963 1522 2929
+ 3308 3963 440
+ 3964 2994 2415
+ 3653 3964 1093
+ 3965 74 75
+ 1749 3965 3031
+ 3966 772 2445
+ 1339 3966 2445
+ 3967 3406 1377
+ 2053 3967 1377
+ 3968 76 77
+ 1753 3968 2491
+ 3969 1812 3471
+ 1411 3969 2490
+ 3970 3344 1619
+ 2104 3970 2892
+ 3971 1919 1448
+ 2253 3971 1448
+ 3972 2374 1362
+ 2919 3972 2105
+ 3973 2358 1445
+ 1914 3973 1445
+ 3974 1198 2924
+ 334 3974 2924
+ 3975 1877 1600
+ 2669 3975 1600
+ 3976 3499 1348
+ 2116 3976 1348
+ 3977 3483 1381
+ 2065 3977 1381
+ 3978 846 3014
+ 1392 3978 3014
+ 3979 3334 1796
+ 3013 3979 1391
+ 3980 2317 1504
+ 2353 3980 1504
+ 3981 1553 2698
+ 271 3981 270
+ 3982 868 3666
+ 1948 3982 3666
+ 3983 3344 1105
+ 1561 3983 2666
+ 3984 1590 2195
+ 1924 3984 3012
+ 3985 2999 1489
+ 2670 3985 1489
+ 3986 2808 1602
+ 2513 3986 1172
+ 3987 2136 3838
+ 3131 3987 1467
+ 3988 2115 2957
+ 2081 3988 2957
+ 3989 930 2137
+ 1197 3989 2137
+ 3990 743 2772
+ 1241 3990 2772
+ 3991 3299 1839
+ 2691 3991 770
+ 3992 1821 644
+ 1692 3992 646
+ 3993 730 2301
+ 1166 3993 2301
+ 3994 770 3441
+ 2539 3994 1921
+ 3995 1935 994
+ 1569 3995 2488
+ 3996 3400 1888
+ 2933 3996 1409
+ 3997 3224 2082
+ 2268 3997 756
+ 3998 2057 1441
+ 2198 3998 1441
+ 3999 1505 2498
+ 2509 3999 1233
+ 4000 2995 1503
+ 2687 4000 1503
+ 4001 1717 2708
+ 820 4001 2708
+ 4002 1441 2057
+ 2172 4002 940
+ 4003 2622 1905
+ 2457 4003 1469
+ 4004 2306 1328
+ 2379 4004 1328
+ 4005 1327 2378
+ 2305 4005 3927
+ 4006 1406 2975
+ 2971 4006 1515
+ 4007 2169 1396
+ 2324 4007 1396
+ 4008 881 3427
+ 1516 4008 3427
+ 4009 3089 1187
+ 1620 4009 2901
+ 4010 1049 2475
+ 2843 4010 1316
+ 4011 947 2843
+ 3191 4011 1316
+ 4012 3900 697
+ 1125 4012 2964
+ 4013 3032 1624
+ 2570 4013 1624
+ 4014 781 2190
+ 1379 4014 2190
+ 4015 3615 2063
+ 967 4015 2063
+ 4016 1458 3472
+ 354 4016 3472
+ 4017 1999 1057
+ 2026 4017 1762
+ 4018 3561 762
+ 1260 4018 2961
+ 4019 3282 105
+ 3212 4019 106
+ 4020 3104 908
+ 1650 4020 3612
+ 4021 2217 2963
+ 2087 4021 2963
+ 4022 915 2186
+ 2283 4022 1397
+ 4023 101 2994
+ 1509 4023 2994
+ 4024 1810 3125
+ 822 4024 3125
+ 4025 2309 1335
+ 2886 4025 1335
+ 4026 826 3277
+ 1293 4026 3277
+ 4027 2967 1974
+ 3301 4027 1256
+ 4028 2290 723
+ 1449 4028 1919
+ 4029 1332 2658
+ 794 4029 2658
+ 4030 3590 1912
+ 2823 4030 1296
+ 4031 3589 1913
+ 2822 4031 1297
+ 4032 1433 3071
+ 2168 4032 822
+ 4033 1022 2610
+ 1352 4033 2610
+ 4034 2349 1030
+ 1361 4034 3463
+ 4035 822 3125
+ 1250 4035 3125
+ 4036 807 3250
+ 1394 4036 3250
+ 4037 3460 1966
+ 2332 4037 1127
+ 4038 2146 1445
+ 2358 4038 1445
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/test.mgraph
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/test.mgraph	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Graphs/test.mgraph	(revision 9501)
@@ -0,0 +1,770 @@
+%% graph file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% 1st line:  n, m
+%% ff lines:  vwgt1, vwgt2, adjacencies
+ 766  1314 10 2
+  1  1  479  389  571    2
+  2  2  395    1  534    4
+  4  4  148  207  409  498
+  4  4    2  729    6  695
+  4  4  572    6  708  393
+  2  2  571  727    4    5
+  2  2  746  397  575  573
+ 24  8  152  733  638  746
+  1  1  573  524   11   13
+  1  1   11  497  532   14
+  2  2   12  531   10    9
+  4  4  754  490  616   11
+  1  1    9  706  403   14
+  1  1   13   10   18   15
+  1  1   14  402  530   20
+ 24  8  742  692   17  581
+  4  4   16  109  116  620
+  1  1   14  512  535   20
+  1  1   20  404  408   24
+  1  1   18   15   19   22
+ 38  8  645  628  148  536
+  1  1   20  527  421   24
+ 24  8  179   28  629   30
+  1  1   19   22  513   27
+ 24  8  742  159  174   28
+  0  0  411  440  539  442
+  1  1   24  411  410  538
+ 24  8   25  254   23   29
+  4  4  174   28  750   30
+  4  4  596   23   29  745
+ 52  8  645  192  581  525
+  1  1   51  332  406
+  1  1  577  330   51
+  1  1  418  682  423
+ 68  8  711   36  606
+ 68  8  626   35  153
+  0  0   52  333  420
+  2  2  422  358  419
+  1  1   58  345  578
+  1  1   59  348   58
+ 68  8  208  144  734
+ 68  8  143  483  484
+  1  1   64  349  425
+  2  2   66  334  426
+ 68  8  579  141  427
+  0  0  420   50  339
+ 68  8  764   48  564
+ 68  8  587   47  443
+  2  2   62  673  687
+  0  0  578   46  565
+  1  1   33  584   32
+  0  0  406  429   37
+ 68  8  485  335  731
+ 68  8  758   55  519
+ 68  8  586   54  183
+  1  1  426   64  577
+  0  0  552  630
+  1  1   40  429   39
+  1  1  425  584   40
+  0  0  462
+ 68  8  308  162  647
+  4  4  690  431   49
+ 68  8  161  672  305
+  1  1  687   56   43
+ 68  8  588  168  253
+  4  4  368  431   44
+ 68  8  560   68  709
+ 68  8  500   67  196
+ 68  8  566  170  433
+ 68  8  724  163  366
+  1  1  113   97
+  1  1  177   79
+  1  1  601  142
+ 24  8   92  738  739
+ 24  8  454  644  595
+  1  1  545  146  502
+  1  1  591  351  435
+  1  1  344  436  437
+  1  1  146   72  487  434
+  1  1  103  354  439
+  2  2  437  463  115
+  1  1  601  304
+  2  2  109  174  592
+  0  0  110  355  440
+  1  1  112  353  441
+  0  0  440  442  593
+  0  0  263
+  1  1  444  381  111
+  0  0   91  442  357
+  8  8  594  740  732
+  0  0  445  446   89
+ 24  8  595  447   74
+  8  8  763  741  744
+  1  1  757  667  448
+  1  1  453  436  108
+ 52  8  130  686  208
+  1  1   71  268
+  1  1  304  157
+  0  0  101  100
+  0  0  474   99  126
+  0  0  474  630   99
+  1  1  117  383  107
+  1  1  441  449   80
+  2  2  116  207  338
+ 52  8  763  187  205  692
+ 24  8  713  447  763
+  1  1  102  449  444
+  2  2   95  388  450
+  4  4  742   17   83
+  1  1  439  451   84
+  1  1   88  451  445
+  1  1  435  452   85
+  1  1  309   71  282
+  0  0  743
+  4  4   81  119  454
+  4  4  744   17  104
+  1  1  448  452  102
+  1  1  178  600
+  4  4  450  115  661
+  1  1  356  178
+  1  1  601  602
+  0  0  123  460
+  0  0  663  122  248
+ 24  8  222  253
+ 24  8  603  461
+  0  0  100  248
+  4  4  220  218  604
+  1  1  549  685
+  0  0  529  234  567  151
+ 68  8  606   96
+  0  0  607  261  462
+ 68  8  417  711
+  1  1  550  608  267
+  1  1  649  214
+  1  1  235  611  704
+  1  1  280  219  613
+  0  0  654  221
+  1  1  266  211  615
+ 24  8  736  176
+ 24  8  579  558
+ 68  8  676   45  518
+  1  1  177   73  542
+ 68  8   42  526  191
+ 68  8  179   41  629
+  0  0  224  621
+  1  1   76   79  258
+ 68  8  468  747  731
+  8  8  391  392   21    3
+  4  4  346  556
+  2  2  639  229  232
+  0  0  464  129
+ 24  8  526  191    8  412
+ 52  8   36  738  712  167
+ 68  8  466  194  526
+ 52  8  496  695  753  748
+  2  2  350  623
+  1  1   98  465  309
+  1  1  233  217  238
+ 52  8  167  190  179   25
+ 68  8  644  595  626
+ 52  8  390   63  308
+ 68  8  697   61  749
+ 68  8  628   70  725
+  4  4  225  674
+ 68  8  629  726  191
+  4  4  710  328  169  318
+ 68  8  153  739  159
+ 68  8  631   65  751
+  4  4  721  166  398  490
+ 68  8  632   69  637
+  0  0  657  226
+ 68  8  253  603
+ 68  8  468  200  640
+  4  4   25   83  413   29
+  0  0  203  469  470
+ 52  8  564  139  609  240
+  1  1  142   72  438
+  1  1  455  120  118
+ 52  8  159  144  180   23
+ 24  8  190  179  208  596
+  4  4  237  659
+ 68  8  183  205  628
+ 64  8   55  568  735  182
+ 68  8  748  209  715
+  1  1  227  471
+  1  1  231  310
+ 68  8  447  105  739
+  1  1  215  650
+ 68  8  707  209  619
+ 24  8  159  686  180  413
+ 52  8  143  165  752  152
+ 68  8   31  726  618
+ 68  8  599  595  447
+ 68  8  624  154  733
+  1  1  241  635
+ 68  8   68  210  632
+  8  8  651  756  662
+ 24  8  387  683  651
+ 52  8  749  651  758  586
+ 68  8  641  173  528
+  0  0  252  239  256
+ 68  8  213  642  546
+  0  0  696  250  175
+ 24  8  759  694  386
+ 68  8  105  182  645
+  0  0  246  322
+  4  4  391  407  104    3
+ 52  8   96   41  180  223
+ 68  8  189  184  617
+ 68  8  546  196  624
+  1  1  646  138  354
+ 68  8  647  758
+ 68  8  475  202  648
+  1  1  134  610  233  330
+  1  1  290  260  472  188
+ 68  8  519  694
+  1  1  330  158  332
+  4  4  612  652  127
+  1  1  653  136  353
+  2  2  704  297  127
+  0  0  137  243  657
+ 24  8  604  588  124
+ 24  8  208  734  350
+  0  0  655  145  270  355
+  4  4  295  249  164  278
+  0  0  467  171  262  339
+  1  1  327  185  681  517
+  1  1  471  259  456
+  4  4  271  150  334
+  4  4  461  561  639
+  1  1  659  244  186
+  1  1  150  299  649
+  1  1  214  291  158
+  0  0  593  129  462
+  1  1  602  236  135
+  1  1  633  235  491
+  8  8  558  242  181
+  1  1  158  301  654
+  0  0  540  201  319
+ 24  8  176  718  579
+  1  1  310  247  195
+ 24  8  427  518  237  504
+  0  0  614  221  313  333
+  2  2  307  292  231  658
+  0  0  416  460  567
+  0  0  319  256  477  206
+  1  1  241  660  289  635
+  0  0  126  264  123
+  2  2  650  312  225
+  0  0  503  565  203
+  1  1  542  255  465
+  1  1  541  300  201
+ 52  8  124   65  172  554
+ 24  8  581   28  726  750
+  1  1  478  251  523
+  0  0  201  562  246
+  0  0  265  481  263
+  1  1  146  327  478
+  1  1  523  228  455
+  1  1  482  285  215
+  0  0  363  131  460
+  0  0  226  316  627
+  0  0  257  470   87
+  0  0  480  663  343  248
+  0  0  570  257
+  1  1  613  360  138
+  1  1  133  361  549
+  1  1   97  282  597
+  0  0  671  287
+  1  1  615  362  224
+ 24  8  582  315  229
+  1  1  670  284
+  0  0  621  688  547
+ 68  8  427  483
+  1  1  352  293
+ 68  8  734  484
+ 68  8  335  764
+  8  8  225  580  656  674
+  2  2  643  384
+  1  1  668  765  136
+ 68  8  485  414
+  1  1  113  356  458  268
+  4  4  486  387
+  1  1  272  665  381  348
+  1  1  487  260  590
+ 24  8  724  430  643
+  0  0  269  345  570
+ 24  8  324  636  320
+  1  1  488  247  321
+  1  1  548  365  215
+  1  1  537  233  329
+  2  2  318  244  634
+  1  1  428  275  383  349
+  2  2  491  341  297
+  2  2  650  723  225
+ 24  8  680  631  331
+  4  4  294  220  563
+  1  1  458  597  358  388
+  1  1  398  232  492
+  1  1  493  252  562
+  1  1  329  238  494
+  8  8  755  473  561
+  1  1  590  341  495
+  1  1   82   98  418
+ 68  8   63  761
+  1  1  492  317  537
+  4  4  504  659  675  244
+ 68  8  161   61
+  1  1  113  157  422
+  1  1  186  677  241
+ 24  8  676  473  559
+  4  4  495  249  669
+  0  0  494  326  243
+  1  1  635  374  540
+ 52  8  566  271  368
+  0  0  499  262  760
+  1  1  634  306  488
+  4  4  702  166  292
+  0  0  239  378  246
+ 24  8  288  475  678
+  1  1  289  501  493
+  0  0  206  679  474
+ 68  8  366  433
+ 24  8  669  432  288
+  1  1  550  471  361
+  0  0  313  562  499
+  1  1  502  258  227
+  2  2  561  166  398
+  1  1  291  501  301
+  1  1  214   33  217
+ 24  8  296  475  751
+  1  1  217   32  654
+  0  0  243   37  657  467
+  2  2  229   44  649
+ 52  8  585   53  277
+  1  1  602  682  611
+ 24  8  483  340  569
+  1  1  104  544  757
+  0  0  226   46  503
+ 24  8  484  337  372
+  2  2  303  727  294  708
+  0  0  343  469  416
+  0  0  720  264  342
+  1  1  608   78  549
+  1  1  671   39  700  287
+  2  2  685  463  149
+ 24  8  556  644  594
+  1  1  284   40  671
+  1  1  293   43  670
+  4  4  596  223  156  745
+  1  1  623   77  653
+  1  1  384  673  275
+  1  1  219   85  646
+  1  1  211   80  655
+  0  0  224   84  621  666
+  1  1  120  282  453
+  0  0   89  470  464
+  2  2  298   38  486
+  0  0  370  679  663
+  1  1  689  266  377
+  1  1  325  267  505
+  1  1  506  270  379
+  0  0  364  507  261
+  0  0  508  688  363
+  1  1  681  290  511
+ 52  8   70  323  430  698
+  2  2  505  691  369
+ 24  8  433  315   66
+  4  4  367  509  701
+  0  0  510  507  359
+  2  2  372  765  376
+  4  4  340  396  693  371
+  2  2  511  691  723
+  1  1  385  314  405
+  1  1  399  677  514
+  1  1  371  380  689
+  1  1  360  400  506
+  0  0  515  319  510
+  0  0  362  382  508
+  1  1  693  376  399
+  1  1  284   88  671
+  0  0  405  379  515
+  1  1  293  102  670
+  1  1  279  667  352
+  1  1  514  400  374
+ 24  8  401  204  766  407
+ 24  8  283  664  749  198
+  2  2  298  108  486
+  1  1  517    1  516  505
+ 24  8  419  496  697  161
+  8  8  401  744  148  207
+ 38  8  401  628  766  148
+ 24  8    5  468  707  619
+ 52  8  695  622  753  641
+  1  1  523  521  522    2
+  4  4  752  412  372  575
+  2  2  553    7  435  524
+  2  2  639  328  169  299
+  1  1  737  380  375  574
+  1  1  512  377  385  404
+ 24  8  735  392  386  391
+  1  1  449   15  444  408
+  1  1  452   13  441  449
+  1  1  400   19  506  405
+  1  1  374  404  513  382
+  1  1   32  421  614   52
+  4  4  386  207  409
+  1  1  402  439   19  451
+  4  4  766  407    3  643
+  1  1  429   27  578  420
+  1  1  451   27  445   26
+  4  4  152  717  396  746
+  4  4  190  174  596
+ 68  8  281  415  417
+ 52  8  701  424  640  414
+  0  0  459  529  342  245
+ 52  8  556  414  132
+  1  1  304  589  465   34
+  4  4  423   38  390
+  0  0   37  410  467   46
+  1  1  584  406   22  429
+  1  1  309  458  522   38
+  2  2  522   34  419  729
+ 24  8  463  415  625  556
+  1  1   43  530  665   59
+  1  1   44  531  532   56
+ 52  8   45  558  274  242
+  1  1  673  448  687  293
+  1  1  421   58   52  410
+ 24  8  366  286  690
+  4  4  533   66   62  531
+ 24  8  563  520  324  617
+ 52  8  323   69  368  533
+  1  1  478   79  438  699
+  1  1   77  397  653  112
+  1  1  521   78   95  534
+  1  1   78  605  534   81
+  1  1  542  177  434  633
+  1  1   80  408  655  110
+  0  0   84   26  666   86
+  1  1   85  403  646  103
+  0  0   26   89   86  529
+ 52  8  636   48  564  678
+  1  1  107  665  402   88
+  1  1  111  700  411   91
+  0  0  700  570   91  481
+ 52  8  193  106   92  187
+  1  1   94  524  428  117
+  1  1  403  107  402  103
+  4  4  534  108  622  119
+  1  1  408  111  110  411
+  1  1  524  112  117  403
+  1  1  356  521  458   95
+ 24  8  115  625  528   75
+  1  1  178  259  521  600
+  1  1  228  550  600
+ 24  8  483  504  526  675
+  1  1  282  422  453  298
+  0  0  507  416  663  460
+  0  0  459  261  245  122
+ 24  8  560  125  582  230
+  0  0  131  234  567   60
+  4  4  509   81  346  424
+  0  0  529  357  469  151
+  1  1  157  251  418  522
+ 52  8  518  154  702  504
+  0  0  333  499  420  226
+ 52  8  393  730  173  147
+  0  0  342  175  464
+  0  0  481  357  175  263
+  1  1  228  185  517  325
+  1  1  215  511  705  650
+ 24  8  546  311  302  710
+  0  0  322  101  480  100
+ 52  8  617  320  331  213
+  1  1  502  548  681
+  0  0  246  510  499  679
+  1  1  258  255  434  479
+  1  1  517  478  523    1
+  0  0  679  760  474  264
+  0  0  446  565  257  470
+  1  1  545  548  260
+ 52  8  274   42  457  337
+ 52  8   42  276  752  340
+ 52  8  701   53  281
+  4  4  358  388  664  283
+  1  1  545   79  285
+  1  1  317  660  289  535
+  4  4  643  498  690  667
+  2  2  169   12  634  492
+  1  1  236  703  294  704
+  1  1  299  490  497  306
+  1  1  321  541  300  527
+  1  1  301  527  614  313
+  2  2  705  303  312  708
+ 24  8  729  390  155  672
+  1  1  492  610   10  537
+  4  4    3  536  757  489
+  0  0  326  467  477  316
+ 52  8  648  755   68  546
+  1  1  535  329  321  527
+  1  1   76  476  327
+  0  0  339  627  250
+ 24  8  242  457  466  307
+  1  1  361  389  605  367
+  1  1  377  615  404  362
+  0  0  539  370  363  459
+  0  0  379  666  539  364
+  2  2  605  685  369  463
+  0  0  378  538  477  370
+  1  1  365  516  472  373
+  1  1  574  514   18  400
+  1  1  405  540   24  515
+  1  1  375  512  660  385
+  0  0  513  382  378  538
+  2  2  389  511  572  691
+  1  1  479  227  471  389
+ 52  8  141  559  466  242
+ 52  8  756   54  759  216
+ 24  8  708  669  619  432
+  1  1  455  453  395  436
+  1  1  465  422  395  423
+  1  1  259  255  479  395
+  1  1  397  448    9  452
+ 24  8   31  536  618  598
+ 52  8  143  154  457  152
+  1  1  501   22  494  493
+ 52  8  661  454  200  599
+  0  0  442  416  464  129
+  1  1  577  425   15  584
+  2  2  431   11  426  687
+  1  1  426  610   10  577
+ 24  8  433  698  637  431
+  2  2  436    2  437  450
+  1  1  537  488   18  501
+ 24  8   21  525  725  498
+  1  1  306  497  291  535
+  0  0  515   27  539  510
+  0  0  538  508   26  507
+  1  1  314  541  513  239
+  1  1  635  493  252  540
+  1  1  142  251  438  589
+  1  1  592  544  591
+  2  2  620  338  598  543
+  1  1   76  487  482
+ 52  8  202  500  473  210
+  0  0  273  607
+  1  1  476  482  290
+  1  1  267  344  605  128
+  1  1  456  325  133
+  0  0  743  552  696
+  0  0   57  551  720
+  4  4  638  591  598  397
+ 24  8  253  555  603
+ 24  8  751  554  755
+ 24  8  149  424  417  347
+  8  8  674  636  736
+ 24  8  140  427  237
+ 24  8  311  518  702
+ 52  8  603   67  755  461
+  4  4  302  230  328
+  0  0  300  326  256
+  8  8  297  432  680
+ 52  8  736   47  443  176
+  0  0   50  481  250
+ 68  8  709  315   69
+  0  0  245  129  462
+ 32  8  583  741  763  183
+  4  4  337  675  693
+  0  0  287  446  265
+  1  1  699    1  572    6
+  2  2  571  705  516    5
+  1  1    7  616    9  706
+  1  1  399  706  689  512
+  2  2  396  668    7  765
+ 52  8  715  604  761  588
+  1  1   56  532   33  530
+  1  1   39  410  700   50
+ 52  8  609  240   45  140
+ 24  8  278  585  587  764
+ 24  8   16  254   31  620
+ 24  8  461  709  271  639
+ 52  8  651  713  586  568
+  1  1   51  530   59  421
+ 24  8  723  731  335  580
+ 68  8  199  583   55
+ 52  8  580  656  747   48
+ 52  8  576  631  222   65
+  1  1  601  542  418  714
+  1  1  285  699  705  303
+  2  2  750  543  553   77
+  2  2  620   83  750  543
+  0  0   86  607  234
+ 24  8  347  711   90  626
+ 52  8   75  193   92  160
+  4  4  180  413   30  350
+  1  1  268  298
+  4  4  525  544  757  553
+ 68  8  528  713  193
+  1  1  118  456  455  608
+  1  1   73   82  121  589
+  1  1  121  714  235  336
+ 52  8  172  554  125  560
+ 24  8  127  576  652  222
+  1  1  549  505  437  509
+ 52  8  740   35  712  130
+  0  0  688  547  593  131
+  1  1  600  133  344
+ 68  8  176  579
+  1  1  649  497  532  214
+  1  1  336  135  612
+  2  2  611  719  704  218
+  1  1  136  722  646  266
+  1  1  654  494  406  243
+  1  1  138  506  655  270
+  2  2  746   12  737  573
+ 52  8  432  680  209  475
+ 52  8  192  716  525  638
+ 52  8  393  520  747  189
+  4  4   17  581  592  544
+  0  0  145  355  273
+ 24  8  450  394  664  661
+  2  2  745  351  156  668
+ 52  8  210  194  710  721
+ 52  8  454  424  640  644
+ 52  8  594  160   36  738
+  0  0  262  503  696  743
+ 64  8  182  392  163   21
+ 52  8  144  165   23  762
+  0  0  760  101   57
+ 52  8  715  588  296  168
+ 52  8  196  170  709  721
+  1  1  438  714  236  703
+  1  1  292  490  658  317
+  1  1  247  195  314  541
+ 24  8  656  557  288  443
+ 52  8  170  728  754  533
+ 24  8  726  618    8  553
+  4  4  230  582  398  150
+ 68  8  173  415  625
+ 68  8  707  394  200
+ 68  8  678  202  676
+  4  4  409  286  279  489
+ 52  8  625   75  347  160
+ 52  8  205  692   21   31
+  1  1  353  613  441  211
+ 52  8  749   61  212
+ 68  8  751  213  500
+  1  1  232  334  610  134
+  1  1  188  472  295  249
+ 24  8  198  199  197  583
+ 24  8  218  761  604
+  1  1  351  668  435  219
+  1  1  238  332  614  137
+  1  1  354  615  439  224
+ 24  8  278  669  587  636
+  0  0  221  333  171
+  1  1  244  737  634  677
+  2  2  181  307  231
+  1  1  677  488  247  514
+ 24  8  119  622  528  683
+  8  8  197  741  759
+  0  0  359  459  264  123
+ 24  8  486  697  622  387
+  1  1  670  444  425  284
+  0  0  355  508  440  688
+  2  2  489  384   94  673
+  2  2  623  575  653  280
+ 24  8  312  520  656  324
+  1  1  383  349  665  272
+  1  1  348  381  269  345
+ 52  8  496  761   63  748
+  2  2  667   49  352  428
+  8  8  278  164  684  557
+  4  4  457  569  307  717
+ 52  8  642  718  141  311
+  1  1  658  310  375  660
+ 52  8  443  320  642  718
+  0  0  477  322  359  480
+ 24  8  563  715  617  296
+  1  1  476  227  365
+  1  1  714   34  336  719
+ 24  8  661  198  713
+ 24  8  674  764  736
+  1  1  128  509  346
+ 24  8  712   96  190
+  1  1   49  531  428   64
+  0  0  273  666  364  607
+  1  1  376  722  574  360
+  8  8  430  698  489   62
+  4  4  367  516  373  730
+ 24  8  105  744   16  645
+  2  2  569  372  717  380
+ 52  8  216  204  724
+ 24  8    4  394  155  707
+  0  0  627  720  203  551
+ 52  8  390  664  753  162
+ 24  8  366  725  533  690
+  1  1  434  571  590  727
+  1  1  345  445  578  446
+ 24  8  369  730  415  485
+ 24  8  559  710  466  318
+  1  1  633  727  719  491
+  1  1  135  491  612  220
+  1  1  590  472  572  495
+  1  1  573  722  574   13
+ 52  8  695  393  641  189
+  4  4  495    5  341  520
+ 52  8   67  566  582  632
+ 24  8  473  624  702  166
+ 52  8  594  132  740   35
+ 24  8  606  732  153  686
+ 52  8  683  599  106  583
+  1  1  589  602  633  682
+ 52  8  576  680  184  631
+ 68  8  728  618  733
+  2  2  675  412  693  737
+ 24  8  678  240  676
+  2  2  682  703  729  612
+  0  0  760  696  343  552
+ 24  8  624  632  754  169
+  1  1  765  706  689  613
+  4  4  373  295  585
+ 52  8  694   70  766  286
+ 52  8  163  728  536  698
+ 52  8  192  165  254  638
+  1  1  699  703    6  341
+ 68  8  716  725  637
+  4  4  423    4  719  496
+ 24  8  691  701  468  731
+ 52  8  730  585   53  147
+  8  8   90  738  712
+ 52  8  194  716  754    8
+ 52  8   41  276  223  762
+ 38  8  183  759  741  401
+ 24  8  684  557  564  139
+  1  1  717  658  616  399
+ 24  8  626  732   74  153
+ 52  8   74  187  167  742
+ 24  8  711   90  606
+  8  8  568  662   93  735
+ 24  8  739  109   16   25
+  0  0  627  114  551
+  8  8   93  692  116  391
+  4  4   30  350  762  623
+  4  4    8  412  616    7
+ 68  8  147  619  587
+ 68  8  155  672  184
+ 52  8  387  647  162  199
+  4  4  592  254   29  591
+ 52  8  168  331  648  555
+ 24  8  191  484  762  396
+ 68  8  155  697  394
+ 24  8  721  733  637   12
+ 24  8  555  500  560  302
+ 24  8  758  197  519
+  2  2  498  338  598   94
+ 52  8  199  212  756   54
+ 24  8  519  662  735  204
+  0  0  316  480  630  720
+ 52  8  672  652  305  576
+ 24  8  629  734  752  745
+ 24  8  106  568   93  105
+ 52  8  580  684  277   47
+  1  1  575  371  280  722
+ 24  8  386  392  724  409
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/INSTALL
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/INSTALL	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/INSTALL	(revision 9501)
@@ -0,0 +1,79 @@
+
+Copyright 1998, Regents of the University of Minnesota.
+METIS was written by George Karypis (karypis@cs.umn.edu)
+
+Introduction ------------------------------------------------------------
+
+METIS is a software package for partitioning unstructured graphs, partitioning 
+meshes, and computing fill-reducing orderings of sparse matrices. 
+The documentation of METIS can be found in the Doc/manual.ps file.
+
+METIS is written in ANSI C and should compile on Unix systems that have
+a ANSI C compiler. It has been extensively tested on the following
+architectures:
+
+   AIX 
+   SunOS 
+   Solaris 
+   IRIX 
+   Unicos
+   Linux
+   HP-UX
+   FreeBSD
+
+
+Installation Instructions -----------------------------------------------
+
+In order to build METIS you need
+  (a) a C compiler that is ANSI compatible 
+  (b) make 
+
+Edit the file Makefile.in that resides in the same directory as this file 
+according to the requirements of your system. In particular you may need
+to modify the following:
+  1. The CC variable, to be the name of the ANSI C compiler 
+     in your system. The GNU C compiler (gcc) will do. 
+  2. The settings for the AR and RANLIB variables that are suitable for
+     you system. Note that some systems do not have 'ranlib' but they use
+     'ar -ts' instead, or it is not needed all together. 
+  3. You can use COPTIONS and LDOPTIONS to provide additional command line
+     options that are required by your compiler and linker.
+
+
+After saving the modified Makefile.in, type 'make' at the prompt. This will
+build all of METIS's stand-alone programs, METIS's library, and a program that
+tests the various partitioning algorithms.
+Upon successful completion, make creates the following 11 files:
+
+  pmetis, 
+  kmetis, 
+  oemetis, 
+  onmetis, 
+  partnmesh, 
+  partdmesh, 
+  mesh2nodal,
+  mesh2dual,
+  graphchk,
+  libmetis.a
+  Graphs/mtest
+
+Please read the instructions in the file Graphs/0README on how to go and
+test the various programs.
+
+
+Contact Information -----------------------------------------------------
+
+If you have any comments, suggestions, or bug reports, please send them
+to metis@cs.umn.edu.
+
+Any bug fixes and upgrades of the METIS packages is available on WWW at
+URL: http://www.cs.umn.edu/~metis
+or
+URL: http://www.cs.umn.edu/~karypis/metis
+
+
+George Karypis
+Sun Sep 20 13:18:36 CDT 1998
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/Makefile
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/Makefile	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/Makefile	(revision 9501)
@@ -0,0 +1,31 @@
+include ../Makefile.in
+
+INCLUDES = -I.
+
+CFLAGS = $(COPTIONS) $(OPTFLAGS) $(INCLUDES)
+LD = $(CC) -L. 
+
+
+OBJS = coarsen.o fm.o initpart.o match.o ccgraph.o memory.o \
+       pmetis.o pqueue.o refine.o util.o timing.o debug.o \
+       bucketsort.o graph.o stat.o kmetis.o kwayrefine.o \
+       kwayfm.o balance.o ometis.o srefine.o sfm.o separator.o \
+       mincover.o mmd.o mesh.o meshpart.o frename.o fortran.o \
+       myqsort.o compress.o parmetis.o estmem.o \
+       mpmetis.o mcoarsen.o mmatch.o minitpart.o mbalance.o \
+       mrefine.o mutil.o mfm.o mkmetis.o mkwayrefine.o mkwayfmh.o \
+       mrefine2.o minitpart2.o mbalance2.o mfm2.o \
+       kvmetis.o kwayvolrefine.o kwayvolfm.o subdomains.o
+
+.c.o:
+	$(CC) $(CFLAGS) -c $*.c
+
+../libmetis.a: $(OBJS)
+	$(AR) $@ $(OBJS)
+	$(RANLIB) $@
+
+clean:
+	rm -f *.o
+
+realclean:
+	rm -f *.o ; rm -f ../libmetis.a
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/balance.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/balance.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/balance.c	(revision 9501)
@@ -0,0 +1,278 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * balance.c
+ *
+ * This file contains code that is used to forcefully balance either
+ * bisections or k-sections
+ *
+ * Started 7/29/97
+ * George
+ *
+ * $Id: balance.c,v 1.1 1998/11/27 17:59:10 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function is the entry point of the bisection balancing algorithms.
+**************************************************************************/
+void Balance2Way(CtrlType *ctrl, GraphType *graph, int *tpwgts, float ubfactor)
+{
+  int i, j, nvtxs, from, imax, gain, mindiff;
+  idxtype *id, *ed;
+
+  /* Return right away if the balance is OK */
+  mindiff = abs(tpwgts[0]-graph->pwgts[0]);
+  if (mindiff < 3*(graph->pwgts[0]+graph->pwgts[1])/graph->nvtxs)
+    return;
+  if (graph->pwgts[0] > tpwgts[0] && graph->pwgts[0] < (int)(ubfactor*tpwgts[0]))
+    return;
+  if (graph->pwgts[1] > tpwgts[1] && graph->pwgts[1] < (int)(ubfactor*tpwgts[1]))
+    return;
+
+  if (graph->nbnd > 0)
+    Bnd2WayBalance(ctrl, graph, tpwgts);
+  else
+    General2WayBalance(ctrl, graph, tpwgts);
+
+}
+
+
+
+/*************************************************************************
+* This function balances two partitions by moving boundary nodes
+* from the domain that is overweight to the one that is underweight.
+**************************************************************************/
+void Bnd2WayBalance(CtrlType *ctrl, GraphType *graph, int *tpwgts)
+{
+  int i, ii, j, k, kwgt, nvtxs, nbnd, nswaps, from, to, pass, me, tmp;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind, *pwgts;
+  idxtype *moved, *perm;
+  PQueueType parts;
+  int higain, oldgain, mincut, mindiff;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  pwgts = graph->pwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  /* Determine from which domain you will be moving data */
+  mindiff = abs(tpwgts[0]-pwgts[0]);
+  from = (pwgts[0] < tpwgts[0] ? 1 : 0);
+  to = (from+1)%2;
+
+  IFSET(ctrl->dbglvl, DBG_REFINE, 
+     printf("Partitions: [%6d %6d] T[%6d %6d], Nv-Nb[%6d %6d]. ICut: %6d [B]\n",
+             pwgts[0], pwgts[1], tpwgts[0], tpwgts[1], graph->nvtxs, graph->nbnd, graph->mincut));
+
+  tmp = graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)];
+  PQueueInit(ctrl, &parts, nvtxs, tmp);
+
+  idxset(nvtxs, -1, moved);
+
+  ASSERT(ComputeCut(graph, where) == graph->mincut);
+  ASSERT(CheckBnd(graph));
+
+  /* Insert the boundary nodes of the proper partition whose size is OK in the priority queue */
+  nbnd = graph->nbnd;
+  RandomPermute(nbnd, perm, 1);
+  for (ii=0; ii<nbnd; ii++) {
+    i = perm[ii];
+    ASSERT(ed[bndind[i]] > 0 || id[bndind[i]] == 0);
+    ASSERT(bndptr[bndind[i]] != -1);
+    if (where[bndind[i]] == from && vwgt[bndind[i]] <= mindiff)
+      PQueueInsert(&parts, bndind[i], ed[bndind[i]]-id[bndind[i]]);
+  }
+
+  mincut = graph->mincut;
+  for (nswaps=0; nswaps<nvtxs; nswaps++) {
+    if ((higain = PQueueGetMax(&parts)) == -1)
+      break;
+    ASSERT(bndptr[higain] != -1);
+
+    if (pwgts[to]+vwgt[higain] > tpwgts[to])
+      break;
+
+    mincut -= (ed[higain]-id[higain]);
+    INC_DEC(pwgts[to], pwgts[from], vwgt[higain]);
+
+    where[higain] = to;
+    moved[higain] = nswaps;
+
+    IFSET(ctrl->dbglvl, DBG_MOVEINFO, 
+      printf("Moved %6d from %d. [%3d %3d] %5d [%4d %4d]\n", higain, from, ed[higain]-id[higain], vwgt[higain], mincut, pwgts[0], pwgts[1]));
+
+    /**************************************************************
+    * Update the id[i]/ed[i] values of the affected nodes
+    ***************************************************************/
+    SWAP(id[higain], ed[higain], tmp);
+    if (ed[higain] == 0 && xadj[higain] < xadj[higain+1]) 
+      BNDDelete(nbnd, bndind,  bndptr, higain);
+
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+      oldgain = ed[k]-id[k];
+
+      kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+      INC_DEC(id[k], ed[k], kwgt);
+
+      /* Update its boundary information and queue position */
+      if (bndptr[k] != -1) { /* If k was a boundary vertex */
+        if (ed[k] == 0) { /* Not a boundary vertex any more */
+          BNDDelete(nbnd, bndind, bndptr, k);
+          if (moved[k] == -1 && where[k] == from && vwgt[k] <= mindiff)  /* Remove it if in the queues */
+            PQueueDelete(&parts, k, oldgain);
+        }
+        else { /* If it has not been moved, update its position in the queue */
+          if (moved[k] == -1 && where[k] == from && vwgt[k] <= mindiff)
+            PQueueUpdate(&parts, k, oldgain, ed[k]-id[k]);
+        }
+      }
+      else {
+        if (ed[k] > 0) {  /* It will now become a boundary vertex */
+          BNDInsert(nbnd, bndind, bndptr, k);
+          if (moved[k] == -1 && where[k] == from && vwgt[k] <= mindiff) 
+            PQueueInsert(&parts, k, ed[k]-id[k]);
+        }
+      }
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_REFINE, 
+    printf("\tMinimum cut: %6d, PWGTS: [%6d %6d], NBND: %6d\n", mincut, pwgts[0], pwgts[1], nbnd));
+
+  graph->mincut = mincut;
+  graph->nbnd = nbnd;
+
+  PQueueFree(ctrl, &parts);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+/*************************************************************************
+* This function balances two partitions by moving the highest gain 
+* (including negative gain) vertices to the other domain.
+* It is used only when tha unbalance is due to non contigous
+* subdomains. That is, the are no boundary vertices.
+* It moves vertices from the domain that is overweight to the one that 
+* is underweight.
+**************************************************************************/
+void General2WayBalance(CtrlType *ctrl, GraphType *graph, int *tpwgts)
+{
+  int i, ii, j, k, kwgt, nvtxs, nbnd, nswaps, from, to, pass, me, tmp;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind, *pwgts;
+  idxtype *moved, *perm;
+  PQueueType parts;
+  int higain, oldgain, mincut, mindiff;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  pwgts = graph->pwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  /* Determine from which domain you will be moving data */
+  mindiff = abs(tpwgts[0]-pwgts[0]);
+  from = (pwgts[0] < tpwgts[0] ? 1 : 0);
+  to = (from+1)%2;
+
+  IFSET(ctrl->dbglvl, DBG_REFINE, 
+     printf("Partitions: [%6d %6d] T[%6d %6d], Nv-Nb[%6d %6d]. ICut: %6d [B]\n",
+             pwgts[0], pwgts[1], tpwgts[0], tpwgts[1], graph->nvtxs, graph->nbnd, graph->mincut));
+
+  tmp = graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)];
+  PQueueInit(ctrl, &parts, nvtxs, tmp);
+
+  idxset(nvtxs, -1, moved);
+
+  ASSERT(ComputeCut(graph, where) == graph->mincut);
+  ASSERT(CheckBnd(graph));
+
+  /* Insert the nodes of the proper partition whose size is OK in the priority queue */
+  RandomPermute(nvtxs, perm, 1);
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+    if (where[i] == from && vwgt[i] <= mindiff)
+      PQueueInsert(&parts, i, ed[i]-id[i]);
+  }
+
+  mincut = graph->mincut;
+  nbnd = graph->nbnd;
+  for (nswaps=0; nswaps<nvtxs; nswaps++) {
+    if ((higain = PQueueGetMax(&parts)) == -1)
+      break;
+
+    if (pwgts[to]+vwgt[higain] > tpwgts[to])
+      break;
+
+    mincut -= (ed[higain]-id[higain]);
+    INC_DEC(pwgts[to], pwgts[from], vwgt[higain]);
+
+    where[higain] = to;
+    moved[higain] = nswaps;
+
+    IFSET(ctrl->dbglvl, DBG_MOVEINFO, 
+      printf("Moved %6d from %d. [%3d %3d] %5d [%4d %4d]\n", higain, from, ed[higain]-id[higain], vwgt[higain], mincut, pwgts[0], pwgts[1]));
+
+    /**************************************************************
+    * Update the id[i]/ed[i] values of the affected nodes
+    ***************************************************************/
+    SWAP(id[higain], ed[higain], tmp);
+    if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1]) 
+      BNDDelete(nbnd, bndind,  bndptr, higain);
+    if (ed[higain] > 0 && bndptr[higain] == -1)
+      BNDInsert(nbnd, bndind,  bndptr, higain);
+
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+      oldgain = ed[k]-id[k];
+
+      kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+      INC_DEC(id[k], ed[k], kwgt);
+
+      /* Update the queue position */
+      if (moved[k] == -1 && where[k] == from && vwgt[k] <= mindiff)
+        PQueueUpdate(&parts, k, oldgain, ed[k]-id[k]);
+
+      /* Update its boundary information */
+      if (ed[k] == 0 && bndptr[k] != -1) 
+        BNDDelete(nbnd, bndind, bndptr, k);
+      else if (ed[k] > 0 && bndptr[k] == -1)  
+        BNDInsert(nbnd, bndind, bndptr, k);
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_REFINE, 
+    printf("\tMinimum cut: %6d, PWGTS: [%6d %6d], NBND: %6d\n", mincut, pwgts[0], pwgts[1], nbnd));
+
+  graph->mincut = mincut;
+  graph->nbnd = nbnd;
+
+  PQueueFree(ctrl, &parts);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/bucketsort.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/bucketsort.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/bucketsort.c	(revision 9501)
@@ -0,0 +1,43 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * bucketsort.c
+ *
+ * This file contains code that implement a variety of counting sorting
+ * algorithms
+ *
+ * Started 7/25/97
+ * George
+ *
+ * $Id: bucketsort.c,v 1.1 1998/11/27 17:59:11 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* This function uses simple counting sort to return a permutation array
+* corresponding to the sorted order. The keys are assumed to start from
+* 0 and they are positive.  This sorting is used during matching.
+**************************************************************************/
+void BucketSortKeysInc(int n, int max, idxtype *keys, idxtype *tperm, idxtype *perm)
+{
+  int i, ii;
+  idxtype *counts;
+
+  counts = idxsmalloc(max+2, 0, "BucketSortKeysInc: counts");
+
+  for (i=0; i<n; i++)
+    counts[keys[i]]++;
+  MAKECSR(i, max+1, counts);
+
+  for (ii=0; ii<n; ii++) {
+    i = tperm[ii];
+    perm[counts[keys[i]]++] = i;
+  }
+
+  free(counts);
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/ccgraph.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/ccgraph.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/ccgraph.c	(revision 9501)
@@ -0,0 +1,599 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * ccgraph.c
+ *
+ * This file contains the functions that create the coarse graph
+ *
+ * Started 8/11/97
+ * George
+ *
+ * $Id: ccgraph.c,v 1.1 1998/11/27 17:59:12 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* This function creates the coarser graph
+**************************************************************************/
+void CreateCoarseGraph(CtrlType *ctrl, GraphType *graph, int cnvtxs, idxtype *match, idxtype *perm)
+{
+  int i, j, jj, k, kk, l, m, istart, iend, nvtxs, nedges, ncon, cnedges, v, u, mask, dovsize;
+  idxtype *xadj, *vwgt, *vsize, *adjncy, *adjwgt, *adjwgtsum, *auxadj;
+  idxtype *cmap, *htable;
+  idxtype *cxadj, *cvwgt, *cvsize, *cadjncy, *cadjwgt, *cadjwgtsum;
+  float *nvwgt, *cnvwgt;
+  GraphType *cgraph;
+
+  dovsize = (ctrl->optype == OP_KVMETIS ? 1 : 0);
+
+  mask = HTLENGTH;
+  if (cnvtxs < 8*mask || graph->nedges/graph->nvtxs > 15) { 
+    CreateCoarseGraphNoMask(ctrl, graph, cnvtxs, match, perm);
+    return;
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ContractTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  vsize = graph->vsize;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+  cmap = graph->cmap;
+
+  /* Initialize the coarser graph */
+  cgraph = SetUpCoarseGraph(graph, cnvtxs, dovsize);
+  cxadj = cgraph->xadj;
+  cvwgt = cgraph->vwgt;
+  cvsize = cgraph->vsize;
+  cnvwgt = cgraph->nvwgt;
+  cadjwgtsum = cgraph->adjwgtsum;
+  cadjncy = cgraph->adjncy;
+  cadjwgt = cgraph->adjwgt;
+
+
+  iend = xadj[nvtxs];
+  auxadj = ctrl->wspace.auxcore; 
+  memcpy(auxadj, adjncy, iend*sizeof(idxtype)); 
+  for (i=0; i<iend; i++)
+    auxadj[i] = cmap[auxadj[i]];
+
+  htable = idxset(mask+1, -1, idxwspacemalloc(ctrl, mask+1)); 
+
+  cxadj[0] = cnvtxs = cnedges = 0;
+  for (i=0; i<nvtxs; i++) {
+    v = perm[i];
+    if (cmap[v] != cnvtxs) 
+      continue;
+
+    u = match[v];
+    if (ncon == 1)
+      cvwgt[cnvtxs] = vwgt[v];
+    else
+      scopy(ncon, nvwgt+v*ncon, cnvwgt+cnvtxs*ncon);
+
+    if (dovsize)
+      cvsize[cnvtxs] = vsize[v];
+
+    cadjwgtsum[cnvtxs] = adjwgtsum[v];
+    nedges = 0;
+
+    istart = xadj[v];
+    iend = xadj[v+1];
+    for (j=istart; j<iend; j++) {
+      k = auxadj[j];
+      kk = k&mask;
+      if ((m = htable[kk]) == -1) {
+        cadjncy[nedges] = k;
+        cadjwgt[nedges] = adjwgt[j];
+        htable[kk] = nedges++;
+      }
+      else if (cadjncy[m] == k) {
+        cadjwgt[m] += adjwgt[j];
+      }
+      else {
+        for (jj=0; jj<nedges; jj++) {
+          if (cadjncy[jj] == k) {
+            cadjwgt[jj] += adjwgt[j];
+            break;
+          }
+        }
+        if (jj == nedges) {
+          cadjncy[nedges] = k;
+          cadjwgt[nedges++] = adjwgt[j];
+        }
+      }
+    }
+
+    if (v != u) { 
+      if (ncon == 1)
+        cvwgt[cnvtxs] += vwgt[u];
+      else
+        saxpy(ncon, 1.0, nvwgt+u*ncon, 1, cnvwgt+cnvtxs*ncon, 1);
+
+      if (dovsize)
+        cvsize[cnvtxs] += vsize[u];
+
+      cadjwgtsum[cnvtxs] += adjwgtsum[u];
+
+      istart = xadj[u];
+      iend = xadj[u+1];
+      for (j=istart; j<iend; j++) {
+        k = auxadj[j];
+        kk = k&mask;
+        if ((m = htable[kk]) == -1) {
+          cadjncy[nedges] = k;
+          cadjwgt[nedges] = adjwgt[j];
+          htable[kk] = nedges++;
+        }
+        else if (cadjncy[m] == k) {
+          cadjwgt[m] += adjwgt[j];
+        }
+        else {
+          for (jj=0; jj<nedges; jj++) {
+            if (cadjncy[jj] == k) {
+              cadjwgt[jj] += adjwgt[j];
+              break;
+            }
+          }
+          if (jj == nedges) {
+            cadjncy[nedges] = k;
+            cadjwgt[nedges++] = adjwgt[j];
+          }
+        }
+      }
+
+      /* Remove the contracted adjacency weight */
+      jj = htable[cnvtxs&mask];
+      if (jj >= 0 && cadjncy[jj] != cnvtxs) {
+        for (jj=0; jj<nedges; jj++) {
+          if (cadjncy[jj] == cnvtxs) 
+            break;
+        }
+      }
+      if (jj >= 0 && cadjncy[jj] == cnvtxs) { /* This 2nd check is needed for non-adjacent matchings */
+        cadjwgtsum[cnvtxs] -= cadjwgt[jj];
+        cadjncy[jj] = cadjncy[--nedges];
+        cadjwgt[jj] = cadjwgt[nedges];
+      }
+    }
+
+    ASSERTP(cadjwgtsum[cnvtxs] == idxsum(nedges, cadjwgt), ("%d %d %d %d %d\n", cnvtxs, cadjwgtsum[cnvtxs], idxsum(nedges, cadjwgt), adjwgtsum[u], adjwgtsum[v]));
+
+    for (j=0; j<nedges; j++)
+      htable[cadjncy[j]&mask] = -1;  /* Zero out the htable */
+    htable[cnvtxs&mask] = -1;
+
+    cnedges += nedges;
+    cxadj[++cnvtxs] = cnedges;
+    cadjncy += nedges;
+    cadjwgt += nedges;
+  }
+
+  cgraph->nedges = cnedges;
+
+  ReAdjustMemory(graph, cgraph, dovsize);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ContractTmr));
+
+  idxwspacefree(ctrl, mask+1);
+
+}
+
+
+/*************************************************************************
+* This function creates the coarser graph
+**************************************************************************/
+void CreateCoarseGraphNoMask(CtrlType *ctrl, GraphType *graph, int cnvtxs, idxtype *match, idxtype *perm)
+{
+  int i, j, k, m, istart, iend, nvtxs, nedges, ncon, cnedges, v, u, dovsize;
+  idxtype *xadj, *vwgt, *vsize, *adjncy, *adjwgt, *adjwgtsum, *auxadj;
+  idxtype *cmap, *htable;
+  idxtype *cxadj, *cvwgt, *cvsize, *cadjncy, *cadjwgt, *cadjwgtsum;
+  float *nvwgt, *cnvwgt;
+  GraphType *cgraph;
+
+  dovsize = (ctrl->optype == OP_KVMETIS ? 1 : 0);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ContractTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  vsize = graph->vsize;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+  cmap = graph->cmap;
+
+
+  /* Initialize the coarser graph */
+  cgraph = SetUpCoarseGraph(graph, cnvtxs, dovsize);
+  cxadj = cgraph->xadj;
+  cvwgt = cgraph->vwgt;
+  cvsize = cgraph->vsize;
+  cnvwgt = cgraph->nvwgt;
+  cadjwgtsum = cgraph->adjwgtsum;
+  cadjncy = cgraph->adjncy;
+  cadjwgt = cgraph->adjwgt;
+
+
+  htable = idxset(cnvtxs, -1, idxwspacemalloc(ctrl, cnvtxs));
+
+  iend = xadj[nvtxs];
+  auxadj = ctrl->wspace.auxcore; 
+  memcpy(auxadj, adjncy, iend*sizeof(idxtype)); 
+  for (i=0; i<iend; i++)
+    auxadj[i] = cmap[auxadj[i]];
+
+  cxadj[0] = cnvtxs = cnedges = 0;
+  for (i=0; i<nvtxs; i++) {
+    v = perm[i];
+    if (cmap[v] != cnvtxs) 
+      continue;
+
+    u = match[v];
+    if (ncon == 1)
+      cvwgt[cnvtxs] = vwgt[v];
+    else
+      scopy(ncon, nvwgt+v*ncon, cnvwgt+cnvtxs*ncon);
+
+    if (dovsize)
+      cvsize[cnvtxs] = vsize[v];
+
+    cadjwgtsum[cnvtxs] = adjwgtsum[v];
+    nedges = 0;
+
+    istart = xadj[v];
+    iend = xadj[v+1];
+    for (j=istart; j<iend; j++) {
+      k = auxadj[j];
+      if ((m = htable[k]) == -1) {
+        cadjncy[nedges] = k;
+        cadjwgt[nedges] = adjwgt[j];
+        htable[k] = nedges++;
+      }
+      else {
+        cadjwgt[m] += adjwgt[j];
+      }
+    }
+
+    if (v != u) { 
+      if (ncon == 1)
+        cvwgt[cnvtxs] += vwgt[u];
+      else
+        saxpy(ncon, 1.0, nvwgt+u*ncon, 1, cnvwgt+cnvtxs*ncon, 1);
+
+      if (dovsize)
+        cvsize[cnvtxs] += vsize[u];
+
+      cadjwgtsum[cnvtxs] += adjwgtsum[u];
+
+      istart = xadj[u];
+      iend = xadj[u+1];
+      for (j=istart; j<iend; j++) {
+        k = auxadj[j];
+        if ((m = htable[k]) == -1) {
+          cadjncy[nedges] = k;
+          cadjwgt[nedges] = adjwgt[j];
+          htable[k] = nedges++;
+        }
+        else {
+          cadjwgt[m] += adjwgt[j];
+        }
+      }
+
+      /* Remove the contracted adjacency weight */
+      if ((j = htable[cnvtxs]) != -1) {
+        ASSERT(cadjncy[j] == cnvtxs);
+        cadjwgtsum[cnvtxs] -= cadjwgt[j];
+        cadjncy[j] = cadjncy[--nedges];
+        cadjwgt[j] = cadjwgt[nedges];
+        htable[cnvtxs] = -1;
+      }
+    }
+
+    ASSERTP(cadjwgtsum[cnvtxs] == idxsum(nedges, cadjwgt), ("%d %d\n", cadjwgtsum[cnvtxs], idxsum(nedges, cadjwgt)));
+
+    for (j=0; j<nedges; j++)
+      htable[cadjncy[j]] = -1;  /* Zero out the htable */
+
+    cnedges += nedges;
+    cxadj[++cnvtxs] = cnedges;
+    cadjncy += nedges;
+    cadjwgt += nedges;
+  }
+
+  cgraph->nedges = cnedges;
+
+  ReAdjustMemory(graph, cgraph, dovsize);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ContractTmr));
+
+  idxwspacefree(ctrl, cnvtxs);
+}
+
+
+/*************************************************************************
+* This function creates the coarser graph
+**************************************************************************/
+void CreateCoarseGraph_NVW(CtrlType *ctrl, GraphType *graph, int cnvtxs, idxtype *match, idxtype *perm)
+{
+  int i, j, jj, k, kk, l, m, istart, iend, nvtxs, nedges, ncon, cnedges, v, u, mask;
+  idxtype *xadj, *adjncy, *adjwgtsum, *auxadj;
+  idxtype *cmap, *htable;
+  idxtype *cxadj, *cvwgt, *cadjncy, *cadjwgt, *cadjwgtsum;
+  float *nvwgt, *cnvwgt;
+  GraphType *cgraph;
+
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ContractTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgtsum = graph->adjwgtsum;
+  cmap = graph->cmap;
+
+  /* Initialize the coarser graph */
+  cgraph = SetUpCoarseGraph(graph, cnvtxs, 0);
+  cxadj = cgraph->xadj;
+  cvwgt = cgraph->vwgt;
+  cnvwgt = cgraph->nvwgt;
+  cadjwgtsum = cgraph->adjwgtsum;
+  cadjncy = cgraph->adjncy;
+  cadjwgt = cgraph->adjwgt;
+
+
+  iend = xadj[nvtxs];
+  auxadj = ctrl->wspace.auxcore; 
+  memcpy(auxadj, adjncy, iend*sizeof(idxtype)); 
+  for (i=0; i<iend; i++)
+    auxadj[i] = cmap[auxadj[i]];
+
+  mask = HTLENGTH;
+  htable = idxset(mask+1, -1, idxwspacemalloc(ctrl, mask+1)); 
+
+  cxadj[0] = cnvtxs = cnedges = 0;
+  for (i=0; i<nvtxs; i++) {
+    v = perm[i];
+    if (cmap[v] != cnvtxs) 
+      continue;
+
+    u = match[v];
+    cvwgt[cnvtxs] = 1;
+    cadjwgtsum[cnvtxs] = adjwgtsum[v];
+    nedges = 0;
+
+    istart = xadj[v];
+    iend = xadj[v+1];
+    for (j=istart; j<iend; j++) {
+      k = auxadj[j];
+      kk = k&mask;
+      if ((m = htable[kk]) == -1) {
+        cadjncy[nedges] = k;
+        cadjwgt[nedges] = 1;
+        htable[kk] = nedges++;
+      }
+      else if (cadjncy[m] == k) {
+        cadjwgt[m]++;
+      }
+      else {
+        for (jj=0; jj<nedges; jj++) {
+          if (cadjncy[jj] == k) {
+            cadjwgt[jj]++;
+            break;
+          }
+        }
+        if (jj == nedges) {
+          cadjncy[nedges] = k;
+          cadjwgt[nedges++] = 1;
+        }
+      }
+    }
+
+    if (v != u) { 
+      cvwgt[cnvtxs]++;
+      cadjwgtsum[cnvtxs] += adjwgtsum[u];
+
+      istart = xadj[u];
+      iend = xadj[u+1];
+      for (j=istart; j<iend; j++) {
+        k = auxadj[j];
+        kk = k&mask;
+        if ((m = htable[kk]) == -1) {
+          cadjncy[nedges] = k;
+          cadjwgt[nedges] = 1;
+          htable[kk] = nedges++;
+        }
+        else if (cadjncy[m] == k) {
+          cadjwgt[m]++;
+        }
+        else {
+          for (jj=0; jj<nedges; jj++) {
+            if (cadjncy[jj] == k) {
+              cadjwgt[jj]++;
+              break;
+            }
+          }
+          if (jj == nedges) {
+            cadjncy[nedges] = k;
+            cadjwgt[nedges++] = 1;
+          }
+        }
+      }
+
+      /* Remove the contracted adjacency weight */
+      jj = htable[cnvtxs&mask];
+      if (jj >= 0 && cadjncy[jj] != cnvtxs) {
+        for (jj=0; jj<nedges; jj++) {
+          if (cadjncy[jj] == cnvtxs) 
+            break;
+        }
+      }
+      if (jj >= 0 && cadjncy[jj] == cnvtxs) { /* This 2nd check is needed for non-adjacent matchings */
+        cadjwgtsum[cnvtxs] -= cadjwgt[jj];
+        cadjncy[jj] = cadjncy[--nedges];
+        cadjwgt[jj] = cadjwgt[nedges];
+      }
+    }
+
+    ASSERTP(cadjwgtsum[cnvtxs] == idxsum(nedges, cadjwgt), ("%d %d %d %d %d\n", cnvtxs, cadjwgtsum[cnvtxs], idxsum(nedges, cadjwgt), adjwgtsum[u], adjwgtsum[v]));
+
+    for (j=0; j<nedges; j++)
+      htable[cadjncy[j]&mask] = -1;  /* Zero out the htable */
+    htable[cnvtxs&mask] = -1;
+
+    cnedges += nedges;
+    cxadj[++cnvtxs] = cnedges;
+    cadjncy += nedges;
+    cadjwgt += nedges;
+  }
+
+  cgraph->nedges = cnedges;
+
+  ReAdjustMemory(graph, cgraph, 0);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ContractTmr));
+
+  idxwspacefree(ctrl, mask+1);
+
+}
+
+
+/*************************************************************************
+* Setup the various arrays for the coarse graph
+**************************************************************************/
+GraphType *SetUpCoarseGraph(GraphType *graph, int cnvtxs, int dovsize)
+{
+  GraphType *cgraph;
+
+  cgraph = CreateGraph();
+  cgraph->nvtxs = cnvtxs;
+  cgraph->ncon = graph->ncon;
+
+  cgraph->finer = graph;
+  graph->coarser = cgraph;
+
+
+  /* Allocate memory for the coarser graph */
+  if (graph->ncon == 1) {
+    if (dovsize) {
+      cgraph->gdata = idxmalloc(5*cnvtxs+1 + 2*graph->nedges, "SetUpCoarseGraph: gdata");
+      cgraph->xadj 		= cgraph->gdata;
+      cgraph->vwgt 		= cgraph->gdata + cnvtxs+1;
+      cgraph->vsize 		= cgraph->gdata + 2*cnvtxs+1;
+      cgraph->adjwgtsum 	= cgraph->gdata + 3*cnvtxs+1;
+      cgraph->cmap 		= cgraph->gdata + 4*cnvtxs+1;
+      cgraph->adjncy 		= cgraph->gdata + 5*cnvtxs+1;
+      cgraph->adjwgt 		= cgraph->gdata + 5*cnvtxs+1 + graph->nedges;
+    }
+    else {
+      cgraph->gdata = idxmalloc(4*cnvtxs+1 + 2*graph->nedges, "SetUpCoarseGraph: gdata");
+      cgraph->xadj 		= cgraph->gdata;
+      cgraph->vwgt 		= cgraph->gdata + cnvtxs+1;
+      cgraph->adjwgtsum 	= cgraph->gdata + 2*cnvtxs+1;
+      cgraph->cmap 		= cgraph->gdata + 3*cnvtxs+1;
+      cgraph->adjncy 		= cgraph->gdata + 4*cnvtxs+1;
+      cgraph->adjwgt 		= cgraph->gdata + 4*cnvtxs+1 + graph->nedges;
+    }
+  }
+  else {
+    if (dovsize) {
+      cgraph->gdata = idxmalloc(4*cnvtxs+1 + 2*graph->nedges, "SetUpCoarseGraph: gdata");
+      cgraph->xadj 		= cgraph->gdata;
+      cgraph->vsize 		= cgraph->gdata + cnvtxs+1;
+      cgraph->adjwgtsum 	= cgraph->gdata + 2*cnvtxs+1;
+      cgraph->cmap 		= cgraph->gdata + 3*cnvtxs+1;
+      cgraph->adjncy 		= cgraph->gdata + 4*cnvtxs+1;
+      cgraph->adjwgt 		= cgraph->gdata + 4*cnvtxs+1 + graph->nedges;
+    }
+    else {
+      cgraph->gdata = idxmalloc(3*cnvtxs+1 + 2*graph->nedges, "SetUpCoarseGraph: gdata");
+      cgraph->xadj 		= cgraph->gdata;
+      cgraph->adjwgtsum 	= cgraph->gdata + cnvtxs+1;
+      cgraph->cmap 		= cgraph->gdata + 2*cnvtxs+1;
+      cgraph->adjncy 		= cgraph->gdata + 3*cnvtxs+1;
+      cgraph->adjwgt 		= cgraph->gdata + 3*cnvtxs+1 + graph->nedges;
+    }
+
+    cgraph->nvwgt 	= fmalloc(graph->ncon*cnvtxs, "SetUpCoarseGraph: nvwgt");
+  }
+
+  return cgraph;
+}
+
+
+/*************************************************************************
+* This function re-adjusts the amount of memory that was allocated if
+* it will lead to significant savings
+**************************************************************************/
+void ReAdjustMemory(GraphType *graph, GraphType *cgraph, int dovsize) 
+{
+
+  if (cgraph->nedges > 100000 && graph->nedges < 0.7*graph->nedges) {
+    idxcopy(cgraph->nedges, cgraph->adjwgt, cgraph->adjncy+cgraph->nedges);
+
+    if (graph->ncon == 1) {
+      if (dovsize) {
+        cgraph->gdata = realloc(cgraph->gdata, (5*cgraph->nvtxs+1 + 2*cgraph->nedges)*sizeof(idxtype));
+
+        /* Do this, in case everything was copied into new space */
+        cgraph->xadj 		= cgraph->gdata;
+        cgraph->vwgt 		= cgraph->gdata + cgraph->nvtxs+1;
+        cgraph->vsize 		= cgraph->gdata + 2*cgraph->nvtxs+1;
+        cgraph->adjwgtsum	= cgraph->gdata + 3*cgraph->nvtxs+1;
+        cgraph->cmap 		= cgraph->gdata + 4*cgraph->nvtxs+1;
+        cgraph->adjncy 		= cgraph->gdata + 5*cgraph->nvtxs+1;
+        cgraph->adjwgt 		= cgraph->gdata + 5*cgraph->nvtxs+1 + cgraph->nedges;
+      }
+      else {
+        cgraph->gdata = realloc(cgraph->gdata, (4*cgraph->nvtxs+1 + 2*cgraph->nedges)*sizeof(idxtype));
+
+        /* Do this, in case everything was copied into new space */
+        cgraph->xadj 	= cgraph->gdata;
+        cgraph->vwgt 	= cgraph->gdata + cgraph->nvtxs+1;
+        cgraph->adjwgtsum	= cgraph->gdata + 2*cgraph->nvtxs+1;
+        cgraph->cmap 	= cgraph->gdata + 3*cgraph->nvtxs+1;
+        cgraph->adjncy 	= cgraph->gdata + 4*cgraph->nvtxs+1;
+        cgraph->adjwgt 	= cgraph->gdata + 4*cgraph->nvtxs+1 + cgraph->nedges;
+      }
+    }
+    else {
+      if (dovsize) {
+        cgraph->gdata = realloc(cgraph->gdata, (4*cgraph->nvtxs+1 + 2*cgraph->nedges)*sizeof(idxtype));
+
+        /* Do this, in case everything was copied into new space */
+        cgraph->xadj 		= cgraph->gdata;
+        cgraph->vsize		= cgraph->gdata + cgraph->nvtxs+1;
+        cgraph->adjwgtsum	= cgraph->gdata + 2*cgraph->nvtxs+1;
+        cgraph->cmap 		= cgraph->gdata + 3*cgraph->nvtxs+1;
+        cgraph->adjncy 		= cgraph->gdata + 4*cgraph->nvtxs+1;
+        cgraph->adjwgt 		= cgraph->gdata + 4*cgraph->nvtxs+1 + cgraph->nedges;
+      }
+      else {
+        cgraph->gdata = realloc(cgraph->gdata, (3*cgraph->nvtxs+1 + 2*cgraph->nedges)*sizeof(idxtype));
+
+        /* Do this, in case everything was copied into new space */
+        cgraph->xadj 		= cgraph->gdata;
+        cgraph->adjwgtsum	= cgraph->gdata + cgraph->nvtxs+1;
+        cgraph->cmap 		= cgraph->gdata + 2*cgraph->nvtxs+1;
+        cgraph->adjncy 		= cgraph->gdata + 3*cgraph->nvtxs+1;
+        cgraph->adjwgt 		= cgraph->gdata + 3*cgraph->nvtxs+1 + cgraph->nedges;
+      }
+    }
+  }
+
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/coarsen.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/coarsen.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/coarsen.c	(revision 9501)
@@ -0,0 +1,83 @@
+/*
+ * coarsen.c
+ *
+ * This file contains the driving routines for the coarsening process 
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: coarsen.c,v 1.1 1998/11/27 17:59:12 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function takes a graph and creates a sequence of coarser graphs
+**************************************************************************/
+GraphType *Coarsen2Way(CtrlType *ctrl, GraphType *graph)
+{
+  int clevel;
+  GraphType *cgraph;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->CoarsenTmr));
+
+  cgraph = graph;
+
+  /* The following is ahack to allow the multiple bisections to go through with correct
+     coarsening */
+  if (ctrl->CType > 20) {
+    clevel = 1;
+    ctrl->CType -= 20;
+  }
+  else
+    clevel = 0;
+
+  do {
+    IFSET(ctrl->dbglvl, DBG_COARSEN, printf("%6d %7d [%d] [%d %d]\n",
+          cgraph->nvtxs, cgraph->nedges, ctrl->CoarsenTo, ctrl->maxvwgt, 
+          (cgraph->vwgt ? idxsum(cgraph->nvtxs, cgraph->vwgt) : cgraph->nvtxs)));
+
+    if (cgraph->adjwgt) {
+      switch (ctrl->CType) {
+        case MATCH_RM:
+          Match_RM(ctrl, cgraph);
+          break;
+        case MATCH_HEM:
+          if (clevel < 1)
+            Match_RM(ctrl, cgraph);
+          else
+            Match_HEM(ctrl, cgraph);
+          break;
+        case MATCH_SHEM:
+          if (clevel < 1)
+            Match_RM(ctrl, cgraph);
+          else
+            Match_SHEM(ctrl, cgraph);
+          break;
+        case MATCH_SHEMKWAY:
+          Match_SHEM(ctrl, cgraph);
+          break;
+        default:
+          errexit("Unknown CType: %d\n", ctrl->CType);
+      }
+    }
+    else {
+      Match_RM_NVW(ctrl, cgraph);
+    }
+
+    cgraph = cgraph->coarser;
+    clevel++;
+
+  } while (cgraph->nvtxs > ctrl->CoarsenTo && cgraph->nvtxs < COARSEN_FRACTION2*cgraph->finer->nvtxs && cgraph->nedges > cgraph->nvtxs/2); 
+
+  IFSET(ctrl->dbglvl, DBG_COARSEN, printf("%6d %7d [%d] [%d %d]\n",
+        cgraph->nvtxs, cgraph->nedges, ctrl->CoarsenTo, ctrl->maxvwgt, 
+        (cgraph->vwgt ? idxsum(cgraph->nvtxs, cgraph->vwgt) : cgraph->nvtxs)));
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->CoarsenTmr));
+
+  return cgraph;
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/compress.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/compress.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/compress.c	(revision 9501)
@@ -0,0 +1,256 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * compress.c
+ *
+ * This file contains code for compressing nodes with identical adjacency
+ * structure and for prunning dense columns
+ *
+ * Started 9/17/97
+ * George
+ *
+ * $Id: compress.c,v 1.1 1998/11/27 17:59:12 karypis Exp $
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function compresses a graph by merging identical vertices
+* The compression should lead to at least 10% reduction.
+**************************************************************************/
+void CompressGraph(CtrlType *ctrl, GraphType *graph, int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *cptr, idxtype *cind)
+{
+  int i, ii, iii, j, jj, k, l, cnvtxs, cnedges;
+  idxtype *cxadj, *cadjncy, *cvwgt, *mark, *map;
+  KeyValueType *keys;
+
+  mark = idxsmalloc(nvtxs, -1, "CompressGraph: mark");
+  map = idxsmalloc(nvtxs, -1, "CompressGraph: map");
+  keys = (KeyValueType *)GKmalloc(nvtxs*sizeof(KeyValueType), "CompressGraph: keys");
+
+  /* Compute a key for each adjacency list */
+  for (i=0; i<nvtxs; i++) {
+    k = 0;
+    for (j=xadj[i]; j<xadj[i+1]; j++)
+      k += adjncy[j];
+    keys[i].key = k+i; /* Add the diagonal entry as well */
+    keys[i].val = i;
+  }
+
+  ikeysort(nvtxs, keys);
+
+  l = cptr[0] = 0;
+  for (cnvtxs=i=0; i<nvtxs; i++) {
+    ii = keys[i].val;
+    if (map[ii] == -1) { 
+      mark[ii] = i;  /* Add the diagonal entry */
+      for (j=xadj[ii]; j<xadj[ii+1]; j++) 
+        mark[adjncy[j]] = i;
+
+      cind[l++] = ii;
+      map[ii] = cnvtxs;
+
+      for (j=i+1; j<nvtxs; j++) {
+        iii = keys[j].val;
+
+        if (keys[i].key != keys[j].key || xadj[ii+1]-xadj[ii] != xadj[iii+1]-xadj[iii])
+          break; /* Break if keys or degrees are different */
+
+        if (map[iii] == -1) { /* Do a comparison if iii has not been mapped */ 
+          for (jj=xadj[iii]; jj<xadj[iii+1]; jj++) {
+            if (mark[adjncy[jj]] != i)
+              break;
+          }
+
+          if (jj == xadj[iii+1]) { /* Identical adjacency structure */
+            map[iii] = cnvtxs;
+            cind[l++] = iii;
+          }
+        }
+      }
+
+      cptr[++cnvtxs] = l;
+    }
+  }
+
+  /* printf("Original: %6d, Compressed: %6d\n", nvtxs, cnvtxs); */
+
+
+  InitGraph(graph);
+
+  if (cnvtxs >= COMPRESSION_FRACTION*nvtxs) {
+    graph->nvtxs = nvtxs;
+    graph->nedges = xadj[nvtxs];
+    graph->ncon = 1;
+    graph->xadj = xadj;
+    graph->adjncy = adjncy;
+
+    graph->gdata = idxmalloc(3*nvtxs+graph->nedges, "CompressGraph: gdata");
+    graph->vwgt    	= graph->gdata;
+    graph->adjwgtsum    = graph->gdata+nvtxs;
+    graph->cmap		= graph->gdata+2*nvtxs;
+    graph->adjwgt	= graph->gdata+3*nvtxs;
+
+    idxset(nvtxs, 1, graph->vwgt);
+    idxset(graph->nedges, 1, graph->adjwgt);
+    for (i=0; i<nvtxs; i++)
+      graph->adjwgtsum[i] = xadj[i+1]-xadj[i];
+
+    graph->label = idxmalloc(nvtxs, "CompressGraph: label");
+    for (i=0; i<nvtxs; i++)
+      graph->label[i] = i;
+  }
+  else { /* Ok, form the compressed graph  */
+    cnedges = 0;
+    for (i=0; i<cnvtxs; i++) {
+      ii = cind[cptr[i]];
+      cnedges += xadj[ii+1]-xadj[ii];
+    }
+
+    /* Allocate memory for the compressed graph*/
+    graph->gdata = idxmalloc(4*cnvtxs+1 + 2*cnedges, "CompressGraph: gdata");
+    cxadj = graph->xadj		= graph->gdata;
+    cvwgt = graph->vwgt         = graph->gdata + cnvtxs+1;
+    graph->adjwgtsum        	= graph->gdata + 2*cnvtxs+1;
+    graph->cmap                 = graph->gdata + 3*cnvtxs+1;
+    cadjncy = graph->adjncy     = graph->gdata + 4*cnvtxs+1;
+    graph->adjwgt            	= graph->gdata + 4*cnvtxs+1 + cnedges;
+
+    /* Now go and compress the graph */
+    idxset(nvtxs, -1, mark);
+    l = cxadj[0] = 0;
+    for (i=0; i<cnvtxs; i++) {
+      cvwgt[i] = cptr[i+1]-cptr[i];
+      mark[i] = i;  /* Remove any dioganal entries in the compressed graph */
+      for (j=cptr[i]; j<cptr[i+1]; j++) {
+        ii = cind[j];
+        for (jj=xadj[ii]; jj<xadj[ii+1]; jj++) {
+          k = map[adjncy[jj]];
+          if (mark[k] != i) 
+            cadjncy[l++] = k;
+          mark[k] = i;
+        }
+      }
+      cxadj[i+1] = l;
+    }
+
+    graph->nvtxs = cnvtxs;
+    graph->nedges = l;
+    graph->ncon = 1;
+
+    idxset(graph->nedges, 1, graph->adjwgt);
+    for (i=0; i<cnvtxs; i++)
+      graph->adjwgtsum[i] = cxadj[i+1]-cxadj[i];
+
+    graph->label = idxmalloc(cnvtxs, "CompressGraph: label");
+    for (i=0; i<cnvtxs; i++)
+      graph->label[i] = i;
+
+  }
+
+  GKfree(&keys, &map, &mark, LTERM);
+}
+
+
+
+/*************************************************************************
+* This function prunes all the vertices in a graph with degree greater 
+* than factor*average
+**************************************************************************/
+void PruneGraph(CtrlType *ctrl, GraphType *graph, int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *iperm, float factor)
+{
+  int i, j, k, l, nlarge, pnvtxs, pnedges;
+  idxtype *pxadj, *padjncy, *padjwgt, *pvwgt;
+  idxtype *perm;
+
+  perm = idxmalloc(nvtxs, "PruneGraph: perm");
+
+  factor = factor*xadj[nvtxs]/nvtxs;
+
+  pnvtxs = pnedges = nlarge = 0;
+  for (i=0; i<nvtxs; i++) {
+    if (xadj[i+1]-xadj[i] < factor) {
+      perm[i] = pnvtxs;
+      iperm[pnvtxs++] = i;
+      pnedges += xadj[i+1]-xadj[i];
+    }
+    else {
+      perm[i] = nvtxs - ++nlarge;
+      iperm[nvtxs-nlarge] = i;
+    }
+  }
+
+  /* printf("Pruned %d vertices\n", nlarge); */
+
+  InitGraph(graph);
+
+  if (nlarge == 0) { /* No prunning */
+    graph->nvtxs = nvtxs;
+    graph->nedges = xadj[nvtxs];
+    graph->ncon = 1;
+    graph->xadj = xadj;
+    graph->adjncy = adjncy;
+
+    graph->gdata = idxmalloc(3*nvtxs+graph->nedges, "CompressGraph: gdata");
+    graph->vwgt    	= graph->gdata;
+    graph->adjwgtsum    = graph->gdata+nvtxs;
+    graph->cmap		= graph->gdata+2*nvtxs;
+    graph->adjwgt	= graph->gdata+3*nvtxs;
+
+    idxset(nvtxs, 1, graph->vwgt);
+    idxset(graph->nedges, 1, graph->adjwgt);
+    for (i=0; i<nvtxs; i++)
+      graph->adjwgtsum[i] = xadj[i+1]-xadj[i];
+
+    graph->label = idxmalloc(nvtxs, "CompressGraph: label");
+    for (i=0; i<nvtxs; i++)
+      graph->label[i] = i;
+  }
+  else { /* Prune the graph */
+    /* Allocate memory for the compressed graph*/
+    graph->gdata = idxmalloc(4*pnvtxs+1 + 2*pnedges, "PruneGraph: gdata");
+    pxadj = graph->xadj		= graph->gdata;
+    graph->vwgt         	= graph->gdata + pnvtxs+1;
+    graph->adjwgtsum        	= graph->gdata + 2*pnvtxs+1;
+    graph->cmap                 = graph->gdata + 3*pnvtxs+1;
+    padjncy = graph->adjncy     = graph->gdata + 4*pnvtxs+1;
+    graph->adjwgt            	= graph->gdata + 4*pnvtxs+1 + pnedges;
+
+    pxadj[0] = pnedges = l = 0;
+    for (i=0; i<nvtxs; i++) {
+      if (xadj[i+1]-xadj[i] < factor) {
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          k = perm[adjncy[j]];
+          if (k < pnvtxs) 
+            padjncy[pnedges++] = k;
+        }
+        pxadj[++l] = pnedges;
+      }
+    }
+
+    graph->nvtxs = pnvtxs;
+    graph->nedges = pnedges;
+    graph->ncon = 1;
+
+    idxset(pnvtxs, 1, graph->vwgt);
+    idxset(pnedges, 1, graph->adjwgt);
+    for (i=0; i<pnvtxs; i++)
+      graph->adjwgtsum[i] = pxadj[i+1]-pxadj[i];
+
+    graph->label = idxmalloc(pnvtxs, "CompressGraph: label");
+    for (i=0; i<pnvtxs; i++)
+      graph->label[i] = i;
+  }
+
+  free(perm);
+
+}
+
+
+
+
+
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/debug.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/debug.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/debug.c	(revision 9501)
@@ -0,0 +1,239 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * debug.c
+ *
+ * This file contains code that performs self debuging
+ *
+ * Started 7/24/97
+ * George
+ *
+ * $Id: debug.c,v 1.1 1998/11/27 17:59:13 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function computes the cut given the graph and a where vector
+**************************************************************************/
+int ComputeCut(GraphType *graph, idxtype *where)
+{
+  int i, j, cut;
+
+  if (graph->adjwgt == NULL) {
+    for (cut=0, i=0; i<graph->nvtxs; i++) {
+      for (j=graph->xadj[i]; j<graph->xadj[i+1]; j++)
+        if (where[i] != where[graph->adjncy[j]])
+          cut++;
+    }
+  }
+  else {
+    for (cut=0, i=0; i<graph->nvtxs; i++) {
+      for (j=graph->xadj[i]; j<graph->xadj[i+1]; j++)
+        if (where[i] != where[graph->adjncy[j]])
+          cut += graph->adjwgt[j];
+    }
+  }
+
+  return cut/2;
+}
+
+
+/*************************************************************************
+* This function checks whether or not the boundary information is correct
+**************************************************************************/
+int CheckBnd(GraphType *graph) 
+{
+  int i, j, nvtxs, nbnd;
+  idxtype *xadj, *adjncy, *where, *bndptr, *bndind;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  where = graph->where;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  for (nbnd=0, i=0; i<nvtxs; i++) {
+    if (xadj[i+1]-xadj[i] == 0)
+      nbnd++;   /* Islands are considered to be boundary vertices */
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (where[i] != where[adjncy[j]]) {
+        nbnd++;
+        ASSERT(bndptr[i] != -1);
+        ASSERT(bndind[bndptr[i]] == i);
+        break;
+      }
+    }
+  }
+
+  ASSERTP(nbnd == graph->nbnd, ("%d %d\n", nbnd, graph->nbnd));
+
+  return 1;
+}
+
+
+
+/*************************************************************************
+* This function checks whether or not the boundary information is correct
+**************************************************************************/
+int CheckBnd2(GraphType *graph) 
+{
+  int i, j, nvtxs, nbnd, id, ed;
+  idxtype *xadj, *adjncy, *where, *bndptr, *bndind;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  where = graph->where;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  for (nbnd=0, i=0; i<nvtxs; i++) {
+    id = ed = 0;
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (where[i] != where[adjncy[j]]) 
+        ed += graph->adjwgt[j];
+      else
+        id += graph->adjwgt[j];
+    }
+    if (ed - id >= 0 && xadj[i] < xadj[i+1]) {
+      nbnd++;
+      ASSERTP(bndptr[i] != -1, ("%d %d %d\n", i, id, ed));
+      ASSERT(bndind[bndptr[i]] == i);
+    }
+  }
+
+  ASSERTP(nbnd == graph->nbnd, ("%d %d\n", nbnd, graph->nbnd));
+
+  return 1;
+}
+
+/*************************************************************************
+* This function checks whether or not the boundary information is correct
+**************************************************************************/
+int CheckNodeBnd(GraphType *graph, int onbnd) 
+{
+  int i, j, nvtxs, nbnd;
+  idxtype *xadj, *adjncy, *where, *bndptr, *bndind;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  where = graph->where;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  for (nbnd=0, i=0; i<nvtxs; i++) {
+    if (where[i] == 2) 
+      nbnd++;   
+  }
+
+  ASSERTP(nbnd == onbnd, ("%d %d\n", nbnd, onbnd));
+
+  for (i=0; i<nvtxs; i++) {
+    if (where[i] != 2) {
+      ASSERTP(bndptr[i] == -1, ("%d %d\n", i, bndptr[i]));
+    }
+    else {
+      ASSERTP(bndptr[i] != -1, ("%d %d\n", i, bndptr[i]));
+    }
+  }
+
+  return 1;
+}
+
+
+
+/*************************************************************************
+* This function checks whether or not the rinfo of a vertex is consistent
+**************************************************************************/
+int CheckRInfo(RInfoType *rinfo)
+{
+  int i, j;
+
+  for (i=0; i<rinfo->ndegrees; i++) {
+    for (j=i+1; j<rinfo->ndegrees; j++)
+      ASSERTP(rinfo->edegrees[i].pid != rinfo->edegrees[j].pid, ("%d %d %d %d\n", i, j, rinfo->edegrees[i].pid, rinfo->edegrees[j].pid));
+  }
+
+  return 1;
+}
+
+
+
+/*************************************************************************
+* This function checks the correctness of the NodeFM data structures
+**************************************************************************/
+int CheckNodePartitionParams(GraphType *graph)
+{
+  int i, j, k, l, nvtxs, me, other;
+  idxtype *xadj, *adjncy, *adjwgt, *vwgt, *where;
+  idxtype edegrees[2], pwgts[3];
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+
+  /*------------------------------------------------------------
+  / Compute now the separator external degrees
+  /------------------------------------------------------------*/
+  pwgts[0] = pwgts[1] = pwgts[2] = 0;
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+    pwgts[me] += vwgt[i];
+
+    if (me == 2) { /* If it is on the separator do some computations */
+      edegrees[0] = edegrees[1] = 0;
+
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        other = where[adjncy[j]];
+        if (other != 2)
+          edegrees[other] += vwgt[adjncy[j]];
+      }
+      if (edegrees[0] != graph->nrinfo[i].edegrees[0] || edegrees[1] != graph->nrinfo[i].edegrees[1]) {
+        printf("Something wrong with edegrees: %d %d %d %d %d\n", i, edegrees[0], edegrees[1], graph->nrinfo[i].edegrees[0], graph->nrinfo[i].edegrees[1]);
+        return 0;
+      }
+    }
+  }
+
+  if (pwgts[0] != graph->pwgts[0] || pwgts[1] != graph->pwgts[1] || pwgts[2] != graph->pwgts[2])
+    printf("Something wrong with part-weights: %d %d %d %d %d %d\n", pwgts[0], pwgts[1], pwgts[2], graph->pwgts[0], graph->pwgts[1], graph->pwgts[2]);
+
+  return 1;
+}
+
+
+/*************************************************************************
+* This function checks if the separator is indeed a separator
+**************************************************************************/
+int IsSeparable(GraphType *graph)
+{
+  int i, j, nvtxs, other;
+  idxtype *xadj, *adjncy, *where;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  where = graph->where;
+
+  for (i=0; i<nvtxs; i++) {
+    if (where[i] == 2)
+      continue;
+    other = (where[i]+1)%2;
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      ASSERTP(where[adjncy[j]] != other, ("%d %d %d %d %d %d\n", i, where[i], adjncy[j], where[adjncy[j]], xadj[i+1]-xadj[i], xadj[adjncy[j]+1]-xadj[adjncy[j]]));
+    }
+  }
+
+  return 1;
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/defs.h
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/defs.h	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/defs.h	(revision 9501)
@@ -0,0 +1,161 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * defs.h
+ *
+ * This file contains constant definitions
+ *
+ * Started 8/27/94
+ * George
+ *
+ * $Id: defs.h,v 1.1 1998/11/27 17:59:13 karypis Exp $
+ *
+ */
+
+#define METISTITLE              "  METIS 4.0.1 Copyright 1998, Regents of the University of Minnesota\n\n"
+#define MAXLINE			1280000
+
+#define LTERM			(void **) 0	/* List terminator for GKfree() */
+
+#define MAXNCON			16		/* The maximum number of constrains */
+#define MAXNOBJ			16		/* The maximum number of objectives */
+
+#define PLUS_GAINSPAN   	500             /* Parameters for FM buckets */
+#define NEG_GAINSPAN    	500
+
+#define HTLENGTH		((1<<11)-1)
+
+/* Meaning of various options[] parameters */
+#define OPTION_PTYPE		0
+#define OPTION_CTYPE		1
+#define OPTION_ITYPE		2
+#define OPTION_RTYPE		3
+#define OPTION_DBGLVL		4
+#define OPTION_OFLAGS		5
+#define OPTION_PFACTOR		6
+#define OPTION_NSEPS		7
+
+#define OFLAG_COMPRESS		1	/* Try to compress the graph */
+#define OFLAG_CCMP		2	/* Find and order connected components */
+
+
+/* Default options for PMETIS */
+#define PMETIS_CTYPE		MATCH_SHEM
+#define PMETIS_ITYPE		IPART_GGPKL
+#define PMETIS_RTYPE		RTYPE_FM
+#define PMETIS_DBGLVL		0
+
+/* Default options for KMETIS */
+#define KMETIS_CTYPE		MATCH_SHEM
+#define KMETIS_ITYPE		IPART_PMETIS
+#define KMETIS_RTYPE		RTYPE_KWAYRANDOM_MCONN
+#define KMETIS_DBGLVL		0
+
+/* Default options for OEMETIS */
+#define OEMETIS_CTYPE		MATCH_SHEM
+#define OEMETIS_ITYPE		IPART_GGPKL
+#define OEMETIS_RTYPE		RTYPE_FM
+#define OEMETIS_DBGLVL		0
+
+/* Default options for ONMETIS */
+#define ONMETIS_CTYPE		MATCH_SHEM
+#define ONMETIS_ITYPE		IPART_GGPKL
+#define ONMETIS_RTYPE		RTYPE_SEP1SIDED
+#define ONMETIS_DBGLVL		0
+#define ONMETIS_OFLAGS		OFLAG_COMPRESS
+#define ONMETIS_PFACTOR		-1
+#define ONMETIS_NSEPS		1
+
+/* Default options for McPMETIS */
+#define McPMETIS_CTYPE		MATCH_SHEBM_ONENORM
+#define McPMETIS_ITYPE		IPART_RANDOM
+#define McPMETIS_RTYPE		RTYPE_FM
+#define McPMETIS_DBGLVL		0
+
+/* Default options for McKMETIS */
+#define McKMETIS_CTYPE		MATCH_SHEBM_ONENORM
+#define McKMETIS_ITYPE		IPART_McHPMETIS
+#define McKMETIS_RTYPE		RTYPE_KWAYRANDOM
+#define McKMETIS_DBGLVL		0
+
+/* Default options for KVMETIS */
+#define KVMETIS_CTYPE		MATCH_SHEM
+#define KVMETIS_ITYPE		IPART_PMETIS
+#define KVMETIS_RTYPE		RTYPE_KWAYRANDOM
+#define KVMETIS_DBGLVL		0
+
+
+/* Operations supported by stand-alone code */
+#define OP_PMETIS		1
+#define OP_KMETIS		2
+#define OP_OEMETIS		3
+#define OP_ONMETIS		4
+#define OP_ONWMETIS		5
+#define OP_KVMETIS		6
+
+
+/* Matching Schemes */
+#define MATCH_RM		1
+#define MATCH_HEM		2
+#define MATCH_SHEM		3
+#define MATCH_SHEMKWAY		4
+#define MATCH_SHEBM_ONENORM	5
+#define MATCH_SHEBM_INFNORM	6
+#define MATCH_SBHEM_ONENORM	7
+#define MATCH_SBHEM_INFNORM	8
+
+/* Initial partitioning schemes for PMETIS and ONMETIS */
+#define IPART_GGPKL		1
+#define IPART_GGPKLNODE		2
+#define IPART_RANDOM		2
+
+/* Refinement schemes for PMETIS */
+#define RTYPE_FM		1
+
+/* Initial partitioning schemes for KMETIS */
+#define IPART_PMETIS		1
+
+/* Refinement schemes for KMETIS */
+#define RTYPE_KWAYRANDOM	1
+#define RTYPE_KWAYGREEDY	2
+#define RTYPE_KWAYRANDOM_MCONN	3
+
+/* Refinement schemes for ONMETIS */
+#define RTYPE_SEP2SIDED		1
+#define RTYPE_SEP1SIDED		2
+
+/* Initial Partitioning Schemes for McKMETIS */
+#define IPART_McPMETIS		1   	/* Simple McPMETIS */
+#define IPART_McHPMETIS		2	/* horizontally relaxed McPMETIS */
+
+#define UNMATCHED		-1
+
+#define HTABLE_EMPTY    	-1
+
+#define NGR_PASSES		4	/* Number of greedy refinement passes */
+#define NLGR_PASSES		5	/* Number of GR refinement during IPartition */
+
+#define LARGENIPARTS		8	/* Number of random initial partitions */
+#define SMALLNIPARTS		3	/* Number of random initial partitions */
+
+#define COARSEN_FRACTION	0.75	/* Node reduction between succesive coarsening levels */
+#define COARSEN_FRACTION2	0.90	/* Node reduction between succesive coarsening levels */
+#define UNBALANCE_FRACTION		1.05
+
+#define COMPRESSION_FRACTION		0.85
+
+#define ORDER_UNBALANCE_FRACTION	1.10
+
+#define MMDSWITCH		200
+
+#define HORIZONTAL_IMBALANCE		1.05
+
+/* Debug Levels */
+#define DBG_TIME	1		/* Perform timing analysis */
+#define DBG_OUTPUT	2
+#define DBG_COARSEN   	4		/* Show the coarsening progress */
+#define DBG_REFINE	8		/* Show info on communication during folding */
+#define DBG_IPART	16		/* Show info on initial partition */
+#define DBG_MOVEINFO	32		/* Show info on communication during folding */
+#define DBG_KWAYPINFO	64		/* Show info on communication during folding */
+#define DBG_SEPINFO	128		/* Show info on communication during folding */
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/estmem.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/estmem.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/estmem.c	(revision 9501)
@@ -0,0 +1,157 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * estmem.c
+ *
+ * This file contains code for estimating the amount of memory required by
+ * the various routines in METIS
+ *
+ * Started 11/4/97
+ * George
+ *
+ * $Id: estmem.c,v 1.1 1998/11/27 17:59:13 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function computes how much memory will be required by the various
+* routines in METIS
+**************************************************************************/
+void METIS_EstimateMemory(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *optype, int *nbytes)
+{
+  int i, j, k, nedges, nlevels;
+  float vfraction, efraction, vmult, emult;
+  int coresize, gdata, rdata;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  nedges = xadj[*nvtxs];
+
+  InitRandom(-1);
+  EstimateCFraction(*nvtxs, xadj, adjncy, &vfraction, &efraction);
+
+  /* Estimate the amount of memory for coresize */
+  if (*optype == 2) 
+    coresize = nedges;
+  else
+    coresize = 0;
+  coresize += nedges + 11*(*nvtxs) + 4*1024 + 2*(NEG_GAINSPAN+PLUS_GAINSPAN+1)*(sizeof(ListNodeType *)/sizeof(idxtype));
+  coresize += 2*(*nvtxs);  /* add some more fore other vectors */
+
+  gdata = nedges;   /* Assume that the user does not pass weights */
+
+  nlevels = (int)(log(100.0/(*nvtxs))/log(vfraction) + .5);
+  vmult = 0.5 + (1.0 - pow(vfraction, nlevels))/(1.0 - vfraction);
+  emult = 1.0 + (1.0 - pow(efraction, nlevels+1))/(1.0 - efraction);
+
+  gdata += vmult*4*(*nvtxs) + emult*2*nedges;
+  if ((vmult-1.0)*4*(*nvtxs) + (emult-1.0)*2*nedges < 5*(*nvtxs))
+    rdata = 0;
+  else
+    rdata = 5*(*nvtxs);
+
+  *nbytes = sizeof(idxtype)*(coresize+gdata+rdata+(*nvtxs));
+
+  if (*numflag == 1)
+    Change2FNumbering2(*nvtxs, xadj, adjncy);
+}
+  
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void EstimateCFraction(int nvtxs, idxtype *xadj, idxtype *adjncy, float *vfraction, float *efraction)
+{
+  int i, ii, j, cnvtxs, cnedges, maxidx;
+  idxtype *match, *cmap, *perm;
+
+  cmap = idxmalloc(nvtxs, "cmap");
+  match = idxsmalloc(nvtxs, UNMATCHED, "match");
+  perm = idxmalloc(nvtxs, "perm");
+  RandomPermute(nvtxs, perm, 1);
+
+  cnvtxs = 0;
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+
+      /* Find a random matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        if (match[adjncy[j]] == UNMATCHED) {
+          maxidx = adjncy[j];
+          break;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  cnedges = ComputeCoarseGraphSize(nvtxs, xadj, adjncy, cnvtxs, cmap, match, perm);
+
+  *vfraction = (1.0*cnvtxs)/(1.0*nvtxs);
+  *efraction = (1.0*cnedges)/(1.0*xadj[nvtxs]);
+
+  GKfree(&cmap, &match, &perm, LTERM);
+}
+
+
+
+
+/*************************************************************************
+* This function computes the size of the coarse graph
+**************************************************************************/
+int ComputeCoarseGraphSize(int nvtxs, idxtype *xadj, idxtype *adjncy, int cnvtxs, idxtype *cmap, idxtype *match, idxtype *perm)
+{
+  int i, j, k, istart, iend, nedges, cnedges, v, u;
+  idxtype *htable;
+
+  htable = idxsmalloc(cnvtxs, -1, "htable");
+
+  cnvtxs = cnedges = 0;
+  for (i=0; i<nvtxs; i++) {
+    v = perm[i];
+    if (cmap[v] != cnvtxs) 
+      continue;
+
+    htable[cnvtxs] = cnvtxs;
+
+    u = match[v];
+
+    istart = xadj[v];
+    iend = xadj[v+1];
+    for (j=istart; j<iend; j++) {
+      k = cmap[adjncy[j]];
+      if (htable[k] != cnvtxs) {
+        htable[k] = cnvtxs;
+        cnedges++;
+      }
+    }
+
+    if (v != u) { 
+      istart = xadj[u];
+      iend = xadj[u+1];
+      for (j=istart; j<iend; j++) {
+        k = cmap[adjncy[j]];
+        if (htable[k] != cnvtxs) {
+          htable[k] = cnvtxs;
+          cnedges++;
+        }
+      }
+    }
+    cnvtxs++;
+  }
+
+  GKfree(&htable, LTERM);
+
+  return cnedges;
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/fm.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/fm.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/fm.c	(revision 9501)
@@ -0,0 +1,194 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * fm.c
+ *
+ * This file contains code that implements the edge-based FM refinement
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: fm.c,v 1.1 1998/11/27 17:59:14 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function performs an edge-based FM refinement
+**************************************************************************/
+void FM_2WayEdgeRefine(CtrlType *ctrl, GraphType *graph, int *tpwgts, int npasses)
+{
+  int i, ii, j, k, kwgt, nvtxs, nbnd, nswaps, from, to, pass, me, limit, tmp;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind, *pwgts;
+  idxtype *moved, *swaps, *perm;
+  PQueueType parts[2];
+  int higain, oldgain, mincut, mindiff, origdiff, initcut, newcut, mincutorder, avgvwgt;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  pwgts = graph->pwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  limit = amin(amax(0.01*nvtxs, 15), 100);
+  avgvwgt = amin((pwgts[0]+pwgts[1])/20, 2*(pwgts[0]+pwgts[1])/nvtxs);
+
+  tmp = graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)];
+  PQueueInit(ctrl, &parts[0], nvtxs, tmp);
+  PQueueInit(ctrl, &parts[1], nvtxs, tmp);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE, 
+     printf("Partitions: [%6d %6d] T[%6d %6d], Nv-Nb[%6d %6d]. ICut: %6d\n",
+             pwgts[0], pwgts[1], tpwgts[0], tpwgts[1], graph->nvtxs, graph->nbnd, graph->mincut));
+
+  origdiff = abs(tpwgts[0]-pwgts[0]);
+  idxset(nvtxs, -1, moved);
+  for (pass=0; pass<npasses; pass++) { /* Do a number of passes */
+    PQueueReset(&parts[0]);
+    PQueueReset(&parts[1]);
+
+    mincutorder = -1;
+    newcut = mincut = initcut = graph->mincut;
+    mindiff = abs(tpwgts[0]-pwgts[0]);
+
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+    ASSERT(CheckBnd(graph));
+
+    /* Insert boundary nodes in the priority queues */
+    nbnd = graph->nbnd;
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = perm[ii];
+      ASSERT(ed[bndind[i]] > 0 || id[bndind[i]] == 0);
+      ASSERT(bndptr[bndind[i]] != -1);
+      PQueueInsert(&parts[where[bndind[i]]], bndind[i], ed[bndind[i]]-id[bndind[i]]);
+    }
+
+    for (nswaps=0; nswaps<nvtxs; nswaps++) {
+      from = (tpwgts[0]-pwgts[0] < tpwgts[1]-pwgts[1] ? 0 : 1);
+      to = (from+1)%2;
+
+      if ((higain = PQueueGetMax(&parts[from])) == -1)
+        break;
+      ASSERT(bndptr[higain] != -1);
+
+      newcut -= (ed[higain]-id[higain]);
+      INC_DEC(pwgts[to], pwgts[from], vwgt[higain]);
+
+      if ((newcut < mincut && abs(tpwgts[0]-pwgts[0]) <= origdiff+avgvwgt) || 
+          (newcut == mincut && abs(tpwgts[0]-pwgts[0]) < mindiff)) {
+        mincut = newcut;
+        mindiff = abs(tpwgts[0]-pwgts[0]);
+        mincutorder = nswaps;
+      }
+      else if (nswaps-mincutorder > limit) { /* We hit the limit, undo last move */
+        newcut += (ed[higain]-id[higain]);
+        INC_DEC(pwgts[from], pwgts[to], vwgt[higain]);
+        break;
+      }
+
+      where[higain] = to;
+      moved[higain] = nswaps;
+      swaps[nswaps] = higain;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO, 
+        printf("Moved %6d from %d. [%3d %3d] %5d [%4d %4d]\n", higain, from, ed[higain]-id[higain], vwgt[higain], newcut, pwgts[0], pwgts[1]));
+
+      /**************************************************************
+      * Update the id[i]/ed[i] values of the affected nodes
+      ***************************************************************/
+      SWAP(id[higain], ed[higain], tmp);
+      if (ed[higain] == 0 && xadj[higain] < xadj[higain+1]) 
+        BNDDelete(nbnd, bndind,  bndptr, higain);
+
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        oldgain = ed[k]-id[k];
+
+        kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+        INC_DEC(id[k], ed[k], kwgt);
+
+        /* Update its boundary information and queue position */
+        if (bndptr[k] != -1) { /* If k was a boundary vertex */
+          if (ed[k] == 0) { /* Not a boundary vertex any more */
+            BNDDelete(nbnd, bndind, bndptr, k);
+            if (moved[k] == -1)  /* Remove it if in the queues */
+              PQueueDelete(&parts[where[k]], k, oldgain);
+          }
+          else { /* If it has not been moved, update its position in the queue */
+            if (moved[k] == -1)
+              PQueueUpdate(&parts[where[k]], k, oldgain, ed[k]-id[k]);
+          }
+        }
+        else {
+          if (ed[k] > 0) {  /* It will now become a boundary vertex */
+            BNDInsert(nbnd, bndind, bndptr, k);
+            if (moved[k] == -1) 
+              PQueueInsert(&parts[where[k]], k, ed[k]-id[k]);
+          }
+        }
+      }
+
+    }
+
+
+    /****************************************************************
+    * Roll back computations
+    *****************************************************************/
+    for (i=0; i<nswaps; i++)
+      moved[swaps[i]] = -1;  /* reset moved array */
+    for (nswaps--; nswaps>mincutorder; nswaps--) {
+      higain = swaps[nswaps];
+
+      to = where[higain] = (where[higain]+1)%2;
+      SWAP(id[higain], ed[higain], tmp);
+      if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1])
+        BNDDelete(nbnd, bndind,  bndptr, higain);
+      else if (ed[higain] > 0 && bndptr[higain] == -1)
+        BNDInsert(nbnd, bndind,  bndptr, higain);
+
+      INC_DEC(pwgts[to], pwgts[(to+1)%2], vwgt[higain]);
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+
+        kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+        INC_DEC(id[k], ed[k], kwgt);
+
+        if (bndptr[k] != -1 && ed[k] == 0)
+          BNDDelete(nbnd, bndind, bndptr, k);
+        if (bndptr[k] == -1 && ed[k] > 0)
+          BNDInsert(nbnd, bndind, bndptr, k);
+      }
+    }
+
+    IFSET(ctrl->dbglvl, DBG_REFINE, 
+      printf("\tMinimum cut: %6d at %5d, PWGTS: [%6d %6d], NBND: %6d\n", mincut, mincutorder, pwgts[0], pwgts[1], nbnd));
+
+    graph->mincut = mincut;
+    graph->nbnd = nbnd;
+
+    if (mincutorder == -1 || mincut == initcut)
+      break;
+  }
+
+  PQueueFree(ctrl, &parts[0]);
+  PQueueFree(ctrl, &parts[1]);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/fortran.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/fortran.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/fortran.c	(revision 9501)
@@ -0,0 +1,141 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * fortran.c
+ *
+ * This file contains code for the fortran to C interface
+ *
+ * Started 8/19/97
+ * George
+ *
+ * $Id: fortran.c,v 1.1 1998/11/27 17:59:14 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function changes the numbering to start from 0 instead of 1
+**************************************************************************/
+void Change2CNumbering(int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i, nedges;
+
+  for (i=0; i<=nvtxs; i++)
+    xadj[i]--;
+
+  nedges = xadj[nvtxs];
+  for (i=0; i<nedges; i++)
+    adjncy[i]--;
+}
+
+/*************************************************************************
+* This function changes the numbering to start from 1 instead of 0
+**************************************************************************/
+void Change2FNumbering(int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vector)
+{
+  int i, nedges;
+
+  for (i=0; i<nvtxs; i++)
+    vector[i]++;
+
+  nedges = xadj[nvtxs];
+  for (i=0; i<nedges; i++)
+    adjncy[i]++;
+
+  for (i=0; i<=nvtxs; i++)
+    xadj[i]++;
+}
+
+/*************************************************************************
+* This function changes the numbering to start from 1 instead of 0
+**************************************************************************/
+void Change2FNumbering2(int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i, nedges;
+
+  nedges = xadj[nvtxs];
+  for (i=0; i<nedges; i++)
+    adjncy[i]++;
+
+  for (i=0; i<=nvtxs; i++)
+    xadj[i]++;
+}
+
+
+
+/*************************************************************************
+* This function changes the numbering to start from 1 instead of 0
+**************************************************************************/
+void Change2FNumberingOrder(int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *v1, idxtype *v2)
+{
+  int i, nedges;
+
+  for (i=0; i<nvtxs; i++) {
+    v1[i]++;
+    v2[i]++;
+  }
+
+  nedges = xadj[nvtxs];
+  for (i=0; i<nedges; i++)
+    adjncy[i]++;
+
+  for (i=0; i<=nvtxs; i++)
+    xadj[i]++;
+
+}
+
+
+
+/*************************************************************************
+* This function changes the numbering to start from 0 instead of 1
+**************************************************************************/
+void ChangeMesh2CNumbering(int n, idxtype *mesh)
+{
+  int i;
+
+  for (i=0; i<n; i++)
+    mesh[i]--;
+
+}
+
+
+/*************************************************************************
+* This function changes the numbering to start from 1 instead of 0
+**************************************************************************/
+void ChangeMesh2FNumbering(int n, idxtype *mesh, int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i, nedges;
+
+  for (i=0; i<n; i++)
+    mesh[i]++;
+
+  nedges = xadj[nvtxs];
+  for (i=0; i<nedges; i++)
+    adjncy[i]++;
+
+  for (i=0; i<=nvtxs; i++)
+    xadj[i]++;
+
+}
+
+
+/*************************************************************************
+* This function changes the numbering to start from 1 instead of 0
+**************************************************************************/
+void ChangeMesh2FNumbering2(int n, idxtype *mesh, int ne, int nn, idxtype *epart, idxtype *npart)
+{
+  int i, nedges;
+
+  for (i=0; i<n; i++)
+    mesh[i]++;
+
+  for (i=0; i<ne; i++)
+    epart[i]++;
+
+  for (i=0; i<nn; i++)
+    npart[i]++;
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/frename.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/frename.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/frename.c	(revision 9501)
@@ -0,0 +1,312 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * frename.c
+ * 
+ * This file contains some renaming routines to deal with different Fortran compilers
+ *
+ * Started 9/15/97
+ * George
+ *
+ * $Id: frename.c,v 1.1 1998/11/27 17:59:14 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+void METIS_PARTGRAPHRECURSIVE(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_PartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+void metis_partgraphrecursive(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{ 
+  METIS_PartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part); 
+}
+void metis_partgraphrecursive_(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_PartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+void metis_partgraphrecursive__(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_PartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+
+
+void METIS_WPARTGRAPHRECURSIVE(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_WPartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, tpwgts, options, edgecut, part);
+}
+void metis_wpartgraphrecursive(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_WPartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, tpwgts, options, edgecut, part);
+}
+void metis_wpartgraphrecursive_(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_WPartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, tpwgts, options, edgecut, part);
+}
+void metis_wpartgraphrecursive__(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_WPartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, tpwgts, options, edgecut, part);
+}
+
+
+
+void METIS_PARTGRAPHKWAY(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_PartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+void metis_partgraphkway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_PartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+void metis_partgraphkway_(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_PartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+void metis_partgraphkway__(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_PartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+
+
+
+void METIS_WPARTGRAPHKWAY(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_WPartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, tpwgts, options, edgecut, part);
+}
+void metis_wpartgraphkway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_WPartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, tpwgts, options, edgecut, part);
+}
+void metis_wpartgraphkway_(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_WPartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, tpwgts, options, edgecut, part);
+}
+void metis_wpartgraphkway__(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_WPartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, tpwgts, options, edgecut, part);
+}
+
+
+
+void METIS_EDGEND(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_EdgeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm);
+}
+void metis_edgend(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_EdgeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm);
+}
+void metis_edgend_(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_EdgeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm);
+}
+void metis_edgend__(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_EdgeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm);
+}
+
+
+
+void METIS_NODEND(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm);
+}
+void metis_nodend(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm);
+}
+void metis_nodend_(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm);
+}
+void metis_nodend__(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_NodeND(nvtxs, xadj, adjncy, numflag, options, perm, iperm);
+}
+
+
+
+void METIS_NODEWND(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_NodeWND(nvtxs, xadj, adjncy, vwgt, numflag, options, perm, iperm);
+}
+void metis_nodewnd(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_NodeWND(nvtxs, xadj, adjncy, vwgt, numflag, options, perm, iperm);
+}
+void metis_nodewnd_(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_NodeWND(nvtxs, xadj, adjncy, vwgt, numflag, options, perm, iperm);
+}
+void metis_nodewnd__(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, int *numflag, int *options, idxtype *perm, idxtype *iperm)
+{
+  METIS_NodeWND(nvtxs, xadj, adjncy, vwgt, numflag, options, perm, iperm);
+}
+
+
+
+void METIS_PARTMESHNODAL(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  METIS_PartMeshNodal(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
+void metis_partmeshnodal(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  METIS_PartMeshNodal(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
+void metis_partmeshnodal_(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  METIS_PartMeshNodal(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
+void metis_partmeshnodal__(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  METIS_PartMeshNodal(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
+
+
+void METIS_PARTMESHDUAL(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  METIS_PartMeshDual(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
+void metis_partmeshdual(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  METIS_PartMeshDual(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
+void metis_partmeshdual_(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  METIS_PartMeshDual(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
+void metis_partmeshdual__(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  METIS_PartMeshDual(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
+
+
+void METIS_MESHTONODAL(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, idxtype *dxadj, idxtype *dadjncy)
+{
+  METIS_MeshToNodal(ne, nn, elmnts, etype, numflag, dxadj, dadjncy);
+}
+void metis_meshtonodal(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, idxtype *dxadj, idxtype *dadjncy)
+{
+  METIS_MeshToNodal(ne, nn, elmnts, etype, numflag, dxadj, dadjncy);
+}
+void metis_meshtonodal_(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, idxtype *dxadj, idxtype *dadjncy)
+{
+  METIS_MeshToNodal(ne, nn, elmnts, etype, numflag, dxadj, dadjncy);
+}
+void metis_meshtonodal__(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, idxtype *dxadj, idxtype *dadjncy)
+{
+  METIS_MeshToNodal(ne, nn, elmnts, etype, numflag, dxadj, dadjncy);
+}
+
+
+void METIS_MESHTODUAL(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, idxtype *dxadj, idxtype *dadjncy)
+{
+  METIS_MeshToDual(ne, nn, elmnts, etype, numflag, dxadj, dadjncy);
+}
+void metis_meshtodual(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, idxtype *dxadj, idxtype *dadjncy)
+{
+  METIS_MeshToDual(ne, nn, elmnts, etype, numflag, dxadj, dadjncy);
+}
+void metis_meshtodual_(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, idxtype *dxadj, idxtype *dadjncy)
+{
+  METIS_MeshToDual(ne, nn, elmnts, etype, numflag, dxadj, dadjncy);
+}
+void metis_meshtodual__(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, idxtype *dxadj, idxtype *dadjncy)
+{
+  METIS_MeshToDual(ne, nn, elmnts, etype, numflag, dxadj, dadjncy);
+}
+
+
+void METIS_ESTIMATEMEMORY(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *optype, int *nbytes)
+{
+  METIS_EstimateMemory(nvtxs, xadj, adjncy, numflag, optype, nbytes);
+}
+void metis_estimatememory(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *optype, int *nbytes)
+{
+  METIS_EstimateMemory(nvtxs, xadj, adjncy, numflag, optype, nbytes);
+}
+void metis_estimatememory_(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *optype, int *nbytes)
+{
+  METIS_EstimateMemory(nvtxs, xadj, adjncy, numflag, optype, nbytes);
+}
+void metis_estimatememory__(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *optype, int *nbytes)
+{
+  METIS_EstimateMemory(nvtxs, xadj, adjncy, numflag, optype, nbytes);
+}
+
+
+
+void METIS_MCPARTGRAPHRECURSIVE(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_mCPartGraphRecursive(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+void metis_mcpartgraphrecursive(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_mCPartGraphRecursive(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+void metis_mcpartgraphrecursive_(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_mCPartGraphRecursive(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+void metis_mcpartgraphrecursive__(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  METIS_mCPartGraphRecursive(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, options, edgecut, part);
+}
+
+
+void METIS_MCPARTGRAPHKWAY(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *rubvec, int *options, int *edgecut, idxtype *part)
+{
+  METIS_mCPartGraphKway(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, rubvec, options, edgecut, part);
+}
+void metis_mcpartgraphkway(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *rubvec, int *options, int *edgecut, idxtype *part)
+{
+  METIS_mCPartGraphKway(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, rubvec, options, edgecut, part);
+}
+void metis_mcpartgraphkway_(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *rubvec, int *options, int *edgecut, idxtype *part)
+{
+  METIS_mCPartGraphKway(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, rubvec, options, edgecut, part);
+}
+void metis_mcpartgraphkway__(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, float *rubvec, int *options, int *edgecut, idxtype *part)
+{
+  METIS_mCPartGraphKway(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, rubvec, options, edgecut, part);
+}
+
+
+void METIS_PARTGRAPHVKWAY(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int *wgtflag, int *numflag, int *nparts, int *options, int *volume, idxtype *part)
+{
+  METIS_PartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, options, volume, part);
+}
+void metis_partgraphvkway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int *wgtflag, int *numflag, int *nparts, int *options, int *volume, idxtype *part)
+{
+  METIS_PartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, options, volume, part);
+}
+void metis_partgraphvkway_(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int *wgtflag, int *numflag, int *nparts, int *options, int *volume, idxtype *part)
+{
+  METIS_PartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, options, volume, part);
+}
+void metis_partgraphvkway__(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int *wgtflag, int *numflag, int *nparts, int *options, int *volume, idxtype *part)
+{
+  METIS_PartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, options, volume, part);
+}
+
+void METIS_WPARTGRAPHVKWAY(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *volume, idxtype *part)
+{
+  METIS_WPartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, tpwgts, options, volume, part);
+}
+void metis_wpartgraphvkway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *volume, idxtype *part)
+{
+  METIS_WPartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, tpwgts, options, volume, part);
+}
+void metis_wpartgraphvkway_(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *volume, idxtype *part)
+{
+  METIS_WPartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, tpwgts, options, volume, part);
+}
+void metis_wpartgraphvkway__(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int *wgtflag, int *numflag, int *nparts, float *tpwgts, int *options, int *volume, idxtype *part)
+{
+  METIS_WPartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, tpwgts, options, volume, part);
+}
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/graph.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/graph.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/graph.c	(revision 9501)
@@ -0,0 +1,616 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * graph.c
+ *
+ * This file contains functions that deal with setting up the graphs
+ * for METIS.
+ *
+ * Started 7/25/97
+ * George
+ *
+ * $Id: graph.c,v 1.1 1998/11/27 17:59:15 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function sets up the graph from the user input
+**************************************************************************/
+void SetUpGraph(GraphType *graph, int OpType, int nvtxs, int ncon,
+       idxtype *xadj, idxtype *adjncy, idxtype *vwgt, idxtype *adjwgt, int wgtflag)
+{
+  int i, j, k, sum, gsize;
+  float *nvwgt;
+  idxtype tvwgt[MAXNCON];
+
+  if (OpType == OP_KMETIS && ncon == 1 && (wgtflag&2) == 0 && (wgtflag&1) == 0) {
+    SetUpGraphKway(graph, nvtxs, xadj, adjncy);
+    return;
+  }
+
+  InitGraph(graph);
+
+  graph->nvtxs = nvtxs;
+  graph->nedges = xadj[nvtxs];
+  graph->ncon = ncon;
+  graph->xadj = xadj;
+  graph->adjncy = adjncy;
+
+  if (ncon == 1) { /* We are in the non mC mode */
+    gsize = 0; 
+    if ((wgtflag&2) == 0)
+      gsize += nvtxs;
+    if ((wgtflag&1) == 0)
+      gsize += graph->nedges;
+
+    gsize += 2*nvtxs;
+
+    graph->gdata = idxmalloc(gsize, "SetUpGraph: gdata");
+
+    /* Create the vertex/edge weight vectors if they are not supplied */
+    gsize = 0;
+    if ((wgtflag&2) == 0) {
+      vwgt = graph->vwgt = idxset(nvtxs, 1, graph->gdata);
+      gsize += nvtxs;
+    }
+    else
+      graph->vwgt = vwgt;
+
+    if ((wgtflag&1) == 0) {
+      adjwgt = graph->adjwgt = idxset(graph->nedges, 1, graph->gdata+gsize);
+      gsize += graph->nedges;
+    }
+    else
+      graph->adjwgt = adjwgt;
+
+
+    /* Compute the initial values of the adjwgtsum */
+    graph->adjwgtsum = graph->gdata + gsize;
+    gsize += nvtxs;
+
+    for (i=0; i<nvtxs; i++) {
+      sum = 0;
+      for (j=xadj[i]; j<xadj[i+1]; j++)
+        sum += adjwgt[j];
+      graph->adjwgtsum[i] = sum;
+    }
+
+    graph->cmap = graph->gdata + gsize;
+    gsize += nvtxs;
+
+  }
+  else {  /* Set up the graph in MOC mode */
+    gsize = 0; 
+    if ((wgtflag&1) == 0)
+      gsize += graph->nedges;
+
+    gsize += 2*nvtxs;
+
+    graph->gdata = idxmalloc(gsize, "SetUpGraph: gdata");
+    gsize = 0;
+
+    for (i=0; i<ncon; i++) 
+      tvwgt[i] = idxsum_strd(nvtxs, vwgt+i, ncon);
+    
+    nvwgt = graph->nvwgt = fmalloc(ncon*nvtxs, "SetUpGraph: nvwgt");
+
+    for (i=0; i<nvtxs; i++) {
+      for (j=0; j<ncon; j++) 
+        nvwgt[i*ncon+j] = (1.0*vwgt[i*ncon+j])/(1.0*tvwgt[j]);
+    }
+
+
+    /* Create the edge weight vectors if they are not supplied */
+    if ((wgtflag&1) == 0) {
+      adjwgt = graph->adjwgt = idxset(graph->nedges, 1, graph->gdata+gsize);
+      gsize += graph->nedges;
+    }
+    else
+      graph->adjwgt = adjwgt;
+
+    /* Compute the initial values of the adjwgtsum */
+    graph->adjwgtsum = graph->gdata + gsize;
+    gsize += nvtxs;
+
+    for (i=0; i<nvtxs; i++) {
+      sum = 0;
+      for (j=xadj[i]; j<xadj[i+1]; j++)
+        sum += adjwgt[j];
+      graph->adjwgtsum[i] = sum;
+    }
+
+    graph->cmap = graph->gdata + gsize;
+    gsize += nvtxs;
+
+  }
+
+  if (OpType != OP_KMETIS && OpType != OP_KVMETIS) {
+    graph->label = idxmalloc(nvtxs, "SetUpGraph: label");
+
+    for (i=0; i<nvtxs; i++)
+      graph->label[i] = i;
+  }
+
+}
+
+
+/*************************************************************************
+* This function sets up the graph from the user input
+**************************************************************************/
+void SetUpGraphKway(GraphType *graph, int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i;
+
+  InitGraph(graph);
+
+  graph->nvtxs = nvtxs;
+  graph->nedges = xadj[nvtxs];
+  graph->ncon = 1;
+  graph->xadj = xadj;
+  graph->vwgt = NULL;
+  graph->adjncy = adjncy;
+  graph->adjwgt = NULL;
+
+  graph->gdata = idxmalloc(2*nvtxs, "SetUpGraph: gdata");
+  graph->adjwgtsum = graph->gdata;
+  graph->cmap = graph->gdata + nvtxs;
+
+  /* Compute the initial values of the adjwgtsum */
+  for (i=0; i<nvtxs; i++) 
+    graph->adjwgtsum[i] = xadj[i+1]-xadj[i];
+
+}
+
+
+
+/*************************************************************************
+* This function sets up the graph from the user input
+**************************************************************************/
+void SetUpGraph2(GraphType *graph, int nvtxs, int ncon, idxtype *xadj, 
+       idxtype *adjncy, float *nvwgt, idxtype *adjwgt)
+{
+  int i, j, sum;
+
+  InitGraph(graph);
+
+  graph->nvtxs = nvtxs;
+  graph->nedges = xadj[nvtxs];
+  graph->ncon = ncon;
+  graph->xadj = xadj;
+  graph->adjncy = adjncy;
+  graph->adjwgt = adjwgt;
+
+  graph->nvwgt = fmalloc(nvtxs*ncon, "SetUpGraph2: graph->nvwgt");
+  scopy(nvtxs*ncon, nvwgt, graph->nvwgt);
+
+  graph->gdata = idxmalloc(2*nvtxs, "SetUpGraph: gdata");
+
+  /* Compute the initial values of the adjwgtsum */
+  graph->adjwgtsum = graph->gdata;
+  for (i=0; i<nvtxs; i++) {
+    sum = 0;
+    for (j=xadj[i]; j<xadj[i+1]; j++)
+      sum += adjwgt[j];
+    graph->adjwgtsum[i] = sum;
+  }
+
+  graph->cmap = graph->gdata+nvtxs;
+
+  graph->label = idxmalloc(nvtxs, "SetUpGraph: label");
+  for (i=0; i<nvtxs; i++)
+    graph->label[i] = i;
+
+}
+
+
+/*************************************************************************
+* This function sets up the graph from the user input
+**************************************************************************/
+void VolSetUpGraph(GraphType *graph, int OpType, int nvtxs, int ncon, idxtype *xadj, 
+                   idxtype *adjncy, idxtype *vwgt, idxtype *vsize, int wgtflag)
+{
+  int i, j, k, sum, gsize;
+  idxtype *adjwgt;
+  float *nvwgt;
+  idxtype tvwgt[MAXNCON];
+
+  InitGraph(graph);
+
+  graph->nvtxs = nvtxs;
+  graph->nedges = xadj[nvtxs];
+  graph->ncon = ncon;
+  graph->xadj = xadj;
+  graph->adjncy = adjncy;
+
+  if (ncon == 1) { /* We are in the non mC mode */
+    gsize = graph->nedges;  /* This is for the edge weights */
+    if ((wgtflag&2) == 0)
+      gsize += nvtxs; /* vwgts */
+    if ((wgtflag&1) == 0)
+      gsize += nvtxs; /* vsize */
+
+    gsize += 2*nvtxs;
+
+    graph->gdata = idxmalloc(gsize, "SetUpGraph: gdata");
+
+    /* Create the vertex/edge weight vectors if they are not supplied */
+    gsize = 0;
+    if ((wgtflag&2) == 0) {
+      vwgt = graph->vwgt = idxset(nvtxs, 1, graph->gdata);
+      gsize += nvtxs;
+    }
+    else
+      graph->vwgt = vwgt;
+
+    if ((wgtflag&1) == 0) {
+      vsize = graph->vsize = idxset(nvtxs, 1, graph->gdata);
+      gsize += nvtxs;
+    }
+    else
+      graph->vsize = vsize;
+
+    /* Allocate memory for edge weights and initialize them to the sum of the vsize */
+    adjwgt = graph->adjwgt = graph->gdata+gsize;
+    gsize += graph->nedges;
+
+    for (i=0; i<nvtxs; i++) {
+      for (j=xadj[i]; j<xadj[i+1]; j++)
+        adjwgt[j] = 1+vsize[i]+vsize[adjncy[j]];
+    }
+
+
+    /* Compute the initial values of the adjwgtsum */
+    graph->adjwgtsum = graph->gdata + gsize;
+    gsize += nvtxs;
+
+    for (i=0; i<nvtxs; i++) {
+      sum = 0;
+      for (j=xadj[i]; j<xadj[i+1]; j++)
+        sum += adjwgt[j];
+      graph->adjwgtsum[i] = sum;
+    }
+
+    graph->cmap = graph->gdata + gsize;
+    gsize += nvtxs;
+
+  }
+  else {  /* Set up the graph in MOC mode */
+    gsize = graph->nedges; 
+    if ((wgtflag&1) == 0)
+      gsize += nvtxs;
+
+    gsize += 2*nvtxs;
+
+    graph->gdata = idxmalloc(gsize, "SetUpGraph: gdata");
+    gsize = 0;
+
+    /* Create the normalized vertex weights along each constrain */
+    if ((wgtflag&2) == 0) 
+      vwgt = idxsmalloc(nvtxs, 1, "SetUpGraph: vwgt");
+
+    for (i=0; i<ncon; i++) 
+      tvwgt[i] = idxsum_strd(nvtxs, vwgt+i, ncon);
+    
+    nvwgt = graph->nvwgt = fmalloc(ncon*nvtxs, "SetUpGraph: nvwgt");
+
+    for (i=0; i<nvtxs; i++) {
+      for (j=0; j<ncon; j++) 
+        nvwgt[i*ncon+j] = (1.0*vwgt[i*ncon+j])/(1.0*tvwgt[j]);
+    }
+    if ((wgtflag&2) == 0) 
+      free(vwgt);
+
+
+    /* Create the vsize vector if it is not supplied */
+    if ((wgtflag&1) == 0) {
+      vsize = graph->vsize = idxset(nvtxs, 1, graph->gdata);
+      gsize += nvtxs;
+    }
+    else
+      graph->vsize = vsize;
+
+    /* Allocate memory for edge weights and initialize them to the sum of the vsize */
+    adjwgt = graph->adjwgt = graph->gdata+gsize;
+    gsize += graph->nedges;
+
+    for (i=0; i<nvtxs; i++) {
+      for (j=xadj[i]; j<xadj[i+1]; j++)
+        adjwgt[j] = 1+vsize[i]+vsize[adjncy[j]];
+    }
+
+    /* Compute the initial values of the adjwgtsum */
+    graph->adjwgtsum = graph->gdata + gsize;
+    gsize += nvtxs;
+
+    for (i=0; i<nvtxs; i++) {
+      sum = 0;
+      for (j=xadj[i]; j<xadj[i+1]; j++)
+        sum += adjwgt[j];
+      graph->adjwgtsum[i] = sum;
+    }
+
+    graph->cmap = graph->gdata + gsize;
+    gsize += nvtxs;
+
+  }
+
+  if (OpType != OP_KVMETIS) {
+    graph->label = idxmalloc(nvtxs, "SetUpGraph: label");
+
+    for (i=0; i<nvtxs; i++)
+      graph->label[i] = i;
+  }
+
+}
+
+
+/*************************************************************************
+* This function randomly permutes the adjacency lists of a graph
+**************************************************************************/
+void RandomizeGraph(GraphType *graph)
+{
+  int i, j, k, l, tmp, nvtxs;
+  idxtype *xadj, *adjncy, *adjwgt;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  for (i=0; i<nvtxs; i++) {
+    l = xadj[i+1]-xadj[i];
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = xadj[i] + RandomInRange(l);
+      SWAP(adjncy[j], adjncy[k], tmp);
+      SWAP(adjwgt[j], adjwgt[k], tmp);
+    }
+  }
+}
+
+
+/*************************************************************************
+* This function checks whether or not partition pid is contigous
+**************************************************************************/
+int IsConnectedSubdomain(CtrlType *ctrl, GraphType *graph, int pid, int report)
+{
+  int i, j, k, nvtxs, first, last, nleft, ncmps, wgt;
+  idxtype *xadj, *adjncy, *where, *touched, *queue;
+  idxtype *cptr;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  where = graph->where;
+
+  touched = idxsmalloc(nvtxs, 0, "IsConnected: touched");
+  queue = idxmalloc(nvtxs, "IsConnected: queue");
+  cptr = idxmalloc(nvtxs, "IsConnected: cptr");
+
+  nleft = 0;
+  for (i=0; i<nvtxs; i++) {
+    if (where[i] == pid) 
+      nleft++;
+  }
+
+  for (i=0; i<nvtxs; i++) {
+    if (where[i] == pid) 
+      break;
+  }
+
+  touched[i] = 1;
+  queue[0] = i;
+  first = 0; last = 1;
+
+  cptr[0] = 0;  /* This actually points to queue */
+  ncmps = 0;
+  while (first != nleft) {
+    if (first == last) { /* Find another starting vertex */
+      cptr[++ncmps] = first;
+      for (i=0; i<nvtxs; i++) {
+        if (where[i] == pid && !touched[i])
+          break;
+      }
+      queue[last++] = i;
+      touched[i] = 1;
+    }
+
+    i = queue[first++];
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (where[k] == pid && !touched[k]) {
+        queue[last++] = k;
+        touched[k] = 1;
+      }
+    }
+  }
+  cptr[++ncmps] = first;
+
+  if (ncmps > 1 && report) {
+    printf("The graph has %d connected components in partition %d:\t", ncmps, pid);
+    for (i=0; i<ncmps; i++) {
+      wgt = 0;
+      for (j=cptr[i]; j<cptr[i+1]; j++)
+        wgt += graph->vwgt[queue[j]];
+      printf("[%5d %5d] ", cptr[i+1]-cptr[i], wgt);
+      /*
+      if (cptr[i+1]-cptr[i] == 1)
+        printf("[%d %d] ", queue[cptr[i]], xadj[queue[cptr[i]]+1]-xadj[queue[cptr[i]]]);
+      */
+    }
+    printf("\n");
+  }
+
+  GKfree(&touched, &queue, &cptr, LTERM);
+
+  return (ncmps == 1 ? 1 : 0);
+}
+
+
+/*************************************************************************
+* This function checks whether a graph is contigous or not
+**************************************************************************/
+int IsConnected(CtrlType *ctrl, GraphType *graph, int report)
+{
+  int i, j, k, nvtxs, first, last;
+  idxtype *xadj, *adjncy, *touched, *queue;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+
+  touched = idxsmalloc(nvtxs, 0, "IsConnected: touched");
+  queue = idxmalloc(nvtxs, "IsConnected: queue");
+
+  touched[0] = 1;
+  queue[0] = 0;
+  first = 0; last = 1;
+
+  while (first < last) {
+    i = queue[first++];
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (!touched[k]) {
+        queue[last++] = k;
+        touched[k] = 1;
+      }
+    }
+  }
+
+  if (first != nvtxs && report)
+    printf("The graph is not connected. It has %d disconnected vertices!\n", nvtxs-first);
+
+  return (first == nvtxs ? 1 : 0);
+}
+
+
+/*************************************************************************
+* This function checks whether or not partition pid is contigous
+**************************************************************************/
+int IsConnected2(GraphType *graph, int report)
+{
+  int i, j, k, nvtxs, first, last, nleft, ncmps, wgt;
+  idxtype *xadj, *adjncy, *where, *touched, *queue;
+  idxtype *cptr;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  where = graph->where;
+
+  touched = idxsmalloc(nvtxs, 0, "IsConnected: touched");
+  queue = idxmalloc(nvtxs, "IsConnected: queue");
+  cptr = idxmalloc(nvtxs, "IsConnected: cptr");
+
+  nleft = nvtxs;
+  touched[0] = 1;
+  queue[0] = 0;
+  first = 0; last = 1;
+
+  cptr[0] = 0;  /* This actually points to queue */
+  ncmps = 0;
+  while (first != nleft) {
+    if (first == last) { /* Find another starting vertex */
+      cptr[++ncmps] = first;
+      for (i=0; i<nvtxs; i++) {
+        if (!touched[i])
+          break;
+      }
+      queue[last++] = i;
+      touched[i] = 1;
+    }
+
+    i = queue[first++];
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (!touched[k]) {
+        queue[last++] = k;
+        touched[k] = 1;
+      }
+    }
+  }
+  cptr[++ncmps] = first;
+
+  if (ncmps > 1 && report) {
+    printf("%d connected components:\t", ncmps);
+    for (i=0; i<ncmps; i++) {
+      if (cptr[i+1]-cptr[i] > 200)
+        printf("[%5d] ", cptr[i+1]-cptr[i]);
+    }
+    printf("\n");
+  }
+
+  GKfree(&touched, &queue, &cptr, LTERM);
+
+  return (ncmps == 1 ? 1 : 0);
+}
+
+
+/*************************************************************************
+* This function returns the number of connected components in cptr,cind
+* The separator of the graph is used to split it and then find its components.
+**************************************************************************/
+int FindComponents(CtrlType *ctrl, GraphType *graph, idxtype *cptr, idxtype *cind)
+{
+  int i, j, k, nvtxs, first, last, nleft, ncmps, wgt;
+  idxtype *xadj, *adjncy, *where, *touched, *queue;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  where = graph->where;
+
+  touched = idxsmalloc(nvtxs, 0, "IsConnected: queue");
+
+  for (i=0; i<graph->nbnd; i++)
+    touched[graph->bndind[i]] = 1;
+
+  queue = cind;
+
+  nleft = 0;
+  for (i=0; i<nvtxs; i++) {
+    if (where[i] != 2) 
+      nleft++;
+  }
+
+  for (i=0; i<nvtxs; i++) {
+    if (where[i] != 2)
+      break;
+  }
+
+  touched[i] = 1;
+  queue[0] = i;
+  first = 0; last = 1;
+
+  cptr[0] = 0;  /* This actually points to queue */
+  ncmps = 0;
+  while (first != nleft) {
+    if (first == last) { /* Find another starting vertex */
+      cptr[++ncmps] = first;
+      for (i=0; i<nvtxs; i++) {
+        if (!touched[i])
+          break;
+      }
+      queue[last++] = i;
+      touched[i] = 1;
+    }
+
+    i = queue[first++];
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (!touched[k]) {
+        queue[last++] = k;
+        touched[k] = 1;
+      }
+    }
+  }
+  cptr[++ncmps] = first;
+
+  free(touched);
+
+  return ncmps;
+}
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/initpart.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/initpart.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/initpart.c	(revision 9501)
@@ -0,0 +1,422 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * initpart.c
+ *
+ * This file contains code that performs the initial partition of the
+ * coarsest graph
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: initpart.c,v 1.1 1998/11/27 17:59:15 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function computes the initial bisection of the coarsest graph
+**************************************************************************/
+void Init2WayPartition(CtrlType *ctrl, GraphType *graph, int *tpwgts, float ubfactor) 
+{
+  int dbglvl;
+
+  dbglvl = ctrl->dbglvl;
+  IFSET(ctrl->dbglvl, DBG_REFINE, ctrl->dbglvl -= DBG_REFINE);
+  IFSET(ctrl->dbglvl, DBG_MOVEINFO, ctrl->dbglvl -= DBG_MOVEINFO);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->InitPartTmr));
+
+  switch (ctrl->IType) {
+    case IPART_GGPKL:
+      GrowBisection(ctrl, graph, tpwgts, ubfactor);
+      break;
+    case 3:
+      RandomBisection(ctrl, graph, tpwgts, ubfactor);
+      break;
+    default:
+      errexit("Unknown initial partition type: %d\n", ctrl->IType);
+  }
+
+  IFSET(ctrl->dbglvl, DBG_IPART, printf("Initial Cut: %d\n", graph->mincut));
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->InitPartTmr));
+  ctrl->dbglvl = dbglvl;
+
+/*
+  IsConnectedSubdomain(ctrl, graph, 0);
+  IsConnectedSubdomain(ctrl, graph, 1);
+*/
+}
+
+/*************************************************************************
+* This function computes the initial bisection of the coarsest graph
+**************************************************************************/
+void InitSeparator(CtrlType *ctrl, GraphType *graph, float ubfactor) 
+{
+  int dbglvl;
+
+  dbglvl = ctrl->dbglvl;
+  IFSET(ctrl->dbglvl, DBG_REFINE, ctrl->dbglvl -= DBG_REFINE);
+  IFSET(ctrl->dbglvl, DBG_MOVEINFO, ctrl->dbglvl -= DBG_MOVEINFO);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->InitPartTmr));
+
+  GrowBisectionNode(ctrl, graph, ubfactor);
+  Compute2WayNodePartitionParams(ctrl, graph);
+
+  IFSET(ctrl->dbglvl, DBG_IPART, printf("Initial Sep: %d\n", graph->mincut));
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->InitPartTmr));
+
+  ctrl->dbglvl = dbglvl;
+
+}
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection by using a region
+* growing algorithm. The resulting partition is returned in
+* graph->where
+**************************************************************************/
+void GrowBisection(CtrlType *ctrl, GraphType *graph, int *tpwgts, float ubfactor)
+{
+  int i, j, k, nvtxs, drain, nleft, first, last, pwgts[2], minpwgt[2], maxpwgt[2], from, bestcut, icut, mincut, me, pass, nbfs;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *where;
+  idxtype *queue, *touched, *gain, *bestwhere;
+
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  Allocate2WayPartitionMemory(ctrl, graph);
+  where = graph->where;
+
+  bestwhere = idxmalloc(nvtxs, "BisectGraph: bestwhere");
+  queue = idxmalloc(nvtxs, "BisectGraph: queue");
+  touched = idxmalloc(nvtxs, "BisectGraph: touched");
+
+  ASSERTP(tpwgts[0]+tpwgts[1] == idxsum(nvtxs, vwgt), ("%d %d\n", tpwgts[0]+tpwgts[1], idxsum(nvtxs, vwgt)));
+
+  maxpwgt[0] = ubfactor*tpwgts[0];
+  maxpwgt[1] = ubfactor*tpwgts[1];
+  minpwgt[0] = (1.0/ubfactor)*tpwgts[0];
+  minpwgt[1] = (1.0/ubfactor)*tpwgts[1];
+
+  nbfs = (nvtxs <= ctrl->CoarsenTo ? SMALLNIPARTS : LARGENIPARTS);
+  bestcut = idxsum(nvtxs, graph->adjwgtsum)+1;  /* The +1 is for the 0 edges case */
+  for (; nbfs>0; nbfs--) {
+    idxset(nvtxs, 0, touched);
+
+    pwgts[1] = tpwgts[0]+tpwgts[1];
+    pwgts[0] = 0;
+
+    idxset(nvtxs, 1, where);
+
+    queue[0] = RandomInRange(nvtxs);
+    touched[queue[0]] = 1;
+    first = 0; last = 1;
+    nleft = nvtxs-1;
+    drain = 0;
+
+    /* Start the BFS from queue to get a partition */
+    for (;;) {
+      if (first == last) { /* Empty. Disconnected graph! */
+        if (nleft == 0 || drain)
+          break;
+
+        k = RandomInRange(nleft);
+        for (i=0; i<nvtxs; i++) {
+          if (touched[i] == 0) {
+            if (k == 0)
+              break;
+            else
+              k--;
+          }
+        }
+
+        queue[0] = i;
+        touched[i] = 1;
+        first = 0; last = 1;;
+        nleft--;
+      }
+
+      i = queue[first++];
+      if (pwgts[0] > 0 && pwgts[1]-vwgt[i] < minpwgt[1]) {
+        drain = 1;
+        continue;
+      }
+
+      where[i] = 0;
+      INC_DEC(pwgts[0], pwgts[1], vwgt[i]);
+      if (pwgts[1] <= maxpwgt[1])
+        break;
+
+      drain = 0;
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        k = adjncy[j];
+        if (touched[k] == 0) {
+          queue[last++] = k;
+          touched[k] = 1;
+          nleft--;
+        }
+      }
+    }
+
+    /* Check to see if we hit any bad limiting cases */
+    if (pwgts[1] == 0) { 
+      i = RandomInRange(nvtxs);
+      where[i] = 1;
+      INC_DEC(pwgts[1], pwgts[0], vwgt[i]);
+    }
+
+    /*************************************************************
+    * Do some partition refinement 
+    **************************************************************/
+    Compute2WayPartitionParams(ctrl, graph);
+    /*printf("IPART: %3d [%5d %5d] [%5d %5d] %5d\n", graph->nvtxs, pwgts[0], pwgts[1], graph->pwgts[0], graph->pwgts[1], graph->mincut); */
+
+    Balance2Way(ctrl, graph, tpwgts, ubfactor);
+    /*printf("BPART: [%5d %5d] %5d\n", graph->pwgts[0], graph->pwgts[1], graph->mincut);*/
+
+    FM_2WayEdgeRefine(ctrl, graph, tpwgts, 4);
+    /*printf("RPART: [%5d %5d] %5d\n", graph->pwgts[0], graph->pwgts[1], graph->mincut);*/
+
+    if (bestcut > graph->mincut) {
+      bestcut = graph->mincut;
+      idxcopy(nvtxs, where, bestwhere);
+      if (bestcut == 0)
+        break;
+    }
+  }
+
+  graph->mincut = bestcut;
+  idxcopy(nvtxs, bestwhere, where);
+
+  GKfree(&bestwhere, &queue, &touched, LTERM);
+}
+
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection by using a region
+* growing algorithm. The resulting partition is returned in
+* graph->where
+**************************************************************************/
+void GrowBisectionNode(CtrlType *ctrl, GraphType *graph, float ubfactor)
+{
+  int i, j, k, nvtxs, drain, nleft, first, last, pwgts[2], tpwgts[2], minpwgt[2], maxpwgt[2], from, bestcut, icut, mincut, me, pass, nbfs;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *where, *bndind;
+  idxtype *queue, *touched, *gain, *bestwhere;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bestwhere = idxmalloc(nvtxs, "BisectGraph: bestwhere");
+  queue = idxmalloc(nvtxs, "BisectGraph: queue");
+  touched = idxmalloc(nvtxs, "BisectGraph: touched");
+
+  tpwgts[0] = idxsum(nvtxs, vwgt);
+  tpwgts[1] = tpwgts[0]/2;
+  tpwgts[0] -= tpwgts[1];
+
+  maxpwgt[0] = ubfactor*tpwgts[0];
+  maxpwgt[1] = ubfactor*tpwgts[1];
+  minpwgt[0] = (1.0/ubfactor)*tpwgts[0];
+  minpwgt[1] = (1.0/ubfactor)*tpwgts[1];
+
+  /* Allocate memory for graph->rdata. Allocate sufficient memory for both edge and node */
+  graph->rdata = idxmalloc(5*nvtxs+3, "GrowBisectionNode: graph->rdata");
+  graph->pwgts    = graph->rdata;
+  graph->where    = graph->rdata + 3;
+  graph->bndptr   = graph->rdata + nvtxs + 3;
+  graph->bndind   = graph->rdata + 2*nvtxs + 3;
+  graph->nrinfo   = (NRInfoType *)(graph->rdata + 3*nvtxs + 3);
+  graph->id       = graph->rdata + 3*nvtxs + 3;
+  graph->ed       = graph->rdata + 4*nvtxs + 3;
+  
+  where = graph->where;
+  bndind = graph->bndind;
+
+  nbfs = (nvtxs <= ctrl->CoarsenTo ? SMALLNIPARTS : LARGENIPARTS);
+  bestcut = tpwgts[0]+tpwgts[1];
+  for (nbfs++; nbfs>0; nbfs--) {
+    idxset(nvtxs, 0, touched);
+
+    pwgts[1] = tpwgts[0]+tpwgts[1];
+    pwgts[0] = 0;
+
+    idxset(nvtxs, 1, where);
+
+    queue[0] = RandomInRange(nvtxs);
+    touched[queue[0]] = 1;
+    first = 0; last = 1;
+    nleft = nvtxs-1;
+    drain = 0;
+
+    /* Start the BFS from queue to get a partition */
+    if (nbfs >= 1) {
+      for (;;) {
+        if (first == last) { /* Empty. Disconnected graph! */
+          if (nleft == 0 || drain)
+            break;
+  
+          k = RandomInRange(nleft);
+          for (i=0; i<nvtxs; i++) {
+            if (touched[i] == 0) {
+              if (k == 0)
+                break;
+              else
+                k--;
+            }
+          }
+
+          queue[0] = i;
+          touched[i] = 1;
+          first = 0; last = 1;;
+          nleft--;
+        }
+
+        i = queue[first++];
+        if (pwgts[1]-vwgt[i] < minpwgt[1]) {
+          drain = 1;
+          continue;
+        }
+
+        where[i] = 0;
+        INC_DEC(pwgts[0], pwgts[1], vwgt[i]);
+        if (pwgts[1] <= maxpwgt[1])
+          break;
+
+        drain = 0;
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          k = adjncy[j];
+          if (touched[k] == 0) {
+            queue[last++] = k;
+            touched[k] = 1;
+            nleft--;
+          }
+        }
+      }
+    }
+
+    /*************************************************************
+    * Do some partition refinement 
+    **************************************************************/
+    Compute2WayPartitionParams(ctrl, graph);
+    Balance2Way(ctrl, graph, tpwgts, ubfactor);
+    FM_2WayEdgeRefine(ctrl, graph, tpwgts, 4);
+
+    /* Construct and refine the vertex separator */
+    for (i=0; i<graph->nbnd; i++) 
+      where[bndind[i]] = 2;
+
+    Compute2WayNodePartitionParams(ctrl, graph); 
+    FM_2WayNodeRefine(ctrl, graph, ubfactor, 6);
+
+    /* printf("ISep: [%d %d %d] %d\n", graph->pwgts[0], graph->pwgts[1], graph->pwgts[2], bestcut); */
+
+    if (bestcut > graph->mincut) {
+      bestcut = graph->mincut;
+      idxcopy(nvtxs, where, bestwhere);
+    }
+  }
+
+  graph->mincut = bestcut;
+  idxcopy(nvtxs, bestwhere, where);
+
+  Compute2WayNodePartitionParams(ctrl, graph); 
+
+  GKfree(&bestwhere, &queue, &touched, LTERM);
+}
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection by using a region
+* growing algorithm. The resulting partition is returned in
+* graph->where
+**************************************************************************/
+void RandomBisection(CtrlType *ctrl, GraphType *graph, int *tpwgts, float ubfactor)
+{
+  int i, ii, j, k, nvtxs, pwgts[2], minpwgt[2], maxpwgt[2], from, bestcut, icut, mincut, me, pass, nbfs;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *where;
+  idxtype *perm, *bestwhere;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  Allocate2WayPartitionMemory(ctrl, graph);
+  where = graph->where;
+
+  bestwhere = idxmalloc(nvtxs, "BisectGraph: bestwhere");
+  perm = idxmalloc(nvtxs, "BisectGraph: queue");
+
+  ASSERTP(tpwgts[0]+tpwgts[1] == idxsum(nvtxs, vwgt), ("%d %d\n", tpwgts[0]+tpwgts[1], idxsum(nvtxs, vwgt)));
+
+  maxpwgt[0] = ubfactor*tpwgts[0];
+  maxpwgt[1] = ubfactor*tpwgts[1];
+  minpwgt[0] = (1.0/ubfactor)*tpwgts[0];
+  minpwgt[1] = (1.0/ubfactor)*tpwgts[1];
+
+  nbfs = (nvtxs <= ctrl->CoarsenTo ? SMALLNIPARTS : LARGENIPARTS);
+  bestcut = idxsum(nvtxs, graph->adjwgtsum)+1;  /* The +1 is for the 0 edges case */
+  for (; nbfs>0; nbfs--) {
+    RandomPermute(nvtxs, perm, 1);
+
+    idxset(nvtxs, 1, where);
+    pwgts[1] = tpwgts[0]+tpwgts[1];
+    pwgts[0] = 0;
+
+
+    if (nbfs != 1) {
+      for (ii=0; ii<nvtxs; ii++) {
+        i = perm[ii];
+        if (pwgts[0]+vwgt[i] < maxpwgt[0]) {
+          where[i] = 0;
+          pwgts[0] += vwgt[i];
+          pwgts[1] -= vwgt[i];
+          if (pwgts[0] > minpwgt[0])
+            break;
+        }
+      }
+    }
+
+    /*************************************************************
+    * Do some partition refinement 
+    **************************************************************/
+    Compute2WayPartitionParams(ctrl, graph);
+    /* printf("IPART: %3d [%5d %5d] [%5d %5d] %5d\n", graph->nvtxs, pwgts[0], pwgts[1], graph->pwgts[0], graph->pwgts[1], graph->mincut); */
+
+    Balance2Way(ctrl, graph, tpwgts, ubfactor);
+    /* printf("BPART: [%5d %5d] %5d\n", graph->pwgts[0], graph->pwgts[1], graph->mincut); */
+
+    FM_2WayEdgeRefine(ctrl, graph, tpwgts, 4);
+    /* printf("RPART: [%5d %5d] %5d\n", graph->pwgts[0], graph->pwgts[1], graph->mincut); */
+
+    if (bestcut > graph->mincut) {
+      bestcut = graph->mincut;
+      idxcopy(nvtxs, where, bestwhere);
+      if (bestcut == 0)
+        break;
+    }
+  }
+
+  graph->mincut = bestcut;
+  idxcopy(nvtxs, bestwhere, where);
+
+  GKfree(&bestwhere, &perm, LTERM);
+}
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kmetis.c	(revision 9501)
@@ -0,0 +1,129 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * kmetis.c
+ *
+ * This file contains the top level routines for the multilevel k-way partitioning
+ * algorithm KMETIS.
+ *
+ * Started 7/28/97
+ * George
+ *
+ * $Id: kmetis.c,v 1.1 1998/11/27 17:59:15 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point for KMETIS
+**************************************************************************/
+void METIS_PartGraphKway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                         idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, 
+                         int *options, int *edgecut, idxtype *part)
+{
+  int i;
+  float *tpwgts;
+
+  tpwgts = fmalloc(*nparts, "KMETIS: tpwgts");
+  for (i=0; i<*nparts; i++) 
+    tpwgts[i] = 1.0/(1.0*(*nparts));
+
+  METIS_WPartGraphKway(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, 
+                       tpwgts, options, edgecut, part);
+
+  free(tpwgts);
+}
+
+
+/*************************************************************************
+* This function is the entry point for KWMETIS
+**************************************************************************/
+void METIS_WPartGraphKway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                          idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, 
+                          float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  SetUpGraph(&graph, OP_KMETIS, *nvtxs, 1, xadj, adjncy, vwgt, adjwgt, *wgtflag);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = KMETIS_CTYPE;
+    ctrl.IType = KMETIS_ITYPE;
+    ctrl.RType = KMETIS_RTYPE;
+    ctrl.dbglvl = KMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_KMETIS;
+  ctrl.CoarsenTo = amax((*nvtxs)/(40*log2(*nparts)), 20*(*nparts));
+  ctrl.maxvwgt = 1.5*((graph.vwgt ? idxsum(*nvtxs, graph.vwgt) : (*nvtxs))/ctrl.CoarsenTo);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *edgecut = MlevelKWayPartitioning(&ctrl, &graph, *nparts, part, tpwgts, 1.03);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (*numflag == 1)
+    Change2FNumbering(*nvtxs, xadj, adjncy, part);
+}
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+int MlevelKWayPartitioning(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *part, float *tpwgts, float ubfactor)
+{
+  int i, j, nvtxs, tvwgt, tpwgts2[2];
+  GraphType *cgraph;
+  int wgtflag=3, numflag=0, options[10], edgecut;
+
+  cgraph = Coarsen2Way(ctrl, graph);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->InitPartTmr));
+  AllocateKWayPartitionMemory(ctrl, cgraph, nparts);
+
+  options[0] = 1; 
+  options[OPTION_CTYPE] = MATCH_SHEMKWAY;
+  options[OPTION_ITYPE] = IPART_GGPKL;
+  options[OPTION_RTYPE] = RTYPE_FM;
+  options[OPTION_DBGLVL] = 0;
+
+  METIS_WPartGraphRecursive(&cgraph->nvtxs, cgraph->xadj, cgraph->adjncy, cgraph->vwgt, 
+                            cgraph->adjwgt, &wgtflag, &numflag, &nparts, tpwgts, options, 
+                            &edgecut, cgraph->where);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->InitPartTmr));
+  IFSET(ctrl->dbglvl, DBG_IPART, printf("Initial %d-way partitioning cut: %d\n", nparts, edgecut));
+
+  IFSET(ctrl->dbglvl, DBG_KWAYPINFO, ComputePartitionInfo(cgraph, nparts, cgraph->where));
+
+  RefineKWay(ctrl, graph, cgraph, nparts, tpwgts, ubfactor);
+
+  idxcopy(graph->nvtxs, graph->where, part);
+
+  GKfree(&graph->gdata, &graph->rdata, LTERM);
+
+  return graph->mincut;
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kvmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kvmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kvmetis.c	(revision 9501)
@@ -0,0 +1,130 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * kvmetis.c
+ *
+ * This file contains the top level routines for the multilevel k-way partitioning
+ * algorithm KMETIS.
+ *
+ * Started 7/28/97
+ * George
+ *
+ * $Id: kvmetis.c,v 1.1 1998/11/27 17:59:16 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point for KMETIS
+**************************************************************************/
+void METIS_PartGraphVKway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                         idxtype *vsize, int *wgtflag, int *numflag, int *nparts, 
+                         int *options, int *volume, idxtype *part)
+{
+  int i;
+  float *tpwgts;
+
+  tpwgts = fmalloc(*nparts, "KMETIS: tpwgts");
+  for (i=0; i<*nparts; i++) 
+    tpwgts[i] = 1.0/(1.0*(*nparts));
+
+  METIS_WPartGraphVKway(nvtxs, xadj, adjncy, vwgt, vsize, wgtflag, numflag, nparts, 
+                       tpwgts, options, volume, part);
+
+  free(tpwgts);
+}
+
+
+/*************************************************************************
+* This function is the entry point for KWMETIS
+**************************************************************************/
+void METIS_WPartGraphVKway(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                          idxtype *vsize, int *wgtflag, int *numflag, int *nparts, 
+                          float *tpwgts, int *options, int *volume, idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  VolSetUpGraph(&graph, OP_KVMETIS, *nvtxs, 1, xadj, adjncy, vwgt, vsize, *wgtflag);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = KVMETIS_CTYPE;
+    ctrl.IType = KVMETIS_ITYPE;
+    ctrl.RType = KVMETIS_RTYPE;
+    ctrl.dbglvl = KVMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_KVMETIS;
+  ctrl.CoarsenTo = amax((*nvtxs)/(40*ilog2(*nparts)), 20*(*nparts));
+  ctrl.maxvwgt = 1.5*((graph.vwgt ? idxsum(*nvtxs, graph.vwgt) : (*nvtxs))/ctrl.CoarsenTo);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *volume = MlevelVolKWayPartitioning(&ctrl, &graph, *nparts, part, tpwgts, 1.03);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (*numflag == 1)
+    Change2FNumbering(*nvtxs, xadj, adjncy, part);
+}
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+int MlevelVolKWayPartitioning(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *part, 
+                              float *tpwgts, float ubfactor)
+{
+  int i, j, nvtxs, tvwgt, tpwgts2[2];
+  GraphType *cgraph;
+  int wgtflag=3, numflag=0, options[10], edgecut;
+
+  cgraph = Coarsen2Way(ctrl, graph);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->InitPartTmr));
+  AllocateVolKWayPartitionMemory(ctrl, cgraph, nparts);
+
+  options[0] = 1; 
+  options[OPTION_CTYPE] = MATCH_SHEMKWAY;
+  options[OPTION_ITYPE] = IPART_GGPKL;
+  options[OPTION_RTYPE] = RTYPE_FM;
+  options[OPTION_DBGLVL] = 0;
+
+  METIS_WPartGraphRecursive(&cgraph->nvtxs, cgraph->xadj, cgraph->adjncy, cgraph->vwgt, 
+                            cgraph->adjwgt, &wgtflag, &numflag, &nparts, tpwgts, options, 
+                            &edgecut, cgraph->where);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->InitPartTmr));
+  IFSET(ctrl->dbglvl, DBG_IPART, printf("Initial %d-way partitioning cut: %d\n", nparts, edgecut));
+
+  IFSET(ctrl->dbglvl, DBG_KWAYPINFO, ComputePartitionInfo(cgraph, nparts, cgraph->where));
+
+  RefineVolKWay(ctrl, graph, cgraph, nparts, tpwgts, ubfactor);
+
+  idxcopy(graph->nvtxs, graph->where, part);
+
+  GKfree(&graph->gdata, &graph->rdata, LTERM);
+
+  return graph->minvol;
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayfm.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayfm.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayfm.c	(revision 9501)
@@ -0,0 +1,672 @@
+/*
+ * kwayfm.c
+ *
+ * This file contains code that implements the multilevel k-way refinement
+ *
+ * Started 7/28/97
+ * George
+ *
+ * $Id: kwayfm.c,v 1.1 1998/11/27 17:59:16 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Random_KWayEdgeRefine(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, float ubfactor, int npasses, int ffactor)
+{
+  int i, ii, iii, j, jj, k, l, pass, nvtxs, nmoves, nbnd, tvwgt, myndegrees; 
+  int from, me, to, oldcut, vwgt, gain;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *bndptr, *bndind, *minwgt, *maxwgt, *itpwgts;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("Partitions: [%6d %6d]-[%6d %6d], Balance: %5.3f, Nv-Nb[%6d %6d]. Cut: %6d\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut));
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    oldcut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (nmoves=iii=0; iii<graph->nbnd; iii++) {
+      ii = perm[iii];
+      if (ii >= nbnd)
+        continue;
+      i = bndind[ii];
+
+      myrinfo = graph->rinfo+i;
+
+      if (myrinfo->ed >= myrinfo->id) { /* Total ED is too high */
+        from = where[i];
+        vwgt = graph->vwgt[i];
+
+        if (myrinfo->id > 0 && pwgts[from]-vwgt < minwgt[from]) 
+          continue;   /* This cannot be moved! */
+
+        myedegrees = myrinfo->edegrees;
+        myndegrees = myrinfo->ndegrees;
+
+        j = myrinfo->id;
+        for (k=0; k<myndegrees; k++) {
+          to = myedegrees[k].pid;
+          gain = myedegrees[k].ed-j; /* j = myrinfo->id. Allow good nodes to move */ 
+          if (pwgts[to]+vwgt <= maxwgt[to]+ffactor*gain && gain >= 0)  
+            break;
+        }
+        if (k == myndegrees)
+          continue;  /* break out if you did not find a candidate */
+
+        for (j=k+1; j<myndegrees; j++) {
+          to = myedegrees[j].pid;
+          if ((myedegrees[j].ed > myedegrees[k].ed && pwgts[to]+vwgt <= maxwgt[to]) ||
+              (myedegrees[j].ed == myedegrees[k].ed && 
+               itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]))
+            k = j;
+        }
+
+        to = myedegrees[k].pid;
+
+        j = 0;
+        if (myedegrees[k].ed-myrinfo->id > 0)
+          j = 1;
+        else if (myedegrees[k].ed-myrinfo->id == 0) {
+          if ((iii&7) == 0 || pwgts[from] >= maxwgt[from] || itpwgts[from]*(pwgts[to]+vwgt) < itpwgts[to]*pwgts[from])
+            j = 1;
+        }
+        if (j == 0)
+          continue;
+          
+        /*=====================================================================
+        * If we got here, we can now move the vertex from 'from' to 'to' 
+        *======================================================================*/
+        graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+        IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d to %3d. Gain: %4d. Cut: %6d\n", i, to, myedegrees[k].ed-myrinfo->id, graph->mincut));
+
+        /* Update where, weight, and ID/ED information of the vertex you moved */
+        where[i] = to;
+        INC_DEC(pwgts[to], pwgts[from], vwgt);
+        myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+        SWAP(myrinfo->id, myedegrees[k].ed, j);
+        if (myedegrees[k].ed == 0) 
+          myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+        else
+          myedegrees[k].pid = from;
+
+        if (myrinfo->ed-myrinfo->id < 0)
+          BNDDelete(nbnd, bndind, bndptr, i);
+
+        /* Update the degrees of adjacent vertices */
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          ii = adjncy[j];
+          me = where[ii];
+
+          myrinfo = graph->rinfo+ii;
+          if (myrinfo->edegrees == NULL) {
+            myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+            ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+          }
+          myedegrees = myrinfo->edegrees;
+
+          ASSERT(CheckRInfo(myrinfo));
+
+          if (me == from) {
+            INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+            if (myrinfo->ed-myrinfo->id >= 0 && bndptr[ii] == -1)
+              BNDInsert(nbnd, bndind, bndptr, ii);
+          }
+          else if (me == to) {
+            INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+            if (myrinfo->ed-myrinfo->id < 0 && bndptr[ii] != -1)
+              BNDDelete(nbnd, bndind, bndptr, ii);
+          }
+
+          /* Remove contribution from the .ed of 'from' */
+          if (me != from) {
+            for (k=0; k<myrinfo->ndegrees; k++) {
+              if (myedegrees[k].pid == from) {
+                if (myedegrees[k].ed == adjwgt[j])
+                  myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+                else
+                  myedegrees[k].ed -= adjwgt[j];
+                break;
+              }
+            }
+          }
+
+          /* Add contribution to the .ed of 'to' */
+          if (me != to) {
+            for (k=0; k<myrinfo->ndegrees; k++) {
+              if (myedegrees[k].pid == to) {
+                myedegrees[k].ed += adjwgt[j];
+                break;
+              }
+            }
+            if (k == myrinfo->ndegrees) {
+              myedegrees[myrinfo->ndegrees].pid = to;
+              myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+            }
+          }
+
+          ASSERT(myrinfo->ndegrees <= xadj[ii+1]-xadj[ii]);
+          ASSERT(CheckRInfo(myrinfo));
+
+        }
+        nmoves++;
+      }
+    }
+
+    graph->nbnd = nbnd;
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Nmoves: %5d, Cut: %6d, Vol: %6d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, nmoves, graph->mincut, ComputeVolume(graph, where)));
+
+    if (graph->mincut == oldcut)
+      break;
+  }
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Greedy_KWayEdgeRefine(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, float ubfactor, int npasses)
+{
+  int i, ii, iii, j, jj, k, l, pass, nvtxs, nbnd, tvwgt, myndegrees, oldgain, gain; 
+  int from, me, to, oldcut, vwgt;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *bndptr, *bndind, *minwgt, *maxwgt, *moved, *itpwgts;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+  PQueueType queue;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  moved = idxwspacemalloc(ctrl, nvtxs);
+
+  PQueueInit(ctrl, &queue, nvtxs, graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)]);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("Partitions: [%6d %6d]-[%6d %6d], Balance: %5.3f, Nv-Nb[%6d %6d]. Cut: %6d\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut));
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    PQueueReset(&queue);
+    idxset(nvtxs, -1, moved);
+
+    oldcut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      PQueueInsert(&queue, i, graph->rinfo[i].ed - graph->rinfo[i].id);
+      moved[i] = 2;
+    }
+
+    for (iii=0;;iii++) {
+      if ((i = PQueueGetMax(&queue)) == -1) 
+        break;
+      moved[i] = 1;
+
+      myrinfo = graph->rinfo+i;
+      from = where[i];
+      vwgt = graph->vwgt[i];
+
+      if (pwgts[from]-vwgt < minwgt[from]) 
+        continue;   /* This cannot be moved! */
+
+      myedegrees = myrinfo->edegrees;
+      myndegrees = myrinfo->ndegrees;
+
+      j = myrinfo->id;
+      for (k=0; k<myndegrees; k++) {
+        to = myedegrees[k].pid;
+        gain = myedegrees[k].ed-j; /* j = myrinfo->id. Allow good nodes to move */ 
+        if (pwgts[to]+vwgt <= maxwgt[to]+gain && gain >= 0)  
+          break;
+      }
+      if (k == myndegrees)
+        continue;  /* break out if you did not find a candidate */
+
+      for (j=k+1; j<myndegrees; j++) {
+        to = myedegrees[j].pid;
+        if ((myedegrees[j].ed > myedegrees[k].ed && pwgts[to]+vwgt <= maxwgt[to]) ||
+            (myedegrees[j].ed == myedegrees[k].ed && 
+             itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]))
+          k = j;
+      }
+
+      to = myedegrees[k].pid;
+
+      j = 0;
+      if (myedegrees[k].ed-myrinfo->id > 0)
+        j = 1;
+      else if (myedegrees[k].ed-myrinfo->id == 0) {
+        if ((iii&7) == 0 || pwgts[from] >= maxwgt[from] || itpwgts[from]*(pwgts[to]+vwgt) < itpwgts[to]*pwgts[from])
+          j = 1;
+      }
+      if (j == 0)
+        continue;
+          
+      /*=====================================================================
+      * If we got here, we can now move the vertex from 'from' to 'to' 
+      *======================================================================*/
+      graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d to %3d. Gain: %4d. Cut: %6d\n", i, to, myedegrees[k].ed-myrinfo->id, graph->mincut));
+
+      /* Update where, weight, and ID/ED information of the vertex you moved */
+      where[i] = to;
+      INC_DEC(pwgts[to], pwgts[from], vwgt);
+      myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+      SWAP(myrinfo->id, myedegrees[k].ed, j);
+      if (myedegrees[k].ed == 0) 
+        myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+      else
+        myedegrees[k].pid = from;
+
+      if (myrinfo->ed < myrinfo->id)
+        BNDDelete(nbnd, bndind, bndptr, i);
+
+      /* Update the degrees of adjacent vertices */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        ii = adjncy[j];
+        me = where[ii];
+
+        myrinfo = graph->rinfo+ii;
+        if (myrinfo->edegrees == NULL) {
+          myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+          ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+        }
+        myedegrees = myrinfo->edegrees;
+
+        ASSERT(CheckRInfo(myrinfo));
+
+        oldgain = (myrinfo->ed-myrinfo->id);
+
+        if (me == from) {
+          INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+          if (myrinfo->ed-myrinfo->id >= 0 && bndptr[ii] == -1)
+            BNDInsert(nbnd, bndind, bndptr, ii);
+        }
+        else if (me == to) {
+          INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+          if (myrinfo->ed-myrinfo->id < 0 && bndptr[ii] != -1)
+            BNDDelete(nbnd, bndind, bndptr, ii);
+        }
+
+        /* Remove contribution from the .ed of 'from' */
+        if (me != from) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == from) {
+              if (myedegrees[k].ed == adjwgt[j])
+                myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+              else
+                myedegrees[k].ed -= adjwgt[j];
+              break;
+            }
+          }
+        }
+
+        /* Add contribution to the .ed of 'to' */
+        if (me != to) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == to) {
+              myedegrees[k].ed += adjwgt[j];
+              break;
+            }
+          }
+          if (k == myrinfo->ndegrees) {
+            myedegrees[myrinfo->ndegrees].pid = to;
+            myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+          }
+        }
+
+        /* Update the queue */
+        if (me == to || me == from) { 
+          gain = myrinfo->ed-myrinfo->id;
+          if (moved[ii] == 2) {
+            if (gain >= 0)
+              PQueueUpdate(&queue, ii, oldgain, gain);
+            else {
+              PQueueDelete(&queue, ii, oldgain);
+              moved[ii] = -1;
+            }
+          }
+          else if (moved[ii] == -1 && gain >= 0) {
+            PQueueInsert(&queue, ii, gain);
+            moved[ii] = 2;
+          }
+        } 
+
+        ASSERT(myrinfo->ndegrees <= xadj[ii+1]-xadj[ii]);
+        ASSERT(CheckRInfo(myrinfo));
+
+      }
+    }
+
+    graph->nbnd = nbnd;
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Cut: %6d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, graph->mincut));
+
+    if (graph->mincut == oldcut)
+      break;
+  }
+
+  PQueueFree(ctrl, &queue);
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Greedy_KWayEdgeBalance(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, float ubfactor, int npasses)
+{
+  int i, ii, iii, j, jj, k, l, pass, nvtxs, nbnd, tvwgt, myndegrees, oldgain, gain, nmoves; 
+  int from, me, to, oldcut, vwgt;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *bndptr, *bndind, *minwgt, *maxwgt, *moved, *itpwgts;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+  PQueueType queue;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  moved = idxwspacemalloc(ctrl, nvtxs);
+
+  PQueueInit(ctrl, &queue, nvtxs, graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)]);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("Partitions: [%6d %6d]-[%6d %6d], Balance: %5.3f, Nv-Nb[%6d %6d]. Cut: %6d [B]\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut));
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    /* Check to see if things are out of balance, given the tolerance */
+    for (i=0; i<nparts; i++) {
+      if (pwgts[i] > maxwgt[i])
+        break;
+    }
+    if (i == nparts) /* Things are balanced. Return right away */
+      break;
+
+    PQueueReset(&queue);
+    idxset(nvtxs, -1, moved);
+
+    oldcut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      PQueueInsert(&queue, i, graph->rinfo[i].ed - graph->rinfo[i].id);
+      moved[i] = 2;
+    }
+
+    nmoves = 0;
+    for (;;) {
+      if ((i = PQueueGetMax(&queue)) == -1) 
+        break;
+      moved[i] = 1;
+
+      myrinfo = graph->rinfo+i;
+      from = where[i];
+      vwgt = graph->vwgt[i];
+
+      if (pwgts[from]-vwgt < minwgt[from]) 
+        continue;   /* This cannot be moved! */
+
+      myedegrees = myrinfo->edegrees;
+      myndegrees = myrinfo->ndegrees;
+
+      for (k=0; k<myndegrees; k++) {
+        to = myedegrees[k].pid;
+        if (pwgts[to]+vwgt <= maxwgt[to] || itpwgts[from]*(pwgts[to]+vwgt) <= itpwgts[to]*pwgts[from]) 
+          break;
+      }
+      if (k == myndegrees)
+        continue;  /* break out if you did not find a candidate */
+
+      for (j=k+1; j<myndegrees; j++) {
+        to = myedegrees[j].pid;
+        if (itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]) 
+          k = j;
+      }
+
+      to = myedegrees[k].pid;
+
+      if (pwgts[from] < maxwgt[from] && pwgts[to] > minwgt[to] && myedegrees[k].ed-myrinfo->id < 0) 
+        continue;
+
+      /*=====================================================================
+      * If we got here, we can now move the vertex from 'from' to 'to' 
+      *======================================================================*/
+      graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d to %3d. Gain: %4d. Cut: %6d\n", i, to, myedegrees[k].ed-myrinfo->id, graph->mincut));
+
+      /* Update where, weight, and ID/ED information of the vertex you moved */
+      where[i] = to;
+      INC_DEC(pwgts[to], pwgts[from], vwgt);
+      myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+      SWAP(myrinfo->id, myedegrees[k].ed, j);
+      if (myedegrees[k].ed == 0) 
+        myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+      else
+        myedegrees[k].pid = from;
+
+      if (myrinfo->ed == 0)
+        BNDDelete(nbnd, bndind, bndptr, i);
+
+      /* Update the degrees of adjacent vertices */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        ii = adjncy[j];
+        me = where[ii];
+
+        myrinfo = graph->rinfo+ii;
+        if (myrinfo->edegrees == NULL) {
+          myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+          ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+        }
+        myedegrees = myrinfo->edegrees;
+
+        ASSERT(CheckRInfo(myrinfo));
+
+        oldgain = (myrinfo->ed-myrinfo->id);
+
+        if (me == from) {
+          INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+          if (myrinfo->ed > 0 && bndptr[ii] == -1)
+            BNDInsert(nbnd, bndind, bndptr, ii);
+        }
+        else if (me == to) {
+          INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+          if (myrinfo->ed == 0 && bndptr[ii] != -1)
+            BNDDelete(nbnd, bndind, bndptr, ii);
+        }
+
+        /* Remove contribution from the .ed of 'from' */
+        if (me != from) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == from) {
+              if (myedegrees[k].ed == adjwgt[j])
+                myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+              else
+                myedegrees[k].ed -= adjwgt[j];
+              break;
+            }
+          }
+        }
+
+        /* Add contribution to the .ed of 'to' */
+        if (me != to) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == to) {
+              myedegrees[k].ed += adjwgt[j];
+              break;
+            }
+          }
+          if (k == myrinfo->ndegrees) {
+            myedegrees[myrinfo->ndegrees].pid = to;
+            myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+          }
+        }
+
+        /* Update the queue */
+        if (me == to || me == from) { 
+          gain = myrinfo->ed-myrinfo->id;
+          if (moved[ii] == 2) {
+            if (myrinfo->ed > 0)
+              PQueueUpdate(&queue, ii, oldgain, gain);
+            else {
+              PQueueDelete(&queue, ii, oldgain);
+              moved[ii] = -1;
+            }
+          }
+          else if (moved[ii] == -1 && myrinfo->ed > 0) {
+            PQueueInsert(&queue, ii, gain);
+            moved[ii] = 2;
+          }
+        } 
+
+        ASSERT(myrinfo->ndegrees <= xadj[ii+1]-xadj[ii]);
+        ASSERT(CheckRInfo(myrinfo));
+      }
+      nmoves++;
+    }
+
+    graph->nbnd = nbnd;
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Nmoves: %5d, Cut: %6d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, nmoves, graph->mincut));
+  }
+
+  PQueueFree(ctrl, &queue);
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayrefine.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayrefine.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayrefine.c	(revision 9501)
@@ -0,0 +1,392 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * kwayrefine.c
+ *
+ * This file contains the driving routines for multilevel k-way refinement
+ *
+ * Started 7/28/97
+ * George
+ *
+ * $Id: kwayrefine.c,v 1.1 1998/11/27 17:59:17 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of refinement
+**************************************************************************/
+void RefineKWay(CtrlType *ctrl, GraphType *orggraph, GraphType *graph, int nparts, float *tpwgts, float ubfactor)
+{
+  int i, nlevels, mustfree=0;
+  GraphType *ptr;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->UncoarsenTmr));
+
+  /* Compute the parameters of the coarsest graph */
+  ComputeKWayPartitionParams(ctrl, graph, nparts);
+
+  /* Take care any non-contiguity */
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->AuxTmr1));
+  if (ctrl->RType == RTYPE_KWAYRANDOM_MCONN) {
+    EliminateComponents(ctrl, graph, nparts, tpwgts, 1.25);
+    EliminateSubDomainEdges(ctrl, graph, nparts, tpwgts);
+    EliminateComponents(ctrl, graph, nparts, tpwgts, 1.25);
+  }
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->AuxTmr1));
+
+  /* Determine how many levels are there */
+  for (ptr=graph, nlevels=0; ptr!=orggraph; ptr=ptr->finer, nlevels++); 
+
+  for (i=0; ;i++) {
+    /* PrintSubDomainGraph(graph, nparts, graph->where); */
+    if (ctrl->RType == RTYPE_KWAYRANDOM_MCONN && (i == nlevels/2 || i == nlevels/2+1))
+      EliminateSubDomainEdges(ctrl, graph, nparts, tpwgts);
+
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->RefTmr));
+
+    if (2*i >= nlevels && !IsBalanced(graph->pwgts, nparts, tpwgts, 1.04*ubfactor)) {
+      ComputeKWayBalanceBoundary(ctrl, graph, nparts);
+      if (ctrl->RType == RTYPE_KWAYRANDOM_MCONN)
+        Greedy_KWayEdgeBalanceMConn(ctrl, graph, nparts, tpwgts, ubfactor, 1); 
+      else
+        Greedy_KWayEdgeBalance(ctrl, graph, nparts, tpwgts, ubfactor, 1); 
+      ComputeKWayBoundary(ctrl, graph, nparts);
+    }
+
+    switch (ctrl->RType) {
+      case RTYPE_KWAYRANDOM:
+        Random_KWayEdgeRefine(ctrl, graph, nparts, tpwgts, ubfactor, 10, 1); 
+        break;
+      case RTYPE_KWAYGREEDY:
+        Greedy_KWayEdgeRefine(ctrl, graph, nparts, tpwgts, ubfactor, 10); 
+        break;
+      case RTYPE_KWAYRANDOM_MCONN:
+        Random_KWayEdgeRefineMConn(ctrl, graph, nparts, tpwgts, ubfactor, 10, 1); 
+        break;
+    }
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->RefTmr));
+
+    if (graph == orggraph)
+      break;
+
+    GKfree(&graph->gdata, LTERM);  /* Deallocate the graph related arrays */
+
+    graph = graph->finer;
+
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ProjectTmr));
+    if (graph->vwgt == NULL) {
+      graph->vwgt = idxsmalloc(graph->nvtxs, 1, "RefineKWay: graph->vwgt");
+      graph->adjwgt = idxsmalloc(graph->nedges, 1, "RefineKWay: graph->adjwgt");
+      mustfree = 1;
+    }
+    ProjectKWayPartition(ctrl, graph, nparts);
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ProjectTmr));
+  }
+
+  if (!IsBalanced(graph->pwgts, nparts, tpwgts, ubfactor)) {
+    ComputeKWayBalanceBoundary(ctrl, graph, nparts);
+    if (ctrl->RType == RTYPE_KWAYRANDOM_MCONN) {
+      Greedy_KWayEdgeBalanceMConn(ctrl, graph, nparts, tpwgts, ubfactor, 8); 
+      Random_KWayEdgeRefineMConn(ctrl, graph, nparts, tpwgts, ubfactor, 10, 0); 
+    }
+    else {
+      Greedy_KWayEdgeBalance(ctrl, graph, nparts, tpwgts, ubfactor, 8); 
+      Random_KWayEdgeRefine(ctrl, graph, nparts, tpwgts, ubfactor, 10, 0); 
+    }
+  }
+
+  /* Take care any trivial non-contiguity */
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->AuxTmr2));
+  EliminateComponents(ctrl, graph, nparts, tpwgts, ubfactor);
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->AuxTmr2));
+
+  if (mustfree) 
+    GKfree(&graph->vwgt, &graph->adjwgt, LTERM);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->UncoarsenTmr));
+}
+
+
+/*************************************************************************
+* This function allocates memory for k-way edge refinement
+**************************************************************************/
+void AllocateKWayPartitionMemory(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int nvtxs, pad64;
+
+  nvtxs = graph->nvtxs;
+
+  pad64 = (3*nvtxs+nparts)%2;
+
+  graph->rdata = idxmalloc(3*nvtxs+nparts+(sizeof(RInfoType)/sizeof(idxtype))*nvtxs+pad64, "AllocateKWayPartitionMemory: rdata");
+  graph->pwgts          = graph->rdata;
+  graph->where          = graph->rdata + nparts;
+  graph->bndptr         = graph->rdata + nvtxs + nparts;
+  graph->bndind         = graph->rdata + 2*nvtxs + nparts;
+  graph->rinfo          = (RInfoType *)(graph->rdata + 3*nvtxs+nparts + pad64);
+
+/*
+  if (ctrl->wspace.edegrees != NULL)
+    free(ctrl->wspace.edegrees);
+  ctrl->wspace.edegrees = (EDegreeType *)GKmalloc(graph->nedges*sizeof(EDegreeType), "AllocateKWayPartitionMemory: edegrees");
+*/
+}
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void ComputeKWayPartitionParams(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, j, k, l, nvtxs, nbnd, mincut, me, other;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *pwgts, *where, *bndind, *bndptr;
+  RInfoType *rinfo, *myrinfo;
+  EDegreeType *myedegrees;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  pwgts = idxset(nparts, 0, graph->pwgts);
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+  rinfo = graph->rinfo;
+
+
+  /*------------------------------------------------------------
+  / Compute now the id/ed degrees
+  /------------------------------------------------------------*/
+  ctrl->wspace.cdegree = 0;
+  nbnd = mincut = 0;
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+    pwgts[me] += vwgt[i];
+
+    myrinfo = rinfo+i;
+    myrinfo->id = myrinfo->ed = myrinfo->ndegrees = 0;
+    myrinfo->edegrees = NULL;
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (me != where[adjncy[j]])
+        myrinfo->ed += adjwgt[j];
+    }
+    myrinfo->id = graph->adjwgtsum[i] - myrinfo->ed;
+
+    if (myrinfo->ed > 0) 
+      mincut += myrinfo->ed;
+
+    if (myrinfo->ed-myrinfo->id >= 0)
+      BNDInsert(nbnd, bndind, bndptr, i);
+
+    /* Time to compute the particular external degrees */
+    if (myrinfo->ed > 0) { 
+      myedegrees = myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += xadj[i+1]-xadj[i];
+
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        other = where[adjncy[j]];
+        if (me != other) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == other) {
+              myedegrees[k].ed += adjwgt[j];
+              break;
+            }
+          }
+          if (k == myrinfo->ndegrees) {
+            myedegrees[myrinfo->ndegrees].pid = other;
+            myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+          }
+        }
+      }
+
+      ASSERT(myrinfo->ndegrees <= xadj[i+1]-xadj[i]);
+    }
+  }
+
+  graph->mincut = mincut/2;
+  graph->nbnd = nbnd;
+
+}
+
+
+
+/*************************************************************************
+* This function projects a partition, and at the same time computes the
+* parameters for refinement.
+**************************************************************************/
+void ProjectKWayPartition(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, j, k, nvtxs, nbnd, me, other, istart, iend, ndegrees;
+  idxtype *xadj, *adjncy, *adjwgt, *adjwgtsum;
+  idxtype *cmap, *where, *bndptr, *bndind;
+  idxtype *cwhere;
+  GraphType *cgraph;
+  RInfoType *crinfo, *rinfo, *myrinfo;
+  EDegreeType *myedegrees;
+  idxtype *htable;
+
+  cgraph = graph->coarser;
+  cwhere = cgraph->where;
+  crinfo = cgraph->rinfo;
+
+  nvtxs = graph->nvtxs;
+  cmap = graph->cmap;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+
+  AllocateKWayPartitionMemory(ctrl, graph, nparts);
+  where = graph->where;
+  rinfo = graph->rinfo;
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+
+  /* Go through and project partition and compute id/ed for the nodes */
+  for (i=0; i<nvtxs; i++) {
+    k = cmap[i];
+    where[i] = cwhere[k];
+    cmap[i] = crinfo[k].ed;  /* For optimization */
+  }
+
+  htable = idxset(nparts, -1, idxwspacemalloc(ctrl, nparts));
+
+  ctrl->wspace.cdegree = 0;
+  for (nbnd=0, i=0; i<nvtxs; i++) {
+    me = where[i];
+
+    myrinfo = rinfo+i;
+    myrinfo->id = myrinfo->ed = myrinfo->ndegrees = 0;
+    myrinfo->edegrees = NULL;
+
+    myrinfo->id = adjwgtsum[i];
+
+    if (cmap[i] > 0) { /* If it is an interface node. Note cmap[i] = crinfo[cmap[i]].ed */
+      istart = xadj[i];
+      iend = xadj[i+1];
+
+      myedegrees = myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += iend-istart;
+
+      ndegrees = 0;
+      for (j=istart; j<iend; j++) {
+        other = where[adjncy[j]];
+        if (me != other) {
+          myrinfo->ed += adjwgt[j];
+          if ((k = htable[other]) == -1) {
+            htable[other] = ndegrees;
+            myedegrees[ndegrees].pid = other;
+            myedegrees[ndegrees++].ed = adjwgt[j];
+          }
+          else {
+            myedegrees[k].ed += adjwgt[j];
+          }
+        }
+      }
+      myrinfo->id -= myrinfo->ed;
+
+      /* Remove space for edegrees if it was interior */
+      if (myrinfo->ed == 0) { 
+        myrinfo->edegrees = NULL;
+        ctrl->wspace.cdegree -= iend-istart;
+      }
+      else {
+        if (myrinfo->ed-myrinfo->id >= 0) 
+          BNDInsert(nbnd, bndind, bndptr, i); 
+
+        myrinfo->ndegrees = ndegrees;
+
+        for (j=0; j<ndegrees; j++)
+          htable[myedegrees[j].pid] = -1;
+      }
+    }
+  }
+
+  idxcopy(nparts, cgraph->pwgts, graph->pwgts);
+  graph->mincut = cgraph->mincut;
+  graph->nbnd = nbnd;
+
+  FreeGraph(graph->coarser);
+  graph->coarser = NULL;
+
+  idxwspacefree(ctrl, nparts);
+
+  ASSERT(CheckBnd2(graph));
+
+}
+
+
+
+/*************************************************************************
+* This function checks if the partition weights are within the balance
+* contraints
+**************************************************************************/
+int IsBalanced(idxtype *pwgts, int nparts, float *tpwgts, float ubfactor)
+{
+  int i, j, tvwgt;
+
+  tvwgt = idxsum(nparts, pwgts);
+  for (i=0; i<nparts; i++) {
+    if (pwgts[i] > tpwgts[i]*tvwgt*(ubfactor+0.005))
+      return 0;
+  }
+
+  return 1;
+}
+
+
+/*************************************************************************
+* This function computes the boundary definition for balancing
+**************************************************************************/
+void ComputeKWayBoundary(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, nvtxs, nbnd;
+  idxtype *bndind, *bndptr;
+
+  nvtxs = graph->nvtxs;
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+
+
+  /*------------------------------------------------------------
+  / Compute the new boundary
+  /------------------------------------------------------------*/
+  nbnd = 0;
+  for (i=0; i<nvtxs; i++) {
+    if (graph->rinfo[i].ed-graph->rinfo[i].id >= 0) 
+      BNDInsert(nbnd, bndind, bndptr, i);
+  }
+
+  graph->nbnd = nbnd;
+}
+
+/*************************************************************************
+* This function computes the boundary definition for balancing
+**************************************************************************/
+void ComputeKWayBalanceBoundary(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, nvtxs, nbnd;
+  idxtype *bndind, *bndptr;
+
+  nvtxs = graph->nvtxs;
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+
+
+  /*------------------------------------------------------------
+  / Compute the new boundary
+  /------------------------------------------------------------*/
+  nbnd = 0;
+  for (i=0; i<nvtxs; i++) {
+    if (graph->rinfo[i].ed > 0) 
+      BNDInsert(nbnd, bndind, bndptr, i);
+  }
+
+  graph->nbnd = nbnd;
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayvolfm.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayvolfm.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayvolfm.c	(revision 9501)
@@ -0,0 +1,1778 @@
+/*
+ * kwayvolfm.c
+ *
+ * This file contains code that implements the multilevel k-way refinement
+ *
+ * Started 7/8/98
+ * George
+ *
+ * $Id: kwayvolfm.c,v 1.1 1998/11/27 17:59:17 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Random_KWayVolRefine(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, 
+                          float ubfactor, int npasses, int ffactor)
+{
+  int i, ii, iii, j, jj, k, kk, l, u, pass, nvtxs, nmoves, tvwgt, myndegrees, xgain; 
+  int from, me, to, oldcut, oldvol, vwgt;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *bndptr, *bndind, *minwgt, *maxwgt, *itpwgts, *updind, *marker, *phtable;
+  VEDegreeType *myedegrees;
+  VRInfoType *myrinfo; 
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  updind = idxmalloc(nvtxs, "Random_KWayVolRefine: updind");
+  marker = idxsmalloc(nvtxs, 0, "Random_KWayVolRefine: marker");
+  phtable = idxsmalloc(nparts, -1, "Random_KWayVolRefine: phtable");
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("VolPart: [%5d %5d]-[%5d %5d], Balance: %3.2f, Nv-Nb[%5d %5d]. Cut: %5d, Vol: %5d\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut, graph->minvol));
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    oldcut = graph->mincut;
+    oldvol = graph->minvol;
+
+    RandomPermute(graph->nbnd, perm, 1);
+    for (nmoves=iii=0; iii<graph->nbnd; iii++) {
+      ii = perm[iii];
+      if (ii >= graph->nbnd)
+        continue;
+      i = bndind[ii];
+      myrinfo = graph->vrinfo+i;
+
+      if (myrinfo->gv >= 0) { /* Total volume gain is too high */
+        from = where[i];
+        vwgt = graph->vwgt[i];
+
+        if (myrinfo->id > 0 && pwgts[from]-vwgt < minwgt[from]) 
+          continue;   /* This cannot be moved! */
+
+        xgain = (myrinfo->id == 0 && myrinfo->ed > 0 ? graph->vsize[i] : 0);
+
+        myedegrees = myrinfo->edegrees;
+        myndegrees = myrinfo->ndegrees;
+
+        for (k=0; k<myndegrees; k++) {
+          to = myedegrees[k].pid;
+          if (pwgts[to]+vwgt <= maxwgt[to]+ffactor*myedegrees[k].gv && xgain+myedegrees[k].gv >= 0)  
+            break;
+        }
+        if (k == myndegrees)
+          continue;  /* break out if you did not find a candidate */
+
+        for (j=k+1; j<myndegrees; j++) {
+          to = myedegrees[j].pid;
+          if (pwgts[to]+vwgt > maxwgt[to])
+            continue;
+          if (myedegrees[j].gv > myedegrees[k].gv ||
+              (myedegrees[j].gv == myedegrees[k].gv && myedegrees[j].ed > myedegrees[k].ed) ||
+              (myedegrees[j].gv == myedegrees[k].gv && myedegrees[j].ed == myedegrees[k].ed &&
+               itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]))
+            k = j;
+        }
+
+        to = myedegrees[k].pid;
+
+        j = 0;
+        if (xgain+myedegrees[k].gv > 0 || myedegrees[k].ed-myrinfo->id > 0)
+          j = 1;
+        else if (myedegrees[k].ed-myrinfo->id == 0) {
+          if ((iii&5) == 0 || pwgts[from] >= maxwgt[from] || itpwgts[from]*(pwgts[to]+vwgt) < itpwgts[to]*pwgts[from])
+            j = 1;
+        }
+        if (j == 0)
+          continue;
+          
+        /*=====================================================================
+        * If we got here, we can now move the vertex from 'from' to 'to' 
+        *======================================================================*/
+        INC_DEC(pwgts[to], pwgts[from], vwgt);
+        graph->mincut -= myedegrees[k].ed-myrinfo->id;
+        graph->minvol -= (xgain+myedegrees[k].gv);
+        where[i] = to;
+
+        IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d from %3d to %3d. Gain: [%4d %4d]. Cut: %6d, Vol: %6d\n", 
+              i, from, to, xgain+myedegrees[k].gv, myedegrees[k].ed-myrinfo->id, graph->mincut, graph->minvol));
+
+        KWayVolUpdate(ctrl, graph, i, from, to, marker, phtable, updind);
+
+        nmoves++;
+
+        /* CheckVolKWayPartitionParams(ctrl, graph, nparts); */
+      }
+    }
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Nmoves: %5d, Cut: %6d, Vol: %6d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, nmoves, graph->mincut, 
+               graph->minvol));
+
+    if (graph->minvol == oldvol && graph->mincut == oldcut)
+      break;
+  }
+
+  GKfree(&marker, &updind, &phtable, LTERM);
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Random_KWayVolRefineMConn(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, 
+            float ubfactor, int npasses, int ffactor)
+{
+  int i, ii, iii, j, jj, k, kk, l, u, pass, nvtxs, nmoves, tvwgt, myndegrees, xgain; 
+  int from, me, to, oldcut, oldvol, vwgt, nadd, maxndoms;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *bndptr, *bndind, *minwgt, *maxwgt, *itpwgts, *updind, *marker, *phtable;
+  idxtype *pmat, *pmatptr, *ndoms;
+  VEDegreeType *myedegrees;
+  VRInfoType *myrinfo; 
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  updind = idxmalloc(nvtxs, "Random_KWayVolRefine: updind");
+  marker = idxsmalloc(nvtxs, 0, "Random_KWayVolRefine: marker");
+  phtable = idxsmalloc(nparts, -1, "Random_KWayVolRefine: phtable");
+
+  pmat = ctrl->wspace.pmat;
+  ndoms = idxwspacemalloc(ctrl, nparts);
+
+  ComputeVolSubDomainGraph(graph, nparts, pmat, ndoms);
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("VolPart: [%5d %5d]-[%5d %5d], Balance: %3.2f, Nv-Nb[%5d %5d]. Cut: %5d, Vol: %5d\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut, graph->minvol));
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    maxndoms = ndoms[idxamax(nparts, ndoms)];
+
+    oldcut = graph->mincut;
+    oldvol = graph->minvol;
+
+    RandomPermute(graph->nbnd, perm, 1);
+    for (nmoves=iii=0; iii<graph->nbnd; iii++) {
+      ii = perm[iii];
+      if (ii >= graph->nbnd)
+        continue;
+      i = bndind[ii];
+      myrinfo = graph->vrinfo+i;
+
+      if (myrinfo->gv >= 0) { /* Total volume gain is too high */
+        from = where[i];
+        vwgt = graph->vwgt[i];
+
+        if (myrinfo->id > 0 && pwgts[from]-vwgt < minwgt[from]) 
+          continue;   /* This cannot be moved! */
+
+        xgain = (myrinfo->id == 0 && myrinfo->ed > 0 ? graph->vsize[i] : 0);
+
+        myedegrees = myrinfo->edegrees;
+        myndegrees = myrinfo->ndegrees;
+
+        /* Determine the valid domains */
+        for (j=0; j<myndegrees; j++) {
+          to = myedegrees[j].pid;
+          phtable[to] = 1;
+          pmatptr = pmat + to*nparts;
+          for (nadd=0, k=0; k<myndegrees; k++) {
+            if (k == j)
+              continue;
+
+            l = myedegrees[k].pid;
+            if (pmatptr[l] == 0) {
+              if (ndoms[l] > maxndoms-1) {
+                phtable[to] = 0;
+                nadd = maxndoms;
+                break;
+              }
+              nadd++;
+            }
+          }
+          if (ndoms[to]+nadd > maxndoms)
+            phtable[to] = 0;
+          if (nadd == 0)
+            phtable[to] = 2;
+        }
+
+        for (k=0; k<myndegrees; k++) {
+          to = myedegrees[k].pid;
+          if (!phtable[to])
+            continue;
+          if (pwgts[to]+vwgt <= maxwgt[to]+ffactor*myedegrees[k].gv && xgain+myedegrees[k].gv >= 0)  
+            break;
+        }
+        if (k == myndegrees)
+          continue;  /* break out if you did not find a candidate */
+
+        for (j=k+1; j<myndegrees; j++) {
+          to = myedegrees[j].pid;
+          if (!phtable[to] || pwgts[to]+vwgt > maxwgt[to])
+            continue;
+          if (myedegrees[j].gv > myedegrees[k].gv ||
+              (myedegrees[j].gv == myedegrees[k].gv && myedegrees[j].ed > myedegrees[k].ed) ||
+              (myedegrees[j].gv == myedegrees[k].gv && myedegrees[j].ed == myedegrees[k].ed &&
+               itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]))
+            k = j;
+        }
+
+        to = myedegrees[k].pid;
+
+        j = 0;
+        if (xgain+myedegrees[k].gv > 0 || myedegrees[k].ed-myrinfo->id > 0)
+          j = 1;
+        else if (myedegrees[k].ed-myrinfo->id == 0) {
+          if ((iii&5) == 0 || phtable[myedegrees[k].pid] == 2 || pwgts[from] >= maxwgt[from] || itpwgts[from]*(pwgts[to]+vwgt) < itpwgts[to]*pwgts[from])
+            j = 1;
+        }
+
+        if (j == 0)
+          continue;
+
+        for (j=0; j<myndegrees; j++) 
+          phtable[myedegrees[j].pid] = -1;
+
+          
+        /*=====================================================================
+        * If we got here, we can now move the vertex from 'from' to 'to' 
+        *======================================================================*/
+        INC_DEC(pwgts[to], pwgts[from], vwgt);
+        graph->mincut -= myedegrees[k].ed-myrinfo->id;
+        graph->minvol -= (xgain+myedegrees[k].gv);
+        where[i] = to;
+
+        IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d from %3d to %3d. Gain: [%4d %4d]. Cut: %6d, Vol: %6d\n", 
+              i, from, to, xgain+myedegrees[k].gv, myedegrees[k].ed-myrinfo->id, graph->mincut, graph->minvol));
+
+        /* Update pmat to reflect the move of 'i' */
+        pmat[from*nparts+to] += (myrinfo->id-myedegrees[k].ed);
+        pmat[to*nparts+from] += (myrinfo->id-myedegrees[k].ed);
+        if (pmat[from*nparts+to] == 0) {
+          ndoms[from]--;
+          if (ndoms[from]+1 == maxndoms)
+            maxndoms = ndoms[idxamax(nparts, ndoms)];
+        }
+        if (pmat[to*nparts+from] == 0) {
+          ndoms[to]--;
+          if (ndoms[to]+1 == maxndoms)
+            maxndoms = ndoms[idxamax(nparts, ndoms)];
+        }
+
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          ii = adjncy[j];
+          me = where[ii];
+
+          /* Update pmat to reflect the move of 'i' for domains other than 'from' and 'to' */
+          if (me != from && me != to) {
+            pmat[me*nparts+from] -= adjwgt[j];
+            pmat[from*nparts+me] -= adjwgt[j];
+            if (pmat[me*nparts+from] == 0) {
+              ndoms[me]--;
+              if (ndoms[me]+1 == maxndoms)
+                maxndoms = ndoms[idxamax(nparts, ndoms)];
+            }
+            if (pmat[from*nparts+me] == 0) {
+              ndoms[from]--;
+              if (ndoms[from]+1 == maxndoms)
+                maxndoms = ndoms[idxamax(nparts, ndoms)];
+            }
+
+            if (pmat[me*nparts+to] == 0) {
+              ndoms[me]++;
+              if (ndoms[me] > maxndoms) {
+                printf("You just increased the maxndoms: %d %d\n", ndoms[me], maxndoms);
+                maxndoms = ndoms[me];
+              }
+            }
+            if (pmat[to*nparts+me] == 0) {
+              ndoms[to]++;
+              if (ndoms[to] > maxndoms) {
+                printf("You just increased the maxndoms: %d %d\n", ndoms[to], maxndoms);
+                maxndoms = ndoms[to];
+              }
+            }
+            pmat[me*nparts+to] += adjwgt[j];
+            pmat[to*nparts+me] += adjwgt[j];
+          }
+        }
+
+        KWayVolUpdate(ctrl, graph, i, from, to, marker, phtable, updind);
+
+        nmoves++;
+
+        /* CheckVolKWayPartitionParams(ctrl, graph, nparts); */
+      }
+    }
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Nmoves: %5d, Cut: %6d, Vol: %6d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, nmoves, graph->mincut, 
+               graph->minvol));
+
+    if (graph->minvol == oldvol && graph->mincut == oldcut)
+      break;
+  }
+
+  GKfree(&marker, &updind, &phtable, LTERM);
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Greedy_KWayVolBalance(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, 
+                           float ubfactor, int npasses)
+{
+  int i, ii, iii, j, jj, k, kk, l, u, pass, nvtxs, nmoves, tvwgt, myndegrees, xgain; 
+  int from, me, to, vwgt, gain;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *moved, *bndptr, *bndind, *minwgt, *maxwgt, *itpwgts, *updind, *marker, *phtable;
+  VEDegreeType *myedegrees;
+  VRInfoType *myrinfo; 
+  PQueueType queue;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  updind = idxmalloc(nvtxs, "Random_KWayVolRefine: updind");
+  marker = idxsmalloc(nvtxs, 0, "Random_KWayVolRefine: marker");
+  phtable = idxsmalloc(nparts, -1, "Random_KWayVolRefine: phtable");
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  moved = idxwspacemalloc(ctrl, nvtxs);
+
+  PQueueInit(ctrl, &queue, nvtxs, graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)]);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("VolPart: [%5d %5d]-[%5d %5d], Balance: %3.2f, Nv-Nb[%5d %5d]. Cut: %5d, Vol: %5d [B]\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut, graph->minvol));
+
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+    /* Check to see if things are out of balance, given the tolerance */
+    for (i=0; i<nparts; i++) {
+      if (pwgts[i] > maxwgt[i])
+        break;
+    }
+    if (i == nparts) /* Things are balanced. Return right away */
+      break;
+
+    PQueueReset(&queue);
+    idxset(nvtxs, -1, moved);
+
+    RandomPermute(graph->nbnd, perm, 1);
+    for (ii=0; ii<graph->nbnd; ii++) {
+      i = bndind[perm[ii]];
+      PQueueInsert(&queue, i, graph->vrinfo[i].gv);
+      moved[i] = 2;
+    }
+
+    for (nmoves=0;;) {
+      if ((i = PQueueGetMax(&queue)) == -1) 
+        break;
+      moved[i] = 1;
+
+      myrinfo = graph->vrinfo+i;
+      from = where[i];
+      vwgt = graph->vwgt[i];
+
+      if (pwgts[from]-vwgt < minwgt[from]) 
+        continue;   /* This cannot be moved! */
+
+      xgain = (myrinfo->id == 0 && myrinfo->ed > 0 ? graph->vsize[i] : 0);
+
+      myedegrees = myrinfo->edegrees;
+      myndegrees = myrinfo->ndegrees;
+
+      for (k=0; k<myndegrees; k++) {
+        to = myedegrees[k].pid;
+        if (pwgts[to]+vwgt <= maxwgt[to] || 
+            itpwgts[from]*(pwgts[to]+vwgt) <= itpwgts[to]*pwgts[from]) 
+          break;
+      }
+      if (k == myndegrees)
+        continue;  /* break out if you did not find a candidate */
+
+      for (j=k+1; j<myndegrees; j++) {
+        to = myedegrees[j].pid;
+        if (itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]) 
+          k = j;
+      }
+
+      to = myedegrees[k].pid;
+
+      if (pwgts[from] < maxwgt[from] && pwgts[to] > minwgt[to] && 
+          (xgain+myedegrees[k].gv < 0 || 
+           (xgain+myedegrees[k].gv == 0 &&  myedegrees[k].ed-myrinfo->id < 0))
+         )
+        continue;
+  
+
+      /*=====================================================================
+      * If we got here, we can now move the vertex from 'from' to 'to' 
+      *======================================================================*/
+      INC_DEC(pwgts[to], pwgts[from], vwgt);
+      graph->mincut -= myedegrees[k].ed-myrinfo->id;
+      graph->minvol -= (xgain+myedegrees[k].gv);
+      where[i] = to;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d from %3d to %3d. Gain: [%4d %4d]. Cut: %6d, Vol: %6d\n", 
+            i, from, to, xgain+myedegrees[k].gv, myedegrees[k].ed-myrinfo->id, graph->mincut, graph->minvol));
+
+      KWayVolUpdate(ctrl, graph, i, from, to, marker, phtable, updind);
+
+      nmoves++;
+
+      /*CheckVolKWayPartitionParams(ctrl, graph, nparts); */
+    }
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Nmoves: %5d, Cut: %6d, Vol: %6d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, nmoves, graph->mincut, 
+               graph->minvol));
+
+  }
+
+  GKfree(&marker, &updind, &phtable, LTERM);
+
+  PQueueFree(ctrl, &queue);
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Greedy_KWayVolBalanceMConn(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, 
+                                float ubfactor, int npasses)
+{
+  int i, ii, iii, j, jj, k, kk, l, u, pass, nvtxs, nmoves, tvwgt, myndegrees, xgain; 
+  int from, me, to, vwgt, gain, maxndoms, nadd;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *moved, *bndptr, *bndind, *minwgt, *maxwgt, *itpwgts, *updind, *marker, *phtable;
+  idxtype *pmat, *pmatptr, *ndoms;
+  VEDegreeType *myedegrees;
+  VRInfoType *myrinfo; 
+  PQueueType queue;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  updind = idxmalloc(nvtxs, "Random_KWayVolRefine: updind");
+  marker = idxsmalloc(nvtxs, 0, "Random_KWayVolRefine: marker");
+  phtable = idxsmalloc(nparts, -1, "Random_KWayVolRefine: phtable");
+
+  pmat = ctrl->wspace.pmat;
+  ndoms = idxwspacemalloc(ctrl, nparts);
+
+  ComputeVolSubDomainGraph(graph, nparts, pmat, ndoms);
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  moved = idxwspacemalloc(ctrl, nvtxs);
+
+  PQueueInit(ctrl, &queue, nvtxs, graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)]);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("VolPart: [%5d %5d]-[%5d %5d], Balance: %3.2f, Nv-Nb[%5d %5d]. Cut: %5d, Vol: %5d [B]\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut, graph->minvol));
+
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+    /* Check to see if things are out of balance, given the tolerance */
+    for (i=0; i<nparts; i++) {
+      if (pwgts[i] > maxwgt[i])
+        break;
+    }
+    if (i == nparts) /* Things are balanced. Return right away */
+      break;
+
+    PQueueReset(&queue);
+    idxset(nvtxs, -1, moved);
+
+    RandomPermute(graph->nbnd, perm, 1);
+    for (ii=0; ii<graph->nbnd; ii++) {
+      i = bndind[perm[ii]];
+      PQueueInsert(&queue, i, graph->vrinfo[i].gv);
+      moved[i] = 2;
+    }
+
+    maxndoms = ndoms[idxamax(nparts, ndoms)];
+
+    for (nmoves=0;;) {
+      if ((i = PQueueGetMax(&queue)) == -1) 
+        break;
+      moved[i] = 1;
+
+      myrinfo = graph->vrinfo+i;
+      from = where[i];
+      vwgt = graph->vwgt[i];
+
+      if (pwgts[from]-vwgt < minwgt[from]) 
+        continue;   /* This cannot be moved! */
+
+      xgain = (myrinfo->id == 0 && myrinfo->ed > 0 ? graph->vsize[i] : 0);
+
+      myedegrees = myrinfo->edegrees;
+      myndegrees = myrinfo->ndegrees;
+
+      /* Determine the valid domains */
+      for (j=0; j<myndegrees; j++) {
+        to = myedegrees[j].pid;
+        phtable[to] = 1;
+        pmatptr = pmat + to*nparts;
+        for (nadd=0, k=0; k<myndegrees; k++) {
+          if (k == j)
+            continue;
+
+          l = myedegrees[k].pid;
+          if (pmatptr[l] == 0) {
+            if (ndoms[l] > maxndoms-1) {
+              phtable[to] = 0;
+              nadd = maxndoms;
+              break;
+            }
+            nadd++;
+          }
+        }
+        if (ndoms[to]+nadd > maxndoms)
+          phtable[to] = 0;
+      }
+
+      for (k=0; k<myndegrees; k++) {
+        to = myedegrees[k].pid;
+        if (!phtable[to])
+          continue;
+        if (pwgts[to]+vwgt <= maxwgt[to] || 
+            itpwgts[from]*(pwgts[to]+vwgt) <= itpwgts[to]*pwgts[from]) 
+          break;
+      }
+      if (k == myndegrees)
+        continue;  /* break out if you did not find a candidate */
+
+      for (j=k+1; j<myndegrees; j++) {
+        to = myedegrees[j].pid;
+        if (!phtable[to])
+          continue;
+        if (itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]) 
+          k = j;
+      }
+
+      to = myedegrees[k].pid;
+
+      for (j=0; j<myndegrees; j++) 
+        phtable[myedegrees[j].pid] = -1;
+
+      if (pwgts[from] < maxwgt[from] && pwgts[to] > minwgt[to] && 
+          (xgain+myedegrees[k].gv < 0 || 
+           (xgain+myedegrees[k].gv == 0 &&  myedegrees[k].ed-myrinfo->id < 0))
+         )
+        continue;
+  
+
+      /*=====================================================================
+      * If we got here, we can now move the vertex from 'from' to 'to' 
+      *======================================================================*/
+      INC_DEC(pwgts[to], pwgts[from], vwgt);
+      graph->mincut -= myedegrees[k].ed-myrinfo->id;
+      graph->minvol -= (xgain+myedegrees[k].gv);
+      where[i] = to;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d from %3d to %3d. Gain: [%4d %4d]. Cut: %6d, Vol: %6d\n", 
+            i, from, to, xgain+myedegrees[k].gv, myedegrees[k].ed-myrinfo->id, graph->mincut, graph->minvol));
+
+      /* Update pmat to reflect the move of 'i' */
+      pmat[from*nparts+to] += (myrinfo->id-myedegrees[k].ed);
+      pmat[to*nparts+from] += (myrinfo->id-myedegrees[k].ed);
+      if (pmat[from*nparts+to] == 0) {
+        ndoms[from]--;
+        if (ndoms[from]+1 == maxndoms)
+          maxndoms = ndoms[idxamax(nparts, ndoms)];
+      }
+      if (pmat[to*nparts+from] == 0) {
+        ndoms[to]--;
+        if (ndoms[to]+1 == maxndoms)
+          maxndoms = ndoms[idxamax(nparts, ndoms)];
+      }
+
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        ii = adjncy[j];
+        me = where[ii];
+
+        /* Update pmat to reflect the move of 'i' for domains other than 'from' and 'to' */
+        if (me != from && me != to) {
+          pmat[me*nparts+from] -= adjwgt[j];
+          pmat[from*nparts+me] -= adjwgt[j];
+          if (pmat[me*nparts+from] == 0) {
+            ndoms[me]--;
+            if (ndoms[me]+1 == maxndoms)
+              maxndoms = ndoms[idxamax(nparts, ndoms)];
+          }
+          if (pmat[from*nparts+me] == 0) {
+            ndoms[from]--;
+            if (ndoms[from]+1 == maxndoms)
+              maxndoms = ndoms[idxamax(nparts, ndoms)];
+          }
+
+          if (pmat[me*nparts+to] == 0) {
+            ndoms[me]++;
+            if (ndoms[me] > maxndoms) {
+              printf("You just increased the maxndoms: %d %d\n", ndoms[me], maxndoms);
+              maxndoms = ndoms[me];
+            }
+          }
+          if (pmat[to*nparts+me] == 0) {
+            ndoms[to]++;
+            if (ndoms[to] > maxndoms) {
+              printf("You just increased the maxndoms: %d %d\n", ndoms[to], maxndoms);
+              maxndoms = ndoms[to];
+            }
+          }
+          pmat[me*nparts+to] += adjwgt[j];
+          pmat[to*nparts+me] += adjwgt[j];
+        }
+      }
+
+      KWayVolUpdate(ctrl, graph, i, from, to, marker, phtable, updind);
+
+      nmoves++;
+
+      /*CheckVolKWayPartitionParams(ctrl, graph, nparts); */
+    }
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Nmoves: %5d, Cut: %6d, Vol: %6d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, nmoves, graph->mincut, 
+               graph->minvol));
+
+  }
+
+  GKfree(&marker, &updind, &phtable, LTERM);
+
+  PQueueFree(ctrl, &queue);
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+
+/*************************************************************************
+* This function updates the edge and volume gains as a result of moving
+* v from 'from' to 'to'.
+* The working arrays marker and phtable are assumed to be initialized to
+* -1, and they left to -1 upon return
+**************************************************************************/
+void KWayVolUpdate(CtrlType *ctrl, GraphType *graph, int v, int from, int to,
+                   idxtype *marker, idxtype *phtable, idxtype *updind)
+{
+  int ii, iii, j, jj, k, kk, l, u, nupd, other, me, myidx; 
+  idxtype *xadj, *vsize, *adjncy, *adjwgt, *where;
+  VEDegreeType *myedegrees, *oedegrees;
+  VRInfoType *myrinfo, *orinfo;
+
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  vsize = graph->vsize;
+  where = graph->where;
+
+  myrinfo = graph->vrinfo+v;
+  myedegrees = myrinfo->edegrees;
+
+
+  /*======================================================================
+   * Remove the contributions on the gain made by 'v'. 
+   *=====================================================================*/
+  for (k=0; k<myrinfo->ndegrees; k++)
+    phtable[myedegrees[k].pid] = k;
+  phtable[from] = k;
+
+  myidx = phtable[to];  /* Keep track of the index in myedegrees of the 'to' domain */
+
+  for (j=xadj[v]; j<xadj[v+1]; j++) {
+    ii = adjncy[j];
+    other = where[ii];
+    orinfo = graph->vrinfo+ii;
+    oedegrees = orinfo->edegrees;
+
+    if (other == from) {
+      for (k=0; k<orinfo->ndegrees; k++) {
+        if (phtable[oedegrees[k].pid] == -1) 
+          oedegrees[k].gv += vsize[v];
+      }
+    }
+    else {
+      ASSERT(phtable[other] != -1);
+
+      if (myedegrees[phtable[other]].ned > 1) {
+        for (k=0; k<orinfo->ndegrees; k++) {
+          if (phtable[oedegrees[k].pid] == -1) 
+            oedegrees[k].gv += vsize[v];
+        }
+      }
+      else { /* There is only one connection */
+        for (k=0; k<orinfo->ndegrees; k++) {
+          if (phtable[oedegrees[k].pid] != -1) 
+            oedegrees[k].gv -= vsize[v];
+        }
+      }
+    }
+  }
+
+  for (k=0; k<myrinfo->ndegrees; k++)
+    phtable[myedegrees[k].pid] = -1;
+  phtable[from] = -1;
+
+
+  /*======================================================================
+   * Update the id/ed of vertex 'v'
+   *=====================================================================*/
+  myrinfo->ed += myrinfo->id-myedegrees[myidx].ed;
+  SWAP(myrinfo->id, myedegrees[myidx].ed, j);
+  SWAP(myrinfo->nid, myedegrees[myidx].ned, j);
+  if (myedegrees[myidx].ed == 0) 
+    myedegrees[myidx] = myedegrees[--myrinfo->ndegrees];
+  else
+    myedegrees[myidx].pid = from;
+
+  /*======================================================================
+   * Update the degrees of adjacent vertices and their volume gains
+   *=====================================================================*/
+  marker[v] = 1;
+  updind[0] = v;
+  nupd = 1;
+  for (j=xadj[v]; j<xadj[v+1]; j++) {
+    ii = adjncy[j];
+    me = where[ii];
+
+    if (!marker[ii]) {  /* The marking is done for boundary and max gv calculations */
+      marker[ii] = 2;
+      updind[nupd++] = ii;
+    }
+
+    myrinfo = graph->vrinfo+ii;
+    if (myrinfo->edegrees == NULL) {
+      myrinfo->edegrees = ctrl->wspace.vedegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+    }
+    myedegrees = myrinfo->edegrees;
+
+    if (me == from) {
+      INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+      myrinfo->nid--;
+    } 
+    else if (me == to) {
+      INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+      myrinfo->nid++;
+    }
+
+    /* Remove the edgeweight from the 'pid == from' entry of the vertex */
+    if (me != from) {
+      for (k=0; k<myrinfo->ndegrees; k++) {
+        if (myedegrees[k].pid == from) {
+          if (myedegrees[k].ned == 1) {
+            myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+            marker[ii] = 1;  /* You do a complete .gv calculation */
+
+            /* All vertices adjacent to 'ii' need to be updated */
+            for (jj=xadj[ii]; jj<xadj[ii+1]; jj++) {
+              u = adjncy[jj];
+              other = where[u];
+              orinfo = graph->vrinfo+u;
+              oedegrees = orinfo->edegrees;
+
+              for (kk=0; kk<orinfo->ndegrees; kk++) {
+                if (oedegrees[kk].pid == from) {
+                  oedegrees[kk].gv -= vsize[ii];
+                  break;
+                }
+              }
+            }
+          }
+          else {
+            myedegrees[k].ed -= adjwgt[j];
+            myedegrees[k].ned--;
+
+            /* Update the gv due to single 'ii' connection to 'from' */
+            if (myedegrees[k].ned == 1) {
+              /* find the vertex 'u' that 'ii' was connected into 'from' */
+              for (jj=xadj[ii]; jj<xadj[ii+1]; jj++) {
+                u = adjncy[jj];
+                other = where[u];
+                orinfo = graph->vrinfo+u;
+                oedegrees = orinfo->edegrees;
+
+                if (other == from) {
+                  for (kk=0; kk<orinfo->ndegrees; kk++) 
+                    oedegrees[kk].gv += vsize[ii];
+                  break;  
+                }
+              }
+            }
+          }
+
+          break; 
+        }
+      }
+    }
+
+    /* Add the edgeweight to the 'pid == to' entry of the vertex */
+    if (me != to) {
+      for (k=0; k<myrinfo->ndegrees; k++) {
+        if (myedegrees[k].pid == to) {
+          myedegrees[k].ed += adjwgt[j];
+          myedegrees[k].ned++;
+
+          /* Update the gv due to non-single 'ii' connection to 'to' */
+          if (myedegrees[k].ned == 2) {
+            /* find the vertex 'u' that 'ii' was connected into 'to' */
+            for (jj=xadj[ii]; jj<xadj[ii+1]; jj++) {
+              u = adjncy[jj];
+              other = where[u];
+              orinfo = graph->vrinfo+u;
+              oedegrees = orinfo->edegrees;
+
+              if (u != v && other == to) {
+                for (kk=0; kk<orinfo->ndegrees; kk++) 
+                  oedegrees[kk].gv -= vsize[ii];
+                break;  
+              }
+            }
+          }
+          break;
+        }
+      }
+
+      if (k == myrinfo->ndegrees) {
+        myedegrees[myrinfo->ndegrees].pid = to;
+        myedegrees[myrinfo->ndegrees].ed = adjwgt[j];
+        myedegrees[myrinfo->ndegrees++].ned = 1;
+        marker[ii] = 1;  /* You do a complete .gv calculation */
+
+        /* All vertices adjacent to 'ii' need to be updated */
+        for (jj=xadj[ii]; jj<xadj[ii+1]; jj++) {
+          u = adjncy[jj];
+          other = where[u];
+          orinfo = graph->vrinfo+u;
+          oedegrees = orinfo->edegrees;
+
+          for (kk=0; kk<orinfo->ndegrees; kk++) {
+            if (oedegrees[kk].pid == to) {
+              oedegrees[kk].gv += vsize[ii];
+              if (!marker[u]) { /* Need to update boundary etc */
+                marker[u] = 2;
+                updind[nupd++] = u;
+              }
+              break;
+            }
+          }
+        }
+      }
+    }
+
+    ASSERT(myrinfo->ndegrees <= xadj[ii+1]-xadj[ii]);
+  }
+
+  /*======================================================================
+   * Add the contributions on the volume gain due to 'v'
+   *=====================================================================*/
+  myrinfo = graph->vrinfo+v;
+  myedegrees = myrinfo->edegrees;
+  for (k=0; k<myrinfo->ndegrees; k++)
+    phtable[myedegrees[k].pid] = k;
+  phtable[to] = k;
+
+  for (j=xadj[v]; j<xadj[v+1]; j++) {
+    ii = adjncy[j];
+    other = where[ii];
+    orinfo = graph->vrinfo+ii;
+    oedegrees = orinfo->edegrees;
+
+    if (other == to) {
+      for (k=0; k<orinfo->ndegrees; k++) {
+        if (phtable[oedegrees[k].pid] == -1) 
+          oedegrees[k].gv -= vsize[v];
+      }
+    }
+    else {
+      ASSERT(phtable[other] != -1);
+
+      if (myedegrees[phtable[other]].ned > 1) {
+        for (k=0; k<orinfo->ndegrees; k++) {
+          if (phtable[oedegrees[k].pid] == -1) 
+            oedegrees[k].gv -= vsize[v];
+        }
+      }
+      else { /* There is only one connection */
+        for (k=0; k<orinfo->ndegrees; k++) {
+          if (phtable[oedegrees[k].pid] != -1) 
+            oedegrees[k].gv += vsize[v];
+        }
+      }
+    }
+  }
+  for (k=0; k<myrinfo->ndegrees; k++)
+    phtable[myedegrees[k].pid] = -1;
+  phtable[to] = -1;
+
+
+  /*======================================================================
+   * Recompute the volume information of the 'hard' nodes, and update the
+   * max volume gain for all the update vertices
+   *=====================================================================*/
+  ComputeKWayVolume(graph, nupd, updind, marker, phtable);
+
+
+  /*======================================================================
+   * Maintain a consistent boundary
+   *=====================================================================*/
+  for (j=0; j<nupd; j++) {
+    k = updind[j];
+    marker[k] = 0;
+    myrinfo = graph->vrinfo+k;
+
+    if ((myrinfo->gv >= 0 || myrinfo->ed-myrinfo->id >= 0) && graph->bndptr[k] == -1)
+      BNDInsert(graph->nbnd, graph->bndind, graph->bndptr, k);
+
+    if (myrinfo->gv < 0 && myrinfo->ed-myrinfo->id < 0 && graph->bndptr[k] != -1)
+      BNDDelete(graph->nbnd, graph->bndind, graph->bndptr, k);
+  }
+
+}
+
+
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void ComputeKWayVolume(GraphType *graph, int nupd, idxtype *updind, idxtype *marker, idxtype *phtable)
+{
+  int ii, iii, i, j, k, kk, l, nvtxs, me, other, pid;
+  idxtype *xadj, *vsize, *adjncy, *adjwgt, *where;
+  VRInfoType *rinfo, *myrinfo, *orinfo;
+  VEDegreeType *myedegrees, *oedegrees;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vsize = graph->vsize;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  rinfo = graph->vrinfo;
+
+
+  /*------------------------------------------------------------
+  / Compute now the iv/ev degrees
+  /------------------------------------------------------------*/
+  for (iii=0; iii<nupd; iii++) {
+    i = updind[iii];
+    me = where[i];
+
+    myrinfo = rinfo+i;
+    myedegrees = myrinfo->edegrees;
+
+    if (marker[i] == 1) {  /* Only complete gain updates go through */
+      for (k=0; k<myrinfo->ndegrees; k++) 
+        myedegrees[k].gv = 0;
+
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        ii = adjncy[j];
+        other = where[ii];
+        orinfo = rinfo+ii;
+        oedegrees = orinfo->edegrees;
+
+        for (kk=0; kk<orinfo->ndegrees; kk++) 
+          phtable[oedegrees[kk].pid] = kk;
+        phtable[other] = 1;
+
+        if (me == other) {
+          /* Find which domains 'i' is connected and 'ii' is not and update their gain */
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (phtable[myedegrees[k].pid] == -1)
+              myedegrees[k].gv -= vsize[ii];
+          }
+        }
+        else {
+          ASSERT(phtable[me] != -1);
+
+          /* I'm the only connection of 'ii' in 'me' */
+          if (oedegrees[phtable[me]].ned == 1) { 
+            /* Increase the gains for all the common domains between 'i' and 'ii' */
+            for (k=0; k<myrinfo->ndegrees; k++) {
+              if (phtable[myedegrees[k].pid] != -1) 
+                myedegrees[k].gv += vsize[ii];
+            }
+          }
+          else {
+            /* Find which domains 'i' is connected and 'ii' is not and update their gain */
+            for (k=0; k<myrinfo->ndegrees; k++) {
+              if (phtable[myedegrees[k].pid] == -1) 
+                myedegrees[k].gv -= vsize[ii];
+            }
+          }
+        }
+
+        for (kk=0; kk<orinfo->ndegrees; kk++) 
+          phtable[oedegrees[kk].pid] = -1;
+        phtable[other] = -1;
+  
+      }
+    }
+
+    myrinfo->gv = -MAXIDX;
+    for (k=0; k<myrinfo->ndegrees; k++) {
+      if (myedegrees[k].gv > myrinfo->gv)
+        myrinfo->gv = myedegrees[k].gv;
+    }
+    if (myrinfo->ed > 0 && myrinfo->id == 0)
+      myrinfo->gv += vsize[i];
+
+  }
+
+}
+
+
+
+/*************************************************************************
+* This function computes the total volume
+**************************************************************************/
+int ComputeVolume(GraphType *graph, idxtype *where)
+{
+  int i, j, k, me, nvtxs, nparts, totalv;
+  idxtype *xadj, *adjncy, *vsize, *marker;
+
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vsize = (graph->vsize == NULL ? graph->vwgt : graph->vsize);
+
+  nparts = where[idxamax(nvtxs, where)]+1;
+  marker = idxsmalloc(nparts, -1, "ComputeVolume: marker");
+
+  totalv = 0;
+
+  for (i=0; i<nvtxs; i++) {
+    marker[where[i]] = i;
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = where[adjncy[j]];
+      if (marker[k] != i) {
+        marker[k] = i;
+        totalv += vsize[i];
+      }
+    }
+  }
+
+  free(marker);
+
+  return totalv;
+}
+
+
+
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void CheckVolKWayPartitionParams(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, ii, j, k, kk, l, nvtxs, nbnd, mincut, minvol, me, other, pid;
+  idxtype *xadj, *vsize, *adjncy, *adjwgt, *pwgts, *where, *bndind, *bndptr;
+  VRInfoType *rinfo, *myrinfo, *orinfo, tmprinfo;
+  VEDegreeType *myedegrees, *oedegrees, *tmpdegrees;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vsize = graph->vsize;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  rinfo = graph->vrinfo;
+
+  tmpdegrees = (VEDegreeType *)GKmalloc(nparts*sizeof(VEDegreeType), "CheckVolKWayPartitionParams: tmpdegrees");
+
+  /*------------------------------------------------------------
+  / Compute now the iv/ev degrees
+  /------------------------------------------------------------*/
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+
+    myrinfo = rinfo+i;
+    myedegrees = myrinfo->edegrees;
+
+    for (k=0; k<myrinfo->ndegrees; k++)
+      tmpdegrees[k] = myedegrees[k];
+
+    tmprinfo.ndegrees = myrinfo->ndegrees;
+    tmprinfo.id = myrinfo->id;
+    tmprinfo.ed = myrinfo->ed;
+
+    myrinfo = &tmprinfo;
+    myedegrees = tmpdegrees;
+
+
+    for (k=0; k<myrinfo->ndegrees; k++)
+      myedegrees[k].gv = 0;
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      ii = adjncy[j];
+      other = where[ii];
+      orinfo = rinfo+ii;
+      oedegrees = orinfo->edegrees;
+
+      if (me == other) {
+        /* Find which domains 'i' is connected and 'ii' is not and update their gain */
+        for (k=0; k<myrinfo->ndegrees; k++) {
+          pid = myedegrees[k].pid;
+          for (kk=0; kk<orinfo->ndegrees; kk++) {
+            if (oedegrees[kk].pid == pid)
+              break;
+          }
+          if (kk == orinfo->ndegrees) 
+            myedegrees[k].gv -= vsize[ii];
+        }
+      }
+      else {
+        /* Find the orinfo[me].ed and see if I'm the only connection */
+        for (k=0; k<orinfo->ndegrees; k++) {
+          if (oedegrees[k].pid == me)
+            break;
+        }
+
+        if (oedegrees[k].ned == 1) { /* I'm the only connection of 'ii' in 'me' */
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == other) {
+              myedegrees[k].gv += vsize[ii];
+              break;
+            }
+          }
+
+          /* Increase the gains for all the common domains between 'i' and 'ii' */
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if ((pid = myedegrees[k].pid) == other)
+              continue;
+            for (kk=0; kk<orinfo->ndegrees; kk++) {
+              if (oedegrees[kk].pid == pid) {
+                myedegrees[k].gv += vsize[ii];
+                break;
+              }
+            }
+          }
+
+        }
+        else {
+          /* Find which domains 'i' is connected and 'ii' is not and update their gain */
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if ((pid = myedegrees[k].pid) == other)
+              continue;
+            for (kk=0; kk<orinfo->ndegrees; kk++) {
+              if (oedegrees[kk].pid == pid)
+                break;
+            }
+            if (kk == orinfo->ndegrees) 
+              myedegrees[k].gv -= vsize[ii];
+          }
+        }
+      }
+    }
+
+    myrinfo = rinfo+i;
+    myedegrees = myrinfo->edegrees;
+
+    for (k=0; k<myrinfo->ndegrees; k++) {
+      pid = myedegrees[k].pid;
+      for (kk=0; kk<tmprinfo.ndegrees; kk++) {
+        if (tmpdegrees[kk].pid == pid) {
+          if (tmpdegrees[kk].gv != myedegrees[k].gv)
+            printf("[%d %d %d %d]\n", i, pid, myedegrees[k].gv, tmpdegrees[kk].gv);
+          break;
+        }
+      }
+    }
+
+  }
+
+  free(tmpdegrees);
+
+}
+
+
+/*************************************************************************
+* This function computes the subdomain graph
+**************************************************************************/
+void ComputeVolSubDomainGraph(GraphType *graph, int nparts, idxtype *pmat, idxtype *ndoms)
+{
+  int i, j, k, me, nvtxs, ndegrees;
+  idxtype *xadj, *adjncy, *adjwgt, *where;
+  VRInfoType *rinfo;
+  VEDegreeType *edegrees;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  rinfo = graph->vrinfo;
+
+  idxset(nparts*nparts, 0, pmat);
+
+  for (i=0; i<nvtxs; i++) {
+    if (rinfo[i].ed > 0) {
+      me = where[i];
+      ndegrees = rinfo[i].ndegrees;
+      edegrees = rinfo[i].edegrees;
+
+      k = me*nparts;
+      for (j=0; j<ndegrees; j++) 
+        pmat[k+edegrees[j].pid] += edegrees[j].ed;
+    }
+  }
+
+  for (i=0; i<nparts; i++) {
+    ndoms[i] = 0;
+    for (j=0; j<nparts; j++) {
+      if (pmat[i*nparts+j] > 0)
+        ndoms[i]++;
+    }
+  }
+}
+
+
+
+/*************************************************************************
+* This function computes the subdomain graph
+**************************************************************************/
+void EliminateVolSubDomainEdges(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts)
+{
+  int i, ii, j, k, me, other, nvtxs, total, max, avg, totalout, nind, ncand, ncand2, target, target2, nadd;
+  int min, move, cpwgt, tvwgt;
+  idxtype *xadj, *adjncy, *vwgt, *adjwgt, *pwgts, *where, *maxpwgt, *pmat, *ndoms, *mypmat, *otherpmat, *ind;
+  KeyValueType *cand, *cand2;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  pwgts = idxset(nparts, 0, graph->pwgts);
+
+  maxpwgt = idxwspacemalloc(ctrl, nparts);
+  ndoms = idxwspacemalloc(ctrl, nparts);
+  otherpmat = idxwspacemalloc(ctrl, nparts);
+  ind = idxwspacemalloc(ctrl, nvtxs);
+  pmat = idxset(nparts*nparts, 0, ctrl->wspace.pmat);
+
+  cand = (KeyValueType *)GKmalloc(nparts*sizeof(KeyValueType), "EliminateSubDomainEdges: cand");
+  cand2 = (KeyValueType *)GKmalloc(nparts*sizeof(KeyValueType), "EliminateSubDomainEdges: cand");
+
+  /* Compute the pmat matrix */
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+    pwgts[me] += vwgt[i];
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (where[k] != me) 
+        pmat[me*nparts+where[k]] += adjwgt[j];
+    }
+  }
+
+  /* Compute the maximum allowed weight for each domain */
+  tvwgt = idxsum(nparts, pwgts);
+  for (i=0; i<nparts; i++)
+    maxpwgt[i] = 1.25*tpwgts[i]*tvwgt;
+
+  /* Determine the domain connectivity */
+  for (i=0; i<nparts; i++) {
+    for (k=0, j=0; j<nparts; j++) {
+      if (pmat[i*nparts+j] > 0)
+        k++;
+    }
+    ndoms[i] = k;
+  }
+
+  /* Get into the loop eliminating subdomain connections */
+  for (;;) {
+    total = idxsum(nparts, ndoms);
+    avg = total/nparts;
+    max = ndoms[idxamax(nparts, ndoms)];
+
+    /* printf("Adjacent Subdomain Stats: Total: %3d, Max: %3d, Avg: %3d\n", total, max, avg); */
+
+    if (max < 1.5*avg)
+      break;
+
+    me = idxamax(nparts, ndoms);
+    mypmat = pmat + me*nparts;
+    totalout = idxsum(nparts, mypmat);
+
+    /*printf("Me: %d, TotalOut: %d,\n", me, totalout);*/
+
+    /* Sort the connections according to their cut */
+    for (ncand2=0, i=0; i<nparts; i++) {
+      if (mypmat[i] > 0) {
+        cand2[ncand2].key = mypmat[i];
+        cand2[ncand2++].val = i;
+      }
+    }
+    ikeysort(ncand2, cand2);
+
+    move = 0;
+    for (min=0; min<ncand2; min++) {
+      if (cand2[min].key > totalout/(2*ndoms[me])) 
+        break;
+
+      other = cand2[min].val;
+
+      /*printf("\tMinOut: %d to %d\n", mypmat[other], other);*/
+
+      idxset(nparts, 0, otherpmat);
+
+      /* Go and find the vertices in 'other' that are connected in 'me' */
+      for (nind=0, i=0; i<nvtxs; i++) {
+        if (where[i] == other) {
+          for (j=xadj[i]; j<xadj[i+1]; j++) {
+            if (where[adjncy[j]] == me) {
+              ind[nind++] = i;
+              break;
+            }
+          }
+        }
+      }
+
+      /* Go and construct the otherpmat to see where these nind vertices are connected to */
+      for (cpwgt=0, ii=0; ii<nind; ii++) {
+        i = ind[ii];
+        cpwgt += vwgt[i];
+
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          k = adjncy[j];
+          if (where[k] != other) 
+            otherpmat[where[k]] += adjwgt[j];
+        }
+      }
+
+      for (ncand=0, i=0; i<nparts; i++) {
+        if (otherpmat[i] > 0) {
+          cand[ncand].key = -otherpmat[i];
+          cand[ncand++].val = i;
+        }
+      }
+      ikeysort(ncand, cand);
+
+      /* 
+       * Go through and the select the first domain that is common with 'me', and
+       * does not increase the ndoms[target] higher than my ndoms, subject to the
+       * maxpwgt constraint. Traversal is done from the mostly connected to the least.
+       */
+      target = target2 = -1;
+      for (i=0; i<ncand; i++) {
+        k = cand[i].val;
+
+        if (mypmat[k] > 0) {
+          if (pwgts[k] + cpwgt > maxpwgt[k])  /* Check if balance will go off */
+            continue;
+
+          for (j=0; j<nparts; j++) {
+            if (otherpmat[j] > 0 && ndoms[j] >= ndoms[me]-1 && pmat[nparts*j+k] == 0)
+              break;
+          }
+          if (j == nparts) { /* No bad second level effects */
+            for (nadd=0, j=0; j<nparts; j++) {
+              if (otherpmat[j] > 0 && pmat[nparts*k+j] == 0)
+                nadd++;
+            }
+
+            /*printf("\t\tto=%d, nadd=%d, %d\n", k, nadd, ndoms[k]);*/
+            if (target2 == -1 && ndoms[k]+nadd < ndoms[me]) {
+              target2 = k;
+            }
+            if (nadd == 0) {
+              target = k;
+              break;
+            }
+          }
+        }
+      }
+      if (target == -1 && target2 != -1)
+        target = target2;
+
+      if (target == -1) {
+        /* printf("\t\tCould not make the move\n");*/
+        continue;
+      }
+
+      /*printf("\t\tMoving to %d\n", target);*/
+
+      /* Update the partition weights */
+      INC_DEC(pwgts[target], pwgts[other], cpwgt);
+
+      /* Set all nind vertices to belong to 'target' */
+      for (ii=0; ii<nind; ii++) {
+        i = ind[ii];
+        where[i] = target;
+
+        /* First remove any contribution that this vertex may have made */
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          k = adjncy[j];
+          if (where[k] != other) {
+            if (pmat[nparts*other + where[k]] == 0)
+              printf("Something wrong\n");
+            pmat[nparts*other + where[k]] -= adjwgt[j];
+            if (pmat[nparts*other + where[k]] == 0)
+              ndoms[other]--;
+
+            if (pmat[nparts*where[k] + other] == 0)
+              printf("Something wrong\n");
+            pmat[nparts*where[k] + other] -= adjwgt[j];
+            if (pmat[nparts*where[k] + other] == 0)
+              ndoms[where[k]]--;
+          }
+        }
+
+        /* Next add the new contributions as a result of the move */
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          k = adjncy[j];
+          if (where[k] != target) {
+            if (pmat[nparts*target + where[k]] == 0)
+              ndoms[target]++;
+            pmat[nparts*target + where[k]] += adjwgt[j];
+  
+            if (pmat[nparts*where[k] + target] == 0)
+              ndoms[where[k]]++;
+            pmat[nparts*where[k] + target] += adjwgt[j];
+          }
+        }
+      }
+
+      move = 1;
+      break;
+    }
+
+    if (move == 0)
+      break;
+  }
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+
+  GKfree(&cand, &cand2, LTERM);
+}
+
+
+
+/*************************************************************************
+* This function finds all the connected components induced by the 
+* partitioning vector in wgraph->where and tries to push them around to 
+* remove some of them
+**************************************************************************/
+void EliminateVolComponents(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, float ubfactor)
+{
+  int i, ii, j, jj, k, me, nvtxs, tvwgt, first, last, nleft, ncmps, cwgt, ncand, other, target, deltawgt;
+  idxtype *xadj, *adjncy, *vwgt, *adjwgt, *where, *pwgts, *maxpwgt;
+  idxtype *cpvec, *touched, *perm, *todo, *cind, *cptr, *npcmps;
+  KeyValueType *cand;
+  int recompute=0;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  pwgts = idxset(nparts, 0, graph->pwgts);
+
+  touched = idxset(nvtxs, 0, idxwspacemalloc(ctrl, nvtxs));
+  cptr = idxwspacemalloc(ctrl, nvtxs);
+  cind = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  todo = idxwspacemalloc(ctrl, nvtxs);
+  maxpwgt = idxwspacemalloc(ctrl, nparts);
+  cpvec = idxwspacemalloc(ctrl, nparts);
+  npcmps = idxset(nparts, 0, idxwspacemalloc(ctrl, nparts));
+
+  for (i=0; i<nvtxs; i++) 
+    perm[i] = todo[i] = i;
+
+  /* Find the connected componends induced by the partition */
+  ncmps = -1;
+  first = last = 0;
+  nleft = nvtxs;
+  while (nleft > 0) {
+    if (first == last) { /* Find another starting vertex */
+      cptr[++ncmps] = first;
+      ASSERT(touched[todo[0]] == 0);
+      i = todo[0];
+      cind[last++] = i;
+      touched[i] = 1;
+      me = where[i];
+      npcmps[me]++;
+    }
+
+    i = cind[first++];
+    k = perm[i];
+    j = todo[k] = todo[--nleft];
+    perm[j] = k;
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (where[k] == me && !touched[k]) {
+        cind[last++] = k;
+        touched[k] = 1;
+      }
+    }
+  }
+  cptr[++ncmps] = first;
+
+  /* printf("I found %d components, for this %d-way partition\n", ncmps, nparts); */
+
+  if (ncmps > nparts) { /* There are more components than processors */
+    cand = (KeyValueType *)GKmalloc(nparts*sizeof(KeyValueType), "EliminateSubDomainEdges: cand");
+
+    /* First determine the partition sizes and max allowed load imbalance */
+    for (i=0; i<nvtxs; i++) 
+      pwgts[where[i]] += vwgt[i];
+    tvwgt = idxsum(nparts, pwgts);
+    for (i=0; i<nparts; i++)
+      maxpwgt[i] = ubfactor*tpwgts[i]*tvwgt;
+
+    deltawgt = tvwgt/(100*nparts);
+    deltawgt = 5;
+
+    for (i=0; i<ncmps; i++) {
+      me = where[cind[cptr[i]]];  /* Get the domain of this component */
+      if (npcmps[me] == 1)
+        continue;  /* Skip it because it is contigous */
+
+      /*printf("Trying to move %d from %d\n", i, me); */
+
+      /* Determine the connectivity */
+      idxset(nparts, 0, cpvec);
+      for (cwgt=0, j=cptr[i]; j<cptr[i+1]; j++) {
+        ii = cind[j];
+        cwgt += vwgt[ii];
+        for (jj=xadj[ii]; jj<xadj[ii+1]; jj++) {
+          other = where[adjncy[jj]];
+          if (me != other)
+            cpvec[other] += adjwgt[jj];
+        }
+      }
+
+      /*printf("\tCmp weight: %d\n", cwgt);*/
+
+      if (cwgt > .30*pwgts[me])
+        continue;  /* Skip the component if it is over 30% of the weight */
+
+      for (ncand=0, j=0; j<nparts; j++) {
+        if (cpvec[j] > 0) {
+          cand[ncand].key = -cpvec[j];
+          cand[ncand++].val = j;
+        }
+      }
+      if (ncand == 0)
+        continue;
+
+      ikeysort(ncand, cand);
+
+      target = -1;
+      for (j=0; j<ncand; j++) {
+        k = cand[j].val;
+        if (cwgt < deltawgt || pwgts[k] + cwgt < maxpwgt[k]) {
+          target = k;
+          break;
+        }
+      }
+
+      /*printf("\tMoving it to %d [%d]\n", target, cpvec[target]);*/
+
+      if (target != -1) {
+        /* Assign all the vertices of 'me' to 'target' and update data structures */
+        pwgts[me] -= cwgt;
+        pwgts[target] += cwgt;
+        npcmps[me]--;
+
+        for (j=cptr[i]; j<cptr[i+1]; j++) 
+          where[cind[j]] = target;
+
+        graph->mincut -= cpvec[target];
+        recompute = 1;
+      }
+    }
+
+    free(cand);
+  }
+
+  if (recompute) {
+    int ttlv;
+    idxtype *marker;
+
+    marker = idxset(nparts, -1, cpvec);
+    for (ttlv=0, i=0; i<nvtxs; i++) {
+      marker[where[i]] = i;
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        if (marker[where[adjncy[j]]] != i) {
+          ttlv += graph->vsize[i];
+          marker[where[adjncy[j]]] = i;
+        }
+      }
+    }
+    graph->minvol = ttlv;
+  }
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayvolrefine.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayvolrefine.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/kwayvolrefine.c	(revision 9501)
@@ -0,0 +1,460 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * kwayvolrefine.c
+ *
+ * This file contains the driving routines for multilevel k-way refinement
+ *
+ * Started 7/28/97
+ * George
+ *
+ * $Id: kwayvolrefine.c,v 1.2 1998/11/30 16:13:57 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of refinement
+**************************************************************************/
+void RefineVolKWay(CtrlType *ctrl, GraphType *orggraph, GraphType *graph, int nparts, 
+                   float *tpwgts, float ubfactor)
+{
+  int i, nlevels;
+  GraphType *ptr;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->UncoarsenTmr));
+
+  /* Take care any non-contiguity */
+  if (ctrl->RType == RTYPE_KWAYRANDOM_MCONN) {
+    ComputeVolKWayPartitionParams(ctrl, graph, nparts);
+    EliminateVolComponents(ctrl, graph, nparts, tpwgts, 1.25);
+    EliminateVolSubDomainEdges(ctrl, graph, nparts, tpwgts);
+    EliminateVolComponents(ctrl, graph, nparts, tpwgts, 1.25);
+  }
+
+
+  /* Determine how many levels are there */
+  for (ptr=graph, nlevels=0; ptr!=orggraph; ptr=ptr->finer, nlevels++); 
+
+  /* Compute the parameters of the coarsest graph */
+  ComputeVolKWayPartitionParams(ctrl, graph, nparts);
+
+  for (i=0; ;i++) {
+    /*PrintSubDomainGraph(graph, nparts, graph->where);*/
+    MALLOC_CHECK(NULL);
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->RefTmr));
+
+    if (2*i >= nlevels && !IsBalanced(graph->pwgts, nparts, tpwgts, 1.04*ubfactor)) {
+      ComputeVolKWayBalanceBoundary(ctrl, graph, nparts);
+      switch (ctrl->RType) {
+        case RTYPE_KWAYRANDOM:
+          Greedy_KWayVolBalance(ctrl, graph, nparts, tpwgts, ubfactor, 1); 
+          break;
+        case RTYPE_KWAYRANDOM_MCONN:
+          Greedy_KWayVolBalanceMConn(ctrl, graph, nparts, tpwgts, ubfactor, 1); 
+          break;
+      }
+      ComputeVolKWayBoundary(ctrl, graph, nparts);
+    }
+
+    switch (ctrl->RType) {
+      case RTYPE_KWAYRANDOM:
+        Random_KWayVolRefine(ctrl, graph, nparts, tpwgts, ubfactor, 10, 0); 
+        break;
+      case RTYPE_KWAYRANDOM_MCONN:
+        Random_KWayVolRefineMConn(ctrl, graph, nparts, tpwgts, ubfactor, 10, 0); 
+        break;
+    }
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->RefTmr));
+
+    if (graph == orggraph)
+      break;
+
+    GKfree(&graph->gdata, LTERM);  /* Deallocate the graph related arrays */
+
+    graph = graph->finer;
+
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ProjectTmr));
+    ProjectVolKWayPartition(ctrl, graph, nparts);
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ProjectTmr));
+  }
+
+  if (!IsBalanced(graph->pwgts, nparts, tpwgts, ubfactor)) {
+    ComputeVolKWayBalanceBoundary(ctrl, graph, nparts);
+    switch (ctrl->RType) {
+      case RTYPE_KWAYRANDOM:
+        Greedy_KWayVolBalance(ctrl, graph, nparts, tpwgts, ubfactor, 8); 
+        Random_KWayVolRefine(ctrl, graph, nparts, tpwgts, ubfactor, 10, 0); 
+        break;
+      case RTYPE_KWAYRANDOM_MCONN:
+        Greedy_KWayVolBalanceMConn(ctrl, graph, nparts, tpwgts, ubfactor, 8); 
+        Random_KWayVolRefineMConn(ctrl, graph, nparts, tpwgts, ubfactor, 10, 0); 
+        break;
+    }
+  }
+
+  EliminateVolComponents(ctrl, graph, nparts, tpwgts, ubfactor); 
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->UncoarsenTmr));
+}
+
+
+
+/*************************************************************************
+* This function allocates memory for k-way edge refinement
+**************************************************************************/
+void AllocateVolKWayPartitionMemory(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int nvtxs, pad64;
+
+  nvtxs = graph->nvtxs;
+
+  pad64 = (3*nvtxs+nparts)%2;
+
+  graph->rdata = idxmalloc(3*nvtxs+nparts+(sizeof(VRInfoType)/sizeof(idxtype))*nvtxs+pad64, "AllocateVolKWayPartitionMemory: rdata");
+  graph->pwgts          = graph->rdata;
+  graph->where          = graph->rdata + nparts;
+  graph->bndptr         = graph->rdata + nvtxs + nparts;
+  graph->bndind         = graph->rdata + 2*nvtxs + nparts;
+  graph->vrinfo          = (VRInfoType *)(graph->rdata + 3*nvtxs+nparts + pad64);
+
+}
+
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void ComputeVolKWayPartitionParams(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, ii, j, k, kk, l, nvtxs, nbnd, mincut, minvol, me, other, pid; 
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *pwgts, *where;
+  VRInfoType *rinfo, *myrinfo, *orinfo;
+  VEDegreeType *myedegrees, *oedegrees;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  pwgts = idxset(nparts, 0, graph->pwgts);
+  rinfo = graph->vrinfo;
+
+
+  /*------------------------------------------------------------
+  / Compute now the id/ed degrees
+  /------------------------------------------------------------*/
+  ctrl->wspace.cdegree = 0;
+  mincut = 0;
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+    pwgts[me] += vwgt[i];
+
+    myrinfo = rinfo+i;
+    myrinfo->id = myrinfo->ed = myrinfo->nid = myrinfo->ndegrees = 0;
+    myrinfo->edegrees = NULL;
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (me == where[adjncy[j]]) {
+        myrinfo->id += adjwgt[j];
+        myrinfo->nid++;
+      }
+    }
+    myrinfo->ed = graph->adjwgtsum[i] - myrinfo->id;
+
+    mincut += myrinfo->ed;
+
+    /* Time to compute the particular external degrees */
+    if (myrinfo->ed > 0) { 
+      myedegrees = myrinfo->edegrees = ctrl->wspace.vedegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += xadj[i+1]-xadj[i];
+
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        other = where[adjncy[j]];
+        if (me != other) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == other) {
+              myedegrees[k].ed += adjwgt[j];
+              myedegrees[k].ned++;
+              break;
+            }
+          }
+          if (k == myrinfo->ndegrees) {
+            myedegrees[myrinfo->ndegrees].gv = 0;
+            myedegrees[myrinfo->ndegrees].pid = other;
+            myedegrees[myrinfo->ndegrees].ed = adjwgt[j];
+            myedegrees[myrinfo->ndegrees++].ned = 1;
+          }
+        }
+      }
+
+      ASSERT(myrinfo->ndegrees <= xadj[i+1]-xadj[i]);
+    }
+  }
+  graph->mincut = mincut/2;
+
+
+  ComputeKWayVolGains(ctrl, graph, nparts);
+
+}
+
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void ComputeKWayVolGains(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, ii, j, k, kk, l, nvtxs, me, other, pid, myndegrees; 
+  idxtype *xadj, *vsize, *adjncy, *adjwgt, *where, *bndind, *bndptr, *ophtable;
+  VRInfoType *rinfo, *myrinfo, *orinfo;
+  VEDegreeType *myedegrees, *oedegrees;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vsize = graph->vsize;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+  rinfo = graph->vrinfo;
+
+  ophtable = idxset(nparts, -1, idxwspacemalloc(ctrl, nparts));
+
+  /*------------------------------------------------------------
+  / Compute now the iv/ev degrees
+  /------------------------------------------------------------*/
+  graph->minvol = graph->nbnd = 0;
+  for (i=0; i<nvtxs; i++) {
+    myrinfo = rinfo+i;
+    myrinfo->gv = -MAXIDX;
+
+    if (myrinfo->ndegrees > 0) {
+      me = where[i];
+      myedegrees = myrinfo->edegrees;
+      myndegrees = myrinfo->ndegrees;
+
+      graph->minvol += myndegrees*vsize[i];
+
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        ii = adjncy[j];
+        other = where[ii];
+        orinfo = rinfo+ii;
+        oedegrees = orinfo->edegrees;
+
+        for (k=0; k<orinfo->ndegrees; k++) 
+          ophtable[oedegrees[k].pid] = k;
+        ophtable[other] = 1;  /* this is to simplify coding */
+
+        if (me == other) {
+          /* Find which domains 'i' is connected and 'ii' is not and update their gain */
+          for (k=0; k<myndegrees; k++) {
+            if (ophtable[myedegrees[k].pid] == -1)
+              myedegrees[k].gv -= vsize[ii];
+          }
+        }
+        else {
+          ASSERT(ophtable[me] != -1);
+
+          if (oedegrees[ophtable[me]].ned == 1) { /* I'm the only connection of 'ii' in 'me' */
+            /* Increase the gains for all the common domains between 'i' and 'ii' */
+            for (k=0; k<myndegrees; k++) {
+              if (ophtable[myedegrees[k].pid] != -1) 
+                myedegrees[k].gv += vsize[ii];
+            }
+          }
+          else {
+            /* Find which domains 'i' is connected and 'ii' is not and update their gain */
+            for (k=0; k<myndegrees; k++) {
+              if (ophtable[myedegrees[k].pid] == -1) 
+                myedegrees[k].gv -= vsize[ii];
+            }
+          }
+        }
+
+        for (kk=0; kk<orinfo->ndegrees; kk++) 
+          ophtable[oedegrees[kk].pid] = -1;
+        ophtable[other] = -1;
+      }
+
+      /* Compute the max vgain */
+      for (k=0; k<myndegrees; k++) {
+        if (myedegrees[k].gv > myrinfo->gv)
+          myrinfo->gv = myedegrees[k].gv;
+      }
+    }
+
+    if (myrinfo->ed > 0 && myrinfo->id == 0) 
+      myrinfo->gv += vsize[i];
+
+    if (myrinfo->gv >= 0 || myrinfo->ed-myrinfo->id >= 0)
+      BNDInsert(graph->nbnd, bndind, bndptr, i);
+  }
+
+  idxwspacefree(ctrl, nparts);
+
+}
+
+
+
+/*************************************************************************
+* This function projects a partition, and at the same time computes the
+* parameters for refinement.
+**************************************************************************/
+void ProjectVolKWayPartition(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, j, k, nvtxs, me, other, istart, iend, ndegrees;
+  idxtype *xadj, *adjncy, *adjwgt, *adjwgtsum;
+  idxtype *cmap, *where;
+  idxtype *cwhere;
+  GraphType *cgraph;
+  VRInfoType *crinfo, *rinfo, *myrinfo;
+  VEDegreeType *myedegrees;
+  idxtype *htable;
+
+  cgraph = graph->coarser;
+  cwhere = cgraph->where;
+  crinfo = cgraph->vrinfo;
+
+  nvtxs = graph->nvtxs;
+  cmap = graph->cmap;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+
+  AllocateVolKWayPartitionMemory(ctrl, graph, nparts);
+  where = graph->where;
+  rinfo = graph->vrinfo;
+
+  /* Go through and project partition and compute id/ed for the nodes */
+  for (i=0; i<nvtxs; i++) {
+    k = cmap[i];
+    where[i] = cwhere[k];
+    cmap[i] = crinfo[k].ed;  /* For optimization */
+  }
+
+  htable = idxset(nparts, -1, idxwspacemalloc(ctrl, nparts));
+
+  ctrl->wspace.cdegree = 0;
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+
+    myrinfo = rinfo+i;
+    myrinfo->id = myrinfo->ed = myrinfo->nid = myrinfo->ndegrees = 0;
+    myrinfo->edegrees = NULL;
+
+    myrinfo->id = adjwgtsum[i];
+    myrinfo->nid = xadj[i+1]-xadj[i];
+
+    if (cmap[i] > 0) { /* If it is an interface node. Note cmap[i] = crinfo[cmap[i]].ed */
+      istart = xadj[i];
+      iend = xadj[i+1];
+
+      myedegrees = myrinfo->edegrees = ctrl->wspace.vedegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += iend-istart;
+
+      ndegrees = 0;
+      for (j=istart; j<iend; j++) {
+        other = where[adjncy[j]];
+        if (me != other) {
+          myrinfo->ed += adjwgt[j];
+          myrinfo->nid--;
+          if ((k = htable[other]) == -1) {
+            htable[other] = ndegrees;
+            myedegrees[ndegrees].gv = 0;
+            myedegrees[ndegrees].pid = other;
+            myedegrees[ndegrees].ed = adjwgt[j];
+            myedegrees[ndegrees++].ned = 1;
+          }
+          else {
+            myedegrees[k].ed += adjwgt[j];
+            myedegrees[k].ned++;
+          }
+        }
+      }
+      myrinfo->id -= myrinfo->ed;
+
+      /* Remove space for edegrees if it was interior */
+      if (myrinfo->ed == 0) { 
+        myrinfo->edegrees = NULL;
+        ctrl->wspace.cdegree -= iend-istart;
+      }
+      else {
+        myrinfo->ndegrees = ndegrees;
+
+        for (j=0; j<ndegrees; j++)
+          htable[myedegrees[j].pid] = -1;
+      }
+    }
+  }
+
+  ComputeKWayVolGains(ctrl, graph, nparts);
+
+  idxcopy(nparts, cgraph->pwgts, graph->pwgts);
+  graph->mincut = cgraph->mincut;
+
+  FreeGraph(graph->coarser);
+  graph->coarser = NULL;
+
+  idxwspacefree(ctrl, nparts);
+
+}
+
+
+
+/*************************************************************************
+* This function computes the boundary definition for balancing
+**************************************************************************/
+void ComputeVolKWayBoundary(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, nvtxs, nbnd;
+  idxtype *bndind, *bndptr;
+
+  nvtxs = graph->nvtxs;
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+
+
+  /*------------------------------------------------------------
+  / Compute the new boundary
+  /------------------------------------------------------------*/
+  nbnd = 0;
+  for (i=0; i<nvtxs; i++) {
+    if (graph->vrinfo[i].gv >=0 || graph->vrinfo[i].ed-graph->vrinfo[i].id >= 0) 
+      BNDInsert(nbnd, bndind, bndptr, i);
+  }
+
+  graph->nbnd = nbnd;
+}
+
+/*************************************************************************
+* This function computes the boundary definition for balancing
+**************************************************************************/
+void ComputeVolKWayBalanceBoundary(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, nvtxs, nbnd;
+  idxtype *bndind, *bndptr;
+
+  nvtxs = graph->nvtxs;
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+
+
+  /*------------------------------------------------------------
+  / Compute the new boundary
+  /------------------------------------------------------------*/
+  nbnd = 0;
+  for (i=0; i<nvtxs; i++) {
+    if (graph->vrinfo[i].ed > 0) 
+      BNDInsert(nbnd, bndind, bndptr, i);
+  }
+
+  graph->nbnd = nbnd;
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/macros.h
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/macros.h	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/macros.h	(revision 9501)
@@ -0,0 +1,143 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * macros.h
+ *
+ * This file contains macros used in multilevel
+ *
+ * Started 9/25/94
+ * George
+ *
+ * $Id: macros.h,v 1.1 1998/11/27 17:59:18 karypis Exp $
+ *
+ */
+
+
+/*************************************************************************
+* The following macro returns a random number in the specified range
+**************************************************************************/
+#ifdef __VC__
+#define RandomInRange(u) ((rand()>>3)%(u))
+#define RandomInRangeFast(u) ((rand()>>3)%(u))
+#else
+#define RandomInRange(u) ((int)(drand48()*((double)(u))))
+#define RandomInRangeFast(u) ((rand()>>3)%(u))
+#endif
+
+
+
+#define amax(a, b) ((a) >= (b) ? (a) : (b))
+#define amin(a, b) ((a) >= (b) ? (b) : (a))
+
+#define AND(a, b) ((a) < 0 ? ((-(a))&(b)) : ((a)&(b)))
+#define OR(a, b) ((a) < 0 ? -((-(a))|(b)) : ((a)|(b)))
+#define XOR(a, b) ((a) < 0 ? -((-(a))^(b)) : ((a)^(b)))
+
+#define SWAP(a, b, tmp)  \
+                 do {(tmp) = (a); (a) = (b); (b) = (tmp);} while(0) 
+
+#define INC_DEC(a, b, val) \
+                 do {(a) += (val); (b) -= (val);} while(0)
+
+
+#define scopy(n, a, b) (float *)memcpy((void *)(b), (void *)(a), sizeof(float)*(n))
+#define idxcopy(n, a, b) (idxtype *)memcpy((void *)(b), (void *)(a), sizeof(idxtype)*(n)) 
+
+#define HASHFCT(key, size) ((key)%(size))
+
+
+/*************************************************************************
+* Timer macros
+**************************************************************************/
+#define cleartimer(tmr) (tmr = 0.0)
+#define starttimer(tmr) (tmr -= seconds())
+#define stoptimer(tmr) (tmr += seconds())
+#define gettimer(tmr) (tmr)
+
+
+/*************************************************************************
+* This macro is used to handle dbglvl
+**************************************************************************/
+#define IFSET(a, flag, cmd) if ((a)&(flag)) (cmd);
+
+/*************************************************************************
+* These macros are used for debuging memory leaks
+**************************************************************************/
+#ifdef DMALLOC
+#define imalloc(n, msg) (malloc(sizeof(int)*(n)))
+#define fmalloc(n, msg) (malloc(sizeof(float)*(n)))
+#define idxmalloc(n, msg) (malloc(sizeof(idxtype)*(n)))
+#define ismalloc(n, val, msg) (iset((n), (val), malloc(sizeof(int)*(n))))
+#define idxsmalloc(n, val, msg) (idxset((n), (val), malloc(sizeof(idxtype)*(n))))
+#define GKmalloc(a, b) (malloc((a)))
+#endif
+
+#ifdef DMALLOC
+#   define MALLOC_CHECK(ptr)                                          \
+    if (malloc_verify((ptr)) == DMALLOC_VERIFY_ERROR) {  \
+        printf("***MALLOC_CHECK failed on line %d of file %s: " #ptr "\n", \
+              __LINE__, __FILE__);                               \
+        abort();                                                \
+    }
+#else
+#   define MALLOC_CHECK(ptr) ;
+#endif 
+
+
+
+/*************************************************************************
+* This macro converts a length array in a CSR one
+**************************************************************************/
+#define MAKECSR(i, n, a) \
+   do { \
+     for (i=1; i<n; i++) a[i] += a[i-1]; \
+     for (i=n; i>0; i--) a[i] = a[i-1]; \
+     a[0] = 0; \
+   } while(0) 
+
+
+/*************************************************************************
+* These macros insert and remove nodes from the boundary list
+**************************************************************************/
+#define BNDInsert(nbnd, bndind, bndptr, vtx) \
+   do { \
+     ASSERT(bndptr[vtx] == -1); \
+     bndind[nbnd] = vtx; \
+     bndptr[vtx] = nbnd++;\
+   } while(0) 
+
+#define BNDDelete(nbnd, bndind, bndptr, vtx) \
+   do { \
+     ASSERT(bndptr[vtx] != -1); \
+     bndind[bndptr[vtx]] = bndind[--nbnd]; \
+     bndptr[bndind[nbnd]] = bndptr[vtx]; \
+     bndptr[vtx] = -1; \
+   } while(0) 
+
+
+
+/*************************************************************************
+* These are debugging macros
+**************************************************************************/
+#ifdef DEBUG
+#   define ASSERT(expr)                                          \
+    if (!(expr)) {                                               \
+        printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
+              __LINE__, __FILE__);                               \
+        abort();                                                \
+    }
+#else
+#   define ASSERT(expr) ;
+#endif 
+
+#ifdef DEBUG
+#   define ASSERTP(expr, msg)                                          \
+    if (!(expr)) {                                               \
+        printf("***ASSERTION failed on line %d of file %s: " #expr "\n", \
+              __LINE__, __FILE__);                               \
+        printf msg ; \
+        abort();                                                \
+    }
+#else
+#   define ASSERTP(expr, msg) ;
+#endif 
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/match.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/match.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/match.c	(revision 9501)
@@ -0,0 +1,267 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * match.c
+ *
+ * This file contains the code that computes matchings and creates the next
+ * level coarse graph.
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: match.c,v 1.1 1998/11/27 17:59:18 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void Match_RM(CtrlType *ctrl, GraphType *graph)
+{
+  int i, ii, j, nvtxs, cnvtxs, maxidx;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt;
+  idxtype *match, *cmap, *perm;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  RandomPermute(nvtxs, perm, 1);
+
+  cnvtxs = 0;
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+
+      /* Find a random matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        if (match[adjncy[j]] == UNMATCHED && vwgt[i]+vwgt[adjncy[j]] <= ctrl->maxvwgt) {
+          maxidx = adjncy[j];
+          break;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  CreateCoarseGraph(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void Match_RM_NVW(CtrlType *ctrl, GraphType *graph)
+{
+  int i, ii, j, nvtxs, cnvtxs, maxidx;
+  idxtype *xadj, *adjncy;
+  idxtype *match, *cmap, *perm;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  RandomPermute(nvtxs, perm, 1);
+
+  cnvtxs = 0;
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+
+      /* Find a random matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        if (match[adjncy[j]] == UNMATCHED) {
+          maxidx = adjncy[j];
+          break;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  CreateCoarseGraph_NVW(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void Match_HEM(CtrlType *ctrl, GraphType *graph)
+{
+  int i, ii, j, k, nvtxs, cnvtxs, maxidx, maxwgt;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt;
+  idxtype *match, *cmap, *perm;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  RandomPermute(nvtxs, perm, 1);
+
+  cnvtxs = 0;
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+      maxwgt = 0;
+
+      /* Find a heavy-edge matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        k = adjncy[j];
+        if (match[k] == UNMATCHED && maxwgt < adjwgt[j] && vwgt[i]+vwgt[k] <= ctrl->maxvwgt) {
+          maxwgt = adjwgt[j];
+          maxidx = adjncy[j];
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  CreateCoarseGraph(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void Match_SHEM(CtrlType *ctrl, GraphType *graph)
+{
+  int i, ii, j, k, nvtxs, cnvtxs, maxidx, maxwgt, avgdegree;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt;
+  idxtype *match, *cmap, *degrees, *perm, *tperm;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  tperm = idxwspacemalloc(ctrl, nvtxs);
+  degrees = idxwspacemalloc(ctrl, nvtxs);
+
+  RandomPermute(nvtxs, tperm, 1);
+  avgdegree = 0.7*(xadj[nvtxs]/nvtxs);
+  for (i=0; i<nvtxs; i++) 
+    degrees[i] = (xadj[i+1]-xadj[i] > avgdegree ? avgdegree : xadj[i+1]-xadj[i]);
+  BucketSortKeysInc(nvtxs, avgdegree, degrees, tperm, perm);
+
+  cnvtxs = 0;
+
+  /* Take care any islands. Islands are matched with non-islands due to coarsening */
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      if (xadj[i] < xadj[i+1])
+        break;
+
+      maxidx = i;
+      for (j=nvtxs-1; j>ii; j--) {
+        k = perm[j];
+        if (match[k] == UNMATCHED && xadj[k] < xadj[k+1]) {
+          maxidx = k;
+          break;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  /* Continue with normal matching */
+  for (; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+      maxwgt = 0;
+
+      /* Find a heavy-edge matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        if (match[adjncy[j]] == UNMATCHED && maxwgt < adjwgt[j] && vwgt[i]+vwgt[adjncy[j]] <= ctrl->maxvwgt) {
+          maxwgt = adjwgt[j];
+          maxidx = adjncy[j];
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  idxwspacefree(ctrl, nvtxs);  /* degrees */
+  idxwspacefree(ctrl, nvtxs);  /* tperm */
+
+  CreateCoarseGraph(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mbalance.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mbalance.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mbalance.c	(revision 9501)
@@ -0,0 +1,260 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mbalance.c
+ *
+ * This file contains code that is used to forcefully balance either
+ * bisections or k-sections
+ *
+ * Started 7/29/97
+ * George
+ *
+ * $Id: mbalance.c,v 1.1 1998/11/27 17:59:19 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of the bisection balancing algorithms.
+**************************************************************************/
+void MocBalance2Way(CtrlType *ctrl, GraphType *graph, float *tpwgts, float lbfactor)
+{
+
+  if (Compute2WayHLoadImbalance(graph->ncon, graph->npwgts, tpwgts) < lbfactor)
+    return;
+
+  MocGeneral2WayBalance(ctrl, graph, tpwgts, lbfactor);
+
+}
+
+
+/*************************************************************************
+* This function performs an edge-based FM refinement
+**************************************************************************/
+void MocGeneral2WayBalance(CtrlType *ctrl, GraphType *graph, float *tpwgts, float lbfactor)
+{
+  int i, ii, j, k, l, kwgt, nvtxs, ncon, nbnd, nswaps, from, to, pass, me, limit, tmp, cnum;
+  idxtype *xadj, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind;
+  idxtype *moved, *swaps, *perm, *qnum;
+  float *nvwgt, *npwgts, mindiff[MAXNCON], origbal, minbal, newbal;
+  PQueueType parts[MAXNCON][2];
+  int higain, oldgain, mincut, newcut, mincutorder;
+  int qsizes[MAXNCON][2];
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  npwgts = graph->npwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  qnum = idxwspacemalloc(ctrl, nvtxs);
+
+  limit = amin(amax(0.01*nvtxs, 15), 100);
+
+  /* Initialize the queues */
+  for (i=0; i<ncon; i++) {
+    PQueueInit(ctrl, &parts[i][0], nvtxs, PLUS_GAINSPAN+1);
+    PQueueInit(ctrl, &parts[i][1], nvtxs, PLUS_GAINSPAN+1);
+    qsizes[i][0] = qsizes[i][1] = 0;
+  }
+
+  for (i=0; i<nvtxs; i++) {
+    qnum[i] = samax(ncon, nvwgt+i*ncon);
+    qsizes[qnum[i]][where[i]]++;
+  }
+
+/*
+  printf("Weight Distribution:    \t");
+  for (i=0; i<ncon; i++) 
+    printf(" [%d %d]", qsizes[i][0], qsizes[i][1]); 
+  printf("\n");
+*/
+
+  for (from=0; from<2; from++) {
+    for (j=0; j<ncon; j++) {
+      if (qsizes[j][from] == 0) {
+        for (i=0; i<nvtxs; i++) {
+          if (where[i] != from)
+            continue;
+
+          k = samax2(ncon, nvwgt+i*ncon);
+          if (k == j && qsizes[qnum[i]][from] > qsizes[j][from] && nvwgt[i*ncon+qnum[i]] < 1.3*nvwgt[i*ncon+j]) {
+            qsizes[qnum[i]][from]--;
+            qsizes[j][from]++;
+            qnum[i] = j;
+          }
+        }
+      }
+    }
+  }
+
+/*
+  printf("Weight Distribution (after):\t ");
+  for (i=0; i<ncon; i++) 
+    printf(" [%d %d]", qsizes[i][0], qsizes[i][1]); 
+  printf("\n");
+*/
+
+
+
+  for (i=0; i<ncon; i++) 
+    mindiff[i] = fabs(tpwgts[0]-npwgts[i]);
+  minbal = origbal = Compute2WayHLoadImbalance(ncon, npwgts, tpwgts);
+  newcut = mincut = graph->mincut;
+  mincutorder = -1;
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("Parts: [");
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf("] T[%.3f %.3f], Nv-Nb[%5d, %5d]. ICut: %6d, LB: %.3f [B]\n", tpwgts[0], tpwgts[1], graph->nvtxs, graph->nbnd, graph->mincut, origbal);
+  }
+
+  idxset(nvtxs, -1, moved);
+
+  ASSERT(ComputeCut(graph, where) == graph->mincut);
+  ASSERT(CheckBnd(graph));
+
+  /* Insert all nodes in the priority queues */
+  nbnd = graph->nbnd;
+  RandomPermute(nvtxs, perm, 1);
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+    PQueueInsert(&parts[qnum[i]][where[i]], i, ed[i]-id[i]);
+  }
+
+  for (nswaps=0; nswaps<nvtxs; nswaps++) {
+    if (minbal < lbfactor)
+      break;
+
+    SelectQueue(ncon, npwgts, tpwgts, &from, &cnum, parts);
+    to = (from+1)%2;
+
+    if (from == -1 || (higain = PQueueGetMax(&parts[cnum][from])) == -1)
+      break;
+
+    saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+    saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+    newcut -= (ed[higain]-id[higain]);
+    newbal = Compute2WayHLoadImbalance(ncon, npwgts, tpwgts);
+
+    if (newbal < minbal || (newbal == minbal && 
+        (newcut < mincut || (newcut == mincut && BetterBalance(ncon, npwgts, tpwgts, mindiff))))) {
+      mincut = newcut;
+      minbal = newbal;
+      mincutorder = nswaps;
+      for (i=0; i<ncon; i++)
+        mindiff[i] = fabs(tpwgts[0]-npwgts[i]);
+    }
+    else if (nswaps-mincutorder > limit) { /* We hit the limit, undo last move */
+      newcut += (ed[higain]-id[higain]);
+      saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+      saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+      break;
+    }
+
+    where[higain] = to;
+    moved[higain] = nswaps;
+    swaps[nswaps] = higain;
+
+    if (ctrl->dbglvl&DBG_MOVEINFO) {
+      printf("Moved %6d from %d(%d). Gain: %5d, Cut: %5d, NPwgts: ", higain, from, cnum, ed[higain]-id[higain], newcut);
+      for (l=0; l<ncon; l++) 
+        printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+      printf(", %.3f LB: %.3f\n", minbal, newbal);
+    }
+
+
+    /**************************************************************
+    * Update the id[i]/ed[i] values of the affected nodes
+    ***************************************************************/
+    SWAP(id[higain], ed[higain], tmp);
+    if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1]) 
+      BNDDelete(nbnd, bndind,  bndptr, higain);
+    if (ed[higain] > 0 && bndptr[higain] == -1)
+      BNDInsert(nbnd, bndind,  bndptr, higain);
+
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+      oldgain = ed[k]-id[k];
+
+      kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+      INC_DEC(id[k], ed[k], kwgt);
+
+      /* Update the queue position */
+      if (moved[k] == -1)
+        PQueueUpdate(&parts[qnum[k]][where[k]], k, oldgain, ed[k]-id[k]);
+
+      /* Update its boundary information */
+      if (ed[k] == 0 && bndptr[k] != -1) 
+        BNDDelete(nbnd, bndind, bndptr, k);
+      else if (ed[k] > 0 && bndptr[k] == -1)  
+        BNDInsert(nbnd, bndind, bndptr, k);
+    }
+  }
+
+
+
+  /****************************************************************
+  * Roll back computations
+  *****************************************************************/
+  for (nswaps--; nswaps>mincutorder; nswaps--) {
+    higain = swaps[nswaps];
+
+    to = where[higain] = (where[higain]+1)%2;
+    SWAP(id[higain], ed[higain], tmp);
+    if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1])
+      BNDDelete(nbnd, bndind,  bndptr, higain);
+    else if (ed[higain] > 0 && bndptr[higain] == -1)
+      BNDInsert(nbnd, bndind,  bndptr, higain);
+
+    saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+    saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+((to+1)%2)*ncon, 1);
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+
+      kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+      INC_DEC(id[k], ed[k], kwgt);
+
+      if (bndptr[k] != -1 && ed[k] == 0)
+        BNDDelete(nbnd, bndind, bndptr, k);
+      if (bndptr[k] == -1 && ed[k] > 0)
+        BNDInsert(nbnd, bndind, bndptr, k);
+    }
+  }
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("\tMincut: %6d at %5d, NBND: %6d, NPwgts: [", mincut, mincutorder, nbnd);
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf("], LB: %.3f\n", Compute2WayHLoadImbalance(ncon, npwgts, tpwgts));
+  }
+
+  graph->mincut = mincut;
+  graph->nbnd = nbnd;
+
+
+  for (i=0; i<ncon; i++) {
+    PQueueFree(ctrl, &parts[i][0]);
+    PQueueFree(ctrl, &parts[i][1]);
+  }
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mbalance2.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mbalance2.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mbalance2.c	(revision 9501)
@@ -0,0 +1,328 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mbalance2.c
+ *
+ * This file contains code that is used to forcefully balance either
+ * bisections or k-sections
+ *
+ * Started 7/29/97
+ * George
+ *
+ * $Id: mbalance2.c,v 1.1 1998/11/27 17:59:19 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of the bisection balancing algorithms.
+**************************************************************************/
+void MocBalance2Way2(CtrlType *ctrl, GraphType *graph, float *tpwgts, float *ubvec)
+{
+  int i;
+  float tvec[MAXNCON];
+
+  Compute2WayHLoadImbalanceVec(graph->ncon, graph->npwgts, tpwgts, tvec);
+  if (!AreAllBelow(graph->ncon, tvec, ubvec))
+    MocGeneral2WayBalance2(ctrl, graph, tpwgts, ubvec);
+}
+
+
+
+/*************************************************************************
+* This function performs an edge-based FM refinement
+**************************************************************************/
+void MocGeneral2WayBalance2(CtrlType *ctrl, GraphType *graph, float *tpwgts, float *ubvec)
+{
+  int i, ii, j, k, l, kwgt, nvtxs, ncon, nbnd, nswaps, from, to, pass, me, limit, tmp, cnum;
+  idxtype *xadj, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind;
+  idxtype *moved, *swaps, *perm, *qnum;
+  float *nvwgt, *npwgts, origbal[MAXNCON], minbal[MAXNCON], newbal[MAXNCON];
+  PQueueType parts[MAXNCON][2];
+  int higain, oldgain, mincut, newcut, mincutorder;
+  float *maxwgt, *minwgt, tvec[MAXNCON];
+
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  npwgts = graph->npwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  qnum = idxwspacemalloc(ctrl, nvtxs);
+
+  limit = amin(amax(0.01*nvtxs, 15), 100);
+
+  /* Setup the weight intervals of the two subdomains */
+  minwgt = fwspacemalloc(ctrl, 2*ncon);
+  maxwgt = fwspacemalloc(ctrl, 2*ncon);
+
+  for (i=0; i<2; i++) {
+    for (j=0; j<ncon; j++) {
+      maxwgt[i*ncon+j] = tpwgts[i]*ubvec[j];
+      minwgt[i*ncon+j] = tpwgts[i]*(1.0/ubvec[j]);
+    }
+  }
+
+
+  /* Initialize the queues */
+  for (i=0; i<ncon; i++) {
+    PQueueInit(ctrl, &parts[i][0], nvtxs, PLUS_GAINSPAN+1);
+    PQueueInit(ctrl, &parts[i][1], nvtxs, PLUS_GAINSPAN+1);
+  }
+  for (i=0; i<nvtxs; i++)
+    qnum[i] = samax(ncon, nvwgt+i*ncon);
+
+  Compute2WayHLoadImbalanceVec(ncon, npwgts, tpwgts, origbal);
+  for (i=0; i<ncon; i++) 
+    minbal[i] = origbal[i];
+
+  newcut = mincut = graph->mincut;
+  mincutorder = -1;
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("Parts: [");
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf("] T[%.3f %.3f], Nv-Nb[%5d, %5d]. ICut: %6d, LB: ", tpwgts[0], tpwgts[1], 
+            graph->nvtxs, graph->nbnd, graph->mincut);
+    for (i=0; i<ncon; i++)
+      printf("%.3f ", origbal[i]);
+    printf("[B]\n");
+  }
+
+  idxset(nvtxs, -1, moved);
+
+  ASSERT(ComputeCut(graph, where) == graph->mincut);
+  ASSERT(CheckBnd(graph));
+
+  /* Insert all nodes in the priority queues */
+  nbnd = graph->nbnd;
+  RandomPermute(nvtxs, perm, 1);
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+    PQueueInsert(&parts[qnum[i]][where[i]], i, ed[i]-id[i]);
+  }
+
+
+  for (nswaps=0; nswaps<nvtxs; nswaps++) {
+    if (AreAllBelow(ncon, minbal, ubvec))
+      break;
+
+    SelectQueue3(ncon, npwgts, tpwgts, &from, &cnum, parts, maxwgt);
+    to = (from+1)%2;
+
+    if (from == -1 || (higain = PQueueGetMax(&parts[cnum][from])) == -1)
+      break;
+
+    saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+    saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+    newcut -= (ed[higain]-id[higain]);
+    Compute2WayHLoadImbalanceVec(ncon, npwgts, tpwgts, newbal);
+
+    if (IsBetter2wayBalance(ncon, newbal, minbal, ubvec) || 
+        (IsBetter2wayBalance(ncon, newbal, origbal, ubvec) && newcut < mincut)) {
+      mincut = newcut;
+      for (i=0; i<ncon; i++) 
+        minbal[i] = newbal[i];
+      mincutorder = nswaps;
+    }
+    else if (nswaps-mincutorder > limit) { /* We hit the limit, undo last move */
+      newcut += (ed[higain]-id[higain]);
+      saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+      saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+      break;
+    }
+
+    where[higain] = to;
+    moved[higain] = nswaps;
+    swaps[nswaps] = higain;
+
+    if (ctrl->dbglvl&DBG_MOVEINFO) {
+      printf("Moved %6d from %d(%d). Gain: %5d, Cut: %5d, NPwgts: ", higain, from, cnum, ed[higain]-id[higain], newcut);
+      for (i=0; i<ncon; i++) 
+        printf("(%.3f, %.3f) ", npwgts[i], npwgts[ncon+i]);
+
+      Compute2WayHLoadImbalanceVec(ncon, npwgts, tpwgts, tvec);
+      printf(", LB: ");
+      for (i=0; i<ncon; i++) 
+        printf("%.3f ", tvec[i]);
+      if (mincutorder == nswaps)
+        printf(" *\n");
+      else
+        printf("\n");
+    }
+
+
+    /**************************************************************
+    * Update the id[i]/ed[i] values of the affected nodes
+    ***************************************************************/
+    SWAP(id[higain], ed[higain], tmp);
+    if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1]) 
+      BNDDelete(nbnd, bndind,  bndptr, higain);
+    if (ed[higain] > 0 && bndptr[higain] == -1)
+      BNDInsert(nbnd, bndind,  bndptr, higain);
+
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+      oldgain = ed[k]-id[k];
+
+      kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+      INC_DEC(id[k], ed[k], kwgt);
+
+      /* Update the queue position */
+      if (moved[k] == -1)
+        PQueueUpdate(&parts[qnum[k]][where[k]], k, oldgain, ed[k]-id[k]);
+
+      /* Update its boundary information */
+      if (ed[k] == 0 && bndptr[k] != -1) 
+        BNDDelete(nbnd, bndind, bndptr, k);
+      else if (ed[k] > 0 && bndptr[k] == -1)  
+        BNDInsert(nbnd, bndind, bndptr, k);
+    }
+   
+  }
+
+
+
+  /****************************************************************
+  * Roll back computations
+  *****************************************************************/
+  for (i=0; i<nswaps; i++)
+    moved[swaps[i]] = -1;  /* reset moved array */
+  for (nswaps--; nswaps>mincutorder; nswaps--) {
+    higain = swaps[nswaps];
+
+    to = where[higain] = (where[higain]+1)%2;
+    SWAP(id[higain], ed[higain], tmp);
+    if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1])
+      BNDDelete(nbnd, bndind,  bndptr, higain);
+    else if (ed[higain] > 0 && bndptr[higain] == -1)
+      BNDInsert(nbnd, bndind,  bndptr, higain);
+
+    saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+    saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+((to+1)%2)*ncon, 1);
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+
+      kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+      INC_DEC(id[k], ed[k], kwgt);
+
+      if (bndptr[k] != -1 && ed[k] == 0)
+        BNDDelete(nbnd, bndind, bndptr, k);
+      if (bndptr[k] == -1 && ed[k] > 0)
+        BNDInsert(nbnd, bndind, bndptr, k);
+    }
+  }
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("\tMincut: %6d at %5d, NBND: %6d, NPwgts: [", mincut, mincutorder, nbnd);
+    for (i=0; i<ncon; i++)
+      printf("(%.3f, %.3f) ", npwgts[i], npwgts[ncon+i]);
+    printf("], LB: ");
+    Compute2WayHLoadImbalanceVec(ncon, npwgts, tpwgts, tvec);
+    for (i=0; i<ncon; i++) 
+      printf("%.3f ", tvec[i]);
+    printf("\n");
+  }
+
+  graph->mincut = mincut;
+  graph->nbnd = nbnd;
+
+
+  for (i=0; i<ncon; i++) {
+    PQueueFree(ctrl, &parts[i][0]);
+    PQueueFree(ctrl, &parts[i][1]);
+  }
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  fwspacefree(ctrl, 2*ncon);
+  fwspacefree(ctrl, 2*ncon);
+
+}
+
+
+
+
+/*************************************************************************
+* This function selects the partition number and the queue from which
+* we will move vertices out
+**************************************************************************/ 
+void SelectQueue3(int ncon, float *npwgts, float *tpwgts, int *from, int *cnum, 
+       PQueueType queues[MAXNCON][2], float *maxwgt)
+{
+  int i, j, maxgain=0;
+  float maxdiff=0.0, diff;
+
+  *from = -1;
+  *cnum = -1;
+
+  /* First determine the side and the queue, irrespective of the presence of nodes */
+  for (j=0; j<2; j++) {
+    for (i=0; i<ncon; i++) {
+      diff = npwgts[j*ncon+i]-maxwgt[j*ncon+i];
+      if (diff >= maxdiff) {
+        maxdiff = diff;
+        *from = j;
+        *cnum = i;
+      }
+    }
+  }
+
+/* DELETE
+j = *from;
+for (i=0; i<ncon; i++)
+  printf("[%5d %5d %.4f %.4f] ", i, PQueueGetSize(&queues[i][j]), npwgts[j*ncon+i], maxwgt[j*ncon+i]);
+printf("***[%5d %5d]\n", *cnum, *from);
+*/
+
+  /* If the desired queue is empty, select a node from that side anyway */
+  if (*from != -1 && PQueueGetSize(&queues[*cnum][*from]) == 0) {
+    for (i=0; i<ncon; i++) {
+      if (PQueueGetSize(&queues[i][*from]) > 0) {
+        maxdiff = (npwgts[(*from)*ncon+i] - maxwgt[(*from)*ncon+i]);
+        *cnum = i;
+        break;
+      }
+    }
+
+    for (i++; i<ncon; i++) {
+      diff = npwgts[(*from)*ncon+i] - maxwgt[(*from)*ncon+i];
+      if (diff > maxdiff && PQueueGetSize(&queues[i][*from]) > 0) {
+        maxdiff = diff;
+        *cnum = i;
+      }
+    }
+  }
+
+  /* If the constraints ar OK, select a high gain vertex */
+  if (*from == -1) {
+    maxgain = -100000;
+    for (j=0; j<2; j++) {
+      for (i=0; i<ncon; i++) {
+        if (PQueueGetSize(&queues[i][j]) > 0 && PQueueGetKey(&queues[i][j]) > maxgain) {
+          maxgain = PQueueGetKey(&queues[i][0]); 
+          *from = j;
+          *cnum = i;
+        }
+      }
+    }
+
+    /* printf("(%2d %2d) %3d\n", *from, *cnum, maxgain); */
+  }
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mcoarsen.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mcoarsen.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mcoarsen.c	(revision 9501)
@@ -0,0 +1,91 @@
+/*
+ * mcoarsen.c
+ *
+ * This file contains the driving routines for the coarsening process 
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: mcoarsen.c,v 1.1 1998/11/27 17:59:19 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function takes a graph and creates a sequence of coarser graphs
+**************************************************************************/
+GraphType *MCCoarsen2Way(CtrlType *ctrl, GraphType *graph)
+{
+  int i, clevel;
+  GraphType *cgraph;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->CoarsenTmr));
+
+  cgraph = graph;
+
+  clevel = 0;
+  do {
+    if (ctrl->dbglvl&DBG_COARSEN) {
+      printf("%6d %7d %10d [%d] [%6.4f", cgraph->nvtxs, cgraph->nedges, 
+              idxsum(cgraph->nvtxs, cgraph->adjwgtsum), ctrl->CoarsenTo, ctrl->nmaxvwgt);
+      for (i=0; i<graph->ncon; i++)
+        printf(" %5.3f", ssum_strd(cgraph->nvtxs, cgraph->nvwgt+i, cgraph->ncon));
+      printf("]\n");
+    }
+
+    switch (ctrl->CType) {
+      case MATCH_RM:
+        MCMatch_RM(ctrl, cgraph);
+        break;
+      case MATCH_HEM:
+        if (clevel < 1)
+          MCMatch_RM(ctrl, cgraph);
+        else
+          MCMatch_HEM(ctrl, cgraph);
+        break;
+      case MATCH_SHEM:
+        if (clevel < 1)
+          MCMatch_RM(ctrl, cgraph);
+        else
+          MCMatch_SHEM(ctrl, cgraph);
+        break;
+      case MATCH_SHEMKWAY:
+        MCMatch_SHEM(ctrl, cgraph);
+        break;
+      case MATCH_SHEBM_ONENORM:
+        MCMatch_SHEBM(ctrl, cgraph, 1);
+        break;
+      case MATCH_SHEBM_INFNORM:
+        MCMatch_SHEBM(ctrl, cgraph, -1);
+        break;
+      case MATCH_SBHEM_ONENORM:
+        MCMatch_SBHEM(ctrl, cgraph, 1);
+        break;
+      case MATCH_SBHEM_INFNORM:
+        MCMatch_SBHEM(ctrl, cgraph, -1);
+        break;
+      default:
+        errexit("Unknown CType: %d\n", ctrl->CType);
+    }
+
+    cgraph = cgraph->coarser;
+    clevel++;
+
+  } while (cgraph->nvtxs > ctrl->CoarsenTo && cgraph->nvtxs < COARSEN_FRACTION2*cgraph->finer->nvtxs && cgraph->nedges > cgraph->nvtxs/2); 
+
+  if (ctrl->dbglvl&DBG_COARSEN) {
+    printf("%6d %7d %10d [%d] [%6.4f", cgraph->nvtxs, cgraph->nedges, 
+            idxsum(cgraph->nvtxs, cgraph->adjwgtsum), ctrl->CoarsenTo, ctrl->nmaxvwgt);
+    for (i=0; i<graph->ncon; i++)
+      printf(" %5.3f", ssum_strd(cgraph->nvtxs, cgraph->nvwgt+i, cgraph->ncon));
+    printf("]\n");
+  }
+
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->CoarsenTmr));
+
+  return cgraph;
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/memory.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/memory.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/memory.c	(revision 9501)
@@ -0,0 +1,208 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * memory.c
+ *
+ * This file contains routines that deal with memory allocation
+ *
+ * Started 2/24/96
+ * George
+ *
+ * $Id: memory.c,v 1.2 1998/11/27 18:16:18 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function allocates memory for the workspace
+**************************************************************************/
+void AllocateWorkSpace(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  ctrl->wspace.pmat = NULL;
+
+  if (ctrl->optype == OP_KMETIS) {
+    ctrl->wspace.edegrees = (EDegreeType *)GKmalloc(graph->nedges*sizeof(EDegreeType), "AllocateWorkSpace: edegrees");
+    ctrl->wspace.vedegrees = NULL;
+    ctrl->wspace.auxcore = (idxtype *)ctrl->wspace.edegrees;
+
+    ctrl->wspace.pmat = idxmalloc(nparts*nparts, "AllocateWorkSpace: pmat");
+
+    /* Memory requirements for different phases
+          Coarsening
+                    Matching: 4*nvtxs vectors
+                 Contraction: 2*nvtxs vectors (from the above 4), 1*nparts, 1*Nedges
+            Total = MAX(4*nvtxs, 2*nvtxs+nparts+nedges)
+
+          Refinement
+                Random Refinement/Balance: 5*nparts + 1*nvtxs + 2*nedges
+                Greedy Refinement/Balance: 5*nparts + 2*nvtxs + 2*nedges + 1*PQueue(==Nvtxs)
+            Total = 5*nparts + 3*nvtxs + 2*nedges
+
+         Total = 5*nparts + 3*nvtxs + 2*nedges 
+    */
+    ctrl->wspace.maxcore = 3*(graph->nvtxs+1) +                 /* Match/Refinement vectors */
+                           5*(nparts+1) +                       /* Partition weights etc */
+                           graph->nvtxs*(sizeof(ListNodeType)/sizeof(idxtype)) + /* Greedy k-way balance/refine */
+                           20  /* padding for 64 bit machines */
+                           ;
+  }
+  else if (ctrl->optype == OP_KVMETIS) {
+    ctrl->wspace.edegrees = NULL;
+    ctrl->wspace.vedegrees = (VEDegreeType *)GKmalloc(graph->nedges*sizeof(VEDegreeType), "AllocateWorkSpace: vedegrees");
+    ctrl->wspace.auxcore = (idxtype *)ctrl->wspace.vedegrees;
+
+    ctrl->wspace.pmat = idxmalloc(nparts*nparts, "AllocateWorkSpace: pmat");
+
+    /* Memory requirements for different phases are identical to KMETIS */
+    ctrl->wspace.maxcore = 3*(graph->nvtxs+1) +                 /* Match/Refinement vectors */
+                           3*(nparts+1) +                       /* Partition weights etc */
+                           graph->nvtxs*(sizeof(ListNodeType)/sizeof(idxtype)) + /* Greedy k-way balance/refine */
+                           20  /* padding for 64 bit machines */
+                           ;
+  }
+  else {
+    ctrl->wspace.edegrees = (EDegreeType *)idxmalloc(graph->nedges, "AllocateWorkSpace: edegrees");
+    ctrl->wspace.vedegrees = NULL;
+    ctrl->wspace.auxcore = (idxtype *)ctrl->wspace.edegrees;
+
+    ctrl->wspace.maxcore = 5*(graph->nvtxs+1) +                 /* Refinement vectors */
+                           4*(nparts+1) +                       /* Partition weights etc */
+                           2*graph->ncon*graph->nvtxs*(sizeof(ListNodeType)/sizeof(idxtype)) + /* 2-way refinement */
+                           2*graph->ncon*(NEG_GAINSPAN+PLUS_GAINSPAN+1)*(sizeof(ListNodeType *)/sizeof(idxtype)) + /* 2-way refinement */
+                           20  /* padding for 64 bit machines */
+                           ;
+  }
+
+  ctrl->wspace.maxcore += HTLENGTH;
+  ctrl->wspace.core = idxmalloc(ctrl->wspace.maxcore, "AllocateWorkSpace: maxcore");
+  ctrl->wspace.ccore = 0;
+}
+
+
+/*************************************************************************
+* This function allocates memory for the workspace
+**************************************************************************/
+void FreeWorkSpace(CtrlType *ctrl, GraphType *graph)
+{
+  GKfree(&ctrl->wspace.edegrees, &ctrl->wspace.vedegrees, &ctrl->wspace.core, &ctrl->wspace.pmat, LTERM);
+}
+
+/*************************************************************************
+* This function returns how may words are left in the workspace
+**************************************************************************/
+int WspaceAvail(CtrlType *ctrl)
+{
+  return ctrl->wspace.maxcore - ctrl->wspace.ccore;
+}
+
+
+/*************************************************************************
+* This function allocate space from the core 
+**************************************************************************/
+idxtype *idxwspacemalloc(CtrlType *ctrl, int n)
+{
+  n += n%2; /* This is a fix for 64 bit machines that require 8-byte pointer allignment */
+
+  ctrl->wspace.ccore += n;
+  ASSERT(ctrl->wspace.ccore <= ctrl->wspace.maxcore);
+  return ctrl->wspace.core + ctrl->wspace.ccore - n;
+}
+
+/*************************************************************************
+* This function frees space from the core 
+**************************************************************************/
+void idxwspacefree(CtrlType *ctrl, int n)
+{
+  n += n%2; /* This is a fix for 64 bit machines that require 8-byte pointer allignment */
+
+  ctrl->wspace.ccore -= n;
+  ASSERT(ctrl->wspace.ccore >= 0);
+}
+
+
+/*************************************************************************
+* This function allocate space from the core 
+**************************************************************************/
+float *fwspacemalloc(CtrlType *ctrl, int n)
+{
+  n += n%2; /* This is a fix for 64 bit machines that require 8-byte pointer allignment */
+
+  ctrl->wspace.ccore += n;
+  ASSERT(ctrl->wspace.ccore <= ctrl->wspace.maxcore);
+  return (float *) (ctrl->wspace.core + ctrl->wspace.ccore - n);
+}
+
+/*************************************************************************
+* This function frees space from the core 
+**************************************************************************/
+void fwspacefree(CtrlType *ctrl, int n)
+{
+  n += n%2; /* This is a fix for 64 bit machines that require 8-byte pointer allignment */
+
+  ctrl->wspace.ccore -= n;
+  ASSERT(ctrl->wspace.ccore >= 0);
+}
+
+
+
+/*************************************************************************
+* This function creates a CoarseGraphType data structure and initializes
+* the various fields
+**************************************************************************/
+GraphType *CreateGraph(void)
+{
+  GraphType *graph;
+
+  graph = (GraphType *)GKmalloc(sizeof(GraphType), "CreateCoarseGraph: graph");
+
+  InitGraph(graph);
+
+  return graph;
+}
+
+
+/*************************************************************************
+* This function creates a CoarseGraphType data structure and initializes
+* the various fields
+**************************************************************************/
+void InitGraph(GraphType *graph) 
+{
+  graph->gdata = graph->rdata = NULL;
+
+  graph->nvtxs = graph->nedges = -1;
+  graph->mincut = graph->minvol = -1;
+
+  graph->xadj = graph->vwgt = graph->adjncy = graph->adjwgt = NULL;
+  graph->adjwgtsum = NULL;
+  graph->label = NULL;
+  graph->cmap = NULL;
+
+  graph->where = graph->pwgts = NULL;
+  graph->id = graph->ed = NULL;
+  graph->bndptr = graph->bndind = NULL;
+  graph->rinfo = NULL;
+  graph->vrinfo = NULL;
+  graph->nrinfo = NULL;
+
+  graph->ncon = -1;
+  graph->nvwgt = NULL;
+  graph->npwgts = NULL;
+
+  graph->vsize = NULL;
+
+  graph->coarser = graph->finer = NULL;
+
+}
+
+/*************************************************************************
+* This function deallocates any memory stored in a graph
+**************************************************************************/
+void FreeGraph(GraphType *graph) 
+{
+
+  GKfree(&graph->gdata, &graph->nvwgt, &graph->rdata, &graph->npwgts, LTERM);
+  free(graph);
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mesh.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mesh.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mesh.c	(revision 9501)
@@ -0,0 +1,400 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mesh.c
+ *
+ * This file contains routines for converting 3D and 4D finite element
+ * meshes into dual or nodal graphs
+ *
+ * Started 8/18/97
+ * George
+ *
+ * $Id: mesh.c,v 1.1 1998/11/27 17:59:20 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*****************************************************************************
+* This function creates a graph corresponding to the dual of a finite element
+* mesh. At this point the supported elements are triangles, tetrahedrons, and
+* bricks.
+******************************************************************************/
+void METIS_MeshToDual(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, 
+                      idxtype *dxadj, idxtype *dadjncy)
+{
+
+
+  int esizes[] = {-1, 3, 4, 8, 4};
+
+  if (*numflag == 1)
+    ChangeMesh2CNumbering((*ne)*esizes[*etype], elmnts);
+
+  GENDUALMETIS(*ne, *nn, *etype, elmnts, dxadj, dadjncy);
+
+  if (*numflag == 1)
+    ChangeMesh2FNumbering((*ne)*esizes[*etype], elmnts, *ne, dxadj, dadjncy);
+}
+
+
+/*****************************************************************************
+* This function creates a graph corresponding to the finite element mesh. 
+* At this point the supported elements are triangles, tetrahedrons.
+******************************************************************************/
+void METIS_MeshToNodal(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, 
+                       idxtype *dxadj, idxtype *dadjncy)
+{
+  int esizes[] = {-1, 3, 4, 8, 4};
+
+  if (*numflag == 1)
+    ChangeMesh2CNumbering((*ne)*esizes[*etype], elmnts);
+
+  switch (*etype) {
+    case 1:
+      TRINODALMETIS(*ne, *nn, elmnts, dxadj, dadjncy);
+      break;
+    case 2:
+      TETNODALMETIS(*ne, *nn, elmnts, dxadj, dadjncy);
+      break;
+    case 3:
+      HEXNODALMETIS(*ne, *nn, elmnts, dxadj, dadjncy);
+      break;
+    case 4:
+      QUADNODALMETIS(*ne, *nn, elmnts, dxadj, dadjncy);
+      break;
+  }
+
+  if (*numflag == 1)
+    ChangeMesh2FNumbering((*ne)*esizes[*etype], elmnts, *nn, dxadj, dadjncy);
+}
+
+
+
+/*****************************************************************************
+* This function creates the dual of a finite element mesh
+******************************************************************************/
+void GENDUALMETIS(int nelmnts, int nvtxs, int etype, idxtype *elmnts, idxtype *dxadj, idxtype *dadjncy)
+{
+   int i, j, jj, k, kk, kkk, l, m, n, nedges, mask;
+   idxtype *nptr, *nind;
+   idxtype *mark, ind[200], wgt[200];
+   int esize, esizes[] = {-1, 3, 4, 8, 4},
+       mgcnum, mgcnums[] = {-1, 2, 3, 4, 2};
+
+   mask = (1<<11)-1;
+   mark = idxsmalloc(mask+1, -1, "GENDUALMETIS: mark");
+
+   /* Get the element size and magic number for the particular element */
+   esize = esizes[etype];
+   mgcnum = mgcnums[etype];
+
+   /* Construct the node-element list first */
+   nptr = idxsmalloc(nvtxs+1, 0, "GENDUALMETIS: nptr");
+   for (j=esize*nelmnts, i=0; i<j; i++) 
+     nptr[elmnts[i]]++;
+   MAKECSR(i, nvtxs, nptr);
+
+   nind = idxmalloc(nptr[nvtxs], "GENDUALMETIS: nind");
+   for (k=i=0; i<nelmnts; i++) {
+     for (j=0; j<esize; j++, k++) 
+       nind[nptr[elmnts[k]]++] = i;
+   }
+   for (i=nvtxs; i>0; i--)
+     nptr[i] = nptr[i-1];
+   nptr[0] = 0;
+
+   for (i=0; i<nelmnts; i++) 
+     dxadj[i] = esize*i;
+
+   for (i=0; i<nelmnts; i++) {
+     for (m=j=0; j<esize; j++) {
+       n = elmnts[esize*i+j];
+       for (k=nptr[n+1]-1; k>=nptr[n]; k--) {
+         if ((kk = nind[k]) <= i)
+           break;
+
+         kkk = kk&mask;
+         if ((l = mark[kkk]) == -1) {
+           ind[m] = kk;
+           wgt[m] = 1;
+           mark[kkk] = m++;
+         }
+         else if (ind[l] == kk) {
+           wgt[l]++;
+         }
+         else {
+           for (jj=0; jj<m; jj++) {
+             if (ind[jj] == kk) {
+               wgt[jj]++;
+               break;
+             }
+           }
+           if (jj == m) {
+             ind[m] = kk;
+             wgt[m++] = 1;
+           }
+         }
+       }
+     }
+     for (j=0; j<m; j++) {
+       if (wgt[j] == mgcnum) {
+         k = ind[j];
+         dadjncy[dxadj[i]++] = k;
+         dadjncy[dxadj[k]++] = i;
+       }
+       mark[ind[j]&mask] = -1;
+     }
+   }
+
+   /* Go and consolidate the dxadj and dadjncy */
+   for (j=i=0; i<nelmnts; i++) {
+     for (k=esize*i; k<dxadj[i]; k++, j++)
+       dadjncy[j] = dadjncy[k];
+     dxadj[i] = j;
+   }
+   for (i=nelmnts; i>0; i--)
+     dxadj[i] = dxadj[i-1];
+   dxadj[0] = 0;
+
+   free(mark);
+   free(nptr);
+   free(nind);
+
+}
+
+
+
+
+/*****************************************************************************
+* This function creates the nodal graph of a finite element mesh
+******************************************************************************/
+void TRINODALMETIS(int nelmnts, int nvtxs, idxtype *elmnts, idxtype *dxadj, idxtype *dadjncy)
+{
+   int i, j, jj, k, kk, kkk, l, m, n, nedges;
+   idxtype *nptr, *nind;
+   idxtype *mark;
+
+   /* Construct the node-element list first */
+   nptr = idxsmalloc(nvtxs+1, 0, "TRINODALMETIS: nptr");
+   for (j=3*nelmnts, i=0; i<j; i++) 
+     nptr[elmnts[i]]++;
+   MAKECSR(i, nvtxs, nptr);
+
+   nind = idxmalloc(nptr[nvtxs], "TRINODALMETIS: nind");
+   for (k=i=0; i<nelmnts; i++) {
+     for (j=0; j<3; j++, k++) 
+       nind[nptr[elmnts[k]]++] = i;
+   }
+   for (i=nvtxs; i>0; i--)
+     nptr[i] = nptr[i-1];
+   nptr[0] = 0;
+
+
+   mark = idxsmalloc(nvtxs, -1, "TRINODALMETIS: mark");
+
+   nedges = dxadj[0] = 0;
+   for (i=0; i<nvtxs; i++) {
+     mark[i] = i;
+     for (j=nptr[i]; j<nptr[i+1]; j++) {
+       for (jj=3*nind[j], k=0; k<3; k++, jj++) {
+         kk = elmnts[jj];
+         if (mark[kk] != i) {
+           mark[kk] = i;
+           dadjncy[nedges++] = kk;
+         }
+       }
+     }
+     dxadj[i+1] = nedges;
+   }
+
+   free(mark);
+   free(nptr);
+   free(nind);
+
+}
+
+
+/*****************************************************************************
+* This function creates the nodal graph of a finite element mesh
+******************************************************************************/
+void TETNODALMETIS(int nelmnts, int nvtxs, idxtype *elmnts, idxtype *dxadj, idxtype *dadjncy)
+{
+   int i, j, jj, k, kk, kkk, l, m, n, nedges;
+   idxtype *nptr, *nind;
+   idxtype *mark;
+
+   /* Construct the node-element list first */
+   nptr = idxsmalloc(nvtxs+1, 0, "TETNODALMETIS: nptr");
+   for (j=4*nelmnts, i=0; i<j; i++) 
+     nptr[elmnts[i]]++;
+   MAKECSR(i, nvtxs, nptr);
+
+   nind = idxmalloc(nptr[nvtxs], "TETNODALMETIS: nind");
+   for (k=i=0; i<nelmnts; i++) {
+     for (j=0; j<4; j++, k++) 
+       nind[nptr[elmnts[k]]++] = i;
+   }
+   for (i=nvtxs; i>0; i--)
+     nptr[i] = nptr[i-1];
+   nptr[0] = 0;
+
+
+   mark = idxsmalloc(nvtxs, -1, "TETNODALMETIS: mark");
+
+   nedges = dxadj[0] = 0;
+   for (i=0; i<nvtxs; i++) {
+     mark[i] = i;
+     for (j=nptr[i]; j<nptr[i+1]; j++) {
+       for (jj=4*nind[j], k=0; k<4; k++, jj++) {
+         kk = elmnts[jj];
+         if (mark[kk] != i) {
+           mark[kk] = i;
+           dadjncy[nedges++] = kk;
+         }
+       }
+     }
+     dxadj[i+1] = nedges;
+   }
+
+   free(mark);
+   free(nptr);
+   free(nind);
+
+}
+
+
+/*****************************************************************************
+* This function creates the nodal graph of a finite element mesh
+******************************************************************************/
+void HEXNODALMETIS(int nelmnts, int nvtxs, idxtype *elmnts, idxtype *dxadj, idxtype *dadjncy)
+{
+   int i, j, jj, k, kk, kkk, l, m, n, nedges;
+   idxtype *nptr, *nind;
+   idxtype *mark;
+   int table[8][3] = {1, 3, 4,
+                      0, 2, 5,
+                      1, 3, 6,
+                      0, 2, 7,
+                      0, 5, 7,
+                      1, 4, 6,
+                      2, 5, 7,
+                      3, 4, 6};
+
+   /* Construct the node-element list first */
+   nptr = idxsmalloc(nvtxs+1, 0, "HEXNODALMETIS: nptr");
+   for (j=8*nelmnts, i=0; i<j; i++) 
+     nptr[elmnts[i]]++;
+   MAKECSR(i, nvtxs, nptr);
+
+   nind = idxmalloc(nptr[nvtxs], "HEXNODALMETIS: nind");
+   for (k=i=0; i<nelmnts; i++) {
+     for (j=0; j<8; j++, k++) 
+       nind[nptr[elmnts[k]]++] = i;
+   }
+   for (i=nvtxs; i>0; i--)
+     nptr[i] = nptr[i-1];
+   nptr[0] = 0;
+
+
+   mark = idxsmalloc(nvtxs, -1, "HEXNODALMETIS: mark");
+
+   nedges = dxadj[0] = 0;
+   for (i=0; i<nvtxs; i++) {
+     mark[i] = i;
+     for (j=nptr[i]; j<nptr[i+1]; j++) {
+       jj=8*nind[j];
+       for (k=0; k<8; k++) {
+         if (elmnts[jj+k] == i)
+           break;
+       }
+       ASSERT(k != 8);
+
+       /* You found the index, now go and put the 3 neighbors */
+       kk = elmnts[jj+table[k][0]];
+       if (mark[kk] != i) {
+         mark[kk] = i;
+         dadjncy[nedges++] = kk;
+       }
+       kk = elmnts[jj+table[k][1]];
+       if (mark[kk] != i) {
+         mark[kk] = i;
+         dadjncy[nedges++] = kk;
+       }
+       kk = elmnts[jj+table[k][2]];
+       if (mark[kk] != i) {
+         mark[kk] = i;
+         dadjncy[nedges++] = kk;
+       }
+     }
+     dxadj[i+1] = nedges;
+   }
+
+   free(mark);
+   free(nptr);
+   free(nind);
+
+}
+
+
+/*****************************************************************************
+* This function creates the nodal graph of a finite element mesh
+******************************************************************************/
+void QUADNODALMETIS(int nelmnts, int nvtxs, idxtype *elmnts, idxtype *dxadj, idxtype *dadjncy)
+{
+   int i, j, jj, k, kk, kkk, l, m, n, nedges;
+   idxtype *nptr, *nind;
+   idxtype *mark;
+   int table[4][2] = {1, 3, 
+                      0, 2,
+                      1, 3, 
+                      0, 2}; 
+
+   /* Construct the node-element list first */
+   nptr = idxsmalloc(nvtxs+1, 0, "QUADNODALMETIS: nptr");
+   for (j=4*nelmnts, i=0; i<j; i++) 
+     nptr[elmnts[i]]++;
+   MAKECSR(i, nvtxs, nptr);
+
+   nind = idxmalloc(nptr[nvtxs], "QUADNODALMETIS: nind");
+   for (k=i=0; i<nelmnts; i++) {
+     for (j=0; j<4; j++, k++) 
+       nind[nptr[elmnts[k]]++] = i;
+   }
+   for (i=nvtxs; i>0; i--)
+     nptr[i] = nptr[i-1];
+   nptr[0] = 0;
+
+
+   mark = idxsmalloc(nvtxs, -1, "QUADNODALMETIS: mark");
+
+   nedges = dxadj[0] = 0;
+   for (i=0; i<nvtxs; i++) {
+     mark[i] = i;
+     for (j=nptr[i]; j<nptr[i+1]; j++) {
+       jj=4*nind[j];
+       for (k=0; k<4; k++) {
+         if (elmnts[jj+k] == i)
+           break;
+       }
+       ASSERT(k != 4);
+
+       /* You found the index, now go and put the 2 neighbors */
+       kk = elmnts[jj+table[k][0]];
+       if (mark[kk] != i) {
+         mark[kk] = i;
+         dadjncy[nedges++] = kk;
+       }
+       kk = elmnts[jj+table[k][1]];
+       if (mark[kk] != i) {
+         mark[kk] = i;
+         dadjncy[nedges++] = kk;
+       }
+     }
+     dxadj[i+1] = nedges;
+   }
+
+   free(mark);
+   free(nptr);
+   free(nind);
+
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/meshpart.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/meshpart.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/meshpart.c	(revision 9501)
@@ -0,0 +1,203 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * meshpart.c
+ *
+ * This file contains routines for partitioning finite element meshes.
+ *
+ * Started 9/29/97
+ * George
+ *
+ * $Id: meshpart.c,v 1.1 1998/11/27 17:59:21 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function partitions a finite element mesh by partitioning its nodal
+* graph using KMETIS and then assigning elements in a load balanced fashion.
+**************************************************************************/
+void METIS_PartMeshNodal(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, 
+                         int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  int i, j, k, me;
+  idxtype *xadj, *adjncy, *pwgts;
+  int options[10], pnumflag=0, wgtflag=0;
+  int nnbrs, nbrind[200], nbrwgt[200], maxpwgt;
+  int esize, esizes[] = {-1, 3, 4, 8, 4};
+
+  esize = esizes[*etype];
+
+  if (*numflag == 1)
+    ChangeMesh2CNumbering((*ne)*esize, elmnts);
+
+  xadj = idxmalloc(*nn+1, "METIS_MESHPARTNODAL: xadj");
+  adjncy = idxmalloc(20*(*nn), "METIS_MESHPARTNODAL: adjncy");
+
+  METIS_MeshToNodal(ne, nn, elmnts, etype, &pnumflag, xadj, adjncy);
+    
+  adjncy = realloc(adjncy, xadj[*nn]*sizeof(idxtype));
+
+  options[0] = 0;
+  METIS_PartGraphKway(nn, xadj, adjncy, NULL, NULL, &wgtflag, &pnumflag, nparts, options, edgecut, npart);
+
+  /* OK, now compute an element partition based on the nodal partition npart */
+  idxset(*ne, -1, epart);
+  pwgts = idxsmalloc(*nparts, 0, "METIS_MESHPARTNODAL: pwgts");
+  for (i=0; i<*ne; i++) {
+    me = npart[elmnts[i*esize]];
+    for (j=1; j<esize; j++) {
+      if (npart[elmnts[i*esize+j]] != me)
+        break;
+    }
+    if (j == esize) {
+      epart[i] = me;
+      pwgts[me]++;
+    }
+  }
+
+  maxpwgt = 1.03*(*ne)/(*nparts);
+  for (i=0; i<*ne; i++) {
+    if (epart[i] == -1) { /* Assign the boundary element */
+      nnbrs = 0;
+      for (j=0; j<esize; j++) {
+        me = npart[elmnts[i*esize+j]];
+        for (k=0; k<nnbrs; k++) {
+          if (nbrind[k] == me) {
+            nbrwgt[k]++;
+            break;
+          }
+        }
+        if (k == nnbrs) {
+          nbrind[nnbrs] = me;
+          nbrwgt[nnbrs++] = 1;
+        }
+      }
+      /* Try to assign it first to the domain with most things in common */
+      j = iamax(nnbrs, nbrwgt);
+      if (pwgts[nbrind[j]] < maxpwgt) {
+        epart[i] = nbrind[j];
+      }
+      else {
+        /* If that fails, assign it to a light domain */
+        for (j=0; j<nnbrs; j++) {
+          if (pwgts[nbrind[j]] < maxpwgt) {
+            epart[i] = nbrind[j];
+            break;
+          }
+        }
+        if (j == nnbrs) 
+          epart[i] = nbrind[iamax(nnbrs, nbrwgt)];
+      }
+      pwgts[epart[i]]++;
+    }
+  }
+
+  if (*numflag == 1)
+    ChangeMesh2FNumbering2((*ne)*esize, elmnts, *ne, *nn, epart, npart);
+
+  GKfree(&xadj, &adjncy, &pwgts, LTERM);
+}
+
+
+/*************************************************************************
+* This function partitions a finite element mesh by partitioning its dual
+* graph using KMETIS and then assigning nodes in a load balanced fashion.
+**************************************************************************/
+void METIS_PartMeshDual(int *ne, int *nn, idxtype *elmnts, int *etype, int *numflag, 
+                        int *nparts, int *edgecut, idxtype *epart, idxtype *npart)
+{
+  int i, j, k, me;
+  idxtype *xadj, *adjncy, *pwgts, *nptr, *nind;
+  int options[10], pnumflag=0, wgtflag=0;
+  int nnbrs, nbrind[200], nbrwgt[200], maxpwgt;
+  int esize, esizes[] = {-1, 3, 4, 8, 4};
+
+  esize = esizes[*etype];
+
+  if (*numflag == 1)
+    ChangeMesh2CNumbering((*ne)*esize, elmnts);
+
+  xadj = idxmalloc(*ne+1, "METIS_MESHPARTNODAL: xadj");
+  adjncy = idxmalloc(esize*(*ne), "METIS_MESHPARTNODAL: adjncy");
+
+  METIS_MeshToDual(ne, nn, elmnts, etype, &pnumflag, xadj, adjncy);
+
+  options[0] = 0;
+  METIS_PartGraphKway(ne, xadj, adjncy, NULL, NULL, &wgtflag, &pnumflag, nparts, options, edgecut, epart);
+
+  /* Construct the node-element list */
+  nptr = idxsmalloc(*nn+1, 0, "METIS_MESHPARTDUAL: nptr");
+  for (j=esize*(*ne), i=0; i<j; i++) 
+    nptr[elmnts[i]]++;
+  MAKECSR(i, *nn, nptr);
+
+  nind = idxmalloc(nptr[*nn], "METIS_MESHPARTDUAL: nind");
+  for (k=i=0; i<(*ne); i++) {
+    for (j=0; j<esize; j++, k++) 
+      nind[nptr[elmnts[k]]++] = i;
+  }
+  for (i=(*nn); i>0; i--)
+    nptr[i] = nptr[i-1];
+  nptr[0] = 0;
+
+
+  /* OK, now compute a nodal partition based on the element partition npart */
+  idxset(*nn, -1, npart);
+  pwgts = idxsmalloc(*nparts, 0, "METIS_MESHPARTDUAL: pwgts");
+  for (i=0; i<*nn; i++) {
+    me = epart[nind[nptr[i]]];
+    for (j=nptr[i]+1; j<nptr[i+1]; j++) {
+      if (epart[nind[j]] != me)
+        break;
+    }
+    if (j == nptr[i+1]) {
+      npart[i] = me;
+      pwgts[me]++;
+    }
+  }
+
+  maxpwgt = 1.03*(*nn)/(*nparts);
+  for (i=0; i<*nn; i++) {
+    if (npart[i] == -1) { /* Assign the boundary element */
+      nnbrs = 0;
+      for (j=nptr[i]; j<nptr[i+1]; j++) {
+        me = epart[nind[j]];
+        for (k=0; k<nnbrs; k++) {
+          if (nbrind[k] == me) {
+            nbrwgt[k]++;
+            break;
+          }
+        }
+        if (k == nnbrs) {
+          nbrind[nnbrs] = me;
+          nbrwgt[nnbrs++] = 1;
+        }
+      }
+      /* Try to assign it first to the domain with most things in common */
+      j = iamax(nnbrs, nbrwgt);
+      if (pwgts[nbrind[j]] < maxpwgt) {
+        npart[i] = nbrind[j];
+      }
+      else {
+        /* If that fails, assign it to a light domain */
+        npart[i] = nbrind[0];
+        for (j=0; j<nnbrs; j++) {
+          if (pwgts[nbrind[j]] < maxpwgt) {
+            npart[i] = nbrind[j];
+            break;
+          }
+        }
+      }
+      pwgts[npart[i]]++;
+    }
+  }
+
+  if (*numflag == 1)
+    ChangeMesh2FNumbering2((*ne)*esize, elmnts, *ne, *nn, epart, npart);
+
+  GKfree(&xadj, &adjncy, &pwgts, &nptr, &nind, LTERM);
+
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/metis.h
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/metis.h	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/metis.h	(revision 9501)
@@ -0,0 +1,37 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * metis.h
+ *
+ * This file includes all necessary header files
+ *
+ * Started 8/27/94
+ * George
+ *
+ * $Id: metis.h,v 1.1 1998/11/27 17:59:21 karypis Exp $
+ */
+
+
+#include <stdio.h>
+#ifdef __STDC__
+#include <stdlib.h>
+#else
+#include <malloc.h>
+#endif
+#include <strings.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <time.h>
+
+#ifdef DMALLOC
+#include <dmalloc.h>
+#endif
+
+#include <defs.h>
+#include <struct.h>
+#include <macros.h>
+#include <rename.h>
+#include <proto.h>
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mfm.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mfm.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mfm.c	(revision 9501)
@@ -0,0 +1,344 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mfm.c
+ *
+ * This file contains code that implements the edge-based FM refinement
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: mfm.c,v 1.3 1998/11/30 14:50:44 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function performs an edge-based FM refinement
+**************************************************************************/
+void MocFM_2WayEdgeRefine(CtrlType *ctrl, GraphType *graph, float *tpwgts, int npasses)
+{
+  int i, ii, j, k, l, kwgt, nvtxs, ncon, nbnd, nswaps, from, to, pass, me, limit, tmp, cnum;
+  idxtype *xadj, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind;
+  idxtype *moved, *swaps, *perm, *qnum;
+  float *nvwgt, *npwgts, mindiff[MAXNCON], origbal, minbal, newbal;
+  PQueueType parts[MAXNCON][2];
+  int higain, oldgain, mincut, initcut, newcut, mincutorder;
+  float rtpwgts[2];
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  npwgts = graph->npwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  qnum = idxwspacemalloc(ctrl, nvtxs);
+
+  limit = amin(amax(0.01*nvtxs, 25), 150);
+
+  /* Initialize the queues */
+  for (i=0; i<ncon; i++) {
+    PQueueInit(ctrl, &parts[i][0], nvtxs, PLUS_GAINSPAN+1);
+    PQueueInit(ctrl, &parts[i][1], nvtxs, PLUS_GAINSPAN+1);
+  }
+  for (i=0; i<nvtxs; i++)
+    qnum[i] = samax(ncon, nvwgt+i*ncon);
+
+  origbal = Compute2WayHLoadImbalance(ncon, npwgts, tpwgts);
+
+  rtpwgts[0] = origbal*tpwgts[0];
+  rtpwgts[1] = origbal*tpwgts[1];
+
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("Parts: [");
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf("] T[%.3f %.3f], Nv-Nb[%5d, %5d]. ICut: %6d, LB: %.3f\n", tpwgts[0], tpwgts[1], graph->nvtxs, graph->nbnd, graph->mincut, origbal);
+  }
+
+  idxset(nvtxs, -1, moved);
+  for (pass=0; pass<npasses; pass++) { /* Do a number of passes */
+    for (i=0; i<ncon; i++) { 
+      PQueueReset(&parts[i][0]);
+      PQueueReset(&parts[i][1]);
+    }
+
+    mincutorder = -1;
+    newcut = mincut = initcut = graph->mincut;
+    for (i=0; i<ncon; i++)
+      mindiff[i] = fabs(tpwgts[0]-npwgts[i]);
+    minbal = Compute2WayHLoadImbalance(ncon, npwgts, tpwgts);
+
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+    ASSERT(CheckBnd(graph));
+
+    /* Insert boundary nodes in the priority queues */
+    nbnd = graph->nbnd;
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      ASSERT(ed[i] > 0 || id[i] == 0);
+      ASSERT(bndptr[i] != -1);
+      PQueueInsert(&parts[qnum[i]][where[i]], i, ed[i]-id[i]);
+    }
+
+    for (nswaps=0; nswaps<nvtxs; nswaps++) {
+      SelectQueue(ncon, npwgts, rtpwgts, &from, &cnum, parts);
+      to = (from+1)%2;
+
+      if (from == -1 || (higain = PQueueGetMax(&parts[cnum][from])) == -1)
+        break;
+      ASSERT(bndptr[higain] != -1);
+
+      saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+      saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+
+      newcut -= (ed[higain]-id[higain]);
+      newbal = Compute2WayHLoadImbalance(ncon, npwgts, tpwgts);
+
+      if ((newcut < mincut && newbal-origbal <= .00001) || 
+          (newcut == mincut && (newbal < minbal || 
+                                (newbal == minbal && BetterBalance(ncon, npwgts, tpwgts, mindiff))))) {
+        mincut = newcut;
+        minbal = newbal;
+        mincutorder = nswaps;
+        for (i=0; i<ncon; i++)
+          mindiff[i] = fabs(tpwgts[0]-npwgts[i]);
+      }
+      else if (nswaps-mincutorder > limit) { /* We hit the limit, undo last move */
+        newcut += (ed[higain]-id[higain]);
+        saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+        saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+        break;
+      }
+
+      where[higain] = to;
+      moved[higain] = nswaps;
+      swaps[nswaps] = higain;
+
+      if (ctrl->dbglvl&DBG_MOVEINFO) {
+        printf("Moved %6d from %d(%d). Gain: %5d, Cut: %5d, NPwgts: ", higain, from, cnum, ed[higain]-id[higain], newcut);
+        for (l=0; l<ncon; l++) 
+          printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+        printf(", %.3f LB: %.3f\n", minbal, newbal);
+      }
+
+
+      /**************************************************************
+      * Update the id[i]/ed[i] values of the affected nodes
+      ***************************************************************/
+      SWAP(id[higain], ed[higain], tmp);
+      if (ed[higain] == 0 && xadj[higain] < xadj[higain+1]) 
+        BNDDelete(nbnd, bndind,  bndptr, higain);
+
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        oldgain = ed[k]-id[k];
+
+        kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+        INC_DEC(id[k], ed[k], kwgt);
+
+        /* Update its boundary information and queue position */
+        if (bndptr[k] != -1) { /* If k was a boundary vertex */
+          if (ed[k] == 0) { /* Not a boundary vertex any more */
+            BNDDelete(nbnd, bndind, bndptr, k);
+            if (moved[k] == -1)  /* Remove it if in the queues */
+              PQueueDelete(&parts[qnum[k]][where[k]], k, oldgain);
+          }
+          else { /* If it has not been moved, update its position in the queue */
+            if (moved[k] == -1)
+              PQueueUpdate(&parts[qnum[k]][where[k]], k, oldgain, ed[k]-id[k]);
+          }
+        }
+        else {
+          if (ed[k] > 0) {  /* It will now become a boundary vertex */
+            BNDInsert(nbnd, bndind, bndptr, k);
+            if (moved[k] == -1) 
+              PQueueInsert(&parts[qnum[k]][where[k]], k, ed[k]-id[k]);
+          }
+        }
+      }
+
+    }
+
+
+    /****************************************************************
+    * Roll back computations
+    *****************************************************************/
+    for (i=0; i<nswaps; i++)
+      moved[swaps[i]] = -1;  /* reset moved array */
+    for (nswaps--; nswaps>mincutorder; nswaps--) {
+      higain = swaps[nswaps];
+
+      to = where[higain] = (where[higain]+1)%2;
+      SWAP(id[higain], ed[higain], tmp);
+      if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1])
+        BNDDelete(nbnd, bndind,  bndptr, higain);
+      else if (ed[higain] > 0 && bndptr[higain] == -1)
+        BNDInsert(nbnd, bndind,  bndptr, higain);
+
+      saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+      saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+((to+1)%2)*ncon, 1);
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+
+        kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+        INC_DEC(id[k], ed[k], kwgt);
+
+        if (bndptr[k] != -1 && ed[k] == 0)
+          BNDDelete(nbnd, bndind, bndptr, k);
+        if (bndptr[k] == -1 && ed[k] > 0)
+          BNDInsert(nbnd, bndind, bndptr, k);
+      }
+    }
+
+    if (ctrl->dbglvl&DBG_REFINE) {
+      printf("\tMincut: %6d at %5d, NBND: %6d, NPwgts: [", mincut, mincutorder, nbnd);
+      for (l=0; l<ncon; l++)
+        printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+      printf("], LB: %.3f\n", Compute2WayHLoadImbalance(ncon, npwgts, tpwgts));
+    }
+
+    graph->mincut = mincut;
+    graph->nbnd = nbnd;
+
+    if (mincutorder == -1 || mincut == initcut)
+      break;
+  }
+
+  for (i=0; i<ncon; i++) {
+    PQueueFree(ctrl, &parts[i][0]);
+    PQueueFree(ctrl, &parts[i][1]);
+  }
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
+
+/*************************************************************************
+* This function selects the partition number and the queue from which
+* we will move vertices out
+**************************************************************************/ 
+void SelectQueue(int ncon, float *npwgts, float *tpwgts, int *from, int *cnum, PQueueType queues[MAXNCON][2])
+{
+  int i, part, maxgain=0;
+  float max, maxdiff=0.0;
+
+  *from = -1;
+  *cnum = -1;
+
+  /* First determine the side and the queue, irrespective of the presence of nodes */
+  for (part=0; part<2; part++) {
+    for (i=0; i<ncon; i++) {
+      if (npwgts[part*ncon+i]-tpwgts[part] >= maxdiff) {
+        maxdiff = npwgts[part*ncon+i]-tpwgts[part];
+        *from = part;
+        *cnum = i;
+      }
+    }
+  }
+
+  /* printf("Selected1 %d(%d) -> %d [%5f]\n", *from, *cnum, PQueueGetSize(&queues[*cnum][*from]), maxdiff); */
+
+  if (*from != -1 && PQueueGetSize(&queues[*cnum][*from]) == 0) {
+    /* The desired queue is empty, select a node from that side anyway */
+    for (i=0; i<ncon; i++) {
+      if (PQueueGetSize(&queues[i][*from]) > 0) {
+        max = npwgts[(*from)*ncon + i];
+        *cnum = i;
+        break;
+      }
+    }
+
+    for (i++; i<ncon; i++) {
+      if (npwgts[(*from)*ncon + i] > max && PQueueGetSize(&queues[i][*from]) > 0) {
+        max = npwgts[(*from)*ncon + i];
+        *cnum = i;
+      }
+    }
+  }
+
+  /* Check to see if you can focus on the cut */
+  if (maxdiff <= 0.0 || *from == -1) {
+    maxgain = -100000;
+
+    for (part=0; part<2; part++) {
+      for (i=0; i<ncon; i++) {
+        if (PQueueGetSize(&queues[i][part]) > 0 && PQueueGetKey(&queues[i][part]) > maxgain) {
+          maxgain = PQueueGetKey(&queues[i][part]); 
+          *from = part;
+          *cnum = i;
+        }
+      }
+    }
+  }
+
+  /* printf("Selected2 %d(%d) -> %d\n", *from, *cnum, PQueueGetSize(&queues[*cnum][*from])); */
+}
+
+
+
+
+
+/*************************************************************************
+* This function checks if the balance achieved is better than the diff 
+* For now, it uses a 2-norm measure
+**************************************************************************/ 
+int BetterBalance(int ncon, float *npwgts, float *tpwgts, float *diff)
+{
+  int i;
+  float ndiff[MAXNCON];
+
+  for (i=0; i<ncon; i++)
+    ndiff[i] = fabs(tpwgts[0]-npwgts[i]);
+   
+  return snorm2(ncon, ndiff) < snorm2(ncon, diff);
+}
+
+
+
+/*************************************************************************
+* This function computes the load imbalance over all the constrains
+**************************************************************************/ 
+float Compute2WayHLoadImbalance(int ncon, float *npwgts, float *tpwgts)
+{
+  int i;
+  float max=0.0, temp;
+
+  for (i=0; i<ncon; i++) {
+    /* temp = amax(npwgts[i]/tpwgts[0], npwgts[ncon+i]/tpwgts[1]); */
+    temp = fabs(tpwgts[0]-npwgts[i])/tpwgts[0];
+    max = (max < temp ? temp : max);
+  }
+  return 1.0+max;
+}
+
+
+/*************************************************************************
+* This function computes the load imbalance over all the constrains
+* For now assume that we just want balanced partitionings
+**************************************************************************/ 
+void Compute2WayHLoadImbalanceVec(int ncon, float *npwgts, float *tpwgts, float *lbvec)
+{
+  int i;
+
+  for (i=0; i<ncon; i++) 
+    lbvec[i] = 1.0 + fabs(tpwgts[0]-npwgts[i])/tpwgts[0];
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mfm2.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mfm2.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mfm2.c	(revision 9501)
@@ -0,0 +1,349 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mfm2.c
+ *
+ * This file contains code that implements the edge-based FM refinement
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: mfm2.c,v 1.2 1998/11/30 14:50:44 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function performs an edge-based FM refinement
+**************************************************************************/
+void MocFM_2WayEdgeRefine2(CtrlType *ctrl, GraphType *graph, float *tpwgts, float *orgubvec, 
+       int npasses)
+{
+  int i, ii, j, k, l, kwgt, nvtxs, ncon, nbnd, nswaps, from, to, pass, me, limit, tmp, cnum;
+  idxtype *xadj, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind;
+  idxtype *moved, *swaps, *perm, *qnum;
+  float *nvwgt, *npwgts, origdiff[MAXNCON], origbal[MAXNCON], minbal[MAXNCON];
+  PQueueType parts[MAXNCON][2];
+  int higain, oldgain, mincut, initcut, newcut, mincutorder;
+  float *maxwgt, *minwgt, ubvec[MAXNCON], tvec[MAXNCON];
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  npwgts = graph->npwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  qnum = idxwspacemalloc(ctrl, nvtxs);
+
+  limit = amin(amax(0.01*nvtxs, 15), 100);
+
+  Compute2WayHLoadImbalanceVec(ncon, npwgts, tpwgts, origbal);
+  for (i=0; i<ncon; i++) {
+    origdiff[i] = fabs(tpwgts[0]-npwgts[i]);
+    ubvec[i] = amax(origbal[i], orgubvec[i]);
+  }
+
+  /* Setup the weight intervals of the two subdomains */
+  minwgt = fwspacemalloc(ctrl, 2*ncon);
+  maxwgt = fwspacemalloc(ctrl, 2*ncon);
+
+  for (i=0; i<2; i++) {
+    for (j=0; j<ncon; j++) {
+      maxwgt[i*ncon+j] = tpwgts[i]*ubvec[j];
+      minwgt[i*ncon+j] = tpwgts[i]*(1.0/ubvec[j]);
+    }
+  }
+
+  /* Initialize the queues */
+  for (i=0; i<ncon; i++) {
+    PQueueInit(ctrl, &parts[i][0], nvtxs, PLUS_GAINSPAN+1);
+    PQueueInit(ctrl, &parts[i][1], nvtxs, PLUS_GAINSPAN+1);
+  }
+  for (i=0; i<nvtxs; i++)
+    qnum[i] = samax(ncon, nvwgt+i*ncon);
+
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("Parts: [");
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf("] T[%.3f %.3f], Nv-Nb[%5d, %5d]. ICut: %6d, LB: ", tpwgts[0], tpwgts[1], 
+            graph->nvtxs, graph->nbnd, graph->mincut);
+    for (i=0; i<ncon; i++)
+      printf("%.3f ", origbal[i]);
+    printf("\n");
+  }
+
+  idxset(nvtxs, -1, moved);
+  for (pass=0; pass<npasses; pass++) { /* Do a number of passes */
+    for (i=0; i<ncon; i++) { 
+      PQueueReset(&parts[i][0]);
+      PQueueReset(&parts[i][1]);
+    }
+
+    mincutorder = -1;
+    newcut = mincut = initcut = graph->mincut;
+    Compute2WayHLoadImbalanceVec(ncon, npwgts, tpwgts, minbal);
+
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+    ASSERT(CheckBnd(graph));
+
+    /* Insert boundary nodes in the priority queues */
+    nbnd = graph->nbnd;
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      ASSERT(ed[i] > 0 || id[i] == 0);
+      ASSERT(bndptr[i] != -1);
+      PQueueInsert(&parts[qnum[i]][where[i]], i, ed[i]-id[i]);
+    }
+
+    for (nswaps=0; nswaps<nvtxs; nswaps++) {
+      SelectQueue2(ncon, npwgts, tpwgts, &from, &cnum, parts, maxwgt);
+      to = (from+1)%2;
+
+      if (from == -1 || (higain = PQueueGetMax(&parts[cnum][from])) == -1)
+        break;
+      ASSERT(bndptr[higain] != -1);
+
+      newcut -= (ed[higain]-id[higain]);
+      saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+      saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+
+      Compute2WayHLoadImbalanceVec(ncon, npwgts, tpwgts, tvec);
+      if ((newcut < mincut && AreAllBelow(ncon, tvec, ubvec)) ||
+          (newcut == mincut && IsBetter2wayBalance(ncon, tvec, minbal, ubvec))) {
+        mincut = newcut;
+        for (i=0; i<ncon; i++) 
+          minbal[i] = tvec[i];
+        mincutorder = nswaps;
+      }
+      else if (nswaps-mincutorder > limit) { /* We hit the limit, undo last move */
+        newcut += (ed[higain]-id[higain]);
+        saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+        saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+        break;
+      }
+
+      where[higain] = to;
+      moved[higain] = nswaps;
+      swaps[nswaps] = higain;
+
+      if (ctrl->dbglvl&DBG_MOVEINFO) {
+        printf("Moved %6d from %d(%d). Gain: %5d, Cut: %5d, NPwgts: ", higain, from, cnum, ed[higain]-id[higain], newcut);
+        for (l=0; l<ncon; l++) 
+          printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+
+        printf(", LB: ");
+        for (i=0; i<ncon; i++) 
+          printf("%.3f ", tvec[i]);
+        if (mincutorder == nswaps)
+          printf(" *\n");
+        else
+          printf("\n");
+      }
+
+
+      /**************************************************************
+      * Update the id[i]/ed[i] values of the affected nodes
+      ***************************************************************/
+      SWAP(id[higain], ed[higain], tmp);
+      if (ed[higain] == 0 && xadj[higain] < xadj[higain+1]) 
+        BNDDelete(nbnd, bndind,  bndptr, higain);
+
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        oldgain = ed[k]-id[k];
+
+        kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+        INC_DEC(id[k], ed[k], kwgt);
+
+        /* Update its boundary information and queue position */
+        if (bndptr[k] != -1) { /* If k was a boundary vertex */
+          if (ed[k] == 0) { /* Not a boundary vertex any more */
+            BNDDelete(nbnd, bndind, bndptr, k);
+            if (moved[k] == -1)  /* Remove it if in the queues */
+              PQueueDelete(&parts[qnum[k]][where[k]], k, oldgain);
+          }
+          else { /* If it has not been moved, update its position in the queue */
+            if (moved[k] == -1)
+              PQueueUpdate(&parts[qnum[k]][where[k]], k, oldgain, ed[k]-id[k]);
+          }
+        }
+        else {
+          if (ed[k] > 0) {  /* It will now become a boundary vertex */
+            BNDInsert(nbnd, bndind, bndptr, k);
+            if (moved[k] == -1) 
+              PQueueInsert(&parts[qnum[k]][where[k]], k, ed[k]-id[k]);
+          }
+        }
+      }
+
+    }
+
+
+    /****************************************************************
+    * Roll back computations
+    *****************************************************************/
+    for (i=0; i<nswaps; i++)
+      moved[swaps[i]] = -1;  /* reset moved array */
+    for (nswaps--; nswaps>mincutorder; nswaps--) {
+      higain = swaps[nswaps];
+
+      to = where[higain] = (where[higain]+1)%2;
+      SWAP(id[higain], ed[higain], tmp);
+      if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1])
+        BNDDelete(nbnd, bndind,  bndptr, higain);
+      else if (ed[higain] > 0 && bndptr[higain] == -1)
+        BNDInsert(nbnd, bndind,  bndptr, higain);
+
+      saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+      saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+((to+1)%2)*ncon, 1);
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+
+        kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+        INC_DEC(id[k], ed[k], kwgt);
+
+        if (bndptr[k] != -1 && ed[k] == 0)
+          BNDDelete(nbnd, bndind, bndptr, k);
+        if (bndptr[k] == -1 && ed[k] > 0)
+          BNDInsert(nbnd, bndind, bndptr, k);
+      }
+    }
+
+    if (ctrl->dbglvl&DBG_REFINE) {
+      printf("\tMincut: %6d at %5d, NBND: %6d, NPwgts: [", mincut, mincutorder, nbnd);
+      for (l=0; l<ncon; l++)
+        printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+      printf("], LB: ");
+      Compute2WayHLoadImbalanceVec(ncon, npwgts, tpwgts, tvec);
+      for (i=0; i<ncon; i++) 
+        printf("%.3f ", tvec[i]);
+      printf("\n");
+    }
+
+    graph->mincut = mincut;
+    graph->nbnd = nbnd;
+
+    if (mincutorder == -1 || mincut == initcut)
+      break;
+  }
+
+  for (i=0; i<ncon; i++) {
+    PQueueFree(ctrl, &parts[i][0]);
+    PQueueFree(ctrl, &parts[i][1]);
+  }
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  fwspacefree(ctrl, 2*ncon);
+  fwspacefree(ctrl, 2*ncon);
+
+}
+
+
+/*************************************************************************
+* This function selects the partition number and the queue from which
+* we will move vertices out
+**************************************************************************/ 
+void SelectQueue2(int ncon, float *npwgts, float *tpwgts, int *from, int *cnum, 
+       PQueueType queues[MAXNCON][2], float *maxwgt)
+{
+  int i, j, maxgain=0;
+  float diff, max, maxdiff=0.0;
+
+  *from = -1;
+  *cnum = -1;
+
+  /* First determine the side and the queue, irrespective of the presence of nodes */
+  for (j=0; j<2; j++) {
+    for (i=0; i<ncon; i++) {
+      diff = npwgts[j*ncon+i]-maxwgt[j*ncon+i];
+      if (diff >= maxdiff) {
+        maxdiff = diff;
+        *from = j;
+        *cnum = i;
+      }
+    }
+  }
+
+  if (*from != -1 && PQueueGetSize(&queues[*cnum][*from]) == 0) {
+    /* The desired queue is empty, select a node from that side anyway */
+    for (i=0; i<ncon; i++) {
+      if (PQueueGetSize(&queues[i][*from]) > 0) {
+        max = (npwgts[(*from)*ncon+i] - maxwgt[(*from)*ncon+i]);
+        *cnum = i;
+        break;
+      }
+    }
+
+    for (i++; i<ncon; i++) {
+      diff = npwgts[(*from)*ncon+i] - maxwgt[(*from)*ncon+i];
+      if (diff > max && PQueueGetSize(&queues[i][*from]) > 0) {
+        max = diff;
+        *cnum = i;
+      }
+    }
+  }
+
+  /* Check to see if you can focus on the cut */
+  if (maxdiff <= 0.0 || *from == -1) {
+    maxgain = -100000;
+
+    for (j=0; j<2; j++) {
+      for (i=0; i<ncon; i++) {
+        if (PQueueGetSize(&queues[i][j]) > 0 && PQueueGetKey(&queues[i][j]) > maxgain) {
+          maxgain = PQueueGetKey(&queues[i][j]); 
+          *from = j;
+          *cnum = i;
+        }
+      }
+    }
+
+    /* printf("(%2d %2d) %3d\n", *from, *cnum, maxgain); */
+  }
+}
+
+
+/*************************************************************************
+* This function checks if the newbal is better than oldbal given the
+* ubvector ubvec
+**************************************************************************/
+int IsBetter2wayBalance(int ncon, float *newbal, float *oldbal, float *ubvec)
+{
+  int i, j;
+  float max1=0.0, max2=0.0, sum1=0.0, sum2=0.0, tmp;
+
+  for (i=0; i<ncon; i++) {
+    tmp = (newbal[i]-1)/(ubvec[i]-1);
+    max1 = (max1 < tmp ? tmp : max1);
+    sum1 += tmp;
+
+    tmp = (oldbal[i]-1)/(ubvec[i]-1);
+    max2 = (max2 < tmp ? tmp : max2);
+    sum2 += tmp;
+  }
+
+  if (max1 < max2)
+    return 1;
+  else if (max1 > max2)
+    return 0;
+  else
+    return sum1 <= sum2;
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mincover.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mincover.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mincover.c	(revision 9501)
@@ -0,0 +1,259 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mincover.c
+ *
+ * This file implements the minimum cover algorithm
+ *
+ * Started 8/1/97
+ * George
+ *
+ * $Id: mincover.c,v 1.1 1998/11/27 17:59:22 karypis Exp $
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* Constants used by mincover algorithm
+**************************************************************************/
+#define INCOL 10
+#define INROW 20
+#define VC 1
+#define SC 2
+#define HC 3
+#define VR 4
+#define SR 5
+#define HR 6
+
+
+/*************************************************************************
+* This function returns the min-cover of a bipartite graph.
+* The algorithm used is due to Hopcroft and Karp as modified by Duff etal
+* adj: the adjacency list of the bipartite graph
+*       asize: the number of vertices in the first part of the bipartite graph
+* bsize-asize: the number of vertices in the second part
+*        0..(asize-1) > A vertices
+*        asize..bsize > B vertices
+*
+* Returns:
+*  cover : the actual cover (array)
+*  csize : the size of the cover
+**************************************************************************/
+void MinCover(idxtype *xadj, idxtype *adjncy, int asize, int bsize, idxtype *cover, int *csize)
+{
+  int i, j;
+  idxtype *mate, *queue, *flag, *level, *lst;
+  int fptr, rptr, lstptr;
+  int row, maxlevel, col;
+
+  mate = idxsmalloc(bsize, -1, "MinCover: mate");
+  flag = idxmalloc(bsize, "MinCover: flag");
+  level = idxmalloc(bsize, "MinCover: level");
+  queue = idxmalloc(bsize, "MinCover: queue");
+  lst = idxmalloc(bsize, "MinCover: lst");
+
+  /* Get a cheap matching */
+  for (i=0; i<asize; i++) {
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (mate[adjncy[j]] == -1) {
+        mate[i] = adjncy[j];
+        mate[adjncy[j]] = i;
+        break;
+      }
+    }
+  }
+
+  /* Get into the main loop */
+  while (1) {
+    /* Initialization */
+    fptr = rptr = 0;   /* Empty Queue */
+    lstptr = 0;        /* Empty List */
+    for (i=0; i<bsize; i++) {
+      level[i] = -1;
+      flag[i] = 0;
+    }
+    maxlevel = bsize;
+
+    /* Insert free nodes into the queue */
+    for (i=0; i<asize; i++) 
+      if (mate[i] == -1) {
+        queue[rptr++] = i;
+        level[i] = 0;
+      }
+
+    /* Perform the BFS */
+    while (fptr != rptr) {
+      row = queue[fptr++];
+      if (level[row] < maxlevel) {
+        flag[row] = 1;
+        for (j=xadj[row]; j<xadj[row+1]; j++) {
+          col = adjncy[j];
+          if (!flag[col]) {  /* If this column has not been accessed yet */
+            flag[col] = 1;
+            if (mate[col] == -1) { /* Free column node was found */
+              maxlevel = level[row];
+              lst[lstptr++] = col;
+            }
+            else { /* This column node is matched */
+              if (flag[mate[col]]) 
+                printf("\nSomething wrong, flag[%d] is 1",mate[col]);
+              queue[rptr++] = mate[col];
+              level[mate[col]] = level[row] + 1;
+            }
+          }
+        }
+      } 
+    }
+
+    if (lstptr == 0)
+      break;   /* No free columns can be reached */
+
+    /* Perform restricted DFS from the free column nodes */
+    for (i=0; i<lstptr; i++)
+      MinCover_Augment(xadj, adjncy, lst[i], mate, flag, level, maxlevel);
+  }
+
+  MinCover_Decompose(xadj, adjncy, asize, bsize, mate, cover, csize);
+
+  GKfree(&mate, &flag, &level, &queue, &lst, LTERM);
+
+}
+
+
+/*************************************************************************
+* This function perfoms a restricted DFS and augments matchings
+**************************************************************************/
+int MinCover_Augment(idxtype *xadj, idxtype *adjncy, int col, idxtype *mate, idxtype *flag, idxtype *level, int maxlevel)
+{
+  int i;
+  int row = -1;
+  int status;
+
+  flag[col] = 2;
+  for (i=xadj[col]; i<xadj[col+1]; i++) {
+    row = adjncy[i];
+
+    if (flag[row] == 1) { /* First time through this row node */
+      if (level[row] == maxlevel) {  /* (col, row) is an edge of the G^T */
+        flag[row] = 2;  /* Mark this node as being visited */
+        if (maxlevel != 0)
+          status = MinCover_Augment(xadj, adjncy, mate[row], mate, flag, level, maxlevel-1);
+        else
+          status = 1;
+
+        if (status) {
+          mate[col] = row;
+          mate[row] = col;
+          return 1;
+        }
+      }
+    }
+  }
+
+  return 0;
+}
+
+
+
+/*************************************************************************
+* This function performs a coarse decomposition and determines the 
+* min-cover.
+* REF: Pothen ACMTrans. on Amth Software
+**************************************************************************/
+void MinCover_Decompose(idxtype *xadj, idxtype *adjncy, int asize, int bsize, idxtype *mate, idxtype *cover, int *csize)
+{
+  int i, k;
+  idxtype *where;
+  int card[10];
+
+  where = idxmalloc(bsize, "MinCover_Decompose: where");
+  for (i=0; i<10; i++)
+    card[i] = 0;
+
+  for (i=0; i<asize; i++)
+    where[i] = SC;
+  for (; i<bsize; i++)
+    where[i] = SR;
+
+  for (i=0; i<asize; i++) 
+    if (mate[i] == -1)  
+      MinCover_ColDFS(xadj, adjncy, i, mate, where, INCOL);
+  for (; i<bsize; i++) 
+    if (mate[i] == -1)  
+      MinCover_RowDFS(xadj, adjncy, i, mate, where, INROW);
+
+  for (i=0; i<bsize; i++) 
+    card[where[i]]++;
+
+  k = 0;
+  if (abs(card[VC]+card[SC]-card[HR]) < abs(card[VC]-card[SR]-card[HR])) {  /* S = VC+SC+HR */
+    /* printf("%d %d ",vc+sc, hr); */
+    for (i=0; i<bsize; i++) 
+      if (where[i] == VC || where[i] == SC || where[i] == HR)
+        cover[k++] = i;
+  }
+  else {  /* S = VC+SR+HR */
+    /* printf("%d %d ",vc, hr+sr); */
+    for (i=0; i<bsize; i++) 
+      if (where[i] == VC || where[i] == SR || where[i] == HR)
+        cover[k++] = i;
+  }
+
+  *csize = k;
+  free(where);
+
+}
+
+
+/*************************************************************************
+* This function perfoms a dfs starting from an unmatched col node
+* forming alternate paths
+**************************************************************************/
+void MinCover_ColDFS(idxtype *xadj, idxtype *adjncy, int root, idxtype *mate, idxtype *where, int flag)
+{
+  int i;
+
+  if (flag == INCOL) {
+    if (where[root] == HC)
+      return;
+    where[root] = HC;
+    for (i=xadj[root]; i<xadj[root+1]; i++) 
+      MinCover_ColDFS(xadj, adjncy, adjncy[i], mate, where, INROW);
+  }
+  else {
+    if (where[root] == HR)
+      return;
+    where[root] = HR;
+    if (mate[root] != -1)
+      MinCover_ColDFS(xadj, adjncy, mate[root], mate, where, INCOL);
+  }
+
+}
+
+/*************************************************************************
+* This function perfoms a dfs starting from an unmatched col node
+* forming alternate paths
+**************************************************************************/
+void MinCover_RowDFS(idxtype *xadj, idxtype *adjncy, int root, idxtype *mate, idxtype *where, int flag)
+{
+  int i;
+
+  if (flag == INROW) {
+    if (where[root] == VR)
+      return;
+    where[root] = VR;
+    for (i=xadj[root]; i<xadj[root+1]; i++) 
+      MinCover_RowDFS(xadj, adjncy, adjncy[i], mate, where, INCOL);
+  }
+  else {
+    if (where[root] == VC)
+      return;
+    where[root] = VC;
+    if (mate[root] != -1)
+      MinCover_RowDFS(xadj, adjncy, mate[root], mate, where, INROW);
+  }
+
+}
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/minitpart.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/minitpart.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/minitpart.c	(revision 9501)
@@ -0,0 +1,355 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * minitpart.c
+ *
+ * This file contains code that performs the initial partition of the
+ * coarsest graph
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: minitpart.c,v 1.2 1998/11/30 15:08:37 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function computes the initial bisection of the coarsest graph
+**************************************************************************/
+void MocInit2WayPartition(CtrlType *ctrl, GraphType *graph, float *tpwgts, float ubfactor) 
+{
+  int i, dbglvl;
+
+  dbglvl = ctrl->dbglvl;
+  IFSET(ctrl->dbglvl, DBG_REFINE, ctrl->dbglvl -= DBG_REFINE);
+  IFSET(ctrl->dbglvl, DBG_MOVEINFO, ctrl->dbglvl -= DBG_MOVEINFO);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->InitPartTmr));
+
+  switch (ctrl->IType) {
+    case IPART_GGPKL:
+      MocGrowBisection(ctrl, graph, tpwgts, ubfactor);
+      break;
+    case IPART_RANDOM:
+      MocRandomBisection(ctrl, graph, tpwgts, ubfactor);
+      break;
+    default:
+      errexit("Unknown initial partition type: %d\n", ctrl->IType);
+  }
+
+  IFSET(ctrl->dbglvl, DBG_IPART, printf("Initial Cut: %d [%d]\n", graph->mincut, graph->where[0]));
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->InitPartTmr));
+  ctrl->dbglvl = dbglvl;
+
+}
+
+
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection by using a region
+* growing algorithm. The resulting partition is returned in
+* graph->where
+**************************************************************************/
+void MocGrowBisection(CtrlType *ctrl, GraphType *graph, float *tpwgts, float ubfactor)
+{
+  int i, j, k, nvtxs, ncon, from, bestcut, mincut, nbfs;
+  idxtype *bestwhere, *where;
+
+  nvtxs = graph->nvtxs;
+
+  MocAllocate2WayPartitionMemory(ctrl, graph);
+  where = graph->where;
+
+  bestwhere = idxmalloc(nvtxs, "BisectGraph: bestwhere");
+  nbfs = 2*(nvtxs <= ctrl->CoarsenTo ? SMALLNIPARTS : LARGENIPARTS);
+  bestcut = idxsum(graph->nedges, graph->adjwgt);  
+
+  for (; nbfs>0; nbfs--) {
+    idxset(nvtxs, 1, where);
+    where[RandomInRange(nvtxs)] = 0;
+
+    MocCompute2WayPartitionParams(ctrl, graph);
+
+    MocInit2WayBalance(ctrl, graph, tpwgts);
+
+    MocFM_2WayEdgeRefine(ctrl, graph, tpwgts, 4); 
+
+    MocBalance2Way(ctrl, graph, tpwgts, 1.02);
+    MocFM_2WayEdgeRefine(ctrl, graph, tpwgts, 4); 
+
+    if (bestcut >= graph->mincut) {
+      bestcut = graph->mincut;
+      idxcopy(nvtxs, where, bestwhere);
+      if (bestcut == 0)
+        break;
+    }
+  }
+
+  graph->mincut = bestcut;
+  idxcopy(nvtxs, bestwhere, where);
+
+  GKfree(&bestwhere, LTERM);
+}
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection by using a region
+* growing algorithm. The resulting partition is returned in
+* graph->where
+**************************************************************************/
+void MocRandomBisection(CtrlType *ctrl, GraphType *graph, float *tpwgts, float ubfactor)
+{
+  int i, ii, j, k, nvtxs, ncon, from, bestcut, mincut, nbfs, qnum;
+  idxtype *bestwhere, *where, *perm;
+  int counts[MAXNCON];
+  float *nvwgt;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  nvwgt = graph->nvwgt;
+
+  MocAllocate2WayPartitionMemory(ctrl, graph);
+  where = graph->where;
+
+  bestwhere = idxmalloc(nvtxs, "BisectGraph: bestwhere");
+  nbfs = 2*(nvtxs <= ctrl->CoarsenTo ? SMALLNIPARTS : LARGENIPARTS);
+  bestcut = idxsum(graph->nedges, graph->adjwgt);  
+  perm = idxmalloc(nvtxs, "BisectGraph: perm");
+
+  for (; nbfs>0; nbfs--) {
+    for (i=0; i<ncon; i++)
+      counts[i] = 0;
+
+    RandomPermute(nvtxs, perm, 1);
+
+    /* Partition by spliting the queues randomly */
+    for (ii=0; ii<nvtxs; ii++) {
+      i = perm[ii];
+      qnum = samax(ncon, nvwgt+i*ncon);
+      where[i] = counts[qnum];
+      counts[qnum] = (counts[qnum]+1)%2;
+    }
+
+    MocCompute2WayPartitionParams(ctrl, graph);
+
+    MocFM_2WayEdgeRefine(ctrl, graph, tpwgts, 6); 
+    MocBalance2Way(ctrl, graph, tpwgts, 1.02);
+    MocFM_2WayEdgeRefine(ctrl, graph, tpwgts, 6); 
+    MocBalance2Way(ctrl, graph, tpwgts, 1.02);
+    MocFM_2WayEdgeRefine(ctrl, graph, tpwgts, 6); 
+
+    /*
+    printf("Edgecut: %6d, NPwgts: [", graph->mincut);
+    for (i=0; i<graph->ncon; i++)
+      printf("(%.3f %.3f) ", graph->npwgts[i], graph->npwgts[graph->ncon+i]);
+    printf("]\n");
+    */
+
+    if (bestcut >= graph->mincut) {
+      bestcut = graph->mincut;
+      idxcopy(nvtxs, where, bestwhere);
+      if (bestcut == 0)
+        break;
+    }
+  }
+
+  graph->mincut = bestcut;
+  idxcopy(nvtxs, bestwhere, where);
+
+  GKfree(&bestwhere, &perm, LTERM);
+}
+
+
+
+
+/*************************************************************************
+* This function balances two partitions by moving the highest gain 
+* (including negative gain) vertices to the other domain.
+* It is used only when tha unbalance is due to non contigous
+* subdomains. That is, the are no boundary vertices.
+* It moves vertices from the domain that is overweight to the one that 
+* is underweight.
+**************************************************************************/
+void MocInit2WayBalance(CtrlType *ctrl, GraphType *graph, float *tpwgts)
+{
+  int i, ii, j, k, l, kwgt, nvtxs, nbnd, ncon, nswaps, from, to, pass, me, cnum, tmp;
+  idxtype *xadj, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind;
+  idxtype *perm, *qnum;
+  float *nvwgt, *npwgts;
+  PQueueType parts[MAXNCON][2];
+  int higain, oldgain, mincut;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  nvwgt = graph->nvwgt;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  npwgts = graph->npwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  qnum = idxwspacemalloc(ctrl, nvtxs);
+
+  /* This is called for initial partitioning so we know from where to pick nodes */
+  from = 1;
+  to = (from+1)%2;
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("Parts: [");
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf("] T[%.3f %.3f], Nv-Nb[%5d, %5d]. ICut: %6d, LB: %.3f [B]\n", tpwgts[0], tpwgts[1], 
+           graph->nvtxs, graph->nbnd, graph->mincut, 
+           Compute2WayHLoadImbalance(ncon, npwgts, tpwgts));
+  }
+
+  for (i=0; i<ncon; i++) {
+    PQueueInit(ctrl, &parts[i][0], nvtxs, PLUS_GAINSPAN+1);
+    PQueueInit(ctrl, &parts[i][1], nvtxs, PLUS_GAINSPAN+1);
+  }
+
+  ASSERT(ComputeCut(graph, where) == graph->mincut);
+  ASSERT(CheckBnd(graph));
+  ASSERT(CheckGraph(graph));
+
+  /* Compute the queues in which each vertex will be assigned to */
+  for (i=0; i<nvtxs; i++)
+    qnum[i] = samax(ncon, nvwgt+i*ncon);
+
+  /* Insert the nodes of the proper partition in the appropriate priority queue */
+  RandomPermute(nvtxs, perm, 1);
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+    if (where[i] == from) {
+      if (ed[i] > 0)
+        PQueueInsert(&parts[qnum[i]][0], i, ed[i]-id[i]);
+      else
+        PQueueInsert(&parts[qnum[i]][1], i, ed[i]-id[i]);
+    }
+  }
+
+
+  mincut = graph->mincut;
+  nbnd = graph->nbnd;
+  for (nswaps=0; nswaps<nvtxs; nswaps++) {
+    if (AreAnyVwgtsBelow(ncon, 1.0, npwgts+from*ncon, 0.0, nvwgt, tpwgts[from]))
+      break;
+
+    if ((cnum = SelectQueueOneWay(ncon, npwgts, tpwgts, from, parts)) == -1)
+      break;
+
+    if ((higain = PQueueGetMax(&parts[cnum][0])) == -1)
+      higain = PQueueGetMax(&parts[cnum][1]);
+
+    mincut -= (ed[higain]-id[higain]);
+    saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+    saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+
+    where[higain] = to;
+
+    if (ctrl->dbglvl&DBG_MOVEINFO) {
+      printf("Moved %6d from %d(%d). [%5d] %5d, NPwgts: ", higain, from, cnum, ed[higain]-id[higain], mincut);
+      for (l=0; l<ncon; l++) 
+        printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+      printf(", LB: %.3f\n", Compute2WayHLoadImbalance(ncon, npwgts, tpwgts));
+      if (ed[higain] == 0 && id[higain] > 0)
+        printf("\t Pulled from the interior!\n");
+    }
+
+
+    /**************************************************************
+    * Update the id[i]/ed[i] values of the affected nodes
+    ***************************************************************/
+    SWAP(id[higain], ed[higain], tmp);
+    if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1]) 
+      BNDDelete(nbnd, bndind,  bndptr, higain);
+    if (ed[higain] > 0 && bndptr[higain] == -1)
+      BNDInsert(nbnd, bndind,  bndptr, higain);
+
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+      oldgain = ed[k]-id[k];
+
+      kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+      INC_DEC(id[k], ed[k], kwgt);
+
+      /* Update the queue position */
+      if (where[k] == from) {
+        if (ed[k] > 0 && bndptr[k] == -1) {  /* It moves in boundary */
+          PQueueDelete(&parts[qnum[k]][1], k, oldgain);
+          PQueueInsert(&parts[qnum[k]][0], k, ed[k]-id[k]);
+        }
+        else { /* It must be in the boundary already */
+          if (bndptr[k] == -1)
+            printf("What you thought was wrong!\n");
+          PQueueUpdate(&parts[qnum[k]][0], k, oldgain, ed[k]-id[k]);
+        }
+      }
+
+      /* Update its boundary information */
+      if (ed[k] == 0 && bndptr[k] != -1) 
+        BNDDelete(nbnd, bndind, bndptr, k);
+      else if (ed[k] > 0 && bndptr[k] == -1)  
+        BNDInsert(nbnd, bndind, bndptr, k);
+    }
+
+    ASSERTP(ComputeCut(graph, where) == mincut, ("%d != %d\n", ComputeCut(graph, where), mincut));
+
+  }
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("\tMincut: %6d, NBND: %6d, NPwgts: ", mincut, nbnd);
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf(", LB: %.3f\n", Compute2WayHLoadImbalance(ncon, npwgts, tpwgts));
+  }
+
+  graph->mincut = mincut;
+  graph->nbnd = nbnd;
+
+  for (i=0; i<ncon; i++) {
+    PQueueFree(ctrl, &parts[i][0]);
+    PQueueFree(ctrl, &parts[i][1]);
+  }
+
+  ASSERT(ComputeCut(graph, where) == graph->mincut);
+  ASSERT(CheckBnd(graph));
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+
+/*************************************************************************
+* This function selects the partition number and the queue from which
+* we will move vertices out
+**************************************************************************/ 
+int SelectQueueOneWay(int ncon, float *npwgts, float *tpwgts, int from, PQueueType queues[MAXNCON][2])
+{
+  int i, cnum=-1;
+  float max=0.0;
+
+  for (i=0; i<ncon; i++) {
+    if (npwgts[from*ncon+i]-tpwgts[from] >= max && 
+        PQueueGetSize(&queues[i][0]) + PQueueGetSize(&queues[i][1]) > 0) {
+      max = npwgts[from*ncon+i]-tpwgts[0];
+      cnum = i;
+    }
+  }
+
+  return cnum;
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/minitpart2.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/minitpart2.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/minitpart2.c	(revision 9501)
@@ -0,0 +1,368 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * minitpart2.c
+ *
+ * This file contains code that performs the initial partition of the
+ * coarsest graph
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: minitpart2.c,v 1.1 1998/11/27 17:59:23 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function computes the initial bisection of the coarsest graph
+**************************************************************************/
+void MocInit2WayPartition2(CtrlType *ctrl, GraphType *graph, float *tpwgts, float *ubvec) 
+{
+  int dbglvl;
+
+  dbglvl = ctrl->dbglvl;
+  IFSET(ctrl->dbglvl, DBG_REFINE, ctrl->dbglvl -= DBG_REFINE);
+  IFSET(ctrl->dbglvl, DBG_MOVEINFO, ctrl->dbglvl -= DBG_MOVEINFO);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->InitPartTmr));
+
+  switch (ctrl->IType) {
+    case IPART_GGPKL:
+    case IPART_RANDOM:
+      MocGrowBisection2(ctrl, graph, tpwgts, ubvec);
+      break;
+    case 3:
+      MocGrowBisectionNew2(ctrl, graph, tpwgts, ubvec);
+      break;
+    default:
+      errexit("Unknown initial partition type: %d\n", ctrl->IType);
+  }
+
+  IFSET(ctrl->dbglvl, DBG_IPART, printf("Initial Cut: %d\n", graph->mincut));
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->InitPartTmr));
+  ctrl->dbglvl = dbglvl;
+
+}
+
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection by using a region
+* growing algorithm. The resulting partition is returned in
+* graph->where
+**************************************************************************/
+void MocGrowBisection2(CtrlType *ctrl, GraphType *graph, float *tpwgts, float *ubvec)
+{
+  int i, j, k, nvtxs, ncon, from, bestcut, mincut, nbfs;
+  idxtype *bestwhere, *where;
+
+  nvtxs = graph->nvtxs;
+
+  MocAllocate2WayPartitionMemory(ctrl, graph);
+  where = graph->where;
+
+  bestwhere = idxmalloc(nvtxs, "BisectGraph: bestwhere");
+  nbfs = 2*(nvtxs <= ctrl->CoarsenTo ? SMALLNIPARTS : LARGENIPARTS);
+  bestcut = idxsum(graph->nedges, graph->adjwgt);  
+
+  for (; nbfs>0; nbfs--) {
+    idxset(nvtxs, 1, where);
+    where[RandomInRange(nvtxs)] = 0;
+
+    MocCompute2WayPartitionParams(ctrl, graph);
+
+    MocBalance2Way2(ctrl, graph, tpwgts, ubvec);
+
+    MocFM_2WayEdgeRefine2(ctrl, graph, tpwgts, ubvec, 4); 
+
+    MocBalance2Way2(ctrl, graph, tpwgts, ubvec);
+    MocFM_2WayEdgeRefine2(ctrl, graph, tpwgts, ubvec, 4); 
+
+    if (bestcut > graph->mincut) {
+      bestcut = graph->mincut;
+      idxcopy(nvtxs, where, bestwhere);
+      if (bestcut == 0)
+        break;
+    }
+  }
+
+  graph->mincut = bestcut;
+  idxcopy(nvtxs, bestwhere, where);
+
+  GKfree(&bestwhere, LTERM);
+}
+
+
+
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection by using a region
+* growing algorithm. The resulting partition is returned in
+* graph->where
+**************************************************************************/
+void MocGrowBisectionNew2(CtrlType *ctrl, GraphType *graph, float *tpwgts, float *ubvec)
+{
+  int i, j, k, nvtxs, ncon, from, bestcut, mincut, nbfs;
+  idxtype *bestwhere, *where;
+
+  nvtxs = graph->nvtxs;
+
+  MocAllocate2WayPartitionMemory(ctrl, graph);
+  where = graph->where;
+
+  bestwhere = idxmalloc(nvtxs, "BisectGraph: bestwhere");
+  nbfs = 2*(nvtxs <= ctrl->CoarsenTo ? SMALLNIPARTS : LARGENIPARTS);
+  bestcut = idxsum(graph->nedges, graph->adjwgt);  
+
+  for (; nbfs>0; nbfs--) {
+    idxset(nvtxs, 1, where);
+    where[RandomInRange(nvtxs)] = 0;
+
+    MocCompute2WayPartitionParams(ctrl, graph);
+
+    MocInit2WayBalance2(ctrl, graph, tpwgts, ubvec);
+
+    MocFM_2WayEdgeRefine2(ctrl, graph, tpwgts, ubvec, 4); 
+
+    if (bestcut > graph->mincut) {
+      bestcut = graph->mincut;
+      idxcopy(nvtxs, where, bestwhere);
+      if (bestcut == 0)
+        break;
+    }
+  }
+
+  graph->mincut = bestcut;
+  idxcopy(nvtxs, bestwhere, where);
+
+  GKfree(&bestwhere, LTERM);
+}
+
+
+
+/*************************************************************************
+* This function balances two partitions by moving the highest gain 
+* (including negative gain) vertices to the other domain.
+* It is used only when tha unbalance is due to non contigous
+* subdomains. That is, the are no boundary vertices.
+* It moves vertices from the domain that is overweight to the one that 
+* is underweight.
+**************************************************************************/
+void MocInit2WayBalance2(CtrlType *ctrl, GraphType *graph, float *tpwgts, float *ubvec)
+{
+  int i, ii, j, k, l, kwgt, nvtxs, nbnd, ncon, nswaps, from, to, pass, me, cnum, tmp, imin;
+  idxtype *xadj, *adjncy, *adjwgt, *where, *id, *ed, *bndptr, *bndind;
+  idxtype *moved, *perm, *qnum;
+  float *nvwgt, *npwgts, minwgt;
+  PQueueType parts[MAXNCON][2];
+  int higain, oldgain, mincut;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  nvwgt = graph->nvwgt;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  id = graph->id;
+  ed = graph->ed;
+  npwgts = graph->npwgts;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  qnum = idxwspacemalloc(ctrl, nvtxs);
+
+  /* This is called for initial partitioning so we know from where to pick nodes */
+  from = 1;
+  to = (from+1)%2;
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("Parts: [");
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf("] T[%.3f %.3f], Nv-Nb[%5d, %5d]. ICut: %6d, LB: %.3f [B]\n", tpwgts[0], tpwgts[1], graph->nvtxs, graph->nbnd, graph->mincut, ComputeLoadImbalance(ncon, 2, npwgts, tpwgts));
+  }
+
+  for (i=0; i<ncon; i++) {
+    PQueueInit(ctrl, &parts[i][0], nvtxs, PLUS_GAINSPAN+1);
+    PQueueInit(ctrl, &parts[i][1], nvtxs, PLUS_GAINSPAN+1);
+  }
+
+  idxset(nvtxs, -1, moved);
+
+  ASSERT(ComputeCut(graph, where) == graph->mincut);
+  ASSERT(CheckBnd(graph));
+  ASSERT(CheckGraph(graph));
+
+  /* Compute the queues in which each vertex will be assigned to */
+  for (i=0; i<nvtxs; i++)
+    qnum[i] = samax(ncon, nvwgt+i*ncon);
+
+  /* Insert the nodes of the proper partition in the appropriate priority queue */
+  RandomPermute(nvtxs, perm, 1);
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+    if (where[i] == from) {
+      if (ed[i] > 0)
+        PQueueInsert(&parts[qnum[i]][0], i, ed[i]-id[i]);
+      else
+        PQueueInsert(&parts[qnum[i]][1], i, ed[i]-id[i]);
+    }
+  }
+
+/*
+  for (i=0; i<ncon; i++)
+    printf("Queue #%d has %d %d\n", i, parts[i][0].nnodes, parts[i][1].nnodes);
+*/
+
+  /* Determine the termination criterion */
+  imin = 0;
+  for (i=1; i<ncon; i++) 
+    imin = (ubvec[i] < ubvec[imin] ? i : imin);
+  minwgt = .5/ubvec[imin];
+
+  mincut = graph->mincut;
+  nbnd = graph->nbnd;
+  for (nswaps=0; nswaps<nvtxs; nswaps++) {
+    /* Exit as soon as the minimum weight crossed over */
+    if (npwgts[to*ncon+imin] > minwgt)  
+      break;
+
+    if ((cnum = SelectQueueOneWay2(ncon, npwgts+to*ncon, parts, ubvec)) == -1)
+      break;
+
+    if ((higain = PQueueGetMax(&parts[cnum][0])) == -1)
+      higain = PQueueGetMax(&parts[cnum][1]);
+
+    mincut -= (ed[higain]-id[higain]);
+    saxpy(ncon, 1.0, nvwgt+higain*ncon, 1, npwgts+to*ncon, 1);
+    saxpy(ncon, -1.0, nvwgt+higain*ncon, 1, npwgts+from*ncon, 1);
+
+    where[higain] = to;
+    moved[higain] = nswaps;
+
+    if (ctrl->dbglvl&DBG_MOVEINFO) {
+      printf("Moved %6d from %d(%d). [%5d] %5d, NPwgts: ", higain, from, cnum, ed[higain]-id[higain], mincut);
+      for (l=0; l<ncon; l++) 
+        printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+      printf(", LB: %.3f\n", ComputeLoadImbalance(ncon, 2, npwgts, tpwgts));
+      if (ed[higain] == 0 && id[higain] > 0)
+        printf("\t Pulled from the interior!\n");
+    }
+
+
+    /**************************************************************
+    * Update the id[i]/ed[i] values of the affected nodes
+    ***************************************************************/
+    SWAP(id[higain], ed[higain], tmp);
+    if (ed[higain] == 0 && bndptr[higain] != -1 && xadj[higain] < xadj[higain+1]) 
+      BNDDelete(nbnd, bndind,  bndptr, higain);
+    if (ed[higain] > 0 && bndptr[higain] == -1)
+      BNDInsert(nbnd, bndind,  bndptr, higain);
+
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+      oldgain = ed[k]-id[k];
+
+      kwgt = (to == where[k] ? adjwgt[j] : -adjwgt[j]);
+      INC_DEC(id[k], ed[k], kwgt);
+
+      /* Update the queue position */
+      if (moved[k] == -1 && where[k] == from) {
+        if (ed[k] > 0 && bndptr[k] == -1) {  /* It moves in boundary */
+          PQueueDelete(&parts[qnum[k]][1], k, oldgain);
+          PQueueInsert(&parts[qnum[k]][0], k, ed[k]-id[k]);
+        }
+        else { /* It must be in the boundary already */
+          if (bndptr[k] == -1)
+            printf("What you thought was wrong!\n");
+          PQueueUpdate(&parts[qnum[k]][0], k, oldgain, ed[k]-id[k]);
+        }
+      }
+
+      /* Update its boundary information */
+      if (ed[k] == 0 && bndptr[k] != -1) 
+        BNDDelete(nbnd, bndind, bndptr, k);
+      else if (ed[k] > 0 && bndptr[k] == -1)  
+        BNDInsert(nbnd, bndind, bndptr, k);
+    }
+
+    ASSERTP(ComputeCut(graph, where) == mincut, ("%d != %d\n", ComputeCut(graph, where), mincut));
+
+  }
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("\tMincut: %6d, NBND: %6d, NPwgts: ", mincut, nbnd);
+    for (l=0; l<ncon; l++)
+      printf("(%.3f, %.3f) ", npwgts[l], npwgts[ncon+l]);
+    printf(", LB: %.3f\n", ComputeLoadImbalance(ncon, 2, npwgts, tpwgts));
+  }
+
+  graph->mincut = mincut;
+  graph->nbnd = nbnd;
+
+  for (i=0; i<ncon; i++) {
+    PQueueFree(ctrl, &parts[i][0]);
+    PQueueFree(ctrl, &parts[i][1]);
+  }
+
+  ASSERT(ComputeCut(graph, where) == graph->mincut);
+  ASSERT(CheckBnd(graph));
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function selects the partition number and the queue from which
+* we will move vertices out
+**************************************************************************/ 
+int SelectQueueOneWay2(int ncon, float *pto, PQueueType queues[MAXNCON][2], float *ubvec)
+{
+  int i, cnum=-1, imax, maxgain;
+  float max=0.0;
+  float twgt[MAXNCON];
+
+  for (i=0; i<ncon; i++) {
+    if (max < pto[i]) {
+      imax = i;
+      max = pto[i];
+    }
+  }
+  for (i=0; i<ncon; i++) 
+    twgt[i] = (max/(ubvec[imax]*ubvec[i]))/pto[i];
+  twgt[imax] = 0.0;
+
+  max = 0.0;
+  for (i=0; i<ncon; i++) {
+    if (max < twgt[i] && (PQueueGetSize(&queues[i][0]) > 0 || PQueueGetSize(&queues[i][1]) > 0)) {
+      max = twgt[i];
+      cnum = i;
+    }
+  }
+  if (max > 1)
+    return cnum;
+
+  /* optimize of cut */
+  maxgain = -10000000;
+  for (i=0; i<ncon; i++) {
+    if (PQueueGetSize(&queues[i][0]) > 0 && PQueueGetKey(&queues[i][0]) > maxgain) {
+      maxgain = PQueueGetKey(&queues[i][0]);
+      cnum = i;
+    }
+  }
+
+  return cnum;
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkmetis.c	(revision 9501)
@@ -0,0 +1,123 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mkmetis.c
+ *
+ * This file contains the top level routines for the multilevel k-way partitioning
+ * algorithm KMETIS.
+ *
+ * Started 7/28/97
+ * George
+ *
+ * $Id: mkmetis.c,v 1.2 1998/11/27 18:25:09 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* This function is the entry point for KWMETIS
+**************************************************************************/
+void METIS_mCPartGraphKway(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, 
+                          idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, 
+                          int *nparts, float *rubvec, int *options, int *edgecut, 
+                          idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  SetUpGraph(&graph, OP_KMETIS, *nvtxs, *ncon, xadj, adjncy, vwgt, adjwgt, *wgtflag);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType  = McKMETIS_CTYPE;
+    ctrl.IType  = McKMETIS_ITYPE;
+    ctrl.RType  = McKMETIS_RTYPE;
+    ctrl.dbglvl = McKMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType  = options[OPTION_CTYPE];
+    ctrl.IType  = options[OPTION_ITYPE];
+    ctrl.RType  = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_KMETIS;
+  ctrl.CoarsenTo = amax((*nvtxs)/(20*ilog2(*nparts)), 30*(*nparts));
+
+  ctrl.nmaxvwgt = 1.5/(1.0*ctrl.CoarsenTo);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *edgecut = MCMlevelKWayPartitioning(&ctrl, &graph, *nparts, part, rubvec);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (*numflag == 1)
+    Change2FNumbering(*nvtxs, xadj, adjncy, part);
+}
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+int MCMlevelKWayPartitioning(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *part, 
+      float *rubvec)
+{
+  int i, j, nvtxs;
+  GraphType *cgraph;
+  int options[10], edgecut;
+
+  cgraph = MCCoarsen2Way(ctrl, graph);
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->InitPartTmr));
+  MocAllocateKWayPartitionMemory(ctrl, cgraph, nparts);
+
+  options[0] = 1; 
+  options[OPTION_CTYPE] = MATCH_SBHEM_INFNORM;
+  options[OPTION_ITYPE] = IPART_RANDOM;
+  options[OPTION_RTYPE] = RTYPE_FM;
+  options[OPTION_DBGLVL] = 0;
+
+  /* Determine what you will use as the initial partitioner, based on tolerances */
+  for (i=0; i<graph->ncon; i++) {
+    if (rubvec[i] > 1.2)
+      break;
+  }
+  if (i == graph->ncon)
+    METIS_mCPartGraphRecursiveInternal(&cgraph->nvtxs, &cgraph->ncon, 
+          cgraph->xadj, cgraph->adjncy, cgraph->nvwgt, cgraph->adjwgt, &nparts, 
+          options, &edgecut, cgraph->where);
+  else
+    METIS_mCHPartGraphRecursiveInternal(&cgraph->nvtxs, &cgraph->ncon, 
+          cgraph->xadj, cgraph->adjncy, cgraph->nvwgt, cgraph->adjwgt, &nparts, 
+          rubvec, options, &edgecut, cgraph->where);
+
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->InitPartTmr));
+  IFSET(ctrl->dbglvl, DBG_IPART, printf("Initial %d-way partitioning cut: %d\n", nparts, edgecut));
+
+  IFSET(ctrl->dbglvl, DBG_KWAYPINFO, ComputePartitionInfo(cgraph, nparts, cgraph->where));
+
+  MocRefineKWayHorizontal(ctrl, graph, cgraph, nparts, rubvec);
+
+  idxcopy(graph->nvtxs, graph->where, part);
+
+  GKfree(&graph->nvwgt, &graph->npwgts, &graph->gdata, &graph->rdata, LTERM);
+
+  return graph->mincut;
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkwayfmh.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkwayfmh.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkwayfmh.c	(revision 9501)
@@ -0,0 +1,677 @@
+/*
+ * mkwayfmh.c
+ *
+ * This file contains code that implements the multilevel k-way refinement
+ *
+ * Started 7/28/97
+ * George
+ *
+ * $Id: mkwayfmh.c,v 1.1 1998/11/27 17:59:24 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void MCRandom_KWayEdgeRefineHorizontal(CtrlType *ctrl, GraphType *graph, int nparts, 
+       float *orgubvec, int npasses)
+{
+  int i, ii, iii, j, jj, k, l, pass, nvtxs, ncon, nmoves, nbnd, myndegrees, same; 
+  int from, me, to, oldcut, gain;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *perm, *bndptr, *bndind;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+  float *npwgts, *nvwgt, *minwgt, *maxwgt, maxlb, minlb, ubvec[MAXNCON], tvec[MAXNCON];
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  where = graph->where;
+  npwgts = graph->npwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  fwspacemalloc(ctrl, nparts*ncon);
+  maxwgt = fwspacemalloc(ctrl, nparts*ncon);
+
+  /* See if the orgubvec consists of identical constraints */
+  maxlb = minlb = orgubvec[0];
+  for (i=1; i<ncon; i++) {
+    minlb = (orgubvec[i] < minlb ? orgubvec[i] : minlb);
+    maxlb = (orgubvec[i] > maxlb ? orgubvec[i] : maxlb);
+  }
+  same = (fabs(maxlb-minlb) < .01 ? 1 : 0);
+
+
+  /* Let's not get very optimistic. Let Balancing do the work */
+  ComputeHKWayLoadImbalance(ncon, nparts, npwgts, ubvec);
+  for (i=0; i<ncon; i++)
+    ubvec[i] = amax(ubvec[i], orgubvec[i]);
+
+  if (!same) {
+    for (i=0; i<nparts; i++) {
+      for (j=0; j<ncon; j++) {
+        maxwgt[i*ncon+j] = ubvec[j]/nparts;
+        minwgt[i*ncon+j] = 1.0/(ubvec[j]*nparts);
+      }
+    }
+  }
+  else {
+    maxlb = ubvec[0];
+    for (i=1; i<ncon; i++) 
+      maxlb = (ubvec[i] > maxlb ? ubvec[i] : maxlb);
+
+    for (i=0; i<nparts; i++) {
+      for (j=0; j<ncon; j++) {
+        maxwgt[i*ncon+j] = maxlb/nparts;
+        minwgt[i*ncon+j] = 1.0/(maxlb*nparts);
+      }
+    }
+  }
+
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("Partitions: [%5.4f %5.4f], Nv-Nb[%6d %6d]. Cut: %6d, LB: ",
+            npwgts[samin(ncon*nparts, npwgts)], npwgts[samax(ncon*nparts, npwgts)], 
+            graph->nvtxs, graph->nbnd, graph->mincut);
+    ComputeHKWayLoadImbalance(ncon, nparts, npwgts, tvec);
+    for (i=0; i<ncon; i++)
+      printf("%.3f ", tvec[i]);
+    printf("\n");
+  }
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    oldcut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (nmoves=iii=0; iii<graph->nbnd; iii++) {
+      ii = perm[iii];
+      if (ii >= nbnd)
+        continue;
+      i = bndind[ii];
+
+      myrinfo = graph->rinfo+i;
+
+      if (myrinfo->ed >= myrinfo->id) { /* Total ED is too high */
+        from = where[i];
+        nvwgt = graph->nvwgt+i*ncon;
+
+        if (myrinfo->id > 0 && AreAllHVwgtsBelow(ncon, 1.0, npwgts+from*ncon, -1.0, nvwgt, minwgt+from*ncon)) 
+          continue;   /* This cannot be moved! */
+
+        myedegrees = myrinfo->edegrees;
+        myndegrees = myrinfo->ndegrees;
+
+        for (k=0; k<myndegrees; k++) {
+          to = myedegrees[k].pid;
+          gain = myedegrees[k].ed - myrinfo->id; 
+          if (gain >= 0 && 
+              (AreAllHVwgtsBelow(ncon, 1.0, npwgts+to*ncon, 1.0, nvwgt, maxwgt+to*ncon) ||
+               IsHBalanceBetterFT(ncon, nparts, npwgts+from*ncon, npwgts+to*ncon, nvwgt, ubvec)))
+            break;
+        }
+        if (k == myndegrees)
+          continue;  /* break out if you did not find a candidate */
+
+        for (j=k+1; j<myndegrees; j++) {
+          to = myedegrees[j].pid;
+          if ((myedegrees[j].ed > myedegrees[k].ed &&
+               (AreAllHVwgtsBelow(ncon, 1.0, npwgts+to*ncon, 1.0, nvwgt, maxwgt+to*ncon) || 
+               IsHBalanceBetterFT(ncon, nparts, npwgts+from*ncon, npwgts+to*ncon, nvwgt, ubvec))) ||
+              (myedegrees[j].ed == myedegrees[k].ed && 
+               IsHBalanceBetterTT(ncon, nparts, npwgts+myedegrees[k].pid*ncon, npwgts+to*ncon, nvwgt, ubvec)))
+            k = j;
+        }
+
+        to = myedegrees[k].pid;
+
+        if (myedegrees[k].ed-myrinfo->id == 0 
+            && !IsHBalanceBetterFT(ncon, nparts, npwgts+from*ncon, npwgts+to*ncon, nvwgt, ubvec)
+            && AreAllHVwgtsBelow(ncon, 1.0, npwgts+from*ncon, 0.0, npwgts+from*ncon, maxwgt+from*ncon)) 
+          continue;
+
+        /*=====================================================================
+        * If we got here, we can now move the vertex from 'from' to 'to' 
+        *======================================================================*/
+        graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+        IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d to %3d. Gain: %4d. Cut: %6d\n", i, to, myedegrees[k].ed-myrinfo->id, graph->mincut));
+
+        /* Update where, weight, and ID/ED information of the vertex you moved */
+        saxpy(ncon, 1.0, nvwgt, 1, npwgts+to*ncon, 1);
+        saxpy(ncon, -1.0, nvwgt, 1, npwgts+from*ncon, 1);
+        where[i] = to;
+        myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+        SWAP(myrinfo->id, myedegrees[k].ed, j);
+        if (myedegrees[k].ed == 0) 
+          myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+        else
+          myedegrees[k].pid = from;
+
+        if (myrinfo->ed-myrinfo->id < 0)
+          BNDDelete(nbnd, bndind, bndptr, i);
+
+        /* Update the degrees of adjacent vertices */
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          ii = adjncy[j];
+          me = where[ii];
+
+          myrinfo = graph->rinfo+ii;
+          if (myrinfo->edegrees == NULL) {
+            myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+            ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+          }
+          myedegrees = myrinfo->edegrees;
+
+          ASSERT(CheckRInfo(myrinfo));
+
+          if (me == from) {
+            INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+            if (myrinfo->ed-myrinfo->id >= 0 && bndptr[ii] == -1)
+              BNDInsert(nbnd, bndind, bndptr, ii);
+          }
+          else if (me == to) {
+            INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+            if (myrinfo->ed-myrinfo->id < 0 && bndptr[ii] != -1)
+              BNDDelete(nbnd, bndind, bndptr, ii);
+          }
+
+          /* Remove contribution from the .ed of 'from' */
+          if (me != from) {
+            for (k=0; k<myrinfo->ndegrees; k++) {
+              if (myedegrees[k].pid == from) {
+                if (myedegrees[k].ed == adjwgt[j])
+                  myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+                else
+                  myedegrees[k].ed -= adjwgt[j];
+                break;
+              }
+            }
+          }
+
+          /* Add contribution to the .ed of 'to' */
+          if (me != to) {
+            for (k=0; k<myrinfo->ndegrees; k++) {
+              if (myedegrees[k].pid == to) {
+                myedegrees[k].ed += adjwgt[j];
+                break;
+              }
+            }
+            if (k == myrinfo->ndegrees) {
+              myedegrees[myrinfo->ndegrees].pid = to;
+              myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+            }
+          }
+
+          ASSERT(myrinfo->ndegrees <= xadj[ii+1]-xadj[ii]);
+          ASSERT(CheckRInfo(myrinfo));
+
+        }
+        nmoves++;
+      }
+    }
+
+    graph->nbnd = nbnd;
+
+    if (ctrl->dbglvl&DBG_REFINE) {
+      printf("\t [%5.4f %5.4f], Nb: %6d, Nmoves: %5d, Cut: %6d, LB: ",
+              npwgts[samin(ncon*nparts, npwgts)], npwgts[samax(ncon*nparts, npwgts)], 
+              nbnd, nmoves, graph->mincut);
+      ComputeHKWayLoadImbalance(ncon, nparts, npwgts, tvec);
+      for (i=0; i<ncon; i++)
+        printf("%.3f ", tvec[i]);
+      printf("\n");
+    }
+
+    if (graph->mincut == oldcut)
+      break;
+  }
+
+  fwspacefree(ctrl, ncon*nparts);
+  fwspacefree(ctrl, ncon*nparts);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void MCGreedy_KWayEdgeBalanceHorizontal(CtrlType *ctrl, GraphType *graph, int nparts, 
+       float *ubvec, int npasses)
+{
+  int i, ii, iii, j, jj, k, l, pass, nvtxs, ncon, nbnd, myndegrees, oldgain, gain, nmoves; 
+  int from, me, to, oldcut;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *perm, *bndptr, *bndind, *moved;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+  PQueueType queue;
+  float *npwgts, *nvwgt, *minwgt, *maxwgt, tvec[MAXNCON];
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+
+  where = graph->where;
+  npwgts = graph->npwgts;
+  
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  fwspacemalloc(ctrl, ncon*nparts);
+  maxwgt = fwspacemalloc(ctrl, ncon*nparts);
+
+  for (i=0; i<nparts; i++) {
+    for (j=0; j<ncon; j++) {
+      maxwgt[i*ncon+j] = ubvec[j]/nparts;
+      minwgt[i*ncon+j] = 1.0/(ubvec[j]*nparts);
+    }
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  moved = idxwspacemalloc(ctrl, nvtxs);
+
+  PQueueInit(ctrl, &queue, nvtxs, graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)]);
+
+  if (ctrl->dbglvl&DBG_REFINE) {
+    printf("Partitions: [%5.4f %5.4f], Nv-Nb[%6d %6d]. Cut: %6d, LB: ",
+            npwgts[samin(ncon*nparts, npwgts)], npwgts[samax(ncon*nparts, npwgts)], 
+            graph->nvtxs, graph->nbnd, graph->mincut);
+    ComputeHKWayLoadImbalance(ncon, nparts, npwgts, tvec);
+    for (i=0; i<ncon; i++)
+      printf("%.3f ", tvec[i]);
+    printf("[B]\n");
+  }
+
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    /* Check to see if things are out of balance, given the tolerance */
+    if (MocIsHBalanced(ncon, nparts, npwgts, ubvec))
+      break;
+
+    PQueueReset(&queue);
+    idxset(nvtxs, -1, moved);
+
+    oldcut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      PQueueInsert(&queue, i, graph->rinfo[i].ed - graph->rinfo[i].id);
+      moved[i] = 2;
+    }
+
+    nmoves = 0;
+    for (;;) {
+      if ((i = PQueueGetMax(&queue)) == -1) 
+        break;
+      moved[i] = 1;
+
+      myrinfo = graph->rinfo+i;
+      from = where[i];
+      nvwgt = graph->nvwgt+i*ncon;
+
+      if (AreAllHVwgtsBelow(ncon, 1.0, npwgts+from*ncon, -1.0, nvwgt, minwgt+from*ncon))
+        continue;   /* This cannot be moved! */
+
+      myedegrees = myrinfo->edegrees;
+      myndegrees = myrinfo->ndegrees;
+
+      for (k=0; k<myndegrees; k++) {
+        to = myedegrees[k].pid;
+        if (IsHBalanceBetterFT(ncon, nparts, npwgts+from*ncon, npwgts+to*ncon, nvwgt, ubvec))
+          break;
+      }
+      if (k == myndegrees) 
+        continue;  /* break out if you did not find a candidate */
+
+      for (j=k+1; j<myndegrees; j++) {
+        to = myedegrees[j].pid;
+        if (IsHBalanceBetterTT(ncon, nparts, npwgts+myedegrees[k].pid*ncon, npwgts+to*ncon, nvwgt, ubvec)) 
+          k = j;
+      }
+
+      to = myedegrees[k].pid;
+
+      j = 0;
+      if (!AreAllHVwgtsBelow(ncon, 1.0, npwgts+from*ncon, 0.0, nvwgt, maxwgt+from*ncon))
+        j++;
+      if (myedegrees[k].ed-myrinfo->id >= 0)
+        j++;
+      if (!AreAllHVwgtsAbove(ncon, 1.0, npwgts+to*ncon, 0.0, nvwgt, minwgt+to*ncon) &&
+          AreAllHVwgtsBelow(ncon, 1.0, npwgts+to*ncon, 1.0, nvwgt, maxwgt+to*ncon))
+        j++;
+      if (j == 0)
+        continue;
+
+/* DELETE
+      if (myedegrees[k].ed-myrinfo->id < 0 && 
+          AreAllHVwgtsBelow(ncon, 1.0, npwgts+from*ncon, 0.0, nvwgt, maxwgt+from*ncon) &&
+          AreAllHVwgtsAbove(ncon, 1.0, npwgts+to*ncon, 0.0, nvwgt, minwgt+to*ncon) &&
+          AreAllHVwgtsBelow(ncon, 1.0, npwgts+to*ncon, 1.0, nvwgt, maxwgt+to*ncon))
+        continue;
+*/
+      /*=====================================================================
+      * If we got here, we can now move the vertex from 'from' to 'to' 
+      *======================================================================*/
+      graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d to %3d. Gain: %4d. Cut: %6d\n", i, to, myedegrees[k].ed-myrinfo->id, graph->mincut));
+
+      /* Update where, weight, and ID/ED information of the vertex you moved */
+      saxpy(ncon, 1.0, nvwgt, 1, npwgts+to*ncon, 1);
+      saxpy(ncon, -1.0, nvwgt, 1, npwgts+from*ncon, 1);
+      where[i] = to;
+      myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+      SWAP(myrinfo->id, myedegrees[k].ed, j);
+      if (myedegrees[k].ed == 0) 
+        myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+      else
+        myedegrees[k].pid = from;
+
+      if (myrinfo->ed == 0)
+        BNDDelete(nbnd, bndind, bndptr, i);
+
+      /* Update the degrees of adjacent vertices */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        ii = adjncy[j];
+        me = where[ii];
+
+        myrinfo = graph->rinfo+ii;
+        if (myrinfo->edegrees == NULL) {
+          myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+          ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+        }
+        myedegrees = myrinfo->edegrees;
+
+        ASSERT(CheckRInfo(myrinfo));
+
+        oldgain = (myrinfo->ed-myrinfo->id);
+
+        if (me == from) {
+          INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+          if (myrinfo->ed > 0 && bndptr[ii] == -1)
+            BNDInsert(nbnd, bndind, bndptr, ii);
+        }
+        else if (me == to) {
+          INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+          if (myrinfo->ed == 0 && bndptr[ii] != -1)
+            BNDDelete(nbnd, bndind, bndptr, ii);
+        }
+
+        /* Remove contribution from the .ed of 'from' */
+        if (me != from) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == from) {
+              if (myedegrees[k].ed == adjwgt[j])
+                myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+              else
+                myedegrees[k].ed -= adjwgt[j];
+              break;
+            }
+          }
+        }
+
+        /* Add contribution to the .ed of 'to' */
+        if (me != to) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == to) {
+              myedegrees[k].ed += adjwgt[j];
+              break;
+            }
+          }
+          if (k == myrinfo->ndegrees) {
+            myedegrees[myrinfo->ndegrees].pid = to;
+            myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+          }
+        }
+
+
+        /* Update the queue */
+        if (me == to || me == from) { 
+          gain = myrinfo->ed-myrinfo->id;
+          if (moved[ii] == 2) {
+            if (myrinfo->ed > 0)
+              PQueueUpdate(&queue, ii, oldgain, gain);
+            else {
+              PQueueDelete(&queue, ii, oldgain);
+              moved[ii] = -1;
+            }
+          }
+          else if (moved[ii] == -1 && myrinfo->ed > 0) {
+            PQueueInsert(&queue, ii, gain);
+            moved[ii] = 2;
+          }
+        } 
+
+        ASSERT(myrinfo->ndegrees <= xadj[ii+1]-xadj[ii]);
+        ASSERT(CheckRInfo(myrinfo));
+      }
+      nmoves++;
+    }
+
+    graph->nbnd = nbnd;
+
+    if (ctrl->dbglvl&DBG_REFINE) {
+      printf("\t [%5.4f %5.4f], Nb: %6d, Nmoves: %5d, Cut: %6d, LB: ",
+              npwgts[samin(ncon*nparts, npwgts)], npwgts[samax(ncon*nparts, npwgts)], 
+              nbnd, nmoves, graph->mincut);
+      ComputeHKWayLoadImbalance(ncon, nparts, npwgts, tvec);
+      for (i=0; i<ncon; i++)
+        printf("%.3f ", tvec[i]);
+      printf("\n");
+    }
+
+    if (nmoves == 0)
+      break;
+  }
+
+  PQueueFree(ctrl, &queue);
+
+  fwspacefree(ctrl, ncon*nparts);
+  fwspacefree(ctrl, ncon*nparts);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
+
+
+
+
+/*************************************************************************
+* This function checks if the vertex weights of two vertices are below 
+* a given set of values
+**************************************************************************/
+int AreAllHVwgtsBelow(int ncon, float alpha, float *vwgt1, float beta, float *vwgt2, float *limit)
+{
+  int i;
+
+  for (i=0; i<ncon; i++)
+    if (alpha*vwgt1[i] + beta*vwgt2[i] > limit[i])
+      return 0;
+
+  return 1;
+}
+
+
+
+/*************************************************************************
+* This function checks if the vertex weights of two vertices are above 
+* a given set of values
+**************************************************************************/
+int AreAllHVwgtsAbove(int ncon, float alpha, float *vwgt1, float beta, float *vwgt2, float *limit)
+{
+  int i;
+
+  for (i=0; i<ncon; i++)
+    if (alpha*vwgt1[i] + beta*vwgt2[i] < limit[i])
+      return 0;
+
+  return 1;
+}
+
+
+/*************************************************************************
+* This function computes the load imbalance over all the constrains
+* For now assume that we just want balanced partitionings
+**************************************************************************/ 
+void ComputeHKWayLoadImbalance(int ncon, int nparts, float *npwgts, float *lbvec)
+{
+  int i, j;
+  float max;
+
+  for (i=0; i<ncon; i++) {
+    max = 0.0;
+    for (j=0; j<nparts; j++) {
+      if (npwgts[j*ncon+i] > max)
+        max = npwgts[j*ncon+i];
+    }
+
+    lbvec[i] = max*nparts;
+  }
+}
+
+
+/*************************************************************************
+* This function determines if a partitioning is horizontally balanced
+**************************************************************************/
+int MocIsHBalanced(int ncon, int nparts, float *npwgts, float *ubvec)
+{
+  int i, j;
+  float max;
+
+  for (i=0; i<ncon; i++) {
+    max = 0.0;
+    for (j=0; j<nparts; j++) {
+      if (npwgts[j*ncon+i] > max)
+        max = npwgts[j*ncon+i];
+    }
+
+    if (ubvec[i] < max*nparts)
+      return 0;
+  }
+
+  return 1;
+}
+
+
+
+
+
+/*************************************************************************
+* This function checks if the pairwise balance of the between the two 
+* partitions will improve by moving the vertex v from pfrom to pto,
+* subject to the target partition weights of tfrom, and tto respectively
+**************************************************************************/
+int IsHBalanceBetterFT(int ncon, int nparts, float *pfrom, float *pto, float *vwgt, float *ubvec)
+{
+  int i, j, k;
+  float blb1=0.0, alb1=0.0, sblb=0.0, salb=0.0;
+  float blb2=0.0, alb2=0.0;
+  float temp;
+
+  for (i=0; i<ncon; i++) {
+    temp = amax(pfrom[i], pto[i])*nparts/ubvec[i];
+    if (blb1 < temp) {
+      blb2 = blb1;
+      blb1 = temp;
+    }
+    else if (blb2 < temp)
+      blb2 = temp;
+    sblb += temp;
+
+    temp = amax(pfrom[i]-vwgt[i], pto[i]+vwgt[i])*nparts/ubvec[i];
+    if (alb1 < temp) {
+      alb2 = alb1;
+      alb1 = temp;
+    }
+    else if (alb2 < temp)
+      alb2 = temp;
+    salb += temp;
+  }
+
+  if (alb1 < blb1)
+    return 1;
+  if (blb1 < alb1)
+    return 0;
+  if (alb2 < blb2)
+    return 1;
+  if (blb2 < alb2)
+    return 0;
+  
+  return salb < sblb;
+
+}
+
+
+
+
+/*************************************************************************
+* This function checks if it will be better to move a vertex to pt2 than
+* to pt1 subject to their target weights of tt1 and tt2, respectively
+* This routine takes into account the weight of the vertex in question
+**************************************************************************/
+int IsHBalanceBetterTT(int ncon, int nparts, float *pt1, float *pt2, float *vwgt, float *ubvec)
+{
+  int i;
+  float m11=0.0, m12=0.0, m21=0.0, m22=0.0, sm1=0.0, sm2=0.0, temp;
+
+  for (i=0; i<ncon; i++) {
+    temp = (pt1[i]+vwgt[i])*nparts/ubvec[i];
+    if (m11 < temp) {
+      m12 = m11;
+      m11 = temp;
+    }
+    else if (m12 < temp)
+      m12 = temp;
+    sm1 += temp;
+
+    temp = (pt2[i]+vwgt[i])*nparts/ubvec[i];
+    if (m21 < temp) {
+      m22 = m21;
+      m21 = temp;
+    }
+    else if (m22 < temp)
+      m22 = temp;
+    sm2 += temp;
+  }
+
+  if (m21 < m11)
+    return 1;
+  if (m21 > m11)
+    return 0;
+  if (m22 < m12)
+    return 1;
+  if (m22 > m12)
+    return 0;
+
+  return sm2 < sm1;  
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkwayrefine.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkwayrefine.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mkwayrefine.c	(revision 9501)
@@ -0,0 +1,297 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mkwayrefine.c
+ *
+ * This file contains the driving routines for multilevel k-way refinement
+ *
+ * Started 7/28/97
+ * George
+ *
+ * $Id: mkwayrefine.c,v 1.2 1998/11/27 18:16:19 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of refinement
+**************************************************************************/
+void MocRefineKWayHorizontal(CtrlType *ctrl, GraphType *orggraph, GraphType *graph, int nparts, 
+       float *ubvec)
+{
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->UncoarsenTmr));
+
+  /* Compute the parameters of the coarsest graph */
+  MocComputeKWayPartitionParams(ctrl, graph, nparts);
+
+  for (;;) {
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->RefTmr));
+
+    if (!MocIsHBalanced(graph->ncon, nparts, graph->npwgts, ubvec)) {
+      MocComputeKWayBalanceBoundary(ctrl, graph, nparts);
+      MCGreedy_KWayEdgeBalanceHorizontal(ctrl, graph, nparts, ubvec, 4); 
+      ComputeKWayBoundary(ctrl, graph, nparts);
+    }
+
+    MCRandom_KWayEdgeRefineHorizontal(ctrl, graph, nparts, ubvec, 10); 
+
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->RefTmr));
+
+    if (graph == orggraph)
+      break;
+
+    graph = graph->finer;
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ProjectTmr));
+    MocProjectKWayPartition(ctrl, graph, nparts);
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ProjectTmr));
+  }
+
+  if (!MocIsHBalanced(graph->ncon, nparts, graph->npwgts, ubvec)) {
+    MocComputeKWayBalanceBoundary(ctrl, graph, nparts);
+    MCGreedy_KWayEdgeBalanceHorizontal(ctrl, graph, nparts, ubvec, 4); 
+    ComputeKWayBoundary(ctrl, graph, nparts);
+    MCRandom_KWayEdgeRefineHorizontal(ctrl, graph, nparts, ubvec, 10); 
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->UncoarsenTmr));
+}
+
+
+
+
+/*************************************************************************
+* This function allocates memory for k-way edge refinement
+**************************************************************************/
+void MocAllocateKWayPartitionMemory(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int nvtxs, ncon, pad64;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+
+  pad64 = (3*nvtxs)%2;
+
+  graph->rdata = idxmalloc(3*nvtxs+(sizeof(RInfoType)/sizeof(idxtype))*nvtxs+pad64, "AllocateKWayPartitionMemory: rdata");
+  graph->where          = graph->rdata;
+  graph->bndptr         = graph->rdata + nvtxs;
+  graph->bndind         = graph->rdata + 2*nvtxs;
+  graph->rinfo          = (RInfoType *)(graph->rdata + 3*nvtxs + pad64);
+
+  graph->npwgts         = fmalloc(ncon*nparts, "MocAllocateKWayPartitionMemory: npwgts");
+}
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void MocComputeKWayPartitionParams(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, j, k, l, nvtxs, ncon, nbnd, mincut, me, other;
+  idxtype *xadj, *adjncy, *adjwgt, *where, *bndind, *bndptr;
+  RInfoType *rinfo, *myrinfo;
+  EDegreeType *myedegrees;
+  float *nvwgt, *npwgts;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  npwgts = sset(ncon*nparts, 0.0, graph->npwgts);
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+  rinfo = graph->rinfo;
+
+
+  /*------------------------------------------------------------
+  / Compute now the id/ed degrees
+  /------------------------------------------------------------*/
+  ctrl->wspace.cdegree = 0;
+  nbnd = mincut = 0;
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+    saxpy(ncon, 1.0, nvwgt+i*ncon, 1, npwgts+me*ncon, 1);
+
+    myrinfo = rinfo+i;
+    myrinfo->id = myrinfo->ed = myrinfo->ndegrees = 0;
+    myrinfo->edegrees = NULL;
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (me != where[adjncy[j]])
+        myrinfo->ed += adjwgt[j];
+    }
+    myrinfo->id = graph->adjwgtsum[i] - myrinfo->ed;
+
+    if (myrinfo->ed > 0) 
+      mincut += myrinfo->ed;
+
+    if (myrinfo->ed-myrinfo->id >= 0)
+      BNDInsert(nbnd, bndind, bndptr, i);
+
+    /* Time to compute the particular external degrees */
+    if (myrinfo->ed > 0) { 
+      myedegrees = myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += xadj[i+1]-xadj[i];
+
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        other = where[adjncy[j]];
+        if (me != other) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == other) {
+              myedegrees[k].ed += adjwgt[j];
+              break;
+            }
+          }
+          if (k == myrinfo->ndegrees) {
+            myedegrees[myrinfo->ndegrees].pid = other;
+            myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+          }
+        }
+      }
+
+      ASSERT(myrinfo->ndegrees <= xadj[i+1]-xadj[i]);
+    }
+  }
+
+  graph->mincut = mincut/2;
+  graph->nbnd = nbnd;
+
+}
+
+
+
+/*************************************************************************
+* This function projects a partition, and at the same time computes the
+* parameters for refinement.
+**************************************************************************/
+void MocProjectKWayPartition(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, j, k, nvtxs, nbnd, me, other, istart, iend, ndegrees;
+  idxtype *xadj, *adjncy, *adjwgt, *adjwgtsum;
+  idxtype *cmap, *where, *bndptr, *bndind;
+  idxtype *cwhere;
+  GraphType *cgraph;
+  RInfoType *crinfo, *rinfo, *myrinfo;
+  EDegreeType *myedegrees;
+  idxtype *htable;
+
+  cgraph = graph->coarser;
+  cwhere = cgraph->where;
+  crinfo = cgraph->rinfo;
+
+  nvtxs = graph->nvtxs;
+  cmap = graph->cmap;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+
+  MocAllocateKWayPartitionMemory(ctrl, graph, nparts);
+  where = graph->where;
+  rinfo = graph->rinfo;
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+
+  /* Go through and project partition and compute id/ed for the nodes */
+  for (i=0; i<nvtxs; i++) {
+    k = cmap[i];
+    where[i] = cwhere[k];
+    cmap[i] = crinfo[k].ed;  /* For optimization */
+  }
+
+  htable = idxset(nparts, -1, idxwspacemalloc(ctrl, nparts));
+
+  ctrl->wspace.cdegree = 0;
+  for (nbnd=0, i=0; i<nvtxs; i++) {
+    me = where[i];
+
+    myrinfo = rinfo+i;
+    myrinfo->id = myrinfo->ed = myrinfo->ndegrees = 0;
+    myrinfo->edegrees = NULL;
+
+    myrinfo->id = adjwgtsum[i];
+
+    if (cmap[i] > 0) { /* If it is an interface node. Note cmap[i] = crinfo[cmap[i]].ed */
+      istart = xadj[i];
+      iend = xadj[i+1];
+
+      myedegrees = myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += iend-istart;
+
+      ndegrees = 0;
+      for (j=istart; j<iend; j++) {
+        other = where[adjncy[j]];
+        if (me != other) {
+          myrinfo->ed += adjwgt[j];
+          if ((k = htable[other]) == -1) {
+            htable[other] = ndegrees;
+            myedegrees[ndegrees].pid = other;
+            myedegrees[ndegrees++].ed = adjwgt[j];
+          }
+          else {
+            myedegrees[k].ed += adjwgt[j];
+          }
+        }
+      }
+      myrinfo->id -= myrinfo->ed;
+
+      /* Remove space for edegrees if it was interior */
+      if (myrinfo->ed == 0) { 
+        myrinfo->edegrees = NULL;
+        ctrl->wspace.cdegree -= iend-istart;
+      }
+      else {
+        if (myrinfo->ed-myrinfo->id >= 0) 
+          BNDInsert(nbnd, bndind, bndptr, i); 
+
+        myrinfo->ndegrees = ndegrees;
+
+        for (j=0; j<ndegrees; j++)
+          htable[myedegrees[j].pid] = -1;
+      }
+    }
+  }
+
+  scopy(graph->ncon*nparts, cgraph->npwgts, graph->npwgts);
+  graph->mincut = cgraph->mincut;
+  graph->nbnd = nbnd;
+
+  FreeGraph(graph->coarser);
+  graph->coarser = NULL;
+
+  idxwspacefree(ctrl, nparts);
+
+  ASSERT(CheckBnd2(graph));
+
+}
+
+
+
+/*************************************************************************
+* This function computes the boundary definition for balancing
+**************************************************************************/
+void MocComputeKWayBalanceBoundary(CtrlType *ctrl, GraphType *graph, int nparts)
+{
+  int i, nvtxs, nbnd;
+  idxtype *bndind, *bndptr;
+
+  nvtxs = graph->nvtxs;
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+
+
+  /* Compute the new boundary */
+  nbnd = 0;
+  for (i=0; i<nvtxs; i++) {
+    if (graph->rinfo[i].ed > 0) 
+      BNDInsert(nbnd, bndind, bndptr, i);
+  }
+
+  graph->nbnd = nbnd;
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mmatch.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mmatch.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mmatch.c	(revision 9501)
@@ -0,0 +1,506 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mmatch.c
+ *
+ * This file contains the code that computes matchings and creates the next
+ * level coarse graph.
+ *
+ * Started 7/23/97
+ * George
+ *
+ * $Id: mmatch.c,v 1.3 1998/11/30 14:50:44 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void MCMatch_RM(CtrlType *ctrl, GraphType *graph)
+{
+  int i, ii, j, k, nvtxs, ncon, cnvtxs, maxidx;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *match, *cmap, *perm;
+  float *nvwgt;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  RandomPermute(nvtxs, perm, 1);
+
+  cnvtxs = 0;
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+
+      /* Find a random matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        k = adjncy[j];
+        if (match[k] == UNMATCHED && AreAllVwgtsBelowFast(ncon, nvwgt+i*ncon, nvwgt+k*ncon, ctrl->nmaxvwgt)) {
+          maxidx = k;
+          break;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  CreateCoarseGraph(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void MCMatch_HEM(CtrlType *ctrl, GraphType *graph)
+{
+  int i, ii, j, k, l, nvtxs, cnvtxs, ncon, maxidx, maxwgt;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *match, *cmap, *perm;
+  float *nvwgt;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  RandomPermute(nvtxs, perm, 1);
+
+  cnvtxs = 0;
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+      maxwgt = 0;
+
+      /* Find a heavy-edge matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        k = adjncy[j];
+        if (match[k] == UNMATCHED && maxwgt <= adjwgt[j] &&
+               AreAllVwgtsBelowFast(ncon, nvwgt+i*ncon, nvwgt+k*ncon, ctrl->nmaxvwgt)) {
+          maxwgt = adjwgt[j];
+          maxidx = adjncy[j];
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  CreateCoarseGraph(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void MCMatch_SHEM(CtrlType *ctrl, GraphType *graph)
+{
+  int i, ii, j, k, nvtxs, cnvtxs, ncon, maxidx, maxwgt, avgdegree;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *match, *cmap, *degrees, *perm, *tperm;
+  float *nvwgt;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  tperm = idxwspacemalloc(ctrl, nvtxs);
+  degrees = idxwspacemalloc(ctrl, nvtxs);
+
+  RandomPermute(nvtxs, tperm, 1);
+  avgdegree = 0.7*(xadj[nvtxs]/nvtxs);
+  for (i=0; i<nvtxs; i++) 
+    degrees[i] = (xadj[i+1]-xadj[i] > avgdegree ? avgdegree : xadj[i+1]-xadj[i]);
+  BucketSortKeysInc(nvtxs, avgdegree, degrees, tperm, perm);
+
+  cnvtxs = 0;
+
+  /* Take care any islands. Islands are matched with non-islands due to coarsening */
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      if (xadj[i] < xadj[i+1])
+        break;
+
+      maxidx = i;
+      for (j=nvtxs-1; j>ii; j--) {
+        k = perm[j];
+        if (match[k] == UNMATCHED && xadj[k] < xadj[k+1]) {
+          maxidx = k;
+          break;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  /* Continue with normal matching */
+  for (; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+      maxwgt = 0;
+
+      /* Find a heavy-edge matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        k = adjncy[j];
+        if (match[k] == UNMATCHED && maxwgt <= adjwgt[j] &&
+               AreAllVwgtsBelowFast(ncon, nvwgt+i*ncon, nvwgt+k*ncon, ctrl->nmaxvwgt)) {
+          maxwgt = adjwgt[j];
+          maxidx = adjncy[j];
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  idxwspacefree(ctrl, nvtxs);  /* degrees */
+  idxwspacefree(ctrl, nvtxs);  /* tperm */
+
+  CreateCoarseGraph(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void MCMatch_SHEBM(CtrlType *ctrl, GraphType *graph, int norm)
+{
+  int i, ii, j, k, nvtxs, cnvtxs, ncon, maxidx, maxwgt, avgdegree;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *match, *cmap, *degrees, *perm, *tperm;
+  float *nvwgt;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  tperm = idxwspacemalloc(ctrl, nvtxs);
+  degrees = idxwspacemalloc(ctrl, nvtxs);
+
+  RandomPermute(nvtxs, tperm, 1);
+  avgdegree = 0.7*(xadj[nvtxs]/nvtxs);
+  for (i=0; i<nvtxs; i++) 
+    degrees[i] = (xadj[i+1]-xadj[i] > avgdegree ? avgdegree : xadj[i+1]-xadj[i]);
+  BucketSortKeysInc(nvtxs, avgdegree, degrees, tperm, perm);
+
+  cnvtxs = 0;
+
+  /* Take care any islands. Islands are matched with non-islands due to coarsening */
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      if (xadj[i] < xadj[i+1])
+        break;
+
+      maxidx = i;
+      for (j=nvtxs-1; j>ii; j--) {
+        k = perm[j];
+        if (match[k] == UNMATCHED && xadj[k] < xadj[k+1]) {
+          maxidx = k;
+          break;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  /* Continue with normal matching */
+  for (; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+      maxwgt = -1;
+
+      /* Find a heavy-edge matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        k = adjncy[j];
+
+        if (match[k] == UNMATCHED && 
+            AreAllVwgtsBelowFast(ncon, nvwgt+i*ncon, nvwgt+k*ncon, ctrl->nmaxvwgt) &&
+            (maxwgt < adjwgt[j] || 
+              (maxwgt == adjwgt[j] && 
+               BetterVBalance(ncon, norm, nvwgt+i*ncon, nvwgt+maxidx*ncon, nvwgt+k*ncon) >= 0
+              )
+            )
+           ) {
+          maxwgt = adjwgt[j];
+          maxidx = k;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  idxwspacefree(ctrl, nvtxs);  /* degrees */
+  idxwspacefree(ctrl, nvtxs);  /* tperm */
+
+  CreateCoarseGraph(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function finds a matching using the HEM heuristic
+**************************************************************************/
+void MCMatch_SBHEM(CtrlType *ctrl, GraphType *graph, int norm)
+{
+  int i, ii, j, k, nvtxs, cnvtxs, ncon, maxidx, maxwgt, avgdegree;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *match, *cmap, *degrees, *perm, *tperm;
+  float *nvwgt, vbal;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->MatchTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  cmap = graph->cmap;
+  match = idxset(nvtxs, UNMATCHED, idxwspacemalloc(ctrl, nvtxs));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  tperm = idxwspacemalloc(ctrl, nvtxs);
+  degrees = idxwspacemalloc(ctrl, nvtxs);
+
+  RandomPermute(nvtxs, tperm, 1);
+  avgdegree = 0.7*(xadj[nvtxs]/nvtxs);
+  for (i=0; i<nvtxs; i++) 
+    degrees[i] = (xadj[i+1]-xadj[i] > avgdegree ? avgdegree : xadj[i+1]-xadj[i]);
+  BucketSortKeysInc(nvtxs, avgdegree, degrees, tperm, perm);
+
+  cnvtxs = 0;
+
+  /* Take care any islands. Islands are matched with non-islands due to coarsening */
+  for (ii=0; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      if (xadj[i] < xadj[i+1])
+        break;
+
+      maxidx = i;
+      for (j=nvtxs-1; j>ii; j--) {
+        k = perm[j];
+        if (match[k] == UNMATCHED && xadj[k] < xadj[k+1]) {
+          maxidx = k;
+          break;
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  /* Continue with normal matching */
+  for (; ii<nvtxs; ii++) {
+    i = perm[ii];
+
+    if (match[i] == UNMATCHED) {  /* Unmatched */
+      maxidx = i;
+      maxwgt = -1;
+      vbal = 0.0;
+
+      /* Find a heavy-edge matching, subject to maxvwgt constraints */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        k = adjncy[j];
+        if (match[k] == UNMATCHED && AreAllVwgtsBelowFast(ncon, nvwgt+i*ncon, nvwgt+k*ncon, ctrl->nmaxvwgt)) {
+          if (maxidx != i)
+            vbal = BetterVBalance(ncon, norm, nvwgt+i*ncon, nvwgt+maxidx*ncon, nvwgt+k*ncon);
+
+          if (vbal > 0 || (vbal > -.01 && maxwgt < adjwgt[j])) {
+            maxwgt = adjwgt[j];
+            maxidx = k;
+          }
+        }
+      }
+
+      cmap[i] = cmap[maxidx] = cnvtxs++;
+      match[i] = maxidx;
+      match[maxidx] = i;
+    }
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->MatchTmr));
+
+  idxwspacefree(ctrl, nvtxs);  /* degrees */
+  idxwspacefree(ctrl, nvtxs);  /* tperm */
+
+  CreateCoarseGraph(ctrl, graph, cnvtxs, match, perm);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+
+
+/*************************************************************************
+* This function checks if v+u2 provides a better balance in the weight 
+* vector that v+u1
+**************************************************************************/
+float BetterVBalance(int ncon, int norm, float *vwgt, float *u1wgt, float *u2wgt)
+{
+  int i;
+  float sum1, sum2, max1, max2, min1, min2, diff1, diff2;
+
+  if (norm == -1) {
+    max1 = min1 = vwgt[0]+u1wgt[0];
+    max2 = min2 = vwgt[0]+u2wgt[0];
+    sum1 = vwgt[0]+u1wgt[0];
+    sum2 = vwgt[0]+u2wgt[0];
+
+    for (i=1; i<ncon; i++) {
+      if (max1 < vwgt[i]+u1wgt[i])
+        max1 = vwgt[i]+u1wgt[i];
+      if (min1 > vwgt[i]+u1wgt[i])
+        min1 = vwgt[i]+u1wgt[i];
+
+      if (max2 < vwgt[i]+u2wgt[i])
+        max2 = vwgt[i]+u2wgt[i];
+      if (min2 > vwgt[i]+u2wgt[i])
+        min2 = vwgt[i]+u2wgt[i];
+
+      sum1 += vwgt[i]+u1wgt[i];
+      sum2 += vwgt[i]+u2wgt[i];
+    }
+
+    if (sum1 == 0.0)
+      return 1;
+    else if (sum2 == 0.0)
+      return -1;
+    else
+      return ((max1-min1)/sum1) - ((max2-min2)/sum2);
+  }
+  else if (norm == 1) {
+    sum1 = sum2 = 0.0;
+    for (i=0; i<ncon; i++) {
+      sum1 += vwgt[i]+u1wgt[i];
+      sum2 += vwgt[i]+u2wgt[i];
+    }
+    sum1 = sum1/(1.0*ncon);
+    sum2 = sum2/(1.0*ncon);
+
+    diff1 = diff2 = 0.0;
+    for (i=0; i<ncon; i++) {
+      diff1 += fabs(sum1 - (vwgt[i]+u1wgt[i]));
+      diff2 += fabs(sum2 - (vwgt[i]+u2wgt[i]));
+    }
+
+    return diff1 - diff2;
+  }
+  else {
+    errexit("Unknown norm: %d\n", norm);
+  }
+  return 0.0;
+}
+
+
+/*************************************************************************
+* This function checks if the vertex weights of two vertices are below 
+* a given set of values
+**************************************************************************/
+int AreAllVwgtsBelowFast(int ncon, float *vwgt1, float *vwgt2, float limit)
+{
+  int i;
+
+  for (i=0; i<ncon; i++)
+    if (vwgt1[i] + vwgt2[i] > limit)
+      return 0;
+
+  return 1;
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mmd.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mmd.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mmd.c	(revision 9501)
@@ -0,0 +1,593 @@
+/*
+ * mmd.c
+ *
+ * **************************************************************
+ * The following C function was developed from a FORTRAN subroutine
+ * in SPARSPAK written by Eleanor Chu, Alan George, Joseph Liu
+ * and Esmond Ng.
+ * 
+ * The FORTRAN-to-C transformation and modifications such as dynamic
+ * memory allocation and deallocation were performed by Chunguang
+ * Sun.
+ * ************************************************************** 
+ *
+ * Taken from SMMS, George 12/13/94
+ *
+ * The meaning of invperm, and perm vectors is different from that
+ * in genqmd_ of SparsPak
+ *
+ * $Id: mmd.c,v 1.1 1998/11/27 17:59:25 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+*  genmmd  -- multiple minimum external degree
+*  purpose -- this routine implements the minimum degree
+*     algorithm. it makes use of the implicit representation
+*     of elimination graphs by quotient graphs, and the notion
+*     of indistinguishable nodes. It also implements the modifications
+*     by multiple elimination and minimum external degree.
+*     Caution -- the adjacency vector adjncy will be destroyed.
+*  Input parameters --
+*     neqns -- number of equations.
+*     (xadj, adjncy) -- the adjacency structure.
+*     delta  -- tolerance value for multiple elimination.
+*     maxint -- maximum machine representable (short) integer
+*               (any smaller estimate will do) for marking nodes.
+*  Output parameters --
+*     perm -- the minimum degree ordering.
+*     invp -- the inverse of perm.
+*     *ncsub -- an upper bound on the number of nonzero subscripts
+*               for the compressed storage scheme.
+*  Working parameters --
+*     head -- vector for head of degree lists.
+*     invp  -- used temporarily for degree forward link.
+*     perm  -- used temporarily for degree backward link.
+*     qsize -- vector for size of supernodes.
+*     list -- vector for temporary linked lists.
+*     marker -- a temporary marker vector.
+*  Subroutines used -- mmdelm, mmdint, mmdnum, mmdupd.
+**************************************************************************/
+void genmmd(int neqns, idxtype *xadj, idxtype *adjncy, idxtype *invp, idxtype *perm,
+     int delta, idxtype *head, idxtype *qsize, idxtype *list, idxtype *marker,
+     int maxint, int *ncsub)
+{
+    int  ehead, i, mdeg, mdlmt, mdeg_node, nextmd, num, tag;
+
+    if (neqns <= 0)  
+      return;
+
+    /* Adjust from C to Fortran */
+    xadj--; adjncy--; invp--; perm--; head--; qsize--; list--; marker--;
+
+    /* initialization for the minimum degree algorithm. */
+    *ncsub = 0;
+    mmdint(neqns, xadj, adjncy, head, invp, perm, qsize, list, marker);
+
+    /*  'num' counts the number of ordered nodes plus 1. */
+    num = 1;
+
+    /* eliminate all isolated nodes. */
+    nextmd = head[1];
+    while (nextmd > 0) {
+      mdeg_node = nextmd;
+      nextmd = invp[mdeg_node];
+      marker[mdeg_node] = maxint;
+      invp[mdeg_node] = -num;
+      num = num + 1;
+    }
+
+    /* search for node of the minimum degree. 'mdeg' is the current */
+    /* minimum degree; 'tag' is used to facilitate marking nodes.   */
+    if (num > neqns) 
+      goto n1000;
+    tag = 1;
+    head[1] = 0;
+    mdeg = 2;
+
+    /* infinite loop here ! */
+    while (1) {
+      while (head[mdeg] <= 0) 
+        mdeg++;
+
+      /* use value of 'delta' to set up 'mdlmt', which governs */
+      /* when a degree update is to be performed.              */
+      mdlmt = mdeg + delta;
+      ehead = 0;
+
+n500:
+      mdeg_node = head[mdeg];
+      while (mdeg_node <= 0) {
+        mdeg++;
+
+        if (mdeg > mdlmt) 
+          goto n900;
+        mdeg_node = head[mdeg];
+      };
+
+      /*  remove 'mdeg_node' from the degree structure. */
+      nextmd = invp[mdeg_node];
+      head[mdeg] = nextmd;
+      if (nextmd > 0)  
+        perm[nextmd] = -mdeg;
+      invp[mdeg_node] = -num;
+      *ncsub += mdeg + qsize[mdeg_node] - 2;
+      if ((num+qsize[mdeg_node]) > neqns)  
+        goto n1000;
+
+      /*  eliminate 'mdeg_node' and perform quotient graph */
+      /*  transformation. reset 'tag' value if necessary.    */
+      tag++;
+      if (tag >= maxint) {
+        tag = 1;
+        for (i = 1; i <= neqns; i++)
+          if (marker[i] < maxint)  
+            marker[i] = 0;
+      };
+
+      mmdelm(mdeg_node, xadj, adjncy, head, invp, perm, qsize, list, marker, maxint, tag);
+
+      num += qsize[mdeg_node];
+      list[mdeg_node] = ehead;
+      ehead = mdeg_node;
+      if (delta >= 0) 
+        goto n500;
+
+ n900:
+      /* update degrees of the nodes involved in the  */
+      /* minimum degree nodes elimination.            */
+      if (num > neqns)  
+        goto n1000;
+      mmdupd( ehead, neqns, xadj, adjncy, delta, &mdeg, head, invp, perm, qsize, list, marker, maxint, &tag);
+    }; /* end of -- while ( 1 ) -- */
+
+n1000:
+    mmdnum( neqns, perm, invp, qsize );
+
+    /* Adjust from Fortran back to C*/
+    xadj++; adjncy++; invp++; perm++; head++; qsize++; list++; marker++;
+}
+
+
+/**************************************************************************
+*           mmdelm ...... multiple minimum degree elimination
+* Purpose -- This routine eliminates the node mdeg_node of minimum degree
+*     from the adjacency structure, which is stored in the quotient
+*     graph format. It also transforms the quotient graph representation
+*     of the elimination graph.
+* Input parameters --
+*     mdeg_node -- node of minimum degree.
+*     maxint -- estimate of maximum representable (short) integer.
+*     tag    -- tag value.
+* Updated parameters --
+*     (xadj, adjncy) -- updated adjacency structure.
+*     (head, forward, backward) -- degree doubly linked structure.
+*     qsize -- size of supernode.
+*     marker -- marker vector.
+*     list -- temporary linked list of eliminated nabors.
+***************************************************************************/
+void mmdelm(int mdeg_node, idxtype *xadj, idxtype *adjncy, idxtype *head, idxtype *forward,
+     idxtype *backward, idxtype *qsize, idxtype *list, idxtype *marker, int maxint,int tag)
+{
+    int   element, i,   istop, istart, j,
+          jstop, jstart, link,
+          nabor, node, npv, nqnbrs, nxnode,
+          pvnode, rlmt, rloc, rnode, xqnbr;
+
+    /* find the reachable set of 'mdeg_node' and */
+    /* place it in the data structure.           */
+    marker[mdeg_node] = tag;
+    istart = xadj[mdeg_node];
+    istop = xadj[mdeg_node+1] - 1;
+
+    /* 'element' points to the beginning of the list of  */
+    /* eliminated nabors of 'mdeg_node', and 'rloc' gives the */
+    /* storage location for the next reachable node.   */
+    element = 0;
+    rloc = istart;
+    rlmt = istop;
+    for ( i = istart; i <= istop; i++ ) {
+        nabor = adjncy[i];
+        if ( nabor == 0 ) break;
+        if ( marker[nabor] < tag ) {
+           marker[nabor] = tag;
+           if ( forward[nabor] < 0 )  {
+              list[nabor] = element;
+              element = nabor;
+           } else {
+              adjncy[rloc] = nabor;
+              rloc++;
+           };
+        }; /* end of -- if -- */
+    }; /* end of -- for -- */
+
+  /* merge with reachable nodes from generalized elements. */
+  while ( element > 0 ) {
+      adjncy[rlmt] = -element;
+      link = element;
+
+n400:
+      jstart = xadj[link];
+      jstop = xadj[link+1] - 1;
+      for ( j = jstart; j <= jstop; j++ ) {
+          node = adjncy[j];
+          link = -node;
+          if ( node < 0 )  goto n400;
+          if ( node == 0 ) break;
+          if ((marker[node]<tag)&&(forward[node]>=0)) {
+             marker[node] = tag;
+             /*use storage from eliminated nodes if necessary.*/
+             while ( rloc >= rlmt ) {
+                   link = -adjncy[rlmt];
+                   rloc = xadj[link];
+                   rlmt = xadj[link+1] - 1;
+             };
+             adjncy[rloc] = node;
+             rloc++;
+          };
+      }; /* end of -- for ( j = jstart; -- */
+      element = list[element];
+    };  /* end of -- while ( element > 0 ) -- */
+    if ( rloc <= rlmt ) adjncy[rloc] = 0;
+    /* for each node in the reachable set, do the following. */
+    link = mdeg_node;
+
+n1100:
+    istart = xadj[link];
+    istop = xadj[link+1] - 1;
+    for ( i = istart; i <= istop; i++ ) {
+        rnode = adjncy[i];
+        link = -rnode;
+        if ( rnode < 0 ) goto n1100;
+        if ( rnode == 0 ) return;
+
+        /* 'rnode' is in the degree list structure. */
+        pvnode = backward[rnode];
+        if (( pvnode != 0 ) && ( pvnode != (-maxint) )) {
+           /* then remove 'rnode' from the structure. */
+           nxnode = forward[rnode];
+           if ( nxnode > 0 ) backward[nxnode] = pvnode;
+           if ( pvnode > 0 ) forward[pvnode] = nxnode;
+           npv = -pvnode;
+           if ( pvnode < 0 ) head[npv] = nxnode;
+        };
+
+        /* purge inactive quotient nabors of 'rnode'. */
+        jstart = xadj[rnode];
+        jstop = xadj[rnode+1] - 1;
+        xqnbr = jstart;
+        for ( j = jstart; j <= jstop; j++ ) {
+            nabor = adjncy[j];
+            if ( nabor == 0 ) break;
+            if ( marker[nabor] < tag ) {
+                adjncy[xqnbr] = nabor;
+                xqnbr++;
+            };
+        };
+
+        /* no active nabor after the purging. */
+        nqnbrs = xqnbr - jstart;
+        if ( nqnbrs <= 0 ) {
+           /* merge 'rnode' with 'mdeg_node'. */
+           qsize[mdeg_node] += qsize[rnode];
+           qsize[rnode] = 0;
+           marker[rnode] = maxint;
+           forward[rnode] = -mdeg_node;
+           backward[rnode] = -maxint;
+        } else {
+           /* flag 'rnode' for degree update, and  */
+           /* add 'mdeg_node' as a nabor of 'rnode'.      */
+           forward[rnode] = nqnbrs + 1;
+           backward[rnode] = 0;
+           adjncy[xqnbr] = mdeg_node;
+           xqnbr++;
+           if ( xqnbr <= jstop )  adjncy[xqnbr] = 0;
+        };
+      }; /* end of -- for ( i = istart; -- */
+      return;
+ }
+
+/***************************************************************************
+*    mmdint ---- mult minimum degree initialization
+*    purpose -- this routine performs initialization for the
+*       multiple elimination version of the minimum degree algorithm.
+*    input parameters --
+*       neqns  -- number of equations.
+*       (xadj, adjncy) -- adjacency structure.
+*    output parameters --
+*       (head, dfrow, backward) -- degree doubly linked structure.
+*       qsize -- size of supernode ( initialized to one).
+*       list -- linked list.
+*       marker -- marker vector.
+****************************************************************************/
+int  mmdint(int neqns, idxtype *xadj, idxtype *adjncy, idxtype *head, idxtype *forward,
+     idxtype *backward, idxtype *qsize, idxtype *list, idxtype *marker)
+{
+    int  fnode, ndeg, node;
+
+    for ( node = 1; node <= neqns; node++ ) {
+        head[node] = 0;
+        qsize[node] = 1;
+        marker[node] = 0;
+        list[node] = 0;
+    };
+
+    /* initialize the degree doubly linked lists. */
+    for ( node = 1; node <= neqns; node++ ) {
+        ndeg = xadj[node+1] - xadj[node]/* + 1*/;   /* george */
+        if (ndeg == 0)
+          ndeg = 1;
+        fnode = head[ndeg];
+        forward[node] = fnode;
+        head[ndeg] = node;
+        if ( fnode > 0 ) backward[fnode] = node;
+        backward[node] = -ndeg;
+    };
+    return 0;
+}
+
+/****************************************************************************
+* mmdnum --- multi minimum degree numbering
+* purpose -- this routine performs the final step in producing
+*    the permutation and inverse permutation vectors in the
+*    multiple elimination version of the minimum degree
+*    ordering algorithm.
+* input parameters --
+*     neqns -- number of equations.
+*     qsize -- size of supernodes at elimination.
+* updated parameters --
+*     invp -- inverse permutation vector. on input,
+*             if qsize[node] = 0, then node has been merged
+*             into the node -invp[node]; otherwise,
+*            -invp[node] is its inverse labelling.
+* output parameters --
+*     perm -- the permutation vector.
+****************************************************************************/
+void mmdnum(int neqns, idxtype *perm, idxtype *invp, idxtype *qsize)
+{
+  int father, nextf, node, nqsize, num, root;
+
+  for ( node = 1; node <= neqns; node++ ) {
+      nqsize = qsize[node];
+      if ( nqsize <= 0 ) perm[node] = invp[node];
+      if ( nqsize > 0 )  perm[node] = -invp[node];
+  };
+
+  /* for each node which has been merged, do the following. */
+  for ( node = 1; node <= neqns; node++ ) {
+      if ( perm[node] <= 0 )  {
+
+	 /* trace the merged tree until one which has not */
+         /* been merged, call it root.                    */
+         father = node;
+         while ( perm[father] <= 0 )
+            father = - perm[father];
+
+         /* number node after root. */
+         root = father;
+         num = perm[root] + 1;
+         invp[node] = -num;
+         perm[root] = num;
+
+         /* shorten the merged tree. */
+         father = node;
+         nextf = - perm[father];
+         while ( nextf > 0 ) {
+            perm[father] = -root;
+            father = nextf;
+            nextf = -perm[father];
+         };
+      };  /* end of -- if ( perm[node] <= 0 ) -- */
+  }; /* end of -- for ( node = 1; -- */
+
+  /* ready to compute perm. */
+  for ( node = 1; node <= neqns; node++ ) {
+        num = -invp[node];
+        invp[node] = num;
+        perm[num] = node;
+  };
+  return;
+}
+
+/****************************************************************************
+* mmdupd ---- multiple minimum degree update
+* purpose -- this routine updates the degrees of nodes after a
+*            multiple elimination step.
+* input parameters --
+*    ehead -- the beginning of the list of eliminated nodes
+*             (i.e., newly formed elements).
+*    neqns -- number of equations.
+*    (xadj, adjncy) -- adjacency structure.
+*    delta -- tolerance value for multiple elimination.
+*    maxint -- maximum machine representable (short) integer.
+* updated parameters --
+*    mdeg -- new minimum degree after degree update.
+*    (head, forward, backward) -- degree doubly linked structure.
+*    qsize -- size of supernode.
+*    list -- marker vector for degree update.
+*    *tag   -- tag value.
+****************************************************************************/
+void mmdupd(int ehead, int neqns, idxtype *xadj, idxtype *adjncy, int delta, int *mdeg,
+     idxtype *head, idxtype *forward, idxtype *backward, idxtype *qsize, idxtype *list,
+     idxtype *marker, int maxint,int *tag)
+{
+ int  deg, deg0, element, enode, fnode, i, iq2, istop,
+      istart, j, jstop, jstart, link, mdeg0, mtag, nabor,
+      node, q2head, qxhead;
+
+      mdeg0 = *mdeg + delta;
+      element = ehead;
+
+n100:
+      if ( element <= 0 ) return;
+
+      /* for each of the newly formed element, do the following. */
+      /* reset tag value if necessary.                           */
+      mtag = *tag + mdeg0;
+      if ( mtag >= maxint ) {
+         *tag = 1;
+         for ( i = 1; i <= neqns; i++ )
+             if ( marker[i] < maxint ) marker[i] = 0;
+         mtag = *tag + mdeg0;
+      };
+
+      /* create two linked lists from nodes associated with 'element': */
+      /* one with two nabors (q2head) in the adjacency structure, and the*/
+      /* other with more than two nabors (qxhead). also compute 'deg0',*/
+      /* number of nodes in this element.                              */
+      q2head = 0;
+      qxhead = 0;
+      deg0 = 0;
+      link =element;
+
+n400:
+      istart = xadj[link];
+      istop = xadj[link+1] - 1;
+      for ( i = istart; i <= istop; i++ ) {
+          enode = adjncy[i];
+          link = -enode;
+          if ( enode < 0 )  goto n400;
+          if ( enode == 0 ) break;
+          if ( qsize[enode] != 0 ) {
+             deg0 += qsize[enode];
+             marker[enode] = mtag;
+
+             /*'enode' requires a degree update*/
+             if ( backward[enode] == 0 ) {
+                /* place either in qxhead or q2head list. */
+                if ( forward[enode] != 2 ) {
+                     list[enode] = qxhead;
+                     qxhead = enode;
+                } else {
+                     list[enode] = q2head;
+                     q2head = enode;
+                };
+             };
+          }; /* enf of -- if ( qsize[enode] != 0 ) -- */
+      }; /* end of -- for ( i = istart; -- */
+
+      /* for each node in q2 list, do the following. */
+      enode = q2head;
+      iq2 = 1;
+
+n900:
+      if ( enode <= 0 ) goto n1500;
+      if ( backward[enode] != 0 ) goto n2200;
+      (*tag)++;
+      deg = deg0;
+
+      /* identify the other adjacent element nabor. */
+      istart = xadj[enode];
+      nabor = adjncy[istart];
+      if ( nabor == element ) nabor = adjncy[istart+1];
+      link = nabor;
+      if ( forward[nabor] >= 0 ) {
+           /* nabor is uneliminated, increase degree count. */
+           deg += qsize[nabor];
+           goto n2100;
+      };
+
+       /* the nabor is eliminated. for each node in the 2nd element */
+       /* do the following.                                         */
+n1000:
+       istart = xadj[link];
+       istop = xadj[link+1] - 1;
+       for ( i = istart; i <= istop; i++ ) {
+           node = adjncy[i];
+           link = -node;
+           if ( node != enode ) {
+                if ( node < 0 ) goto n1000;
+                if ( node == 0 )  goto n2100;
+                if ( qsize[node] != 0 ) {
+                     if ( marker[node] < *tag ) {
+                        /* 'node' is not yet considered. */
+                        marker[node] = *tag;
+                        deg += qsize[node];
+                     } else {
+                        if ( backward[node] == 0 ) {
+                             if ( forward[node] == 2 ) {
+                                /* 'node' is indistinguishable from 'enode'.*/
+                                /* merge them into a new supernode.         */
+                                qsize[enode] += qsize[node];
+                                qsize[node] = 0;
+                                marker[node] = maxint;
+                                forward[node] = -enode;
+                                backward[node] = -maxint;
+                             } else {
+                                /* 'node' is outmacthed by 'enode' */
+				if (backward[node]==0) backward[node] = -maxint;
+                             };
+                        }; /* end of -- if ( backward[node] == 0 ) -- */
+                    }; /* end of -- if ( marker[node] < *tag ) -- */
+                }; /* end of -- if ( qsize[node] != 0 ) -- */
+              }; /* end of -- if ( node != enode ) -- */
+          }; /* end of -- for ( i = istart; -- */
+          goto n2100;
+
+n1500:
+          /* for each 'enode' in the 'qx' list, do the following. */
+          enode = qxhead;
+          iq2 = 0;
+
+n1600:    if ( enode <= 0 )  goto n2300;
+          if ( backward[enode] != 0 )  goto n2200;
+          (*tag)++;
+          deg = deg0;
+
+          /*for each unmarked nabor of 'enode', do the following.*/
+          istart = xadj[enode];
+          istop = xadj[enode+1] - 1;
+          for ( i = istart; i <= istop; i++ ) {
+                nabor = adjncy[i];
+                if ( nabor == 0 ) break;
+                if ( marker[nabor] < *tag ) {
+                     marker[nabor] = *tag;
+                     link = nabor;
+                     if ( forward[nabor] >= 0 ) 
+                          /*if uneliminated, include it in deg count.*/
+                          deg += qsize[nabor];
+                     else {
+n1700:
+                          /* if eliminated, include unmarked nodes in this*/
+                          /* element into the degree count.             */
+                          jstart = xadj[link];
+                          jstop = xadj[link+1] - 1;
+                          for ( j = jstart; j <= jstop; j++ ) {
+                                node = adjncy[j];
+                                link = -node;
+                                if ( node < 0 ) goto n1700;
+                                if ( node == 0 ) break;
+                                if ( marker[node] < *tag ) {
+                                    marker[node] = *tag;
+                                    deg += qsize[node];
+                                };
+                          }; /* end of -- for ( j = jstart; -- */
+                     }; /* end of -- if ( forward[nabor] >= 0 ) -- */
+                  }; /* end of -- if ( marker[nabor] < *tag ) -- */
+          }; /* end of -- for ( i = istart; -- */
+
+n2100:
+          /* update external degree of 'enode' in degree structure, */
+          /* and '*mdeg' if necessary.                     */
+          deg = deg - qsize[enode] + 1;
+          fnode = head[deg];
+          forward[enode] = fnode;
+          backward[enode] = -deg;
+          if ( fnode > 0 ) backward[fnode] = enode;
+          head[deg] = enode;
+          if ( deg < *mdeg ) *mdeg = deg;
+
+n2200:
+          /* get next enode in current element. */
+          enode = list[enode];
+          if ( iq2 == 1 ) goto n900;
+          goto n1600;
+
+n2300:
+          /* get next element in the list. */
+          *tag = mtag;
+          element = list[element];
+          goto n100;
+    }
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mpmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mpmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mpmetis.c	(revision 9501)
@@ -0,0 +1,402 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mpmetis.c
+ *
+ * This file contains the top level routines for the multilevel recursive
+ * bisection algorithm PMETIS.
+ *
+ * Started 7/24/97
+ * George
+ *
+ * $Id: mpmetis.c,v 1.4 1998/11/30 14:50:44 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* This function is the entry point for PWMETIS that accepts exact weights
+* for the target partitions
+**************************************************************************/
+void METIS_mCPartGraphRecursive(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, 
+       idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, 
+       int *options, int *edgecut, idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  SetUpGraph(&graph, OP_PMETIS, *nvtxs, *ncon, xadj, adjncy, vwgt, adjwgt, *wgtflag);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType  = McPMETIS_CTYPE;
+    ctrl.IType  = McPMETIS_ITYPE;
+    ctrl.RType  = McPMETIS_RTYPE;
+    ctrl.dbglvl = McPMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType  = options[OPTION_CTYPE];
+    ctrl.IType  = options[OPTION_ITYPE];
+    ctrl.RType  = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_PMETIS;
+  ctrl.CoarsenTo = 100;
+
+  ctrl.nmaxvwgt = 1.5/(1.0*ctrl.CoarsenTo);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *edgecut = MCMlevelRecursiveBisection(&ctrl, &graph, *nparts, part, 1.000, 0);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (*numflag == 1)
+    Change2FNumbering(*nvtxs, xadj, adjncy, part);
+}
+
+
+
+/*************************************************************************
+* This function is the entry point for PWMETIS that accepts exact weights
+* for the target partitions
+**************************************************************************/
+void METIS_mCHPartGraphRecursive(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, 
+       idxtype *vwgt, idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, 
+       float *ubvec, int *options, int *edgecut, idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+  float *myubvec;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  SetUpGraph(&graph, OP_PMETIS, *nvtxs, *ncon, xadj, adjncy, vwgt, adjwgt, *wgtflag);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = PMETIS_CTYPE;
+    ctrl.IType = PMETIS_ITYPE;
+    ctrl.RType = PMETIS_RTYPE;
+    ctrl.dbglvl = PMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_PMETIS;
+  ctrl.CoarsenTo = 100;
+
+  ctrl.nmaxvwgt = 1.5/(1.0*ctrl.CoarsenTo);
+
+  myubvec = fmalloc(*ncon, "PWMETIS: mytpwgts");
+  scopy(*ncon, ubvec, myubvec);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *edgecut = MCHMlevelRecursiveBisection(&ctrl, &graph, *nparts, part, myubvec, 0);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+  GKfree(&myubvec, LTERM);
+
+  if (*numflag == 1)
+    Change2FNumbering(*nvtxs, xadj, adjncy, part);
+}
+
+
+
+/*************************************************************************
+* This function is the entry point for PWMETIS that accepts exact weights
+* for the target partitions
+**************************************************************************/
+void METIS_mCPartGraphRecursiveInternal(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, 
+       float *nvwgt, idxtype *adjwgt, int *nparts, int *options, int *edgecut, idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+
+  SetUpGraph2(&graph, *nvtxs, *ncon, xadj, adjncy, nvwgt, adjwgt);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = PMETIS_CTYPE;
+    ctrl.IType = PMETIS_ITYPE;
+    ctrl.RType = PMETIS_RTYPE;
+    ctrl.dbglvl = PMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_PMETIS;
+  ctrl.CoarsenTo = 100;
+
+  ctrl.nmaxvwgt = 1.5/(1.0*ctrl.CoarsenTo);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *edgecut = MCMlevelRecursiveBisection(&ctrl, &graph, *nparts, part, 1.000, 0);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+
+}
+
+
+/*************************************************************************
+* This function is the entry point for PWMETIS that accepts exact weights
+* for the target partitions
+**************************************************************************/
+void METIS_mCHPartGraphRecursiveInternal(int *nvtxs, int *ncon, idxtype *xadj, idxtype *adjncy, 
+       float *nvwgt, idxtype *adjwgt, int *nparts, float *ubvec, int *options, int *edgecut, 
+       idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+  float *myubvec;
+
+  SetUpGraph2(&graph, *nvtxs, *ncon, xadj, adjncy, nvwgt, adjwgt);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = PMETIS_CTYPE;
+    ctrl.IType = PMETIS_ITYPE;
+    ctrl.RType = PMETIS_RTYPE;
+    ctrl.dbglvl = PMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_PMETIS;
+  ctrl.CoarsenTo = 100;
+
+  ctrl.nmaxvwgt = 1.5/(1.0*ctrl.CoarsenTo);
+
+  myubvec = fmalloc(*ncon, "PWMETIS: mytpwgts");
+  scopy(*ncon, ubvec, myubvec);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *edgecut = MCHMlevelRecursiveBisection(&ctrl, &graph, *nparts, part, myubvec, 0);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+  GKfree(&myubvec, LTERM);
+
+}
+
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+int MCMlevelRecursiveBisection(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *part, 
+       float ubfactor, int fpart)
+{
+  int i, j, nvtxs, ncon, cut;
+  idxtype *label, *where;
+  GraphType lgraph, rgraph;
+  float tpwgts[2];
+
+  nvtxs = graph->nvtxs;
+  if (nvtxs == 0) {
+    printf("\t***Cannot bisect a graph with 0 vertices!\n\t***You are trying to partition a graph into too many parts!\n");
+    return 0;
+  }
+
+  /* Determine the weights of the partitions */
+  tpwgts[0] = 1.0*(nparts>>1)/(1.0*nparts);
+  tpwgts[1] = 1.0 - tpwgts[0];
+
+  MCMlevelEdgeBisection(ctrl, graph, tpwgts, ubfactor);
+  cut = graph->mincut;
+
+  label = graph->label;
+  where = graph->where;
+  for (i=0; i<nvtxs; i++)
+    part[label[i]] = where[i] + fpart;
+
+  if (nparts > 2) 
+    SplitGraphPart(ctrl, graph, &lgraph, &rgraph);
+
+  /* Free the memory of the top level graph */
+  GKfree(&graph->gdata, &graph->nvwgt, &graph->rdata, &graph->npwgts, &graph->label, LTERM);
+
+
+  /* Do the recursive call */
+  if (nparts > 3) {
+    cut += MCMlevelRecursiveBisection(ctrl, &lgraph, nparts/2, part, ubfactor, fpart);
+    cut += MCMlevelRecursiveBisection(ctrl, &rgraph, nparts-nparts/2, part, ubfactor, fpart+nparts/2);
+  }
+  else if (nparts == 3) {
+    cut += MCMlevelRecursiveBisection(ctrl, &rgraph, nparts-nparts/2, part, ubfactor, fpart+nparts/2);
+    GKfree(&lgraph.gdata, &lgraph.nvwgt, &lgraph.label, LTERM);
+  }
+
+  return cut;
+
+}
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+int MCHMlevelRecursiveBisection(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *part, 
+      float *ubvec, int fpart)
+{
+  int i, j, nvtxs, ncon, cut;
+  idxtype *label, *where;
+  GraphType lgraph, rgraph;
+  float tpwgts[2], *npwgts, *lubvec, *rubvec;
+
+  lubvec = rubvec = NULL;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  if (nvtxs == 0) {
+    printf("\t***Cannot bisect a graph with 0 vertices!\n\t***You are trying to partition a graph into too many parts!\n");
+    return 0;
+  }
+
+  /* Determine the weights of the partitions */
+  tpwgts[0] = 1.0*(nparts>>1)/(1.0*nparts);
+  tpwgts[1] = 1.0 - tpwgts[0];
+
+  /* For now, relax at the coarsest level only */
+  if (nparts == 2)
+    MCHMlevelEdgeBisection(ctrl, graph, tpwgts, ubvec);
+  else
+    MCMlevelEdgeBisection(ctrl, graph, tpwgts, 1.000);
+  cut = graph->mincut;
+
+  label = graph->label;
+  where = graph->where;
+  for (i=0; i<nvtxs; i++)
+    part[label[i]] = where[i] + fpart;
+
+  if (nparts > 2) {
+    /* Adjust the ubvecs before the split */
+    npwgts = graph->npwgts;
+    lubvec = fmalloc(ncon, "MCHMlevelRecursiveBisection");
+    rubvec = fmalloc(ncon, "MCHMlevelRecursiveBisection");
+
+    for (i=0; i<ncon; i++) {
+      lubvec[i] = ubvec[i]*tpwgts[0]/npwgts[i];
+      lubvec[i] = amax(lubvec[i], 1.01);
+
+      rubvec[i] = ubvec[i]*tpwgts[1]/npwgts[ncon+i];
+      rubvec[i] = amax(rubvec[i], 1.01);
+    }
+
+    SplitGraphPart(ctrl, graph, &lgraph, &rgraph);
+  }
+
+  /* Free the memory of the top level graph */
+  GKfree(&graph->gdata, &graph->nvwgt, &graph->rdata, &graph->npwgts, &graph->label, LTERM);
+
+
+  /* Do the recursive call */
+  if (nparts > 3) {
+    cut += MCHMlevelRecursiveBisection(ctrl, &lgraph, nparts/2, part, lubvec, fpart);
+    cut += MCHMlevelRecursiveBisection(ctrl, &rgraph, nparts-nparts/2, part, rubvec, fpart+nparts/2);
+  }
+  else if (nparts == 3) {
+    cut += MCHMlevelRecursiveBisection(ctrl, &rgraph, nparts-nparts/2, part, rubvec, fpart+nparts/2);
+    GKfree(&lgraph.gdata, &lgraph.nvwgt, &lgraph.label, LTERM);
+  }
+
+  GKfree(&lubvec, &rubvec, LTERM);
+
+  return cut;
+
+}
+
+
+
+
+/*************************************************************************
+* This function performs multilevel bisection
+**************************************************************************/
+void MCMlevelEdgeBisection(CtrlType *ctrl, GraphType *graph, float *tpwgts, float ubfactor)
+{
+  GraphType *cgraph;
+
+  cgraph = MCCoarsen2Way(ctrl, graph);
+
+  MocInit2WayPartition(ctrl, cgraph, tpwgts, ubfactor);
+
+  MocRefine2Way(ctrl, graph, cgraph, tpwgts, ubfactor); 
+
+}
+
+
+
+/*************************************************************************
+* This function performs multilevel bisection
+**************************************************************************/
+void MCHMlevelEdgeBisection(CtrlType *ctrl, GraphType *graph, float *tpwgts, float *ubvec)
+{
+  int i;
+  GraphType *cgraph;
+
+/*
+  for (i=0; i<graph->ncon; i++)
+    printf("%.4f ", ubvec[i]);
+  printf("\n");
+*/
+
+  cgraph = MCCoarsen2Way(ctrl, graph);
+
+  MocInit2WayPartition2(ctrl, cgraph, tpwgts, ubvec);
+
+  MocRefine2Way2(ctrl, graph, cgraph, tpwgts, ubvec); 
+
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mrefine.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mrefine.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mrefine.c	(revision 9501)
@@ -0,0 +1,219 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * refine.c
+ *
+ * This file contains the driving routines for multilevel refinement
+ *
+ * Started 7/24/97
+ * George
+ *
+ * $Id: mrefine.c,v 1.2 1998/11/27 18:25:09 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of refinement
+**************************************************************************/
+void MocRefine2Way(CtrlType *ctrl, GraphType *orggraph, GraphType *graph, float *tpwgts, float ubfactor)
+{
+  int i;
+  float tubvec[MAXNCON];
+
+  for (i=0; i<graph->ncon; i++)
+    tubvec[i] = 1.0;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->UncoarsenTmr));
+
+  /* Compute the parameters of the coarsest graph */
+  MocCompute2WayPartitionParams(ctrl, graph);
+
+  for (;;) {
+    ASSERT(CheckBnd(graph));
+
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->RefTmr));
+    switch (ctrl->RType) {
+      case RTYPE_FM:
+        MocBalance2Way(ctrl, graph, tpwgts, 1.03);
+        MocFM_2WayEdgeRefine(ctrl, graph, tpwgts, 8); 
+        break;
+      case 2:
+        MocBalance2Way(ctrl, graph, tpwgts, 1.03);
+        MocFM_2WayEdgeRefine2(ctrl, graph, tpwgts, tubvec, 8); 
+        break;
+      default:
+        errexit("Unknown refinement type: %d\n", ctrl->RType);
+    }
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->RefTmr));
+
+    if (graph == orggraph)
+      break;
+
+    graph = graph->finer;
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ProjectTmr));
+    MocProject2WayPartition(ctrl, graph);
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ProjectTmr));
+  }
+
+  MocBalance2Way(ctrl, graph, tpwgts, 1.01);
+  MocFM_2WayEdgeRefine(ctrl, graph, tpwgts, 8); 
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->UncoarsenTmr));
+}
+
+
+/*************************************************************************
+* This function allocates memory for 2-way edge refinement
+**************************************************************************/
+void MocAllocate2WayPartitionMemory(CtrlType *ctrl, GraphType *graph)
+{
+  int nvtxs, ncon;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+
+  graph->rdata = idxmalloc(5*nvtxs, "Allocate2WayPartitionMemory: rdata");
+  graph->where		= graph->rdata;
+  graph->id		= graph->rdata + nvtxs;
+  graph->ed		= graph->rdata + 2*nvtxs;
+  graph->bndptr		= graph->rdata + 3*nvtxs;
+  graph->bndind		= graph->rdata + 4*nvtxs;
+
+  graph->npwgts 	= fmalloc(2*ncon, "npwgts");
+}
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void MocCompute2WayPartitionParams(CtrlType *ctrl, GraphType *graph)
+{
+  int i, j, k, l, nvtxs, ncon, nbnd, mincut;
+  idxtype *xadj, *adjncy, *adjwgt;
+  float *nvwgt, *npwgts;
+  idxtype *id, *ed, *where;
+  idxtype *bndptr, *bndind;
+  int me, other;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  npwgts = sset(2*ncon, 0.0, graph->npwgts);
+  id = idxset(nvtxs, 0, graph->id);
+  ed = idxset(nvtxs, 0, graph->ed);
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+  bndind = graph->bndind;
+
+
+  /*------------------------------------------------------------
+  / Compute now the id/ed degrees
+  /------------------------------------------------------------*/
+  nbnd = mincut = 0;
+  for (i=0; i<nvtxs; i++) {
+    ASSERT(where[i] >= 0 && where[i] <= 1);
+    me = where[i];
+    saxpy(ncon, 1.0, nvwgt+i*ncon, 1, npwgts+me*ncon, 1);
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (me == where[adjncy[j]])
+        id[i] += adjwgt[j];
+      else
+        ed[i] += adjwgt[j];
+    }
+
+    if (ed[i] > 0 || xadj[i] == xadj[i+1]) {
+      mincut += ed[i];
+      bndptr[i] = nbnd;
+      bndind[nbnd++] = i;
+    }
+  }
+
+  graph->mincut = mincut/2;
+  graph->nbnd = nbnd;
+
+}
+
+
+
+/*************************************************************************
+* This function projects a partition, and at the same time computes the
+* parameters for refinement.
+**************************************************************************/
+void MocProject2WayPartition(CtrlType *ctrl, GraphType *graph)
+{
+  int i, j, k, nvtxs, nbnd, me;
+  idxtype *xadj, *adjncy, *adjwgt, *adjwgtsum;
+  idxtype *cmap, *where, *id, *ed, *bndptr, *bndind;
+  idxtype *cwhere, *cid, *ced, *cbndptr;
+  GraphType *cgraph;
+
+  cgraph = graph->coarser;
+  cwhere = cgraph->where;
+  cid = cgraph->id;
+  ced = cgraph->ed;
+  cbndptr = cgraph->bndptr;
+
+  nvtxs = graph->nvtxs;
+  cmap = graph->cmap;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+
+  MocAllocate2WayPartitionMemory(ctrl, graph);
+
+  where = graph->where;
+  id = idxset(nvtxs, 0, graph->id);
+  ed = idxset(nvtxs, 0, graph->ed);
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+  bndind = graph->bndind;
+
+
+  /* Go through and project partition and compute id/ed for the nodes */
+  for (i=0; i<nvtxs; i++) {
+    k = cmap[i];
+    where[i] = cwhere[k];
+    cmap[i] = cbndptr[k];
+  }
+
+  for (nbnd=0, i=0; i<nvtxs; i++) {
+    me = where[i];
+
+    id[i] = adjwgtsum[i];
+
+    if (xadj[i] == xadj[i+1]) {
+      bndptr[i] = nbnd;
+      bndind[nbnd++] = i;
+    }
+    else {
+      if (cmap[i] != -1) { /* If it is an interface node. Note that cmap[i] = cbndptr[cmap[i]] */
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          if (me != where[adjncy[j]])
+            ed[i] += adjwgt[j];
+        }
+        id[i] -= ed[i];
+
+        if (ed[i] > 0 || xadj[i] == xadj[i+1]) {
+          bndptr[i] = nbnd;
+          bndind[nbnd++] = i;
+        }
+      }
+    }
+  }
+
+  graph->mincut = cgraph->mincut;
+  graph->nbnd = nbnd;
+  scopy(2*graph->ncon, cgraph->npwgts, graph->npwgts);
+
+  FreeGraph(graph->coarser);
+  graph->coarser = NULL;
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mrefine2.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mrefine2.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mrefine2.c	(revision 9501)
@@ -0,0 +1,55 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mrefine2.c
+ *
+ * This file contains the driving routines for multilevel refinement
+ *
+ * Started 7/24/97
+ * George
+ *
+ * $Id: mrefine2.c,v 1.1 1998/11/27 17:59:26 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of refinement
+**************************************************************************/
+void MocRefine2Way2(CtrlType *ctrl, GraphType *orggraph, GraphType *graph, float *tpwgts, 
+       float *ubvec)
+{
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->UncoarsenTmr));
+
+  /* Compute the parameters of the coarsest graph */
+  MocCompute2WayPartitionParams(ctrl, graph);
+
+  for (;;) {
+    ASSERT(CheckBnd(graph));
+
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->RefTmr));
+    switch (ctrl->RType) {
+      case RTYPE_FM:
+        MocBalance2Way2(ctrl, graph, tpwgts, ubvec);
+        MocFM_2WayEdgeRefine2(ctrl, graph, tpwgts, ubvec, 8); 
+        break;
+      default:
+        errexit("Unknown refinement type: %d\n", ctrl->RType);
+    }
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->RefTmr));
+
+    if (graph == orggraph)
+      break;
+
+    graph = graph->finer;
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ProjectTmr));
+    MocProject2WayPartition(ctrl, graph);
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ProjectTmr));
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->UncoarsenTmr));
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mutil.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mutil.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/mutil.c	(revision 9501)
@@ -0,0 +1,101 @@
+/*
+ * mutil.c 
+ *
+ * This file contains various utility functions for the MOC portion of the
+ * code
+ *
+ * Started 2/15/98
+ * George
+ *
+ * $Id: mutil.c,v 1.1 1998/11/27 17:59:27 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function checks if the vertex weights of two vertices are below 
+* a given set of values
+**************************************************************************/
+int AreAllVwgtsBelow(int ncon, float alpha, float *vwgt1, float beta, float *vwgt2, float limit)
+{
+  int i;
+
+  for (i=0; i<ncon; i++)
+    if (alpha*vwgt1[i] + beta*vwgt2[i] > limit)
+      return 0;
+
+  return 1;
+}
+
+
+/*************************************************************************
+* This function checks if the vertex weights of two vertices are below 
+* a given set of values
+**************************************************************************/
+int AreAnyVwgtsBelow(int ncon, float alpha, float *vwgt1, float beta, float *vwgt2, float limit)
+{
+  int i;
+
+  for (i=0; i<ncon; i++)
+    if (alpha*vwgt1[i] + beta*vwgt2[i] < limit)
+      return 1;
+
+  return 0;
+}
+
+
+
+/*************************************************************************
+* This function checks if the vertex weights of two vertices are above 
+* a given set of values
+**************************************************************************/
+int AreAllVwgtsAbove(int ncon, float alpha, float *vwgt1, float beta, float *vwgt2, float limit)
+{
+  int i;
+
+  for (i=0; i<ncon; i++)
+    if (alpha*vwgt1[i] + beta*vwgt2[i] < limit)
+      return 0;
+
+  return 1;
+}
+
+
+/*************************************************************************
+* This function computes the load imbalance over all the constrains
+* For now assume that we just want balanced partitionings
+**************************************************************************/ 
+float ComputeLoadImbalance(int ncon, int nparts, float *npwgts, float *tpwgts)
+{
+  int i, j;
+  float max, lb=0.0;
+
+  for (i=0; i<ncon; i++) {
+    max = 0.0;
+    for (j=0; j<nparts; j++) {
+      if (npwgts[j*ncon+i] > max)
+        max = npwgts[j*ncon+i];
+    }
+    if (max*nparts > lb)
+      lb = max*nparts;
+  }
+
+  return lb;
+}
+
+/*************************************************************************
+* This function checks if the vertex weights of two vertices are below 
+* a given set of values
+**************************************************************************/
+int AreAllBelow(int ncon, float *v1, float *v2)
+{
+  int i;
+
+  for (i=0; i<ncon; i++)
+    if (v1[i] > v2[i])
+      return 0;
+
+  return 1;
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/myqsort.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/myqsort.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/myqsort.c	(revision 9501)
@@ -0,0 +1,547 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * myqsort.c
+ * 
+ * This file contains a fast idxtype increasing qsort algorithm.
+ * Addopted from TeX
+ * 
+ * Started 10/18/96
+ * George
+ * 
+ * $Id: myqsort.c,v 1.1 1998/11/27 17:59:27 karypis Exp $
+ */
+
+#include <metis.h>			/* only for type declarations */
+
+#define		THRESH		1	/* threshold for insertion */
+#define		MTHRESH		6	/* threshold for median */
+
+
+
+
+static void siqst(idxtype *, idxtype *);
+static void iiqst(int *, int *);
+static void keyiqst(KeyValueType *, KeyValueType *);
+static void keyvaliqst(KeyValueType *, KeyValueType *);
+
+
+/*************************************************************************
+* Entry point of idxtype increasing sort
+**************************************************************************/
+void iidxsort(int n, idxtype *base)
+{
+  register idxtype *i;
+  register idxtype *j;
+  register idxtype *lo;
+  register idxtype *hi;
+  register idxtype *min;
+  register idxtype c;
+  idxtype *max;
+
+  if (n <= 1)
+    return;
+
+  max = base + n;
+
+  if (n >= THRESH) {
+    siqst(base, max);
+    hi = base + THRESH;
+  }
+  else 
+    hi = max;
+
+  for (j = lo = base; lo++ < hi;) {
+    if (*j > *lo)
+      j = lo;
+  }
+  if (j != base) { /* swap j into place */
+    c = *base;
+    *base = *j;
+    *j = c;
+  }
+
+  for (min = base; (hi = min += 1) < max;) {
+    while (*(--hi) > *min);
+    if ((hi += 1) != min) {
+      for (lo = min + 1; --lo >= min;) {
+	c = *lo;
+	for (i = j = lo; (j -= 1) >= hi; i = j)
+	   *i = *j;
+	*i = c;
+      }
+    }
+  }
+}
+
+static void siqst(idxtype *base, idxtype *max)
+{
+  register idxtype *i;
+  register idxtype *j;
+  register idxtype *jj;
+  register idxtype *mid;
+  register int ii;
+  register idxtype c;
+  idxtype *tmp;
+  int lo;
+  int hi;
+
+  lo = max - base;		/* number of elements as idxtype */
+  do {
+    mid = base + ((unsigned) lo>>1);
+    if (lo >= MTHRESH) {
+      j = (*base > *mid ? base : mid);
+      tmp = max - 1;
+      if (*j > *tmp) {
+        j = (j == base ? mid : base); /* switch to first loser */
+        if (*j < *tmp)
+          j = tmp;
+      }
+
+      if (j != mid) {  /* SWAP */ 
+        c = *mid;
+        *mid = *j;
+        *j = c;
+      }
+    }
+
+    /* Semi-standard quicksort partitioning/swapping */
+    for (i = base, j = max - 1;;) {
+      while (i < mid && *i <= *mid)
+        i++;
+      while (j > mid) {
+        if (*mid <= *j) {
+          j--;
+          continue;
+        }
+        tmp = i + 1;	/* value of i after swap */
+        if (i == mid) 	/* j <-> mid, new mid is j */
+          mid = jj = j;
+        else 		/* i <-> j */
+          jj = j--;
+        goto swap;
+      }
+
+      if (i == mid) 
+	break;
+      else {		/* i <-> mid, new mid is i */
+        jj = mid;
+        tmp = mid = i;	/* value of i after swap */
+        j--;
+      }
+swap:
+      c = *i;
+      *i = *jj;
+      *jj = c;
+      i = tmp;
+    }
+
+    i = (j = mid) + 1;
+    if ((lo = j - base) <= (hi = max - i)) {
+      if (lo >= THRESH)
+        siqst(base, j);
+      base = i;
+      lo = hi;
+    }
+    else {
+      if (hi >= THRESH)
+        siqst(i, max);
+      max = j;
+    }
+  } while (lo >= THRESH);
+}
+
+
+
+
+
+/*************************************************************************
+* Entry point of int increasing sort
+**************************************************************************/
+void iintsort(int n, int *base)
+{
+  register int *i;
+  register int *j;
+  register int *lo;
+  register int *hi;
+  register int *min;
+  register int c;
+  int *max;
+
+  if (n <= 1)
+    return;
+
+  max = base + n;
+
+  if (n >= THRESH) {
+    iiqst(base, max);
+    hi = base + THRESH;
+  }
+  else 
+    hi = max;
+
+  for (j = lo = base; lo++ < hi;) {
+    if (*j > *lo)
+      j = lo;
+  }
+  if (j != base) { /* swap j into place */
+    c = *base;
+    *base = *j;
+    *j = c;
+  }
+
+  for (min = base; (hi = min += 1) < max;) {
+    while (*(--hi) > *min);
+    if ((hi += 1) != min) {
+      for (lo = min + 1; --lo >= min;) {
+	c = *lo;
+	for (i = j = lo; (j -= 1) >= hi; i = j)
+	   *i = *j;
+	*i = c;
+      }
+    }
+  }
+}
+
+
+static void iiqst(int *base, int *max)
+{
+  register int *i;
+  register int *j;
+  register int *jj;
+  register int *mid;
+  register int ii;
+  register int c;
+  int *tmp;
+  int lo;
+  int hi;
+
+  lo = max - base;		/* number of elements as ints */
+  do {
+    mid = base + ((unsigned) lo>>1);
+    if (lo >= MTHRESH) {
+      j = (*base > *mid ? base : mid);
+      tmp = max - 1;
+      if (*j > *tmp) {
+        j = (j == base ? mid : base); /* switch to first loser */
+        if (*j < *tmp)
+          j = tmp;
+      }
+
+      if (j != mid) {  /* SWAP */ 
+        c = *mid;
+        *mid = *j;
+        *j = c;
+      }
+    }
+
+    /* Semi-standard quicksort partitioning/swapping */
+    for (i = base, j = max - 1;;) {
+      while (i < mid && *i <= *mid)
+        i++;
+      while (j > mid) {
+        if (*mid <= *j) {
+          j--;
+          continue;
+        }
+        tmp = i + 1;	/* value of i after swap */
+        if (i == mid) 	/* j <-> mid, new mid is j */
+          mid = jj = j;
+        else 		/* i <-> j */
+          jj = j--;
+        goto swap;
+      }
+
+      if (i == mid) 
+	break;
+      else {		/* i <-> mid, new mid is i */
+        jj = mid;
+        tmp = mid = i;	/* value of i after swap */
+        j--;
+      }
+swap:
+      c = *i;
+      *i = *jj;
+      *jj = c;
+      i = tmp;
+    }
+
+    i = (j = mid) + 1;
+    if ((lo = j - base) <= (hi = max - i)) {
+      if (lo >= THRESH)
+        iiqst(base, j);
+      base = i;
+      lo = hi;
+    }
+    else {
+      if (hi >= THRESH)
+        iiqst(i, max);
+      max = j;
+    }
+  } while (lo >= THRESH);
+}
+
+
+
+
+
+/*************************************************************************
+* Entry point of KeyVal increasing sort, ONLY key part
+**************************************************************************/
+void ikeysort(int n, KeyValueType *base)
+{
+  register KeyValueType *i;
+  register KeyValueType *j;
+  register KeyValueType *lo;
+  register KeyValueType *hi;
+  register KeyValueType *min;
+  register KeyValueType c;
+  KeyValueType *max;
+
+  if (n <= 1)
+    return;
+
+  max = base + n;
+
+  if (n >= THRESH) {
+    keyiqst(base, max);
+    hi = base + THRESH;
+  }
+  else 
+    hi = max;
+
+  for (j = lo = base; lo++ < hi;) {
+    if (j->key > lo->key)
+      j = lo;
+  }
+  if (j != base) { /* swap j into place */
+    c = *base;
+    *base = *j;
+    *j = c;
+  }
+
+  for (min = base; (hi = min += 1) < max;) {
+    while ((--hi)->key > min->key);
+    if ((hi += 1) != min) {
+      for (lo = min + 1; --lo >= min;) {
+	c = *lo;
+	for (i = j = lo; (j -= 1) >= hi; i = j)
+	   *i = *j;
+	*i = c;
+      }
+    }
+  }
+
+  /* Sanity check */
+  { 
+    int i;
+    for (i=0; i<n-1; i++)
+      if (base[i].key > base[i+1].key)
+        printf("Something went wrong!\n");
+  }
+}
+
+
+static void keyiqst(KeyValueType *base, KeyValueType *max)
+{
+  register KeyValueType *i;
+  register KeyValueType *j;
+  register KeyValueType *jj;
+  register KeyValueType *mid;
+  register KeyValueType c;
+  KeyValueType *tmp;
+  int lo;
+  int hi;
+
+  lo = (max - base)>>1;		/* number of elements as KeyValueType */
+  do {
+    mid = base + ((unsigned) lo>>1);
+    if (lo >= MTHRESH) {
+      j = (base->key > mid->key ? base : mid);
+      tmp = max - 1;
+      if (j->key > tmp->key) {
+        j = (j == base ? mid : base); /* switch to first loser */
+        if (j->key < tmp->key)
+          j = tmp;
+      }
+
+      if (j != mid) {  /* SWAP */ 
+        c = *mid;
+        *mid = *j;
+        *j = c;
+      }
+    }
+
+    /* Semi-standard quicksort partitioning/swapping */
+    for (i = base, j = max - 1;;) {
+      while (i < mid && i->key <= mid->key)
+        i++;
+      while (j > mid) {
+        if (mid->key <= j->key) {
+          j--;
+          continue;
+        }
+        tmp = i + 1;	/* value of i after swap */
+        if (i == mid) 	/* j <-> mid, new mid is j */
+          mid = jj = j;
+        else 		/* i <-> j */
+          jj = j--;
+        goto swap;
+      }
+
+      if (i == mid) 
+	break;
+      else {		/* i <-> mid, new mid is i */
+        jj = mid;
+        tmp = mid = i;	/* value of i after swap */
+        j--;
+      }
+swap:
+      c = *i;
+      *i = *jj;
+      *jj = c;
+      i = tmp;
+    }
+
+    i = (j = mid) + 1;
+    if ((lo = (j - base)>>1) <= (hi = (max - i)>>1)) {
+      if (lo >= THRESH)
+        keyiqst(base, j);
+      base = i;
+      lo = hi;
+    }
+    else {
+      if (hi >= THRESH)
+        keyiqst(i, max);
+      max = j;
+    }
+  } while (lo >= THRESH);
+}
+
+
+
+
+/*************************************************************************
+* Entry point of KeyVal increasing sort, BOTH key and val part
+**************************************************************************/
+void ikeyvalsort(int n, KeyValueType *base)
+{
+  register KeyValueType *i;
+  register KeyValueType *j;
+  register KeyValueType *lo;
+  register KeyValueType *hi;
+  register KeyValueType *min;
+  register KeyValueType c;
+  KeyValueType *max;
+
+  if (n <= 1)
+    return;
+
+  max = base + n;
+
+  if (n >= THRESH) {
+    keyvaliqst(base, max);
+    hi = base + THRESH;
+  }
+  else 
+    hi = max;
+
+  for (j = lo = base; lo++ < hi;) {
+    if ((j->key > lo->key) || (j->key == lo->key && j->val > lo->val))
+      j = lo;
+  }
+  if (j != base) { /* swap j into place */
+    c = *base;
+    *base = *j;
+    *j = c;
+  }
+
+  for (min = base; (hi = min += 1) < max;) {
+    while ((--hi)->key > min->key || (hi->key == min->key && hi->val > min->val));
+    if ((hi += 1) != min) {
+      for (lo = min + 1; --lo >= min;) {
+	c = *lo;
+	for (i = j = lo; (j -= 1) >= hi; i = j)
+	   *i = *j;
+	*i = c;
+      }
+    }
+  }
+}
+
+
+static void keyvaliqst(KeyValueType *base, KeyValueType *max)
+{
+  register KeyValueType *i;
+  register KeyValueType *j;
+  register KeyValueType *jj;
+  register KeyValueType *mid;
+  register KeyValueType c;
+  KeyValueType *tmp;
+  int lo;
+  int hi;
+
+  lo = (max - base)>>1;		/* number of elements as KeyValueType */
+  do {
+    mid = base + ((unsigned) lo>>1);
+    if (lo >= MTHRESH) {
+      j = (base->key > mid->key || (base->key == mid->key && base->val > mid->val) ? base : mid);
+      tmp = max - 1;
+      if (j->key > tmp->key || (j->key == tmp->key && j->val > tmp->val)) {
+        j = (j == base ? mid : base); /* switch to first loser */
+        if (j->key < tmp->key || (j->key == tmp->key && j->val < tmp->val))
+          j = tmp;
+      }
+
+      if (j != mid) {  /* SWAP */ 
+        c = *mid;
+        *mid = *j;
+        *j = c;
+      }
+    }
+
+    /* Semi-standard quicksort partitioning/swapping */
+    for (i = base, j = max - 1;;) {
+      while (i < mid && (i->key < mid->key || (i->key == mid->key && i->val <= mid->val)))
+        i++;
+      while (j > mid) {
+        if (mid->key < j->key || (mid->key == j->key && mid->val <= j->val)) {
+          j--;
+          continue;
+        }
+        tmp = i + 1;	/* value of i after swap */
+        if (i == mid) 	/* j <-> mid, new mid is j */
+          mid = jj = j;
+        else 		/* i <-> j */
+          jj = j--;
+        goto swap;
+      }
+
+      if (i == mid) 
+	break;
+      else {		/* i <-> mid, new mid is i */
+        jj = mid;
+        tmp = mid = i;	/* value of i after swap */
+        j--;
+      }
+swap:
+      c = *i;
+      *i = *jj;
+      *jj = c;
+      i = tmp;
+    }
+
+    i = (j = mid) + 1;
+    if ((lo = (j - base)>>1) <= (hi = (max - i)>>1)) {
+      if (lo >= THRESH)
+        keyvaliqst(base, j);
+      base = i;
+      lo = hi;
+    }
+    else {
+      if (hi >= THRESH)
+        keyvaliqst(i, max);
+      max = j;
+    }
+  } while (lo >= THRESH);
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/ometis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/ometis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/ometis.c	(revision 9501)
@@ -0,0 +1,764 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * ometis.c
+ *
+ * This file contains the top level routines for the multilevel recursive
+ * bisection algorithm PMETIS.
+ *
+ * Started 7/24/97
+ * George
+ *
+ * $Id: ometis.c,v 1.1 1998/11/27 17:59:27 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point for OEMETIS
+**************************************************************************/
+void METIS_EdgeND(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, 
+                  idxtype *perm, idxtype *iperm) 
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  SetUpGraph(&graph, OP_OEMETIS, *nvtxs, 1, xadj, adjncy, NULL, NULL, 0);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = OEMETIS_CTYPE;
+    ctrl.IType = OEMETIS_ITYPE;
+    ctrl.RType = OEMETIS_RTYPE;
+    ctrl.dbglvl = OEMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.oflags  = 0;
+  ctrl.pfactor = -1;
+  ctrl.nseps   = 1;
+
+  ctrl.optype = OP_OEMETIS;
+  ctrl.CoarsenTo = 20;
+  ctrl.maxvwgt = 1.5*(idxsum(*nvtxs, graph.vwgt)/ctrl.CoarsenTo);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, 2);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  MlevelNestedDissection(&ctrl, &graph, iperm, ORDER_UNBALANCE_FRACTION, *nvtxs);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  for (i=0; i<*nvtxs; i++)
+    perm[iperm[i]] = i;
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (*numflag == 1)
+    Change2FNumberingOrder(*nvtxs, xadj, adjncy, perm, iperm);
+}
+
+
+/*************************************************************************
+* This function is the entry point for ONCMETIS
+**************************************************************************/
+void METIS_NodeND(int *nvtxs, idxtype *xadj, idxtype *adjncy, int *numflag, int *options, 
+                  idxtype *perm, idxtype *iperm) 
+{
+  int i, ii, j, l, wflag, nflag;
+  GraphType graph;
+  CtrlType ctrl;
+  idxtype *cptr, *cind, *piperm;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType   = ONMETIS_CTYPE;
+    ctrl.IType   = ONMETIS_ITYPE;
+    ctrl.RType   = ONMETIS_RTYPE;
+    ctrl.dbglvl  = ONMETIS_DBGLVL;
+    ctrl.oflags  = ONMETIS_OFLAGS;
+    ctrl.pfactor = ONMETIS_PFACTOR;
+    ctrl.nseps   = ONMETIS_NSEPS;
+  }
+  else {
+    ctrl.CType   = options[OPTION_CTYPE];
+    ctrl.IType   = options[OPTION_ITYPE];
+    ctrl.RType   = options[OPTION_RTYPE];
+    ctrl.dbglvl  = options[OPTION_DBGLVL];
+    ctrl.oflags  = options[OPTION_OFLAGS];
+    ctrl.pfactor = options[OPTION_PFACTOR];
+    ctrl.nseps   = options[OPTION_NSEPS];
+  }
+  if (ctrl.nseps < 1)
+    ctrl.nseps = 1;
+
+  ctrl.optype = OP_ONMETIS;
+  ctrl.CoarsenTo = 100;
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  InitRandom(-1);
+
+  if (ctrl.pfactor > 0) { 
+    /*============================================================
+    * Prune the dense columns
+    ==============================================================*/
+    piperm = idxmalloc(*nvtxs, "ONMETIS: piperm");
+
+    PruneGraph(&ctrl, &graph, *nvtxs, xadj, adjncy, piperm, (float)(0.1*ctrl.pfactor));
+  }
+  else if (ctrl.oflags&OFLAG_COMPRESS) {
+    /*============================================================
+    * Compress the graph 
+    ==============================================================*/
+    cptr = idxmalloc(*nvtxs+1, "ONMETIS: cptr");
+    cind = idxmalloc(*nvtxs, "ONMETIS: cind");
+
+    CompressGraph(&ctrl, &graph, *nvtxs, xadj, adjncy, cptr, cind);
+
+    if (graph.nvtxs >= COMPRESSION_FRACTION*(*nvtxs)) {
+      ctrl.oflags--; /* We actually performed no compression */
+      GKfree(&cptr, &cind, LTERM);
+    }
+    else if (2*graph.nvtxs < *nvtxs && ctrl.nseps == 1)
+      ctrl.nseps = 2;
+  }
+  else {
+    SetUpGraph(&graph, OP_ONMETIS, *nvtxs, 1, xadj, adjncy, NULL, NULL, 0);
+  }
+
+
+  /*=============================================================
+  * Do the nested dissection ordering 
+  --=============================================================*/
+  ctrl.maxvwgt = 1.5*(idxsum(graph.nvtxs, graph.vwgt)/ctrl.CoarsenTo);
+  AllocateWorkSpace(&ctrl, &graph, 2);
+
+  if (ctrl.oflags&OFLAG_CCMP) 
+    MlevelNestedDissectionCC(&ctrl, &graph, iperm, ORDER_UNBALANCE_FRACTION, graph.nvtxs);
+  else
+    MlevelNestedDissection(&ctrl, &graph, iperm, ORDER_UNBALANCE_FRACTION, graph.nvtxs);
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (ctrl.pfactor > 0) { /* Order any prunned vertices */
+    if (graph.nvtxs < *nvtxs) { 
+      idxcopy(graph.nvtxs, iperm, perm);  /* Use perm as an auxiliary array */
+      for (i=0; i<graph.nvtxs; i++)
+        iperm[piperm[i]] = perm[i];
+      for (i=graph.nvtxs; i<*nvtxs; i++)
+        iperm[piperm[i]] = i;
+    }
+
+    GKfree(&piperm, LTERM);
+  }
+  else if (ctrl.oflags&OFLAG_COMPRESS) { /* Uncompress the ordering */
+    if (graph.nvtxs < COMPRESSION_FRACTION*(*nvtxs)) { 
+      /* construct perm from iperm */
+      for (i=0; i<graph.nvtxs; i++)
+        perm[iperm[i]] = i; 
+      for (l=ii=0; ii<graph.nvtxs; ii++) {
+        i = perm[ii];
+        for (j=cptr[i]; j<cptr[i+1]; j++)
+          iperm[cind[j]] = l++;
+      }
+    }
+
+    GKfree(&cptr, &cind, LTERM);
+  }
+
+
+  for (i=0; i<*nvtxs; i++)
+    perm[iperm[i]] = i;
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  if (*numflag == 1)
+    Change2FNumberingOrder(*nvtxs, xadj, adjncy, perm, iperm);
+
+}
+
+
+/*************************************************************************
+* This function is the entry point for ONWMETIS. It requires weights on the
+* vertices. It is for the case that the matrix has been pre-compressed.
+**************************************************************************/
+void METIS_NodeWND(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, int *numflag, 
+                   int *options, idxtype *perm, idxtype *iperm) 
+{
+  int i, j, tvwgt;
+  GraphType graph;
+  CtrlType ctrl;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  SetUpGraph(&graph, OP_ONMETIS, *nvtxs, 1, xadj, adjncy, vwgt, NULL, 2);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = ONMETIS_CTYPE;
+    ctrl.IType = ONMETIS_ITYPE;
+    ctrl.RType = ONMETIS_RTYPE;
+    ctrl.dbglvl = ONMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+
+  ctrl.oflags  = OFLAG_COMPRESS;
+  ctrl.pfactor = 0;
+  ctrl.nseps = 2;
+  ctrl.optype = OP_ONMETIS;
+  ctrl.CoarsenTo = 100;
+  ctrl.maxvwgt = 1.5*(idxsum(*nvtxs, graph.vwgt)/ctrl.CoarsenTo);
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, 2);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  MlevelNestedDissection(&ctrl, &graph, iperm, ORDER_UNBALANCE_FRACTION, *nvtxs);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  for (i=0; i<*nvtxs; i++)
+    perm[iperm[i]] = i;
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (*numflag == 1)
+    Change2FNumberingOrder(*nvtxs, xadj, adjncy, perm, iperm);
+}
+
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+void MlevelNestedDissection(CtrlType *ctrl, GraphType *graph, idxtype *order, float ubfactor, int lastvtx)
+{
+  int i, j, nvtxs, nbnd, tvwgt, tpwgts2[2];
+  idxtype *label, *bndind;
+  GraphType lgraph, rgraph;
+
+  nvtxs = graph->nvtxs;
+
+  /* Determine the weights of the partitions */
+  tvwgt = idxsum(nvtxs, graph->vwgt);
+  tpwgts2[0] = tvwgt/2;
+  tpwgts2[1] = tvwgt-tpwgts2[0];
+
+  switch (ctrl->optype) {
+    case OP_OEMETIS:
+      MlevelEdgeBisection(ctrl, graph, tpwgts2, ubfactor);
+
+      IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->SepTmr));
+      ConstructMinCoverSeparator(ctrl, graph, ubfactor);
+      IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->SepTmr));
+
+      break;
+    case OP_ONMETIS:
+      MlevelNodeBisectionMultiple(ctrl, graph, tpwgts2, ubfactor);
+
+      IFSET(ctrl->dbglvl, DBG_SEPINFO, printf("Nvtxs: %6d, [%6d %6d %6d]\n", graph->nvtxs, graph->pwgts[0], graph->pwgts[1], graph->pwgts[2]));
+
+      break;
+  }
+
+  /* Order the nodes in the separator */
+  nbnd = graph->nbnd;
+  bndind = graph->bndind;
+  label = graph->label;
+  for (i=0; i<nbnd; i++) 
+    order[label[bndind[i]]] = --lastvtx;
+
+  SplitGraphOrder(ctrl, graph, &lgraph, &rgraph);
+
+  /* Free the memory of the top level graph */
+  GKfree(&graph->gdata, &graph->rdata, &graph->label, LTERM);
+
+  if (rgraph.nvtxs > MMDSWITCH) 
+    MlevelNestedDissection(ctrl, &rgraph, order, ubfactor, lastvtx);
+  else {
+    MMDOrder(ctrl, &rgraph, order, lastvtx); 
+    GKfree(&rgraph.gdata, &rgraph.rdata, &rgraph.label, LTERM);
+  }
+  if (lgraph.nvtxs > MMDSWITCH) 
+    MlevelNestedDissection(ctrl, &lgraph, order, ubfactor, lastvtx-rgraph.nvtxs);
+  else {
+    MMDOrder(ctrl, &lgraph, order, lastvtx-rgraph.nvtxs); 
+    GKfree(&lgraph.gdata, &lgraph.rdata, &lgraph.label, LTERM);
+  }
+}
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+void MlevelNestedDissectionCC(CtrlType *ctrl, GraphType *graph, idxtype *order, float ubfactor, int lastvtx)
+{
+  int i, j, nvtxs, nbnd, tvwgt, tpwgts2[2], nsgraphs, ncmps, rnvtxs;
+  idxtype *label, *bndind;
+  idxtype *cptr, *cind;
+  GraphType *sgraphs;
+
+  nvtxs = graph->nvtxs;
+
+  /* Determine the weights of the partitions */
+  tvwgt = idxsum(nvtxs, graph->vwgt);
+  tpwgts2[0] = tvwgt/2;
+  tpwgts2[1] = tvwgt-tpwgts2[0];
+
+  MlevelNodeBisectionMultiple(ctrl, graph, tpwgts2, ubfactor);
+  IFSET(ctrl->dbglvl, DBG_SEPINFO, printf("Nvtxs: %6d, [%6d %6d %6d]\n", graph->nvtxs, graph->pwgts[0], graph->pwgts[1], graph->pwgts[2]));
+
+  /* Order the nodes in the separator */
+  nbnd = graph->nbnd;
+  bndind = graph->bndind;
+  label = graph->label;
+  for (i=0; i<nbnd; i++) 
+    order[label[bndind[i]]] = --lastvtx;
+
+  cptr = idxmalloc(nvtxs, "MlevelNestedDissectionCC: cptr");
+  cind = idxmalloc(nvtxs, "MlevelNestedDissectionCC: cind");
+  ncmps = FindComponents(ctrl, graph, cptr, cind);
+
+/*
+  if (ncmps > 2)
+    printf("[%5d] has %3d components\n", nvtxs, ncmps);
+*/
+
+  sgraphs = (GraphType *)GKmalloc(ncmps*sizeof(GraphType), "MlevelNestedDissectionCC: sgraphs");
+
+  nsgraphs = SplitGraphOrderCC(ctrl, graph, sgraphs, ncmps, cptr, cind);
+
+  GKfree(&cptr, &cind, LTERM);
+
+  /* Free the memory of the top level graph */
+  GKfree(&graph->gdata, &graph->rdata, &graph->label, LTERM);
+
+  /* Go and process the subgraphs */
+  for (rnvtxs=i=0; i<nsgraphs; i++) {
+    if (sgraphs[i].adjwgt == NULL) {
+      MMDOrder(ctrl, sgraphs+i, order, lastvtx-rnvtxs);
+      GKfree(&sgraphs[i].gdata, &sgraphs[i].label, LTERM);
+    }
+    else {
+      MlevelNestedDissectionCC(ctrl, sgraphs+i, order, ubfactor, lastvtx-rnvtxs);
+    }
+    rnvtxs += sgraphs[i].nvtxs;
+  }
+
+  free(sgraphs);
+}
+
+
+
+/*************************************************************************
+* This function performs multilevel bisection. It performs multiple 
+* bisections and selects the best.
+**************************************************************************/
+void MlevelNodeBisectionMultiple(CtrlType *ctrl, GraphType *graph, int *tpwgts, float ubfactor)
+{
+  int i, nvtxs, cnvtxs, mincut, tmp;
+  GraphType *cgraph; 
+  idxtype *bestwhere;
+
+  if (ctrl->nseps == 1 || graph->nvtxs < (ctrl->oflags&OFLAG_COMPRESS ? 1000 : 2000)) {
+    MlevelNodeBisection(ctrl, graph, tpwgts, ubfactor);
+    return;
+  }
+
+  nvtxs = graph->nvtxs;
+
+  if (ctrl->oflags&OFLAG_COMPRESS) { /* Multiple separators at the original graph */
+    bestwhere = idxmalloc(nvtxs, "MlevelNodeBisection2: bestwhere");
+    mincut = nvtxs;
+
+    for (i=ctrl->nseps; i>0; i--) {
+      MlevelNodeBisection(ctrl, graph, tpwgts, ubfactor);
+
+      /* printf("%5d ", cgraph->mincut); */
+
+      if (graph->mincut < mincut) {
+        mincut = graph->mincut;
+        idxcopy(nvtxs, graph->where, bestwhere);
+      }
+
+      GKfree(&graph->rdata, LTERM);
+    
+      if (mincut == 0)
+        break;
+    }
+    /* printf("[%5d]\n", mincut); */
+
+    Allocate2WayNodePartitionMemory(ctrl, graph);
+    idxcopy(nvtxs, bestwhere, graph->where);
+    free(bestwhere);
+
+    Compute2WayNodePartitionParams(ctrl, graph);
+  }
+  else {  /* Coarsen it a bit */
+    ctrl->CoarsenTo = nvtxs-1;
+
+    cgraph = Coarsen2Way(ctrl, graph);
+
+    cnvtxs = cgraph->nvtxs;
+
+    bestwhere = idxmalloc(cnvtxs, "MlevelNodeBisection2: bestwhere");
+    mincut = nvtxs;
+
+    for (i=ctrl->nseps; i>0; i--) {
+      ctrl->CType += 20; /* This is a hack. Look at coarsen.c */
+      MlevelNodeBisection(ctrl, cgraph, tpwgts, ubfactor);
+
+      /* printf("%5d ", cgraph->mincut); */
+
+      if (cgraph->mincut < mincut) {
+        mincut = cgraph->mincut;
+        idxcopy(cnvtxs, cgraph->where, bestwhere);
+      }
+
+      GKfree(&cgraph->rdata, LTERM);
+    
+      if (mincut == 0)
+        break;
+    }
+    /* printf("[%5d]\n", mincut); */
+
+    Allocate2WayNodePartitionMemory(ctrl, cgraph);
+    idxcopy(cnvtxs, bestwhere, cgraph->where);
+    free(bestwhere);
+
+    Compute2WayNodePartitionParams(ctrl, cgraph);
+
+    Refine2WayNode(ctrl, graph, cgraph, ubfactor);
+  }
+
+}
+
+/*************************************************************************
+* This function performs multilevel bisection
+**************************************************************************/
+void MlevelNodeBisection(CtrlType *ctrl, GraphType *graph, int *tpwgts, float ubfactor)
+{
+  GraphType *cgraph;
+
+  ctrl->CoarsenTo = graph->nvtxs/8;
+  if (ctrl->CoarsenTo > 100)
+    ctrl->CoarsenTo = 100;
+  else if (ctrl->CoarsenTo < 40)
+    ctrl->CoarsenTo = 40;
+  ctrl->maxvwgt = 1.5*((tpwgts[0]+tpwgts[1])/ctrl->CoarsenTo);
+
+  cgraph = Coarsen2Way(ctrl, graph);
+
+  switch (ctrl->IType) {
+    case IPART_GGPKL:
+      Init2WayPartition(ctrl, cgraph, tpwgts, ubfactor);
+
+      IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->SepTmr));
+
+      Compute2WayPartitionParams(ctrl, cgraph);
+      ConstructSeparator(ctrl, cgraph, ubfactor);
+
+      IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->SepTmr));
+      break;
+    case IPART_GGPKLNODE:
+      InitSeparator(ctrl, cgraph, ubfactor);
+      break;
+  }
+
+  Refine2WayNode(ctrl, graph, cgraph, ubfactor);
+
+}
+
+
+
+
+/*************************************************************************
+* This function takes a graph and a bisection and splits it into two graphs.
+* This function relies on the fact that adjwgt is all equal to 1.
+**************************************************************************/
+void SplitGraphOrder(CtrlType *ctrl, GraphType *graph, GraphType *lgraph, GraphType *rgraph)
+{
+  int i, ii, j, k, l, istart, iend, mypart, nvtxs, snvtxs[3], snedges[3];
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *adjwgtsum, *label, *where, *bndptr, *bndind;
+  idxtype *sxadj[2], *svwgt[2], *sadjncy[2], *sadjwgt[2], *sadjwgtsum[2], *slabel[2];
+  idxtype *rename;
+  idxtype *auxadjncy, *auxadjwgt;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->SplitTmr));
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+  label = graph->label;
+  where = graph->where;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+  ASSERT(bndptr != NULL);
+
+  rename = idxwspacemalloc(ctrl, nvtxs);
+  
+  snvtxs[0] = snvtxs[1] = snvtxs[2] = snedges[0] = snedges[1] = snedges[2] = 0;
+  for (i=0; i<nvtxs; i++) {
+    k = where[i];
+    rename[i] = snvtxs[k]++;
+    snedges[k] += xadj[i+1]-xadj[i];
+  }
+
+  SetUpSplitGraph(graph, lgraph, snvtxs[0], snedges[0]);
+  sxadj[0] = lgraph->xadj;
+  svwgt[0] = lgraph->vwgt;
+  sadjwgtsum[0] = lgraph->adjwgtsum;
+  sadjncy[0] = lgraph->adjncy; 
+  sadjwgt[0] = lgraph->adjwgt; 
+  slabel[0] = lgraph->label;
+
+  SetUpSplitGraph(graph, rgraph, snvtxs[1], snedges[1]);
+  sxadj[1] = rgraph->xadj;
+  svwgt[1] = rgraph->vwgt;
+  sadjwgtsum[1] = rgraph->adjwgtsum;
+  sadjncy[1] = rgraph->adjncy; 
+  sadjwgt[1] = rgraph->adjwgt; 
+  slabel[1] = rgraph->label;
+
+  /* Go and use bndptr to also mark the boundary nodes in the two partitions */
+  for (ii=0; ii<graph->nbnd; ii++) {
+    i = bndind[ii];
+    for (j=xadj[i]; j<xadj[i+1]; j++)
+      bndptr[adjncy[j]] = 1;
+  }
+
+  snvtxs[0] = snvtxs[1] = snedges[0] = snedges[1] = 0;
+  sxadj[0][0] = sxadj[1][0] = 0;
+  for (i=0; i<nvtxs; i++) {
+    if ((mypart = where[i]) == 2)
+      continue;
+
+    istart = xadj[i];
+    iend = xadj[i+1];
+    if (bndptr[i] == -1) { /* This is an interior vertex */
+      auxadjncy = sadjncy[mypart] + snedges[mypart] - istart;
+      for(j=istart; j<iend; j++) 
+        auxadjncy[j] = adjncy[j];
+      snedges[mypart] += iend-istart;
+    }
+    else {
+      auxadjncy = sadjncy[mypart];
+      l = snedges[mypart];
+      for (j=istart; j<iend; j++) {
+        k = adjncy[j];
+        if (where[k] == mypart) 
+          auxadjncy[l++] = k;
+      }
+      snedges[mypart] = l;
+    }
+
+    svwgt[mypart][snvtxs[mypart]] = vwgt[i];
+    sadjwgtsum[mypart][snvtxs[mypart]] = snedges[mypart]-sxadj[mypart][snvtxs[mypart]];
+    slabel[mypart][snvtxs[mypart]] = label[i];
+    sxadj[mypart][++snvtxs[mypart]] = snedges[mypart];
+  }
+
+  for (mypart=0; mypart<2; mypart++) {
+    iend = snedges[mypart];
+    idxset(iend, 1, sadjwgt[mypart]);
+
+    auxadjncy = sadjncy[mypart];
+    for (i=0; i<iend; i++) 
+      auxadjncy[i] = rename[auxadjncy[i]];
+  }
+
+  lgraph->nvtxs = snvtxs[0];
+  lgraph->nedges = snedges[0];
+  rgraph->nvtxs = snvtxs[1];
+  rgraph->nedges = snedges[1];
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->SplitTmr));
+
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
+/*************************************************************************
+* This function uses MMD to order the graph. The vertices are numbered
+* from lastvtx downwards
+**************************************************************************/
+void MMDOrder(CtrlType *ctrl, GraphType *graph, idxtype *order, int lastvtx)
+{
+  int i, j, k, nvtxs, nofsub, firstvtx;
+  idxtype *xadj, *adjncy, *label;
+  idxtype *perm, *iperm, *head, *qsize, *list, *marker;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+
+  /* Relabel the vertices so that it starts from 1 */
+  k = xadj[nvtxs];
+  for (i=0; i<k; i++)
+    adjncy[i]++;
+  for (i=0; i<nvtxs+1; i++)
+    xadj[i]++;
+
+  perm = idxmalloc(6*(nvtxs+5), "MMDOrder: perm");
+  iperm = perm + nvtxs + 5;
+  head = iperm + nvtxs + 5;
+  qsize = head + nvtxs + 5;
+  list = qsize + nvtxs + 5;
+  marker = list + nvtxs + 5;
+
+  genmmd(nvtxs, xadj, adjncy, iperm, perm, 1, head, qsize, list, marker, MAXIDX, &nofsub);
+
+  label = graph->label;
+  firstvtx = lastvtx-nvtxs;
+  for (i=0; i<nvtxs; i++)
+    order[label[i]] = firstvtx+iperm[i]-1;
+
+  free(perm);
+
+  /* Relabel the vertices so that it starts from 0 */
+  for (i=0; i<nvtxs+1; i++)
+    xadj[i]--;
+  k = xadj[nvtxs];
+  for (i=0; i<k; i++)
+    adjncy[i]--;
+}
+
+
+/*************************************************************************
+* This function takes a graph and a bisection and splits it into two graphs.
+* It relies on the fact that adjwgt is all set to 1.
+**************************************************************************/
+int SplitGraphOrderCC(CtrlType *ctrl, GraphType *graph, GraphType *sgraphs, int ncmps, idxtype *cptr, idxtype *cind)
+{
+  int i, ii, iii, j, k, l, istart, iend, mypart, nvtxs, snvtxs, snedges;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *adjwgtsum, *label, *where, *bndptr, *bndind;
+  idxtype *sxadj, *svwgt, *sadjncy, *sadjwgt, *sadjwgtsum, *slabel;
+  idxtype *rename;
+  idxtype *auxadjncy, *auxadjwgt;
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->SplitTmr));
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+  label = graph->label;
+  where = graph->where;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+  ASSERT(bndptr != NULL);
+
+  /* Go and use bndptr to also mark the boundary nodes in the two partitions */
+  for (ii=0; ii<graph->nbnd; ii++) {
+    i = bndind[ii];
+    for (j=xadj[i]; j<xadj[i+1]; j++)
+      bndptr[adjncy[j]] = 1;
+  }
+
+  rename = idxwspacemalloc(ctrl, nvtxs);
+  
+  /* Go and split the graph a component at a time */
+  for (iii=0; iii<ncmps; iii++) {
+    RandomPermute(cptr[iii+1]-cptr[iii], cind+cptr[iii], 0);
+    snvtxs = snedges = 0;
+    for (j=cptr[iii]; j<cptr[iii+1]; j++) {
+      i = cind[j];
+      rename[i] = snvtxs++;
+      snedges += xadj[i+1]-xadj[i];
+    }
+
+    SetUpSplitGraph(graph, sgraphs+iii, snvtxs, snedges);
+    sxadj = sgraphs[iii].xadj;
+    svwgt = sgraphs[iii].vwgt;
+    sadjwgtsum = sgraphs[iii].adjwgtsum;
+    sadjncy = sgraphs[iii].adjncy;
+    sadjwgt = sgraphs[iii].adjwgt;
+    slabel = sgraphs[iii].label;
+
+    snvtxs = snedges = sxadj[0] = 0;
+    for (ii=cptr[iii]; ii<cptr[iii+1]; ii++) {
+      i = cind[ii];
+
+      istart = xadj[i];
+      iend = xadj[i+1];
+      if (bndptr[i] == -1) { /* This is an interior vertex */
+        auxadjncy = sadjncy + snedges - istart;
+        auxadjwgt = sadjwgt + snedges - istart;
+        for(j=istart; j<iend; j++) 
+          auxadjncy[j] = adjncy[j];
+        snedges += iend-istart;
+      }
+      else {
+        l = snedges;
+        for (j=istart; j<iend; j++) {
+          k = adjncy[j];
+          if (where[k] != 2) 
+            sadjncy[l++] = k;
+        }
+        snedges = l;
+      }
+
+      svwgt[snvtxs] = vwgt[i];
+      sadjwgtsum[snvtxs] = snedges-sxadj[snvtxs];
+      slabel[snvtxs] = label[i];
+      sxadj[++snvtxs] = snedges;
+    }
+
+    idxset(snedges, 1, sadjwgt);
+    for (i=0; i<snedges; i++) 
+      sadjncy[i] = rename[sadjncy[i]];
+
+    sgraphs[iii].nvtxs = snvtxs;
+    sgraphs[iii].nedges = snedges;
+    sgraphs[iii].ncon = 1;
+
+    if (snvtxs < MMDSWITCH)
+      sgraphs[iii].adjwgt = NULL;  /* A marker to call MMD on the driver */
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->SplitTmr));
+
+  idxwspacefree(ctrl, nvtxs);
+
+  return ncmps;
+
+}
+
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/parmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/parmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/parmetis.c	(revision 9501)
@@ -0,0 +1,371 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * parmetis.c
+ *
+ * This file contains top level routines that are used by ParMETIS
+ *
+ * Started 10/14/97
+ * George
+ *
+ * $Id: parmetis.c,v 1.1 1998/11/27 17:59:27 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point for KMETIS with seed specification
+* in options[7] 
+**************************************************************************/
+void METIS_PartGraphKway2(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                         idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, 
+                         int *options, int *edgecut, idxtype *part)
+{
+  int i;
+  float *tpwgts;
+
+  tpwgts = fmalloc(*nparts, "KMETIS: tpwgts");
+  for (i=0; i<*nparts; i++) 
+    tpwgts[i] = 1.0/(1.0*(*nparts));
+
+  METIS_WPartGraphKway2(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, 
+                       tpwgts, options, edgecut, part);
+
+  free(tpwgts);
+}
+
+
+/*************************************************************************
+* This function is the entry point for KWMETIS with seed specification
+* in options[7] 
+**************************************************************************/
+void METIS_WPartGraphKway2(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                          idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, 
+                          float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  SetUpGraph(&graph, OP_KMETIS, *nvtxs, 1, xadj, adjncy, vwgt, adjwgt, *wgtflag);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = KMETIS_CTYPE;
+    ctrl.IType = KMETIS_ITYPE;
+    ctrl.RType = KMETIS_RTYPE;
+    ctrl.dbglvl = KMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_KMETIS;
+  ctrl.CoarsenTo = 20*(*nparts);
+  ctrl.maxvwgt = 1.5*((graph.vwgt ? idxsum(*nvtxs, graph.vwgt) : (*nvtxs))/ctrl.CoarsenTo);
+
+  InitRandom(options[7]);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *edgecut = MlevelKWayPartitioning(&ctrl, &graph, *nparts, part, tpwgts, 1.03);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (*numflag == 1)
+    Change2FNumbering(*nvtxs, xadj, adjncy, part);
+}
+
+
+/*************************************************************************
+* This function is the entry point for the node ND code for ParMETIS
+**************************************************************************/
+void METIS_NodeNDP(int nvtxs, idxtype *xadj, idxtype *adjncy, int npes, 
+                   int *options, idxtype *perm, idxtype *iperm, idxtype *sizes) 
+{
+  int i, ii, j, l, wflag, nflag;
+  GraphType graph;
+  CtrlType ctrl;
+  idxtype *cptr, *cind;
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType   = ONMETIS_CTYPE;
+    ctrl.IType   = ONMETIS_ITYPE;
+    ctrl.RType   = ONMETIS_RTYPE;
+    ctrl.dbglvl  = ONMETIS_DBGLVL;
+    ctrl.oflags  = ONMETIS_OFLAGS;
+    ctrl.pfactor = ONMETIS_PFACTOR;
+    ctrl.nseps   = ONMETIS_NSEPS;
+  }
+  else {
+    ctrl.CType   = options[OPTION_CTYPE];
+    ctrl.IType   = options[OPTION_ITYPE];
+    ctrl.RType   = options[OPTION_RTYPE];
+    ctrl.dbglvl  = options[OPTION_DBGLVL];
+    ctrl.oflags  = options[OPTION_OFLAGS];
+    ctrl.pfactor = options[OPTION_PFACTOR];
+    ctrl.nseps   = options[OPTION_NSEPS];
+  }
+  if (ctrl.nseps < 1)
+    ctrl.nseps = 1;
+
+  ctrl.optype = OP_ONMETIS;
+  ctrl.CoarsenTo = 100;
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  InitRandom(-1);
+
+  if (ctrl.oflags&OFLAG_COMPRESS) {
+    /*============================================================
+    * Compress the graph 
+    ==============================================================*/
+    cptr = idxmalloc(nvtxs+1, "ONMETIS: cptr");
+    cind = idxmalloc(nvtxs, "ONMETIS: cind");
+
+    CompressGraph(&ctrl, &graph, nvtxs, xadj, adjncy, cptr, cind);
+
+    if (graph.nvtxs >= COMPRESSION_FRACTION*(nvtxs)) {
+      ctrl.oflags--; /* We actually performed no compression */
+      GKfree(&cptr, &cind, LTERM);
+    }
+    else if (2*graph.nvtxs < nvtxs && ctrl.nseps == 1)
+      ctrl.nseps = 2;
+  }
+  else {
+    SetUpGraph(&graph, OP_ONMETIS, nvtxs, 1, xadj, adjncy, NULL, NULL, 0);
+  }
+
+
+  /*=============================================================
+  * Do the nested dissection ordering 
+  --=============================================================*/
+  ctrl.maxvwgt = 1.5*(idxsum(graph.nvtxs, graph.vwgt)/ctrl.CoarsenTo);
+  AllocateWorkSpace(&ctrl, &graph, 2);
+
+  idxset(2*npes-1, 0, sizes);
+  MlevelNestedDissectionP(&ctrl, &graph, iperm, graph.nvtxs, npes, 0, sizes);
+
+  FreeWorkSpace(&ctrl, &graph);
+
+  if (ctrl.oflags&OFLAG_COMPRESS) { /* Uncompress the ordering */
+    if (graph.nvtxs < COMPRESSION_FRACTION*(nvtxs)) { 
+      /* construct perm from iperm */
+      for (i=0; i<graph.nvtxs; i++)
+        perm[iperm[i]] = i; 
+      for (l=ii=0; ii<graph.nvtxs; ii++) {
+        i = perm[ii];
+        for (j=cptr[i]; j<cptr[i+1]; j++)
+          iperm[cind[j]] = l++;
+      }
+    }
+
+    GKfree(&cptr, &cind, LTERM);
+  }
+
+
+  for (i=0; i<nvtxs; i++)
+    perm[iperm[i]] = i;
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+}
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+void MlevelNestedDissectionP(CtrlType *ctrl, GraphType *graph, idxtype *order, int lastvtx, 
+                             int npes, int cpos, idxtype *sizes)
+{
+  int i, j, nvtxs, nbnd, tvwgt, tpwgts2[2];
+  idxtype *label, *bndind;
+  GraphType lgraph, rgraph;
+  float ubfactor;
+
+  nvtxs = graph->nvtxs;
+
+  if (nvtxs == 0) {
+    GKfree(&graph->gdata, &graph->rdata, &graph->label, LTERM);
+    return;
+  }
+
+  /* Determine the weights of the partitions */
+  tvwgt = idxsum(nvtxs, graph->vwgt);
+  tpwgts2[0] = tvwgt/2;
+  tpwgts2[1] = tvwgt-tpwgts2[0];
+
+  if (cpos >= npes-1) 
+    ubfactor = ORDER_UNBALANCE_FRACTION;
+  else 
+    ubfactor = 1.05;
+
+
+  MlevelNodeBisectionMultiple(ctrl, graph, tpwgts2, ubfactor);
+
+  IFSET(ctrl->dbglvl, DBG_SEPINFO, printf("Nvtxs: %6d, [%6d %6d %6d]\n", graph->nvtxs, graph->pwgts[0], graph->pwgts[1], graph->pwgts[2]));
+
+  if (cpos < npes-1) {
+    sizes[2*npes-2-cpos] = graph->pwgts[2];
+    sizes[2*npes-2-(2*cpos+1)] = graph->pwgts[1];
+    sizes[2*npes-2-(2*cpos+2)] = graph->pwgts[0];
+  }
+
+  /* Order the nodes in the separator */
+  nbnd = graph->nbnd;
+  bndind = graph->bndind;
+  label = graph->label;
+  for (i=0; i<nbnd; i++) 
+    order[label[bndind[i]]] = --lastvtx;
+
+  SplitGraphOrder(ctrl, graph, &lgraph, &rgraph);
+
+  /* Free the memory of the top level graph */
+  GKfree(&graph->gdata, &graph->rdata, &graph->label, LTERM);
+
+  if (rgraph.nvtxs > MMDSWITCH || 2*cpos+1 < npes-1) 
+    MlevelNestedDissectionP(ctrl, &rgraph, order, lastvtx, npes, 2*cpos+1, sizes);
+  else {
+    MMDOrder(ctrl, &rgraph, order, lastvtx); 
+    GKfree(&rgraph.gdata, &rgraph.rdata, &rgraph.label, LTERM);
+  }
+  if (lgraph.nvtxs > MMDSWITCH || 2*cpos+2 < npes-1) 
+    MlevelNestedDissectionP(ctrl, &lgraph, order, lastvtx-rgraph.nvtxs, npes, 2*cpos+2, sizes);
+  else {
+    MMDOrder(ctrl, &lgraph, order, lastvtx-rgraph.nvtxs); 
+    GKfree(&lgraph.gdata, &lgraph.rdata, &lgraph.label, LTERM);
+  }
+}
+
+
+
+
+/*************************************************************************
+* This function is the entry point for ONWMETIS. It requires weights on the
+* vertices. It is for the case that the matrix has been pre-compressed.
+**************************************************************************/
+void METIS_NodeComputeSeparator(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+           idxtype *adjwgt, int *options, int *sepsize, idxtype *part) 
+{
+  int i, j, tvwgt, tpwgts[2];
+  GraphType graph;
+  CtrlType ctrl;
+
+  SetUpGraph(&graph, OP_ONMETIS, *nvtxs, 1, xadj, adjncy, vwgt, adjwgt, 3);
+  tvwgt = idxsum(*nvtxs, graph.vwgt);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = ONMETIS_CTYPE;
+    ctrl.IType = ONMETIS_ITYPE;
+    ctrl.RType = ONMETIS_RTYPE;
+    ctrl.dbglvl = ONMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+
+  ctrl.oflags  = 0;
+  ctrl.pfactor = 0;
+  ctrl.nseps = 1;
+  ctrl.optype = OP_ONMETIS;
+  ctrl.CoarsenTo = amin(100, *nvtxs-1);
+  ctrl.maxvwgt = 1.5*tvwgt/ctrl.CoarsenTo;
+
+  InitRandom(options[7]);
+
+  AllocateWorkSpace(&ctrl, &graph, 2);
+
+  /*============================================================
+   * Perform the bisection
+   *============================================================*/ 
+  tpwgts[0] = tvwgt/2;
+  tpwgts[1] = tvwgt-tpwgts[0];
+
+  MlevelNodeBisectionMultiple(&ctrl, &graph, tpwgts, 1.05);
+
+  *sepsize = graph.pwgts[2];
+  idxcopy(*nvtxs, graph.where, part);
+
+  GKfree(&graph.gdata, &graph.rdata, &graph.label, LTERM);
+
+
+  FreeWorkSpace(&ctrl, &graph);
+
+}
+
+
+
+/*************************************************************************
+* This function is the entry point for ONWMETIS. It requires weights on the
+* vertices. It is for the case that the matrix has been pre-compressed.
+**************************************************************************/
+void METIS_EdgeComputeSeparator(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+           idxtype *adjwgt, int *options, int *sepsize, idxtype *part) 
+{
+  int i, j, tvwgt, tpwgts[2];
+  GraphType graph;
+  CtrlType ctrl;
+
+  SetUpGraph(&graph, OP_ONMETIS, *nvtxs, 1, xadj, adjncy, vwgt, adjwgt, 3);
+  tvwgt = idxsum(*nvtxs, graph.vwgt);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = ONMETIS_CTYPE;
+    ctrl.IType = ONMETIS_ITYPE;
+    ctrl.RType = ONMETIS_RTYPE;
+    ctrl.dbglvl = ONMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+
+  ctrl.oflags  = 0;
+  ctrl.pfactor = 0;
+  ctrl.nseps = 1;
+  ctrl.optype = OP_OEMETIS;
+  ctrl.CoarsenTo = amin(100, *nvtxs-1);
+  ctrl.maxvwgt = 1.5*tvwgt/ctrl.CoarsenTo;
+
+  InitRandom(options[7]);
+
+  AllocateWorkSpace(&ctrl, &graph, 2);
+
+  /*============================================================
+   * Perform the bisection
+   *============================================================*/ 
+  tpwgts[0] = tvwgt/2;
+  tpwgts[1] = tvwgt-tpwgts[0];
+
+  MlevelEdgeBisection(&ctrl, &graph, tpwgts, 1.05);
+  ConstructMinCoverSeparator(&ctrl, &graph, 1.05);
+
+  *sepsize = graph.pwgts[2];
+  idxcopy(*nvtxs, graph.where, part);
+
+  GKfree(&graph.gdata, &graph.rdata, &graph.label, LTERM);
+
+
+  FreeWorkSpace(&ctrl, &graph);
+
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/pmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/pmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/pmetis.c	(revision 9501)
@@ -0,0 +1,341 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * pmetis.c
+ *
+ * This file contains the top level routines for the multilevel recursive
+ * bisection algorithm PMETIS.
+ *
+ * Started 7/24/97
+ * George
+ *
+ * $Id: pmetis.c,v 1.1 1998/11/27 17:59:28 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point for PMETIS
+**************************************************************************/
+void METIS_PartGraphRecursive(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                              idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, 
+                              int *options, int *edgecut, idxtype *part)
+{
+  int i;
+  float *tpwgts;
+
+  tpwgts = fmalloc(*nparts, "KMETIS: tpwgts");
+  for (i=0; i<*nparts; i++) 
+    tpwgts[i] = 1.0/(1.0*(*nparts));
+
+  METIS_WPartGraphRecursive(nvtxs, xadj, adjncy, vwgt, adjwgt, wgtflag, numflag, nparts, 
+                            tpwgts, options, edgecut, part);
+
+  free(tpwgts);
+}
+
+
+
+/*************************************************************************
+* This function is the entry point for PWMETIS that accepts exact weights
+* for the target partitions
+**************************************************************************/
+void METIS_WPartGraphRecursive(int *nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                               idxtype *adjwgt, int *wgtflag, int *numflag, int *nparts, 
+                               float *tpwgts, int *options, int *edgecut, idxtype *part)
+{
+  int i, j;
+  GraphType graph;
+  CtrlType ctrl;
+  float *mytpwgts;
+
+  if (*numflag == 1)
+    Change2CNumbering(*nvtxs, xadj, adjncy);
+
+  SetUpGraph(&graph, OP_PMETIS, *nvtxs, 1, xadj, adjncy, vwgt, adjwgt, *wgtflag);
+
+  if (options[0] == 0) {  /* Use the default parameters */
+    ctrl.CType = PMETIS_CTYPE;
+    ctrl.IType = PMETIS_ITYPE;
+    ctrl.RType = PMETIS_RTYPE;
+    ctrl.dbglvl = PMETIS_DBGLVL;
+  }
+  else {
+    ctrl.CType = options[OPTION_CTYPE];
+    ctrl.IType = options[OPTION_ITYPE];
+    ctrl.RType = options[OPTION_RTYPE];
+    ctrl.dbglvl = options[OPTION_DBGLVL];
+  }
+  ctrl.optype = OP_PMETIS;
+  ctrl.CoarsenTo = 20;
+  ctrl.maxvwgt = 1.5*(idxsum(*nvtxs, graph.vwgt)/ctrl.CoarsenTo);
+
+  mytpwgts = fmalloc(*nparts, "PWMETIS: mytpwgts");
+  for (i=0; i<*nparts; i++) 
+    mytpwgts[i] = tpwgts[i];
+
+  InitRandom(-1);
+
+  AllocateWorkSpace(&ctrl, &graph, *nparts);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, InitTimers(&ctrl));
+  IFSET(ctrl.dbglvl, DBG_TIME, starttimer(ctrl.TotalTmr));
+
+  *edgecut = MlevelRecursiveBisection(&ctrl, &graph, *nparts, part, mytpwgts, 1.000, 0);
+
+  IFSET(ctrl.dbglvl, DBG_TIME, stoptimer(ctrl.TotalTmr));
+  IFSET(ctrl.dbglvl, DBG_TIME, PrintTimers(&ctrl));
+
+  FreeWorkSpace(&ctrl, &graph);
+  free(mytpwgts);
+
+  if (*numflag == 1)
+    Change2FNumbering(*nvtxs, xadj, adjncy, part);
+}
+
+
+
+/*************************************************************************
+* This function takes a graph and produces a bisection of it
+**************************************************************************/
+int MlevelRecursiveBisection(CtrlType *ctrl, GraphType *graph, int nparts, idxtype *part, float *tpwgts, float ubfactor, int fpart)
+{
+  int i, j, nvtxs, cut, tvwgt, tpwgts2[2];
+  idxtype *label, *where;
+  GraphType lgraph, rgraph;
+  float wsum;
+
+  nvtxs = graph->nvtxs;
+  if (nvtxs == 0) {
+    printf("\t***Cannot bisect a graph with 0 vertices!\n\t***You are trying to partition a graph into too many parts!\n");
+    return 0;
+  }
+
+  /* Determine the weights of the partitions */
+  tvwgt = idxsum(nvtxs, graph->vwgt);
+  tpwgts2[0] = tvwgt*ssum(nparts/2, tpwgts);
+  tpwgts2[1] = tvwgt-tpwgts2[0];
+
+  MlevelEdgeBisection(ctrl, graph, tpwgts2, ubfactor);
+  cut = graph->mincut;
+
+  /* printf("%5d %5d %5d [%5d %f]\n", tpwgts2[0], tpwgts2[1], cut, tvwgt, ssum(nparts/2, tpwgts));*/
+
+  label = graph->label;
+  where = graph->where;
+  for (i=0; i<nvtxs; i++)
+    part[label[i]] = where[i] + fpart;
+
+  if (nparts > 2) {
+    SplitGraphPart(ctrl, graph, &lgraph, &rgraph);
+    /* printf("%d %d\n", lgraph.nvtxs, rgraph.nvtxs); */
+  }
+
+
+  /* Free the memory of the top level graph */
+  GKfree(&graph->gdata, &graph->rdata, &graph->label, LTERM);
+
+  /* Scale the fractions in the tpwgts according to the true weight */
+  wsum = ssum(nparts/2, tpwgts);
+  sscale(nparts/2, 1.0/wsum, tpwgts);
+  sscale(nparts-nparts/2, 1.0/(1.0-wsum), tpwgts+nparts/2);
+  /*
+  for (i=0; i<nparts; i++)
+    printf("%5.3f ", tpwgts[i]);
+  printf("[%5.3f]\n", wsum);
+  */
+
+  /* Do the recursive call */
+  if (nparts > 3) {
+    cut += MlevelRecursiveBisection(ctrl, &lgraph, nparts/2, part, tpwgts, ubfactor, fpart);
+    cut += MlevelRecursiveBisection(ctrl, &rgraph, nparts-nparts/2, part, tpwgts+nparts/2, ubfactor, fpart+nparts/2);
+  }
+  else if (nparts == 3) {
+    cut += MlevelRecursiveBisection(ctrl, &rgraph, nparts-nparts/2, part, tpwgts+nparts/2, ubfactor, fpart+nparts/2);
+    GKfree(&lgraph.gdata, &lgraph.label, LTERM);
+  }
+
+  return cut;
+
+}
+
+
+/*************************************************************************
+* This function performs multilevel bisection
+**************************************************************************/
+void MlevelEdgeBisection(CtrlType *ctrl, GraphType *graph, int *tpwgts, float ubfactor)
+{
+  GraphType *cgraph;
+
+  cgraph = Coarsen2Way(ctrl, graph);
+
+  Init2WayPartition(ctrl, cgraph, tpwgts, ubfactor);
+
+  Refine2Way(ctrl, graph, cgraph, tpwgts, ubfactor);
+
+/*
+  IsConnectedSubdomain(ctrl, graph, 0);
+  IsConnectedSubdomain(ctrl, graph, 1);
+*/
+}
+
+
+
+
+/*************************************************************************
+* This function takes a graph and a bisection and splits it into two graphs.
+**************************************************************************/
+void SplitGraphPart(CtrlType *ctrl, GraphType *graph, GraphType *lgraph, GraphType *rgraph)
+{
+  int i, j, k, kk, l, istart, iend, mypart, nvtxs, ncon, snvtxs[2], snedges[2], sum;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *adjwgtsum, *label, *where, *bndptr;
+  idxtype *sxadj[2], *svwgt[2], *sadjncy[2], *sadjwgt[2], *sadjwgtsum[2], *slabel[2];
+  idxtype *rename;
+  idxtype *auxadjncy, *auxadjwgt;
+  float *nvwgt, *snvwgt[2], *npwgts;
+
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->SplitTmr));
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  nvwgt = graph->nvwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+  label = graph->label;
+  where = graph->where;
+  bndptr = graph->bndptr;
+  npwgts = graph->npwgts;
+
+  ASSERT(bndptr != NULL);
+
+  rename = idxwspacemalloc(ctrl, nvtxs);
+  
+  snvtxs[0] = snvtxs[1] = snedges[0] = snedges[1] = 0;
+  for (i=0; i<nvtxs; i++) {
+    k = where[i];
+    rename[i] = snvtxs[k]++;
+    snedges[k] += xadj[i+1]-xadj[i];
+  }
+
+  SetUpSplitGraph(graph, lgraph, snvtxs[0], snedges[0]);
+  sxadj[0] = lgraph->xadj;
+  svwgt[0] = lgraph->vwgt;
+  snvwgt[0] = lgraph->nvwgt;
+  sadjwgtsum[0] = lgraph->adjwgtsum;
+  sadjncy[0] = lgraph->adjncy; 	
+  sadjwgt[0] = lgraph->adjwgt; 
+  slabel[0] = lgraph->label;
+
+  SetUpSplitGraph(graph, rgraph, snvtxs[1], snedges[1]);
+  sxadj[1] = rgraph->xadj;
+  svwgt[1] = rgraph->vwgt;
+  snvwgt[1] = rgraph->nvwgt;
+  sadjwgtsum[1] = rgraph->adjwgtsum;
+  sadjncy[1] = rgraph->adjncy; 	
+  sadjwgt[1] = rgraph->adjwgt; 
+  slabel[1] = rgraph->label;
+
+  snvtxs[0] = snvtxs[1] = snedges[0] = snedges[1] = 0;
+  sxadj[0][0] = sxadj[1][0] = 0;
+  for (i=0; i<nvtxs; i++) {
+    mypart = where[i];
+    sum = adjwgtsum[i];
+
+    istart = xadj[i];
+    iend = xadj[i+1];
+    if (bndptr[i] == -1) { /* This is an interior vertex */
+      auxadjncy = sadjncy[mypart] + snedges[mypart] - istart;
+      auxadjwgt = sadjwgt[mypart] + snedges[mypart] - istart;
+      for(j=istart; j<iend; j++) {
+        auxadjncy[j] = adjncy[j];
+        auxadjwgt[j] = adjwgt[j]; 
+      }
+      snedges[mypart] += iend-istart;
+    }
+    else {
+      auxadjncy = sadjncy[mypart];
+      auxadjwgt = sadjwgt[mypart];
+      l = snedges[mypart];
+      for (j=istart; j<iend; j++) {
+        k = adjncy[j];
+        if (where[k] == mypart) {
+          auxadjncy[l] = k;
+          auxadjwgt[l++] = adjwgt[j]; 
+        }
+        else {
+          sum -= adjwgt[j];
+        }
+      }
+      snedges[mypart] = l;
+    }
+
+    if (ncon == 1)
+      svwgt[mypart][snvtxs[mypart]] = vwgt[i];
+    else {
+      for (kk=0; kk<ncon; kk++)
+        snvwgt[mypart][snvtxs[mypart]*ncon+kk] = nvwgt[i*ncon+kk]/npwgts[mypart*ncon+kk];
+    }
+
+    sadjwgtsum[mypart][snvtxs[mypart]] = sum;
+    slabel[mypart][snvtxs[mypart]] = label[i];
+    sxadj[mypart][++snvtxs[mypart]] = snedges[mypart];
+  }
+
+  for (mypart=0; mypart<2; mypart++) {
+    iend = sxadj[mypart][snvtxs[mypart]];
+    auxadjncy = sadjncy[mypart];
+    for (i=0; i<iend; i++) 
+      auxadjncy[i] = rename[auxadjncy[i]];
+  }
+
+  lgraph->nedges = snedges[0];
+  rgraph->nedges = snedges[1];
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->SplitTmr));
+
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+/*************************************************************************
+* Setup the various arrays for the splitted graph
+**************************************************************************/
+void SetUpSplitGraph(GraphType *graph, GraphType *sgraph, int snvtxs, int snedges)
+{
+  InitGraph(sgraph);
+  sgraph->nvtxs = snvtxs;
+  sgraph->nedges = snedges;
+  sgraph->ncon = graph->ncon;
+
+  /* Allocate memory for the splitted graph */
+  if (graph->ncon == 1) {
+    sgraph->gdata = idxmalloc(4*snvtxs+1 + 2*snedges, "SetUpSplitGraph: gdata");
+
+    sgraph->xadj        = sgraph->gdata;
+    sgraph->vwgt        = sgraph->gdata + snvtxs+1;
+    sgraph->adjwgtsum   = sgraph->gdata + 2*snvtxs+1;
+    sgraph->cmap        = sgraph->gdata + 3*snvtxs+1;
+    sgraph->adjncy      = sgraph->gdata + 4*snvtxs+1;
+    sgraph->adjwgt      = sgraph->gdata + 4*snvtxs+1 + snedges;
+  }
+  else {
+    sgraph->gdata = idxmalloc(3*snvtxs+1 + 2*snedges, "SetUpSplitGraph: gdata");
+
+    sgraph->xadj        = sgraph->gdata;
+    sgraph->adjwgtsum   = sgraph->gdata + snvtxs+1;
+    sgraph->cmap        = sgraph->gdata + 2*snvtxs+1;
+    sgraph->adjncy      = sgraph->gdata + 3*snvtxs+1;
+    sgraph->adjwgt      = sgraph->gdata + 3*snvtxs+1 + snedges;
+
+    sgraph->nvwgt       = fmalloc(graph->ncon*snvtxs, "SetUpSplitGraph: nvwgt");
+  }
+
+  sgraph->label	= idxmalloc(snvtxs, "SetUpSplitGraph: sgraph->label");
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/pqueue.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/pqueue.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/pqueue.c	(revision 9501)
@@ -0,0 +1,579 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * pqueue.c
+ *
+ * This file contains functions for manipulating the bucket list
+ * representation of the gains associated with each vertex in a graph.
+ * These functions are used by the refinement algorithms
+ *
+ * Started 9/2/94
+ * George
+ *
+ * $Id: pqueue.c,v 1.1 1998/11/27 17:59:28 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function initializes the data structures of the priority queue
+**************************************************************************/
+void PQueueInit(CtrlType *ctrl, PQueueType *queue, int maxnodes, int maxgain)
+{
+  int i, j, ncore;
+
+  queue->nnodes = 0;
+  queue->maxnodes = maxnodes;
+
+  queue->buckets = NULL;
+  queue->nodes = NULL;
+  queue->heap = NULL;
+  queue->locator = NULL;
+
+  if (maxgain > PLUS_GAINSPAN || maxnodes < 500)
+    queue->type = 2;
+  else
+    queue->type = 1;
+
+  if (queue->type == 1) {
+    queue->pgainspan = amin(PLUS_GAINSPAN, maxgain);
+    queue->ngainspan = amin(NEG_GAINSPAN, maxgain);
+
+    j = queue->ngainspan+queue->pgainspan+1;
+
+    ncore = 2 + (sizeof(ListNodeType)/sizeof(idxtype))*maxnodes + (sizeof(ListNodeType *)/sizeof(idxtype))*j;
+
+    if (WspaceAvail(ctrl) > ncore) {
+      queue->nodes = (ListNodeType *)idxwspacemalloc(ctrl, (sizeof(ListNodeType)/sizeof(idxtype))*maxnodes);
+      queue->buckets = (ListNodeType **)idxwspacemalloc(ctrl, (sizeof(ListNodeType *)/sizeof(idxtype))*j);
+      queue->mustfree = 0;
+    }
+    else { /* Not enough memory in the wspace, allocate it */
+      queue->nodes = (ListNodeType *)idxmalloc((sizeof(ListNodeType)/sizeof(idxtype))*maxnodes, "PQueueInit: queue->nodes");
+      queue->buckets = (ListNodeType **)idxmalloc((sizeof(ListNodeType *)/sizeof(idxtype))*j, "PQueueInit: queue->buckets");
+      queue->mustfree = 1;
+    }
+
+    for (i=0; i<maxnodes; i++) 
+      queue->nodes[i].id = i;
+
+    for (i=0; i<j; i++)
+      queue->buckets[i] = NULL;
+
+    queue->buckets += queue->ngainspan;  /* Advance buckets by the ngainspan proper indexing */
+    queue->maxgain = -queue->ngainspan;
+  }
+  else {
+    queue->heap = (KeyValueType *)idxwspacemalloc(ctrl, (sizeof(KeyValueType)/sizeof(idxtype))*maxnodes);
+    queue->locator = idxwspacemalloc(ctrl, maxnodes);
+    idxset(maxnodes, -1, queue->locator);
+  }
+
+}
+
+
+/*************************************************************************
+* This function resets the buckets
+**************************************************************************/
+void PQueueReset(PQueueType *queue)
+{
+  int i, j;
+  queue->nnodes = 0;
+
+  if (queue->type == 1) {
+    queue->maxgain = -queue->ngainspan;
+
+    j = queue->ngainspan+queue->pgainspan+1;
+    queue->buckets -= queue->ngainspan;  
+    for (i=0; i<j; i++)
+      queue->buckets[i] = NULL;
+    queue->buckets += queue->ngainspan;  
+  }
+  else {
+    idxset(queue->maxnodes, -1, queue->locator);
+  }
+
+}
+
+
+/*************************************************************************
+* This function frees the buckets
+**************************************************************************/
+void PQueueFree(CtrlType *ctrl, PQueueType *queue)
+{
+
+  if (queue->type == 1) {
+    if (queue->mustfree) {
+      queue->buckets -= queue->ngainspan;  
+      GKfree(&queue->nodes, &queue->buckets, LTERM);
+    } 
+    else {
+      idxwspacefree(ctrl, sizeof(ListNodeType *)*(queue->ngainspan+queue->pgainspan+1)/sizeof(idxtype));
+      idxwspacefree(ctrl, sizeof(ListNodeType)*queue->maxnodes/sizeof(idxtype));
+    }
+  }
+  else {
+    idxwspacefree(ctrl, sizeof(KeyValueType)*queue->maxnodes/sizeof(idxtype));
+    idxwspacefree(ctrl, queue->maxnodes);
+  }
+
+  queue->maxnodes = 0;
+}
+
+
+/*************************************************************************
+* This function returns the number of nodes in the queue
+**************************************************************************/
+int PQueueGetSize(PQueueType *queue)
+{
+  return queue->nnodes;
+}
+
+
+/*************************************************************************
+* This function adds a node of certain gain into a partition
+**************************************************************************/
+int PQueueInsert(PQueueType *queue, int node, int gain)
+{
+  int i, j, k;
+  idxtype *locator;
+  ListNodeType *newnode;
+  KeyValueType *heap;
+
+  if (queue->type == 1) {
+    ASSERT(gain >= -queue->ngainspan && gain <= queue->pgainspan);
+
+    /* Allocate and add the node */
+    queue->nnodes++;
+    newnode = queue->nodes + node;
+
+    /* Attach this node in the doubly-linked list */
+    newnode->next = queue->buckets[gain];
+    newnode->prev = NULL;
+    if (newnode->next != NULL)
+      newnode->next->prev = newnode;
+    queue->buckets[gain] = newnode;
+
+    if (queue->maxgain < gain)
+      queue->maxgain = gain;
+  }
+  else {
+    ASSERT(CheckHeap(queue));
+
+    heap = queue->heap;
+    locator = queue->locator;
+
+    ASSERT(locator[node] == -1);
+
+    i = queue->nnodes++;
+    while (i > 0) {
+      j = (i-1)/2;
+      if (heap[j].key < gain) {
+        heap[i] = heap[j];
+        locator[heap[i].val] = i;
+        i = j;
+      }
+      else 
+        break;
+    }
+    ASSERT(i >= 0);
+    heap[i].key = gain;
+    heap[i].val = node;
+    locator[node] = i;
+
+    ASSERT(CheckHeap(queue));
+  }
+
+  return 0;
+}
+
+
+/*************************************************************************
+* This function deletes a node from a partition and reinserts it with
+* an updated gain
+**************************************************************************/
+int PQueueDelete(PQueueType *queue, int node, int gain)
+{
+  int i, j, newgain, oldgain;
+  idxtype *locator;
+  ListNodeType *newnode, **buckets;
+  KeyValueType *heap;
+
+  if (queue->type == 1) {
+    ASSERT(gain >= -queue->ngainspan && gain <= queue->pgainspan);
+    ASSERT(queue->nnodes > 0);
+
+    buckets = queue->buckets;
+    queue->nnodes--;
+    newnode = queue->nodes+node;
+
+    /* Remove newnode from the doubly-linked list */
+    if (newnode->prev != NULL)
+      newnode->prev->next = newnode->next;
+    else
+      buckets[gain] = newnode->next;
+    if (newnode->next != NULL)
+      newnode->next->prev = newnode->prev;
+
+    if (buckets[gain] == NULL && gain == queue->maxgain) {
+      if (queue->nnodes == 0) 
+        queue->maxgain = -queue->ngainspan;
+      else 
+        for (; buckets[queue->maxgain]==NULL; queue->maxgain--);
+    }
+  }
+  else { /* Heap Priority Queue */
+    heap = queue->heap;
+    locator = queue->locator;
+
+    ASSERT(locator[node] != -1);
+    ASSERT(heap[locator[node]].val == node);
+
+    ASSERT(CheckHeap(queue));
+
+    i = locator[node];
+    locator[node] = -1;
+
+    if (--queue->nnodes > 0 && heap[queue->nnodes].val != node) {
+      node = heap[queue->nnodes].val;
+      newgain = heap[queue->nnodes].key;
+      oldgain = heap[i].key;
+
+      if (oldgain < newgain) { /* Filter-up */
+        while (i > 0) {
+          j = (i-1)>>1;
+          if (heap[j].key < newgain) {
+            heap[i] = heap[j];
+            locator[heap[i].val] = i;
+            i = j;
+          }
+          else 
+            break;
+        }
+      }
+      else { /* Filter down */
+        while ((j=2*i+1) < queue->nnodes) {
+          if (heap[j].key > newgain) {
+            if (j+1 < queue->nnodes && heap[j+1].key > heap[j].key)
+              j = j+1;
+            heap[i] = heap[j];
+            locator[heap[i].val] = i;
+            i = j;
+          }
+          else if (j+1 < queue->nnodes && heap[j+1].key > newgain) {
+            j = j+1;
+            heap[i] = heap[j];
+            locator[heap[i].val] = i;
+            i = j;
+          }
+          else
+            break;
+        }
+      }
+
+      heap[i].key = newgain;
+      heap[i].val = node;
+      locator[node] = i;
+    }
+
+    ASSERT(CheckHeap(queue));
+  }
+
+  return 0;
+}
+
+
+
+/*************************************************************************
+* This function deletes a node from a partition and reinserts it with
+* an updated gain
+**************************************************************************/
+int PQueueUpdate(PQueueType *queue, int node, int oldgain, int newgain)
+{
+  int i, j;
+  idxtype *locator;
+  ListNodeType *newnode;
+  KeyValueType *heap;
+
+  if (oldgain == newgain) 
+    return 0;
+
+  if (queue->type == 1) {
+    /* First delete the node and then insert it */
+    PQueueDelete(queue, node, oldgain);
+    return PQueueInsert(queue, node, newgain);
+  }
+  else { /* Heap Priority Queue */
+    heap = queue->heap;
+    locator = queue->locator;
+
+    ASSERT(locator[node] != -1);
+    ASSERT(heap[locator[node]].val == node);
+    ASSERT(heap[locator[node]].key == oldgain);
+    ASSERT(CheckHeap(queue));
+
+    i = locator[node];
+
+    if (oldgain < newgain) { /* Filter-up */
+      while (i > 0) {
+        j = (i-1)>>1;
+        if (heap[j].key < newgain) {
+          heap[i] = heap[j];
+          locator[heap[i].val] = i;
+          i = j;
+        }
+        else 
+          break;
+      }
+    }
+    else { /* Filter down */
+      while ((j=2*i+1) < queue->nnodes) {
+        if (heap[j].key > newgain) {
+          if (j+1 < queue->nnodes && heap[j+1].key > heap[j].key)
+            j = j+1;
+          heap[i] = heap[j];
+          locator[heap[i].val] = i;
+          i = j;
+        }
+        else if (j+1 < queue->nnodes && heap[j+1].key > newgain) {
+          j = j+1;
+          heap[i] = heap[j];
+          locator[heap[i].val] = i;
+          i = j;
+        }
+        else
+          break;
+      }
+    }
+
+    heap[i].key = newgain;
+    heap[i].val = node;
+    locator[node] = i;
+
+    ASSERT(CheckHeap(queue));
+  }
+
+  return 0;
+}
+
+
+
+/*************************************************************************
+* This function deletes a node from a partition and reinserts it with
+* an updated gain
+**************************************************************************/
+void PQueueUpdateUp(PQueueType *queue, int node, int oldgain, int newgain)
+{
+  int i, j;
+  idxtype *locator;
+  ListNodeType *newnode, **buckets;
+  KeyValueType *heap;
+
+  if (oldgain == newgain) 
+    return;
+
+  if (queue->type == 1) {
+    ASSERT(oldgain >= -queue->ngainspan && oldgain <= queue->pgainspan);
+    ASSERT(newgain >= -queue->ngainspan && newgain <= queue->pgainspan);
+    ASSERT(queue->nnodes > 0);
+
+    buckets = queue->buckets;
+    newnode = queue->nodes+node;
+
+    /* First delete the node */
+    if (newnode->prev != NULL)
+      newnode->prev->next = newnode->next;
+    else
+      buckets[oldgain] = newnode->next;
+    if (newnode->next != NULL)
+      newnode->next->prev = newnode->prev;
+
+    /* Attach this node in the doubly-linked list */
+    newnode->next = buckets[newgain];
+    newnode->prev = NULL;
+    if (newnode->next != NULL)
+      newnode->next->prev = newnode;
+    buckets[newgain] = newnode;
+
+    if (queue->maxgain < newgain)
+      queue->maxgain = newgain;
+  }
+  else { /* Heap Priority Queue */
+    heap = queue->heap;
+    locator = queue->locator;
+
+    ASSERT(locator[node] != -1);
+    ASSERT(heap[locator[node]].val == node);
+    ASSERT(heap[locator[node]].key == oldgain);
+    ASSERT(CheckHeap(queue));
+
+
+    /* Here we are just filtering up since the newgain is greater than the oldgain */
+    i = locator[node];
+    while (i > 0) {
+      j = (i-1)>>1;
+      if (heap[j].key < newgain) {
+        heap[i] = heap[j];
+        locator[heap[i].val] = i;
+        i = j;
+      }
+      else 
+        break;
+    }
+
+    heap[i].key = newgain;
+    heap[i].val = node;
+    locator[node] = i;
+
+    ASSERT(CheckHeap(queue));
+  }
+
+}
+
+
+/*************************************************************************
+* This function returns the vertex with the largest gain from a partition
+* and removes the node from the bucket list
+**************************************************************************/
+int PQueueGetMax(PQueueType *queue)
+{
+  int vtx, i, j, gain, node;
+  idxtype *locator;
+  ListNodeType *tptr;
+  KeyValueType *heap;
+
+  if (queue->nnodes == 0)
+    return -1;
+
+  queue->nnodes--;
+
+  if (queue->type == 1) {
+    tptr = queue->buckets[queue->maxgain];
+    queue->buckets[queue->maxgain] = tptr->next;
+    if (tptr->next != NULL) {
+      tptr->next->prev = NULL;
+    }
+    else {
+      if (queue->nnodes == 0) {
+        queue->maxgain = -queue->ngainspan;
+      }
+      else 
+        for (; queue->buckets[queue->maxgain]==NULL; queue->maxgain--);
+    }
+
+    return tptr->id;
+  }
+  else {
+    heap = queue->heap;
+    locator = queue->locator;
+
+    vtx = heap[0].val;
+    locator[vtx] = -1;
+
+    if ((i = queue->nnodes) > 0) {
+      gain = heap[i].key;
+      node = heap[i].val;
+      i = 0;
+      while ((j=2*i+1) < queue->nnodes) {
+        if (heap[j].key > gain) {
+          if (j+1 < queue->nnodes && heap[j+1].key > heap[j].key)
+            j = j+1;
+          heap[i] = heap[j];
+          locator[heap[i].val] = i;
+          i = j;
+        }
+        else if (j+1 < queue->nnodes && heap[j+1].key > gain) {
+          j = j+1;
+          heap[i] = heap[j];
+          locator[heap[i].val] = i;
+          i = j;
+        }
+        else
+          break;
+      }
+
+      heap[i].key = gain;
+      heap[i].val = node;
+      locator[node] = i;
+    }
+
+    ASSERT(CheckHeap(queue));
+    return vtx;
+  }
+}
+      
+
+/*************************************************************************
+* This function returns the vertex with the largest gain from a partition
+**************************************************************************/
+int PQueueSeeMax(PQueueType *queue)
+{
+  int vtx;
+
+  if (queue->nnodes == 0)
+    return -1;
+
+  if (queue->type == 1) 
+    vtx = queue->buckets[queue->maxgain]->id;
+  else
+    vtx = queue->heap[0].val;
+
+  return vtx;
+}
+      
+
+/*************************************************************************
+* This function returns the vertex with the largest gain from a partition
+**************************************************************************/
+int PQueueGetKey(PQueueType *queue)
+{
+  int key;
+
+  if (queue->nnodes == 0)
+    return -1;
+
+  if (queue->type == 1) 
+    key = queue->maxgain;
+  else
+    key = queue->heap[0].key;
+
+  return key;
+}
+      
+
+
+
+/*************************************************************************
+* This functions checks the consistency of the heap
+**************************************************************************/
+int CheckHeap(PQueueType *queue)
+{
+  int i, j, nnodes;
+  idxtype *locator;
+  KeyValueType *heap;
+
+  heap = queue->heap;
+  locator = queue->locator;
+  nnodes = queue->nnodes;
+
+  if (nnodes == 0)
+    return 1;
+
+  ASSERT(locator[heap[0].val] == 0);
+  for (i=1; i<nnodes; i++) {
+    ASSERTP(locator[heap[i].val] == i, ("%d %d %d %d\n", nnodes, i, heap[i].val, locator[heap[i].val])); 
+    ASSERTP(heap[i].key <= heap[(i-1)/2].key, ("%d %d %d %d %d\n", i, (i-1)/2, nnodes, heap[i].key, heap[(i-1)/2].key));
+  }
+  for (i=1; i<nnodes; i++)
+    ASSERT(heap[i].key <= heap[0].key);
+
+  for (j=i=0; i<queue->maxnodes; i++) {
+    if (locator[i] != -1)
+      j++;
+  }
+  ASSERTP(j == nnodes, ("%d %d\n", j, nnodes));
+
+  return 1;
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/proto.h
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/proto.h	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/proto.h	(revision 9501)
@@ -0,0 +1,505 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * proto.h
+ *
+ * This file contains header files
+ *
+ * Started 10/19/95
+ * George
+ *
+ * $Id: proto.h,v 1.1 1998/11/27 17:59:28 karypis Exp $
+ *
+ */
+
+/* balance.c */
+void Balance2Way(CtrlType *, GraphType *, int *, float);
+void Bnd2WayBalance(CtrlType *, GraphType *, int *);
+void General2WayBalance(CtrlType *, GraphType *, int *);
+
+/* bucketsort.c */
+void BucketSortKeysInc(int, int, idxtype *, idxtype *, idxtype *);
+
+/* ccgraph.c */
+void CreateCoarseGraph(CtrlType *, GraphType *, int, idxtype *, idxtype *);
+void CreateCoarseGraphNoMask(CtrlType *, GraphType *, int, idxtype *, idxtype *);
+void CreateCoarseGraph_NVW(CtrlType *, GraphType *, int, idxtype *, idxtype *);
+GraphType *SetUpCoarseGraph(GraphType *, int, int);
+void ReAdjustMemory(GraphType *, GraphType *, int);
+
+/* coarsen.c */
+GraphType *Coarsen2Way(CtrlType *, GraphType *);
+
+/* compress.c */
+void CompressGraph(CtrlType *, GraphType *, int, idxtype *, idxtype *, idxtype *, idxtype *);
+void PruneGraph(CtrlType *, GraphType *, int, idxtype *, idxtype *, idxtype *, float);
+
+/* debug.c */
+int ComputeCut(GraphType *, idxtype *);
+int CheckBnd(GraphType *);
+int CheckBnd2(GraphType *);
+int CheckNodeBnd(GraphType *, int);
+int CheckRInfo(RInfoType *);
+int CheckNodePartitionParams(GraphType *);
+int IsSeparable(GraphType *);
+
+/* estmem.c */
+void METIS_EstimateMemory(int *, idxtype *, idxtype *, int *, int *, int *);
+void EstimateCFraction(int, idxtype *, idxtype *, float *, float *);
+int ComputeCoarseGraphSize(int, idxtype *, idxtype *, int, idxtype *, idxtype *, idxtype *);
+
+/* fm.c */
+void FM_2WayEdgeRefine(CtrlType *, GraphType *, int *, int);
+
+/* fortran.c */
+void Change2CNumbering(int, idxtype *, idxtype *);
+void Change2FNumbering(int, idxtype *, idxtype *, idxtype *);
+void Change2FNumbering2(int, idxtype *, idxtype *);
+void Change2FNumberingOrder(int, idxtype *, idxtype *, idxtype *, idxtype *);
+void ChangeMesh2CNumbering(int, idxtype *);
+void ChangeMesh2FNumbering(int, idxtype *, int, idxtype *, idxtype *);
+void ChangeMesh2FNumbering2(int, idxtype *, int, int, idxtype *, idxtype *);
+
+/* frename.c */
+void METIS_PARTGRAPHRECURSIVE(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void metis_partgraphrecursive(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void metis_partgraphrecursive_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void metis_partgraphrecursive__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void METIS_WPARTGRAPHRECURSIVE(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void metis_wpartgraphrecursive(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void metis_wpartgraphrecursive_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void metis_wpartgraphrecursive__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void METIS_PARTGRAPHKWAY(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void metis_partgraphkway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void metis_partgraphkway_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void metis_partgraphkway__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void METIS_WPARTGRAPHKWAY(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void metis_wpartgraphkway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void metis_wpartgraphkway_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void metis_wpartgraphkway__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void METIS_EDGEND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_edgend(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_edgend_(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_edgend__(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void METIS_NODEND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_nodend(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_nodend_(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_nodend__(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void METIS_NODEWND(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_nodewnd(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_nodewnd_(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void metis_nodewnd__(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void METIS_PARTMESHNODAL(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void metis_partmeshnodal(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void metis_partmeshnodal_(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void metis_partmeshnodal__(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void METIS_PARTMESHDUAL(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void metis_partmeshdual(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void metis_partmeshdual_(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void metis_partmeshdual__(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void METIS_MESHTONODAL(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void metis_meshtonodal(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void metis_meshtonodal_(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void metis_meshtonodal__(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void METIS_MESHTODUAL(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void metis_meshtodual(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void metis_meshtodual_(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void metis_meshtodual__(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void METIS_ESTIMATEMEMORY(int *, idxtype *, idxtype *, int *, int *, int *);
+void metis_estimatememory(int *, idxtype *, idxtype *, int *, int *, int *);
+void metis_estimatememory_(int *, idxtype *, idxtype *, int *, int *, int *);
+void metis_estimatememory__(int *, idxtype *, idxtype *, int *, int *, int *);
+void METIS_MCPARTGRAPHRECURSIVE(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void metis_mcpartgraphrecursive(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void metis_mcpartgraphrecursive_(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void metis_mcpartgraphrecursive__(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void METIS_MCPARTGRAPHKWAY(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+void metis_mcpartgraphkway(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+void metis_mcpartgraphkway_(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+void metis_mcpartgraphkway__(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+void METIS_PARTGRAPHVKWAY(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void metis_partgraphvkway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void metis_partgraphvkway_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void metis_partgraphvkway__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void METIS_WPARTGRAPHVKWAY(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+void metis_wpartgraphvkway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+void metis_wpartgraphvkway_(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+void metis_wpartgraphvkway__(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+
+/* graph.c */
+void SetUpGraph(GraphType *, int, int, int, idxtype *, idxtype *, idxtype *, idxtype *, int);
+void SetUpGraphKway(GraphType *, int, idxtype *, idxtype *);
+void SetUpGraph2(GraphType *, int, int, idxtype *, idxtype *, float *, idxtype *);
+void VolSetUpGraph(GraphType *, int, int, int, idxtype *, idxtype *, idxtype *, idxtype *, int);
+void RandomizeGraph(GraphType *);
+int IsConnectedSubdomain(CtrlType *, GraphType *, int, int);
+int IsConnected(CtrlType *, GraphType *, int);
+int IsConnected2(GraphType *, int);
+int FindComponents(CtrlType *, GraphType *, idxtype *, idxtype *);
+
+/* initpart.c */
+void Init2WayPartition(CtrlType *, GraphType *, int *, float);
+void InitSeparator(CtrlType *, GraphType *, float);
+void GrowBisection(CtrlType *, GraphType *, int *, float);
+void GrowBisectionNode(CtrlType *, GraphType *, float);
+void RandomBisection(CtrlType *, GraphType *, int *, float);
+
+/* kmetis.c */
+void METIS_PartGraphKway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void METIS_WPartGraphKway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+int MlevelKWayPartitioning(CtrlType *, GraphType *, int, idxtype *, float *, float);
+
+/* kvmetis.c */
+void METIS_PartGraphVKway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void METIS_WPartGraphVKway(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+int MlevelVolKWayPartitioning(CtrlType *, GraphType *, int, idxtype *, float *, float);
+
+/* kwayfm.c */
+void Random_KWayEdgeRefine(CtrlType *, GraphType *, int, float *, float, int, int);
+void Greedy_KWayEdgeRefine(CtrlType *, GraphType *, int, float *, float, int);
+void Greedy_KWayEdgeBalance(CtrlType *, GraphType *, int, float *, float, int);
+
+/* kwayrefine.c */
+void RefineKWay(CtrlType *, GraphType *, GraphType *, int, float *, float);
+void AllocateKWayPartitionMemory(CtrlType *, GraphType *, int);
+void ComputeKWayPartitionParams(CtrlType *, GraphType *, int);
+void ProjectKWayPartition(CtrlType *, GraphType *, int);
+int IsBalanced(idxtype *, int, float *, float);
+void ComputeKWayBoundary(CtrlType *, GraphType *, int);
+void ComputeKWayBalanceBoundary(CtrlType *, GraphType *, int);
+
+/* kwayvolfm.c */
+void Random_KWayVolRefine(CtrlType *, GraphType *, int, float *, float, int, int);
+void Random_KWayVolRefineMConn(CtrlType *, GraphType *, int, float *, float, int, int);
+void Greedy_KWayVolBalance(CtrlType *, GraphType *, int, float *, float, int);
+void Greedy_KWayVolBalanceMConn(CtrlType *, GraphType *, int, float *, float, int);
+void KWayVolUpdate(CtrlType *, GraphType *, int, int, int, idxtype *, idxtype *, idxtype *);
+void ComputeKWayVolume(GraphType *, int, idxtype *, idxtype *, idxtype *);
+int ComputeVolume(GraphType *, idxtype *);
+void CheckVolKWayPartitionParams(CtrlType *, GraphType *, int);
+void ComputeVolSubDomainGraph(GraphType *, int, idxtype *, idxtype *);
+void EliminateVolSubDomainEdges(CtrlType *, GraphType *, int, float *);
+void EliminateVolComponents(CtrlType *, GraphType *, int, float *, float);
+
+/* kwayvolrefine.c */
+void RefineVolKWay(CtrlType *, GraphType *, GraphType *, int, float *, float);
+void AllocateVolKWayPartitionMemory(CtrlType *, GraphType *, int);
+void ComputeVolKWayPartitionParams(CtrlType *, GraphType *, int);
+void ComputeKWayVolGains(CtrlType *, GraphType *, int);
+void ProjectVolKWayPartition(CtrlType *, GraphType *, int);
+void ComputeVolKWayBoundary(CtrlType *, GraphType *, int);
+void ComputeVolKWayBalanceBoundary(CtrlType *, GraphType *, int);
+
+/* match.c */
+void Match_RM(CtrlType *, GraphType *);
+void Match_RM_NVW(CtrlType *, GraphType *);
+void Match_HEM(CtrlType *, GraphType *);
+void Match_SHEM(CtrlType *, GraphType *);
+
+/* mbalance.c */
+void MocBalance2Way(CtrlType *, GraphType *, float *, float);
+void MocGeneral2WayBalance(CtrlType *, GraphType *, float *, float);
+
+/* mbalance2.c */
+void MocBalance2Way2(CtrlType *, GraphType *, float *, float *);
+void MocGeneral2WayBalance2(CtrlType *, GraphType *, float *, float *);
+void SelectQueue3(int, float *, float *, int *, int *, PQueueType [MAXNCON][2], float *);
+
+/* mcoarsen.c */
+GraphType *MCCoarsen2Way(CtrlType *, GraphType *);
+
+/* memory.c */
+void AllocateWorkSpace(CtrlType *, GraphType *, int);
+void FreeWorkSpace(CtrlType *, GraphType *);
+int WspaceAvail(CtrlType *);
+idxtype *idxwspacemalloc(CtrlType *, int);
+void idxwspacefree(CtrlType *, int);
+float *fwspacemalloc(CtrlType *, int);
+void fwspacefree(CtrlType *, int);
+GraphType *CreateGraph(void);
+void InitGraph(GraphType *);
+void FreeGraph(GraphType *);
+
+/* mesh.c */
+void METIS_MeshToDual(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void METIS_MeshToNodal(int *, int *, idxtype *, int *, int *, idxtype *, idxtype *);
+void GENDUALMETIS(int, int, int, idxtype *, idxtype *, idxtype *adjncy);
+void TRINODALMETIS(int, int, idxtype *, idxtype *, idxtype *adjncy);
+void TETNODALMETIS(int, int, idxtype *, idxtype *, idxtype *adjncy);
+void HEXNODALMETIS(int, int, idxtype *, idxtype *, idxtype *adjncy);
+void QUADNODALMETIS(int, int, idxtype *, idxtype *, idxtype *adjncy);
+
+/* meshpart.c */
+void METIS_PartMeshNodal(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+void METIS_PartMeshDual(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
+
+/* mfm.c */
+void MocFM_2WayEdgeRefine(CtrlType *, GraphType *, float *, int);
+void SelectQueue(int, float *, float *, int *, int *, PQueueType [MAXNCON][2]);
+int BetterBalance(int, float *, float *, float *);
+float Compute2WayHLoadImbalance(int, float *, float *);
+void Compute2WayHLoadImbalanceVec(int, float *, float *, float *);
+
+/* mfm2.c */
+void MocFM_2WayEdgeRefine2(CtrlType *, GraphType *, float *, float *, int);
+void SelectQueue2(int, float *, float *, int *, int *, PQueueType [MAXNCON][2], float *);
+int IsBetter2wayBalance(int, float *, float *, float *);
+
+/* mincover.o */
+void MinCover(idxtype *, idxtype *, int, int, idxtype *, int *);
+int MinCover_Augment(idxtype *, idxtype *, int, idxtype *, idxtype *, idxtype *, int);
+void MinCover_Decompose(idxtype *, idxtype *, int, int, idxtype *, idxtype *, int *);
+void MinCover_ColDFS(idxtype *, idxtype *, int, idxtype *, idxtype *, int);
+void MinCover_RowDFS(idxtype *, idxtype *, int, idxtype *, idxtype *, int);
+
+/* minitpart.c */
+void MocInit2WayPartition(CtrlType *, GraphType *, float *, float);
+void MocGrowBisection(CtrlType *, GraphType *, float *, float);
+void MocRandomBisection(CtrlType *, GraphType *, float *, float);
+void MocInit2WayBalance(CtrlType *, GraphType *, float *);
+int SelectQueueoneWay(int, float *, float *, int, PQueueType [MAXNCON][2]);
+
+/* minitpart2.c */
+void MocInit2WayPartition2(CtrlType *, GraphType *, float *, float *);
+void MocGrowBisection2(CtrlType *, GraphType *, float *, float *);
+void MocGrowBisectionNew2(CtrlType *, GraphType *, float *, float *);
+void MocInit2WayBalance2(CtrlType *, GraphType *, float *, float *);
+int SelectQueueOneWay2(int, float *, PQueueType [MAXNCON][2], float *);
+
+/* mkmetis.c */
+void METIS_mCPartGraphKway(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+int MCMlevelKWayPartitioning(CtrlType *, GraphType *, int, idxtype *, float *);
+
+/* mkwayfmh.c */
+void MCRandom_KWayEdgeRefineHorizontal(CtrlType *, GraphType *, int, float *, int);
+void MCGreedy_KWayEdgeBalanceHorizontal(CtrlType *, GraphType *, int, float *, int);
+int AreAllHVwgtsBelow(int, float, float *, float, float *, float *);
+int AreAllHVwgtsAbove(int, float, float *, float, float *, float *);
+void ComputeHKWayLoadImbalance(int, int, float *, float *);
+int MocIsHBalanced(int, int, float *, float *);
+int IsHBalanceBetterFT(int, int, float *, float *, float *, float *);
+int IsHBalanceBetterTT(int, int, float *, float *, float *, float *);
+
+/* mkwayrefine.c */
+void MocRefineKWayHorizontal(CtrlType *, GraphType *, GraphType *, int, float *);
+void MocAllocateKWayPartitionMemory(CtrlType *, GraphType *, int);
+void MocComputeKWayPartitionParams(CtrlType *, GraphType *, int);
+void MocProjectKWayPartition(CtrlType *, GraphType *, int);
+void MocComputeKWayBalanceBoundary(CtrlType *, GraphType *, int);
+
+/* mmatch.c */
+void MCMatch_RM(CtrlType *, GraphType *);
+void MCMatch_HEM(CtrlType *, GraphType *);
+void MCMatch_SHEM(CtrlType *, GraphType *);
+void MCMatch_SHEBM(CtrlType *, GraphType *, int);
+void MCMatch_SBHEM(CtrlType *, GraphType *, int);
+float BetterVBalance(int, int, float *, float *, float *);
+int AreAllVwgtsBelowFast(int, float *, float *, float);
+
+/* mmd.c */
+void genmmd(int, idxtype *, idxtype *, idxtype *, idxtype *, int , idxtype *, idxtype *, idxtype *, idxtype *, int, int *);
+void mmdelm(int, idxtype *xadj, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, int, int);
+int  mmdint(int, idxtype *xadj, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *);
+void mmdnum(int, idxtype *, idxtype *, idxtype *);
+void mmdupd(int, int, idxtype *, idxtype *, int, int *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, int, int *tag);
+
+/* mpmetis.c */
+void METIS_mCPartGraphRecursive(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *);
+void METIS_mCHPartGraphRecursive(int *, int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *);
+void METIS_mCPartGraphRecursiveInternal(int *, int *, idxtype *, idxtype *, float *, idxtype *, int *, int *, int *, idxtype *);
+void METIS_mCHPartGraphRecursiveInternal(int *, int *, idxtype *, idxtype *, float *, idxtype *, int *, float *, int *, int *, idxtype *);
+int MCMlevelRecursiveBisection(CtrlType *, GraphType *, int, idxtype *, float, int);
+int MCHMlevelRecursiveBisection(CtrlType *, GraphType *, int, idxtype *, float *, int);
+void MCMlevelEdgeBisection(CtrlType *, GraphType *, float *, float);
+void MCHMlevelEdgeBisection(CtrlType *, GraphType *, float *, float *);
+
+/* mrefine.c */
+void MocRefine2Way(CtrlType *, GraphType *, GraphType *, float *, float);
+void MocAllocate2WayPartitionMemory(CtrlType *, GraphType *);
+void MocCompute2WayPartitionParams(CtrlType *, GraphType *);
+void MocProject2WayPartition(CtrlType *, GraphType *);
+
+/* mrefine2.c */
+void MocRefine2Way2(CtrlType *, GraphType *, GraphType *, float *, float *);
+
+/* mutil.c */
+int AreAllVwgtsBelow(int, float, float *, float, float *, float);
+int AreAnyVwgtsBelow(int, float, float *, float, float *, float);
+int AreAllVwgtsAbove(int, float, float *, float, float *, float);
+float ComputeLoadImbalance(int, int, float *, float *);
+int AreAllBelow(int, float *, float *);
+
+/* myqsort.c */
+void iidxsort(int, idxtype *);
+void iintsort(int, int *);
+void ikeysort(int, KeyValueType *);
+void ikeyvalsort(int, KeyValueType *);
+
+/* ometis.c */
+void METIS_EdgeND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void METIS_NodeND(int *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void METIS_NodeWND(int *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *, idxtype *); 
+void MlevelNestedDissection(CtrlType *, GraphType *, idxtype *, float, int);
+void MlevelNestedDissectionCC(CtrlType *, GraphType *, idxtype *, float, int);
+void MlevelNodeBisectionMultiple(CtrlType *, GraphType *, int *, float);
+void MlevelNodeBisection(CtrlType *, GraphType *, int *, float);
+void SplitGraphOrder(CtrlType *, GraphType *, GraphType *, GraphType *);
+void MMDOrder(CtrlType *, GraphType *, idxtype *, int);
+int SplitGraphOrderCC(CtrlType *, GraphType *, GraphType *, int, idxtype *, idxtype *);
+
+/* parmetis.c */
+void METIS_PartGraphKway2(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void METIS_WPartGraphKway2(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+void METIS_NodeNDP(int, idxtype *, idxtype *, int, int *, idxtype *, idxtype *, idxtype *);
+void MlevelNestedDissectionP(CtrlType *, GraphType *, idxtype *, int, int, int, idxtype *);
+void METIS_NodeComputeSeparator(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *); 
+void METIS_EdgeComputeSeparator(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, idxtype *); 
+
+/* pmetis.c */
+void METIS_PartGraphRecursive(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, int *, int *, idxtype *); 
+void METIS_WPartGraphRecursive(int *, idxtype *, idxtype *, idxtype *, idxtype *, int *, int *, int *, float *, int *, int *, idxtype *); 
+int MlevelRecursiveBisection(CtrlType *, GraphType *, int, idxtype *, float *, float, int);
+void MlevelEdgeBisection(CtrlType *, GraphType *, int *, float);
+void SplitGraphPart(CtrlType *, GraphType *, GraphType *, GraphType *);
+void SetUpSplitGraph(GraphType *, GraphType *, int, int);
+
+/* pqueue.c */
+void PQueueInit(CtrlType *ctrl, PQueueType *, int, int);
+void PQueueReset(PQueueType *);
+void PQueueFree(CtrlType *ctrl, PQueueType *);
+int PQueueGetSize(PQueueType *);
+int PQueueInsert(PQueueType *, int, int);
+int PQueueDelete(PQueueType *, int, int);
+int PQueueUpdate(PQueueType *, int, int, int);
+void PQueueUpdateUp(PQueueType *, int, int, int);
+int PQueueGetMax(PQueueType *);
+int PQueueSeeMax(PQueueType *);
+int PQueueGetKey(PQueueType *);
+int CheckHeap(PQueueType *);
+
+/* refine.c */
+void Refine2Way(CtrlType *, GraphType *, GraphType *, int *, float ubfactor);
+void Allocate2WayPartitionMemory(CtrlType *, GraphType *);
+void Compute2WayPartitionParams(CtrlType *, GraphType *);
+void Project2WayPartition(CtrlType *, GraphType *);
+
+/* separator.c */
+void ConstructSeparator(CtrlType *, GraphType *, float);
+void ConstructMinCoverSeparator0(CtrlType *, GraphType *, float);
+void ConstructMinCoverSeparator(CtrlType *, GraphType *, float);
+
+/* sfm.c */
+void FM_2WayNodeRefine(CtrlType *, GraphType *, float, int);
+void FM_2WayNodeRefineEqWgt(CtrlType *, GraphType *, int);
+void FM_2WayNodeRefine_OneSided(CtrlType *, GraphType *, float, int);
+void FM_2WayNodeBalance(CtrlType *, GraphType *, float);
+int ComputeMaxNodeGain(int, idxtype *, idxtype *, idxtype *);
+
+/* srefine.c */
+void Refine2WayNode(CtrlType *, GraphType *, GraphType *, float);
+void Allocate2WayNodePartitionMemory(CtrlType *, GraphType *);
+void Compute2WayNodePartitionParams(CtrlType *, GraphType *);
+void Project2WayNodePartition(CtrlType *, GraphType *);
+
+/* stat.c */
+void ComputePartitionInfo(GraphType *, int, idxtype *);
+void ComputePartitionInfoBipartite(GraphType *, int, idxtype *);
+void ComputePartitionBalance(GraphType *, int, idxtype *, float *);
+float ComputeElementBalance(int, int, idxtype *);
+
+/* subdomains.c */
+void Random_KWayEdgeRefineMConn(CtrlType *, GraphType *, int, float *, float, int, int);
+void Greedy_KWayEdgeBalanceMConn(CtrlType *, GraphType *, int, float *, float, int);
+void PrintSubDomainGraph(GraphType *, int, idxtype *);
+void ComputeSubDomainGraph(GraphType *, int, idxtype *, idxtype *);
+void EliminateSubDomainEdges(CtrlType *, GraphType *, int, float *);
+void MoveGroupMConn(CtrlType *, GraphType *, idxtype *, idxtype *, int, int, int, idxtype *);
+void EliminateComponents(CtrlType *, GraphType *, int, float *, float);
+void MoveGroup(CtrlType *, GraphType *, int, int, int, idxtype *, idxtype *);
+
+/* timing.c */
+void InitTimers(CtrlType *);
+void PrintTimers(CtrlType *);
+double seconds(void);
+
+/* util.c */
+void errexit(char *,...);
+#ifndef DMALLOC
+int *imalloc(int, char *);
+idxtype *idxmalloc(int, char *);
+float *fmalloc(int, char *);
+int *ismalloc(int, int, char *);
+idxtype *idxsmalloc(int, idxtype, char *);
+void *GKmalloc(int, char *);
+#endif
+/*void GKfree(void **,...); */
+int *iset(int n, int val, int *x);
+idxtype *idxset(int n, idxtype val, idxtype *x);
+float *sset(int n, float val, float *x);
+int iamax(int, int *);
+int idxamax(int, idxtype *);
+int idxamax_strd(int, idxtype *, int);
+int samax(int, float *);
+int samax2(int, float *);
+int idxamin(int, idxtype *);
+int samin(int, float *);
+int idxsum(int, idxtype *);
+int idxsum_strd(int, idxtype *, int);
+void idxadd(int, idxtype *, idxtype *);
+int charsum(int, char *);
+int isum(int, int *);
+float ssum(int, float *);
+float ssum_strd(int n, float *x, int);
+void sscale(int n, float, float *x);
+float snorm2(int, float *);
+float sdot(int n, float *, float *);
+void saxpy(int, float, float *, int, float *, int);
+void RandomPermute(int, idxtype *, int);
+double drand48();
+void srand48(long);
+int ispow2(int);
+void InitRandom(int);
+int ilog2(int);
+
+
+
+
+
+
+
+
+
+
+/***************************************************************
+* Programs Directory
+****************************************************************/
+
+/* io.c */
+void ReadGraph(GraphType *, char *, int *);
+void WritePartition(char *, idxtype *, int, int);
+void WriteMeshPartition(char *, int, int, idxtype *, int, idxtype *);
+void WritePermutation(char *, idxtype *, int);
+int CheckGraph(GraphType *);
+idxtype *ReadMesh(char *, int *, int *, int *);
+void WriteGraph(char *, int, idxtype *, idxtype *);
+
+/* smbfactor.c */
+void ComputeFillIn(GraphType *, idxtype *);
+idxtype ComputeFillIn2(GraphType *, idxtype *);
+int smbfct(int, idxtype *, idxtype *, idxtype *, idxtype *, idxtype *, int *, idxtype *, idxtype *, int *);
+
+
+/***************************************************************
+* Test Directory
+****************************************************************/
+void Test_PartGraph(int, idxtype *, idxtype *);
+int VerifyPart(int, idxtype *, idxtype *, idxtype *, idxtype *, int, int, idxtype *);
+int VerifyWPart(int, idxtype *, idxtype *, idxtype *, idxtype *, int, float *, int, idxtype *);
+void Test_PartGraphV(int, idxtype *, idxtype *);
+int VerifyPartV(int, idxtype *, idxtype *, idxtype *, idxtype *, int, int, idxtype *);
+int VerifyWPartV(int, idxtype *, idxtype *, idxtype *, idxtype *, int, float *, int, idxtype *);
+void Test_PartGraphmC(int, idxtype *, idxtype *);
+int VerifyPartmC(int, int, idxtype *, idxtype *, idxtype *, idxtype *, int, float *, int, idxtype *);
+void Test_ND(int, idxtype *, idxtype *);
+int VerifyND(int, idxtype *, idxtype *);
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/refine.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/refine.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/refine.c	(revision 9501)
@@ -0,0 +1,204 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * refine.c
+ *
+ * This file contains the driving routines for multilevel refinement
+ *
+ * Started 7/24/97
+ * George
+ *
+ * $Id: refine.c,v 1.1 1998/11/27 17:59:29 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of refinement
+**************************************************************************/
+void Refine2Way(CtrlType *ctrl, GraphType *orggraph, GraphType *graph, int *tpwgts, float ubfactor)
+{
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->UncoarsenTmr));
+
+  /* Compute the parameters of the coarsest graph */
+  Compute2WayPartitionParams(ctrl, graph);
+
+  for (;;) {
+    ASSERT(CheckBnd(graph));
+
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->RefTmr));
+    switch (ctrl->RType) {
+      case 1:
+        Balance2Way(ctrl, graph, tpwgts, ubfactor);
+        FM_2WayEdgeRefine(ctrl, graph, tpwgts, 8); 
+        break;
+      default:
+        errexit("Unknown refinement type: %d\n", ctrl->RType);
+    }
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->RefTmr));
+
+    if (graph == orggraph)
+      break;
+
+    graph = graph->finer;
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ProjectTmr));
+    Project2WayPartition(ctrl, graph);
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ProjectTmr));
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->UncoarsenTmr));
+}
+
+
+/*************************************************************************
+* This function allocates memory for 2-way edge refinement
+**************************************************************************/
+void Allocate2WayPartitionMemory(CtrlType *ctrl, GraphType *graph)
+{
+  int nvtxs;
+
+  nvtxs = graph->nvtxs;
+
+  graph->rdata = idxmalloc(5*nvtxs+2, "Allocate2WayPartitionMemory: rdata");
+  graph->pwgts 		= graph->rdata;
+  graph->where		= graph->rdata + 2;
+  graph->id		= graph->rdata + nvtxs + 2;
+  graph->ed		= graph->rdata + 2*nvtxs + 2;
+  graph->bndptr		= graph->rdata + 3*nvtxs + 2;
+  graph->bndind		= graph->rdata + 4*nvtxs + 2;
+}
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void Compute2WayPartitionParams(CtrlType *ctrl, GraphType *graph)
+{
+  int i, j, k, l, nvtxs, nbnd, mincut;
+  idxtype *xadj, *vwgt, *adjncy, *adjwgt, *pwgts;
+  idxtype *id, *ed, *where;
+  idxtype *bndptr, *bndind;
+  int me, other;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  pwgts = idxset(2, 0, graph->pwgts);
+  id = idxset(nvtxs, 0, graph->id);
+  ed = idxset(nvtxs, 0, graph->ed);
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+  bndind = graph->bndind;
+
+
+  /*------------------------------------------------------------
+  / Compute now the id/ed degrees
+  /------------------------------------------------------------*/
+  nbnd = mincut = 0;
+  for (i=0; i<nvtxs; i++) {
+    ASSERT(where[i] >= 0 && where[i] <= 1);
+    me = where[i];
+    pwgts[me] += vwgt[i];
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (me == where[adjncy[j]])
+        id[i] += adjwgt[j];
+      else
+        ed[i] += adjwgt[j];
+    }
+
+    if (ed[i] > 0 || xadj[i] == xadj[i+1]) {
+      mincut += ed[i];
+      bndptr[i] = nbnd;
+      bndind[nbnd++] = i;
+    }
+  }
+
+  graph->mincut = mincut/2;
+  graph->nbnd = nbnd;
+
+  ASSERT(pwgts[0]+pwgts[1] == idxsum(nvtxs, vwgt));
+}
+
+
+
+/*************************************************************************
+* This function projects a partition, and at the same time computes the
+* parameters for refinement.
+**************************************************************************/
+void Project2WayPartition(CtrlType *ctrl, GraphType *graph)
+{
+  int i, j, k, nvtxs, nbnd, me;
+  idxtype *xadj, *adjncy, *adjwgt, *adjwgtsum;
+  idxtype *cmap, *where, *id, *ed, *bndptr, *bndind;
+  idxtype *cwhere, *cid, *ced, *cbndptr;
+  GraphType *cgraph;
+
+  cgraph = graph->coarser;
+  cwhere = cgraph->where;
+  cid = cgraph->id;
+  ced = cgraph->ed;
+  cbndptr = cgraph->bndptr;
+
+  nvtxs = graph->nvtxs;
+  cmap = graph->cmap;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  adjwgtsum = graph->adjwgtsum;
+
+  Allocate2WayPartitionMemory(ctrl, graph);
+
+  where = graph->where;
+  id = idxset(nvtxs, 0, graph->id);
+  ed = idxset(nvtxs, 0, graph->ed);
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+  bndind = graph->bndind;
+
+
+  /* Go through and project partition and compute id/ed for the nodes */
+  for (i=0; i<nvtxs; i++) {
+    k = cmap[i];
+    where[i] = cwhere[k];
+    cmap[i] = cbndptr[k];
+  }
+
+  for (nbnd=0, i=0; i<nvtxs; i++) {
+    me = where[i];
+
+    id[i] = adjwgtsum[i];
+
+    if (xadj[i] == xadj[i+1]) {
+      bndptr[i] = nbnd;
+      bndind[nbnd++] = i;
+    }
+    else {
+      if (cmap[i] != -1) { /* If it is an interface node. Note that cmap[i] = cbndptr[cmap[i]] */
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          if (me != where[adjncy[j]])
+            ed[i] += adjwgt[j];
+        }
+        id[i] -= ed[i];
+
+        if (ed[i] > 0 || xadj[i] == xadj[i+1]) {
+          bndptr[i] = nbnd;
+          bndind[nbnd++] = i;
+        }
+      }
+    }
+  }
+
+  graph->mincut = cgraph->mincut;
+  graph->nbnd = nbnd;
+  idxcopy(2, cgraph->pwgts, graph->pwgts);
+
+  FreeGraph(graph->coarser);
+  graph->coarser = NULL;
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/rename.h
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/rename.h	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/rename.h	(revision 9501)
@@ -0,0 +1,418 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * rename.h
+ *
+ * This file contains header files
+ *
+ * Started 10/2/97
+ * George
+ *
+ * $Id: rename.h,v 1.1 1998/11/27 17:59:29 karypis Exp $
+ *
+ */
+
+/* balance.c */
+#define Balance2Way			__Balance2Way
+#define Bnd2WayBalance			__Bnd2WayBalance
+#define General2WayBalance		__General2WayBalance
+
+
+/* bucketsort.c */
+#define BucketSortKeysInc		__BucketSortKeysInc
+
+
+/* ccgraph.c */
+#define CreateCoarseGraph		__CreateCoarseGraph
+#define CreateCoarseGraphNoMask		__CreateCoarseGraphNoMask
+#define CreateCoarseGraph_NVW 		__CreateCoarseGraph_NVW
+#define SetUpCoarseGraph		__SetUpCoarseGraph
+#define ReAdjustMemory			__ReAdjustMemory
+
+
+/* coarsen.c */
+#define Coarsen2Way			__Coarsen2Way
+
+
+/* compress.c */
+#define CompressGraph			__CompressGraph
+#define PruneGraph			__PruneGraph
+
+
+/* debug.c */
+#define ComputeCut			__ComputeCut
+#define CheckBnd			__CheckBnd
+#define CheckBnd2			__CheckBnd2
+#define CheckNodeBnd			__CheckNodeBnd
+#define CheckRInfo			__CheckRInfo
+#define CheckNodePartitionParams	__CheckNodePartitionParams
+#define IsSeparable			__IsSeparable
+
+
+/* estmem.c */
+#define EstimateCFraction		__EstimateCFraction
+#define ComputeCoarseGraphSize		__ComputeCoarseGraphSize
+
+
+/* fm.c */
+#define FM_2WayEdgeRefine		__FM_2WayEdgeRefine
+
+
+/* fortran.c */
+#define Change2CNumbering		__Change2CNumbering
+#define Change2FNumbering		__Change2FNumbering
+#define Change2FNumbering2		__Change2FNumbering2
+#define Change2FNumberingOrder		__Change2FNumberingOrder
+#define ChangeMesh2CNumbering		__ChangeMesh2CNumbering
+#define ChangeMesh2FNumbering		__ChangeMesh2FNumbering
+#define ChangeMesh2FNumbering2		__ChangeMesh2FNumbering2
+
+
+/* graph.c */
+#define SetUpGraph			__SetUpGraph
+#define SetUpGraphKway 			__SetUpGraphKway
+#define SetUpGraph2			__SetUpGraph2
+#define VolSetUpGraph			__VolSetUpGraph
+#define RandomizeGraph			__RandomizeGraph
+#define IsConnectedSubdomain		__IsConnectedSubdomain
+#define IsConnected			__IsConnected
+#define IsConnected2			__IsConnected2
+#define FindComponents			__FindComponents
+
+
+/* initpart.c */
+#define Init2WayPartition		__Init2WayPartition
+#define InitSeparator			__InitSeparator
+#define GrowBisection			__GrowBisection
+#define GrowBisectionNode		__GrowBisectionNode
+#define RandomBisection			__RandomBisection
+
+
+/* kmetis.c */
+#define MlevelKWayPartitioning		__MlevelKWayPartitioning
+
+
+/* kvmetis.c */
+#define MlevelVolKWayPartitioning	__MlevelVolKWayPartitioning
+
+
+/* kwayfm.c */
+#define Random_KWayEdgeRefine		__Random_KWayEdgeRefine
+#define Greedy_KWayEdgeRefine		__Greedy_KWayEdgeRefine
+#define Greedy_KWayEdgeBalance		__Greedy_KWayEdgeBalance
+
+
+/* kwayrefine.c */
+#define RefineKWay			__RefineKWay
+#define AllocateKWayPartitionMemory	__AllocateKWayPartitionMemory
+#define ComputeKWayPartitionParams	__ComputeKWayPartitionParams
+#define ProjectKWayPartition		__ProjectKWayPartition
+#define IsBalanced			__IsBalanced
+#define ComputeKWayBoundary		__ComputeKWayBoundary
+#define ComputeKWayBalanceBoundary	__ComputeKWayBalanceBoundary
+
+
+/* kwayvolfm.c */
+#define Random_KWayVolRefine		__Random_KWayVolRefine
+#define Random_KWayVolRefineMConn	__Random_KWayVolRefineMConn
+#define Greedy_KWayVolBalance		__Greedy_KWayVolBalance
+#define Greedy_KWayVolBalanceMConn	__Greedy_KWayVolBalanceMConn
+#define KWayVolUpdate			__KWayVolUpdate
+#define ComputeKWayVolume		__ComputeKWayVolume
+#define ComputeVolume			__ComputeVolume
+#define CheckVolKWayPartitionParams	__CheckVolKWayPartitionParams
+#define ComputeVolSubDomainGraph	__ComputeVolSubDomainGraph
+#define EliminateVolSubDomainEdges	__EliminateVolSubDomainEdges
+
+
+/* kwayvolrefine.c */
+#define RefineVolKWay			__RefineVolKWay
+#define AllocateVolKWayPartitionMemory	__AllocateVolKWayPartitionMemory
+#define ComputeVolKWayPartitionParams	__ComputeVolKWayPartitionParams
+#define ComputeKWayVolGains		__ComputeKWayVolGains
+#define ProjectVolKWayPartition		__ProjectVolKWayPartition
+#define ComputeVolKWayBoundary		__ComputeVolKWayBoundary
+#define ComputeVolKWayBalanceBoundary	__ComputeVolKWayBalanceBoundary
+
+
+/* match.c */
+#define Match_RM			__Match_RM
+#define Match_RM_NVW			__Match_RM_NVW
+#define Match_HEM			__Match_HEM
+#define Match_SHEM			__Match_SHEM
+
+
+/* mbalance.c */
+#define MocBalance2Way			__MocBalance2Way
+#define MocGeneral2WayBalance		__MocGeneral2WayBalance
+
+
+/* mbalance2.c */
+#define MocBalance2Way2			__MocBalance2Way2
+#define MocGeneral2WayBalance2		__MocGeneral2WayBalance2
+#define SelectQueue3			__SelectQueue3
+
+
+/* mcoarsen.c */
+#define MCCoarsen2Way			__MCCoarsen2Way
+
+
+/* memory.c */
+#define AllocateWorkSpace		__AllocateWorkSpace
+#define FreeWorkSpace			__FreeWorkSpace
+#define WspaceAvail			__WspaceAvail
+#define idxwspacemalloc			__idxwspacemalloc
+#define idxwspacefree			__idxwspacefree
+#define fwspacemalloc			__fwspacemalloc
+#define CreateGraph			__CreateGraph
+#define InitGraph			__InitGraph
+#define FreeGraph			__FreeGraph
+
+
+/* mesh.c */
+#define TRIDUALMETIS			__TRIDUALMETIS
+#define TETDUALMETIS			__TETDUALMETIS
+#define HEXDUALMETIS			__HEXDUALMETIS
+#define TRINODALMETIS			__TRINODALMETIS
+#define TETNODALMETIS			__TETNODALMETIS
+#define HEXNODALMETIS			__HEXNODALMETIS
+
+
+/* mfm.c */
+#define MocFM_2WayEdgeRefine		__MocFM_2WayEdgeRefine
+#define SelectQueue			__SelectQueue
+#define BetterBalance			__BetterBalance
+#define Compute2WayHLoadImbalance	__Compute2WayHLoadImbalance
+#define Compute2WayHLoadImbalanceVec	__Compute2WayHLoadImbalanceVec
+
+
+/* mfm2.c */
+#define MocFM_2WayEdgeRefine2		__MocFM_2WayEdgeRefine2
+#define SelectQueue2			__SelectQueue2
+#define IsBetter2wayBalance		__IsBetter2wayBalance
+
+
+/* mincover.c */
+#define MinCover			__MinCover
+#define MinCover_Augment		__MinCover_Augment
+#define MinCover_Decompose		__MinCover_Decompose
+#define MinCover_ColDFS			__MinCover_ColDFS
+#define MinCover_RowDFS			__MinCover_RowDFS
+
+
+/* minitpart.c */
+#define MocInit2WayPartition		__MocInit2WayPartition
+#define MocGrowBisection		__MocGrowBisection
+#define MocRandomBisection		__MocRandomBisection
+#define MocInit2WayBalance		__MocInit2WayBalance
+#define SelectQueueoneWay		__SelectQueueoneWay
+
+
+/* minitpart2.c */
+#define MocInit2WayPartition2		__MocInit2WayPartition2
+#define MocGrowBisection2		__MocGrowBisection2
+#define MocGrowBisectionNew2		__MocGrowBisectionNew2
+#define MocInit2WayBalance2		__MocInit2WayBalance2
+#define SelectQueueOneWay2		__SelectQueueOneWay2
+
+
+/* mkmetis.c */
+#define MCMlevelKWayPartitioning	__MCMlevelKWayPartitioning
+
+
+/* mkwayfmh.c */
+#define MCRandom_KWayEdgeRefineHorizontal	__MCRandom_KWayEdgeRefineHorizontal
+#define MCGreedy_KWayEdgeBalanceHorizontal	__MCGreedy_KWayEdgeBalanceHorizontal
+#define AreAllHVwgtsBelow			__AreAllHVwgtsBelow
+#define AreAllHVwgtsAbove			__AreAllHVwgtsAbove
+#define ComputeHKWayLoadImbalance		__ComputeHKWayLoadImbalance
+#define MocIsHBalanced				__MocIsHBalanced
+#define IsHBalanceBetterFT			__IsHBalanceBetterFT
+#define IsHBalanceBetterTT			__IsHBalanceBetterTT
+
+
+/* mkwayrefine.c */
+#define MocRefineKWayHorizontal		__MocRefineKWayHorizontal
+#define MocAllocateKWayPartitionMemory	__MocAllocateKWayPartitionMemory
+#define MocComputeKWayPartitionParams	__MocComputeKWayPartitionParams
+#define MocProjectKWayPartition		__MocProjectKWayPartition
+#define MocComputeKWayBalanceBoundary	__MocComputeKWayBalanceBoundary
+
+
+/* mmatch.c */
+#define MCMatch_RM			__MCMatch_RM
+#define MCMatch_HEM			__MCMatch_HEM
+#define MCMatch_SHEM			__MCMatch_SHEM
+#define MCMatch_SHEBM			__MCMatch_SHEBM
+#define MCMatch_SBHEM			__MCMatch_SBHEM
+#define BetterVBalance			__BetterVBalance
+#define AreAllVwgtsBelowFast		__AreAllVwgtsBelowFast
+
+
+/* mmd.c */
+#define genmmd				__genmmd
+#define mmdelm				__mmdelm
+#define mmdint				__mmdint
+#define mmdnum				__mmdnum
+#define mmdupd				__mmdupd
+
+
+/* mpmetis.c */
+#define MCMlevelRecursiveBisection	__MCMlevelRecursiveBisection
+#define MCHMlevelRecursiveBisection	__MCHMlevelRecursiveBisection
+#define MCMlevelEdgeBisection		__MCMlevelEdgeBisection
+#define MCHMlevelEdgeBisection		__MCHMlevelEdgeBisection
+
+
+/* mrefine.c */
+#define MocRefine2Way			__MocRefine2Way
+#define MocAllocate2WayPartitionMemory	__MocAllocate2WayPartitionMemory
+#define MocCompute2WayPartitionParams	__MocCompute2WayPartitionParams
+#define MocProject2WayPartition		__MocProject2WayPartition
+
+
+/* mrefine2.c */
+#define MocRefine2Way2			__MocRefine2Way2
+
+
+/* mutil.c */
+#define AreAllVwgtsBelow		__AreAllVwgtsBelow
+#define AreAnyVwgtsBelow		__AreAnyVwgtsBelow
+#define AreAllVwgtsAbove		__AreAllVwgtsAbove
+#define ComputeLoadImbalance		__ComputeLoadImbalance
+#define AreAllBelow			__AreAllBelow
+
+
+/* myqsort.c */
+#define iidxsort			__iidxsort
+#define iintsort			__iintsort
+#define ikeysort			__ikeysort
+#define ikeyvalsort			__ikeyvalsort
+
+
+/* ometis.c */
+#define MlevelNestedDissection		__MlevelNestedDissection
+#define MlevelNestedDissectionCC	__MlevelNestedDissectionCC
+#define MlevelNodeBisectionMultiple	__MlevelNodeBisectionMultiple
+#define MlevelNodeBisection		__MlevelNodeBisection
+#define SplitGraphOrder			__SplitGraphOrder
+#define MMDOrder			__MMDOrder
+#define SplitGraphOrderCC		__SplitGraphOrderCC
+
+
+/* parmetis.c */
+#define MlevelNestedDissectionP		__MlevelNestedDissectionP
+
+
+/* pmetis.c */
+#define MlevelRecursiveBisection	__MlevelRecursiveBisection
+#define MlevelEdgeBisection		__MlevelEdgeBisection
+#define SplitGraphPart			__SplitGraphPart
+#define SetUpSplitGraph			__SetUpSplitGraph
+
+
+/* pqueue.c */
+#define PQueueInit			__PQueueInit
+#define PQueueReset			__PQueueReset
+#define PQueueFree			__PQueueFree
+#define PQueueInsert			__PQueueInsert
+#define PQueueDelete			__PQueueDelete
+#define PQueueUpdate			__PQueueUpdate
+#define PQueueUpdateUp			__PQueueUpdateUp
+#define PQueueGetMax			__PQueueGetMax
+#define PQueueSeeMax			__PQueueSeeMax
+#define CheckHeap			__CheckHeap
+
+
+/* refine.c */
+#define Refine2Way			__Refine2Way
+#define Allocate2WayPartitionMemory	__Allocate2WayPartitionMemory
+#define Compute2WayPartitionParams	__Compute2WayPartitionParams
+#define Project2WayPartition		__Project2WayPartition
+
+
+/* separator.c */
+#define ConstructSeparator		__ConstructSeparator
+#define ConstructMinCoverSeparator0	__ConstructMinCoverSeparator0
+#define ConstructMinCoverSeparator	__ConstructMinCoverSeparator
+
+
+/* sfm.c */
+#define FM_2WayNodeRefine		__FM_2WayNodeRefine
+#define FM_2WayNodeRefineEqWgt		__FM_2WayNodeRefineEqWgt
+#define FM_2WayNodeRefine_OneSided	__FM_2WayNodeRefine_OneSided
+#define FM_2WayNodeBalance		__FM_2WayNodeBalance
+#define ComputeMaxNodeGain		__ComputeMaxNodeGain
+
+
+/* srefine.c */
+#define Refine2WayNode			__Refine2WayNode
+#define Allocate2WayNodePartitionMemory	__Allocate2WayNodePartitionMemory
+#define Compute2WayNodePartitionParams	__Compute2WayNodePartitionParams
+#define Project2WayNodePartition	__Project2WayNodePartition
+
+
+/* stat.c */
+#define ComputePartitionInfo		__ComputePartitionInfo
+#define ComputePartitionBalance		__ComputePartitionBalance
+#define ComputeElementBalance		__ComputeElementBalance
+
+
+/* subdomains.c */
+#define Random_KWayEdgeRefineMConn	__Random_KWayEdgeRefineMConn
+#define Greedy_KWayEdgeBalanceMConn	__Greedy_KWayEdgeBalanceMConn
+#define PrintSubDomainGraph		__PrintSubDomainGraph
+#define ComputeSubDomainGraph		__ComputeSubDomainGraph
+#define EliminateSubDomainEdges		__EliminateSubDomainEdges
+#define MoveGroupMConn			__MoveGroupMConn
+#define EliminateComponents		__EliminateComponents
+#define MoveGroup			__MoveGroup
+
+
+/* timing.c */
+#define InitTimers			__InitTimers
+#define PrintTimers			__PrintTimers
+#define seconds				__seconds
+
+
+/* util.c */
+#define errexit				__errexit
+#define GKfree				__GKfree
+#ifndef DMALLOC
+#define imalloc				__imalloc
+#define idxmalloc			__idxmalloc
+#define fmalloc				__fmalloc
+#define ismalloc			__ismalloc
+#define idxsmalloc			__idxsmalloc
+#define GKmalloc			__GKmalloc
+#endif
+#define iset				__iset
+#define idxset				__idxset
+#define sset				__sset
+#define iamax				__iamax
+#define idxamax				__idxamax
+#define idxamax_strd			__idxamax_strd
+#define samax				__samax
+#define samax2				__samax2
+#define idxamin				__idxamin
+#define samin				__samin
+#define idxsum				__idxsum
+#define idxsum_strd			__idxsum_strd
+#define idxadd				__idxadd
+#define charsum				__charsum
+#define isum				__isum
+#define ssum				__ssum
+#define ssum_strd			__ssum_strd
+#define sscale				__sscale
+#define snorm2				__snorm2
+#define sdot				__sdot
+#define saxpy				__saxpy
+#define RandomPermute			__RandomPermute
+#define ispow2				__ispow2
+#define InitRandom			__InitRandom
+#define ilog2				__ilog2
+
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/separator.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/separator.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/separator.c	(revision 9501)
@@ -0,0 +1,284 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * separator.c
+ *
+ * This file contains code for separator extraction
+ *
+ * Started 8/1/97
+ * George
+ *
+ * $Id: separator.c,v 1.1 1998/11/27 17:59:30 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+/*************************************************************************
+* This function takes a bisection and constructs a minimum weight vertex 
+* separator out of it. It uses the node-based separator refinement for it.
+**************************************************************************/
+void ConstructSeparator(CtrlType *ctrl, GraphType *graph, float ubfactor)
+{
+  int i, j, k, nvtxs, nbnd;
+  idxtype *xadj, *where, *bndind;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  nbnd = graph->nbnd;
+  bndind = graph->bndind;
+
+  where = idxcopy(nvtxs, graph->where, idxwspacemalloc(ctrl, nvtxs));
+
+  /* Put the nodes in the boundary into the separator */
+  for (i=0; i<nbnd; i++) {
+    j = bndind[i];
+    if (xadj[j+1]-xadj[j] > 0)  /* Ignore islands */
+      where[j] = 2;
+  }
+
+  GKfree(&graph->rdata, LTERM);
+  Allocate2WayNodePartitionMemory(ctrl, graph);
+  idxcopy(nvtxs, where, graph->where);
+  idxwspacefree(ctrl, nvtxs);
+
+  ASSERT(IsSeparable(graph));
+
+  Compute2WayNodePartitionParams(ctrl, graph);
+
+  ASSERT(CheckNodePartitionParams(graph));
+
+  FM_2WayNodeRefine(ctrl, graph, ubfactor, 8); 
+
+  ASSERT(IsSeparable(graph));
+}
+
+
+
+/*************************************************************************
+* This function takes a bisection and constructs a minimum weight vertex 
+* separator out of it. It uses an unweighted minimum-cover algorithm
+* followed by node-based separator refinement.
+**************************************************************************/
+void ConstructMinCoverSeparator0(CtrlType *ctrl, GraphType *graph, float ubfactor)
+{
+  int i, ii, j, jj, k, l, nvtxs, nbnd, bnvtxs[3], bnedges[2], csize;
+  idxtype *xadj, *adjncy, *bxadj, *badjncy;
+  idxtype *where, *bndind, *bndptr, *vmap, *ivmap, *cover;
+
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+
+  nbnd = graph->nbnd;
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+  where = graph->where;
+
+  vmap = idxwspacemalloc(ctrl, nvtxs);
+  ivmap = idxwspacemalloc(ctrl, nbnd);
+  cover = idxwspacemalloc(ctrl, nbnd);
+
+  if (nbnd > 0) {
+    /* Go through the boundary and determine the sizes of the bipartite graph */
+    bnvtxs[0] = bnvtxs[1] = bnedges[0] = bnedges[1] = 0;
+    for (i=0; i<nbnd; i++) {
+      j = bndind[i];
+      k = where[j];
+      if (xadj[j+1]-xadj[j] > 0) {
+        bnvtxs[k]++;
+        bnedges[k] += xadj[j+1]-xadj[j];
+      }
+    }
+
+    bnvtxs[2] = bnvtxs[0]+bnvtxs[1];
+    bnvtxs[1] = bnvtxs[0];
+    bnvtxs[0] = 0;
+
+    bxadj = idxmalloc(bnvtxs[2]+1, "ConstructMinCoverSeparator: bxadj");
+    badjncy = idxmalloc(bnedges[0]+bnedges[1]+1, "ConstructMinCoverSeparator: badjncy");
+
+    /* Construct the ivmap and vmap */
+    ASSERT(idxset(nvtxs, -1, vmap) == vmap);
+    for (i=0; i<nbnd; i++) {
+      j = bndind[i];
+      k = where[j];
+      if (xadj[j+1]-xadj[j] > 0) {
+        vmap[j] = bnvtxs[k];
+        ivmap[bnvtxs[k]++] = j;
+      }
+    }
+
+    /* OK, go through and put the vertices of each part starting from 0 */
+    bnvtxs[1] = bnvtxs[0];
+    bnvtxs[0] = 0;
+    bxadj[0] = l = 0;
+    for (k=0; k<2; k++) {
+      for (ii=0; ii<nbnd; ii++) {
+        i = bndind[ii];
+        if (where[i] == k && xadj[i] < xadj[i+1]) {
+          for (j=xadj[i]; j<xadj[i+1]; j++) {
+            jj = adjncy[j];
+            if (where[jj] != k) {
+              ASSERT(bndptr[jj] != -1); 
+              ASSERTP(vmap[jj] != -1, ("%d %d %d\n", jj, vmap[jj], graph->bndptr[jj]));
+              badjncy[l++] = vmap[jj];
+            }
+          }
+          bxadj[++bnvtxs[k]] = l;
+        }
+      }
+    }
+
+    ASSERT(l <= bnedges[0]+bnedges[1]);
+
+    MinCover(bxadj, badjncy, bnvtxs[0], bnvtxs[1], cover, &csize);
+
+    IFSET(ctrl->dbglvl, DBG_SEPINFO,
+      printf("Nvtxs: %6d, [%5d %5d], Cut: %6d, SS: [%6d %6d], Cover: %6d\n", nvtxs, graph->pwgts[0], graph->pwgts[1], graph->mincut, bnvtxs[0], bnvtxs[1]-bnvtxs[0], csize));
+
+    for (i=0; i<csize; i++) {
+      j = ivmap[cover[i]];
+      where[j] = 2;
+    }
+
+    GKfree(&bxadj, &badjncy, LTERM);
+
+    for (i=0; i<nbnd; i++)
+      bndptr[bndind[i]] = -1;
+    for (nbnd=i=0; i<nvtxs; i++) {
+      if (where[i] == 2) {
+        bndind[nbnd] = i;
+        bndptr[i] = nbnd++;
+      }
+    }
+  }
+  else {
+    IFSET(ctrl->dbglvl, DBG_SEPINFO,
+      printf("Nvtxs: %6d, [%5d %5d], Cut: %6d, SS: [%6d %6d], Cover: %6d\n", nvtxs, graph->pwgts[0], graph->pwgts[1], graph->mincut, 0, 0, 0));
+  }
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, graph->nbnd);
+  idxwspacefree(ctrl, graph->nbnd);
+  graph->nbnd = nbnd;
+
+
+  ASSERT(IsSeparable(graph));
+}
+
+
+
+/*************************************************************************
+* This function takes a bisection and constructs a minimum weight vertex 
+* separator out of it. It uses an unweighted minimum-cover algorithm
+* followed by node-based separator refinement.
+**************************************************************************/
+void ConstructMinCoverSeparator(CtrlType *ctrl, GraphType *graph, float ubfactor)
+{
+  int i, ii, j, jj, k, l, nvtxs, nbnd, bnvtxs[3], bnedges[2], csize;
+  idxtype *xadj, *adjncy, *bxadj, *badjncy;
+  idxtype *where, *bndind, *bndptr, *vmap, *ivmap, *cover;
+
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+
+  nbnd = graph->nbnd;
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+  where = graph->where;
+
+  vmap = idxwspacemalloc(ctrl, nvtxs);
+  ivmap = idxwspacemalloc(ctrl, nbnd);
+  cover = idxwspacemalloc(ctrl, nbnd);
+
+  if (nbnd > 0) {
+    /* Go through the boundary and determine the sizes of the bipartite graph */
+    bnvtxs[0] = bnvtxs[1] = bnedges[0] = bnedges[1] = 0;
+    for (i=0; i<nbnd; i++) {
+      j = bndind[i];
+      k = where[j];
+      if (xadj[j+1]-xadj[j] > 0) {
+        bnvtxs[k]++;
+        bnedges[k] += xadj[j+1]-xadj[j];
+      }
+    }
+
+    bnvtxs[2] = bnvtxs[0]+bnvtxs[1];
+    bnvtxs[1] = bnvtxs[0];
+    bnvtxs[0] = 0;
+
+    bxadj = idxmalloc(bnvtxs[2]+1, "ConstructMinCoverSeparator: bxadj");
+    badjncy = idxmalloc(bnedges[0]+bnedges[1]+1, "ConstructMinCoverSeparator: badjncy");
+
+    /* Construct the ivmap and vmap */
+    ASSERT(idxset(nvtxs, -1, vmap) == vmap);
+    for (i=0; i<nbnd; i++) {
+      j = bndind[i];
+      k = where[j];
+      if (xadj[j+1]-xadj[j] > 0) {
+        vmap[j] = bnvtxs[k];
+        ivmap[bnvtxs[k]++] = j;
+      }
+    }
+
+    /* OK, go through and put the vertices of each part starting from 0 */
+    bnvtxs[1] = bnvtxs[0];
+    bnvtxs[0] = 0;
+    bxadj[0] = l = 0;
+    for (k=0; k<2; k++) {
+      for (ii=0; ii<nbnd; ii++) {
+        i = bndind[ii];
+        if (where[i] == k && xadj[i] < xadj[i+1]) {
+          for (j=xadj[i]; j<xadj[i+1]; j++) {
+            jj = adjncy[j];
+            if (where[jj] != k) {
+              ASSERT(bndptr[jj] != -1); 
+              ASSERTP(vmap[jj] != -1, ("%d %d %d\n", jj, vmap[jj], graph->bndptr[jj]));
+              badjncy[l++] = vmap[jj];
+            }
+          }
+          bxadj[++bnvtxs[k]] = l;
+        }
+      }
+    }
+
+    ASSERT(l <= bnedges[0]+bnedges[1]);
+
+    MinCover(bxadj, badjncy, bnvtxs[0], bnvtxs[1], cover, &csize);
+
+    IFSET(ctrl->dbglvl, DBG_SEPINFO,
+      printf("Nvtxs: %6d, [%5d %5d], Cut: %6d, SS: [%6d %6d], Cover: %6d\n", nvtxs, graph->pwgts[0], graph->pwgts[1], graph->mincut, bnvtxs[0], bnvtxs[1]-bnvtxs[0], csize));
+
+    for (i=0; i<csize; i++) {
+      j = ivmap[cover[i]];
+      where[j] = 2;
+    }
+
+    GKfree(&bxadj, &badjncy, LTERM);
+  }
+  else {
+    IFSET(ctrl->dbglvl, DBG_SEPINFO,
+      printf("Nvtxs: %6d, [%5d %5d], Cut: %6d, SS: [%6d %6d], Cover: %6d\n", nvtxs, graph->pwgts[0], graph->pwgts[1], graph->mincut, 0, 0, 0));
+  }
+
+  /* Prepare to refine the vertex separator */
+  idxcopy(nvtxs, graph->where, vmap);
+  GKfree(&graph->rdata, LTERM);
+
+  Allocate2WayNodePartitionMemory(ctrl, graph);
+  idxcopy(nvtxs, vmap, graph->where);
+  idxwspacefree(ctrl, nvtxs+2*graph->nbnd);
+
+  Compute2WayNodePartitionParams(ctrl, graph);
+
+  ASSERT(CheckNodePartitionParams(graph));
+
+  FM_2WayNodeRefine_OneSided(ctrl, graph, ubfactor, 6); 
+
+  ASSERT(IsSeparable(graph));
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/sfm.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/sfm.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/sfm.c	(revision 9501)
@@ -0,0 +1,1069 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * sfm.c
+ *
+ * This file contains code that implementes an FM-based separator refinement
+ *
+ * Started 8/1/97
+ * George
+ *
+ * $Id: sfm.c,v 1.1 1998/11/27 17:59:30 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function performs a node-based FM refinement 
+**************************************************************************/
+void FM_2WayNodeRefine(CtrlType *ctrl, GraphType *graph, float ubfactor, int npasses)
+{
+  int i, ii, j, k, jj, kk, nvtxs, nbnd, nswaps, nmind;
+  idxtype *xadj, *vwgt, *adjncy, *where, *pwgts, *edegrees, *bndind, *bndptr;
+  idxtype *mptr, *mind, *moved, *swaps, *perm;
+  PQueueType parts[2]; 
+  NRInfoType *rinfo;
+  int higain, oldgain, mincut, initcut, mincutorder;	
+  int pass, to, other, limit;
+  int badmaxpwgt, mindiff, newdiff;
+  int u[2], g[2];
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+  where = graph->where;
+  pwgts = graph->pwgts;
+  rinfo = graph->nrinfo;
+
+
+  i = ComputeMaxNodeGain(nvtxs, xadj, adjncy, vwgt);
+  PQueueInit(ctrl, &parts[0], nvtxs, i);
+  PQueueInit(ctrl, &parts[1], nvtxs, i);
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  mptr = idxwspacemalloc(ctrl, nvtxs+1);
+  mind = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+    printf("Partitions: [%6d %6d] Nv-Nb[%6d %6d]. ISep: %6d\n", pwgts[0], pwgts[1], graph->nvtxs, graph->nbnd, graph->mincut));
+
+  badmaxpwgt = (int)(ubfactor*(pwgts[0]+pwgts[1]+pwgts[2])/2);
+
+  for (pass=0; pass<npasses; pass++) {
+    idxset(nvtxs, -1, moved);
+    PQueueReset(&parts[0]);
+    PQueueReset(&parts[1]);
+
+    mincutorder = -1;
+    initcut = mincut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      ASSERT(where[i] == 2);
+      PQueueInsert(&parts[0], i, vwgt[i]-rinfo[i].edegrees[1]);
+      PQueueInsert(&parts[1], i, vwgt[i]-rinfo[i].edegrees[0]);
+    }
+
+    ASSERT(CheckNodeBnd(graph, nbnd));
+    ASSERT(CheckNodePartitionParams(graph));
+
+    limit = (ctrl->oflags&OFLAG_COMPRESS ? amin(5*nbnd, 400) : amin(2*nbnd, 300));
+
+    /******************************************************
+    * Get into the FM loop
+    *******************************************************/
+    mptr[0] = nmind = 0;
+    mindiff = abs(pwgts[0]-pwgts[1]);
+    to = (pwgts[0] < pwgts[1] ? 0 : 1);
+    for (nswaps=0; nswaps<nvtxs; nswaps++) {
+      u[0] = PQueueSeeMax(&parts[0]);  
+      u[1] = PQueueSeeMax(&parts[1]);
+      if (u[0] != -1 && u[1] != -1) {
+        g[0] = vwgt[u[0]]-rinfo[u[0]].edegrees[1];
+        g[1] = vwgt[u[1]]-rinfo[u[1]].edegrees[0];
+
+        to = (g[0] > g[1] ? 0 : (g[0] < g[1] ? 1 : pass%2)); 
+        /* to = (g[0] > g[1] ? 0 : (g[0] < g[1] ? 1 : (pwgts[0] < pwgts[1] ? 0 : 1))); */
+
+        if (pwgts[to]+vwgt[u[to]] > badmaxpwgt) 
+          to = (to+1)%2;
+      }
+      else if (u[0] == -1 && u[1] == -1) {
+        break;
+      }
+      else if (u[0] != -1 && pwgts[0]+vwgt[u[0]] <= badmaxpwgt) {
+        to = 0;
+      }
+      else if (u[1] != -1 && pwgts[1]+vwgt[u[1]] <= badmaxpwgt) {
+        to = 1;
+      }
+      else
+        break;
+
+      other = (to+1)%2;
+
+      higain = PQueueGetMax(&parts[to]);
+      if (moved[higain] == -1) /* Delete if it was in the separator originally */
+        PQueueDelete(&parts[other], higain, vwgt[higain]-rinfo[higain].edegrees[to]);
+
+      ASSERT(bndptr[higain] != -1);
+
+      pwgts[2] -= (vwgt[higain]-rinfo[higain].edegrees[other]);
+
+      newdiff = abs(pwgts[to]+vwgt[higain] - (pwgts[other]-rinfo[higain].edegrees[other]));
+      if (pwgts[2] < mincut || (pwgts[2] == mincut && newdiff < mindiff)) {
+        mincut = pwgts[2];
+        mincutorder = nswaps;
+        mindiff = newdiff;
+      }
+      else {
+        if (nswaps - mincutorder > limit) {
+          pwgts[2] += (vwgt[higain]-rinfo[higain].edegrees[other]);
+          break; /* No further improvement, break out */
+        }
+      }
+
+      BNDDelete(nbnd, bndind, bndptr, higain);
+      pwgts[to] += vwgt[higain];
+      where[higain] = to;
+      moved[higain] = nswaps;
+      swaps[nswaps] = higain;  
+
+
+      /**********************************************************
+      * Update the degrees of the affected nodes
+      ***********************************************************/
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        if (where[k] == 2) { /* For the in-separator vertices modify their edegree[to] */
+          oldgain = vwgt[k]-rinfo[k].edegrees[to];
+          rinfo[k].edegrees[to] += vwgt[higain];
+          if (moved[k] == -1 || moved[k] == -(2+other))
+            PQueueUpdate(&parts[other], k, oldgain, oldgain-vwgt[higain]);
+        }
+        else if (where[k] == other) { /* This vertex is pulled into the separator */
+          ASSERTP(bndptr[k] == -1, ("%d %d %d\n", k, bndptr[k], where[k]));
+          BNDInsert(nbnd, bndind, bndptr, k);
+
+          mind[nmind++] = k;  /* Keep track for rollback */
+          where[k] = 2;
+          pwgts[other] -= vwgt[k];
+
+          edegrees = rinfo[k].edegrees;
+          edegrees[0] = edegrees[1] = 0;
+          for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+            kk = adjncy[jj];
+            if (where[kk] != 2) 
+              edegrees[where[kk]] += vwgt[kk];
+            else {
+              oldgain = vwgt[kk]-rinfo[kk].edegrees[other];
+              rinfo[kk].edegrees[other] -= vwgt[k];
+              if (moved[kk] == -1 || moved[kk] == -(2+to))
+                PQueueUpdate(&parts[to], kk, oldgain, oldgain+vwgt[k]);
+            }
+          }
+
+          /* Insert the new vertex into the priority queue. Only one side! */
+          if (moved[k] == -1) {
+            PQueueInsert(&parts[to], k, vwgt[k]-edegrees[other]);
+            moved[k] = -(2+to);
+          }
+        }
+      }
+      mptr[nswaps+1] = nmind;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO,
+            printf("Moved %6d to %3d, Gain: %5d [%5d] [%4d %4d] \t[%5d %5d %5d]\n", higain, to, g[to], g[other], vwgt[u[to]], vwgt[u[other]], pwgts[0], pwgts[1], pwgts[2]));
+
+    }
+
+
+    /****************************************************************
+    * Roll back computation 
+    *****************************************************************/
+    for (nswaps--; nswaps>mincutorder; nswaps--) {
+      higain = swaps[nswaps];
+
+      ASSERT(CheckNodePartitionParams(graph));
+
+      to = where[higain];
+      other = (to+1)%2;
+      INC_DEC(pwgts[2], pwgts[to], vwgt[higain]);
+      where[higain] = 2;
+      BNDInsert(nbnd, bndind, bndptr, higain);
+
+      edegrees = rinfo[higain].edegrees;
+      edegrees[0] = edegrees[1] = 0;
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        if (where[k] == 2) 
+          rinfo[k].edegrees[to] -= vwgt[higain];
+        else
+          edegrees[where[k]] += vwgt[k];
+      }
+
+      /* Push nodes out of the separator */
+      for (j=mptr[nswaps]; j<mptr[nswaps+1]; j++) {
+        k = mind[j];
+        ASSERT(where[k] == 2);
+        where[k] = other;
+        INC_DEC(pwgts[other], pwgts[2], vwgt[k]);
+        BNDDelete(nbnd, bndind, bndptr, k);
+        for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+          kk = adjncy[jj];
+          if (where[kk] == 2) 
+            rinfo[kk].edegrees[other] += vwgt[k];
+        }
+      }
+    }
+
+    ASSERT(mincut == pwgts[2]);
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+      printf("\tMinimum sep: %6d at %5d, PWGTS: [%6d %6d], NBND: %6d\n", mincut, mincutorder, pwgts[0], pwgts[1], nbnd));
+
+    graph->mincut = mincut;
+    graph->nbnd = nbnd;
+
+    if (mincutorder == -1 || mincut >= initcut)
+      break;
+  }
+
+  PQueueFree(ctrl, &parts[0]);
+  PQueueFree(ctrl, &parts[1]);
+
+  idxwspacefree(ctrl, nvtxs+1);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+/*************************************************************************
+* This function performs a node-based FM refinement 
+**************************************************************************/
+void FM_2WayNodeRefine2(CtrlType *ctrl, GraphType *graph, float ubfactor, int npasses)
+{
+  int i, ii, j, k, jj, kk, nvtxs, nbnd, nswaps, nmind;
+  idxtype *xadj, *vwgt, *adjncy, *where, *pwgts, *edegrees, *bndind, *bndptr;
+  idxtype *mptr, *mind, *moved, *swaps, *perm;
+  PQueueType parts[2]; 
+  NRInfoType *rinfo;
+  int higain, oldgain, mincut, initcut, mincutorder;	
+  int pass, to, other, limit;
+  int badmaxpwgt, mindiff, newdiff;
+  int u[2], g[2];
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+  where = graph->where;
+  pwgts = graph->pwgts;
+  rinfo = graph->nrinfo;
+
+
+  i = ComputeMaxNodeGain(nvtxs, xadj, adjncy, vwgt);
+  PQueueInit(ctrl, &parts[0], nvtxs, i);
+  PQueueInit(ctrl, &parts[1], nvtxs, i);
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  mptr = idxwspacemalloc(ctrl, nvtxs+1);
+  mind = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+    printf("Partitions: [%6d %6d] Nv-Nb[%6d %6d]. ISep: %6d\n", pwgts[0], pwgts[1], graph->nvtxs, graph->nbnd, graph->mincut));
+
+  badmaxpwgt = (int)(ubfactor*(pwgts[0]+pwgts[1]+pwgts[2])/2);
+
+  for (pass=0; pass<npasses; pass++) {
+    idxset(nvtxs, -1, moved);
+    PQueueReset(&parts[0]);
+    PQueueReset(&parts[1]);
+
+    mincutorder = -1;
+    initcut = mincut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      ASSERT(where[i] == 2);
+      PQueueInsert(&parts[0], i, vwgt[i]-rinfo[i].edegrees[1]);
+      PQueueInsert(&parts[1], i, vwgt[i]-rinfo[i].edegrees[0]);
+    }
+
+    ASSERT(CheckNodeBnd(graph, nbnd));
+    ASSERT(CheckNodePartitionParams(graph));
+
+    limit = (ctrl->oflags&OFLAG_COMPRESS ? amin(5*nbnd, 400) : amin(2*nbnd, 300));
+
+    /******************************************************
+    * Get into the FM loop
+    *******************************************************/
+    mptr[0] = nmind = 0;
+    mindiff = abs(pwgts[0]-pwgts[1]);
+    to = (pwgts[0] < pwgts[1] ? 0 : 1);
+    for (nswaps=0; nswaps<nvtxs; nswaps++) {
+      badmaxpwgt = (int)(ubfactor*(pwgts[0]+pwgts[1]+pwgts[2]/2)/2);
+
+      u[0] = PQueueSeeMax(&parts[0]);  
+      u[1] = PQueueSeeMax(&parts[1]);
+      if (u[0] != -1 && u[1] != -1) {
+        g[0] = vwgt[u[0]]-rinfo[u[0]].edegrees[1];
+        g[1] = vwgt[u[1]]-rinfo[u[1]].edegrees[0];
+
+        to = (g[0] > g[1] ? 0 : (g[0] < g[1] ? 1 : pass%2)); 
+        /* to = (g[0] > g[1] ? 0 : (g[0] < g[1] ? 1 : (pwgts[0] < pwgts[1] ? 0 : 1))); */
+
+        if (pwgts[to]+vwgt[u[to]] > badmaxpwgt) 
+          to = (to+1)%2;
+      }
+      else if (u[0] == -1 && u[1] == -1) {
+        break;
+      }
+      else if (u[0] != -1 && pwgts[0]+vwgt[u[0]] <= badmaxpwgt) {
+        to = 0;
+      }
+      else if (u[1] != -1 && pwgts[1]+vwgt[u[1]] <= badmaxpwgt) {
+        to = 1;
+      }
+      else
+        break;
+
+      other = (to+1)%2;
+
+      higain = PQueueGetMax(&parts[to]);
+      if (moved[higain] == -1) /* Delete if it was in the separator originally */
+        PQueueDelete(&parts[other], higain, vwgt[higain]-rinfo[higain].edegrees[to]);
+
+      ASSERT(bndptr[higain] != -1);
+
+      pwgts[2] -= (vwgt[higain]-rinfo[higain].edegrees[other]);
+
+      newdiff = abs(pwgts[to]+vwgt[higain] - (pwgts[other]-rinfo[higain].edegrees[other]));
+      if (pwgts[2] < mincut || (pwgts[2] == mincut && newdiff < mindiff)) {
+        mincut = pwgts[2];
+        mincutorder = nswaps;
+        mindiff = newdiff;
+      }
+      else {
+        if (nswaps - mincutorder > limit) {
+          pwgts[2] += (vwgt[higain]-rinfo[higain].edegrees[other]);
+          break; /* No further improvement, break out */
+        }
+      }
+
+      BNDDelete(nbnd, bndind, bndptr, higain);
+      pwgts[to] += vwgt[higain];
+      where[higain] = to;
+      moved[higain] = nswaps;
+      swaps[nswaps] = higain;  
+
+
+      /**********************************************************
+      * Update the degrees of the affected nodes
+      ***********************************************************/
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        if (where[k] == 2) { /* For the in-separator vertices modify their edegree[to] */
+          oldgain = vwgt[k]-rinfo[k].edegrees[to];
+          rinfo[k].edegrees[to] += vwgt[higain];
+          if (moved[k] == -1 || moved[k] == -(2+other))
+            PQueueUpdate(&parts[other], k, oldgain, oldgain-vwgt[higain]);
+        }
+        else if (where[k] == other) { /* This vertex is pulled into the separator */
+          ASSERTP(bndptr[k] == -1, ("%d %d %d\n", k, bndptr[k], where[k]));
+          BNDInsert(nbnd, bndind, bndptr, k);
+
+          mind[nmind++] = k;  /* Keep track for rollback */
+          where[k] = 2;
+          pwgts[other] -= vwgt[k];
+
+          edegrees = rinfo[k].edegrees;
+          edegrees[0] = edegrees[1] = 0;
+          for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+            kk = adjncy[jj];
+            if (where[kk] != 2) 
+              edegrees[where[kk]] += vwgt[kk];
+            else {
+              oldgain = vwgt[kk]-rinfo[kk].edegrees[other];
+              rinfo[kk].edegrees[other] -= vwgt[k];
+              if (moved[kk] == -1 || moved[kk] == -(2+to))
+                PQueueUpdate(&parts[to], kk, oldgain, oldgain+vwgt[k]);
+            }
+          }
+
+          /* Insert the new vertex into the priority queue. Only one side! */
+          if (moved[k] == -1) {
+            PQueueInsert(&parts[to], k, vwgt[k]-edegrees[other]);
+            moved[k] = -(2+to);
+          }
+        }
+      }
+      mptr[nswaps+1] = nmind;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO,
+            printf("Moved %6d to %3d, Gain: %5d [%5d] [%4d %4d] \t[%5d %5d %5d]\n", higain, to, g[to], g[other], vwgt[u[to]], vwgt[u[other]], pwgts[0], pwgts[1], pwgts[2]));
+
+    }
+
+
+    /****************************************************************
+    * Roll back computation 
+    *****************************************************************/
+    for (nswaps--; nswaps>mincutorder; nswaps--) {
+      higain = swaps[nswaps];
+
+      ASSERT(CheckNodePartitionParams(graph));
+
+      to = where[higain];
+      other = (to+1)%2;
+      INC_DEC(pwgts[2], pwgts[to], vwgt[higain]);
+      where[higain] = 2;
+      BNDInsert(nbnd, bndind, bndptr, higain);
+
+      edegrees = rinfo[higain].edegrees;
+      edegrees[0] = edegrees[1] = 0;
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        if (where[k] == 2) 
+          rinfo[k].edegrees[to] -= vwgt[higain];
+        else
+          edegrees[where[k]] += vwgt[k];
+      }
+
+      /* Push nodes out of the separator */
+      for (j=mptr[nswaps]; j<mptr[nswaps+1]; j++) {
+        k = mind[j];
+        ASSERT(where[k] == 2);
+        where[k] = other;
+        INC_DEC(pwgts[other], pwgts[2], vwgt[k]);
+        BNDDelete(nbnd, bndind, bndptr, k);
+        for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+          kk = adjncy[jj];
+          if (where[kk] == 2) 
+            rinfo[kk].edegrees[other] += vwgt[k];
+        }
+      }
+    }
+
+    ASSERT(mincut == pwgts[2]);
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+      printf("\tMinimum sep: %6d at %5d, PWGTS: [%6d %6d], NBND: %6d\n", mincut, mincutorder, pwgts[0], pwgts[1], nbnd));
+
+    graph->mincut = mincut;
+    graph->nbnd = nbnd;
+
+    if (mincutorder == -1 || mincut >= initcut)
+      break;
+  }
+
+  PQueueFree(ctrl, &parts[0]);
+  PQueueFree(ctrl, &parts[1]);
+
+  idxwspacefree(ctrl, nvtxs+1);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+/*************************************************************************
+* This function performs a node-based FM refinement 
+**************************************************************************/
+void FM_2WayNodeRefineEqWgt(CtrlType *ctrl, GraphType *graph, int npasses)
+{
+  int i, ii, j, k, jj, kk, nvtxs, nbnd, nswaps, nmind;
+  idxtype *xadj, *vwgt, *adjncy, *where, *pwgts, *edegrees, *bndind, *bndptr;
+  idxtype *mptr, *mind, *moved, *swaps, *perm;
+  PQueueType parts[2]; 
+  NRInfoType *rinfo;
+  int higain, oldgain, mincut, initcut, mincutorder;	
+  int pass, to, other, limit;
+  int mindiff, newdiff;
+  int u[2], g[2];
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+  where = graph->where;
+  pwgts = graph->pwgts;
+  rinfo = graph->nrinfo;
+
+
+  i = ComputeMaxNodeGain(nvtxs, xadj, adjncy, vwgt);
+  PQueueInit(ctrl, &parts[0], nvtxs, i);
+  PQueueInit(ctrl, &parts[1], nvtxs, i);
+
+  moved = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  mptr = idxwspacemalloc(ctrl, nvtxs+1);
+  mind = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+    printf("Partitions: [%6d %6d] Nv-Nb[%6d %6d]. ISep: %6d\n", pwgts[0], pwgts[1], graph->nvtxs, graph->nbnd, graph->mincut));
+
+  for (pass=0; pass<npasses; pass++) {
+    idxset(nvtxs, -1, moved);
+    PQueueReset(&parts[0]);
+    PQueueReset(&parts[1]);
+
+    mincutorder = -1;
+    initcut = mincut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      ASSERT(where[i] == 2);
+      PQueueInsert(&parts[0], i, vwgt[i]-rinfo[i].edegrees[1]);
+      PQueueInsert(&parts[1], i, vwgt[i]-rinfo[i].edegrees[0]);
+    }
+
+    ASSERT(CheckNodeBnd(graph, nbnd));
+    ASSERT(CheckNodePartitionParams(graph));
+
+    limit = (ctrl->oflags&OFLAG_COMPRESS ? amin(5*nbnd, 400) : amin(2*nbnd, 300));
+
+    /******************************************************
+    * Get into the FM loop
+    *******************************************************/
+    mptr[0] = nmind = 0;
+    mindiff = abs(pwgts[0]-pwgts[1]);
+    to = (pwgts[0] < pwgts[1] ? 0 : 1);
+    for (nswaps=0; nswaps<nvtxs; nswaps++) {
+      to = (pwgts[0] < pwgts[1] ? 0 : 1);
+
+      if (pwgts[0] == pwgts[1]) {
+        u[0] = PQueueSeeMax(&parts[0]);  
+        u[1] = PQueueSeeMax(&parts[1]);
+        if (u[0] != -1 && u[1] != -1) {
+          g[0] = vwgt[u[0]]-rinfo[u[0]].edegrees[1];
+          g[1] = vwgt[u[1]]-rinfo[u[1]].edegrees[0];
+
+          to = (g[0] > g[1] ? 0 : (g[0] < g[1] ? 1 : pass%2)); 
+        }
+      }
+      other = (to+1)%2;
+
+      if ((higain = PQueueGetMax(&parts[to])) == -1)
+        break;
+
+      if (moved[higain] == -1) /* Delete if it was in the separator originally */
+        PQueueDelete(&parts[other], higain, vwgt[higain]-rinfo[higain].edegrees[to]);
+
+      ASSERT(bndptr[higain] != -1);
+
+      pwgts[2] -= (vwgt[higain]-rinfo[higain].edegrees[other]);
+
+      newdiff = abs(pwgts[to]+vwgt[higain] - (pwgts[other]-rinfo[higain].edegrees[other]));
+      if (pwgts[2] < mincut || (pwgts[2] == mincut && newdiff < mindiff)) {
+        mincut = pwgts[2];
+        mincutorder = nswaps;
+        mindiff = newdiff;
+      }
+      else {
+        if (nswaps - mincutorder > limit) {
+          pwgts[2] += (vwgt[higain]-rinfo[higain].edegrees[other]);
+          break; /* No further improvement, break out */
+        }
+      }
+
+      BNDDelete(nbnd, bndind, bndptr, higain);
+      pwgts[to] += vwgt[higain];
+      where[higain] = to;
+      moved[higain] = nswaps;
+      swaps[nswaps] = higain;  
+
+
+      /**********************************************************
+      * Update the degrees of the affected nodes
+      ***********************************************************/
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        if (where[k] == 2) { /* For the in-separator vertices modify their edegree[to] */
+          oldgain = vwgt[k]-rinfo[k].edegrees[to];
+          rinfo[k].edegrees[to] += vwgt[higain];
+          if (moved[k] == -1 || moved[k] == -(2+other))
+            PQueueUpdate(&parts[other], k, oldgain, oldgain-vwgt[higain]);
+        }
+        else if (where[k] == other) { /* This vertex is pulled into the separator */
+          ASSERTP(bndptr[k] == -1, ("%d %d %d\n", k, bndptr[k], where[k]));
+          BNDInsert(nbnd, bndind, bndptr, k);
+
+          mind[nmind++] = k;  /* Keep track for rollback */
+          where[k] = 2;
+          pwgts[other] -= vwgt[k];
+
+          edegrees = rinfo[k].edegrees;
+          edegrees[0] = edegrees[1] = 0;
+          for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+            kk = adjncy[jj];
+            if (where[kk] != 2) 
+              edegrees[where[kk]] += vwgt[kk];
+            else {
+              oldgain = vwgt[kk]-rinfo[kk].edegrees[other];
+              rinfo[kk].edegrees[other] -= vwgt[k];
+              if (moved[kk] == -1 || moved[kk] == -(2+to))
+                PQueueUpdate(&parts[to], kk, oldgain, oldgain+vwgt[k]);
+            }
+          }
+
+          /* Insert the new vertex into the priority queue. Only one side! */
+          if (moved[k] == -1) {
+            PQueueInsert(&parts[to], k, vwgt[k]-edegrees[other]);
+            moved[k] = -(2+to);
+          }
+        }
+      }
+      mptr[nswaps+1] = nmind;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO,
+            printf("Moved %6d to %3d, Gain: %5d [%5d] [%4d %4d] \t[%5d %5d %5d]\n", higain, to, g[to], g[other], vwgt[u[to]], vwgt[u[other]], pwgts[0], pwgts[1], pwgts[2]));
+
+    }
+
+
+    /****************************************************************
+    * Roll back computation 
+    *****************************************************************/
+    for (nswaps--; nswaps>mincutorder; nswaps--) {
+      higain = swaps[nswaps];
+
+      ASSERT(CheckNodePartitionParams(graph));
+
+      to = where[higain];
+      other = (to+1)%2;
+      INC_DEC(pwgts[2], pwgts[to], vwgt[higain]);
+      where[higain] = 2;
+      BNDInsert(nbnd, bndind, bndptr, higain);
+
+      edegrees = rinfo[higain].edegrees;
+      edegrees[0] = edegrees[1] = 0;
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        if (where[k] == 2) 
+          rinfo[k].edegrees[to] -= vwgt[higain];
+        else
+          edegrees[where[k]] += vwgt[k];
+      }
+
+      /* Push nodes out of the separator */
+      for (j=mptr[nswaps]; j<mptr[nswaps+1]; j++) {
+        k = mind[j];
+        ASSERT(where[k] == 2);
+        where[k] = other;
+        INC_DEC(pwgts[other], pwgts[2], vwgt[k]);
+        BNDDelete(nbnd, bndind, bndptr, k);
+        for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+          kk = adjncy[jj];
+          if (where[kk] == 2) 
+            rinfo[kk].edegrees[other] += vwgt[k];
+        }
+      }
+    }
+
+    ASSERT(mincut == pwgts[2]);
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+      printf("\tMinimum sep: %6d at %5d, PWGTS: [%6d %6d], NBND: %6d\n", mincut, mincutorder, pwgts[0], pwgts[1], nbnd));
+
+    graph->mincut = mincut;
+    graph->nbnd = nbnd;
+
+    if (mincutorder == -1 || mincut >= initcut)
+      break;
+  }
+
+  PQueueFree(ctrl, &parts[0]);
+  PQueueFree(ctrl, &parts[1]);
+
+  idxwspacefree(ctrl, nvtxs+1);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+/*************************************************************************
+* This function performs a node-based FM refinement. This is the 
+* one-way version 
+**************************************************************************/
+void FM_2WayNodeRefine_OneSided(CtrlType *ctrl, GraphType *graph, float ubfactor, int npasses)
+{
+  int i, ii, j, k, jj, kk, nvtxs, nbnd, nswaps, nmind;
+  idxtype *xadj, *vwgt, *adjncy, *where, *pwgts, *edegrees, *bndind, *bndptr;
+  idxtype *mptr, *mind, *swaps, *perm;
+  PQueueType parts; 
+  NRInfoType *rinfo;
+  int higain, oldgain, mincut, initcut, mincutorder;	
+  int pass, to, other, limit;
+  int badmaxpwgt, mindiff, newdiff;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+  where = graph->where;
+  pwgts = graph->pwgts;
+  rinfo = graph->nrinfo;
+
+  PQueueInit(ctrl, &parts, nvtxs, ComputeMaxNodeGain(nvtxs, xadj, adjncy, vwgt));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  swaps = idxwspacemalloc(ctrl, nvtxs);
+  mptr = idxwspacemalloc(ctrl, nvtxs);
+  mind = idxwspacemalloc(ctrl, nvtxs+1);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+    printf("Partitions-N1: [%6d %6d] Nv-Nb[%6d %6d]. ISep: %6d\n", pwgts[0], pwgts[1], graph->nvtxs, graph->nbnd, graph->mincut));
+
+  badmaxpwgt = (int)(ubfactor*(pwgts[0]+pwgts[1]+pwgts[2])/2);
+
+  to = (pwgts[0] < pwgts[1] ? 1 : 0);
+  for (pass=0; pass<npasses; pass++) {
+    other = to; 
+    to = (to+1)%2;
+
+    PQueueReset(&parts);
+
+    mincutorder = -1;
+    initcut = mincut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      ASSERT(where[i] == 2);
+      PQueueInsert(&parts, i, vwgt[i]-rinfo[i].edegrees[other]);
+    }
+
+    ASSERT(CheckNodeBnd(graph, nbnd));
+    ASSERT(CheckNodePartitionParams(graph));
+
+    limit = (ctrl->oflags&OFLAG_COMPRESS ? amin(5*nbnd, 400) : amin(2*nbnd, 300));
+
+    /******************************************************
+    * Get into the FM loop
+    *******************************************************/
+    mptr[0] = nmind = 0;
+    mindiff = abs(pwgts[0]-pwgts[1]);
+    for (nswaps=0; nswaps<nvtxs; nswaps++) {
+
+      if ((higain = PQueueGetMax(&parts)) == -1)
+        break;
+
+      ASSERT(bndptr[higain] != -1);
+
+      if (pwgts[to]+vwgt[higain] > badmaxpwgt)
+        break;  /* No point going any further. Balance will be bad */
+
+      pwgts[2] -= (vwgt[higain]-rinfo[higain].edegrees[other]);
+
+      newdiff = abs(pwgts[to]+vwgt[higain] - (pwgts[other]-rinfo[higain].edegrees[other]));
+      if (pwgts[2] < mincut || (pwgts[2] == mincut && newdiff < mindiff)) {
+        mincut = pwgts[2];
+        mincutorder = nswaps;
+        mindiff = newdiff;
+      }
+      else {
+        if (nswaps - mincutorder > limit) {
+          pwgts[2] += (vwgt[higain]-rinfo[higain].edegrees[other]);
+          break; /* No further improvement, break out */
+        }
+      }
+
+      BNDDelete(nbnd, bndind, bndptr, higain);
+      pwgts[to] += vwgt[higain];
+      where[higain] = to;
+      swaps[nswaps] = higain;  
+
+
+      /**********************************************************
+      * Update the degrees of the affected nodes
+      ***********************************************************/
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        if (where[k] == 2) { /* For the in-separator vertices modify their edegree[to] */
+          rinfo[k].edegrees[to] += vwgt[higain];
+        }
+        else if (where[k] == other) { /* This vertex is pulled into the separator */
+          ASSERTP(bndptr[k] == -1, ("%d %d %d\n", k, bndptr[k], where[k]));
+          BNDInsert(nbnd, bndind, bndptr, k);
+
+          mind[nmind++] = k;  /* Keep track for rollback */
+          where[k] = 2;
+          pwgts[other] -= vwgt[k];
+
+          edegrees = rinfo[k].edegrees;
+          edegrees[0] = edegrees[1] = 0;
+          for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+            kk = adjncy[jj];
+            if (where[kk] != 2) 
+              edegrees[where[kk]] += vwgt[kk];
+            else {
+              oldgain = vwgt[kk]-rinfo[kk].edegrees[other];
+              rinfo[kk].edegrees[other] -= vwgt[k];
+
+              /* Since the moves are one-sided this vertex has not been moved yet */
+              PQueueUpdateUp(&parts, kk, oldgain, oldgain+vwgt[k]); 
+            }
+          }
+
+          /* Insert the new vertex into the priority queue. Safe due to one-sided moves */
+          PQueueInsert(&parts, k, vwgt[k]-edegrees[other]);
+        }
+      }
+      mptr[nswaps+1] = nmind;
+
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO,
+            printf("Moved %6d to %3d, Gain: %5d [%5d] \t[%5d %5d %5d] [%3d %2d]\n", 
+                       higain, to, (vwgt[higain]-rinfo[higain].edegrees[other]), vwgt[higain], pwgts[0], pwgts[1], pwgts[2], nswaps, limit));
+
+    }
+
+
+    /****************************************************************
+    * Roll back computation 
+    *****************************************************************/
+    for (nswaps--; nswaps>mincutorder; nswaps--) {
+      higain = swaps[nswaps];
+
+      ASSERT(CheckNodePartitionParams(graph));
+      ASSERT(where[higain] == to);
+
+      INC_DEC(pwgts[2], pwgts[to], vwgt[higain]);
+      where[higain] = 2;
+      BNDInsert(nbnd, bndind, bndptr, higain);
+
+      edegrees = rinfo[higain].edegrees;
+      edegrees[0] = edegrees[1] = 0;
+      for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+        k = adjncy[j];
+        if (where[k] == 2) 
+          rinfo[k].edegrees[to] -= vwgt[higain];
+        else
+          edegrees[where[k]] += vwgt[k];
+      }
+
+      /* Push nodes out of the separator */
+      for (j=mptr[nswaps]; j<mptr[nswaps+1]; j++) {
+        k = mind[j];
+        ASSERT(where[k] == 2);
+        where[k] = other;
+        INC_DEC(pwgts[other], pwgts[2], vwgt[k]);
+        BNDDelete(nbnd, bndind, bndptr, k);
+        for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+          kk = adjncy[jj];
+          if (where[kk] == 2) 
+            rinfo[kk].edegrees[other] += vwgt[k];
+        }
+      }
+    }
+
+    ASSERT(mincut == pwgts[2]);
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+      printf("\tMinimum sep: %6d at %5d, PWGTS: [%6d %6d], NBND: %6d\n", mincut, mincutorder, pwgts[0], pwgts[1], nbnd));
+
+    graph->mincut = mincut;
+    graph->nbnd = nbnd;
+
+    if (pass%2 == 1 && (mincutorder == -1 || mincut >= initcut))
+      break;
+  }
+
+  PQueueFree(ctrl, &parts);
+
+  idxwspacefree(ctrl, nvtxs+1);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function performs a node-based FM refinement 
+**************************************************************************/
+void FM_2WayNodeBalance(CtrlType *ctrl, GraphType *graph, float ubfactor)
+{
+  int i, ii, j, k, jj, kk, nvtxs, nbnd, nswaps;
+  idxtype *xadj, *vwgt, *adjncy, *where, *pwgts, *edegrees, *bndind, *bndptr;
+  idxtype *perm, *moved;
+  PQueueType parts; 
+  NRInfoType *rinfo;
+  int higain, oldgain;	
+  int pass, to, other;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+  where = graph->where;
+  pwgts = graph->pwgts;
+  rinfo = graph->nrinfo;
+
+  if (abs(pwgts[0]-pwgts[1]) < (int)((ubfactor-1.0)*(pwgts[0]+pwgts[1])))
+    return;
+  if (abs(pwgts[0]-pwgts[1]) < 3*idxsum(nvtxs, vwgt)/nvtxs)
+    return;
+
+  to = (pwgts[0] < pwgts[1] ? 0 : 1); 
+  other = (to+1)%2;
+
+  PQueueInit(ctrl, &parts, nvtxs, ComputeMaxNodeGain(nvtxs, xadj, adjncy, vwgt));
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  moved = idxset(nvtxs, -1, idxwspacemalloc(ctrl, nvtxs));
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+    printf("Partitions: [%6d %6d] Nv-Nb[%6d %6d]. ISep: %6d [B]\n", pwgts[0], pwgts[1], graph->nvtxs, graph->nbnd, graph->mincut));
+
+  nbnd = graph->nbnd;
+  RandomPermute(nbnd, perm, 1);
+  for (ii=0; ii<nbnd; ii++) {
+    i = bndind[perm[ii]];
+    ASSERT(where[i] == 2);
+    PQueueInsert(&parts, i, vwgt[i]-rinfo[i].edegrees[other]);
+  }
+
+  ASSERT(CheckNodeBnd(graph, nbnd));
+  ASSERT(CheckNodePartitionParams(graph));
+
+  /******************************************************
+  * Get into the FM loop
+  *******************************************************/
+  for (nswaps=0; nswaps<nvtxs; nswaps++) {
+    if ((higain = PQueueGetMax(&parts)) == -1)
+      break;
+
+    moved[higain] = 1;
+
+    if (pwgts[other] - rinfo[higain].edegrees[other] < (pwgts[0]+pwgts[1])/2) 
+      continue;
+#ifdef XXX
+    if (pwgts[other] - rinfo[higain].edegrees[other] < pwgts[to]+vwgt[higain]) 
+      break;
+#endif
+
+    ASSERT(bndptr[higain] != -1);
+
+    pwgts[2] -= (vwgt[higain]-rinfo[higain].edegrees[other]);
+
+    BNDDelete(nbnd, bndind, bndptr, higain);
+    pwgts[to] += vwgt[higain];
+    where[higain] = to;
+
+    IFSET(ctrl->dbglvl, DBG_MOVEINFO,
+          printf("Moved %6d to %3d, Gain: %3d, \t[%5d %5d %5d]\n", higain, to, vwgt[higain]-rinfo[higain].edegrees[other], pwgts[0], pwgts[1], pwgts[2]));
+
+
+    /**********************************************************
+    * Update the degrees of the affected nodes
+    ***********************************************************/
+    for (j=xadj[higain]; j<xadj[higain+1]; j++) {
+      k = adjncy[j];
+      if (where[k] == 2) { /* For the in-separator vertices modify their edegree[to] */
+        rinfo[k].edegrees[to] += vwgt[higain];
+      }
+      else if (where[k] == other) { /* This vertex is pulled into the separator */
+        ASSERTP(bndptr[k] == -1, ("%d %d %d\n", k, bndptr[k], where[k]));
+        BNDInsert(nbnd, bndind, bndptr, k);
+
+        where[k] = 2;
+        pwgts[other] -= vwgt[k];
+
+        edegrees = rinfo[k].edegrees;
+        edegrees[0] = edegrees[1] = 0;
+        for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+          kk = adjncy[jj];
+          if (where[kk] != 2) 
+            edegrees[where[kk]] += vwgt[kk];
+          else {
+            ASSERT(bndptr[kk] != -1);
+            oldgain = vwgt[kk]-rinfo[kk].edegrees[other];
+            rinfo[kk].edegrees[other] -= vwgt[k];
+
+            if (moved[kk] == -1)
+              PQueueUpdateUp(&parts, kk, oldgain, oldgain+vwgt[k]);
+          }
+        }
+
+        /* Insert the new vertex into the priority queue */
+        PQueueInsert(&parts, k, vwgt[k]-edegrees[other]);
+      }
+    }
+
+    if (pwgts[to] > pwgts[other])
+      break;
+  }
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+    printf("\tBalanced sep: %6d at %4d, PWGTS: [%6d %6d], NBND: %6d\n", pwgts[2], nswaps, pwgts[0], pwgts[1], nbnd));
+
+  graph->mincut = pwgts[2];
+  graph->nbnd = nbnd;
+
+
+  PQueueFree(ctrl, &parts);
+
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+/*************************************************************************
+* This function computes the maximum possible gain for a vertex
+**************************************************************************/
+int ComputeMaxNodeGain(int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt)
+{
+  int i, j, k, max;
+
+  max = 0;
+  for (j=xadj[0]; j<xadj[1]; j++)
+    max += vwgt[adjncy[j]];
+
+  for (i=1; i<nvtxs; i++) {
+    for (k=0, j=xadj[i]; j<xadj[i+1]; j++)
+      k += vwgt[adjncy[j]];
+    if (max < k)
+      max = k;
+  }
+
+  return max;
+}
+   
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/srefine.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/srefine.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/srefine.c	(revision 9501)
@@ -0,0 +1,169 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * srefine.c
+ *
+ * This file contains code for the separator refinement algortihms
+ *
+ * Started 8/1/97
+ * George
+ *
+ * $Id: srefine.c,v 1.1 1998/11/27 17:59:30 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function is the entry point of the separator refinement
+**************************************************************************/
+void Refine2WayNode(CtrlType *ctrl, GraphType *orggraph, GraphType *graph, float ubfactor)
+{
+
+  IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->UncoarsenTmr));
+
+  for (;;) {
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->RefTmr));
+    if (ctrl->RType != 15)
+      FM_2WayNodeBalance(ctrl, graph, ubfactor); 
+
+    switch (ctrl->RType) {
+      case 1:
+        FM_2WayNodeRefine(ctrl, graph, ubfactor, 8); 
+        break;
+      case 2:
+        FM_2WayNodeRefine_OneSided(ctrl, graph, ubfactor, 8); 
+        break;
+      case 3:
+        FM_2WayNodeRefine(ctrl, graph, ubfactor, 8); 
+        FM_2WayNodeRefine_OneSided(ctrl, graph, ubfactor, 8); 
+        break;
+      case 4:
+        FM_2WayNodeRefine_OneSided(ctrl, graph, ubfactor, 8); 
+        FM_2WayNodeRefine(ctrl, graph, ubfactor, 8); 
+        break;
+      case 5:
+        FM_2WayNodeRefineEqWgt(ctrl, graph, 8); 
+        break;
+    }
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->RefTmr));
+
+    if (graph == orggraph) 
+      break;
+
+    graph = graph->finer;
+    IFSET(ctrl->dbglvl, DBG_TIME, starttimer(ctrl->ProjectTmr));
+    Project2WayNodePartition(ctrl, graph);
+    IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->ProjectTmr));
+  }
+
+  IFSET(ctrl->dbglvl, DBG_TIME, stoptimer(ctrl->UncoarsenTmr));
+}
+
+
+/*************************************************************************
+* This function allocates memory for 2-way edge refinement
+**************************************************************************/
+void Allocate2WayNodePartitionMemory(CtrlType *ctrl, GraphType *graph)
+{
+  int nvtxs, pad64;
+
+  nvtxs = graph->nvtxs;
+
+  pad64 = (3*nvtxs+3)%2;
+
+  graph->rdata = idxmalloc(3*nvtxs+3+(sizeof(NRInfoType)/sizeof(idxtype))*nvtxs+pad64, "Allocate2WayPartitionMemory: rdata");
+  graph->pwgts          = graph->rdata;
+  graph->where          = graph->rdata + 3;
+  graph->bndptr         = graph->rdata + nvtxs + 3;
+  graph->bndind         = graph->rdata + 2*nvtxs + 3;
+  graph->nrinfo         = (NRInfoType *)(graph->rdata + 3*nvtxs + 3 + pad64);
+}
+
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void Compute2WayNodePartitionParams(CtrlType *ctrl, GraphType *graph)
+{
+  int i, j, k, l, nvtxs, nbnd;
+  idxtype *xadj, *adjncy, *adjwgt, *vwgt;
+  idxtype *where, *pwgts, *bndind, *bndptr, *edegrees;
+  NRInfoType *rinfo;
+  int me, other;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  vwgt = graph->vwgt;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  rinfo = graph->nrinfo;
+  pwgts = idxset(3, 0, graph->pwgts);
+  bndind = graph->bndind;
+  bndptr = idxset(nvtxs, -1, graph->bndptr);
+
+
+  /*------------------------------------------------------------
+  / Compute now the separator external degrees
+  /------------------------------------------------------------*/
+  nbnd = 0;
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+    pwgts[me] += vwgt[i];
+
+    ASSERT(me >=0 && me <= 2);
+
+    if (me == 2) { /* If it is on the separator do some computations */
+      BNDInsert(nbnd, bndind, bndptr, i);
+
+      edegrees = rinfo[i].edegrees;
+      edegrees[0] = edegrees[1] = 0;
+
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        other = where[adjncy[j]];
+        if (other != 2)
+          edegrees[other] += vwgt[adjncy[j]];
+      }
+    }
+  }
+
+  ASSERT(CheckNodeBnd(graph, nbnd));
+
+  graph->mincut = pwgts[2];
+  graph->nbnd = nbnd;
+}
+
+
+/*************************************************************************
+* This function computes the initial id/ed 
+**************************************************************************/
+void Project2WayNodePartition(CtrlType *ctrl, GraphType *graph)
+{
+  int i, j, nvtxs;
+  idxtype *cmap, *where, *cwhere;
+  GraphType *cgraph;
+
+  cgraph = graph->coarser;
+  cwhere = cgraph->where;
+
+  nvtxs = graph->nvtxs;
+  cmap = graph->cmap;
+
+  Allocate2WayNodePartitionMemory(ctrl, graph);
+  where = graph->where;
+  
+  /* Project the partition */
+  for (i=0; i<nvtxs; i++) {
+    where[i] = cwhere[cmap[i]];
+    ASSERTP(where[i] >= 0 && where[i] <= 2, ("%d %d %d %d\n", i, cmap[i], where[i], cwhere[cmap[i]]));
+  }
+
+  FreeGraph(graph->coarser);
+  graph->coarser = NULL;
+
+  Compute2WayNodePartitionParams(ctrl, graph);
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/stat.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/stat.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/stat.c	(revision 9501)
@@ -0,0 +1,287 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * stat.c
+ *
+ * This file computes various statistics
+ *
+ * Started 7/25/97
+ * George
+ *
+ * $Id: stat.c,v 1.1 1998/11/27 17:59:31 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function computes cuts and balance information
+**************************************************************************/
+void ComputePartitionInfo(GraphType *graph, int nparts, idxtype *where)
+{
+  int i, j, k, nvtxs, ncon, mustfree=0;
+  idxtype *xadj, *adjncy, *vwgt, *adjwgt, *kpwgts, *tmpptr;
+  idxtype *padjncy, *padjwgt, *padjcut;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+  adjwgt = graph->adjwgt;
+
+  if (vwgt == NULL) {
+    vwgt = graph->vwgt = idxsmalloc(nvtxs, 1, "vwgt");
+    mustfree = 1;
+  }
+  if (adjwgt == NULL) {
+    adjwgt = graph->adjwgt = idxsmalloc(xadj[nvtxs], 1, "adjwgt");
+    mustfree += 2;
+  }
+
+  printf("%d-way Cut: %5d, Vol: %5d, ", nparts, ComputeCut(graph, where), ComputeVolume(graph, where));
+
+  /* Compute balance information */
+  kpwgts = idxsmalloc(ncon*nparts, 0, "ComputePartitionInfo: kpwgts");
+
+  for (i=0; i<nvtxs; i++) {
+    for (j=0; j<ncon; j++) 
+      kpwgts[where[i]*ncon+j] += vwgt[i*ncon+j];
+  }
+
+  if (ncon == 1) {
+    printf("\tBalance: %5.3f out of %5.3f\n", 
+            1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts)),
+            1.0*nparts*vwgt[idxamax(nvtxs, vwgt)]/(1.0*idxsum(nparts, kpwgts)));
+  }
+  else {
+    printf("\tBalance:");
+    for (j=0; j<ncon; j++) 
+      printf(" (%5.3f out of %5.3f)", 
+            1.0*nparts*kpwgts[ncon*idxamax_strd(nparts, kpwgts+j, ncon)+j]/(1.0*idxsum_strd(nparts, kpwgts+j, ncon)),
+            1.0*nparts*vwgt[ncon*idxamax_strd(nvtxs, vwgt+j, ncon)+j]/(1.0*idxsum_strd(nparts, kpwgts+j, ncon)));
+    printf("\n");
+  }
+
+
+  /* Compute p-adjncy information */
+  padjncy = idxsmalloc(nparts*nparts, 0, "ComputePartitionInfo: padjncy");
+  padjwgt = idxsmalloc(nparts*nparts, 0, "ComputePartitionInfo: padjwgt");
+  padjcut = idxsmalloc(nparts*nparts, 0, "ComputePartitionInfo: padjwgt");
+
+  idxset(nparts, 0, kpwgts);
+  for (i=0; i<nvtxs; i++) {
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (where[i] != where[adjncy[j]]) {
+        padjncy[where[i]*nparts+where[adjncy[j]]] = 1;
+        padjcut[where[i]*nparts+where[adjncy[j]]] += adjwgt[j];
+        if (kpwgts[where[adjncy[j]]] == 0) {
+          padjwgt[where[i]*nparts+where[adjncy[j]]]++;
+          kpwgts[where[adjncy[j]]] = 1;
+        }
+      }
+    }
+    for (j=xadj[i]; j<xadj[i+1]; j++) 
+      kpwgts[where[adjncy[j]]] = 0;
+  }
+
+  for (i=0; i<nparts; i++)
+    kpwgts[i] = idxsum(nparts, padjncy+i*nparts);
+  printf("Min/Max/Avg/Bal # of adjacent     subdomains: %5d %5d %5.2f %7.3f\n",
+    kpwgts[idxamin(nparts, kpwgts)], kpwgts[idxamax(nparts, kpwgts)], 
+    1.0*idxsum(nparts, kpwgts)/(1.0*nparts), 
+    1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts)));
+
+  for (i=0; i<nparts; i++)
+    kpwgts[i] = idxsum(nparts, padjcut+i*nparts);
+  printf("Min/Max/Avg/Bal # of adjacent subdomain cuts: %5d %5d %5d %7.3f\n",
+    kpwgts[idxamin(nparts, kpwgts)], kpwgts[idxamax(nparts, kpwgts)], idxsum(nparts, kpwgts)/nparts, 
+    1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts)));
+
+  for (i=0; i<nparts; i++)
+    kpwgts[i] = idxsum(nparts, padjwgt+i*nparts);
+  printf("Min/Max/Avg/Bal/Frac # of interface    nodes: %5d %5d %5d %7.3f %7.3f\n",
+    kpwgts[idxamin(nparts, kpwgts)], kpwgts[idxamax(nparts, kpwgts)], idxsum(nparts, kpwgts)/nparts, 
+    1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts)), 1.0*idxsum(nparts, kpwgts)/(1.0*nvtxs));
+
+  tmpptr = graph->where;
+  graph->where = where;
+  for (i=0; i<nparts; i++)
+    IsConnectedSubdomain(NULL, graph, i, 1);
+  graph->where = tmpptr;
+
+  if (mustfree == 1 || mustfree == 3) {
+    free(vwgt);
+    graph->vwgt = NULL;
+  }
+  if (mustfree == 2 || mustfree == 3) {
+    free(adjwgt);
+    graph->adjwgt = NULL;
+  }
+
+  GKfree(&kpwgts, &padjncy, &padjwgt, &padjcut, LTERM);
+}
+
+
+/*************************************************************************
+* This function computes cuts and balance information
+**************************************************************************/
+void ComputePartitionInfoBipartite(GraphType *graph, int nparts, idxtype *where)
+{
+  int i, j, k, nvtxs, ncon, mustfree=0;
+  idxtype *xadj, *adjncy, *vwgt, *vsize, *adjwgt, *kpwgts, *tmpptr;
+  idxtype *padjncy, *padjwgt, *padjcut;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+  vsize = graph->vsize;
+  adjwgt = graph->adjwgt;
+
+  if (vwgt == NULL) {
+    vwgt = graph->vwgt = idxsmalloc(nvtxs, 1, "vwgt");
+    mustfree = 1;
+  }
+  if (adjwgt == NULL) {
+    adjwgt = graph->adjwgt = idxsmalloc(xadj[nvtxs], 1, "adjwgt");
+    mustfree += 2;
+  }
+
+  printf("%d-way Cut: %5d, Vol: %5d, ", nparts, ComputeCut(graph, where), ComputeVolume(graph, where));
+
+  /* Compute balance information */
+  kpwgts = idxsmalloc(ncon*nparts, 0, "ComputePartitionInfo: kpwgts");
+
+  for (i=0; i<nvtxs; i++) {
+    for (j=0; j<ncon; j++) 
+      kpwgts[where[i]*ncon+j] += vwgt[i*ncon+j];
+  }
+
+  if (ncon == 1) {
+    printf("\tBalance: %5.3f out of %5.3f\n", 
+            1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts)),
+            1.0*nparts*vwgt[idxamax(nvtxs, vwgt)]/(1.0*idxsum(nparts, kpwgts)));
+  }
+  else {
+    printf("\tBalance:");
+    for (j=0; j<ncon; j++) 
+      printf(" (%5.3f out of %5.3f)", 
+            1.0*nparts*kpwgts[ncon*idxamax_strd(nparts, kpwgts+j, ncon)+j]/(1.0*idxsum_strd(nparts, kpwgts+j, ncon)),
+            1.0*nparts*vwgt[ncon*idxamax_strd(nvtxs, vwgt+j, ncon)+j]/(1.0*idxsum_strd(nparts, kpwgts+j, ncon)));
+    printf("\n");
+  }
+
+
+  /* Compute p-adjncy information */
+  padjncy = idxsmalloc(nparts*nparts, 0, "ComputePartitionInfo: padjncy");
+  padjwgt = idxsmalloc(nparts*nparts, 0, "ComputePartitionInfo: padjwgt");
+  padjcut = idxsmalloc(nparts*nparts, 0, "ComputePartitionInfo: padjwgt");
+
+  idxset(nparts, 0, kpwgts);
+  for (i=0; i<nvtxs; i++) {
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (where[i] != where[adjncy[j]]) {
+        padjncy[where[i]*nparts+where[adjncy[j]]] = 1;
+        padjcut[where[i]*nparts+where[adjncy[j]]] += adjwgt[j];
+        if (kpwgts[where[adjncy[j]]] == 0) {
+          padjwgt[where[i]*nparts+where[adjncy[j]]] += vsize[i];
+          kpwgts[where[adjncy[j]]] = 1;
+        }
+      }
+    }
+    for (j=xadj[i]; j<xadj[i+1]; j++) 
+      kpwgts[where[adjncy[j]]] = 0;
+  }
+
+  for (i=0; i<nparts; i++)
+    kpwgts[i] = idxsum(nparts, padjncy+i*nparts);
+  printf("Min/Max/Avg/Bal # of adjacent     subdomains: %5d %5d %5d %7.3f\n",
+    kpwgts[idxamin(nparts, kpwgts)], kpwgts[idxamax(nparts, kpwgts)], idxsum(nparts, kpwgts)/nparts, 
+    1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts)));
+
+  for (i=0; i<nparts; i++)
+    kpwgts[i] = idxsum(nparts, padjcut+i*nparts);
+  printf("Min/Max/Avg/Bal # of adjacent subdomain cuts: %5d %5d %5d %7.3f\n",
+    kpwgts[idxamin(nparts, kpwgts)], kpwgts[idxamax(nparts, kpwgts)], idxsum(nparts, kpwgts)/nparts, 
+    1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts)));
+
+  for (i=0; i<nparts; i++)
+    kpwgts[i] = idxsum(nparts, padjwgt+i*nparts);
+  printf("Min/Max/Avg/Bal/Frac # of interface    nodes: %5d %5d %5d %7.3f %7.3f\n",
+    kpwgts[idxamin(nparts, kpwgts)], kpwgts[idxamax(nparts, kpwgts)], idxsum(nparts, kpwgts)/nparts, 
+    1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts)), 1.0*idxsum(nparts, kpwgts)/(1.0*nvtxs));
+
+
+  if (mustfree == 1 || mustfree == 3) {
+    free(vwgt);
+    graph->vwgt = NULL;
+  }
+  if (mustfree == 2 || mustfree == 3) {
+    free(adjwgt);
+    graph->adjwgt = NULL;
+  }
+
+  GKfree(&kpwgts, &padjncy, &padjwgt, &padjcut, LTERM);
+}
+
+
+
+/*************************************************************************
+* This function computes the balance of the partitioning
+**************************************************************************/
+void ComputePartitionBalance(GraphType *graph, int nparts, idxtype *where, float *ubvec)
+{
+  int i, j, nvtxs, ncon;
+  idxtype *kpwgts, *vwgt;
+  float balance;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  vwgt = graph->vwgt;
+
+  kpwgts = idxsmalloc(nparts, 0, "ComputePartitionInfo: kpwgts");
+
+  if (vwgt == NULL) {
+    for (i=0; i<nvtxs; i++)
+      kpwgts[where[i]]++;
+    ubvec[0] = 1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*nvtxs);
+  }
+  else {
+    for (j=0; j<ncon; j++) {
+      idxset(nparts, 0, kpwgts);
+      for (i=0; i<graph->nvtxs; i++)
+        kpwgts[where[i]] += vwgt[i*ncon+j];
+
+      ubvec[j] = 1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts));
+    }
+  }
+
+  free(kpwgts);
+
+}
+
+
+/*************************************************************************
+* This function computes the balance of the element partitioning
+**************************************************************************/
+float ComputeElementBalance(int ne, int nparts, idxtype *where)
+{
+  int i;
+  idxtype *kpwgts;
+  float balance;
+
+  kpwgts = idxsmalloc(nparts, 0, "ComputeElementBalance: kpwgts");
+
+  for (i=0; i<ne; i++)
+    kpwgts[where[i]]++;
+
+  balance = 1.0*nparts*kpwgts[idxamax(nparts, kpwgts)]/(1.0*idxsum(nparts, kpwgts));
+
+  free(kpwgts);
+
+  return balance;
+
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/struct.h
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/struct.h	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/struct.h	(revision 9501)
@@ -0,0 +1,251 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * struct.h
+ *
+ * This file contains data structures for ILU routines.
+ *
+ * Started 9/26/95
+ * George
+ *
+ * $Id: struct.h,v 1.1 1998/11/27 17:59:31 karypis Exp $
+ */
+
+/* Undefine the following #define in order to use short int as the idxtype */
+#define IDXTYPE_INT
+
+/* Indexes are as long as integers for now */
+#ifdef IDXTYPE_INT
+typedef int idxtype;
+#else
+typedef short idxtype;
+#endif
+
+#define MAXIDX	(1<<8*sizeof(idxtype)-2)
+
+
+/*************************************************************************
+* The following data structure stores key-value pair
+**************************************************************************/
+struct KeyValueType {
+  idxtype key;
+  idxtype val;
+};
+
+typedef struct KeyValueType KeyValueType;
+
+
+/*************************************************************************
+* The following data structure will hold a node of a doubly-linked list.
+**************************************************************************/
+struct ListNodeType {
+  int id;                       	/* The id value of the node */
+  struct ListNodeType *prev, *next;     /* It's a doubly-linked list */
+};
+
+typedef struct ListNodeType ListNodeType;
+
+
+
+/*************************************************************************
+* The following data structure is used to store the buckets for the 
+* refinment algorithms
+**************************************************************************/
+struct PQueueType {
+  int type;                     /* The type of the representation used */
+  int nnodes;
+  int maxnodes;
+  int mustfree;
+
+  /* Linear array version of the data structures */
+  int pgainspan, ngainspan;     /* plus and negative gain span */
+  int maxgain;
+  ListNodeType *nodes;
+  ListNodeType **buckets;
+
+  /* Heap version of the data structure */
+  KeyValueType *heap;
+  idxtype *locator;
+};
+
+typedef struct PQueueType PQueueType;
+
+
+/*************************************************************************
+* The following data structure stores an edge
+**************************************************************************/
+struct edegreedef {
+  idxtype pid;
+  idxtype ed;
+};
+typedef struct edegreedef EDegreeType;
+
+
+/*************************************************************************
+* The following data structure stores an edge for vol
+**************************************************************************/
+struct vedegreedef {
+  idxtype pid;
+  idxtype ed, ned;
+  idxtype gv;
+};
+typedef struct vedegreedef VEDegreeType;
+
+
+/*************************************************************************
+* This data structure holds various working space data
+**************************************************************************/
+struct workspacedef {
+  idxtype *core;			/* Where pairs, indices, and degrees are coming from */
+  int maxcore, ccore;
+
+  EDegreeType *edegrees;
+  VEDegreeType *vedegrees;
+  int cdegree;
+
+  idxtype *auxcore;			/* This points to the memory of the edegrees */
+
+  idxtype *pmat;			/* An array of k^2 used for eliminating domain 
+                                           connectivity in k-way refinement */
+};
+
+typedef struct workspacedef WorkSpaceType;
+
+
+/*************************************************************************
+* The following data structure holds information on degrees for k-way
+* partition
+**************************************************************************/
+struct rinfodef {
+ int id, ed;            	/* ID/ED of nodes */
+ int ndegrees;          	/* The number of different ext-degrees */
+ EDegreeType *edegrees;     	/* List of edges */
+};
+
+typedef struct rinfodef RInfoType;
+
+
+/*************************************************************************
+* The following data structure holds information on degrees for k-way
+* vol-based partition
+**************************************************************************/
+struct vrinfodef {
+ int id, ed, nid;            	/* ID/ED of nodes */
+ int gv;            		/* IV/EV of nodes */
+ int ndegrees;          	/* The number of different ext-degrees */
+ VEDegreeType *edegrees;     	/* List of edges */
+};
+
+typedef struct vrinfodef VRInfoType;
+
+
+/*************************************************************************
+* The following data structure holds information on degrees for k-way
+* partition
+**************************************************************************/
+struct nrinfodef {
+ idxtype edegrees[2];  
+};
+
+typedef struct nrinfodef NRInfoType;
+
+
+/*************************************************************************
+* This data structure holds the input graph
+**************************************************************************/
+struct graphdef {
+  idxtype *gdata, *rdata;	/* Memory pools for graph and refinement data.
+                                   This is where memory is allocated and used
+                                   the rest of the fields in this structure */
+
+  int nvtxs, nedges;		/* The # of vertices and edges in the graph */
+  idxtype *xadj;		/* Pointers to the locally stored vertices */
+  idxtype *vwgt;		/* Vertex weights */
+  idxtype *vsize;		/* Vertex sizes for min-volume formulation */
+  idxtype *adjncy;		/* Array that stores the adjacency lists of nvtxs */
+  idxtype *adjwgt;		/* Array that stores the weights of the adjacency lists */
+
+  idxtype *adjwgtsum;		/* The sum of the adjacency weight of each vertex */
+
+  idxtype *label;
+
+  idxtype *cmap;
+
+  /* Partition parameters */
+  int mincut, minvol;
+  idxtype *where, *pwgts;
+  int nbnd;
+  idxtype *bndptr, *bndind;
+
+  /* Bisection refinement parameters */
+  idxtype *id, *ed;
+
+  /* K-way refinement parameters */
+  RInfoType *rinfo;
+
+  /* K-way volume refinement parameters */
+  VRInfoType *vrinfo;
+
+  /* Node refinement information */
+  NRInfoType *nrinfo;
+
+
+  /* Additional info needed by the MOC routines */
+  int ncon;			/* The # of constrains */ 
+  float *nvwgt;			/* Normalized vertex weights */
+  float *npwgts;		/* The normalized partition weights */
+
+  struct graphdef *coarser, *finer;
+};
+
+typedef struct graphdef GraphType;
+
+
+
+/*************************************************************************
+* The following data type implements a timer
+**************************************************************************/
+typedef double timer;
+
+
+/*************************************************************************
+* The following structure stores information used by Metis
+**************************************************************************/
+struct controldef {
+  int CoarsenTo;		/* The # of vertices in the coarsest graph */
+  int dbglvl;			/* Controls the debuging output of the program */
+  int CType;			/* The type of coarsening */
+  int IType;			/* The type of initial partitioning */
+  int RType;			/* The type of refinement */
+  int maxvwgt;			/* The maximum allowed weight for a vertex */
+  float nmaxvwgt;		/* The maximum allowed weight for a vertex for each constrain */
+  int optype;			/* Type of operation */
+  int pfactor;			/* .1*prunning factor */
+  int nseps;			/* The number of separators to be found during multiple bisections */
+  int oflags;
+
+  WorkSpaceType wspace;		/* Work Space Informations */
+
+  /* Various Timers */
+  timer TotalTmr, InitPartTmr, MatchTmr, ContractTmr, CoarsenTmr, UncoarsenTmr, 
+        SepTmr, RefTmr, ProjectTmr, SplitTmr, AuxTmr1, AuxTmr2, AuxTmr3, AuxTmr4, AuxTmr5, AuxTmr6;
+
+};
+
+typedef struct controldef CtrlType;
+
+
+/*************************************************************************
+* The following data structure stores max-partition weight info for 
+* Vertical MOC k-way refinement
+**************************************************************************/
+struct vpwgtdef {
+  float max[2][MAXNCON];
+  int imax[2][MAXNCON];
+};
+
+typedef struct vpwgtdef VPInfoType;
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/subdomains.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/subdomains.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/subdomains.c	(revision 9501)
@@ -0,0 +1,1295 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * subdomains.c
+ *
+ * This file contains functions that deal with prunning the number of
+ * adjacent subdomains in KMETIS
+ *
+ * Started 7/15/98
+ * George
+ *
+ * $Id: subdomains.c,v 1.1 1998/11/27 17:59:32 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Random_KWayEdgeRefineMConn(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, float ubfactor, int npasses, int ffactor)
+{
+  int i, ii, iii, j, jj, k, l, pass, nvtxs, nmoves, nbnd, tvwgt, myndegrees; 
+  int from, me, to, oldcut, vwgt, gain;
+  int maxndoms, nadd;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *bndptr, *bndind, *minwgt, *maxwgt, *itpwgts;
+  idxtype *phtable, *pmat, *pmatptr, *ndoms;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+
+  pmat = ctrl->wspace.pmat;
+  phtable = idxwspacemalloc(ctrl, nparts);
+  ndoms = idxwspacemalloc(ctrl, nparts);
+
+  ComputeSubDomainGraph(graph, nparts, pmat, ndoms);
+
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("Partitions: [%6d %6d]-[%6d %6d], Balance: %5.3f, Nv-Nb[%6d %6d]. Cut: %6d\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut));
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    maxndoms = ndoms[idxamax(nparts, ndoms)];
+
+    oldcut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (nmoves=iii=0; iii<graph->nbnd; iii++) {
+      ii = perm[iii];
+      if (ii >= nbnd)
+        continue;
+      i = bndind[ii];
+
+      myrinfo = graph->rinfo+i;
+
+      if (myrinfo->ed >= myrinfo->id) { /* Total ED is too high */
+        from = where[i];
+        vwgt = graph->vwgt[i];
+
+        if (myrinfo->id > 0 && pwgts[from]-vwgt < minwgt[from]) 
+          continue;   /* This cannot be moved! */
+
+        myedegrees = myrinfo->edegrees;
+        myndegrees = myrinfo->ndegrees;
+
+        /* Determine the valid domains */
+        for (j=0; j<myndegrees; j++) {
+          to = myedegrees[j].pid;
+          phtable[to] = 1;
+          pmatptr = pmat + to*nparts;
+          for (nadd=0, k=0; k<myndegrees; k++) {
+            if (k == j)
+              continue;
+
+            l = myedegrees[k].pid;
+            if (pmatptr[l] == 0) {
+              if (ndoms[l] > maxndoms-1) {
+                phtable[to] = 0;
+                nadd = maxndoms;
+                break;
+              }
+              nadd++;
+            }
+          }
+          if (ndoms[to]+nadd > maxndoms)
+            phtable[to] = 0;
+          if (nadd == 0)
+            phtable[to] = 2;
+        }
+
+        /* Find the first valid move */
+        j = myrinfo->id;
+        for (k=0; k<myndegrees; k++) {
+          to = myedegrees[k].pid;
+          if (!phtable[to])
+            continue;
+          gain = myedegrees[k].ed-j; /* j = myrinfo->id. Allow good nodes to move */ 
+          if (pwgts[to]+vwgt <= maxwgt[to]+ffactor*gain && gain >= 0)  
+            break;
+        }
+        if (k == myndegrees)
+          continue;  /* break out if you did not find a candidate */
+
+        for (j=k+1; j<myndegrees; j++) {
+          to = myedegrees[j].pid;
+          if (!phtable[to])
+            continue;
+          if ((myedegrees[j].ed > myedegrees[k].ed && pwgts[to]+vwgt <= maxwgt[to]) ||
+              (myedegrees[j].ed == myedegrees[k].ed && 
+               itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]))
+            k = j;
+        }
+
+        to = myedegrees[k].pid;
+
+        j = 0;
+        if (myedegrees[k].ed-myrinfo->id > 0)
+          j = 1;
+        else if (myedegrees[k].ed-myrinfo->id == 0) {
+          if (/*(iii&7) == 0  ||*/ phtable[myedegrees[k].pid] == 2 || pwgts[from] >= maxwgt[from] || itpwgts[from]*(pwgts[to]+vwgt) < itpwgts[to]*pwgts[from])
+            j = 1;
+        }
+        if (j == 0)
+          continue;
+          
+        /*=====================================================================
+        * If we got here, we can now move the vertex from 'from' to 'to' 
+        *======================================================================*/
+        graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+        IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d to %3d. Gain: %4d. Cut: %6d\n", i, to, myedegrees[k].ed-myrinfo->id, graph->mincut));
+
+        /* Update pmat to reflect the move of 'i' */
+        pmat[from*nparts+to] += (myrinfo->id-myedegrees[k].ed);
+        pmat[to*nparts+from] += (myrinfo->id-myedegrees[k].ed);
+        if (pmat[from*nparts+to] == 0) {
+          ndoms[from]--;
+          if (ndoms[from]+1 == maxndoms)
+            maxndoms = ndoms[idxamax(nparts, ndoms)];
+        }
+        if (pmat[to*nparts+from] == 0) {
+          ndoms[to]--;
+          if (ndoms[to]+1 == maxndoms)
+            maxndoms = ndoms[idxamax(nparts, ndoms)];
+        }
+
+        /* Update where, weight, and ID/ED information of the vertex you moved */
+        where[i] = to;
+        INC_DEC(pwgts[to], pwgts[from], vwgt);
+        myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+        SWAP(myrinfo->id, myedegrees[k].ed, j);
+        if (myedegrees[k].ed == 0) 
+          myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+        else
+          myedegrees[k].pid = from;
+
+        if (myrinfo->ed-myrinfo->id < 0)
+          BNDDelete(nbnd, bndind, bndptr, i);
+
+        /* Update the degrees of adjacent vertices */
+        for (j=xadj[i]; j<xadj[i+1]; j++) {
+          ii = adjncy[j];
+          me = where[ii];
+
+          myrinfo = graph->rinfo+ii;
+          if (myrinfo->edegrees == NULL) {
+            myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+            ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+          }
+          myedegrees = myrinfo->edegrees;
+
+          ASSERT(CheckRInfo(myrinfo));
+
+          if (me == from) {
+            INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+            if (myrinfo->ed-myrinfo->id >= 0 && bndptr[ii] == -1)
+              BNDInsert(nbnd, bndind, bndptr, ii);
+          }
+          else if (me == to) {
+            INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+            if (myrinfo->ed-myrinfo->id < 0 && bndptr[ii] != -1)
+              BNDDelete(nbnd, bndind, bndptr, ii);
+          }
+
+          /* Remove contribution from the .ed of 'from' */
+          if (me != from) {
+            for (k=0; k<myrinfo->ndegrees; k++) {
+              if (myedegrees[k].pid == from) {
+                if (myedegrees[k].ed == adjwgt[j])
+                  myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+                else
+                  myedegrees[k].ed -= adjwgt[j];
+                break;
+              }
+            }
+          }
+
+          /* Add contribution to the .ed of 'to' */
+          if (me != to) {
+            for (k=0; k<myrinfo->ndegrees; k++) {
+              if (myedegrees[k].pid == to) {
+                myedegrees[k].ed += adjwgt[j];
+                break;
+              }
+            }
+            if (k == myrinfo->ndegrees) {
+              myedegrees[myrinfo->ndegrees].pid = to;
+              myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+            }
+          }
+
+          /* Update pmat to reflect the move of 'i' for domains other than 'from' and 'to' */
+          if (me != from && me != to) {
+            pmat[me*nparts+from] -= adjwgt[j];
+            pmat[from*nparts+me] -= adjwgt[j];
+            if (pmat[me*nparts+from] == 0) {
+              ndoms[me]--;
+              if (ndoms[me]+1 == maxndoms)
+                maxndoms = ndoms[idxamax(nparts, ndoms)];
+            }
+            if (pmat[from*nparts+me] == 0) {
+              ndoms[from]--;
+              if (ndoms[from]+1 == maxndoms)
+                maxndoms = ndoms[idxamax(nparts, ndoms)];
+            }
+
+            if (pmat[me*nparts+to] == 0) {
+              ndoms[me]++;
+              if (ndoms[me] > maxndoms) {
+                printf("You just increased the maxndoms: %d %d\n", ndoms[me], maxndoms);
+                maxndoms = ndoms[me];
+              }
+            }
+            if (pmat[to*nparts+me] == 0) {
+              ndoms[to]++;
+              if (ndoms[to] > maxndoms) {
+                printf("You just increased the maxndoms: %d %d\n", ndoms[to], maxndoms);
+                maxndoms = ndoms[to];
+              }
+            }
+            pmat[me*nparts+to] += adjwgt[j];
+            pmat[to*nparts+me] += adjwgt[j];
+          }
+
+          ASSERT(myrinfo->ndegrees <= xadj[ii+1]-xadj[ii]);
+          ASSERT(CheckRInfo(myrinfo));
+
+        }
+        nmoves++;
+      }
+    }
+
+    graph->nbnd = nbnd;
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Nmoves: %5d, Cut: %5d, Vol: %5d, %d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, nmoves, 
+               graph->mincut, ComputeVolume(graph, where), idxsum(nparts, ndoms)));
+
+    if (graph->mincut == oldcut)
+      break;
+  }
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+}
+
+
+
+/*************************************************************************
+* This function performs k-way refinement
+**************************************************************************/
+void Greedy_KWayEdgeBalanceMConn(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, float ubfactor, int npasses)
+{
+  int i, ii, iii, j, jj, k, l, pass, nvtxs, nbnd, tvwgt, myndegrees, oldgain, gain, nmoves; 
+  int from, me, to, oldcut, vwgt, maxndoms, nadd;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *pwgts, *perm, *bndptr, *bndind, *minwgt, *maxwgt, *moved, *itpwgts;
+  idxtype *phtable, *pmat, *pmatptr, *ndoms;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+  PQueueType queue;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  bndind = graph->bndind;
+  bndptr = graph->bndptr;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+  
+  pmat = ctrl->wspace.pmat;
+  phtable = idxwspacemalloc(ctrl, nparts);
+  ndoms = idxwspacemalloc(ctrl, nparts);
+
+  ComputeSubDomainGraph(graph, nparts, pmat, ndoms);
+
+
+  /* Setup the weight intervals of the various subdomains */
+  minwgt =  idxwspacemalloc(ctrl, nparts);
+  maxwgt = idxwspacemalloc(ctrl, nparts);
+  itpwgts = idxwspacemalloc(ctrl, nparts);
+  tvwgt = idxsum(nparts, pwgts);
+  ASSERT(tvwgt == idxsum(nvtxs, graph->vwgt));
+
+  for (i=0; i<nparts; i++) {
+    itpwgts[i] = tpwgts[i]*tvwgt;
+    maxwgt[i] = tpwgts[i]*tvwgt*ubfactor;
+    minwgt[i] = tpwgts[i]*tvwgt*(1.0/ubfactor);
+  }
+
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  moved = idxwspacemalloc(ctrl, nvtxs);
+
+  PQueueInit(ctrl, &queue, nvtxs, graph->adjwgtsum[idxamax(nvtxs, graph->adjwgtsum)]);
+
+  IFSET(ctrl->dbglvl, DBG_REFINE,
+     printf("Partitions: [%6d %6d]-[%6d %6d], Balance: %5.3f, Nv-Nb[%6d %6d]. Cut: %6d [B]\n",
+             pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)], minwgt[0], maxwgt[0], 
+             1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nvtxs, graph->nbnd,
+             graph->mincut));
+
+  for (pass=0; pass<npasses; pass++) {
+    ASSERT(ComputeCut(graph, where) == graph->mincut);
+
+    /* Check to see if things are out of balance, given the tolerance */
+    for (i=0; i<nparts; i++) {
+      if (pwgts[i] > maxwgt[i])
+        break;
+    }
+    if (i == nparts) /* Things are balanced. Return right away */
+      break;
+
+    PQueueReset(&queue);
+    idxset(nvtxs, -1, moved);
+
+    oldcut = graph->mincut;
+    nbnd = graph->nbnd;
+
+    RandomPermute(nbnd, perm, 1);
+    for (ii=0; ii<nbnd; ii++) {
+      i = bndind[perm[ii]];
+      PQueueInsert(&queue, i, graph->rinfo[i].ed - graph->rinfo[i].id);
+      moved[i] = 2;
+    }
+
+    maxndoms = ndoms[idxamax(nparts, ndoms)];
+
+    for (nmoves=0;;) {
+      if ((i = PQueueGetMax(&queue)) == -1) 
+        break;
+      moved[i] = 1;
+
+      myrinfo = graph->rinfo+i;
+      from = where[i];
+      vwgt = graph->vwgt[i];
+
+      if (pwgts[from]-vwgt < minwgt[from]) 
+        continue;   /* This cannot be moved! */
+
+      myedegrees = myrinfo->edegrees;
+      myndegrees = myrinfo->ndegrees;
+
+      /* Determine the valid domains */
+      for (j=0; j<myndegrees; j++) {
+        to = myedegrees[j].pid;
+        phtable[to] = 1;
+        pmatptr = pmat + to*nparts;
+        for (nadd=0, k=0; k<myndegrees; k++) {
+          if (k == j)
+            continue;
+
+          l = myedegrees[k].pid;
+          if (pmatptr[l] == 0) {
+            if (ndoms[l] > maxndoms-1) {
+              phtable[to] = 0;
+              nadd = maxndoms;
+              break;
+            }
+            nadd++;
+          }
+        }
+        if (ndoms[to]+nadd > maxndoms)
+          phtable[to] = 0;
+      }
+
+      for (k=0; k<myndegrees; k++) {
+        to = myedegrees[k].pid;
+        if (!phtable[to])
+          continue;
+        if (pwgts[to]+vwgt <= maxwgt[to] || itpwgts[from]*(pwgts[to]+vwgt) <= itpwgts[to]*pwgts[from]) 
+          break;
+      }
+      if (k == myndegrees)
+        continue;  /* break out if you did not find a candidate */
+
+      for (j=k+1; j<myndegrees; j++) {
+        to = myedegrees[j].pid;
+        if (!phtable[to])
+          continue;
+        if (itpwgts[myedegrees[k].pid]*pwgts[to] < itpwgts[to]*pwgts[myedegrees[k].pid]) 
+          k = j;
+      }
+
+      to = myedegrees[k].pid;
+
+      if (pwgts[from] < maxwgt[from] && pwgts[to] > minwgt[to] && myedegrees[k].ed-myrinfo->id < 0) 
+        continue;
+
+      /*=====================================================================
+      * If we got here, we can now move the vertex from 'from' to 'to' 
+      *======================================================================*/
+      graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+      IFSET(ctrl->dbglvl, DBG_MOVEINFO, printf("\t\tMoving %6d to %3d. Gain: %4d. Cut: %6d\n", i, to, myedegrees[k].ed-myrinfo->id, graph->mincut));
+
+      /* Update pmat to reflect the move of 'i' */
+      pmat[from*nparts+to] += (myrinfo->id-myedegrees[k].ed);
+      pmat[to*nparts+from] += (myrinfo->id-myedegrees[k].ed);
+      if (pmat[from*nparts+to] == 0) {
+        ndoms[from]--;
+        if (ndoms[from]+1 == maxndoms)
+          maxndoms = ndoms[idxamax(nparts, ndoms)];
+      }
+      if (pmat[to*nparts+from] == 0) {
+        ndoms[to]--;
+        if (ndoms[to]+1 == maxndoms)
+          maxndoms = ndoms[idxamax(nparts, ndoms)];
+      }
+
+
+      /* Update where, weight, and ID/ED information of the vertex you moved */
+      where[i] = to;
+      INC_DEC(pwgts[to], pwgts[from], vwgt);
+      myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+      SWAP(myrinfo->id, myedegrees[k].ed, j);
+      if (myedegrees[k].ed == 0) 
+        myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+      else
+        myedegrees[k].pid = from;
+
+      if (myrinfo->ed == 0)
+        BNDDelete(nbnd, bndind, bndptr, i);
+
+      /* Update the degrees of adjacent vertices */
+      for (j=xadj[i]; j<xadj[i+1]; j++) {
+        ii = adjncy[j];
+        me = where[ii];
+
+        myrinfo = graph->rinfo+ii;
+        if (myrinfo->edegrees == NULL) {
+          myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+          ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+        }
+        myedegrees = myrinfo->edegrees;
+
+        ASSERT(CheckRInfo(myrinfo));
+
+        oldgain = (myrinfo->ed-myrinfo->id);
+
+        if (me == from) {
+          INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+          if (myrinfo->ed > 0 && bndptr[ii] == -1)
+            BNDInsert(nbnd, bndind, bndptr, ii);
+        }
+        else if (me == to) {
+          INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+          if (myrinfo->ed == 0 && bndptr[ii] != -1)
+            BNDDelete(nbnd, bndind, bndptr, ii);
+        }
+
+        /* Remove contribution from the .ed of 'from' */
+        if (me != from) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == from) {
+              if (myedegrees[k].ed == adjwgt[j])
+                myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+              else
+                myedegrees[k].ed -= adjwgt[j];
+              break;
+            }
+          }
+        }
+
+        /* Add contribution to the .ed of 'to' */
+        if (me != to) {
+          for (k=0; k<myrinfo->ndegrees; k++) {
+            if (myedegrees[k].pid == to) {
+              myedegrees[k].ed += adjwgt[j];
+              break;
+            }
+          }
+          if (k == myrinfo->ndegrees) {
+            myedegrees[myrinfo->ndegrees].pid = to;
+            myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+          }
+        }
+
+        /* Update pmat to reflect the move of 'i' for domains other than 'from' and 'to' */
+        if (me != from && me != to) {
+          pmat[me*nparts+from] -= adjwgt[j];
+          pmat[from*nparts+me] -= adjwgt[j];
+          if (pmat[me*nparts+from] == 0) {
+            ndoms[me]--;
+            if (ndoms[me]+1 == maxndoms)
+              maxndoms = ndoms[idxamax(nparts, ndoms)];
+          }
+          if (pmat[from*nparts+me] == 0) {
+            ndoms[from]--;
+            if (ndoms[from]+1 == maxndoms)
+              maxndoms = ndoms[idxamax(nparts, ndoms)];
+          }
+
+          if (pmat[me*nparts+to] == 0) {
+            ndoms[me]++;
+            if (ndoms[me] > maxndoms) {
+              printf("You just increased the maxndoms: %d %d\n", ndoms[me], maxndoms);
+              maxndoms = ndoms[me];
+            }
+          }
+          if (pmat[to*nparts+me] == 0) {
+            ndoms[to]++;
+            if (ndoms[to] > maxndoms) {
+              printf("You just increased the maxndoms: %d %d\n", ndoms[to], maxndoms);
+              maxndoms = ndoms[to];
+            }
+          }
+          pmat[me*nparts+to] += adjwgt[j];
+          pmat[to*nparts+me] += adjwgt[j];
+        }
+
+        /* Update the queue */
+        if (me == to || me == from) { 
+          gain = myrinfo->ed-myrinfo->id;
+          if (moved[ii] == 2) {
+            if (myrinfo->ed > 0)
+              PQueueUpdate(&queue, ii, oldgain, gain);
+            else {
+              PQueueDelete(&queue, ii, oldgain);
+              moved[ii] = -1;
+            }
+          }
+          else if (moved[ii] == -1 && myrinfo->ed > 0) {
+            PQueueInsert(&queue, ii, gain);
+            moved[ii] = 2;
+          }
+        } 
+
+        ASSERT(myrinfo->ndegrees <= xadj[ii+1]-xadj[ii]);
+        ASSERT(CheckRInfo(myrinfo));
+      }
+      nmoves++;
+    }
+
+    graph->nbnd = nbnd;
+
+    IFSET(ctrl->dbglvl, DBG_REFINE,
+       printf("\t[%6d %6d], Balance: %5.3f, Nb: %6d. Nmoves: %5d, Cut: %6d, %d\n",
+               pwgts[idxamin(nparts, pwgts)], pwgts[idxamax(nparts, pwgts)],
+               1.0*nparts*pwgts[idxamax(nparts, pwgts)]/tvwgt, graph->nbnd, nmoves, graph->mincut,idxsum(nparts, ndoms)));
+  }
+
+  PQueueFree(ctrl, &queue);
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
+
+
+
+/*************************************************************************
+* This function computes the subdomain graph
+**************************************************************************/
+void PrintSubDomainGraph(GraphType *graph, int nparts, idxtype *where)
+{
+  int i, j, k, me, nvtxs, total, max;
+  idxtype *xadj, *adjncy, *adjwgt, *pmat;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  pmat = idxsmalloc(nparts*nparts, 0, "ComputeSubDomainGraph: pmat");
+
+  for (i=0; i<nvtxs; i++) {
+    me = where[i];
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (where[k] != me) 
+        pmat[me*nparts+where[k]] += adjwgt[j];
+    }
+  }
+
+  /* printf("Subdomain Info\n"); */
+  total = max = 0;
+  for (i=0; i<nparts; i++) {
+    for (k=0, j=0; j<nparts; j++) {
+      if (pmat[i*nparts+j] > 0)
+        k++;
+    }
+    total += k;
+
+    if (k > max)
+      max = k;
+/*
+    printf("%2d -> %2d  ", i, k);
+    for (j=0; j<nparts; j++) {
+      if (pmat[i*nparts+j] > 0)
+        printf("[%2d %4d] ", j, pmat[i*nparts+j]);
+    }
+    printf("\n");
+*/
+  }
+  printf("Total adjacent subdomains: %d, Max: %d\n", total, max);
+
+  free(pmat);
+}
+
+
+
+/*************************************************************************
+* This function computes the subdomain graph
+**************************************************************************/
+void ComputeSubDomainGraph(GraphType *graph, int nparts, idxtype *pmat, idxtype *ndoms)
+{
+  int i, j, k, me, nvtxs, ndegrees;
+  idxtype *xadj, *adjncy, *adjwgt, *where;
+  RInfoType *rinfo;
+  EDegreeType *edegrees;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+  where = graph->where;
+  rinfo = graph->rinfo;
+
+  idxset(nparts*nparts, 0, pmat);
+
+  for (i=0; i<nvtxs; i++) {
+    if (rinfo[i].ed > 0) {
+      me = where[i];
+      ndegrees = rinfo[i].ndegrees;
+      edegrees = rinfo[i].edegrees;
+
+      k = me*nparts;
+      for (j=0; j<ndegrees; j++) 
+        pmat[k+edegrees[j].pid] += edegrees[j].ed;
+    }
+  }
+
+  for (i=0; i<nparts; i++) {
+    ndoms[i] = 0;
+    for (j=0; j<nparts; j++) {
+      if (pmat[i*nparts+j] > 0)
+        ndoms[i]++;
+    }
+  }
+
+}
+
+
+
+
+
+/*************************************************************************
+* This function computes the subdomain graph
+**************************************************************************/
+void EliminateSubDomainEdges(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts)
+{
+  int i, ii, j, k, me, other, nvtxs, total, max, avg, totalout, nind, ncand, ncand2, target, target2, nadd;
+  int min, move, cpwgt, tvwgt;
+  idxtype *xadj, *adjncy, *vwgt, *adjwgt, *pwgts, *where, *maxpwgt, *pmat, *ndoms, *mypmat, *otherpmat, *ind;
+  KeyValueType *cand, *cand2;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  pwgts = graph->pwgts;  /* We assume that this is properly initialized */
+
+  maxpwgt = idxwspacemalloc(ctrl, nparts);
+  ndoms = idxwspacemalloc(ctrl, nparts);
+  otherpmat = idxwspacemalloc(ctrl, nparts);
+  ind = idxwspacemalloc(ctrl, nvtxs);
+  pmat = ctrl->wspace.pmat;
+
+  cand = (KeyValueType *)GKmalloc(nparts*sizeof(KeyValueType), "EliminateSubDomainEdges: cand");
+  cand2 = (KeyValueType *)GKmalloc(nparts*sizeof(KeyValueType), "EliminateSubDomainEdges: cand");
+
+  /* Compute the pmat matrix and ndoms */
+  ComputeSubDomainGraph(graph, nparts, pmat, ndoms);
+
+
+  /* Compute the maximum allowed weight for each domain */
+  tvwgt = idxsum(nparts, pwgts);
+  for (i=0; i<nparts; i++)
+    maxpwgt[i] = 1.25*tpwgts[i]*tvwgt;
+
+
+  /* Get into the loop eliminating subdomain connections */
+  for (;;) {
+    total = idxsum(nparts, ndoms);
+    avg = total/nparts;
+    max = ndoms[idxamax(nparts, ndoms)];
+
+    /* printf("Adjacent Subdomain Stats: Total: %3d, Max: %3d, Avg: %3d [%5d]\n", total, max, avg, idxsum(nparts*nparts, pmat)); */
+
+    if (max < 1.4*avg)
+      break;
+
+    me = idxamax(nparts, ndoms);
+    mypmat = pmat + me*nparts;
+    totalout = idxsum(nparts, mypmat);
+
+    /*printf("Me: %d, TotalOut: %d,\n", me, totalout);*/
+
+    /* Sort the connections according to their cut */
+    for (ncand2=0, i=0; i<nparts; i++) {
+      if (mypmat[i] > 0) {
+        cand2[ncand2].key = mypmat[i];
+        cand2[ncand2++].val = i;
+      }
+    }
+    ikeysort(ncand2, cand2);
+
+    move = 0;
+    for (min=0; min<ncand2; min++) {
+      if (cand2[min].key > totalout/(2*ndoms[me])) 
+        break;
+
+      other = cand2[min].val;
+
+      /*printf("\tMinOut: %d to %d\n", mypmat[other], other);*/
+
+      idxset(nparts, 0, otherpmat);
+
+      /* Go and find the vertices in 'other' that are connected in 'me' */
+      for (nind=0, i=0; i<nvtxs; i++) {
+        if (where[i] == other) {
+          for (j=xadj[i]; j<xadj[i+1]; j++) {
+            if (where[adjncy[j]] == me) {
+              ind[nind++] = i;
+              break;
+            }
+          }
+        }
+      }
+
+      /* Go and construct the otherpmat to see where these nind vertices are connected to */
+      for (cpwgt=0, ii=0; ii<nind; ii++) {
+        i = ind[ii];
+        cpwgt += vwgt[i];
+
+        for (j=xadj[i]; j<xadj[i+1]; j++) 
+          otherpmat[where[adjncy[j]]] += adjwgt[j];
+      }
+      otherpmat[other] = 0;
+
+      for (ncand=0, i=0; i<nparts; i++) {
+        if (otherpmat[i] > 0) {
+          cand[ncand].key = -otherpmat[i];
+          cand[ncand++].val = i;
+        }
+      }
+      ikeysort(ncand, cand);
+
+      /* 
+       * Go through and the select the first domain that is common with 'me', and
+       * does not increase the ndoms[target] higher than my ndoms, subject to the
+       * maxpwgt constraint. Traversal is done from the mostly connected to the least.
+       */
+      target = target2 = -1;
+      for (i=0; i<ncand; i++) {
+        k = cand[i].val;
+
+        if (mypmat[k] > 0) {
+          if (pwgts[k] + cpwgt > maxpwgt[k])  /* Check if balance will go off */
+            continue;
+
+          for (j=0; j<nparts; j++) {
+            if (otherpmat[j] > 0 && ndoms[j] >= ndoms[me]-1 && pmat[nparts*j+k] == 0)
+              break;
+          }
+          if (j == nparts) { /* No bad second level effects */
+            for (nadd=0, j=0; j<nparts; j++) {
+              if (otherpmat[j] > 0 && pmat[nparts*k+j] == 0)
+                nadd++;
+            }
+
+            /*printf("\t\tto=%d, nadd=%d, %d\n", k, nadd, ndoms[k]);*/
+            if (target2 == -1 && ndoms[k]+nadd < ndoms[me]) {
+              target2 = k;
+            }
+            if (nadd == 0) {
+              target = k;
+              break;
+            }
+          }
+        }
+      }
+      if (target == -1 && target2 != -1)
+        target = target2;
+
+      if (target == -1) {
+        /* printf("\t\tCould not make the move\n");*/
+        continue;
+      }
+
+      /*printf("\t\tMoving to %d\n", target);*/
+
+      /* Update the partition weights */
+      INC_DEC(pwgts[target], pwgts[other], cpwgt);
+
+      MoveGroupMConn(ctrl, graph, ndoms, pmat, nparts, target, nind, ind);
+
+      move = 1;
+      break;
+    }
+
+    if (move == 0)
+      break;
+  }
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+
+  GKfree(&cand, &cand2, LTERM);
+}
+
+
+/*************************************************************************
+* This function moves a collection of vertices and updates their rinfo
+**************************************************************************/
+void MoveGroupMConn(CtrlType *ctrl, GraphType *graph, idxtype *ndoms, idxtype *pmat,
+                    int nparts, int to, int nind, idxtype *ind)
+{
+  int i, ii, iii, j, jj, k, l, nvtxs, nbnd, myndegrees; 
+  int from, me;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *bndptr, *bndind;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  nbnd = graph->nbnd;
+
+  for (iii=0; iii<nind; iii++) {
+    i = ind[iii];
+    from = where[i];
+
+    myrinfo = graph->rinfo+i;
+    if (myrinfo->edegrees == NULL) {
+      myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += xadj[i+1]-xadj[i];
+      myrinfo->ndegrees = 0;
+    }
+    myedegrees = myrinfo->edegrees;
+
+    /* find the location of 'to' in myrinfo or create it if it is not there */
+    for (k=0; k<myrinfo->ndegrees; k++) {
+      if (myedegrees[k].pid == to)
+        break;
+    }
+    if (k == myrinfo->ndegrees) {
+      myedegrees[k].pid = to;
+      myedegrees[k].ed = 0;
+      myrinfo->ndegrees++;
+    }
+
+    graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+    /* Update pmat to reflect the move of 'i' */
+    pmat[from*nparts+to] += (myrinfo->id-myedegrees[k].ed);
+    pmat[to*nparts+from] += (myrinfo->id-myedegrees[k].ed);
+    if (pmat[from*nparts+to] == 0) 
+      ndoms[from]--;
+    if (pmat[to*nparts+from] == 0) 
+      ndoms[to]--;
+
+    /* Update where, weight, and ID/ED information of the vertex you moved */
+    where[i] = to;
+    myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+    SWAP(myrinfo->id, myedegrees[k].ed, j);
+    if (myedegrees[k].ed == 0) 
+      myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+    else
+      myedegrees[k].pid = from;
+
+    if (myrinfo->ed-myrinfo->id < 0 && bndptr[i] != -1)
+      BNDDelete(nbnd, bndind, bndptr, i);
+
+    /* Update the degrees of adjacent vertices */
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      ii = adjncy[j];
+      me = where[ii];
+
+      myrinfo = graph->rinfo+ii;
+      if (myrinfo->edegrees == NULL) {
+        myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+        ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+      }
+      myedegrees = myrinfo->edegrees;
+
+      ASSERT(CheckRInfo(myrinfo));
+
+      if (me == from) {
+        INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+        if (myrinfo->ed-myrinfo->id >= 0 && bndptr[ii] == -1)
+          BNDInsert(nbnd, bndind, bndptr, ii);
+      }
+      else if (me == to) {
+        INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+        if (myrinfo->ed-myrinfo->id < 0 && bndptr[ii] != -1)
+          BNDDelete(nbnd, bndind, bndptr, ii);
+      }
+
+      /* Remove contribution from the .ed of 'from' */
+      if (me != from) {
+        for (k=0; k<myrinfo->ndegrees; k++) {
+          if (myedegrees[k].pid == from) {
+            if (myedegrees[k].ed == adjwgt[j])
+              myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+            else
+              myedegrees[k].ed -= adjwgt[j];
+            break;
+          }
+        }
+      }
+
+      /* Add contribution to the .ed of 'to' */
+      if (me != to) {
+        for (k=0; k<myrinfo->ndegrees; k++) {
+          if (myedegrees[k].pid == to) {
+            myedegrees[k].ed += adjwgt[j];
+            break;
+          }
+        }
+        if (k == myrinfo->ndegrees) {
+          myedegrees[myrinfo->ndegrees].pid = to;
+          myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+        }
+      }
+
+      /* Update pmat to reflect the move of 'i' for domains other than 'from' and 'to' */
+      if (me != from && me != to) {
+        pmat[me*nparts+from] -= adjwgt[j];
+        pmat[from*nparts+me] -= adjwgt[j];
+        if (pmat[me*nparts+from] == 0) 
+          ndoms[me]--;
+        if (pmat[from*nparts+me] == 0) 
+          ndoms[from]--;
+
+        if (pmat[me*nparts+to] == 0) 
+          ndoms[me]++;
+        if (pmat[to*nparts+me] == 0) 
+          ndoms[to]++;
+
+        pmat[me*nparts+to] += adjwgt[j];
+        pmat[to*nparts+me] += adjwgt[j];
+      }
+
+      ASSERT(CheckRInfo(myrinfo));
+    }
+
+    ASSERT(CheckRInfo(graph->rinfo+i));
+  }
+
+  graph->nbnd = nbnd;
+
+}
+
+
+
+
+/*************************************************************************
+* This function finds all the connected components induced by the 
+* partitioning vector in wgraph->where and tries to push them around to 
+* remove some of them
+**************************************************************************/
+void EliminateComponents(CtrlType *ctrl, GraphType *graph, int nparts, float *tpwgts, float ubfactor)
+{
+  int i, ii, j, jj, k, me, nvtxs, tvwgt, first, last, nleft, ncmps, cwgt, other, target, deltawgt;
+  idxtype *xadj, *adjncy, *vwgt, *adjwgt, *where, *pwgts, *maxpwgt;
+  idxtype *cpvec, *touched, *perm, *todo, *cind, *cptr, *npcmps;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  vwgt = graph->vwgt;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  pwgts = graph->pwgts;
+
+  touched = idxset(nvtxs, 0, idxwspacemalloc(ctrl, nvtxs));
+  cptr = idxwspacemalloc(ctrl, nvtxs);
+  cind = idxwspacemalloc(ctrl, nvtxs);
+  perm = idxwspacemalloc(ctrl, nvtxs);
+  todo = idxwspacemalloc(ctrl, nvtxs);
+  maxpwgt = idxwspacemalloc(ctrl, nparts);
+  cpvec = idxwspacemalloc(ctrl, nparts);
+  npcmps = idxset(nparts, 0, idxwspacemalloc(ctrl, nparts));
+
+  for (i=0; i<nvtxs; i++) 
+    perm[i] = todo[i] = i;
+
+  /* Find the connected componends induced by the partition */
+  ncmps = -1;
+  first = last = 0;
+  nleft = nvtxs;
+  while (nleft > 0) {
+    if (first == last) { /* Find another starting vertex */
+      cptr[++ncmps] = first;
+      ASSERT(touched[todo[0]] == 0);
+      i = todo[0];
+      cind[last++] = i;
+      touched[i] = 1;
+      me = where[i];
+      npcmps[me]++;
+    }
+
+    i = cind[first++];
+    k = perm[i];
+    j = todo[k] = todo[--nleft];
+    perm[j] = k;
+
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (where[k] == me && !touched[k]) {
+        cind[last++] = k;
+        touched[k] = 1;
+      }
+    }
+  }
+  cptr[++ncmps] = first;
+
+  /* printf("I found %d components, for this %d-way partition\n", ncmps, nparts); */
+
+  if (ncmps > nparts) { /* There are more components than processors */
+    /* First determine the max allowed load imbalance */
+    tvwgt = idxsum(nparts, pwgts);
+    for (i=0; i<nparts; i++)
+      maxpwgt[i] = ubfactor*tpwgts[i]*tvwgt;
+
+    deltawgt = 5;
+
+    for (i=0; i<ncmps; i++) {
+      me = where[cind[cptr[i]]];  /* Get the domain of this component */
+      if (npcmps[me] == 1)
+        continue;  /* Skip it because it is contigous */
+
+      /*printf("Trying to move %d from %d\n", i, me); */
+
+      /* Determine the weight of the block to be moved and abort if too high */
+      for (cwgt=0, j=cptr[i]; j<cptr[i+1]; j++) 
+        cwgt += vwgt[cind[j]];
+
+      if (cwgt > .30*pwgts[me])
+        continue;  /* Skip the component if it is over 30% of the weight */
+
+      /* Determine the connectivity */
+      idxset(nparts, 0, cpvec);
+      for (j=cptr[i]; j<cptr[i+1]; j++) {
+        ii = cind[j];
+        for (jj=xadj[ii]; jj<xadj[ii+1]; jj++) 
+          cpvec[where[adjncy[jj]]] += adjwgt[jj];
+      }
+      cpvec[me] = 0;
+
+      target = -1;
+      for (j=0; j<nparts; j++) {
+        if (cpvec[j] > 0 && (cwgt < deltawgt || pwgts[j] + cwgt < maxpwgt[j])) {
+          if (target == -1 || cpvec[target] < cpvec[j])
+            target = j;
+        }
+      }
+
+      /* printf("\tMoving it to %d [%d]\n", target, cpvec[target]);*/
+
+      if (target != -1) {
+        /* Assign all the vertices of 'me' to 'target' and update data structures */
+        INC_DEC(pwgts[target], pwgts[me], cwgt);
+        npcmps[me]--;
+
+        MoveGroup(ctrl, graph, nparts, target, i, cptr, cind);
+      }
+    }
+
+  }
+
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nparts);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+  idxwspacefree(ctrl, nvtxs);
+
+}
+
+
+/*************************************************************************
+* This function moves a collection of vertices and updates their rinfo
+**************************************************************************/
+void MoveGroup(CtrlType *ctrl, GraphType *graph, int nparts, int to, int gid, idxtype *ptr, idxtype *ind)
+{
+  int i, ii, iii, j, jj, k, l, nvtxs, nbnd, myndegrees; 
+  int from, me;
+  idxtype *xadj, *adjncy, *adjwgt;
+  idxtype *where, *bndptr, *bndind;
+  EDegreeType *myedegrees;
+  RInfoType *myrinfo;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+  where = graph->where;
+  bndptr = graph->bndptr;
+  bndind = graph->bndind;
+
+  nbnd = graph->nbnd;
+
+  for (iii=ptr[gid]; iii<ptr[gid+1]; iii++) {
+    i = ind[iii];
+    from = where[i];
+
+    myrinfo = graph->rinfo+i;
+    if (myrinfo->edegrees == NULL) {
+      myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+      ctrl->wspace.cdegree += xadj[i+1]-xadj[i];
+      myrinfo->ndegrees = 0;
+    }
+    myedegrees = myrinfo->edegrees;
+
+    /* find the location of 'to' in myrinfo or create it if it is not there */
+    for (k=0; k<myrinfo->ndegrees; k++) {
+      if (myedegrees[k].pid == to)
+        break;
+    }
+    if (k == myrinfo->ndegrees) {
+      myedegrees[k].pid = to;
+      myedegrees[k].ed = 0;
+      myrinfo->ndegrees++;
+    }
+
+    graph->mincut -= myedegrees[k].ed-myrinfo->id;
+
+
+    /* Update where, weight, and ID/ED information of the vertex you moved */
+    where[i] = to;
+    myrinfo->ed += myrinfo->id-myedegrees[k].ed;
+    SWAP(myrinfo->id, myedegrees[k].ed, j);
+    if (myedegrees[k].ed == 0) 
+      myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+    else
+      myedegrees[k].pid = from;
+
+    if (myrinfo->ed-myrinfo->id < 0 && bndptr[i] != -1)
+      BNDDelete(nbnd, bndind, bndptr, i);
+
+    /* Update the degrees of adjacent vertices */
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      ii = adjncy[j];
+      me = where[ii];
+
+      myrinfo = graph->rinfo+ii;
+      if (myrinfo->edegrees == NULL) {
+        myrinfo->edegrees = ctrl->wspace.edegrees+ctrl->wspace.cdegree;
+        ctrl->wspace.cdegree += xadj[ii+1]-xadj[ii];
+      }
+      myedegrees = myrinfo->edegrees;
+
+      ASSERT(CheckRInfo(myrinfo));
+
+      if (me == from) {
+        INC_DEC(myrinfo->ed, myrinfo->id, adjwgt[j]);
+
+        if (myrinfo->ed-myrinfo->id >= 0 && bndptr[ii] == -1)
+          BNDInsert(nbnd, bndind, bndptr, ii);
+      }
+      else if (me == to) {
+        INC_DEC(myrinfo->id, myrinfo->ed, adjwgt[j]);
+
+        if (myrinfo->ed-myrinfo->id < 0 && bndptr[ii] != -1)
+          BNDDelete(nbnd, bndind, bndptr, ii);
+      }
+
+      /* Remove contribution from the .ed of 'from' */
+      if (me != from) {
+        for (k=0; k<myrinfo->ndegrees; k++) {
+          if (myedegrees[k].pid == from) {
+            if (myedegrees[k].ed == adjwgt[j])
+              myedegrees[k] = myedegrees[--myrinfo->ndegrees];
+            else
+              myedegrees[k].ed -= adjwgt[j];
+            break;
+          }
+        }
+      }
+
+      /* Add contribution to the .ed of 'to' */
+      if (me != to) {
+        for (k=0; k<myrinfo->ndegrees; k++) {
+          if (myedegrees[k].pid == to) {
+            myedegrees[k].ed += adjwgt[j];
+            break;
+          }
+        }
+        if (k == myrinfo->ndegrees) {
+          myedegrees[myrinfo->ndegrees].pid = to;
+          myedegrees[myrinfo->ndegrees++].ed = adjwgt[j];
+        }
+      }
+
+      ASSERT(CheckRInfo(myrinfo));
+    }
+
+    ASSERT(CheckRInfo(graph->rinfo+i));
+  }
+
+  graph->nbnd = nbnd;
+
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/timing.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/timing.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/timing.c	(revision 9501)
@@ -0,0 +1,74 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * timing.c
+ *
+ * This file contains routines that deal with timing Metis
+ *
+ * Started 7/24/97
+ * George
+ *
+ * $Id: timing.c,v 1.1 1998/11/27 17:59:32 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function clears the timers
+**************************************************************************/
+void InitTimers(CtrlType *ctrl)
+{
+  cleartimer(ctrl->TotalTmr);
+  cleartimer(ctrl->InitPartTmr);
+  cleartimer(ctrl->MatchTmr);
+  cleartimer(ctrl->ContractTmr);
+  cleartimer(ctrl->CoarsenTmr);
+  cleartimer(ctrl->UncoarsenTmr);
+  cleartimer(ctrl->RefTmr);
+  cleartimer(ctrl->ProjectTmr);
+  cleartimer(ctrl->SplitTmr);
+  cleartimer(ctrl->SepTmr);
+  cleartimer(ctrl->AuxTmr1);
+  cleartimer(ctrl->AuxTmr2);
+  cleartimer(ctrl->AuxTmr3);
+  cleartimer(ctrl->AuxTmr4);
+  cleartimer(ctrl->AuxTmr5);
+  cleartimer(ctrl->AuxTmr6);
+}
+
+
+
+/*************************************************************************
+* This function prints the various timers
+**************************************************************************/
+void PrintTimers(CtrlType *ctrl)
+{
+  printf("\nTiming Information -------------------------------------------------");
+  printf("\n Multilevel: \t\t %7.3f", gettimer(ctrl->TotalTmr));
+  printf("\n     Coarsening: \t\t %7.3f", gettimer(ctrl->CoarsenTmr));
+  printf("\n            Matching: \t\t\t %7.3f", gettimer(ctrl->MatchTmr));
+  printf("\n            Contract: \t\t\t %7.3f", gettimer(ctrl->ContractTmr));
+  printf("\n     Initial Partition: \t %7.3f", gettimer(ctrl->InitPartTmr));
+  printf("\n   Construct Separator: \t %7.3f", gettimer(ctrl->SepTmr));
+  printf("\n     Uncoarsening: \t\t %7.3f", gettimer(ctrl->UncoarsenTmr));
+  printf("\n          Refinement: \t\t\t %7.3f", gettimer(ctrl->RefTmr));
+  printf("\n          Projection: \t\t\t %7.3f", gettimer(ctrl->ProjectTmr));
+  printf("\n     Splitting: \t\t %7.3f", gettimer(ctrl->SplitTmr));
+  printf("\n          AUX1: \t\t %7.3f", gettimer(ctrl->AuxTmr1));
+  printf("\n          AUX2: \t\t %7.3f", gettimer(ctrl->AuxTmr2));
+  printf("\n          AUX3: \t\t %7.3f", gettimer(ctrl->AuxTmr3));
+  printf("\n********************************************************************\n");
+}
+
+
+/*************************************************************************
+* This function returns the seconds
+**************************************************************************/
+double seconds(void)
+{
+  return((double) clock()/CLOCKS_PER_SEC);
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/util.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/util.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Lib/util.c	(revision 9501)
@@ -0,0 +1,519 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * util.c
+ *
+ * This function contains various utility routines
+ *
+ * Started 9/28/95
+ * George
+ *
+ * $Id: util.c,v 1.1 1998/11/27 17:59:32 karypis Exp $
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function prints an error message and exits
+**************************************************************************/
+void errexit(char *f_str,...)
+{
+  va_list argp;
+  char out1[256], out2[256];
+
+  va_start(argp, f_str);
+  vsprintf(out1, f_str, argp);
+  va_end(argp);
+
+  sprintf(out2, "Error! %s", out1);
+
+  fprintf(stdout, out2);
+  fflush(stdout);
+
+  abort();
+}
+
+
+
+#ifndef DMALLOC
+/*************************************************************************
+* The following function allocates an array of integers
+**************************************************************************/
+int *imalloc(int n, char *msg)
+{
+  if (n == 0)
+    return NULL;
+
+  return (int *)GKmalloc(sizeof(int)*n, msg);
+}
+
+
+/*************************************************************************
+* The following function allocates an array of integers
+**************************************************************************/
+idxtype *idxmalloc(int n, char *msg)
+{
+  if (n == 0)
+    return NULL;
+
+  return (idxtype *)GKmalloc(sizeof(idxtype)*n, msg);
+}
+
+
+/*************************************************************************
+* The following function allocates an array of float 
+**************************************************************************/
+float *fmalloc(int n, char *msg)
+{
+  if (n == 0)
+    return NULL;
+
+  return (float *)GKmalloc(sizeof(float)*n, msg);
+}
+
+
+/*************************************************************************
+* The follwoing function allocates an array of integers
+**************************************************************************/
+int *ismalloc(int n, int ival, char *msg)
+{
+  if (n == 0)
+    return NULL;
+
+  return iset(n, ival, (int *)GKmalloc(sizeof(int)*n, msg));
+}
+
+
+
+/*************************************************************************
+* The follwoing function allocates an array of integers
+**************************************************************************/
+idxtype *idxsmalloc(int n, idxtype ival, char *msg)
+{
+  if (n == 0)
+    return NULL;
+
+  return idxset(n, ival, (idxtype *)GKmalloc(sizeof(idxtype)*n, msg));
+}
+
+
+/*************************************************************************
+* This function is my wrapper around malloc
+**************************************************************************/
+void *GKmalloc(int nbytes, char *msg)
+{
+  void *ptr;
+
+  if (nbytes == 0)
+    return NULL;
+
+  ptr = (void *)malloc(nbytes);
+  if (ptr == NULL) 
+    errexit("***Memory allocation failed for %s. Requested size: %d bytes", msg, nbytes);
+
+  return ptr;
+}
+#endif
+
+/*************************************************************************
+* This function is my wrapper around free, allows multiple pointers    
+**************************************************************************/
+void GKfree(void **ptr1,...)
+{
+  va_list plist;
+  void **ptr;
+
+  if (*ptr1 != NULL)
+    free(*ptr1);
+  *ptr1 = NULL;
+
+  va_start(plist, ptr1);
+
+  /* while ((int)(ptr = va_arg(plist, void **)) != -1) { */
+  while ((ptr = va_arg(plist, void **)) != LTERM) {
+    if (*ptr != NULL)
+      free(*ptr);
+    *ptr = NULL;
+  }
+
+  va_end(plist);
+}            
+
+
+/*************************************************************************
+* These functions set the values of a vector
+**************************************************************************/
+int *iset(int n, int val, int *x)
+{
+  int i;
+
+  for (i=0; i<n; i++)
+    x[i] = val;
+
+  return x;
+}
+
+
+/*************************************************************************
+* These functions set the values of a vector
+**************************************************************************/
+idxtype *idxset(int n, idxtype val, idxtype *x)
+{
+  int i;
+
+  for (i=0; i<n; i++)
+    x[i] = val;
+
+  return x;
+}
+
+
+/*************************************************************************
+* These functions set the values of a vector
+**************************************************************************/
+float *sset(int n, float val, float *x)
+{
+  int i;
+
+  for (i=0; i<n; i++)
+    x[i] = val;
+
+  return x;
+}
+
+
+
+/*************************************************************************
+* These functions return the index of the maximum element in a vector
+**************************************************************************/
+int iamax(int n, int *x)
+{
+  int i, max=0;
+
+  for (i=1; i<n; i++)
+    max = (x[i] > x[max] ? i : max);
+
+  return max;
+}
+
+
+/*************************************************************************
+* These functions return the index of the maximum element in a vector
+**************************************************************************/
+int idxamax(int n, idxtype *x)
+{
+  int i, max=0;
+
+  for (i=1; i<n; i++)
+    max = (x[i] > x[max] ? i : max);
+
+  return max;
+}
+
+/*************************************************************************
+* These functions return the index of the maximum element in a vector
+**************************************************************************/
+int idxamax_strd(int n, idxtype *x, int incx)
+{
+  int i, max=0;
+
+  n *= incx;
+  for (i=incx; i<n; i+=incx)
+    max = (x[i] > x[max] ? i : max);
+
+  return max/incx;
+}
+
+
+
+/*************************************************************************
+* These functions return the index of the maximum element in a vector
+**************************************************************************/
+int samax(int n, float *x)
+{
+  int i, max=0;
+
+  for (i=1; i<n; i++)
+    max = (x[i] > x[max] ? i : max);
+
+  return max;
+}
+
+/*************************************************************************
+* These functions return the index of the almost maximum element in a vector
+**************************************************************************/
+int samax2(int n, float *x)
+{
+  int i, max1, max2;
+
+  if (x[0] > x[1]) {
+    max1 = 0;
+    max2 = 1;
+  }
+  else {
+    max1 = 1;
+    max2 = 0;
+  }
+
+  for (i=2; i<n; i++) {
+    if (x[i] > x[max1]) {
+      max2 = max1;
+      max1 = i;
+    }
+    else if (x[i] > x[max2])
+      max2 = i;
+  }
+
+  return max2;
+}
+
+
+/*************************************************************************
+* These functions return the index of the minimum element in a vector
+**************************************************************************/
+int idxamin(int n, idxtype *x)
+{
+  int i, min=0;
+
+  for (i=1; i<n; i++)
+    min = (x[i] < x[min] ? i : min);
+
+  return min;
+}
+
+
+/*************************************************************************
+* These functions return the index of the minimum element in a vector
+**************************************************************************/
+int samin(int n, float *x)
+{
+  int i, min=0;
+
+  for (i=1; i<n; i++)
+    min = (x[i] < x[min] ? i : min);
+
+  return min;
+}
+
+
+/*************************************************************************
+* This function sums the entries in an array
+**************************************************************************/
+int idxsum(int n, idxtype *x)
+{
+  int i, sum = 0;
+
+  for (i=0; i<n; i++)
+    sum += x[i];
+
+  return sum;
+}
+
+
+/*************************************************************************
+* This function sums the entries in an array
+**************************************************************************/
+int idxsum_strd(int n, idxtype *x, int incx)
+{
+  int i, sum = 0;
+
+  for (i=0; i<n; i++, x+=incx) {
+    sum += *x;
+  }
+
+  return sum;
+}
+
+
+/*************************************************************************
+* This function sums the entries in an array
+**************************************************************************/
+void idxadd(int n, idxtype *x, idxtype *y)
+{
+  for (n--; n>=0; n--)
+    y[n] += x[n];
+}
+
+
+/*************************************************************************
+* This function sums the entries in an array
+**************************************************************************/
+int charsum(int n, char *x)
+{
+  int i, sum = 0;
+
+  for (i=0; i<n; i++)
+    sum += x[i];
+
+  return sum;
+}
+
+/*************************************************************************
+* This function sums the entries in an array
+**************************************************************************/
+int isum(int n, int *x)
+{
+  int i, sum = 0;
+
+  for (i=0; i<n; i++)
+    sum += x[i];
+
+  return sum;
+}
+
+/*************************************************************************
+* This function sums the entries in an array
+**************************************************************************/
+float ssum(int n, float *x)
+{
+  int i;
+  float sum = 0.0;
+
+  for (i=0; i<n; i++)
+    sum += x[i];
+
+  return sum;
+}
+
+/*************************************************************************
+* This function sums the entries in an array
+**************************************************************************/
+float ssum_strd(int n, float *x, int incx)
+{
+  int i;
+  float sum = 0.0;
+
+  for (i=0; i<n; i++, x+=incx)
+    sum += *x;
+
+  return sum;
+}
+
+/*************************************************************************
+* This function sums the entries in an array
+**************************************************************************/
+void sscale(int n, float alpha, float *x)
+{
+  int i;
+
+  for (i=0; i<n; i++)
+    x[i] *= alpha;
+}
+
+
+/*************************************************************************
+* This function computes a 2-norm
+**************************************************************************/
+float snorm2(int n, float *v)
+{
+  int i;
+  float partial = 0;
+ 
+  for (i = 0; i<n; i++)
+    partial += v[i] * v[i];
+
+  return sqrt(partial);
+}
+
+
+
+/*************************************************************************
+* This function computes a 2-norm
+**************************************************************************/
+float sdot(int n, float *x, float *y)
+{
+  int i;
+  float partial = 0;
+ 
+  for (i = 0; i<n; i++)
+    partial += x[i] * y[i];
+
+  return partial;
+}
+
+
+/*************************************************************************
+* This function computes a 2-norm
+**************************************************************************/
+void saxpy(int n, float alpha, float *x, int incx, float *y, int incy)
+{
+  int i;
+ 
+  for (i=0; i<n; i++, x+=incx, y+=incy) 
+    *y += alpha*(*x);
+}
+
+
+
+
+/*************************************************************************
+* This file randomly permutes the contents of an array.
+* flag == 0, don't initialize perm
+* flag == 1, set p[i] = i 
+**************************************************************************/
+void RandomPermute(int n, idxtype *p, int flag)
+{
+  int i, u, v;
+  idxtype tmp;
+
+  if (flag == 1) {
+    for (i=0; i<n; i++)
+      p[i] = i;
+  }
+
+  if (n <= 4)
+    return;
+
+  for (i=0; i<n; i+=16) {
+    u = RandomInRangeFast(n-4);
+    v = RandomInRangeFast(n-4);
+    SWAP(p[v], p[u], tmp);
+    SWAP(p[v+1], p[u+1], tmp);
+    SWAP(p[v+2], p[u+2], tmp);
+    SWAP(p[v+3], p[u+3], tmp);
+  }
+}
+
+
+
+/*************************************************************************
+* This function returns true if the a is a power of 2
+**************************************************************************/
+int ispow2(int a)
+{
+  for (; a%2 != 1; a = a>>1);
+  return (a > 1 ? 0 : 1);
+}
+
+
+/*************************************************************************
+* This function initializes the random number generator
+**************************************************************************/
+void InitRandom(int seed)
+{
+  if (seed == -1) {
+#ifndef __VC__
+    srand48(7654321L);  
+#endif
+    srand(4321);  
+  }
+  else {
+#ifndef __VC__
+    srand48(seed);  
+#endif
+    srand(seed);  
+  }
+}
+
+/*************************************************************************
+* This function returns the ilog2(x)
+**************************************************************************/
+int ilog2(int a)
+{
+  int i;
+
+  for (i=1; a > 1; i++, a = a>>1);
+  return i-1;
+}
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Makefile
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Makefile	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Makefile	(revision 9501)
@@ -0,0 +1,16 @@
+
+
+default:
+	(cd Lib ; make ) 
+	(cd Programs ; make ) 
+	(cd Test ; make ) 
+
+clean:
+	(cd Lib ; make clean )
+	(cd Programs ; make clean )
+	(cd Test ; make clean )
+
+realclean:
+	(cd Lib ; make realclean )
+	(cd Programs ; make realclean )
+	(cd Test ; make realclean )
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Makefile.in
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Makefile.in	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Makefile.in	(revision 9501)
@@ -0,0 +1,22 @@
+
+# Which compiler to use
+CC = gcc
+
+# What optimization level to use
+OPTFLAGS = -O2 
+
+# What options to be used by the compiler
+COPTIONS = -fPIC
+
+# What options to be used by the loader
+LDOPTIONS = 
+
+# What archiving to use
+AR = ar rv
+
+# What to use for indexing the archive
+RANLIB = ranlib
+#RANLIB = ar -ts
+#RANLIB = 
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/Makefile
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/Makefile	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/Makefile	(revision 9501)
@@ -0,0 +1,83 @@
+include ../Makefile.in
+
+BINDIR = ..
+
+INCLUDES = -I../Lib 
+CFLAGS = $(COPTIONS) $(OPTFLAGS) $(INCLUDES)
+
+LIBS = -lmetis -lm
+LD = $(CC) $(LDOPTIONS) -L. -L..
+METISLIB = ../libmetis.a
+
+
+
+PMETISOBJS = pmetis.o io.o 
+KMETISOBJS = kmetis.o io.o 
+OEMETISOBJS = oemetis.o io.o smbfactor.o
+ONMETISOBJS = onmetis.o io.o smbfactor.o
+MESH2DUALOBJ = mesh2dual.o io.o 
+MESH2NODALOBJ = mesh2nodal.o io.o 
+PARTDMESHOBJ = partdmesh.o io.o 
+PARTNMESHOBJ = partnmesh.o io.o 
+GRAPHCHKOBJ = graphchk.o io.o 
+
+
+.c.o:
+	$(CC) $(CFLAGS) -c $*.c
+
+default: $(BINDIR)/pmetis$(VERNUM) $(BINDIR)/kmetis$(VERNUM) \
+         $(BINDIR)/oemetis$(VERNUM) $(BINDIR)/onmetis$(VERNUM) $(BINDIR)/mesh2dual$(VERNUM) \
+         $(BINDIR)/mesh2nodal$(VERNUM) $(BINDIR)/partdmesh$(VERNUM) $(BINDIR)/partnmesh$(VERNUM) \
+         $(BINDIR)/graphchk$(VERNUM)
+
+$(BINDIR)/pmetis$(VERNUM): $(PMETISOBJS) $(METISLIB)
+	$(LD)  -o $@ $(PMETISOBJS) $(LIBS)
+
+
+$(BINDIR)/kmetis$(VERNUM): $(KMETISOBJS) $(METISLIB)
+	$(LD)  -o $@ $(KMETISOBJS) $(LIBS)
+
+
+$(BINDIR)/oemetis$(VERNUM): $(OEMETISOBJS) $(METISLIB)
+	$(LD)  -o $@ $(OEMETISOBJS) $(LIBS)
+
+
+$(BINDIR)/onmetis$(VERNUM): $(ONMETISOBJS) $(METISLIB)
+	$(LD)  -o $@ $(ONMETISOBJS) $(LIBS)
+
+
+$(BINDIR)/mesh2dual$(VERNUM): $(MESH2DUALOBJ) $(METISLIB)
+	$(LD)  -o $@ $(MESH2DUALOBJ) $(LIBS)
+
+
+$(BINDIR)/mesh2nodal$(VERNUM): $(MESH2NODALOBJ) $(METISLIB)
+	$(LD)  -o $@ $(MESH2NODALOBJ) $(LIBS)
+
+
+$(BINDIR)/partdmesh$(VERNUM): $(PARTDMESHOBJ) $(METISLIB)
+	$(LD)  -o $@ $(PARTDMESHOBJ) $(LIBS)
+
+
+$(BINDIR)/partnmesh$(VERNUM): $(PARTNMESHOBJ) $(METISLIB)
+	$(LD)  -o $@ $(PARTNMESHOBJ) $(LIBS)
+
+
+$(BINDIR)/graphchk$(VERNUM): $(GRAPHCHKOBJ) $(METISLIB)
+	$(LD)  -o $@ $(GRAPHCHKOBJ) $(LIBS)
+
+
+
+clean:
+	rm -f *.o
+
+realclean:
+	rm -f *.o ;\
+        rm -f $(BINDIR)/pmetis$(VERNUM) ;\
+        rm -f $(BINDIR)/kmetis$(VERNUM) ;\
+        rm -f $(BINDIR)/oemetis$(VERNUM) ;\
+        rm -f $(BINDIR)/onmetis$(VERNUM) ;\
+        rm -f $(BINDIR)/mesh2dual$(VERNUM) ;\
+        rm -f $(BINDIR)/mesh2nodal$(VERNUM) ;\
+        rm -f $(BINDIR)/partdmesh$(VERNUM) ;\
+        rm -f $(BINDIR)/partnmesh$(VERNUM) ;\
+        rm -f $(BINDIR)/graphchk$(VERNUM)
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/graphchk.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/graphchk.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/graphchk.c	(revision 9501)
@@ -0,0 +1,58 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * graphchk.c
+ *
+ * This file checks the validity of a graph
+ *
+ * Started 8/28/94
+ * George
+ *
+ * $Id: graphchk.c,v 1.1 1998/11/27 17:59:33 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  GraphType graph;
+  char filename[256];
+  int wgtflag;
+
+  if (argc != 2) {
+    printf("Usage: %s <GraphFile>\n", argv[0]);
+    exit(0);
+  }
+    
+  strcpy(filename, argv[1]);
+
+  ReadGraph(&graph, filename, &wgtflag);
+  if (graph.nvtxs == 0) {
+    printf("Empty graph!\n");
+    exit(0);
+  }
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Graph Information ---------------------------------------------------\n");
+  printf("  Name: %s, #Vertices: %d, #Edges: %d\n\n", filename, graph.nvtxs, graph.nedges/2);
+  printf("Checking Graph... ---------------------------------------------------\n");
+
+  if (CheckGraph(&graph))
+    printf("   The format of the graph is correct!\n");
+  else
+    printf("   The format of the graph is incorrect!\n");
+
+  printf("\n**********************************************************************\n");
+
+
+  GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, LTERM);
+}  
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/io.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/io.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/io.c	(revision 9501)
@@ -0,0 +1,382 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * io.c
+ *
+ * This file contains routines related to I/O
+ *
+ * Started 8/28/94
+ * George
+ *
+ * $Id: io.c,v 1.1 1998/11/27 17:59:34 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* This function reads the spd matrix
+**************************************************************************/
+void ReadGraph(GraphType *graph, char *filename, int *wgtflag)
+{
+  int i, j, k, l, fmt, readew, readvw, ncon, edge, ewgt;
+  idxtype *xadj, *adjncy, *vwgt, *adjwgt;
+  char *line, *oldstr, *newstr;
+  FILE *fpin;
+
+  InitGraph(graph);
+
+  line = (char *)malloc(sizeof(char)*(MAXLINE+1));
+
+  if ((fpin = fopen(filename, "r")) == NULL) {
+    printf("Failed to open file %s\n", filename);
+    exit(0);
+  }
+
+  do {
+    fgets(line, MAXLINE, fpin);
+  } while (line[0] == '%' && !feof(fpin));
+
+  if (feof(fpin)) {
+    graph->nvtxs = 0;
+    free(line);
+    return;
+  }
+
+  fmt = ncon = 0;
+  sscanf(line, "%d %d %d %d", &(graph->nvtxs), &(graph->nedges), &fmt, &ncon);
+
+  readew = (fmt%10 > 0);
+  readvw = ((fmt/10)%10 > 0);
+  if (fmt >= 100) {
+    printf("Cannot read this type of file format!");
+    exit(0);
+  }
+
+
+  *wgtflag = 0;
+  if (readew)
+    *wgtflag += 1;
+  if (readvw)
+    *wgtflag += 2;
+
+  if (ncon > 0 && !readvw) {
+    printf("------------------------------------------------------------------------------\n");
+    printf("***  I detected an error in your input file  ***\n\n");
+    printf("You specified ncon=%d, but the fmt parameter does not specify vertex weights\n", ncon);
+    printf("Make sure that the fmt parameter is set to either 10 or 11.\n");
+    printf("------------------------------------------------------------------------------\n");
+    exit(0);
+  }
+
+  graph->nedges *=2;
+  ncon = graph->ncon = (ncon == 0 ? 1 : ncon);
+
+  /*printf("%d %d %d %d %d [%d %d]\n", fmt, fmt%10, (fmt/10)%10, ncon, graph->ncon, readew, readvw);*/
+
+  if (graph->nvtxs > MAXIDX) 
+    errexit("\nThe matrix is too big: %d [%d %d]\n", graph->nvtxs, MAXIDX, sizeof(idxtype));
+
+  xadj = graph->xadj = idxsmalloc(graph->nvtxs+1, 0, "ReadGraph: xadj");
+  adjncy = graph->adjncy = idxmalloc(graph->nedges, "ReadGraph: adjncy");
+
+  vwgt = graph->vwgt = (readvw ? idxmalloc(ncon*graph->nvtxs, "ReadGraph: vwgt") : NULL);
+  adjwgt = graph->adjwgt = (readew ? idxmalloc(graph->nedges, "ReadGraph: adjwgt") : NULL);
+
+  /* Start reading the graph file */
+  for (xadj[0]=0, k=0, i=0; i<graph->nvtxs; i++) {
+    do {
+      fgets(line, MAXLINE, fpin);
+    } while (line[0] == '%' && !feof(fpin));
+    oldstr = line;
+    newstr = NULL;
+
+    if (strlen(line) == MAXLINE) 
+      errexit("\nBuffer for fgets not big enough!\n");
+
+    if (readvw) {
+      for (l=0; l<ncon; l++) {
+        vwgt[i*ncon+l] = (int)strtol(oldstr, &newstr, 10);
+        oldstr = newstr;
+      }
+    }
+
+    for (;;) {
+      edge = (int)strtol(oldstr, &newstr, 10) -1;
+      oldstr = newstr;
+
+      if (readew) {
+        ewgt = (int)strtol(oldstr, &newstr, 10);
+        oldstr = newstr;
+      }
+
+      if (edge < 0)
+        break;
+
+      adjncy[k] = edge;
+      if (readew) 
+        adjwgt[k] = ewgt;
+      k++;
+    } 
+    xadj[i+1] = k;
+  }
+
+  fclose(fpin);
+
+  if (k != graph->nedges) {
+    printf("------------------------------------------------------------------------------\n");
+    printf("***  I detected an error in your input file  ***\n\n");
+    printf("In the first line of the file, you specified that the graph contained\n%d edges. However, I only found %d edges in the file.\n", graph->nedges/2, k/2);
+    if (2*k == graph->nedges) {
+      printf("\n *> I detected that you specified twice the number of edges that you have in\n");
+      printf("    the file. Remember that the number of edges specified in the first line\n");
+      printf("    counts each edge between vertices v and u only once.\n\n");
+    }
+    printf("Please specify the correct number of edges in the first line of the file.\n");
+    printf("------------------------------------------------------------------------------\n");
+    exit(0);
+  }
+
+  free(line);
+}
+
+
+
+/*************************************************************************
+* This function writes out the partition vector
+**************************************************************************/
+void WritePartition(char *fname, idxtype *part, int n, int nparts)
+{
+  FILE *fpout;
+  int i;
+  char filename[256];
+
+  sprintf(filename,"%s.part.%d",fname, nparts);
+
+  if ((fpout = fopen(filename, "w")) == NULL) 
+    errexit("Problems in opening the partition file: %s", filename);
+
+  for (i=0; i<n; i++)
+    fprintf(fpout,"%d\n",part[i]);
+
+  fclose(fpout);
+
+}
+
+
+/*************************************************************************
+* This function writes out the partition vectors for a mesh
+**************************************************************************/
+void WriteMeshPartition(char *fname, int nparts, int ne, idxtype *epart, int nn, idxtype *npart)
+{
+  FILE *fpout;
+  int i;
+  char filename[256];
+
+  sprintf(filename,"%s.epart.%d",fname, nparts);
+
+  if ((fpout = fopen(filename, "w")) == NULL) 
+    errexit("Problems in opening the partition file: %s", filename);
+
+  for (i=0; i<ne; i++)
+    fprintf(fpout,"%d\n", epart[i]);
+
+  fclose(fpout);
+
+  sprintf(filename,"%s.npart.%d",fname, nparts);
+
+  if ((fpout = fopen(filename, "w")) == NULL) 
+    errexit("Problems in opening the partition file: %s", filename);
+
+  for (i=0; i<nn; i++)
+    fprintf(fpout,"%d\n", npart[i]);
+
+  fclose(fpout);
+
+
+}
+
+
+
+/*************************************************************************
+* This function writes out the partition vector
+**************************************************************************/
+void WritePermutation(char *fname, idxtype *iperm, int n)
+{
+  FILE *fpout;
+  int i;
+  char filename[256];
+
+  sprintf(filename,"%s.iperm",fname);
+
+  if ((fpout = fopen(filename, "w")) == NULL) 
+    errexit("Problems in opening the permutation file: %s", filename);
+
+  for (i=0; i<n; i++)
+    fprintf(fpout,"%d\n", iperm[i]);
+
+  fclose(fpout);
+
+}
+
+
+
+/*************************************************************************
+* This function checks if a graph is valid
+**************************************************************************/
+int CheckGraph(GraphType *graph)
+{
+  int i, j, k, l, nvtxs, err=0;
+  idxtype *xadj, *adjncy, *adjwgt;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  adjwgt = graph->adjwgt;
+
+
+  for (i=0; i<nvtxs; i++) {
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+
+      if (i == k) {
+        printf("Vertex %d contains a self-loop (i.e., diagonal entry in the matrix)!\n", i);
+        err++;
+      }
+      else {
+        for (l=xadj[k]; l<xadj[k+1]; l++) {
+          if (adjncy[l] == i) {
+            if (adjwgt != NULL && adjwgt[l] != adjwgt[j]) {
+              printf("Edges (%d %d) and (%d %d) do not have the same weight! %d %d\n", i,k,k,i, adjwgt[l], adjwgt[adjncy[j]]);
+              err++;
+            }
+            break;
+          }
+        }
+        if (l == xadj[k+1]) {
+          printf("Missing edge: (%d %d)!\n", k, i);
+          err++;
+        }
+      }
+    }
+  }
+
+  if (err > 0) 
+    printf("A total of %d errors exist in the input file. Correct them, and run again!\n", err);
+
+  return (err == 0 ? 1 : 0);
+}
+
+
+/*************************************************************************
+* This function reads the element node array of a mesh
+**************************************************************************/
+idxtype *ReadMesh(char *filename, int *ne, int *nn, int *etype)
+{
+  int i, j, k, esize;
+  idxtype *elmnts;
+  FILE *fpin;
+
+  if ((fpin = fopen(filename, "r")) == NULL) {
+    printf("Failed to open file %s\n", filename);
+    exit(0);
+  }
+
+  fscanf(fpin, "%d %d", ne, etype);
+
+  switch (*etype) {
+    case 1:
+      esize = 3;
+      break;
+    case 2:
+      esize = 4;
+      break;
+    case 3:
+      esize = 8;
+      break;
+    case 4:
+      esize = 4;
+      break;
+    default:
+      errexit("Unknown mesh-element type: %d\n", *etype);
+  }
+
+  elmnts = idxmalloc(esize*(*ne), "ReadMesh: elmnts");
+
+  for (j=esize*(*ne), i=0; i<j; i++) {
+    fscanf(fpin, "%d", elmnts+i);
+    elmnts[i]--;
+  }
+
+  fclose(fpin);
+
+  *nn = elmnts[idxamax(j, elmnts)]+1;
+
+  return elmnts;
+}
+
+
+/*************************************************************************
+* This function writes a graphs into a file 
+**************************************************************************/
+void WriteGraph(char *filename, int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i, j;
+  FILE *fpout;
+
+  if ((fpout = fopen(filename, "w")) == NULL) {
+    printf("Failed to open file %s\n", filename);
+    exit(0);
+  }
+
+  fprintf(fpout, "%d %d", nvtxs, xadj[nvtxs]/2);
+
+  for (i=0; i<nvtxs; i++) {
+    fprintf(fpout, "\n");
+    for (j=xadj[i]; j<xadj[i+1]; j++)
+      fprintf(fpout, " %d", adjncy[j]+1);
+  }
+
+  fclose(fpout);
+}
+
+
+/*************************************************************************
+* This function writes a graphs into a file 
+**************************************************************************/
+void WriteMocGraph(GraphType *graph)
+{
+  int i, j, nvtxs, ncon;
+  idxtype *xadj, *adjncy;
+  float *nvwgt;
+  char filename[256];
+  FILE *fpout;
+
+  nvtxs = graph->nvtxs;
+  ncon = graph->ncon;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+  nvwgt = graph->nvwgt;
+
+  sprintf(filename, "moc.graph.%d.%d", nvtxs, ncon);
+
+  if ((fpout = fopen(filename, "w")) == NULL) {
+    printf("Failed to open file %s\n", filename);
+    exit(0);
+  }
+
+  fprintf(fpout, "%d %d 10 1 %d", nvtxs, xadj[nvtxs]/2, ncon);
+
+  for (i=0; i<nvtxs; i++) {
+    fprintf(fpout, "\n");
+    for (j=0; j<ncon; j++)
+      fprintf(fpout, "%d ", (int)((float)10e6*nvwgt[i*ncon+j]));
+
+    for (j=xadj[i]; j<xadj[i+1]; j++)
+      fprintf(fpout, " %d", adjncy[j]+1);
+  }
+
+  fclose(fpout);
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/kmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/kmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/kmetis.c	(revision 9501)
@@ -0,0 +1,105 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * kmetis.c
+ *
+ * This file contains the driving routine for kmetis
+ *
+ * Started 8/28/94
+ * George
+ *
+ * $Id: kmetis.c,v 1.1 1998/11/27 17:59:35 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, nparts, options[10];
+  idxtype *part;
+  float rubvec[MAXNCON], lbvec[MAXNCON];
+  GraphType graph;
+  char filename[256];
+  int numflag = 0, wgtflag = 0, edgecut;
+  timer TOTALTmr, METISTmr, IOTmr;
+
+  if (argc != 3) {
+    printf("Usage: %s <GraphFile> <Nparts>\n",argv[0]);
+    exit(0);
+  }
+    
+  strcpy(filename, argv[1]);
+  nparts = atoi(argv[2]);
+
+  if (nparts < 2) {
+    printf("The number of partitions should be greater than 1!\n");
+    exit(0);
+  }
+
+  cleartimer(TOTALTmr);
+  cleartimer(METISTmr);
+  cleartimer(IOTmr);
+
+  starttimer(TOTALTmr);
+  starttimer(IOTmr);
+  ReadGraph(&graph, filename, &wgtflag);
+  if (graph.nvtxs <= 0) {
+    printf("Empty graph. Nothing to do.\n");
+    exit(0);
+  }
+  stoptimer(IOTmr);
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Graph Information ---------------------------------------------------\n");
+  printf("  Name: %s, #Vertices: %d, #Edges: %d, #Parts: %d\n", filename, graph.nvtxs, graph.nedges/2, nparts);
+  if (graph.ncon > 1)
+    printf("  Balancing Constraints: %d\n", graph.ncon);
+  printf("\nK-way Partitioning... -----------------------------------------------\n");
+
+  part = idxmalloc(graph.nvtxs, "main: part");
+  options[0] = 0;
+
+  starttimer(METISTmr);
+  if (graph.ncon == 1) {
+    METIS_PartGraphKway(&graph.nvtxs, graph.xadj, graph.adjncy, graph.vwgt, graph.adjwgt, 
+          &wgtflag, &numflag, &nparts, options, &edgecut, part);
+  }
+  else {
+    for (i=0; i<graph.ncon; i++)
+      rubvec[i] = HORIZONTAL_IMBALANCE;
+
+    METIS_mCPartGraphKway(&graph.nvtxs, &graph.ncon, graph.xadj, graph.adjncy, graph.vwgt, 
+          graph.adjwgt, &wgtflag, &numflag, &nparts, rubvec, options, &edgecut, part);
+  }
+  stoptimer(METISTmr);
+
+  ComputePartitionBalance(&graph, nparts, part, lbvec);
+
+  printf("  %d-way Edge-Cut: %7d, Balance: ", nparts, edgecut);
+  for (i=0; i<graph.ncon; i++)
+    printf("%5.2f ", lbvec[i]);
+  printf("\n");
+
+  starttimer(IOTmr);
+  WritePartition(filename, part, graph.nvtxs, nparts); 
+  stoptimer(IOTmr);
+  stoptimer(TOTALTmr);
+
+  printf("\nTiming Information --------------------------------------------------\n");
+  printf("  I/O:          \t\t %7.3f\n", gettimer(IOTmr));
+  printf("  Partitioning: \t\t %7.3f   (KMETIS time)\n", gettimer(METISTmr));
+  printf("  Total:        \t\t %7.3f\n", gettimer(TOTALTmr));
+  printf("**********************************************************************\n");
+
+
+  GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, &part, LTERM);
+}  
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/mesh2dual.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/mesh2dual.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/mesh2dual.c	(revision 9501)
@@ -0,0 +1,72 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mesh2dual.c
+ *
+ * This file reads in the element node connectivity array of a mesh and writes
+ * out its dual in the format suitable for Metis.
+ *
+ * Started 9/29/97
+ * George
+ *
+ * $Id: mesh2dual.c,v 1.1 1998/11/27 17:59:35 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, j, ne, nn, etype, numflag=0;
+  idxtype *elmnts, *xadj, *adjncy;
+  timer IOTmr, DUALTmr;
+  char fileout[256], etypestr[4][5] = {"TRI", "TET", "HEX", "QUAD"};
+
+  if (argc != 2) {
+    printf("Usage: %s <meshfile>\n",argv[0]);
+    exit(0);
+  }
+
+  cleartimer(IOTmr);
+  cleartimer(DUALTmr);
+
+  starttimer(IOTmr);
+  elmnts = ReadMesh(argv[1], &ne, &nn, &etype);
+  stoptimer(IOTmr);
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Mesh Information ----------------------------------------------------\n");
+  printf("  Name: %s, #Elements: %d, #Nodes: %d, Etype: %s\n\n", argv[1], ne, nn, etypestr[etype-1]);
+  printf("Forming Dual Graph... -----------------------------------------------\n");
+
+  xadj = idxmalloc(ne+1, "main: xadj");
+  adjncy = idxmalloc(10*ne, "main: adjncy");
+
+  starttimer(DUALTmr);
+  METIS_MeshToDual(&ne, &nn, elmnts, &etype, &numflag, xadj, adjncy);
+  stoptimer(DUALTmr);
+
+  printf("  Dual Information: #Vertices: %d, #Edges: %d\n", ne, xadj[ne]/2);
+
+  sprintf(fileout, "%s.dgraph", argv[1]);
+  starttimer(IOTmr);
+  WriteGraph(fileout, ne, xadj, adjncy);
+  stoptimer(IOTmr);
+
+
+  printf("\nTiming Information --------------------------------------------------\n");
+  printf("  I/O:          \t\t %7.3f\n", gettimer(IOTmr));
+  printf("  Dual Creation:\t\t %7.3f\n", gettimer(DUALTmr));
+  printf("**********************************************************************\n");
+
+  GKfree(&elmnts, &xadj, &adjncy, LTERM);
+
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/mesh2nodal.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/mesh2nodal.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/mesh2nodal.c	(revision 9501)
@@ -0,0 +1,72 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mesh2nodal.c
+ *
+ * This file reads in the element node connectivity array of a mesh and writes
+ * out its dual in the format suitable for Metis.
+ *
+ * Started 9/29/97
+ * George
+ *
+ * $Id: mesh2nodal.c,v 1.1 1998/11/27 17:59:35 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, j, ne, nn, etype, numflag=0;
+  idxtype *elmnts, *xadj, *adjncy;
+  timer IOTmr, DUALTmr;
+  char fileout[256], etypestr[4][5] = {"TRI", "TET", "HEX", "QUAD"};
+
+  if (argc != 2) {
+    printf("Usage: %s <meshfile>\n",argv[0]);
+    exit(0);
+  }
+
+  cleartimer(IOTmr);
+  cleartimer(DUALTmr);
+
+  starttimer(IOTmr);
+  elmnts = ReadMesh(argv[1], &ne, &nn, &etype);
+  stoptimer(IOTmr);
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Mesh Information ----------------------------------------------------\n");
+  printf("  Name: %s, #Elements: %d, #Nodes: %d, Etype: %s\n\n", argv[1], ne, nn, etypestr[etype-1]);
+  printf("Forming Nodal Graph... ----------------------------------------------\n");
+
+  xadj = idxmalloc(nn+1, "main: xadj");
+  adjncy = idxmalloc(20*nn, "main: adjncy");
+
+  starttimer(DUALTmr);
+  METIS_MeshToNodal(&ne, &nn, elmnts, &etype, &numflag, xadj, adjncy);
+  stoptimer(DUALTmr);
+
+  printf("  Nodal Information: #Vertices: %d, #Edges: %d\n", nn, xadj[nn]/2);
+
+  sprintf(fileout, "%s.ngraph", argv[1]);
+  starttimer(IOTmr);
+  WriteGraph(fileout, nn, xadj, adjncy);
+  stoptimer(IOTmr);
+
+
+  printf("\nTiming Information --------------------------------------------------\n");
+  printf("  I/O:          \t\t %7.3f\n", gettimer(IOTmr));
+  printf("  Nodal Creation:\t\t %7.3f\n", gettimer(DUALTmr));
+  printf("**********************************************************************\n");
+
+  GKfree(&elmnts, &xadj, &adjncy, LTERM);
+
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/oemetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/oemetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/oemetis.c	(revision 9501)
@@ -0,0 +1,95 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * oemetis.c
+ *
+ * This file contains the driving routine for multilevel method
+ *
+ * Started 8/28/94
+ * George
+ *
+ * $Id: oemetis.c,v 1.1 1998/11/27 17:59:37 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, options[10];
+  idxtype *perm, *iperm;
+  GraphType graph;
+  char filename[256];
+  int numflag = 0, wgtflag;
+  timer TOTALTmr, METISTmr, IOTmr, SMBTmr;
+
+
+  if (argc != 2) {
+    printf("Usage: %s <GraphFile>\n",argv[0]);
+    exit(0);
+  }
+    
+  strcpy(filename, argv[1]);
+
+  cleartimer(TOTALTmr);
+  cleartimer(METISTmr);
+  cleartimer(IOTmr);
+  cleartimer(SMBTmr);
+
+  starttimer(TOTALTmr);
+  starttimer(IOTmr);
+  ReadGraph(&graph, filename, &wgtflag);
+  if (graph.nvtxs <= 0) {
+    printf("Empty graph. Nothing to do.\n");
+    exit(0);
+  }
+  if (graph.ncon != 1) {
+    printf("Ordering can only be applied to graphs with one constraint.\n");
+    exit(0);
+  }
+  stoptimer(IOTmr);
+
+  /* Ordering does not use weights! */
+  GKfree(&graph.vwgt, &graph.adjwgt, LTERM);
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Graph Information ---------------------------------------------------\n");
+  printf("  Name: %s, #Vertices: %d, #Edges: %d\n\n", filename, graph.nvtxs, graph.nedges/2);
+  printf("Edge-Based Ordering... ----------------------------------------------\n");
+
+  perm = idxmalloc(graph.nvtxs, "main: perm");
+  iperm = idxmalloc(graph.nvtxs, "main: iperm");
+  options[0] = 0;
+
+  starttimer(METISTmr);
+  METIS_EdgeND(&graph.nvtxs, graph.xadj, graph.adjncy, &numflag, options, perm, iperm);
+  stoptimer(METISTmr);
+
+  starttimer(IOTmr);
+  WritePermutation(filename, iperm, graph.nvtxs); 
+  stoptimer(IOTmr);
+
+  starttimer(SMBTmr);
+  ComputeFillIn(&graph, iperm);
+  stoptimer(SMBTmr);
+
+  stoptimer(TOTALTmr);
+
+  printf("\nTiming Information --------------------------------------------------\n");
+  printf("  I/O:                     \t %7.3f\n", gettimer(IOTmr));
+  printf("  Ordering:                \t %7.3f   (OEMETIS time)\n", gettimer(METISTmr));
+  printf("  Symbolic Factorization:  \t %7.3f\n", gettimer(SMBTmr));
+  printf("  Total:                   \t %7.3f\n", gettimer(TOTALTmr));
+  printf("**********************************************************************\n");
+
+
+  GKfree(&graph.xadj, &graph.adjncy, &perm, &iperm, LTERM);
+}  
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/onmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/onmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/onmetis.c	(revision 9501)
@@ -0,0 +1,95 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * onmetis.c
+ *
+ * This file contains the driving routine for multilevel method
+ *
+ * Started 8/28/94
+ * George
+ *
+ * $Id: onmetis.c,v 1.1 1998/11/27 17:59:38 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, options[10];
+  idxtype *perm, *iperm;
+  GraphType graph;
+  char filename[256];
+  int numflag = 0, wgtflag;
+  timer TOTALTmr, METISTmr, IOTmr, SMBTmr;
+
+
+  if (argc != 2) {
+    printf("Usage: %s <GraphFile>\n",argv[0]);
+    exit(0);
+  }
+    
+  strcpy(filename, argv[1]);
+
+  cleartimer(TOTALTmr);
+  cleartimer(METISTmr);
+  cleartimer(IOTmr);
+  cleartimer(SMBTmr);
+
+  starttimer(TOTALTmr);
+  starttimer(IOTmr);
+  ReadGraph(&graph, filename, &wgtflag);
+  if (graph.nvtxs <= 0) {
+    printf("Empty graph. Nothing to do.\n");
+    exit(0);
+  }
+  if (graph.ncon != 1) {
+    printf("Ordering can only be applied to graphs with one constraint.\n");
+    exit(0);
+  }
+  stoptimer(IOTmr);
+
+  /* Ordering does not use weights! */
+  GKfree(&graph.vwgt, &graph.adjwgt, LTERM);
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Graph Information ---------------------------------------------------\n");
+  printf("  Name: %s, #Vertices: %d, #Edges: %d\n\n", filename, graph.nvtxs, graph.nedges/2);
+  printf("Node-Based Ordering... ----------------------------------------------\n");
+
+  perm = idxmalloc(graph.nvtxs, "main: perm");
+  iperm = idxmalloc(graph.nvtxs, "main: iperm");
+  options[0] = 0;
+
+  starttimer(METISTmr);
+  METIS_NodeND(&graph.nvtxs, graph.xadj, graph.adjncy, &numflag, options, perm, iperm);
+  stoptimer(METISTmr);
+
+  starttimer(IOTmr);
+  WritePermutation(filename, iperm, graph.nvtxs); 
+  stoptimer(IOTmr);
+
+  starttimer(SMBTmr);
+  ComputeFillIn(&graph, iperm);
+  stoptimer(SMBTmr);
+
+  stoptimer(TOTALTmr);
+
+  printf("\nTiming Information --------------------------------------------------\n");
+  printf("  I/O:                     \t %7.3f\n", gettimer(IOTmr));
+  printf("  Ordering:                \t %7.3f   (ONMETIS time)\n", gettimer(METISTmr));
+  printf("  Symbolic Factorization:  \t %7.3f\n", gettimer(SMBTmr));
+  printf("  Total:                   \t %7.3f\n", gettimer(TOTALTmr));
+  printf("**********************************************************************\n");
+
+
+  GKfree(&graph.xadj, &graph.adjncy, &perm, &iperm, LTERM);
+}  
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/partdmesh.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/partdmesh.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/partdmesh.c	(revision 9501)
@@ -0,0 +1,93 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * partdmesh.c
+ *
+ * This file reads in the element node connectivity array of a mesh and 
+ * partitions both the elements and the nodes using KMETIS on the dual graph.
+ *
+ * Started 9/29/97
+ * George
+ *
+ * $Id: partdmesh.c,v 1.1 1998/11/27 17:59:38 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, j, ne, nn, etype, numflag=0, nparts, edgecut;
+  idxtype *elmnts, *epart, *npart;
+  timer IOTmr, DUALTmr;
+  char etypestr[4][5] = {"TRI", "TET", "HEX", "QUAD"};
+  GraphType graph;
+
+  if (argc != 3) {
+    printf("Usage: %s <meshfile> <nparts>\n",argv[0]);
+    exit(0);
+  }
+
+  nparts = atoi(argv[2]);
+  if (nparts < 2) {
+    printf("nparts must be greater than one.\n");
+    exit(0);
+  }
+   
+  cleartimer(IOTmr);
+  cleartimer(DUALTmr);
+
+  starttimer(IOTmr);
+  elmnts = ReadMesh(argv[1], &ne, &nn, &etype);
+  stoptimer(IOTmr);
+
+  epart = idxmalloc(ne, "main: epart");
+  npart = idxmalloc(nn, "main: npart");
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Mesh Information ----------------------------------------------------\n");
+  printf("  Name: %s, #Elements: %d, #Nodes: %d, Etype: %s\n\n", argv[1], ne, nn, etypestr[etype-1]);
+  printf("Partitioning Dual Graph... ------------------------------------------\n");
+
+
+  starttimer(DUALTmr);
+  METIS_PartMeshDual(&ne, &nn, elmnts, &etype, &numflag, &nparts, &edgecut, epart, npart);
+  stoptimer(DUALTmr);
+
+  printf("  %d-way Edge-Cut: %7d, Balance: %5.2f\n", nparts, edgecut, ComputeElementBalance(ne, nparts, epart));
+
+  starttimer(IOTmr);
+  WriteMeshPartition(argv[1], nparts, ne, epart, nn, npart);
+  stoptimer(IOTmr);
+
+
+  printf("\nTiming Information --------------------------------------------------\n");
+  printf("  I/O:          \t\t %7.3f\n", gettimer(IOTmr));
+  printf("  Partitioning: \t\t %7.3f\n", gettimer(DUALTmr));
+  printf("**********************************************************************\n");
+
+/*
+  graph.nvtxs = nn;
+  graph.xadj = idxmalloc(nn+1, "xadj");
+  graph.vwgt = idxsmalloc(nn, 1, "vwgt");
+  graph.adjncy = idxmalloc(20*nn, "adjncy");
+  graph.adjwgt = idxsmalloc(20*nn, 1, "adjncy");
+
+  METIS_MeshToNodal(&ne, &nn, elmnts, &etype, &numflag, graph.xadj, graph.adjncy);
+
+  ComputePartitionInfo(&graph, nparts, npart);
+
+  GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, LTERM);
+*/
+
+  GKfree(&elmnts, &epart, &npart, LTERM);
+
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/partnmesh.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/partnmesh.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/partnmesh.c	(revision 9501)
@@ -0,0 +1,93 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * partnmesh.c
+ *
+ * This file reads in the element node connectivity array of a mesh and 
+ * partitions both the elements and the nodes using KMETIS on the dual graph.
+ *
+ * Started 9/29/97
+ * George
+ *
+ * $Id: partnmesh.c,v 1.1 1998/11/27 17:59:39 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, j, ne, nn, etype, numflag=0, nparts, edgecut;
+  idxtype *elmnts, *epart, *npart;
+  timer IOTmr, DUALTmr;
+  char etypestr[4][5] = {"TRI", "TET", "HEX", "QUAD"};
+  GraphType graph;
+
+  if (argc != 3) {
+    printf("Usage: %s <meshfile> <nparts>\n",argv[0]);
+    exit(0);
+  }
+
+  nparts = atoi(argv[2]);
+  if (nparts < 2) {
+    printf("nparts must be greater than one.\n");
+    exit(0);
+  }
+   
+  cleartimer(IOTmr);
+  cleartimer(DUALTmr);
+
+  starttimer(IOTmr);
+  elmnts = ReadMesh(argv[1], &ne, &nn, &etype);
+  stoptimer(IOTmr);
+
+  epart = idxmalloc(ne, "main: epart");
+  npart = idxmalloc(nn, "main: npart");
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Mesh Information ----------------------------------------------------\n");
+  printf("  Name: %s, #Elements: %d, #Nodes: %d, Etype: %s\n\n", argv[1], ne, nn, etypestr[etype-1]);
+  printf("Partitioning Nodal Graph... -----------------------------------------\n");
+
+
+  starttimer(DUALTmr);
+  METIS_PartMeshNodal(&ne, &nn, elmnts, &etype, &numflag, &nparts, &edgecut, epart, npart);
+  stoptimer(DUALTmr);
+
+  printf("  %d-way Edge-Cut: %7d, Balance: %5.2f\n", nparts, edgecut, ComputeElementBalance(ne, nparts, epart));
+
+  starttimer(IOTmr);
+  WriteMeshPartition(argv[1], nparts, ne, epart, nn, npart);
+  stoptimer(IOTmr);
+
+
+  printf("\nTiming Information --------------------------------------------------\n");
+  printf("  I/O:          \t\t %7.3f\n", gettimer(IOTmr));
+  printf("  Partitioning: \t\t %7.3f\n", gettimer(DUALTmr));
+  printf("**********************************************************************\n");
+
+/*
+  graph.nvtxs = ne;
+  graph.xadj = idxmalloc(ne+1, "xadj");
+  graph.vwgt = idxsmalloc(ne, 1, "vwgt");
+  graph.adjncy = idxmalloc(10*ne, "adjncy");
+  graph.adjwgt = idxsmalloc(10*ne, 1, "adjncy");
+
+  METIS_MeshToDual(&ne, &nn, elmnts, &etype, &numflag, graph.xadj, graph.adjncy);
+
+  ComputePartitionInfo(&graph, nparts, epart);
+
+  GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, LTERM);
+*/
+
+  GKfree(&elmnts, &epart, &npart, LTERM);
+
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/pmetis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/pmetis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/pmetis.c	(revision 9501)
@@ -0,0 +1,105 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * pmetis.c
+ *
+ * This file contains the driving routine for multilevel method
+ *
+ * Started 8/28/94
+ * George
+ *
+ * $Id: pmetis.c,v 1.1 1998/11/27 17:59:39 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, nparts, options[10];
+  idxtype *part;
+  float lbvec[MAXNCON];
+  GraphType graph;
+  char filename[256];
+  int numflag = 0, wgtflag = 0, edgecut;
+  timer TOTALTmr, METISTmr, IOTmr;
+
+
+  if (argc != 3) {
+    printf("Usage: %s <GraphFile> <Nparts>\n",argv[0]);
+    exit(0);
+  }
+    
+  strcpy(filename, argv[1]);
+  nparts = atoi(argv[2]);
+
+  if (nparts < 2) {
+    printf("The number of partitions should be greater than 1!\n");
+    exit(0);
+  }
+
+  cleartimer(TOTALTmr);
+  cleartimer(METISTmr);
+  cleartimer(IOTmr);
+
+  starttimer(TOTALTmr);
+  starttimer(IOTmr);
+  ReadGraph(&graph, filename, &wgtflag);
+  if (graph.nvtxs <= 0) {
+    printf("Empty graph. Nothing to do.\n");
+    exit(0);
+  }
+  stoptimer(IOTmr);
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Graph Information ---------------------------------------------------\n");
+  printf("  Name: %s, #Vertices: %d, #Edges: %d, #Parts: %d\n", filename, graph.nvtxs, graph.nedges/2, nparts);
+  if (graph.ncon > 1)
+    printf("  Balancing Constraints: %d\n", graph.ncon);
+  printf("\nRecursive Partitioning... -------------------------------------------\n");
+
+  part = idxmalloc(graph.nvtxs, "main: part");
+  options[0] = 0;
+
+  starttimer(METISTmr);
+  if (graph.ncon == 1) {
+    METIS_PartGraphRecursive(&graph.nvtxs, graph.xadj, graph.adjncy, graph.vwgt, graph.adjwgt, 
+          &wgtflag, &numflag, &nparts, options, &edgecut, part);
+  }
+  else {
+    METIS_mCPartGraphRecursive(&graph.nvtxs, &graph.ncon, graph.xadj, graph.adjncy, graph.vwgt, 
+          graph.adjwgt, &wgtflag, &numflag, &nparts, options, &edgecut, part);
+  }
+
+  stoptimer(METISTmr);
+
+  ComputePartitionBalance(&graph, nparts, part, lbvec);
+
+  printf("  %d-way Edge-Cut: %7d, Balance: ", nparts, edgecut);
+  for (i=0; i<graph.ncon; i++)
+    printf("%5.2f ", lbvec[i]);
+  printf("\n");
+
+
+  starttimer(IOTmr);
+  WritePartition(filename, part, graph.nvtxs, nparts); 
+  stoptimer(IOTmr);
+  stoptimer(TOTALTmr);
+
+  printf("\nTiming Information --------------------------------------------------\n");
+  printf("  I/O:          \t\t %7.3f\n", gettimer(IOTmr));
+  printf("  Partitioning: \t\t %7.3f   (PMETIS time)\n", gettimer(METISTmr));
+  printf("  Total:        \t\t %7.3f\n", gettimer(TOTALTmr));
+  printf("**********************************************************************\n");
+
+
+  GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, &part, LTERM);
+}  
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/smbfactor.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/smbfactor.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Programs/smbfactor.c	(revision 9501)
@@ -0,0 +1,385 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * smbfactor.c
+ *
+ * This file performs the symbolic factorization of a matrix
+ *
+ * Started 8/1/97
+ * George
+ *
+ * $Id: smbfactor.c,v 1.1 1998/11/27 17:59:40 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+/*************************************************************************
+* This function sets up data structures for fill-in computations
+**************************************************************************/
+void ComputeFillIn(GraphType *graph, idxtype *iperm)
+{
+  int i, j, k, nvtxs, maxlnz, maxsub;
+  idxtype *xadj, *adjncy;
+  idxtype *perm, *xlnz, *xnzsub, *nzsub;
+  double opc;
+
+/*
+  printf("\nSymbolic factorization... --------------------------------------------\n");
+*/
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+
+  maxsub = 4*xadj[nvtxs];
+
+  /* Relabel the vertices so that it starts from 1 */
+  k = xadj[nvtxs];
+  for (i=0; i<k; i++)
+    adjncy[i]++;
+  for (i=0; i<nvtxs+1; i++)
+    xadj[i]++;
+
+  /* Allocate the required memory */
+  perm = idxmalloc(nvtxs+1, "ComputeFillIn: perm");
+  xlnz = idxmalloc(nvtxs+1, "ComputeFillIn: xlnz");
+  xnzsub = idxmalloc(nvtxs+1, "ComputeFillIn: xnzsub");
+  nzsub = idxmalloc(maxsub, "ComputeFillIn: nzsub");
+
+  /* Construct perm from iperm and change the numbering of iperm */
+  for (i=0; i<nvtxs; i++)
+    perm[iperm[i]] = i;
+  for (i=0; i<nvtxs; i++) {
+    iperm[i]++;
+    perm[i]++;
+  }
+  
+  /*
+   * Call sparspak routine.
+   */
+  if (smbfct(nvtxs, xadj, adjncy, perm, iperm, xlnz, &maxlnz, xnzsub, nzsub, &maxsub)) {
+    free(nzsub);
+
+    maxsub = 4*maxsub; 
+    nzsub = idxmalloc(maxsub, "ComputeFillIn: nzsub");
+    if (smbfct(nvtxs, xadj, adjncy, perm, iperm, xlnz, &maxlnz, xnzsub, nzsub, &maxsub)) 
+      errexit("MAXSUB is too small!");
+  }
+
+  opc = 0;
+  for (i=0; i<nvtxs; i++)
+    xlnz[i]--;
+  for (i=0; i<nvtxs; i++)
+    opc += (xlnz[i+1]-xlnz[i])*(xlnz[i+1]-xlnz[i]) - (xlnz[i+1]-xlnz[i]);
+
+  printf("  Nonzeros: %d, \tOperation Count: %6.4le\n", maxlnz, opc);
+
+
+  GKfree(&perm, &xlnz, &xnzsub, &nzsub, LTERM);
+
+
+  /* Relabel the vertices so that it starts from 0 */
+  for (i=0; i<nvtxs; i++)
+    iperm[i]--;
+  for (i=0; i<nvtxs+1; i++)
+    xadj[i]--;
+  k = xadj[nvtxs];
+  for (i=0; i<k; i++)
+    adjncy[i]--;
+
+}
+
+
+
+/*************************************************************************
+* This function sets up data structures for fill-in computations
+**************************************************************************/
+idxtype ComputeFillIn2(GraphType *graph, idxtype *iperm)
+{
+  int i, j, k, nvtxs, maxlnz, maxsub;
+  idxtype *xadj, *adjncy;
+  idxtype *perm, *xlnz, *xnzsub, *nzsub;
+  double opc;
+
+  nvtxs = graph->nvtxs;
+  xadj = graph->xadj;
+  adjncy = graph->adjncy;
+
+  maxsub = 4*xadj[nvtxs];
+
+  /* Relabel the vertices so that it starts from 1 */
+  k = xadj[nvtxs];
+  for (i=0; i<k; i++)
+    adjncy[i]++;
+  for (i=0; i<nvtxs+1; i++)
+    xadj[i]++;
+
+  /* Allocate the required memory */
+  perm = idxmalloc(nvtxs+1, "ComputeFillIn: perm");
+  xlnz = idxmalloc(nvtxs+1, "ComputeFillIn: xlnz");
+  xnzsub = idxmalloc(nvtxs+1, "ComputeFillIn: xnzsub");
+  nzsub = idxmalloc(maxsub, "ComputeFillIn: nzsub");
+
+  /* Construct perm from iperm and change the numbering of iperm */
+  for (i=0; i<nvtxs; i++)
+    perm[iperm[i]] = i;
+  for (i=0; i<nvtxs; i++) {
+    iperm[i]++;
+    perm[i]++;
+  }
+  
+  /*
+   * Call sparspak routine.
+   */
+  if (smbfct(nvtxs, xadj, adjncy, perm, iperm, xlnz, &maxlnz, xnzsub, nzsub, &maxsub)) {
+    free(nzsub);
+
+    maxsub = 4*maxsub; 
+    nzsub = idxmalloc(maxsub, "ComputeFillIn: nzsub");
+    if (smbfct(nvtxs, xadj, adjncy, perm, iperm, xlnz, &maxlnz, xnzsub, nzsub, &maxsub)) 
+      errexit("MAXSUB is too small!");
+  }
+
+  opc = 0;
+  for (i=0; i<nvtxs; i++)
+    xlnz[i]--;
+  for (i=0; i<nvtxs; i++)
+    opc += (xlnz[i+1]-xlnz[i])*(xlnz[i+1]-xlnz[i]) - (xlnz[i+1]-xlnz[i]);
+
+
+  GKfree(&perm, &xlnz, &xnzsub, &nzsub, LTERM);
+
+
+  /* Relabel the vertices so that it starts from 0 */
+  for (i=0; i<nvtxs; i++)
+    iperm[i]--;
+  for (i=0; i<nvtxs+1; i++)
+    xadj[i]--;
+  k = xadj[nvtxs];
+  for (i=0; i<k; i++)
+    adjncy[i]--;
+
+  return maxlnz;
+
+}
+
+
+/*****************************************************************          
+**********     SMBFCT ..... SYMBOLIC FACTORIZATION       ********* 
+******************************************************************          
+*   PURPOSE - THIS ROUTINE PERFORMS SYMBOLIC FACTORIZATION               
+*   ON A PERMUTED LINEAR SYSTEM AND IT ALSO SETS UP THE               
+*   COMPRESSED DATA STRUCTURE FOR THE SYSTEM.                         
+*
+*   INPUT PARAMETERS -                                               
+*      NEQNS - NUMBER OF EQUATIONS.                                 
+*      (XADJ, ADJNCY) - THE ADJACENCY STRUCTURE.                   
+*      (PERM, INVP) - THE PERMUTATION VECTOR AND ITS INVERSE.     
+*
+*   UPDATED PARAMETERS -                                         
+*      MAXSUB - SIZE OF THE SUBSCRIPT ARRAY NZSUB.  ON RETURN,  
+*             IT CONTAINS THE NUMBER OF SUBSCRIPTS USED        
+*
+*   OUTPUT PARAMETERS -                                       
+*      XLNZ - INDEX INTO THE NONZERO STORAGE VECTOR LNZ.   
+*      (XNZSUB, NZSUB) - THE COMPRESSED SUBSCRIPT VECTORS. 
+*      MAXLNZ - THE NUMBER OF NONZEROS FOUND.             
+*
+*******************************************************************/
+int smbfct(int neqns, idxtype *xadj, idxtype *adjncy, idxtype *perm, idxtype *invp, idxtype *xlnz, 
+           int *maxlnz, idxtype *xnzsub, idxtype *nzsub, int *maxsub)
+{
+  /* Local variables */
+  int node, rchm, mrgk, lmax, i, j, k, m, nabor, nzbeg, nzend;
+  int kxsub, jstop, jstrt, mrkflg, inz, knz, flag;
+  idxtype *mrglnk, *marker, *rchlnk;
+
+  rchlnk = idxmalloc(neqns+1, "smbfct: rchlnk");
+  marker = idxsmalloc(neqns+1, 0, "smbfct: marker");
+  mrglnk = idxsmalloc(neqns+1, 0, "smbfct: mgrlnk");
+
+  /* Parameter adjustments */
+  --marker;
+  --mrglnk;
+  --rchlnk;
+  --nzsub;
+  --xnzsub;
+  --xlnz;
+  --invp;
+  --perm;
+  --adjncy;
+  --xadj;
+
+  /* Function Body */
+  flag = 0;
+  nzbeg = 1;
+  nzend = 0;
+  xlnz[1] = 1;
+
+  /* FOR EACH COLUMN KNZ COUNTS THE NUMBER OF NONZEROS IN COLUMN K ACCUMULATED IN RCHLNK. */
+  for (k = 1; k <= neqns; ++k) {
+    knz = 0;
+    mrgk = mrglnk[k];
+    mrkflg = 0;
+    marker[k] = k;
+    if (mrgk != 0) 
+      marker[k] = marker[mrgk];
+    xnzsub[k] = nzend;
+    node = perm[k];
+
+    if (xadj[node] >= xadj[node+1]) {
+      xlnz[k+1] = xlnz[k];
+      continue;
+    }
+
+    /* USE RCHLNK TO LINK THROUGH THE STRUCTURE OF A(*,K) BELOW DIAGONAL */
+    rchlnk[k] = neqns+1;
+    for (j=xadj[node]; j<xadj[node+1]; j++) {
+      nabor = invp[adjncy[j]];
+      if (nabor <= k) 
+        continue;
+      rchm = k;
+
+      do {
+        m = rchm;
+        rchm = rchlnk[m];
+      } while (rchm <= nabor); 
+
+      knz++;
+      rchlnk[m] = nabor;
+      rchlnk[nabor] = rchm;
+      if (marker[nabor] != marker[k]) 
+        mrkflg = 1;
+    }
+
+    /* TEST FOR MASS SYMBOLIC ELIMINATION */
+    lmax = 0;
+    if (mrkflg != 0 || mrgk == 0 || mrglnk[mrgk] != 0) 
+      goto L350;
+    xnzsub[k] = xnzsub[mrgk] + 1;
+    knz = xlnz[mrgk + 1] - (xlnz[mrgk] + 1);
+    goto L1400;
+
+
+    /* LINK THROUGH EACH COLUMN I THAT AFFECTS L(*,K) */
+L350:
+    i = k;
+    while ((i = mrglnk[i]) != 0) {
+      inz = xlnz[i+1] - (xlnz[i]+1);
+      jstrt = xnzsub[i] + 1;
+      jstop = xnzsub[i] + inz;
+
+      if (inz > lmax) { 
+        lmax = inz;
+        xnzsub[k] = jstrt;
+      }
+
+      /* MERGE STRUCTURE OF L(*,I) IN NZSUB INTO RCHLNK. */ 
+      rchm = k;
+      for (j = jstrt; j <= jstop; ++j) {
+        nabor = nzsub[j];
+        do {
+          m = rchm;
+          rchm = rchlnk[m];
+        } while (rchm < nabor);
+
+        if (rchm != nabor) {
+          knz++;
+          rchlnk[m] = nabor;
+          rchlnk[nabor] = rchm;
+          rchm = nabor;
+        }
+      }
+    }
+
+    /* CHECK IF SUBSCRIPTS DUPLICATE THOSE OF ANOTHER COLUMN */
+    if (knz == lmax) 
+      goto L1400;
+
+    /* OR IF TAIL OF K-1ST COLUMN MATCHES HEAD OF KTH */
+    if (nzbeg > nzend) 
+      goto L1200;
+
+    i = rchlnk[k];
+    for (jstrt = nzbeg; jstrt <= nzend; ++jstrt) {
+      if (nzsub[jstrt] < i) 
+        continue;
+
+      if (nzsub[jstrt] == i) 
+        goto L1000;
+      else 
+        goto L1200;
+    }
+    goto L1200;
+
+L1000:
+    xnzsub[k] = jstrt;
+    for (j = jstrt; j <= nzend; ++j) {
+      if (nzsub[j] != i) 
+        goto L1200;
+      
+      i = rchlnk[i];
+      if (i > neqns) 
+        goto L1400;
+    }
+    nzend = jstrt - 1;
+
+    /* COPY THE STRUCTURE OF L(*,K) FROM RCHLNK TO THE DATA STRUCTURE (XNZSUB, NZSUB) */
+L1200:
+    nzbeg = nzend + 1;
+    nzend += knz;
+
+    if (nzend > *maxsub) {
+      flag = 1; /* Out of memory */
+      break;
+    }
+
+    i = k;
+    for (j=nzbeg; j<=nzend; ++j) {
+      i = rchlnk[i];
+      nzsub[j] = i;
+      marker[i] = k;
+    }
+    xnzsub[k] = nzbeg;
+    marker[k] = k;
+
+    /*
+     * UPDATE THE VECTOR MRGLNK.  NOTE COLUMN L(*,K) JUST FOUND   
+     * IS REQUIRED TO DETERMINE COLUMN L(*,J), WHERE              
+     * L(J,K) IS THE FIRST NONZERO IN L(*,K) BELOW DIAGONAL.      
+     */
+L1400:
+    if (knz > 1) { 
+      kxsub = xnzsub[k];
+      i = nzsub[kxsub];
+      mrglnk[k] = mrglnk[i];
+      mrglnk[i] = k;
+    }
+
+    xlnz[k + 1] = xlnz[k] + knz;
+  }
+
+  if (flag == 0) {
+    *maxlnz = xlnz[neqns] - 1;
+    *maxsub = xnzsub[neqns];
+    xnzsub[neqns + 1] = xnzsub[neqns];
+  }
+
+  marker++;
+  mrglnk++;
+  rchlnk++;
+  nzsub++;
+  xnzsub++;
+  xlnz++;
+  invp++;
+  perm++;
+  adjncy++;
+  xadj++;
+  GKfree(&rchlnk, &mrglnk, &marker, LTERM);
+
+  return flag;
+  
+} 
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Test/Makefile
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Test/Makefile	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Test/Makefile	(revision 9501)
@@ -0,0 +1,31 @@
+include ../Makefile.in
+
+BINDIR = ../Graphs
+
+INCLUDES = -I../Lib 
+CFLAGS = $(COPTIONS) $(OPTFLAGS) $(INCLUDES)
+
+LIBS = -lmetis -lm
+LD = $(CC) $(LDOPTIONS) -L. -L..
+METISLIB = ../libmetis.a
+
+
+
+MTESTOBJS = mtest.o ../Programs/io.o 
+
+
+.c.o:
+	$(CC) $(CFLAGS) -c $*.c
+
+default: $(BINDIR)/mtest
+
+$(BINDIR)/mtest: $(MTESTOBJS) $(METISLIB)
+	$(LD)  -o $@ $(MTESTOBJS) $(LIBS)
+
+
+clean:
+	rm -f *.o
+
+realclean:
+	rm -f *.o ;\
+        rm -f $(BINDIR)/mtest 
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Test/mtest.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Test/mtest.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/Test/mtest.c	(revision 9501)
@@ -0,0 +1,1776 @@
+/*
+ * Copyright 1997, Regents of the University of Minnesota
+ *
+ * mtest.c
+ *
+ * This file is a comprehensive tester for all the graph partitioning/ordering
+ * routines of METIS
+ *
+ * Started 9/18/98
+ * George
+ *
+ * $Id: mtest.c,v 1.8 1998/09/20 17:36:14 karypis Exp $
+ *
+ */
+
+#include <metis.h>
+
+
+
+/*************************************************************************
+* Let the game begin
+**************************************************************************/
+main(int argc, char *argv[])
+{
+  int i, nparts, options[10];
+  idxtype *part;
+  float lbvec[MAXNCON], rubvec[MAXNCON];
+  GraphType graph;
+  int numflag = 0, wgtflag = 0, edgecut;
+
+
+  if (argc != 2) {
+    printf("Usage: %s <GraphFile>\n",argv[0]);
+    exit(0);
+  }
+    
+  ReadGraph(&graph, argv[1], &wgtflag);
+
+  printf("**********************************************************************\n");
+  printf("%s", METISTITLE);
+  printf("Graph Information ---------------------------------------------------\n");
+  printf("  Name: %s, #Vertices: %d, #Edges: %d\n", argv[1], graph.nvtxs, graph.nedges/2);
+
+  Test_PartGraph(graph.nvtxs, graph.xadj, graph.adjncy);
+
+  Test_PartGraphV(graph.nvtxs, graph.xadj, graph.adjncy);
+
+  Test_PartGraphmC(graph.nvtxs, graph.xadj, graph.adjncy);
+
+  Test_ND(graph.nvtxs, graph.xadj, graph.adjncy);
+
+  printf("\n---------------------------------------------------------------------\n");
+  printf(" Testing completed.\n");
+  printf("**********************************************************************\n");
+
+  GKfree(&graph.xadj, &graph.adjncy, &graph.vwgt, &graph.adjwgt, LTERM);
+}  
+
+
+
+/*************************************************************************
+* This function tests the regular graph partitioning routines
+**************************************************************************/
+void Test_PartGraph(int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i, j, jj, k, tstnum, rcode;
+  int nparts, numflag, wgtflag, edgecut, options[10];
+  idxtype *part, *vwgt, *adjwgt;
+  float tpwgts[256];
+
+  vwgt = idxmalloc(nvtxs, "vwgt");
+  for (i=0; i<nvtxs; i++)
+    vwgt[i] = RandomInRange(10);
+
+  adjwgt = idxmalloc(xadj[nvtxs], "adjwgt");
+  for (i=0; i<nvtxs; i++) {
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (i < k) {
+        adjwgt[j] = 1+RandomInRange(5);
+        for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+          if (adjncy[jj] == i) {
+            adjwgt[jj] = adjwgt[j];
+            break;
+          }
+        }
+      }
+    }
+  }
+
+
+  part = idxmalloc(nvtxs, "part");
+
+  tpwgts[0] = .1;
+  tpwgts[1] = .2;
+  tpwgts[2] = .3;
+  tpwgts[3] = .1;
+  tpwgts[4] = .05;
+  tpwgts[5] = .25;
+
+
+  /*===========================================================================*/
+  printf("\nTesting METIS_PartGraphRecursive ------------------------------------\n  ");
+  tstnum = 1;
+
+/**/
+  numflag = 0; wgtflag = 0; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphRecursive(&nvtxs, xadj, adjncy, NULL, NULL, &wgtflag, &numflag,
+                           &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, NULL, NULL, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphRecursive(&nvtxs, xadj, adjncy, NULL, adjwgt, &wgtflag, &numflag,
+                           &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, NULL, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 2; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphRecursive(&nvtxs, xadj, adjncy, vwgt, NULL, &wgtflag, &numflag,
+                           &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, NULL, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphRecursive(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                           &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_PartGraphRecursive(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                           &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_PartGraphRecursive(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                           &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+ 
+  /*===========================================================================*/
+  printf("\nTesting METIS_WPartGraphRecursive -----------------------------------\n  ");
+  tstnum = 1;
+
+
+/**/
+  numflag = 0; wgtflag = 0; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphRecursive(&nvtxs, xadj, adjncy, NULL, NULL, &wgtflag, &numflag,
+                           &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, NULL, NULL, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphRecursive(&nvtxs, xadj, adjncy, NULL, adjwgt, &wgtflag, &numflag,
+                           &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, NULL, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 2; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphRecursive(&nvtxs, xadj, adjncy, vwgt, NULL, &wgtflag, &numflag,
+                           &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, NULL, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphRecursive(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                           &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_WPartGraphRecursive(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                           &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_WPartGraphRecursive(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                           &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+
+  /*===========================================================================*/
+  printf("\nTesting METIS_PartGraphKway -----------------------------------------\n  ");
+  tstnum = 1;
+
+/**/
+  numflag = 0; wgtflag = 0; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphKway(&nvtxs, xadj, adjncy, NULL, NULL, &wgtflag, &numflag,
+                      &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, NULL, NULL, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphKway(&nvtxs, xadj, adjncy, NULL, adjwgt, &wgtflag, &numflag,
+                      &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, NULL, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 2; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphKway(&nvtxs, xadj, adjncy, vwgt, NULL, &wgtflag, &numflag,
+                      &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, NULL, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                      &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_PartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                      &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_PartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                      &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 2; options[4] = 0;
+  METIS_PartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                      &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 3; options[4] = 0;
+  METIS_PartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                      &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+ 
+  /*===========================================================================*/
+  printf("\nTesting METIS_WPartGraphKway ----------------------------------------\n  ");
+  tstnum = 1;
+
+
+/**/
+  numflag = 0; wgtflag = 0; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphKway(&nvtxs, xadj, adjncy, NULL, NULL, &wgtflag, &numflag,
+                       &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, NULL, NULL, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphKway(&nvtxs, xadj, adjncy, NULL, adjwgt, &wgtflag, &numflag,
+                       &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, NULL, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 2; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphKway(&nvtxs, xadj, adjncy, vwgt, NULL, &wgtflag, &numflag,
+                       &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, NULL, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                       &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_WPartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                       &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_WPartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                       &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 2; options[4] = 0;
+  METIS_WPartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                       &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 3; options[4] = 0;
+  METIS_WPartGraphKway(&nvtxs, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                       &nparts, tpwgts, options, &edgecut, part);
+
+  if ((rcode = VerifyWPart(nvtxs, xadj, adjncy, vwgt, adjwgt, nparts, tpwgts, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+  GKfree(&vwgt, &adjwgt, &part, LTERM);
+}
+
+
+
+/*************************************************************************
+* This function verifies that the partitioning was computed correctly
+**************************************************************************/
+int VerifyPart(int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+               idxtype *adjwgt, int nparts, int edgecut, idxtype *part)
+{
+  int i, j, k, cut, vfree=0, efree=0, rcode=0;
+  idxtype *pwgts;
+
+  if (part[idxamax(nvtxs, part)] != nparts-1)
+    return 1;  /* the total number of partitions is different than nparts */
+
+  /* compute the cut and the pwgts */
+  if (vwgt == NULL) {
+    vfree = 1;
+    vwgt = idxsmalloc(nvtxs, 1, "vwgt");
+  }
+  if (adjwgt == NULL) {
+    efree = 1;
+    adjwgt = idxsmalloc(xadj[nvtxs], 1, "adjwgt");
+  }
+  pwgts = idxsmalloc(nparts, 0, "pwgts");
+
+  for (cut=0, i=0; i<nvtxs; i++) {
+    pwgts[part[i]] += vwgt[i];
+    for (j=xadj[i]; j<xadj[i+1]; j++) 
+      cut += (part[i] != part[adjncy[j]] ? adjwgt[j] : 0);
+  }
+
+  if (cut != 2*edgecut)
+    rcode = 2;
+
+  if (nparts*pwgts[idxamax(nparts, pwgts)] > 1.10*idxsum(nparts, pwgts))
+    rcode = 3;
+
+  if (vfree)
+    free(vwgt);
+
+  if (efree)
+    free(adjwgt);
+
+  free(pwgts);
+
+  MALLOC_CHECK(NULL);
+
+  return rcode;
+}
+
+
+/*************************************************************************
+* This function verifies that the partitioning was computed correctly
+**************************************************************************/
+int VerifyWPart(int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                idxtype *adjwgt, int nparts, float *tpwgts, int edgecut, idxtype *part)
+{
+  int i, j, k, tvwgt, cut, vfree=0, efree=0, rcode=0;
+  idxtype *pwgts;
+
+  if (part[idxamax(nvtxs, part)] != nparts-1) 
+    return 1;  /* the total number of partitions is different than nparts */
+
+  /* compute the cut and the pwgts */
+  if (vwgt == NULL) {
+    vfree = 1;
+    vwgt = idxsmalloc(nvtxs, 1, "vwgt");
+  }
+  if (adjwgt == NULL) {
+    efree = 1;
+    adjwgt = idxsmalloc(xadj[nvtxs], 1, "adjwgt");
+  }
+  pwgts = idxsmalloc(nparts, 0, "pwgts");
+
+  for (cut=0, i=0; i<nvtxs; i++) {
+    pwgts[part[i]] += vwgt[i];
+    for (j=xadj[i]; j<xadj[i+1]; j++) 
+      cut += (part[i] != part[adjncy[j]] ? adjwgt[j] : 0);
+  }
+
+  if (cut != 2*edgecut)
+    rcode = 2;
+
+  tvwgt = idxsum(nparts, pwgts);
+  for (i=0; i<nparts; i++) {
+    if (pwgts[i] > 1.10*tpwgts[i]*tvwgt) {
+      rcode = 3;
+      break;
+    }
+  }
+
+  if (vfree)
+    free(vwgt);
+
+  if (efree)
+    free(adjwgt);
+
+  free(pwgts);
+
+  MALLOC_CHECK(NULL);
+
+  return rcode;
+}
+
+
+
+/*************************************************************************
+* This function tests the regular graph partitioning routines
+**************************************************************************/
+void Test_PartGraphV(int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i, j, jj, k, tstnum, rcode;
+  int nparts, numflag, wgtflag, totalv, options[10];
+  idxtype *part, *vwgt, *vsize;
+  float tpwgts[256];
+
+  vwgt = idxmalloc(nvtxs, "vwgt");
+  for (i=0; i<nvtxs; i++)
+    vwgt[i] = RandomInRange(10);
+
+  vsize = idxmalloc(nvtxs, "vsize");
+  for (i=0; i<nvtxs; i++)
+    vsize[i] = RandomInRange(10);
+
+  part = idxmalloc(nvtxs, "part");
+
+  tpwgts[0] = .1;
+  tpwgts[1] = .2;
+  tpwgts[2] = .3;
+  tpwgts[3] = .1;
+  tpwgts[4] = .05;
+  tpwgts[5] = .25;
+
+
+  /*===========================================================================*/
+  printf("\nTesting METIS_PartGraphVKway ----------------------------------------\n  ");
+  tstnum = 1;
+
+/**/
+  numflag = 0; wgtflag = 0; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphVKway(&nvtxs, xadj, adjncy, NULL, NULL, &wgtflag, &numflag,
+                       &nparts, options, &totalv, part);
+
+  if ((rcode = VerifyPartV(nvtxs, xadj, adjncy, NULL, NULL, nparts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphVKway(&nvtxs, xadj, adjncy, NULL, vsize, &wgtflag, &numflag,
+                       &nparts, options, &totalv, part);
+
+  if ((rcode = VerifyPartV(nvtxs, xadj, adjncy, NULL, vsize, nparts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 2; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphVKway(&nvtxs, xadj, adjncy, vwgt, NULL, &wgtflag, &numflag,
+                       &nparts, options, &totalv, part);
+
+  if ((rcode = VerifyPartV(nvtxs, xadj, adjncy, vwgt, NULL, nparts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 0;
+  METIS_PartGraphVKway(&nvtxs, xadj, adjncy, vwgt, vsize, &wgtflag, &numflag,
+                       &nparts, options, &totalv, part);
+
+  if ((rcode = VerifyPartV(nvtxs, xadj, adjncy, vwgt, vsize, nparts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_PartGraphVKway(&nvtxs, xadj, adjncy, vwgt, vsize, &wgtflag, &numflag,
+                       &nparts, options, &totalv, part);
+
+  if ((rcode = VerifyPartV(nvtxs, xadj, adjncy, vwgt, vsize, nparts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_PartGraphVKway(&nvtxs, xadj, adjncy, vwgt, vsize, &wgtflag, &numflag,
+                       &nparts, options, &totalv, part);
+
+  if ((rcode = VerifyPartV(nvtxs, xadj, adjncy, vwgt, vsize, nparts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 20;
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 3; options[4] = 0;
+  METIS_PartGraphVKway(&nvtxs, xadj, adjncy, vwgt, vsize, &wgtflag, &numflag,
+                       &nparts, options, &totalv, part);
+
+  if ((rcode = VerifyPartV(nvtxs, xadj, adjncy, vwgt, vsize, nparts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+ 
+  /*===========================================================================*/
+  printf("\nTesting METIS_WPartGraphVKway ---------------------------------------\n  ");
+  tstnum = 1;
+
+
+/**/
+  numflag = 0; wgtflag = 0; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphVKway(&nvtxs, xadj, adjncy, NULL, NULL, &wgtflag, &numflag,
+                        &nparts, tpwgts, options, &totalv, part);
+
+  if ((rcode = VerifyWPartV(nvtxs, xadj, adjncy, NULL, NULL, nparts, tpwgts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphVKway(&nvtxs, xadj, adjncy, NULL, vsize, &wgtflag, &numflag,
+                        &nparts, tpwgts, options, &totalv, part);
+
+  if ((rcode = VerifyWPartV(nvtxs, xadj, adjncy, NULL, vsize, nparts, tpwgts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 2; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphVKway(&nvtxs, xadj, adjncy, vwgt, NULL, &wgtflag, &numflag,
+                        &nparts, tpwgts, options, &totalv, part);
+
+  if ((rcode = VerifyWPartV(nvtxs, xadj, adjncy, vwgt, NULL, nparts, tpwgts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 0;
+  METIS_WPartGraphVKway(&nvtxs, xadj, adjncy, vwgt, vsize, &wgtflag, &numflag,
+                        &nparts, tpwgts, options, &totalv, part);
+
+  if ((rcode = VerifyWPartV(nvtxs, xadj, adjncy, vwgt, vsize, nparts, tpwgts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_WPartGraphVKway(&nvtxs, xadj, adjncy, vwgt, vsize, &wgtflag, &numflag,
+                        &nparts, tpwgts, options, &totalv, part);
+
+  if ((rcode = VerifyWPartV(nvtxs, xadj, adjncy, vwgt, vsize, nparts, tpwgts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_WPartGraphVKway(&nvtxs, xadj, adjncy, vwgt, vsize, &wgtflag, &numflag,
+                        &nparts, tpwgts, options, &totalv, part);
+
+  if ((rcode = VerifyWPartV(nvtxs, xadj, adjncy, vwgt, vsize, nparts, tpwgts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 3; nparts = 6;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 3; options[4] = 0;
+  METIS_WPartGraphVKway(&nvtxs, xadj, adjncy, vwgt, vsize, &wgtflag, &numflag,
+                        &nparts, tpwgts, options, &totalv, part);
+
+  if ((rcode = VerifyWPartV(nvtxs, xadj, adjncy, vwgt, vsize, nparts, tpwgts, totalv, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+  GKfree(&vwgt, &vsize, &part, LTERM);
+}
+
+
+/*************************************************************************
+* This function verifies that the partitioning was computed correctly
+**************************************************************************/
+int VerifyPartV(int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+               idxtype *vsize, int nparts, int totalv, idxtype *part)
+{
+  int i, j, k, ttlv, vfree=0, efree=0, rcode=0;
+  idxtype *pwgts, *marker;
+
+  if (part[idxamax(nvtxs, part)] != nparts-1)
+    return 1;  /* the total number of partitions is different than nparts */
+
+  /* compute the cut and the pwgts */
+  if (vwgt == NULL) {
+    vfree = 1;
+    vwgt = idxsmalloc(nvtxs, 1, "vwgt");
+  }
+  if (vsize == NULL) {
+    efree = 1;
+    vsize = idxsmalloc(nvtxs, 1, "vsize");
+  }
+  pwgts = idxsmalloc(nparts, 0, "pwgts");
+
+  marker = idxsmalloc(nparts, -1, "htable");
+  for (ttlv=0, i=0; i<nvtxs; i++) {
+    pwgts[part[i]] += vwgt[i];
+    marker[part[i]] = i;
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (marker[part[adjncy[j]]] != i) {
+        ttlv += vsize[i];
+        marker[part[adjncy[j]]] = i;
+      }
+    }
+  }
+
+  if (ttlv != totalv)
+    rcode = 2;
+
+  if (nparts*pwgts[idxamax(nparts, pwgts)] > 1.05*idxsum(nparts, pwgts))
+    rcode = 3;
+
+  if (vfree)
+    free(vwgt);
+
+  if (efree)
+    free(vsize);
+
+  free(pwgts);
+  free(marker);
+
+  MALLOC_CHECK(NULL);
+
+  return rcode;
+}
+
+
+/*************************************************************************
+* This function verifies that the partitioning was computed correctly
+**************************************************************************/
+int VerifyWPartV(int nvtxs, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+                idxtype *vsize, int nparts, float *tpwgts, int totalv, idxtype *part)
+{
+  int i, j, k, tvwgt, ttlv, vfree=0, efree=0, rcode=0;
+  idxtype *pwgts, *marker;
+
+  if (part[idxamax(nvtxs, part)] != nparts-1) 
+    return 1;  /* the total number of partitions is different than nparts */
+
+  /* compute the cut and the pwgts */
+  if (vwgt == NULL) {
+    vfree = 1;
+    vwgt = idxsmalloc(nvtxs, 1, "vwgt");
+  }
+  if (vsize == NULL) {
+    efree = 1;
+    vsize = idxsmalloc(nvtxs, 1, "vsize");
+  }
+  pwgts = idxsmalloc(nparts, 0, "pwgts");
+
+  marker = idxsmalloc(nparts, -1, "htable");
+  for (ttlv=0, i=0; i<nvtxs; i++) {
+    pwgts[part[i]] += vwgt[i];
+    marker[part[i]] = i;
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      if (marker[part[adjncy[j]]] != i) {
+        ttlv += vsize[i];
+        marker[part[adjncy[j]]] = i;
+      }
+    }
+  }
+
+  if (ttlv != totalv)
+    rcode = 2;
+
+  tvwgt = idxsum(nparts, pwgts);
+  for (i=0; i<nparts; i++) {
+    if (pwgts[i] > 1.05*tpwgts[i]*tvwgt) {
+      rcode = 3;
+      break;
+    }
+  }
+
+  if (vfree)
+    free(vwgt);
+
+  if (efree)
+    free(vsize);
+
+  free(pwgts);
+  free(marker);
+
+  MALLOC_CHECK(NULL);
+
+  return rcode;
+}
+
+
+
+/*************************************************************************
+* This function tests the regular graph partitioning routines
+**************************************************************************/
+void Test_PartGraphmC(int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i, j, jj, k, tstnum, rcode;
+  int nparts, ncon, numflag, wgtflag, edgecut, options[10];
+  idxtype *part, *vwgt, *adjwgt;
+  float ubvec[MAXNCON];
+
+  ncon = 3;
+
+  vwgt = idxmalloc(nvtxs*ncon, "vwgt");
+  for (i=0; i<ncon*nvtxs; i++)
+    vwgt[i] = RandomInRange(10);
+
+  adjwgt = idxmalloc(xadj[nvtxs], "adjwgt");
+  for (i=0; i<nvtxs; i++) {
+    for (j=xadj[i]; j<xadj[i+1]; j++) {
+      k = adjncy[j];
+      if (i < k) {
+        adjwgt[j] = 1+RandomInRange(5);
+        for (jj=xadj[k]; jj<xadj[k+1]; jj++) {
+          if (adjncy[jj] == i) {
+            adjwgt[jj] = adjwgt[j];
+            break;
+          }
+        }
+      }
+    }
+  }
+
+
+  part = idxmalloc(nvtxs, "part");
+
+
+
+  /*===========================================================================*/
+  printf("\nTesting METIS_mCPartGraphRecursive ----------------------------------\n  ");
+  tstnum = 1;
+
+/**/
+  numflag = 0; wgtflag = 0; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, NULL, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, NULL, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 4; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 5; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 6; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 7; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 8; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n  ");
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 4; options[2] = 2; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 3; options[2] = 2; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphRecursive(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                             &nparts, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+
+  printf("\nTesting METIS_mCPartGraphKway ---------------------------------------\n  ");
+  tstnum = 1;
+
+/**/
+  numflag = 0; wgtflag = 0; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, NULL, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, NULL, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 4; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 5; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 6; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 7; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 8; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n  ");
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 6; options[2] = 2; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.5; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 4; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 1.05; ubvec[1] = 1.5; ubvec[2] = 1.5;
+  options[0] = 1; options[1] = 3; options[2] = 2; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; wgtflag = 1; nparts = 10;
+  ubvec[0] = 2.05; ubvec[1] = 1.05; ubvec[2] = 1.05;
+  options[0] = 1; options[1] = 4; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_mCPartGraphKway(&nvtxs, &ncon, xadj, adjncy, vwgt, adjwgt, &wgtflag, &numflag,
+                        &nparts, ubvec, options, &edgecut, part);
+
+  if ((rcode = VerifyPartmC(nvtxs, ncon, xadj, adjncy, vwgt, adjwgt, nparts, ubvec, edgecut, part)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+  printf("\n");
+
+  GKfree(&vwgt, &adjwgt, &part, LTERM);
+}
+
+
+
+/*************************************************************************
+* This function verifies that the partitioning was computed correctly
+**************************************************************************/
+int VerifyPartmC(int nvtxs, int ncon, idxtype *xadj, idxtype *adjncy, idxtype *vwgt, 
+               idxtype *adjwgt, int nparts, float *ubvec, int edgecut, idxtype *part)
+{
+  int i, j, k, cut, efree=0, rcode=0;
+  idxtype *pwgts;
+  float lb;
+
+  if (part[idxamax(nvtxs, part)] != nparts-1)
+    return 1;  /* the total number of partitions is different than nparts */
+
+  if (adjwgt == NULL) {
+    efree = 1;
+    adjwgt = idxsmalloc(xadj[nvtxs], 1, "adjwgt");
+  }
+  pwgts = idxsmalloc(ncon*nparts, 0, "pwgts");
+
+  for (cut=0, i=0; i<nvtxs; i++) {
+    for (j=0; j<ncon; j++)
+      pwgts[part[i]*ncon+j] += vwgt[i*ncon+j];
+    for (j=xadj[i]; j<xadj[i+1]; j++) 
+      cut += (part[i] != part[adjncy[j]] ? adjwgt[j] : 0);
+  }
+
+  if (cut != 2*edgecut)
+    rcode = 2;
+
+/*
+printf("\n");
+for (i=0; i<nparts; i++) {
+  for (j=0; j<ncon; j++) 
+    printf("%5d ", pwgts[i*ncon+j]);
+  printf("\n");
+}
+printf("---------------------------------\n");
+for (j=0; j<ncon; j++) 
+  printf("%5d ", idxsum_strd(nparts, pwgts+j, ncon));
+printf("\n---------------------------------\n");
+for (j=0; j<ncon; j++) 
+  printf("%5d ", pwgts[ncon*idxamax_strd(nparts, pwgts+j, ncon)+j]);
+printf("\n%d %d\n", idxsum(ncon*nvtxs, vwgt), idxsum(ncon*nparts, pwgts));
+*/
+
+  for (i=0; i<ncon; i++) {
+    lb = 1.0*nparts*pwgts[ncon*idxamax_strd(nparts, pwgts+i, ncon)+i]/(1.0*idxsum_strd(nparts, pwgts+i, ncon));
+    /*printf("[%3.2f]", lb);*/
+    if (lb > ubvec[i])
+      rcode = 3;
+  }
+
+
+  if (efree)
+    free(adjwgt);
+
+  free(pwgts);
+
+  MALLOC_CHECK(NULL);
+
+  return rcode;
+}
+
+
+/*************************************************************************
+* This function tests the regular graph partitioning routines
+**************************************************************************/
+void Test_ND(int nvtxs, idxtype *xadj, idxtype *adjncy)
+{
+  int i, j, jj, k, tstnum, rcode;
+  int numflag, wgtflag, options[10];
+  idxtype *perm, *iperm, *vwgt;
+
+  vwgt = idxmalloc(nvtxs, "vwgt");
+  for (i=0; i<nvtxs; i++)
+    vwgt[i] = 1+RandomInRange(10);
+
+
+  perm = idxmalloc(nvtxs, "perm");
+  iperm = idxmalloc(nvtxs, "iperm");
+
+
+
+  /*===========================================================================*/
+  printf("\nTesting METIS_EdgeND ------------------------------------------------\n  ");
+  tstnum = 1;
+
+/**/
+  numflag = 0; 
+  options[0] = 0;
+  METIS_EdgeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_EdgeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_EdgeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+
+  /*===========================================================================*/
+  printf("\nTesting METIS_NodeND ------------------------------------------------\n  ");
+  tstnum = 1;
+
+/**/
+  numflag = 0; 
+  options[0] = 0;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  options[5] = 0; options[6] = 0; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0; 
+  options[5] = 0; options[6] = 0; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 1; options[4] = 0;
+  options[5] = 0; options[6] = 0; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 2; options[3] = 1; options[4] = 0;
+  options[5] = 0; options[6] = 0; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  options[5] = 0; options[6] = 0; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  options[5] = 1; options[6] = 0; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  options[5] = 2; options[6] = 0; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  options[5] = 3; options[6] = 0; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  options[5] = 3; options[6] = 40; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n  ");
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  options[5] = 3; options[6] = 20; options[7] = 1;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  options[5] = 3; options[6] = 20; options[7] = 2;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  options[5] = 0; options[6] = 0; options[7] = 2;
+  METIS_NodeND(&nvtxs, xadj, adjncy, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+
+  /*===========================================================================*/
+  printf("\nTesting METIS_NodeWND -----------------------------------------------\n  ");
+  tstnum = 1;
+
+/**/
+  numflag = 0; 
+  options[0] = 0;
+  METIS_NodeWND(&nvtxs, xadj, adjncy, vwgt, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 1; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_NodeWND(&nvtxs, xadj, adjncy, vwgt, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 2; options[2] = 1; options[3] = 1; options[4] = 0; 
+  METIS_NodeWND(&nvtxs, xadj, adjncy, vwgt, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 1; options[4] = 0;
+  METIS_NodeWND(&nvtxs, xadj, adjncy, vwgt, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 2; options[3] = 1; options[4] = 0;
+  METIS_NodeWND(&nvtxs, xadj, adjncy, vwgt, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+
+/**/
+  numflag = 0; 
+  options[0] = 1; options[1] = 3; options[2] = 1; options[3] = 2; options[4] = 0;
+  METIS_NodeWND(&nvtxs, xadj, adjncy, vwgt, &numflag, options, perm, iperm);
+
+  if ((rcode = VerifyND(nvtxs, perm, iperm)) == 0)
+    printf("[%d:ok]", tstnum++);
+  else
+    printf("[%d:err-%d]", tstnum++, rcode);
+  fflush(stdout);
+
+  printf("\n");
+
+
+  GKfree(&vwgt, &perm, &iperm, LTERM);
+}
+
+
+
+/*************************************************************************
+* This function verifies that the partitioning was computed correctly
+**************************************************************************/
+int VerifyND(int nvtxs, idxtype *perm, idxtype *iperm)
+{
+  int i, j, k, rcode=0;
+
+  for (i=0; i<nvtxs; i++) {
+    if (i != perm[iperm[i]])
+      rcode = 1;
+  }
+
+  for (i=0; i<nvtxs; i++) {
+    if (i != iperm[perm[i]])
+      rcode = 2;
+  }
+
+  MALLOC_CHECK(NULL);
+
+  return rcode;
+}
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/VERSION
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/VERSION	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/metis-4.0/VERSION	(revision 9501)
@@ -0,0 +1,1 @@
+METIS 4.0.1	Mon Nov 30 10:27:29 CST 1998
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/bridge.h
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/bridge.h	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/bridge.h	(revision 9501)
@@ -0,0 +1,1 @@
+void bridge_partMeshNodal(int *, int *, idxtype *, int *, int *, int *, int *, idxtype *, idxtype *);
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/get_module.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/get_module.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/get_module.py	(revision 9501)
@@ -0,0 +1,49 @@
+
+import os
+import os.path
+import shutil
+from os.path import join
+
+os.chdir('build')
+
+
+for file in os.listdir('.'):
+    if os.path.isdir(file) and file.startswith('lib'):
+        os.chdir(file)
+        locallist = os.listdir('.')
+        for lfile in locallist:
+            if  lfile=='metis.so' or lfile=='metis.pyd':
+                print 'Found %s in %s\n' % (lfile, file)
+                shutil.copy2(lfile, join('..','..','..'))
+            else:
+                pass
+        os.chdir('..')
+
+os.chdir('..')
+
+   
+        
+                
+
+    
+   
+   
+   
+   
+    
+"""    
+for X in $(ls -d lib.*)
+  do
+  cd ${X}
+  if [ -f metis.so ]
+      then
+      cp metis.so ../../../ -pf
+      echo 'Found metis.so in' ${X}
+  elif [ -f metis.pyd ]
+      then
+      cp metis.pyd ../../../ -pf
+      echo 'Found metis.pyd in' ${X}
+  fi
+  cd ..
+done
+"""
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/metis.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/metis.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/metis.c	(revision 9501)
@@ -0,0 +1,117 @@
+#include <Python.h>
+#include <numpy/arrayobject.h>
+
+/* This must be the same as the metis idxtype */
+typedef int idxtype;
+
+#include "bridge.h"
+
+static PyObject * metis_partMeshNodal(PyObject *, PyObject *);
+
+static PyMethodDef methods[] = {
+  {"partMeshNodal", metis_partMeshNodal, METH_VARARGS, "METIS_PartMeshNodal"},
+  {NULL, NULL, 0, NULL}
+};
+
+PyMODINIT_FUNC initmetis(void){
+  (void) Py_InitModule("metis", methods);
+
+  import_array();
+}
+
+/* Run the metis METIS_PartMeshNodal function
+ * expected args:
+ * ne: number of elements
+ * nn: number of nodes
+ * elmnts: element array
+ * etype: type of mesh elements:
+ ** 1 - triangle
+ ** 2 - tetrahedra
+ ** 3 - hexahedra
+ ** 4 - quadrilaterals
+ * nparts: number of partitions
+ * returns:
+ * edgecut: number of cut edges
+ * epart: partitioning of the elements
+ * npart: partitioning of the nodes.
+ *
+ * Note that while the metis data file format indexes verticies from 1,
+ * the library calls (including this one) use vericies indexed from 0.
+ * Unsure if this is because of the num_flag option, perhaps calling
+ * from a FORTRAN program will have 1-indexed verticies?
+ */
+static PyObject * metis_partMeshNodal(PyObject * self, PyObject * args){
+  int i;
+  int malloc_elem_c_arr = 0;
+  int ne;
+  int nn;
+  int etype;
+  int nparts;
+  int edgecut;
+  int numflag = 0; // The metis routine requires an int * for numflag.
+  npy_intp dims[1]; // PyArray_SimpleNewFromData needs an npy_intp[] of array sizes.
+
+  PyObject * elements;
+  PyArrayObject * elem_arr;
+  PyArrayObject * epart_pyarr;
+  PyArrayObject * npart_pyarr;
+
+  /* These are all of the metis idxtype */
+  idxtype * elem_c_arr;
+  idxtype * epart;
+  idxtype * npart;
+  if(!PyArg_ParseTuple(args, "iiOii", &ne, &nn, &elements, &etype, &nparts))
+    return NULL;
+
+  elem_arr = (PyArrayObject *) PyArray_ContiguousFromObject(elements, PyArray_NOTYPE, 1, 1);
+
+  if(!elem_arr)
+    return NULL;
+
+  /* x86_64 will create arrays of longs and they need to be
+   * converted to arrays of idxtype for metis to work on them.
+   */
+  if(elem_arr->descr->type_num == PyArray_LONG){
+    elem_c_arr = (idxtype *)malloc(*(elem_arr->dimensions) * sizeof(idxtype));
+    malloc_elem_c_arr = 1;
+    if(!elem_c_arr)
+	return NULL;
+    for(i = 0 ; i < *(elem_arr->dimensions) ; i++){
+      elem_c_arr[i] = (idxtype)(((long *)elem_arr->data)[i]);
+      if(elem_c_arr[i] != ((long *)elem_arr->data)[i]){ /* i.e. downcast failed */
+	free(elem_c_arr);
+        Py_DECREF(elem_arr);
+	return NULL;
+      }
+    }
+  }else
+    elem_c_arr = (idxtype *)elem_arr->data;
+
+  epart = (idxtype *)malloc(ne * sizeof(idxtype));
+  if(epart == NULL){
+    if(malloc_elem_c_arr) free(elem_c_arr);
+    Py_DECREF(elem_arr);
+    return NULL;
+  }
+  npart = (idxtype *)malloc(nn * sizeof(idxtype));
+  if(npart == NULL){
+    if(malloc_elem_c_arr) free(elem_c_arr);
+    free(epart);
+    Py_DECREF(elem_arr);
+    return NULL;
+  }
+  bridge_partMeshNodal(&ne, &nn, elem_c_arr, &etype, &numflag, &nparts, &edgecut, epart, npart);
+
+  dims[0] = ne;
+  epart_pyarr = (PyArrayObject *)PyArray_SimpleNewFromData(1, dims, PyArray_INT, (void *)epart);
+  //epart_pyarr = (PyArrayObject *)PyArray_FromDimsAndData(1, dims, PyArray_INT, (char *)epart);
+  dims[0] = nn;
+  npart_pyarr = (PyArrayObject *)PyArray_SimpleNewFromData(1, dims, PyArray_INT, (void *)npart);
+  //npart_pyarr = (PyArrayObject *)PyArray_FromDimsAndData(1, dims, PyArray_INT, (char *)npart);
+
+  
+  if(malloc_elem_c_arr) free(elem_c_arr);
+  Py_DECREF(elem_arr);
+
+  return Py_BuildValue("iOO", edgecut, (PyObject *)epart_pyarr, (PyObject *)npart_pyarr);
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/metis_bridge.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/metis_bridge.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/metis_bridge.c	(revision 9501)
@@ -0,0 +1,16 @@
+/* Python.h and metis.h don't get along, so this is an ugly
+ * hack to make it work.
+ */
+
+//#include <metis.h>
+
+#include <defs.h>
+#include <struct.h>
+#include <macros.h>
+#include <rename.h>
+#include <proto.h>
+
+
+void bridge_partMeshNodal(int * ne, int * nn, idxtype * elmnts, int * etype, int * numflag, int * nparts, int * edgecut, idxtype * epart, idxtype * npart){
+  METIS_PartMeshNodal(ne, nn, elmnts, etype, numflag, nparts, edgecut, epart, npart);
+}
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/setup.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/setup.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/pymetis/setup.py	(revision 9501)
@@ -0,0 +1,14 @@
+from distutils.core import setup, Extension;
+from numpy.distutils.misc_util import get_numpy_include_dirs;
+import os;
+
+metis = Extension('metis',
+                  sources = ['metis.c', 'metis_bridge.c'],
+                  include_dirs = ['..' + os.sep + os.environ['METIS_DIR'] + os.sep + 'Lib' ] + get_numpy_include_dirs(),
+                  libraries = ['metis', 'm'],
+                  library_dirs = ['..' + os.sep + os.environ['METIS_DIR']]);
+
+setup(name = 'PyMetis',
+      version = '1.0',
+      description = 'Python interface to metis',
+      ext_modules = [metis]);
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/test_all.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/test_all.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/test_all.py	(revision 9501)
@@ -0,0 +1,220 @@
+"""Regression testing framework
+This module will search for scripts in the same directory named
+test_*.py.  Each such script should be a test suite that tests a
+module through PyUnit. This script will aggregate all
+found test suites into one big test suite and run them all at once.
+"""
+
+# Author: Mark Pilgrim
+# Modified by Ole Nielsen
+
+import unittest
+import os
+import sys
+import tempfile
+import time
+import anuga.utilities.system_tools as aust
+from anuga.utilities.terminal_width import terminal_width
+
+
+#List files that should be excluded from the testing process.
+#E.g. if they are known to fail and under development
+exclude_files = []
+
+# Directories that should not be searched for test files.
+exclude_dirs = ['metis-4.0','pymetis',               # Special requirements
+                '.svn',                              # subversion
+                'props', 'wcprops', 'prop-base', 'text-base', 'tmp']
+
+
+##
+# @brief List a string sequence on the screen in columns.
+# @param names Sequence of strings to list.
+# @param func Function to apply to each string in sequence.
+# @param col_width Force columns to this width (default calculated).
+# @param page_width Set displayable page width to this (default 132).
+def list_names(names, func=None, col_width=None, page_width=None):
+    # set defaults
+    p_width = page_width - 1            # set page width
+    if p_width is None:
+        p_width = 132                   # default page width
+
+    c_width = col_width                 # set column width
+    if c_width is None:
+        c_width = 0
+        for name in names:
+            if func:
+                name = func(name)
+            c_width = max(c_width, len(name))
+    c_width += 2                        # 2 column padding
+
+    # calculate number of columns allowed
+    max_columns = int(p_width / c_width)
+
+    # print columns
+    column = 0
+    for name in names:
+        if func:
+            name = func(name)
+        print '%-*s' % (c_width-1, name),
+        column += 1
+        if column >= max_columns:
+            column = 0
+            print
+
+    # if last line not finished, end it here
+    if column > 0:
+        print
+
+
+##
+# @brief Get 'test_*.py' files and paths to directories.
+# @param path Path to directory to start walk in.
+# @return A tuple (<files>, <dirs>).
+# @note Don't include any files in and below forbidden directories.
+def get_test_files(path):
+    walk = os.walk(path)
+
+    test_files = []
+    path_files = []
+
+    for (dirpath, dirnames, filenames) in walk:
+        # exclude forbidden directories
+        for e_dir in exclude_dirs:
+            try:
+                dirnames.remove(e_dir)
+            except ValueError:
+                pass
+
+        # check for test_*.py files
+        for filename in filenames:
+            if filename.startswith('test_') and filename.endswith('.py'):
+                test_files.append(filename)
+                if dirpath not in path_files:
+                    path_files.append(dirpath)
+
+    return test_files, path_files
+
+
+def regressionTest(test_verbose=False):
+    # start off with where we are
+    path = os.getcwd()
+    print
+    print 'Testing path: %s' % path
+
+    # get the terminal width
+    term_width = terminal_width()
+
+    # explain what we are doing
+    print
+    print "The following directories will be skipped over:"
+    exclude_dirs.sort()
+    list_names(exclude_dirs, page_width=term_width)
+
+    # get all test_*.py and enclosing directories
+    test_files, path_files = get_test_files(path)
+    path_files.sort()
+
+    files = [x for x in test_files if not x == 'test_all.py']
+    files.sort()        # Ensure same order on all platforms
+
+    print
+    print 'Paths searched:'
+    list_names(path_files, os.path.basename, page_width=term_width)
+
+    print    
+    print 'Files tested:'
+    list_names(files, page_width=term_width)
+    print
+
+    # update system path with found paths
+    for path in path_files:
+        sys.path.append(path)
+   
+    # exclude files that we can't handle 
+    for file in exclude_files:
+        print 'WARNING: File '+ file + ' to be excluded from testing'
+        try:
+            files.remove(file)
+        except ValueError, e:
+            msg = 'File "%s" was not found in test suite.\n' % file
+            msg += 'Original error is "%s"\n' % e
+            msg += 'Perhaps it should be removed from exclude list?'
+            raise Exception, msg
+
+    # import all test_*.py files
+    # NOTE: This implies that test_*.py files MUST HAVE UNIQUE NAMES!
+    filenameToModuleName = lambda f: os.path.splitext(f)[0]
+    moduleNames = map(filenameToModuleName, files)
+    modules = map(__import__, moduleNames)
+
+    # Fix up the system path
+    for file in path_files:
+        sys.path.remove(file)
+
+    # bundle up all the tests
+    load = unittest.defaultTestLoader.loadTestsFromModule
+    testCaseClasses = map(load, modules)
+
+    if test_verbose is True:
+        # Test the code by setting verbose to True.
+        # The test cases have to be set up for this to work.
+        # See test data manager for an example.
+        for test_suite in testCaseClasses:
+            for tests in test_suite._tests:
+                # tests is of class TestSuite
+                if len(tests._tests) > 1:
+                    # these are the test functions
+                    try:
+                        # Calls class method set_verbose in test case classes
+                        tests._tests[0].set_verbose()
+                    except:
+                        pass                # No all classes have set_verbose
+
+    return unittest.TestSuite(testCaseClasses)
+
+
+##
+# @brief Check that the environment is sane.
+# @note Stops here if there is an error.
+def check_anuga_import():
+    try:
+        # importing something that loads quickly
+        import anuga.anuga_exceptions
+    except ImportError:
+        print "Python cannot import ANUGA module."
+        print "Check you have followed all steps of its installation."
+        import sys
+        sys.exit()
+
+
+if __name__ == '__main__':
+    check_anuga_import()
+
+    if len(sys.argv) > 1 and sys.argv[1][0].upper() == 'V':
+        test_verbose = True
+        saveout = sys.stdout
+        filename = ".temp"
+        fid = open(filename, 'w')
+        sys.stdout = fid
+    else:
+        test_verbose = False
+    suite = regressionTest(test_verbose)
+    runner = unittest.TextTestRunner() #verbosity=2
+    runner.run(suite)
+
+    # timestamp at the end
+    timestamp = time.asctime()
+    version = aust.get_revision_number()
+    print
+    print 'Finished at %s, version %s' % (timestamp, version)
+
+    # Cleaning up
+    if len(sys.argv) > 1 and sys.argv[1][0].upper() == 'V':
+        sys.stdout = saveout
+        #fid.close() # This was causing an error in windows
+        #os.remove(filename)
+
+    
+    #if sys.platform == 'win32':
+    #    raw_input('Press the RETURN key')
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/test_metis.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/test_metis.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/test_metis.py	(revision 9501)
@@ -0,0 +1,120 @@
+#!/usr/bin/env python
+from os import sep
+from sys import path
+
+from numpy import array, allclose
+
+import unittest
+
+# path.append('..' + sep + 'pymetis')
+
+import anuga.parallel.pymetis.metis  as metis
+
+class TestMetis(unittest.TestCase):
+    def setUp(self):
+        pass
+
+    def test_Hexmesh(self):
+        # Hexagonal mesh
+        #
+        #   1---2  
+        #  / \ / \
+        # 6---0---3
+        #  \ / \ /
+        #   5---4
+        #
+        # Divided 3 ways
+        # Calling order is: elements, verticies, edge list
+        # element type, number parts
+        edgecut, epart, npart = metis.partMeshNodal(6, 7,\
+                                                    [0, 1, 2,\
+                                                     0, 2, 3,\
+                                                     0, 3, 4,\
+                                                     0, 4, 5,\
+                                                     0, 5, 6,\
+                                                     0, 6, 1],\
+                                                    1,\
+                                                    3,)
+        #print edgecut
+        #print epart
+        #print npart
+        epart_expected = array([2, 2, 0, 0, 0, 0], 'i')
+        npart_expected = array([0, 2, 2, 2, 0, 0, 0], 'i')
+        self.assert_(edgecut == 5)
+        assert allclose(epart, epart_expected)
+        assert allclose(npart, npart_expected)        
+
+
+    def test_Hexmesh2(self):
+        # Hexagonal mesh
+        #
+        #   1---2  
+        #  / \ / \
+        # 6---0---3
+        #  \ / \ /
+        #   5---4
+        #
+        # Divided 2 ways
+        # Calling order is: elements, verticies, edge list
+        # element type, number parts
+        edgecut, epart, npart = metis.partMeshNodal(6, 7,\
+                                                    [0, 2, 1,\
+                                                     0, 3, 2,\
+                                                     0, 4, 3,\
+                                                     0, 5, 4,\
+                                                     0, 6, 5,\
+                                                     0, 1, 6],\
+                                                    1,\
+                                                    2,)
+        #print edgecut
+        #print epart
+        #print npart
+        epart_expected = array([1, 0, 0, 0, 1, 1], 'i')
+        npart_expected = array([0, 1, 1, 0, 0, 0, 1], 'i')
+        self.assert_(edgecut == 5)
+        assert allclose(epart, epart_expected)
+        assert allclose(npart, npart_expected)
+		
+		
+		
+    def test_Hexmesh3(self):
+        # Hexagonal mesh
+        #
+        #   1---2---7 
+        #  /5\0/1\6/7\
+        # 6---0---3---8
+        #  \4/3\2/9\8/
+        #   5---4---9
+        #
+        # Divided 2 ways
+        # Calling order is: elements, verticies, edge list
+        # element type, number parts
+        edgecut, epart, npart = metis.partMeshNodal(10, 10,\
+                                                    [0, 2, 1,\
+                                                     0, 3, 2,\
+                                                     0, 4, 3,\
+                                                     0, 5, 4,\
+                                                     0, 6, 5,\
+                                                     0, 1, 6,\
+													 3, 2, 7,\
+													 3, 7, 8,\
+													 3, 8, 9,\
+													 3, 9, 4],\
+                                                    1,\
+                                                    3,)
+        #print edgecut
+        #print epart
+        #print npart
+        epart_expected = array([0, 0, 0, 1, 2, 2, 2, 2, 1, 1], 'i')
+        npart_expected = array([0, 2, 0, 2, 1, 1, 2, 2, 0, 1], 'i')
+        self.assert_(edgecut == 14)
+        assert allclose(epart, epart_expected)
+        assert allclose(npart, npart_expected)
+
+
+if __name__ == "__main__":
+    suite = unittest.makeSuite(TestMetis,'test_')
+    runner = unittest.TextTestRunner()
+    runner.run(suite)
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/win32/Makefile
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/win32/Makefile	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/win32/Makefile	(revision 9501)
@@ -0,0 +1,24 @@
+###
+#
+# Config
+
+CC = gcc
+CFLAGS = 
+OBJS = random.o
+AR = ar rv
+RANLIB = ranlib
+
+## Merge the extra functions specified here into the metis library
+merge: $(OBJS) ../$(METIS_DIR)/libmetis.a
+	$(AR) ../$(METIS_DIR)/libmetis.a $(OBJS)
+	$(RANLIB) ../$(METIS_DIR)/libmetis.a
+
+../$(METIS_DIR)/libmetis.a:
+	make -C ../$(METIS_DIR)/Lib CC=gcc
+
+%.o: %.c
+	$(CC) $(CFLAGS) -c -o $@ $<
+
+clean:
+	-rm -f $(OBJS)
+	-rm -f *~
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/win32/README
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/win32/README	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/win32/README	(revision 9501)
@@ -0,0 +1,4 @@
+This directory contains (at the moment):
+
+A small wrapper around rand() and srand() to make them
+behave enough like rand48() and srand48().
Index: /trunk/anuga_core/source/anuga/parallel/pymetis/win32/random.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pymetis/win32/random.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pymetis/win32/random.c	(revision 9501)
@@ -0,0 +1,9 @@
+#include <stdlib.h>
+
+double drand48(){
+  return (((double)rand())/RAND_MAX);
+}
+
+void srand48(long seed){
+  srand(seed);
+}
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/LICENSE
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/LICENSE	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/LICENSE	(revision 9501)
@@ -0,0 +1,674 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/__init__.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/__init__.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/__init__.py	(revision 9501)
@@ -0,0 +1,40 @@
+# =============================================================================
+# pypar_ext.py - Extension to Parallel Python using MPI
+# Copyright (C) 2012 Stephen G Roberts
+#              (ANU)
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License (http://www.gnu.org/copyleft/gpl.html)
+#    for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+#
+#
+# Contact address: Stephen.Roberts@anu.edu.au
+#
+# Version: See pypar_ext.__version__
+# =============================================================================
+
+"""The python module pypar_ext.py and the C-extension mpiext.c
+implements some extensions to pypar.
+"""
+
+from pypar_ext import *
+from __metadata__ import __version__, __date__, __author__
+
+#Add path of package to PYTHONPATH to allow C-extension to be loaded
+#import sys
+#sys.path += __path__
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/__metadata__.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/__metadata__.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/__metadata__.py	(revision 9501)
@@ -0,0 +1,6 @@
+# Meta data for pypar
+__version__ = '1.0'
+__date__ = '13 August 2012'
+__author__ = 'Stephen G Roberts'
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/anuga_setup.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/anuga_setup.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/anuga_setup.py	(revision 9501)
@@ -0,0 +1,14 @@
+
+import os
+anuga_source = os.path.split(os.path.abspath(os.getcwd()))[0]
+
+print anuga_source
+
+
+cmd = 'python setup.py install --install-purelib=%s --install-platlib=%s '%( anuga_source , anuga_source)
+
+print cmd
+
+#os.chdir('source')
+os.system (cmd)
+
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/compile.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/compile.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/compile.py	(revision 9501)
@@ -0,0 +1,206 @@
+"""compile.py - compile Python C-extension
+
+   Commandline usage: 
+     python compile.py <filename>
+
+   Usage from within Python:
+     import compile
+     compile.compile(<filename>,..)
+
+   Ole Nielsen, Oct 2001      
+"""   
+
+import numpy
+def compile(FNs=None, CC=None, LD = None, SFLAG = None, verbose = 1):
+  """compile(FNs=None, CC=None, LD = None, SFLAG = None):
+  
+     Compile FN(s) using compiler CC (e.g. mpicc), 
+     Loader LD and shared flag SFLAG.
+     If CC is absent use default compiler dependent on platform
+     if LD is absent CC is used.
+     if SFLAG is absent platform default is used
+     FNs can be either one filename or a list of filenames
+     In the latter case, the first will be used to name so file.
+  """
+  import os, string, sys, types
+  
+  # Input check
+  #
+  assert not FNs is None, 'No filename provided'
+
+  if not type(FNs) == types.ListType:
+    FNs = [FNs]
+
+  # Determine platform and compiler
+  #
+  if sys.platform == 'sunos5':  # Solaris
+    if CC:
+      compiler = CC
+    else:  
+      compiler = 'gcc'
+    if LD:
+      loader = LD
+    else:  
+      loader = compiler
+    if SFLAG:
+      sharedflag = SFLAG
+    else:  
+      sharedflag = 'G'
+      
+  elif sys.platform == 'osf1V5':  # Compaq AlphaServer
+    if CC:
+      compiler = CC
+    else:  
+      compiler = 'cc'
+    if LD:
+      loader = LD
+    else:  
+      loader = compiler
+    if SFLAG:
+      sharedflag = SFLAG
+    else:  
+      sharedflag = 'shared'    
+      
+  elif sys.platform == 'linux2':  # Linux
+    if CC:
+      compiler = CC
+    else:  
+      compiler = 'gcc'
+    if LD:
+      loader = LD
+    else:  
+      loader = compiler
+    if SFLAG:
+      sharedflag = SFLAG
+    else:  
+      sharedflag = 'shared'    
+      
+  elif sys.platform == 'darwin':  # Mac OS X:
+    if CC:
+      compiler = CC
+    else:  
+      compiler = 'cc'
+    if LD:
+      loader = LD
+    else:  
+      loader = compiler
+    if SFLAG:
+      sharedflag = SFLAG
+    else:  
+      sharedflag = 'bundle -flat_namespace -undefined suppress'
+      
+  else:
+    if verbose: print "Unrecognised platform %s - revert to default"\
+                %sys.platform
+    
+    if CC:
+      compiler = CC
+    else:  
+      compiler = 'cc'
+    if LD:
+      loader = LD
+    else:  
+      loader = 'ld'
+    if SFLAG:
+      sharedflag = SFLAG
+    else:  
+      sharedflag = 'G'
+
+            
+  # Find location of include files
+  #
+  python_include = os.path.join(os.path.join(sys.exec_prefix, 'include'),
+                                'python'+sys.version[:3])
+  
+  
+  # Check existence of Python.h
+  #
+  headerfile = python_include + '/Python.h'
+  try:
+    open(headerfile, 'r')
+  except:
+    raise """Did not find Python header file %s.
+    Make sure files for Python C-extensions are installed. 
+    In debian linux, for example, you need to install a
+    package called something like python2.1-dev""" % headerfile
+
+
+  # Get numpy include
+  numpy_include = numpy.get_include()
+  
+  
+  # Check filename(s)
+  #
+  object_files = ''
+  for FN in FNs:        
+    root, ext = os.path.splitext(FN)
+    if ext == '':
+      FN = FN + '.c'
+    elif ext.lower() != '.c':
+      msg = 'Unrecognised extension: ' + FN
+      raise Exception(msg)
+    
+    try:
+      open(FN,'r')
+    except:    
+      msg = 'Could not open: ' + FN
+      raise Exception(msg) 
+
+    if not object_files: root1 = root  # Remember first filename        
+    object_files += root + '.o '  
+  
+  
+    # Compile
+    #
+    s = '%s -c %s -I%s -I%s -o %s.o -Wall' % (compiler, FN,
+                                              python_include, numpy_include,
+                                              root)
+    if os.name == 'posix' and os.uname()[4] == 'x86_64':
+      #Extra flags for 64 bit architectures
+      s += ' -fPIC'
+      
+    
+    if verbose:
+      print s
+    else:
+      s = s + ' 2> /dev/null' # Suppress errors
+  
+    try:
+      os.system(s)
+    except:
+      raise 'Could not compile %s - please try manually' % FN  
+
+  
+  # Make shared library (*.so)
+  s = '%s -%s %s -o %s.so' % (loader, sharedflag, object_files, root1)
+
+  if os.name == 'posix' and os.uname()[4] == 'x86_64':
+      # Extra flags for 64 bit architectures using Portland compilers
+      s += ' -mcmodel=medium'
+  
+  if verbose:
+    print s
+  else:
+    s = s + ' 2> /dev/null' # Suppress warnings
+  
+  try:  
+    err=os.system(s)
+  except:
+    raise 'Could not link %s - please try manually' % root1
+    
+
+
+
+if __name__ == '__main__':
+
+  import sys
+  
+  # Get file to compile
+  #
+  if len(sys.argv) < 2:
+    print 'Usage:'
+    print '  python compile.py <filename>'
+    sys.exit()
+
+  compile(sys.argv[1], verbose=1)
+
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/mpiextras.c
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/mpiextras.c	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/mpiextras.c	(revision 9501)
@@ -0,0 +1,691 @@
+/************************************************************************/
+/* PyPAR - Parallel Python using MPI                 	                */
+/* Copyright (C) 2001 - 2009 Ole Nielsen                                */
+/*                                                                      */
+/* See enclosed README file for details of installation and use.   	*/
+/*                                                                 	*/   
+/* This program is free software; you can redistribute it and/or modify */
+/* it under the terms of the GNU General Public License as published by */
+/* the Free Software Foundation; either version 2 of the License, or    */
+/* (at your option) any later version.                                  */
+/*                                                                      */     
+/* This program is distributed in the hope that it will be useful,      */
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of       */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        */
+/* GNU General Public License (http://www.gnu.org/copyleft/gpl.html)    */
+/* for more details.                                                    */
+/*                                                                      */
+/* You should have received a copy of the GNU General Public License    */
+/* along with this program; if not, write to the Free Software          */
+/*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307*/
+/*                                                                      */
+/*                                                                 	*/
+/* Contact address: Ole.Moller.Nielsen@gmail.com                        */
+/*                                                                 	*/
+/* version (see __version__ in pypar.py)                                */
+/* date (see __date__ in pypar.py)                                      */
+/************************************************************************/
+
+
+#include "Python.h"
+#include "mpi.h"
+#include "math.h"
+#include "numpy/arrayobject.h"
+
+
+/* Handle MPI constants export (shamelessly stolen from _cursesmodule.c)*/
+#define SetDictInt(string,ch) \
+        PyDict_SetItemString(ModDict, string, PyInt_FromLong((long) (ch)));
+
+/* Remap struct MPI_op to int (easier to handle by python)*/
+#define MAX 1
+#define MIN 2
+#define SUM 3
+#define PROD 4
+#define LAND 5
+#define BAND 6
+#define LOR 7
+#define BOR 8
+#define LXOR 9
+#define BXOR 10
+#define MAXLOC 11
+#define MINLOC 12
+/*#define REPLACE 13 // Not available on all MPI systems */
+
+
+static char errmsg[132];  /*Used to cretae exception messages*/
+
+/* MPI_Bsend() related variables. */
+static void *pt_buf;	/* Pointer to allocated buffer. */
+static int buf_size;	/* Size of buffer to allocate. */ 
+
+int length(PyArrayObject *x) {  
+  /* Compute the total length of contiguous array */
+  /* Necessary for communicating multi dimensional arrays */
+  
+  int i, length;
+  
+  /* Compute total length of contiguous data */
+  length = 1;
+  for (i=0; i<x->nd; i++) {
+    length *= x->dimensions[i];
+  }  
+    
+  return length;
+}  
+
+/**********************************************************/
+/* type_map                                               */
+/*                                                        */
+/**********************************************************/
+MPI_Datatype type_map(PyArrayObject *x, int *count) {  
+  /* Return the MPI Datatype corresponding to                       
+     the Python data type as follows  
+  
+     TYPE    py_type  mpi_type  bytes  symbol
+     ---------------------------------------- 
+     INT       4        6         4      'i'
+     LONG      5        8         8      'l'
+     FLOAT     6       10         4      'f'  
+     DOUBLE    12      11         8      'd'
+  
+     Also return the total number of elements in the array
+  
+     The Python datatype COMPLEX ('F') and COMPLEX_DOUBLE ('D')
+     is treated as a special case to the absence of an 
+     MPI_COMPLEX datatype:
+  
+     Complex arrays are mapped to float or double arrays with real 
+     and imaginary parts alternating and count is updated. */
+  
+  int py_type;
+  MPI_Datatype mpi_type;
+  char err_msg[64];
+
+  *count = length(x);
+  
+  py_type = PyArray_TYPE(x);
+  if (py_type == NPY_DOUBLE) 
+    mpi_type = MPI_DOUBLE;
+  else if (py_type == NPY_INT) 
+    mpi_type = MPI_INT;
+  else if (py_type == NPY_CDOUBLE) {
+    mpi_type = MPI_DOUBLE;
+    (*count) *= 2;
+  } else if (py_type == NPY_FLOAT) 
+    mpi_type = MPI_FLOAT;
+  else if (py_type == NPY_LONG)   
+    mpi_type = MPI_LONG;  
+  else if (py_type == NPY_CFLOAT) {
+    mpi_type = MPI_FLOAT;
+    (*count) *= 2;
+  } else {
+    sprintf(err_msg, 
+	    "Array must be of type int or float. I got py_type == %d", 
+	    py_type);
+    PyErr_SetString(PyExc_ValueError, err_msg);
+    return (MPI_Datatype) NULL;
+  }      
+
+  //printf("Types: py_type=%d, mpi_type=%d\n", py_type, (int) mpi_type);
+  
+  return mpi_type;
+}    
+
+/**********************************************************/
+/* op_map                                                 */
+/*                                                        */
+/**********************************************************/
+MPI_Op op_map(int py_op) {  
+  
+  MPI_Op mpi_op;
+  
+  if (py_op == MAX) 
+    mpi_op = MPI_MAX;
+  else if (py_op == MIN)   
+    mpi_op = MPI_MIN;  
+  else if (py_op == SUM)   
+    mpi_op = MPI_SUM;  
+  else if (py_op == PROD)   
+    mpi_op = MPI_PROD;  
+  else if (py_op == LAND)   
+    mpi_op = MPI_LAND;  
+  else if (py_op == BAND)   
+    mpi_op = MPI_BAND;  
+  else if (py_op == LOR)   
+    mpi_op = MPI_LOR;  
+  else if (py_op == BOR)   
+    mpi_op = MPI_BOR;  
+  else if (py_op == LXOR)   
+    mpi_op = MPI_LXOR;  
+  else if (py_op == BXOR)   
+    mpi_op = MPI_BXOR;  
+  else if (py_op == MAXLOC)
+    mpi_op = MPI_MAXLOC;
+  else if (py_op == MINLOC)   
+    mpi_op = MPI_MINLOC;  
+  /*else if (py_op == REPLACE)*/   
+  /*  mpi_op = MPI_REPLACE; */ 
+  else {
+    PyErr_SetString(PyExc_ValueError, "Operation unknown");
+    return (MPI_Op) NULL;
+  }      
+  
+  return mpi_op;
+}  
+
+
+/**********************************************************/
+/* isend_array (asynchronous)                             */
+/* Send Numpy array of type float, double, int, or long   */
+/*                                                        */
+/**********************************************************/
+static PyObject *isend_array(PyObject *self, PyObject *args) {
+  PyObject *input;
+  PyArrayObject *x;
+  int destination, tag, error, count, myid;
+  MPI_Datatype mpi_type;
+
+  /* process the parameters */
+  if (!PyArg_ParseTuple(args, "Oii", &input, &destination, &tag))
+    return NULL;
+
+  /* Make Numpy array from general sequence type (no cost if already Numpy). */
+  x = (PyArrayObject *)
+    PyArray_ContiguousFromObject(input, NPY_NOTYPE, 0, 0);
+
+  /* Input check and determination of MPI type */
+  mpi_type = type_map(x, &count);
+  if (!mpi_type) return NULL;
+
+  /* call the MPI routine */
+  error = MPI_Send(x->data, count, mpi_type, destination, tag,
+		   MPI_COMM_WORLD);
+  Py_DECREF(x);
+
+  if (error != 0) {
+    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
+    sprintf(errmsg, "Proc %d: MPI_Send failed with error code %d\n",
+	    myid, error);
+    PyErr_SetString(PyExc_RuntimeError, errmsg);
+    return NULL;
+  }
+
+  Py_INCREF(Py_None);
+  return (Py_None);
+}
+
+
+
+
+/*************************************************************/
+/* ireceive_array (asynchronous)                             */
+/* Receive Numpy array of type float, double, int, or long   */
+/*                                                           */
+/*************************************************************/
+static PyObject *ireceive_array(PyObject *self, PyObject *args) {
+  PyArrayObject *x;
+  int source, tag, error, st_length, size, count, myid;
+  MPI_Datatype mpi_type;
+  MPI_Status status;
+
+    
+  if (!PyArg_ParseTuple(args, "Oii", &x, &source, &tag))
+    return NULL;    
+    
+  /* Input check and determination of MPI type */          
+  mpi_type = type_map(x, &count);
+  if (!mpi_type) return NULL;  
+      
+  /* call the MPI routine */
+  error =  MPI_Recv(x->data, count, mpi_type, source, tag,
+		    MPI_COMM_WORLD, &status);
+	 
+  /* Do not DECREF x as it must be returned to Python */
+  	 
+  if (error != 0) {
+    MPI_Comm_rank(MPI_COMM_WORLD, &myid);    
+    sprintf(errmsg, "Proc %d: MPI_Recv failed with error code %d\n", 
+	    myid, error);
+    PyErr_SetString(PyExc_RuntimeError, errmsg);   
+    return NULL;
+  }  
+   
+	 
+  MPI_Get_count(&status, mpi_type, &st_length); 
+  /* status.st_length is not available in all MPI implementations */
+  /* Alternative is: MPI_Get_elements(MPI_Status *, MPI_Datatype, int *); */
+	 
+      
+  /* FIXME: This might not be watertight on all platforms */
+  /* Need C equivalent to itemsize().*/
+  if (mpi_type == MPI_DOUBLE) {
+    size = sizeof(double);  /*8 */
+  } else if (mpi_type == MPI_LONG) {
+    size = sizeof(long); /*8? */
+  } else if (mpi_type == MPI_FLOAT) {
+    size = sizeof(float);
+  } else if (mpi_type == MPI_INT) {    
+    size = sizeof(int);  
+  } else {
+    size = 4;  
+  }
+    
+  return Py_BuildValue("(iiiii)", status.MPI_SOURCE, status.MPI_TAG,
+  status.MPI_ERROR, st_length, size);  
+}
+
+
+
+
+
+/*************************************************************/
+/* allreduce_array                                           */
+/* Allreduce Numpy array of type float, double, int, or long */
+/*                                                           */
+/*************************************************************/
+static PyObject *allreduce_array(PyObject *self, PyObject *args) {
+  PyArrayObject *x;
+  PyArrayObject *d;
+  int op, error, count, count1, myid;
+  MPI_Datatype mpi_type, buffer_type;
+  MPI_Op mpi_op;
+
+  /* process the parameters */
+  if (!PyArg_ParseTuple(args, "OOi", &x, &d, &op)) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): could not parse input");
+    return NULL;
+  }
+
+  /* Input check and determination of MPI type */
+  mpi_type = type_map(x, &count);
+  if (!mpi_type) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): could not determine mpi_type");
+    return NULL;
+  }
+
+  /* This error is caught at the pypar level - so we won't end up here
+     unless mpiext is being used independently */
+  buffer_type = type_map(d, &count1);
+  if (mpi_type != buffer_type) {
+    sprintf(errmsg, "mpiext.c (allreduce_array): Input array and buffer must be of the same type.");
+    PyErr_SetString(PyExc_RuntimeError, errmsg);
+
+    return NULL;
+  }
+
+  if (count != count1) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): Input array and buffer must have same length");
+    return NULL;
+  }
+
+  /* Input check and determination of MPI op */
+  mpi_op = op_map(op);
+  if (!mpi_op) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): could not determine mpi_op");
+    return NULL;
+  }
+
+  if (op == MAXLOC || op == MINLOC) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): MAXLOC and MINLOC are not implemented");
+    return NULL;
+  }
+  else {
+    /* call the MPI routine */
+    error =  MPI_Allreduce(x->data, d->data, count, mpi_type, mpi_op, \
+			MPI_COMM_WORLD);
+  }
+
+  if (error != 0) {
+    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
+    sprintf(errmsg, "Proc %d: MPI_Allreduce failed with error code %d\n",
+	    myid, error);
+    PyErr_SetString(PyExc_RuntimeError, errmsg);
+    return NULL;
+  }
+
+  Py_INCREF(Py_None);
+  return (Py_None);
+}
+
+
+/*************************************************************/
+/* do multiple isends and irecv of Numpy array buffers        */
+/* of type float, double, int, or long                       */
+/*                                                           */
+/*************************************************************/
+static PyObject *sendrecv_array(PyObject *self, PyObject *args) {
+  PyObject *send_bufs;
+  PyArrayObject *send_dest;
+  PyObject *recv_bufs;
+  PyArrayObject *recv_dest;
+
+  PyObject *seq;
+
+  PyArrayObject *x;
+  int op, error, count, count1, myid;
+  MPI_Datatype mpi_type, buffer_type;
+  MPI_Op mpi_op;
+  int i, len, lenx;
+
+  double *xdata;
+
+  /* process the parameters */
+  if (!PyArg_ParseTuple(args, "OOOO", &send_bufs, &send_dest, &recv_bufs, &recv_dest)) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiextras.c (sendrecv_array): could not parse input");
+    return NULL;
+  }
+
+  seq = PySequence_Fast(send_bufs, "expected a sequence");
+  len = PySequence_Size(send_bufs);
+  printf("len of sequence %d\n",len);
+  for (i = 0; i < len; i++) {
+    x = (PyArrayObject *) PySequence_Fast_GET_ITEM(seq, i);
+    lenx = x->dimensions[0];
+    printf("buf size %d\n",len);
+    xdata = (double *) x->data;
+    printf("x->data[0] %g\n",xdata[0]);
+  }
+  Py_DECREF(seq);
+
+
+/*
+//   Input check and determination of MPI type
+  mpi_type = type_map(x, &count);
+  if (!mpi_type) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): could not determine mpi_type");
+    return NULL;
+  }
+
+
+  //This error is caught at the pypar level - so we won't end up here
+  //  unless mpiext is being used independently
+  buffer_type = type_map(d, &count1);
+  if (mpi_type != buffer_type) {
+    sprintf(errmsg, "mpiext.c (allreduce_array): Input array and buffer must be of the same type.");
+    PyErr_SetString(PyExc_RuntimeError, errmsg);
+
+    return NULL;
+  }
+
+  if (count != count1) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): Input array and buffer must have same length");
+    return NULL;
+  }
+
+  // Input check and determination of MPI op
+  mpi_op = op_map(op);
+  if (!mpi_op) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): could not determine mpi_op");
+    return NULL;
+  }
+
+  if (op == MAXLOC || op == MINLOC) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): MAXLOC and MINLOC are not implemented");
+    return NULL;
+  }
+  else {
+    // call the MPI routine
+    error =  MPI_Allreduce(x->data, d->data, count, mpi_type, mpi_op, \
+			MPI_COMM_WORLD);
+  }
+
+  if (error != 0) {
+    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
+    sprintf(errmsg, "Proc %d: MPI_Allreduce failed with error code %d\n",
+	    myid, error);
+    PyErr_SetString(PyExc_RuntimeError, errmsg);
+    return NULL;
+  }
+*/
+
+
+  Py_INCREF(Py_None);
+  return (Py_None);
+}
+
+
+
+/*************************************************************/
+/* do multiple isends and irecv of Numpy array buffers        */
+/* of type float, double, int, or long                       */
+/*                                                           */
+/*************************************************************/
+static PyObject *send_recv_via_dicts(PyObject *self, PyObject *args) {
+
+  PyObject *send_dict;
+  PyObject *recv_dict;
+
+  PyObject *seq;
+
+  PyObject *list;
+  PyArrayObject *X;
+  PyArrayObject *Id;
+  int op, error, count, count1, myid;
+  MPI_Datatype mpi_type, buffer_type;
+  MPI_Op mpi_op;
+  int i, k, len, lenx;
+  int num_recv=0;
+  int num_send=0;
+
+  int ierr;
+  MPI_Request requests[40];
+  MPI_Status statuses[40];
+
+  Py_ssize_t pos = 0;
+
+  PyObject *key, *value;
+  long *Iddata;
+  double *xdata;
+
+  /* process the parameters */
+  if (!PyArg_ParseTuple(args, "OO", &send_dict, &recv_dict)) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiextras.c (sendrecv_array): could not parse input");
+    return NULL;
+  }
+
+  //----------------------------------------------------------------------------
+  // Do the recv first
+  //----------------------------------------------------------------------------
+  num_recv = PyDict_Size(recv_dict);
+  //printf("num_recv = %d\n",num_recv);
+  if (num_recv>20) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiextras.c; Number of recv communication buffers > 10");
+    return NULL;
+  }
+
+  pos = 0;
+  k = 0;
+  while (PyDict_Next(recv_dict, &pos, &key, &value)) {
+    int i = PyInt_AS_LONG(key);
+    //printf("key %d\n",i);
+
+    Id = (PyArrayObject *) PyList_GetItem(value, 0);
+    X   = (PyArrayObject *) PyList_GetItem(value, 2);
+
+    lenx = X->dimensions[0]*X->dimensions[1];
+
+
+    //printf("buf size %d by 3\n",lenx/3);
+    //xdata = (double *) X->data;
+    //Iddata = (long *) Id->data;
+
+    //printf("k = %d \n",k);
+    ierr = MPI_Irecv(X->data, lenx, MPI_DOUBLE, i, 123, MPI_COMM_WORLD, &requests[k]);
+    //printf("ierr = %d \n",ierr);
+    k++;
+    //for (k=0 ; k < lenx ; k++) printf("X[%d] = %g Id[%d] = %ld \n",k,xdata[k],k,Iddata[k]);
+}
+  //----------------------------------------------------------------------------
+  // Do the sends second
+  //----------------------------------------------------------------------------
+  num_send = PyDict_Size(send_dict);
+  //printf("num_send = %d\n",num_send);
+  if (num_send>20) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiextras.c; Number of send communication buffers > 10");
+    return NULL;
+  }
+
+  pos = 0;
+  while (PyDict_Next(send_dict, &pos, &key, &value)) {
+    int i = PyInt_AS_LONG(key);
+    //printf("key %d\n",i);
+
+    Id = (PyArrayObject *) PyList_GetItem(value, 0);
+    X   = (PyArrayObject *) PyList_GetItem(value, 2);
+
+    lenx = X->dimensions[0]*X->dimensions[1];
+
+    //printf("buf size %d by 3 \n",lenx/3);
+    //xdata = (double *) X->data;
+    //Iddata = (long *) Id->data;
+    //for (k=0 ; k < lenx ; k++) printf("X[%d] = %g Id[%d] = %ld \n",k,xdata[k],k,Iddata[k]);
+
+    //printf("k = %d \n",k);
+    ierr = MPI_Isend(X->data, lenx, MPI_DOUBLE, i, 123, MPI_COMM_WORLD, &requests[k]);
+    //printf("ierr = %d \n",ierr);
+    
+    k++;
+}
+
+
+
+  //printf("k = %d\n",k);
+
+
+  //----------------------------------------------------------------------------
+  // Now complete communication. We could put some computation between the 
+  // communication calls above and this call.
+  //----------------------------------------------------------------------------
+  ierr =  MPI_Waitall(k,requests,statuses);
+
+
+
+
+
+/*
+  for (i = 0; i < len; i++) {
+    x = (PyArrayObject *) PySequence_Fast_GET_ITEM(seq, i);
+    lenx = x->dimensions[0];
+    printf("buf size %d\n",len);
+    xdata = (double *) x->data;
+    printf("x->data[0] %g\n",xdata[0]);y
+  }
+  Py_DECREF(seq);
+*/
+
+
+/*
+//   Input check and determination of MPI type
+  mpi_type = type_map(x, &count);
+  if (!mpi_type) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): could not determine mpi_type");
+    return NULL;
+  }
+
+
+  //This error is caught at the pypar level - so we won't end up here
+  //  unless mpiext is being used independently
+  buffer_type = type_map(d, &count1);
+  if (mpi_type != buffer_type) {
+    sprintf(errmsg, "mpiext.c (allreduce_array): Input array and buffer must be of the same type.");
+    PyErr_SetString(PyExc_RuntimeError, errmsg);
+
+    return NULL;
+  }
+
+  if (count != count1) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): Input array and buffer must have same length");
+    return NULL;
+  }
+
+  // Input check and determination of MPI op
+  mpi_op = op_map(op);
+  if (!mpi_op) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): could not determine mpi_op");
+    return NULL;
+  }
+
+  if (op == MAXLOC || op == MINLOC) {
+    PyErr_SetString(PyExc_RuntimeError,
+		    "mpiext.c (allreduce_array): MAXLOC and MINLOC are not implemented");
+    return NULL;
+  }
+  else {
+    // call the MPI routine
+    error =  MPI_Allreduce(x->data, d->data, count, mpi_type, mpi_op, \
+			MPI_COMM_WORLD);
+  }
+
+  if (error != 0) {
+    MPI_Comm_rank(MPI_COMM_WORLD, &myid);
+    sprintf(errmsg, "Proc %d: MPI_Allreduce failed with error code %d\n",
+	    myid, error);
+    PyErr_SetString(PyExc_RuntimeError, errmsg);
+    return NULL;
+  }
+*/
+
+
+  Py_INCREF(Py_None);
+  return (Py_None);
+}
+
+
+ 
+/**********************************/
+/* Method table for python module */
+/**********************************/
+static struct PyMethodDef MethodTable[] = {
+  {"isend_array", isend_array, METH_VARARGS},
+  {"ireceive_array", ireceive_array, METH_VARARGS},
+  {"allreduce_array", allreduce_array, METH_VARARGS},
+  {"sendrecv_array", sendrecv_array, METH_VARARGS},
+  {"send_recv_via_dicts", send_recv_via_dicts, METH_VARARGS},
+  {NULL, NULL}
+};
+
+
+/***************************/
+/* Module initialisation   */
+/***************************/
+void initmpiextras(void){
+  PyObject *m, *ModDict;
+  
+  m = Py_InitModule("mpiextras", MethodTable);
+  
+  /* to handle MPI symbolic constants*/
+  ModDict = PyModule_GetDict(m); 
+  SetDictInt("MPI_ANY_TAG", MPI_ANY_TAG);
+  SetDictInt("MPI_TAG_UB", MPI_TAG_UB);  
+  SetDictInt("MPI_ANY_SOURCE", MPI_ANY_SOURCE);
+  SetDictInt("MAX", MAX);
+  SetDictInt("MIN", MIN);
+  SetDictInt("SUM", SUM);
+  SetDictInt("PROD", PROD);
+  SetDictInt("LAND", LAND);
+  SetDictInt("BAND", BAND);
+  SetDictInt("LOR", LOR);
+  SetDictInt("BOR", BOR);
+  SetDictInt("LXOR", LXOR);
+  SetDictInt("BXOR", BXOR);
+
+   
+  import_array();     /* Necessary for handling of numpy structures  */
+}
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/pypar_ext.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/pypar_ext.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/pypar_ext.py	(revision 9501)
@@ -0,0 +1,528 @@
+# =============================================================================
+# pypar_ext.py - Extension to Parallel Python using MPI
+# Copyright (C) 2012 Stephen G Roberts
+#              (ANU)
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License (http://www.gnu.org/copyleft/gpl.html)
+#    for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+#
+#
+# Contact address: Stephen.Roberts@anu.edu.au
+#
+# Version: See pypar_ext.__version__
+# =============================================================================
+
+"""Module pypar_ext.py -Extension to pypar
+
+Need to import pypar first to init mpi.
+
+Public functions:
+
+
+
+isend() -- Asyncronous send (arrays)
+receive() --  Asyncronous receive (arrays)
+allreduce() -- wrapper for MPI_Allreduce (array)
+
+
+See doc strings of individual functions for detailed documentation.
+"""
+
+from numpy import zeros, reshape, product
+from __metadata__ import __version__, __date__, __author__
+
+
+# Constants
+#
+max_tag = 32767      # Max tag value (MPI_TAG_UB didn't work and returned 0)
+control_tag = 13849  # Reserved tag used to identify control information
+default_tag = 1      # Tag used as default if not specified
+
+control_sep = ':'          # Separator for fields in control info (NOT ',')
+control_data_max_size = 64 # Maximal size of string holding control data
+
+
+#---------------------------------------------------------------------------
+# Communication functions
+#--------------------------------------------------------------------------
+
+def isend(x, destination, use_buffer=False, vanilla=False,
+         tag=default_tag, bypass=False):
+    """Wrapper for easy MPI send.
+       Send x to destination.
+
+       Automatically determine appropriate protocol
+       and call corresponding send function.
+       Also passes type and size information on as preceding message to
+       simplify the receive call.
+
+       The variable x can be any (picklable) type, but
+       numpy variables and text strings will most efficient.
+       Setting vanilla = 1 forces vanilla mode for any type.
+
+       If use_buffer is True, workspace x will be used for the return value.
+       In this case the corresponding receive call must specify a buffer.
+       Otherwise a new workspace will be created by receive.
+
+       If bypass is True, all admin and error checks
+       get bypassed to reduce the latency. Should only
+       be used for sending numpy arrays and should be matched
+       with a bypass in the corresponding receive command.
+
+    """
+    import types, string
+
+    if bypass:
+        isend_array(x, destination, tag)
+        return
+
+    # Input check
+    errmsg = 'Destination id (%s) must be an integer.' % destination
+    assert type(destination) == types.IntType, errmsg
+
+    errmsg = 'Tag %d is reserved by pypar - please use another.' % control_tag
+    assert tag != control_tag, errmsg
+
+    # Create metadata about object to be sent
+    control_info, x = create_control_info(x, vanilla, return_object=True)
+    protocol = control_info[0]
+
+
+    # Possibly transmit control data
+    if use_buffer is False:
+        send_control_info(control_info, destination)
+
+
+    # Transmit payload data
+    if protocol == 'array':
+        send_array(x, destination, tag)
+    elif protocol in ['string', 'vanilla']:
+        send_string(x, destination, tag)
+    else:
+        raise 'Unknown protocol: %s' %protocol
+
+
+def ireceive(source, buffer=None, vanilla=False, tag=default_tag,
+            return_status=False, bypass=False):
+    """receive - blocking MPI receive
+
+       Receive data from source.
+
+       Optional parameters:
+         buffer: Use specified buffer for received data (faster). Default None.
+         vanilla: Specify to enforce vanilla protocol for any type.
+                  Default False
+
+         tag: Only received messages tagged as specified. Default default_tag
+         return_status: Return Status object along with result. Default False.
+
+       If no buffer is specified, receive will try to receive a
+       preceding message containing protocol, type, size and shape and
+       then create a suitable buffer.
+
+       If buffer is specified the corresponding send must specify
+       use_buffer = True.
+       The variable buffer can be any (picklable) type, but
+       numpy variables and text strings will most efficient.
+
+       Appropriate protocol will be automatically determined
+       and corresponding receive function called.
+
+
+       If bypass is True, all admin and error checks
+       get bypassed to reduce the latency. Should only
+       be used for receiving numpy arrays and should
+       be matched with a bypass in the corresponding send command.
+       Also buffer must be specified.
+    """
+
+    if bypass:
+        # errmsg = 'bypass mode must be used with specified buffer'
+        # assert buffer is not None, msg
+        stat = ireceive_array(buffer, source, tag)
+    else:
+
+        import types
+
+        # Input check
+        errmsg = 'Source id (%s) must be an integer.' %source
+        assert type(source) == types.IntType, errmsg
+
+        errmsg = 'Tag %d is reserved by pypar - please use another.'\
+            % control_tag
+        assert tag != control_tag, errmsg
+
+
+        # Either receive or create metadata about object to receive
+        if buffer is None:
+            control_info, source = receive_control_info(source,
+                                                        return_source=True)
+            protocol, typecode, size, shape = control_info
+        else:
+            protocol, typecode, size, shape = create_control_info(buffer,
+                                                                  vanilla)
+
+
+        # Receive payload data
+        if protocol == 'array':
+            if buffer is None:
+                buffer = zeros(size,typecode)
+                buffer = reshape(buffer, shape)
+
+            stat = receive_array(buffer, source, tag)
+
+        elif protocol == 'string':
+            if buffer is None:
+                buffer = ' '*size
+
+            stat = receive_string(buffer, source, tag)
+
+        elif protocol == 'vanilla':
+            from cPickle import dumps, loads, UnpicklingError
+            if buffer is None:
+                s = ' '*size
+            else:
+                s = dumps(buffer, protocol=2)
+                s = s + ' '*int(0.1*len(s)) #safety
+
+            stat = receive_string(s, source, tag)
+            try:
+                buffer = loads(s)   #Replace buffer with received result
+            except UnpicklingError, err:
+                raise UnpicklingError(str(err) + " - '%s'" % s)
+        else:
+            raise 'Unknown protocol: %s' %protocol
+
+    # Return received data and possibly the status object
+    if return_status:
+        return buffer, Status(stat)
+    else:
+        return buffer
+
+
+
+
+def allreduce(x, op, buffer=None, vanilla=0, bypass=False):
+    """Allreduce elements in x to buffer (of the same size as x)
+       applying operation op elementwise.
+
+       If bypass is True, all admin and error checks
+       get bypassed to reduce the latency.
+       The buffer must be specified explicitly in this case.
+    """
+
+    if bypass:
+        allreduce_array(x, buffer, op)
+        return
+
+
+    import types
+    from pypar import size
+    numproc = size()         # Needed to determine buffer size
+
+
+
+    # Create metadata about object
+    protocol, typecode, size, shape = create_control_info(x)
+
+    # Allreduce
+    if protocol == 'array':
+        if buffer is None:
+            buffer = zeros(size*numproc, typecode)
+
+            # Modify shape along axis=0 to match size
+            shape = list(shape)
+            shape[0] *= numproc
+            buffer = reshape(buffer, shape)
+
+
+        msg = 'Data array and buffer must have same type '
+        msg = 'in allreduce. I got types "%s" and "%s"' % (x.dtype.char,
+                                                        buffer.dtype.char)
+        assert x.dtype.char == buffer.dtype.char, msg
+        allreduce_array(x, buffer, op)
+
+
+    elif (protocol == 'vanilla' or protocol == 'string'):
+        raise 'Protocol: %s unsupported for allreduce' % protocol
+    else:
+        raise 'Unknown protocol: %s' % protocol
+
+    return buffer
+
+
+
+
+#---------------------------------------------------------
+# INTERNAL FUNCTIONS
+#---------------------------------------------------------
+
+class Status:
+    """ MPI Status block returned by receive if
+        specified with parameter return_status=True
+    """
+
+    def __init__(self, status_tuple):
+        self.source = status_tuple[0]  # Id of sender
+        self.tag = status_tuple[1]     # Tag of received message
+        self.error = status_tuple[2]   # MPI Error code
+        self.length = status_tuple[3]  # Number of elements transmitted
+        self.size = status_tuple[4]    # Size of one element
+
+    def __repr__(self):
+        return 'Pypar Status Object:\n  source=%d\n  tag=%d\n  error=%d\n  length=%d\n  size=%d\n' %(self.source, self.tag, self.error, self.length, self.size)
+
+    def bytes(self):
+        """Number of bytes transmitted (excl control info)
+        """
+        return self.length * self.size
+
+
+
+def create_control_info(x, vanilla=0, return_object=False):
+    """Determine which protocol to use for communication:
+       (numpy) arrays, strings, or vanilla based x's type.
+
+       There are three protocols:
+       'array':   numpy arrays of type 'i', 'l', 'f', 'd', 'F' or 'D' can be
+                  communicated  with mpiext.send_array and mpiext.receive_array.
+       'string':  Text strings can be communicated with mpiext.send_string and
+                  mpiext.receive_string.
+       'vanilla': All other types can be communicated as string representations
+                  provided that the objects
+                  can be serialised using pickle (or cPickle).
+                  The latter mode is less efficient than the
+                  first two but it can handle general structures.
+
+       Rules:
+       If keyword argument vanilla == 1, vanilla is chosen regardless of
+       x's type.
+       Otherwise if x is a string, the string protocol is chosen
+       If x is an array, the 'array' protocol is chosen provided that x has one
+       of the admissible typecodes.
+
+       The optional argument return_object asks to return object as well.
+       This is useful in case it gets modified as in the case of general structures
+       using the vanilla protocol.
+    """
+
+    import types
+
+    # Default values
+    protocol = 'vanilla'
+    typecode = ' '
+    size = 0
+    shape = ()
+
+    # Determine protocol in case
+    if not vanilla:
+        if type(x) == types.StringType:
+            protocol = 'string'
+            typecode = 'c'
+            size = len(x)
+        elif type(x).__name__ == 'ndarray': # numpy isn't imported yet
+            try:
+                import numpy
+            except:
+                print "WARNING (pypar.py): numpy module could not be imported,",
+                print "reverting to vanilla mode"
+                protocol = 'vanilla'
+            else:
+                typecode = x.dtype.char
+                if typecode in ['i', 'l', 'f', 'd', 'F', 'D']:
+                    protocol = 'array'
+                    shape = x.shape
+                    size = product(shape)
+                else:
+                    print "WARNING (pypar.py): numpy object type %s is not supported."\
+                          %(x.dtype.char)
+                    print "Only types 'i', 'l', 'f', 'd', 'F', 'D' are supported,",
+                    print "Reverting to vanilla mode."
+                    protocol = 'vanilla'
+
+    # Pickle general structures using the vanilla protocol
+    if protocol == 'vanilla':
+        from cPickle import dumps
+        x = dumps(x, protocol=2)
+        size = len(x) # Let count be length of pickled object
+
+    # Return
+    if return_object:
+        return [protocol, typecode, size, shape], x
+    else:
+        return [protocol, typecode, size, shape]
+
+
+
+#----------------------------------------------
+
+def send_control_info(control_info, destination):
+    """Send control info to destination
+    """
+    import string
+
+    # Convert to strings
+    control_info = [str(c) for c in control_info]
+
+    control_msg = string.join(control_info,control_sep)
+    if len(control_msg) > control_data_max_size:
+        errmsg = 'Length of control_info exceeds specified maximium (%d)'\
+                 %control_data_max_size
+        errmsg += ' - Please increase it (in pypar.py)'
+        raise errmsg
+
+    send_string(control_msg, destination, control_tag)
+
+
+def receive_control_info(source, return_source=False):
+    """Receive control info from source
+
+    The optional argument (due to Jim Bosch) also returns the actual source node
+    which can be used to require that the data message come from the same node.
+    """
+
+    # FIXME (Ole): Perhaps we should include actual source in the control info?
+
+    import string
+
+    msg = ' '*control_data_max_size
+
+    stat = receive_string(msg, source, control_tag)
+    # No need to create status object here - it is reserved
+    # for payload communications only
+
+    msg = msg[:stat[3]] # Trim buffer to actual received length (needed?)
+
+    control_info = msg.split(control_sep)
+
+    assert len(control_info) == 4, 'len(control_info) = %d' %len(control_info)
+    control_info[2] = eval(control_info[2]) # Convert back to int
+    control_info[3] = eval(control_info[3]) # Convert back to tuple
+
+    if return_source:
+        return control_info, int(stat[0])
+    else:
+        return control_info
+
+
+#----------------------------------------------------------------------------
+# Initialise module
+#----------------------------------------------------------------------------
+
+
+# Take care of situation where module is part of package
+import sys, os, string, os.path
+dirname = os.path.dirname(string.replace(__name__,'.',os.sep)).strip()
+
+if not dirname:
+    dirname = '.'
+
+if dirname[-1] != os.sep:
+    dirname += os.sep
+
+
+
+# Import MPI extension
+#
+# Verify existence of mpiext.so.
+
+try:
+    import mpiextras
+except:
+    errmsg = 'ERROR: C extension mpiextras could not be imported.\n'
+    errmsg += 'Please compile mpiextras.c manually.\n'
+    #raise Exception, errmsg
+    error = 1
+    print errmsg
+else:
+
+    # Determine if MPI program is allowed to run sequentially on current platform
+    # Attempting to check this automatically may case some systems to hang.
+
+    if sys.platform in ['linux2', 'sunos5', 'win32', 'darwin']:
+        # Linux (LAM,MPICH) or Sun (MPICH)
+        error = 0  #Sequential execution of MPI is allowed
+    else:
+        # Platform: Alpha 'osf1V5'
+        cmdstring = '"import mpiext, sys; mpiext.init(sys.argv); mpiext.finalize()"'
+        #s = 'cd %s; python -c %s' %(dirname, cmdstring)
+        s = 'python -c %s >/dev/null 2>/dev/null' %cmdstring
+        error = os.system(s)
+
+        # The check is performed in a separate shell.
+        # Reason: The Alpha server, LAM/Linux or the Sun cannot recover from a
+        # try:
+        #   mpiext.init(sys.argv)
+
+        # However, on LAM/Linux, this test causes system to hang.
+        # Verified (OMN 12/12/2)
+        # If lamboot is started, the system, will hang when init is called
+        # again further down in this file.
+        # If lamboot is not loaded error will be nozero as it should.
+        # I don't know how to deal with this
+        #
+        #Comparisons of two strategies using LAM
+        #
+        # Strategy 1: Assume seq execution is OK (i.e. set error = 0)
+        # Strategy 2: Try to test if mpi can be initialised (in a separate shell)
+        #
+        #
+        # Strategy 1 (currently used)
+        #                    | Lam booted  | Lam not booted
+        #-----------------------------------------------------
+        #
+        # Sequential exec    |  OK         | Not OK
+        # Parallel exec      |  OK         | Not OK
+        #
+        #
+        # Strategy 2
+        #                    | Lam booted  | Lam not booted
+        #-----------------------------------------------------
+        #
+        # Sequential exec    |  Hangs      | Not OK
+        # Parallel exec      |  Hangs      | OK
+        #
+
+
+
+# Initialise MPI
+#
+# Attempt to initialise mpiext.so
+# If this fails, define a rudimentary interface suitable for
+# sequential execution.
+
+if error:
+    print "WARNING: MPI library could not be initialised"
+
+else:
+    from mpiextras import \
+         isend_array, \
+         ireceive_array, \
+         allreduce_array
+
+    # Work around bug in OpenMPI (December 2009):
+    # https://bugs.launchpad.net/ubuntu/+source/petsc4py/+bug/232036
+
+    from ctypes import *
+    CDLL('libmpi.so', RTLD_GLOBAL)
+    # End work around
+
+
+
+
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/setup.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/setup.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/setup.py	(revision 9501)
@@ -0,0 +1,194 @@
+# Examples of setup
+#
+# python setup.py install
+# python setup.py install --prefix=/opt/python-2.3
+# python setup.py install --home=~
+#
+# Some times you'll have to add a file called pypar.pth
+# containing the word pypar to site-packages
+#
+# See http://docs.python.org/dist/pure-pkg.html for more on distutils
+
+
+from distutils.core import setup, Extension
+
+# FIXME (Ole): This works, but I don't know how to use it
+# Generate Python EGG if possible.
+#try:
+#   from setuptools import setup, Extension
+#except ImportError:
+#   pass
+
+import distutils.sysconfig
+import distutils.debug
+import os, sys
+#import popen2 # FIXME: Replace with subprocess - http://docs.python.org/library/subprocess.html#replacing-older-functions-with-the-subprocess-module
+import string
+import tempfile
+import numpy
+import shlex
+from __metadata__ import __version__, __date__, __author__
+
+
+def setup_compiler():
+    distutils.sysconfig.get_config_vars()
+    config_vars = distutils.sysconfig._config_vars
+
+    if sys.platform == 'sunos5':
+        config_vars['LDSHARED'] = 'gcc -G'
+        config_vars['CCSHARED'] = ''
+
+
+def uniq_arr(arr):
+    """Remove repeated values from an array and return new array."""
+    ret = []
+    for i in arr:
+        if i not in ret:
+            ret.append(i)
+    return ret
+
+
+def _run_command(cmd):
+    import subprocess
+
+
+    print 'running ' + cmd
+    try:
+        #FIXME SR: The following only works for python 2.7!
+        #output = subprocess.check_output(cmd, shell=True)
+        #FIXME SR: This works for python 2.6
+        output = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE).communicate()[0]
+
+    except:
+        output = ''
+
+    return output
+    
+    
+
+
+def _get_mpi_cmd():
+    """Returns the output of the command used to compile using
+    mpicc."""
+    # LAM/OPENMPI/MPICH2
+    output = _run_command('mpicc -show') + ' -fPIC'
+
+    if output:
+        return output
+
+    # FIXME: If appears that MPICH actually needs these hacks.
+
+    # MPICH
+    # works with MPICH version 1.2.1 (on Debian)
+    output = _run_command('mpicc -compile_info -link_info')
+    if output:
+        return output
+
+    # Old version of MPICH needs this hack.
+    tmp_base = tempfile.mktemp()
+    tmp_c = tmp_base + ".c"
+    tmp_o = tmp_base + ".o"
+    tmp_file = open(tmp_c, "w")
+    tmp_file.write('#include "mpi.h"\nint main(){return 0;}\n')
+    tmp_file.close()
+    output = _run_command("mpicc -show;"\
+                          "mpicc -echo -c %s -o %s"%(tmp_c, tmp_o))
+    os.remove(tmp_c)
+    if os.path.exists(tmp_o):
+        os.remove(tmp_o)
+    if output:
+        return output
+    else:
+        return ''
+
+
+def get_mpi_flags():
+    output = _get_mpi_cmd()
+    print output
+    if not output:
+        if sys.platform=='win32': # From Simon Frost
+            #this didn't work on my machine (Vladimir Lazunin on April 7, 2009)
+            #output = "gcc -L$MPICH_DIR\SDK.gcc\lib -lmpich -I$MPICH_DIR\SDK.gcc\include"
+
+            #"MPICH_DIR" must be set manually in environment variables
+            mpi_dir = os.getenv("MPICH_DIR")
+            if mpi_dir == None:
+            	print 'MPICH_DIR environment variable must be set'
+            	exit()
+
+            #for MPICH2
+            sdk_prefix = mpi_dir
+            lib_name = 'mpi'
+
+            #for MPICH1
+            if os.path.exists(sdk_prefix + '\\SDK'):
+                sdk_prefix += '\\SDK'
+                lib_name = 'mpich'
+            output = 'gcc -L"%(sdk_prefix)s\lib" -l"%(lib_name)s" -I"%(sdk_prefix)s\include"' % {'sdk_prefix' : sdk_prefix, 'lib_name' : lib_name}
+        else:
+            output = 'cc -L/usr/opt/mpi -lmpi -lelan'
+
+
+    # Now get the include, library dirs and the libs to link with.
+    #flags = string.split(output)
+    flags = shlex.split(output)
+    flags = uniq_arr(flags) # Remove repeated values.
+    inc_dirs = []
+    lib_dirs = []
+    libs = []
+    def_macros = []
+    undef_macros = []
+    for f in flags:
+        if f[:2] == '-I':
+            inc_dirs.append(f[2:])
+        elif f[:2] == '-L':
+            lib_dirs.append(f[2:])
+        elif f[:2] == '-l' and f[-1] != "'": # Patched by Michael McKerns July 2009
+            libs.append(f[2:])
+        elif f[:2] == '-U':
+            undef_macros.append(f[2:])
+        elif f[:2] == '-D':
+            tmp = string.split(f[2:], '=')
+            if len(tmp) == 1:
+                def_macros.append((tmp[0], None))
+            else:
+                def_macros.append(tuple(tmp))
+    return {'inc_dirs': inc_dirs, 'lib_dirs': lib_dirs, 'libs':libs,
+            'def_macros': def_macros, 'undef_macros': undef_macros}
+
+
+if __name__ == '__main__':
+    setup_compiler()
+
+    mpi_flags = get_mpi_flags()
+    mpi_flags['inc_dirs'].append(numpy.get_include())
+
+
+    # setting some extra compile flags for 64 bit architectures, utilizing
+    # distutils.sysconfig to check which compiler to use
+    if os.name == 'posix' and os.uname()[4] == 'x86_64':
+        #Extra flags for 64 bit architectures
+        extra_compile_args = ['-fPIC']
+    else:
+        extra_compile_args = None
+
+
+
+    setup(name='Pypar_extras',
+          version=__version__,
+          description='Extension to Pypar - Parallel Python',
+          long_description='Extension to Pypar - Parallel Python',
+          author=__author__,
+          author_email='stephen.roberts@anu.edu.au',
+          #url='http://sourceforge.net/projects/pypar',
+          package_dir = {'pypar_extras': ''}, # Use files in this dirctory
+          packages  = ['pypar_extras'],
+          ext_modules = [Extension('pypar_extras.mpiextras',
+                                   ['mpiextras.c'],
+                                   include_dirs=mpi_flags['inc_dirs'],
+                                   library_dirs=mpi_flags['lib_dirs'],
+                                   libraries=mpi_flags['libs'],
+                                   define_macros=mpi_flags['def_macros'],
+                                   undef_macros=mpi_flags['undef_macros'],
+                                   extra_compile_args=extra_compile_args)]
+         )
Index: /trunk/anuga_core/source/anuga/parallel/pypar_extras/test_pypar_ext.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/pypar_extras/test_pypar_ext.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/pypar_extras/test_pypar_ext.py	(revision 9501)
@@ -0,0 +1,1005 @@
+# Test of MPI module 'pypar' for Python
+# 
+# Run as 
+#   python testpypar.py
+# or 
+#   mpirun -np 2 testpypar.py
+# (perhaps try number of processors more than 2)
+#
+# To verify bandwidth of your architecture please run pytiming (and ctiming) 
+#
+# OMN, GPC FEB 2002
+
+
+try:
+  import numpy
+except:
+  raise 'Module numpy must be present to run pypar'
+
+
+#print "Importing pypar"
+import pypar
+import pypar_ext as par_exts
+#import pypar as par_exts
+par_exts_methods = dir(par_exts)
+assert 'allreduce' in par_exts_methods
+methods = dir(pypar)
+assert 'abort' in methods
+assert 'finalize' in methods
+assert 'get_processor_name' in methods
+assert 'time' in methods
+assert 'rank' in methods
+assert 'receive' in methods
+assert 'send' in methods
+assert 'broadcast' in methods
+assert 'size' in methods
+
+#print "Module pypar imported OK"
+#pypar.Barrier()
+
+
+myid = pypar.rank()
+numproc = pypar.size()
+node = pypar.get_processor_name()
+
+print 'I am processor %d of %d on node "%s"' %(myid, numproc, node)
+pypar.barrier()
+
+
+if numproc > 1:
+  # Test simple buffered communication (arrays, strings and general)
+  #
+  N = 17 #Number of elements
+  
+  if myid == 0:
+    # Integer arrays
+    #
+    A = numpy.array(range(N)).astype('i')
+    B = numpy.zeros(N).astype('i')
+
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+
+    assert numpy.allclose(A, B)
+    print 'Buffered communication of numeric integer arrays OK'
+
+
+    # Long integer arrays
+    #
+    A = numpy.array(range(N)).astype('l')
+    B = numpy.zeros(N).astype('l')    
+
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)
+    print 'Buffered communication of numeric long integer arrays OK'
+
+    # Real arrays
+    #
+    A = numpy.array(range(N)).astype('f')
+    B = numpy.zeros(N).astype('f')    
+
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of numeric real arrays OK'
+
+    # Complex arrays
+    #
+    A = numpy.array(range(N)).astype('D')
+    A += 3j
+    B = numpy.zeros(N).astype('D')
+
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of numeric complex arrays OK'
+
+    # Strings (< 256 characters)
+    #
+    A = "and now to something completely different !"
+    B = " "*len(A)
+
+    pypar.send(A, 1, use_buffer=True)
+    B, status = pypar.receive(numproc-1, buffer=B, return_status=True)
+
+
+    assert A == B
+    print 'Buffered communication of strings OK'
+    
+    # A more general structure
+    #
+    A = ['ABC', (1,2,3.14), {8: 'Monty'}, numpy.array([13.45, 1.2])]
+    B = ['   ', (0,0,0.0) , {0: '     '}, numpy.zeros(2).astype('f')]    
+
+    pypar.send(A, 1, use_buffer=True)
+    B, status = pypar.receive(numproc-1, buffer=B, return_status=True)
+
+    OK = True
+    for i, a in enumerate(A):
+      b = B[i]
+
+      if type(a).__name__ == 'ndarray':
+        if not numpy.allclose(a, b):
+          OK = False
+          break
+      elif a != b:
+        OK = False
+        break
+
+    if OK is True:
+      print 'Buffered communication of general structures OK' 
+    else:
+      raise Exception    
+
+    
+  else:  
+    # Integers
+    #
+    X = numpy.zeros(N).astype('i')    
+
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+  
+    # Long integers
+    #
+    X = numpy.zeros(N).astype('l')
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+
+    # Floats
+    #
+    X = numpy.zeros(N).astype('f')
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+
+    # Complex
+    #
+    X = numpy.zeros(N).astype('D')
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+
+    # Strings
+    #
+    X = " "*256
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X.strip(), (myid+1)%numproc, use_buffer=True)
+
+    # General
+    #
+    X = ['   ', (0,0,0.0), {0: '     '}, numpy.zeros(2).astype('f')]
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+    
+
+
+
+
+  #Test (buffered communication of) multi dimensional arrays
+
+  M = 13  #Number of elements in dim 1
+  N = 17  #Number of elements in higher dims
+  
+  if myid == 0:
+    # 2D real arrays
+    #
+    A = numpy.array(range(M*N)).astype('f')
+    B = numpy.zeros(M*N).astype('f')
+
+    A = numpy.reshape(A, (M,N))
+    B = numpy.reshape(B, (M,N))    
+    
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of 2D real arrays OK'
+
+    # 2D complex arrays
+    #
+    A = numpy.array(range(M*N)).astype('D')
+    B = numpy.zeros(M*N).astype('D')
+
+    A = numpy.reshape(A, (M,N))
+    B = numpy.reshape(B, (M,N))    
+
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of 2D complex arrays OK'
+
+    # 3D real arrays
+    #
+    A = numpy.array(range(M*N*N)).astype('f')
+    B = numpy.zeros(M*N*N).astype('f')
+
+    A = numpy.reshape(A, (M,N,N))
+    B = numpy.reshape(B, (M,N,N))    
+    
+
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of 3D real real arrays OK'
+
+    # 4D real arrays
+    #
+    A = numpy.array(range(M*N*N*M)).astype('f')
+    B = numpy.zeros(M*N*N*M).astype('f')
+
+    A = numpy.reshape(A, (M,N,N,M))
+    B = numpy.reshape(B, (M,N,N,M))    
+
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of 4D real real arrays OK'
+
+    # 5D real arrays
+    #
+    A = numpy.array(range(M*N*2*N*M)).astype('f')
+    B = numpy.zeros(M*N*2*N*M).astype('f')
+
+    A = numpy.reshape(A, (M,N,2,N,M))
+    B = numpy.reshape(B, (M,N,2,N,M))    
+    
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of 5D real real arrays OK'
+
+    # 5D double arrays
+    #
+    A = numpy.array(range(M*N*2*N*M)).astype('d')
+    B = numpy.zeros(M*N*2*N*M).astype('d')
+
+    A = numpy.reshape(A, (M,N,2,N,M))
+    B = numpy.reshape(B, (M,N,2,N,M))    
+    
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of 5D double arrays OK'
+
+    # 5D complex arrays
+    #
+    A = numpy.array(range(M*N*2*N*M)).astype('D')
+    B = numpy.zeros(M*N*2*N*M).astype('D')
+
+    A = numpy.reshape(A, (M,N,2,N,M))
+    B = numpy.reshape(B, (M,N,2,N,M))    
+    
+    pypar.send(A, 1, use_buffer=True)
+    B = pypar.receive(numproc-1, buffer=B)
+    
+    assert numpy.allclose(A, B)    
+    print 'Buffered communication of 5D complex arrays OK'
+  else:  
+    # 2D real arrays
+    #
+    X = numpy.zeros(M*N).astype('f')
+    X = numpy.reshape(X, (M,N))
+    
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+  
+    # 2D complex arrays
+    #
+    X = numpy.zeros(M*N).astype('D')
+    X = numpy.reshape(X, (M,N))
+
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+  
+    # 3D real arrays
+    #
+    X = numpy.zeros(M*N*N).astype('f')
+    X = numpy.reshape(X, (M,N,N))
+    
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+
+    # 4D real arrays
+    #
+    X = numpy.zeros(M*N*N*M).astype('f')
+    X = numpy.reshape(X, (M,N,N,M))
+    
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+
+    # 5D real arrays
+    #
+    X = numpy.zeros(M*N*2*N*M).astype('f')
+    X = numpy.reshape(X, (M,N,2,N,M))
+    
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+
+    # 5D double arrays
+    #
+    X = numpy.zeros(M*N*2*N*M).astype('d')
+    X = numpy.reshape(X, (M,N,2,N,M))
+    
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+
+    # 5D complex arrays
+    #
+    X = numpy.zeros(M*N*2*N*M).astype('D')
+    X = numpy.reshape(X, (M,N,2,N,M))
+    
+    X = pypar.receive(myid-1, buffer=X)
+    pypar.send(X, (myid+1)%numproc, use_buffer=True)
+
+  # Test easy communication  - without buffers (arrays, strings and general)
+  #
+  N = 17 #Number of elements
+  
+  if myid == 0:
+    # Integer arrays
+    #
+    A = numpy.array(range(N))
+
+    pypar.send(A,1)
+    B = pypar.receive(numproc-1)
+    
+
+    assert numpy.allclose(A, B)
+    print "Simplified communication of numeric integer arrays OK"
+
+    # Long integer arrays
+    #
+    A = numpy.array(range(N)).astype('l')
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+    
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of long integer real arrays OK"
+
+    # Real arrays
+    #
+    A = numpy.array(range(N)).astype('f')
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+    
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of numeric real arrays OK"
+
+    # Complex arrays
+    #
+    A = numpy.array(range(N)).astype('D')
+    A += 3j
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of numeric complex arrays OK"
+
+
+    # Strings
+    #
+    A = "and now to something completely different !"
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+    
+    assert A == B
+    print "Simplified communication of strings OK"
+    
+    # A more general structure
+    #
+    A = ['ABC', (1,2,3.14), {8: 'Monty'}, numpy.array([13.45, 1.2])]
+    pypar.send(A,1)
+    B = pypar.receive(numproc-1)
+
+    OK = True
+    for i, a in enumerate(A):
+      b = B[i]
+
+      if type(a).__name__ == 'ndarray':
+        if not numpy.allclose(a, b):
+          OK = False
+          break
+      elif a != b:
+        OK = False
+        break
+
+    if OK is True:
+      print 'Simplified communication of general structures OK' 
+    else:
+      raise Exception    
+    
+  else:  
+    # Integers
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)
+  
+    # Long integers
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)    
+
+    # Floats
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)    
+
+    # Complex
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)    
+
+    # Strings
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)    
+
+    # General
+    #
+    X = pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)    
+
+
+
+
+    
+  #Test (easy communication of) multi dimensional arrays
+
+  M = 13  #Number of elements in dim 1
+  N = 17  #Number of elements in higher dims
+  
+  if myid == 0:
+    # 2D real arrays
+    #
+    A = numpy.array(range(M*N)).astype('f')
+
+    A = numpy.reshape(A, (M,N))
+    
+    pypar.send(A,1)
+    B = pypar.receive(numproc-1)
+    
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of 2D real arrays OK"
+
+    # 3D real arrays
+    #
+    A = numpy.array(range(M*N*N)).astype('f')
+    A = numpy.reshape(A, (M,N,N))
+    
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+    
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of 3D real arrays OK"
+
+    # 4D real arrays
+    #
+    A = numpy.array(range(M*N*N*M)).astype('f')
+    A = numpy.reshape(A, (M,N,N,M))
+    
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+    
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of 4D real arrays OK"
+
+    # 5D real arrays
+    #
+    A = numpy.array(range(M*N*2*N*M)).astype('f')
+    A = numpy.reshape(A, (M,N,2,N,M))
+    
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+    
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of 5D real arrays OK"
+
+    # 5D double arrays
+    #
+    A = numpy.array(range(M*N*2*N*M)).astype('d')
+    A = numpy.reshape(A, (M,N,2,N,M))
+    
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+    
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of 5D double arrays OK"
+
+    # 5D complex arrays
+    #
+    A = numpy.array(range(M*N*2*N*M)).astype('D')
+    A = numpy.reshape(A, (M,N,2,N,M))
+    
+    pypar.send(A,1)
+    B=pypar.receive(numproc-1)
+    
+    assert numpy.allclose(A, B)    
+    print "Simplified communication of 5D complex real arrays OK"
+
+  else:  
+    # 2D real arrays
+    #
+    
+    X = pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)
+  
+    # 3D real arrays
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)
+
+    # 4D real arrays
+    #
+    X = pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)
+
+    # 5D real arrays
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)
+
+    # 5D double arrays
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)
+
+    # 5D complex arrays
+    #
+    X=pypar.receive(myid-1)  
+    pypar.send(X, (myid+1)%numproc)
+
+  # Test broadcast  - with buffers (arrays, strings and general)
+  #
+      
+  testString = ('test' + str(myid)).ljust(10)  #Buffers must have the same length on all procs!
+  pypar.broadcast(testString, 0)
+  assert testString.strip() == 'test0'
+  
+  testString = ('test' + str(myid)).ljust(10)  #Buffers must have the same length on all procs!
+  pypar.broadcast(testString, numproc-1)
+  assert testString.strip() == 'test' + str(numproc-1)
+  
+  if myid == 0:
+    print "Broadcast communication of strings OK"
+
+  ####################################################  
+  N = 17 #Number of elements
+  testArray = myid * numpy.array(range(N))
+  pypar.broadcast(testArray, 1)
+  assert numpy.allclose(testArray, 1 * testArray)
+  
+  if myid == 0:    
+    print "Broadcast communication of numeric integer array OK"
+
+
+  testArray = myid * numpy.array(range(N)).astype('f')
+  pypar.broadcast(testArray, 1)
+  assert numpy.allclose(testArray, 1 * testArray)
+  if myid == 0:
+    print "Broadcast communication of numeric real array OK"
+
+
+  M = 13
+  testArray = myid * numpy.array(range(M*N)).astype('f')
+  testArray = numpy.reshape(testArray, (M,N))  
+  pypar.broadcast(testArray, 1)
+  assert numpy.allclose(testArray, 1 * testArray)
+  if myid == 0:
+    print "Broadcast communication of 2D numeric real array OK"
+
+  testArray = myid * numpy.array(range(M*2*N)).astype('f')
+  testArray = numpy.reshape(testArray, (M,2,N))  
+  pypar.broadcast(testArray, 1)
+  assert numpy.allclose(testArray, 1 * testArray)
+  if myid == 0:
+    print "Broadcast communication of 3D numeric real array OK"
+
+  testArray = myid * numpy.array(range(M*2*N)).astype('D')
+  testArray = numpy.reshape(testArray, (M,2,N))  
+  pypar.broadcast(testArray, 1)
+  assert numpy.allclose(testArray, 1 * testArray)
+  if myid == 0:
+    print "Broadcast communication of 3D numeric complex array OK"
+
+    
+  A_x = ['ABC', myid, (1,2,3), {8: 'Monty'}, numpy.array([13.45, 1.2])]
+  A_1 = ['ABC',    1, (1,2,3), {8: 'Monty'}, numpy.array([13.45, 1.2])]
+  B = pypar.broadcast(A_x, 1)
+
+  OK = True
+  for i, a in enumerate(A_1):
+    b = B[i]
+
+    if type(a).__name__ == 'ndarray':
+      if not numpy.allclose(a, b):
+        OK = False
+        break
+    elif a != b:
+      OK = False
+      break
+
+  if OK is False:
+    raise Exception    
+    
+  if myid == 0:
+    print "Broadcast communication of general structures OK"
+  
+
+
+
+  # Test scatter  - with/without buffers (arrays, strings)
+  #
+  N = 16 # Number of elements
+
+  NP = N/numproc
+  
+  testString = 'ABCDEFGHIJKLMNOP'  #Length = 16
+  X = ' '*NP
+
+  pypar.scatter(testString, 0, buffer=X) # With buffer
+  Y = pypar.scatter(testString, 0) # With buffer automatically created
+
+  assert X==Y, 'X=%s, Y=%s' %(X,Y)
+  assert Y == testString[myid*NP:(myid+1)*NP]
+  assert X == testString[myid*NP:(myid+1)*NP]
+
+  if myid == 0:    
+    print "Scatter communication of strings OK"
+    
+
+  #Scatter Arrays
+  testArray = numpy.array(range(N)).astype('i')
+  X = numpy.zeros(NP).astype('i')
+
+  pypar.scatter(testArray, 0, buffer=X) # With buffer
+  Y = pypar.scatter(testArray, 0) # With buffer automatically created
+
+  assert numpy.allclose(X, Y)  
+  assert numpy.allclose(X, testArray[myid*NP:(myid+1)*NP])
+  assert numpy.allclose(Y, testArray[myid*NP:(myid+1)*NP])   
+
+  if myid == 0:
+    print "Scatter communication of numeric integer array OK"
+
+
+  testArray = numpy.array(range(N)).astype('f')
+  X = numpy.zeros(NP).astype('f')
+
+  pypar.scatter(testArray, 0, buffer=X) # With buffer
+  Y = pypar.scatter(testArray, 0) # With buffer automatically created
+
+  assert numpy.allclose(X, Y)  
+  assert numpy.allclose(X, testArray[myid*NP:(myid+1)*NP])
+  assert numpy.allclose(Y, testArray[myid*NP:(myid+1)*NP])   
+
+  if myid == 0:
+    print "Scatter communication of numeric real arrays OK"
+  #else:
+  #  print X, testArray, Y
+  #  assert numpy.allclose(X, Y)
+
+  testArray = numpy.array(range(N)).astype('D')
+  X = numpy.zeros(NP).astype('D')
+
+  pypar.scatter(testArray, 0, buffer=X) # With buffer
+  Y = pypar.scatter(testArray, 0) # With buffer automatically created
+
+  assert numpy.allclose(X, Y)  
+  assert numpy.allclose(X, testArray[myid*NP:(myid+1)*NP])
+  assert numpy.allclose(Y, testArray[myid*NP:(myid+1)*NP])   
+
+  if myid == 0:
+    print "Scatter communication of numeric complex array OK"
+
+
+###################################################
+#FIXME: 2D scatter doesn't work yet    
+#   M = 16
+#   N = 13
+#   MP = M/numproc
+  
+#   testArray = numpy.array(range(M*N)).astype('D')
+#   testArray = numpy.reshape(testArray, (M,N))    
+#   X = numpy.zeros(MP*N).astype('D')
+#   X = numpy.reshape(X, (MP,N))
+  
+#   raw_scatter(testArray, X, 0)
+#   Y = pypar.scatter(testArray, 0)
+  
+#   assert numpy.allclose(X, Y)  
+#   assert numpy.allclose(X, testArray[myid*MP:(myid+1)*MP,:])
+#   assert numpy.allclose(Y, testArray[myid*MP:(myid+1)*MP,:])   
+
+#   if myid == 0:
+#     print "Scatter communication of 2D numeric complex array OK"
+
+
+
+  # Test gather  - with/without buffers (arrays, strings)
+  #
+  N = 17 # Number of elements
+      
+  testString = 'AB'
+  X = '_'*(len(testString)*numproc) # Blanks caused errors when numproc >= 6 
+
+  pypar.gather(testString, 0, buffer=X) # Using buffer  
+  Y = pypar.gather(testString, 0) # Create buffer automatically
+  
+  if myid == 0:
+    assert X == 'AB' * numproc
+    assert Y == 'AB' * numproc
+    print "Gather communication of strings OK"
+  
+
+  testArray = numpy.array(range(N)).astype('i')
+  X = numpy.zeros(N*numproc).astype('i')
+
+  pypar.gather(testArray, 0, buffer=X) # Using buffer  
+  Y = pypar.gather(testArray, 0) # Create buffer automatically
+
+  if myid == 0:
+    for i in range(numproc):       
+      assert numpy.allclose(testArray, X[(i * N): ((i+1)*N)])
+
+    assert numpy.allclose(X, Y)
+    print "Gather communication of numeric integer array OK"
+    
+    
+  testArray = numpy.array(range(N)).astype('f')
+  X = numpy.zeros(N*numproc).astype('f')
+
+  pypar.gather(testArray, 0, buffer=X) # Using buffer  
+  Y = pypar.gather(testArray, 0) # Create buffer automatically
+
+  if myid == 0:
+    for i in range(numproc):       
+      assert numpy.allclose(testArray, X[(i * N): ((i+1)*N)])
+    assert numpy.allclose(X, Y)      
+    print "Gather communication of numeric real array OK"
+    
+  
+  testArray = numpy.array(range(N)).astype('D')
+  X = numpy.zeros(N*numproc).astype('D')
+
+  pypar.gather(testArray, 0, buffer=X) # Using buffer  
+  Y = pypar.gather(testArray, 0) # Create buffer automatically
+
+  if myid == 0:
+    for i in range(numproc):       
+      assert numpy.allclose(testArray, X[(i * N): ((i+1)*N)])
+    assert numpy.allclose(X, Y)      
+    print "Gather communication of numeric complex arrays OK"
+
+  M = 13  
+  testArray = numpy.array(range(M*N)).astype('D')
+  testArray = numpy.reshape(testArray, (M,N))
+  X = numpy.zeros(M*N*numproc).astype('D')
+  X = numpy.reshape(X, (M*numproc,N))
+  
+  pypar.gather(testArray, 0, buffer=X) # Using buffer  
+  Y = pypar.gather(testArray, 0) # Create buffer automatically
+
+  if myid == 0:
+    for i in range(numproc):       
+      assert numpy.allclose(testArray, X[(i * M): ((i+1)*M), :])
+    assert numpy.allclose(X, Y)      
+    print "Gather communication of 2D numeric complex arrays OK"
+  
+  ########################################################
+  # Test reduce
+  #######################################################
+  N = 17 #Number of elements
+  
+  # Create one (different) array on each processor
+  #    
+  testArray = numpy.array(range(N), 'i') * (myid+1)
+  X = numpy.zeros(N, 'i') # Buffer for results
+
+  pypar.reduce(testArray, pypar.SUM, 0, buffer=X)
+
+  if myid == 0:
+    Y = numpy.zeros(N, 'i')
+    for i in range(numproc):
+      Y = Y + numpy.array(range(N), 'i')*(i+1)    
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.SUM OK'
+        
+  pypar.reduce(testArray, pypar.MAX, 0, buffer=X)
+  if myid == 0:
+    Y = numpy.array(range(N))*numproc
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.MAX OK'
+
+  pypar.reduce(testArray, pypar.MIN, 0, buffer=X)
+  if myid == 0:
+    Y = numpy.array(range(N))
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.MIN OK'
+    
+  if numproc <= 20:
+    testArray_float = testArray.astype('f')  #Make room for big results
+    X_float = X.astype('f')
+
+    pypar.reduce(testArray_float, pypar.PROD, 0, buffer=X_float)
+    if myid == 0:
+      Y = numpy.ones(N).astype('f')    
+      for i in range(numproc):
+        Y = Y*numpy.array(range(N))*(i+1)    
+      #print X_float
+      #print Y  
+      assert numpy.allclose(X_float, Y)
+      print 'Buffered reduce using pypar.PROD OK'
+  else:
+    if myid == 0:
+      print "Skipping product-reduce - try again with numproc < 20"    
+
+  pypar.reduce(testArray, pypar.LAND, 0, buffer=X)
+  if myid == 0:  
+    Y = numpy.ones(N).astype('i')    
+    for i in range(numproc):
+      Y = numpy.logical_and(Y, numpy.array(range(N)).astype('i')*(i+1))  
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.LAND OK'
+    
+  pypar.reduce(testArray, pypar.BAND, 0, buffer=X)
+  if myid == 0:
+    Y = numpy.ones(N).astype('i')*255  #Neutral element for &   
+    for i in range(numproc):
+      Y = numpy.bitwise_and(Y, numpy.array(range(N))*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.BAND OK'    
+
+  pypar.reduce(testArray, pypar.LOR, 0, buffer=X)
+  if myid == 0:  
+    Y = numpy.zeros(N).astype('i')    
+    for i in range(numproc):
+      Y = numpy.logical_or(Y, numpy.array(range(N)).astype('i')*(i+1))  
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.LOR OK'
+  
+  pypar.reduce(testArray, pypar.BOR, 0, buffer=X)
+  if myid == 0:
+    Y = numpy.zeros(N).astype('i')   #Neutral element for |   
+    for i in range(numproc):
+      Y = numpy.bitwise_or(Y, numpy.array(range(N)).astype('i')*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.BOR OK'    
+
+  pypar.reduce(testArray, pypar.LXOR, 0, buffer=X)
+  if myid == 0:  
+    Y = numpy.zeros(N).astype('i')    
+    for i in range(numproc):
+      Y = numpy.logical_xor(Y, numpy.array(range(N)).astype('i')*(i+1))  
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.LXOR OK'
+
+  pypar.reduce(testArray, pypar.BXOR, 0, buffer=X)
+  if myid == 0:
+    Y = numpy.zeros(N).astype('i')   #Neutral element for xor ?   
+    for i in range(numproc):
+      Y = numpy.bitwise_xor(Y, numpy.array(range(N)).astype('i')*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered reduce using pypar.BXOR OK'    
+
+
+
+
+
+  # FIXME: NOT YET SUPPORTED: pypar.MAXLOC, pypar.MINLOC, pypar.REPLACE
+
+  ########################################################
+  # Test allreduce
+  #######################################################
+  N = 17 #Number of elements
+
+  # Create one (different) array on each processor
+  #
+  testArray = numpy.array(range(N), 'i') * (myid+1)
+  X = numpy.zeros(N, 'i') # Buffer for results
+
+  par_exts.allreduce(testArray, pypar.SUM, buffer=X)
+
+  if myid == 0:
+    Y = numpy.zeros(N, 'i')
+    for i in range(numproc):
+      Y = Y + numpy.array(range(N), 'i')*(i+1)
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.SUM OK'
+
+  par_exts.allreduce(testArray, pypar.MAX, buffer=X)
+  if myid == 0:
+    Y = numpy.array(range(N))*numproc
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.MAX OK'
+
+  par_exts.allreduce(testArray, pypar.MIN, buffer=X)
+  if myid == 0:
+    Y = numpy.array(range(N))
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.MIN OK'
+
+  if numproc <= 20:
+    testArray_float = testArray.astype('f')  #Make room for big results
+    X_float = X.astype('f')
+
+    par_exts.allreduce(testArray_float, pypar.PROD, buffer=X_float)
+    if myid == 0:
+      Y = numpy.ones(N).astype('f')
+      for i in range(numproc):
+        Y = Y*numpy.array(range(N))*(i+1)
+      #print X_float
+      #print Y
+      assert numpy.allclose(X_float, Y)
+      print 'Buffered allreduce using pypar.PROD OK'
+  else:
+    if myid == 0:
+      print "Skipping product-allreduce - try again with numproc < 20"
+
+  par_exts.allreduce(testArray, pypar.LAND, buffer=X)
+  if myid == 0:
+    Y = numpy.ones(N).astype('i')
+    for i in range(numproc):
+      Y = numpy.logical_and(Y, numpy.array(range(N)).astype('i')*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.LAND OK'
+
+  par_exts.allreduce(testArray, pypar.BAND, buffer=X)
+  if myid == 0:
+    Y = numpy.ones(N).astype('i')*255  #Neutral element for &
+    for i in range(numproc):
+      Y = numpy.bitwise_and(Y, numpy.array(range(N))*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.BAND OK'
+
+  par_exts.allreduce(testArray, pypar.LOR, buffer=X)
+  if myid == 0:
+    Y = numpy.zeros(N).astype('i')
+    for i in range(numproc):
+      Y = numpy.logical_or(Y, numpy.array(range(N)).astype('i')*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.LOR OK'
+
+  par_exts.allreduce(testArray, pypar.BOR, buffer=X)
+  if myid == 0:
+    Y = numpy.zeros(N).astype('i')   #Neutral element for |
+    for i in range(numproc):
+      Y = numpy.bitwise_or(Y, numpy.array(range(N)).astype('i')*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.BOR OK'
+
+  par_exts.allreduce(testArray, pypar.LXOR, buffer=X)
+  if myid == 0:
+    Y = numpy.zeros(N).astype('i')
+    for i in range(numproc):
+      Y = numpy.logical_xor(Y, numpy.array(range(N)).astype('i')*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.LXOR OK'
+
+  par_exts.allreduce(testArray, pypar.BXOR, buffer=X)
+  if myid == 0:
+    Y = numpy.zeros(N).astype('i')   #Neutral element for xor ?
+    for i in range(numproc):
+      Y = numpy.bitwise_xor(Y, numpy.array(range(N)).astype('i')*(i+1))
+    assert numpy.allclose(X, Y)
+    print 'Buffered allreduce using pypar.BXOR OK'
+
+
+
+
+
+
+
+
+pypar.finalize()
+
+
+
+
Index: /trunk/anuga_core/source/anuga/parallel/sequential_distribute.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/sequential_distribute.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/sequential_distribute.py	(revision 9501)
@@ -0,0 +1,309 @@
+"""Trying to lump parallel stuff into simpler interface
+
+
+"""
+
+import numpy as num
+
+
+from anuga import Domain
+
+from anuga.parallel.distribute_mesh  import send_submesh
+from anuga.parallel.distribute_mesh  import rec_submesh
+from anuga.parallel.distribute_mesh  import extract_submesh
+
+# Mesh partitioning using Metis
+from anuga.parallel.distribute_mesh import build_submesh
+from anuga.parallel.distribute_mesh import pmesh_divide_metis_with_map
+
+from anuga.parallel.parallel_shallow_water import Parallel_domain
+
+
+
+class Sequential_distribute(object):
+
+    def __init__(self, domain, verbose=False, debug=False, parameters=None):
+
+        if debug:
+            verbose = True
+            
+        self.domain = domain
+        self.verbose = verbose
+        self.debug = debug
+        self.parameters = parameters
+
+
+    def distribute(self, numprocs=1):
+
+        self.numprocs = numprocs
+        
+        domain = self.domain
+        verbose = self.verbose
+        debug = self.debug
+        parameters = self.parameters
+
+        # FIXME: Dummy assignment (until boundaries are refactored to
+        # be independent of domains until they are applied)
+        bdmap = {}
+        for tag in domain.get_boundary_tags():
+            bdmap[tag] = None
+
+        domain.set_boundary(bdmap)
+
+
+        self.domain_name = domain.get_name()
+        self.domain_dir = domain.get_datadir()
+        self.domain_store = domain.get_store()
+        self.domain_store_centroids = domain.get_store_centroids()
+        self.domain_minimum_storable_height = domain.minimum_storable_height
+        self.domain_flow_algorithm = domain.get_flow_algorithm()
+        self.domain_minimum_allowed_height = domain.get_minimum_allowed_height()
+        self.domain_georef = domain.geo_reference
+        self.number_of_global_triangles = domain.number_of_triangles
+        self.number_of_global_nodes = domain.number_of_nodes
+        self.boundary_map = domain.boundary_map
+
+
+        # Subdivide the mesh
+        if verbose: print 'sequential_distribute: Subdivide mesh'
+
+        new_nodes, new_triangles, new_boundary, triangles_per_proc, quantities, \
+               s2p_map, p2s_map = \
+               pmesh_divide_metis_with_map(domain, numprocs)
+
+
+        # Build the mesh that should be assigned to each processor,
+        # this includes ghost nodes and the communication pattern
+        if verbose: print 'sequential_distribute: Build submeshes'
+        if verbose: print 'sequential_distribute: parameters = ',parameters
+
+        submesh = build_submesh(new_nodes, new_triangles, new_boundary, \
+                                quantities, triangles_per_proc, parameters=parameters)
+
+        if verbose:
+            for p in range(numprocs):
+                N = len(submesh['ghost_nodes'][p])
+                M = len(submesh['ghost_triangles'][p])
+                print 'There are %d ghost nodes and %d ghost triangles on proc %d'\
+                      %(N, M, p)
+
+
+        self.submesh = submesh
+        self.triangles_per_proc = triangles_per_proc
+        self.p2s_map =  p2s_map
+
+
+    def extract_submesh(self, p=0):
+        """Build the local mesh for processor p
+        """
+
+        submesh = self.submesh
+        triangles_per_proc = self.triangles_per_proc 
+        p2s_map = self.p2s_map
+        verbose = self.verbose
+        debug = self.debug
+
+        assert p>=0
+        assert p<self.numprocs
+        
+        
+        points, vertices, boundary, quantities, \
+            ghost_recv_dict, full_send_dict, \
+            tri_map, node_map, tri_l2g, node_l2g, ghost_layer_width =\
+              extract_submesh(submesh, triangles_per_proc, p2s_map, p)
+              
+
+        number_of_full_nodes = len(submesh['full_nodes'][p])
+        number_of_full_triangles = len(submesh['full_triangles'][p])
+
+
+        if debug:
+            import pprint
+            print  50*"="
+            print 'NODE_L2G'
+            pprint.pprint(node_l2g)
+        
+            pprint.pprint(node_l2g[vertices[:,0]])
+        
+            print 'VERTICES'
+            pprint.pprint(vertices[:,0])
+            pprint.pprint(new_triangles[tri_l2g,0])
+        
+            assert num.allclose(node_l2g[vertices[:,0]], new_triangles[tri_l2g,0])        
+            assert num.allclose(node_l2g[vertices[:,1]], new_triangles[tri_l2g,1]) 
+            assert num.allclose(node_l2g[vertices[:,2]], new_triangles[tri_l2g,2]) 
+        
+
+            print 'POINTS'
+            pprint.pprint(points)
+        
+            assert num.allclose(points[:,0], new_nodes[node_l2g,0])
+            assert num.allclose(points[:,1], new_nodes[node_l2g,1])
+
+
+            print 'TRI'
+            pprint.pprint(tri_l2g)
+            pprint.pprint(p2s_map[tri_l2g])
+        
+
+            assert num.allclose(original_triangles[tri_l2orig,0],node_l2g[vertices[:,0]])
+            assert num.allclose(original_triangles[tri_l2orig,1],node_l2g[vertices[:,1]])
+            assert num.allclose(original_triangles[tri_l2orig,2],node_l2g[vertices[:,2]])
+
+            print 'NODES'
+            pprint.pprint(node_map)
+            pprint.pprint(node_l2g)      
+        
+        #tri_l2orig = p2s_map[tri_l2g]        
+        
+        s2p_map = None
+        p2s_map = None
+
+        #------------------------------------------------------------------------
+        # Build the parallel domain for this processor using partion structures
+        #------------------------------------------------------------------------
+
+        if verbose:
+            print 'sequential_distribute: P%g, no_full_nodes = %g, no_full_triangles = %g' % (p, number_of_full_nodes, number_of_full_triangles)
+
+
+        kwargs = {'full_send_dict': full_send_dict,
+                'ghost_recv_dict': ghost_recv_dict,
+                'number_of_full_nodes': number_of_full_nodes,
+                'number_of_full_triangles': number_of_full_triangles,
+                'geo_reference': self.domain_georef,
+                'number_of_global_triangles':  self.number_of_global_triangles,
+                'number_of_global_nodes':  self.number_of_global_nodes,
+                'processor':  p,
+                'numproc':  self.numprocs,
+                's2p_map':  s2p_map,
+                'p2s_map':  p2s_map, ## jj added this
+                'tri_l2g':  tri_l2g, ## SR added this
+                'node_l2g':  node_l2g,
+                'ghost_layer_width':  ghost_layer_width}
+
+
+        boundary_map = self.boundary_map
+        domain_name = self.domain_name
+        domain_dir = self.domain_dir
+        domain_store = self.domain_store
+        domain_store_centroids = self.domain_store_centroids
+        domain_minimum_storable_height = self.domain_minimum_storable_height
+        domain_minimum_allowed_height = self.domain_minimum_allowed_height
+        domain_flow_algorithm = self.domain_flow_algorithm
+        domain_georef = self.domain_georef
+            
+        tostore = (kwargs, points, vertices, boundary, quantities, \
+                   boundary_map, \
+                   domain_name, domain_dir, domain_store, domain_store_centroids, \
+                   domain_minimum_storable_height, \
+                   domain_minimum_allowed_height, domain_flow_algorithm, \
+                   domain_georef)
+
+
+        return tostore
+
+
+
+                       
+
+    
+def sequential_distribute_dump(domain, numprocs=1, verbose=False, partition_dir='.', debug=False, parameters = None):
+    """ Distribute the domain, create parallel domain and pickle result
+    """
+
+    from os.path import join
+    
+    partition = Sequential_distribute(domain, verbose, debug, parameters)
+
+    partition.distribute(numprocs)
+
+    # Make sure the partition_dir exists
+    if partition_dir == '.' :
+        pass
+    else:
+        import os
+        import errno
+        try:
+            os.makedirs(partition_dir)
+        except OSError as exception:
+            if exception.errno != errno.EEXIST:
+                raise
+
+    
+    for p in range(0, numprocs):
+
+        tostore = partition.extract_submesh(p) 
+
+        import cPickle
+        pickle_name = partition.domain_name + '_P%g_%g.pickle'% (numprocs,p)
+        pickle_name = join(partition_dir,pickle_name)
+        f = file(pickle_name, 'wb')
+        cPickle.dump( tostore, f, protocol=cPickle.HIGHEST_PROTOCOL)
+
+    return
+
+
+def sequential_distribute_load(filename = 'domain', partition_dir = '.', verbose = False):
+
+
+    from anuga import myid, numprocs
+
+    from os.path import join
+
+    pickle_name = filename+'_P%g_%g.pickle'% (numprocs,myid)
+    pickle_name = join(partition_dir,pickle_name) 
+    
+    return sequential_distribute_load_pickle_file(pickle_name, numprocs, verbose = verbose)
+
+
+def sequential_distribute_load_pickle_file(pickle_name, np=1, verbose = False):
+    """
+    Open pickle files
+    """
+    
+    import cPickle    
+    f = file(pickle_name, 'rb')
+
+    kwargs, points, vertices, boundary, quantities, boundary_map, \
+                   domain_name, domain_dir, domain_store, domain_store_centroids, \
+                   domain_minimum_storable_height, domain_minimum_allowed_height, \
+                   domain_flow_algorithm, georef = cPickle.load(f)
+    f.close()
+
+    #---------------------------------------------------------------------------
+    # Create domain (parallel if np>1)
+    #---------------------------------------------------------------------------
+    if np>1:
+        domain = Parallel_domain(points, vertices, boundary, **kwargs)
+    else:
+        domain = Domain(points, vertices, boundary, **kwargs)
+
+    #------------------------------------------------------------------------
+    # Copy in quantity data
+    #------------------------------------------------------------------------
+    for q in quantities:
+        domain.set_quantity(q, quantities[q])
+
+
+    #------------------------------------------------------------------------
+    # Transfer boundary conditions to each subdomain
+    #------------------------------------------------------------------------
+    boundary_map['ghost'] = None  # Add binding to ghost boundary
+    domain.set_boundary(boundary_map)
+
+
+    #------------------------------------------------------------------------
+    # Transfer other attributes to each subdomain
+    #------------------------------------------------------------------------
+    domain.set_name(domain_name)
+    domain.set_datadir(domain_dir)
+    domain.set_flow_algorithm(domain_flow_algorithm)
+    domain.set_store(domain_store)
+    domain.set_store_centroids(domain_store_centroids)
+    domain.set_minimum_storable_height(domain_minimum_storable_height)
+    domain.set_minimum_allowed_height(domain_minimum_allowed_height)
+    domain.geo_reference = georef
+
+
+    return domain
Index: /trunk/anuga_core/source/anuga/parallel/test/test_all.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_all.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_all.py	(revision 9501)
@@ -0,0 +1,223 @@
+"""Regression testing framework
+This module will search for scripts in the same directory named
+test_*.py.  Each such script should be a test suite that tests a
+module through PyUnit. This script will aggregate all
+found test suites into one big test suite and run them all at once.
+"""
+
+# Author: Mark Pilgrim
+# Modified by Ole Nielsen
+
+import unittest
+import os
+import sys
+import tempfile
+import time
+import anuga.utilities.system_tools as aust
+from anuga.utilities.terminal_width import terminal_width
+
+
+
+
+
+#List files that should be excluded from the testing process.
+#E.g. if they are known to fail and under development
+exclude_files = ['test_failure.py', 'test_parallel_boyd_pipe_operator.py', 'test_parallel_boyd_box_op_apron.py']
+
+# Directories that should not be searched for test files.
+exclude_dirs = ['documentation',               # Special requirements
+                '.svn',                              # subversion
+                'props', 'wcprops', 'prop-base', 'text-base', 'tmp']
+
+
+##
+# @brief List a string sequence on the screen in columns.
+# @param names Sequence of strings to list.
+# @param func Function to apply to each string in sequence.
+# @param col_width Force columns to this width (default calculated).
+# @param page_width Set displayable page width to this (default 132).
+def list_names(names, func=None, col_width=None, page_width=None):
+    # set defaults
+    p_width = page_width - 1            # set page width
+    if p_width is None:
+        p_width = 132                   # default page width
+
+    c_width = col_width                 # set column width
+    if c_width is None:
+        c_width = 0
+        for name in names:
+            if func:
+                name = func(name)
+            c_width = max(c_width, len(name))
+    c_width += 2                        # 2 column padding
+
+    # calculate number of columns allowed
+    max_columns = int(p_width / c_width)
+
+    # print columns
+    column = 0
+    for name in names:
+        if func:
+            name = func(name)
+        print '%-*s' % (c_width-1, name),
+        column += 1
+        if column >= max_columns:
+            column = 0
+            print
+
+    # if last line not finished, end it here
+    if column > 0:
+        print
+
+
+##
+# @brief Get 'test_*.py' files and paths to directories.
+# @param path Path to directory to start walk in.
+# @return A tuple (<files>, <dirs>).
+# @note Don't include any files in and below forbidden directories.
+def get_test_files(path):
+    walk = os.walk(path)
+
+    test_files = []
+    path_files = []
+
+    for (dirpath, dirnames, filenames) in walk:
+        # exclude forbidden directories
+        for e_dir in exclude_dirs:
+            try:
+                dirnames.remove(e_dir)
+            except ValueError:
+                pass
+
+        # check for test_*.py files
+        for filename in filenames:
+            if filename.startswith('test_') and filename.endswith('.py'):
+                test_files.append(filename)
+                if dirpath not in path_files:
+                    path_files.append(dirpath)
+
+    return test_files, path_files
+
+
+def regressionTest(test_verbose=False):
+    # start off with where we are
+    path = os.getcwd()
+    print
+    print 'Testing path: %s' % path
+
+    # get the terminal width
+    term_width = terminal_width()
+
+    # explain what we are doing
+    print
+    print "The following directories will be skipped over:"
+    exclude_dirs.sort()
+    list_names(exclude_dirs, page_width=term_width)
+
+    # get all test_*.py and enclosing directories
+    test_files, path_files = get_test_files(path)
+    path_files.sort()
+
+    files = [x for x in test_files if not x == 'test_all.py']
+    files.sort()        # Ensure same order on all platforms
+
+    print
+    print 'Paths searched:'
+    list_names(path_files, os.path.basename, page_width=term_width)
+
+    print    
+    print 'Files tested:'
+    list_names(files, page_width=term_width)
+    print
+
+    # update system path with found paths
+    for path in path_files:
+        sys.path.append(path)
+   
+    # exclude files that we can't handle 
+    for file in exclude_files:
+        print 'WARNING: File '+ file + ' to be excluded from testing'
+        try:
+            files.remove(file)
+        except ValueError, e:
+            msg = 'File "%s" was not found in test suite.\n' % file
+            msg += 'Original error is "%s"\n' % e
+            msg += 'Perhaps it should be removed from exclude list?'
+            raise Exception, msg
+
+    # import all test_*.py files
+    # NOTE: This implies that test_*.py files MUST HAVE UNIQUE NAMES!
+    filenameToModuleName = lambda f: os.path.splitext(f)[0]
+    moduleNames = map(filenameToModuleName, files)
+    modules = map(__import__, moduleNames)
+
+    # Fix up the system path
+    for file in path_files:
+        sys.path.remove(file)
+
+    # bundle up all the tests
+    load = unittest.defaultTestLoader.loadTestsFromModule
+    testCaseClasses = map(load, modules)
+
+    if test_verbose is True:
+        # Test the code by setting verbose to True.
+        # The test cases have to be set up for this to work.
+        # See test data manager for an example.
+        for test_suite in testCaseClasses:
+            for tests in test_suite._tests:
+                # tests is of class TestSuite
+                if len(tests._tests) > 1:
+                    # these are the test functions
+                    try:
+                        # Calls class method set_verbose in test case classes
+                        tests._tests[0].set_verbose()
+                    except:
+                        pass                # No all classes have set_verbose
+
+    return unittest.TestSuite(testCaseClasses)
+
+
+##
+# @brief Check that the environment is sane.
+# @note Stops here if there is an error.
+def check_anuga_import():
+    try:
+        # importing something that loads quickly
+        import anuga.anuga_exceptions
+    except ImportError:
+        print "Python cannot import ANUGA module."
+        print "Check you have followed all steps of its installation."
+        import sys
+        sys.exit()
+
+
+if __name__ == '__main__':
+    check_anuga_import()
+
+    if len(sys.argv) > 1 and sys.argv[1][0].upper() == 'V':
+        test_verbose = True
+        saveout = sys.stdout
+        filename = ".temp"
+        fid = open(filename, 'w')
+        sys.stdout = fid
+    else:
+        test_verbose = False
+    suite = regressionTest(test_verbose)
+    runner = unittest.TextTestRunner(verbosity=1)
+    runner.run(suite)
+
+    # timestamp at the end
+    timestamp = time.asctime()
+    version = aust.get_revision_number()
+    print
+    print 'Finished at %s, version %s' % (timestamp, version)
+
+    # Cleaning up
+    if len(sys.argv) > 1 and sys.argv[1][0].upper() == 'V':
+        sys.stdout = saveout
+        #fid.close() # This was causing an error in windows
+        #os.remove(filename)
+
+    
+    if sys.platform == 'win32':
+        raw_input('Press the RETURN key')
Index: /trunk/anuga_core/source/anuga/parallel/test/test_distribute_mesh.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_distribute_mesh.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_distribute_mesh.py	(revision 9501)
@@ -0,0 +1,1518 @@
+#!/usr/bin/env python
+
+import unittest
+import sys
+from math import sqrt
+
+
+from anuga import Domain
+from anuga import rectangular_cross
+
+from anuga.parallel.distribute_mesh import pmesh_divide_metis
+from anuga.parallel.distribute_mesh import build_submesh
+from anuga.parallel.distribute_mesh import submesh_full, submesh_ghost, submesh_quantities
+from anuga.parallel.distribute_mesh import extract_submesh, rec_submesh, send_submesh
+
+import numpy as num
+
+
+def topography(x,y): 
+    return -x/2
+
+
+def xcoord(x,y):
+    return x
+
+def ycoord(x,y):
+    return y
+
+
+
+class Test_Distribute_Mesh(unittest.TestCase):
+    def setUp(self):
+        pass
+
+
+    def tearDown(self):
+        pass
+
+
+
+    def test_pmesh_1(self):
+        """
+        test distributing with just one processor
+        """
+        
+        points, vertices, boundary = rectangular_cross(2,2)
+
+
+        true_points = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], \
+        [0.5, 0.5], [0.5, 1.0], [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], \
+        [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
+
+        true_vertices = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [1, 10, 2], \
+        [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7],
+        [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]]
+
+
+        assert num.allclose(points,true_points)
+        assert num.allclose(vertices,true_vertices)
+
+        domain = Domain(points, vertices, boundary)
+
+
+        domain.set_quantity('elevation', topography) # Use function for elevation
+        domain.set_quantity('friction', 0.0)         # Constant friction 
+        domain.set_quantity('stage', expression='elevation') # Dry initial stage
+        domain.set_quantity('xmomentum', expression='friction + 2.0') # 
+        domain.set_quantity('ymomentum', ycoord) #
+
+
+        #print domain.quantities['ymomentum'].centroid_values
+ 
+        nodes, triangles, boundary, triangles_per_proc, quantities = pmesh_divide_metis(domain,1)
+
+
+        true_nodes = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], \
+        [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
+
+        true_triangles = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [1, 10, 2], [4, 10, 1], \
+        [5, 10, 4], [2, 10, 5], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7], [4, 12, 5], \
+        [7, 12, 4], [8, 12, 7], [5, 12, 8]]
+
+
+        assert num.allclose(nodes,true_nodes)
+        assert num.allclose(triangles,true_triangles)
+
+
+        assert num.allclose(triangles_per_proc,[16])
+        
+        
+
+    def test_pmesh_2(self):
+        """
+        Test 2 way pmesh
+        """
+        points, vertices, boundary = rectangular_cross(2,2)
+
+
+        true_points = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], \
+        [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
+
+        true_vertices = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [1, 10, 2], [4, 10, 1], \
+        [5, 10, 4], [2, 10, 5], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7], [4, 12, 5], \
+        [7, 12, 4], [8, 12, 7], [5, 12, 8]]
+
+
+        assert num.allclose(points,true_points)
+        assert num.allclose(vertices,true_vertices)
+
+        domain = Domain(points, vertices, boundary)
+
+
+        domain.set_quantity('elevation', topography) # Use function for elevation
+        domain.set_quantity('friction', 0.0)         # Constant friction 
+        domain.set_quantity('stage', expression='elevation') # Dry initial stage
+        domain.set_quantity('xmomentum', expression='friction + 2.0') # 
+        domain.set_quantity('ymomentum', ycoord) #
+
+
+        #print domain.quantities['ymomentum'].centroid_values
+ 
+        nodes, triangles, boundary, triangles_per_proc, quantities = pmesh_divide_metis(domain,2)
+
+
+        true_nodes = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], \
+        [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
+
+
+        true_triangles = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [4, 10, 1], [3, 11, 4], \
+        [4, 11, 7], [4, 12, 5], [1, 10, 2], [5, 10, 4], [2, 10, 5], [6, 11, 3], [7, 11, 6], \
+        [7, 12, 4], [8, 12, 7], [5, 12, 8]]
+
+
+        assert num.allclose(nodes,true_nodes)
+        assert num.allclose(triangles,true_triangles)
+
+
+        assert num.allclose(triangles_per_proc,[8,8])
+
+
+            
+    def test_build_submesh_3(self):
+        """
+        Test 3 way build_submesh
+        """
+
+        nodes = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.0], \
+        [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
+
+
+        triangles = [[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8], [0, 9, 1], \
+        [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 9, 0], [3, 11, 4], \
+        [6, 11, 3], [7, 11, 6], [4, 11, 7]]
+
+
+        boundary = {(13, 1): 'bottom', (7, 1): 'left', (3, 1): 'right', (14, 1): 'right', \
+        (11, 1): 'bottom', (10, 1): 'top', (5, 1): 'left', (4, 1): 'top'}
+
+        triangles_per_proc = [5, 6, 5]
+
+
+        quantities = {'stage': num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]),  'elevation': num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]),  'ymomentum': num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]]),  'friction': num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]),  'xmomentum': num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])}
+
+
+        
+        true_submesh = {'full_boundary': [{(3, 1): 'right', (4, 1): 'top'},\
+        {(5, 1): 'left', (10, 1): 'top', (7, 1): 'left'}, \
+        {(13, 1): 'bottom', (14, 1): 'right', (11, 1): 'bottom'}],
+                        'ghost_nodes': [num.array([[  0.  ,   0.  ,   0.  ],
+       [  1.  ,   0.  ,   0.5 ],
+       [  2.  ,   0.  ,   1.  ],
+       [  6.  ,   1.  ,   0.  ],
+       [ 10.  ,   0.25,   0.75],
+       [ 11.  ,   0.75,   0.25]]), num.array([[  3.  ,   0.5 ,   0.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  8.  ,   1.  ,   1.  ],
+       [ 11.  ,   0.75,   0.25],
+       [ 12.  ,   0.75,   0.75]]), num.array([[  1.  ,   0.  ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  8.  ,   1.  ,   1.  ],
+       [ 12.  ,   0.75,   0.75]])],
+                        'full_nodes': [num.array([[  3.  ,   0.5 ,   0.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  8.  ,   1.  ,   1.  ],
+       [  9.  ,   0.25,   0.25],
+       [ 12.  ,   0.75,   0.75]]), num.array([[  0.  ,   0.  ,   0.  ],
+       [  1.  ,   0.  ,   0.5 ],
+       [  2.  ,   0.  ,   1.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  9.  ,   0.25,   0.25],
+       [ 10.  ,   0.25,   0.75]]), num.array([[  0.  ,   0.  ,   0.  ],
+       [  3.  ,   0.5 ,   0.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  6.  ,   1.  ,   0.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  9.  ,   0.25,   0.25],
+       [ 11.  ,   0.75,   0.25]])],
+                        'ghost_triangles': [num.array([[ 5,  0,  9,  1],
+       [ 6,  1,  9,  4],
+       [ 8,  4, 10,  1],
+       [ 9,  5, 10,  4],
+       [10,  2, 10,  5],
+       [11,  3,  9,  0],
+       [12,  3, 11,  4],
+       [13,  6, 11,  3],
+       [14,  7, 11,  6],
+       [15,  4, 11,  7]]), num.array([[ 0,  4,  9,  3],
+       [ 1,  4, 12,  5],
+       [ 2,  7, 12,  4],
+       [ 4,  5, 12,  8],
+       [11,  3,  9,  0],
+       [12,  3, 11,  4]]), num.array([[ 0,  4,  9,  3],
+       [ 1,  4, 12,  5],
+       [ 2,  7, 12,  4],
+       [ 3,  8, 12,  7],
+       [ 5,  0,  9,  1],
+       [ 6,  1,  9,  4]])],
+                        'ghost_boundary': [{(13, 1): 'ghost', (8, 0): 'ghost', (14, 1): 'ghost', \
+                        (11, 1): 'ghost', (10, 1): 'ghost', (5, 1): 'ghost', (10, 2): 'ghost'}, \
+                        {(12, 2): 'ghost', (12, 0): 'ghost', (2, 1): 'ghost', (11, 1): 'ghost',\
+                        (2, 2): 'ghost', (4, 1): 'ghost', (4, 0): 'ghost'}, {(3, 2): 'ghost', \
+                        (6, 1): 'ghost', (3, 1): 'ghost', (5, 1): 'ghost', (1, 0): 'ghost', (1, 1): 'ghost'}],
+                        'full_triangles': [[[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]], \
+                        [[0, 9, 1], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5]], \
+                        [[3, 9, 0], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7]]],
+                        'full_commun': [{0: [1, 2], 1: [1, 2], 2: [1, 2], 3: [2], 4: [1]}, \
+                        {5: [0, 2], 6: [0, 2], 7: [], 8: [0], 9: [0], 10: [0]}, \
+                        {11: [0, 1], 12: [0, 1], 13: [0], 14: [0], 15: [0]}],
+                        'ghost_commun': [num.array([[ 5,  1],
+       [ 6,  1],
+       [ 8,  1],
+       [ 9,  1],
+       [10,  1],
+       [11,  2],
+       [12,  2],
+       [13,  2],
+       [14,  2],
+       [15,  2]]), num.array([[ 0,  0],
+       [ 1,  0],
+       [ 2,  0],
+       [ 4,  0],
+       [11,  2],
+       [12,  2]]), num.array([[0, 0],
+       [1, 0],
+       [2, 0],
+       [3, 0],
+       [5, 1],
+       [6, 1]])],  'ghost_quan': {'stage': [num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ]])],  'elevation': [num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ]])],  'ymomentum': [num.array([[ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ]])],  'friction': [num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]])], 'xmomentum': [num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])]},  'full_quan': {'stage': [num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]])],  'elevation': [num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]])],  'ymomentum': [num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]])],  'friction': [num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]])],  'xmomentum': [num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])]}}
+                                  
+
+        from anuga.abstract_2d_finite_volumes.neighbour_mesh import Mesh
+        
+        mesh = Mesh(nodes, triangles, boundary)
+        boundary_polygon = mesh.get_boundary_polygon()
+
+
+        # Subdivide into non-overlapping partitions
+
+        submesh = submesh_full(mesh, triangles_per_proc)
+
+        #print submesh
+
+
+        for i in range(3):
+            assert num.allclose(true_submesh['full_triangles'][i],submesh['full_triangles'][i])
+            assert num.allclose(true_submesh['full_nodes'][i],submesh['full_nodes'][i])
+        assert true_submesh['full_boundary'] == submesh['full_boundary']
+
+        # Add any extra ghost boundary layer information
+
+        submesh = submesh_ghost(submesh, mesh, triangles_per_proc)
+
+        for i in range(3):
+            assert num.allclose(true_submesh['ghost_triangles'][i],submesh['ghost_triangles'][i])
+            assert num.allclose(true_submesh['ghost_nodes'][i],submesh['ghost_nodes'][i])
+            assert num.allclose(true_submesh['ghost_commun'][i],submesh['ghost_commun'][i])
+
+        assert true_submesh['full_commun'] == submesh['full_commun']
+
+
+        # Order the quantities information to be the same as the triangle
+        # information
+
+
+        submesh = submesh_quantities(submesh, quantities, \
+                                 triangles_per_proc)
+
+
+
+        for key, value in true_submesh['ghost_quan'].iteritems():
+            for i in range(3):
+                assert num.allclose(true_submesh['ghost_quan'][key][i],submesh['ghost_quan'][key][i])
+                assert num.allclose(true_submesh['full_quan'][key][i],submesh['full_quan'][key][i])
+        
+
+        submesh["boundary_polygon"] = boundary_polygon
+
+
+
+    def test_build_submesh_3_layer_4(self):
+        """
+        Test 3 Layer 4 way build_submesh with ghost_layer_width = 4
+        """
+
+        nodes = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], \
+        [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
+
+
+        triangles = [[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8], [0, 9, 1], \
+        [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 9, 0], [3, 11, 4], \
+        [6, 11, 3], [7, 11, 6], [4, 11, 7]]
+
+
+        boundary = {(13, 1): 'bottom', (7, 1): 'left', (3, 1): 'right', (14, 1): 'right', \
+        (11, 1): 'bottom', (10, 1): 'top', (5, 1): 'left', (4, 1): 'top'}
+
+        """
+                     top
+            (10,1)       (4,1)
+        2 ---------- 5 ---------- 8
+        | \   10   / | \   04   / |
+        |   \    /   |   \    /   |
+ (7,1)  | 07  10  09 | 01  12  03 | (3,1)
+        |   /    \   |   /    \   |
+        | /   08   \ | /   02   \ |
+ left   1 ---------- 4 ---------- 7  right
+        | \   06   / | \   15   / |
+        |   \    /   |   \    /   |
+ (5,1)  | 05  09  00 | 12  11  14 | (14,1)
+        |   /    \   |   /    \   |
+        | /   11   \ | /   13   \ |
+        0 ---------- 3 ---------- 6
+            (11,1)        (13,1)
+                   bottom
+
+
+        Processor 0 Full Triangles 00,01,02,03,04
+        Processor 1 Full Triangles 05,06,07,08,09,10
+        Processor 2 Full Triangles 11,12,13,14,15
+        """
+
+
+        triangles_per_proc = [5, 6, 5]
+
+
+        quantities = {'stage': num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]),  'elevation': num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]),  'ymomentum': num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]]),  'friction': num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]),  'xmomentum': num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])}
+
+
+
+        true_submesh = {'full_boundary': [{(3, 1): 'right', (4, 1): 'top'}, {(5, 1): 'left', \
+        (10, 1): 'top', (7, 1): 'left'}, {(13, 1): 'bottom', (14, 1): 'right', (11, 1): 'bottom'}],
+                        'ghost_nodes': [num.array([[  0.  ,   0.  ,   0.  ],
+       [  1.  ,   0.  ,   0.5 ],
+       [  2.  ,   0.  ,   1.  ],
+       [  6.  ,   1.  ,   0.  ],
+       [ 10.  ,   0.25,   0.75],
+       [ 11.  ,   0.75,   0.25]]), num.array([[  3.  ,   0.5 ,   0.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  8.  ,   1.  ,   1.  ],
+       [ 11.  ,   0.75,   0.25],
+       [ 12.  ,   0.75,   0.75]]), num.array([[  1.  ,   0.  ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  8.  ,   1.  ,   1.  ],
+       [ 12.  ,   0.75,   0.75]])],
+                        'full_nodes': [num.array([[  3.  ,   0.5 ,   0.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  8.  ,   1.  ,   1.  ],
+       [  9.  ,   0.25,   0.25],
+       [ 12.  ,   0.75,   0.75]]), num.array([[  0.  ,   0.  ,   0.  ],
+       [  1.  ,   0.  ,   0.5 ],
+       [  2.  ,   0.  ,   1.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  9.  ,   0.25,   0.25],
+       [ 10.  ,   0.25,   0.75]]), num.array([[  0.  ,   0.  ,   0.  ],
+       [  3.  ,   0.5 ,   0.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  6.  ,   1.  ,   0.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  9.  ,   0.25,   0.25],
+       [ 11.  ,   0.75,   0.25]])],
+                        'ghost_triangles': [num.array([[ 5,  0,  9,  1],
+       [ 6,  1,  9,  4],
+       [ 8,  4, 10,  1],
+       [ 9,  5, 10,  4],
+       [10,  2, 10,  5],
+       [11,  3,  9,  0],
+       [12,  3, 11,  4],
+       [13,  6, 11,  3],
+       [14,  7, 11,  6],
+       [15,  4, 11,  7]]), num.array([[ 0,  4,  9,  3],
+       [ 1,  4, 12,  5],
+       [ 2,  7, 12,  4],
+       [ 4,  5, 12,  8],
+       [11,  3,  9,  0],
+       [12,  3, 11,  4]]), num.array([[ 0,  4,  9,  3],
+       [ 1,  4, 12,  5],
+       [ 2,  7, 12,  4],
+       [ 3,  8, 12,  7],
+       [ 5,  0,  9,  1],
+       [ 6,  1,  9,  4]])],
+                        'ghost_boundary': [{(13, 1): 'ghost', (8, 0): 'ghost', \
+                        (14, 1): 'ghost', (11, 1): 'ghost', (10, 1): 'ghost', \
+                        (5, 1): 'ghost', (10, 2): 'ghost'}, {(12, 2): 'ghost', \
+                        (12, 0): 'ghost', (2, 1): 'ghost', (11, 1): 'ghost', \
+                        (2, 2): 'ghost', (4, 1): 'ghost', (4, 0): 'ghost'}, \
+                        {(3, 2): 'ghost', (6, 1): 'ghost', (3, 1): 'ghost', \
+                        (5, 1): 'ghost', (1, 0): 'ghost', (1, 1): 'ghost'}],
+                        'full_triangles': [[[4, 9, 3], [4, 12, 5], [7, 12, 4], \
+                        [8, 12, 7], [5, 12, 8]], [[0, 9, 1], [1, 9, 4], [1, 10, 2], \
+                        [4, 10, 1], [5, 10, 4], [2, 10, 5]], [[3, 9, 0], [3, 11, 4], \
+                        [6, 11, 3], [7, 11, 6], [4, 11, 7]]],
+                        'full_commun': [{0: [1, 2], 1: [1, 2], 2: [1, 2], 3: [2], 4: [1]}, \
+                        {5: [0, 2], 6: [0, 2], 7: [], 8: [0], 9: [0], 10: [0]}, \
+                        {11: [0, 1], 12: [0, 1], 13: [0], 14: [0], 15: [0]}],
+                        'ghost_commun': [num.array([[ 5,  1],
+       [ 6,  1],
+       [ 8,  1],
+       [ 9,  1],
+       [10,  1],
+       [11,  2],
+       [12,  2],
+       [13,  2],
+       [14,  2],
+       [15,  2]]), num.array([[ 0,  0],
+       [ 1,  0],
+       [ 2,  0],
+       [ 4,  0],
+       [11,  2],
+       [12,  2]]), num.array([[0, 0],
+       [1, 0],
+       [2, 0],
+       [3, 0],
+       [5, 1],
+       [6, 1]])],  'ghost_quan': {'stage': [num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ]])],  'elevation': [num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ]])],  'ymomentum': [num.array([[ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ]])],  'friction': [num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]])], 'xmomentum': [num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])]},  'full_quan': {'stage': [num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]])],  'elevation': [num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]])],  'ymomentum': [num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]])],  'friction': [num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]])],  'xmomentum': [num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])]}}
+
+
+        # setup parameters to test using different ghost_layer_widths
+        parameters = dict(ghost_layer_width = 1)
+
+        from anuga.abstract_2d_finite_volumes.neighbour_mesh import Mesh
+
+        mesh = Mesh(nodes, triangles, boundary)
+        boundary_polygon = mesh.get_boundary_polygon()
+
+
+        # Subdivide into non-overlapping partitions
+
+        submesh = submesh_full(mesh, triangles_per_proc)
+
+
+
+        for i in range(3):
+            assert num.allclose(true_submesh['full_triangles'][i],submesh['full_triangles'][i])
+            assert num.allclose(true_submesh['full_nodes'][i],submesh['full_nodes'][i])
+        assert true_submesh['full_boundary'] == submesh['full_boundary']
+
+        # Add any extra ghost boundary layer information
+
+        submesh = submesh_ghost(submesh, mesh, triangles_per_proc, parameters)
+
+        #print submesh
+
+        #print 'ghost_triangles', submesh['ghost_triangles']
+        #print 'ghost_boundary', submesh['ghost_boundary']
+        #print 'ghost_nodes', submesh['ghost_nodes']
+        #print 'ghost_commun', submesh['ghost_commun']
+
+
+        true_submesh['ghost_boundary'] = [{(12, 2): 'ghost', (9, 0): 'ghost', (9, 2): 'ghost', \
+        (6, 1): 'ghost', (15, 0): 'ghost', (11, 1): 'bottom', (11, 0): 'ghost', (6, 2): 'ghost'}, \
+        {(0, 1): 'ghost', (1, 2): 'ghost', (1, 0): 'ghost', (11, 1): 'bottom'},\
+        {(5, 1): 'left', (2, 0): 'ghost', (0, 2): 'ghost', (5, 0): 'ghost', (2, 2): 'ghost'}]
+
+
+        true_submesh['ghost_triangles'] = [num.array([[ 6,  1,  9,  4],\
+                                                      [ 9,  5, 10,  4],\
+                                                      [11,  3,  9,  0],\
+                                                      [12,  3, 11,  4],\
+                                                      [15,  4, 11,  7]]), \
+                                           num.array([[ 0,  4,  9,  3],\
+                                                      [ 1,  4, 12,  5],\
+                                                     [11,  3,  9,  0]]),\
+                                           num.array([[ 0,  4,  9,  3],\
+                                                      [ 2,  7, 12,  4],\
+                                                      [ 5,  0,  9,  1]])]
+
+        true_submesh['ghost_nodes'] =  [num.array([[  0.  ,   0.  ,   0.  ],\
+                                                   [  1.  ,   0.  ,   0.5 ],\
+                                                   [ 10.  ,   0.25,   0.75],\
+                                                   [ 11.  ,   0.75,   0.25]]),\
+                                        num.array([[  3.  ,   0.5 ,   0.  ],\
+                                                   [ 12.  ,   0.75,   0.75]]),\
+                                        num.array([[  1.  ,   0.  ,   0.5 ],\
+                                                   [ 12.  ,   0.75,   0.75]])]
+
+        true_submesh['ghost_commun'] = [num.array([[ 6,  1],\
+                                                   [ 9,  1],\
+                                                   [11,  2],\
+                                                   [12,  2],\
+                                                   [15,  2]]),\
+                                        num.array([[ 0,  0],\
+                                                   [ 1,  0],\
+                                                   [11,  2]]),\
+                                        num.array([[0, 0],\
+                                                   [2, 0],\
+                                                   [5, 1]])]
+
+
+
+
+        for i in range(3):
+            assert true_submesh['ghost_boundary'][i] == submesh['ghost_boundary'][i]
+            assert num.allclose(true_submesh['ghost_triangles'][i],submesh['ghost_triangles'][i])
+            assert num.allclose(true_submesh['ghost_nodes'][i],submesh['ghost_nodes'][i])
+            assert num.allclose(true_submesh['ghost_commun'][i],submesh['ghost_commun'][i])
+
+
+
+        true_submesh['full_commun'] = [{0: [1, 2], 1: [1], 2: [2], 3: [], 4: []},\
+                                       {5: [2], 6: [0], 7: [], 8: [], 9: [0], 10: []},\
+                                       {11: [0, 1], 12: [0], 13: [], 14: [], 15: [0]}]
+
+        assert true_submesh['full_commun'] == submesh['full_commun']
+
+
+        # Order the quantities information to be the same as the triangle
+        # information
+
+
+        submesh = submesh_quantities(submesh, quantities, \
+                                 triangles_per_proc)
+
+
+        #print submesh['full_quan']
+
+
+
+        true_submesh['full_quan'] = {'stage': [num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]])], 'elevation': [num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]])], 'ymomentum': [num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]])], 'friction': [num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]])], 'xmomentum': [num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])]}
+
+
+        true_submesh['ghost_quan'] = {'stage': [num.array([[-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.25 , -0.125, -0.   ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.   , -0.125, -0.   ]])], 'elevation': [num.array([[-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.25 , -0.125, -0.   ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.   , -0.125, -0.   ]])], 'ymomentum': [num.array([[ 0.5 ,  0.25,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ]]), num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 0.  ,  0.25,  0.5 ]])], 'friction': [num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]])], 'xmomentum': [num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])]}
+
+
+        for key, value in true_submesh['ghost_quan'].iteritems():
+            for i in range(3):
+                assert num.allclose(true_submesh['ghost_quan'][key][i],submesh['ghost_quan'][key][i])
+                assert num.allclose(true_submesh['full_quan'][key][i],submesh['full_quan'][key][i])
+
+
+        submesh["boundary_polygon"] = boundary_polygon
+
+
+    def test_build_extract_submesh_3(self):
+        """
+        Test 3 way extract_submesh
+        """
+
+        nodes = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.0], \
+        [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
+
+
+        triangles = [[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8], [0, 9, 1], \
+        [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 9, 0], [3, 11, 4], \
+        [6, 11, 3], [7, 11, 6], [4, 11, 7]]
+
+
+        boundary = {(13, 1): 'bottom', (7, 1): 'left', (3, 1): 'right', (14, 1): 'right', \
+        (11, 1): 'bottom', (10, 1): 'top', (5, 1): 'left', (4, 1): 'top'}
+
+        triangles_per_proc = [5, 6, 5]
+
+
+        quantities = {'stage': num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]),  'elevation': num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]),  'ymomentum': num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]]),  'friction': num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]),  'xmomentum': num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])}
+
+
+
+        true_submesh = {'full_boundary': [{(3, 1): 'right', (4, 1): 'top'},\
+        {(5, 1): 'left', (10, 1): 'top', (7, 1): 'left'}, \
+        {(13, 1): 'bottom', (14, 1): 'right', (11, 1): 'bottom'}],
+                        'ghost_nodes': [num.array([[  0.  ,   0.  ,   0.  ],
+       [  1.  ,   0.  ,   0.5 ],
+       [  2.  ,   0.  ,   1.  ],
+       [  6.  ,   1.  ,   0.  ],
+       [ 10.  ,   0.25,   0.75],
+       [ 11.  ,   0.75,   0.25]]), num.array([[  3.  ,   0.5 ,   0.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  8.  ,   1.  ,   1.  ],
+       [ 11.  ,   0.75,   0.25],
+       [ 12.  ,   0.75,   0.75]]), num.array([[  1.  ,   0.  ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  8.  ,   1.  ,   1.  ],
+       [ 12.  ,   0.75,   0.75]])],
+                        'full_nodes': [num.array([[  3.  ,   0.5 ,   0.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  8.  ,   1.  ,   1.  ],
+       [  9.  ,   0.25,   0.25],
+       [ 12.  ,   0.75,   0.75]]), num.array([[  0.  ,   0.  ,   0.  ],
+       [  1.  ,   0.  ,   0.5 ],
+       [  2.  ,   0.  ,   1.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  5.  ,   0.5 ,   1.  ],
+       [  9.  ,   0.25,   0.25],
+       [ 10.  ,   0.25,   0.75]]), num.array([[  0.  ,   0.  ,   0.  ],
+       [  3.  ,   0.5 ,   0.  ],
+       [  4.  ,   0.5 ,   0.5 ],
+       [  6.  ,   1.  ,   0.  ],
+       [  7.  ,   1.  ,   0.5 ],
+       [  9.  ,   0.25,   0.25],
+       [ 11.  ,   0.75,   0.25]])],
+                        'ghost_triangles': [num.array([[ 5,  0,  9,  1],
+       [ 6,  1,  9,  4],
+       [ 8,  4, 10,  1],
+       [ 9,  5, 10,  4],
+       [10,  2, 10,  5],
+       [11,  3,  9,  0],
+       [12,  3, 11,  4],
+       [13,  6, 11,  3],
+       [14,  7, 11,  6],
+       [15,  4, 11,  7]]), num.array([[ 0,  4,  9,  3],
+       [ 1,  4, 12,  5],
+       [ 2,  7, 12,  4],
+       [ 4,  5, 12,  8],
+       [11,  3,  9,  0],
+       [12,  3, 11,  4]]), num.array([[ 0,  4,  9,  3],
+       [ 1,  4, 12,  5],
+       [ 2,  7, 12,  4],
+       [ 3,  8, 12,  7],
+       [ 5,  0,  9,  1],
+       [ 6,  1,  9,  4]])],
+                        'ghost_boundary': [{(13, 1): 'ghost', (8, 0): 'ghost', (14, 1): 'ghost', \
+                        (11, 1): 'ghost', (10, 1): 'ghost', (5, 1): 'ghost', (10, 2): 'ghost'}, \
+                        {(12, 2): 'ghost', (12, 0): 'ghost', (2, 1): 'ghost', (11, 1): 'ghost',\
+                        (2, 2): 'ghost', (4, 1): 'ghost', (4, 0): 'ghost'}, {(3, 2): 'ghost', \
+                        (6, 1): 'ghost', (3, 1): 'ghost', (5, 1): 'ghost', (1, 0): 'ghost', (1, 1): 'ghost'}],
+                        'full_triangles': [[[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]], \
+                        [[0, 9, 1], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5]], \
+                        [[3, 9, 0], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7]]],
+                        'full_commun': [{0: [1, 2], 1: [1, 2], 2: [1, 2], 3: [2], 4: [1]}, \
+                        {5: [0, 2], 6: [0, 2], 7: [], 8: [0], 9: [0], 10: [0]}, \
+                        {11: [0, 1], 12: [0, 1], 13: [0], 14: [0], 15: [0]}],
+                        'ghost_commun': [num.array([[ 5,  1],
+       [ 6,  1],
+       [ 8,  1],
+       [ 9,  1],
+       [10,  1],
+       [11,  2],
+       [12,  2],
+       [13,  2],
+       [14,  2],
+       [15,  2]]), num.array([[ 0,  0],
+       [ 1,  0],
+       [ 2,  0],
+       [ 4,  0],
+       [11,  2],
+       [12,  2]]), num.array([[0, 0],
+       [1, 0],
+       [2, 0],
+       [3, 0],
+       [5, 1],
+       [6, 1]])],  'ghost_quan': {'stage': [num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ]])],  'elevation': [num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.25 , -0.375, -0.5  ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ]]), num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ]])],  'ymomentum': [num.array([[ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ]])],  'friction': [num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]])], 'xmomentum': [num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])]},  'full_quan': {'stage': [num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]])],  'elevation': [num.array([[-0.25 , -0.125, -0.25 ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
+       [-0.   , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.125, -0.25 ],
+       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
+       [-0.25 , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.25 ],
+       [-0.5  , -0.375, -0.5  ],
+       [-0.25 , -0.375, -0.5  ]])],  'ymomentum': [num.array([[ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.5 ],
+       [ 0.5 ,  0.25,  0.5 ],
+       [ 0.5 ,  0.75,  1.  ],
+       [ 0.5 ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  0.5 ],
+       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.  ],
+       [ 0.  ,  0.25,  0.5 ],
+       [ 0.  ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.  ],
+       [ 0.5 ,  0.25,  0.5 ]])],  'friction': [num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.],
+       [ 0.,  0.,  0.]])],  'xmomentum': [num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.],
+       [ 2.,  2.,  2.]])]}}
+
+
+        # Subdivide into non-overlapping partitions
+        submesh = build_submesh(nodes, triangles, boundary, quantities,
+                  triangles_per_proc, parameters = None)
+
+
+        for i in range(3):
+            assert num.allclose(true_submesh['full_triangles'][i],submesh['full_triangles'][i])
+            assert num.allclose(true_submesh['full_nodes'][i],submesh['full_nodes'][i])
+            assert num.allclose(true_submesh['ghost_triangles'][i],submesh['ghost_triangles'][i])
+            assert num.allclose(true_submesh['ghost_nodes'][i],submesh['ghost_nodes'][i])
+            assert num.allclose(true_submesh['ghost_commun'][i],submesh['ghost_commun'][i])
+
+        assert true_submesh['full_boundary'] == submesh['full_boundary']
+        assert true_submesh['full_commun'] == submesh['full_commun']
+
+        for key, value in true_submesh['ghost_quan'].iteritems():
+            for i in range(3):
+                assert num.allclose(true_submesh['ghost_quan'][key][i],submesh['ghost_quan'][key][i])
+                assert num.allclose(true_submesh['full_quan'][key][i],submesh['full_quan'][key][i])
+
+
+        # Now test the extract_submesh for the 3 processors
+
+        submesh_cell_0 = extract_submesh(submesh,triangles_per_proc,p=0)
+        submesh_cell_1 = extract_submesh(submesh,triangles_per_proc,p=1)
+        submesh_cell_2 = extract_submesh(submesh,triangles_per_proc,p=2)
+
+
+        from pprint import pprint
+
+        #pprint(submesh_cell_1)
+
+#-------------------------------------------------------------
+
+if __name__ == "__main__":
+    suite = unittest.makeSuite(Test_Distribute_Mesh,'test')
+    runner = unittest.TextTestRunner()
+    runner.run(suite)
Index: /trunk/anuga_core/source/anuga/parallel/test/test_failure.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_failure.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_failure.py	(revision 9501)
@@ -0,0 +1,329 @@
+import os.path
+import sys
+
+from anuga.utilities.system_tools import get_pathname_from_package
+from anuga.geometry.polygon_function import Polygon_function
+        
+from anuga.abstract_2d_finite_volumes.mesh_factory import rectangular_cross
+from anuga.abstract_2d_finite_volumes.quantity import Quantity
+from anuga.abstract_2d_finite_volumes.util import file_function
+
+import anuga
+
+from anuga.structures.boyd_box_operator import Boyd_box_operator
+from anuga.structures.inlet_operator import Inlet_operator
+                            
+#from anuga.culvert_flows.culvert_routines import boyd_generalised_culvert_model
+     
+from math import pi, pow, sqrt
+
+import numpy as num
+#from parallel_inlet_operator import Parallel_Inlet_operator
+from anuga.parallel import distribute, myid, numprocs, finalize
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+
+#from parallel_operator_factory import Inlet_operator, Boyd_box_operator
+import pypar
+import random
+
+
+"""test_that_culvert_runs_rating
+
+This test exercises the culvert and checks values outside rating curve
+are dealt with       
+"""
+verbose = False
+path = get_pathname_from_package('anuga.culvert_flows')    
+
+length = 40.
+width = 15.
+
+dx = dy = 0.5          # Resolution: Length of subdivisions on both axes
+
+#----------------------------------------------------------------------
+# Setup initial conditions
+#----------------------------------------------------------------------
+
+def topography(x, y):
+    """Set up a weir
+    
+    A culvert will connect either side
+    """
+    # General Slope of Topography
+    z=-x/1000
+    
+    N = len(x)
+    for i in range(N):
+
+       # Sloping Embankment Across Channel
+        if 5.0 < x[i] < 10.1:
+            # Cut Out Segment for Culvert face                
+            if  1.0+(x[i]-5.0)/5.0 <  y[i]  < 4.0 - (x[i]-5.0)/5.0: 
+               z[i]=z[i]
+            else:
+               z[i] +=  0.5*(x[i] -5.0)    # Sloping Segment  U/S Face
+        if 10.0 < x[i] < 12.1:
+           z[i] +=  2.5                    # Flat Crest of Embankment
+        if 12.0 < x[i] < 14.5:
+            # Cut Out Segment for Culvert face                
+            if  2.0-(x[i]-12.0)/2.5 <  y[i]  < 3.0 + (x[i]-12.0)/2.5:
+               z[i]=z[i]
+            else:
+               z[i] +=  2.5-1.0*(x[i] -12.0) # Sloping D/S Face
+                   
+        
+    return z
+
+filename=os.path.join(path, 'example_rating_curve.csv')
+
+
+mod_path = get_pathname_from_package('anuga.parallel')
+
+line0 = [[10.0, 10.0], [30.0, 10.0]]
+#line0 = [[29.0, 10.0], [30.0, 10.0]]
+line1 = [[0.0, 10.0], [0.0, 15.0]]
+Q0 = file_function(os.path.join(mod_path,'data','test_hydrograph.tms'), quantities=['hydrograph'])
+Q1 = 5.0
+
+samples = 50
+
+def run_test(parallel = False, control_data = None, test_points = None, verbose = False):
+    success = True
+
+##-----------------------------------------------------------------------
+## Setup domain
+##-----------------------------------------------------------------------
+
+    points, vertices, boundary = rectangular_cross(int(length/dx),
+                                                   int(width/dy),
+                                                   len1=length, 
+                                                   len2=width)
+
+    domain = anuga.Domain(points, vertices, boundary)   
+    domain.set_store(False)
+    #domain.set_name('output_parallel_failure')                 # Output name
+    domain.set_default_order(2)
+
+##-----------------------------------------------------------------------
+## Distribute domain
+##-----------------------------------------------------------------------
+
+    if parallel: domain = distribute(domain)
+    
+
+##-----------------------------------------------------------------------
+## Setup boundary conditions
+##-----------------------------------------------------------------------
+    
+    domain.set_quantity('elevation', topography) 
+    domain.set_quantity('friction', 0.01)         # Constant friction 
+    domain.set_quantity('stage',
+                        expression='elevation')   # Dry initial condition
+
+    
+    Bi = anuga.Dirichlet_boundary([5.0, 0.0, 0.0])
+    Br = anuga.Reflective_boundary(domain)              # Solid reflective wall
+    domain.set_boundary({'left': Bi, 'right': Br, 'top': Br, 'bottom': Br})
+
+
+##-----------------------------------------------------------------------
+## Determine triangle index coinciding with test points
+##-----------------------------------------------------------------------
+
+    assert(test_points is not None)
+    assert(len(test_points) == samples)
+
+    tri_ids = []
+
+    for point in test_points:
+        try:
+            k = domain.get_triangle_containing_point(point)
+            if domain.tri_full_flag[k] == 1:
+                tri_ids.append(k)
+            else:
+                tri_ids.append(-1)            
+        except:
+            tri_ids.append(-2)
+
+    if verbose: print 'P%d has points = %s' %(myid, tri_ids)
+
+    if not parallel: control_data = []
+
+    ################ Define Fractional Operators ##########################
+
+    inlet0 = None
+    inlet1 = None
+    boyd_box0 = None
+    
+    #inlet0 = Inlet_operator(domain, line0, Q0, debug = True)
+    #inlet1 = Inlet_operator(domain, line1, Q1, debug = True)
+    
+    ## # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+    ## if myid == 5 and parallel:
+    ##     boyd_box0 = Boyd_box_operator(domain,
+    ##                                   end_points=[[9.0, 2.5],[13.0, 2.5]],
+    ##                                   losses=1.5,
+    ##                                   width=1.0,
+    ##                                   apron=0.5,
+    ##                                   use_momentum_jet=True,
+    ##                                   use_velocity_head=False,
+    ##                                   manning=0.013,
+    ##                                   verbose=False)
+    ## elif not parallel:
+    ##     boyd_box0 = Boyd_box_operator(domain,
+    ##                                   end_points=[[9.0, 2.5],[13.0, 2.5]],
+    ##                                   losses=1.5,
+    ##                                   width=1.0,
+    ##                                   apron=0.5,
+    ##                                   use_momentum_jet=True,
+    ##                                   use_velocity_head=False,
+    ##                                   manning=0.013,
+    ##                                   verbose=False)
+
+#    if parallel:
+#        factory = Parallel_operator_factory(domain, debug = True)
+#
+#        inlet0 = factory.inlet_operator_factory(line0, Q0)
+#        inlet1 = factory.inlet_operator_factory(line1, Q1)
+#        
+#        boyd_box0 = factory.boyd_box_operator_factory(end_points=[[9.0, 2.5],[19.0, 2.5]],
+#                                          losses=1.5,
+#                                          width=1.5,
+#                                          apron=5.0,
+#                                          use_momentum_jet=True,
+#                                          use_velocity_head=False,
+#                                          manning=0.013,
+#                                          verbose=False)
+#
+#    else:
+#        inlet0 = Inlet_operator(domain, line0, Q0)
+#        inlet1 = Inlet_operator(domain, line1, Q1)
+#
+#        # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+#        boyd_box0 = Boyd_box_operator(domain,
+#                          end_points=[[9.0, 2.5],[19.0, 2.5]],
+#                          losses=1.5,
+#                          width=1.5,
+#                          apron=5.0,
+#                          use_momentum_jet=True,
+#                          use_velocity_head=False,
+#                          manning=0.013,
+#                          verbose=False)
+    
+    #######################################################################
+
+    ##-----------------------------------------------------------------------
+    ## Evolve system through time
+    ##-----------------------------------------------------------------------
+
+    for t in domain.evolve(yieldstep = 1.0, finaltime = 4):
+        if verbose: domain.write_time()
+
+        #print domain.volumetric_balance_statistics()
+    
+        stage = domain.get_quantity('stage')
+
+        #for i in range(samples):
+        #    if tri_ids[i] >= 0:                
+        #        if verbose: print 'P%d tri %d, value = %s' %(myid, i, stage.centroid_values[tri_ids[i]])
+                    
+        sys.stdout.flush()
+ 
+        pass
+
+ 
+    domain.sww_merge(delete_old=True)
+    
+    success = True
+
+##-----------------------------------------------------------------------
+## Assign/Test Control data
+##-----------------------------------------------------------------------
+
+    if not parallel:
+        stage = domain.get_quantity('stage')
+
+        for i in range(samples):
+            assert(tri_ids[i] >= 0)
+            control_data.append(stage.centroid_values[tri_ids[i]])
+
+        if inlet0 is not None:
+            control_data.append(inlet0.inlet.get_average_stage())
+            control_data.append(inlet0.inlet.get_average_xmom())
+            control_data.append(inlet0.inlet.get_average_ymom())
+            control_data.append(inlet0.inlet.get_total_water_volume())
+            control_data.append(inlet0.inlet.get_average_depth())
+
+        if verbose: print 'P%d control_data = %s' %(myid, control_data)
+    else:
+        stage = domain.get_quantity('stage')
+        
+        for i in range(samples):
+            if tri_ids[i] >= 0:
+                local_success = num.allclose(control_data[i], stage.centroid_values[tri_ids[i]])
+                success = success and local_success
+                if verbose and not local_success: 
+                    print 'P%d tri %d, control = %s, actual = %s, Success = %s' %(myid, i, control_data[i], stage.centroid_values[tri_ids[i]], local_success)
+                    sys.stdout.flush()
+                    
+                
+                
+        if inlet0 is not None:
+            inlet_master_proc = inlet0.inlet.get_master_proc()
+            average_stage = inlet0.inlet.get_global_average_stage()
+            average_xmom = inlet0.inlet.get_global_average_xmom()
+            average_ymom = inlet0.inlet.get_global_average_ymom()
+            average_volume = inlet0.inlet.get_global_total_water_volume()
+            average_depth = inlet0.inlet.get_global_average_depth()
+
+            if myid == inlet_master_proc:
+                if verbose: 
+                    print 'P%d average stage, control = %s, actual = %s' %(myid, control_data[samples], average_stage)
+
+                    print 'P%d average xmom, control = %s, actual = %s' %(myid, control_data[samples+1], average_xmom)
+
+                    print 'P%d average ymom, control = %s, actual = %s' %(myid, control_data[samples+2], average_ymom)
+
+                    print 'P%d average volume, control = %s, actual = %s' %(myid, control_data[samples+3], average_volume)
+
+                    print 'P%d average depth, control = %s, actual = %s' %(myid, control_data[samples+4], average_depth)
+
+
+        #assert(success)
+
+    return control_data
+
+
+if __name__=="__main__":
+    
+    test_points = []
+
+    if myid == 0:
+
+        for i in range(samples):
+            x = random.randrange(0,1000)/1000.0 * length
+            y = random.randrange(0,1000)/1000.0 * width
+            point = [x, y]
+            test_points.append(point)
+        
+        for i in range(1,numprocs):
+            pypar.send(test_points, i)
+    else:
+        test_points = pypar.receive(0)
+
+    print "Test Points::"
+    print test_points
+
+    if myid == 0:
+        control_data = run_test(parallel=False, test_points = test_points, verbose = True)
+        
+        for proc in range(1,numprocs):
+            pypar.send(control_data, proc)
+    else:
+        control_data = pypar.receive(0)
+
+    pypar.barrier()
+    run_test(parallel=True, control_data = control_data, test_points = test_points, verbose = True)
+
+
+finalize()
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_box_op_apron.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_box_op_apron.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_box_op_apron.py	(revision 9501)
@@ -0,0 +1,369 @@
+import os.path
+import sys
+
+from anuga.utilities.system_tools import get_pathname_from_package
+from anuga.geometry.polygon_function import Polygon_function
+        
+from anuga.abstract_2d_finite_volumes.mesh_factory import rectangular_cross
+from anuga.abstract_2d_finite_volumes.quantity import Quantity
+from anuga.abstract_2d_finite_volumes.util import file_function
+
+import anuga
+
+import warnings
+warnings.simplefilter("ignore")
+
+#------------------------------------------
+# Import pypar without the initial output
+#------------------------------------------
+class NullStream:
+    def write(self,text):
+        pass
+sys.stdout = NullStream()
+import pypar
+sys.stdout = sys.__stdout__
+
+
+from math import pi, pow, sqrt
+
+import numpy as num
+from anuga.parallel.parallel_inlet_operator import Parallel_Inlet_operator
+from anuga.parallel import distribute, myid, numprocs, finalize
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+
+from anuga.parallel.parallel_operator_factory import Inlet_operator, Boyd_box_operator
+
+import random
+import unittest
+
+
+"""
+
+This test exercises the parallel culvert and checks values
+"""
+verbose = False
+nprocs = 3
+    
+
+length = 40.
+width = 16.
+
+dx = dy = 4           # Resolution: Length of subdivisions on both axes
+
+#----------------------------------------------------------------------
+# Setup initial conditions
+#----------------------------------------------------------------------
+
+def topography(x, y):
+    """Set up a weir
+    
+    A culvert will connect either side
+    """
+    # General Slope of Topography
+    z=-x/1000
+    
+    N = len(x)
+    for i in range(N):
+
+       # Sloping Embankment Across Channel
+        if 5.0 < x[i] < 10.1:
+            # Cut Out Segment for Culvert face                
+            if  1.0+(x[i]-5.0)/5.0 <  y[i]  < 4.0 - (x[i]-5.0)/5.0: 
+               z[i]=z[i]
+            else:
+               z[i] +=  0.5*(x[i] -5.0)    # Sloping Segment  U/S Face
+        if 10.0 < x[i] < 12.1:
+           z[i] +=  2.5                    # Flat Crest of Embankment
+        if 12.0 < x[i] < 14.5:
+            # Cut Out Segment for Culvert face                
+            if  2.0-(x[i]-12.0)/2.5 <  y[i]  < 3.0 + (x[i]-12.0)/2.5:
+               z[i]=z[i]
+            else:
+               z[i] +=  2.5-1.0*(x[i] -12.0) # Sloping D/S Face
+                   
+        
+    return z
+
+#filename=os.path.join(path, 'example_rating_curve.csv')
+
+mod_path = get_pathname_from_package('anuga.parallel')
+line0 = [[10.0, 10.0], [30.0, 10.0]]
+#line0 = [[29.0, 10.0], [30.0, 10.0]]
+line1 = [[0.0, 10.0], [0.0, 15.0]]
+Q0 = file_function(os.path.join(mod_path,'data','test_hydrograph.tms'), quantities=['hydrograph'])
+Q1 = 5.0
+
+samples = 50
+
+def run_test(parallel = False, control_data = None, test_points = None, verbose = False):
+    success = True
+
+##-----------------------------------------------------------------------
+## Setup domain
+##-----------------------------------------------------------------------
+
+    points, vertices, boundary = rectangular_cross(int(length/dx),
+                                                   int(width/dy),
+                                                   len1=length, 
+                                                   len2=width)
+
+    domain = anuga.Domain(points, vertices, boundary)   
+    #domain.set_name()                 # Output name
+    domain.set_store(False)
+    domain.set_default_order(2)
+
+##-----------------------------------------------------------------------
+## Distribute domain
+##-----------------------------------------------------------------------
+
+    if parallel:
+        domain = distribute(domain)
+        #domain.dump_triangulation("frac_op_domain.png")
+    
+
+##-----------------------------------------------------------------------
+## Setup boundary conditions
+##-----------------------------------------------------------------------
+    
+    domain.set_quantity('elevation', topography) 
+    domain.set_quantity('friction', 0.01)         # Constant friction 
+    domain.set_quantity('stage',
+                        expression='elevation')   # Dry initial condition
+
+    
+    Bi = anuga.Dirichlet_boundary([5.0, 0.0, 0.0])
+    Br = anuga.Reflective_boundary(domain)              # Solid reflective wall
+    domain.set_boundary({'left': Br, 'right': Br, 'top': Br, 'bottom': Br})
+
+
+##-----------------------------------------------------------------------
+## Determine triangle index coinciding with test points
+##-----------------------------------------------------------------------
+
+    assert(test_points is not None)
+    assert(len(test_points) == samples)
+
+    tri_ids = []
+
+    for point in test_points:
+        try:
+            k = domain.get_triangle_containing_point(point)
+            if domain.tri_full_flag[k] == 1:
+                tri_ids.append(k)
+            else:
+                tri_ids.append(-1)            
+        except:
+            tri_ids.append(-2)
+
+    if verbose: print 'P%d has points = %s' %(myid, tri_ids)
+
+    if not parallel: control_data = []
+
+    ################ Define Fractional Operators ##########################
+
+    inlet0 = None
+    inlet1 = None
+    boyd_box0 = None
+    
+    inlet0 = Inlet_operator(domain, line0, Q0, verbose = False, label = 'Inlet_0')
+    inlet1 = Inlet_operator(domain, line1, Q1, verbose = False, label = 'Inlet_1')
+    
+    # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+    
+    boyd_box0 = Boyd_box_operator(domain,
+                                  end_points=[[9.0, 2.5],[19.0, 2.5]],
+                                  losses=1.5,
+                                  width=5.0,
+                                  apron=5.0,
+                                  use_momentum_jet=True,
+                                  use_velocity_head=False,
+                                  manning=0.013,
+                                  label='Boyd_Box_0',
+                                  verbose=False)
+        
+    #if inlet0 is not None and verbose: inlet0.print_statistics()
+    #if inlet1 is not None and verbose: inlet1.print_statistics()
+    
+    if boyd_box0 is not None and verbose:
+        print "++++", myid
+        boyd_box0.print_statistics()
+
+#    if parallel:
+#        factory = Parallel_operator_factory(domain, verbose = True)
+#
+#        inlet0 = factory.inlet_operator_factory(line0, Q0)
+#        inlet1 = factory.inlet_operator_factory(line1, Q1)
+#        
+#        boyd_box0 = factory.boyd_box_operator_factory(end_points=[[9.0, 2.5],[19.0, 2.5]],
+#                                          losses=1.5,
+#                                          width=1.5,
+#                                          apron=5.0,
+#                                          use_momentum_jet=True,
+#                                          use_velocity_head=False,
+#                                          manning=0.013,
+#                                          verbose=False)
+#
+#    else:
+#        inlet0 = Inlet_operator(domain, line0, Q0)
+#        inlet1 = Inlet_operator(domain, line1, Q1)
+#
+#        # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+#        boyd_box0 = Boyd_box_operator(domain,
+#                          end_points=[[9.0, 2.5],[19.0, 2.5]],
+#                          losses=1.5,
+#                          width=1.5,
+#                          apron=5.0,
+#                          use_momentum_jet=True,
+#                          use_velocity_head=False,
+#                          manning=0.013,
+#                          verbose=False)
+    
+    #######################################################################
+
+    ##-----------------------------------------------------------------------
+    ## Evolve system through time
+    ##-----------------------------------------------------------------------
+
+    for t in domain.evolve(yieldstep = 2.0, finaltime = 20.0):
+        if myid == 0 and verbose:
+            domain.write_time()
+
+        #print domain.volumetric_balance_statistics()
+    
+        stage = domain.get_quantity('stage')
+
+
+        if boyd_box0 is not None and verbose :
+            if myid == boyd_box0.master_proc:
+                print 'master_proc ',myid
+                boyd_box0.print_timestepping_statistics()
+ 
+        #for i in range(samples):
+        #    if tri_ids[i] >= 0:                
+        #        if verbose: print 'P%d tri %d, value = %s' %(myid, i, stage.centroid_values[tri_ids[i]])
+                    
+        sys.stdout.flush()
+ 
+        pass
+
+    domain.sww_merge(delete_old=True)
+    
+    success = True
+
+##-----------------------------------------------------------------------
+## Assign/Test Control data
+##-----------------------------------------------------------------------
+
+    if not parallel:
+        stage = domain.get_quantity('stage')
+
+        for i in range(samples):
+            assert(tri_ids[i] >= 0)
+            control_data.append(stage.centroid_values[tri_ids[i]])
+        
+        if inlet0 is not None:
+            control_data.append(inlet0.inlet.get_average_stage())
+            control_data.append(inlet0.inlet.get_average_xmom())
+            control_data.append(inlet0.inlet.get_average_ymom())
+            control_data.append(inlet0.inlet.get_total_water_volume())
+            control_data.append(inlet0.inlet.get_average_depth())
+
+        if verbose: print 'P%d control_data = %s' %(myid, control_data)
+    else:
+        stage = domain.get_quantity('stage')
+        
+        for i in range(samples):
+            if tri_ids[i] >= 0:
+                local_success = num.allclose(control_data[i], stage.centroid_values[tri_ids[i]])
+                success = success and local_success
+                if verbose: 
+                    print 'P%d tri %d, control = %s, actual = %s, Success = %s' %(myid, i, control_data[i], stage.centroid_values[tri_ids[i]], local_success) 
+                
+                
+        if inlet0 is not None:
+            inlet_master_proc = inlet0.inlet.get_master_proc()
+            average_stage = inlet0.inlet.get_global_average_stage()
+            average_xmom = inlet0.inlet.get_global_average_xmom()
+            average_ymom = inlet0.inlet.get_global_average_ymom()
+            average_volume = inlet0.inlet.get_global_total_water_volume()
+            average_depth = inlet0.inlet.get_global_average_depth()
+
+            if myid == inlet_master_proc:
+                if verbose: 
+                    print 'P%d average stage, control = %s, actual = %s' %(myid, control_data[samples], average_stage)
+
+                    print 'P%d average xmom, control = %s, actual = %s' %(myid, control_data[samples+1], average_xmom)
+
+                    print 'P%d average ymom, control = %s, actual = %s' %(myid, control_data[samples+2], average_ymom)
+
+                    print 'P%d average volume, control = %s, actual = %s' %(myid, control_data[samples+3], average_volume)
+
+                    print 'P%d average depth, control = %s, actual = %s' %(myid, control_data[samples+4], average_depth)
+
+
+        assert(success)
+
+    return control_data
+
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+
+
+class Test_parallel_boyd_box_apron(unittest.TestCase):
+    def test_parallel_operator(self):
+        
+
+        #print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_boyd_box_op_apron.py" % nprocs)
+        assert_(result == 0)
+
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1:
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_boyd_box_apron, 'test')
+        #print "Running for numproc = 1"
+        runner.run(suite)
+    else:
+        #print "Running for numproc > 1"
+        pypar.barrier()
+        test_points = []
+
+        if myid == 0:
+            if verbose: print 'PARALLEL START'
+            for i in range(samples):
+                x = random.randrange(0,1000)/1000.0 * length
+                y = random.randrange(0,1000)/1000.0 * width
+                point = [x, y]
+                test_points.append(point)
+
+            for i in range(1,numprocs):
+                pypar.send(test_points, i)
+        else:
+            test_points = pypar.receive(0)
+
+        if myid == 0:
+            control_data = run_test(parallel=False, test_points = test_points, verbose = verbose)
+
+            for proc in range(1,numprocs):
+                pypar.send(control_data, proc)
+        else:
+            control_data = pypar.receive(0)
+
+
+        pypar.barrier()
+        run_test(parallel=True, control_data = control_data, test_points = test_points, verbose = verbose)
+
+
+    finalize()
+    
+
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_box_operator.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_box_operator.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_box_operator.py	(revision 9501)
@@ -0,0 +1,372 @@
+import os.path
+import sys
+
+from anuga.utilities.system_tools import get_pathname_from_package
+from anuga.geometry.polygon_function import Polygon_function
+        
+from anuga.abstract_2d_finite_volumes.mesh_factory import rectangular_cross
+from anuga.abstract_2d_finite_volumes.quantity import Quantity
+from anuga.abstract_2d_finite_volumes.util import file_function
+
+import anuga
+
+import warnings
+warnings.simplefilter("ignore")
+
+#from anuga.structures.boyd_box_operator import Boyd_box_operator
+#from anuga.structures.inlet_operator import Inlet_operator
+                            
+#from anuga.culvert_flows.culvert_routines import boyd_generalised_culvert_model
+
+
+#------------------------------------------
+# Import pypar without the initial output
+#------------------------------------------
+class NullStream:
+    def write(self,text):
+        pass
+sys.stdout = NullStream()
+import pypar
+sys.stdout = sys.__stdout__
+
+
+from math import pi, pow, sqrt
+
+import numpy as num
+from anuga.parallel.parallel_inlet_operator import Parallel_Inlet_operator
+from anuga.parallel import distribute, myid, numprocs, finalize
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+
+from anuga.parallel.parallel_operator_factory import Inlet_operator, Boyd_box_operator
+
+import random
+import unittest
+
+
+"""
+
+This test exercises the parallel culvert and checks values
+"""
+verbose = False
+nprocs = 3
+    
+
+length = 40.
+width = 16.
+
+dx = dy = 4           # Resolution: Length of subdivisions on both axes
+
+#----------------------------------------------------------------------
+# Setup initial conditions
+#----------------------------------------------------------------------
+
+def topography(x, y):
+    """Set up a weir
+    
+    A culvert will connect either side
+    """
+    # General Slope of Topography
+    z=-x/1000
+    
+    N = len(x)
+    for i in range(N):
+
+       # Sloping Embankment Across Channel
+        if 5.0 < x[i] < 10.1:
+            # Cut Out Segment for Culvert face                
+            if  1.0+(x[i]-5.0)/5.0 <  y[i]  < 4.0 - (x[i]-5.0)/5.0: 
+               z[i]=z[i]
+            else:
+               z[i] +=  0.5*(x[i] -5.0)    # Sloping Segment  U/S Face
+        if 10.0 < x[i] < 12.1:
+           z[i] +=  2.5                    # Flat Crest of Embankment
+        if 12.0 < x[i] < 14.5:
+            # Cut Out Segment for Culvert face                
+            if  2.0-(x[i]-12.0)/2.5 <  y[i]  < 3.0 + (x[i]-12.0)/2.5:
+               z[i]=z[i]
+            else:
+               z[i] +=  2.5-1.0*(x[i] -12.0) # Sloping D/S Face
+                   
+        
+    return z
+
+#filename=os.path.join(path, 'example_rating_curve.csv')
+
+mod_path = get_pathname_from_package('anuga.parallel')
+
+line0 = [[10.0, 10.0], [30.0, 10.0]]
+#line0 = [[29.0, 10.0], [30.0, 10.0]]
+line1 = [[0.0, 10.0], [0.0, 15.0]]
+Q0 = file_function(os.path.join(mod_path,'data','test_hydrograph.tms'), quantities=['hydrograph'])
+Q1 = 5.0
+
+samples = 50
+
+def run_test(parallel = False, control_data = None, test_points = None, verbose = False):
+    success = True
+
+##-----------------------------------------------------------------------
+## Setup domain
+##-----------------------------------------------------------------------
+
+    points, vertices, boundary = rectangular_cross(int(length/dx),
+                                                   int(width/dy),
+                                                   len1=length, 
+                                                   len2=width)
+
+    domain = anuga.Domain(points, vertices, boundary)   
+    domain.set_store(False)
+    #domain.set_name('output_parallel_frac_op')                 # Output name
+    domain.set_default_order(2)
+
+##-----------------------------------------------------------------------
+## Distribute domain
+##-----------------------------------------------------------------------
+
+    if parallel:
+        domain = distribute(domain)
+        #domain.dump_triangulation("frac_op_domain.png")
+    
+
+##-----------------------------------------------------------------------
+## Setup boundary conditions
+##-----------------------------------------------------------------------
+    
+    domain.set_quantity('elevation', topography) 
+    domain.set_quantity('friction', 0.01)         # Constant friction 
+    domain.set_quantity('stage',
+                        expression='elevation')   # Dry initial condition
+
+    
+    Bi = anuga.Dirichlet_boundary([5.0, 0.0, 0.0])
+    Br = anuga.Reflective_boundary(domain)              # Solid reflective wall
+    domain.set_boundary({'left': Br, 'right': Br, 'top': Br, 'bottom': Br})
+
+
+##-----------------------------------------------------------------------
+## Determine triangle index coinciding with test points
+##-----------------------------------------------------------------------
+
+    assert(test_points is not None)
+    assert(len(test_points) == samples)
+
+    tri_ids = []
+
+    for point in test_points:
+        try:
+            k = domain.get_triangle_containing_point(point)
+            if domain.tri_full_flag[k] == 1:
+                tri_ids.append(k)
+            else:
+                tri_ids.append(-1)            
+        except:
+            tri_ids.append(-2)
+
+    if verbose: print 'P%d has points = %s' %(myid, tri_ids)
+
+    if not parallel: control_data = []
+
+    ################ Define Fractional Operators ##########################
+
+    inlet0 = None
+    inlet1 = None
+    boyd_box0 = None
+    
+    inlet0 = Inlet_operator(domain, line0, Q0, verbose = False, label = 'Inlet_0')
+    inlet1 = Inlet_operator(domain, line1, Q1, verbose = False, label = 'Inlet_1')
+    
+    # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+    
+    boyd_box0 = Boyd_box_operator(domain,
+                                  end_points=[[9.0, 2.5],[19.0, 2.5]],
+                                  losses=1.5,
+                                  width=5.0,
+                                  #apron=5.,
+                                  use_momentum_jet=True,
+                                  use_velocity_head=False,
+                                  manning=0.013,
+                                  label='Boyd_Box_0',
+                                  verbose=False)
+        
+    #if inlet0 is not None and verbose: inlet0.print_statistics()
+    #if inlet1 is not None and verbose: inlet1.print_statistics()
+    
+    if boyd_box0 is not None and verbose:
+        print "++++", myid
+        boyd_box0.print_statistics()
+
+#    if parallel:
+#        factory = Parallel_operator_factory(domain, verbose = True)
+#
+#        inlet0 = factory.inlet_operator_factory(line0, Q0)
+#        inlet1 = factory.inlet_operator_factory(line1, Q1)
+#        
+#        boyd_box0 = factory.boyd_box_operator_factory(end_points=[[9.0, 2.5],[19.0, 2.5]],
+#                                          losses=1.5,
+#                                          width=1.5,
+#                                          apron=5.0,
+#                                          use_momentum_jet=True,
+#                                          use_velocity_head=False,
+#                                          manning=0.013,
+#                                          verbose=False)
+#
+#    else:
+#        inlet0 = Inlet_operator(domain, line0, Q0)
+#        inlet1 = Inlet_operator(domain, line1, Q1)
+#
+#        # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+#        boyd_box0 = Boyd_box_operator(domain,
+#                          end_points=[[9.0, 2.5],[19.0, 2.5]],
+#                          losses=1.5,
+#                          width=1.5,
+#                          apron=5.0,
+#                          use_momentum_jet=True,
+#                          use_velocity_head=False,
+#                          manning=0.013,
+#                          verbose=False)
+    
+    #######################################################################
+
+    ##-----------------------------------------------------------------------
+    ## Evolve system through time
+    ##-----------------------------------------------------------------------
+
+    for t in domain.evolve(yieldstep = 2.0, finaltime = 20.0):
+        if myid == 0 and verbose:
+            domain.write_time()
+
+        #print domain.volumetric_balance_statistics()
+    
+        stage = domain.get_quantity('stage')
+
+
+        if boyd_box0 is not None and verbose :
+            if myid == boyd_box0.master_proc:
+                print 'master_proc ',myid
+                boyd_box0.print_timestepping_statistics()
+ 
+        #for i in range(samples):
+        #    if tri_ids[i] >= 0:                
+        #        if verbose: print 'P%d tri %d, value = %s' %(myid, i, stage.centroid_values[tri_ids[i]])
+                    
+        sys.stdout.flush()
+ 
+        pass
+    
+    domain.sww_merge(delete_old=True)
+
+    success = True
+
+##-----------------------------------------------------------------------
+## Assign/Test Control data
+##-----------------------------------------------------------------------
+
+    if not parallel:
+        stage = domain.get_quantity('stage')
+
+        for i in range(samples):
+            assert(tri_ids[i] >= 0)
+            control_data.append(stage.centroid_values[tri_ids[i]])
+        
+        if inlet0 is not None:
+            control_data.append(inlet0.inlet.get_average_stage())
+            control_data.append(inlet0.inlet.get_average_xmom())
+            control_data.append(inlet0.inlet.get_average_ymom())
+            control_data.append(inlet0.inlet.get_total_water_volume())
+            control_data.append(inlet0.inlet.get_average_depth())
+
+        if verbose: print 'P%d control_data = %s' %(myid, control_data)
+    else:
+        stage = domain.get_quantity('stage')
+        
+        for i in range(samples):
+            if tri_ids[i] >= 0:
+                local_success = num.allclose(control_data[i], stage.centroid_values[tri_ids[i]])
+                success = success and local_success
+                if verbose: 
+                    print 'P%d tri %d, control = %s, actual = %s, Success = %s' %(myid, i, control_data[i], stage.centroid_values[tri_ids[i]], local_success) 
+                
+                
+        if inlet0 is not None:
+            inlet_master_proc = inlet0.inlet.get_master_proc()
+            average_stage = inlet0.inlet.get_global_average_stage()
+            average_xmom = inlet0.inlet.get_global_average_xmom()
+            average_ymom = inlet0.inlet.get_global_average_ymom()
+            average_volume = inlet0.inlet.get_global_total_water_volume()
+            average_depth = inlet0.inlet.get_global_average_depth()
+
+            if myid == inlet_master_proc:
+                if verbose: 
+                    print 'P%d average stage, control = %s, actual = %s' %(myid, control_data[samples], average_stage)
+
+                    print 'P%d average xmom, control = %s, actual = %s' %(myid, control_data[samples+1], average_xmom)
+
+                    print 'P%d average ymom, control = %s, actual = %s' %(myid, control_data[samples+2], average_ymom)
+
+                    print 'P%d average volume, control = %s, actual = %s' %(myid, control_data[samples+3], average_volume)
+
+                    print 'P%d average depth, control = %s, actual = %s' %(myid, control_data[samples+4], average_depth)
+
+
+        assert(success)
+
+    return control_data
+
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_boyd_box_operator(unittest.TestCase):
+    def test_parallel_operator(self):
+        #print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_boyd_box_operator.py" % nprocs)
+        assert_(result == 0)
+
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1:
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_boyd_box_operator, 'test')
+        #print "Running for numproc = 1"
+        runner.run(suite)
+    else:
+        #print "Running for numproc > 1"
+        pypar.barrier()
+        test_points = []
+
+        if myid == 0:
+            if verbose: print 'PARALLEL START'
+            for i in range(samples):
+                x = random.randrange(0,1000)/1000.0 * length
+                y = random.randrange(0,1000)/1000.0 * width
+                point = [x, y]
+                test_points.append(point)
+
+            for i in range(1,numprocs):
+                pypar.send(test_points, i)
+        else:
+            test_points = pypar.receive(0)
+
+        if myid == 0:
+            control_data = run_test(parallel=False, test_points = test_points, verbose = verbose)
+
+            for proc in range(1,numprocs):
+                pypar.send(control_data, proc)
+        else:
+            control_data = pypar.receive(0)
+
+
+        pypar.barrier()
+        run_test(parallel=True, control_data = control_data, test_points = test_points, verbose = verbose)
+
+
+    finalize()
+    
+
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_pipe_operator.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_pipe_operator.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_boyd_pipe_operator.py	(revision 9501)
@@ -0,0 +1,359 @@
+import os.path
+import sys
+
+from anuga.utilities.system_tools import get_pathname_from_package
+from anuga.geometry.polygon_function import Polygon_function
+        
+from anuga.abstract_2d_finite_volumes.mesh_factory import rectangular_cross
+from anuga.abstract_2d_finite_volumes.quantity import Quantity
+from anuga.abstract_2d_finite_volumes.util import file_function
+
+import anuga
+
+#------------------------------------------
+# Import pypar without the initial output
+#------------------------------------------
+class NullStream:
+    def write(self,text):
+        pass
+sys.stdout = NullStream()
+import pypar
+sys.stdout = sys.__stdout__
+
+
+from math import pi, pow, sqrt
+
+import numpy as num
+
+#from parallel_inlet_operator import Parallel_Inlet_operator
+
+from anuga.parallel import distribute, myid, numprocs, finalize
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+
+from anuga.parallel.parallel_operator_factory import Inlet_operator
+from anuga.parallel.parallel_operator_factory import Boyd_pipe_operator
+
+import random
+import unittest
+
+
+"""
+
+This test exercises the parallel culvert and checks values
+"""
+verbose = False
+nprocs = 3
+    
+
+length = 40.
+width = 16.
+
+dx = dy = 2           # Resolution: Length of subdivisions on both axes
+
+#----------------------------------------------------------------------
+# Setup initial conditions
+#----------------------------------------------------------------------
+
+def topography(x, y):
+    """Set up a weir
+    
+    A culvert will connect either side
+    """
+    # General Slope of Topography
+    z=-x/1000
+    
+    N = len(x)
+    for i in range(N):
+
+       # Sloping Embankment Across Channel
+        if 5.0 < x[i] < 10.1:
+            # Cut Out Segment for Culvert face                
+            if  1.0+(x[i]-5.0)/5.0 <  y[i]  < 4.0 - (x[i]-5.0)/5.0: 
+               z[i]=z[i]
+            else:
+               z[i] +=  0.5*(x[i] -5.0)    # Sloping Segment  U/S Face
+        if 10.0 < x[i] < 12.1:
+           z[i] +=  2.5                    # Flat Crest of Embankment
+        if 12.0 < x[i] < 14.5:
+            # Cut Out Segment for Culvert face                
+            if  2.0-(x[i]-12.0)/2.5 <  y[i]  < 3.0 + (x[i]-12.0)/2.5:
+               z[i]=z[i]
+            else:
+               z[i] +=  2.5-1.0*(x[i] -12.0) # Sloping D/S Face
+                   
+        
+    return z
+
+#filename=os.path.join(path, 'example_rating_curve.csv')
+
+mod_path = get_pathname_from_package('anuga.parallel')
+
+line0 = [[10.0, 10.0], [30.0, 10.0]]
+#line0 = [[29.0, 10.0], [30.0, 10.0]]
+line1 = [[0.0, 10.0], [0.0, 15.0]]
+Q0 = file_function(os.path.join(mod_path,'data','test_hydrograph.tms'), quantities=['hydrograph'])
+Q1 = 5.0
+
+samples = 50
+
+def run_test(parallel = False, control_data = None, test_points = None, verbose = False):
+    success = True
+
+##-----------------------------------------------------------------------
+## Setup domain
+##-----------------------------------------------------------------------
+
+    points, vertices, boundary = rectangular_cross(int(length/dx),
+                                                   int(width/dy),
+                                                   len1=length, 
+                                                   len2=width)
+
+    domain = anuga.Domain(points, vertices, boundary)   
+    #domain.set_name('output_parallel_boyd_pipe_op')                 # Output name
+    domain.set_store(False)
+    domain.set_default_order(2)
+
+##-----------------------------------------------------------------------
+## Distribute domain
+##-----------------------------------------------------------------------
+
+    if parallel:
+        domain = distribute(domain)
+        #domain.dump_triangulation("boyd_pipe_domain.png")
+    
+
+##-----------------------------------------------------------------------
+## Setup boundary conditions
+##-----------------------------------------------------------------------
+    
+    domain.set_quantity('elevation', topography) 
+    domain.set_quantity('friction', 0.01)         # Constant friction 
+    domain.set_quantity('stage',
+                        expression='elevation')   # Dry initial condition
+
+    
+    Bi = anuga.Dirichlet_boundary([5.0, 0.0, 0.0])
+    Br = anuga.Reflective_boundary(domain)              # Solid reflective wall
+    domain.set_boundary({'left': Br, 'right': Br, 'top': Br, 'bottom': Br})
+
+
+##-----------------------------------------------------------------------
+## Determine triangle index coinciding with test points
+##-----------------------------------------------------------------------
+
+    assert(test_points is not None)
+    assert(len(test_points) == samples)
+
+    tri_ids = []
+
+    for point in test_points:
+        try:
+            k = domain.get_triangle_containing_point(point)
+            if domain.tri_full_flag[k] == 1:
+                tri_ids.append(k)
+            else:
+                tri_ids.append(-1)            
+        except:
+            tri_ids.append(-2)
+
+    if verbose: print 'P%d has points = %s' %(myid, tri_ids)
+
+    if not parallel: control_data = []
+
+    ################ Define Fractional Operators ##########################
+
+    inlet0 = None
+    inlet1 = None
+    boyd_pipe0 = None
+    
+    inlet0 = Inlet_operator(domain, line0, Q0, verbose = False)
+    inlet1 = Inlet_operator(domain, line1, Q1, verbose = False)
+    
+    # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+    
+    boyd_pipe0 = Boyd_pipe_operator(domain,
+                                  end_points=[[9.0, 2.5],[19.0, 2.5]],
+                                  losses=1.5,
+                                  diameter=5.0,
+                                  apron=5.0,
+                                  use_momentum_jet=True,
+                                  use_velocity_head=False,
+                                  manning=0.013,
+                                  verbose=False)
+        
+    if inlet0 is not None and verbose: inlet0.print_statistics()
+    if inlet1 is not None and verbose: inlet1.print_statistics()
+    if boyd_pipe0 is not None and verbose: boyd_pipe0.print_statistics()
+
+#    if parallel:
+#        factory = Parallel_operator_factory(domain, verbose = True)
+#
+#        inlet0 = factory.inlet_operator_factory(line0, Q0)
+#        inlet1 = factory.inlet_operator_factory(line1, Q1)
+#        
+#        boyd_box0 = factory.boyd_box_operator_factory(end_points=[[9.0, 2.5],[19.0, 2.5]],
+#                                          losses=1.5,
+#                                          width=1.5,
+#                                          apron=5.0,
+#                                          use_momentum_jet=True,
+#                                          use_velocity_head=False,
+#                                          manning=0.013,
+#                                          verbose=False)
+#
+#    else:
+#        inlet0 = Inlet_operator(domain, line0, Q0)
+#        inlet1 = Inlet_operator(domain, line1, Q1)
+#
+#        # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+#        boyd_box0 = Boyd_box_operator(domain,
+#                          end_points=[[9.0, 2.5],[19.0, 2.5]],
+#                          losses=1.5,
+#                          width=1.5,
+#                          apron=5.0,
+#                          use_momentum_jet=True,
+#                          use_velocity_head=False,
+#                          manning=0.013,
+#                          verbose=False)
+    
+    #######################################################################
+
+    ##-----------------------------------------------------------------------
+    ## Evolve system through time
+    ##-----------------------------------------------------------------------
+
+    for t in domain.evolve(yieldstep = 2.0, finaltime = 20.0):
+        if myid == 0 and verbose:
+            domain.write_time()
+
+        #print domain.volumetric_balance_statistics()
+    
+        stage = domain.get_quantity('stage')
+
+
+        if boyd_pipe0 is not None and verbose : boyd_pipe0.print_timestepping_statistics()
+ 
+        #for i in range(samples):
+        #    if tri_ids[i] >= 0:                
+        #        if verbose: print 'P%d tri %d, value = %s' %(myid, i, stage.centroid_values[tri_ids[i]])
+                    
+        sys.stdout.flush()
+ 
+        pass
+
+    success = True
+
+##-----------------------------------------------------------------------
+## Assign/Test Control data
+##-----------------------------------------------------------------------
+
+    if not parallel:
+        stage = domain.get_quantity('stage')
+
+        for i in range(samples):
+            assert(tri_ids[i] >= 0)
+            control_data.append(stage.centroid_values[tri_ids[i]])
+        
+        if inlet0 is not None:
+            control_data.append(inlet0.inlet.get_average_stage())
+            control_data.append(inlet0.inlet.get_average_xmom())
+            control_data.append(inlet0.inlet.get_average_ymom())
+            control_data.append(inlet0.inlet.get_total_water_volume())
+            control_data.append(inlet0.inlet.get_average_depth())
+
+        if verbose: print 'P%d control_data = %s' %(myid, control_data)
+    else:
+        stage = domain.get_quantity('stage')
+        
+        for i in range(samples):
+            if tri_ids[i] >= 0:
+                local_success = num.allclose(control_data[i], stage.centroid_values[tri_ids[i]])
+                success = success and local_success
+                if verbose: 
+                    print 'P%d tri %d, control = %s, actual = %s, Success = %s' %(myid, i, control_data[i], stage.centroid_values[tri_ids[i]], local_success) 
+                
+                
+        if inlet0 is not None:
+            inlet_master_proc = inlet0.inlet.get_master_proc()
+            average_stage = inlet0.inlet.get_global_average_stage()
+            average_xmom = inlet0.inlet.get_global_average_xmom()
+            average_ymom = inlet0.inlet.get_global_average_ymom()
+            average_volume = inlet0.inlet.get_global_total_water_volume()
+            average_depth = inlet0.inlet.get_global_average_depth()
+
+            if myid == inlet_master_proc:
+                if verbose: 
+                    print 'P%d average stage, control = %s, actual = %s' %(myid, control_data[samples], average_stage)
+
+                    print 'P%d average xmom, control = %s, actual = %s' %(myid, control_data[samples+1], average_xmom)
+
+                    print 'P%d average ymom, control = %s, actual = %s' %(myid, control_data[samples+2], average_ymom)
+
+                    print 'P%d average volume, control = %s, actual = %s' %(myid, control_data[samples+3], average_volume)
+
+                    print 'P%d average depth, control = %s, actual = %s' %(myid, control_data[samples+4], average_depth)
+
+
+        assert(success)
+
+    if parallel:
+        finalize()
+
+    return control_data
+
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_boyd_pipe_op(unittest.TestCase):
+    def test_parallel_operator(self):
+        #print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_boyd_pipe_operator.py" % nprocs)
+        assert_(result == 0)
+
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1:
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_boyd_pipe_op, 'test')
+        #print "Running for numproc = 1"
+        runner.run(suite)
+    else:
+        #print "Running for numproc > 1"
+        pypar.barrier()
+        test_points = []
+
+        if myid == 0:
+            if verbose: print 'PARALLEL START'
+            for i in range(samples):
+                x = random.randrange(0,1000)/1000.0 * length
+                y = random.randrange(0,1000)/1000.0 * width
+                point = [x, y]
+                test_points.append(point)
+
+            for i in range(1,numprocs):
+                pypar.send(test_points, i)
+        else:
+            test_points = pypar.receive(0)
+
+        if myid == 0:
+            control_data = run_test(parallel=False, test_points = test_points, verbose = verbose)
+
+            for proc in range(1,numprocs):
+                pypar.send(control_data, proc)
+        else:
+            control_data = pypar.receive(0)
+
+
+        pypar.barrier()
+        run_test(parallel=True, control_data = control_data, test_points = test_points, verbose = verbose)
+
+
+    
+
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_distribute_domain.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_distribute_domain.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_distribute_domain.py	(revision 9501)
@@ -0,0 +1,240 @@
+
+"""Test a run of the sequential shallow water domain against
+a run of the parallel shallow water domain.
+
+WARNING: This assumes that the command to run jobs is mpirun.
+Tested with MPICH and LAM (Ole)
+"""
+
+#------------------------------------------------------------------------------
+# Import necessary modules
+#------------------------------------------------------------------------------
+
+import unittest
+import os
+import sys
+
+from anuga.utilities.system_tools import get_pathname_from_package
+
+import numpy as num
+
+#------------------------------------------
+# Import pypar without the initial output
+#------------------------------------------
+class NullStream:
+    def write(self,text):
+        pass
+sys.stdout = NullStream()
+import pypar
+sys.stdout = sys.__stdout__
+
+
+#------------------------------------------
+# anuga imports
+#------------------------------------------
+
+from anuga.utilities.numerical_tools import ensure_numeric
+from anuga.utilities.util_ext        import double_precision
+from anuga.utilities.norms           import l1_norm, l2_norm, linf_norm
+
+from anuga import Domain
+from anuga import Reflective_boundary
+from anuga import Dirichlet_boundary
+from anuga import Time_boundary
+from anuga import Transmissive_boundary
+
+from anuga import rectangular_cross
+from anuga import create_domain_from_file
+
+
+from anuga.parallel import distribute, myid, numprocs, finalize
+
+
+#--------------------------------------------------------------------------
+# Setup parameters
+#--------------------------------------------------------------------------
+
+mod_path = get_pathname_from_package('anuga.parallel')
+
+mesh_filename = os.path.join(mod_path,'data','merimbula_10785_1.tsh')
+#mesh_filename = os.path.join(mod_path,'data','test-100.tsh')
+yieldstep = 1
+finaltime = 20
+quantity = 'stage'
+nprocs = 4
+verbose = False
+
+#--------------------------------------------------------------------------
+# Setup procedures
+#--------------------------------------------------------------------------
+class Set_Stage:
+    """Set an initial condition with constant water height, for x<x0
+    """
+
+    def __init__(self, x0=0.25, x1=0.5, h=1.0):
+        self.x0 = x0
+        self.x1 = x1
+        self.h  = h
+
+    def __call__(self, x, y):
+        return self.h*((x>self.x0)&(x<self.x1))
+
+#--------------------------------------------------------------------------
+# Setup test
+#--------------------------------------------------------------------------
+def evolution_test(parallel=False):
+
+
+    domain = create_domain_from_file(mesh_filename)
+    domain.set_quantity('stage', Set_Stage(756000.0, 756500.0, 2.0))
+
+    #--------------------------------------------------------------------------
+    # Create parallel domain if requested
+    #--------------------------------------------------------------------------
+
+    if parallel:
+        if myid == 0 and verbose: print 'DISTRIBUTING PARALLEL DOMAIN'
+        domain = distribute(domain)
+
+    #------------------------------------------------------------------------------
+    # Setup boundary conditions
+    # This must currently happen *after* domain has been distributed
+    #------------------------------------------------------------------------------
+    domain.store = False
+    Br = Reflective_boundary(domain)      # Solid reflective wall
+
+    domain.set_boundary({'outflow' :Br, 'inflow' :Br, 'inner' :Br, 'exterior' :Br, 'open' :Br})
+
+    #------------------------------------------------------------------------------
+    # Setup diagnostic arrays
+    #------------------------------------------------------------------------------
+    l1list = []
+    l2list = []
+    linflist = []
+    l1norm = num.zeros(3, num.float)
+    l2norm = num.zeros(3, num.float)
+    linfnorm = num.zeros(3, num.float)
+    recv_norm = num.zeros(3, num.float)
+
+    #------------------------------------------------------------------------------
+    # Evolution
+    #------------------------------------------------------------------------------
+    if parallel:
+        if myid == 0 and verbose: print 'PARALLEL EVOLVE'
+    else:
+        if verbose: print 'SEQUENTIAL EVOLVE'
+        
+    for t in domain.evolve(yieldstep = yieldstep, finaltime = finaltime):
+        edges = domain.quantities[quantity].edge_values.take(num.flatnonzero(domain.tri_full_flag),axis=0)
+        l1norm[0] = l1_norm(edges[:,0])
+        l1norm[1] = l1_norm(edges[:,1])
+        l1norm[2] = l1_norm(edges[:,2])
+        l2norm[0] = l2_norm(edges[:,0])
+        l2norm[1] = l2_norm(edges[:,1])
+        l2norm[2] = l2_norm(edges[:,2])
+        linfnorm[0] = linf_norm(edges[:,0])
+        linfnorm[1] = linf_norm(edges[:,1])
+        linfnorm[2] = linf_norm(edges[:,2])
+        if parallel:
+            l2norm[0] = pow(l2norm[0], 2)
+            l2norm[1] = pow(l2norm[1], 2)
+            l2norm[2] = pow(l2norm[2], 2)
+            if myid == 0:
+                #domain.write_time()
+
+                #print edges[:,1]            
+                for p in range(1, numprocs):
+                    recv_norm = pypar.receive(p)
+                    l1norm += recv_norm
+                    recv_norm = pypar.receive(p)
+                    l2norm += recv_norm
+                    recv_norm = pypar.receive(p)
+                    linfnorm[0] = max(linfnorm[0], recv_norm[0])
+                    linfnorm[1] = max(linfnorm[1], recv_norm[1])
+                    linfnorm[2] = max(linfnorm[2], recv_norm[2])
+
+                l2norm[0] = pow(l2norm[0], 0.5)
+                l2norm[1] = pow(l2norm[1], 0.5)
+                l2norm[2] = pow(l2norm[2], 0.5)
+
+                l1list.append(l1norm)                
+                l2list.append(l2norm)
+                linflist.append(linfnorm)                
+            else:
+                pypar.send(l1norm, 0)
+                pypar.send(l2norm, 0)
+                pypar.send(linfnorm, 0)
+        else:
+            #domain.write_time()
+            l1list.append(l1norm)                
+            l2list.append(l2norm)
+            linflist.append(linfnorm)
+            
+
+    return (l1list, l2list, linflist)
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_distribute_domain(unittest.TestCase):
+    def test_parallel_distribute_domain(self):
+        #print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_distribute_domain.py" % nprocs)
+        assert_(result == 0)
+
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1: 
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_distribute_domain, 'test')
+        runner.run(suite)
+    else:
+
+        pypar.barrier()
+        if myid == 0:
+            if verbose: print 'SEQUENTIAL START'
+            l1norm_seq, l2norm_seq, linfnorm_seq = evolution_test(parallel=False)
+
+        pypar.barrier()
+        if myid ==0:
+            if verbose: print 'PARALLEL START'
+        
+        l1norm_par, l2norm_par, linfnorm_par = evolution_test(parallel=True)
+        
+        if myid == 0:
+            assert_(len(l1norm_seq) == len(l1norm_par))
+            assert_(len(l2norm_seq) == len(l2norm_par))
+            assert_(len(linfnorm_seq) == len(linfnorm_par))
+            assert_(len(l1norm_seq) == len(l2norm_seq))
+            assert_(len(l2norm_seq) == len(linfnorm_seq))
+            # Anything smaller than tol we consider to be 0.
+            # This usualy comes out to be 10^-14 (DBL_DIG = 10^-15)
+            # * 10 to cater for rounding error in computation.
+            tol = pow(10, -1 * (double_precision() - 1))
+            for x in range(len(l1norm_seq)):
+                for y in range(3):
+                    # Calculate relative difference in the norms
+                    assert_(abs(l1norm_seq[x][y] - l1norm_par[x][y])/l1norm_seq[x][y] < tol)
+                    assert_(abs(l2norm_seq[x][y] - l2norm_par[x][y])/l2norm_seq[x][y] < tol)
+                    assert_(abs(linfnorm_seq[x][y] - linfnorm_par[x][y])/linfnorm_seq[x][y] < tol)
+                    if x > 0:
+                        # Verify that the quantity is being conserved across iterations.
+                        assert_(abs(l1norm_seq[x][y] - l1norm_seq[x-1][y]) < tol)
+                        assert_(abs(l2norm_seq[x][y] - l2norm_seq[x-1][y]) < tol)
+                        assert_(abs(linfnorm_seq[x][y] - linfnorm_seq[x-1][y]) < tol)
+                        assert_(abs(l1norm_par[x][y] - l1norm_par[x-1][y]) < tol)
+                        assert_(abs(l2norm_par[x][y] - l2norm_par[x-1][y]) < tol)
+                        assert_(abs(linfnorm_par[x][y] - linfnorm_par[x-1][y]) < tol)
+                
+            if verbose: print 'Parallel test OK'
+
+
+
+    finalize()
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_distribute_mesh.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_distribute_mesh.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_distribute_mesh.py	(revision 9501)
@@ -0,0 +1,326 @@
+#!/usr/bin/env python
+
+import unittest
+import sys
+import os
+from math import sqrt
+
+	
+from anuga import Domain
+from anuga import rectangular_cross
+
+from anuga.parallel.distribute_mesh import pmesh_divide_metis
+from anuga.parallel.distribute_mesh import build_submesh
+from anuga.parallel.distribute_mesh import submesh_full, submesh_ghost, submesh_quantities
+from anuga.parallel.distribute_mesh import extract_submesh, rec_submesh, send_submesh
+
+from anuga.parallel import myid, numprocs, barrier, finalize
+
+import numpy as num
+
+
+def topography(x,y): 
+    return -x/2
+
+
+def xcoord(x,y):
+    return x
+
+def ycoord(x,y):
+    return y
+
+
+def distibute_three_processors():
+    """
+    Do a parallel test of distributing a rectangle onto 3 processors
+    """
+
+    import pypar
+
+    myid = pypar.rank()
+    numprocs = pypar.size()
+
+    if not numprocs == 3: return
+
+    #print numprocs
+
+    barrier()
+
+    if myid == 0:
+
+        points, vertices, boundary = rectangular_cross(2,2)
+
+        domain = Domain(points, vertices, boundary)
+
+
+        domain.set_quantity('elevation', topography) # Use function for elevation
+        domain.set_quantity('friction', 0.0)         # Constant friction 
+        domain.set_quantity('stage', expression='elevation') # Dry initial stage
+        domain.set_quantity('xmomentum', expression='friction + 2.0') # 
+        domain.set_quantity('ymomentum', ycoord) #
+
+        #----------------------------------------------------------------------------------
+        # Test pmesh_divide_metis
+        #----------------------------------------------------------------------------------
+        nodes, triangles, boundary, triangles_per_proc, quantities = pmesh_divide_metis(domain,numprocs)
+
+        assert_(num.allclose(nodes,points))
+
+        true_vertices = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]]
+
+        true_triangles = [[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8], [0, 9, 1], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 9, 0], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7]]
+
+        assert_(num.allclose(vertices,true_vertices))
+        assert_(num.allclose(triangles,true_triangles))
+
+        assert_(num.allclose(triangles_per_proc,[5,6,5]))
+
+
+        #----------------------------------------------------------------------------------
+        # Test build_submesh
+        #----------------------------------------------------------------------------------
+        submesh = build_submesh(nodes, triangles, boundary, quantities, triangles_per_proc)
+
+
+        assert_(num.allclose(submesh['full_nodes'][0],[[3.0, 0.5, 0.0], [4.0, 0.5, 0.5], [5.0, 0.5, 1.0], [7.0, 1.0, 0.5], [8.0, 1.0, 1.0], [9.0, 0.25, 0.25], [12.0, 0.75, 0.75]]))
+        assert_(num.allclose(submesh['full_nodes'][1],[[0.0, 0.0, 0.0], [1.0, 0.0, 0.5], [2.0, 0.0, 1.0], [4.0, 0.5, 0.5], [5.0, 0.5, 1.0], [9.0, 0.25, 0.25], [10.0, 0.25, 0.75]]))
+        assert_(num.allclose(submesh['full_nodes'][2],[[0.0, 0.0, 0.0], [3.0, 0.5, 0.0], [4.0, 0.5, 0.5], [6.0, 1.0, 0.0], [7.0, 1.0, 0.5], [9.0, 0.25, 0.25], [11.0, 0.75, 0.25]]))
+
+
+        assert_(num.allclose(submesh['ghost_nodes'][0],[[0.0, 0.0, 0.0], [1.0, 0.0, 0.5], [2.0, 0.0, 1.0], [6.0, 1.0, 0.0], [10.0, 0.25, 0.75], [11.0, 0.75, 0.25]]))
+        assert_(num.allclose(submesh['ghost_nodes'][1],[[3.0, 0.5, 0.0], [7.0, 1.0, 0.5], [8.0, 1.0, 1.0], [11.0, 0.75, 0.25], [12.0, 0.75, 0.75]]))
+        assert_(num.allclose(submesh['ghost_nodes'][2],[[1.0, 0.0, 0.5], [5.0, 0.5, 1.0], [8.0, 1.0, 1.0], [12.0, 0.75, 0.75]]))
+
+
+
+        true_full_triangles = [num.array([[ 4,  9,  3],
+                                          [ 4, 12,  5],
+                                          [ 7, 12,  4],
+                                          [ 8, 12,  7],
+                                          [ 5, 12,  8]]),
+                               num.array([[ 0,  9,  1],
+                                          [ 1,  9,  4],
+                                          [ 1, 10,  2],
+                                          [ 4, 10,  1],
+                                          [ 5, 10,  4],
+                                          [ 2, 10,  5]]),
+                               num.array([[ 3,  9,  0],
+                                          [ 3, 11,  4],
+                                          [ 6, 11,  3],
+                                          [ 7, 11,  6],
+                                          [ 4, 11,  7]])]
+
+
+        assert_(num.allclose(submesh['full_triangles'][0],true_full_triangles[0]))
+        assert_(num.allclose(submesh['full_triangles'][1],true_full_triangles[1]))
+        assert_(num.allclose(submesh['full_triangles'][2],true_full_triangles[2]))
+
+        true_ghost_triangles = [num.array([[ 5,  0,  9,  1],
+                                           [ 6,  1,  9,  4],
+                                           [ 8,  4, 10,  1],
+                                           [ 9,  5, 10,  4],
+                                           [10,  2, 10,  5],
+                                           [11,  3,  9,  0],
+                                           [12,  3, 11,  4],
+                                           [13,  6, 11,  3],
+                                           [14,  7, 11,  6],
+                                           [15,  4, 11,  7]]),
+                                num.array([[ 0,  4,  9,  3],
+                                           [ 1,  4, 12,  5],
+                                           [ 2,  7, 12,  4],
+                                           [ 4,  5, 12,  8],
+                                           [11,  3,  9,  0],
+                                           [12,  3, 11,  4]]),
+                                num.array([[ 0,  4,  9,  3],
+                                           [ 1,  4, 12,  5],
+                                           [ 2,  7, 12,  4],
+                                           [ 3,  8, 12,  7],
+                                           [ 5,  0,  9,  1],
+                                           [ 6,  1,  9,  4]])]
+
+
+
+        assert_(num.allclose(submesh['ghost_triangles'][0],true_ghost_triangles[0]))
+        assert_(num.allclose(submesh['ghost_triangles'][1],true_ghost_triangles[1]))
+        assert_(num.allclose(submesh['ghost_triangles'][2],true_ghost_triangles[2]))
+
+        true_full_commun = [{0: [1, 2], 1: [1, 2], 2: [1, 2], 3: [2], 4: [1]}, {5: [0, 2], 6: [0, 2], 7: [], 8: [0], 9: [0], 10: [0]}, {11: [0, 1], 12: [0, 1], 13: [0], 14: [0], 15: [0]}]
+
+        assert_(true_full_commun == submesh['full_commun'])
+
+
+        true_ghost_commun = [num.array([[ 5,  1],
+                                        [ 6,  1],
+                                        [ 8,  1],
+                                        [ 9,  1],
+                                        [10,  1],
+                                        [11,  2],
+                                        [12,  2],
+                                        [13,  2],
+                                        [14,  2],
+                                        [15,  2]]),
+                             num.array([[ 0,  0],
+                                        [ 1,  0],
+                                        [ 2,  0],
+                                        [ 4,  0],
+                                        [11,  2],
+                                        [12,  2]]),
+                             num.array([[0, 0],
+                                        [1, 0],
+                                        [2, 0],
+                                        [3, 0],
+                                        [5, 1],
+                                        [6, 1]])]
+
+        assert_(num.allclose(submesh['ghost_commun'][0],true_ghost_commun[0]))
+        assert_(num.allclose(submesh['ghost_commun'][1],true_ghost_commun[1]))
+        assert_(num.allclose(submesh['ghost_commun'][2],true_ghost_commun[2]))
+
+
+
+    barrier()
+    #--------------------------------
+    # Now do the comunnication part
+    #--------------------------------
+
+
+    if myid == 0:
+        #----------------------------------------------------------------------------------
+        # Test send_submesh
+        #----------------------------------------------------------------------------------
+        for p in range(1, numprocs):
+            send_submesh(submesh, triangles_per_proc, p, verbose=False)
+
+        #----------------------------------------------------------------------------------
+        # Test extract_submesh
+        #----------------------------------------------------------------------------------
+        points, vertices, boundary, quantities, \
+                ghost_recv_dict, full_send_dict, tri_map, node_map, tri_l2g, node_l2g, \
+                ghost_layer_width =\
+        extract_submesh(submesh, triangles_per_proc)
+
+
+        true_points =  [[0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.75, 0.75], [0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [1.0, 0.0], [0.25, 0.75], [0.75, 0.25]]
+
+        true_vertices = [[1, 5, 0], [1, 6, 2], [3, 6, 1], [4, 6, 3], [2, 6, 4], [7, 5, 8], [8, 5, 1], [1, 11, 8], [2, 11, 1], [9, 11, 2], [0, 5, 7], [0, 12, 1], [10, 12, 0], [3, 12, 10], [1, 12, 3]]
+
+
+        true_ghost_recv = {1: [num.array([5, 6, 7, 8, 9]), num.array([ 5,  6,  8,  9, 10])], 2: [num.array([10, 11, 12, 13, 14]), num.array([11, 12, 13, 14, 15])]}
+
+
+        true_full_send = {1: [num.array([0, 1, 2, 4]), num.array([0, 1, 2, 4])], 2: [num.array([0, 1, 2, 3]), num.array([0, 1, 2, 3])]}
+
+        assert_(num.allclose(ghost_layer_width,  2))
+        assert_(num.allclose(points,   true_points))
+        assert_(num.allclose(vertices, true_vertices))
+        assert_(num.allclose(ghost_recv_dict[1],true_ghost_recv[1]))
+        assert_(num.allclose(ghost_recv_dict[2],true_ghost_recv[2]))
+        assert_(num.allclose(full_send_dict[1],true_full_send[1]))
+        assert_(num.allclose(full_send_dict[2],true_full_send[2]))
+
+        #print triangles_per_proc
+
+    else:
+        #----------------------------------------------------------------------------------
+        # Test rec_submesh
+        #----------------------------------------------------------------------------------
+        points, vertices, boundary, quantities, \
+                ghost_recv_dict, full_send_dict, \
+                no_full_nodes, no_full_trigs, tri_map, node_map, tri_l2g, node_l2g, \
+                ghost_layer_width  = \
+                rec_submesh(0, verbose=False)    
+
+        if myid == 1:
+
+
+            true_points =  [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.5], [0.5, 1.0], [0.25, 0.25], [0.25, 0.75], [0.5, 0.0], [1.0, 0.5], [1.0, 1.0], [0.75, 0.25], [0.75, 0.75]] 
+
+            true_vertices =  [[0, 5, 1], [1, 5, 3], [1, 6, 2], [3, 6, 1], [4, 6, 3], [2, 6, 4], [3, 5, 7], [3, 11, 4], [8, 11, 3], [4, 11, 9], [7, 5, 0], [7, 10, 3]]
+
+            true_ghost_recv =  {0: [num.array([6, 7, 8, 9]), num.array([0, 1, 2, 4])], 2: [num.array([10, 11]), num.array([11, 12])]}
+
+            true_full_send =  {0: [num.array([0, 1, 3, 4, 5]), num.array([ 5,  6,  8,  9, 10])], 2: [num.array([0, 1]), num.array([5, 6])]}
+
+            true_tri_map  = num.array([ 6,  7,  8, -1,  9,  0, 1,  2,  3,  4,  5, 10, 11])
+
+            true_node_map = num.array([ 0,  1,  2,  7,  3,  4, -1,  8,  9,  5,  6, 10, 11])
+
+            assert_(num.allclose(ghost_layer_width,  2))
+            assert_(num.allclose(tri_map,   true_tri_map))
+            assert_(num.allclose(node_map,   true_node_map))
+            assert_(num.allclose(points,   true_points))
+            assert_(num.allclose(vertices, true_vertices))
+            assert_(num.allclose(ghost_recv_dict[0],true_ghost_recv[0]))
+            assert_(num.allclose(ghost_recv_dict[2],true_ghost_recv[2]))
+            assert_(num.allclose(full_send_dict[0],true_full_send[0]))
+            assert_(num.allclose(full_send_dict[2],true_full_send[2])) 
+
+
+        if myid == 2:
+
+            true_points =   [[0.0, 0.0], [0.5, 0.0], [0.5, 0.5], [1.0, 0.0], [1.0, 0.5], [0.25, 0.25], [0.75, 0.25], [0.0, 0.5], [0.5, 1.0], [1.0, 1.0], [0.75, 0.75]]
+
+            true_vertices =  [[1, 5, 0], [1, 6, 2], [3, 6, 1], [4, 6, 3], [2, 6, 4], [2, 5, 1], [2, 10, 8], [4, 10, 2], [9, 10, 4], [0, 5, 7], [7, 5, 2]]
+
+            true_ghost_recv =   {0: [num.array([5, 6, 7, 8]), num.array([0, 1, 2, 3])], 1: [num.array([ 9, 10]), num.array([5, 6])]}
+
+            true_full_send =   {0: [num.array([0, 1, 2, 3, 4]), num.array([11, 12, 13, 14, 15])], 1: [num.array([0, 1]), num.array([11, 12])]}
+
+            true_tri_map  = num.array([5, 6, 7, 8, -1, 9, 10, -1, -1, -1, -1, 0, 1, 2, 3, 4, -1])
+
+            true_node_map = num.array([ 0,  7, -1,  1,  2,  8 , 3,  4,  9,  5, -1,  6, 10])
+
+            assert_(num.allclose(ghost_layer_width,  2))
+            assert_(num.allclose(tri_map,   true_tri_map))
+            assert_(num.allclose(node_map,   true_node_map))
+            assert_(num.allclose(points,   true_points))
+            assert_(num.allclose(vertices, true_vertices))
+            assert_(num.allclose(ghost_recv_dict[0],true_ghost_recv[0]))
+            assert_(num.allclose(ghost_recv_dict[1],true_ghost_recv[1]))
+            assert_(num.allclose(full_send_dict[0],true_full_send[0]))
+            assert_(num.allclose(full_send_dict[1],true_full_send[1])) 
+
+
+
+
+
+
+###############################################################
+
+class Test_parallel_distribute_mesh(unittest.TestCase):
+
+    def test_distribute_three_processors(self):
+        # Expect this test to fail if not run from the parallel directory.
+        result = os.system("mpirun -np 3 python test_parallel_distribute_mesh.py")
+        assert_(result == 0)
+
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #import pypar
+        #pypar.finalize()
+        raise AssertionError, msg
+        #import sys
+        #sys.exit(1)
+    
+
+
+
+
+
+
+#-------------------------------------------------------------
+if __name__=="__main__":
+    if numprocs == 1: 
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_distribute_mesh, 'test')
+        runner.run(suite)
+    else:
+        distibute_three_processors()
+
+    finalize()
+        
+
+        
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_file_boundary.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_file_boundary.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_file_boundary.py	(revision 9501)
@@ -0,0 +1,505 @@
+
+"""Run parallel shallow water domain.
+
+   run using command like:
+
+   mpirun -np m python run_parallel_sw_merimbula.py
+
+   where m is the number of processors to be used.
+   
+   Will produce sww files with names domain_Pn_m.sww where m is number of processors and
+   n in [0, m-1] refers to specific processor that owned this part of the partitioned mesh.
+"""
+
+#------------------------------------------------------------------------------
+# Import necessary modules
+#------------------------------------------------------------------------------
+
+import os
+import sys
+import time
+import pypar
+import numpy as num
+import unittest
+import tempfile
+from struct import pack, unpack
+from anuga.file.netcdf import NetCDFFile
+import copy
+
+#------------------------
+# ANUGA Modules
+#------------------------
+from anuga.utilities.numerical_tools import ensure_numeric
+from anuga.utilities.util_ext        import double_precision
+from anuga.utilities.norms           import l1_norm, l2_norm, linf_norm
+	
+from anuga import Domain
+from anuga import Reflective_boundary
+from anuga import Dirichlet_boundary
+from anuga import Time_boundary
+from anuga import Transmissive_boundary
+from anuga import File_boundary
+
+from mux import WAVEHEIGHT_MUX2_LABEL, EAST_VELOCITY_MUX2_LABEL, \
+                NORTH_VELOCITY_MUX2_LABEL
+from mux import read_mux2_py
+from anuga.file_conversion.urs2sts import urs2sts
+from anuga.file.urs import Read_urs
+from anuga.file.sts import create_sts_boundary
+
+from anuga.utilities.numerical_tools import ensure_numeric
+from anuga.coordinate_transforms.redfearn import redfearn
+from anuga.coordinate_transforms.geo_reference import Geo_reference
+
+from anuga import rectangular_cross_domain
+from anuga.pmesh.mesh_interface import create_mesh_from_regions
+from anuga import create_domain_from_file
+
+from anuga.parallel import distribute, myid, numprocs, send, receive, barrier, finalize
+
+from anuga.file.test.test_mux import Test_Mux
+
+verbose = False
+
+
+class Test_urs2sts_parallel(Test_Mux):
+    """ A suite of tests to test urs2sts file conversion functions.
+        These tests are quite coarse-grained: converting a file
+        and checking that its headers and some of its contents
+        are correct.
+    """ 
+
+    def sequential_test_time_varying_file_boundary_sts(self):
+        """sequential_ltest_time_varying_file_boundary_sts_sequential(self):
+        Read correct points from ordering file and apply sts to boundary. The boundary is time varying. FIXME add to test_urs2sts.
+        """
+        lat_long_points=[[6.01,97.0],[6.02,97.0],[6.05,96.9],[6.0,97.0]]
+        bounding_polygon=[[6.0,97.0],[6.01,97.0],[6.02,97.0],
+                          [6.02,97.02],[6.00,97.02]]
+        tide = 3.0
+        time_step_count = 65
+        time_step = 2.
+        n=len(lat_long_points)
+        first_tstep=num.ones(n,num.int)
+        last_tstep=(time_step_count)*num.ones(n,num.int)
+        finaltime=num.float(time_step*(time_step_count-1))
+        yieldstep=num.float(time_step)
+        gauge_depth=20*num.ones(n,num.float)
+        ha=2*num.ones((n,time_step_count),num.float)
+        ua=10*num.ones((n,time_step_count),num.float)
+        va=-10*num.ones((n,time_step_count),num.float)
+
+        times=num.arange(0., num.float(time_step_count*time_step), time_step)
+        for i in range(n):
+            #ha[i]+=num.sin(times)
+            ha[i]+=times/finaltime
+
+
+
+        sts_file="test"
+        if myid==0:
+            base_name, files = self.write_mux2(lat_long_points,
+                                               time_step_count,
+                                               time_step,
+                                               first_tstep,
+                                               last_tstep,
+                                               depth=gauge_depth,
+                                               ha=ha,
+                                               ua=ua,
+                                               va=va)
+            # base name will not exist, but 3 other files are created
+
+            # Write order file
+            file_handle, order_base_name = tempfile.mkstemp("")
+            os.close(file_handle)
+            os.remove(order_base_name)
+            d=","
+            order_file=order_base_name+'order.txt'
+            fid=open(order_file,'w')
+        
+            # Write Header
+            header='index, longitude, latitude\n'
+            fid.write(header)
+            indices=[3,0,1]
+            for i in indices:
+                line=str(i)+d+str(lat_long_points[i][1])+d+\
+                    str(lat_long_points[i][0])+"\n"
+                fid.write(line)
+            fid.close()
+
+            urs2sts(base_name,
+                    basename_out=sts_file,
+                    ordering_filename=order_file,
+                    mean_stage=tide,
+                    verbose=verbose)
+            self.delete_mux(files)
+
+            assert(os.access(sts_file+'.sts', os.F_OK))
+
+            os.remove(order_file)
+
+        barrier()
+        boundary_polygon = create_sts_boundary(sts_file)
+
+        # Append the remaining part of the boundary polygon to be defined by
+        # the user
+        bounding_polygon_utm=[]
+        for point in bounding_polygon:
+            zone,easting,northing=redfearn(point[0],point[1])
+            bounding_polygon_utm.append([easting,northing])
+
+        boundary_polygon.append(bounding_polygon_utm[3])
+        boundary_polygon.append(bounding_polygon_utm[4])
+
+        assert num.allclose(bounding_polygon_utm,boundary_polygon)
+
+
+        extent_res=1000000
+        meshname = 'urs_test_mesh' + '.tsh'
+        interior_regions=None
+        boundary_tags={'ocean': [0,1], 'otherocean': [2,3,4]}
+        
+        # have to change boundary tags from last example because now bounding
+        # polygon starts in different place.
+        if myid==0:
+            create_mesh_from_regions(boundary_polygon,
+                                     boundary_tags=boundary_tags,
+                                     maximum_triangle_area=extent_res,
+                                     filename=meshname,
+                                     interior_regions=interior_regions,
+                                     verbose=verbose)
+
+        barrier()
+        
+        domain_fbound = Domain(meshname)
+        domain_fbound.set_quantities_to_be_stored(None)
+        domain_fbound.set_quantity('stage', tide)
+        if verbose: print "Creating file boundary condition"
+        Bf = File_boundary(sts_file+'.sts',
+                           domain_fbound,
+                           boundary_polygon=boundary_polygon)
+        Br = Reflective_boundary(domain_fbound)
+
+        domain_fbound.set_boundary({'ocean': Bf,'otherocean': Br})
+
+        temp_fbound=num.zeros(int(finaltime/yieldstep)+1,num.float)
+        if verbose: print "Evolving domain with file boundary condition"
+        for i, t in enumerate(domain_fbound.evolve(yieldstep=yieldstep,
+                                                   finaltime=finaltime, 
+                                                   skip_initial_step = False)):
+            temp_fbound[i]=domain_fbound.quantities['stage'].centroid_values[2]
+            if verbose: domain_fbound.write_time()
+            
+        
+        domain_drchlt = Domain(meshname)
+        domain_drchlt.set_quantities_to_be_stored(None)
+        domain_drchlt.set_starttime(time_step)
+        domain_drchlt.set_quantity('stage', tide)
+        Br = Reflective_boundary(domain_drchlt)
+        #Bd = Dirichlet_boundary([2.0+tide,220+10*tide,-220-10*tide])
+        Bd = Time_boundary(domain=domain_drchlt, f=lambda t: [2.0+t/finaltime+tide,220.+10.*tide+10.*t/finaltime,-220.-10.*tide-10.*t/finaltime])
+        #Bd = Time_boundary(domain=domain_drchlt,f=lambda t: [2.0+num.sin(t)+tide,10.*(2+20.+num.sin(t)+tide),-10.*(2+20.+num.sin(t)+tide)])
+        domain_drchlt.set_boundary({'ocean': Bd,'otherocean': Br})
+        temp_drchlt=num.zeros(int(finaltime/yieldstep)+1,num.float)
+        
+        for i, t in enumerate(domain_drchlt.evolve(yieldstep=yieldstep,
+                                                   finaltime=finaltime, 
+                                                   skip_initial_step = False)):
+            temp_drchlt[i]=domain_drchlt.quantities['stage'].centroid_values[2]
+            #domain_drchlt.write_time()
+        
+        #print domain_fbound.quantities['stage'].vertex_values
+        #print domain_drchlt.quantities['stage'].vertex_values
+                    
+        assert num.allclose(temp_fbound,temp_drchlt),temp_fbound-temp_drchlt
+
+        
+        assert num.allclose(domain_fbound.quantities['stage'].vertex_values,
+                            domain_drchlt.quantities['stage'].vertex_values)
+                        
+        assert num.allclose(domain_fbound.quantities['xmomentum'].vertex_values,
+                            domain_drchlt.quantities['xmomentum'].vertex_values)                        
+                        
+        assert num.allclose(domain_fbound.quantities['ymomentum'].vertex_values,
+                            domain_drchlt.quantities['ymomentum'].vertex_values)
+        
+        if not sys.platform == 'win32':
+            if myid==0: os.remove(sts_file+'.sts')
+        
+        if myid==0: os.remove(meshname)
+
+    def parallel_test_time_varying_file_boundary_sts(self):
+        """ parallel_test_time_varying_file_boundary_sts_sequential(self):
+            Read correct points from ordering file and apply sts to boundary. 
+            The boundary is time varying. Compares sequential result with 
+            distributed result found using anuga_parallel
+        """
+
+        #------------------------------------------------------------
+        # Define test variables
+        #------------------------------------------------------------
+        lat_long_points=[[6.01,97.0],[6.02,97.0],[6.05,96.9],[6.0,97.0]]
+        bounding_polygon=[[6.0,97.0],[6.01,97.0],[6.02,97.0],
+                          [6.02,97.02],[6.00,97.02]]
+        tide = 3.0
+        time_step_count = 65
+        time_step = 2
+        n=len(lat_long_points)
+        first_tstep=num.ones(n,num.int)
+        last_tstep=(time_step_count)*num.ones(n,num.int)
+        finaltime=num.float(time_step*(time_step_count-1))
+        yieldstep=num.float(time_step)
+        gauge_depth=20*num.ones(n,num.float)
+        ha=2*num.ones((n,time_step_count),num.float)
+        ua=10*num.ones((n,time_step_count),num.float)
+        va=-10*num.ones((n,time_step_count),num.float)
+
+        times=num.arange(0, time_step_count*time_step, time_step)
+        for i in range(n):
+            #ha[i]+=num.sin(times)
+            ha[i]+=times/finaltime
+
+        #------------------------------------------------------------
+        # Write mux data to file then convert to sts format
+        #------------------------------------------------------------
+        sts_file="test"
+        if myid==0:
+            base_name, files = self.write_mux2(lat_long_points,
+                                               time_step_count,
+                                               time_step,
+                                               first_tstep,
+                                               last_tstep,
+                                               depth=gauge_depth,
+                                               ha=ha,
+                                               ua=ua,
+                                               va=va)
+            # base name will not exist, but 3 other files are created
+
+            # Write order file
+            file_handle, order_base_name = tempfile.mkstemp("")
+            os.close(file_handle)
+            os.remove(order_base_name)
+            d=","
+            order_file=order_base_name+'order.txt'
+            fid=open(order_file,'w')
+        
+            # Write Header
+            header='index, longitude, latitude\n'
+            fid.write(header)
+            indices=[3,0,1]
+            for i in indices:
+                line=str(i)+d+str(lat_long_points[i][1])+d+\
+                    str(lat_long_points[i][0])+"\n"
+                fid.write(line)
+            fid.close()
+
+            urs2sts(base_name,
+                    basename_out=sts_file,
+                    ordering_filename=order_file,
+                    mean_stage=tide,
+                    verbose=verbose)
+            self.delete_mux(files)
+
+            assert(os.access(sts_file+'.sts', os.F_OK))
+
+            os.remove(order_file)
+
+        barrier()
+        #------------------------------------------------------------
+        # Define boundary_polygon on each processor. This polygon defines the
+        # urs boundary and lies on a portion of the bounding_polygon
+        #------------------------------------------------------------
+        boundary_polygon = create_sts_boundary(sts_file)
+
+        # Append the remaining part of the boundary polygon to be defined by
+        # the user
+        bounding_polygon_utm=[]
+        for point in bounding_polygon:
+            zone,easting,northing=redfearn(point[0],point[1])
+            bounding_polygon_utm.append([easting,northing])
+
+        boundary_polygon.append(bounding_polygon_utm[3])
+        boundary_polygon.append(bounding_polygon_utm[4])
+
+
+        assert num.allclose(bounding_polygon_utm,boundary_polygon)
+
+        extent_res=10000
+        meshname = 'urs_test_mesh' + '.tsh'
+        interior_regions=None
+        boundary_tags={'ocean': [0,1], 'otherocean': [2,3,4]}
+        
+        #------------------------------------------------------------
+        # Create mesh on the master processor and store in file. This file
+        # is read in by each slave processor when needed
+        #------------------------------------------------------------
+        if myid==0:
+            create_mesh_from_regions(boundary_polygon,
+                                     boundary_tags=boundary_tags,
+                                     maximum_triangle_area=extent_res,
+                                     filename=meshname,
+                                     interior_regions=interior_regions,
+                                     verbose=verbose)
+        
+
+            # barrier()
+            domain_fbound = Domain(meshname)
+            domain_fbound.set_quantities_to_be_stored(None)
+            domain_fbound.set_quantity('stage', tide)
+            # print domain_fbound.mesh.get_boundary_polygon()
+        else:
+            domain_fbound=None
+
+        barrier()
+        if ( verbose and myid == 0 ): 
+            print 'DISTRIBUTING PARALLEL DOMAIN'
+        domain_fbound = distribute(domain_fbound)
+
+        #--------------------------------------------------------------------
+        # Find which sub_domain in which the interpolation points are located 
+        #
+        # Sometimes the interpolation points sit exactly
+        # between two centroids, so in the parallel run we
+        # reset the interpolation points to the centroids
+        # found in the sequential run
+        #--------------------------------------------------------------------
+        interpolation_points = [[279000,664000], [280250,664130], 
+                                    [279280,665400], [280500,665000]]
+
+        interpolation_points=num.array(interpolation_points)
+
+        #if myid==0:
+        #    import pylab as P
+        #    boundary_polygon=num.array(boundary_polygon)
+        #    P.plot(boundary_polygon[:,0],boundary_polygon[:,1])
+        #    P.plot(interpolation_points[:,0],interpolation_points[:,1],'ko')
+        #    P.show()
+
+        fbound_gauge_values = []
+        fbound_proc_tri_ids = []
+        for i, point in enumerate(interpolation_points):
+            fbound_gauge_values.append([]) # Empty list for timeseries
+
+            try:
+                k = domain_fbound.get_triangle_containing_point(point)
+                if domain_fbound.tri_full_flag[k] == 1:
+                    fbound_proc_tri_ids.append(k)
+                else:
+                    fbound_proc_tri_ids.append(-1)            
+            except:
+                fbound_proc_tri_ids.append(-2)
+
+
+        if verbose: print 'P%d has points = %s' %(myid, fbound_proc_tri_ids)
+
+        #------------------------------------------------------------
+        # Set boundary conditions
+        #------------------------------------------------------------
+        Bf = File_boundary(sts_file+'.sts',
+                           domain_fbound,
+                           boundary_polygon=boundary_polygon)
+        Br = Reflective_boundary(domain_fbound)
+    
+        domain_fbound.set_boundary({'ocean': Bf,'otherocean': Br})
+
+        #------------------------------------------------------------
+        # Evolve the domain on each processor
+        #------------------------------------------------------------  
+        for i, t in enumerate(domain_fbound.evolve(yieldstep=yieldstep,
+                                                   finaltime=finaltime, 
+                                                   skip_initial_step = False)):
+
+            stage = domain_fbound.get_quantity('stage')
+            for i in range(4):
+                if fbound_proc_tri_ids[i] > -1:
+                    fbound_gauge_values[i].append(stage.centroid_values[fbound_proc_tri_ids[i]])
+        
+        #------------------------------------------------------------
+        # Create domain to be run sequntially on each processor
+        #------------------------------------------------------------
+        domain_drchlt = Domain(meshname)
+        domain_drchlt.set_quantities_to_be_stored(None)
+        domain_drchlt.set_starttime(time_step)
+        domain_drchlt.set_quantity('stage', tide)
+        Br = Reflective_boundary(domain_drchlt)
+        #Bd = Dirichlet_boundary([2.0+tide,220+10*tide,-220-10*tide])
+        Bd = Time_boundary(domain=domain_drchlt, function=lambda t: [2.0+t/finaltime+tide,220.+10.*tide+10.*t/finaltime,-220.-10.*tide-10.*t/finaltime])
+        #Bd = Time_boundary(domain=domain_drchlt,function=lambda t: [2.0+num.sin(t)+tide,10.*(2+20.+num.sin(t)+tide),-10.*(2+20.+num.sin(t)+tide)])
+        domain_drchlt.set_boundary({'ocean': Bd,'otherocean': Br})
+       
+        drchlt_gauge_values = []
+        drchlt_proc_tri_ids = []
+        for i, point in enumerate(interpolation_points):
+            drchlt_gauge_values.append([]) # Empty list for timeseries
+
+            try:
+                k = domain_drchlt.get_triangle_containing_point(point)
+                if domain_drchlt.tri_full_flag[k] == 1:
+                    drchlt_proc_tri_ids.append(k)
+                else:
+                    drchlt_proc_tri_ids.append(-1)            
+            except:
+                drchlt_proc_tri_ids.append(-2)
+
+
+        if verbose: print 'P%d has points = %s' %(myid, drchlt_proc_tri_ids)
+
+        #------------------------------------------------------------
+        # Evolve entire domain on each processor
+        #------------------------------------------------------------
+        for i, t in enumerate(domain_drchlt.evolve(yieldstep=yieldstep,
+                                                   finaltime=finaltime, 
+                                                   skip_initial_step = False)):
+
+            stage = domain_drchlt.get_quantity('stage')
+            for i in range(4):
+                drchlt_gauge_values[i].append(stage.centroid_values[drchlt_proc_tri_ids[i]])
+
+        #------------------------------------------------------------
+        # Compare sequential values with parallel values
+        #------------------------------------------------------------
+        barrier()
+        success = True
+        for i in range(4):
+            if fbound_proc_tri_ids[i] > -1:
+                fbound_gauge_values[i]=num.array(fbound_gauge_values[i])
+                drchlt_gauge_values[i]=num.array(drchlt_gauge_values[i])
+                #print i,fbound_gauge_values[i][4]
+                #print i,drchlt_gauge_values[i][4]
+                success = success and num.allclose(fbound_gauge_values[i], drchlt_gauge_values[i])
+                assert success#, (fbound_gauge_values[i]-drchlt_gauge_values[i])
+
+        #assert_(success)       
+
+        if not sys.platform == 'win32':
+            if myid==0: os.remove(sts_file+'.sts')
+        
+        if myid==0: os.remove(meshname)
+    
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+if __name__=="__main__":
+    #verbose=False
+    if myid ==0 and verbose: 
+        print 'PARALLEL START'
+    suite = unittest.makeSuite(Test_urs2sts_parallel,'parallel_test')
+    #suite = unittest.makeSuite(Test_urs2sts_parallel,'sequential_test')
+    runner = unittest.TextTestRunner()
+    runner.run(suite)
+
+    #------------------------------------------
+    # Run the code code and compare sequential
+    # results at 4 gauge stations
+    #------------------------------------------
+
+    
+    finalize()
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_frac_op.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_frac_op.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_frac_op.py	(revision 9501)
@@ -0,0 +1,342 @@
+import os.path
+import sys
+
+from anuga.utilities.system_tools import get_pathname_from_package
+from anuga.geometry.polygon_function import Polygon_function
+        
+from anuga.abstract_2d_finite_volumes.mesh_factory import rectangular_cross
+from anuga.abstract_2d_finite_volumes.quantity import Quantity
+from anuga.abstract_2d_finite_volumes.util import file_function
+
+import anuga
+
+import warnings
+warnings.simplefilter("ignore")
+
+
+#------------------------------------------
+# Import pypar without the initial output
+#------------------------------------------
+class NullStream:
+    def write(self,text):
+        pass
+sys.stdout = NullStream()
+import pypar
+sys.stdout = sys.__stdout__
+
+
+from math import pi, pow, sqrt
+
+import numpy as num
+from anuga.parallel.parallel_inlet_operator import Parallel_Inlet_operator
+from anuga.parallel import distribute, myid, numprocs, finalize
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+
+from anuga import Inlet_operator, Boyd_box_operator
+
+import random
+import unittest
+
+
+"""
+
+This test exercises the parallel culvert and checks values
+"""
+
+verbose = False
+nprocs = 3
+    
+
+length = 40.
+width = 16.
+
+dx = dy = 2           # Resolution: Length of subdivisions on both axes
+
+#----------------------------------------------------------------------
+# Setup initial conditions
+#----------------------------------------------------------------------
+
+def topography(x, y):
+    """Set up a weir
+    
+    A culvert will connect either side
+    """
+    # General Slope of Topography
+    z=-x/1000
+    
+    N = len(x)
+    for i in range(N):
+
+        # Sloping Embankment Across Channel
+        if 5.0 < x[i] < 10.1:
+            # Cut Out Segment for Culvert face                
+            if  1.0+(x[i]-5.0)/5.0 <  y[i]  < 4.0 - (x[i]-5.0)/5.0: 
+                z[i]=z[i]
+            else:
+                z[i] +=  0.5*(x[i] -5.0)    # Sloping Segment  U/S Face
+        if 10.0 < x[i] < 12.1:
+            z[i] +=  2.5                    # Flat Crest of Embankment
+        if 12.0 < x[i] < 14.5:
+            # Cut Out Segment for Culvert face                
+            if  2.0-(x[i]-12.0)/2.5 <  y[i]  < 3.0 + (x[i]-12.0)/2.5:
+                z[i]=z[i]
+            else:
+                z[i] +=  2.5-1.0*(x[i] -12.0) # Sloping D/S Face
+                   
+    return z
+
+#filename=os.path.join(path, 'example_rating_curve.csv')
+mod_path = get_pathname_from_package('anuga.parallel')
+
+line0 = [[10.0, 10.0], [30.0, 10.0]]
+#line0 = [[29.0, 10.0], [30.0, 10.0]]
+line1 = [[0.0, 10.0], [0.0, 15.0]]
+Q0 = file_function(os.path.join(mod_path,'data','test_hydrograph.tms'), quantities=['hydrograph'])
+Q1 = 5.0
+
+samples = 50
+
+def run_test(parallel = False, control_data = None, test_points = None, verbose = False):
+    success = True
+
+##-----------------------------------------------------------------------
+## Setup domain
+##-----------------------------------------------------------------------
+
+    points, vertices, boundary = rectangular_cross(int(length/dx),
+                                                   int(width/dy),
+                                                   len1=length, 
+                                                   len2=width)
+
+    domain = anuga.Domain(points, vertices, boundary)   
+    #domain.set_name('output_parallel_frac_op')                 # Output name
+    domain.set_store(False)
+    domain.set_default_order(2)
+
+##-----------------------------------------------------------------------
+## Distribute domain
+##-----------------------------------------------------------------------
+
+    if parallel:
+        domain = distribute(domain)
+        #domain.dump_triangulation("frac_op_domain.png")
+    
+
+##-----------------------------------------------------------------------
+## Setup boundary conditions
+##-----------------------------------------------------------------------
+    
+    domain.set_quantity('elevation', topography) 
+    domain.set_quantity('friction', 0.01)         # Constant friction 
+    domain.set_quantity('stage',
+                        expression='elevation')   # Dry initial condition
+
+    
+    Bi = anuga.Dirichlet_boundary([5.0, 0.0, 0.0])
+    Br = anuga.Reflective_boundary(domain)              # Solid reflective wall
+    domain.set_boundary({'left': Br, 'right': Br, 'top': Br, 'bottom': Br})
+
+
+##-----------------------------------------------------------------------
+## Determine triangle index coinciding with test points
+##-----------------------------------------------------------------------
+
+    assert(test_points is not None)
+    assert(len(test_points) == samples)
+
+    tri_ids = []
+
+    for point in test_points:
+        try:
+            k = domain.get_triangle_containing_point(point)
+            if domain.tri_full_flag[k] == 1:
+                tri_ids.append(k)
+            else:
+                tri_ids.append(-1)            
+        except:
+            tri_ids.append(-2)
+
+    if verbose: print 'P%d has points = %s' %(myid, tri_ids)
+
+    if not parallel: control_data = []
+
+    ################ Define Fractional Operators ##########################
+
+    inlet0 = None
+    inlet1 = None
+    boyd_box0 = None
+    
+    inlet0 = Inlet_operator(domain, line0, Q0, logging=False, description='inlet0', verbose = False)
+    inlet1 = Inlet_operator(domain, line1, Q1, logging=False, description='inlet1', verbose = False)
+    
+    # Enquiry point [ 19.    2.5] is contained in two domains in 4 proc case
+    
+    boyd_box0 = Boyd_box_operator(domain,
+                                  end_points=[[9.0, 2.5],[19.0, 2.5]],
+                                  losses=1.5,
+                                  width=5.0,
+                                  #apron=5.0,
+                                  use_momentum_jet=True,
+                                  use_velocity_head=False,
+                                  manning=0.013,
+                                  logging=False,
+                                  description='boyd_box_0',
+                                  verbose=False)
+        
+    if inlet0 is not None and verbose: inlet0.print_statistics()
+    if inlet1 is not None and verbose: inlet1.print_statistics()
+    if boyd_box0 is not None and verbose: boyd_box0.print_statistics()
+
+
+    ##-----------------------------------------------------------------------
+    ## Evolve system through time
+    ##-----------------------------------------------------------------------
+
+    for t in domain.evolve(yieldstep = 2.0, finaltime = 20.0):
+        if myid == 0 and verbose:
+            domain.write_time()
+
+        #print domain.volumetric_balance_statistics()
+    
+        stage = domain.get_quantity('stage')
+
+
+        if boyd_box0 is not None and verbose : boyd_box0.print_timestepping_statistics()
+ 
+        #for i in range(samples):
+        #    if tri_ids[i] >= 0:                
+        #        if verbose: print 'P%d tri %d, value = %s' %(myid, i, stage.centroid_values[tri_ids[i]])
+                    
+        sys.stdout.flush()
+ 
+        pass
+    
+    domain.sww_merge(delete_old=True)
+
+    success = True
+
+##-----------------------------------------------------------------------
+## Assign/Test Control data
+##-----------------------------------------------------------------------
+
+    if not parallel:
+        stage = domain.get_quantity('stage')
+
+        for i in range(samples):
+            assert(tri_ids[i] >= 0)
+            control_data.append(stage.centroid_values[tri_ids[i]])
+        
+        if inlet0 is not None:
+            control_data.append(inlet0.inlet.get_average_stage())
+            control_data.append(inlet0.inlet.get_average_xmom())
+            control_data.append(inlet0.inlet.get_average_ymom())
+            control_data.append(inlet0.inlet.get_total_water_volume())
+            control_data.append(inlet0.inlet.get_average_depth())
+
+        if verbose: print 'P%d control_data = %s' %(myid, control_data)
+    else:
+        stage = domain.get_quantity('stage')
+        
+        for i in range(samples):
+            if tri_ids[i] >= 0:
+                local_success = num.allclose(control_data[i], stage.centroid_values[tri_ids[i]])
+                success = success and local_success
+                if verbose: 
+                    print 'P%d tri %d, control = %s, actual = %s, Success = %s' %(myid, i, control_data[i], stage.centroid_values[tri_ids[i]], local_success) 
+                if not local_success:
+                    print 'Ouput P%d tri %d, control = %s, actual = %s, Success = %s' %(myid, i, control_data[i], stage.centroid_values[tri_ids[i]], local_success) 
+
+
+        #assert success        
+                
+        if inlet0 is not None:
+            inlet_master_proc = inlet0.inlet.get_master_proc()
+            average_stage = inlet0.inlet.get_global_average_stage()
+            average_xmom = inlet0.inlet.get_global_average_xmom()
+            average_ymom = inlet0.inlet.get_global_average_ymom()
+            average_volume = inlet0.inlet.get_global_total_water_volume()
+            average_depth = inlet0.inlet.get_global_average_depth()
+
+            if myid == inlet_master_proc:
+                if verbose: 
+                    print 'P%d average stage, control = %s, actual = %s' %(myid, control_data[samples], average_stage)
+
+                    print 'P%d average xmom, control = %s, actual = %s' %(myid, control_data[samples+1], average_xmom)
+
+                    print 'P%d average ymom, control = %s, actual = %s' %(myid, control_data[samples+2], average_ymom)
+
+                    print 'P%d average volume, control = %s, actual = %s' %(myid, control_data[samples+3], average_volume)
+
+                    print 'P%d average depth, control = %s, actual = %s' %(myid, control_data[samples+4], average_depth)
+
+
+        #assert(success)
+
+    return control_data, success
+
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_frac_op(unittest.TestCase):
+    def test_parallel_frac_op(self):
+        #print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_frac_op.py" % nprocs)
+        assert_(result == 0)
+
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+
+    if numprocs == 1:
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_frac_op, 'test')
+        #print "Running for numproc = 1"
+        runner.run(suite)
+    else:
+        #print "Running for numproc > 1"
+        pypar.barrier()
+        test_points = []
+
+        if myid == 0:
+            if verbose: print 'PARALLEL START'
+            random.seed(2)
+            for i in range(samples):
+                x = random.randrange(0,1000)/1000.0 * length
+                y = random.randrange(0,1000)/1000.0 * width
+                point = [x, y]
+                test_points.append(point)
+
+            for i in range(1,numprocs):
+                pypar.send(test_points, i)
+        else:
+            test_points = pypar.receive(0)
+
+        if myid == 0:
+            control_data, success  = run_test(parallel=False, test_points = test_points, verbose = verbose)
+
+            for proc in range(1,numprocs):
+                pypar.send(control_data, proc)
+        else:
+            control_data = pypar.receive(0)
+
+
+        pypar.barrier()
+        _, success = run_test(parallel=True, control_data = control_data, test_points = test_points, verbose = verbose)
+
+        sys.stdout.flush()
+
+        pypar.barrier()
+
+        msg = 'Discrepency between sequential and parallel runs on P%g' % myid
+        assert success, msg
+
+    finalize()
+    
+
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_inlet_operator.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_inlet_operator.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_inlet_operator.py	(revision 9501)
@@ -0,0 +1,322 @@
+import os.path
+import sys
+
+from anuga.utilities.system_tools import get_pathname_from_package
+from anuga.geometry.polygon_function import Polygon_function
+        
+from anuga.abstract_2d_finite_volumes.mesh_factory import rectangular_cross
+from anuga.abstract_2d_finite_volumes.quantity import Quantity
+from anuga.abstract_2d_finite_volumes.util import file_function
+
+import anuga
+
+#from anuga.structures.boyd_box_operator import Boyd_box_operator
+#from anuga.structures.inlet_operator import Inlet_operator
+                            
+#from anuga.culvert_flows.culvert_routines import boyd_generalised_culvert_model
+
+
+import warnings
+warnings.simplefilter('ignore')
+
+#------------------------------------------
+# Import pypar without the initial output
+#------------------------------------------
+class NullStream:
+    def write(self,text):
+        pass
+sys.stdout = NullStream()
+import pypar
+sys.stdout = sys.__stdout__
+
+
+from math import pi, pow, sqrt
+
+import numpy as num
+from anuga.parallel.parallel_inlet_operator import Parallel_Inlet_operator
+from anuga.parallel import distribute, myid, numprocs, finalize
+from anuga.geometry.polygon import inside_polygon, is_inside_polygon, line_intersect
+
+from anuga.parallel.parallel_operator_factory import Inlet_operator
+
+import random
+import unittest
+
+
+"""
+
+This test exercises the parallel culvert and checks values
+"""
+verbose = False
+nprocs = 3
+    
+
+length = 40.
+width = 16.
+
+dx = dy = 2.0          # Resolution: Length of subdivisions on both axes
+
+#----------------------------------------------------------------------
+# Setup initial conditions
+#----------------------------------------------------------------------
+
+def topography(x, y):
+    """Set up a weir
+    
+    A culvert will connect either side
+    """
+    # General Slope of Topography
+    z=-x/1000
+    
+    N = len(x)
+    for i in range(N):
+
+        # Sloping Embankment Across Channel
+        if 5.0 < x[i] < 10.1:
+            # Cut Out Segment for Culvert face                
+            if  1.0+(x[i]-5.0)/5.0 <  y[i]  < 4.0 - (x[i]-5.0)/5.0: 
+                z[i]=z[i]
+            else:
+                z[i] +=  0.5*(x[i] -5.0)    # Sloping Segment  U/S Face
+        if 10.0 < x[i] < 12.1:
+            z[i] +=  2.5                    # Flat Crest of Embankment
+        if 12.0 < x[i] < 14.5:
+            # Cut Out Segment for Culvert face                
+            if  2.0-(x[i]-12.0)/2.5 <  y[i]  < 3.0 + (x[i]-12.0)/2.5:
+                z[i]=z[i]
+            else:
+                z[i] +=  2.5-1.0*(x[i] -12.0) # Sloping D/S Face
+                   
+        
+    return z
+
+#filename=os.path.join(path, 'example_rating_curve.csv')
+
+mod_path = get_pathname_from_package('anuga.parallel')
+line0 = [[10.0, 10.0], [30.0, 10.0]]
+#line0 = [[29.0, 10.0], [30.0, 10.0]]
+line1 = [[0.0, 10.0], [0.0, 15.0]]
+Q0 = file_function(os.path.join(mod_path,'data','test_hydrograph.tms'), quantities=['hydrograph'])
+Q1 = 5.0
+
+samples = 50
+
+def run_test(parallel = False, control_data = None, test_points = None, verbose = False):
+    success = True
+
+    ##-----------------------------------------------------------------------
+    ## Setup domain
+    ##-----------------------------------------------------------------------
+
+    points, vertices, boundary = rectangular_cross(int(length/dx),
+                                                   int(width/dy),
+                                                   len1=length, 
+                                                   len2=width)
+
+    domain = anuga.Domain(points, vertices, boundary)   
+    #rm *.swwdomain.set_name('output_parallel_inlet_operator')                 # Output name
+    domain.set_store(False)
+    domain.set_default_order(2)
+
+    ##-----------------------------------------------------------------------
+    ## Distribute domain
+    ##-----------------------------------------------------------------------
+
+    if parallel:
+        domain = distribute(domain)
+        #domain.dump_triangulation("frac_op_domain.png")
+    
+
+    ##-----------------------------------------------------------------------
+    ## Setup boundary conditions
+    ##-----------------------------------------------------------------------
+    
+    domain.set_quantity('elevation', topography) 
+    domain.set_quantity('friction', 0.01)         # Constant friction 
+    domain.set_quantity('stage',
+                        expression='elevation')   # Dry initial condition
+
+    
+    Bi = anuga.Dirichlet_boundary([5.0, 0.0, 0.0])
+    Br = anuga.Reflective_boundary(domain)              # Solid reflective wall
+    domain.set_boundary({'left': Br, 'right': Br, 'top': Br, 'bottom': Br})
+
+
+    ##-----------------------------------------------------------------------
+    ## Determine triangle index coinciding with test points
+    ##-----------------------------------------------------------------------
+
+    assert(test_points is not None)
+    assert(len(test_points) == samples)
+
+    tri_ids = []
+
+    for point in test_points:
+        try:
+            k = domain.get_triangle_containing_point(point)
+            if domain.tri_full_flag[k] == 1:
+                tri_ids.append(k)
+            else:
+                tri_ids.append(-1)            
+        except:
+            tri_ids.append(-2)
+
+    if verbose: print 'P%d has points = %s' %(myid, tri_ids)
+
+    if not parallel: control_data = []
+
+    ################ Define Fractional Operators ##########################
+
+    inlet0 = None
+    inlet1 = None
+    boyd_box0 = None
+    
+    inlet0 = Inlet_operator(domain, line0, Q0, verbose = False, default=0.0)
+    inlet1 = Inlet_operator(domain, line1, Q1, verbose = False)
+    
+        
+    if inlet0 is not None and verbose: inlet0.print_statistics()
+    if inlet1 is not None and verbose: inlet1.print_statistics()
+    #if boyd_box0 is not None and verbose: boyd_box0.print_statistics()
+
+
+    ##-----------------------------------------------------------------------
+    ## Evolve system through time
+    ##-----------------------------------------------------------------------
+
+    for t in domain.evolve(yieldstep = 2.0, finaltime = 40.0):
+        if myid == 0 and verbose:
+            domain.write_time()
+
+        #print domain.volumetric_balance_statistics()
+    
+        stage = domain.get_quantity('stage')
+
+
+        #if boyd_box0 is not None and verbose : boyd_box0.print_timestepping_statistics()
+ 
+        #for i in range(samples):
+        #    if tri_ids[i] >= 0:                
+        #        if verbose: print 'P%d tri %d, value = %s' %(myid, i, stage.centroid_values[tri_ids[i]])
+                    
+        sys.stdout.flush()
+ 
+        pass
+
+    domain.sww_merge(delete_old=True)
+    
+    success = True
+
+    ##-----------------------------------------------------------------------
+    ## Assign/Test Control data
+    ##-----------------------------------------------------------------------
+
+    if not parallel:
+        stage = domain.get_quantity('stage')
+
+        for i in range(samples):
+            assert(tri_ids[i] >= 0)
+            control_data.append(stage.centroid_values[tri_ids[i]])
+        
+        if inlet0 is not None:
+            control_data.append(inlet0.inlet.get_average_stage())
+            control_data.append(inlet0.inlet.get_average_xmom())
+            control_data.append(inlet0.inlet.get_average_ymom())
+            control_data.append(inlet0.inlet.get_total_water_volume())
+            control_data.append(inlet0.inlet.get_average_depth())
+
+        if verbose: print 'P%d control_data = %s' %(myid, control_data)
+    else:
+        stage = domain.get_quantity('stage')
+        
+        for i in range(samples):
+            if tri_ids[i] >= 0:
+                local_success = num.allclose(control_data[i], stage.centroid_values[tri_ids[i]])
+                success = success and local_success
+                if verbose: 
+                    print 'P%d tri %d, control = %s, actual = %s, Success = %s' %(myid, i, control_data[i], stage.centroid_values[tri_ids[i]], local_success) 
+                
+                
+        if inlet0 is not None:
+            inlet_master_proc = inlet0.inlet.get_master_proc()
+            average_stage = inlet0.inlet.get_global_average_stage()
+            average_xmom = inlet0.inlet.get_global_average_xmom()
+            average_ymom = inlet0.inlet.get_global_average_ymom()
+            average_volume = inlet0.inlet.get_global_total_water_volume()
+            average_depth = inlet0.inlet.get_global_average_depth()
+
+            if myid == inlet_master_proc:
+                if verbose: 
+                    print 'P%d average stage, control = %s, actual = %s' %(myid, control_data[samples], average_stage)
+
+                    print 'P%d average xmom, control = %s, actual = %s' %(myid, control_data[samples+1], average_xmom)
+
+                    print 'P%d average ymom, control = %s, actual = %s' %(myid, control_data[samples+2], average_ymom)
+
+                    print 'P%d average volume, control = %s, actual = %s' %(myid, control_data[samples+3], average_volume)
+
+                    print 'P%d average depth, control = %s, actual = %s' %(myid, control_data[samples+4], average_depth)
+
+
+        assert(success)
+
+    return control_data
+
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_frac_op(unittest.TestCase):
+    def test_parallel_frac_op(self):
+        #print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_inlet_operator.py" % nprocs)
+        assert_(result == 0)
+
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1:
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_frac_op, 'test')
+        #print "Running for numproc = 1"
+        runner.run(suite)
+    else:
+        #print "Running for numproc > 1"
+        pypar.barrier()
+        test_points = []
+
+        if myid == 0:
+            if verbose: print 'PARALLEL START'
+            for i in range(samples):
+                x = random.randrange(0,1000)/1000.0 * length
+                y = random.randrange(0,1000)/1000.0 * width
+                point = [x, y]
+                test_points.append(point)
+
+            for i in range(1,numprocs):
+                pypar.send(test_points, i)
+        else:
+            test_points = pypar.receive(0)
+
+        if myid == 0:
+            control_data = run_test(parallel=False, test_points = test_points, verbose = verbose)
+
+            for proc in range(1,numprocs):
+                pypar.send(control_data, proc)
+        else:
+            control_data = pypar.receive(0)
+
+
+        pypar.barrier()
+        run_test(parallel=True, control_data = control_data, test_points = test_points, verbose = verbose)
+
+
+    finalize()
+    
+
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_riverwall.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_riverwall.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_riverwall.py	(revision 9501)
@@ -0,0 +1,253 @@
+"""
+Test parallel and sequential results of riverwall procedure
+"""
+
+
+#------------------------------------------------------------------------------
+# Import necessary modules
+#------------------------------------------------------------------------------
+import unittest
+import os
+import sys
+import anuga
+import numpy as num
+
+from anuga import myid, finalize, distribute, barrier, numprocs
+
+import anuga.utilities.plot_utils as util
+
+from math import exp
+
+
+alg = 'DE0'
+verbose = False
+
+scale_me=1.0
+nprocs = 3
+
+## Set up mesh
+boundaryPolygon=[ [0., 0.], [0., 100.], [100.0, 100.0], [100.0, 0.0]]
+midResPolygon=[ [30., 30.], [30., 70.], [70., 70.], [70., 30.]]
+higherResPolygon=[ [40., 40.], [40., 60.], [60., 60.], [60., 40.]]
+# Riverwall = list of lists, each with a set of x,y,z (and optional QFactor) values
+riverWall={ 'centralWall':
+                [ [50., 0.0, -0.0],
+                  [50., 45., -0.0],
+                  [50., 46., -0.2],
+                  [50., 54., -0.2],
+                  [50., 55., -0.0], 
+                  [50., 100.0, -0.0]] 
+          }
+
+riverWall_Par={'centralWall':{'Qfactor':1.0}}
+# Try to avoid any shallow-water type solution -- becomes unstable
+#riverWall_Par={'centralWall':{'Qfactor':1.0, 's1': 0.999, 's2':0.9999, 'h1':100, 'h2':150}}
+
+# The boundary polygon + riverwall breaks the mesh into multiple regions
+# Must define the resolution in these areas with an xy point + maximum area
+# Otherwise triangle.c gets confused
+regionPtAreas=[ [99., 99., 10.0*10.0*0.5],
+                [1., 1., 10.0*10.0*0.5],
+                [45., 45., 1.0*1.0*0.5],
+                [55., 55., 1.0*1.0*0.5],
+                [65., 65., 3.0*3.0*0.5],
+                [35., 35., 3.0*3.0*0.5] ]
+
+
+
+
+  
+
+###########################################################################
+# Setup Test
+##########################################################################
+def evolution_test(parallel=False, verbose=False):
+
+    #--------------------------------------------------------------------------
+    # Setup computational domain and quantities
+    #--------------------------------------------------------------------------
+    if myid == 0:
+        anuga.create_mesh_from_regions(boundaryPolygon, 
+                                 boundary_tags={'left': [0],
+                                                'top': [1],
+                                                'right': [2],
+                                                'bottom': [3]},
+                                   maximum_triangle_area = 1.0e+20,
+                                   minimum_triangle_angle = 28.0,
+                                   filename = 'runup.msh',
+                                   interior_regions = [ [higherResPolygon, 1.*1.*0.5],
+                                                        [midResPolygon, 3.0*3.0*0.5]],
+                                   breaklines=riverWall.values(),
+                                   use_cache=False,
+                                   verbose=verbose,
+                                   regionPtArea=regionPtAreas)
+        
+        sdomain=anuga.create_domain_from_file('runup.msh')
+        
+        
+        sdomain.set_flow_algorithm(alg)
+        
+        
+        sdomain.set_name('s_riverwall')                         
+        sdomain.set_datadir('.')                         
+        sdomain.set_store_vertices_uniquely()
+        
+        #------------------
+        # Define topography
+        #------------------
+        
+        def topography(x,y):
+            return -x/150.*scale_me 
+        
+        def stagefun(x,y):
+            stg=-0.5*scale_me
+            return stg 
+        
+        sdomain.set_quantity('elevation',topography)     # Use function for elevation
+        sdomain.set_quantity('friction',0.03)             # Constant friction
+        sdomain.set_quantity('stage', stagefun)              # Constant negative initial stage
+    else:
+        sdomain = None
+        
+    #--------------------------------------------------------------------------
+    # Create the parallel domains
+    #--------------------------------------------------------------------------
+    if parallel:
+        
+        if myid == 0 and verbose : print 'DISTRIBUTING TO PARALLEL DOMAIN'
+        pdomain = distribute(sdomain, verbose=verbose)
+        pdomain.set_name('p_riverwall')
+        pdomain.set_store_vertices_uniquely()
+        
+        
+    if myid == 0 and verbose: 
+        print 60*'='
+        print 'EVOLVING pdomain'
+        print 60*'='
+            
+    setup_and_evolve(pdomain, verbose=verbose)
+ 
+    barrier()
+   
+    if myid == 0:
+        if verbose: 
+            print 60*'='
+            print 'EVOLVING sdomain'
+            print 60*'='  
+        setup_and_evolve(sdomain, verbose=verbose)
+      
+    barrier()
+    
+    #---------------------------------
+    # Now compare the merged sww files
+    #---------------------------------
+    if myid == 0:
+        if verbose: print 'COMPARING SWW FILES'
+        
+        sdomain_v = util.get_output('s_riverwall.sww')
+        sdomain_c = util.get_centroids(sdomain_v)
+
+        pdomain_v = util.get_output('p_riverwall.sww')
+        pdomain_c = util.get_centroids(pdomain_v)
+        
+
+        # Test some values against the original ordering
+        
+        if verbose:
+            
+            order = 0
+            print 'PDOMAIN CENTROID VALUES'
+            print num.linalg.norm(sdomain_c.x-pdomain_c.x,ord=order)
+            print num.linalg.norm(sdomain_c.y-pdomain_c.y,ord=order)
+            print num.linalg.norm(sdomain_c.stage[-1]-pdomain_c.stage[-1],ord=order)
+            print num.linalg.norm(sdomain_c.xmom[-1]-pdomain_c.xmom[-1],ord=order)
+            print num.linalg.norm(sdomain_c.ymom[-1]-pdomain_c.ymom[-1],ord=order)
+            print num.linalg.norm(sdomain_c.xvel[-1]-pdomain_c.xvel[-1],ord=order)
+            print num.linalg.norm(sdomain_c.yvel[-1]-pdomain_c.yvel[-1],ord=order)        
+            
+        assert num.allclose(sdomain_c.stage,pdomain_c.stage)
+        assert num.allclose(sdomain_c.xmom,pdomain_c.xmom)
+        assert num.allclose(sdomain_c.ymom,pdomain_c.ymom)
+        assert num.allclose(sdomain_c.xvel,pdomain_c.xvel)
+        assert num.allclose(sdomain_c.yvel,pdomain_c.yvel)
+        
+        assert num.allclose(sdomain_v.x,pdomain_v.x)
+        assert num.allclose(sdomain_v.y,pdomain_v.y)
+        
+        
+        import os
+        os.remove('s_riverwall.sww')
+        os.remove('p_riverwall.sww')
+        os.remove('runup.msh')
+        
+        
+        
+def setup_and_evolve(domain, verbose=False):
+    
+
+    domain.riverwallData.create_riverwalls(riverWall, riverWall_Par, verbose=verbose)
+    
+    #--------------------------
+    # Setup boundary conditions
+    #--------------------------
+    Br=anuga.Reflective_boundary(domain)            # Solid reflective wall
+    
+    def boundaryFun(t):
+        output=-0.4*exp(-t/100.)-0.1
+        output=min(output,-0.11)
+        #output=min(output,-0.3)
+        return output  
+    
+
+    Bin_tmss = anuga.Transmissive_momentum_set_stage_boundary(domain=domain, function = boundaryFun) 
+    
+    #----------------------------------------------
+    # Associate boundary tags with boundary objects
+    #----------------------------------------------
+    domain.set_boundary({'left': Br, 'right': Bin_tmss, 'top': Br, 'bottom':Br})
+    
+
+    
+    #------------------------------
+    #Evolve the system through time
+    #------------------------------
+    if verbose: print 'Evolve'
+    for t in domain.evolve(yieldstep=10.0,finaltime=150.0):
+        if myid == 0 and verbose: print domain.timestepping_statistics()
+    
+    domain.sww_merge(delete_old=True)
+
+    
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_riverwall(unittest.TestCase):
+    def test_parallel_riverwall(self):
+        if verbose : print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_riverwall.py" % nprocs)
+        assert_(result == 0)
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1: 
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_riverwall, 'test')
+        runner.run(suite)
+    else:
+
+        #------------------------------------------
+        # Run the code code and compare sequential
+        # and parallel values
+        #------------------------------------------
+        if myid ==0 and verbose: print 'PARALLEL START'
+        evolution_test(parallel=True, verbose=verbose)
+        finalize()
+
+
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_shallow_domain.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_shallow_domain.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_shallow_domain.py	(revision 9501)
@@ -0,0 +1,159 @@
+
+"""Test a run of the sequential shallow water domain against
+a run of the parallel shallow water domain.
+
+WARNING: This assumes that the command to run jobs is mpirun.
+Tested with MPICH and LAM (Ole)
+"""
+
+#------------------------------------------------------------------------------
+# Import necessary modules
+#------------------------------------------------------------------------------
+
+import unittest
+import os
+import sys
+
+
+
+import numpy as num
+
+
+
+#------------------------------------------
+# Import pypar without the initial output
+#------------------------------------------
+class NullStream:
+    def write(self,text):
+        pass
+sys.stdout = NullStream()
+import pypar
+sys.stdout = sys.__stdout__
+
+
+#------------------------------------------
+# anuga imports
+#------------------------------------------
+
+from anuga.utilities.numerical_tools import ensure_numeric
+from anuga.utilities.util_ext        import double_precision
+from anuga.utilities.norms           import l1_norm, l2_norm, linf_norm
+from anuga.utilities.system_tools    import get_pathname_from_package
+
+from anuga import Domain
+from anuga import Reflective_boundary
+from anuga import Dirichlet_boundary
+from anuga import Time_boundary
+from anuga import Transmissive_boundary
+
+from anuga import rectangular_cross
+from anuga import create_domain_from_file
+
+
+from anuga import distribute, myid, numprocs, finalize
+
+
+#--------------------------------------------------------------------------
+# Setup parameters
+#--------------------------------------------------------------------------
+
+mod_path = get_pathname_from_package('anuga.parallel')
+
+mesh_filename = os.path.join('..','data','merimbula_10785_1.tsh')
+#mesh_filename = os.path.join('..','data','test-100.tsh')
+yieldstep = 1
+finaltime = 1
+quantity = 'stage'
+nprocs = 2
+verbose = False
+
+#--------------------------------------------------------------------------
+# Setup procedures
+#--------------------------------------------------------------------------
+class Set_Stage:
+    """Set an initial condition with constant water height, for x<x0
+    """
+
+    def __init__(self, x0=0.25, x1=0.5, h=1.0):
+        self.x0 = x0
+        self.x1 = x1
+        self.h  = h
+
+    def __call__(self, x, y):
+        return self.h*((x>self.x0)&(x<self.x1))
+
+#--------------------------------------------------------------------------
+# Setup test
+#--------------------------------------------------------------------------
+def evolution_test(parallel=False):
+
+
+    domain = create_domain_from_file(mesh_filename)
+    domain.set_quantity('stage', Set_Stage(756000.0, 756500.0, 2.0))
+
+    #--------------------------------------------------------------------------
+    # Create parallel domain if requested
+    #--------------------------------------------------------------------------
+
+    if parallel:
+        if myid == 0 and verbose: print 'DISTRIBUTING PARALLEL DOMAIN'
+        domain = distribute(domain)
+
+    #------------------------------------------------------------------------------
+    # Setup boundary conditions
+    # This must currently happen *after* domain has been distributed
+    #------------------------------------------------------------------------------
+    domain.store = False
+    Br = Reflective_boundary(domain)      # Solid reflective wall
+
+    domain.set_boundary({'outflow' :Br, 'inflow' :Br, 'inner' :Br, 'exterior' :Br, 'open' :Br})
+
+    #------------------------------------------------------------------------------
+    # Evolution
+    #------------------------------------------------------------------------------
+    if parallel:
+        if myid == 0 and verbose: print 'PARALLEL EVOLVE'
+    else:
+        if verbose: print 'SEQUENTIAL EVOLVE'
+
+    for t in domain.evolve(yieldstep = yieldstep, finaltime = finaltime):
+        pass
+
+    #domain.dump_triangulation()
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_shallow_domain(unittest.TestCase):
+    def test_parallel_shallow_domain(self):
+        #print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_shallow_domain.py" % nprocs)
+        assert_(result == 0)
+
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1: 
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_shallow_domain, 'test')
+        runner.run(suite)
+    else:
+
+        pypar.barrier()
+        if myid ==0:
+            if verbose: print 'PARALLEL START'
+
+        evolution_test(parallel=True)
+        
+        if myid == 0:     
+            if verbose: print 'Parallel test OK'
+
+
+
+    finalize()
Index: /trunk/anuga_core/source/anuga/parallel/test/test_parallel_sw_flow.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_parallel_sw_flow.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_parallel_sw_flow.py	(revision 9501)
@@ -0,0 +1,216 @@
+"""
+Simple water flow example using ANUGA
+
+Water driven up a linear slope and time varying boundary,
+similar to a beach environment
+
+This is a very simple test of the parallel algorithm using the simplified parallel API
+"""
+
+
+#------------------------------------------------------------------------------
+# Import necessary modules
+#------------------------------------------------------------------------------
+import unittest
+import os
+import sys
+#import pypar
+import numpy as num
+
+
+
+from anuga import Domain
+from anuga import Reflective_boundary
+from anuga import Dirichlet_boundary
+from anuga import Time_boundary
+from anuga import Transmissive_boundary
+from anuga import rectangular_cross_domain
+
+from anuga import distribute, myid, numprocs, send, receive, barrier, finalize
+
+#--------------------------------------------------------------------------
+# Setup parameters
+#--------------------------------------------------------------------------
+yieldstep = 0.25
+finaltime = 6.0
+nprocs = 4
+N = 29
+M = 29 
+verbose = False
+
+#---------------------------------
+# Setup Functions
+#---------------------------------
+def topography(x,y): 
+    return -x/2    
+
+###########################################################################
+# Setup Test
+##########################################################################
+def evolution_test(parallel=False, G = None, seq_interpolation_points=None, verbose=False):
+
+    #--------------------------------------------------------------------------
+    # Setup computational domain and quantities
+    #--------------------------------------------------------------------------
+    domain = rectangular_cross_domain(M, N)
+    domain.set_quantity('elevation', topography) # Use function for elevation
+    domain.set_quantity('friction', 0.0)         # Constant friction 
+    domain.set_quantity('stage', expression='elevation') # Dry initial stage
+
+    #--------------------------------------------------------------------------
+    # Create the parallel domain
+    #--------------------------------------------------------------------------
+    if parallel:
+        if myid == 0 and verbose : print 'DISTRIBUTING PARALLEL DOMAIN'
+        domain = distribute(domain, verbose=False)
+
+    #--------------------------------------------------------------------------
+    # Setup domain parameters
+    #--------------------------------------------------------------------------
+    domain.set_name('runup')                    # Set sww filename
+    domain.set_datadir('.')                     # Set output dir
+
+    domain.set_flow_algorithm('2_0')
+    domain.set_quantities_to_be_stored(None)
+
+
+    #------------------------------------------------------------------------------
+    # Setup boundary conditions
+    # This must currently happen *AFTER* domain has been distributed
+    #------------------------------------------------------------------------------
+
+    Br = Reflective_boundary(domain)      # Solid reflective wall
+    Bd = Dirichlet_boundary([-0.2,0.,0.]) # Constant boundary values
+
+    # Associate boundary tags with boundary objects
+    domain.set_boundary({'left': Br, 'right': Bd, 'top': Br, 'bottom': Br})
+
+    #------------------------------------------------------------------------------
+    # Find which sub_domain in which the interpolation points are located 
+    #
+    # Sometimes the interpolation points sit exactly
+    # between two centroids, so in the parallel run we
+    # reset the interpolation points to the centroids
+    # found in the sequential run
+    #------------------------------------------------------------------------------
+    interpolation_points = [[0.4,0.5], [0.6,0.5], [0.8,0.5], [0.9,0.5]]
+
+
+    gauge_values = []
+    tri_ids = []
+    for i, point in enumerate(interpolation_points):
+        gauge_values.append([]) # Empty list for timeseries
+
+        #if is_inside_polygon(point, domain.get_boundary_polygon()):
+        #print "Point ", myid, i, point
+        try:
+            k = domain.get_triangle_containing_point(point)
+            if domain.tri_full_flag[k] == 1:
+                tri_ids.append(k)
+            else:
+                tri_ids.append(-1)            
+        except:
+            tri_ids.append(-2)
+
+        #print "  tri_ids ",myid, i, tri_ids[-1]
+		
+    if verbose: print 'P%d has points = %s' %(myid, tri_ids)
+
+
+    c_coord = domain.get_centroid_coordinates()
+    interpolation_points = []
+    for id in tri_ids:
+        if id<1:
+            if verbose: print 'WARNING: Interpolation point not within the domain!'
+        interpolation_points.append(c_coord[id,:])
+            
+    #------------------------------------------------------------------------------
+    # Evolve system through time
+    #------------------------------------------------------------------------------
+    time = []
+
+    if parallel:
+        if myid == 0 and verbose: print 'PARALLEL EVOLVE'
+    else:
+        if myid == 0 and verbose: print 'SEQUENTIAL EVOLVE'
+    
+
+    for t in domain.evolve(yieldstep = yieldstep, finaltime = finaltime):
+        if myid == 0 and verbose : domain.write_time()
+
+        # Record time series at known points
+        time.append(domain.get_time())
+
+        stage = domain.get_quantity('stage')
+
+        for i in range(4):
+            if tri_ids[i] > -1:
+                gauge_values[i].append(stage.centroid_values[tri_ids[i]])
+
+
+    #----------------------------------------
+    # Setup test arrays during sequential run
+    #----------------------------------------
+    if not parallel:
+        G = []
+        for i in range(4):
+            G.append(gauge_values[i])
+
+    success = True
+
+    for i in range(4):
+        if tri_ids[i] > -1:
+            #print num.max(num.array(gauge_values[i])- num.array(G[i]))
+            success = success and num.allclose(gauge_values[i], G[i])
+
+    assert_(success)
+    
+    return G, interpolation_points
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_sw_flow(unittest.TestCase):
+    def test_parallel_sw_flow(self):
+        if verbose : print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_parallel_sw_flow.py" % nprocs)
+        assert_(result == 0)
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1: 
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_sw_flow, 'test')
+        runner.run(suite)
+    else:
+
+        #------------------------------------------
+        # Run the sequential code on each processor
+        # and save results at 4 gauge stations to
+        # array G
+        #------------------------------------------
+        barrier()
+        if myid == 0 and verbose: print 'SEQUENTIAL START'
+
+        G , interpolation_points = evolution_test(parallel=False,verbose=verbose)
+        G = num.array(G,num.float)
+
+        barrier()
+        
+        #------------------------------------------
+        # Run the code code and compare sequential
+        # results at 4 gauge stations
+        #------------------------------------------
+        if myid ==0 and verbose: print 'PARALLEL START'
+
+        evolution_test(parallel=True, G=G, seq_interpolation_points = interpolation_points, verbose= verbose)
+        
+        finalize()
+
+
Index: /trunk/anuga_core/source/anuga/parallel/test/test_sequential_dist_sw_flow.py
===================================================================
--- /trunk/anuga_core/source/anuga/parallel/test/test_sequential_dist_sw_flow.py	(revision 9501)
+++ /trunk/anuga_core/source/anuga/parallel/test/test_sequential_dist_sw_flow.py	(revision 9501)
@@ -0,0 +1,322 @@
+"""
+Simple water flow example using ANUGA
+
+Water driven up a linear slope and time varying boundary,
+similar to a beach environment
+
+This is a very simple test of the parallel algorithm using the simplified parallel API
+"""
+
+
+#------------------------------------------------------------------------------
+# Import necessary modules
+#------------------------------------------------------------------------------
+import unittest
+import os
+import sys
+#import pypar
+import numpy as num
+
+
+
+from anuga import Domain
+from anuga import Reflective_boundary
+from anuga import Dirichlet_boundary
+from anuga import Time_boundary
+from anuga import Transmissive_boundary
+
+from anuga import rectangular_cross_domain
+
+
+from anuga import distribute, myid, numprocs, send, receive, barrier, finalize
+
+from anuga.parallel.sequential_distribute import sequential_distribute_dump
+from anuga.parallel.sequential_distribute import sequential_distribute_load
+
+import anuga.utilities.plot_utils as util
+
+
+#--------------------------------------------------------------------------
+# Setup parameters
+#--------------------------------------------------------------------------
+yieldstep = 0.25
+finaltime = 3.0
+nprocs = 4
+N = 29
+M = 29 
+verbose = False
+
+
+new_parameters = {}
+new_parameters['ghost_layer_width'] = 2
+
+#---------------------------------
+# Setup Functions
+#---------------------------------
+def topography(x,y): 
+    return -x/2    
+
+###########################################################################
+# Setup Test
+##########################################################################
+def evolution_test(parallel=False, verbose=False):
+
+    #--------------------------------------------------------------------------
+    # Setup computational domain and quantities
+    #--------------------------------------------------------------------------
+    if myid == 0:
+        domain = rectangular_cross_domain(M, N)
+        domain.set_name('odomain')                    # Set sww filename
+        domain.set_datadir('.')   
+        domain.set_quantity('elevation', topography) # Use function for elevation
+        domain.set_quantity('friction', 0.0)         # Constant friction 
+        domain.set_quantity('stage', expression='elevation') # Dry initial stage
+    else:
+        domain = None
+        
+    #--------------------------------------------------------------------------
+    # Create pickled partition
+    #--------------------------------------------------------------------------
+    if myid == 0:
+        if verbose: print 'DUMPING PARTITION DATA'
+        sequential_distribute_dump(domain, numprocs, verbose=verbose, parameters=new_parameters)    
+
+    #--------------------------------------------------------------------------
+    # Create the parallel domains
+    #--------------------------------------------------------------------------
+    if parallel:
+        
+        if myid == 0 and verbose : print 'DISTRIBUTING TO PARALLEL DOMAIN'
+        pdomain = distribute(domain, verbose=verbose, parameters=new_parameters)
+        pdomain.set_name('pdomain')
+        
+        if myid == 0 and verbose : print 'LOADING IN PARALLEL DOMAIN'
+        sdomain = sequential_distribute_load(filename='odomain', verbose = verbose)
+        sdomain.set_name('sdomain')
+        
+    if myid == 0 and verbose: print 'EVOLVING pdomain'    
+    setup_and_evolve(pdomain, verbose=verbose)
+ 
+    if myid == 0 and verbose: print 'EVOLVING sdomain'   
+    setup_and_evolve(sdomain, verbose=verbose)
+    
+    if myid == 0:
+        if verbose: print 'EVOLVING odomain'   
+        setup_and_evolve(domain, verbose=verbose)
+    
+
+    if myid == 0 and verbose:
+        parameter_file=open('odomain.txt', 'w')
+        from pprint import pprint
+        pprint(domain.get_algorithm_parameters(),parameter_file,indent=4)
+        parameter_file.close()
+
+        parameter_file=open('sdomain.txt', 'w')
+        from pprint import pprint
+        pprint(sdomain.get_algorithm_parameters(),parameter_file,indent=4)
+        parameter_file.close()
+
+        parameter_file=open('pdomain.txt', 'w')
+        from pprint import pprint
+        pprint(pdomain.get_algorithm_parameters(),parameter_file,indent=4)
+        parameter_file.close()        
+    
+    assert num.allclose(pdomain.quantities['stage'].centroid_values, sdomain.quantities['stage'].centroid_values)
+    assert num.allclose(pdomain.quantities['stage'].vertex_values, sdomain.quantities['stage'].vertex_values)
+    
+    assert num.allclose(pdomain.vertex_coordinates, sdomain.vertex_coordinates)
+    assert num.allclose(pdomain.centroid_coordinates, sdomain.centroid_coordinates)
+    
+    
+
+    #---------------------------------
+    # Now compare the merged sww files
+    #---------------------------------
+    if myid == 0:
+        if verbose: print 'COMPARING SWW FILES'
+        
+        odomain_v = util.get_output('odomain.sww')
+        odomain_c = util.get_centroids(odomain_v)
+
+        pdomain_v = util.get_output('pdomain.sww')
+        pdomain_c = util.get_centroids(pdomain_v)
+        
+        sdomain_v = util.get_output('sdomain.sww')
+        sdomain_c = util.get_centroids(sdomain_v)
+
+        # Test some values against the original ordering
+        
+        if verbose:
+            
+            order = 0
+            print 'PDOMAIN CENTROID VALUES'
+            print num.linalg.norm(odomain_c.x-pdomain_c.x,ord=order)
+            print num.linalg.norm(odomain_c.y-pdomain_c.y,ord=order)
+            print num.linalg.norm(odomain_c.stage[-1]-pdomain_c.stage[-1],ord=order)
+            print num.linalg.norm(odomain_c.xmom[-1]-pdomain_c.xmom[-1],ord=order)
+            print num.linalg.norm(odomain_c.ymom[-1]-pdomain_c.ymom[-1],ord=order)
+            print num.linalg.norm(odomain_c.xvel[-1]-pdomain_c.xvel[-1],ord=order)
+            print num.linalg.norm(odomain_c.yvel[-1]-pdomain_c.yvel[-1],ord=order)        
+            
+             
+            print 'SDOMAIN CENTROID VALUES'        
+            print num.linalg.norm(odomain_c.x-sdomain_c.x,ord=order)
+            print num.linalg.norm(odomain_c.y-sdomain_c.y,ord=order)
+            print num.linalg.norm(odomain_c.stage[-1]-sdomain_c.stage[-1],ord=order)
+            print num.linalg.norm(odomain_c.xmom[-1]-sdomain_c.xmom[-1],ord=order)
+            print num.linalg.norm(odomain_c.ymom[-1]-sdomain_c.ymom[-1],ord=order)
+            print num.linalg.norm(odomain_c.xvel[-1]-sdomain_c.xvel[-1],ord=order)
+            print num.linalg.norm(odomain_c.yvel[-1]-sdomain_c.yvel[-1],ord=order)
+            
+            print 'PDOMAIN VERTEX VALUES'        
+            print num.linalg.norm(odomain_v.stage[-1]-pdomain_v.stage[-1],ord=order)
+            print num.linalg.norm(odomain_v.xmom[-1]-pdomain_v.xmom[-1],ord=order)
+            print num.linalg.norm(odomain_v.ymom[-1]-pdomain_v.ymom[-1],ord=order)
+            print num.linalg.norm(odomain_v.xvel[-1]-pdomain_v.xvel[-1],ord=order)
+            print num.linalg.norm(odomain_v.yvel[-1]-pdomain_v.yvel[-1],ord=order)
+            
+            print 'SDOMAIN VERTEX VALUES'     
+            print num.linalg.norm(odomain_v.stage[-1]-sdomain_v.stage[-1],ord=order)
+            print num.linalg.norm(odomain_v.xmom[-1]-sdomain_v.xmom[-1],ord=order)
+            print num.linalg.norm(odomain_v.ymom[-1]-sdomain_v.ymom[-1],ord=order)
+            print num.linalg.norm(odomain_v.xvel[-1]-sdomain_v.xvel[-1],ord=order)
+            print num.linalg.norm(odomain_v.yvel[-1]-sdomain_v.yvel[-1],ord=order)
+            
+            
+            
+
+        assert num.allclose(odomain_c.stage,pdomain_c.stage)
+        assert num.allclose(odomain_c.xmom,pdomain_c.xmom)
+        assert num.allclose(odomain_c.ymom,pdomain_c.ymom)
+        assert num.allclose(odomain_c.xvel,pdomain_c.xvel)
+        assert num.allclose(odomain_c.yvel,pdomain_c.yvel)
+        
+        assert num.allclose(odomain_v.x,pdomain_v.x)
+        assert num.allclose(odomain_v.y,pdomain_v.y)
+                
+        assert num.linalg.norm(odomain_v.x-pdomain_v.x,ord=0) == 0
+        assert num.linalg.norm(odomain_v.y-pdomain_v.y,ord=0) == 0
+        assert num.linalg.norm(odomain_v.stage[-1]-pdomain_v.stage[-1],ord=0) < 100
+        assert num.linalg.norm(odomain_v.xmom[-1]-pdomain_v.xmom[-1],ord=0) < 100 
+        assert num.linalg.norm(odomain_v.ymom[-1]-pdomain_v.ymom[-1],ord=0) < 100
+        assert num.linalg.norm(odomain_v.xvel[-1]-pdomain_v.xvel[-1],ord=0) < 100
+        assert num.linalg.norm(odomain_v.yvel[-1]-pdomain_v.yvel[-1],ord=0) < 100     
+        
+        assert num.allclose(odomain_c.x,sdomain_c.x)
+        assert num.allclose(odomain_c.y,sdomain_c.y)
+        assert num.allclose(odomain_c.stage,sdomain_c.stage)
+        assert num.allclose(odomain_c.xmom,sdomain_c.xmom)
+        assert num.allclose(odomain_c.ymom,sdomain_c.ymom)
+        assert num.allclose(odomain_c.xvel,sdomain_c.xvel)
+        assert num.allclose(odomain_c.yvel,sdomain_c.yvel)
+        
+        assert num.allclose(odomain_v.x,sdomain_v.x)
+        assert num.allclose(odomain_v.y,sdomain_v.y)
+        
+        order = 0
+        assert num.linalg.norm(odomain_v.x-sdomain_v.x,ord=order) == 0
+        assert num.linalg.norm(odomain_v.y-sdomain_v.y,ord=order) == 0
+        assert num.linalg.norm(odomain_v.stage[-1]-sdomain_v.stage[-1],ord=order) < 100
+        assert num.linalg.norm(odomain_v.xmom[-1]-sdomain_v.xmom[-1],ord=order) < 100
+        assert num.linalg.norm(odomain_v.ymom[-1]-sdomain_v.ymom[-1],ord=order) < 100
+        assert num.linalg.norm(odomain_v.xvel[-1]-sdomain_v.xvel[-1],ord=order) < 100
+        assert num.linalg.norm(odomain_v.yvel[-1]-sdomain_v.yvel[-1],ord=order) < 100        
+                
+        # COMPARE CENTROID PDOMAIN SDOMAIN  
+        assert num.allclose(pdomain_c.x,sdomain_c.x)
+        assert num.allclose(pdomain_c.y,sdomain_c.y)
+        assert num.allclose(pdomain_c.stage[-1],sdomain_c.stage[-1])
+        assert num.allclose(pdomain_c.xmom[-1],sdomain_c.xmom[-1])
+        assert num.allclose(pdomain_c.ymom[-1],sdomain_c.ymom[-1])
+        assert num.allclose(pdomain_c.xvel[-1],sdomain_c.xvel[-1])
+        assert num.allclose(pdomain_c.yvel[-1],sdomain_c.yvel[-1])
+            
+            
+        # COMPARE VERTEX PDOMAIN SDOMAIN
+        assert num.allclose(pdomain_v.x,sdomain_v.x)
+        assert num.allclose(pdomain_v.y,sdomain_v.y)
+        assert num.allclose(pdomain_v.stage[-1],sdomain_v.stage[-1])
+        assert num.allclose(pdomain_v.xmom[-1],sdomain_v.xmom[-1])
+        assert num.allclose(pdomain_v.ymom[-1],sdomain_v.ymom[-1])
+        assert num.allclose(pdomain_v.xvel[-1],sdomain_v.xvel[-1])
+        assert num.allclose(pdomain_v.yvel[-1],sdomain_v.yvel[-1])   
+        
+        
+        import os
+        os.remove('odomain.sww')
+        os.remove('pdomain.sww')
+        os.remove('sdomain.sww')
+        os.remove('odomain_P4_0.pickle')
+        os.remove('odomain_P4_1.pickle')
+        os.remove('odomain_P4_2.pickle')
+        os.remove('odomain_P4_3.pickle')
+            
+
+        
+        
+def setup_and_evolve(domain, verbose=False):
+
+    #--------------------------------------------------------------------------
+    # Setup domain parameters
+    #--------------------------------------------------------------------------
+    domain.set_flow_algorithm('DE0')
+    #domain.set_store_vertices_uniquely()
+
+    #------------------------------------------------------------------------------
+    # Setup boundary conditions
+    # This must currently happen *AFTER* domain has been distributed
+    #------------------------------------------------------------------------------
+
+    Br = Reflective_boundary(domain)      # Solid reflective wall
+    Bd = Dirichlet_boundary([-0.2,0.,0.]) # Constant boundary values
+
+    # Associate boundary tags with boundary objects
+    domain.set_boundary({'left': Br, 'right': Bd, 'top': Br, 'bottom': Br})
+
+    #------------------------------------------------------------------------------
+    # Evolve
+    #------------------------------------------------------------------------------
+    for t in domain.evolve(yieldstep = yieldstep, finaltime = finaltime):
+        if myid == 0 and verbose : domain.write_time()
+        #if myid == 0 and verbose : print domain.quantities['stage'].get_maximum_value()
+
+
+    domain.sww_merge(delete_old=True)
+    
+
+# Test an nprocs-way run of the shallow water equations
+# against the sequential code.
+
+class Test_parallel_sw_flow(unittest.TestCase):
+    def test_parallel_sw_flow(self):
+        if verbose : print "Expect this test to fail if not run from the parallel directory."
+        result = os.system("mpirun -np %d python test_sequential_dist_sw_flow.py" % nprocs)
+        assert_(result == 0)
+
+# Because we are doing assertions outside of the TestCase class
+# the PyUnit defined assert_ function can't be used.
+def assert_(condition, msg="Assertion Failed"):
+    if condition == False:
+        #pypar.finalize()
+        raise AssertionError, msg
+
+if __name__=="__main__":
+    if numprocs == 1: 
+        runner = unittest.TextTestRunner()
+        suite = unittest.makeSuite(Test_parallel_sw_flow, 'test')
+        runner.run(suite)
+    else:
+
+
+        
+        #------------------------------------------
+        # Run the codel and compare sequential
+        # results at 4 gauge stations
+        #------------------------------------------
+        if myid ==0 and verbose: print 'PARALLEL START'
+
+        evolution_test(parallel=True, verbose=verbose)
+        
+        finalize()
+
+
Index: /trunk/anuga_core/source/anuga/structures/riverwall.py
===================================================================
--- /trunk/anuga_core/source/anuga/structures/riverwall.py	(revision 9500)
+++ /trunk/anuga_core/source/anuga/structures/riverwall.py	(revision 9501)
@@ -1,4 +1,4 @@
 import os
-from anuga_parallel import barrier, numprocs, myid
+from anuga import barrier, numprocs, myid
 import numpy
 
