From: Arnaud Giersch Date: Sat, 27 Oct 2012 14:28:40 +0000 (+0200) Subject: Merge branch 'v3_8_x' X-Git-Tag: v3_9_rc1~91^2~190 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/d9347ab3e960f0f098338c88a79724dbcf4a58bb?hp=0aa233a2c29e24e4ac31620e2386558d4912aefc Merge branch 'v3_8_x' --- diff --git a/CMakeLists.txt b/CMakeLists.txt index d61bf74904..d5fb1132a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,14 +2,15 @@ cmake_minimum_required(VERSION 2.6) ### Need to set rc ccompiler before enable language if(WIN32) SET(CMAKE_RC_COMPILER "windres") -endif(WIN32) -project(SimGrid CXX C) +endif() +project(SimGrid CXX C Fortran) set(CMAKE_C_FLAGS "" CACHE TYPE INTERNAL FORCE) set(CMAKE_CXX_FLAGS "" CACHE TYPE INTERNAL FORCE) set(CMAKE_EXE_LINKER_FLAGS "" CACHE TYPE INTERNAL FORCE) set(CMAKE_C_LINK_FLAGS "" CACHE TYPE INTERNAL FORCE) - +set(CMAKE_Fortran_FLAGS "" CACHE TYPE INTERNAL FORCE) +set(CMAKE_Fortran_LINK_FLAGS "" CACHE TYPE INTERNAL FORCE) ## Mapping version number -> version name # 3.5.99 -> alpha1 (oops) # 3.5.9{1,2} -> beta{1,2} @@ -17,16 +18,17 @@ set(CMAKE_C_LINK_FLAGS "" CACHE TYPE INTERNAL FORCE) # 3.6.{0,1,2} -> release 3.6, 3.6.1, 3.6.2 # 3.7.{0,1} -> release 3.7, 3.7.1 # 3.8.{0,1} -> release 3.8, 3.8.1 +# 3.9.0 -> release 3.9 set(SIMGRID_VERSION_MAJOR "3") -set(SIMGRID_VERSION_MINOR "8") -set(SIMGRID_VERSION_PATCH "1") +set(SIMGRID_VERSION_MINOR "9") +set(SIMGRID_VERSION_PATCH "0") if(${SIMGRID_VERSION_PATCH} EQUAL "0") set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}") -else(${SIMGRID_VERSION_PATCH} EQUAL "0") +else() set(release_version "${SIMGRID_VERSION_MAJOR}.${SIMGRID_VERSION_MINOR}.${SIMGRID_VERSION_PATCH}") -endif(${SIMGRID_VERSION_PATCH} EQUAL "0") +endif() set(libsimgrid_version "${release_version}") set(libgras_version "${release_version}") set(libsmpi_version "${release_version}") @@ -36,14 +38,14 @@ set(APPLE_NEED_GCC_VERSION "4.6") ### SET THE LIBRARY EXTENSION AND GCC VERSION if(APPLE) #MAC set(LIB_EXE "dylib") -else(APPLE) +else() if(WIN32) #WINDOWS set(LIB_EXE "a") set(BIN_EXE ".exe") - else(WIN32) #UNIX + else() #UNIX set(LIB_EXE "so") - endif(WIN32) -endif(APPLE) + endif() +endif() string(REGEX MATCH "gcc" GCC "${CMAKE_C_COMPILER}") if(GCC) @@ -57,20 +59,20 @@ if(GCC) if(${GCC_NEED_VERSION} GREATER COMPILER_C_VERSION_MAJOR_MINOR) message(FATAL_ERROR "Gcc must be to version ${GCC_NEED_VERSION} current version ${COMPILER_C_VERSION_MAJOR_MINOR}") - endif(${GCC_NEED_VERSION} GREATER COMPILER_C_VERSION_MAJOR_MINOR) -endif(GCC) + endif() +endif() string(REGEX MATCH "cl.exe" VBC "${CMAKE_C_COMPILER}") if(VBC) message(FATAL_ERROR "VB is not yet supported by Simgrid.") -endif(VBC) +endif() ### Find programs and paths FIND_PROGRAM(GCOV_PATH gcov) include(FindPerl) if(NOT PERL_EXECUTABLE) message(FATAL_ERROR "-- SimGrid cannot be compiled without Perl installed -- sorry. Bailling out.") -endif(NOT PERL_EXECUTABLE) +endif() ### Set some variables for Cmake SET(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) @@ -87,21 +89,21 @@ set(INCLUDES if(WIN32) set(INCLUDES ${INCLUDES} ${CMAKE_HOME_DIRECTORY}/include/xbt ${CMAKE_HOME_DIRECTORY}/src/xbt) #for win32_ucontext.[ch] -endif(WIN32) +endif() set(CMAKE_SOURCE_DIR ${PROJECT_SOURCE_DIRECTORY}) if(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/) set(INCLUDES ${INCLUDES} /usr/include/) -endif(NOT CMAKE_CROSSCOMPILING AND EXISTS /usr/include/) +endif() ### Check 32bits or 64bits INCLUDE (CheckTypeSize) CHECK_TYPE_SIZE("void*" SIZEOF_VOIDSTAR) IF(SIZEOF_VOIDSTAR EQUAL 4) SET(ARCH_32_BITS 1) -ELSE(SIZEOF_VOIDSTAR EQUAL 4) +ELSE() SET(ARCH_32_BITS 0) -ENDIF(SIZEOF_VOIDSTAR EQUAL 4) +ENDIF() if(WIN32) @@ -121,26 +123,26 @@ if(WIN32) string(REGEX REPLACE "^${COMPILER_C_MAJOR_VERSION}." "" COMPILER_C_MINOR_VERSION "${COMPILER_C_MINOR_VERSION}") if(COMPILER_C_MAJOR_VERSION) # set(__GNUC__ ${COMPILER_C_MAJOR_VERSION}) - endif(COMPILER_C_MAJOR_VERSION) + endif() if(COMPILER_C_MINOR_VERSION) # set(__GNUC_MINOR__ ${COMPILER_C_MINOR_VERSION}) - endif(COMPILER_C_MINOR_VERSION) + endif() set(MSVC 0) set(BORLAND 0) - else(CMAKE_COMPILER_IS_GNUCC) + else() message(FATAL_ERROR "Please use MinGW to compile SimGrid!") - endif(CMAKE_COMPILER_IS_GNUCC) + endif() if(ARCH_32_BITS) ### Arch 32bits set(_WIN32 1) - else(ARCH_32_BITS) ### Arch 64bits + else() ### Arch 64bits set(_WIN64 1) - endif(ARCH_32_BITS) + endif() set(NSIS_WIN_VERSION $ENV{PROCESSOR_ARCHITEW6432}) if(NSIS_WIN_VERSION MATCHES "") set(NSIS_WIN_VERSION $ENV{PROCESSOR_ARCHITECTURE}) - endif(NSIS_WIN_VERSION MATCHES "") + endif() string(TOLOWER ${NSIS_WIN_VERSION} NSIS_WIN_VERSION) set(_XBT_WIN32 1) @@ -158,7 +160,7 @@ if(WIN32) message(STATUS "VISUALC ${MSVC}") message(STATUS "GNUC ${CMAKE_COMPILER_IS_GNUCC}") -endif(WIN32) +endif() include_directories(${INCLUDES}) @@ -179,7 +181,7 @@ include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/DefinePackages.cmake) include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MaintainerMode.cmake) if(NOT WIN32) include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/UnitTesting.cmake) -endif(NOT WIN32) +endif() ### Setup gcc flags include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Flags.cmake) @@ -187,9 +189,9 @@ include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Flags.cmake) ### Make Libs if(NOT WIN32) include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MakeLib.cmake) -else(NOT WIN32) +else() include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MakeLibWin.cmake) -endif(NOT WIN32) +endif() ### Make Exes include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/MakeExe.cmake) @@ -207,9 +209,9 @@ include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Pipol.cmake) ### Build the doc if(NOT WIN32) include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/GenerateDoc.cmake) -else(NOT WIN32) +else() include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/GenerateDocWin.cmake) -endif(NOT WIN32) +endif() ### Print ARGS include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/PrintArgs.cmake) diff --git a/ChangeLog b/ChangeLog index 5d7e1c68c8..5d4efe5a50 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +SimGrid (3.9) NOT RELEASED; urgency=low + + SMPI: + * Now works on Windows too! + * Much more extensive test suite, from MPICH + + -- $date Da SimGrid team + SimGrid (3.8.1) stable; urgency=low The "we are told that some people want to also *install* the simgrid diff --git a/NEWS b/NEWS index 363511f96a..3353af294e 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,10 @@ + _ _____ ___ +__ _____ _ __ ___(_) ___ _ __ |___ // _ \ +\ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ (_) | + \ V / __/ | \__ \ | (_) | | | | ___) \__, | + \_/ \___|_| |___/_|\___/|_| |_| |____(_)/_/ + +(to complete) _ _____ ___ _ __ _____ _ __ ___(_) ___ _ __ |___ / ( _ ) / | \ \ / / _ \ '__/ __| |/ _ \| '_ \ |_ \ / _ \ | | diff --git a/buildtools/Cmake/AddTests.cmake b/buildtools/Cmake/AddTests.cmake index f96df3b44e..a5d5958a60 100644 --- a/buildtools/Cmake/AddTests.cmake +++ b/buildtools/Cmake/AddTests.cmake @@ -1,14 +1,14 @@ if(enable_memcheck) include(FindValgrind) -endif(enable_memcheck) +endif() if(enable_smpi AND NOT WIN32) exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpicc" OUTPUT_VARIABLE "OKITOKI") exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpif2c" OUTPUT_VARIABLE "OKITOKI") exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpiff" OUTPUT_VARIABLE "OKITOKI") exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpirun" OUTPUT_VARIABLE "OKITOKI") -endif(enable_smpi AND NOT WIN32) +endif() ### For code coverage ### Set some variables @@ -53,10 +53,10 @@ if(NOT enable_memcheck) IF(HAVE_MMAP) IF(${ARCH_32_BITS}) ADD_TEST(xbt-mmalloc-32 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/mmalloc_32.tesh) - ELSE(${ARCH_32_BITS}) + ELSE() ADD_TEST(xbt-mmalloc-64 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/xbt/mmalloc_64.tesh) - ENDIF(${ARCH_32_BITS}) - ENDIF(HAVE_MMAP) + ENDIF() + ENDIF() # teshsuite/gras/datadesc directory ADD_TEST(tesh-gras-dd-mem ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/datadesc/datadesc_mem.tesh) @@ -67,18 +67,18 @@ if(NOT enable_memcheck) IF(${ARCH_32_BITS}) ADD_TEST(tesh-gras-msg-handle-sg-32 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle/test_sg_32.tesh) - ELSE(${ARCH_32_BITS}) + ELSE() ADD_TEST(tesh-gras-msg-handle-sg-64 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/msg_handle/test_sg_64.tesh) - ENDIF(${ARCH_32_BITS}) + ENDIF() ADD_TEST(tesh-gras-empty-main-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/empty_main --cd ${CMAKE_HOME_DIRECTORY}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main/test_rl.tesh) ADD_TEST(tesh-gras-empty-main-sg ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/empty_main --cd ${CMAKE_HOME_DIRECTORY}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/gras/empty_main/test_sg.tesh) IF(${ARCH_32_BITS}) ADD_TEST(tesh-gras-small-sleep-sg-32 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/small_sleep --cd ${CMAKE_HOME_DIRECTORY}/teshsuite gras/small_sleep/test_sg_32.tesh) - ELSE(${ARCH_32_BITS}) + ELSE() ADD_TEST(tesh-gras-small-sleep-sg-64 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/gras/small_sleep --cd ${CMAKE_HOME_DIRECTORY}/teshsuite gras/small_sleep/test_sg_64.tesh) - ENDIF(${ARCH_32_BITS}) + ENDIF() # GRAS examples ADD_TEST(gras-ping-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_rl.tesh) @@ -97,14 +97,14 @@ if(NOT enable_memcheck) ADD_TEST(tesh-msg-get-sender-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) if(HAVE_RAWCTX) ADD_TEST(tesh-msg-get-sender-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) - endif(HAVE_RAWCTX) + endif() if(CONTEXT_UCONTEXT) ADD_TEST(tesh-msg-get-sender-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite --cd ${CMAKE_BINARY_DIR}/teshsuite ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.tesh) - endif(CONTEXT_UCONTEXT) + endif() IF(enable_debug) # these tests need the assertion mechanism ADD_TEST(tesh-simdag-parser-bogus-symmetric ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms two_hosts_asymetric.tesh) - ENDIF(enable_debug) + ENDIF() ADD_TEST(tesh-simdag-bypass ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms basic_parsing_test_bypass.tesh) ADD_TEST(tesh-simdag-flatifier ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms flatifier.tesh) @@ -177,7 +177,7 @@ if(NOT enable_memcheck) ADD_TEST(msg-masterslave-failure-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure_crosstraffic.tesh) ADD_TEST(msg-masterslave-mailbox-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox_crosstraffic.tesh) ADD_TEST(msg-masterslave-cpu-ti-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti_crosstraffic.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) ADD_TEST(msg-sendrecv-CLM03-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/sendrecv/sendrecv_CLM03.tesh) @@ -198,18 +198,18 @@ if(NOT enable_memcheck) ADD_TEST(msg-masterslave-failure-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_failure_crosstraffic.tesh) ADD_TEST(msg-masterslave-mailbox-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_mailbox_crosstraffic.tesh) ADD_TEST(msg-masterslave-cpu-ti-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/masterslave --cd ${CMAKE_HOME_DIRECTORY}/examples/msg masterslave/masterslave_cpu_ti_crosstraffic.tesh) - endif(HAVE_RAWCTX) + endif() ADD_TEST(msg-masterslave-vivaldi-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh) ADD_TEST(msg-token-ring-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) if(HAVE_RAWCTX) ADD_TEST(msg-masterslave-vivaldi-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh) ADD_TEST(msg-token-ring-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) - endif(HAVE_RAWCTX) + endif() if(CONTEXT_UCONTEXT) ADD_TEST(msg-masterslave-vivaldi-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/masterslave/masterslave_vivaldi.tesh) ADD_TEST(msg-token-ring-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg/token_ring ${CMAKE_HOME_DIRECTORY}/examples/msg/token_ring/token_ring.tesh) - endif(CONTEXT_UCONTEXT) + endif() ADD_TEST(msg-migration-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh) ADD_TEST(msg-ptask-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh) @@ -244,7 +244,7 @@ if(NOT enable_memcheck) ADD_TEST(msg-kademlia-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh) ADD_TEST(msg-kademlia-ucontext-parallel ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) ADD_TEST(msg-migration-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/migration/migration.tesh) ADD_TEST(msg-ptask-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/parallel_task/parallel_task.tesh) @@ -261,7 +261,7 @@ if(NOT enable_memcheck) ADD_TEST(msg-bittorrent-raw-parallel ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/bittorrent --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/bittorrent bittorrent.tesh) ADD_TEST(msg-kademlia-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh) ADD_TEST(msg-kademlia-raw-parallel ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/nthreads:4 --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/kademlia --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/kademlia kademlia.tesh) - endif(HAVE_RAWCTX) + endif() IF(${ARCH_32_BITS}) ADD_TEST(gras-ping-sg-32-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh) @@ -285,7 +285,7 @@ if(NOT enable_memcheck) ADD_TEST(gras-all2all-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh) ADD_TEST(gras-pmm-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh) ADD_TEST(gras-synchro-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) ADD_TEST(gras-ping-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_32.tesh) ADD_TEST(gras-rpc-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_32.tesh) @@ -297,9 +297,9 @@ if(NOT enable_memcheck) ADD_TEST(gras-all2all-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_32.tesh) ADD_TEST(gras-pmm-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_32.tesh) ADD_TEST(gras-synchro-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_32.tesh) - endif(HAVE_RAWCTX) + endif() - ELSE(${ARCH_32_BITS}) + ELSE() ADD_TEST(gras-ping-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh) ADD_TEST(gras-rpc-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh) ADD_TEST(gras-spawn-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/spawn --cd ${CMAKE_BINARY_DIR}/examples/gras/spawn ${CMAKE_HOME_DIRECTORY}/examples/gras/spawn/test_sg_64.tesh) @@ -321,7 +321,7 @@ if(NOT enable_memcheck) ADD_TEST(gras-all2all-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh) ADD_TEST(gras-pmm-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh) ADD_TEST(gras-synchro-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) ADD_TEST(gras-ping-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/ping --cd ${CMAKE_BINARY_DIR}/examples/gras/ping ${CMAKE_HOME_DIRECTORY}/examples/gras/ping/test_sg_64.tesh) ADD_TEST(gras-rpc-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/rpc --cd ${CMAKE_BINARY_DIR}/examples/gras/rpc ${CMAKE_HOME_DIRECTORY}/examples/gras/rpc/test_sg_64.tesh) @@ -333,16 +333,16 @@ if(NOT enable_memcheck) ADD_TEST(gras-all2all-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/all2all --cd ${CMAKE_BINARY_DIR}/examples/gras/all2all ${CMAKE_HOME_DIRECTORY}/examples/gras/all2all/test_sg_64.tesh) ADD_TEST(gras-pmm-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/pmm --cd ${CMAKE_BINARY_DIR}/examples/gras/pmm ${CMAKE_HOME_DIRECTORY}/examples/gras/pmm/test_sg_64.tesh) ADD_TEST(gras-synchro-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/synchro --cd ${CMAKE_BINARY_DIR}/examples/gras/synchro ${CMAKE_HOME_DIRECTORY}/examples/gras/synchro/test_sg_64.tesh) - endif(HAVE_RAWCTX) + endif() - ENDIF(${ARCH_32_BITS}) + ENDIF() ADD_TEST(gras-properties-sg-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) if(CONTEXT_UCONTEXT) ADD_TEST(gras-properties-sg-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) ADD_TEST(gras-properties-sg-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/gras/properties --cd ${CMAKE_BINARY_DIR}/examples/gras/properties ${CMAKE_HOME_DIRECTORY}/examples/gras/properties/test_sg.tesh) - endif(HAVE_RAWCTX) + endif() # amok examples ADD_TEST(amok-bandwidth-rl ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_rl.tesh) @@ -354,28 +354,28 @@ if(NOT enable_memcheck) if(HAVE_RAWCTX) ADD_TEST(amok-bandwidth-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh) ADD_TEST(amok-saturate-sg-32-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh) - endif(HAVE_RAWCTX) + endif() if(CONTEXT_UCONTEXT) ADD_TEST(amok-bandwidth-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_32.tesh) ADD_TEST(amok-saturate-sg-32-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_32.tesh) - endif(CONTEXT_UCONTEXT) - ELSE(${ARCH_32_BITS}) + endif() + ELSE() ADD_TEST(amok-bandwidth-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) ADD_TEST(amok-saturate-sg-64-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) if(HAVE_RAWCTX) ADD_TEST(amok-bandwidth-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) ADD_TEST(amok-saturate-sg-64-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) - endif(HAVE_RAWCTX) + endif() if(CONTEXT_UCONTEXT) ADD_TEST(amok-saturate-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/saturate/saturate_sg_64.tesh) ADD_TEST(amok-bandwidth-sg-64-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/amok --cd ${CMAKE_BINARY_DIR}/examples/amok ${CMAKE_HOME_DIRECTORY}/examples/amok/bandwidth/bandwidth_sg_64.tesh) - endif(CONTEXT_UCONTEXT) - ENDIF(${ARCH_32_BITS}) + endif() + ENDIF() # simdag examples if(HAVE_GRAPHVIZ) ADD_TEST(simdag-test-dotload ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag/dot --cd ${CMAKE_BINARY_DIR}/examples/simdag/dot ${CMAKE_HOME_DIRECTORY}/examples/simdag/dot/test_simdag_dotload.tesh) - endif(HAVE_GRAPHVIZ) + endif() ADD_TEST(simdag-test-simdag ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag.tesh) ADD_TEST(simdag-test-simdag2 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag2.tesh) ADD_TEST(simdag-test-seq-access ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/simdag --cd ${CMAKE_BINARY_DIR}/examples/simdag ${CMAKE_HOME_DIRECTORY}/examples/simdag/test_simdag_seq_access.tesh) @@ -390,10 +390,10 @@ if(NOT enable_memcheck) ADD_TEST(msg-gtnets-crosstraffic-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-crosstraffic.tesh) if(CONTEXT_UCONTEXT) ADD_TEST(msg-gtnets-crosstraffic-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-crosstraffic.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) ADD_TEST(msg-gtnets-crosstraffic-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-crosstraffic.tesh) - endif(HAVE_RAWCTX) + endif() if(HAVE_GTNETS) ADD_TEST(msg-gtnets-waxman-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh) @@ -407,14 +407,14 @@ if(NOT enable_memcheck) ADD_TEST(msg-gtnets-onelink-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh) ADD_TEST(msg-gtnets-dogbone-lv08-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh) ADD_TEST(msg-gtnets-onelink-lv08-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) ADD_TEST(msg-gtnets-waxman-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-waxman.tesh) ADD_TEST(msg-gtnets-dogbone-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-gtnets.tesh) ADD_TEST(msg-gtnets-onelink-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-gtnets.tesh) ADD_TEST(msg-gtnets-dogbone-lv08-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-dogbone-lv08.tesh) ADD_TEST(msg-gtnets-onelink-lv08-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/gtnets-onelink-lv08.tesh) - endif(HAVE_RAWCTX) + endif() if(HAVE_TRACING) ADD_TEST(msg-tracing-gtnets-waxman ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-waxman.tesh) @@ -422,14 +422,14 @@ if(NOT enable_memcheck) ADD_TEST(msg-tracing-gtnets-onelink ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-onelink-gtnets.tesh) ADD_TEST(msg-tracing-gtnets-dogbone-lv08 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-dogbone-lv08.tesh) ADD_TEST(msg-tracing-gtnets-onelink-lv08 ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/gtnets/tracing-gtnets-onelink-lv08.tesh) - endif(HAVE_TRACING) - endif(HAVE_GTNETS) + endif() + endif() if(HAVE_NS3) ADD_TEST(msg-ns3-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh) ADD_TEST(msg-ns3-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh) ADD_TEST(msg-ns3-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/ns3/ns3.tesh) - endif(HAVE_NS3) + endif() IF(HAVE_TRACING) ADD_TEST(tracing-help ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test --help-tracing) @@ -442,7 +442,7 @@ if(NOT enable_memcheck) ADD_TEST(tracing-categories ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/categories.tesh) ADD_TEST(tracing-process-migration ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg --cd ${CMAKE_HOME_DIRECTORY}/examples/msg tracing/procmig.tesh) ADD_TEST(graphicator ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} --setenv bindir=${CMAKE_BINARY_DIR}/bin --cd ${CMAKE_HOME_DIRECTORY}/tools/graphicator graphicator.tesh) - ENDIF(HAVE_TRACING) + ENDIF() # Lua examples if(HAVE_LUA) @@ -464,7 +464,7 @@ if(NOT enable_memcheck) set_tests_properties(lua-bittorrent PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so") set_tests_properties(lua-kademlia PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so") set_tests_properties(simdag-test-lua PROPERTIES ENVIRONMENT "LUA_CPATH=${CMAKE_BINARY_DIR}/examples/lua/?.so") - endif(HAVE_LUA) + endif() # END TESH TESTS @@ -473,33 +473,49 @@ if(NOT enable_memcheck) ADD_TEST(smpi-bcast-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast.tesh) ADD_TEST(smpi-reduce-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce.tesh) ADD_TEST(smpi-vector-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/vector.tesh) + ADD_TEST(smpi-hvector-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hvector.tesh) ADD_TEST(smpi-indexed-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/indexed.tesh) ADD_TEST(smpi-struct-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh) ADD_TEST(smpi-pt2pt-thread ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:thread --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh) + if(HAVE_RAWCTX) ADD_TEST(smpi-bcast-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast.tesh) ADD_TEST(smpi-reduce-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce.tesh) ADD_TEST(smpi-vector-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/vector.tesh) + ADD_TEST(smpi-hvector-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hvector.tesh) ADD_TEST(smpi-indexed-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/indexed.tesh) ADD_TEST(smpi-struct-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh) ADD_TEST(smpi-pt2pt-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh) - - endif(HAVE_RAWCTX) + ADD_TEST(NAME smpi-mpich-env-raw COMMAND ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env/runtests + -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/env) + ADD_TEST(NAME smpi-mpich-pt2pt-raw COMMAND ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt/runtests + -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/pt2pt) + ADD_TEST(NAME smpi-mpich-context-raw COMMAND ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context/runtests + -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/context) + ADD_TEST(NAME smpi-mpich-profile-raw COMMAND ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile/runtests + -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/profile) + ADD_TEST(NAME smpi-mpich-coll-raw COMMAND ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll/runtests + -srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll -basedir=${CMAKE_BINARY_DIR}/smpi_script/ -fort=${SMPI_F2C} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/teshsuite/smpi/mpich-test/coll) + set_tests_properties(smpi-mpich-env-raw smpi-mpich-context-raw smpi-mpich-pt2pt-raw smpi-mpich-coll-raw smpi-mpich-profile-raw PROPERTIES PASS_REGULAR_EXPRESSION "-- No differences found; test successful") + + + endif() if(CONTEXT_UCONTEXT) ADD_TEST(smpi-bcast-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/bcast.tesh) ADD_TEST(smpi-reduce-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/reduce.tesh) ADD_TEST(smpi-vector-ucontex ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/vector.tesh) + ADD_TEST(smpi-hvector-ucontex ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/hvector.tesh) ADD_TEST(smpi-indexed-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/indexed.tesh) ADD_TEST(smpi-struct-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/struct.tesh) ADD_TEST(smpi-pt2pt-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --cd ${CMAKE_BINARY_DIR}/teshsuite/smpi ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_TRACING) ADD_TEST(smpi-tracing-ptp ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/tracing/smpi_traced.tesh) ADD_TEST(smpi-replay ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi --cd ${CMAKE_BINARY_DIR}/examples/smpi ${CMAKE_HOME_DIRECTORY}/examples/smpi/replay/smpi_replay.tesh) - endif(HAVE_TRACING) - endif(enable_smpi) + endif() + endif() # examples/msg/mc if(HAVE_MC) @@ -510,13 +526,13 @@ if(NOT enable_memcheck) ADD_TEST(mc-bugged1-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) ADD_TEST(mc-bugged2-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) ADD_TEST(mc-centralized-ucontext ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:ucontext --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) ADD_TEST(mc-bugged1-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) ADD_TEST(mc-bugged2-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) ADD_TEST(mc-centralized-raw ${CMAKE_BINARY_DIR}/bin/tesh ${TESH_OPTION} --cfg contexts/factory:raw --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc centralized.tesh) - endif(HAVE_RAWCTX) - endif(HAVE_MC) + endif() + endif() ### ### Declare that we know that some tests are broken @@ -529,20 +545,20 @@ if(NOT enable_memcheck) set_tests_properties(amok-saturate-sg-32-thread PROPERTIES WILL_FAIL true) if(CONTEXT_UCONTEXT) set_tests_properties(amok-bandwidth-sg-32-ucontext amok-saturate-sg-32-ucontext PROPERTIES WILL_FAIL true) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) set_tests_properties(amok-bandwidth-sg-32-raw amok-saturate-sg-32-raw PROPERTIES WILL_FAIL true) - endif(HAVE_RAWCTX) - else(${ARCH_32_BITS}) + endif() + else() set_tests_properties(amok-bandwidth-sg-64-thread PROPERTIES WILL_FAIL true) set_tests_properties(amok-saturate-sg-64-thread PROPERTIES WILL_FAIL true) if(CONTEXT_UCONTEXT) set_tests_properties(amok-bandwidth-sg-64-ucontext amok-saturate-sg-64-ucontext PROPERTIES WILL_FAIL true) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) set_tests_properties(amok-bandwidth-sg-64-raw amok-saturate-sg-64-raw PROPERTIES WILL_FAIL true) - endif(HAVE_RAWCTX) - endif(${ARCH_32_BITS}) + endif() + endif() # Those tests are broken : set to "fail" for release v3.6 if(release) @@ -552,15 +568,15 @@ if(NOT enable_memcheck) set_tests_properties(mc-centralized-thread PROPERTIES WILL_FAIL true) if(CONTEXT_UCONTEXT) set_tests_properties(mc-centralized-ucontext PROPERTIES WILL_FAIL true) - endif(CONTEXT_UCONTEXT) + endif() if(HAVE_RAWCTX) set_tests_properties(mc-centralized-raw PROPERTIES WILL_FAIL true) - endif(HAVE_RAWCTX) - endif(HAVE_MC) + endif() + endif() - endif(release) + endif() -endif(NOT enable_memcheck) +endif() ADD_TEST(tesh-simdag-full-links01 ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms/two_clusters.xml FULL_LINK) ADD_TEST(tesh-simdag-full-links02 ${CMAKE_BINARY_DIR}/teshsuite/simdag/platforms/basic_parsing_test ${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms/two_clusters_one_name.xml FULL_LINK) @@ -582,8 +598,8 @@ add_test(testall ${CMAKE_BINARY_DIR}/src/testall) if(enable_auto_install) add_test(simgrid_install make install) -endif(enable_auto_install) +endif() if(enable_memcheck) include(${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/memcheck_tests.cmake) -endif(enable_memcheck) +endif() diff --git a/buildtools/Cmake/CTestConfig.cmake b/buildtools/Cmake/CTestConfig.cmake index dd4935ca26..8272ecd9ca 100644 --- a/buildtools/Cmake/CTestConfig.cmake +++ b/buildtools/Cmake/CTestConfig.cmake @@ -3,36 +3,36 @@ if(APPLE) SET(BUILDNAME "APPLE" CACHE TYPE INTERNAL FORCE) -else(APPLE) +else() SET(BUILDNAME "UNIX" CACHE TYPE INTERNAL FORCE) if(WIN32) SET(BUILDNAME "WINDOWS" CACHE TYPE INTERNAL FORCE) - endif(WIN32) -endif(APPLE) + endif() +endif() if(enable_memcheck) set(CTEST_TIMEOUT "300") #TIMEOUT FOR EACH TEST -endif(enable_memcheck) +endif() if(enable_compile_warnings AND enable_compile_optimizations) SET(BUILDNAME "FULL_FLAGS" CACHE TYPE INTERNAL FORCE) -endif(enable_compile_warnings AND enable_compile_optimizations) +endif() if(enable_supernovae) SET(BUILDNAME "SUPERNOVAE" CACHE TYPE INTERNAL FORCE) -endif(enable_supernovae) +endif() if(HAVE_GTNETS) SET(BUILDNAME "GTNETS" CACHE TYPE INTERNAL FORCE) -endif(HAVE_GTNETS) +endif() if(HAVE_MC) SET(BUILDNAME "MODEL-CHECKING" CACHE TYPE INTERNAL FORCE) -endif(HAVE_MC) +endif() if(enable_memcheck) SET(BUILDNAME "MEMCHECK" CACHE TYPE INTERNAL FORCE) -endif(enable_memcheck) +endif() set(osname ${CMAKE_SYSTEM_NAME}) set(cpu ${CMAKE_SYSTEM_PROCESSOR}) @@ -47,4 +47,4 @@ SET(CTEST_CUSTOM_MAXIMUM_PASSED_TEST_OUTPUT_SIZE "3000000") set(PIPOL_IMAGE $ENV{PIPOL_IMAGE}) if(NOT ${PIPOL_IMAGE} MATCHES "\n") set(SITE ${PIPOL_IMAGE}) -endif(NOT ${PIPOL_IMAGE} MATCHES "\n") +endif() diff --git a/buildtools/Cmake/CompleteInFiles.cmake b/buildtools/Cmake/CompleteInFiles.cmake index f020bf1ea0..caa2a03c9a 100644 --- a/buildtools/Cmake/CompleteInFiles.cmake +++ b/buildtools/Cmake/CompleteInFiles.cmake @@ -12,12 +12,12 @@ IF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86") set(PROCESSOR_i686 1) set(SIMGRID_SYSTEM_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}") message(STATUS "System processor: ${CMAKE_SYSTEM_PROCESSOR}") - ELSE(${ARCH_32_BITS}) + ELSE() message(STATUS "System processor: amd64") set(SIMGRID_SYSTEM_PROCESSOR "amd64") set(PROCESSOR_x86_64 1) set(PROCESSOR_i686 0) - ENDIF(${ARCH_32_BITS}) + ENDIF() set(HAVE_RAWCTX 1) ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^alpha") @@ -52,10 +52,10 @@ ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^s390") ELSEIF(CMAKE_SYSTEM_PROCESSOR MATCHES "^sh") message(STATUS "System processor: sh") -ELSE(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") #PROCESSOR NOT fIND +ELSE() #PROCESSOR NOT fIND message(STATUS "PROCESSOR NOT FOUND: ${CMAKE_SYSTEM_PROCESSOR}") -ENDIF(CMAKE_SYSTEM_PROCESSOR MATCHES ".86") +ENDIF() message(STATUS "Cmake version ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}") @@ -70,25 +70,25 @@ TEST_BIG_ENDIAN(BIGENDIAN) include(FindGraphviz) if(WIN32) include(FindPcreWin) -else(WIN32) +else() include(FindPCRE) -endif(WIN32) +endif() set(HAVE_GTNETS 0) if(enable_gtnets) include(FindGTnets) -endif(enable_gtnets) +endif() if(enable_smpi) include(FindF2c) SET(HAVE_SMPI 1) -endif(enable_smpi) +endif() if(enable_lua) include(FindLua51Simgrid) -endif(enable_lua) +endif() set(HAVE_NS3 0) if(enable_ns3) include(FindNS3) -endif(enable_ns3) +endif() # Checks for header libraries functions. CHECK_LIBRARY_EXISTS(pthread pthread_create "" pthread) @@ -152,22 +152,22 @@ execute_process( if(HAVE_thread_storage_run) set(HAVE_THREAD_LOCAL_STORAGE 0) -else(HAVE_thread_storage_run) +else() set(HAVE_THREAD_LOCAL_STORAGE 1) -endif(HAVE_thread_storage_run) +endif() # Our usage of mmap is Linux-specific (flag MAP_ANONYMOUS), but kFreeBSD uses a GNU libc IF(NOT "${CMAKE_SYSTEM}" MATCHES "Linux" AND NOT "${CMAKE_SYSTEM}" MATCHES "kFreeBSD" AND NOT "${CMAKE_SYSTEM}" MATCHES "GNU") SET(HAVE_MMAP 0) message(STATUS "Warning: MMAP is thought as non functional on this architecture (${CMAKE_SYSTEM})") -ENDIF(NOT "${CMAKE_SYSTEM}" MATCHES "Linux" AND NOT "${CMAKE_SYSTEM}" MATCHES "kFreeBSD" AND NOT "${CMAKE_SYSTEM}" MATCHES "GNU") +ENDIF() if(WIN32) #THOSE FILES ARE FUNCTIONS ARE NOT DETECTED BUT THEY SHOULD... set(HAVE_UCONTEXT_H 1) set(HAVE_MAKECONTEXT 1) set(HAVE_SNPRINTF 1) set(HAVE_VSNPRINTF 1) -endif(WIN32) +endif() set(CONTEXT_UCONTEXT 0) SET(CONTEXT_THREADS 0) @@ -175,40 +175,40 @@ SET(HAVE_TRACING 1) if(enable_tracing) SET(HAVE_TRACING 1) -else(enable_tracing) +else() SET(HAVE_TRACING 0) -endif(enable_tracing) +endif() if(enable_jedule) SET(HAVE_JEDULE 1) -endif(enable_jedule) +endif() if(enable_latency_bound_tracking) SET(HAVE_LATENCY_BOUND_TRACKING 1) -else(enable_latency_bound_tracking) +else() if(enable_gtnets) message(STATUS "Warning : Turning latency_bound_tracking to ON because GTNeTs is ON") SET(enable_latency_bound_tracking ON) SET(HAVE_LATENCY_BOUND_TRACKING 1) - else(enable_gtnets) + else() SET(HAVE_LATENCY_BOUND_TRACKING 0) - endif(enable_gtnets) -endif(enable_latency_bound_tracking) + endif() +endif() if(enable_mallocators) SET(MALLOCATOR_IS_WANTED 1) -else(enable_mallocators) +else() SET(MALLOCATOR_IS_WANTED 0) -endif(enable_mallocators) +endif() if(enable_model-checking AND HAVE_MMAP) SET(HAVE_MC 1) SET(MMALLOC_WANT_OVERRIDE_LEGACY 1) include(FindLibunwind) -else(enable_model-checking AND HAVE_MMAP) +else() SET(HAVE_MC 0) SET(MMALLOC_WANT_OVERRIDE_LEGACY 0) -endif(enable_model-checking AND HAVE_MMAP) +endif() #-------------------------------------------------------------------------------------------------- ### Check for some architecture dependent values @@ -222,7 +222,7 @@ if(pthread) set(pthread 1) elseif(pthread) set(pthread 0) -endif(pthread) +endif() if(pthread) ### Test that we have a way to create semaphores @@ -239,10 +239,10 @@ if(pthread) set(HAVE_SEM_OPEN 0) message(STATUS "Warning: sem_open not compilable") message(STATUS "HAVE_SEM_OPEN_comp_output: ${HAVE_SEM_OPEN_comp_output}") - else(HAVE_SEM_OPEN_compil) + else() set(HAVE_SEM_OPEN 1) message(STATUS "sem_open is compilable") - endif(HAVE_SEM_OPEN_compil) + endif() exec_program("${CMAKE_BINARY_DIR}/testprog" RETURN_VALUE HAVE_SEM_OPEN_run OUTPUT_VARIABLE var_compil) file(REMOVE "${CMAKE_BINARY_DIR}/testprog*") @@ -250,14 +250,14 @@ if(pthread) if(NOT HAVE_SEM_OPEN_run) set(HAVE_SEM_OPEN 1) message(STATUS "sem_open is executable") - else(NOT HAVE_SEM_OPEN_run) + else() set(HAVE_SEM_OPEN 0) message(STATUS "Warning: sem_open not executable") - endif(NOT HAVE_SEM_OPEN_run) + endif() - else(HAVE_SEM_OPEN_LIB) + else() set(HAVE_SEM_OPEN 0) - endif(HAVE_SEM_OPEN_LIB) + endif() if(HAVE_SEM_INIT_LIB) exec_program( @@ -270,10 +270,10 @@ if(pthread) set(HAVE_SEM_INIT 0) message(STATUS "Warning: sem_init not compilable") message(STATUS "HAVE_SEM_INIT_comp_output: ${HAVE_SEM_OPEN_comp_output}") - else(HAVE_SEM_INIT_compil) + else() set(HAVE_SEM_INIT 1) message(STATUS "sem_init is compilable") - endif(HAVE_SEM_INIT_compil) + endif() exec_program("${CMAKE_BINARY_DIR}/testprog" RETURN_VALUE HAVE_SEM_INIT_run OUTPUT_VARIABLE var_compil) file(REMOVE "${CMAKE_BINARY_DIR}/testprog*") @@ -281,15 +281,15 @@ if(pthread) if(NOT HAVE_SEM_INIT_run) set(HAVE_SEM_INIT 1) message(STATUS "sem_init is executable") - else(NOT HAVE_SEM_INIT_run) + else() set(HAVE_SEM_INIT 0) message(STATUS "Warning: sem_init not executable") - endif(NOT HAVE_SEM_INIT_run) - endif(HAVE_SEM_INIT_LIB) + endif() + endif() if(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT) message(FATAL_ERROR "Semaphores are not usable (neither sem_open nor sem_init is both compilable and executable), but they are mandatory to threads (you may need to mount /dev).") - endif(NOT HAVE_SEM_OPEN AND NOT HAVE_SEM_INIT) + endif() ### Test that we have a way to timewait for semaphores @@ -304,11 +304,11 @@ if(pthread) if(HAVE_SEM_TIMEDWAIT_run) set(HAVE_SEM_TIMEDWAIT 0) message(STATUS "timedwait not compilable") - else(HAVE_SEM_TIMEDWAIT_run) + else() set(HAVE_SEM_TIMEDWAIT 1) message(STATUS "timedwait is compilable") - endif(HAVE_SEM_TIMEDWAIT_run) - endif(HAVE_SEM_TIMEDWAIT_LIB) + endif() + endif() ### HAVE_MUTEX_TIMEDLOCK @@ -323,33 +323,33 @@ if(pthread) if(HAVE_MUTEX_TIMEDLOCK_run) set(HAVE_MUTEX_TIMEDLOCK 0) message(STATUS "timedlock not compilable") - else(HAVE_MUTEX_TIMEDLOCK_run) + else() message(STATUS "timedlock is compilable") set(HAVE_MUTEX_TIMEDLOCK 1) - endif(HAVE_MUTEX_TIMEDLOCK_run) - endif(HAVE_MUTEX_TIMEDLOCK_LIB) -endif(pthread) + endif() + endif() +endif() # AC_CHECK_MCSC(mcsc=yes, mcsc=no) set(mcsc_flags "") if(CMAKE_SYSTEM_NAME MATCHES "Darwin") set(mcsc_flags "-D_XOPEN_SOURCE") -endif(CMAKE_SYSTEM_NAME MATCHES "Darwin") +endif() if(WIN32) if(ARCH_32_BITS) set(mcsc_flags "-D_XBT_WIN32 -D_I_X86_ -I${CMAKE_HOME_DIRECTORY}/include/xbt -I${CMAKE_HOME_DIRECTORY}/src/xbt") - else(ARCH_32_BITS) + else() set(mcsc_flags "-D_XBT_WIN32 -D_AMD64_ -I${CMAKE_HOME_DIRECTORY}/include/xbt -I${CMAKE_HOME_DIRECTORY}/src/xbt") - endif(ARCH_32_BITS) -endif(WIN32) + endif() +endif() IF(CMAKE_CROSSCOMPILING) IF(WIN32) set(windows_context "yes") set(IS_WINDOWS 1) - ENDIF(WIN32) -ELSE(CMAKE_CROSSCOMPILING) + ENDIF() +ELSE() file(REMOVE "${CMAKE_BINARY_DIR}/testprog*") file(REMOVE ${CMAKE_BINARY_DIR}/conftestval) exec_program( @@ -360,9 +360,9 @@ ELSE(CMAKE_CROSSCOMPILING) if(NOT COMPILE_mcsc_VAR) message(STATUS "prog_AC_CHECK_MCSC.c is compilable") exec_program("${CMAKE_BINARY_DIR}/testprog" OUTPUT_VARIABLE var_compil) - else(NOT COMPILE_mcsc_VAR) + else() message(STATUS "prog_AC_CHECK_MCSC.c is not compilable") - endif(NOT COMPILE_mcsc_VAR) + endif() file(REMOVE "${CMAKE_BINARY_DIR}/testprog*") if(EXISTS "${CMAKE_BINARY_DIR}/conftestval") @@ -371,15 +371,15 @@ ELSE(CMAKE_CROSSCOMPILING) if(mcsc) set(mcsc "yes") set(HAVE_UCONTEXT_H 1) - else(mcsc) + else() set(mcsc "no") - endif(mcsc) - else(EXISTS "${CMAKE_BINARY_DIR}/conftestval") + endif() + else() set(mcsc "no") - endif(EXISTS "${CMAKE_BINARY_DIR}/conftestval") + endif() message(STATUS "mcsc: ${mcsc}") -ENDIF(CMAKE_CROSSCOMPILING) +ENDIF() if(mcsc MATCHES "no" AND pthread) if(HAVE_WINDOWS_H) @@ -387,30 +387,30 @@ if(mcsc MATCHES "no" AND pthread) set(IS_WINDOWS 1) elseif(HAVE_WINDOWS_H) message(FATAL_ERROR "no appropriate backend found") - endif(HAVE_WINDOWS_H) -endif(mcsc MATCHES "no" AND pthread) + endif() +endif() #Only windows if(WIN32) if(NOT HAVE_WINDOWS_H) message(FATAL_ERROR "no appropriate backend found windows") - endif(NOT HAVE_WINDOWS_H) -endif(WIN32) + endif() +endif() if(windows_context MATCHES "yes") message(STATUS "Context change to windows") -endif(windows_context MATCHES "yes") +endif() #If can have both context if(mcsc) set(CONTEXT_UCONTEXT 1) -endif(mcsc) +endif() if(pthread) set(CONTEXT_THREADS 1) -endif(pthread) +endif() ############### ## GIT version check @@ -428,8 +428,8 @@ if(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/ AND NOT WIN32) STRING(REPLACE " +0000" "" GIT_DATE ${GIT_DATE}) STRING(REPLACE " " "~" GIT_DATE ${GIT_DATE}) STRING(REPLACE ":" "-" GIT_DATE ${GIT_DATE}) - endif(url) -endif(EXISTS ${CMAKE_HOME_DIRECTORY}/.git/ AND NOT WIN32) + endif() +endif() ################################### ## SimGrid and GRAS specific checks @@ -445,10 +445,10 @@ IF(NOT CMAKE_CROSSCOMPILING) if(BIGENDIAN) set(val_big "B${var1}") set(GRAS_BIGENDIAN 1) - else(BIGENDIAN) + else() set(val_big "l${var1}") set(GRAS_BIGENDIAN 0) - endif(BIGENDIAN) + endif() # The syntax of this magic string is given in src/xbt/datadesc/ddt_convert.c # It kinda matches the values that the xbt_arch_desc_t structure can take @@ -484,68 +484,68 @@ IF(NOT CMAKE_CROSSCOMPILING) #gras_arch=0; gras_size=32; gras_arch_name=little32_1; SET(GRAS_ARCH_32_BITS 1) SET(GRAS_THISARCH 0) - endif(val_big MATCHES "l_C:1/1:_I:2/1:4/1:4/1:8/1:_P:4/1:4/1:_D:4/1:8/1:") + endif() if(val_big MATCHES "l_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:") #gras_arch=1; gras_size=32; gras_arch_name=little32_2; SET(GRAS_ARCH_32_BITS 1) SET(GRAS_THISARCH 1) - endif(val_big MATCHES "l_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:") + endif() if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:") #gras_arch=2; gras_size=32; gras_arch_name=little32_4; SET(GRAS_ARCH_32_BITS 1) SET(GRAS_THISARCH 2) - endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:") + endif() if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:") #gras_arch=3; gras_size=32; gras_arch_name=little32_8; SET(GRAS_ARCH_32_BITS 1) SET(GRAS_THISARCH 3) - endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:") + endif() if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:") #gras_arch=4; gras_size=64; gras_arch_name=little64; SET(GRAS_ARCH_32_BITS 0) SET(GRAS_THISARCH 4) - endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:") + endif() if(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:8/8:8/8:_D:4/4:8/8:") #gras_arch=5; gras_size=64; gras_arch_name=little64_2; SET(GRAS_ARCH_32_BITS 0) SET(GRAS_THISARCH 5) - endif(val_big MATCHES "l_C:1/1:_I:2/2:4/4:4/4:8/8:_P:8/8:8/8:_D:4/4:8/8:") + endif() if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:") #gras_arch=6; gras_size=32; gras_arch_name=big32_8; SET(GRAS_ARCH_32_BITS 1) SET(GRAS_THISARCH 6) - endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/8:") + endif() if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:") #gras_arch=7; gras_size=32; gras_arch_name=big32_8_4; SET(GRAS_ARCH_32_BITS 1) SET(GRAS_THISARCH 7) - endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/8:_P:4/4:4/4:_D:4/4:8/4:") + endif() if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:") #gras_arch=8; gras_size=32; gras_arch_name=big32_4; SET(GRAS_ARCH_32_BITS 1) SET(GRAS_THISARCH 8) - endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:4/4:8/4:_P:4/4:4/4:_D:4/4:8/4:") + endif() if(val_big MATCHES "B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:") #gras_arch=9; gras_size=32; gras_arch_name=big32_2; SET(GRAS_ARCH_32_BITS 1) SET(GRAS_THISARCH 9) - endif(val_big MATCHES "B_C:1/1:_I:2/2:4/2:4/2:8/2:_P:4/2:4/2:_D:4/2:8/2:") + endif() if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:") #gras_arch=10; gras_size=64; gras_arch_name=big64; SET(GRAS_ARCH_32_BITS 0) SET(GRAS_THISARCH 10) - endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/8:") + endif() if(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4:") #gras_arch=11; gras_size=64; gras_arch_name=big64_8_4; SET(GRAS_ARCH_32_BITS 0) SET(GRAS_THISARCH 11) - endif(val_big MATCHES "B_C:1/1:_I:2/2:4/4:8/8:8/8:_P:8/8:8/8:_D:4/4:8/4:") + endif() if(GRAS_THISARCH MATCHES "none") message(STATUS "architecture: ${val_big}") message(FATAL_ERROR "GRAS_THISARCH is empty: '${GRAS_THISARCH}'") - endif(GRAS_THISARCH MATCHES "none") + endif() # Check architecture signature end try_run(RUN_GRAS_VAR COMPILE_GRAS_VAR @@ -566,7 +566,7 @@ IF(NOT CMAKE_CROSSCOMPILING) ) message(STATUS "SIZEOF_MAX ${var3}") SET(SIZEOF_MAX ${var3}) -ENDIF(NOT CMAKE_CROSSCOMPILING) +ENDIF() #-------------------------------------------------------------------------------------------------- @@ -575,16 +575,16 @@ if(HAVE_MAKECONTEXT OR WIN32) set(makecontext_CPPFLAGS "-DTEST_makecontext") if(CMAKE_SYSTEM_NAME MATCHES "Darwin") set(makecontext_CPPFLAGS_2 "-D_XOPEN_SOURCE") - endif(CMAKE_SYSTEM_NAME MATCHES "Darwin") + endif() if(WIN32) if(ARCH_32_BITS) set(makecontext_CPPFLAGS "-DTEST_makecontext -D_I_X86_") - else(ARCH_32_BITS) + else() set(makecontext_CPPFLAGS "-DTEST_makecontext -D_AMD64_") - endif(ARCH_32_BITS) + endif() set(makecontext_CPPFLAGS_2 "-D_XBT_WIN32 -I${CMAKE_HOME_DIRECTORY}/include/xbt -I${CMAKE_HOME_DIRECTORY}/src/xbt") - endif(WIN32) + endif() file(REMOVE ${CMAKE_BINARY_DIR}/conftestval) @@ -605,10 +605,10 @@ if(HAVE_MAKECONTEXT OR WIN32) set(pth_sksize_makecontext "#define pth_sksize_makecontext(skaddr,sksize) (${makecontext_size})") message(STATUS "${pth_skaddr_makecontext}") message(STATUS "${pth_sksize_makecontext}") - else(EXISTS ${CMAKE_BINARY_DIR}/conftestval) + else() # message(FATAL_ERROR "makecontext is not compilable") - endif(EXISTS ${CMAKE_BINARY_DIR}/conftestval) -endif(HAVE_MAKECONTEXT OR WIN32) + endif() +endif() #-------------------------------------------------------------------------------------------------- @@ -621,12 +621,12 @@ if (NOT CMAKE_CROSSCOMPILING) file(READ "${CMAKE_BINARY_DIR}/conftestval" stack) if(stack MATCHES "down") set(PTH_STACKGROWTH "-1") - endif(stack MATCHES "down") + endif() if(stack MATCHES "up") set(PTH_STACKGROWTH "1") - endif(stack MATCHES "up") + endif() -endif(NOT CMAKE_CROSSCOMPILING) +endif() ############### ## System checks ## @@ -645,9 +645,9 @@ try_run(RUN_PRINTF_NULL_VAR COMPILE_PRINTF_NULL_VAR if(RUN_PRINTF_NULL_VAR MATCHES "FAILED_TO_RUN") SET(PRINTF_NULL_WORKING "0") -else(RUN_PRINTF_NULL_VAR MATCHES "FAILED_TO_RUN") +else() SET(PRINTF_NULL_WORKING "1") -endif(RUN_PRINTF_NULL_VAR MATCHES "FAILED_TO_RUN") +endif() #AC_CHECK_VA_COPY @@ -701,49 +701,49 @@ foreach(fct ${diff_va}) set(HAVE_VA_COPY 1) set(ac_cv_va_copy "C99") set(__VA_COPY_USE_C99 "va_copy((d),(s))") - endif(${fctbis} STREQUAL "va_copy((d),(s))") + endif() if(${fctbis} STREQUAL "VA_COPY((d),(s))") set(ac_cv_va_copy "GCM") set(__VA_COPY_USE_GCM "VA_COPY((d),(s))") - endif(${fctbis} STREQUAL "VA_COPY((d),(s))") + endif() if(${fctbis} STREQUAL "__va_copy((d),(s))") set(ac_cv_va_copy "GCH") set(__VA_COPY_USE_GCH "__va_copy((d),(s))") - endif(${fctbis} STREQUAL "__va_copy((d),(s))") + endif() if(${fctbis} STREQUAL "__builtin_va_copy((d),(s))") set(ac_cv_va_copy "GCB") set(__VA_COPY_USE_GCB "__builtin_va_copy((d),(s))") - endif(${fctbis} STREQUAL "__builtin_va_copy((d),(s))") + endif() if(${fctbis} STREQUAL "do { (d) = (s) } while (0)") set(ac_cv_va_copy "ASS") set(__VA_COPY_USE_ASS "do { (d) = (s); } while (0)") - endif(${fctbis} STREQUAL "do { (d) = (s) } while (0)") + endif() if(${fctbis} STREQUAL "do { *(d) = *(s) } while (0)") set(ac_cv_va_copy "ASP") set(__VA_COPY_USE_ASP "do { *(d) = *(s); } while (0)") - endif(${fctbis} STREQUAL "do { *(d) = *(s) } while (0)") + endif() if(${fctbis} STREQUAL "memcpy((void *)&(d), (void *)&(s), sizeof(s))") set(ac_cv_va_copy "CPS") set(__VA_COPY_USE_CPS "memcpy((void *)&(d), (void *)&(s), sizeof(s))") - endif(${fctbis} STREQUAL "memcpy((void *)&(d), (void *)&(s), sizeof(s))") + endif() if(${fctbis} STREQUAL "memcpy((void *)(d), (void *)(s), sizeof(*(s)))") set(ac_cv_va_copy "CPP") set(__VA_COPY_USE_CPP "memcpy((void *)(d), (void *)(s), sizeof(*(s)))") - endif(${fctbis} STREQUAL "memcpy((void *)(d), (void *)(s), sizeof(*(s)))") + endif() if(NOT STATUS_OK) set(__VA_COPY_USE "__VA_COPY_USE_${ac_cv_va_copy}(d, s)") - endif(NOT STATUS_OK) + endif() set(STATUS_OK "1") - endif(COMPILE_VA_NULL_VAR) + endif() endforeach(fct ${diff_va}) @@ -757,78 +757,78 @@ try_compile(COMPILE_RESULT_VAR if(NOT COMPILE_RESULT_VAR) SET(need_getline "#define SIMGRID_NEED_GETLINE 1") SET(SIMGRID_NEED_GETLINE 1) -else(NOT COMPILE_RESULT_VAR) +else() SET(need_getline "") SET(SIMGRID_NEED_GETLINE 0) -endif(NOT COMPILE_RESULT_VAR) +endif() ### check for a working snprintf if(HAVE_SNPRINTF AND HAVE_VSNPRINTF OR WIN32) if(WIN32) #set(HAVE_SNPRINTF 1) #set(HAVE_VSNPRINTF 1) - endif(WIN32) + endif() if(CMAKE_CROSSCOMPILING) set(RUN_SNPRINTF_FUNC "cross") #set(PREFER_PORTABLE_SNPRINTF 1) - else(CMAKE_CROSSCOMPILING) + else() try_run(RUN_SNPRINTF_FUNC_VAR COMPILE_SNPRINTF_FUNC_VAR ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_snprintf.c ) - endif(CMAKE_CROSSCOMPILING) + endif() if(CMAKE_CROSSCOMPILING) set(RUN_VSNPRINTF_FUNC "cross") set(PREFER_PORTABLE_VSNPRINTF 1) - else(CMAKE_CROSSCOMPILING) + else() try_run(RUN_VSNPRINTF_FUNC_VAR COMPILE_VSNPRINTF_FUNC_VAR ${CMAKE_BINARY_DIR} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/test_prog/prog_vsnprintf.c ) - endif(CMAKE_CROSSCOMPILING) + endif() set(PREFER_PORTABLE_SNPRINTF 0) if(RUN_VSNPRINTF_FUNC_VAR MATCHES "FAILED_TO_RUN") set(PREFER_PORTABLE_SNPRINTF 1) - endif(RUN_VSNPRINTF_FUNC_VAR MATCHES "FAILED_TO_RUN") + endif() if(RUN_SNPRINTF_FUNC_VAR MATCHES "FAILED_TO_RUN") set(PREFER_PORTABLE_SNPRINTF 1) - endif(RUN_SNPRINTF_FUNC_VAR MATCHES "FAILED_TO_RUN") -endif(HAVE_SNPRINTF AND HAVE_VSNPRINTF OR WIN32) + endif() +endif() ### check for asprintf function familly if(HAVE_ASPRINTF) SET(simgrid_need_asprintf "") SET(NEED_ASPRINTF 0) -else(HAVE_ASPRINTF) +else() SET(simgrid_need_asprintf "#define SIMGRID_NEED_ASPRINTF 1") SET(NEED_ASPRINTF 1) -endif(HAVE_ASPRINTF) +endif() if(HAVE_VASPRINTF) SET(simgrid_need_vasprintf "") SET(NEED_VASPRINTF 0) -else(HAVE_VASPRINTF) +else() SET(simgrid_need_vasprintf "#define SIMGRID_NEED_VASPRINTF 1") SET(NEED_VASPRINTF 1) -endif(HAVE_VASPRINTF) +endif() ### check for addr2line find_path(ADDR2LINE NAMES addr2line PATHS NO_DEFAULT_PATHS ) if(ADDR2LINE) set(ADDR2LINE "${ADDR2LINE}/addr2line") -endif(ADDR2LINE) +endif() ### Check if OSX can compile with ucontext (with gcc 4.[1-5] it is broken) if(APPLE) if(APPLE_NEED_GCC_VERSION GREATER COMPILER_C_VERSION_MAJOR_MINOR) message(STATUS "Ucontext can't be used with this version of gcc (must be greater than 4.5)") set(HAVE_UCONTEXT_H 0) - endif(APPLE_NEED_GCC_VERSION GREATER COMPILER_C_VERSION_MAJOR_MINOR) -endif(APPLE) + endif() +endif() ### File to create @@ -842,12 +842,12 @@ configure_file("${CMAKE_HOME_DIRECTORY}/include/simgrid_config.h.in" "${CMAKE_ set(top_srcdir "${CMAKE_HOME_DIRECTORY}") set(srcdir "${CMAKE_HOME_DIRECTORY}/src") +### Script used when simgrid is installed set(exec_prefix ${CMAKE_INSTALL_PREFIX}) -set(includedir ${CMAKE_INSTALL_PREFIX}/include) -set(top_builddir ${CMAKE_HOME_DIRECTORY}) +set(includeflag "-I${CMAKE_INSTALL_PREFIX}/include -I${CMAKE_INSTALL_PREFIX}/include/smpi") +set(includedir "${CMAKE_INSTALL_PREFIX}/include") set(libdir ${exec_prefix}/lib) -set(CMAKE_LINKARGS "${CMAKE_BINARY_DIR}/lib") -set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:${GTNETS_LIB_PATH}:${HAVE_NS3_LIB}:$LD_LIBRARY_PATH") +set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=${CMAKE_INSTALL_PREFIX}/lib:${GTNETS_LIB_PATH}:${HAVE_NS3_LIB}:$LD_LIBRARY_PATH") configure_file(${CMAKE_HOME_DIRECTORY}/include/smpi/smpif.h.in ${CMAKE_BINARY_DIR}/include/smpi/smpif.h @ONLY) configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpicc.in ${CMAKE_BINARY_DIR}/bin/smpicc @ONLY) @@ -855,12 +855,31 @@ configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpif2c.in ${CMAKE_BINARY_DIR}/b configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpiff.in ${CMAKE_BINARY_DIR}/bin/smpiff @ONLY) configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpirun.in ${CMAKE_BINARY_DIR}/bin/smpirun @ONLY) +### Script used when simgrid is compiling +set(includeflag "-I${CMAKE_HOME_DIRECTORY}/include -I${CMAKE_HOME_DIRECTORY}/include/smpi") +set(includeflag "${includeflag} -I${CMAKE_BINARY_DIR}/include -I${CMAKE_BINARY_DIR}/include/smpi") +set(includedir "${CMAKE_HOME_DIRECTORY}/include") +set(exec_prefix "${CMAKE_BINARY_DIR}/smpi_script/") +set(CMAKE_SMPI_COMMAND "export LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:${GTNETS_LIB_PATH}:${HAVE_NS3_LIB}:$LD_LIBRARY_PATH") +set(libdir "${CMAKE_BINARY_DIR}/lib") + +configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpicc.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc @ONLY) +configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpif2c.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpif2c @ONLY) +configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpiff.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff @ONLY) +configure_file(${CMAKE_HOME_DIRECTORY}/src/smpi/smpirun.in ${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun @ONLY) + +set(top_builddir ${CMAKE_HOME_DIRECTORY}) + if(NOT WIN32) exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpicc" OUTPUT_VARIABLE OKITOKI) exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpif2c" OUTPUT_VARIABLE OKITOKI) exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpiff" OUTPUT_VARIABLE OKITOKI) exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/bin/smpirun" OUTPUT_VARIABLE OKITOKI) -endif(NOT WIN32) + exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc" OUTPUT_VARIABLE OKITOKI) + exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpif2c" OUTPUT_VARIABLE OKITOKI) + exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff" OUTPUT_VARIABLE OKITOKI) + exec_program("chmod a=rwx ${CMAKE_BINARY_DIR}/smpi_script/bin/smpirun" OUTPUT_VARIABLE OKITOKI) +endif() set(generated_headers_to_install ${CMAKE_CURRENT_BINARY_DIR}/include/smpi/smpif.h @@ -888,7 +907,7 @@ set(generated_files_to_clean ) if("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") -else("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") +else() configure_file(${CMAKE_HOME_DIRECTORY}/examples/smpi/hostfile ${CMAKE_BINARY_DIR}/examples/smpi/hostfile COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/msg/small_platform.xml ${CMAKE_BINARY_DIR}/examples/msg/small_platform.xml COPYONLY) configure_file(${CMAKE_HOME_DIRECTORY}/examples/msg/small_platform_with_routers.xml ${CMAKE_BINARY_DIR}/examples/msg/small_platform_with_routers.xml COPYONLY) @@ -909,14 +928,14 @@ else("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") ${CMAKE_BINARY_DIR}/examples/smpi/replay/actions_bcast.txt ${CMAKE_BINARY_DIR}/teshsuite/smpi/hostfile ) -endif("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") +endif() SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${generated_files_to_clean}") IF(${ARCH_32_BITS}) set(WIN_ARCH "32") -ELSE(${ARCH_32_BITS}) +ELSE() set(WIN_ARCH "64") -ENDIF(${ARCH_32_BITS}) +ENDIF() configure_file("${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/src/simgrid.nsi.in" "${CMAKE_BINARY_DIR}/simgrid.nsi" @ONLY IMMEDIATE) diff --git a/buildtools/Cmake/DefinePackages.cmake b/buildtools/Cmake/DefinePackages.cmake index 2480bb4898..0f4a26f1d6 100644 --- a/buildtools/Cmake/DefinePackages.cmake +++ b/buildtools/Cmake/DefinePackages.cmake @@ -126,12 +126,12 @@ if(SMPI_F2C) ${SMPI_SRC} src/smpi/smpi_f77.c ) -else(SMPI_F2C) +else() set(EXTRA_DIST ${EXTRA_DIST} src/smpi/smpi_f77.c ) -endif(SMPI_F2C) +endif() set(GRAS_RL_SRC ${XBT_RL_SRC} @@ -203,7 +203,7 @@ if(HAVE_MMAP) ${XBT_SRC} src/xbt/mmalloc/mm.c ) -endif(HAVE_MMAP) +endif() set(GTNETS_SRC src/surf/gtnets/gtnets_interface.cc @@ -325,11 +325,11 @@ if(HAVE_GRAPHVIZ) set(SIMDAG_SRC ${SIMDAG_SRC} src/simdag/sd_dotloader.c ) -else(HAVE_GRAPHVIZ) +else() set(EXTRA_DIST ${EXTRA_DIST} src/simdag/sd_dotloader.c ) -endif(HAVE_GRAPHVIZ) +endif() set(GRAS_COMMON_SRC src/gras/Msg/gras_msg_exchange.c @@ -509,38 +509,38 @@ if(${CONTEXT_THREADS}) #pthread src/simix/smx_context_thread.c src/xbt/xbt_os_thread.c ) -else(${CONTEXT_THREADS}) # NOT pthread +else() # NOT pthread set(EXTRA_DIST ${EXTRA_DIST} src/simix/smx_context_thread.c src/xbt/xbt_os_thread.c ) -endif(${CONTEXT_THREADS}) +endif() if(${CONTEXT_UCONTEXT}) #ucontext set(SURF_SRC ${SURF_SRC} src/simix/smx_context_sysv.c ) -else(${CONTEXT_UCONTEXT}) # NOT ucontext +else() # NOT ucontext set(EXTRA_DIST ${EXTRA_DIST} src/simix/smx_context_sysv.c ) -endif(${CONTEXT_UCONTEXT}) +endif() # -->HAVE_GTNETS if(HAVE_GTNETS) set(GTNETS_USED ${GTNETS_SRC} ) -else(HAVE_GTNETS) +else() set(GTNETS_USED "") set(EXTRA_DIST ${EXTRA_DIST} ${GTNETS_SRC} ) -endif(HAVE_GTNETS) +endif() ### Simgrid Lib sources set(simgrid_sources @@ -563,14 +563,14 @@ if(HAVE_MC) ${simgrid_sources} ${MC_SRC} ) -endif(HAVE_MC) +endif() if(HAVE_NS3) set(simgrid_sources ${simgrid_sources} ${NS3_SRC} ) -endif(HAVE_NS3) +endif() # WINDOWS if(WIN32) @@ -580,7 +580,7 @@ if(WIN32) src/xbt/win32_ucontext.c src/xbt/xbt_os_thread.c ) -endif(WIN32) +endif() ### Gras Lib sources set(gras_sources @@ -595,12 +595,12 @@ if(${HAVE_LUA}) ${simgrid_sources} ${LUA_SRC} ) -else(${HAVE_LUA}) +else() set(EXTRA_DIST ${EXTRA_DIST} ${LUA_SRC} ) -endif(${HAVE_LUA}) +endif() set(DOC_SOURCES doc/amok_bw_sat.png @@ -913,6 +913,11 @@ set(TESHSUITE_CMAKEFILES_TXT teshsuite/simdag/platforms/CMakeLists.txt teshsuite/xbt/CMakeLists.txt teshsuite/smpi/CMakeLists.txt + teshsuite/smpi/mpich-test/env/CMakeLists.txt + teshsuite/smpi/mpich-test/coll/CMakeLists.txt + teshsuite/smpi/mpich-test/context/CMakeLists.txt + teshsuite/smpi/mpich-test/profile/CMakeLists.txt + teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt ) set(TOOLS_CMAKEFILES_TXT diff --git a/buildtools/Cmake/Distrib.cmake b/buildtools/Cmake/Distrib.cmake index 70faceb4f9..afd614c2d6 100644 --- a/buildtools/Cmake/Distrib.cmake +++ b/buildtools/Cmake/Distrib.cmake @@ -27,7 +27,7 @@ install(DIRECTORY "${CMAKE_HOME_DIRECTORY}/doc/user_guide/html/" if(NOT WIN32) if( NOT MANPAGE_DIR) set( MANPAGE_DIR ${CMAKE_BINARY_DIR}/manpages ) - endif( NOT MANPAGE_DIR) + endif() add_custom_target(manpages ALL COMMAND ${CMAKE_COMMAND} -E make_directory ${MANPAGE_DIR} @@ -37,7 +37,7 @@ if(NOT WIN32) install(FILES ${MANPAGE_DIR}/simgrid_update_xml.1 ${CMAKE_HOME_DIRECTORY}/tools/tesh/tesh.1 DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/share/man/man1) -endif(NOT WIN32) +endif() # binaries install(PROGRAMS ${CMAKE_BINARY_DIR}/bin/smpicc @@ -80,7 +80,7 @@ install(TARGETS simgrid gras if(enable_smpi) install(TARGETS smpi DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/) -endif(enable_smpi) +endif() if(enable_lib_static AND NOT WIN32) install(TARGETS simgrid_static @@ -88,8 +88,8 @@ if(enable_lib_static AND NOT WIN32) if(enable_smpi) install(TARGETS smpi_static DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/) - endif(enable_smpi) -endif(enable_lib_static AND NOT WIN32) + endif() +endif() # include files set(HEADERS @@ -126,7 +126,7 @@ if(HAVE_LUA) install(FILES ${CMAKE_BINARY_DIR}/lib/lua/5.1/simgrid.${LIB_EXE} DESTINATION $ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/lua/5.1 ) -endif(HAVE_LUA) +endif() ########################################### ### Fill in the "make uninstall" target ### @@ -175,7 +175,7 @@ if(HAVE_LUA) COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_INSTALL_PREFIX}/lib/lua/5.1/simgrid.${LIB_EXE} WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}/" ) -endif(HAVE_LUA) +endif() ################################################################ ## Build a sain "make dist" target to build a source package ### @@ -267,7 +267,7 @@ foreach(file ${source_to_pack}) TARGET dist-dir COMMAND ${CMAKE_COMMAND} -E make_directory ${PROJECT_NAME}-${release_version}/${file_location}/ ) - endif(NOT OPERATION) + endif() # Actually copy the file add_custom_command( @@ -307,7 +307,7 @@ if(NOT enable_maintainer_mode) COMMAND ${CMAKE_COMMAND} -E echo "WARNING: ----------------------------------------------------" ) add_dependencies(dist echo-dist) -endif(NOT enable_maintainer_mode) +endif() ########################################### ### Fill in the "make distcheck" target ### @@ -359,11 +359,11 @@ if(enable_memcheck) add_custom_target(check COMMAND ctest -D ExperimentalMemCheck ) -else(enable_memcheck) +else() add_custom_target(check COMMAND make test ) -endif(enable_memcheck) +endif() ####################################### ### Fill in the "make xxx-clean" target ### diff --git a/buildtools/Cmake/Flags.cmake b/buildtools/Cmake/Flags.cmake index b864063813..81828fd89b 100644 --- a/buildtools/Cmake/Flags.cmake +++ b/buildtools/Cmake/Flags.cmake @@ -4,39 +4,39 @@ set(optCFLAGS "") if(NOT __VISUALC__ AND NOT __BORLANDC__) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-g3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-g3") -else(NOT __VISUALC__ AND NOT __BORLANDC__) +else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}/Zi") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}/Zi") -endif(NOT __VISUALC__ AND NOT __BORLANDC__) +endif() if(enable_compile_warnings) set(warnCFLAGS "-fno-common -Wall -Wunused -Wmissing-prototypes -Wmissing-declarations -Wpointer-arith -Wchar-subscripts -Wcomment -Wformat -Wwrite-strings -Wclobbered -Wno-unused-function -Wno-unused-parameter -Wno-strict-aliasing -Wno-format-nonliteral -Werror -Wno-error=clobbered ") if(COMPILER_C_VERSION_MAJOR_MINOR STRGREATER "4.5") set(warnCFLAGS "${warnCFLAGS}-Wno-error=unused-but-set-variable ") - endif(COMPILER_C_VERSION_MAJOR_MINOR STRGREATER "4.5") -endif(enable_compile_warnings) + endif() +endif() if(enable_compile_optimizations) set(optCFLAGS "-O3 -finline-functions -funroll-loops -fno-strict-aliasing ") if(COMPILER_C_VERSION_MAJOR_MINOR STRGREATER "4.5") set(optCFLAGS "${optCFLAGS}-flto ") - endif(COMPILER_C_VERSION_MAJOR_MINOR STRGREATER "4.5") -else(enable_compile_optimizations) + endif() +else() set(optCFLAGS "-O0 ") -endif(enable_compile_optimizations) +endif() if(APPLE AND COMPILER_C_VERSION_MAJOR_MINOR MATCHES "4.6") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-deprecated-declarations") set(optCFLAGS "-O0 ") -endif(APPLE AND COMPILER_C_VERSION_MAJOR_MINOR MATCHES "4.6") +endif() if(NOT enable_debug) set(CMAKE_C_FLAGS "-DNDEBUG ${CMAKE_C_FLAGS}") -endif(NOT enable_debug) +endif() if(enable_msg_deprecated) set(CMAKE_C_FLAGS "-DMSG_USE_DEPRECATED ${CMAKE_C_FLAGS}") -endif(enable_msg_deprecated) +endif() set(CMAKE_C_FLAGS "${optCFLAGS}${warnCFLAGS}${CMAKE_C_FLAGS}") @@ -45,7 +45,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${optCFLAGS}") # Try to make Mac a bit more complient to open source standards if(CMAKE_SYSTEM_NAME MATCHES "Darwin") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE") -endif(CMAKE_SYSTEM_NAME MATCHES "Darwin") +endif() set(TESH_OPTION "") if(enable_coverage) @@ -54,22 +54,23 @@ if(enable_coverage) SET(COVERAGE_COMMAND "${GCOV_PATH}" CACHE TYPE FILEPATH FORCE) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCOVERAGE") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fprofile-arcs -ftest-coverage") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") set(TESH_OPTION --enable-coverage) add_definitions(-fprofile-arcs -ftest-coverage) - endif(GCOV_PATH) -endif(enable_coverage) + endif() +endif() if(NOT $ENV{CFLAGS} STREQUAL "") message(STATUS "Add CFLAGS: \"$ENV{CFLAGS}\" to CMAKE_C_FLAGS") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{CFLAGS}") -endif(NOT $ENV{CFLAGS} STREQUAL "") +endif() if(NOT $ENV{LDFLAGS} STREQUAL "") message(STATUS "Add LDFLAGS: \"$ENV{LDFLAGS}\" to CMAKE_C_LINK_FLAGS") set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} $ENV{LDFLAGS}") -endif(NOT $ENV{LDFLAGS} STREQUAL "") +endif() if(enable_model-checking AND enable_compile_optimizations) message(WARNING "Sorry for now GCC optimizations does not work with model checking.\nPlease turn off optimizations with command:\ncmake -Denable_compile_optimizations=off. ") -endif(enable_model-checking AND enable_compile_optimizations) +endif() diff --git a/buildtools/Cmake/GenerateDevGuide.cmake b/buildtools/Cmake/GenerateDevGuide.cmake index e20f2890ad..8b09f5b0ae 100644 --- a/buildtools/Cmake/GenerateDevGuide.cmake +++ b/buildtools/Cmake/GenerateDevGuide.cmake @@ -45,7 +45,7 @@ if(DOXYGEN_PATH) WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/dev_guide/doxygen ) -else(DOXYGEN_PATH) +else() ADD_CUSTOM_TARGET(dev_guide COMMENT "Generating the SimGrid documentation..." @@ -58,6 +58,6 @@ else(DOXYGEN_PATH) COMMAND false ) -endif(DOXYGEN_PATH) +endif() ##############################################################################" diff --git a/buildtools/Cmake/GenerateDoc.cmake b/buildtools/Cmake/GenerateDoc.cmake index c69b51629e..ae81f04f02 100644 --- a/buildtools/Cmake/GenerateDoc.cmake +++ b/buildtools/Cmake/GenerateDoc.cmake @@ -69,13 +69,13 @@ if(DOXYGEN_PATH) if(DOXYGEN_MAJOR_VERSION STRLESS "2" AND DOXYGEN_MINOR_VERSION STRLESS "8") add_dependencies(simgrid_documentation error_doxygen) - else(DOXYGEN_MAJOR_VERSION STRLESS "2" AND DOXYGEN_MINOR_VERSION STRLESS "8") + else() add_dependencies(simgrid_documentation ref_guide) add_dependencies(simgrid_documentation user_guide) add_dependencies(simgrid_documentation dev_guide) - endif(DOXYGEN_MAJOR_VERSION STRLESS "2" AND DOXYGEN_MINOR_VERSION STRLESS "8") + endif() -endif(DOXYGEN_PATH) +endif() ############################################# ### Fill in the "make sync-gforge" target ### @@ -144,7 +144,7 @@ add_custom_target(sync-gforge-dtd # string(REPLACE " - \\ref subsection" " - \\ref " line2 ${line2}) # string(REPLACE " - \\ref subsubsection" " - \\ref " line2 ${line2}) # file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc "${line2}\n") -# endif(line2 AND NOT line3) +# endif() # endforeach(line ${file_content}) # # file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc "\n") # make sure it exists @@ -152,7 +152,7 @@ add_custom_target(sync-gforge-dtd # string(REGEX MATCH ".*ref.*" line_ok ${line}) # if(line_ok) # file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc "${line_ok}\n") -# endif(line_ok) +# endif() # endforeach(line ${valeur_line}) # # exec_program("${CMAKE_COMMAND} -E compare_files ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc" OUTPUT_VARIABLE compare_files) @@ -161,7 +161,7 @@ add_custom_target(sync-gforge-dtd # file(READ "${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc" file_content) # message("${file_content}") # exec_program("diff -u ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc") -# endif(compare_files) +# endif() #endforeach(file_name ${LISTE_GTUT}) # #file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc) @@ -182,7 +182,7 @@ add_custom_target(sync-gforge-dtd # string(REGEX REPLACE " .*" "" line2 "${line2}") # set(line2 " - \\ref ${line2}") # file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc "${line2}\n") -# endif(line2) +# endif() # endforeach(line ${file_content}) # # foreach(line ${valeur_line}) @@ -192,7 +192,7 @@ add_custom_target(sync-gforge-dtd # string(REGEX MATCH "Table of Contents" line4 "${line}") # if(NOT line1 AND NOT line2 AND NOT line3 AND NOT line4) # file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc " ${line}\n") -# endif(NOT line1 AND NOT line2 AND NOT line3 AND NOT line4) +# endif() # endforeach(line ${valeur_line}) #endforeach(file_name ${LISTE_GTUT}) # @@ -202,15 +202,15 @@ add_custom_target(sync-gforge-dtd # string(REGEX MATCH "^[ ]+.*\\ref" line1 "${line}") # if(line1) # file(APPEND ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc "${line}\n") -# endif(line1) +# endif() #endforeach(line ${file_content}) # #exec_program("${CMAKE_COMMAND} -E compare_files ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc" OUTPUT_VARIABLE compare_files) #if(compare_files) # message(STATUS "Wrong toc for gtut-tour.doc Right one is in tmp.realtoc") # exec_program("diff -u ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc") -#else(compare_files) +#else() # file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.realtoc) -#endif(compare_files) +#endif() # #file(REMOVE ${CMAKE_HOME_DIRECTORY}/doc/doxygen/tmp.curtoc) \ No newline at end of file diff --git a/buildtools/Cmake/GenerateDocWin.cmake b/buildtools/Cmake/GenerateDocWin.cmake index 61d1a47d47..7283e59b42 100644 --- a/buildtools/Cmake/GenerateDocWin.cmake +++ b/buildtools/Cmake/GenerateDocWin.cmake @@ -11,7 +11,7 @@ if(WGET_PATH) COMMAND ${WGET_PATH}/wget.exe -r -np -nH -nd http://simgrid.gforge.inria.fr/simgrid/${release_version}/doc/ WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/html ) -endif(WGET_PATH) +endif() if(NSIS_PATH) ADD_CUSTOM_TARGET(nsis @@ -20,4 +20,4 @@ if(NSIS_PATH) COMMAND ${NSIS_PATH}/makensis.exe simgrid.nsi WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/ ) -endif(NSIS_PATH) \ No newline at end of file +endif() \ No newline at end of file diff --git a/buildtools/Cmake/GenerateRefGuide.cmake b/buildtools/Cmake/GenerateRefGuide.cmake index 1e7e6fe996..6e136fcc91 100644 --- a/buildtools/Cmake/GenerateRefGuide.cmake +++ b/buildtools/Cmake/GenerateRefGuide.cmake @@ -62,7 +62,7 @@ if(FIG2DEV_PATH) WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/ref_guide/doxygen ) -else(DOXYGEN_PATH AND FIG2DEV_PATH) +else() ADD_CUSTOM_TARGET(ref_guide COMMENT "Generating the SimGrid documentation..." @@ -76,7 +76,7 @@ else(DOXYGEN_PATH AND FIG2DEV_PATH) COMMAND false ) -endif(FIG2DEV_PATH) +endif() ##############################################################################" diff --git a/buildtools/Cmake/GenerateUserGuide.cmake b/buildtools/Cmake/GenerateUserGuide.cmake index 72a3861517..a4f052670d 100644 --- a/buildtools/Cmake/GenerateUserGuide.cmake +++ b/buildtools/Cmake/GenerateUserGuide.cmake @@ -66,7 +66,7 @@ if(FIG2DEV_PATH) WORKING_DIRECTORY ${CMAKE_HOME_DIRECTORY}/doc/user_guide/doxygen ) -else(FIG2DEV_PATH) +else() ADD_CUSTOM_TARGET(user_guide COMMENT "Generating the SimGrid user guide..." @@ -80,7 +80,7 @@ else(FIG2DEV_PATH) COMMAND false ) -endif(FIG2DEV_PATH) +endif() ADD_CUSTOM_TARGET(user_guide_pdf COMMAND ${CMAKE_COMMAND} -E echo "XX First pass simgrid_user_guide.pdf" diff --git a/buildtools/Cmake/MaintainerMode.cmake b/buildtools/Cmake/MaintainerMode.cmake index 26d587d14d..be667ea142 100644 --- a/buildtools/Cmake/MaintainerMode.cmake +++ b/buildtools/Cmake/MaintainerMode.cmake @@ -35,7 +35,7 @@ if(enable_maintainer_mode AND NOT WIN32) SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${CMAKE_HOME_DIRECTORY}/src/xbt/automaton/parserPromela.tab.cacc;${CMAKE_HOME_DIRECTORY}/src/xbt/automaton/parserPromela.tab.hacc;${CMAKE_HOME_DIRECTORY}/src/xbt/automaton/automaton_parse.yy.c" ) - endif(BISON_EXE AND LEX_EXE) + endif() IF(FLEX_EXE) set(HAVE_FLEX 1) @@ -45,7 +45,7 @@ if(enable_maintainer_mode AND NOT WIN32) string(REGEX MATCH "[0-9]+[.]+[0-9]+$" FLEX_VERSION "${FLEX_VERSION}") string(REGEX MATCH "^[0-9]+" FLEX_MINOR_VERSION "${FLEX_VERSION}") string(REGEX MATCH "[0-9]+$" FLEX_PATCH_VERSION "${FLEX_VERSION}") - ENDIF(FLEX_EXE) + ENDIF() IF(FLEXML_EXE) set(HAVE_FLEXML 1) @@ -53,7 +53,7 @@ if(enable_maintainer_mode AND NOT WIN32) string(REGEX MATCH "[0-9]+[.]+[0-9]+" FLEXML_VERSION "${FLEXML_VERSION}") string(REGEX MATCH "^[0-9]*" FLEXML_MAJOR_VERSION "${FLEXML_VERSION}") string(REGEX MATCH "[0-9]*$" FLEXML_MINOR_VERSION "${FLEXML_VERSION}") - ENDIF(FLEXML_EXE) + ENDIF() message(STATUS "Found flex: ${FLEX_EXE}") message(STATUS "Found flexml: ${FLEXML_EXE}") @@ -177,18 +177,18 @@ if(enable_maintainer_mode AND NOT WIN32) ${CMAKE_HOME_DIRECTORY}/src/simdag/dax_dtd.c ) - else(HAVE_FLEXML AND HAVE_FLEX AND SED_EXE) + else() if(NOT HAVE_FLEXML) message(STATUS "Error : Install flexml before use maintainer mode.") - endif(NOT HAVE_FLEXML) + endif() if(NOT HAVE_FLEX) message(STATUS "Error : Install flex before use maintainer mode.") - endif(NOT HAVE_FLEX) + endif() if(NOT SED_EXE) message(STATUS "Error : Install sed before use maintainer mode.") - endif(NOT SED_EXE) + endif() message(FATAL_ERROR STATUS "Error : Need to install all tools for maintainer mode !!!") - endif(HAVE_FLEXML AND HAVE_FLEX AND SED_EXE) + endif() -endif(enable_maintainer_mode AND NOT WIN32) +endif() diff --git a/buildtools/Cmake/MakeExe.cmake b/buildtools/Cmake/MakeExe.cmake index 87d8221c01..cde9e1623b 100644 --- a/buildtools/Cmake/MakeExe.cmake +++ b/buildtools/Cmake/MakeExe.cmake @@ -30,6 +30,11 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/network/mxn) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/partask) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/simdag/platforms) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/env) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/coll) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/context) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/profile) +add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/pt2pt) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg) add_subdirectory(${CMAKE_HOME_DIRECTORY}/teshsuite/msg/trace) diff --git a/buildtools/Cmake/MakeLib.cmake b/buildtools/Cmake/MakeLib.cmake index d37b8bf4eb..11d16efd9a 100644 --- a/buildtools/Cmake/MakeLib.cmake +++ b/buildtools/Cmake/MakeLib.cmake @@ -16,15 +16,15 @@ set_target_properties(gras PROPERTIES VERSION ${libgras_version}) if(enable_lib_static) add_library(simgrid_static STATIC ${simgrid_sources}) -endif(enable_lib_static) +endif() if(enable_smpi) add_library(smpi SHARED ${SMPI_SRC}) set_target_properties(smpi PROPERTIES VERSION ${libsmpi_version}) if(enable_lib_static) add_library(smpi_static STATIC ${SMPI_SRC}) - endif(enable_lib_static) -endif(enable_smpi) + endif() +endif() add_dependencies(gras maintainer_files) add_dependencies(simgrid maintainer_files) @@ -34,16 +34,16 @@ if (enable_supernovae) add_dependencies(simgrid ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c) if(enable_lib_static) add_dependencies(simgrid_static ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_sg.c) - endif(enable_lib_static) + endif() add_dependencies(gras ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_gras.c) if(enable_smpi) add_dependencies(smpi ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c) if(enable_lib_static) add_dependencies(smpi_static ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c) - endif(enable_lib_static) - endif(enable_smpi) -endif(enable_supernovae) + endif() + endif() +endif() # Compute the dependencies of GRAS ################################## @@ -51,7 +51,7 @@ set(GRAS_DEP "-lm -pthread") if(HAVE_POSIX_GETTIME) SET(GRAS_DEP "${GRAS_DEP} -lrt") -endif(HAVE_POSIX_GETTIME) +endif() # the following is probably unneed since it kills the previous # GRAS_DEP (and is thus probably invalid). @@ -60,8 +60,8 @@ endif(HAVE_POSIX_GETTIME) if(with_context MATCHES windows) if(pthread) SET(GRAS_DEP "msg") - endif(pthread) -endif(with_context MATCHES windows) + endif() +endif() target_link_libraries(gras ${GRAS_DEP}) # Compute the dependencies of SimGrid @@ -71,8 +71,8 @@ set(SIMGRID_DEP "-lm -lpcre") if(pthread) if(${CONTEXT_THREADS}) SET(SIMGRID_DEP "${SIMGRID_DEP} -pthread") - endif(${CONTEXT_THREADS}) -endif(pthread) + endif() +endif() if(HAVE_LUA) ADD_CUSTOM_TARGET(link_simgrid_lua ALL @@ -98,21 +98,21 @@ if(HAVE_LUA) COMMAND ${CMAKE_COMMAND} -E create_symlink ${CMAKE_BINARY_DIR}/lib/libsimgrid.${LIB_EXE} ${CMAKE_BINARY_DIR}/examples/simdag/simgrid.${LIB_EXE} #for test ) SET(SIMGRID_DEP "${SIMGRID_DEP} -l${LIB_LUA_NAME}") -endif(HAVE_LUA) +endif() if(HAVE_GRAPHVIZ) if(HAVE_CGRAPH_LIB) SET(SIMGRID_DEP "${SIMGRID_DEP} -lcgraph") - else(HAVE_CGRAPH_LIB) + else() if(HAVE_AGRAPH_LIB) SET(SIMGRID_DEP "${SIMGRID_DEP} -lagraph -lcdt") - endif(HAVE_AGRAPH_LIB) - endif(HAVE_CGRAPH_LIB) -endif(HAVE_GRAPHVIZ) + endif() + endif() +endif() if(HAVE_GTNETS) SET(SIMGRID_DEP "${SIMGRID_DEP} -lgtnets") -endif(HAVE_GTNETS) +endif() if(HAVE_MC) # The availability of libunwind was checked in CompleteInFiles.cmake @@ -122,24 +122,24 @@ if(HAVE_MC) # This is deeply wrong, and should be fixed by manually loading -lunwind-PLAT (FIXME) if(PROCESSOR_x86_64) SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-x86_64") - else(PROCESSOR_x86_64) + else() SET(SIMGRID_DEP "${SIMGRID_DEP} -lunwind-x86") - endif(PROCESSOR_x86_64) -endif(HAVE_MC) + endif() +endif() if(HAVE_NS3) if(${NS3_VERSION} EQUAL 310) SET(SIMGRID_DEP "${SIMGRID_DEP} -lns3") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_NS3_3_10") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_NS3_3_10") - else(${NS3_VERSION} EQUAL 310) + else() SET(SIMGRID_DEP "${SIMGRID_DEP} -lns3-core -lns3-csma -lns3-point-to-point -lns3-internet -lns3-applications") - endif(${NS3_VERSION} EQUAL 310) -endif(HAVE_NS3) + endif() +endif() if(HAVE_POSIX_GETTIME) SET(SIMGRID_DEP "${SIMGRID_DEP} -lrt") -endif(HAVE_POSIX_GETTIME) +endif() target_link_libraries(simgrid ${SIMGRID_DEP}) @@ -148,10 +148,10 @@ target_link_libraries(simgrid ${SIMGRID_DEP}) set(SMPI_LDEP "") if(APPLE) set(SMPI_LDEP "-Wl,-U -Wl,_smpi_simulated_main") -endif(APPLE) +endif() if(enable_smpi) target_link_libraries(smpi simgrid ${SMPI_LDEP}) -endif(enable_smpi) +endif() # Pass dependencies to static libs ################################## @@ -162,11 +162,11 @@ if(enable_lib_static) if(enable_smpi) target_link_libraries(smpi_static simgrid ${SMPI_LDEP}) set_target_properties(smpi_static PROPERTIES OUTPUT_NAME smpi) - endif(enable_smpi) -endif(enable_lib_static) + endif() +endif() # Dependencies from maintainer mode ################################### if(enable_maintainer_mode AND BISON_EXE AND LEX_EXE) add_dependencies(simgrid automaton_generated_src) -endif(enable_maintainer_mode AND BISON_EXE AND LEX_EXE) +endif() diff --git a/buildtools/Cmake/MakeLibWin.cmake b/buildtools/Cmake/MakeLibWin.cmake index 866fe1d9b0..cb29b3d577 100644 --- a/buildtools/Cmake/MakeLibWin.cmake +++ b/buildtools/Cmake/MakeLibWin.cmake @@ -6,6 +6,11 @@ add_library(gras SHARED ${gras_sources}) set_target_properties(gras PROPERTIES COMPILE_FLAGS "-D_XBT_DLL_EXPORT -DDLL_EXPORT" VERSION ${libgras_version} OUTPUT_NAME "gras") set_target_properties(simgrid PROPERTIES COMPILE_FLAGS "-D_XBT_DLL_EXPORT -DDLL_EXPORT" VERSION ${libsimgrid_version} OUTPUT_NAME "simgrid") +if(enable_smpi) + add_library(smpi SHARED ${SMPI_SRC}) + set_target_properties(smpi PROPERTIES COMPILE_FLAGS "-D_XBT_DLL_EXPORT -DDLL_EXPORT" VERSION ${libsmpi_version} OUTPUT_NAME "smpi") +endif() + # libpthreadGC2.dll if(ARCH_32_BITS) find_library(PATH_PTHREAD_LIB @@ -14,34 +19,39 @@ if(ARCH_32_BITS) $ENV{PATH} PATH_SUFFIXES bin/ c/bin ) -else(ARCH_32_BITS) +else() find_library(PATH_PTHREAD_LIB NAMES pthreadGC2-w64.dll HINTS $ENV{PATH} PATH_SUFFIXES bin/ c/bin ) -endif(ARCH_32_BITS) +endif() set(GRAS_DEP "ws2_32 ${PATH_PTHREAD_LIB}") set(SIMGRID_DEP "ws2_32 ${PATH_PCRE_LIB} ${PATH_PTHREAD_LIB}") +set(SMPI_DEP "${LIBRARY_OUTPUT_PATH}/libsimgrid.dll") if(ARCH_32_BITS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i486") -else(ARCH_32_BITS) +else() set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64") # message(FATAL_ERROR "Sorry, Simgrid fails with full 64bits for now! Please contact us.") -endif(ARCH_32_BITS) +endif() target_link_libraries(gras ${GRAS_DEP}) target_link_libraries(simgrid ${SIMGRID_DEP}) +if(enable_smpi) +add_dependencies(smpi simgrid) +target_link_libraries(smpi ${SMPI_DEP}) +endif() find_path(PEXPORTS_PATH NAMES pexports.exe PATHS NO_DEFAULT_PATHS) message(STATUS "pexports: ${PEXPORTS_PATH}") if(PEXPORTS_PATH) add_custom_command(TARGET simgrid POST_BUILD COMMAND ${PEXPORTS_PATH}/pexports.exe ${CMAKE_BINARY_DIR}/lib/libsimgrid.dll > ${CMAKE_BINARY_DIR}/lib/libsimgrid.def) -endif(PEXPORTS_PATH) +endif() if(enable_smpi) add_library(smpi SHARED ${SMPI_SRC}) @@ -49,4 +59,4 @@ if(enable_smpi) set(SMPI_LDEP "") target_link_libraries(smpi simgrid ${SMPI_LDEP}) -endif(enable_smpi) \ No newline at end of file +endif() diff --git a/buildtools/Cmake/Modules/FindF2c.cmake b/buildtools/Cmake/Modules/FindF2c.cmake index e73fcc4c71..69e519f9a7 100644 --- a/buildtools/Cmake/Modules/FindF2c.cmake +++ b/buildtools/Cmake/Modules/FindF2c.cmake @@ -36,28 +36,28 @@ find_library(HAVE_F2C_LIB if(HAVE_F2C_H) set(HAVE_SMPI_F2C_H 1) -endif(HAVE_F2C_H) +endif() message(STATUS "Looking for f2c.h") if(HAVE_F2C_H) message(STATUS "Looking for f2c.h - found") -else(HAVE_F2C_H) +else() message(STATUS "Looking for f2c.h - not found") -endif(HAVE_F2C_H) +endif() message(STATUS "Looking for lib f2c") if(HAVE_F2C_LIB) message(STATUS "Looking for lib f2c - found") -else(HAVE_F2C_LIB) +else() message(STATUS "Looking for lib f2c - not found") -endif(HAVE_F2C_LIB) +endif() message(STATUS "Looking for bin f2c") if(F2C_EXE) message(STATUS "Found F2C: ${F2C_EXE}") -else(F2C_EXE) +else() message(STATUS "Looking for bin f2c - not found") -endif(F2C_EXE) +endif() mark_as_advanced(HAVE_F2C_H) mark_as_advanced(F2C_EXE) @@ -65,15 +65,15 @@ mark_as_advanced(HAVE_F2C_LIB) if(HAVE_F2C_H) include_directories(${HAVE_F2C_H}) -else(HAVE_F2C_H) +else() if(WIN32) message("-- Fortran for smpi is not installed (http://www.netlib.org/f2c/).") - else(WIN32) + else() message(FATAL_ERROR "You should install f2c before use smpi.") - endif(WIN32) -endif(HAVE_F2C_H) + endif() +endif() set(SMPI_F2C 0) if(HAVE_F2C_H AND F2C_EXE AND HAVE_F2C_LIB) set(SMPI_F2C 1) -endif(HAVE_F2C_H AND F2C_EXE AND HAVE_F2C_LIB) +endif() diff --git a/buildtools/Cmake/Modules/FindGTnets.cmake b/buildtools/Cmake/Modules/FindGTnets.cmake index 46e24c2ec4..bd12fa6439 100644 --- a/buildtools/Cmake/Modules/FindGTnets.cmake +++ b/buildtools/Cmake/Modules/FindGTnets.cmake @@ -20,38 +20,38 @@ if(HAVE_GTNETS_LIB AND HAVE_SIMULATOR_H) OUTPUT_VARIABLE COMPILE_GTNETS_VAR) if(COMPILE_GTNETS_VAR) SET(HAVE_GTNETS 0) - else(COMPILE_GTNETS_VAR) + else() SET(HAVE_GTNETS 1) string(REGEX MATCH "-L${GTNETS_LIB_PATH} " operation "${CMAKE_C_FLAGS}") if(NOT operation) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${GTNETS_LIB_PATH} ") - endif(NOT operation) + endif() SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-I${HAVE_SIMULATOR_H} -L${GTNETS_LIB_PATH} ") string(REGEX MATCH "${GTNETS_LIB_PATH}" operation "$ENV{LD_LIBRARY_PATH}") if(NOT operation) message(FATAL_ERROR "\n\nTo use GTNETS don't forget to set LD_LIBRARY_PATH with \n\texport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${GTNETS_LIB_PATH}\n\n") - endif(NOT operation) + endif() - endif(COMPILE_GTNETS_VAR) + endif() -else(HAVE_GTNETS_LIB AND HAVE_SIMULATOR_H) +else() if(NOT HAVE_GTNETS_LIB) message(STATUS "Gtnets is enabled but can't find it.") - endif(NOT HAVE_GTNETS_LIB) + endif() if(NOT HAVE_SIMULATOR_H) message(STATUS "Gtnets needs simulator.h") - endif(NOT HAVE_SIMULATOR_H) -endif(HAVE_GTNETS_LIB AND HAVE_SIMULATOR_H) + endif() +endif() message(STATUS "Looking for lib gtnets patch") if(HAVE_GTNETS) message(STATUS "Looking for lib gtnets patch - found") -else(HAVE_GTNETS) +else() message(STATUS "Looking for lib gtnets patch - not found") -endif(HAVE_GTNETS) +endif() mark_as_advanced(HAVE_GTNETS_LIB) mark_as_advanced(HAVE_SIMULATOR_H) \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindGraphviz.cmake b/buildtools/Cmake/Modules/FindGraphviz.cmake index cf16bff2c3..c2c6c957ba 100644 --- a/buildtools/Cmake/Modules/FindGraphviz.cmake +++ b/buildtools/Cmake/Modules/FindGraphviz.cmake @@ -100,11 +100,11 @@ if(HAVE_CDT_LIB) if(HAVE_AGRAPH_LIB) string(REGEX REPLACE "/libagraph.*" "" lib_graphviz ${HAVE_AGRAPH_LIB}) - else(HAVE_AGRAPH_LIB) + else() if(HAVE_CGRAPH_LIB) string(REGEX REPLACE "/libcgraph.*" "" lib_graphviz ${HAVE_CGRAPH_LIB}) - endif(HAVE_CGRAPH_LIB) - endif(HAVE_AGRAPH_LIB) + endif() + endif() if(HAVE_GRAPH_H OR HAVE_AGRAPH_H OR HAVE_CGRAPH_H) @@ -112,81 +112,81 @@ if(HAVE_CDT_LIB) string(REPLACE "/graphviz/graph.h" "" file_graphviz_h ${HAVE_GRAPH_H}) string(REPLACE "/graphviz" "" file_graphviz_h ${file_graphviz_h}) set(GRAPH_H 1) - endif(HAVE_GRAPH_H) + endif() if(HAVE_AGRAPH_H) string(REPLACE "/graphviz/agraph.h" "" file_graphviz_h ${HAVE_AGRAPH_H}) string(REPLACE "/graphviz" "" file_graphviz_h ${file_graphviz_h}) set(AGRAPH_H 1) - endif(HAVE_AGRAPH_H) + endif() if(HAVE_CGRAPH_H) string(REPLACE "/graphviz/cgraph.h" "" file_graphviz_h ${HAVE_CGRAPH_H}) string(REPLACE "/graphviz" "" file_graphviz_h ${file_graphviz_h}) set(CGRAPH_H 1) - endif(HAVE_CGRAPH_H) + endif() include_directories(${file_graphviz_h} ${file_graphviz_h}/graphviz) link_directories(${lib_graphviz}) set(HAVE_GRAPHVIZ "1") - else(HAVE_GRAPH_H OR HAVE_AGRAPH_H OR HAVE_CGRAPH_H) + else() set(HAVE_GRAPHVIZ "0") - endif(HAVE_GRAPH_H OR HAVE_AGRAPH_H OR HAVE_CGRAPH_H) + endif() - else(HAVE_CGRAPH_LIB OR HAVE_AGRAPH_LIB) + else() set(HAVE_GRAPHVIZ "0") - endif(HAVE_CGRAPH_LIB OR HAVE_AGRAPH_LIB) + endif() -endif(HAVE_CDT_LIB) +endif() mark_as_advanced(HAVE_GRAPHVIZ) message(STATUS "Looking for agraph.h") if(HAVE_AGRAPH_H) message(STATUS "Looking for agraph.h - found") -else(HAVE_AGRAPH_H) +else() message(STATUS "Looking for agraph.h - not found") -endif(HAVE_AGRAPH_H) +endif() message(STATUS "Looking for cgraph.h") if(HAVE_CGRAPH_H) message(STATUS "Looking for cgraph.h - found") -else(HAVE_CGRAPH_H) +else() message(STATUS "Looking for cgraph.h - not found") -endif(HAVE_CGRAPH_H) +endif() message(STATUS "Looking for graph.h") if(HAVE_GRAPH_H) message(STATUS "Looking for graph.h - found") -else(HAVE_GRAPH_H) +else() message(STATUS "Looking for graph.h - not found") -endif(HAVE_GRAPH_H) +endif() message(STATUS "Looking for lib agraph") if(HAVE_AGRAPH_LIB) message(STATUS "Looking for lib agraph - found") -else(HAVE_AGRAPH_LIB) +else() message(STATUS "Looking for lib agraph - not found") -endif(HAVE_AGRAPH_LIB) +endif() message(STATUS "Looking for lib cgraph") if(HAVE_CGRAPH_LIB) message(STATUS "Looking for lib cgraph - found") -else(HAVE_CGRAPH_LIB) +else() message(STATUS "Looking for lib cgraph - not found") -endif(HAVE_CGRAPH_LIB) +endif() message(STATUS "Looking for lib graph") if(HAVE_GRAPH_LIB) message(STATUS "Looking for lib graph - found") -else(HAVE_GRAPH_LIB) +else() message(STATUS "Looking for lib graph - not found") -endif(HAVE_GRAPH_LIB) +endif() message(STATUS "Looking for lib cdt") if(HAVE_CDT_LIB) message(STATUS "Looking for lib cdt - found") -else(HAVE_CDT_LIB) +else() message(STATUS "Looking for lib cdt - not found") -endif(HAVE_CDT_LIB) \ No newline at end of file +endif() \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindLibunwind.cmake b/buildtools/Cmake/Modules/FindLibunwind.cmake index 101a9df300..56de1f79a0 100644 --- a/buildtools/Cmake/Modules/FindLibunwind.cmake +++ b/buildtools/Cmake/Modules/FindLibunwind.cmake @@ -12,7 +12,7 @@ if(PROCESSOR_x86_64) /opt/csw /sw /usr) -else(PROCESSOR_x86_64) +else() find_library(PATH_LIBUNWIND_LIB NAMES unwind HINTS @@ -26,7 +26,7 @@ else(PROCESSOR_x86_64) /opt/csw /sw /usr) -endif(PROCESSOR_x86_64) +endif() find_path(PATH_LIBUNWIND_H "libunwind.h" HINTS @@ -44,16 +44,16 @@ find_path(PATH_LIBUNWIND_H "libunwind.h" message(STATUS "Looking for libunwind.h") if(PATH_LIBUNWIND_H) message(STATUS "Looking for libunwind.h - found") -else(PATH_LIBUNWIND_H) +else() message(STATUS "Looking for libunwind.h - not found") -endif(PATH_LIBUNWIND_H) +endif() message(STATUS "Looking for libunwind") if(PATH_LIBUNWIND_LIB) message(STATUS "Looking for libunwind - found") -else(PATH_LIBUNWIND_LIB) +else() message(STATUS "Looking for libunwind - not found") -endif(PATH_LIBUNWIND_LIB) +endif() if(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H) string(REGEX REPLACE "/libunwind.*[.]${LIB_EXE}$" "" PATH_LIBUNWIND_LIB "${PATH_LIBUNWIND_LIB}") @@ -62,9 +62,9 @@ if(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H) include_directories(${PATH_LIBUNWIND_H}) link_directories(${PATH_LIBUNWIND_LIB}) -else(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H) +else() message(FATAL_ERROR "Please either install the libunwind7-dev package (or equivalent) or turn off the model-checking option of SimGrid.") -endif(PATH_LIBUNWIND_LIB AND PATH_LIBUNWIND_H) +endif() mark_as_advanced(PATH_LIBUNWIND_H) mark_as_advanced(PATH_LIBUNWIND_LIB) \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindLua51Simgrid.cmake b/buildtools/Cmake/Modules/FindLua51Simgrid.cmake index 5d54f0dcda..2b3c4d1716 100644 --- a/buildtools/Cmake/Modules/FindLua51Simgrid.cmake +++ b/buildtools/Cmake/Modules/FindLua51Simgrid.cmake @@ -5,13 +5,13 @@ mark_as_advanced(HAVE_LUA_BIN) message(STATUS "Looking for lua.h") if(LUA_INCLUDE_DIR) message(STATUS "Looking for lua.h - found") -else(LUA_INCLUDE_DIR) +else() message(STATUS "Looking for lua.h - not found") -endif(LUA_INCLUDE_DIR) +endif() if(HAVE_LUA_BIN) message(STATUS "Found Lua: ${HAVE_LUA_BIN}") -endif(HAVE_LUA_BIN) +endif() set(LIB_LUA_NAME "") @@ -22,8 +22,8 @@ foreach(lib_path ${LUA_LIBRARIES}) string(REPLACE "lib" "" LIB_LUA_NAME "${LIB_LUA_NAME}") if(LIB_LUA_NAME) string(REPLACE "/lib${LIB_LUA_NAME}.${LIB_EXE}" "" LUA_LIBRARY_DIR ${lib_path}) - endif(LIB_LUA_NAME) - endif(NOT LIB_LUA_NAME) + endif() + endif() endforeach(lib_path ${LUA_LIBRARIES}) message(STATUS "Looking for lib lua") @@ -31,14 +31,14 @@ if(LUA_LIBRARY_DIR) message(STATUS "Looking for lib lua - found") message(STATUS "Lua version: ${LIB_LUA_NAME}") message(STATUS "Lib path : ${LUA_LIBRARY_DIR}") -else(LUA_LIBRARY_DIR) +else() message(STATUS "Looking for lib lua - not found") -endif(LUA_LIBRARY_DIR) +endif() if(LUA51_FOUND) set(HAVE_LUA 1) include_directories(${LUA_INCLUDE_DIR}) link_directories(${LUA_LIBRARY_DIR}) -else(LUA51_FOUND) +else() message(STATUS "Warning : Lua need version 5.1") -endif(LUA51_FOUND) +endif() diff --git a/buildtools/Cmake/Modules/FindNS3.cmake b/buildtools/Cmake/Modules/FindNS3.cmake index d9a2687859..04e568c836 100644 --- a/buildtools/Cmake/Modules/FindNS3.cmake +++ b/buildtools/Cmake/Modules/FindNS3.cmake @@ -29,25 +29,25 @@ find_path(HAVE_CORE_MODULE_H message(STATUS "Looking for core-module.h") if(HAVE_CORE_MODULE_H) message(STATUS "Looking for core-module.h - found") -else(HAVE_CORE_MODULE_H) +else() message(STATUS "Looking for core-module.h - not found") -endif(HAVE_CORE_MODULE_H) +endif() mark_as_advanced(HAVE_CORE_MODULE_H) message(STATUS "Looking for lib ns3") if(HAVE_NS3_LIB) message(STATUS "Looking for lib ns3 - found") -else(HAVE_NS3_LIB) +else() message(STATUS "Looking for lib ns3 - not found") -endif(HAVE_NS3_LIB) +endif() mark_as_advanced(HAVE_NS3_LIB) message(STATUS "Looking for lib ns3-core") if(HAVE_NS3_CORE_LIB) message(STATUS "Looking for lib ns3-core - found") -else(HAVE_NS3_CORE_LIB) +else() message(STATUS "Looking for lib ns3-core - not found") -endif(HAVE_NS3_CORE_LIB) +endif() mark_as_advanced(HAVE_NS3_LIB) mark_as_advanced(HAVE_NS3_CORE_LIB) @@ -58,37 +58,37 @@ if(HAVE_CORE_MODULE_H) set(HAVE_NS3 1) set(NS3_VERSION 310) string(REPLACE "/libns3.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_LIB}") - endif(HAVE_NS3_LIB) + endif() if(HAVE_NS3_CORE_LIB) message(STATUS "NS-3 version > 3.10") set(HAVE_NS3 1) set(NS3_VERSION 312) string(REPLACE "/libns3-core.${LIB_EXE}" "" HAVE_NS3_LIB "${HAVE_NS3_CORE_LIB}") - endif(HAVE_NS3_CORE_LIB) -endif(HAVE_CORE_MODULE_H) + endif() +endif() if(HAVE_NS3) string(REGEX MATCH "${HAVE_NS3_LIB}" operation "$ENV{LD_LIBRARY_PATH}") if(NOT operation) message(STATUS "Warning: To use NS-3 don't forget to set LD_LIBRARY_PATH with: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${HAVE_NS3_LIB}") - else(NOT operation) + else() string(REGEX MATCH "-L${HAVE_NS3_LIB} " operation1 "${CMAKE_C_FLAGS}") if(NOT operation1) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${HAVE_NS3_LIB} ") - endif(NOT operation1) + endif() string(REGEX MATCH "-I${HAVE_CORE_MODULE_H} " operation1 "${CMAKE_C_FLAGS}") if(NOT operation1) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${HAVE_CORE_MODULE_H} ") - endif(NOT operation1) + endif() SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}-I${HAVE_CORE_MODULE_H} -L${HAVE_NS3_LIB} ") - endif(NOT operation) -else(HAVE_NS3) + endif() +else() message(STATUS "Warning: To use NS-3 Please install ns3 at least version 3.10 (http://www.nsnam.org/releases/)") -endif(HAVE_NS3) +endif() if(HAVE_NS3 AND enable_supernovae) set(enable_supernovae OFF) -endif(HAVE_NS3 AND enable_supernovae) +endif() diff --git a/buildtools/Cmake/Modules/FindPCRE.cmake b/buildtools/Cmake/Modules/FindPCRE.cmake index f4b57b754d..2e46c9b1e6 100644 --- a/buildtools/Cmake/Modules/FindPCRE.cmake +++ b/buildtools/Cmake/Modules/FindPCRE.cmake @@ -28,25 +28,25 @@ find_path(PATH_PCRE_H "pcre.h" message(STATUS "Looking for pcre.h") if(PATH_PCRE_H) message(STATUS "Looking for pcre.h - found") -else(PATH_PCRE_H) +else() message(STATUS "Looking for pcre.h - not found") -endif(PATH_PCRE_H) +endif() message(STATUS "Looking for lib pcre") if(PATH_PCRE_LIB) message(STATUS "Looking for lib pcre - found") -else(PATH_PCRE_LIB) +else() message(STATUS "Looking for lib pcre - not found") -endif(PATH_PCRE_LIB) +endif() if(PATH_PCRE_LIB AND PATH_PCRE_H) string(REGEX REPLACE "/libpcre.*[.]${LIB_EXE}$" "" PATH_PCRE_LIB "${PATH_PCRE_LIB}") string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") include_directories(${PATH_PCRE_H}) link_directories(${PATH_PCRE_LIB}) -else(PATH_PCRE_LIB) +else() message(FATAL_ERROR "Please install the libpcre3-dev package or equivalent before using SimGrid.") -endif(PATH_PCRE_LIB AND PATH_PCRE_H) +endif() set(PCRE_LIBRARY_PATH $ENV{PCRE_LIBRARY_PATH}) diff --git a/buildtools/Cmake/Modules/FindPcreWin.cmake b/buildtools/Cmake/Modules/FindPcreWin.cmake index 021867d185..8f454fb546 100644 --- a/buildtools/Cmake/Modules/FindPcreWin.cmake +++ b/buildtools/Cmake/Modules/FindPcreWin.cmake @@ -17,26 +17,26 @@ find_path(PATH_PCRE_H "pcre.h" message(STATUS "Looking for pcre.h") if(PATH_PCRE_H) message(STATUS "Looking for pcre.h - found") -else(PATH_PCRE_H) +else() message(STATUS "Looking for pcre.h - not found") -endif(PATH_PCRE_H) +endif() message(STATUS "Looking for lib pcre") if(PATH_PCRE_LIB) message(STATUS "Looking for lib pcre - found") -else(PATH_PCRE_LIB) +else() message(STATUS "Looking for lib pcre - not found") -endif(PATH_PCRE_LIB) +endif() if(PATH_PCRE_LIB AND PATH_PCRE_H) string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}") if(NOT operation) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ") - endif(NOT operation) -else(PATH_PCRE_LIB) + endif() +else() message(FATAL_ERROR "Please install the pcre package before using SimGrid.") -endif(PATH_PCRE_LIB AND PATH_PCRE_H) +endif() set(PCRE_LIBRARY_PATH $ENV{PCRE_LIBRARY_PATH}) diff --git a/buildtools/Cmake/Modules/FindRngStream.cmake b/buildtools/Cmake/Modules/FindRngStream.cmake index c057c27cdb..33e6429e55 100644 --- a/buildtools/Cmake/Modules/FindRngStream.cmake +++ b/buildtools/Cmake/Modules/FindRngStream.cmake @@ -30,10 +30,10 @@ if(HAVE_RNGSTREAM_H) string(REGEX MATCH "-I${HAVE_RNGSTREAM_H} " operation "${CMAKE_C_FLAGS}") if(NOT operation) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${HAVE_RNGSTREAM_H} ") - endif(NOT operation) -else(HAVE_RNGSTREAM_H) + endif() +else() message(STATUS "Looking for RngStream.h - not found") -endif(HAVE_RNGSTREAM_H) +endif() message(STATUS "Looking for lib rngstreams") if(HAVE_RNGSTREAM_LIB) @@ -42,10 +42,10 @@ if(HAVE_RNGSTREAM_LIB) string(REGEX MATCH "-L${HAVE_RNGSTREAM_LIB} " operation "${CMAKE_C_FLAGS}") if(NOT operation) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-L${HAVE_RNGSTREAM_LIB} ") - endif(NOT operation) -else(HAVE_RNGSTREAM_LIB) + endif() +else() message(STATUS "Looking for lib rngstreams - not found") -endif(HAVE_RNGSTREAM_LIB) +endif() mark_as_advanced(HAVE_RNGSTREAM_LIB) mark_as_advanced(HAVE_RNGSTREAM_H) \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindRubySimgrid.cmake b/buildtools/Cmake/Modules/FindRubySimgrid.cmake index 742cda25d8..9228fd8637 100644 --- a/buildtools/Cmake/Modules/FindRubySimgrid.cmake +++ b/buildtools/Cmake/Modules/FindRubySimgrid.cmake @@ -2,28 +2,28 @@ include(FindRuby) if(RUBY_EXECUTABLE) message(STATUS "Found ruby: ${RUBY_EXECUTABLE}") -endif(RUBY_EXECUTABLE) +endif() message(STATUS "Looking for ruby.h") if(RUBY_INCLUDE_DIR) message(STATUS "Looking for ruby.h - found") -else(RUBY_INCLUDE_DIR) +else() message(STATUS "Looking for ruby.h - not found") -endif(RUBY_INCLUDE_DIR) +endif() message(STATUS "Looking for confi.h") if(RUBY_CONFIG_INCLUDE_DIR) message(STATUS "Looking for config.h - found") -else(RUBY_CONFIG_INCLUDE_DIR) +else() message(STATUS "Looking for config.h - not found") -endif(RUBY_CONFIG_INCLUDE_DIR) +endif() message(STATUS "Looking for lib ruby") if(RUBY_LIBRARY) message(STATUS "Looking for lib ruby - found") -else(RUBY_LIBRARY) +else() message(STATUS "Looking for lib ruby - not found") -endif(RUBY_LIBRARY) +endif() if(RUBY_LIBRARY) set(LIB_RUBY_VERSION "${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.${RUBY_VERSION_PATCH}") @@ -32,23 +32,23 @@ if(RUBY_LIBRARY) string(REGEX MATCH "ruby.*[0-9]" RUBY_LIBRARY_NAME ${RUBY_LIBRARY}) if(NOT RUBY_LIBRARY_NAME) set(RUBY_LIBRARY_NAME ruby) - endif(NOT RUBY_LIBRARY_NAME) + endif() string(REGEX REPLACE "/libruby.*$" "" RUBY_LIBRARY ${RUBY_LIBRARY}) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${RUBY_CONFIG_INCLUDE_DIR} ") #path to config.h string(COMPARE EQUAL "${RUBY_INCLUDE_DIR}" "${RUBY_CONFIG_INCLUDE_DIR}" operation) if(NOT operation) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${RUBY_INCLUDE_DIR} ") #path to ruby.h - endif(NOT operation) + endif() ADD_DEFINITIONS("-I${CMAKE_HOME_DIRECTORY}/src/bindings/ruby -I${CMAKE_HOME_DIRECTORY}/src/simix") SET(HAVE_RUBY 1) - else(RUBY_VERSION_MAJOR MATCHES "1" AND RUBY_VERSION_MINOR MATCHES "9") + else() message(STATUS "Warning: Ruby bindings need version 1.9.x, but found version ${RUBY_VERSION_MAJOR}.${RUBY_VERSION_MINOR}.x") SET(HAVE_RUBY 0) - endif(RUBY_VERSION_MAJOR MATCHES "1" AND RUBY_VERSION_MINOR MATCHES "9") -else(RUBY_LIBRARY) + endif() +else() SET(HAVE_RUBY 0) -endif(RUBY_LIBRARY) +endif() if(NOT RUBY_EXECUTABLE) message(STATUS "Warning: you are missing the ruby executable, so you can compile and build examples but can't execute them!") -endif(NOT RUBY_EXECUTABLE) \ No newline at end of file +endif() \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindSimGrid.cmake b/buildtools/Cmake/Modules/FindSimGrid.cmake index d29da73131..67994c7c6b 100644 --- a/buildtools/Cmake/Modules/FindSimGrid.cmake +++ b/buildtools/Cmake/Modules/FindSimGrid.cmake @@ -74,21 +74,21 @@ if(HAVE_SIMGRID_LIB) string(REGEX REPLACE "^${SIMGRID_MINOR_VERSION}." "" SIMGRID_PATCH_VERSION "${SIMGRID_PATCH_VERSION}") string(REGEX REPLACE "^${SIMGRID_MAJOR_VERSION}." "" SIMGRID_MINOR_VERSION "${SIMGRID_MINOR_VERSION}") message(STATUS "Simgrid version : ${SIMGRID_MAJOR_VERSION}.${SIMGRID_MINOR_VERSION}") -else(HAVE_SIMGRID_LIB) +else() message(STATUS "Looking for lib SimGrid - not found") -endif(HAVE_SIMGRID_LIB) +endif() message(STATUS "Looking for gras.h") if(HAVE_GRAS_H) message(STATUS "Looking for gras.h - found") -else(HAVE_GRAS_H) +else() message(STATUS "Looking for gras.h - not found") -endif(HAVE_GRAS_H) +endif() if(HAVE_TESH) message(STATUS "Found Tesh: ${HAVE_TESH}") -endif(HAVE_TESH) +endif() if(HAVE_GRAS_STUB) message(STATUS "Found gras_stub_generator: ${HAVE_GRAS_STUB}") -endif(HAVE_GRAS_STUB) \ No newline at end of file +endif() \ No newline at end of file diff --git a/buildtools/Cmake/Modules/FindValgrind.cmake b/buildtools/Cmake/Modules/FindValgrind.cmake index 9cfcfc085a..cbb044ccb8 100644 --- a/buildtools/Cmake/Modules/FindValgrind.cmake +++ b/buildtools/Cmake/Modules/FindValgrind.cmake @@ -13,7 +13,7 @@ if(VALGRIND_EXE) message(STATUS "Found valgrind: ${VALGRIND_EXE}") SET(VALGRIND_COMMAND "${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/my_valgrind.pl") SET(MEMORYCHECK_COMMAND "${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/my_valgrind.pl") -endif(VALGRIND_EXE) +endif() if(VALGRIND_EXE) exec_program("${VALGRIND_EXE} --version " OUTPUT_VARIABLE "VALGRIND_VERSION") @@ -23,13 +23,13 @@ if(VALGRIND_EXE) exec_program("${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/generate_memcheck_tests.pl ${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/AddTests.cmake > ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/memcheck_tests.cmake" OUTPUT_VARIABLE SHUTT) set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full --show-reachable=yes --track-origins=yes --read-var-info=no") message(STATUS "Valgrind options: ${MEMORYCHECK_COMMAND_OPTIONS}") - else(NEW_VALGRIND_VERSION) + else() set(enable_memcheck false) message(STATUS "Error: Command valgrind not found --> enable_memcheck autoset to false.") - endif(NEW_VALGRIND_VERSION) -else(VALGRIND_EXE) + endif() +else() set(enable_memcheck false) message(FATAL_ERROR "Command valgrind not found --> enable_memcheck autoset to false.") -endif(VALGRIND_EXE) +endif() mark_as_advanced(VALGRIND_EXE) \ No newline at end of file diff --git a/buildtools/Cmake/Option.cmake b/buildtools/Cmake/Option.cmake index 9a660662ee..8b723ec072 100644 --- a/buildtools/Cmake/Option.cmake +++ b/buildtools/Cmake/Option.cmake @@ -7,9 +7,9 @@ set(ns3_path ${ns3_path} CACHE PATH "Path to ns3 lib and include") if(NOT CMAKE_INSTALL_PREFIX) set(CMAKE_INSTALL_PREFIX "/usr/local/simgrid/" CACHE PATH "Path where to install project") -else(NOT CMAKE_INSTALL_PREFIX) +else() set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE PATH "Path where to install project") -endif(NOT CMAKE_INSTALL_PREFIX) +endif() set(pipol_user ${pipol_user} CACHE TYPE INTERNAL FORCE) @@ -37,9 +37,9 @@ option(enable_msg_deprecated "This option enable the use of msg deprecated funct if(WIN32) option(enable_smpi "Whether the smpi library is compiled." off) -else(WIN32) +else() option(enable_smpi "Whether the smpi library is compiled." on) -endif(WIN32) +endif() mark_as_advanced(HAVE_SSH) mark_as_advanced(HAVE_RSYNC) diff --git a/buildtools/Cmake/Pipol.cmake b/buildtools/Cmake/Pipol.cmake index a225176063..1d47879514 100644 --- a/buildtools/Cmake/Pipol.cmake +++ b/buildtools/Cmake/Pipol.cmake @@ -10,43 +10,43 @@ IF(pipol_user) if(with_context) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Dwith_context=${with_context}") - endif(with_context) + endif() if(enable_smpi) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Denable_smpi=on") - endif(enable_smpi) + endif() if(enable_lua) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Denable_lua=on") - endif(enable_lua) + endif() if(enable_compile_optimizations) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Denable_compile_optimizations=on") - endif(enable_compile_optimizations) + endif() if(enable_compile_warnings) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Denable_compile_warnings=on") - endif(enable_compile_warnings) + endif() if(enable_tracing) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Denable_tracing=on") - endif(enable_tracing) + endif() if(enable_coverage) set(CMAKE_OPTIONS "${CMAKE_OPTION} -Denable_coverage=on") - endif(enable_coverage) + endif() if(enable_print_message) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Denable_print_message=on") - endif(enable_print_message) + endif() if(enable_model-checking) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Denable_model-checking=on") - endif(enable_model-checking) + endif() if(enable_latency_bound_tracking) set(CMAKE_OPTIONS "${CMAKE_OPTIONS} -Denable_latency_bound_tracking=on") - endif(enable_latency_bound_tracking) + endif() FIND_PROGRAM(HAVE_SSH ssh) FIND_PROGRAM(HAVE_RSYNC rsync) @@ -59,7 +59,7 @@ IF(pipol_user) ssh ${pipol_user}@pipol.inria.fr pipol-sub --query=systems OUTPUT_VARIABLE PIPOL_SYSTEMS OUTPUT_STRIP_TRAILING_WHITESPACE) - ENDIF(HAVE_SSH) + ENDIF() ADD_CUSTOM_TARGET(pipol_test_list_images COMMENT "Available images for pipol tests (cmake + make + make test) : " @@ -125,8 +125,8 @@ IF(pipol_user) cmake ${CMAKE_HOME_DIRECTORY}${CMAKE_OPTIONS} \; ctest -D Experimental \" ) - endif(NOT make_test) - endif(make_test) + endif() + endif() ADD_CUSTOM_COMMAND(TARGET ${SYSTEM_TARGET}_experimental POST_BUILD @@ -141,7 +141,7 @@ IF(pipol_user) ) ENDMACRO(PIPOL_TARGET) - ENDIF(HAVE_RSYNC) + ENDIF() # add a target for each pipol system IF(PIPOL_SYSTEMS) @@ -149,7 +149,7 @@ IF(pipol_user) FOREACH(SYSTEM ${PIPOL_SYSTEMS}) PIPOL_TARGET(${SYSTEM}) ENDFOREACH(SYSTEM ${PIPOL_SYSTEMS}) - ENDIF(PIPOL_SYSTEMS) + ENDIF() ADD_CUSTOM_TARGET(pipol_kill_all_jobs COMMENT "PIPOL delete all jobs" @@ -158,4 +158,4 @@ IF(pipol_user) message(STATUS "Pipol options: ${CMAKE_OPTIONS}") -ENDIF(pipol_user) \ No newline at end of file +ENDIF() \ No newline at end of file diff --git a/buildtools/Cmake/PrintArgs.cmake b/buildtools/Cmake/PrintArgs.cmake index 26e15db2f0..2fb07fd64c 100644 --- a/buildtools/Cmake/PrintArgs.cmake +++ b/buildtools/Cmake/PrintArgs.cmake @@ -72,7 +72,7 @@ if(enable_print_message) message("______________________________________________________________________") message("______________________________________________________________________ DEBUG END") message("") -endif(enable_print_message) +endif() message("\nConfiguration of package `simgrid' on arch (=${GRAS_THISARCH}):") message(" BUILDNAME ...........: ${BUILDNAME}") @@ -83,6 +83,7 @@ message(" Compiler: c++ .......: ${CMAKE_CXX_COMPILER}") message(" version .....: ${COMPILER_CXX_VERSION}") message(" Compiler: c .........: ${CMAKE_C_COMPILER}") message(" version .....: ${COMPILER_C_VERSION}") +message(" Linker: .............: ${CMAKE_LINKER}") message("") message(" CFlags ..............: ${CMAKE_C_FLAGS}") message(" CPPFlags ............: ${CMAKE_CXX_FLAGS}") @@ -93,7 +94,7 @@ if(NOT APPLE AND NOT WIN32) message(" Compile NS-3 ........: ${HAVE_NS3}") message(" Gtnets path .........: ${gtnets_path}") message(" NS-3 path ...........: ${ns3_path}") -endif(NOT APPLE AND NOT WIN32) +endif() message(" Compile Lua .........: ${HAVE_LUA}") message(" Compile Smpi ........: ${HAVE_SMPI}") message(" Compile Smpi f77 ....: ${SMPI_F2C}") diff --git a/buildtools/Cmake/Supernovae.cmake b/buildtools/Cmake/Supernovae.cmake index d6a32653d2..ec68d3cd24 100644 --- a/buildtools/Cmake/Supernovae.cmake +++ b/buildtools/Cmake/Supernovae.cmake @@ -68,4 +68,4 @@ if (enable_supernovae) # I need supernovae set(SMPI_SRC ${CMAKE_CURRENT_BINARY_DIR}/src/supernovae_smpi.c) -endif(enable_supernovae) # I need supernovae +endif() # I need supernovae diff --git a/buildtools/Cmake/UnitTesting.cmake b/buildtools/Cmake/UnitTesting.cmake index c08425471c..746596e7a7 100644 --- a/buildtools/Cmake/UnitTesting.cmake +++ b/buildtools/Cmake/UnitTesting.cmake @@ -59,8 +59,8 @@ add_executable(testall ${TEST_UNITS}) ### Add definitions for compile if(NOT WIN32) target_link_libraries(testall gras m) -else(NOT WIN32) +else() target_link_libraries(testall gras) -endif(NOT WIN32) +endif() add_dependencies(testall ${TEST_UNITS}) \ No newline at end of file diff --git a/buildtools/pipol/CtestPipol.cmake b/buildtools/pipol/CtestPipol.cmake index f46507d959..b6c2291c27 100755 --- a/buildtools/pipol/CtestPipol.cmake +++ b/buildtools/pipol/CtestPipol.cmake @@ -31,11 +31,11 @@ set(CTEST_MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full -- if(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.svn) SET(CTEST_UPDATE_COMMAND "/usr/bin/svn") -endif(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.svn) +endif() if(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git) SET(CTEST_UPDATE_COMMAND "/usr/bin/git") -endif(IS_DIRECTORY ${CMAKE_HOME_DIRECTORY}/.git) +endif() SET(CTEST_DROP_METHOD "http") SET(CTEST_DROP_SITE "cdash.inria.fr/CDash") @@ -174,7 +174,7 @@ IF(${ARCH_32_BITS}) amok-bandwidth-sg-32 amok-saturate-sg-32 ) -ELSE(${ARCH_32_BITS}) +ELSE() SET(CTEST_CUSTOM_MEMCHECK_IGNORE ${CTEST_CUSTOM_MEMCHECK_IGNORE} tesh-gras-msg_handle-sg-64 @@ -192,7 +192,7 @@ ELSE(${ARCH_32_BITS}) amok-bandwidth-sg-64 amok-saturate-sg-64 ) -ENDIF(${ARCH_32_BITS}) +ENDIF() if(HAVE_GTNETS) SET(CTEST_CUSTOM_MEMCHECK_IGNORE @@ -203,7 +203,7 @@ if(HAVE_GTNETS) msg-gtnets4 msg-gtnets5 ) -endif(HAVE_GTNETS) +endif() if(HAVE_JAVA) SET(CTEST_CUSTOM_MEMCHECK_IGNORE @@ -213,7 +213,7 @@ if(HAVE_JAVA) java-comm_time java-suspend ) -endif(HAVE_JAVA) +endif() ctest_start(Experimental) ctest_update(SOURCE "${CTEST_SOURCE_DIRECTORY}") diff --git a/doc/HelloWorld/CMakeLists.txt b/doc/HelloWorld/CMakeLists.txt index a63cd2c833..99c2b582f3 100644 --- a/doc/HelloWorld/CMakeLists.txt +++ b/doc/HelloWorld/CMakeLists.txt @@ -5,9 +5,9 @@ cmake_minimum_required(VERSION 2.8) if(WIN32) SET(CMAKE_RC_COMPILER "windres") set(LIBRARIES_DEP simgrid pcre ws2_32 pthread) -else(WIN32) +else() set(LIBRARIES_DEP simgrid pcre pthread) -endif(WIN32) +endif() project(MY_SIMGRID_PROJECT C) @@ -22,13 +22,13 @@ message(STATUS "Looking for lib Simgrid") if("$ENV{SIMGRID_ROOT}" STREQUAL "") message(STATUS "Looking for lib Simgrid - Not found") message(FATAL_ERROR "Simgrid not found, reinstall it or set SIMGRID_ROOT") -else("$ENV{SIMGRID_ROOT}" STREQUAL "") +else() link_directories($ENV{SIMGRID_ROOT}/lib) include_directories($ENV{SIMGRID_ROOT}/include) include_directories($ENV{SIMGRID_ROOT}/src) include_directories($ENV{SIMGRID_ROOT}/src/include) message(STATUS "Looking for lib Simgrid - found") -endif("$ENV{SIMGRID_ROOT}" STREQUAL "") +endif() ################ # FIND TARGETS # diff --git a/doc/HelloWorld/FindPcreWin.cmake b/doc/HelloWorld/FindPcreWin.cmake index 871b144831..d4628ea12c 100644 --- a/doc/HelloWorld/FindPcreWin.cmake +++ b/doc/HelloWorld/FindPcreWin.cmake @@ -17,28 +17,28 @@ find_path(PATH_PCRE_H "pcre.h" message(STATUS "Looking for pcre.h") if(PATH_PCRE_H) message(STATUS "Looking for pcre.h - found") -else(PATH_PCRE_H) +else() message(STATUS "Looking for pcre.h - not found") -endif(PATH_PCRE_H) +endif() message(STATUS "Looking for lib pcre") if(PATH_PCRE_LIB) message(STATUS "Looking for lib pcre - found") -else(PATH_PCRE_LIB) +else() message(STATUS "Looking for lib pcre - not found") -endif(PATH_PCRE_LIB) +endif() if(PATH_PCRE_LIB AND PATH_PCRE_H) string(REGEX REPLACE "/pcre.h" "" PATH_PCRE_H "${PATH_PCRE_H}") string(REGEX MATCH "-I${PATH_PCRE_H} " operation "${CMAKE_C_FLAGS}") if(NOT operation) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}-I${PATH_PCRE_H} ") - endif(NOT operation) + endif() string(REGEX REPLACE "/libpcre.dll" "" PATH_PCRE_LIB "${PATH_PCRE_LIB}") link_directories(${PATH_PCRE_LIB}) -else(PATH_PCRE_LIB) +else() message(FATAL_ERROR "Please install the pcre package before using SimGrid.") -endif(PATH_PCRE_LIB AND PATH_PCRE_H) +endif() mark_as_advanced(PATH_PCRE_H) mark_as_advanced(PATH_PCRE_LIB) \ No newline at end of file diff --git a/doc/dev_guide/doxygen/cmake.doc b/doc/dev_guide/doxygen/cmake.doc index 2da858ef50..23fbdb18ed 100644 --- a/doc/dev_guide/doxygen/cmake.doc +++ b/doc/dev_guide/doxygen/cmake.doc @@ -49,4 +49,19 @@ add_subdirectory(${CMAKE_HOME_DIRECTORY}/) \section cmake_dev_guide_test How to add tests? +\section cmake_dev_guide_dist How to make a clean dist? + +\subsection cmake_dev_guide_dist_sim Simgrid + +\subsubsection cmake_dev_guide_dist_sim_unix Under UNIX + +\subsubsection cmake_dev_guide_dist_sim_win Under Win32 + +\subsection cmake_dev_guide_dist_bindings Bindings + +\subsubsection cmake_dev_guide_dist_bindings_java Java + +\subsubsection cmake_dev_guide_dist_bindings_lua LUA + +\subsubsection cmake_dev_guide_dist_bindings_ruby Ruby */ diff --git a/doc/dev_guide/doxygen/xps.doc b/doc/dev_guide/doxygen/xps.doc index 3d7c7ceb3b..1c882101ba 100644 --- a/doc/dev_guide/doxygen/xps.doc +++ b/doc/dev_guide/doxygen/xps.doc @@ -2,6 +2,37 @@ \page xps SimGrid Developer Guide - XPs \section xps_dev_guide_pipol How to run test in pipol? + +In order to use PIPOL you have to create your account here: http://pipol.inria.fr/ + +\subsection xps_dev_guide_pipol_general What is PIPOL? + +The PIPOL platform is a porting, testing and compilation cluster. It hosts several hardware and software +architectures to perform its work. An user can reserve a resource (a specific hardware, an operating system...) +to be used interactively or automatically (with a "Nightly Builds" system) for software testing. + +\subsection xps_dev_guide_pipol_frontend From PIPOL frontend + +You first need to be connected into pipol ssh. +\verbatim +user@caraja:~$ ssh pipol.inria.fr +Linux pipol-server 2.6.26-2-amd64 #1 SMP Thu Nov 5 02:23:12 UTC 2009 x86_64 +*************************************************************************** +* You are just logged-on the PIPOL platform server * +* You can find some documentation about porting works on the platform * +* on the PIPOL's web site: http://pipol.inria.fr/docs/ * +* To report bugs you can write to: pipol-sysadm@lists.gforge.inria.fr * +*************************************************************************** + + +user@pipol:~$ +\endverbatim +Then you can see pipol images availables for deployment + +\subsection xps_dev_guide_pipol_home From a computer + +\section xps_dev_guide_cdash How to report tests in cdash? + \section xps_dev_guide_g5k How to run simgrid scalability xps? */ diff --git a/examples/amok/bandwidth/CMakeLists.txt b/examples/amok/bandwidth/CMakeLists.txt index 9ce7683cbb..5d657fd3e4 100644 --- a/examples/amok/bandwidth/CMakeLists.txt +++ b/examples/amok/bandwidth/CMakeLists.txt @@ -26,11 +26,11 @@ if(NOT WIN32) target_link_libraries(bandwidth_simulator simgrid pthread m) target_link_libraries(bandwidth_maestro gras pthread m) target_link_libraries(bandwidth_sensor gras pthread m) -else(NOT WIN32) +else() target_link_libraries(bandwidth_simulator simgrid) target_link_libraries(bandwidth_maestro gras) target_link_libraries(bandwidth_sensor gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/amok/saturate/CMakeLists.txt b/examples/amok/saturate/CMakeLists.txt index cd87c37018..aec9f8c6b2 100644 --- a/examples/amok/saturate/CMakeLists.txt +++ b/examples/amok/saturate/CMakeLists.txt @@ -26,11 +26,11 @@ if(NOT WIN32) target_link_libraries(saturate_simulator simgrid pthread m) target_link_libraries(saturate_maestro gras pthread m) target_link_libraries(saturate_sensor gras pthread m) -else(NOT WIN32) +else() target_link_libraries(saturate_simulator simgrid) target_link_libraries(saturate_maestro gras) target_link_libraries(saturate_sensor gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/all2all/CMakeLists.txt b/examples/gras/all2all/CMakeLists.txt index 82b7c2fe48..18b5c1d810 100644 --- a/examples/gras/all2all/CMakeLists.txt +++ b/examples/gras/all2all/CMakeLists.txt @@ -26,11 +26,11 @@ if(NOT WIN32) target_link_libraries(all2all_simulator simgrid pthread m) target_link_libraries(all2all_sender gras pthread m) target_link_libraries(all2all_receiver gras pthread m) -else(NOT WIN32) +else() target_link_libraries(all2all_simulator simgrid) target_link_libraries(all2all_sender gras) target_link_libraries(all2all_receiver gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/chrono/CMakeLists.txt b/examples/gras/chrono/CMakeLists.txt index 06d094be7e..218d24f15d 100644 --- a/examples/gras/chrono/CMakeLists.txt +++ b/examples/gras/chrono/CMakeLists.txt @@ -21,10 +21,10 @@ add_custom_command( if(NOT WIN32) target_link_libraries(chrono_simulator simgrid pthread m ) target_link_libraries(chrono_multiplier gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(chrono_simulator simgrid) target_link_libraries(chrono_multiplier gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/console/CMakeLists.txt b/examples/gras/console/CMakeLists.txt index f8989af6ab..e27e4449be 100644 --- a/examples/gras/console/CMakeLists.txt +++ b/examples/gras/console/CMakeLists.txt @@ -39,7 +39,7 @@ if(HAVE_LUA) target_link_libraries(ping_simulator_console simgrid pthread m) target_link_libraries(ping_client_console gras simgrid pthread m) target_link_libraries(ping_server_console gras simgrid pthread m) -endif(HAVE_LUA) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/mmrpc/CMakeLists.txt b/examples/gras/mmrpc/CMakeLists.txt index e8b2bc8550..4ccd6719a9 100644 --- a/examples/gras/mmrpc/CMakeLists.txt +++ b/examples/gras/mmrpc/CMakeLists.txt @@ -36,11 +36,11 @@ if(NOT WIN32) target_link_libraries(mmrpc_simulator simgrid pthread m ) target_link_libraries(mmrpc_client gras pthread m ) target_link_libraries(mmrpc_server gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(mmrpc_simulator simgrid) target_link_libraries(mmrpc_client gras) target_link_libraries(mmrpc_server gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/mutual_exclusion/simple_token/CMakeLists.txt b/examples/gras/mutual_exclusion/simple_token/CMakeLists.txt index c1e24c0d31..2166f97136 100644 --- a/examples/gras/mutual_exclusion/simple_token/CMakeLists.txt +++ b/examples/gras/mutual_exclusion/simple_token/CMakeLists.txt @@ -22,10 +22,10 @@ add_custom_command( if(NOT WIN32) target_link_libraries(simple_token_simulator simgrid pthread m ) target_link_libraries(simple_token_node gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(simple_token_simulator simgrid) target_link_libraries(simple_token_node gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/ping/CMakeLists.txt b/examples/gras/ping/CMakeLists.txt index e2caa08b65..4ba3de8461 100644 --- a/examples/gras/ping/CMakeLists.txt +++ b/examples/gras/ping/CMakeLists.txt @@ -36,11 +36,11 @@ if(NOT WIN32) target_link_libraries(ping_simulator simgrid pthread m ) target_link_libraries(ping_client gras pthread m ) target_link_libraries(ping_server gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(ping_simulator simgrid) target_link_libraries(ping_client gras) target_link_libraries(ping_server gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/pmm/CMakeLists.txt b/examples/gras/pmm/CMakeLists.txt index c894a0d3c1..46d8db7b81 100644 --- a/examples/gras/pmm/CMakeLists.txt +++ b/examples/gras/pmm/CMakeLists.txt @@ -26,11 +26,11 @@ if(NOT WIN32) target_link_libraries(pmm_simulator simgrid pthread m ) target_link_libraries(pmm_slave gras pthread m ) target_link_libraries(pmm_master gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(pmm_simulator simgrid) target_link_libraries(pmm_slave gras) target_link_libraries(pmm_master gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/properties/CMakeLists.txt b/examples/gras/properties/CMakeLists.txt index 90debfdf52..946cf6c0cd 100644 --- a/examples/gras/properties/CMakeLists.txt +++ b/examples/gras/properties/CMakeLists.txt @@ -26,11 +26,11 @@ if(NOT WIN32) target_link_libraries(properties_simulator simgrid pthread m ) target_link_libraries(properties_alice gras pthread m ) target_link_libraries(properties_bob gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(properties_simulator simgrid) target_link_libraries(properties_alice gras) target_link_libraries(properties_bob gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/rpc/CMakeLists.txt b/examples/gras/rpc/CMakeLists.txt index 42c9aaab19..063bb93a89 100644 --- a/examples/gras/rpc/CMakeLists.txt +++ b/examples/gras/rpc/CMakeLists.txt @@ -30,12 +30,12 @@ if(NOT WIN32) target_link_libraries(rpc_client gras pthread m ) target_link_libraries(rpc_forwarder gras pthread m ) target_link_libraries(rpc_server gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(rpc_simulator simgrid) target_link_libraries(rpc_client gras) target_link_libraries(rpc_forwarder gras) target_link_libraries(rpc_server gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/spawn/CMakeLists.txt b/examples/gras/spawn/CMakeLists.txt index d711cd8ba7..05f146d706 100644 --- a/examples/gras/spawn/CMakeLists.txt +++ b/examples/gras/spawn/CMakeLists.txt @@ -22,10 +22,10 @@ add_custom_command( if(NOT WIN32) target_link_libraries(spawn_simulator simgrid pthread m ) target_link_libraries(spawn_server gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(spawn_simulator simgrid) target_link_libraries(spawn_server gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/synchro/CMakeLists.txt b/examples/gras/synchro/CMakeLists.txt index 3490e4613f..6191bdfda1 100644 --- a/examples/gras/synchro/CMakeLists.txt +++ b/examples/gras/synchro/CMakeLists.txt @@ -22,10 +22,10 @@ add_custom_command( if(NOT WIN32) target_link_libraries(synchro_simulator simgrid pthread m ) target_link_libraries(synchro_philosopher gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(synchro_simulator simgrid) target_link_libraries(synchro_philosopher gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/gras/timer/CMakeLists.txt b/examples/gras/timer/CMakeLists.txt index 86c42b7c8b..e41e5c5ea2 100644 --- a/examples/gras/timer/CMakeLists.txt +++ b/examples/gras/timer/CMakeLists.txt @@ -22,10 +22,10 @@ add_custom_command( if(NOT WIN32) target_link_libraries(timer_simulator simgrid pthread m ) target_link_libraries(timer_client gras pthread m ) -else(NOT WIN32) +else() target_link_libraries(timer_simulator simgrid) target_link_libraries(timer_client gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/msg/cloud/CMakeLists.txt b/examples/msg/cloud/CMakeLists.txt index 8372f4545c..c06ebfaa0e 100644 --- a/examples/msg/cloud/CMakeLists.txt +++ b/examples/msg/cloud/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(masterslave_virtual_machines "masterslave_virtual_machines.c") ### Add definitions for compile if(WIN32) target_link_libraries(masterslave_virtual_machines simgrid ) -else(WIN32) +else() target_link_libraries(masterslave_virtual_machines simgrid m) -endif(WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/msg/io/CMakeLists.txt b/examples/msg/io/CMakeLists.txt index 7036f56cf9..d3f612e3f0 100644 --- a/examples/msg/io/CMakeLists.txt +++ b/examples/msg/io/CMakeLists.txt @@ -9,10 +9,10 @@ add_executable(file_unlink file_unlink.c) if(NOT WIN32) target_link_libraries(file simgrid m pthread) target_link_libraries(file_unlink simgrid m pthread) -else(NOT WIN32) +else() target_link_libraries(file simgrid) target_link_libraries(file_unlink simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/msg/masterslave/CMakeLists.txt b/examples/msg/masterslave/CMakeLists.txt index e68e0da4c0..b062bf8316 100644 --- a/examples/msg/masterslave/CMakeLists.txt +++ b/examples/msg/masterslave/CMakeLists.txt @@ -24,7 +24,7 @@ if(WIN32) target_link_libraries(masterslave_arg simgrid ) target_link_libraries(masterslave_platfgen simgrid ) target_link_libraries(masterslave_failure_platfgen simgrid ) -else(WIN32) +else() target_link_libraries(masterslave_forwarder simgrid m ) target_link_libraries(masterslave_failure simgrid m ) target_link_libraries(masterslave_mailbox simgrid m ) @@ -34,7 +34,7 @@ else(WIN32) target_link_libraries(masterslave_arg simgrid m ) target_link_libraries(masterslave_platfgen simgrid m ) target_link_libraries(masterslave_failure_platfgen simgrid m ) -endif(WIN32) +endif() target_link_libraries(masterslave_cluster simgrid) set(tesh_files diff --git a/examples/msg/mc/CMakeLists.txt b/examples/msg/mc/CMakeLists.txt index 47fce16b79..5e267988b7 100644 --- a/examples/msg/mc/CMakeLists.txt +++ b/examples/msg/mc/CMakeLists.txt @@ -23,7 +23,7 @@ if(HAVE_MC) target_link_libraries(bugged2_liveness simgrid m ) target_link_libraries(test/test_heap_comparison simgrid m ) -endif(HAVE_MC) +endif() set(tesh_files ${tesh_files} diff --git a/examples/msg/ns3/CMakeLists.txt b/examples/msg/ns3/CMakeLists.txt index 6b8fa3024f..a32eb655f7 100644 --- a/examples/msg/ns3/CMakeLists.txt +++ b/examples/msg/ns3/CMakeLists.txt @@ -7,7 +7,7 @@ if(HAVE_NS3) ### Add definitions for compile target_link_libraries(ns3 simgrid m ) -endif(HAVE_NS3) +endif() set(tesh_files ${tesh_files} diff --git a/examples/msg/start_kill_time/CMakeLists.txt b/examples/msg/start_kill_time/CMakeLists.txt index 8c8ce6a4b7..7f291d08db 100644 --- a/examples/msg/start_kill_time/CMakeLists.txt +++ b/examples/msg/start_kill_time/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(sk_time "sk_time.c") ### Add definitions for compile if(WIN32) target_link_libraries(sk_time simgrid ) -else(WIN32) +else() target_link_libraries(sk_time simgrid m ) -endif(WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/msg/token_ring/CMakeLists.txt b/examples/msg/token_ring/CMakeLists.txt index c87894efe6..f3e07d48c2 100644 --- a/examples/msg/token_ring/CMakeLists.txt +++ b/examples/msg/token_ring/CMakeLists.txt @@ -9,10 +9,10 @@ add_executable(token_bypass token_bypass.c) if(NOT WIN32) target_link_libraries(token_ring simgrid m pthread ) target_link_libraries(token_bypass simgrid m pthread ) -else(NOT WIN32) +else() target_link_libraries(token_ring simgrid) target_link_libraries(token_bypass simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/msg/tracing/CMakeLists.txt b/examples/msg/tracing/CMakeLists.txt index 99c04491cc..f177544060 100644 --- a/examples/msg/tracing/CMakeLists.txt +++ b/examples/msg/tracing/CMakeLists.txt @@ -29,7 +29,7 @@ if(HAVE_TRACING) PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/ms.cat.plist;${CMAKE_CURRENT_BINARY_DIR}/ms.trace;${CMAKE_CURRENT_BINARY_DIR}/ms.uncat.plist;" ) -endif(HAVE_TRACING) +endif() set(tesh_files ${tesh_files} diff --git a/examples/msg/tracing/trace_platform.tesh b/examples/msg/tracing/trace_platform.tesh index c6e442c496..4af8c320ef 100644 --- a/examples/msg/tracing/trace_platform.tesh +++ b/examples/msg/tracing/trace_platform.tesh @@ -162,40 +162,40 @@ $ tail -n +3 simgrid.trace > 8 0 5 14 0.000060 > 8 0 4 15 27946250.000000 > 8 0 5 15 0.000278 -> 15 0 6 0 G 3 0 -> 16 0 6 0 G 11 0 -> 15 0 7 0 G 11 1 -> 16 0 7 0 G 12 1 -> 15 0 7 0 G 12 2 -> 16 0 7 0 G 14 2 -> 15 0 7 0 G 14 3 -> 16 0 7 0 G 10 3 -> 15 0 7 0 G 10 4 -> 16 0 7 0 G 7 4 -> 15 0 7 0 G 7 5 -> 16 0 7 0 G 13 5 -> 15 0 8 0 G 13 6 -> 16 0 8 0 G 1 6 -> 15 0 7 0 G 11 7 -> 16 0 7 0 G 6 7 -> 15 0 7 0 G 6 8 -> 16 0 7 0 G 8 8 -> 15 0 8 0 G 8 9 -> 16 0 8 0 G 5 9 -> 15 0 7 0 G 13 10 -> 16 0 7 0 G 9 10 -> 15 0 8 0 G 9 11 -> 16 0 8 0 G 2 11 -> 15 0 7 0 G 10 12 -> 16 0 7 0 G 15 12 -> 15 0 8 0 G 15 13 -> 16 0 8 0 G 4 13 -> 15 0 7 0 G 12 14 -> 16 0 7 0 G 6 14 -> 15 0 6 0 G 1 15 -> 16 0 6 0 G 9 15 -> 15 0 7 0 G 7 16 -> 16 0 7 0 G 15 16 +> 15 0 6 0 topology 3 0 +> 16 0 6 0 topology 11 0 +> 15 0 7 0 topology 11 1 +> 16 0 7 0 topology 12 1 +> 15 0 7 0 topology 12 2 +> 16 0 7 0 topology 14 2 +> 15 0 7 0 topology 14 3 +> 16 0 7 0 topology 10 3 +> 15 0 7 0 topology 10 4 +> 16 0 7 0 topology 7 4 +> 15 0 7 0 topology 7 5 +> 16 0 7 0 topology 13 5 +> 15 0 8 0 topology 13 6 +> 16 0 8 0 topology 1 6 +> 15 0 7 0 topology 11 7 +> 16 0 7 0 topology 6 7 +> 15 0 7 0 topology 6 8 +> 16 0 7 0 topology 8 8 +> 15 0 8 0 topology 8 9 +> 16 0 8 0 topology 5 9 +> 15 0 7 0 topology 13 10 +> 16 0 7 0 topology 9 10 +> 15 0 8 0 topology 9 11 +> 16 0 8 0 topology 2 11 +> 15 0 7 0 topology 10 12 +> 16 0 7 0 topology 15 12 +> 15 0 8 0 topology 15 13 +> 16 0 8 0 topology 4 13 +> 15 0 7 0 topology 12 14 +> 16 0 7 0 topology 6 14 +> 15 0 6 0 topology 1 15 +> 16 0 6 0 topology 9 15 +> 15 0 7 0 topology 7 16 +> 16 0 7 0 topology 15 16 > 7 0 1 3 > 7 0 1 1 > 7 0 3 14 @@ -12973,12634 +12973,12634 @@ $ tail -n +3 simgrid.trace > 8 0 5 4794 0.000100 > 8 0 4 4797 1250000000.000000 > 8 0 5 4797 0.000100 -> 15 0 20 1 G 9 0 -> 16 0 20 1 G 18 0 -> 15 0 21 1 G 18 1 -> 16 0 21 1 G 15 1 -> 15 0 21 1 G 15 2 -> 16 0 21 1 G 12 2 -> 15 0 22 1 G 12 3 -> 16 0 22 1 G 2 3 -> 15 0 20 1 G 9 4 -> 16 0 20 1 G 20 4 -> 15 0 22 1 G 20 5 -> 16 0 22 1 G 10 5 -> 15 0 21 1 G 18 6 -> 16 0 21 1 G 17 6 -> 15 0 22 1 G 17 7 -> 16 0 22 1 G 8 7 -> 15 0 22 1 G 15 8 -> 16 0 22 1 G 3 8 -> 15 0 20 1 G 9 9 -> 16 0 20 1 G 19 9 -> 15 0 22 1 G 19 10 -> 16 0 22 1 G 11 10 -> 15 0 21 1 G 18 11 -> 16 0 21 1 G 16 11 -> 15 0 22 1 G 16 12 -> 16 0 22 1 G 7 12 -> 15 0 22 1 G 18 13 -> 16 0 22 1 G 6 13 -> 15 0 21 1 G 15 14 -> 16 0 21 1 G 14 14 -> 15 0 22 1 G 14 15 -> 16 0 22 1 G 5 15 -> 15 0 21 1 G 15 16 -> 16 0 21 1 G 13 16 -> 15 0 22 1 G 13 17 -> 16 0 22 1 G 4 17 -> 15 0 21 1 G 18 18 -> 16 0 21 1 G 20 18 -> 15 0 21 1 G 15 19 -> 16 0 21 1 G 17 19 -> 15 0 22 1 G 12 20 -> 16 0 22 1 G 3 20 -> 15 0 21 1 G 18 21 -> 16 0 21 1 G 19 21 -> 15 0 21 1 G 15 22 -> 16 0 21 1 G 16 22 -> 15 0 22 1 G 15 23 -> 16 0 22 1 G 6 23 -> 15 0 21 1 G 12 24 -> 16 0 21 1 G 14 24 -> 15 0 21 1 G 12 25 -> 16 0 21 1 G 13 25 -> 15 0 21 1 G 20 26 -> 16 0 21 1 G 19 26 -> 15 0 21 1 G 17 27 -> 16 0 21 1 G 16 27 -> 15 0 22 1 G 17 28 -> 16 0 22 1 G 6 28 -> 15 0 20 1 G 3 29 -> 16 0 20 1 G 14 29 -> 15 0 20 1 G 3 30 -> 16 0 20 1 G 13 30 -> 15 0 22 1 G 16 31 -> 16 0 22 1 G 6 31 -> 15 0 21 1 G 14 32 -> 16 0 21 1 G 13 32 -> 15 0 23 4635 G 4648 33 -> 16 0 23 4635 G 4649 33 -> 15 0 24 4635 G 4649 34 -> 16 0 24 4635 G 4793 34 -> 15 0 24 4635 G 4793 35 -> 16 0 24 4635 G 4662 35 -> 15 0 25 4635 G 4662 36 -> 16 0 25 4635 G 4660 36 -> 15 0 24 4635 G 4793 37 -> 16 0 24 4635 G 4665 37 -> 15 0 25 4635 G 4665 38 -> 16 0 25 4635 G 4663 38 -> 15 0 24 4635 G 4793 39 -> 16 0 24 4635 G 4725 39 -> 15 0 25 4635 G 4725 40 -> 16 0 25 4635 G 4723 40 -> 15 0 24 4635 G 4793 41 -> 16 0 24 4635 G 4701 41 -> 15 0 25 4635 G 4701 42 -> 16 0 25 4635 G 4699 42 -> 15 0 24 4635 G 4793 43 -> 16 0 24 4635 G 4677 43 -> 15 0 25 4635 G 4677 44 -> 16 0 25 4635 G 4675 44 -> 15 0 24 4635 G 4793 45 -> 16 0 24 4635 G 4785 45 -> 15 0 25 4635 G 4785 46 -> 16 0 25 4635 G 4783 46 -> 15 0 24 4635 G 4793 47 -> 16 0 24 4635 G 4761 47 -> 15 0 25 4635 G 4761 48 -> 16 0 25 4635 G 4759 48 -> 15 0 24 4635 G 4793 49 -> 16 0 24 4635 G 4737 49 -> 15 0 25 4635 G 4737 50 -> 16 0 25 4635 G 4735 50 -> 15 0 24 4635 G 4793 51 -> 16 0 24 4635 G 4713 51 -> 15 0 25 4635 G 4713 52 -> 16 0 25 4635 G 4711 52 -> 15 0 24 4635 G 4793 53 -> 16 0 24 4635 G 4689 53 -> 15 0 25 4635 G 4689 54 -> 16 0 25 4635 G 4687 54 -> 15 0 24 4635 G 4793 55 -> 16 0 24 4635 G 4773 55 -> 15 0 25 4635 G 4773 56 -> 16 0 25 4635 G 4771 56 -> 15 0 24 4635 G 4793 57 -> 16 0 24 4635 G 4749 57 -> 15 0 25 4635 G 4749 58 -> 16 0 25 4635 G 4747 58 -> 15 0 24 4635 G 4793 59 -> 16 0 24 4635 G 4641 59 -> 15 0 25 4635 G 4641 60 -> 16 0 25 4635 G 4639 60 -> 15 0 24 4635 G 4793 61 -> 16 0 24 4635 G 4653 61 -> 15 0 25 4635 G 4653 62 -> 16 0 25 4635 G 4651 62 -> 15 0 26 4635 G 4793 63 -> 16 0 26 4635 G 4792 63 -> 15 0 24 4635 G 4793 64 -> 16 0 24 4635 G 4668 64 -> 15 0 25 4635 G 4668 65 -> 16 0 25 4635 G 4666 65 -> 15 0 24 4635 G 4793 66 -> 16 0 24 4635 G 4728 66 -> 15 0 25 4635 G 4728 67 -> 16 0 25 4635 G 4726 67 -> 15 0 24 4635 G 4793 68 -> 16 0 24 4635 G 4704 68 -> 15 0 25 4635 G 4704 69 -> 16 0 25 4635 G 4702 69 -> 15 0 24 4635 G 4793 70 -> 16 0 24 4635 G 4680 70 -> 15 0 25 4635 G 4680 71 -> 16 0 25 4635 G 4678 71 -> 15 0 24 4635 G 4793 72 -> 16 0 24 4635 G 4788 72 -> 15 0 25 4635 G 4788 73 -> 16 0 25 4635 G 4786 73 -> 15 0 24 4635 G 4793 74 -> 16 0 24 4635 G 4764 74 -> 15 0 25 4635 G 4764 75 -> 16 0 25 4635 G 4762 75 -> 15 0 24 4635 G 4793 76 -> 16 0 24 4635 G 4740 76 -> 15 0 25 4635 G 4740 77 -> 16 0 25 4635 G 4738 77 -> 15 0 24 4635 G 4793 78 -> 16 0 24 4635 G 4716 78 -> 15 0 25 4635 G 4716 79 -> 16 0 25 4635 G 4714 79 -> 15 0 24 4635 G 4793 80 -> 16 0 24 4635 G 4692 80 -> 15 0 25 4635 G 4692 81 -> 16 0 25 4635 G 4690 81 -> 15 0 24 4635 G 4793 82 -> 16 0 24 4635 G 4776 82 -> 15 0 25 4635 G 4776 83 -> 16 0 25 4635 G 4774 83 -> 15 0 24 4635 G 4793 84 -> 16 0 24 4635 G 4752 84 -> 15 0 25 4635 G 4752 85 -> 16 0 25 4635 G 4750 85 -> 15 0 24 4635 G 4793 86 -> 16 0 24 4635 G 4644 86 -> 15 0 25 4635 G 4644 87 -> 16 0 25 4635 G 4642 87 -> 15 0 24 4635 G 4793 88 -> 16 0 24 4635 G 4656 88 -> 15 0 25 4635 G 4656 89 -> 16 0 25 4635 G 4654 89 -> 15 0 24 4635 G 4793 90 -> 16 0 24 4635 G 4695 90 -> 15 0 25 4635 G 4695 91 -> 16 0 25 4635 G 4693 91 -> 15 0 24 4635 G 4793 92 -> 16 0 24 4635 G 4671 92 -> 15 0 25 4635 G 4671 93 -> 16 0 25 4635 G 4669 93 -> 15 0 24 4635 G 4793 94 -> 16 0 24 4635 G 4755 94 -> 15 0 25 4635 G 4755 95 -> 16 0 25 4635 G 4753 95 -> 15 0 24 4635 G 4793 96 -> 16 0 24 4635 G 4731 96 -> 15 0 25 4635 G 4731 97 -> 16 0 25 4635 G 4729 97 -> 15 0 24 4635 G 4793 98 -> 16 0 24 4635 G 4707 98 -> 15 0 25 4635 G 4707 99 -> 16 0 25 4635 G 4705 99 -> 15 0 24 4635 G 4793 100 -> 16 0 24 4635 G 4683 100 -> 15 0 25 4635 G 4683 101 -> 16 0 25 4635 G 4681 101 -> 15 0 24 4635 G 4793 102 -> 16 0 24 4635 G 4791 102 -> 15 0 25 4635 G 4791 103 -> 16 0 25 4635 G 4789 103 -> 15 0 24 4635 G 4793 104 -> 16 0 24 4635 G 4767 104 -> 15 0 25 4635 G 4767 105 -> 16 0 25 4635 G 4765 105 -> 15 0 24 4635 G 4793 106 -> 16 0 24 4635 G 4743 106 -> 15 0 25 4635 G 4743 107 -> 16 0 25 4635 G 4741 107 -> 15 0 24 4635 G 4793 108 -> 16 0 24 4635 G 4719 108 -> 15 0 25 4635 G 4719 109 -> 16 0 25 4635 G 4717 109 -> 15 0 24 4635 G 4793 110 -> 16 0 24 4635 G 4779 110 -> 15 0 25 4635 G 4779 111 -> 16 0 25 4635 G 4777 111 -> 15 0 24 4635 G 4793 112 -> 16 0 24 4635 G 4647 112 -> 15 0 25 4635 G 4647 113 -> 16 0 25 4635 G 4645 113 -> 15 0 24 4635 G 4793 114 -> 16 0 24 4635 G 4659 114 -> 15 0 25 4635 G 4659 115 -> 16 0 25 4635 G 4657 115 -> 15 0 24 4635 G 4793 116 -> 16 0 24 4635 G 4698 116 -> 15 0 25 4635 G 4698 117 -> 16 0 25 4635 G 4696 117 -> 15 0 24 4635 G 4793 118 -> 16 0 24 4635 G 4674 118 -> 15 0 25 4635 G 4674 119 -> 16 0 25 4635 G 4672 119 -> 15 0 24 4635 G 4793 120 -> 16 0 24 4635 G 4758 120 -> 15 0 25 4635 G 4758 121 -> 16 0 25 4635 G 4756 121 -> 15 0 24 4635 G 4793 122 -> 16 0 24 4635 G 4734 122 -> 15 0 25 4635 G 4734 123 -> 16 0 25 4635 G 4732 123 -> 15 0 24 4635 G 4793 124 -> 16 0 24 4635 G 4710 124 -> 15 0 25 4635 G 4710 125 -> 16 0 25 4635 G 4708 125 -> 15 0 24 4635 G 4793 126 -> 16 0 24 4635 G 4686 126 -> 15 0 25 4635 G 4686 127 -> 16 0 25 4635 G 4684 127 -> 15 0 24 4635 G 4793 128 -> 16 0 24 4635 G 4770 128 -> 15 0 25 4635 G 4770 129 -> 16 0 25 4635 G 4768 129 -> 15 0 24 4635 G 4793 130 -> 16 0 24 4635 G 4746 130 -> 15 0 25 4635 G 4746 131 -> 16 0 25 4635 G 4744 131 -> 15 0 24 4635 G 4793 132 -> 16 0 24 4635 G 4722 132 -> 15 0 25 4635 G 4722 133 -> 16 0 25 4635 G 4720 133 -> 15 0 24 4635 G 4793 134 -> 16 0 24 4635 G 4782 134 -> 15 0 25 4635 G 4782 135 -> 16 0 25 4635 G 4780 135 -> 15 0 24 4635 G 4793 136 -> 16 0 24 4635 G 4638 136 -> 15 0 25 4635 G 4638 137 -> 16 0 25 4635 G 4636 137 -> 15 0 23 4635 G 4660 138 -> 16 0 23 4635 G 4661 138 -> 15 0 24 4635 G 4661 139 -> 16 0 24 4635 G 4793 139 -> 15 0 24 4635 G 4793 140 -> 16 0 24 4635 G 4650 140 -> 15 0 25 4635 G 4650 141 -> 16 0 25 4635 G 4648 141 -> 15 0 23 4635 G 4663 142 -> 16 0 23 4635 G 4664 142 -> 15 0 24 4635 G 4664 143 -> 16 0 24 4635 G 4793 143 -> 15 0 23 4635 G 4723 144 -> 16 0 23 4635 G 4724 144 -> 15 0 24 4635 G 4724 145 -> 16 0 24 4635 G 4793 145 -> 15 0 23 4635 G 4699 146 -> 16 0 23 4635 G 4700 146 -> 15 0 24 4635 G 4700 147 -> 16 0 24 4635 G 4793 147 -> 15 0 23 4635 G 4675 148 -> 16 0 23 4635 G 4676 148 -> 15 0 24 4635 G 4676 149 -> 16 0 24 4635 G 4793 149 -> 15 0 23 4635 G 4783 150 -> 16 0 23 4635 G 4784 150 -> 15 0 24 4635 G 4784 151 -> 16 0 24 4635 G 4793 151 -> 15 0 23 4635 G 4759 152 -> 16 0 23 4635 G 4760 152 -> 15 0 24 4635 G 4760 153 -> 16 0 24 4635 G 4793 153 -> 15 0 23 4635 G 4735 154 -> 16 0 23 4635 G 4736 154 -> 15 0 24 4635 G 4736 155 -> 16 0 24 4635 G 4793 155 -> 15 0 23 4635 G 4711 156 -> 16 0 23 4635 G 4712 156 -> 15 0 24 4635 G 4712 157 -> 16 0 24 4635 G 4793 157 -> 15 0 23 4635 G 4687 158 -> 16 0 23 4635 G 4688 158 -> 15 0 24 4635 G 4688 159 -> 16 0 24 4635 G 4793 159 -> 15 0 23 4635 G 4771 160 -> 16 0 23 4635 G 4772 160 -> 15 0 24 4635 G 4772 161 -> 16 0 24 4635 G 4793 161 -> 15 0 23 4635 G 4747 162 -> 16 0 23 4635 G 4748 162 -> 15 0 24 4635 G 4748 163 -> 16 0 24 4635 G 4793 163 -> 15 0 23 4635 G 4639 164 -> 16 0 23 4635 G 4640 164 -> 15 0 24 4635 G 4640 165 -> 16 0 24 4635 G 4793 165 -> 15 0 23 4635 G 4651 166 -> 16 0 23 4635 G 4652 166 -> 15 0 24 4635 G 4652 167 -> 16 0 24 4635 G 4793 167 -> 15 0 23 4635 G 4666 168 -> 16 0 23 4635 G 4667 168 -> 15 0 24 4635 G 4667 169 -> 16 0 24 4635 G 4793 169 -> 15 0 23 4635 G 4726 170 -> 16 0 23 4635 G 4727 170 -> 15 0 24 4635 G 4727 171 -> 16 0 24 4635 G 4793 171 -> 15 0 23 4635 G 4702 172 -> 16 0 23 4635 G 4703 172 -> 15 0 24 4635 G 4703 173 -> 16 0 24 4635 G 4793 173 -> 15 0 23 4635 G 4678 174 -> 16 0 23 4635 G 4679 174 -> 15 0 24 4635 G 4679 175 -> 16 0 24 4635 G 4793 175 -> 15 0 23 4635 G 4786 176 -> 16 0 23 4635 G 4787 176 -> 15 0 24 4635 G 4787 177 -> 16 0 24 4635 G 4793 177 -> 15 0 23 4635 G 4762 178 -> 16 0 23 4635 G 4763 178 -> 15 0 24 4635 G 4763 179 -> 16 0 24 4635 G 4793 179 -> 15 0 23 4635 G 4738 180 -> 16 0 23 4635 G 4739 180 -> 15 0 24 4635 G 4739 181 -> 16 0 24 4635 G 4793 181 -> 15 0 23 4635 G 4714 182 -> 16 0 23 4635 G 4715 182 -> 15 0 24 4635 G 4715 183 -> 16 0 24 4635 G 4793 183 -> 15 0 23 4635 G 4690 184 -> 16 0 23 4635 G 4691 184 -> 15 0 24 4635 G 4691 185 -> 16 0 24 4635 G 4793 185 -> 15 0 23 4635 G 4774 186 -> 16 0 23 4635 G 4775 186 -> 15 0 24 4635 G 4775 187 -> 16 0 24 4635 G 4793 187 -> 15 0 23 4635 G 4750 188 -> 16 0 23 4635 G 4751 188 -> 15 0 24 4635 G 4751 189 -> 16 0 24 4635 G 4793 189 -> 15 0 23 4635 G 4642 190 -> 16 0 23 4635 G 4643 190 -> 15 0 24 4635 G 4643 191 -> 16 0 24 4635 G 4793 191 -> 15 0 23 4635 G 4654 192 -> 16 0 23 4635 G 4655 192 -> 15 0 24 4635 G 4655 193 -> 16 0 24 4635 G 4793 193 -> 15 0 23 4635 G 4693 194 -> 16 0 23 4635 G 4694 194 -> 15 0 24 4635 G 4694 195 -> 16 0 24 4635 G 4793 195 -> 15 0 23 4635 G 4669 196 -> 16 0 23 4635 G 4670 196 -> 15 0 24 4635 G 4670 197 -> 16 0 24 4635 G 4793 197 -> 15 0 23 4635 G 4753 198 -> 16 0 23 4635 G 4754 198 -> 15 0 24 4635 G 4754 199 -> 16 0 24 4635 G 4793 199 -> 15 0 23 4635 G 4729 200 -> 16 0 23 4635 G 4730 200 -> 15 0 24 4635 G 4730 201 -> 16 0 24 4635 G 4793 201 -> 15 0 23 4635 G 4705 202 -> 16 0 23 4635 G 4706 202 -> 15 0 24 4635 G 4706 203 -> 16 0 24 4635 G 4793 203 -> 15 0 23 4635 G 4681 204 -> 16 0 23 4635 G 4682 204 -> 15 0 24 4635 G 4682 205 -> 16 0 24 4635 G 4793 205 -> 15 0 23 4635 G 4789 206 -> 16 0 23 4635 G 4790 206 -> 15 0 24 4635 G 4790 207 -> 16 0 24 4635 G 4793 207 -> 15 0 23 4635 G 4765 208 -> 16 0 23 4635 G 4766 208 -> 15 0 24 4635 G 4766 209 -> 16 0 24 4635 G 4793 209 -> 15 0 23 4635 G 4741 210 -> 16 0 23 4635 G 4742 210 -> 15 0 24 4635 G 4742 211 -> 16 0 24 4635 G 4793 211 -> 15 0 23 4635 G 4717 212 -> 16 0 23 4635 G 4718 212 -> 15 0 24 4635 G 4718 213 -> 16 0 24 4635 G 4793 213 -> 15 0 23 4635 G 4777 214 -> 16 0 23 4635 G 4778 214 -> 15 0 24 4635 G 4778 215 -> 16 0 24 4635 G 4793 215 -> 15 0 23 4635 G 4645 216 -> 16 0 23 4635 G 4646 216 -> 15 0 24 4635 G 4646 217 -> 16 0 24 4635 G 4793 217 -> 15 0 23 4635 G 4657 218 -> 16 0 23 4635 G 4658 218 -> 15 0 24 4635 G 4658 219 -> 16 0 24 4635 G 4793 219 -> 15 0 23 4635 G 4696 220 -> 16 0 23 4635 G 4697 220 -> 15 0 24 4635 G 4697 221 -> 16 0 24 4635 G 4793 221 -> 15 0 23 4635 G 4672 222 -> 16 0 23 4635 G 4673 222 -> 15 0 24 4635 G 4673 223 -> 16 0 24 4635 G 4793 223 -> 15 0 23 4635 G 4756 224 -> 16 0 23 4635 G 4757 224 -> 15 0 24 4635 G 4757 225 -> 16 0 24 4635 G 4793 225 -> 15 0 23 4635 G 4732 226 -> 16 0 23 4635 G 4733 226 -> 15 0 24 4635 G 4733 227 -> 16 0 24 4635 G 4793 227 -> 15 0 23 4635 G 4708 228 -> 16 0 23 4635 G 4709 228 -> 15 0 24 4635 G 4709 229 -> 16 0 24 4635 G 4793 229 -> 15 0 23 4635 G 4684 230 -> 16 0 23 4635 G 4685 230 -> 15 0 24 4635 G 4685 231 -> 16 0 24 4635 G 4793 231 -> 15 0 23 4635 G 4768 232 -> 16 0 23 4635 G 4769 232 -> 15 0 24 4635 G 4769 233 -> 16 0 24 4635 G 4793 233 -> 15 0 23 4635 G 4744 234 -> 16 0 23 4635 G 4745 234 -> 15 0 24 4635 G 4745 235 -> 16 0 24 4635 G 4793 235 -> 15 0 23 4635 G 4720 236 -> 16 0 23 4635 G 4721 236 -> 15 0 24 4635 G 4721 237 -> 16 0 24 4635 G 4793 237 -> 15 0 23 4635 G 4780 238 -> 16 0 23 4635 G 4781 238 -> 15 0 24 4635 G 4781 239 -> 16 0 24 4635 G 4793 239 -> 15 0 23 4635 G 4636 240 -> 16 0 23 4635 G 4637 240 -> 15 0 24 4635 G 4637 241 -> 16 0 24 4635 G 4793 241 -> 15 0 23 4391 G 4422 242 -> 16 0 23 4391 G 4423 242 -> 15 0 24 4391 G 4423 243 -> 16 0 24 4391 G 4633 243 -> 15 0 24 4391 G 4633 244 -> 16 0 24 4391 G 4460 244 -> 15 0 25 4391 G 4460 245 -> 16 0 25 4391 G 4458 245 -> 15 0 24 4391 G 4633 246 -> 16 0 24 4391 G 4544 246 -> 15 0 25 4391 G 4544 247 -> 16 0 25 4391 G 4542 247 -> 15 0 24 4391 G 4633 248 -> 16 0 24 4391 G 4496 248 -> 15 0 25 4391 G 4496 249 -> 16 0 25 4391 G 4494 249 -> 15 0 24 4391 G 4633 250 -> 16 0 24 4391 G 4580 250 -> 15 0 25 4391 G 4580 251 -> 16 0 25 4391 G 4578 251 -> 15 0 24 4391 G 4633 252 -> 16 0 24 4391 G 4448 252 -> 15 0 25 4391 G 4448 253 -> 16 0 25 4391 G 4446 253 -> 15 0 24 4391 G 4633 254 -> 16 0 24 4391 G 4532 254 -> 15 0 25 4391 G 4532 255 -> 16 0 25 4391 G 4530 255 -> 15 0 24 4391 G 4633 256 -> 16 0 24 4391 G 4616 256 -> 15 0 25 4391 G 4616 257 -> 16 0 25 4391 G 4614 257 -> 15 0 24 4391 G 4633 258 -> 16 0 24 4391 G 4568 258 -> 15 0 25 4391 G 4568 259 -> 16 0 25 4391 G 4566 259 -> 15 0 24 4391 G 4633 260 -> 16 0 24 4391 G 4415 260 -> 15 0 25 4391 G 4415 261 -> 16 0 25 4391 G 4413 261 -> 15 0 24 4391 G 4633 262 -> 16 0 24 4391 G 4451 262 -> 15 0 25 4391 G 4451 263 -> 16 0 25 4391 G 4449 263 -> 15 0 24 4391 G 4633 264 -> 16 0 24 4391 G 4487 264 -> 15 0 25 4391 G 4487 265 -> 16 0 25 4391 G 4485 265 -> 15 0 24 4391 G 4633 266 -> 16 0 24 4391 G 4571 266 -> 15 0 25 4391 G 4571 267 -> 16 0 25 4391 G 4569 267 -> 15 0 24 4391 G 4633 268 -> 16 0 24 4391 G 4439 268 -> 15 0 25 4391 G 4439 269 -> 16 0 25 4391 G 4437 269 -> 15 0 24 4391 G 4633 270 -> 16 0 24 4391 G 4523 270 -> 15 0 25 4391 G 4523 271 -> 16 0 25 4391 G 4521 271 -> 15 0 24 4391 G 4633 272 -> 16 0 24 4391 G 4607 272 -> 15 0 25 4391 G 4607 273 -> 16 0 25 4391 G 4605 273 -> 15 0 24 4391 G 4633 274 -> 16 0 24 4391 G 4475 274 -> 15 0 25 4391 G 4475 275 -> 16 0 25 4391 G 4473 275 -> 15 0 24 4391 G 4633 276 -> 16 0 24 4391 G 4559 276 -> 15 0 25 4391 G 4559 277 -> 16 0 25 4391 G 4557 277 -> 15 0 24 4391 G 4633 278 -> 16 0 24 4391 G 4595 278 -> 15 0 25 4391 G 4595 279 -> 16 0 25 4391 G 4593 279 -> 15 0 24 4391 G 4633 280 -> 16 0 24 4391 G 4406 280 -> 15 0 25 4391 G 4406 281 -> 16 0 25 4391 G 4404 281 -> 15 0 24 4391 G 4633 282 -> 16 0 24 4391 G 4430 282 -> 15 0 25 4391 G 4430 283 -> 16 0 25 4391 G 4428 283 -> 15 0 24 4391 G 4633 284 -> 16 0 24 4391 G 4514 284 -> 15 0 25 4391 G 4514 285 -> 16 0 25 4391 G 4512 285 -> 15 0 24 4391 G 4633 286 -> 16 0 24 4391 G 4466 286 -> 15 0 25 4391 G 4466 287 -> 16 0 25 4391 G 4464 287 -> 15 0 24 4391 G 4633 288 -> 16 0 24 4391 G 4550 288 -> 15 0 25 4391 G 4550 289 -> 16 0 25 4391 G 4548 289 -> 15 0 24 4391 G 4633 290 -> 16 0 24 4391 G 4502 290 -> 15 0 25 4391 G 4502 291 -> 16 0 25 4391 G 4500 291 -> 15 0 24 4391 G 4633 292 -> 16 0 24 4391 G 4586 292 -> 15 0 25 4391 G 4586 293 -> 16 0 25 4391 G 4584 293 -> 15 0 24 4391 G 4633 294 -> 16 0 24 4391 G 4538 294 -> 15 0 25 4391 G 4538 295 -> 16 0 25 4391 G 4536 295 -> 15 0 24 4391 G 4633 296 -> 16 0 24 4391 G 4622 296 -> 15 0 25 4391 G 4622 297 -> 16 0 25 4391 G 4620 297 -> 15 0 24 4391 G 4633 298 -> 16 0 24 4391 G 4397 298 -> 15 0 25 4391 G 4397 299 -> 16 0 25 4391 G 4395 299 -> 15 0 24 4391 G 4633 300 -> 16 0 24 4391 G 4421 300 -> 15 0 25 4391 G 4421 301 -> 16 0 25 4391 G 4419 301 -> 15 0 24 4391 G 4633 302 -> 16 0 24 4391 G 4457 302 -> 15 0 25 4391 G 4457 303 -> 16 0 25 4391 G 4455 303 -> 15 0 24 4391 G 4633 304 -> 16 0 24 4391 G 4541 304 -> 15 0 25 4391 G 4541 305 -> 16 0 25 4391 G 4539 305 -> 15 0 24 4391 G 4633 306 -> 16 0 24 4391 G 4493 306 -> 15 0 25 4391 G 4493 307 -> 16 0 25 4391 G 4491 307 -> 15 0 24 4391 G 4633 308 -> 16 0 24 4391 G 4577 308 -> 15 0 25 4391 G 4577 309 -> 16 0 25 4391 G 4575 309 -> 15 0 24 4391 G 4633 310 -> 16 0 24 4391 G 4445 310 -> 15 0 25 4391 G 4445 311 -> 16 0 25 4391 G 4443 311 -> 15 0 24 4391 G 4633 312 -> 16 0 24 4391 G 4529 312 -> 15 0 25 4391 G 4529 313 -> 16 0 25 4391 G 4527 313 -> 15 0 24 4391 G 4633 314 -> 16 0 24 4391 G 4613 314 -> 15 0 25 4391 G 4613 315 -> 16 0 25 4391 G 4611 315 -> 15 0 24 4391 G 4633 316 -> 16 0 24 4391 G 4565 316 -> 15 0 25 4391 G 4565 317 -> 16 0 25 4391 G 4563 317 -> 15 0 24 4391 G 4633 318 -> 16 0 24 4391 G 4412 318 -> 15 0 25 4391 G 4412 319 -> 16 0 25 4391 G 4410 319 -> 15 0 24 4391 G 4633 320 -> 16 0 24 4391 G 4484 320 -> 15 0 25 4391 G 4484 321 -> 16 0 25 4391 G 4482 321 -> 15 0 24 4391 G 4633 322 -> 16 0 24 4391 G 4436 322 -> 15 0 25 4391 G 4436 323 -> 16 0 25 4391 G 4434 323 -> 15 0 24 4391 G 4633 324 -> 16 0 24 4391 G 4520 324 -> 15 0 25 4391 G 4520 325 -> 16 0 25 4391 G 4518 325 -> 15 0 24 4391 G 4633 326 -> 16 0 24 4391 G 4604 326 -> 15 0 25 4391 G 4604 327 -> 16 0 25 4391 G 4602 327 -> 15 0 24 4391 G 4633 328 -> 16 0 24 4391 G 4472 328 -> 15 0 25 4391 G 4472 329 -> 16 0 25 4391 G 4470 329 -> 15 0 24 4391 G 4633 330 -> 16 0 24 4391 G 4556 330 -> 15 0 25 4391 G 4556 331 -> 16 0 25 4391 G 4554 331 -> 15 0 24 4391 G 4633 332 -> 16 0 24 4391 G 4508 332 -> 15 0 25 4391 G 4508 333 -> 16 0 25 4391 G 4506 333 -> 15 0 24 4391 G 4633 334 -> 16 0 24 4391 G 4592 334 -> 15 0 25 4391 G 4592 335 -> 16 0 25 4391 G 4590 335 -> 15 0 24 4391 G 4633 336 -> 16 0 24 4391 G 4628 336 -> 15 0 25 4391 G 4628 337 -> 16 0 25 4391 G 4626 337 -> 15 0 24 4391 G 4633 338 -> 16 0 24 4391 G 4403 338 -> 15 0 25 4391 G 4403 339 -> 16 0 25 4391 G 4401 339 -> 15 0 26 4391 G 4633 340 -> 16 0 26 4391 G 4632 340 -> 15 0 24 4391 G 4633 341 -> 16 0 24 4391 G 4427 341 -> 15 0 25 4391 G 4427 342 -> 16 0 25 4391 G 4425 342 -> 15 0 24 4391 G 4633 343 -> 16 0 24 4391 G 4511 343 -> 15 0 25 4391 G 4511 344 -> 16 0 25 4391 G 4509 344 -> 15 0 24 4391 G 4633 345 -> 16 0 24 4391 G 4463 345 -> 15 0 25 4391 G 4463 346 -> 16 0 25 4391 G 4461 346 -> 15 0 24 4391 G 4633 347 -> 16 0 24 4391 G 4547 347 -> 15 0 25 4391 G 4547 348 -> 16 0 25 4391 G 4545 348 -> 15 0 24 4391 G 4633 349 -> 16 0 24 4391 G 4631 349 -> 15 0 25 4391 G 4631 350 -> 16 0 25 4391 G 4629 350 -> 15 0 24 4391 G 4633 351 -> 16 0 24 4391 G 4499 351 -> 15 0 25 4391 G 4499 352 -> 16 0 25 4391 G 4497 352 -> 15 0 24 4391 G 4633 353 -> 16 0 24 4391 G 4583 353 -> 15 0 25 4391 G 4583 354 -> 16 0 25 4391 G 4581 354 -> 15 0 24 4391 G 4633 355 -> 16 0 24 4391 G 4535 355 -> 15 0 25 4391 G 4535 356 -> 16 0 25 4391 G 4533 356 -> 15 0 24 4391 G 4633 357 -> 16 0 24 4391 G 4619 357 -> 15 0 25 4391 G 4619 358 -> 16 0 25 4391 G 4617 358 -> 15 0 24 4391 G 4633 359 -> 16 0 24 4391 G 4394 359 -> 15 0 25 4391 G 4394 360 -> 16 0 25 4391 G 4392 360 -> 15 0 24 4391 G 4633 361 -> 16 0 24 4391 G 4418 361 -> 15 0 25 4391 G 4418 362 -> 16 0 25 4391 G 4416 362 -> 15 0 24 4391 G 4633 363 -> 16 0 24 4391 G 4454 363 -> 15 0 25 4391 G 4454 364 -> 16 0 25 4391 G 4452 364 -> 15 0 24 4391 G 4633 365 -> 16 0 24 4391 G 4490 365 -> 15 0 25 4391 G 4490 366 -> 16 0 25 4391 G 4488 366 -> 15 0 24 4391 G 4633 367 -> 16 0 24 4391 G 4574 367 -> 15 0 25 4391 G 4574 368 -> 16 0 25 4391 G 4572 368 -> 15 0 24 4391 G 4633 369 -> 16 0 24 4391 G 4442 369 -> 15 0 25 4391 G 4442 370 -> 16 0 25 4391 G 4440 370 -> 15 0 24 4391 G 4633 371 -> 16 0 24 4391 G 4526 371 -> 15 0 25 4391 G 4526 372 -> 16 0 25 4391 G 4524 372 -> 15 0 24 4391 G 4633 373 -> 16 0 24 4391 G 4610 373 -> 15 0 25 4391 G 4610 374 -> 16 0 25 4391 G 4608 374 -> 15 0 24 4391 G 4633 375 -> 16 0 24 4391 G 4478 375 -> 15 0 25 4391 G 4478 376 -> 16 0 25 4391 G 4476 376 -> 15 0 24 4391 G 4633 377 -> 16 0 24 4391 G 4562 377 -> 15 0 25 4391 G 4562 378 -> 16 0 25 4391 G 4560 378 -> 15 0 24 4391 G 4633 379 -> 16 0 24 4391 G 4598 379 -> 15 0 25 4391 G 4598 380 -> 16 0 25 4391 G 4596 380 -> 15 0 24 4391 G 4633 381 -> 16 0 24 4391 G 4409 381 -> 15 0 25 4391 G 4409 382 -> 16 0 25 4391 G 4407 382 -> 15 0 24 4391 G 4633 383 -> 16 0 24 4391 G 4481 383 -> 15 0 25 4391 G 4481 384 -> 16 0 25 4391 G 4479 384 -> 15 0 24 4391 G 4633 385 -> 16 0 24 4391 G 4433 385 -> 15 0 25 4391 G 4433 386 -> 16 0 25 4391 G 4431 386 -> 15 0 24 4391 G 4633 387 -> 16 0 24 4391 G 4517 387 -> 15 0 25 4391 G 4517 388 -> 16 0 25 4391 G 4515 388 -> 15 0 24 4391 G 4633 389 -> 16 0 24 4391 G 4601 389 -> 15 0 25 4391 G 4601 390 -> 16 0 25 4391 G 4599 390 -> 15 0 24 4391 G 4633 391 -> 16 0 24 4391 G 4469 391 -> 15 0 25 4391 G 4469 392 -> 16 0 25 4391 G 4467 392 -> 15 0 24 4391 G 4633 393 -> 16 0 24 4391 G 4553 393 -> 15 0 25 4391 G 4553 394 -> 16 0 25 4391 G 4551 394 -> 15 0 24 4391 G 4633 395 -> 16 0 24 4391 G 4505 395 -> 15 0 25 4391 G 4505 396 -> 16 0 25 4391 G 4503 396 -> 15 0 24 4391 G 4633 397 -> 16 0 24 4391 G 4589 397 -> 15 0 25 4391 G 4589 398 -> 16 0 25 4391 G 4587 398 -> 15 0 24 4391 G 4633 399 -> 16 0 24 4391 G 4625 399 -> 15 0 25 4391 G 4625 400 -> 16 0 25 4391 G 4623 400 -> 15 0 24 4391 G 4633 401 -> 16 0 24 4391 G 4400 401 -> 15 0 25 4391 G 4400 402 -> 16 0 25 4391 G 4398 402 -> 15 0 23 4391 G 4458 403 -> 16 0 23 4391 G 4459 403 -> 15 0 24 4391 G 4459 404 -> 16 0 24 4391 G 4633 404 -> 15 0 24 4391 G 4633 405 -> 16 0 24 4391 G 4424 405 -> 15 0 25 4391 G 4424 406 -> 16 0 25 4391 G 4422 406 -> 15 0 23 4391 G 4542 407 -> 16 0 23 4391 G 4543 407 -> 15 0 24 4391 G 4543 408 -> 16 0 24 4391 G 4633 408 -> 15 0 23 4391 G 4494 409 -> 16 0 23 4391 G 4495 409 -> 15 0 24 4391 G 4495 410 -> 16 0 24 4391 G 4633 410 -> 15 0 23 4391 G 4578 411 -> 16 0 23 4391 G 4579 411 -> 15 0 24 4391 G 4579 412 -> 16 0 24 4391 G 4633 412 -> 15 0 23 4391 G 4446 413 -> 16 0 23 4391 G 4447 413 -> 15 0 24 4391 G 4447 414 -> 16 0 24 4391 G 4633 414 -> 15 0 23 4391 G 4530 415 -> 16 0 23 4391 G 4531 415 -> 15 0 24 4391 G 4531 416 -> 16 0 24 4391 G 4633 416 -> 15 0 23 4391 G 4614 417 -> 16 0 23 4391 G 4615 417 -> 15 0 24 4391 G 4615 418 -> 16 0 24 4391 G 4633 418 -> 15 0 23 4391 G 4566 419 -> 16 0 23 4391 G 4567 419 -> 15 0 24 4391 G 4567 420 -> 16 0 24 4391 G 4633 420 -> 15 0 23 4391 G 4413 421 -> 16 0 23 4391 G 4414 421 -> 15 0 24 4391 G 4414 422 -> 16 0 24 4391 G 4633 422 -> 15 0 23 4391 G 4449 423 -> 16 0 23 4391 G 4450 423 -> 15 0 24 4391 G 4450 424 -> 16 0 24 4391 G 4633 424 -> 15 0 23 4391 G 4485 425 -> 16 0 23 4391 G 4486 425 -> 15 0 24 4391 G 4486 426 -> 16 0 24 4391 G 4633 426 -> 15 0 23 4391 G 4569 427 -> 16 0 23 4391 G 4570 427 -> 15 0 24 4391 G 4570 428 -> 16 0 24 4391 G 4633 428 -> 15 0 23 4391 G 4437 429 -> 16 0 23 4391 G 4438 429 -> 15 0 24 4391 G 4438 430 -> 16 0 24 4391 G 4633 430 -> 15 0 23 4391 G 4521 431 -> 16 0 23 4391 G 4522 431 -> 15 0 24 4391 G 4522 432 -> 16 0 24 4391 G 4633 432 -> 15 0 23 4391 G 4605 433 -> 16 0 23 4391 G 4606 433 -> 15 0 24 4391 G 4606 434 -> 16 0 24 4391 G 4633 434 -> 15 0 23 4391 G 4473 435 -> 16 0 23 4391 G 4474 435 -> 15 0 24 4391 G 4474 436 -> 16 0 24 4391 G 4633 436 -> 15 0 23 4391 G 4557 437 -> 16 0 23 4391 G 4558 437 -> 15 0 24 4391 G 4558 438 -> 16 0 24 4391 G 4633 438 -> 15 0 23 4391 G 4593 439 -> 16 0 23 4391 G 4594 439 -> 15 0 24 4391 G 4594 440 -> 16 0 24 4391 G 4633 440 -> 15 0 23 4391 G 4404 441 -> 16 0 23 4391 G 4405 441 -> 15 0 24 4391 G 4405 442 -> 16 0 24 4391 G 4633 442 -> 15 0 23 4391 G 4428 443 -> 16 0 23 4391 G 4429 443 -> 15 0 24 4391 G 4429 444 -> 16 0 24 4391 G 4633 444 -> 15 0 23 4391 G 4512 445 -> 16 0 23 4391 G 4513 445 -> 15 0 24 4391 G 4513 446 -> 16 0 24 4391 G 4633 446 -> 15 0 23 4391 G 4464 447 -> 16 0 23 4391 G 4465 447 -> 15 0 24 4391 G 4465 448 -> 16 0 24 4391 G 4633 448 -> 15 0 23 4391 G 4548 449 -> 16 0 23 4391 G 4549 449 -> 15 0 24 4391 G 4549 450 -> 16 0 24 4391 G 4633 450 -> 15 0 23 4391 G 4500 451 -> 16 0 23 4391 G 4501 451 -> 15 0 24 4391 G 4501 452 -> 16 0 24 4391 G 4633 452 -> 15 0 23 4391 G 4584 453 -> 16 0 23 4391 G 4585 453 -> 15 0 24 4391 G 4585 454 -> 16 0 24 4391 G 4633 454 -> 15 0 23 4391 G 4536 455 -> 16 0 23 4391 G 4537 455 -> 15 0 24 4391 G 4537 456 -> 16 0 24 4391 G 4633 456 -> 15 0 23 4391 G 4620 457 -> 16 0 23 4391 G 4621 457 -> 15 0 24 4391 G 4621 458 -> 16 0 24 4391 G 4633 458 -> 15 0 23 4391 G 4395 459 -> 16 0 23 4391 G 4396 459 -> 15 0 24 4391 G 4396 460 -> 16 0 24 4391 G 4633 460 -> 15 0 23 4391 G 4419 461 -> 16 0 23 4391 G 4420 461 -> 15 0 24 4391 G 4420 462 -> 16 0 24 4391 G 4633 462 -> 15 0 23 4391 G 4455 463 -> 16 0 23 4391 G 4456 463 -> 15 0 24 4391 G 4456 464 -> 16 0 24 4391 G 4633 464 -> 15 0 23 4391 G 4539 465 -> 16 0 23 4391 G 4540 465 -> 15 0 24 4391 G 4540 466 -> 16 0 24 4391 G 4633 466 -> 15 0 23 4391 G 4491 467 -> 16 0 23 4391 G 4492 467 -> 15 0 24 4391 G 4492 468 -> 16 0 24 4391 G 4633 468 -> 15 0 23 4391 G 4575 469 -> 16 0 23 4391 G 4576 469 -> 15 0 24 4391 G 4576 470 -> 16 0 24 4391 G 4633 470 -> 15 0 23 4391 G 4443 471 -> 16 0 23 4391 G 4444 471 -> 15 0 24 4391 G 4444 472 -> 16 0 24 4391 G 4633 472 -> 15 0 23 4391 G 4527 473 -> 16 0 23 4391 G 4528 473 -> 15 0 24 4391 G 4528 474 -> 16 0 24 4391 G 4633 474 -> 15 0 23 4391 G 4611 475 -> 16 0 23 4391 G 4612 475 -> 15 0 24 4391 G 4612 476 -> 16 0 24 4391 G 4633 476 -> 15 0 23 4391 G 4563 477 -> 16 0 23 4391 G 4564 477 -> 15 0 24 4391 G 4564 478 -> 16 0 24 4391 G 4633 478 -> 15 0 23 4391 G 4410 479 -> 16 0 23 4391 G 4411 479 -> 15 0 24 4391 G 4411 480 -> 16 0 24 4391 G 4633 480 -> 15 0 23 4391 G 4482 481 -> 16 0 23 4391 G 4483 481 -> 15 0 24 4391 G 4483 482 -> 16 0 24 4391 G 4633 482 -> 15 0 23 4391 G 4434 483 -> 16 0 23 4391 G 4435 483 -> 15 0 24 4391 G 4435 484 -> 16 0 24 4391 G 4633 484 -> 15 0 23 4391 G 4518 485 -> 16 0 23 4391 G 4519 485 -> 15 0 24 4391 G 4519 486 -> 16 0 24 4391 G 4633 486 -> 15 0 23 4391 G 4602 487 -> 16 0 23 4391 G 4603 487 -> 15 0 24 4391 G 4603 488 -> 16 0 24 4391 G 4633 488 -> 15 0 23 4391 G 4470 489 -> 16 0 23 4391 G 4471 489 -> 15 0 24 4391 G 4471 490 -> 16 0 24 4391 G 4633 490 -> 15 0 23 4391 G 4554 491 -> 16 0 23 4391 G 4555 491 -> 15 0 24 4391 G 4555 492 -> 16 0 24 4391 G 4633 492 -> 15 0 23 4391 G 4506 493 -> 16 0 23 4391 G 4507 493 -> 15 0 24 4391 G 4507 494 -> 16 0 24 4391 G 4633 494 -> 15 0 23 4391 G 4590 495 -> 16 0 23 4391 G 4591 495 -> 15 0 24 4391 G 4591 496 -> 16 0 24 4391 G 4633 496 -> 15 0 23 4391 G 4626 497 -> 16 0 23 4391 G 4627 497 -> 15 0 24 4391 G 4627 498 -> 16 0 24 4391 G 4633 498 -> 15 0 23 4391 G 4401 499 -> 16 0 23 4391 G 4402 499 -> 15 0 24 4391 G 4402 500 -> 16 0 24 4391 G 4633 500 -> 15 0 23 4391 G 4425 501 -> 16 0 23 4391 G 4426 501 -> 15 0 24 4391 G 4426 502 -> 16 0 24 4391 G 4633 502 -> 15 0 23 4391 G 4509 503 -> 16 0 23 4391 G 4510 503 -> 15 0 24 4391 G 4510 504 -> 16 0 24 4391 G 4633 504 -> 15 0 23 4391 G 4461 505 -> 16 0 23 4391 G 4462 505 -> 15 0 24 4391 G 4462 506 -> 16 0 24 4391 G 4633 506 -> 15 0 23 4391 G 4545 507 -> 16 0 23 4391 G 4546 507 -> 15 0 24 4391 G 4546 508 -> 16 0 24 4391 G 4633 508 -> 15 0 23 4391 G 4629 509 -> 16 0 23 4391 G 4630 509 -> 15 0 24 4391 G 4630 510 -> 16 0 24 4391 G 4633 510 -> 15 0 23 4391 G 4497 511 -> 16 0 23 4391 G 4498 511 -> 15 0 24 4391 G 4498 512 -> 16 0 24 4391 G 4633 512 -> 15 0 23 4391 G 4581 513 -> 16 0 23 4391 G 4582 513 -> 15 0 24 4391 G 4582 514 -> 16 0 24 4391 G 4633 514 -> 15 0 23 4391 G 4533 515 -> 16 0 23 4391 G 4534 515 -> 15 0 24 4391 G 4534 516 -> 16 0 24 4391 G 4633 516 -> 15 0 23 4391 G 4617 517 -> 16 0 23 4391 G 4618 517 -> 15 0 24 4391 G 4618 518 -> 16 0 24 4391 G 4633 518 -> 15 0 23 4391 G 4392 519 -> 16 0 23 4391 G 4393 519 -> 15 0 24 4391 G 4393 520 -> 16 0 24 4391 G 4633 520 -> 15 0 23 4391 G 4416 521 -> 16 0 23 4391 G 4417 521 -> 15 0 24 4391 G 4417 522 -> 16 0 24 4391 G 4633 522 -> 15 0 23 4391 G 4452 523 -> 16 0 23 4391 G 4453 523 -> 15 0 24 4391 G 4453 524 -> 16 0 24 4391 G 4633 524 -> 15 0 23 4391 G 4488 525 -> 16 0 23 4391 G 4489 525 -> 15 0 24 4391 G 4489 526 -> 16 0 24 4391 G 4633 526 -> 15 0 23 4391 G 4572 527 -> 16 0 23 4391 G 4573 527 -> 15 0 24 4391 G 4573 528 -> 16 0 24 4391 G 4633 528 -> 15 0 23 4391 G 4440 529 -> 16 0 23 4391 G 4441 529 -> 15 0 24 4391 G 4441 530 -> 16 0 24 4391 G 4633 530 -> 15 0 23 4391 G 4524 531 -> 16 0 23 4391 G 4525 531 -> 15 0 24 4391 G 4525 532 -> 16 0 24 4391 G 4633 532 -> 15 0 23 4391 G 4608 533 -> 16 0 23 4391 G 4609 533 -> 15 0 24 4391 G 4609 534 -> 16 0 24 4391 G 4633 534 -> 15 0 23 4391 G 4476 535 -> 16 0 23 4391 G 4477 535 -> 15 0 24 4391 G 4477 536 -> 16 0 24 4391 G 4633 536 -> 15 0 23 4391 G 4560 537 -> 16 0 23 4391 G 4561 537 -> 15 0 24 4391 G 4561 538 -> 16 0 24 4391 G 4633 538 -> 15 0 23 4391 G 4596 539 -> 16 0 23 4391 G 4597 539 -> 15 0 24 4391 G 4597 540 -> 16 0 24 4391 G 4633 540 -> 15 0 23 4391 G 4407 541 -> 16 0 23 4391 G 4408 541 -> 15 0 24 4391 G 4408 542 -> 16 0 24 4391 G 4633 542 -> 15 0 23 4391 G 4479 543 -> 16 0 23 4391 G 4480 543 -> 15 0 24 4391 G 4480 544 -> 16 0 24 4391 G 4633 544 -> 15 0 23 4391 G 4431 545 -> 16 0 23 4391 G 4432 545 -> 15 0 24 4391 G 4432 546 -> 16 0 24 4391 G 4633 546 -> 15 0 23 4391 G 4515 547 -> 16 0 23 4391 G 4516 547 -> 15 0 24 4391 G 4516 548 -> 16 0 24 4391 G 4633 548 -> 15 0 23 4391 G 4599 549 -> 16 0 23 4391 G 4600 549 -> 15 0 24 4391 G 4600 550 -> 16 0 24 4391 G 4633 550 -> 15 0 23 4391 G 4467 551 -> 16 0 23 4391 G 4468 551 -> 15 0 24 4391 G 4468 552 -> 16 0 24 4391 G 4633 552 -> 15 0 23 4391 G 4551 553 -> 16 0 23 4391 G 4552 553 -> 15 0 24 4391 G 4552 554 -> 16 0 24 4391 G 4633 554 -> 15 0 23 4391 G 4503 555 -> 16 0 23 4391 G 4504 555 -> 15 0 24 4391 G 4504 556 -> 16 0 24 4391 G 4633 556 -> 15 0 23 4391 G 4587 557 -> 16 0 23 4391 G 4588 557 -> 15 0 24 4391 G 4588 558 -> 16 0 24 4391 G 4633 558 -> 15 0 23 4391 G 4623 559 -> 16 0 23 4391 G 4624 559 -> 15 0 24 4391 G 4624 560 -> 16 0 24 4391 G 4633 560 -> 15 0 23 4391 G 4398 561 -> 16 0 23 4391 G 4399 561 -> 15 0 24 4391 G 4399 562 -> 16 0 24 4391 G 4633 562 -> 15 0 27 4390 G 4792 563 -> 16 0 27 4390 G 4794 563 -> 15 0 28 4390 G 4794 564 -> 16 0 28 4390 G 4796 564 -> 15 0 21 4390 G 4794 565 -> 16 0 21 4390 G 4634 565 -> 15 0 28 4390 G 4634 566 -> 16 0 28 4390 G 4632 566 -> 15 0 27 4390 G 4796 567 -> 16 0 27 4390 G 4634 567 -> 15 0 23 3794 G 3801 568 -> 16 0 23 3794 G 3802 568 -> 15 0 24 3794 G 3802 569 -> 16 0 24 3794 G 3916 569 -> 15 0 26 3794 G 3916 570 -> 16 0 26 3794 G 3915 570 -> 15 0 24 3794 G 3916 571 -> 16 0 24 3794 G 3815 571 -> 15 0 25 3794 G 3815 572 -> 16 0 25 3794 G 3813 572 -> 15 0 24 3794 G 3916 573 -> 16 0 24 3794 G 3827 573 -> 15 0 25 3794 G 3827 574 -> 16 0 25 3794 G 3825 574 -> 15 0 24 3794 G 3916 575 -> 16 0 24 3794 G 3857 575 -> 15 0 25 3794 G 3857 576 -> 16 0 25 3794 G 3855 576 -> 15 0 24 3794 G 3916 577 -> 16 0 24 3794 G 3887 577 -> 15 0 25 3794 G 3887 578 -> 16 0 25 3794 G 3885 578 -> 15 0 24 3794 G 3916 579 -> 16 0 24 3794 G 3839 579 -> 15 0 25 3794 G 3839 580 -> 16 0 25 3794 G 3837 580 -> 15 0 24 3794 G 3916 581 -> 16 0 24 3794 G 3869 581 -> 15 0 25 3794 G 3869 582 -> 16 0 25 3794 G 3867 582 -> 15 0 24 3794 G 3916 583 -> 16 0 24 3794 G 3899 583 -> 15 0 25 3794 G 3899 584 -> 16 0 25 3794 G 3897 584 -> 15 0 24 3794 G 3916 585 -> 16 0 24 3794 G 3851 585 -> 15 0 25 3794 G 3851 586 -> 16 0 25 3794 G 3849 586 -> 15 0 24 3794 G 3916 587 -> 16 0 24 3794 G 3881 587 -> 15 0 25 3794 G 3881 588 -> 16 0 25 3794 G 3879 588 -> 15 0 24 3794 G 3916 589 -> 16 0 24 3794 G 3911 589 -> 15 0 25 3794 G 3911 590 -> 16 0 25 3794 G 3909 590 -> 15 0 24 3794 G 3916 591 -> 16 0 24 3794 G 3800 591 -> 15 0 25 3794 G 3800 592 -> 16 0 25 3794 G 3798 592 -> 15 0 24 3794 G 3916 593 -> 16 0 24 3794 G 3812 593 -> 15 0 25 3794 G 3812 594 -> 16 0 25 3794 G 3810 594 -> 15 0 24 3794 G 3916 595 -> 16 0 24 3794 G 3824 595 -> 15 0 25 3794 G 3824 596 -> 16 0 25 3794 G 3822 596 -> 15 0 24 3794 G 3916 597 -> 16 0 24 3794 G 3854 597 -> 15 0 25 3794 G 3854 598 -> 16 0 25 3794 G 3852 598 -> 15 0 24 3794 G 3916 599 -> 16 0 24 3794 G 3884 599 -> 15 0 25 3794 G 3884 600 -> 16 0 25 3794 G 3882 600 -> 15 0 24 3794 G 3916 601 -> 16 0 24 3794 G 3914 601 -> 15 0 25 3794 G 3914 602 -> 16 0 25 3794 G 3912 602 -> 15 0 24 3794 G 3916 603 -> 16 0 24 3794 G 3836 603 -> 15 0 25 3794 G 3836 604 -> 16 0 25 3794 G 3834 604 -> 15 0 24 3794 G 3916 605 -> 16 0 24 3794 G 3866 605 -> 15 0 25 3794 G 3866 606 -> 16 0 25 3794 G 3864 606 -> 15 0 24 3794 G 3916 607 -> 16 0 24 3794 G 3896 607 -> 15 0 25 3794 G 3896 608 -> 16 0 25 3794 G 3894 608 -> 15 0 24 3794 G 3916 609 -> 16 0 24 3794 G 3848 609 -> 15 0 25 3794 G 3848 610 -> 16 0 25 3794 G 3846 610 -> 15 0 24 3794 G 3916 611 -> 16 0 24 3794 G 3878 611 -> 15 0 25 3794 G 3878 612 -> 16 0 25 3794 G 3876 612 -> 15 0 24 3794 G 3916 613 -> 16 0 24 3794 G 3908 613 -> 15 0 25 3794 G 3908 614 -> 16 0 25 3794 G 3906 614 -> 15 0 24 3794 G 3916 615 -> 16 0 24 3794 G 3797 615 -> 15 0 25 3794 G 3797 616 -> 16 0 25 3794 G 3795 616 -> 15 0 24 3794 G 3916 617 -> 16 0 24 3794 G 3809 617 -> 15 0 25 3794 G 3809 618 -> 16 0 25 3794 G 3807 618 -> 15 0 24 3794 G 3916 619 -> 16 0 24 3794 G 3821 619 -> 15 0 25 3794 G 3821 620 -> 16 0 25 3794 G 3819 620 -> 15 0 24 3794 G 3916 621 -> 16 0 24 3794 G 3833 621 -> 15 0 25 3794 G 3833 622 -> 16 0 25 3794 G 3831 622 -> 15 0 24 3794 G 3916 623 -> 16 0 24 3794 G 3863 623 -> 15 0 25 3794 G 3863 624 -> 16 0 25 3794 G 3861 624 -> 15 0 24 3794 G 3916 625 -> 16 0 24 3794 G 3893 625 -> 15 0 25 3794 G 3893 626 -> 16 0 25 3794 G 3891 626 -> 15 0 24 3794 G 3916 627 -> 16 0 24 3794 G 3845 627 -> 15 0 25 3794 G 3845 628 -> 16 0 25 3794 G 3843 628 -> 15 0 24 3794 G 3916 629 -> 16 0 24 3794 G 3875 629 -> 15 0 25 3794 G 3875 630 -> 16 0 25 3794 G 3873 630 -> 15 0 24 3794 G 3916 631 -> 16 0 24 3794 G 3905 631 -> 15 0 25 3794 G 3905 632 -> 16 0 25 3794 G 3903 632 -> 15 0 24 3794 G 3916 633 -> 16 0 24 3794 G 3806 633 -> 15 0 25 3794 G 3806 634 -> 16 0 25 3794 G 3804 634 -> 15 0 24 3794 G 3916 635 -> 16 0 24 3794 G 3818 635 -> 15 0 25 3794 G 3818 636 -> 16 0 25 3794 G 3816 636 -> 15 0 24 3794 G 3916 637 -> 16 0 24 3794 G 3830 637 -> 15 0 25 3794 G 3830 638 -> 16 0 25 3794 G 3828 638 -> 15 0 24 3794 G 3916 639 -> 16 0 24 3794 G 3860 639 -> 15 0 25 3794 G 3860 640 -> 16 0 25 3794 G 3858 640 -> 15 0 24 3794 G 3916 641 -> 16 0 24 3794 G 3890 641 -> 15 0 25 3794 G 3890 642 -> 16 0 25 3794 G 3888 642 -> 15 0 24 3794 G 3916 643 -> 16 0 24 3794 G 3842 643 -> 15 0 25 3794 G 3842 644 -> 16 0 25 3794 G 3840 644 -> 15 0 24 3794 G 3916 645 -> 16 0 24 3794 G 3872 645 -> 15 0 25 3794 G 3872 646 -> 16 0 25 3794 G 3870 646 -> 15 0 24 3794 G 3916 647 -> 16 0 24 3794 G 3902 647 -> 15 0 25 3794 G 3902 648 -> 16 0 25 3794 G 3900 648 -> 15 0 24 3794 G 3916 649 -> 16 0 24 3794 G 3803 649 -> 15 0 25 3794 G 3803 650 -> 16 0 25 3794 G 3801 650 -> 15 0 23 3794 G 3813 651 -> 16 0 23 3794 G 3814 651 -> 15 0 24 3794 G 3814 652 -> 16 0 24 3794 G 3916 652 -> 15 0 23 3794 G 3825 653 -> 16 0 23 3794 G 3826 653 -> 15 0 24 3794 G 3826 654 -> 16 0 24 3794 G 3916 654 -> 15 0 23 3794 G 3855 655 -> 16 0 23 3794 G 3856 655 -> 15 0 24 3794 G 3856 656 -> 16 0 24 3794 G 3916 656 -> 15 0 23 3794 G 3885 657 -> 16 0 23 3794 G 3886 657 -> 15 0 24 3794 G 3886 658 -> 16 0 24 3794 G 3916 658 -> 15 0 23 3794 G 3837 659 -> 16 0 23 3794 G 3838 659 -> 15 0 24 3794 G 3838 660 -> 16 0 24 3794 G 3916 660 -> 15 0 23 3794 G 3867 661 -> 16 0 23 3794 G 3868 661 -> 15 0 24 3794 G 3868 662 -> 16 0 24 3794 G 3916 662 -> 15 0 23 3794 G 3897 663 -> 16 0 23 3794 G 3898 663 -> 15 0 24 3794 G 3898 664 -> 16 0 24 3794 G 3916 664 -> 15 0 23 3794 G 3849 665 -> 16 0 23 3794 G 3850 665 -> 15 0 24 3794 G 3850 666 -> 16 0 24 3794 G 3916 666 -> 15 0 23 3794 G 3879 667 -> 16 0 23 3794 G 3880 667 -> 15 0 24 3794 G 3880 668 -> 16 0 24 3794 G 3916 668 -> 15 0 23 3794 G 3909 669 -> 16 0 23 3794 G 3910 669 -> 15 0 24 3794 G 3910 670 -> 16 0 24 3794 G 3916 670 -> 15 0 23 3794 G 3798 671 -> 16 0 23 3794 G 3799 671 -> 15 0 24 3794 G 3799 672 -> 16 0 24 3794 G 3916 672 -> 15 0 23 3794 G 3810 673 -> 16 0 23 3794 G 3811 673 -> 15 0 24 3794 G 3811 674 -> 16 0 24 3794 G 3916 674 -> 15 0 23 3794 G 3822 675 -> 16 0 23 3794 G 3823 675 -> 15 0 24 3794 G 3823 676 -> 16 0 24 3794 G 3916 676 -> 15 0 23 3794 G 3852 677 -> 16 0 23 3794 G 3853 677 -> 15 0 24 3794 G 3853 678 -> 16 0 24 3794 G 3916 678 -> 15 0 23 3794 G 3882 679 -> 16 0 23 3794 G 3883 679 -> 15 0 24 3794 G 3883 680 -> 16 0 24 3794 G 3916 680 -> 15 0 23 3794 G 3912 681 -> 16 0 23 3794 G 3913 681 -> 15 0 24 3794 G 3913 682 -> 16 0 24 3794 G 3916 682 -> 15 0 23 3794 G 3834 683 -> 16 0 23 3794 G 3835 683 -> 15 0 24 3794 G 3835 684 -> 16 0 24 3794 G 3916 684 -> 15 0 23 3794 G 3864 685 -> 16 0 23 3794 G 3865 685 -> 15 0 24 3794 G 3865 686 -> 16 0 24 3794 G 3916 686 -> 15 0 23 3794 G 3894 687 -> 16 0 23 3794 G 3895 687 -> 15 0 24 3794 G 3895 688 -> 16 0 24 3794 G 3916 688 -> 15 0 23 3794 G 3846 689 -> 16 0 23 3794 G 3847 689 -> 15 0 24 3794 G 3847 690 -> 16 0 24 3794 G 3916 690 -> 15 0 23 3794 G 3876 691 -> 16 0 23 3794 G 3877 691 -> 15 0 24 3794 G 3877 692 -> 16 0 24 3794 G 3916 692 -> 15 0 23 3794 G 3906 693 -> 16 0 23 3794 G 3907 693 -> 15 0 24 3794 G 3907 694 -> 16 0 24 3794 G 3916 694 -> 15 0 23 3794 G 3795 695 -> 16 0 23 3794 G 3796 695 -> 15 0 24 3794 G 3796 696 -> 16 0 24 3794 G 3916 696 -> 15 0 23 3794 G 3807 697 -> 16 0 23 3794 G 3808 697 -> 15 0 24 3794 G 3808 698 -> 16 0 24 3794 G 3916 698 -> 15 0 23 3794 G 3819 699 -> 16 0 23 3794 G 3820 699 -> 15 0 24 3794 G 3820 700 -> 16 0 24 3794 G 3916 700 -> 15 0 23 3794 G 3831 701 -> 16 0 23 3794 G 3832 701 -> 15 0 24 3794 G 3832 702 -> 16 0 24 3794 G 3916 702 -> 15 0 23 3794 G 3861 703 -> 16 0 23 3794 G 3862 703 -> 15 0 24 3794 G 3862 704 -> 16 0 24 3794 G 3916 704 -> 15 0 23 3794 G 3891 705 -> 16 0 23 3794 G 3892 705 -> 15 0 24 3794 G 3892 706 -> 16 0 24 3794 G 3916 706 -> 15 0 23 3794 G 3843 707 -> 16 0 23 3794 G 3844 707 -> 15 0 24 3794 G 3844 708 -> 16 0 24 3794 G 3916 708 -> 15 0 23 3794 G 3873 709 -> 16 0 23 3794 G 3874 709 -> 15 0 24 3794 G 3874 710 -> 16 0 24 3794 G 3916 710 -> 15 0 23 3794 G 3903 711 -> 16 0 23 3794 G 3904 711 -> 15 0 24 3794 G 3904 712 -> 16 0 24 3794 G 3916 712 -> 15 0 23 3794 G 3804 713 -> 16 0 23 3794 G 3805 713 -> 15 0 24 3794 G 3805 714 -> 16 0 24 3794 G 3916 714 -> 15 0 23 3794 G 3816 715 -> 16 0 23 3794 G 3817 715 -> 15 0 24 3794 G 3817 716 -> 16 0 24 3794 G 3916 716 -> 15 0 23 3794 G 3828 717 -> 16 0 23 3794 G 3829 717 -> 15 0 24 3794 G 3829 718 -> 16 0 24 3794 G 3916 718 -> 15 0 23 3794 G 3858 719 -> 16 0 23 3794 G 3859 719 -> 15 0 24 3794 G 3859 720 -> 16 0 24 3794 G 3916 720 -> 15 0 23 3794 G 3888 721 -> 16 0 23 3794 G 3889 721 -> 15 0 24 3794 G 3889 722 -> 16 0 24 3794 G 3916 722 -> 15 0 23 3794 G 3840 723 -> 16 0 23 3794 G 3841 723 -> 15 0 24 3794 G 3841 724 -> 16 0 24 3794 G 3916 724 -> 15 0 23 3794 G 3870 725 -> 16 0 23 3794 G 3871 725 -> 15 0 24 3794 G 3871 726 -> 16 0 24 3794 G 3916 726 -> 15 0 23 3794 G 3900 727 -> 16 0 23 3794 G 3901 727 -> 15 0 24 3794 G 3901 728 -> 16 0 24 3794 G 3916 728 -> 15 0 23 3416 G 3462 729 -> 16 0 23 3416 G 3463 729 -> 15 0 24 3416 G 3463 730 -> 16 0 24 3416 G 3610 730 -> 15 0 24 3416 G 3610 731 -> 16 0 24 3416 G 3572 731 -> 15 0 25 3416 G 3572 732 -> 16 0 25 3416 G 3570 732 -> 15 0 24 3416 G 3610 733 -> 16 0 24 3416 G 3494 733 -> 15 0 25 3416 G 3494 734 -> 16 0 25 3416 G 3492 734 -> 15 0 24 3416 G 3610 735 -> 16 0 24 3416 G 3602 735 -> 15 0 25 3416 G 3602 736 -> 16 0 25 3416 G 3600 736 -> 15 0 24 3416 G 3610 737 -> 16 0 24 3416 G 3524 737 -> 15 0 25 3416 G 3524 738 -> 16 0 25 3416 G 3522 738 -> 15 0 24 3416 G 3610 739 -> 16 0 24 3416 G 3554 739 -> 15 0 25 3416 G 3554 740 -> 16 0 25 3416 G 3552 740 -> 15 0 24 3416 G 3610 741 -> 16 0 24 3416 G 3584 741 -> 15 0 25 3416 G 3584 742 -> 16 0 25 3416 G 3582 742 -> 15 0 24 3416 G 3610 743 -> 16 0 24 3416 G 3425 743 -> 15 0 25 3416 G 3425 744 -> 16 0 25 3416 G 3423 744 -> 15 0 24 3416 G 3610 745 -> 16 0 24 3416 G 3437 745 -> 15 0 25 3416 G 3437 746 -> 16 0 25 3416 G 3435 746 -> 15 0 24 3416 G 3610 747 -> 16 0 24 3416 G 3449 747 -> 15 0 25 3416 G 3449 748 -> 16 0 25 3416 G 3447 748 -> 15 0 24 3416 G 3610 749 -> 16 0 24 3416 G 3479 749 -> 15 0 25 3416 G 3479 750 -> 16 0 25 3416 G 3477 750 -> 15 0 24 3416 G 3610 751 -> 16 0 24 3416 G 3509 751 -> 15 0 25 3416 G 3509 752 -> 16 0 25 3416 G 3507 752 -> 15 0 24 3416 G 3610 753 -> 16 0 24 3416 G 3539 753 -> 15 0 25 3416 G 3539 754 -> 16 0 25 3416 G 3537 754 -> 15 0 24 3416 G 3610 755 -> 16 0 24 3416 G 3461 755 -> 15 0 25 3416 G 3461 756 -> 16 0 25 3416 G 3459 756 -> 15 0 24 3416 G 3610 757 -> 16 0 24 3416 G 3569 757 -> 15 0 25 3416 G 3569 758 -> 16 0 25 3416 G 3567 758 -> 15 0 24 3416 G 3610 759 -> 16 0 24 3416 G 3491 759 -> 15 0 25 3416 G 3491 760 -> 16 0 25 3416 G 3489 760 -> 15 0 24 3416 G 3610 761 -> 16 0 24 3416 G 3599 761 -> 15 0 25 3416 G 3599 762 -> 16 0 25 3416 G 3597 762 -> 15 0 24 3416 G 3610 763 -> 16 0 24 3416 G 3521 763 -> 15 0 25 3416 G 3521 764 -> 16 0 25 3416 G 3519 764 -> 15 0 24 3416 G 3610 765 -> 16 0 24 3416 G 3551 765 -> 15 0 25 3416 G 3551 766 -> 16 0 25 3416 G 3549 766 -> 15 0 24 3416 G 3610 767 -> 16 0 24 3416 G 3473 767 -> 15 0 25 3416 G 3473 768 -> 16 0 25 3416 G 3471 768 -> 15 0 24 3416 G 3610 769 -> 16 0 24 3416 G 3581 769 -> 15 0 25 3416 G 3581 770 -> 16 0 25 3416 G 3579 770 -> 15 0 24 3416 G 3610 771 -> 16 0 24 3416 G 3503 771 -> 15 0 25 3416 G 3503 772 -> 16 0 25 3416 G 3501 772 -> 15 0 24 3416 G 3610 773 -> 16 0 24 3416 G 3533 773 -> 15 0 25 3416 G 3533 774 -> 16 0 25 3416 G 3531 774 -> 15 0 24 3416 G 3610 775 -> 16 0 24 3416 G 3563 775 -> 15 0 25 3416 G 3563 776 -> 16 0 25 3416 G 3561 776 -> 15 0 24 3416 G 3610 777 -> 16 0 24 3416 G 3593 777 -> 15 0 25 3416 G 3593 778 -> 16 0 25 3416 G 3591 778 -> 15 0 24 3416 G 3610 779 -> 16 0 24 3416 G 3422 779 -> 15 0 25 3416 G 3422 780 -> 16 0 25 3416 G 3420 780 -> 15 0 24 3416 G 3610 781 -> 16 0 24 3416 G 3434 781 -> 15 0 25 3416 G 3434 782 -> 16 0 25 3416 G 3432 782 -> 15 0 24 3416 G 3610 783 -> 16 0 24 3416 G 3446 783 -> 15 0 25 3416 G 3446 784 -> 16 0 25 3416 G 3444 784 -> 15 0 24 3416 G 3610 785 -> 16 0 24 3416 G 3476 785 -> 15 0 25 3416 G 3476 786 -> 16 0 25 3416 G 3474 786 -> 15 0 26 3416 G 3610 787 -> 16 0 26 3416 G 3609 787 -> 15 0 24 3416 G 3610 788 -> 16 0 24 3416 G 3506 788 -> 15 0 25 3416 G 3506 789 -> 16 0 25 3416 G 3504 789 -> 15 0 24 3416 G 3610 790 -> 16 0 24 3416 G 3536 790 -> 15 0 25 3416 G 3536 791 -> 16 0 25 3416 G 3534 791 -> 15 0 24 3416 G 3610 792 -> 16 0 24 3416 G 3458 792 -> 15 0 25 3416 G 3458 793 -> 16 0 25 3416 G 3456 793 -> 15 0 24 3416 G 3610 794 -> 16 0 24 3416 G 3566 794 -> 15 0 25 3416 G 3566 795 -> 16 0 25 3416 G 3564 795 -> 15 0 24 3416 G 3610 796 -> 16 0 24 3416 G 3488 796 -> 15 0 25 3416 G 3488 797 -> 16 0 25 3416 G 3486 797 -> 15 0 24 3416 G 3610 798 -> 16 0 24 3416 G 3596 798 -> 15 0 25 3416 G 3596 799 -> 16 0 25 3416 G 3594 799 -> 15 0 24 3416 G 3610 800 -> 16 0 24 3416 G 3518 800 -> 15 0 25 3416 G 3518 801 -> 16 0 25 3416 G 3516 801 -> 15 0 24 3416 G 3610 802 -> 16 0 24 3416 G 3548 802 -> 15 0 25 3416 G 3548 803 -> 16 0 25 3416 G 3546 803 -> 15 0 24 3416 G 3610 804 -> 16 0 24 3416 G 3470 804 -> 15 0 25 3416 G 3470 805 -> 16 0 25 3416 G 3468 805 -> 15 0 24 3416 G 3610 806 -> 16 0 24 3416 G 3578 806 -> 15 0 25 3416 G 3578 807 -> 16 0 25 3416 G 3576 807 -> 15 0 24 3416 G 3610 808 -> 16 0 24 3416 G 3500 808 -> 15 0 25 3416 G 3500 809 -> 16 0 25 3416 G 3498 809 -> 15 0 24 3416 G 3610 810 -> 16 0 24 3416 G 3608 810 -> 15 0 25 3416 G 3608 811 -> 16 0 25 3416 G 3606 811 -> 15 0 24 3416 G 3610 812 -> 16 0 24 3416 G 3530 812 -> 15 0 25 3416 G 3530 813 -> 16 0 25 3416 G 3528 813 -> 15 0 24 3416 G 3610 814 -> 16 0 24 3416 G 3560 814 -> 15 0 25 3416 G 3560 815 -> 16 0 25 3416 G 3558 815 -> 15 0 24 3416 G 3610 816 -> 16 0 24 3416 G 3590 816 -> 15 0 25 3416 G 3590 817 -> 16 0 25 3416 G 3588 817 -> 15 0 24 3416 G 3610 818 -> 16 0 24 3416 G 3419 818 -> 15 0 25 3416 G 3419 819 -> 16 0 25 3416 G 3417 819 -> 15 0 24 3416 G 3610 820 -> 16 0 24 3416 G 3431 820 -> 15 0 25 3416 G 3431 821 -> 16 0 25 3416 G 3429 821 -> 15 0 24 3416 G 3610 822 -> 16 0 24 3416 G 3443 822 -> 15 0 25 3416 G 3443 823 -> 16 0 25 3416 G 3441 823 -> 15 0 24 3416 G 3610 824 -> 16 0 24 3416 G 3455 824 -> 15 0 25 3416 G 3455 825 -> 16 0 25 3416 G 3453 825 -> 15 0 24 3416 G 3610 826 -> 16 0 24 3416 G 3485 826 -> 15 0 25 3416 G 3485 827 -> 16 0 25 3416 G 3483 827 -> 15 0 24 3416 G 3610 828 -> 16 0 24 3416 G 3515 828 -> 15 0 25 3416 G 3515 829 -> 16 0 25 3416 G 3513 829 -> 15 0 24 3416 G 3610 830 -> 16 0 24 3416 G 3545 830 -> 15 0 25 3416 G 3545 831 -> 16 0 25 3416 G 3543 831 -> 15 0 24 3416 G 3610 832 -> 16 0 24 3416 G 3467 832 -> 15 0 25 3416 G 3467 833 -> 16 0 25 3416 G 3465 833 -> 15 0 24 3416 G 3610 834 -> 16 0 24 3416 G 3575 834 -> 15 0 25 3416 G 3575 835 -> 16 0 25 3416 G 3573 835 -> 15 0 24 3416 G 3610 836 -> 16 0 24 3416 G 3497 836 -> 15 0 25 3416 G 3497 837 -> 16 0 25 3416 G 3495 837 -> 15 0 24 3416 G 3610 838 -> 16 0 24 3416 G 3605 838 -> 15 0 25 3416 G 3605 839 -> 16 0 25 3416 G 3603 839 -> 15 0 24 3416 G 3610 840 -> 16 0 24 3416 G 3527 840 -> 15 0 25 3416 G 3527 841 -> 16 0 25 3416 G 3525 841 -> 15 0 24 3416 G 3610 842 -> 16 0 24 3416 G 3557 842 -> 15 0 25 3416 G 3557 843 -> 16 0 25 3416 G 3555 843 -> 15 0 24 3416 G 3610 844 -> 16 0 24 3416 G 3587 844 -> 15 0 25 3416 G 3587 845 -> 16 0 25 3416 G 3585 845 -> 15 0 24 3416 G 3610 846 -> 16 0 24 3416 G 3428 846 -> 15 0 25 3416 G 3428 847 -> 16 0 25 3416 G 3426 847 -> 15 0 24 3416 G 3610 848 -> 16 0 24 3416 G 3440 848 -> 15 0 25 3416 G 3440 849 -> 16 0 25 3416 G 3438 849 -> 15 0 24 3416 G 3610 850 -> 16 0 24 3416 G 3452 850 -> 15 0 25 3416 G 3452 851 -> 16 0 25 3416 G 3450 851 -> 15 0 24 3416 G 3610 852 -> 16 0 24 3416 G 3482 852 -> 15 0 25 3416 G 3482 853 -> 16 0 25 3416 G 3480 853 -> 15 0 24 3416 G 3610 854 -> 16 0 24 3416 G 3512 854 -> 15 0 25 3416 G 3512 855 -> 16 0 25 3416 G 3510 855 -> 15 0 24 3416 G 3610 856 -> 16 0 24 3416 G 3542 856 -> 15 0 25 3416 G 3542 857 -> 16 0 25 3416 G 3540 857 -> 15 0 23 3416 G 3570 858 -> 16 0 23 3416 G 3571 858 -> 15 0 24 3416 G 3571 859 -> 16 0 24 3416 G 3610 859 -> 15 0 24 3416 G 3610 860 -> 16 0 24 3416 G 3464 860 -> 15 0 25 3416 G 3464 861 -> 16 0 25 3416 G 3462 861 -> 15 0 23 3416 G 3492 862 -> 16 0 23 3416 G 3493 862 -> 15 0 24 3416 G 3493 863 -> 16 0 24 3416 G 3610 863 -> 15 0 23 3416 G 3600 864 -> 16 0 23 3416 G 3601 864 -> 15 0 24 3416 G 3601 865 -> 16 0 24 3416 G 3610 865 -> 15 0 23 3416 G 3522 866 -> 16 0 23 3416 G 3523 866 -> 15 0 24 3416 G 3523 867 -> 16 0 24 3416 G 3610 867 -> 15 0 23 3416 G 3552 868 -> 16 0 23 3416 G 3553 868 -> 15 0 24 3416 G 3553 869 -> 16 0 24 3416 G 3610 869 -> 15 0 23 3416 G 3582 870 -> 16 0 23 3416 G 3583 870 -> 15 0 24 3416 G 3583 871 -> 16 0 24 3416 G 3610 871 -> 15 0 23 3416 G 3423 872 -> 16 0 23 3416 G 3424 872 -> 15 0 24 3416 G 3424 873 -> 16 0 24 3416 G 3610 873 -> 15 0 23 3416 G 3435 874 -> 16 0 23 3416 G 3436 874 -> 15 0 24 3416 G 3436 875 -> 16 0 24 3416 G 3610 875 -> 15 0 23 3416 G 3447 876 -> 16 0 23 3416 G 3448 876 -> 15 0 24 3416 G 3448 877 -> 16 0 24 3416 G 3610 877 -> 15 0 23 3416 G 3477 878 -> 16 0 23 3416 G 3478 878 -> 15 0 24 3416 G 3478 879 -> 16 0 24 3416 G 3610 879 -> 15 0 23 3416 G 3507 880 -> 16 0 23 3416 G 3508 880 -> 15 0 24 3416 G 3508 881 -> 16 0 24 3416 G 3610 881 -> 15 0 23 3416 G 3537 882 -> 16 0 23 3416 G 3538 882 -> 15 0 24 3416 G 3538 883 -> 16 0 24 3416 G 3610 883 -> 15 0 23 3416 G 3459 884 -> 16 0 23 3416 G 3460 884 -> 15 0 24 3416 G 3460 885 -> 16 0 24 3416 G 3610 885 -> 15 0 23 3416 G 3567 886 -> 16 0 23 3416 G 3568 886 -> 15 0 24 3416 G 3568 887 -> 16 0 24 3416 G 3610 887 -> 15 0 23 3416 G 3489 888 -> 16 0 23 3416 G 3490 888 -> 15 0 24 3416 G 3490 889 -> 16 0 24 3416 G 3610 889 -> 15 0 23 3416 G 3597 890 -> 16 0 23 3416 G 3598 890 -> 15 0 24 3416 G 3598 891 -> 16 0 24 3416 G 3610 891 -> 15 0 23 3416 G 3519 892 -> 16 0 23 3416 G 3520 892 -> 15 0 24 3416 G 3520 893 -> 16 0 24 3416 G 3610 893 -> 15 0 23 3416 G 3549 894 -> 16 0 23 3416 G 3550 894 -> 15 0 24 3416 G 3550 895 -> 16 0 24 3416 G 3610 895 -> 15 0 23 3416 G 3471 896 -> 16 0 23 3416 G 3472 896 -> 15 0 24 3416 G 3472 897 -> 16 0 24 3416 G 3610 897 -> 15 0 23 3416 G 3579 898 -> 16 0 23 3416 G 3580 898 -> 15 0 24 3416 G 3580 899 -> 16 0 24 3416 G 3610 899 -> 15 0 23 3416 G 3501 900 -> 16 0 23 3416 G 3502 900 -> 15 0 24 3416 G 3502 901 -> 16 0 24 3416 G 3610 901 -> 15 0 23 3416 G 3531 902 -> 16 0 23 3416 G 3532 902 -> 15 0 24 3416 G 3532 903 -> 16 0 24 3416 G 3610 903 -> 15 0 23 3416 G 3561 904 -> 16 0 23 3416 G 3562 904 -> 15 0 24 3416 G 3562 905 -> 16 0 24 3416 G 3610 905 -> 15 0 23 3416 G 3591 906 -> 16 0 23 3416 G 3592 906 -> 15 0 24 3416 G 3592 907 -> 16 0 24 3416 G 3610 907 -> 15 0 23 3416 G 3420 908 -> 16 0 23 3416 G 3421 908 -> 15 0 24 3416 G 3421 909 -> 16 0 24 3416 G 3610 909 -> 15 0 23 3416 G 3432 910 -> 16 0 23 3416 G 3433 910 -> 15 0 24 3416 G 3433 911 -> 16 0 24 3416 G 3610 911 -> 15 0 23 3416 G 3444 912 -> 16 0 23 3416 G 3445 912 -> 15 0 24 3416 G 3445 913 -> 16 0 24 3416 G 3610 913 -> 15 0 23 3416 G 3474 914 -> 16 0 23 3416 G 3475 914 -> 15 0 24 3416 G 3475 915 -> 16 0 24 3416 G 3610 915 -> 15 0 23 3416 G 3504 916 -> 16 0 23 3416 G 3505 916 -> 15 0 24 3416 G 3505 917 -> 16 0 24 3416 G 3610 917 -> 15 0 23 3416 G 3534 918 -> 16 0 23 3416 G 3535 918 -> 15 0 24 3416 G 3535 919 -> 16 0 24 3416 G 3610 919 -> 15 0 23 3416 G 3456 920 -> 16 0 23 3416 G 3457 920 -> 15 0 24 3416 G 3457 921 -> 16 0 24 3416 G 3610 921 -> 15 0 23 3416 G 3564 922 -> 16 0 23 3416 G 3565 922 -> 15 0 24 3416 G 3565 923 -> 16 0 24 3416 G 3610 923 -> 15 0 23 3416 G 3486 924 -> 16 0 23 3416 G 3487 924 -> 15 0 24 3416 G 3487 925 -> 16 0 24 3416 G 3610 925 -> 15 0 23 3416 G 3594 926 -> 16 0 23 3416 G 3595 926 -> 15 0 24 3416 G 3595 927 -> 16 0 24 3416 G 3610 927 -> 15 0 23 3416 G 3516 928 -> 16 0 23 3416 G 3517 928 -> 15 0 24 3416 G 3517 929 -> 16 0 24 3416 G 3610 929 -> 15 0 23 3416 G 3546 930 -> 16 0 23 3416 G 3547 930 -> 15 0 24 3416 G 3547 931 -> 16 0 24 3416 G 3610 931 -> 15 0 23 3416 G 3468 932 -> 16 0 23 3416 G 3469 932 -> 15 0 24 3416 G 3469 933 -> 16 0 24 3416 G 3610 933 -> 15 0 23 3416 G 3576 934 -> 16 0 23 3416 G 3577 934 -> 15 0 24 3416 G 3577 935 -> 16 0 24 3416 G 3610 935 -> 15 0 23 3416 G 3498 936 -> 16 0 23 3416 G 3499 936 -> 15 0 24 3416 G 3499 937 -> 16 0 24 3416 G 3610 937 -> 15 0 23 3416 G 3606 938 -> 16 0 23 3416 G 3607 938 -> 15 0 24 3416 G 3607 939 -> 16 0 24 3416 G 3610 939 -> 15 0 23 3416 G 3528 940 -> 16 0 23 3416 G 3529 940 -> 15 0 24 3416 G 3529 941 -> 16 0 24 3416 G 3610 941 -> 15 0 23 3416 G 3558 942 -> 16 0 23 3416 G 3559 942 -> 15 0 24 3416 G 3559 943 -> 16 0 24 3416 G 3610 943 -> 15 0 23 3416 G 3588 944 -> 16 0 23 3416 G 3589 944 -> 15 0 24 3416 G 3589 945 -> 16 0 24 3416 G 3610 945 -> 15 0 23 3416 G 3417 946 -> 16 0 23 3416 G 3418 946 -> 15 0 24 3416 G 3418 947 -> 16 0 24 3416 G 3610 947 -> 15 0 23 3416 G 3429 948 -> 16 0 23 3416 G 3430 948 -> 15 0 24 3416 G 3430 949 -> 16 0 24 3416 G 3610 949 -> 15 0 23 3416 G 3441 950 -> 16 0 23 3416 G 3442 950 -> 15 0 24 3416 G 3442 951 -> 16 0 24 3416 G 3610 951 -> 15 0 23 3416 G 3453 952 -> 16 0 23 3416 G 3454 952 -> 15 0 24 3416 G 3454 953 -> 16 0 24 3416 G 3610 953 -> 15 0 23 3416 G 3483 954 -> 16 0 23 3416 G 3484 954 -> 15 0 24 3416 G 3484 955 -> 16 0 24 3416 G 3610 955 -> 15 0 23 3416 G 3513 956 -> 16 0 23 3416 G 3514 956 -> 15 0 24 3416 G 3514 957 -> 16 0 24 3416 G 3610 957 -> 15 0 23 3416 G 3543 958 -> 16 0 23 3416 G 3544 958 -> 15 0 24 3416 G 3544 959 -> 16 0 24 3416 G 3610 959 -> 15 0 23 3416 G 3465 960 -> 16 0 23 3416 G 3466 960 -> 15 0 24 3416 G 3466 961 -> 16 0 24 3416 G 3610 961 -> 15 0 23 3416 G 3573 962 -> 16 0 23 3416 G 3574 962 -> 15 0 24 3416 G 3574 963 -> 16 0 24 3416 G 3610 963 -> 15 0 23 3416 G 3495 964 -> 16 0 23 3416 G 3496 964 -> 15 0 24 3416 G 3496 965 -> 16 0 24 3416 G 3610 965 -> 15 0 23 3416 G 3603 966 -> 16 0 23 3416 G 3604 966 -> 15 0 24 3416 G 3604 967 -> 16 0 24 3416 G 3610 967 -> 15 0 23 3416 G 3525 968 -> 16 0 23 3416 G 3526 968 -> 15 0 24 3416 G 3526 969 -> 16 0 24 3416 G 3610 969 -> 15 0 23 3416 G 3555 970 -> 16 0 23 3416 G 3556 970 -> 15 0 24 3416 G 3556 971 -> 16 0 24 3416 G 3610 971 -> 15 0 23 3416 G 3585 972 -> 16 0 23 3416 G 3586 972 -> 15 0 24 3416 G 3586 973 -> 16 0 24 3416 G 3610 973 -> 15 0 23 3416 G 3426 974 -> 16 0 23 3416 G 3427 974 -> 15 0 24 3416 G 3427 975 -> 16 0 24 3416 G 3610 975 -> 15 0 23 3416 G 3438 976 -> 16 0 23 3416 G 3439 976 -> 15 0 24 3416 G 3439 977 -> 16 0 24 3416 G 3610 977 -> 15 0 23 3416 G 3450 978 -> 16 0 23 3416 G 3451 978 -> 15 0 24 3416 G 3451 979 -> 16 0 24 3416 G 3610 979 -> 15 0 23 3416 G 3480 980 -> 16 0 23 3416 G 3481 980 -> 15 0 24 3416 G 3481 981 -> 16 0 24 3416 G 3610 981 -> 15 0 23 3416 G 3510 982 -> 16 0 23 3416 G 3511 982 -> 15 0 24 3416 G 3511 983 -> 16 0 24 3416 G 3610 983 -> 15 0 23 3416 G 3540 984 -> 16 0 23 3416 G 3541 984 -> 15 0 24 3416 G 3541 985 -> 16 0 24 3416 G 3610 985 -> 15 0 23 3612 G 3640 986 -> 16 0 23 3612 G 3641 986 -> 15 0 24 3612 G 3641 987 -> 16 0 24 3612 G 3713 987 -> 15 0 24 3612 G 3713 988 -> 16 0 24 3612 G 3672 988 -> 15 0 25 3612 G 3672 989 -> 16 0 25 3612 G 3670 989 -> 15 0 24 3612 G 3713 990 -> 16 0 24 3612 G 3702 990 -> 15 0 25 3612 G 3702 991 -> 16 0 25 3612 G 3700 991 -> 15 0 24 3612 G 3713 992 -> 16 0 24 3612 G 3654 992 -> 15 0 25 3612 G 3654 993 -> 16 0 25 3612 G 3652 993 -> 15 0 24 3612 G 3713 994 -> 16 0 24 3612 G 3684 994 -> 15 0 25 3612 G 3684 995 -> 16 0 25 3612 G 3682 995 -> 15 0 24 3612 G 3713 996 -> 16 0 24 3612 G 3666 996 -> 15 0 25 3612 G 3666 997 -> 16 0 25 3612 G 3664 997 -> 15 0 24 3612 G 3713 998 -> 16 0 24 3612 G 3696 998 -> 15 0 25 3612 G 3696 999 -> 16 0 25 3612 G 3694 999 -> 15 0 24 3612 G 3713 1000 -> 16 0 24 3612 G 3615 1000 -> 15 0 25 3612 G 3615 1001 -> 16 0 25 3612 G 3613 1001 -> 15 0 24 3612 G 3713 1002 -> 16 0 24 3612 G 3627 1002 -> 15 0 25 3612 G 3627 1003 -> 16 0 25 3612 G 3625 1003 -> 15 0 24 3612 G 3713 1004 -> 16 0 24 3612 G 3639 1004 -> 15 0 25 3612 G 3639 1005 -> 16 0 25 3612 G 3637 1005 -> 15 0 24 3612 G 3713 1006 -> 16 0 24 3612 G 3651 1006 -> 15 0 25 3612 G 3651 1007 -> 16 0 25 3612 G 3649 1007 -> 15 0 24 3612 G 3713 1008 -> 16 0 24 3612 G 3681 1008 -> 15 0 25 3612 G 3681 1009 -> 16 0 25 3612 G 3679 1009 -> 15 0 24 3612 G 3713 1010 -> 16 0 24 3612 G 3711 1010 -> 15 0 25 3612 G 3711 1011 -> 16 0 25 3612 G 3709 1011 -> 15 0 24 3612 G 3713 1012 -> 16 0 24 3612 G 3663 1012 -> 15 0 25 3612 G 3663 1013 -> 16 0 25 3612 G 3661 1013 -> 15 0 24 3612 G 3713 1014 -> 16 0 24 3612 G 3693 1014 -> 15 0 25 3612 G 3693 1015 -> 16 0 25 3612 G 3691 1015 -> 15 0 26 3612 G 3713 1016 -> 16 0 26 3612 G 3712 1016 -> 15 0 24 3612 G 3713 1017 -> 16 0 24 3612 G 3624 1017 -> 15 0 25 3612 G 3624 1018 -> 16 0 25 3612 G 3622 1018 -> 15 0 24 3612 G 3713 1019 -> 16 0 24 3612 G 3636 1019 -> 15 0 25 3612 G 3636 1020 -> 16 0 25 3612 G 3634 1020 -> 15 0 24 3612 G 3713 1021 -> 16 0 24 3612 G 3648 1021 -> 15 0 25 3612 G 3648 1022 -> 16 0 25 3612 G 3646 1022 -> 15 0 24 3612 G 3713 1023 -> 16 0 24 3612 G 3678 1023 -> 15 0 25 3612 G 3678 1024 -> 16 0 25 3612 G 3676 1024 -> 15 0 24 3612 G 3713 1025 -> 16 0 24 3612 G 3708 1025 -> 15 0 25 3612 G 3708 1026 -> 16 0 25 3612 G 3706 1026 -> 15 0 24 3612 G 3713 1027 -> 16 0 24 3612 G 3660 1027 -> 15 0 25 3612 G 3660 1028 -> 16 0 25 3612 G 3658 1028 -> 15 0 24 3612 G 3713 1029 -> 16 0 24 3612 G 3690 1029 -> 15 0 25 3612 G 3690 1030 -> 16 0 25 3612 G 3688 1030 -> 15 0 24 3612 G 3713 1031 -> 16 0 24 3612 G 3621 1031 -> 15 0 25 3612 G 3621 1032 -> 16 0 25 3612 G 3619 1032 -> 15 0 24 3612 G 3713 1033 -> 16 0 24 3612 G 3633 1033 -> 15 0 25 3612 G 3633 1034 -> 16 0 25 3612 G 3631 1034 -> 15 0 24 3612 G 3713 1035 -> 16 0 24 3612 G 3645 1035 -> 15 0 25 3612 G 3645 1036 -> 16 0 25 3612 G 3643 1036 -> 15 0 24 3612 G 3713 1037 -> 16 0 24 3612 G 3675 1037 -> 15 0 25 3612 G 3675 1038 -> 16 0 25 3612 G 3673 1038 -> 15 0 24 3612 G 3713 1039 -> 16 0 24 3612 G 3705 1039 -> 15 0 25 3612 G 3705 1040 -> 16 0 25 3612 G 3703 1040 -> 15 0 24 3612 G 3713 1041 -> 16 0 24 3612 G 3657 1041 -> 15 0 25 3612 G 3657 1042 -> 16 0 25 3612 G 3655 1042 -> 15 0 24 3612 G 3713 1043 -> 16 0 24 3612 G 3687 1043 -> 15 0 25 3612 G 3687 1044 -> 16 0 25 3612 G 3685 1044 -> 15 0 24 3612 G 3713 1045 -> 16 0 24 3612 G 3669 1045 -> 15 0 25 3612 G 3669 1046 -> 16 0 25 3612 G 3667 1046 -> 15 0 24 3612 G 3713 1047 -> 16 0 24 3612 G 3699 1047 -> 15 0 25 3612 G 3699 1048 -> 16 0 25 3612 G 3697 1048 -> 15 0 24 3612 G 3713 1049 -> 16 0 24 3612 G 3618 1049 -> 15 0 25 3612 G 3618 1050 -> 16 0 25 3612 G 3616 1050 -> 15 0 24 3612 G 3713 1051 -> 16 0 24 3612 G 3630 1051 -> 15 0 25 3612 G 3630 1052 -> 16 0 25 3612 G 3628 1052 -> 15 0 23 3612 G 3670 1053 -> 16 0 23 3612 G 3671 1053 -> 15 0 24 3612 G 3671 1054 -> 16 0 24 3612 G 3713 1054 -> 15 0 24 3612 G 3713 1055 -> 16 0 24 3612 G 3642 1055 -> 15 0 25 3612 G 3642 1056 -> 16 0 25 3612 G 3640 1056 -> 15 0 23 3612 G 3700 1057 -> 16 0 23 3612 G 3701 1057 -> 15 0 24 3612 G 3701 1058 -> 16 0 24 3612 G 3713 1058 -> 15 0 23 3612 G 3652 1059 -> 16 0 23 3612 G 3653 1059 -> 15 0 24 3612 G 3653 1060 -> 16 0 24 3612 G 3713 1060 -> 15 0 23 3612 G 3682 1061 -> 16 0 23 3612 G 3683 1061 -> 15 0 24 3612 G 3683 1062 -> 16 0 24 3612 G 3713 1062 -> 15 0 23 3612 G 3664 1063 -> 16 0 23 3612 G 3665 1063 -> 15 0 24 3612 G 3665 1064 -> 16 0 24 3612 G 3713 1064 -> 15 0 23 3612 G 3694 1065 -> 16 0 23 3612 G 3695 1065 -> 15 0 24 3612 G 3695 1066 -> 16 0 24 3612 G 3713 1066 -> 15 0 23 3612 G 3613 1067 -> 16 0 23 3612 G 3614 1067 -> 15 0 24 3612 G 3614 1068 -> 16 0 24 3612 G 3713 1068 -> 15 0 23 3612 G 3625 1069 -> 16 0 23 3612 G 3626 1069 -> 15 0 24 3612 G 3626 1070 -> 16 0 24 3612 G 3713 1070 -> 15 0 23 3612 G 3637 1071 -> 16 0 23 3612 G 3638 1071 -> 15 0 24 3612 G 3638 1072 -> 16 0 24 3612 G 3713 1072 -> 15 0 23 3612 G 3649 1073 -> 16 0 23 3612 G 3650 1073 -> 15 0 24 3612 G 3650 1074 -> 16 0 24 3612 G 3713 1074 -> 15 0 23 3612 G 3679 1075 -> 16 0 23 3612 G 3680 1075 -> 15 0 24 3612 G 3680 1076 -> 16 0 24 3612 G 3713 1076 -> 15 0 23 3612 G 3709 1077 -> 16 0 23 3612 G 3710 1077 -> 15 0 24 3612 G 3710 1078 -> 16 0 24 3612 G 3713 1078 -> 15 0 23 3612 G 3661 1079 -> 16 0 23 3612 G 3662 1079 -> 15 0 24 3612 G 3662 1080 -> 16 0 24 3612 G 3713 1080 -> 15 0 23 3612 G 3691 1081 -> 16 0 23 3612 G 3692 1081 -> 15 0 24 3612 G 3692 1082 -> 16 0 24 3612 G 3713 1082 -> 15 0 23 3612 G 3622 1083 -> 16 0 23 3612 G 3623 1083 -> 15 0 24 3612 G 3623 1084 -> 16 0 24 3612 G 3713 1084 -> 15 0 23 3612 G 3634 1085 -> 16 0 23 3612 G 3635 1085 -> 15 0 24 3612 G 3635 1086 -> 16 0 24 3612 G 3713 1086 -> 15 0 23 3612 G 3646 1087 -> 16 0 23 3612 G 3647 1087 -> 15 0 24 3612 G 3647 1088 -> 16 0 24 3612 G 3713 1088 -> 15 0 23 3612 G 3676 1089 -> 16 0 23 3612 G 3677 1089 -> 15 0 24 3612 G 3677 1090 -> 16 0 24 3612 G 3713 1090 -> 15 0 23 3612 G 3706 1091 -> 16 0 23 3612 G 3707 1091 -> 15 0 24 3612 G 3707 1092 -> 16 0 24 3612 G 3713 1092 -> 15 0 23 3612 G 3658 1093 -> 16 0 23 3612 G 3659 1093 -> 15 0 24 3612 G 3659 1094 -> 16 0 24 3612 G 3713 1094 -> 15 0 23 3612 G 3688 1095 -> 16 0 23 3612 G 3689 1095 -> 15 0 24 3612 G 3689 1096 -> 16 0 24 3612 G 3713 1096 -> 15 0 23 3612 G 3619 1097 -> 16 0 23 3612 G 3620 1097 -> 15 0 24 3612 G 3620 1098 -> 16 0 24 3612 G 3713 1098 -> 15 0 23 3612 G 3631 1099 -> 16 0 23 3612 G 3632 1099 -> 15 0 24 3612 G 3632 1100 -> 16 0 24 3612 G 3713 1100 -> 15 0 23 3612 G 3643 1101 -> 16 0 23 3612 G 3644 1101 -> 15 0 24 3612 G 3644 1102 -> 16 0 24 3612 G 3713 1102 -> 15 0 23 3612 G 3673 1103 -> 16 0 23 3612 G 3674 1103 -> 15 0 24 3612 G 3674 1104 -> 16 0 24 3612 G 3713 1104 -> 15 0 23 3612 G 3703 1105 -> 16 0 23 3612 G 3704 1105 -> 15 0 24 3612 G 3704 1106 -> 16 0 24 3612 G 3713 1106 -> 15 0 23 3612 G 3655 1107 -> 16 0 23 3612 G 3656 1107 -> 15 0 24 3612 G 3656 1108 -> 16 0 24 3612 G 3713 1108 -> 15 0 23 3612 G 3685 1109 -> 16 0 23 3612 G 3686 1109 -> 15 0 24 3612 G 3686 1110 -> 16 0 24 3612 G 3713 1110 -> 15 0 23 3612 G 3667 1111 -> 16 0 23 3612 G 3668 1111 -> 15 0 24 3612 G 3668 1112 -> 16 0 24 3612 G 3713 1112 -> 15 0 23 3612 G 3697 1113 -> 16 0 23 3612 G 3698 1113 -> 15 0 24 3612 G 3698 1114 -> 16 0 24 3612 G 3713 1114 -> 15 0 23 3612 G 3616 1115 -> 16 0 23 3612 G 3617 1115 -> 15 0 24 3612 G 3617 1116 -> 16 0 24 3612 G 3713 1116 -> 15 0 23 3612 G 3628 1117 -> 16 0 23 3612 G 3629 1117 -> 15 0 24 3612 G 3629 1118 -> 16 0 24 3612 G 3713 1118 -> 15 0 23 3715 G 3725 1119 -> 16 0 23 3715 G 3726 1119 -> 15 0 24 3715 G 3726 1120 -> 16 0 24 3715 G 3792 1120 -> 15 0 24 3715 G 3792 1121 -> 16 0 24 3715 G 3739 1121 -> 15 0 25 3715 G 3739 1122 -> 16 0 25 3715 G 3737 1122 -> 15 0 24 3715 G 3792 1123 -> 16 0 24 3715 G 3748 1123 -> 15 0 25 3715 G 3748 1124 -> 16 0 25 3715 G 3746 1124 -> 15 0 24 3715 G 3792 1125 -> 16 0 24 3715 G 3778 1125 -> 15 0 25 3715 G 3778 1126 -> 16 0 25 3715 G 3776 1126 -> 15 0 24 3715 G 3792 1127 -> 16 0 24 3715 G 3760 1127 -> 15 0 25 3715 G 3760 1128 -> 16 0 25 3715 G 3758 1128 -> 15 0 24 3715 G 3792 1129 -> 16 0 24 3715 G 3790 1129 -> 15 0 25 3715 G 3790 1130 -> 16 0 25 3715 G 3788 1130 -> 15 0 24 3715 G 3792 1131 -> 16 0 24 3715 G 3772 1131 -> 15 0 25 3715 G 3772 1132 -> 16 0 25 3715 G 3770 1132 -> 15 0 24 3715 G 3792 1133 -> 16 0 24 3715 G 3724 1133 -> 15 0 25 3715 G 3724 1134 -> 16 0 25 3715 G 3722 1134 -> 15 0 24 3715 G 3792 1135 -> 16 0 24 3715 G 3736 1135 -> 15 0 25 3715 G 3736 1136 -> 16 0 25 3715 G 3734 1136 -> 15 0 26 3715 G 3792 1137 -> 16 0 26 3715 G 3791 1137 -> 15 0 24 3715 G 3792 1138 -> 16 0 24 3715 G 3745 1138 -> 15 0 25 3715 G 3745 1139 -> 16 0 25 3715 G 3743 1139 -> 15 0 24 3715 G 3792 1140 -> 16 0 24 3715 G 3775 1140 -> 15 0 25 3715 G 3775 1141 -> 16 0 25 3715 G 3773 1141 -> 15 0 24 3715 G 3792 1142 -> 16 0 24 3715 G 3757 1142 -> 15 0 25 3715 G 3757 1143 -> 16 0 25 3715 G 3755 1143 -> 15 0 24 3715 G 3792 1144 -> 16 0 24 3715 G 3787 1144 -> 15 0 25 3715 G 3787 1145 -> 16 0 25 3715 G 3785 1145 -> 15 0 24 3715 G 3792 1146 -> 16 0 24 3715 G 3769 1146 -> 15 0 25 3715 G 3769 1147 -> 16 0 25 3715 G 3767 1147 -> 15 0 24 3715 G 3792 1148 -> 16 0 24 3715 G 3721 1148 -> 15 0 25 3715 G 3721 1149 -> 16 0 25 3715 G 3719 1149 -> 15 0 24 3715 G 3792 1150 -> 16 0 24 3715 G 3733 1150 -> 15 0 25 3715 G 3733 1151 -> 16 0 25 3715 G 3731 1151 -> 15 0 24 3715 G 3792 1152 -> 16 0 24 3715 G 3754 1152 -> 15 0 25 3715 G 3754 1153 -> 16 0 25 3715 G 3752 1153 -> 15 0 24 3715 G 3792 1154 -> 16 0 24 3715 G 3784 1154 -> 15 0 25 3715 G 3784 1155 -> 16 0 25 3715 G 3782 1155 -> 15 0 24 3715 G 3792 1156 -> 16 0 24 3715 G 3766 1156 -> 15 0 25 3715 G 3766 1157 -> 16 0 25 3715 G 3764 1157 -> 15 0 24 3715 G 3792 1158 -> 16 0 24 3715 G 3718 1158 -> 15 0 25 3715 G 3718 1159 -> 16 0 25 3715 G 3716 1159 -> 15 0 24 3715 G 3792 1160 -> 16 0 24 3715 G 3730 1160 -> 15 0 25 3715 G 3730 1161 -> 16 0 25 3715 G 3728 1161 -> 15 0 24 3715 G 3792 1162 -> 16 0 24 3715 G 3742 1162 -> 15 0 25 3715 G 3742 1163 -> 16 0 25 3715 G 3740 1163 -> 15 0 24 3715 G 3792 1164 -> 16 0 24 3715 G 3751 1164 -> 15 0 25 3715 G 3751 1165 -> 16 0 25 3715 G 3749 1165 -> 15 0 24 3715 G 3792 1166 -> 16 0 24 3715 G 3781 1166 -> 15 0 25 3715 G 3781 1167 -> 16 0 25 3715 G 3779 1167 -> 15 0 24 3715 G 3792 1168 -> 16 0 24 3715 G 3763 1168 -> 15 0 25 3715 G 3763 1169 -> 16 0 25 3715 G 3761 1169 -> 15 0 23 3715 G 3737 1170 -> 16 0 23 3715 G 3738 1170 -> 15 0 24 3715 G 3738 1171 -> 16 0 24 3715 G 3792 1171 -> 15 0 24 3715 G 3792 1172 -> 16 0 24 3715 G 3727 1172 -> 15 0 25 3715 G 3727 1173 -> 16 0 25 3715 G 3725 1173 -> 15 0 23 3715 G 3746 1174 -> 16 0 23 3715 G 3747 1174 -> 15 0 24 3715 G 3747 1175 -> 16 0 24 3715 G 3792 1175 -> 15 0 23 3715 G 3776 1176 -> 16 0 23 3715 G 3777 1176 -> 15 0 24 3715 G 3777 1177 -> 16 0 24 3715 G 3792 1177 -> 15 0 23 3715 G 3758 1178 -> 16 0 23 3715 G 3759 1178 -> 15 0 24 3715 G 3759 1179 -> 16 0 24 3715 G 3792 1179 -> 15 0 23 3715 G 3788 1180 -> 16 0 23 3715 G 3789 1180 -> 15 0 24 3715 G 3789 1181 -> 16 0 24 3715 G 3792 1181 -> 15 0 23 3715 G 3770 1182 -> 16 0 23 3715 G 3771 1182 -> 15 0 24 3715 G 3771 1183 -> 16 0 24 3715 G 3792 1183 -> 15 0 23 3715 G 3722 1184 -> 16 0 23 3715 G 3723 1184 -> 15 0 24 3715 G 3723 1185 -> 16 0 24 3715 G 3792 1185 -> 15 0 23 3715 G 3734 1186 -> 16 0 23 3715 G 3735 1186 -> 15 0 24 3715 G 3735 1187 -> 16 0 24 3715 G 3792 1187 -> 15 0 23 3715 G 3743 1188 -> 16 0 23 3715 G 3744 1188 -> 15 0 24 3715 G 3744 1189 -> 16 0 24 3715 G 3792 1189 -> 15 0 23 3715 G 3773 1190 -> 16 0 23 3715 G 3774 1190 -> 15 0 24 3715 G 3774 1191 -> 16 0 24 3715 G 3792 1191 -> 15 0 23 3715 G 3755 1192 -> 16 0 23 3715 G 3756 1192 -> 15 0 24 3715 G 3756 1193 -> 16 0 24 3715 G 3792 1193 -> 15 0 23 3715 G 3785 1194 -> 16 0 23 3715 G 3786 1194 -> 15 0 24 3715 G 3786 1195 -> 16 0 24 3715 G 3792 1195 -> 15 0 23 3715 G 3767 1196 -> 16 0 23 3715 G 3768 1196 -> 15 0 24 3715 G 3768 1197 -> 16 0 24 3715 G 3792 1197 -> 15 0 23 3715 G 3719 1198 -> 16 0 23 3715 G 3720 1198 -> 15 0 24 3715 G 3720 1199 -> 16 0 24 3715 G 3792 1199 -> 15 0 23 3715 G 3731 1200 -> 16 0 23 3715 G 3732 1200 -> 15 0 24 3715 G 3732 1201 -> 16 0 24 3715 G 3792 1201 -> 15 0 23 3715 G 3752 1202 -> 16 0 23 3715 G 3753 1202 -> 15 0 24 3715 G 3753 1203 -> 16 0 24 3715 G 3792 1203 -> 15 0 23 3715 G 3782 1204 -> 16 0 23 3715 G 3783 1204 -> 15 0 24 3715 G 3783 1205 -> 16 0 24 3715 G 3792 1205 -> 15 0 23 3715 G 3764 1206 -> 16 0 23 3715 G 3765 1206 -> 15 0 24 3715 G 3765 1207 -> 16 0 24 3715 G 3792 1207 -> 15 0 23 3715 G 3716 1208 -> 16 0 23 3715 G 3717 1208 -> 15 0 24 3715 G 3717 1209 -> 16 0 24 3715 G 3792 1209 -> 15 0 23 3715 G 3728 1210 -> 16 0 23 3715 G 3729 1210 -> 15 0 24 3715 G 3729 1211 -> 16 0 24 3715 G 3792 1211 -> 15 0 23 3715 G 3740 1212 -> 16 0 23 3715 G 3741 1212 -> 15 0 24 3715 G 3741 1213 -> 16 0 24 3715 G 3792 1213 -> 15 0 23 3715 G 3749 1214 -> 16 0 23 3715 G 3750 1214 -> 15 0 24 3715 G 3750 1215 -> 16 0 24 3715 G 3792 1215 -> 15 0 23 3715 G 3779 1216 -> 16 0 23 3715 G 3780 1216 -> 15 0 24 3715 G 3780 1217 -> 16 0 24 3715 G 3792 1217 -> 15 0 23 3715 G 3761 1218 -> 16 0 23 3715 G 3762 1218 -> 15 0 24 3715 G 3762 1219 -> 16 0 24 3715 G 3792 1219 -> 15 0 27 3415 G 3919 1220 -> 16 0 27 3415 G 3917 1220 -> 15 0 28 3415 G 3917 1221 -> 16 0 28 3415 G 3915 1221 -> 15 0 27 3415 G 3919 1222 -> 16 0 27 3415 G 3611 1222 -> 15 0 28 3415 G 3611 1223 -> 16 0 28 3415 G 3609 1223 -> 15 0 27 3415 G 3919 1224 -> 16 0 27 3415 G 3714 1224 -> 15 0 28 3415 G 3714 1225 -> 16 0 28 3415 G 3712 1225 -> 15 0 27 3415 G 3919 1226 -> 16 0 27 3415 G 3793 1226 -> 15 0 28 3415 G 3793 1227 -> 16 0 28 3415 G 3791 1227 -> 15 0 21 3415 G 3917 1228 -> 16 0 21 3415 G 3611 1228 -> 15 0 21 3415 G 3917 1229 -> 16 0 21 3415 G 3714 1229 -> 15 0 21 3415 G 3917 1230 -> 16 0 21 3415 G 3793 1230 -> 15 0 21 3415 G 3611 1231 -> 16 0 21 3415 G 3714 1231 -> 15 0 21 3415 G 3611 1232 -> 16 0 21 3415 G 3793 1232 -> 15 0 21 3415 G 3714 1233 -> 16 0 21 3415 G 3793 1233 -> 15 0 23 540 G 628 1234 -> 16 0 23 540 G 629 1234 -> 15 0 24 540 G 629 1235 -> 16 0 24 540 G 758 1235 -> 15 0 24 540 G 758 1236 -> 16 0 24 540 G 582 1236 -> 15 0 25 540 G 582 1237 -> 16 0 25 540 G 580 1237 -> 15 0 24 540 G 758 1238 -> 16 0 24 540 G 666 1238 -> 15 0 25 540 G 666 1239 -> 16 0 25 540 G 664 1239 -> 15 0 24 540 G 758 1240 -> 16 0 24 540 G 750 1240 -> 15 0 25 540 G 750 1241 -> 16 0 25 540 G 748 1241 -> 15 0 24 540 G 758 1242 -> 16 0 24 540 G 618 1242 -> 15 0 25 540 G 618 1243 -> 16 0 25 540 G 616 1243 -> 15 0 24 540 G 758 1244 -> 16 0 24 540 G 702 1244 -> 15 0 25 540 G 702 1245 -> 16 0 25 540 G 700 1245 -> 15 0 24 540 G 758 1246 -> 16 0 24 540 G 654 1246 -> 15 0 25 540 G 654 1247 -> 16 0 25 540 G 652 1247 -> 15 0 24 540 G 758 1248 -> 16 0 24 540 G 738 1248 -> 15 0 25 540 G 738 1249 -> 16 0 25 540 G 736 1249 -> 15 0 24 540 G 758 1250 -> 16 0 24 540 G 564 1250 -> 15 0 25 540 G 564 1251 -> 16 0 25 540 G 562 1251 -> 15 0 24 540 G 758 1252 -> 16 0 24 540 G 573 1252 -> 15 0 25 540 G 573 1253 -> 16 0 25 540 G 571 1253 -> 15 0 24 540 G 758 1254 -> 16 0 24 540 G 609 1254 -> 15 0 25 540 G 609 1255 -> 16 0 25 540 G 607 1255 -> 15 0 24 540 G 758 1256 -> 16 0 24 540 G 693 1256 -> 15 0 25 540 G 693 1257 -> 16 0 25 540 G 691 1257 -> 15 0 24 540 G 758 1258 -> 16 0 24 540 G 645 1258 -> 15 0 25 540 G 645 1259 -> 16 0 25 540 G 643 1259 -> 15 0 24 540 G 758 1260 -> 16 0 24 540 G 729 1260 -> 15 0 25 540 G 729 1261 -> 16 0 25 540 G 727 1261 -> 15 0 24 540 G 758 1262 -> 16 0 24 540 G 597 1262 -> 15 0 25 540 G 597 1263 -> 16 0 25 540 G 595 1263 -> 15 0 24 540 G 758 1264 -> 16 0 24 540 G 681 1264 -> 15 0 25 540 G 681 1265 -> 16 0 25 540 G 679 1265 -> 15 0 24 540 G 758 1266 -> 16 0 24 540 G 717 1266 -> 15 0 25 540 G 717 1267 -> 16 0 25 540 G 715 1267 -> 15 0 24 540 G 758 1268 -> 16 0 24 540 G 555 1268 -> 15 0 25 540 G 555 1269 -> 16 0 25 540 G 553 1269 -> 15 0 24 540 G 758 1270 -> 16 0 24 540 G 600 1270 -> 15 0 25 540 G 600 1271 -> 16 0 25 540 G 598 1271 -> 15 0 24 540 G 758 1272 -> 16 0 24 540 G 636 1272 -> 15 0 25 540 G 636 1273 -> 16 0 25 540 G 634 1273 -> 15 0 24 540 G 758 1274 -> 16 0 24 540 G 720 1274 -> 15 0 25 540 G 720 1275 -> 16 0 25 540 G 718 1275 -> 15 0 24 540 G 758 1276 -> 16 0 24 540 G 588 1276 -> 15 0 25 540 G 588 1277 -> 16 0 25 540 G 586 1277 -> 15 0 24 540 G 758 1278 -> 16 0 24 540 G 672 1278 -> 15 0 25 540 G 672 1279 -> 16 0 25 540 G 670 1279 -> 15 0 24 540 G 758 1280 -> 16 0 24 540 G 756 1280 -> 15 0 25 540 G 756 1281 -> 16 0 25 540 G 754 1281 -> 15 0 24 540 G 758 1282 -> 16 0 24 540 G 624 1282 -> 15 0 25 540 G 624 1283 -> 16 0 25 540 G 622 1283 -> 15 0 24 540 G 758 1284 -> 16 0 24 540 G 708 1284 -> 15 0 25 540 G 708 1285 -> 16 0 25 540 G 706 1285 -> 15 0 24 540 G 758 1286 -> 16 0 24 540 G 744 1286 -> 15 0 25 540 G 744 1287 -> 16 0 25 540 G 742 1287 -> 15 0 24 540 G 758 1288 -> 16 0 24 540 G 546 1288 -> 15 0 25 540 G 546 1289 -> 16 0 25 540 G 544 1289 -> 15 0 24 540 G 758 1290 -> 16 0 24 540 G 579 1290 -> 15 0 25 540 G 579 1291 -> 16 0 25 540 G 577 1291 -> 15 0 24 540 G 758 1292 -> 16 0 24 540 G 663 1292 -> 15 0 25 540 G 663 1293 -> 16 0 25 540 G 661 1293 -> 15 0 24 540 G 758 1294 -> 16 0 24 540 G 615 1294 -> 15 0 25 540 G 615 1295 -> 16 0 25 540 G 613 1295 -> 15 0 24 540 G 758 1296 -> 16 0 24 540 G 699 1296 -> 15 0 25 540 G 699 1297 -> 16 0 25 540 G 697 1297 -> 15 0 24 540 G 758 1298 -> 16 0 24 540 G 651 1298 -> 15 0 25 540 G 651 1299 -> 16 0 25 540 G 649 1299 -> 15 0 24 540 G 758 1300 -> 16 0 24 540 G 735 1300 -> 15 0 25 540 G 735 1301 -> 16 0 25 540 G 733 1301 -> 15 0 24 540 G 758 1302 -> 16 0 24 540 G 687 1302 -> 15 0 25 540 G 687 1303 -> 16 0 25 540 G 685 1303 -> 15 0 24 540 G 758 1304 -> 16 0 24 540 G 561 1304 -> 15 0 25 540 G 561 1305 -> 16 0 25 540 G 559 1305 -> 15 0 24 540 G 758 1306 -> 16 0 24 540 G 570 1306 -> 15 0 25 540 G 570 1307 -> 16 0 25 540 G 568 1307 -> 15 0 24 540 G 758 1308 -> 16 0 24 540 G 606 1308 -> 15 0 25 540 G 606 1309 -> 16 0 25 540 G 604 1309 -> 15 0 24 540 G 758 1310 -> 16 0 24 540 G 690 1310 -> 15 0 25 540 G 690 1311 -> 16 0 25 540 G 688 1311 -> 15 0 24 540 G 758 1312 -> 16 0 24 540 G 642 1312 -> 15 0 25 540 G 642 1313 -> 16 0 25 540 G 640 1313 -> 15 0 24 540 G 758 1314 -> 16 0 24 540 G 726 1314 -> 15 0 25 540 G 726 1315 -> 16 0 25 540 G 724 1315 -> 15 0 24 540 G 758 1316 -> 16 0 24 540 G 594 1316 -> 15 0 25 540 G 594 1317 -> 16 0 25 540 G 592 1317 -> 15 0 24 540 G 758 1318 -> 16 0 24 540 G 678 1318 -> 15 0 25 540 G 678 1319 -> 16 0 25 540 G 676 1319 -> 15 0 24 540 G 758 1320 -> 16 0 24 540 G 714 1320 -> 15 0 25 540 G 714 1321 -> 16 0 25 540 G 712 1321 -> 15 0 26 540 G 758 1322 -> 16 0 26 540 G 757 1322 -> 15 0 24 540 G 758 1323 -> 16 0 24 540 G 552 1323 -> 15 0 25 540 G 552 1324 -> 16 0 25 540 G 550 1324 -> 15 0 24 540 G 758 1325 -> 16 0 24 540 G 633 1325 -> 15 0 25 540 G 633 1326 -> 16 0 25 540 G 631 1326 -> 15 0 24 540 G 758 1327 -> 16 0 24 540 G 585 1327 -> 15 0 25 540 G 585 1328 -> 16 0 25 540 G 583 1328 -> 15 0 24 540 G 758 1329 -> 16 0 24 540 G 669 1329 -> 15 0 25 540 G 669 1330 -> 16 0 25 540 G 667 1330 -> 15 0 24 540 G 758 1331 -> 16 0 24 540 G 753 1331 -> 15 0 25 540 G 753 1332 -> 16 0 25 540 G 751 1332 -> 15 0 24 540 G 758 1333 -> 16 0 24 540 G 621 1333 -> 15 0 25 540 G 621 1334 -> 16 0 25 540 G 619 1334 -> 15 0 24 540 G 758 1335 -> 16 0 24 540 G 705 1335 -> 15 0 25 540 G 705 1336 -> 16 0 25 540 G 703 1336 -> 15 0 24 540 G 758 1337 -> 16 0 24 540 G 657 1337 -> 15 0 25 540 G 657 1338 -> 16 0 25 540 G 655 1338 -> 15 0 24 540 G 758 1339 -> 16 0 24 540 G 741 1339 -> 15 0 25 540 G 741 1340 -> 16 0 25 540 G 739 1340 -> 15 0 24 540 G 758 1341 -> 16 0 24 540 G 543 1341 -> 15 0 25 540 G 543 1342 -> 16 0 25 540 G 541 1342 -> 15 0 24 540 G 758 1343 -> 16 0 24 540 G 567 1343 -> 15 0 25 540 G 567 1344 -> 16 0 25 540 G 565 1344 -> 15 0 24 540 G 758 1345 -> 16 0 24 540 G 576 1345 -> 15 0 25 540 G 576 1346 -> 16 0 25 540 G 574 1346 -> 15 0 24 540 G 758 1347 -> 16 0 24 540 G 660 1347 -> 15 0 25 540 G 660 1348 -> 16 0 25 540 G 658 1348 -> 15 0 24 540 G 758 1349 -> 16 0 24 540 G 612 1349 -> 15 0 25 540 G 612 1350 -> 16 0 25 540 G 610 1350 -> 15 0 24 540 G 758 1351 -> 16 0 24 540 G 696 1351 -> 15 0 25 540 G 696 1352 -> 16 0 25 540 G 694 1352 -> 15 0 24 540 G 758 1353 -> 16 0 24 540 G 648 1353 -> 15 0 25 540 G 648 1354 -> 16 0 25 540 G 646 1354 -> 15 0 24 540 G 758 1355 -> 16 0 24 540 G 732 1355 -> 15 0 25 540 G 732 1356 -> 16 0 25 540 G 730 1356 -> 15 0 24 540 G 758 1357 -> 16 0 24 540 G 684 1357 -> 15 0 25 540 G 684 1358 -> 16 0 25 540 G 682 1358 -> 15 0 24 540 G 758 1359 -> 16 0 24 540 G 558 1359 -> 15 0 25 540 G 558 1360 -> 16 0 25 540 G 556 1360 -> 15 0 24 540 G 758 1361 -> 16 0 24 540 G 603 1361 -> 15 0 25 540 G 603 1362 -> 16 0 25 540 G 601 1362 -> 15 0 24 540 G 758 1363 -> 16 0 24 540 G 639 1363 -> 15 0 25 540 G 639 1364 -> 16 0 25 540 G 637 1364 -> 15 0 24 540 G 758 1365 -> 16 0 24 540 G 723 1365 -> 15 0 25 540 G 723 1366 -> 16 0 25 540 G 721 1366 -> 15 0 24 540 G 758 1367 -> 16 0 24 540 G 591 1367 -> 15 0 25 540 G 591 1368 -> 16 0 25 540 G 589 1368 -> 15 0 24 540 G 758 1369 -> 16 0 24 540 G 675 1369 -> 15 0 25 540 G 675 1370 -> 16 0 25 540 G 673 1370 -> 15 0 24 540 G 758 1371 -> 16 0 24 540 G 627 1371 -> 15 0 25 540 G 627 1372 -> 16 0 25 540 G 625 1372 -> 15 0 24 540 G 758 1373 -> 16 0 24 540 G 711 1373 -> 15 0 25 540 G 711 1374 -> 16 0 25 540 G 709 1374 -> 15 0 24 540 G 758 1375 -> 16 0 24 540 G 747 1375 -> 15 0 25 540 G 747 1376 -> 16 0 25 540 G 745 1376 -> 15 0 24 540 G 758 1377 -> 16 0 24 540 G 549 1377 -> 15 0 25 540 G 549 1378 -> 16 0 25 540 G 547 1378 -> 15 0 23 540 G 580 1379 -> 16 0 23 540 G 581 1379 -> 15 0 24 540 G 581 1380 -> 16 0 24 540 G 758 1380 -> 15 0 24 540 G 758 1381 -> 16 0 24 540 G 630 1381 -> 15 0 25 540 G 630 1382 -> 16 0 25 540 G 628 1382 -> 15 0 23 540 G 664 1383 -> 16 0 23 540 G 665 1383 -> 15 0 24 540 G 665 1384 -> 16 0 24 540 G 758 1384 -> 15 0 23 540 G 748 1385 -> 16 0 23 540 G 749 1385 -> 15 0 24 540 G 749 1386 -> 16 0 24 540 G 758 1386 -> 15 0 23 540 G 616 1387 -> 16 0 23 540 G 617 1387 -> 15 0 24 540 G 617 1388 -> 16 0 24 540 G 758 1388 -> 15 0 23 540 G 700 1389 -> 16 0 23 540 G 701 1389 -> 15 0 24 540 G 701 1390 -> 16 0 24 540 G 758 1390 -> 15 0 23 540 G 652 1391 -> 16 0 23 540 G 653 1391 -> 15 0 24 540 G 653 1392 -> 16 0 24 540 G 758 1392 -> 15 0 23 540 G 736 1393 -> 16 0 23 540 G 737 1393 -> 15 0 24 540 G 737 1394 -> 16 0 24 540 G 758 1394 -> 15 0 23 540 G 562 1395 -> 16 0 23 540 G 563 1395 -> 15 0 24 540 G 563 1396 -> 16 0 24 540 G 758 1396 -> 15 0 23 540 G 571 1397 -> 16 0 23 540 G 572 1397 -> 15 0 24 540 G 572 1398 -> 16 0 24 540 G 758 1398 -> 15 0 23 540 G 607 1399 -> 16 0 23 540 G 608 1399 -> 15 0 24 540 G 608 1400 -> 16 0 24 540 G 758 1400 -> 15 0 23 540 G 691 1401 -> 16 0 23 540 G 692 1401 -> 15 0 24 540 G 692 1402 -> 16 0 24 540 G 758 1402 -> 15 0 23 540 G 643 1403 -> 16 0 23 540 G 644 1403 -> 15 0 24 540 G 644 1404 -> 16 0 24 540 G 758 1404 -> 15 0 23 540 G 727 1405 -> 16 0 23 540 G 728 1405 -> 15 0 24 540 G 728 1406 -> 16 0 24 540 G 758 1406 -> 15 0 23 540 G 595 1407 -> 16 0 23 540 G 596 1407 -> 15 0 24 540 G 596 1408 -> 16 0 24 540 G 758 1408 -> 15 0 23 540 G 679 1409 -> 16 0 23 540 G 680 1409 -> 15 0 24 540 G 680 1410 -> 16 0 24 540 G 758 1410 -> 15 0 23 540 G 715 1411 -> 16 0 23 540 G 716 1411 -> 15 0 24 540 G 716 1412 -> 16 0 24 540 G 758 1412 -> 15 0 23 540 G 553 1413 -> 16 0 23 540 G 554 1413 -> 15 0 24 540 G 554 1414 -> 16 0 24 540 G 758 1414 -> 15 0 23 540 G 598 1415 -> 16 0 23 540 G 599 1415 -> 15 0 24 540 G 599 1416 -> 16 0 24 540 G 758 1416 -> 15 0 23 540 G 634 1417 -> 16 0 23 540 G 635 1417 -> 15 0 24 540 G 635 1418 -> 16 0 24 540 G 758 1418 -> 15 0 23 540 G 718 1419 -> 16 0 23 540 G 719 1419 -> 15 0 24 540 G 719 1420 -> 16 0 24 540 G 758 1420 -> 15 0 23 540 G 586 1421 -> 16 0 23 540 G 587 1421 -> 15 0 24 540 G 587 1422 -> 16 0 24 540 G 758 1422 -> 15 0 23 540 G 670 1423 -> 16 0 23 540 G 671 1423 -> 15 0 24 540 G 671 1424 -> 16 0 24 540 G 758 1424 -> 15 0 23 540 G 754 1425 -> 16 0 23 540 G 755 1425 -> 15 0 24 540 G 755 1426 -> 16 0 24 540 G 758 1426 -> 15 0 23 540 G 622 1427 -> 16 0 23 540 G 623 1427 -> 15 0 24 540 G 623 1428 -> 16 0 24 540 G 758 1428 -> 15 0 23 540 G 706 1429 -> 16 0 23 540 G 707 1429 -> 15 0 24 540 G 707 1430 -> 16 0 24 540 G 758 1430 -> 15 0 23 540 G 742 1431 -> 16 0 23 540 G 743 1431 -> 15 0 24 540 G 743 1432 -> 16 0 24 540 G 758 1432 -> 15 0 23 540 G 544 1433 -> 16 0 23 540 G 545 1433 -> 15 0 24 540 G 545 1434 -> 16 0 24 540 G 758 1434 -> 15 0 23 540 G 577 1435 -> 16 0 23 540 G 578 1435 -> 15 0 24 540 G 578 1436 -> 16 0 24 540 G 758 1436 -> 15 0 23 540 G 661 1437 -> 16 0 23 540 G 662 1437 -> 15 0 24 540 G 662 1438 -> 16 0 24 540 G 758 1438 -> 15 0 23 540 G 613 1439 -> 16 0 23 540 G 614 1439 -> 15 0 24 540 G 614 1440 -> 16 0 24 540 G 758 1440 -> 15 0 23 540 G 697 1441 -> 16 0 23 540 G 698 1441 -> 15 0 24 540 G 698 1442 -> 16 0 24 540 G 758 1442 -> 15 0 23 540 G 649 1443 -> 16 0 23 540 G 650 1443 -> 15 0 24 540 G 650 1444 -> 16 0 24 540 G 758 1444 -> 15 0 23 540 G 733 1445 -> 16 0 23 540 G 734 1445 -> 15 0 24 540 G 734 1446 -> 16 0 24 540 G 758 1446 -> 15 0 23 540 G 685 1447 -> 16 0 23 540 G 686 1447 -> 15 0 24 540 G 686 1448 -> 16 0 24 540 G 758 1448 -> 15 0 23 540 G 559 1449 -> 16 0 23 540 G 560 1449 -> 15 0 24 540 G 560 1450 -> 16 0 24 540 G 758 1450 -> 15 0 23 540 G 568 1451 -> 16 0 23 540 G 569 1451 -> 15 0 24 540 G 569 1452 -> 16 0 24 540 G 758 1452 -> 15 0 23 540 G 604 1453 -> 16 0 23 540 G 605 1453 -> 15 0 24 540 G 605 1454 -> 16 0 24 540 G 758 1454 -> 15 0 23 540 G 688 1455 -> 16 0 23 540 G 689 1455 -> 15 0 24 540 G 689 1456 -> 16 0 24 540 G 758 1456 -> 15 0 23 540 G 640 1457 -> 16 0 23 540 G 641 1457 -> 15 0 24 540 G 641 1458 -> 16 0 24 540 G 758 1458 -> 15 0 23 540 G 724 1459 -> 16 0 23 540 G 725 1459 -> 15 0 24 540 G 725 1460 -> 16 0 24 540 G 758 1460 -> 15 0 23 540 G 592 1461 -> 16 0 23 540 G 593 1461 -> 15 0 24 540 G 593 1462 -> 16 0 24 540 G 758 1462 -> 15 0 23 540 G 676 1463 -> 16 0 23 540 G 677 1463 -> 15 0 24 540 G 677 1464 -> 16 0 24 540 G 758 1464 -> 15 0 23 540 G 712 1465 -> 16 0 23 540 G 713 1465 -> 15 0 24 540 G 713 1466 -> 16 0 24 540 G 758 1466 -> 15 0 23 540 G 550 1467 -> 16 0 23 540 G 551 1467 -> 15 0 24 540 G 551 1468 -> 16 0 24 540 G 758 1468 -> 15 0 23 540 G 631 1469 -> 16 0 23 540 G 632 1469 -> 15 0 24 540 G 632 1470 -> 16 0 24 540 G 758 1470 -> 15 0 23 540 G 583 1471 -> 16 0 23 540 G 584 1471 -> 15 0 24 540 G 584 1472 -> 16 0 24 540 G 758 1472 -> 15 0 23 540 G 667 1473 -> 16 0 23 540 G 668 1473 -> 15 0 24 540 G 668 1474 -> 16 0 24 540 G 758 1474 -> 15 0 23 540 G 751 1475 -> 16 0 23 540 G 752 1475 -> 15 0 24 540 G 752 1476 -> 16 0 24 540 G 758 1476 -> 15 0 23 540 G 619 1477 -> 16 0 23 540 G 620 1477 -> 15 0 24 540 G 620 1478 -> 16 0 24 540 G 758 1478 -> 15 0 23 540 G 703 1479 -> 16 0 23 540 G 704 1479 -> 15 0 24 540 G 704 1480 -> 16 0 24 540 G 758 1480 -> 15 0 23 540 G 655 1481 -> 16 0 23 540 G 656 1481 -> 15 0 24 540 G 656 1482 -> 16 0 24 540 G 758 1482 -> 15 0 23 540 G 739 1483 -> 16 0 23 540 G 740 1483 -> 15 0 24 540 G 740 1484 -> 16 0 24 540 G 758 1484 -> 15 0 23 540 G 541 1485 -> 16 0 23 540 G 542 1485 -> 15 0 24 540 G 542 1486 -> 16 0 24 540 G 758 1486 -> 15 0 23 540 G 565 1487 -> 16 0 23 540 G 566 1487 -> 15 0 24 540 G 566 1488 -> 16 0 24 540 G 758 1488 -> 15 0 23 540 G 574 1489 -> 16 0 23 540 G 575 1489 -> 15 0 24 540 G 575 1490 -> 16 0 24 540 G 758 1490 -> 15 0 23 540 G 658 1491 -> 16 0 23 540 G 659 1491 -> 15 0 24 540 G 659 1492 -> 16 0 24 540 G 758 1492 -> 15 0 23 540 G 610 1493 -> 16 0 23 540 G 611 1493 -> 15 0 24 540 G 611 1494 -> 16 0 24 540 G 758 1494 -> 15 0 23 540 G 694 1495 -> 16 0 23 540 G 695 1495 -> 15 0 24 540 G 695 1496 -> 16 0 24 540 G 758 1496 -> 15 0 23 540 G 646 1497 -> 16 0 23 540 G 647 1497 -> 15 0 24 540 G 647 1498 -> 16 0 24 540 G 758 1498 -> 15 0 23 540 G 730 1499 -> 16 0 23 540 G 731 1499 -> 15 0 24 540 G 731 1500 -> 16 0 24 540 G 758 1500 -> 15 0 23 540 G 682 1501 -> 16 0 23 540 G 683 1501 -> 15 0 24 540 G 683 1502 -> 16 0 24 540 G 758 1502 -> 15 0 23 540 G 556 1503 -> 16 0 23 540 G 557 1503 -> 15 0 24 540 G 557 1504 -> 16 0 24 540 G 758 1504 -> 15 0 23 540 G 601 1505 -> 16 0 23 540 G 602 1505 -> 15 0 24 540 G 602 1506 -> 16 0 24 540 G 758 1506 -> 15 0 23 540 G 637 1507 -> 16 0 23 540 G 638 1507 -> 15 0 24 540 G 638 1508 -> 16 0 24 540 G 758 1508 -> 15 0 23 540 G 721 1509 -> 16 0 23 540 G 722 1509 -> 15 0 24 540 G 722 1510 -> 16 0 24 540 G 758 1510 -> 15 0 23 540 G 589 1511 -> 16 0 23 540 G 590 1511 -> 15 0 24 540 G 590 1512 -> 16 0 24 540 G 758 1512 -> 15 0 23 540 G 673 1513 -> 16 0 23 540 G 674 1513 -> 15 0 24 540 G 674 1514 -> 16 0 24 540 G 758 1514 -> 15 0 23 540 G 625 1515 -> 16 0 23 540 G 626 1515 -> 15 0 24 540 G 626 1516 -> 16 0 24 540 G 758 1516 -> 15 0 23 540 G 709 1517 -> 16 0 23 540 G 710 1517 -> 15 0 24 540 G 710 1518 -> 16 0 24 540 G 758 1518 -> 15 0 23 540 G 745 1519 -> 16 0 23 540 G 746 1519 -> 15 0 24 540 G 746 1520 -> 16 0 24 540 G 758 1520 -> 15 0 23 540 G 547 1521 -> 16 0 23 540 G 548 1521 -> 15 0 24 540 G 548 1522 -> 16 0 24 540 G 758 1522 -> 15 0 23 760 G 788 1523 -> 16 0 23 760 G 789 1523 -> 15 0 24 760 G 789 1524 -> 16 0 24 760 G 864 1524 -> 15 0 24 760 G 864 1525 -> 16 0 24 760 G 850 1525 -> 15 0 25 760 G 850 1526 -> 16 0 25 760 G 848 1526 -> 15 0 24 760 G 864 1527 -> 16 0 24 760 G 826 1527 -> 15 0 25 760 G 826 1528 -> 16 0 25 760 G 824 1528 -> 15 0 24 760 G 864 1529 -> 16 0 24 760 G 802 1529 -> 15 0 25 760 G 802 1530 -> 16 0 25 760 G 800 1530 -> 15 0 24 760 G 864 1531 -> 16 0 24 760 G 862 1531 -> 15 0 25 760 G 862 1532 -> 16 0 25 760 G 860 1532 -> 15 0 24 760 G 864 1533 -> 16 0 24 760 G 838 1533 -> 15 0 25 760 G 838 1534 -> 16 0 25 760 G 836 1534 -> 15 0 24 760 G 864 1535 -> 16 0 24 760 G 814 1535 -> 15 0 25 760 G 814 1536 -> 16 0 25 760 G 812 1536 -> 15 0 26 760 G 864 1537 -> 16 0 26 760 G 863 1537 -> 15 0 24 760 G 864 1538 -> 16 0 24 760 G 766 1538 -> 15 0 25 760 G 766 1539 -> 16 0 25 760 G 764 1539 -> 15 0 24 760 G 864 1540 -> 16 0 24 760 G 778 1540 -> 15 0 25 760 G 778 1541 -> 16 0 25 760 G 776 1541 -> 15 0 24 760 G 864 1542 -> 16 0 24 760 G 793 1542 -> 15 0 25 760 G 793 1543 -> 16 0 25 760 G 791 1543 -> 15 0 24 760 G 864 1544 -> 16 0 24 760 G 853 1544 -> 15 0 25 760 G 853 1545 -> 16 0 25 760 G 851 1545 -> 15 0 24 760 G 864 1546 -> 16 0 24 760 G 829 1546 -> 15 0 25 760 G 829 1547 -> 16 0 25 760 G 827 1547 -> 15 0 24 760 G 864 1548 -> 16 0 24 760 G 805 1548 -> 15 0 25 760 G 805 1549 -> 16 0 25 760 G 803 1549 -> 15 0 24 760 G 864 1550 -> 16 0 24 760 G 841 1550 -> 15 0 25 760 G 841 1551 -> 16 0 25 760 G 839 1551 -> 15 0 24 760 G 864 1552 -> 16 0 24 760 G 817 1552 -> 15 0 25 760 G 817 1553 -> 16 0 25 760 G 815 1553 -> 15 0 24 760 G 864 1554 -> 16 0 24 760 G 769 1554 -> 15 0 25 760 G 769 1555 -> 16 0 25 760 G 767 1555 -> 15 0 24 760 G 864 1556 -> 16 0 24 760 G 781 1556 -> 15 0 25 760 G 781 1557 -> 16 0 25 760 G 779 1557 -> 15 0 24 760 G 864 1558 -> 16 0 24 760 G 820 1558 -> 15 0 25 760 G 820 1559 -> 16 0 25 760 G 818 1559 -> 15 0 24 760 G 864 1560 -> 16 0 24 760 G 796 1560 -> 15 0 25 760 G 796 1561 -> 16 0 25 760 G 794 1561 -> 15 0 24 760 G 864 1562 -> 16 0 24 760 G 856 1562 -> 15 0 25 760 G 856 1563 -> 16 0 25 760 G 854 1563 -> 15 0 24 760 G 864 1564 -> 16 0 24 760 G 832 1564 -> 15 0 25 760 G 832 1565 -> 16 0 25 760 G 830 1565 -> 15 0 24 760 G 864 1566 -> 16 0 24 760 G 808 1566 -> 15 0 25 760 G 808 1567 -> 16 0 25 760 G 806 1567 -> 15 0 24 760 G 864 1568 -> 16 0 24 760 G 844 1568 -> 15 0 25 760 G 844 1569 -> 16 0 25 760 G 842 1569 -> 15 0 24 760 G 864 1570 -> 16 0 24 760 G 772 1570 -> 15 0 25 760 G 772 1571 -> 16 0 25 760 G 770 1571 -> 15 0 24 760 G 864 1572 -> 16 0 24 760 G 784 1572 -> 15 0 25 760 G 784 1573 -> 16 0 25 760 G 782 1573 -> 15 0 24 760 G 864 1574 -> 16 0 24 760 G 823 1574 -> 15 0 25 760 G 823 1575 -> 16 0 25 760 G 821 1575 -> 15 0 24 760 G 864 1576 -> 16 0 24 760 G 799 1576 -> 15 0 25 760 G 799 1577 -> 16 0 25 760 G 797 1577 -> 15 0 24 760 G 864 1578 -> 16 0 24 760 G 859 1578 -> 15 0 25 760 G 859 1579 -> 16 0 25 760 G 857 1579 -> 15 0 24 760 G 864 1580 -> 16 0 24 760 G 835 1580 -> 15 0 25 760 G 835 1581 -> 16 0 25 760 G 833 1581 -> 15 0 24 760 G 864 1582 -> 16 0 24 760 G 811 1582 -> 15 0 25 760 G 811 1583 -> 16 0 25 760 G 809 1583 -> 15 0 24 760 G 864 1584 -> 16 0 24 760 G 847 1584 -> 15 0 25 760 G 847 1585 -> 16 0 25 760 G 845 1585 -> 15 0 24 760 G 864 1586 -> 16 0 24 760 G 763 1586 -> 15 0 25 760 G 763 1587 -> 16 0 25 760 G 761 1587 -> 15 0 24 760 G 864 1588 -> 16 0 24 760 G 775 1588 -> 15 0 25 760 G 775 1589 -> 16 0 25 760 G 773 1589 -> 15 0 24 760 G 864 1590 -> 16 0 24 760 G 787 1590 -> 15 0 25 760 G 787 1591 -> 16 0 25 760 G 785 1591 -> 15 0 23 760 G 848 1592 -> 16 0 23 760 G 849 1592 -> 15 0 24 760 G 849 1593 -> 16 0 24 760 G 864 1593 -> 15 0 24 760 G 864 1594 -> 16 0 24 760 G 790 1594 -> 15 0 25 760 G 790 1595 -> 16 0 25 760 G 788 1595 -> 15 0 23 760 G 824 1596 -> 16 0 23 760 G 825 1596 -> 15 0 24 760 G 825 1597 -> 16 0 24 760 G 864 1597 -> 15 0 23 760 G 800 1598 -> 16 0 23 760 G 801 1598 -> 15 0 24 760 G 801 1599 -> 16 0 24 760 G 864 1599 -> 15 0 23 760 G 860 1600 -> 16 0 23 760 G 861 1600 -> 15 0 24 760 G 861 1601 -> 16 0 24 760 G 864 1601 -> 15 0 23 760 G 836 1602 -> 16 0 23 760 G 837 1602 -> 15 0 24 760 G 837 1603 -> 16 0 24 760 G 864 1603 -> 15 0 23 760 G 812 1604 -> 16 0 23 760 G 813 1604 -> 15 0 24 760 G 813 1605 -> 16 0 24 760 G 864 1605 -> 15 0 23 760 G 764 1606 -> 16 0 23 760 G 765 1606 -> 15 0 24 760 G 765 1607 -> 16 0 24 760 G 864 1607 -> 15 0 23 760 G 776 1608 -> 16 0 23 760 G 777 1608 -> 15 0 24 760 G 777 1609 -> 16 0 24 760 G 864 1609 -> 15 0 23 760 G 791 1610 -> 16 0 23 760 G 792 1610 -> 15 0 24 760 G 792 1611 -> 16 0 24 760 G 864 1611 -> 15 0 23 760 G 851 1612 -> 16 0 23 760 G 852 1612 -> 15 0 24 760 G 852 1613 -> 16 0 24 760 G 864 1613 -> 15 0 23 760 G 827 1614 -> 16 0 23 760 G 828 1614 -> 15 0 24 760 G 828 1615 -> 16 0 24 760 G 864 1615 -> 15 0 23 760 G 803 1616 -> 16 0 23 760 G 804 1616 -> 15 0 24 760 G 804 1617 -> 16 0 24 760 G 864 1617 -> 15 0 23 760 G 839 1618 -> 16 0 23 760 G 840 1618 -> 15 0 24 760 G 840 1619 -> 16 0 24 760 G 864 1619 -> 15 0 23 760 G 815 1620 -> 16 0 23 760 G 816 1620 -> 15 0 24 760 G 816 1621 -> 16 0 24 760 G 864 1621 -> 15 0 23 760 G 767 1622 -> 16 0 23 760 G 768 1622 -> 15 0 24 760 G 768 1623 -> 16 0 24 760 G 864 1623 -> 15 0 23 760 G 779 1624 -> 16 0 23 760 G 780 1624 -> 15 0 24 760 G 780 1625 -> 16 0 24 760 G 864 1625 -> 15 0 23 760 G 818 1626 -> 16 0 23 760 G 819 1626 -> 15 0 24 760 G 819 1627 -> 16 0 24 760 G 864 1627 -> 15 0 23 760 G 794 1628 -> 16 0 23 760 G 795 1628 -> 15 0 24 760 G 795 1629 -> 16 0 24 760 G 864 1629 -> 15 0 23 760 G 854 1630 -> 16 0 23 760 G 855 1630 -> 15 0 24 760 G 855 1631 -> 16 0 24 760 G 864 1631 -> 15 0 23 760 G 830 1632 -> 16 0 23 760 G 831 1632 -> 15 0 24 760 G 831 1633 -> 16 0 24 760 G 864 1633 -> 15 0 23 760 G 806 1634 -> 16 0 23 760 G 807 1634 -> 15 0 24 760 G 807 1635 -> 16 0 24 760 G 864 1635 -> 15 0 23 760 G 842 1636 -> 16 0 23 760 G 843 1636 -> 15 0 24 760 G 843 1637 -> 16 0 24 760 G 864 1637 -> 15 0 23 760 G 770 1638 -> 16 0 23 760 G 771 1638 -> 15 0 24 760 G 771 1639 -> 16 0 24 760 G 864 1639 -> 15 0 23 760 G 782 1640 -> 16 0 23 760 G 783 1640 -> 15 0 24 760 G 783 1641 -> 16 0 24 760 G 864 1641 -> 15 0 23 760 G 821 1642 -> 16 0 23 760 G 822 1642 -> 15 0 24 760 G 822 1643 -> 16 0 24 760 G 864 1643 -> 15 0 23 760 G 797 1644 -> 16 0 23 760 G 798 1644 -> 15 0 24 760 G 798 1645 -> 16 0 24 760 G 864 1645 -> 15 0 23 760 G 857 1646 -> 16 0 23 760 G 858 1646 -> 15 0 24 760 G 858 1647 -> 16 0 24 760 G 864 1647 -> 15 0 23 760 G 833 1648 -> 16 0 23 760 G 834 1648 -> 15 0 24 760 G 834 1649 -> 16 0 24 760 G 864 1649 -> 15 0 23 760 G 809 1650 -> 16 0 23 760 G 810 1650 -> 15 0 24 760 G 810 1651 -> 16 0 24 760 G 864 1651 -> 15 0 23 760 G 845 1652 -> 16 0 23 760 G 846 1652 -> 15 0 24 760 G 846 1653 -> 16 0 24 760 G 864 1653 -> 15 0 23 760 G 761 1654 -> 16 0 23 760 G 762 1654 -> 15 0 24 760 G 762 1655 -> 16 0 24 760 G 864 1655 -> 15 0 23 760 G 773 1656 -> 16 0 23 760 G 774 1656 -> 15 0 24 760 G 774 1657 -> 16 0 24 760 G 864 1657 -> 15 0 23 760 G 785 1658 -> 16 0 23 760 G 786 1658 -> 15 0 24 760 G 786 1659 -> 16 0 24 760 G 864 1659 -> 15 0 23 500 G 519 1660 -> 16 0 23 500 G 520 1660 -> 15 0 24 500 G 520 1661 -> 16 0 24 500 G 538 1661 -> 15 0 24 500 G 538 1662 -> 16 0 24 500 G 530 1662 -> 15 0 25 500 G 530 1663 -> 16 0 25 500 G 528 1663 -> 15 0 26 500 G 538 1664 -> 16 0 26 500 G 537 1664 -> 15 0 24 500 G 538 1665 -> 16 0 24 500 G 512 1665 -> 15 0 25 500 G 512 1666 -> 16 0 25 500 G 510 1666 -> 15 0 24 500 G 538 1667 -> 16 0 24 500 G 524 1667 -> 15 0 25 500 G 524 1668 -> 16 0 25 500 G 522 1668 -> 15 0 24 500 G 538 1669 -> 16 0 24 500 G 533 1669 -> 15 0 25 500 G 533 1670 -> 16 0 25 500 G 531 1670 -> 15 0 24 500 G 538 1671 -> 16 0 24 500 G 503 1671 -> 15 0 25 500 G 503 1672 -> 16 0 25 500 G 501 1672 -> 15 0 24 500 G 538 1673 -> 16 0 24 500 G 515 1673 -> 15 0 25 500 G 515 1674 -> 16 0 25 500 G 513 1674 -> 15 0 24 500 G 538 1675 -> 16 0 24 500 G 527 1675 -> 15 0 25 500 G 527 1676 -> 16 0 25 500 G 525 1676 -> 15 0 24 500 G 538 1677 -> 16 0 24 500 G 536 1677 -> 15 0 25 500 G 536 1678 -> 16 0 25 500 G 534 1678 -> 15 0 24 500 G 538 1679 -> 16 0 24 500 G 506 1679 -> 15 0 25 500 G 506 1680 -> 16 0 25 500 G 504 1680 -> 15 0 24 500 G 538 1681 -> 16 0 24 500 G 518 1681 -> 15 0 25 500 G 518 1682 -> 16 0 25 500 G 516 1682 -> 15 0 24 500 G 538 1683 -> 16 0 24 500 G 509 1683 -> 15 0 25 500 G 509 1684 -> 16 0 25 500 G 507 1684 -> 15 0 23 500 G 528 1685 -> 16 0 23 500 G 529 1685 -> 15 0 24 500 G 529 1686 -> 16 0 24 500 G 538 1686 -> 15 0 24 500 G 538 1687 -> 16 0 24 500 G 521 1687 -> 15 0 25 500 G 521 1688 -> 16 0 25 500 G 519 1688 -> 15 0 23 500 G 510 1689 -> 16 0 23 500 G 511 1689 -> 15 0 24 500 G 511 1690 -> 16 0 24 500 G 538 1690 -> 15 0 23 500 G 522 1691 -> 16 0 23 500 G 523 1691 -> 15 0 24 500 G 523 1692 -> 16 0 24 500 G 538 1692 -> 15 0 23 500 G 531 1693 -> 16 0 23 500 G 532 1693 -> 15 0 24 500 G 532 1694 -> 16 0 24 500 G 538 1694 -> 15 0 23 500 G 501 1695 -> 16 0 23 500 G 502 1695 -> 15 0 24 500 G 502 1696 -> 16 0 24 500 G 538 1696 -> 15 0 23 500 G 513 1697 -> 16 0 23 500 G 514 1697 -> 15 0 24 500 G 514 1698 -> 16 0 24 500 G 538 1698 -> 15 0 23 500 G 525 1699 -> 16 0 23 500 G 526 1699 -> 15 0 24 500 G 526 1700 -> 16 0 24 500 G 538 1700 -> 15 0 23 500 G 534 1701 -> 16 0 23 500 G 535 1701 -> 15 0 24 500 G 535 1702 -> 16 0 24 500 G 538 1702 -> 15 0 23 500 G 504 1703 -> 16 0 23 500 G 505 1703 -> 15 0 24 500 G 505 1704 -> 16 0 24 500 G 538 1704 -> 15 0 23 500 G 516 1705 -> 16 0 23 500 G 517 1705 -> 15 0 24 500 G 517 1706 -> 16 0 24 500 G 538 1706 -> 15 0 23 500 G 507 1707 -> 16 0 23 500 G 508 1707 -> 15 0 24 500 G 508 1708 -> 16 0 24 500 G 538 1708 -> 15 0 27 499 G 757 1709 -> 16 0 27 499 G 759 1709 -> 15 0 28 499 G 759 1710 -> 16 0 28 499 G 867 1710 -> 15 0 21 499 G 759 1711 -> 16 0 21 499 G 865 1711 -> 15 0 28 499 G 865 1712 -> 16 0 28 499 G 863 1712 -> 15 0 21 499 G 759 1713 -> 16 0 21 499 G 539 1713 -> 15 0 28 499 G 539 1714 -> 16 0 28 499 G 537 1714 -> 15 0 27 499 G 867 1715 -> 16 0 27 499 G 865 1715 -> 15 0 27 499 G 867 1716 -> 16 0 27 499 G 539 1716 -> 15 0 21 499 G 865 1717 -> 16 0 21 499 G 539 1717 -> 15 0 23 3318 G 3373 1718 -> 16 0 23 3318 G 3374 1718 -> 15 0 24 3318 G 3374 1719 -> 16 0 24 3318 G 3410 1719 -> 15 0 24 3318 G 3410 1720 -> 16 0 24 3318 G 3378 1720 -> 15 0 25 3318 G 3378 1721 -> 16 0 25 3318 G 3376 1721 -> 15 0 24 3318 G 3410 1722 -> 16 0 24 3318 G 3384 1722 -> 15 0 25 3318 G 3384 1723 -> 16 0 25 3318 G 3382 1723 -> 15 0 24 3318 G 3410 1724 -> 16 0 24 3318 G 3390 1724 -> 15 0 25 3318 G 3390 1725 -> 16 0 25 3318 G 3388 1725 -> 15 0 24 3318 G 3410 1726 -> 16 0 24 3318 G 3396 1726 -> 15 0 25 3318 G 3396 1727 -> 16 0 25 3318 G 3394 1727 -> 15 0 24 3318 G 3410 1728 -> 16 0 24 3318 G 3402 1728 -> 15 0 25 3318 G 3402 1729 -> 16 0 25 3318 G 3400 1729 -> 15 0 24 3318 G 3410 1730 -> 16 0 24 3318 G 3324 1730 -> 15 0 25 3318 G 3324 1731 -> 16 0 25 3318 G 3322 1731 -> 15 0 24 3318 G 3410 1732 -> 16 0 24 3318 G 3330 1732 -> 15 0 25 3318 G 3330 1733 -> 16 0 25 3318 G 3328 1733 -> 15 0 24 3318 G 3410 1734 -> 16 0 24 3318 G 3336 1734 -> 15 0 25 3318 G 3336 1735 -> 16 0 25 3318 G 3334 1735 -> 15 0 24 3318 G 3410 1736 -> 16 0 24 3318 G 3342 1736 -> 15 0 25 3318 G 3342 1737 -> 16 0 25 3318 G 3340 1737 -> 15 0 24 3318 G 3410 1738 -> 16 0 24 3318 G 3348 1738 -> 15 0 25 3318 G 3348 1739 -> 16 0 25 3318 G 3346 1739 -> 15 0 24 3318 G 3410 1740 -> 16 0 24 3318 G 3354 1740 -> 15 0 25 3318 G 3354 1741 -> 16 0 25 3318 G 3352 1741 -> 15 0 24 3318 G 3410 1742 -> 16 0 24 3318 G 3360 1742 -> 15 0 25 3318 G 3360 1743 -> 16 0 25 3318 G 3358 1743 -> 15 0 24 3318 G 3410 1744 -> 16 0 24 3318 G 3366 1744 -> 15 0 25 3318 G 3366 1745 -> 16 0 25 3318 G 3364 1745 -> 15 0 24 3318 G 3410 1746 -> 16 0 24 3318 G 3372 1746 -> 15 0 25 3318 G 3372 1747 -> 16 0 25 3318 G 3370 1747 -> 15 0 24 3318 G 3410 1748 -> 16 0 24 3318 G 3381 1748 -> 15 0 25 3318 G 3381 1749 -> 16 0 25 3318 G 3379 1749 -> 15 0 24 3318 G 3410 1750 -> 16 0 24 3318 G 3387 1750 -> 15 0 25 3318 G 3387 1751 -> 16 0 25 3318 G 3385 1751 -> 15 0 24 3318 G 3410 1752 -> 16 0 24 3318 G 3393 1752 -> 15 0 25 3318 G 3393 1753 -> 16 0 25 3318 G 3391 1753 -> 15 0 24 3318 G 3410 1754 -> 16 0 24 3318 G 3399 1754 -> 15 0 25 3318 G 3399 1755 -> 16 0 25 3318 G 3397 1755 -> 15 0 24 3318 G 3410 1756 -> 16 0 24 3318 G 3405 1756 -> 15 0 25 3318 G 3405 1757 -> 16 0 25 3318 G 3403 1757 -> 15 0 24 3318 G 3410 1758 -> 16 0 24 3318 G 3321 1758 -> 15 0 25 3318 G 3321 1759 -> 16 0 25 3318 G 3319 1759 -> 15 0 24 3318 G 3410 1760 -> 16 0 24 3318 G 3327 1760 -> 15 0 25 3318 G 3327 1761 -> 16 0 25 3318 G 3325 1761 -> 15 0 24 3318 G 3410 1762 -> 16 0 24 3318 G 3333 1762 -> 15 0 25 3318 G 3333 1763 -> 16 0 25 3318 G 3331 1763 -> 15 0 24 3318 G 3410 1764 -> 16 0 24 3318 G 3339 1764 -> 15 0 25 3318 G 3339 1765 -> 16 0 25 3318 G 3337 1765 -> 15 0 24 3318 G 3410 1766 -> 16 0 24 3318 G 3345 1766 -> 15 0 25 3318 G 3345 1767 -> 16 0 25 3318 G 3343 1767 -> 15 0 26 3318 G 3410 1768 -> 16 0 26 3318 G 3409 1768 -> 15 0 24 3318 G 3410 1769 -> 16 0 24 3318 G 3351 1769 -> 15 0 25 3318 G 3351 1770 -> 16 0 25 3318 G 3349 1770 -> 15 0 24 3318 G 3410 1771 -> 16 0 24 3318 G 3408 1771 -> 15 0 25 3318 G 3408 1772 -> 16 0 25 3318 G 3406 1772 -> 15 0 24 3318 G 3410 1773 -> 16 0 24 3318 G 3357 1773 -> 15 0 25 3318 G 3357 1774 -> 16 0 25 3318 G 3355 1774 -> 15 0 24 3318 G 3410 1775 -> 16 0 24 3318 G 3363 1775 -> 15 0 25 3318 G 3363 1776 -> 16 0 25 3318 G 3361 1776 -> 15 0 24 3318 G 3410 1777 -> 16 0 24 3318 G 3369 1777 -> 15 0 25 3318 G 3369 1778 -> 16 0 25 3318 G 3367 1778 -> 15 0 23 3318 G 3376 1779 -> 16 0 23 3318 G 3377 1779 -> 15 0 24 3318 G 3377 1780 -> 16 0 24 3318 G 3410 1780 -> 15 0 24 3318 G 3410 1781 -> 16 0 24 3318 G 3375 1781 -> 15 0 25 3318 G 3375 1782 -> 16 0 25 3318 G 3373 1782 -> 15 0 23 3318 G 3382 1783 -> 16 0 23 3318 G 3383 1783 -> 15 0 24 3318 G 3383 1784 -> 16 0 24 3318 G 3410 1784 -> 15 0 23 3318 G 3388 1785 -> 16 0 23 3318 G 3389 1785 -> 15 0 24 3318 G 3389 1786 -> 16 0 24 3318 G 3410 1786 -> 15 0 23 3318 G 3394 1787 -> 16 0 23 3318 G 3395 1787 -> 15 0 24 3318 G 3395 1788 -> 16 0 24 3318 G 3410 1788 -> 15 0 23 3318 G 3400 1789 -> 16 0 23 3318 G 3401 1789 -> 15 0 24 3318 G 3401 1790 -> 16 0 24 3318 G 3410 1790 -> 15 0 23 3318 G 3322 1791 -> 16 0 23 3318 G 3323 1791 -> 15 0 24 3318 G 3323 1792 -> 16 0 24 3318 G 3410 1792 -> 15 0 23 3318 G 3328 1793 -> 16 0 23 3318 G 3329 1793 -> 15 0 24 3318 G 3329 1794 -> 16 0 24 3318 G 3410 1794 -> 15 0 23 3318 G 3334 1795 -> 16 0 23 3318 G 3335 1795 -> 15 0 24 3318 G 3335 1796 -> 16 0 24 3318 G 3410 1796 -> 15 0 23 3318 G 3340 1797 -> 16 0 23 3318 G 3341 1797 -> 15 0 24 3318 G 3341 1798 -> 16 0 24 3318 G 3410 1798 -> 15 0 23 3318 G 3346 1799 -> 16 0 23 3318 G 3347 1799 -> 15 0 24 3318 G 3347 1800 -> 16 0 24 3318 G 3410 1800 -> 15 0 23 3318 G 3352 1801 -> 16 0 23 3318 G 3353 1801 -> 15 0 24 3318 G 3353 1802 -> 16 0 24 3318 G 3410 1802 -> 15 0 23 3318 G 3358 1803 -> 16 0 23 3318 G 3359 1803 -> 15 0 24 3318 G 3359 1804 -> 16 0 24 3318 G 3410 1804 -> 15 0 23 3318 G 3364 1805 -> 16 0 23 3318 G 3365 1805 -> 15 0 24 3318 G 3365 1806 -> 16 0 24 3318 G 3410 1806 -> 15 0 23 3318 G 3370 1807 -> 16 0 23 3318 G 3371 1807 -> 15 0 24 3318 G 3371 1808 -> 16 0 24 3318 G 3410 1808 -> 15 0 23 3318 G 3379 1809 -> 16 0 23 3318 G 3380 1809 -> 15 0 24 3318 G 3380 1810 -> 16 0 24 3318 G 3410 1810 -> 15 0 23 3318 G 3385 1811 -> 16 0 23 3318 G 3386 1811 -> 15 0 24 3318 G 3386 1812 -> 16 0 24 3318 G 3410 1812 -> 15 0 23 3318 G 3391 1813 -> 16 0 23 3318 G 3392 1813 -> 15 0 24 3318 G 3392 1814 -> 16 0 24 3318 G 3410 1814 -> 15 0 23 3318 G 3397 1815 -> 16 0 23 3318 G 3398 1815 -> 15 0 24 3318 G 3398 1816 -> 16 0 24 3318 G 3410 1816 -> 15 0 23 3318 G 3403 1817 -> 16 0 23 3318 G 3404 1817 -> 15 0 24 3318 G 3404 1818 -> 16 0 24 3318 G 3410 1818 -> 15 0 23 3318 G 3319 1819 -> 16 0 23 3318 G 3320 1819 -> 15 0 24 3318 G 3320 1820 -> 16 0 24 3318 G 3410 1820 -> 15 0 23 3318 G 3325 1821 -> 16 0 23 3318 G 3326 1821 -> 15 0 24 3318 G 3326 1822 -> 16 0 24 3318 G 3410 1822 -> 15 0 23 3318 G 3331 1823 -> 16 0 23 3318 G 3332 1823 -> 15 0 24 3318 G 3332 1824 -> 16 0 24 3318 G 3410 1824 -> 15 0 23 3318 G 3337 1825 -> 16 0 23 3318 G 3338 1825 -> 15 0 24 3318 G 3338 1826 -> 16 0 24 3318 G 3410 1826 -> 15 0 23 3318 G 3343 1827 -> 16 0 23 3318 G 3344 1827 -> 15 0 24 3318 G 3344 1828 -> 16 0 24 3318 G 3410 1828 -> 15 0 23 3318 G 3349 1829 -> 16 0 23 3318 G 3350 1829 -> 15 0 24 3318 G 3350 1830 -> 16 0 24 3318 G 3410 1830 -> 15 0 23 3318 G 3406 1831 -> 16 0 23 3318 G 3407 1831 -> 15 0 24 3318 G 3407 1832 -> 16 0 24 3318 G 3410 1832 -> 15 0 23 3318 G 3355 1833 -> 16 0 23 3318 G 3356 1833 -> 15 0 24 3318 G 3356 1834 -> 16 0 24 3318 G 3410 1834 -> 15 0 23 3318 G 3361 1835 -> 16 0 23 3318 G 3362 1835 -> 15 0 24 3318 G 3362 1836 -> 16 0 24 3318 G 3410 1836 -> 15 0 23 3318 G 3367 1837 -> 16 0 23 3318 G 3368 1837 -> 15 0 24 3318 G 3368 1838 -> 16 0 24 3318 G 3410 1838 -> 15 0 29 3092 G 3144 1839 -> 16 0 29 3092 G 3145 1839 -> 15 0 30 3092 G 3145 1840 -> 16 0 30 3092 G 3202 1840 -> 15 0 30 3092 G 3202 1841 -> 16 0 30 3092 G 3095 1841 -> 15 0 31 3092 G 3095 1842 -> 16 0 31 3092 G 3093 1842 -> 15 0 30 3092 G 3202 1843 -> 16 0 30 3092 G 3152 1843 -> 15 0 31 3092 G 3152 1844 -> 16 0 31 3092 G 3150 1844 -> 15 0 30 3092 G 3202 1845 -> 16 0 30 3092 G 3101 1845 -> 15 0 31 3092 G 3101 1846 -> 16 0 31 3092 G 3099 1846 -> 15 0 30 3092 G 3202 1847 -> 16 0 30 3092 G 3158 1847 -> 15 0 31 3092 G 3158 1848 -> 16 0 31 3092 G 3156 1848 -> 15 0 30 3092 G 3202 1849 -> 16 0 30 3092 G 3107 1849 -> 15 0 31 3092 G 3107 1850 -> 16 0 31 3092 G 3105 1850 -> 15 0 30 3092 G 3202 1851 -> 16 0 30 3092 G 3164 1851 -> 15 0 31 3092 G 3164 1852 -> 16 0 31 3092 G 3162 1852 -> 15 0 30 3092 G 3202 1853 -> 16 0 30 3092 G 3113 1853 -> 15 0 31 3092 G 3113 1854 -> 16 0 31 3092 G 3111 1854 -> 15 0 30 3092 G 3202 1855 -> 16 0 30 3092 G 3170 1855 -> 15 0 31 3092 G 3170 1856 -> 16 0 31 3092 G 3168 1856 -> 15 0 30 3092 G 3202 1857 -> 16 0 30 3092 G 3116 1857 -> 15 0 31 3092 G 3116 1858 -> 16 0 31 3092 G 3114 1858 -> 15 0 30 3092 G 3202 1859 -> 16 0 30 3092 G 3122 1859 -> 15 0 31 3092 G 3122 1860 -> 16 0 31 3092 G 3120 1860 -> 15 0 30 3092 G 3202 1861 -> 16 0 30 3092 G 3179 1861 -> 15 0 31 3092 G 3179 1862 -> 16 0 31 3092 G 3177 1862 -> 15 0 30 3092 G 3202 1863 -> 16 0 30 3092 G 3128 1863 -> 15 0 31 3092 G 3128 1864 -> 16 0 31 3092 G 3126 1864 -> 15 0 30 3092 G 3202 1865 -> 16 0 30 3092 G 3185 1865 -> 15 0 31 3092 G 3185 1866 -> 16 0 31 3092 G 3183 1866 -> 15 0 30 3092 G 3202 1867 -> 16 0 30 3092 G 3134 1867 -> 15 0 31 3092 G 3134 1868 -> 16 0 31 3092 G 3132 1868 -> 15 0 30 3092 G 3202 1869 -> 16 0 30 3092 G 3191 1869 -> 15 0 31 3092 G 3191 1870 -> 16 0 31 3092 G 3189 1870 -> 15 0 30 3092 G 3202 1871 -> 16 0 30 3092 G 3140 1871 -> 15 0 31 3092 G 3140 1872 -> 16 0 31 3092 G 3138 1872 -> 15 0 30 3092 G 3202 1873 -> 16 0 30 3092 G 3197 1873 -> 15 0 31 3092 G 3197 1874 -> 16 0 31 3092 G 3195 1874 -> 15 0 30 3092 G 3202 1875 -> 16 0 30 3092 G 3149 1875 -> 15 0 31 3092 G 3149 1876 -> 16 0 31 3092 G 3147 1876 -> 15 0 30 3092 G 3202 1877 -> 16 0 30 3092 G 3098 1877 -> 15 0 31 3092 G 3098 1878 -> 16 0 31 3092 G 3096 1878 -> 15 0 30 3092 G 3202 1879 -> 16 0 30 3092 G 3155 1879 -> 15 0 31 3092 G 3155 1880 -> 16 0 31 3092 G 3153 1880 -> 15 0 32 3092 G 3202 1881 -> 16 0 32 3092 G 3201 1881 -> 15 0 30 3092 G 3202 1882 -> 16 0 30 3092 G 3104 1882 -> 15 0 31 3092 G 3104 1883 -> 16 0 31 3092 G 3102 1883 -> 15 0 30 3092 G 3202 1884 -> 16 0 30 3092 G 3161 1884 -> 15 0 31 3092 G 3161 1885 -> 16 0 31 3092 G 3159 1885 -> 15 0 30 3092 G 3202 1886 -> 16 0 30 3092 G 3110 1886 -> 15 0 31 3092 G 3110 1887 -> 16 0 31 3092 G 3108 1887 -> 15 0 30 3092 G 3202 1888 -> 16 0 30 3092 G 3167 1888 -> 15 0 31 3092 G 3167 1889 -> 16 0 31 3092 G 3165 1889 -> 15 0 30 3092 G 3202 1890 -> 16 0 30 3092 G 3173 1890 -> 15 0 31 3092 G 3173 1891 -> 16 0 31 3092 G 3171 1891 -> 15 0 30 3092 G 3202 1892 -> 16 0 30 3092 G 3119 1892 -> 15 0 31 3092 G 3119 1893 -> 16 0 31 3092 G 3117 1893 -> 15 0 30 3092 G 3202 1894 -> 16 0 30 3092 G 3176 1894 -> 15 0 31 3092 G 3176 1895 -> 16 0 31 3092 G 3174 1895 -> 15 0 30 3092 G 3202 1896 -> 16 0 30 3092 G 3125 1896 -> 15 0 31 3092 G 3125 1897 -> 16 0 31 3092 G 3123 1897 -> 15 0 30 3092 G 3202 1898 -> 16 0 30 3092 G 3182 1898 -> 15 0 31 3092 G 3182 1899 -> 16 0 31 3092 G 3180 1899 -> 15 0 30 3092 G 3202 1900 -> 16 0 30 3092 G 3131 1900 -> 15 0 31 3092 G 3131 1901 -> 16 0 31 3092 G 3129 1901 -> 15 0 30 3092 G 3202 1902 -> 16 0 30 3092 G 3188 1902 -> 15 0 31 3092 G 3188 1903 -> 16 0 31 3092 G 3186 1903 -> 15 0 30 3092 G 3202 1904 -> 16 0 30 3092 G 3137 1904 -> 15 0 31 3092 G 3137 1905 -> 16 0 31 3092 G 3135 1905 -> 15 0 30 3092 G 3202 1906 -> 16 0 30 3092 G 3194 1906 -> 15 0 31 3092 G 3194 1907 -> 16 0 31 3092 G 3192 1907 -> 15 0 30 3092 G 3202 1908 -> 16 0 30 3092 G 3143 1908 -> 15 0 31 3092 G 3143 1909 -> 16 0 31 3092 G 3141 1909 -> 15 0 30 3092 G 3202 1910 -> 16 0 30 3092 G 3200 1910 -> 15 0 31 3092 G 3200 1911 -> 16 0 31 3092 G 3198 1911 -> 15 0 29 3092 G 3093 1912 -> 16 0 29 3092 G 3094 1912 -> 15 0 30 3092 G 3094 1913 -> 16 0 30 3092 G 3202 1913 -> 15 0 30 3092 G 3202 1914 -> 16 0 30 3092 G 3146 1914 -> 15 0 31 3092 G 3146 1915 -> 16 0 31 3092 G 3144 1915 -> 15 0 29 3092 G 3150 1916 -> 16 0 29 3092 G 3151 1916 -> 15 0 30 3092 G 3151 1917 -> 16 0 30 3092 G 3202 1917 -> 15 0 29 3092 G 3099 1918 -> 16 0 29 3092 G 3100 1918 -> 15 0 30 3092 G 3100 1919 -> 16 0 30 3092 G 3202 1919 -> 15 0 29 3092 G 3156 1920 -> 16 0 29 3092 G 3157 1920 -> 15 0 30 3092 G 3157 1921 -> 16 0 30 3092 G 3202 1921 -> 15 0 29 3092 G 3105 1922 -> 16 0 29 3092 G 3106 1922 -> 15 0 30 3092 G 3106 1923 -> 16 0 30 3092 G 3202 1923 -> 15 0 29 3092 G 3162 1924 -> 16 0 29 3092 G 3163 1924 -> 15 0 30 3092 G 3163 1925 -> 16 0 30 3092 G 3202 1925 -> 15 0 29 3092 G 3111 1926 -> 16 0 29 3092 G 3112 1926 -> 15 0 30 3092 G 3112 1927 -> 16 0 30 3092 G 3202 1927 -> 15 0 29 3092 G 3168 1928 -> 16 0 29 3092 G 3169 1928 -> 15 0 30 3092 G 3169 1929 -> 16 0 30 3092 G 3202 1929 -> 15 0 29 3092 G 3114 1930 -> 16 0 29 3092 G 3115 1930 -> 15 0 30 3092 G 3115 1931 -> 16 0 30 3092 G 3202 1931 -> 15 0 29 3092 G 3120 1932 -> 16 0 29 3092 G 3121 1932 -> 15 0 30 3092 G 3121 1933 -> 16 0 30 3092 G 3202 1933 -> 15 0 29 3092 G 3177 1934 -> 16 0 29 3092 G 3178 1934 -> 15 0 30 3092 G 3178 1935 -> 16 0 30 3092 G 3202 1935 -> 15 0 29 3092 G 3126 1936 -> 16 0 29 3092 G 3127 1936 -> 15 0 30 3092 G 3127 1937 -> 16 0 30 3092 G 3202 1937 -> 15 0 29 3092 G 3183 1938 -> 16 0 29 3092 G 3184 1938 -> 15 0 30 3092 G 3184 1939 -> 16 0 30 3092 G 3202 1939 -> 15 0 29 3092 G 3132 1940 -> 16 0 29 3092 G 3133 1940 -> 15 0 30 3092 G 3133 1941 -> 16 0 30 3092 G 3202 1941 -> 15 0 29 3092 G 3189 1942 -> 16 0 29 3092 G 3190 1942 -> 15 0 30 3092 G 3190 1943 -> 16 0 30 3092 G 3202 1943 -> 15 0 29 3092 G 3138 1944 -> 16 0 29 3092 G 3139 1944 -> 15 0 30 3092 G 3139 1945 -> 16 0 30 3092 G 3202 1945 -> 15 0 29 3092 G 3195 1946 -> 16 0 29 3092 G 3196 1946 -> 15 0 30 3092 G 3196 1947 -> 16 0 30 3092 G 3202 1947 -> 15 0 29 3092 G 3147 1948 -> 16 0 29 3092 G 3148 1948 -> 15 0 30 3092 G 3148 1949 -> 16 0 30 3092 G 3202 1949 -> 15 0 29 3092 G 3096 1950 -> 16 0 29 3092 G 3097 1950 -> 15 0 30 3092 G 3097 1951 -> 16 0 30 3092 G 3202 1951 -> 15 0 29 3092 G 3153 1952 -> 16 0 29 3092 G 3154 1952 -> 15 0 30 3092 G 3154 1953 -> 16 0 30 3092 G 3202 1953 -> 15 0 29 3092 G 3102 1954 -> 16 0 29 3092 G 3103 1954 -> 15 0 30 3092 G 3103 1955 -> 16 0 30 3092 G 3202 1955 -> 15 0 29 3092 G 3159 1956 -> 16 0 29 3092 G 3160 1956 -> 15 0 30 3092 G 3160 1957 -> 16 0 30 3092 G 3202 1957 -> 15 0 29 3092 G 3108 1958 -> 16 0 29 3092 G 3109 1958 -> 15 0 30 3092 G 3109 1959 -> 16 0 30 3092 G 3202 1959 -> 15 0 29 3092 G 3165 1960 -> 16 0 29 3092 G 3166 1960 -> 15 0 30 3092 G 3166 1961 -> 16 0 30 3092 G 3202 1961 -> 15 0 29 3092 G 3171 1962 -> 16 0 29 3092 G 3172 1962 -> 15 0 30 3092 G 3172 1963 -> 16 0 30 3092 G 3202 1963 -> 15 0 29 3092 G 3117 1964 -> 16 0 29 3092 G 3118 1964 -> 15 0 30 3092 G 3118 1965 -> 16 0 30 3092 G 3202 1965 -> 15 0 29 3092 G 3174 1966 -> 16 0 29 3092 G 3175 1966 -> 15 0 30 3092 G 3175 1967 -> 16 0 30 3092 G 3202 1967 -> 15 0 29 3092 G 3123 1968 -> 16 0 29 3092 G 3124 1968 -> 15 0 30 3092 G 3124 1969 -> 16 0 30 3092 G 3202 1969 -> 15 0 29 3092 G 3180 1970 -> 16 0 29 3092 G 3181 1970 -> 15 0 30 3092 G 3181 1971 -> 16 0 30 3092 G 3202 1971 -> 15 0 29 3092 G 3129 1972 -> 16 0 29 3092 G 3130 1972 -> 15 0 30 3092 G 3130 1973 -> 16 0 30 3092 G 3202 1973 -> 15 0 29 3092 G 3186 1974 -> 16 0 29 3092 G 3187 1974 -> 15 0 30 3092 G 3187 1975 -> 16 0 30 3092 G 3202 1975 -> 15 0 29 3092 G 3135 1976 -> 16 0 29 3092 G 3136 1976 -> 15 0 30 3092 G 3136 1977 -> 16 0 30 3092 G 3202 1977 -> 15 0 29 3092 G 3192 1978 -> 16 0 29 3092 G 3193 1978 -> 15 0 30 3092 G 3193 1979 -> 16 0 30 3092 G 3202 1979 -> 15 0 29 3092 G 3141 1980 -> 16 0 29 3092 G 3142 1980 -> 15 0 30 3092 G 3142 1981 -> 16 0 30 3092 G 3202 1981 -> 15 0 29 3092 G 3198 1982 -> 16 0 29 3092 G 3199 1982 -> 15 0 30 3092 G 3199 1983 -> 16 0 30 3092 G 3202 1983 -> 15 0 29 3272 G 3273 1984 -> 16 0 29 3272 G 3274 1984 -> 15 0 30 3272 G 3274 1985 -> 16 0 30 3272 G 3292 1985 -> 15 0 30 3272 G 3292 1986 -> 16 0 30 3272 G 3281 1986 -> 15 0 31 3272 G 3281 1987 -> 16 0 31 3272 G 3279 1987 -> 15 0 30 3272 G 3292 1988 -> 16 0 30 3272 G 3287 1988 -> 15 0 31 3272 G 3287 1989 -> 16 0 31 3272 G 3285 1989 -> 15 0 30 3272 G 3292 1990 -> 16 0 30 3272 G 3278 1990 -> 15 0 31 3272 G 3278 1991 -> 16 0 31 3272 G 3276 1991 -> 15 0 30 3272 G 3292 1992 -> 16 0 30 3272 G 3284 1992 -> 15 0 31 3272 G 3284 1993 -> 16 0 31 3272 G 3282 1993 -> 15 0 30 3272 G 3292 1994 -> 16 0 30 3272 G 3290 1994 -> 15 0 31 3272 G 3290 1995 -> 16 0 31 3272 G 3288 1995 -> 15 0 32 3272 G 3292 1996 -> 16 0 32 3272 G 3291 1996 -> 15 0 29 3272 G 3279 1997 -> 16 0 29 3272 G 3280 1997 -> 15 0 30 3272 G 3280 1998 -> 16 0 30 3272 G 3292 1998 -> 15 0 30 3272 G 3292 1999 -> 16 0 30 3272 G 3275 1999 -> 15 0 31 3272 G 3275 2000 -> 16 0 31 3272 G 3273 2000 -> 15 0 29 3272 G 3285 2001 -> 16 0 29 3272 G 3286 2001 -> 15 0 30 3272 G 3286 2002 -> 16 0 30 3272 G 3292 2002 -> 15 0 29 3272 G 3276 2003 -> 16 0 29 3272 G 3277 2003 -> 15 0 30 3272 G 3277 2004 -> 16 0 30 3272 G 3292 2004 -> 15 0 29 3272 G 3282 2005 -> 16 0 29 3272 G 3283 2005 -> 15 0 30 3272 G 3283 2006 -> 16 0 30 3272 G 3292 2006 -> 15 0 29 3272 G 3288 2007 -> 16 0 29 3272 G 3289 2007 -> 15 0 30 3272 G 3289 2008 -> 16 0 30 3272 G 3292 2008 -> 15 0 29 2351 G 2352 2009 -> 16 0 29 2351 G 2353 2009 -> 15 0 30 2351 G 2353 2010 -> 16 0 30 2351 G 2461 2010 -> 15 0 30 2351 G 2461 2011 -> 16 0 30 2351 G 2360 2011 -> 15 0 31 2351 G 2360 2012 -> 16 0 31 2351 G 2358 2012 -> 15 0 30 2351 G 2461 2013 -> 16 0 30 2351 G 2366 2013 -> 15 0 31 2351 G 2366 2014 -> 16 0 31 2351 G 2364 2014 -> 15 0 30 2351 G 2461 2015 -> 16 0 30 2351 G 2372 2015 -> 15 0 31 2351 G 2372 2016 -> 16 0 31 2351 G 2370 2016 -> 15 0 30 2351 G 2461 2017 -> 16 0 30 2351 G 2378 2017 -> 15 0 31 2351 G 2378 2018 -> 16 0 31 2351 G 2376 2018 -> 15 0 30 2351 G 2461 2019 -> 16 0 30 2351 G 2414 2019 -> 15 0 31 2351 G 2414 2020 -> 16 0 31 2351 G 2412 2020 -> 15 0 30 2351 G 2461 2021 -> 16 0 30 2351 G 2420 2021 -> 15 0 31 2351 G 2420 2022 -> 16 0 31 2351 G 2418 2022 -> 15 0 30 2351 G 2461 2023 -> 16 0 30 2351 G 2426 2023 -> 15 0 31 2351 G 2426 2024 -> 16 0 31 2351 G 2424 2024 -> 15 0 30 2351 G 2461 2025 -> 16 0 30 2351 G 2432 2025 -> 15 0 31 2351 G 2432 2026 -> 16 0 31 2351 G 2430 2026 -> 15 0 30 2351 G 2461 2027 -> 16 0 30 2351 G 2438 2027 -> 15 0 31 2351 G 2438 2028 -> 16 0 31 2351 G 2436 2028 -> 15 0 32 2351 G 2461 2029 -> 16 0 32 2351 G 2460 2029 -> 15 0 30 2351 G 2461 2030 -> 16 0 30 2351 G 2384 2030 -> 15 0 31 2351 G 2384 2031 -> 16 0 31 2351 G 2382 2031 -> 15 0 30 2351 G 2461 2032 -> 16 0 30 2351 G 2441 2032 -> 15 0 31 2351 G 2441 2033 -> 16 0 31 2351 G 2439 2033 -> 15 0 30 2351 G 2461 2034 -> 16 0 30 2351 G 2390 2034 -> 15 0 31 2351 G 2390 2035 -> 16 0 31 2351 G 2388 2035 -> 15 0 30 2351 G 2461 2036 -> 16 0 30 2351 G 2447 2036 -> 15 0 31 2351 G 2447 2037 -> 16 0 31 2351 G 2445 2037 -> 15 0 30 2351 G 2461 2038 -> 16 0 30 2351 G 2396 2038 -> 15 0 31 2351 G 2396 2039 -> 16 0 31 2351 G 2394 2039 -> 15 0 30 2351 G 2461 2040 -> 16 0 30 2351 G 2453 2040 -> 15 0 31 2351 G 2453 2041 -> 16 0 31 2351 G 2451 2041 -> 15 0 30 2351 G 2461 2042 -> 16 0 30 2351 G 2402 2042 -> 15 0 31 2351 G 2402 2043 -> 16 0 31 2351 G 2400 2043 -> 15 0 30 2351 G 2461 2044 -> 16 0 30 2351 G 2459 2044 -> 15 0 31 2351 G 2459 2045 -> 16 0 31 2351 G 2457 2045 -> 15 0 30 2351 G 2461 2046 -> 16 0 30 2351 G 2408 2046 -> 15 0 31 2351 G 2408 2047 -> 16 0 31 2351 G 2406 2047 -> 15 0 30 2351 G 2461 2048 -> 16 0 30 2351 G 2357 2048 -> 15 0 31 2351 G 2357 2049 -> 16 0 31 2351 G 2355 2049 -> 15 0 30 2351 G 2461 2050 -> 16 0 30 2351 G 2363 2050 -> 15 0 31 2351 G 2363 2051 -> 16 0 31 2351 G 2361 2051 -> 15 0 30 2351 G 2461 2052 -> 16 0 30 2351 G 2369 2052 -> 15 0 31 2351 G 2369 2053 -> 16 0 31 2351 G 2367 2053 -> 15 0 30 2351 G 2461 2054 -> 16 0 30 2351 G 2375 2054 -> 15 0 31 2351 G 2375 2055 -> 16 0 31 2351 G 2373 2055 -> 15 0 30 2351 G 2461 2056 -> 16 0 30 2351 G 2411 2056 -> 15 0 31 2351 G 2411 2057 -> 16 0 31 2351 G 2409 2057 -> 15 0 30 2351 G 2461 2058 -> 16 0 30 2351 G 2417 2058 -> 15 0 31 2351 G 2417 2059 -> 16 0 31 2351 G 2415 2059 -> 15 0 30 2351 G 2461 2060 -> 16 0 30 2351 G 2423 2060 -> 15 0 31 2351 G 2423 2061 -> 16 0 31 2351 G 2421 2061 -> 15 0 30 2351 G 2461 2062 -> 16 0 30 2351 G 2429 2062 -> 15 0 31 2351 G 2429 2063 -> 16 0 31 2351 G 2427 2063 -> 15 0 30 2351 G 2461 2064 -> 16 0 30 2351 G 2435 2064 -> 15 0 31 2351 G 2435 2065 -> 16 0 31 2351 G 2433 2065 -> 15 0 30 2351 G 2461 2066 -> 16 0 30 2351 G 2381 2066 -> 15 0 31 2351 G 2381 2067 -> 16 0 31 2351 G 2379 2067 -> 15 0 30 2351 G 2461 2068 -> 16 0 30 2351 G 2387 2068 -> 15 0 31 2351 G 2387 2069 -> 16 0 31 2351 G 2385 2069 -> 15 0 30 2351 G 2461 2070 -> 16 0 30 2351 G 2444 2070 -> 15 0 31 2351 G 2444 2071 -> 16 0 31 2351 G 2442 2071 -> 15 0 30 2351 G 2461 2072 -> 16 0 30 2351 G 2393 2072 -> 15 0 31 2351 G 2393 2073 -> 16 0 31 2351 G 2391 2073 -> 15 0 30 2351 G 2461 2074 -> 16 0 30 2351 G 2450 2074 -> 15 0 31 2351 G 2450 2075 -> 16 0 31 2351 G 2448 2075 -> 15 0 30 2351 G 2461 2076 -> 16 0 30 2351 G 2399 2076 -> 15 0 31 2351 G 2399 2077 -> 16 0 31 2351 G 2397 2077 -> 15 0 30 2351 G 2461 2078 -> 16 0 30 2351 G 2456 2078 -> 15 0 31 2351 G 2456 2079 -> 16 0 31 2351 G 2454 2079 -> 15 0 30 2351 G 2461 2080 -> 16 0 30 2351 G 2405 2080 -> 15 0 31 2351 G 2405 2081 -> 16 0 31 2351 G 2403 2081 -> 15 0 29 2351 G 2358 2082 -> 16 0 29 2351 G 2359 2082 -> 15 0 30 2351 G 2359 2083 -> 16 0 30 2351 G 2461 2083 -> 15 0 30 2351 G 2461 2084 -> 16 0 30 2351 G 2354 2084 -> 15 0 31 2351 G 2354 2085 -> 16 0 31 2351 G 2352 2085 -> 15 0 29 2351 G 2364 2086 -> 16 0 29 2351 G 2365 2086 -> 15 0 30 2351 G 2365 2087 -> 16 0 30 2351 G 2461 2087 -> 15 0 29 2351 G 2370 2088 -> 16 0 29 2351 G 2371 2088 -> 15 0 30 2351 G 2371 2089 -> 16 0 30 2351 G 2461 2089 -> 15 0 29 2351 G 2376 2090 -> 16 0 29 2351 G 2377 2090 -> 15 0 30 2351 G 2377 2091 -> 16 0 30 2351 G 2461 2091 -> 15 0 29 2351 G 2412 2092 -> 16 0 29 2351 G 2413 2092 -> 15 0 30 2351 G 2413 2093 -> 16 0 30 2351 G 2461 2093 -> 15 0 29 2351 G 2418 2094 -> 16 0 29 2351 G 2419 2094 -> 15 0 30 2351 G 2419 2095 -> 16 0 30 2351 G 2461 2095 -> 15 0 29 2351 G 2424 2096 -> 16 0 29 2351 G 2425 2096 -> 15 0 30 2351 G 2425 2097 -> 16 0 30 2351 G 2461 2097 -> 15 0 29 2351 G 2430 2098 -> 16 0 29 2351 G 2431 2098 -> 15 0 30 2351 G 2431 2099 -> 16 0 30 2351 G 2461 2099 -> 15 0 29 2351 G 2436 2100 -> 16 0 29 2351 G 2437 2100 -> 15 0 30 2351 G 2437 2101 -> 16 0 30 2351 G 2461 2101 -> 15 0 29 2351 G 2382 2102 -> 16 0 29 2351 G 2383 2102 -> 15 0 30 2351 G 2383 2103 -> 16 0 30 2351 G 2461 2103 -> 15 0 29 2351 G 2439 2104 -> 16 0 29 2351 G 2440 2104 -> 15 0 30 2351 G 2440 2105 -> 16 0 30 2351 G 2461 2105 -> 15 0 29 2351 G 2388 2106 -> 16 0 29 2351 G 2389 2106 -> 15 0 30 2351 G 2389 2107 -> 16 0 30 2351 G 2461 2107 -> 15 0 29 2351 G 2445 2108 -> 16 0 29 2351 G 2446 2108 -> 15 0 30 2351 G 2446 2109 -> 16 0 30 2351 G 2461 2109 -> 15 0 29 2351 G 2394 2110 -> 16 0 29 2351 G 2395 2110 -> 15 0 30 2351 G 2395 2111 -> 16 0 30 2351 G 2461 2111 -> 15 0 29 2351 G 2451 2112 -> 16 0 29 2351 G 2452 2112 -> 15 0 30 2351 G 2452 2113 -> 16 0 30 2351 G 2461 2113 -> 15 0 29 2351 G 2400 2114 -> 16 0 29 2351 G 2401 2114 -> 15 0 30 2351 G 2401 2115 -> 16 0 30 2351 G 2461 2115 -> 15 0 29 2351 G 2457 2116 -> 16 0 29 2351 G 2458 2116 -> 15 0 30 2351 G 2458 2117 -> 16 0 30 2351 G 2461 2117 -> 15 0 29 2351 G 2406 2118 -> 16 0 29 2351 G 2407 2118 -> 15 0 30 2351 G 2407 2119 -> 16 0 30 2351 G 2461 2119 -> 15 0 29 2351 G 2355 2120 -> 16 0 29 2351 G 2356 2120 -> 15 0 30 2351 G 2356 2121 -> 16 0 30 2351 G 2461 2121 -> 15 0 29 2351 G 2361 2122 -> 16 0 29 2351 G 2362 2122 -> 15 0 30 2351 G 2362 2123 -> 16 0 30 2351 G 2461 2123 -> 15 0 29 2351 G 2367 2124 -> 16 0 29 2351 G 2368 2124 -> 15 0 30 2351 G 2368 2125 -> 16 0 30 2351 G 2461 2125 -> 15 0 29 2351 G 2373 2126 -> 16 0 29 2351 G 2374 2126 -> 15 0 30 2351 G 2374 2127 -> 16 0 30 2351 G 2461 2127 -> 15 0 29 2351 G 2409 2128 -> 16 0 29 2351 G 2410 2128 -> 15 0 30 2351 G 2410 2129 -> 16 0 30 2351 G 2461 2129 -> 15 0 29 2351 G 2415 2130 -> 16 0 29 2351 G 2416 2130 -> 15 0 30 2351 G 2416 2131 -> 16 0 30 2351 G 2461 2131 -> 15 0 29 2351 G 2421 2132 -> 16 0 29 2351 G 2422 2132 -> 15 0 30 2351 G 2422 2133 -> 16 0 30 2351 G 2461 2133 -> 15 0 29 2351 G 2427 2134 -> 16 0 29 2351 G 2428 2134 -> 15 0 30 2351 G 2428 2135 -> 16 0 30 2351 G 2461 2135 -> 15 0 29 2351 G 2433 2136 -> 16 0 29 2351 G 2434 2136 -> 15 0 30 2351 G 2434 2137 -> 16 0 30 2351 G 2461 2137 -> 15 0 29 2351 G 2379 2138 -> 16 0 29 2351 G 2380 2138 -> 15 0 30 2351 G 2380 2139 -> 16 0 30 2351 G 2461 2139 -> 15 0 29 2351 G 2385 2140 -> 16 0 29 2351 G 2386 2140 -> 15 0 30 2351 G 2386 2141 -> 16 0 30 2351 G 2461 2141 -> 15 0 29 2351 G 2442 2142 -> 16 0 29 2351 G 2443 2142 -> 15 0 30 2351 G 2443 2143 -> 16 0 30 2351 G 2461 2143 -> 15 0 29 2351 G 2391 2144 -> 16 0 29 2351 G 2392 2144 -> 15 0 30 2351 G 2392 2145 -> 16 0 30 2351 G 2461 2145 -> 15 0 29 2351 G 2448 2146 -> 16 0 29 2351 G 2449 2146 -> 15 0 30 2351 G 2449 2147 -> 16 0 30 2351 G 2461 2147 -> 15 0 29 2351 G 2397 2148 -> 16 0 29 2351 G 2398 2148 -> 15 0 30 2351 G 2398 2149 -> 16 0 30 2351 G 2461 2149 -> 15 0 29 2351 G 2454 2150 -> 16 0 29 2351 G 2455 2150 -> 15 0 30 2351 G 2455 2151 -> 16 0 30 2351 G 2461 2151 -> 15 0 29 2351 G 2403 2152 -> 16 0 29 2351 G 2404 2152 -> 15 0 30 2351 G 2404 2153 -> 16 0 30 2351 G 2461 2153 -> 15 0 29 2573 G 2592 2154 -> 16 0 29 2573 G 2593 2154 -> 15 0 30 2573 G 2593 2155 -> 16 0 30 2573 G 2683 2155 -> 15 0 30 2573 G 2683 2156 -> 16 0 30 2573 G 2651 2156 -> 15 0 31 2573 G 2651 2157 -> 16 0 31 2573 G 2649 2157 -> 15 0 30 2573 G 2683 2158 -> 16 0 30 2573 G 2597 2158 -> 15 0 31 2573 G 2597 2159 -> 16 0 31 2573 G 2595 2159 -> 15 0 30 2573 G 2683 2160 -> 16 0 30 2573 G 2603 2160 -> 15 0 31 2573 G 2603 2161 -> 16 0 31 2573 G 2601 2161 -> 15 0 30 2573 G 2683 2162 -> 16 0 30 2573 G 2609 2162 -> 15 0 31 2573 G 2609 2163 -> 16 0 31 2573 G 2607 2163 -> 15 0 30 2573 G 2683 2164 -> 16 0 30 2573 G 2615 2164 -> 15 0 31 2573 G 2615 2165 -> 16 0 31 2573 G 2613 2165 -> 15 0 30 2573 G 2683 2166 -> 16 0 30 2573 G 2621 2166 -> 15 0 31 2573 G 2621 2167 -> 16 0 31 2573 G 2619 2167 -> 15 0 30 2573 G 2683 2168 -> 16 0 30 2573 G 2660 2168 -> 15 0 31 2573 G 2660 2169 -> 16 0 31 2573 G 2658 2169 -> 15 0 30 2573 G 2683 2170 -> 16 0 30 2573 G 2666 2170 -> 15 0 31 2573 G 2666 2171 -> 16 0 31 2573 G 2664 2171 -> 15 0 30 2573 G 2683 2172 -> 16 0 30 2573 G 2672 2172 -> 15 0 31 2573 G 2672 2173 -> 16 0 31 2573 G 2670 2173 -> 15 0 30 2573 G 2683 2174 -> 16 0 30 2573 G 2678 2174 -> 15 0 31 2573 G 2678 2175 -> 16 0 31 2573 G 2676 2175 -> 15 0 30 2573 G 2683 2176 -> 16 0 30 2573 G 2630 2176 -> 15 0 31 2573 G 2630 2177 -> 16 0 31 2573 G 2628 2177 -> 15 0 30 2573 G 2683 2178 -> 16 0 30 2573 G 2579 2178 -> 15 0 31 2573 G 2579 2179 -> 16 0 31 2573 G 2577 2179 -> 15 0 30 2573 G 2683 2180 -> 16 0 30 2573 G 2636 2180 -> 15 0 31 2573 G 2636 2181 -> 16 0 31 2573 G 2634 2181 -> 15 0 30 2573 G 2683 2182 -> 16 0 30 2573 G 2585 2182 -> 15 0 31 2573 G 2585 2183 -> 16 0 31 2573 G 2583 2183 -> 15 0 30 2573 G 2683 2184 -> 16 0 30 2573 G 2642 2184 -> 15 0 31 2573 G 2642 2185 -> 16 0 31 2573 G 2640 2185 -> 15 0 30 2573 G 2683 2186 -> 16 0 30 2573 G 2591 2186 -> 15 0 31 2573 G 2591 2187 -> 16 0 31 2573 G 2589 2187 -> 15 0 30 2573 G 2683 2188 -> 16 0 30 2573 G 2648 2188 -> 15 0 31 2573 G 2648 2189 -> 16 0 31 2573 G 2646 2189 -> 15 0 30 2573 G 2683 2190 -> 16 0 30 2573 G 2654 2190 -> 15 0 31 2573 G 2654 2191 -> 16 0 31 2573 G 2652 2191 -> 15 0 30 2573 G 2683 2192 -> 16 0 30 2573 G 2600 2192 -> 15 0 31 2573 G 2600 2193 -> 16 0 31 2573 G 2598 2193 -> 15 0 30 2573 G 2683 2194 -> 16 0 30 2573 G 2606 2194 -> 15 0 31 2573 G 2606 2195 -> 16 0 31 2573 G 2604 2195 -> 15 0 30 2573 G 2683 2196 -> 16 0 30 2573 G 2612 2196 -> 15 0 31 2573 G 2612 2197 -> 16 0 31 2573 G 2610 2197 -> 15 0 30 2573 G 2683 2198 -> 16 0 30 2573 G 2618 2198 -> 15 0 31 2573 G 2618 2199 -> 16 0 31 2573 G 2616 2199 -> 15 0 30 2573 G 2683 2200 -> 16 0 30 2573 G 2624 2200 -> 15 0 31 2573 G 2624 2201 -> 16 0 31 2573 G 2622 2201 -> 15 0 30 2573 G 2683 2202 -> 16 0 30 2573 G 2657 2202 -> 15 0 31 2573 G 2657 2203 -> 16 0 31 2573 G 2655 2203 -> 15 0 30 2573 G 2683 2204 -> 16 0 30 2573 G 2663 2204 -> 15 0 31 2573 G 2663 2205 -> 16 0 31 2573 G 2661 2205 -> 15 0 30 2573 G 2683 2206 -> 16 0 30 2573 G 2669 2206 -> 15 0 31 2573 G 2669 2207 -> 16 0 31 2573 G 2667 2207 -> 15 0 30 2573 G 2683 2208 -> 16 0 30 2573 G 2675 2208 -> 15 0 31 2573 G 2675 2209 -> 16 0 31 2573 G 2673 2209 -> 15 0 32 2573 G 2683 2210 -> 16 0 32 2573 G 2682 2210 -> 15 0 30 2573 G 2683 2211 -> 16 0 30 2573 G 2681 2211 -> 15 0 31 2573 G 2681 2212 -> 16 0 31 2573 G 2679 2212 -> 15 0 30 2573 G 2683 2213 -> 16 0 30 2573 G 2627 2213 -> 15 0 31 2573 G 2627 2214 -> 16 0 31 2573 G 2625 2214 -> 15 0 30 2573 G 2683 2215 -> 16 0 30 2573 G 2576 2215 -> 15 0 31 2573 G 2576 2216 -> 16 0 31 2573 G 2574 2216 -> 15 0 30 2573 G 2683 2217 -> 16 0 30 2573 G 2633 2217 -> 15 0 31 2573 G 2633 2218 -> 16 0 31 2573 G 2631 2218 -> 15 0 30 2573 G 2683 2219 -> 16 0 30 2573 G 2582 2219 -> 15 0 31 2573 G 2582 2220 -> 16 0 31 2573 G 2580 2220 -> 15 0 30 2573 G 2683 2221 -> 16 0 30 2573 G 2639 2221 -> 15 0 31 2573 G 2639 2222 -> 16 0 31 2573 G 2637 2222 -> 15 0 30 2573 G 2683 2223 -> 16 0 30 2573 G 2588 2223 -> 15 0 31 2573 G 2588 2224 -> 16 0 31 2573 G 2586 2224 -> 15 0 30 2573 G 2683 2225 -> 16 0 30 2573 G 2645 2225 -> 15 0 31 2573 G 2645 2226 -> 16 0 31 2573 G 2643 2226 -> 15 0 29 2573 G 2649 2227 -> 16 0 29 2573 G 2650 2227 -> 15 0 30 2573 G 2650 2228 -> 16 0 30 2573 G 2683 2228 -> 15 0 30 2573 G 2683 2229 -> 16 0 30 2573 G 2594 2229 -> 15 0 31 2573 G 2594 2230 -> 16 0 31 2573 G 2592 2230 -> 15 0 29 2573 G 2595 2231 -> 16 0 29 2573 G 2596 2231 -> 15 0 30 2573 G 2596 2232 -> 16 0 30 2573 G 2683 2232 -> 15 0 29 2573 G 2601 2233 -> 16 0 29 2573 G 2602 2233 -> 15 0 30 2573 G 2602 2234 -> 16 0 30 2573 G 2683 2234 -> 15 0 29 2573 G 2607 2235 -> 16 0 29 2573 G 2608 2235 -> 15 0 30 2573 G 2608 2236 -> 16 0 30 2573 G 2683 2236 -> 15 0 29 2573 G 2613 2237 -> 16 0 29 2573 G 2614 2237 -> 15 0 30 2573 G 2614 2238 -> 16 0 30 2573 G 2683 2238 -> 15 0 29 2573 G 2619 2239 -> 16 0 29 2573 G 2620 2239 -> 15 0 30 2573 G 2620 2240 -> 16 0 30 2573 G 2683 2240 -> 15 0 29 2573 G 2658 2241 -> 16 0 29 2573 G 2659 2241 -> 15 0 30 2573 G 2659 2242 -> 16 0 30 2573 G 2683 2242 -> 15 0 29 2573 G 2664 2243 -> 16 0 29 2573 G 2665 2243 -> 15 0 30 2573 G 2665 2244 -> 16 0 30 2573 G 2683 2244 -> 15 0 29 2573 G 2670 2245 -> 16 0 29 2573 G 2671 2245 -> 15 0 30 2573 G 2671 2246 -> 16 0 30 2573 G 2683 2246 -> 15 0 29 2573 G 2676 2247 -> 16 0 29 2573 G 2677 2247 -> 15 0 30 2573 G 2677 2248 -> 16 0 30 2573 G 2683 2248 -> 15 0 29 2573 G 2628 2249 -> 16 0 29 2573 G 2629 2249 -> 15 0 30 2573 G 2629 2250 -> 16 0 30 2573 G 2683 2250 -> 15 0 29 2573 G 2577 2251 -> 16 0 29 2573 G 2578 2251 -> 15 0 30 2573 G 2578 2252 -> 16 0 30 2573 G 2683 2252 -> 15 0 29 2573 G 2634 2253 -> 16 0 29 2573 G 2635 2253 -> 15 0 30 2573 G 2635 2254 -> 16 0 30 2573 G 2683 2254 -> 15 0 29 2573 G 2583 2255 -> 16 0 29 2573 G 2584 2255 -> 15 0 30 2573 G 2584 2256 -> 16 0 30 2573 G 2683 2256 -> 15 0 29 2573 G 2640 2257 -> 16 0 29 2573 G 2641 2257 -> 15 0 30 2573 G 2641 2258 -> 16 0 30 2573 G 2683 2258 -> 15 0 29 2573 G 2589 2259 -> 16 0 29 2573 G 2590 2259 -> 15 0 30 2573 G 2590 2260 -> 16 0 30 2573 G 2683 2260 -> 15 0 29 2573 G 2646 2261 -> 16 0 29 2573 G 2647 2261 -> 15 0 30 2573 G 2647 2262 -> 16 0 30 2573 G 2683 2262 -> 15 0 29 2573 G 2652 2263 -> 16 0 29 2573 G 2653 2263 -> 15 0 30 2573 G 2653 2264 -> 16 0 30 2573 G 2683 2264 -> 15 0 29 2573 G 2598 2265 -> 16 0 29 2573 G 2599 2265 -> 15 0 30 2573 G 2599 2266 -> 16 0 30 2573 G 2683 2266 -> 15 0 29 2573 G 2604 2267 -> 16 0 29 2573 G 2605 2267 -> 15 0 30 2573 G 2605 2268 -> 16 0 30 2573 G 2683 2268 -> 15 0 29 2573 G 2610 2269 -> 16 0 29 2573 G 2611 2269 -> 15 0 30 2573 G 2611 2270 -> 16 0 30 2573 G 2683 2270 -> 15 0 29 2573 G 2616 2271 -> 16 0 29 2573 G 2617 2271 -> 15 0 30 2573 G 2617 2272 -> 16 0 30 2573 G 2683 2272 -> 15 0 29 2573 G 2622 2273 -> 16 0 29 2573 G 2623 2273 -> 15 0 30 2573 G 2623 2274 -> 16 0 30 2573 G 2683 2274 -> 15 0 29 2573 G 2655 2275 -> 16 0 29 2573 G 2656 2275 -> 15 0 30 2573 G 2656 2276 -> 16 0 30 2573 G 2683 2276 -> 15 0 29 2573 G 2661 2277 -> 16 0 29 2573 G 2662 2277 -> 15 0 30 2573 G 2662 2278 -> 16 0 30 2573 G 2683 2278 -> 15 0 29 2573 G 2667 2279 -> 16 0 29 2573 G 2668 2279 -> 15 0 30 2573 G 2668 2280 -> 16 0 30 2573 G 2683 2280 -> 15 0 29 2573 G 2673 2281 -> 16 0 29 2573 G 2674 2281 -> 15 0 30 2573 G 2674 2282 -> 16 0 30 2573 G 2683 2282 -> 15 0 29 2573 G 2679 2283 -> 16 0 29 2573 G 2680 2283 -> 15 0 30 2573 G 2680 2284 -> 16 0 30 2573 G 2683 2284 -> 15 0 29 2573 G 2625 2285 -> 16 0 29 2573 G 2626 2285 -> 15 0 30 2573 G 2626 2286 -> 16 0 30 2573 G 2683 2286 -> 15 0 29 2573 G 2574 2287 -> 16 0 29 2573 G 2575 2287 -> 15 0 30 2573 G 2575 2288 -> 16 0 30 2573 G 2683 2288 -> 15 0 29 2573 G 2631 2289 -> 16 0 29 2573 G 2632 2289 -> 15 0 30 2573 G 2632 2290 -> 16 0 30 2573 G 2683 2290 -> 15 0 29 2573 G 2580 2291 -> 16 0 29 2573 G 2581 2291 -> 15 0 30 2573 G 2581 2292 -> 16 0 30 2573 G 2683 2292 -> 15 0 29 2573 G 2637 2293 -> 16 0 29 2573 G 2638 2293 -> 15 0 30 2573 G 2638 2294 -> 16 0 30 2573 G 2683 2294 -> 15 0 29 2573 G 2586 2295 -> 16 0 29 2573 G 2587 2295 -> 15 0 30 2573 G 2587 2296 -> 16 0 30 2573 G 2683 2296 -> 15 0 29 2573 G 2643 2297 -> 16 0 29 2573 G 2644 2297 -> 15 0 30 2573 G 2644 2298 -> 16 0 30 2573 G 2683 2298 -> 15 0 29 2795 G 2814 2299 -> 16 0 29 2795 G 2815 2299 -> 15 0 30 2795 G 2815 2300 -> 16 0 30 2795 G 2905 2300 -> 15 0 30 2795 G 2905 2301 -> 16 0 30 2795 G 2873 2301 -> 15 0 31 2795 G 2873 2302 -> 16 0 31 2795 G 2871 2302 -> 15 0 30 2795 G 2905 2303 -> 16 0 30 2795 G 2822 2303 -> 15 0 31 2795 G 2822 2304 -> 16 0 31 2795 G 2820 2304 -> 15 0 30 2795 G 2905 2305 -> 16 0 30 2795 G 2879 2305 -> 15 0 31 2795 G 2879 2306 -> 16 0 31 2795 G 2877 2306 -> 15 0 30 2795 G 2905 2307 -> 16 0 30 2795 G 2828 2307 -> 15 0 31 2795 G 2828 2308 -> 16 0 31 2795 G 2826 2308 -> 15 0 30 2795 G 2905 2309 -> 16 0 30 2795 G 2885 2309 -> 15 0 31 2795 G 2885 2310 -> 16 0 31 2795 G 2883 2310 -> 15 0 30 2795 G 2905 2311 -> 16 0 30 2795 G 2834 2311 -> 15 0 31 2795 G 2834 2312 -> 16 0 31 2795 G 2832 2312 -> 15 0 30 2795 G 2905 2313 -> 16 0 30 2795 G 2891 2313 -> 15 0 31 2795 G 2891 2314 -> 16 0 31 2795 G 2889 2314 -> 15 0 30 2795 G 2905 2315 -> 16 0 30 2795 G 2840 2315 -> 15 0 31 2795 G 2840 2316 -> 16 0 31 2795 G 2838 2316 -> 15 0 30 2795 G 2905 2317 -> 16 0 30 2795 G 2897 2317 -> 15 0 31 2795 G 2897 2318 -> 16 0 31 2795 G 2895 2318 -> 15 0 30 2795 G 2905 2319 -> 16 0 30 2795 G 2843 2319 -> 15 0 31 2795 G 2843 2320 -> 16 0 31 2795 G 2841 2320 -> 15 0 30 2795 G 2905 2321 -> 16 0 30 2795 G 2849 2321 -> 15 0 31 2795 G 2849 2322 -> 16 0 31 2795 G 2847 2322 -> 15 0 32 2795 G 2905 2323 -> 16 0 32 2795 G 2904 2323 -> 15 0 30 2795 G 2905 2324 -> 16 0 30 2795 G 2798 2324 -> 15 0 31 2795 G 2798 2325 -> 16 0 31 2795 G 2796 2325 -> 15 0 30 2795 G 2905 2326 -> 16 0 30 2795 G 2855 2326 -> 15 0 31 2795 G 2855 2327 -> 16 0 31 2795 G 2853 2327 -> 15 0 30 2795 G 2905 2328 -> 16 0 30 2795 G 2804 2328 -> 15 0 31 2795 G 2804 2329 -> 16 0 31 2795 G 2802 2329 -> 15 0 30 2795 G 2905 2330 -> 16 0 30 2795 G 2861 2330 -> 15 0 31 2795 G 2861 2331 -> 16 0 31 2795 G 2859 2331 -> 15 0 30 2795 G 2905 2332 -> 16 0 30 2795 G 2810 2332 -> 15 0 31 2795 G 2810 2333 -> 16 0 31 2795 G 2808 2333 -> 15 0 30 2795 G 2905 2334 -> 16 0 30 2795 G 2867 2334 -> 15 0 31 2795 G 2867 2335 -> 16 0 31 2795 G 2865 2335 -> 15 0 30 2795 G 2905 2336 -> 16 0 30 2795 G 2813 2336 -> 15 0 31 2795 G 2813 2337 -> 16 0 31 2795 G 2811 2337 -> 15 0 30 2795 G 2905 2338 -> 16 0 30 2795 G 2819 2338 -> 15 0 31 2795 G 2819 2339 -> 16 0 31 2795 G 2817 2339 -> 15 0 30 2795 G 2905 2340 -> 16 0 30 2795 G 2876 2340 -> 15 0 31 2795 G 2876 2341 -> 16 0 31 2795 G 2874 2341 -> 15 0 30 2795 G 2905 2342 -> 16 0 30 2795 G 2825 2342 -> 15 0 31 2795 G 2825 2343 -> 16 0 31 2795 G 2823 2343 -> 15 0 30 2795 G 2905 2344 -> 16 0 30 2795 G 2882 2344 -> 15 0 31 2795 G 2882 2345 -> 16 0 31 2795 G 2880 2345 -> 15 0 30 2795 G 2905 2346 -> 16 0 30 2795 G 2831 2346 -> 15 0 31 2795 G 2831 2347 -> 16 0 31 2795 G 2829 2347 -> 15 0 30 2795 G 2905 2348 -> 16 0 30 2795 G 2888 2348 -> 15 0 31 2795 G 2888 2349 -> 16 0 31 2795 G 2886 2349 -> 15 0 30 2795 G 2905 2350 -> 16 0 30 2795 G 2837 2350 -> 15 0 31 2795 G 2837 2351 -> 16 0 31 2795 G 2835 2351 -> 15 0 30 2795 G 2905 2352 -> 16 0 30 2795 G 2894 2352 -> 15 0 31 2795 G 2894 2353 -> 16 0 31 2795 G 2892 2353 -> 15 0 30 2795 G 2905 2354 -> 16 0 30 2795 G 2900 2354 -> 15 0 31 2795 G 2900 2355 -> 16 0 31 2795 G 2898 2355 -> 15 0 30 2795 G 2905 2356 -> 16 0 30 2795 G 2846 2356 -> 15 0 31 2795 G 2846 2357 -> 16 0 31 2795 G 2844 2357 -> 15 0 30 2795 G 2905 2358 -> 16 0 30 2795 G 2903 2358 -> 15 0 31 2795 G 2903 2359 -> 16 0 31 2795 G 2901 2359 -> 15 0 30 2795 G 2905 2360 -> 16 0 30 2795 G 2852 2360 -> 15 0 31 2795 G 2852 2361 -> 16 0 31 2795 G 2850 2361 -> 15 0 30 2795 G 2905 2362 -> 16 0 30 2795 G 2801 2362 -> 15 0 31 2795 G 2801 2363 -> 16 0 31 2795 G 2799 2363 -> 15 0 30 2795 G 2905 2364 -> 16 0 30 2795 G 2858 2364 -> 15 0 31 2795 G 2858 2365 -> 16 0 31 2795 G 2856 2365 -> 15 0 30 2795 G 2905 2366 -> 16 0 30 2795 G 2807 2366 -> 15 0 31 2795 G 2807 2367 -> 16 0 31 2795 G 2805 2367 -> 15 0 30 2795 G 2905 2368 -> 16 0 30 2795 G 2864 2368 -> 15 0 31 2795 G 2864 2369 -> 16 0 31 2795 G 2862 2369 -> 15 0 30 2795 G 2905 2370 -> 16 0 30 2795 G 2870 2370 -> 15 0 31 2795 G 2870 2371 -> 16 0 31 2795 G 2868 2371 -> 15 0 29 2795 G 2871 2372 -> 16 0 29 2795 G 2872 2372 -> 15 0 30 2795 G 2872 2373 -> 16 0 30 2795 G 2905 2373 -> 15 0 30 2795 G 2905 2374 -> 16 0 30 2795 G 2816 2374 -> 15 0 31 2795 G 2816 2375 -> 16 0 31 2795 G 2814 2375 -> 15 0 29 2795 G 2820 2376 -> 16 0 29 2795 G 2821 2376 -> 15 0 30 2795 G 2821 2377 -> 16 0 30 2795 G 2905 2377 -> 15 0 29 2795 G 2877 2378 -> 16 0 29 2795 G 2878 2378 -> 15 0 30 2795 G 2878 2379 -> 16 0 30 2795 G 2905 2379 -> 15 0 29 2795 G 2826 2380 -> 16 0 29 2795 G 2827 2380 -> 15 0 30 2795 G 2827 2381 -> 16 0 30 2795 G 2905 2381 -> 15 0 29 2795 G 2883 2382 -> 16 0 29 2795 G 2884 2382 -> 15 0 30 2795 G 2884 2383 -> 16 0 30 2795 G 2905 2383 -> 15 0 29 2795 G 2832 2384 -> 16 0 29 2795 G 2833 2384 -> 15 0 30 2795 G 2833 2385 -> 16 0 30 2795 G 2905 2385 -> 15 0 29 2795 G 2889 2386 -> 16 0 29 2795 G 2890 2386 -> 15 0 30 2795 G 2890 2387 -> 16 0 30 2795 G 2905 2387 -> 15 0 29 2795 G 2838 2388 -> 16 0 29 2795 G 2839 2388 -> 15 0 30 2795 G 2839 2389 -> 16 0 30 2795 G 2905 2389 -> 15 0 29 2795 G 2895 2390 -> 16 0 29 2795 G 2896 2390 -> 15 0 30 2795 G 2896 2391 -> 16 0 30 2795 G 2905 2391 -> 15 0 29 2795 G 2841 2392 -> 16 0 29 2795 G 2842 2392 -> 15 0 30 2795 G 2842 2393 -> 16 0 30 2795 G 2905 2393 -> 15 0 29 2795 G 2847 2394 -> 16 0 29 2795 G 2848 2394 -> 15 0 30 2795 G 2848 2395 -> 16 0 30 2795 G 2905 2395 -> 15 0 29 2795 G 2796 2396 -> 16 0 29 2795 G 2797 2396 -> 15 0 30 2795 G 2797 2397 -> 16 0 30 2795 G 2905 2397 -> 15 0 29 2795 G 2853 2398 -> 16 0 29 2795 G 2854 2398 -> 15 0 30 2795 G 2854 2399 -> 16 0 30 2795 G 2905 2399 -> 15 0 29 2795 G 2802 2400 -> 16 0 29 2795 G 2803 2400 -> 15 0 30 2795 G 2803 2401 -> 16 0 30 2795 G 2905 2401 -> 15 0 29 2795 G 2859 2402 -> 16 0 29 2795 G 2860 2402 -> 15 0 30 2795 G 2860 2403 -> 16 0 30 2795 G 2905 2403 -> 15 0 29 2795 G 2808 2404 -> 16 0 29 2795 G 2809 2404 -> 15 0 30 2795 G 2809 2405 -> 16 0 30 2795 G 2905 2405 -> 15 0 29 2795 G 2865 2406 -> 16 0 29 2795 G 2866 2406 -> 15 0 30 2795 G 2866 2407 -> 16 0 30 2795 G 2905 2407 -> 15 0 29 2795 G 2811 2408 -> 16 0 29 2795 G 2812 2408 -> 15 0 30 2795 G 2812 2409 -> 16 0 30 2795 G 2905 2409 -> 15 0 29 2795 G 2817 2410 -> 16 0 29 2795 G 2818 2410 -> 15 0 30 2795 G 2818 2411 -> 16 0 30 2795 G 2905 2411 -> 15 0 29 2795 G 2874 2412 -> 16 0 29 2795 G 2875 2412 -> 15 0 30 2795 G 2875 2413 -> 16 0 30 2795 G 2905 2413 -> 15 0 29 2795 G 2823 2414 -> 16 0 29 2795 G 2824 2414 -> 15 0 30 2795 G 2824 2415 -> 16 0 30 2795 G 2905 2415 -> 15 0 29 2795 G 2880 2416 -> 16 0 29 2795 G 2881 2416 -> 15 0 30 2795 G 2881 2417 -> 16 0 30 2795 G 2905 2417 -> 15 0 29 2795 G 2829 2418 -> 16 0 29 2795 G 2830 2418 -> 15 0 30 2795 G 2830 2419 -> 16 0 30 2795 G 2905 2419 -> 15 0 29 2795 G 2886 2420 -> 16 0 29 2795 G 2887 2420 -> 15 0 30 2795 G 2887 2421 -> 16 0 30 2795 G 2905 2421 -> 15 0 29 2795 G 2835 2422 -> 16 0 29 2795 G 2836 2422 -> 15 0 30 2795 G 2836 2423 -> 16 0 30 2795 G 2905 2423 -> 15 0 29 2795 G 2892 2424 -> 16 0 29 2795 G 2893 2424 -> 15 0 30 2795 G 2893 2425 -> 16 0 30 2795 G 2905 2425 -> 15 0 29 2795 G 2898 2426 -> 16 0 29 2795 G 2899 2426 -> 15 0 30 2795 G 2899 2427 -> 16 0 30 2795 G 2905 2427 -> 15 0 29 2795 G 2844 2428 -> 16 0 29 2795 G 2845 2428 -> 15 0 30 2795 G 2845 2429 -> 16 0 30 2795 G 2905 2429 -> 15 0 29 2795 G 2901 2430 -> 16 0 29 2795 G 2902 2430 -> 15 0 30 2795 G 2902 2431 -> 16 0 30 2795 G 2905 2431 -> 15 0 29 2795 G 2850 2432 -> 16 0 29 2795 G 2851 2432 -> 15 0 30 2795 G 2851 2433 -> 16 0 30 2795 G 2905 2433 -> 15 0 29 2795 G 2799 2434 -> 16 0 29 2795 G 2800 2434 -> 15 0 30 2795 G 2800 2435 -> 16 0 30 2795 G 2905 2435 -> 15 0 29 2795 G 2856 2436 -> 16 0 29 2795 G 2857 2436 -> 15 0 30 2795 G 2857 2437 -> 16 0 30 2795 G 2905 2437 -> 15 0 29 2795 G 2805 2438 -> 16 0 29 2795 G 2806 2438 -> 15 0 30 2795 G 2806 2439 -> 16 0 30 2795 G 2905 2439 -> 15 0 29 2795 G 2862 2440 -> 16 0 29 2795 G 2863 2440 -> 15 0 30 2795 G 2863 2441 -> 16 0 30 2795 G 2905 2441 -> 15 0 29 2795 G 2868 2442 -> 16 0 29 2795 G 2869 2442 -> 15 0 30 2795 G 2869 2443 -> 16 0 30 2795 G 2905 2443 -> 15 0 29 2981 G 3021 2444 -> 16 0 29 2981 G 3022 2444 -> 15 0 30 2981 G 3022 2445 -> 16 0 30 2981 G 3091 2445 -> 15 0 30 2981 G 3091 2446 -> 16 0 30 2981 G 3029 2446 -> 15 0 31 2981 G 3029 2447 -> 16 0 31 2981 G 3027 2447 -> 15 0 30 2981 G 3091 2448 -> 16 0 30 2981 G 3086 2448 -> 15 0 31 2981 G 3086 2449 -> 16 0 31 2981 G 3084 2449 -> 15 0 30 2981 G 3091 2450 -> 16 0 30 2981 G 3035 2450 -> 15 0 31 2981 G 3035 2451 -> 16 0 31 2981 G 3033 2451 -> 15 0 30 2981 G 3091 2452 -> 16 0 30 2981 G 2984 2452 -> 15 0 31 2981 G 2984 2453 -> 16 0 31 2981 G 2982 2453 -> 15 0 30 2981 G 3091 2454 -> 16 0 30 2981 G 3041 2454 -> 15 0 31 2981 G 3041 2455 -> 16 0 31 2981 G 3039 2455 -> 15 0 30 2981 G 3091 2456 -> 16 0 30 2981 G 2990 2456 -> 15 0 31 2981 G 2990 2457 -> 16 0 31 2981 G 2988 2457 -> 15 0 30 2981 G 3091 2458 -> 16 0 30 2981 G 3047 2458 -> 15 0 31 2981 G 3047 2459 -> 16 0 31 2981 G 3045 2459 -> 15 0 30 2981 G 3091 2460 -> 16 0 30 2981 G 2993 2460 -> 15 0 31 2981 G 2993 2461 -> 16 0 31 2981 G 2991 2461 -> 15 0 30 2981 G 3091 2462 -> 16 0 30 2981 G 2999 2462 -> 15 0 31 2981 G 2999 2463 -> 16 0 31 2981 G 2997 2463 -> 15 0 30 2981 G 3091 2464 -> 16 0 30 2981 G 3056 2464 -> 15 0 31 2981 G 3056 2465 -> 16 0 31 2981 G 3054 2465 -> 15 0 30 2981 G 3091 2466 -> 16 0 30 2981 G 3005 2466 -> 15 0 31 2981 G 3005 2467 -> 16 0 31 2981 G 3003 2467 -> 15 0 30 2981 G 3091 2468 -> 16 0 30 2981 G 3062 2468 -> 15 0 31 2981 G 3062 2469 -> 16 0 31 2981 G 3060 2469 -> 15 0 30 2981 G 3091 2470 -> 16 0 30 2981 G 3011 2470 -> 15 0 31 2981 G 3011 2471 -> 16 0 31 2981 G 3009 2471 -> 15 0 30 2981 G 3091 2472 -> 16 0 30 2981 G 3068 2472 -> 15 0 31 2981 G 3068 2473 -> 16 0 31 2981 G 3066 2473 -> 15 0 30 2981 G 3091 2474 -> 16 0 30 2981 G 3017 2474 -> 15 0 31 2981 G 3017 2475 -> 16 0 31 2981 G 3015 2475 -> 15 0 30 2981 G 3091 2476 -> 16 0 30 2981 G 3074 2476 -> 15 0 31 2981 G 3074 2477 -> 16 0 31 2981 G 3072 2477 -> 15 0 30 2981 G 3091 2478 -> 16 0 30 2981 G 3080 2478 -> 15 0 31 2981 G 3080 2479 -> 16 0 31 2981 G 3078 2479 -> 15 0 30 2981 G 3091 2480 -> 16 0 30 2981 G 3026 2480 -> 15 0 31 2981 G 3026 2481 -> 16 0 31 2981 G 3024 2481 -> 15 0 30 2981 G 3091 2482 -> 16 0 30 2981 G 3083 2482 -> 15 0 31 2981 G 3083 2483 -> 16 0 31 2981 G 3081 2483 -> 15 0 30 2981 G 3091 2484 -> 16 0 30 2981 G 3032 2484 -> 15 0 31 2981 G 3032 2485 -> 16 0 31 2981 G 3030 2485 -> 15 0 30 2981 G 3091 2486 -> 16 0 30 2981 G 3089 2486 -> 15 0 31 2981 G 3089 2487 -> 16 0 31 2981 G 3087 2487 -> 15 0 30 2981 G 3091 2488 -> 16 0 30 2981 G 3038 2488 -> 15 0 31 2981 G 3038 2489 -> 16 0 31 2981 G 3036 2489 -> 15 0 30 2981 G 3091 2490 -> 16 0 30 2981 G 2987 2490 -> 15 0 31 2981 G 2987 2491 -> 16 0 31 2981 G 2985 2491 -> 15 0 30 2981 G 3091 2492 -> 16 0 30 2981 G 3044 2492 -> 15 0 31 2981 G 3044 2493 -> 16 0 31 2981 G 3042 2493 -> 15 0 30 2981 G 3091 2494 -> 16 0 30 2981 G 3050 2494 -> 15 0 31 2981 G 3050 2495 -> 16 0 31 2981 G 3048 2495 -> 15 0 30 2981 G 3091 2496 -> 16 0 30 2981 G 2996 2496 -> 15 0 31 2981 G 2996 2497 -> 16 0 31 2981 G 2994 2497 -> 15 0 30 2981 G 3091 2498 -> 16 0 30 2981 G 3053 2498 -> 15 0 31 2981 G 3053 2499 -> 16 0 31 2981 G 3051 2499 -> 15 0 30 2981 G 3091 2500 -> 16 0 30 2981 G 3002 2500 -> 15 0 31 2981 G 3002 2501 -> 16 0 31 2981 G 3000 2501 -> 15 0 30 2981 G 3091 2502 -> 16 0 30 2981 G 3059 2502 -> 15 0 31 2981 G 3059 2503 -> 16 0 31 2981 G 3057 2503 -> 15 0 30 2981 G 3091 2504 -> 16 0 30 2981 G 3008 2504 -> 15 0 31 2981 G 3008 2505 -> 16 0 31 2981 G 3006 2505 -> 15 0 30 2981 G 3091 2506 -> 16 0 30 2981 G 3065 2506 -> 15 0 31 2981 G 3065 2507 -> 16 0 31 2981 G 3063 2507 -> 15 0 30 2981 G 3091 2508 -> 16 0 30 2981 G 3014 2508 -> 15 0 31 2981 G 3014 2509 -> 16 0 31 2981 G 3012 2509 -> 15 0 32 2981 G 3091 2510 -> 16 0 32 2981 G 3090 2510 -> 15 0 30 2981 G 3091 2511 -> 16 0 30 2981 G 3071 2511 -> 15 0 31 2981 G 3071 2512 -> 16 0 31 2981 G 3069 2512 -> 15 0 30 2981 G 3091 2513 -> 16 0 30 2981 G 3020 2513 -> 15 0 31 2981 G 3020 2514 -> 16 0 31 2981 G 3018 2514 -> 15 0 30 2981 G 3091 2515 -> 16 0 30 2981 G 3077 2515 -> 15 0 31 2981 G 3077 2516 -> 16 0 31 2981 G 3075 2516 -> 15 0 29 2981 G 3027 2517 -> 16 0 29 2981 G 3028 2517 -> 15 0 30 2981 G 3028 2518 -> 16 0 30 2981 G 3091 2518 -> 15 0 30 2981 G 3091 2519 -> 16 0 30 2981 G 3023 2519 -> 15 0 31 2981 G 3023 2520 -> 16 0 31 2981 G 3021 2520 -> 15 0 29 2981 G 3084 2521 -> 16 0 29 2981 G 3085 2521 -> 15 0 30 2981 G 3085 2522 -> 16 0 30 2981 G 3091 2522 -> 15 0 29 2981 G 3033 2523 -> 16 0 29 2981 G 3034 2523 -> 15 0 30 2981 G 3034 2524 -> 16 0 30 2981 G 3091 2524 -> 15 0 29 2981 G 2982 2525 -> 16 0 29 2981 G 2983 2525 -> 15 0 30 2981 G 2983 2526 -> 16 0 30 2981 G 3091 2526 -> 15 0 29 2981 G 3039 2527 -> 16 0 29 2981 G 3040 2527 -> 15 0 30 2981 G 3040 2528 -> 16 0 30 2981 G 3091 2528 -> 15 0 29 2981 G 2988 2529 -> 16 0 29 2981 G 2989 2529 -> 15 0 30 2981 G 2989 2530 -> 16 0 30 2981 G 3091 2530 -> 15 0 29 2981 G 3045 2531 -> 16 0 29 2981 G 3046 2531 -> 15 0 30 2981 G 3046 2532 -> 16 0 30 2981 G 3091 2532 -> 15 0 29 2981 G 2991 2533 -> 16 0 29 2981 G 2992 2533 -> 15 0 30 2981 G 2992 2534 -> 16 0 30 2981 G 3091 2534 -> 15 0 29 2981 G 2997 2535 -> 16 0 29 2981 G 2998 2535 -> 15 0 30 2981 G 2998 2536 -> 16 0 30 2981 G 3091 2536 -> 15 0 29 2981 G 3054 2537 -> 16 0 29 2981 G 3055 2537 -> 15 0 30 2981 G 3055 2538 -> 16 0 30 2981 G 3091 2538 -> 15 0 29 2981 G 3003 2539 -> 16 0 29 2981 G 3004 2539 -> 15 0 30 2981 G 3004 2540 -> 16 0 30 2981 G 3091 2540 -> 15 0 29 2981 G 3060 2541 -> 16 0 29 2981 G 3061 2541 -> 15 0 30 2981 G 3061 2542 -> 16 0 30 2981 G 3091 2542 -> 15 0 29 2981 G 3009 2543 -> 16 0 29 2981 G 3010 2543 -> 15 0 30 2981 G 3010 2544 -> 16 0 30 2981 G 3091 2544 -> 15 0 29 2981 G 3066 2545 -> 16 0 29 2981 G 3067 2545 -> 15 0 30 2981 G 3067 2546 -> 16 0 30 2981 G 3091 2546 -> 15 0 29 2981 G 3015 2547 -> 16 0 29 2981 G 3016 2547 -> 15 0 30 2981 G 3016 2548 -> 16 0 30 2981 G 3091 2548 -> 15 0 29 2981 G 3072 2549 -> 16 0 29 2981 G 3073 2549 -> 15 0 30 2981 G 3073 2550 -> 16 0 30 2981 G 3091 2550 -> 15 0 29 2981 G 3078 2551 -> 16 0 29 2981 G 3079 2551 -> 15 0 30 2981 G 3079 2552 -> 16 0 30 2981 G 3091 2552 -> 15 0 29 2981 G 3024 2553 -> 16 0 29 2981 G 3025 2553 -> 15 0 30 2981 G 3025 2554 -> 16 0 30 2981 G 3091 2554 -> 15 0 29 2981 G 3081 2555 -> 16 0 29 2981 G 3082 2555 -> 15 0 30 2981 G 3082 2556 -> 16 0 30 2981 G 3091 2556 -> 15 0 29 2981 G 3030 2557 -> 16 0 29 2981 G 3031 2557 -> 15 0 30 2981 G 3031 2558 -> 16 0 30 2981 G 3091 2558 -> 15 0 29 2981 G 3087 2559 -> 16 0 29 2981 G 3088 2559 -> 15 0 30 2981 G 3088 2560 -> 16 0 30 2981 G 3091 2560 -> 15 0 29 2981 G 3036 2561 -> 16 0 29 2981 G 3037 2561 -> 15 0 30 2981 G 3037 2562 -> 16 0 30 2981 G 3091 2562 -> 15 0 29 2981 G 2985 2563 -> 16 0 29 2981 G 2986 2563 -> 15 0 30 2981 G 2986 2564 -> 16 0 30 2981 G 3091 2564 -> 15 0 29 2981 G 3042 2565 -> 16 0 29 2981 G 3043 2565 -> 15 0 30 2981 G 3043 2566 -> 16 0 30 2981 G 3091 2566 -> 15 0 29 2981 G 3048 2567 -> 16 0 29 2981 G 3049 2567 -> 15 0 30 2981 G 3049 2568 -> 16 0 30 2981 G 3091 2568 -> 15 0 29 2981 G 2994 2569 -> 16 0 29 2981 G 2995 2569 -> 15 0 30 2981 G 2995 2570 -> 16 0 30 2981 G 3091 2570 -> 15 0 29 2981 G 3051 2571 -> 16 0 29 2981 G 3052 2571 -> 15 0 30 2981 G 3052 2572 -> 16 0 30 2981 G 3091 2572 -> 15 0 29 2981 G 3000 2573 -> 16 0 29 2981 G 3001 2573 -> 15 0 30 2981 G 3001 2574 -> 16 0 30 2981 G 3091 2574 -> 15 0 29 2981 G 3057 2575 -> 16 0 29 2981 G 3058 2575 -> 15 0 30 2981 G 3058 2576 -> 16 0 30 2981 G 3091 2576 -> 15 0 29 2981 G 3006 2577 -> 16 0 29 2981 G 3007 2577 -> 15 0 30 2981 G 3007 2578 -> 16 0 30 2981 G 3091 2578 -> 15 0 29 2981 G 3063 2579 -> 16 0 29 2981 G 3064 2579 -> 15 0 30 2981 G 3064 2580 -> 16 0 30 2981 G 3091 2580 -> 15 0 29 2981 G 3012 2581 -> 16 0 29 2981 G 3013 2581 -> 15 0 30 2981 G 3013 2582 -> 16 0 30 2981 G 3091 2582 -> 15 0 29 2981 G 3069 2583 -> 16 0 29 2981 G 3070 2583 -> 15 0 30 2981 G 3070 2584 -> 16 0 30 2981 G 3091 2584 -> 15 0 29 2981 G 3018 2585 -> 16 0 29 2981 G 3019 2585 -> 15 0 30 2981 G 3019 2586 -> 16 0 30 2981 G 3091 2586 -> 15 0 29 2981 G 3075 2587 -> 16 0 29 2981 G 3076 2587 -> 15 0 30 2981 G 3076 2588 -> 16 0 30 2981 G 3091 2588 -> 15 0 29 3293 G 3306 2589 -> 16 0 29 3293 G 3307 2589 -> 15 0 30 3293 G 3307 2590 -> 16 0 30 3293 G 3313 2590 -> 15 0 30 3293 G 3313 2591 -> 16 0 30 3293 G 3296 2591 -> 15 0 31 3293 G 3296 2592 -> 16 0 31 3293 G 3294 2592 -> 15 0 30 3293 G 3313 2593 -> 16 0 30 3293 G 3302 2593 -> 15 0 31 3293 G 3302 2594 -> 16 0 31 3293 G 3300 2594 -> 15 0 30 3293 G 3313 2595 -> 16 0 30 3293 G 3305 2595 -> 15 0 31 3293 G 3305 2596 -> 16 0 31 3293 G 3303 2596 -> 15 0 30 3293 G 3313 2597 -> 16 0 30 3293 G 3311 2597 -> 15 0 31 3293 G 3311 2598 -> 16 0 31 3293 G 3309 2598 -> 15 0 32 3293 G 3313 2599 -> 16 0 32 3293 G 3312 2599 -> 15 0 30 3293 G 3313 2600 -> 16 0 30 3293 G 3299 2600 -> 15 0 31 3293 G 3299 2601 -> 16 0 31 3293 G 3297 2601 -> 15 0 29 3293 G 3294 2602 -> 16 0 29 3293 G 3295 2602 -> 15 0 30 3293 G 3295 2603 -> 16 0 30 3293 G 3313 2603 -> 15 0 30 3293 G 3313 2604 -> 16 0 30 3293 G 3308 2604 -> 15 0 31 3293 G 3308 2605 -> 16 0 31 3293 G 3306 2605 -> 15 0 29 3293 G 3300 2606 -> 16 0 29 3293 G 3301 2606 -> 15 0 30 3293 G 3301 2607 -> 16 0 30 3293 G 3313 2607 -> 15 0 29 3293 G 3303 2608 -> 16 0 29 3293 G 3304 2608 -> 15 0 30 3293 G 3304 2609 -> 16 0 30 3293 G 3313 2609 -> 15 0 29 3293 G 3309 2610 -> 16 0 29 3293 G 3310 2610 -> 15 0 30 3293 G 3310 2611 -> 16 0 30 3293 G 3313 2611 -> 15 0 29 3293 G 3297 2612 -> 16 0 29 3293 G 3298 2612 -> 15 0 30 3293 G 3298 2613 -> 16 0 30 3293 G 3313 2613 -> 15 0 29 3203 G 3210 2614 -> 16 0 29 3203 G 3211 2614 -> 15 0 30 3203 G 3211 2615 -> 16 0 30 3203 G 3271 2615 -> 15 0 30 3203 G 3271 2616 -> 16 0 30 3203 G 3218 2616 -> 15 0 31 3203 G 3218 2617 -> 16 0 31 3203 G 3216 2617 -> 15 0 30 3203 G 3271 2618 -> 16 0 30 3203 G 3224 2618 -> 15 0 31 3203 G 3224 2619 -> 16 0 31 3203 G 3222 2619 -> 15 0 30 3203 G 3271 2620 -> 16 0 30 3203 G 3230 2620 -> 15 0 31 3203 G 3230 2621 -> 16 0 31 3203 G 3228 2621 -> 15 0 30 3203 G 3271 2622 -> 16 0 30 3203 G 3236 2622 -> 15 0 31 3203 G 3236 2623 -> 16 0 31 3203 G 3234 2623 -> 15 0 30 3203 G 3271 2624 -> 16 0 30 3203 G 3242 2624 -> 15 0 31 3203 G 3242 2625 -> 16 0 31 3203 G 3240 2625 -> 15 0 30 3203 G 3271 2626 -> 16 0 30 3203 G 3248 2626 -> 15 0 31 3203 G 3248 2627 -> 16 0 31 3203 G 3246 2627 -> 15 0 30 3203 G 3271 2628 -> 16 0 30 3203 G 3254 2628 -> 15 0 31 3203 G 3254 2629 -> 16 0 31 3203 G 3252 2629 -> 15 0 30 3203 G 3271 2630 -> 16 0 30 3203 G 3260 2630 -> 15 0 31 3203 G 3260 2631 -> 16 0 31 3203 G 3258 2631 -> 15 0 30 3203 G 3271 2632 -> 16 0 30 3203 G 3266 2632 -> 15 0 31 3203 G 3266 2633 -> 16 0 31 3203 G 3264 2633 -> 15 0 30 3203 G 3271 2634 -> 16 0 30 3203 G 3206 2634 -> 15 0 31 3203 G 3206 2635 -> 16 0 31 3203 G 3204 2635 -> 15 0 30 3203 G 3271 2636 -> 16 0 30 3203 G 3269 2636 -> 15 0 31 3203 G 3269 2637 -> 16 0 31 3203 G 3267 2637 -> 15 0 32 3203 G 3271 2638 -> 16 0 32 3203 G 3270 2638 -> 15 0 30 3203 G 3271 2639 -> 16 0 30 3203 G 3209 2639 -> 15 0 31 3203 G 3209 2640 -> 16 0 31 3203 G 3207 2640 -> 15 0 30 3203 G 3271 2641 -> 16 0 30 3203 G 3215 2641 -> 15 0 31 3203 G 3215 2642 -> 16 0 31 3203 G 3213 2642 -> 15 0 30 3203 G 3271 2643 -> 16 0 30 3203 G 3221 2643 -> 15 0 31 3203 G 3221 2644 -> 16 0 31 3203 G 3219 2644 -> 15 0 30 3203 G 3271 2645 -> 16 0 30 3203 G 3227 2645 -> 15 0 31 3203 G 3227 2646 -> 16 0 31 3203 G 3225 2646 -> 15 0 30 3203 G 3271 2647 -> 16 0 30 3203 G 3233 2647 -> 15 0 31 3203 G 3233 2648 -> 16 0 31 3203 G 3231 2648 -> 15 0 30 3203 G 3271 2649 -> 16 0 30 3203 G 3239 2649 -> 15 0 31 3203 G 3239 2650 -> 16 0 31 3203 G 3237 2650 -> 15 0 30 3203 G 3271 2651 -> 16 0 30 3203 G 3245 2651 -> 15 0 31 3203 G 3245 2652 -> 16 0 31 3203 G 3243 2652 -> 15 0 30 3203 G 3271 2653 -> 16 0 30 3203 G 3251 2653 -> 15 0 31 3203 G 3251 2654 -> 16 0 31 3203 G 3249 2654 -> 15 0 30 3203 G 3271 2655 -> 16 0 30 3203 G 3257 2655 -> 15 0 31 3203 G 3257 2656 -> 16 0 31 3203 G 3255 2656 -> 15 0 30 3203 G 3271 2657 -> 16 0 30 3203 G 3263 2657 -> 15 0 31 3203 G 3263 2658 -> 16 0 31 3203 G 3261 2658 -> 15 0 29 3203 G 3216 2659 -> 16 0 29 3203 G 3217 2659 -> 15 0 30 3203 G 3217 2660 -> 16 0 30 3203 G 3271 2660 -> 15 0 30 3203 G 3271 2661 -> 16 0 30 3203 G 3212 2661 -> 15 0 31 3203 G 3212 2662 -> 16 0 31 3203 G 3210 2662 -> 15 0 29 3203 G 3222 2663 -> 16 0 29 3203 G 3223 2663 -> 15 0 30 3203 G 3223 2664 -> 16 0 30 3203 G 3271 2664 -> 15 0 29 3203 G 3228 2665 -> 16 0 29 3203 G 3229 2665 -> 15 0 30 3203 G 3229 2666 -> 16 0 30 3203 G 3271 2666 -> 15 0 29 3203 G 3234 2667 -> 16 0 29 3203 G 3235 2667 -> 15 0 30 3203 G 3235 2668 -> 16 0 30 3203 G 3271 2668 -> 15 0 29 3203 G 3240 2669 -> 16 0 29 3203 G 3241 2669 -> 15 0 30 3203 G 3241 2670 -> 16 0 30 3203 G 3271 2670 -> 15 0 29 3203 G 3246 2671 -> 16 0 29 3203 G 3247 2671 -> 15 0 30 3203 G 3247 2672 -> 16 0 30 3203 G 3271 2672 -> 15 0 29 3203 G 3252 2673 -> 16 0 29 3203 G 3253 2673 -> 15 0 30 3203 G 3253 2674 -> 16 0 30 3203 G 3271 2674 -> 15 0 29 3203 G 3258 2675 -> 16 0 29 3203 G 3259 2675 -> 15 0 30 3203 G 3259 2676 -> 16 0 30 3203 G 3271 2676 -> 15 0 29 3203 G 3264 2677 -> 16 0 29 3203 G 3265 2677 -> 15 0 30 3203 G 3265 2678 -> 16 0 30 3203 G 3271 2678 -> 15 0 29 3203 G 3204 2679 -> 16 0 29 3203 G 3205 2679 -> 15 0 30 3203 G 3205 2680 -> 16 0 30 3203 G 3271 2680 -> 15 0 29 3203 G 3267 2681 -> 16 0 29 3203 G 3268 2681 -> 15 0 30 3203 G 3268 2682 -> 16 0 30 3203 G 3271 2682 -> 15 0 29 3203 G 3207 2683 -> 16 0 29 3203 G 3208 2683 -> 15 0 30 3203 G 3208 2684 -> 16 0 30 3203 G 3271 2684 -> 15 0 29 3203 G 3213 2685 -> 16 0 29 3203 G 3214 2685 -> 15 0 30 3203 G 3214 2686 -> 16 0 30 3203 G 3271 2686 -> 15 0 29 3203 G 3219 2687 -> 16 0 29 3203 G 3220 2687 -> 15 0 30 3203 G 3220 2688 -> 16 0 30 3203 G 3271 2688 -> 15 0 29 3203 G 3225 2689 -> 16 0 29 3203 G 3226 2689 -> 15 0 30 3203 G 3226 2690 -> 16 0 30 3203 G 3271 2690 -> 15 0 29 3203 G 3231 2691 -> 16 0 29 3203 G 3232 2691 -> 15 0 30 3203 G 3232 2692 -> 16 0 30 3203 G 3271 2692 -> 15 0 29 3203 G 3237 2693 -> 16 0 29 3203 G 3238 2693 -> 15 0 30 3203 G 3238 2694 -> 16 0 30 3203 G 3271 2694 -> 15 0 29 3203 G 3243 2695 -> 16 0 29 3203 G 3244 2695 -> 15 0 30 3203 G 3244 2696 -> 16 0 30 3203 G 3271 2696 -> 15 0 29 3203 G 3249 2697 -> 16 0 29 3203 G 3250 2697 -> 15 0 30 3203 G 3250 2698 -> 16 0 30 3203 G 3271 2698 -> 15 0 29 3203 G 3255 2699 -> 16 0 29 3203 G 3256 2699 -> 15 0 30 3203 G 3256 2700 -> 16 0 30 3203 G 3271 2700 -> 15 0 29 3203 G 3261 2701 -> 16 0 29 3203 G 3262 2701 -> 15 0 30 3203 G 3262 2702 -> 16 0 30 3203 G 3271 2702 -> 15 0 33 2462 G 2571 2703 -> 16 0 33 2462 G 2572 2703 -> 15 0 30 2462 G 2572 2704 -> 16 0 30 2462 G 2474 2704 -> 15 0 31 2462 G 2474 2705 -> 16 0 31 2462 G 2472 2705 -> 15 0 30 2462 G 2572 2706 -> 16 0 30 2462 G 2480 2706 -> 15 0 31 2462 G 2480 2707 -> 16 0 31 2462 G 2478 2707 -> 15 0 30 2462 G 2572 2708 -> 16 0 30 2462 G 2537 2708 -> 15 0 31 2462 G 2537 2709 -> 16 0 31 2462 G 2535 2709 -> 15 0 30 2462 G 2572 2710 -> 16 0 30 2462 G 2486 2710 -> 15 0 31 2462 G 2486 2711 -> 16 0 31 2462 G 2484 2711 -> 15 0 30 2462 G 2572 2712 -> 16 0 30 2462 G 2543 2712 -> 15 0 31 2462 G 2543 2713 -> 16 0 31 2462 G 2541 2713 -> 15 0 30 2462 G 2572 2714 -> 16 0 30 2462 G 2492 2714 -> 15 0 31 2462 G 2492 2715 -> 16 0 31 2462 G 2490 2715 -> 15 0 30 2462 G 2572 2716 -> 16 0 30 2462 G 2549 2716 -> 15 0 31 2462 G 2549 2717 -> 16 0 31 2462 G 2547 2717 -> 15 0 30 2462 G 2572 2718 -> 16 0 30 2462 G 2498 2718 -> 15 0 31 2462 G 2498 2719 -> 16 0 31 2462 G 2496 2719 -> 15 0 30 2462 G 2572 2720 -> 16 0 30 2462 G 2555 2720 -> 15 0 31 2462 G 2555 2721 -> 16 0 31 2462 G 2553 2721 -> 15 0 30 2462 G 2572 2722 -> 16 0 30 2462 G 2561 2722 -> 15 0 31 2462 G 2561 2723 -> 16 0 31 2462 G 2559 2723 -> 15 0 30 2462 G 2572 2724 -> 16 0 30 2462 G 2507 2724 -> 15 0 31 2462 G 2507 2725 -> 16 0 31 2462 G 2505 2725 -> 15 0 30 2462 G 2572 2726 -> 16 0 30 2462 G 2564 2726 -> 15 0 31 2462 G 2564 2727 -> 16 0 31 2462 G 2562 2727 -> 15 0 30 2462 G 2572 2728 -> 16 0 30 2462 G 2513 2728 -> 15 0 31 2462 G 2513 2729 -> 16 0 31 2462 G 2511 2729 -> 15 0 30 2462 G 2572 2730 -> 16 0 30 2462 G 2570 2730 -> 15 0 31 2462 G 2570 2731 -> 16 0 31 2462 G 2568 2731 -> 15 0 30 2462 G 2572 2732 -> 16 0 30 2462 G 2519 2732 -> 15 0 31 2462 G 2519 2733 -> 16 0 31 2462 G 2517 2733 -> 15 0 30 2462 G 2572 2734 -> 16 0 30 2462 G 2468 2734 -> 15 0 31 2462 G 2468 2735 -> 16 0 31 2462 G 2466 2735 -> 15 0 30 2462 G 2572 2736 -> 16 0 30 2462 G 2525 2736 -> 15 0 31 2462 G 2525 2737 -> 16 0 31 2462 G 2523 2737 -> 15 0 30 2462 G 2572 2738 -> 16 0 30 2462 G 2531 2738 -> 15 0 31 2462 G 2531 2739 -> 16 0 31 2462 G 2529 2739 -> 15 0 30 2462 G 2572 2740 -> 16 0 30 2462 G 2477 2740 -> 15 0 31 2462 G 2477 2741 -> 16 0 31 2462 G 2475 2741 -> 15 0 30 2462 G 2572 2742 -> 16 0 30 2462 G 2534 2742 -> 15 0 31 2462 G 2534 2743 -> 16 0 31 2462 G 2532 2743 -> 15 0 30 2462 G 2572 2744 -> 16 0 30 2462 G 2483 2744 -> 15 0 31 2462 G 2483 2745 -> 16 0 31 2462 G 2481 2745 -> 15 0 30 2462 G 2572 2746 -> 16 0 30 2462 G 2540 2746 -> 15 0 31 2462 G 2540 2747 -> 16 0 31 2462 G 2538 2747 -> 15 0 30 2462 G 2572 2748 -> 16 0 30 2462 G 2489 2748 -> 15 0 31 2462 G 2489 2749 -> 16 0 31 2462 G 2487 2749 -> 15 0 30 2462 G 2572 2750 -> 16 0 30 2462 G 2546 2750 -> 15 0 31 2462 G 2546 2751 -> 16 0 31 2462 G 2544 2751 -> 15 0 30 2462 G 2572 2752 -> 16 0 30 2462 G 2495 2752 -> 15 0 31 2462 G 2495 2753 -> 16 0 31 2462 G 2493 2753 -> 15 0 30 2462 G 2572 2754 -> 16 0 30 2462 G 2552 2754 -> 15 0 31 2462 G 2552 2755 -> 16 0 31 2462 G 2550 2755 -> 15 0 30 2462 G 2572 2756 -> 16 0 30 2462 G 2501 2756 -> 15 0 31 2462 G 2501 2757 -> 16 0 31 2462 G 2499 2757 -> 15 0 30 2462 G 2572 2758 -> 16 0 30 2462 G 2558 2758 -> 15 0 31 2462 G 2558 2759 -> 16 0 31 2462 G 2556 2759 -> 15 0 30 2462 G 2572 2760 -> 16 0 30 2462 G 2504 2760 -> 15 0 31 2462 G 2504 2761 -> 16 0 31 2462 G 2502 2761 -> 15 0 30 2462 G 2572 2762 -> 16 0 30 2462 G 2510 2762 -> 15 0 31 2462 G 2510 2763 -> 16 0 31 2462 G 2508 2763 -> 15 0 30 2462 G 2572 2764 -> 16 0 30 2462 G 2567 2764 -> 15 0 31 2462 G 2567 2765 -> 16 0 31 2462 G 2565 2765 -> 15 0 30 2462 G 2572 2766 -> 16 0 30 2462 G 2516 2766 -> 15 0 31 2462 G 2516 2767 -> 16 0 31 2462 G 2514 2767 -> 15 0 30 2462 G 2572 2768 -> 16 0 30 2462 G 2465 2768 -> 15 0 31 2462 G 2465 2769 -> 16 0 31 2462 G 2463 2769 -> 15 0 30 2462 G 2572 2770 -> 16 0 30 2462 G 2522 2770 -> 15 0 31 2462 G 2522 2771 -> 16 0 31 2462 G 2520 2771 -> 15 0 30 2462 G 2572 2772 -> 16 0 30 2462 G 2471 2772 -> 15 0 31 2462 G 2471 2773 -> 16 0 31 2462 G 2469 2773 -> 15 0 30 2462 G 2572 2774 -> 16 0 30 2462 G 2528 2774 -> 15 0 31 2462 G 2528 2775 -> 16 0 31 2462 G 2526 2775 -> 15 0 29 2462 G 2472 2776 -> 16 0 29 2462 G 2473 2776 -> 15 0 30 2462 G 2473 2777 -> 16 0 30 2462 G 2572 2777 -> 15 0 29 2462 G 2478 2778 -> 16 0 29 2462 G 2479 2778 -> 15 0 30 2462 G 2479 2779 -> 16 0 30 2462 G 2572 2779 -> 15 0 29 2462 G 2535 2780 -> 16 0 29 2462 G 2536 2780 -> 15 0 30 2462 G 2536 2781 -> 16 0 30 2462 G 2572 2781 -> 15 0 29 2462 G 2484 2782 -> 16 0 29 2462 G 2485 2782 -> 15 0 30 2462 G 2485 2783 -> 16 0 30 2462 G 2572 2783 -> 15 0 29 2462 G 2541 2784 -> 16 0 29 2462 G 2542 2784 -> 15 0 30 2462 G 2542 2785 -> 16 0 30 2462 G 2572 2785 -> 15 0 29 2462 G 2490 2786 -> 16 0 29 2462 G 2491 2786 -> 15 0 30 2462 G 2491 2787 -> 16 0 30 2462 G 2572 2787 -> 15 0 29 2462 G 2547 2788 -> 16 0 29 2462 G 2548 2788 -> 15 0 30 2462 G 2548 2789 -> 16 0 30 2462 G 2572 2789 -> 15 0 29 2462 G 2496 2790 -> 16 0 29 2462 G 2497 2790 -> 15 0 30 2462 G 2497 2791 -> 16 0 30 2462 G 2572 2791 -> 15 0 29 2462 G 2553 2792 -> 16 0 29 2462 G 2554 2792 -> 15 0 30 2462 G 2554 2793 -> 16 0 30 2462 G 2572 2793 -> 15 0 29 2462 G 2559 2794 -> 16 0 29 2462 G 2560 2794 -> 15 0 30 2462 G 2560 2795 -> 16 0 30 2462 G 2572 2795 -> 15 0 29 2462 G 2505 2796 -> 16 0 29 2462 G 2506 2796 -> 15 0 30 2462 G 2506 2797 -> 16 0 30 2462 G 2572 2797 -> 15 0 29 2462 G 2562 2798 -> 16 0 29 2462 G 2563 2798 -> 15 0 30 2462 G 2563 2799 -> 16 0 30 2462 G 2572 2799 -> 15 0 29 2462 G 2511 2800 -> 16 0 29 2462 G 2512 2800 -> 15 0 30 2462 G 2512 2801 -> 16 0 30 2462 G 2572 2801 -> 15 0 29 2462 G 2568 2802 -> 16 0 29 2462 G 2569 2802 -> 15 0 30 2462 G 2569 2803 -> 16 0 30 2462 G 2572 2803 -> 15 0 29 2462 G 2517 2804 -> 16 0 29 2462 G 2518 2804 -> 15 0 30 2462 G 2518 2805 -> 16 0 30 2462 G 2572 2805 -> 15 0 29 2462 G 2466 2806 -> 16 0 29 2462 G 2467 2806 -> 15 0 30 2462 G 2467 2807 -> 16 0 30 2462 G 2572 2807 -> 15 0 29 2462 G 2523 2808 -> 16 0 29 2462 G 2524 2808 -> 15 0 30 2462 G 2524 2809 -> 16 0 30 2462 G 2572 2809 -> 15 0 29 2462 G 2529 2810 -> 16 0 29 2462 G 2530 2810 -> 15 0 30 2462 G 2530 2811 -> 16 0 30 2462 G 2572 2811 -> 15 0 29 2462 G 2475 2812 -> 16 0 29 2462 G 2476 2812 -> 15 0 30 2462 G 2476 2813 -> 16 0 30 2462 G 2572 2813 -> 15 0 29 2462 G 2532 2814 -> 16 0 29 2462 G 2533 2814 -> 15 0 30 2462 G 2533 2815 -> 16 0 30 2462 G 2572 2815 -> 15 0 29 2462 G 2481 2816 -> 16 0 29 2462 G 2482 2816 -> 15 0 30 2462 G 2482 2817 -> 16 0 30 2462 G 2572 2817 -> 15 0 29 2462 G 2538 2818 -> 16 0 29 2462 G 2539 2818 -> 15 0 30 2462 G 2539 2819 -> 16 0 30 2462 G 2572 2819 -> 15 0 29 2462 G 2487 2820 -> 16 0 29 2462 G 2488 2820 -> 15 0 30 2462 G 2488 2821 -> 16 0 30 2462 G 2572 2821 -> 15 0 29 2462 G 2544 2822 -> 16 0 29 2462 G 2545 2822 -> 15 0 30 2462 G 2545 2823 -> 16 0 30 2462 G 2572 2823 -> 15 0 29 2462 G 2493 2824 -> 16 0 29 2462 G 2494 2824 -> 15 0 30 2462 G 2494 2825 -> 16 0 30 2462 G 2572 2825 -> 15 0 29 2462 G 2550 2826 -> 16 0 29 2462 G 2551 2826 -> 15 0 30 2462 G 2551 2827 -> 16 0 30 2462 G 2572 2827 -> 15 0 29 2462 G 2499 2828 -> 16 0 29 2462 G 2500 2828 -> 15 0 30 2462 G 2500 2829 -> 16 0 30 2462 G 2572 2829 -> 15 0 29 2462 G 2556 2830 -> 16 0 29 2462 G 2557 2830 -> 15 0 30 2462 G 2557 2831 -> 16 0 30 2462 G 2572 2831 -> 15 0 29 2462 G 2502 2832 -> 16 0 29 2462 G 2503 2832 -> 15 0 30 2462 G 2503 2833 -> 16 0 30 2462 G 2572 2833 -> 15 0 29 2462 G 2508 2834 -> 16 0 29 2462 G 2509 2834 -> 15 0 30 2462 G 2509 2835 -> 16 0 30 2462 G 2572 2835 -> 15 0 29 2462 G 2565 2836 -> 16 0 29 2462 G 2566 2836 -> 15 0 30 2462 G 2566 2837 -> 16 0 30 2462 G 2572 2837 -> 15 0 29 2462 G 2514 2838 -> 16 0 29 2462 G 2515 2838 -> 15 0 30 2462 G 2515 2839 -> 16 0 30 2462 G 2572 2839 -> 15 0 29 2462 G 2463 2840 -> 16 0 29 2462 G 2464 2840 -> 15 0 30 2462 G 2464 2841 -> 16 0 30 2462 G 2572 2841 -> 15 0 29 2462 G 2520 2842 -> 16 0 29 2462 G 2521 2842 -> 15 0 30 2462 G 2521 2843 -> 16 0 30 2462 G 2572 2843 -> 15 0 29 2462 G 2469 2844 -> 16 0 29 2462 G 2470 2844 -> 15 0 30 2462 G 2470 2845 -> 16 0 30 2462 G 2572 2845 -> 15 0 29 2462 G 2526 2846 -> 16 0 29 2462 G 2527 2846 -> 15 0 30 2462 G 2527 2847 -> 16 0 30 2462 G 2572 2847 -> 15 0 29 2684 G 2691 2848 -> 16 0 29 2684 G 2692 2848 -> 15 0 30 2684 G 2692 2849 -> 16 0 30 2684 G 2794 2849 -> 15 0 30 2684 G 2794 2850 -> 16 0 30 2684 G 2750 2850 -> 15 0 31 2684 G 2750 2851 -> 16 0 31 2684 G 2748 2851 -> 15 0 30 2684 G 2794 2852 -> 16 0 30 2684 G 2699 2852 -> 15 0 31 2684 G 2699 2853 -> 16 0 31 2684 G 2697 2853 -> 15 0 30 2684 G 2794 2854 -> 16 0 30 2684 G 2756 2854 -> 15 0 31 2684 G 2756 2855 -> 16 0 31 2684 G 2754 2855 -> 15 0 30 2684 G 2794 2856 -> 16 0 30 2684 G 2705 2856 -> 15 0 31 2684 G 2705 2857 -> 16 0 31 2684 G 2703 2857 -> 15 0 30 2684 G 2794 2858 -> 16 0 30 2684 G 2762 2858 -> 15 0 31 2684 G 2762 2859 -> 16 0 31 2684 G 2760 2859 -> 15 0 30 2684 G 2794 2860 -> 16 0 30 2684 G 2711 2860 -> 15 0 31 2684 G 2711 2861 -> 16 0 31 2684 G 2709 2861 -> 15 0 30 2684 G 2794 2862 -> 16 0 30 2684 G 2768 2862 -> 15 0 31 2684 G 2768 2863 -> 16 0 31 2684 G 2766 2863 -> 15 0 30 2684 G 2794 2864 -> 16 0 30 2684 G 2717 2864 -> 15 0 31 2684 G 2717 2865 -> 16 0 31 2684 G 2715 2865 -> 15 0 30 2684 G 2794 2866 -> 16 0 30 2684 G 2774 2866 -> 15 0 31 2684 G 2774 2867 -> 16 0 31 2684 G 2772 2867 -> 15 0 30 2684 G 2794 2868 -> 16 0 30 2684 G 2720 2868 -> 15 0 31 2684 G 2720 2869 -> 16 0 31 2684 G 2718 2869 -> 15 0 30 2684 G 2794 2870 -> 16 0 30 2684 G 2726 2870 -> 15 0 31 2684 G 2726 2871 -> 16 0 31 2684 G 2724 2871 -> 15 0 30 2684 G 2794 2872 -> 16 0 30 2684 G 2783 2872 -> 15 0 31 2684 G 2783 2873 -> 16 0 31 2684 G 2781 2873 -> 15 0 30 2684 G 2794 2874 -> 16 0 30 2684 G 2732 2874 -> 15 0 31 2684 G 2732 2875 -> 16 0 31 2684 G 2730 2875 -> 15 0 30 2684 G 2794 2876 -> 16 0 30 2684 G 2789 2876 -> 15 0 31 2684 G 2789 2877 -> 16 0 31 2684 G 2787 2877 -> 15 0 30 2684 G 2794 2878 -> 16 0 30 2684 G 2738 2878 -> 15 0 31 2684 G 2738 2879 -> 16 0 31 2684 G 2736 2879 -> 15 0 30 2684 G 2794 2880 -> 16 0 30 2684 G 2687 2880 -> 15 0 31 2684 G 2687 2881 -> 16 0 31 2684 G 2685 2881 -> 15 0 30 2684 G 2794 2882 -> 16 0 30 2684 G 2744 2882 -> 15 0 31 2684 G 2744 2883 -> 16 0 31 2684 G 2742 2883 -> 15 0 30 2684 G 2794 2884 -> 16 0 30 2684 G 2690 2884 -> 15 0 31 2684 G 2690 2885 -> 16 0 31 2684 G 2688 2885 -> 15 0 30 2684 G 2794 2886 -> 16 0 30 2684 G 2696 2886 -> 15 0 31 2684 G 2696 2887 -> 16 0 31 2684 G 2694 2887 -> 15 0 30 2684 G 2794 2888 -> 16 0 30 2684 G 2753 2888 -> 15 0 31 2684 G 2753 2889 -> 16 0 31 2684 G 2751 2889 -> 15 0 30 2684 G 2794 2890 -> 16 0 30 2684 G 2702 2890 -> 15 0 31 2684 G 2702 2891 -> 16 0 31 2684 G 2700 2891 -> 15 0 30 2684 G 2794 2892 -> 16 0 30 2684 G 2759 2892 -> 15 0 31 2684 G 2759 2893 -> 16 0 31 2684 G 2757 2893 -> 15 0 30 2684 G 2794 2894 -> 16 0 30 2684 G 2708 2894 -> 15 0 31 2684 G 2708 2895 -> 16 0 31 2684 G 2706 2895 -> 15 0 32 2684 G 2794 2896 -> 16 0 32 2684 G 2793 2896 -> 15 0 30 2684 G 2794 2897 -> 16 0 30 2684 G 2765 2897 -> 15 0 31 2684 G 2765 2898 -> 16 0 31 2684 G 2763 2898 -> 15 0 30 2684 G 2794 2899 -> 16 0 30 2684 G 2714 2899 -> 15 0 31 2684 G 2714 2900 -> 16 0 31 2684 G 2712 2900 -> 15 0 30 2684 G 2794 2901 -> 16 0 30 2684 G 2771 2901 -> 15 0 31 2684 G 2771 2902 -> 16 0 31 2684 G 2769 2902 -> 15 0 30 2684 G 2794 2903 -> 16 0 30 2684 G 2777 2903 -> 15 0 31 2684 G 2777 2904 -> 16 0 31 2684 G 2775 2904 -> 15 0 30 2684 G 2794 2905 -> 16 0 30 2684 G 2723 2905 -> 15 0 31 2684 G 2723 2906 -> 16 0 31 2684 G 2721 2906 -> 15 0 30 2684 G 2794 2907 -> 16 0 30 2684 G 2780 2907 -> 15 0 31 2684 G 2780 2908 -> 16 0 31 2684 G 2778 2908 -> 15 0 30 2684 G 2794 2909 -> 16 0 30 2684 G 2729 2909 -> 15 0 31 2684 G 2729 2910 -> 16 0 31 2684 G 2727 2910 -> 15 0 30 2684 G 2794 2911 -> 16 0 30 2684 G 2786 2911 -> 15 0 31 2684 G 2786 2912 -> 16 0 31 2684 G 2784 2912 -> 15 0 30 2684 G 2794 2913 -> 16 0 30 2684 G 2735 2913 -> 15 0 31 2684 G 2735 2914 -> 16 0 31 2684 G 2733 2914 -> 15 0 30 2684 G 2794 2915 -> 16 0 30 2684 G 2792 2915 -> 15 0 31 2684 G 2792 2916 -> 16 0 31 2684 G 2790 2916 -> 15 0 30 2684 G 2794 2917 -> 16 0 30 2684 G 2741 2917 -> 15 0 31 2684 G 2741 2918 -> 16 0 31 2684 G 2739 2918 -> 15 0 30 2684 G 2794 2919 -> 16 0 30 2684 G 2747 2919 -> 15 0 31 2684 G 2747 2920 -> 16 0 31 2684 G 2745 2920 -> 15 0 29 2684 G 2748 2921 -> 16 0 29 2684 G 2749 2921 -> 15 0 30 2684 G 2749 2922 -> 16 0 30 2684 G 2794 2922 -> 15 0 30 2684 G 2794 2923 -> 16 0 30 2684 G 2693 2923 -> 15 0 31 2684 G 2693 2924 -> 16 0 31 2684 G 2691 2924 -> 15 0 29 2684 G 2697 2925 -> 16 0 29 2684 G 2698 2925 -> 15 0 30 2684 G 2698 2926 -> 16 0 30 2684 G 2794 2926 -> 15 0 29 2684 G 2754 2927 -> 16 0 29 2684 G 2755 2927 -> 15 0 30 2684 G 2755 2928 -> 16 0 30 2684 G 2794 2928 -> 15 0 29 2684 G 2703 2929 -> 16 0 29 2684 G 2704 2929 -> 15 0 30 2684 G 2704 2930 -> 16 0 30 2684 G 2794 2930 -> 15 0 29 2684 G 2760 2931 -> 16 0 29 2684 G 2761 2931 -> 15 0 30 2684 G 2761 2932 -> 16 0 30 2684 G 2794 2932 -> 15 0 29 2684 G 2709 2933 -> 16 0 29 2684 G 2710 2933 -> 15 0 30 2684 G 2710 2934 -> 16 0 30 2684 G 2794 2934 -> 15 0 29 2684 G 2766 2935 -> 16 0 29 2684 G 2767 2935 -> 15 0 30 2684 G 2767 2936 -> 16 0 30 2684 G 2794 2936 -> 15 0 29 2684 G 2715 2937 -> 16 0 29 2684 G 2716 2937 -> 15 0 30 2684 G 2716 2938 -> 16 0 30 2684 G 2794 2938 -> 15 0 29 2684 G 2772 2939 -> 16 0 29 2684 G 2773 2939 -> 15 0 30 2684 G 2773 2940 -> 16 0 30 2684 G 2794 2940 -> 15 0 29 2684 G 2718 2941 -> 16 0 29 2684 G 2719 2941 -> 15 0 30 2684 G 2719 2942 -> 16 0 30 2684 G 2794 2942 -> 15 0 29 2684 G 2724 2943 -> 16 0 29 2684 G 2725 2943 -> 15 0 30 2684 G 2725 2944 -> 16 0 30 2684 G 2794 2944 -> 15 0 29 2684 G 2781 2945 -> 16 0 29 2684 G 2782 2945 -> 15 0 30 2684 G 2782 2946 -> 16 0 30 2684 G 2794 2946 -> 15 0 29 2684 G 2730 2947 -> 16 0 29 2684 G 2731 2947 -> 15 0 30 2684 G 2731 2948 -> 16 0 30 2684 G 2794 2948 -> 15 0 29 2684 G 2787 2949 -> 16 0 29 2684 G 2788 2949 -> 15 0 30 2684 G 2788 2950 -> 16 0 30 2684 G 2794 2950 -> 15 0 29 2684 G 2736 2951 -> 16 0 29 2684 G 2737 2951 -> 15 0 30 2684 G 2737 2952 -> 16 0 30 2684 G 2794 2952 -> 15 0 29 2684 G 2685 2953 -> 16 0 29 2684 G 2686 2953 -> 15 0 30 2684 G 2686 2954 -> 16 0 30 2684 G 2794 2954 -> 15 0 29 2684 G 2742 2955 -> 16 0 29 2684 G 2743 2955 -> 15 0 30 2684 G 2743 2956 -> 16 0 30 2684 G 2794 2956 -> 15 0 29 2684 G 2688 2957 -> 16 0 29 2684 G 2689 2957 -> 15 0 30 2684 G 2689 2958 -> 16 0 30 2684 G 2794 2958 -> 15 0 29 2684 G 2694 2959 -> 16 0 29 2684 G 2695 2959 -> 15 0 30 2684 G 2695 2960 -> 16 0 30 2684 G 2794 2960 -> 15 0 29 2684 G 2751 2961 -> 16 0 29 2684 G 2752 2961 -> 15 0 30 2684 G 2752 2962 -> 16 0 30 2684 G 2794 2962 -> 15 0 29 2684 G 2700 2963 -> 16 0 29 2684 G 2701 2963 -> 15 0 30 2684 G 2701 2964 -> 16 0 30 2684 G 2794 2964 -> 15 0 29 2684 G 2757 2965 -> 16 0 29 2684 G 2758 2965 -> 15 0 30 2684 G 2758 2966 -> 16 0 30 2684 G 2794 2966 -> 15 0 29 2684 G 2706 2967 -> 16 0 29 2684 G 2707 2967 -> 15 0 30 2684 G 2707 2968 -> 16 0 30 2684 G 2794 2968 -> 15 0 29 2684 G 2763 2969 -> 16 0 29 2684 G 2764 2969 -> 15 0 30 2684 G 2764 2970 -> 16 0 30 2684 G 2794 2970 -> 15 0 29 2684 G 2712 2971 -> 16 0 29 2684 G 2713 2971 -> 15 0 30 2684 G 2713 2972 -> 16 0 30 2684 G 2794 2972 -> 15 0 29 2684 G 2769 2973 -> 16 0 29 2684 G 2770 2973 -> 15 0 30 2684 G 2770 2974 -> 16 0 30 2684 G 2794 2974 -> 15 0 29 2684 G 2775 2975 -> 16 0 29 2684 G 2776 2975 -> 15 0 30 2684 G 2776 2976 -> 16 0 30 2684 G 2794 2976 -> 15 0 29 2684 G 2721 2977 -> 16 0 29 2684 G 2722 2977 -> 15 0 30 2684 G 2722 2978 -> 16 0 30 2684 G 2794 2978 -> 15 0 29 2684 G 2778 2979 -> 16 0 29 2684 G 2779 2979 -> 15 0 30 2684 G 2779 2980 -> 16 0 30 2684 G 2794 2980 -> 15 0 29 2684 G 2727 2981 -> 16 0 29 2684 G 2728 2981 -> 15 0 30 2684 G 2728 2982 -> 16 0 30 2684 G 2794 2982 -> 15 0 29 2684 G 2784 2983 -> 16 0 29 2684 G 2785 2983 -> 15 0 30 2684 G 2785 2984 -> 16 0 30 2684 G 2794 2984 -> 15 0 29 2684 G 2733 2985 -> 16 0 29 2684 G 2734 2985 -> 15 0 30 2684 G 2734 2986 -> 16 0 30 2684 G 2794 2986 -> 15 0 29 2684 G 2790 2987 -> 16 0 29 2684 G 2791 2987 -> 15 0 30 2684 G 2791 2988 -> 16 0 30 2684 G 2794 2988 -> 15 0 29 2684 G 2739 2989 -> 16 0 29 2684 G 2740 2989 -> 15 0 30 2684 G 2740 2990 -> 16 0 30 2684 G 2794 2990 -> 15 0 29 2684 G 2745 2991 -> 16 0 29 2684 G 2746 2991 -> 15 0 30 2684 G 2746 2992 -> 16 0 30 2684 G 2794 2992 -> 15 0 29 2906 G 2961 2993 -> 16 0 29 2906 G 2962 2993 -> 15 0 30 2906 G 2962 2994 -> 16 0 30 2906 G 2980 2994 -> 15 0 30 2906 G 2980 2995 -> 16 0 30 2906 G 2969 2995 -> 15 0 31 2906 G 2969 2996 -> 16 0 31 2906 G 2967 2996 -> 15 0 30 2906 G 2980 2997 -> 16 0 30 2906 G 2975 2997 -> 15 0 31 2906 G 2975 2998 -> 16 0 31 2906 G 2973 2998 -> 15 0 32 2906 G 2980 2999 -> 16 0 32 2906 G 2979 2999 -> 15 0 30 2906 G 2980 3000 -> 16 0 30 2906 G 2909 3000 -> 15 0 31 2906 G 2909 3001 -> 16 0 31 2906 G 2907 3001 -> 15 0 30 2906 G 2980 3002 -> 16 0 30 2906 G 2915 3002 -> 15 0 31 2906 G 2915 3003 -> 16 0 31 2906 G 2913 3003 -> 15 0 30 2906 G 2980 3004 -> 16 0 30 2906 G 2921 3004 -> 15 0 31 2906 G 2921 3005 -> 16 0 31 2906 G 2919 3005 -> 15 0 30 2906 G 2980 3006 -> 16 0 30 2906 G 2927 3006 -> 15 0 31 2906 G 2927 3007 -> 16 0 31 2906 G 2925 3007 -> 15 0 30 2906 G 2980 3008 -> 16 0 30 2906 G 2933 3008 -> 15 0 31 2906 G 2933 3009 -> 16 0 31 2906 G 2931 3009 -> 15 0 30 2906 G 2980 3010 -> 16 0 30 2906 G 2939 3010 -> 15 0 31 2906 G 2939 3011 -> 16 0 31 2906 G 2937 3011 -> 15 0 30 2906 G 2980 3012 -> 16 0 30 2906 G 2945 3012 -> 15 0 31 2906 G 2945 3013 -> 16 0 31 2906 G 2943 3013 -> 15 0 30 2906 G 2980 3014 -> 16 0 30 2906 G 2951 3014 -> 15 0 31 2906 G 2951 3015 -> 16 0 31 2906 G 2949 3015 -> 15 0 30 2906 G 2980 3016 -> 16 0 30 2906 G 2957 3016 -> 15 0 31 2906 G 2957 3017 -> 16 0 31 2906 G 2955 3017 -> 15 0 30 2906 G 2980 3018 -> 16 0 30 2906 G 2960 3018 -> 15 0 31 2906 G 2960 3019 -> 16 0 31 2906 G 2958 3019 -> 15 0 30 2906 G 2980 3020 -> 16 0 30 2906 G 2966 3020 -> 15 0 31 2906 G 2966 3021 -> 16 0 31 2906 G 2964 3021 -> 15 0 30 2906 G 2980 3022 -> 16 0 30 2906 G 2972 3022 -> 15 0 31 2906 G 2972 3023 -> 16 0 31 2906 G 2970 3023 -> 15 0 30 2906 G 2980 3024 -> 16 0 30 2906 G 2978 3024 -> 15 0 31 2906 G 2978 3025 -> 16 0 31 2906 G 2976 3025 -> 15 0 30 2906 G 2980 3026 -> 16 0 30 2906 G 2912 3026 -> 15 0 31 2906 G 2912 3027 -> 16 0 31 2906 G 2910 3027 -> 15 0 30 2906 G 2980 3028 -> 16 0 30 2906 G 2918 3028 -> 15 0 31 2906 G 2918 3029 -> 16 0 31 2906 G 2916 3029 -> 15 0 30 2906 G 2980 3030 -> 16 0 30 2906 G 2924 3030 -> 15 0 31 2906 G 2924 3031 -> 16 0 31 2906 G 2922 3031 -> 15 0 30 2906 G 2980 3032 -> 16 0 30 2906 G 2930 3032 -> 15 0 31 2906 G 2930 3033 -> 16 0 31 2906 G 2928 3033 -> 15 0 30 2906 G 2980 3034 -> 16 0 30 2906 G 2936 3034 -> 15 0 31 2906 G 2936 3035 -> 16 0 31 2906 G 2934 3035 -> 15 0 30 2906 G 2980 3036 -> 16 0 30 2906 G 2942 3036 -> 15 0 31 2906 G 2942 3037 -> 16 0 31 2906 G 2940 3037 -> 15 0 30 2906 G 2980 3038 -> 16 0 30 2906 G 2948 3038 -> 15 0 31 2906 G 2948 3039 -> 16 0 31 2906 G 2946 3039 -> 15 0 30 2906 G 2980 3040 -> 16 0 30 2906 G 2954 3040 -> 15 0 31 2906 G 2954 3041 -> 16 0 31 2906 G 2952 3041 -> 15 0 29 2906 G 2967 3042 -> 16 0 29 2906 G 2968 3042 -> 15 0 30 2906 G 2968 3043 -> 16 0 30 2906 G 2980 3043 -> 15 0 30 2906 G 2980 3044 -> 16 0 30 2906 G 2963 3044 -> 15 0 31 2906 G 2963 3045 -> 16 0 31 2906 G 2961 3045 -> 15 0 29 2906 G 2973 3046 -> 16 0 29 2906 G 2974 3046 -> 15 0 30 2906 G 2974 3047 -> 16 0 30 2906 G 2980 3047 -> 15 0 29 2906 G 2907 3048 -> 16 0 29 2906 G 2908 3048 -> 15 0 30 2906 G 2908 3049 -> 16 0 30 2906 G 2980 3049 -> 15 0 29 2906 G 2913 3050 -> 16 0 29 2906 G 2914 3050 -> 15 0 30 2906 G 2914 3051 -> 16 0 30 2906 G 2980 3051 -> 15 0 29 2906 G 2919 3052 -> 16 0 29 2906 G 2920 3052 -> 15 0 30 2906 G 2920 3053 -> 16 0 30 2906 G 2980 3053 -> 15 0 29 2906 G 2925 3054 -> 16 0 29 2906 G 2926 3054 -> 15 0 30 2906 G 2926 3055 -> 16 0 30 2906 G 2980 3055 -> 15 0 29 2906 G 2931 3056 -> 16 0 29 2906 G 2932 3056 -> 15 0 30 2906 G 2932 3057 -> 16 0 30 2906 G 2980 3057 -> 15 0 29 2906 G 2937 3058 -> 16 0 29 2906 G 2938 3058 -> 15 0 30 2906 G 2938 3059 -> 16 0 30 2906 G 2980 3059 -> 15 0 29 2906 G 2943 3060 -> 16 0 29 2906 G 2944 3060 -> 15 0 30 2906 G 2944 3061 -> 16 0 30 2906 G 2980 3061 -> 15 0 29 2906 G 2949 3062 -> 16 0 29 2906 G 2950 3062 -> 15 0 30 2906 G 2950 3063 -> 16 0 30 2906 G 2980 3063 -> 15 0 29 2906 G 2955 3064 -> 16 0 29 2906 G 2956 3064 -> 15 0 30 2906 G 2956 3065 -> 16 0 30 2906 G 2980 3065 -> 15 0 29 2906 G 2958 3066 -> 16 0 29 2906 G 2959 3066 -> 15 0 30 2906 G 2959 3067 -> 16 0 30 2906 G 2980 3067 -> 15 0 29 2906 G 2964 3068 -> 16 0 29 2906 G 2965 3068 -> 15 0 30 2906 G 2965 3069 -> 16 0 30 2906 G 2980 3069 -> 15 0 29 2906 G 2970 3070 -> 16 0 29 2906 G 2971 3070 -> 15 0 30 2906 G 2971 3071 -> 16 0 30 2906 G 2980 3071 -> 15 0 29 2906 G 2976 3072 -> 16 0 29 2906 G 2977 3072 -> 15 0 30 2906 G 2977 3073 -> 16 0 30 2906 G 2980 3073 -> 15 0 29 2906 G 2910 3074 -> 16 0 29 2906 G 2911 3074 -> 15 0 30 2906 G 2911 3075 -> 16 0 30 2906 G 2980 3075 -> 15 0 29 2906 G 2916 3076 -> 16 0 29 2906 G 2917 3076 -> 15 0 30 2906 G 2917 3077 -> 16 0 30 2906 G 2980 3077 -> 15 0 29 2906 G 2922 3078 -> 16 0 29 2906 G 2923 3078 -> 15 0 30 2906 G 2923 3079 -> 16 0 30 2906 G 2980 3079 -> 15 0 29 2906 G 2928 3080 -> 16 0 29 2906 G 2929 3080 -> 15 0 30 2906 G 2929 3081 -> 16 0 30 2906 G 2980 3081 -> 15 0 29 2906 G 2934 3082 -> 16 0 29 2906 G 2935 3082 -> 15 0 30 2906 G 2935 3083 -> 16 0 30 2906 G 2980 3083 -> 15 0 29 2906 G 2940 3084 -> 16 0 29 2906 G 2941 3084 -> 15 0 30 2906 G 2941 3085 -> 16 0 30 2906 G 2980 3085 -> 15 0 29 2906 G 2946 3086 -> 16 0 29 2906 G 2947 3086 -> 15 0 30 2906 G 2947 3087 -> 16 0 30 2906 G 2980 3087 -> 15 0 29 2906 G 2952 3088 -> 16 0 29 2906 G 2953 3088 -> 15 0 30 2906 G 2953 3089 -> 16 0 30 2906 G 2980 3089 -> 15 0 34 2350 G 3201 3090 -> 16 0 34 2350 G 3316 3090 -> 15 0 35 2350 G 3316 3091 -> 16 0 35 2350 G 3291 3091 -> 15 0 35 2350 G 3316 3092 -> 16 0 35 2350 G 2460 3092 -> 15 0 35 2350 G 3316 3093 -> 16 0 35 2350 G 2682 3093 -> 15 0 35 2350 G 3316 3094 -> 16 0 35 2350 G 2904 3094 -> 15 0 35 2350 G 3316 3095 -> 16 0 35 2350 G 3090 3095 -> 15 0 35 2350 G 3316 3096 -> 16 0 35 2350 G 3312 3096 -> 15 0 35 2350 G 3316 3097 -> 16 0 35 2350 G 3270 3097 -> 15 0 35 2350 G 3316 3098 -> 16 0 35 2350 G 3315 3098 -> 15 0 35 2350 G 3316 3099 -> 16 0 35 2350 G 2571 3099 -> 15 0 35 2350 G 3316 3100 -> 16 0 35 2350 G 2793 3100 -> 15 0 35 2350 G 3316 3101 -> 16 0 35 2350 G 2979 3101 -> 15 0 27 2349 G 3409 3102 -> 16 0 27 2349 G 3411 3102 -> 15 0 28 2349 G 3411 3103 -> 16 0 28 2349 G 3413 3103 -> 15 0 21 2349 G 3411 3104 -> 16 0 21 2349 G 3317 3104 -> 15 0 36 2349 G 3317 3105 -> 16 0 36 2349 G 3315 3105 -> 15 0 27 2349 G 3413 3106 -> 16 0 27 2349 G 3317 3106 -> 15 0 29 1608 G 1636 3107 -> 16 0 29 1608 G 1637 3107 -> 15 0 30 1608 G 1637 3108 -> 16 0 30 1608 G 1727 3108 -> 15 0 32 1608 G 1727 3109 -> 16 0 32 1608 G 1726 3109 -> 15 0 30 1608 G 1727 3110 -> 16 0 30 1608 G 1644 3110 -> 15 0 31 1608 G 1644 3111 -> 16 0 31 1608 G 1642 3111 -> 15 0 30 1608 G 1727 3112 -> 16 0 30 1608 G 1701 3112 -> 15 0 31 1608 G 1701 3113 -> 16 0 31 1608 G 1699 3113 -> 15 0 30 1608 G 1727 3114 -> 16 0 30 1608 G 1650 3114 -> 15 0 31 1608 G 1650 3115 -> 16 0 31 1608 G 1648 3115 -> 15 0 30 1608 G 1727 3116 -> 16 0 30 1608 G 1707 3116 -> 15 0 31 1608 G 1707 3117 -> 16 0 31 1608 G 1705 3117 -> 15 0 30 1608 G 1727 3118 -> 16 0 30 1608 G 1656 3118 -> 15 0 31 1608 G 1656 3119 -> 16 0 31 1608 G 1654 3119 -> 15 0 30 1608 G 1727 3120 -> 16 0 30 1608 G 1713 3120 -> 15 0 31 1608 G 1713 3121 -> 16 0 31 1608 G 1711 3121 -> 15 0 30 1608 G 1727 3122 -> 16 0 30 1608 G 1662 3122 -> 15 0 31 1608 G 1662 3123 -> 16 0 31 1608 G 1660 3123 -> 15 0 30 1608 G 1727 3124 -> 16 0 30 1608 G 1719 3124 -> 15 0 31 1608 G 1719 3125 -> 16 0 31 1608 G 1717 3125 -> 15 0 30 1608 G 1727 3126 -> 16 0 30 1608 G 1725 3126 -> 15 0 31 1608 G 1725 3127 -> 16 0 31 1608 G 1723 3127 -> 15 0 30 1608 G 1727 3128 -> 16 0 30 1608 G 1671 3128 -> 15 0 31 1608 G 1671 3129 -> 16 0 31 1608 G 1669 3129 -> 15 0 30 1608 G 1727 3130 -> 16 0 30 1608 G 1677 3130 -> 15 0 31 1608 G 1677 3131 -> 16 0 31 1608 G 1675 3131 -> 15 0 30 1608 G 1727 3132 -> 16 0 30 1608 G 1683 3132 -> 15 0 31 1608 G 1683 3133 -> 16 0 31 1608 G 1681 3133 -> 15 0 30 1608 G 1727 3134 -> 16 0 30 1608 G 1689 3134 -> 15 0 31 1608 G 1689 3135 -> 16 0 31 1608 G 1687 3135 -> 15 0 30 1608 G 1727 3136 -> 16 0 30 1608 G 1695 3136 -> 15 0 31 1608 G 1695 3137 -> 16 0 31 1608 G 1693 3137 -> 15 0 30 1608 G 1727 3138 -> 16 0 30 1608 G 1611 3138 -> 15 0 31 1608 G 1611 3139 -> 16 0 31 1608 G 1609 3139 -> 15 0 30 1608 G 1727 3140 -> 16 0 30 1608 G 1617 3140 -> 15 0 31 1608 G 1617 3141 -> 16 0 31 1608 G 1615 3141 -> 15 0 30 1608 G 1727 3142 -> 16 0 30 1608 G 1623 3142 -> 15 0 31 1608 G 1623 3143 -> 16 0 31 1608 G 1621 3143 -> 15 0 30 1608 G 1727 3144 -> 16 0 30 1608 G 1629 3144 -> 15 0 31 1608 G 1629 3145 -> 16 0 31 1608 G 1627 3145 -> 15 0 30 1608 G 1727 3146 -> 16 0 30 1608 G 1635 3146 -> 15 0 31 1608 G 1635 3147 -> 16 0 31 1608 G 1633 3147 -> 15 0 30 1608 G 1727 3148 -> 16 0 30 1608 G 1641 3148 -> 15 0 31 1608 G 1641 3149 -> 16 0 31 1608 G 1639 3149 -> 15 0 30 1608 G 1727 3150 -> 16 0 30 1608 G 1698 3150 -> 15 0 31 1608 G 1698 3151 -> 16 0 31 1608 G 1696 3151 -> 15 0 30 1608 G 1727 3152 -> 16 0 30 1608 G 1647 3152 -> 15 0 31 1608 G 1647 3153 -> 16 0 31 1608 G 1645 3153 -> 15 0 30 1608 G 1727 3154 -> 16 0 30 1608 G 1704 3154 -> 15 0 31 1608 G 1704 3155 -> 16 0 31 1608 G 1702 3155 -> 15 0 30 1608 G 1727 3156 -> 16 0 30 1608 G 1653 3156 -> 15 0 31 1608 G 1653 3157 -> 16 0 31 1608 G 1651 3157 -> 15 0 30 1608 G 1727 3158 -> 16 0 30 1608 G 1710 3158 -> 15 0 31 1608 G 1710 3159 -> 16 0 31 1608 G 1708 3159 -> 15 0 30 1608 G 1727 3160 -> 16 0 30 1608 G 1659 3160 -> 15 0 31 1608 G 1659 3161 -> 16 0 31 1608 G 1657 3161 -> 15 0 30 1608 G 1727 3162 -> 16 0 30 1608 G 1716 3162 -> 15 0 31 1608 G 1716 3163 -> 16 0 31 1608 G 1714 3163 -> 15 0 30 1608 G 1727 3164 -> 16 0 30 1608 G 1665 3164 -> 15 0 31 1608 G 1665 3165 -> 16 0 31 1608 G 1663 3165 -> 15 0 30 1608 G 1727 3166 -> 16 0 30 1608 G 1722 3166 -> 15 0 31 1608 G 1722 3167 -> 16 0 31 1608 G 1720 3167 -> 15 0 30 1608 G 1727 3168 -> 16 0 30 1608 G 1668 3168 -> 15 0 31 1608 G 1668 3169 -> 16 0 31 1608 G 1666 3169 -> 15 0 30 1608 G 1727 3170 -> 16 0 30 1608 G 1674 3170 -> 15 0 31 1608 G 1674 3171 -> 16 0 31 1608 G 1672 3171 -> 15 0 30 1608 G 1727 3172 -> 16 0 30 1608 G 1680 3172 -> 15 0 31 1608 G 1680 3173 -> 16 0 31 1608 G 1678 3173 -> 15 0 30 1608 G 1727 3174 -> 16 0 30 1608 G 1686 3174 -> 15 0 31 1608 G 1686 3175 -> 16 0 31 1608 G 1684 3175 -> 15 0 30 1608 G 1727 3176 -> 16 0 30 1608 G 1692 3176 -> 15 0 31 1608 G 1692 3177 -> 16 0 31 1608 G 1690 3177 -> 15 0 30 1608 G 1727 3178 -> 16 0 30 1608 G 1614 3178 -> 15 0 31 1608 G 1614 3179 -> 16 0 31 1608 G 1612 3179 -> 15 0 30 1608 G 1727 3180 -> 16 0 30 1608 G 1620 3180 -> 15 0 31 1608 G 1620 3181 -> 16 0 31 1608 G 1618 3181 -> 15 0 30 1608 G 1727 3182 -> 16 0 30 1608 G 1626 3182 -> 15 0 31 1608 G 1626 3183 -> 16 0 31 1608 G 1624 3183 -> 15 0 30 1608 G 1727 3184 -> 16 0 30 1608 G 1632 3184 -> 15 0 31 1608 G 1632 3185 -> 16 0 31 1608 G 1630 3185 -> 15 0 30 1608 G 1727 3186 -> 16 0 30 1608 G 1638 3186 -> 15 0 31 1608 G 1638 3187 -> 16 0 31 1608 G 1636 3187 -> 15 0 29 1608 G 1642 3188 -> 16 0 29 1608 G 1643 3188 -> 15 0 30 1608 G 1643 3189 -> 16 0 30 1608 G 1727 3189 -> 15 0 29 1608 G 1699 3190 -> 16 0 29 1608 G 1700 3190 -> 15 0 30 1608 G 1700 3191 -> 16 0 30 1608 G 1727 3191 -> 15 0 29 1608 G 1648 3192 -> 16 0 29 1608 G 1649 3192 -> 15 0 30 1608 G 1649 3193 -> 16 0 30 1608 G 1727 3193 -> 15 0 29 1608 G 1705 3194 -> 16 0 29 1608 G 1706 3194 -> 15 0 30 1608 G 1706 3195 -> 16 0 30 1608 G 1727 3195 -> 15 0 29 1608 G 1654 3196 -> 16 0 29 1608 G 1655 3196 -> 15 0 30 1608 G 1655 3197 -> 16 0 30 1608 G 1727 3197 -> 15 0 29 1608 G 1711 3198 -> 16 0 29 1608 G 1712 3198 -> 15 0 30 1608 G 1712 3199 -> 16 0 30 1608 G 1727 3199 -> 15 0 29 1608 G 1660 3200 -> 16 0 29 1608 G 1661 3200 -> 15 0 30 1608 G 1661 3201 -> 16 0 30 1608 G 1727 3201 -> 15 0 29 1608 G 1717 3202 -> 16 0 29 1608 G 1718 3202 -> 15 0 30 1608 G 1718 3203 -> 16 0 30 1608 G 1727 3203 -> 15 0 29 1608 G 1723 3204 -> 16 0 29 1608 G 1724 3204 -> 15 0 30 1608 G 1724 3205 -> 16 0 30 1608 G 1727 3205 -> 15 0 29 1608 G 1669 3206 -> 16 0 29 1608 G 1670 3206 -> 15 0 30 1608 G 1670 3207 -> 16 0 30 1608 G 1727 3207 -> 15 0 29 1608 G 1675 3208 -> 16 0 29 1608 G 1676 3208 -> 15 0 30 1608 G 1676 3209 -> 16 0 30 1608 G 1727 3209 -> 15 0 29 1608 G 1681 3210 -> 16 0 29 1608 G 1682 3210 -> 15 0 30 1608 G 1682 3211 -> 16 0 30 1608 G 1727 3211 -> 15 0 29 1608 G 1687 3212 -> 16 0 29 1608 G 1688 3212 -> 15 0 30 1608 G 1688 3213 -> 16 0 30 1608 G 1727 3213 -> 15 0 29 1608 G 1693 3214 -> 16 0 29 1608 G 1694 3214 -> 15 0 30 1608 G 1694 3215 -> 16 0 30 1608 G 1727 3215 -> 15 0 29 1608 G 1609 3216 -> 16 0 29 1608 G 1610 3216 -> 15 0 30 1608 G 1610 3217 -> 16 0 30 1608 G 1727 3217 -> 15 0 29 1608 G 1615 3218 -> 16 0 29 1608 G 1616 3218 -> 15 0 30 1608 G 1616 3219 -> 16 0 30 1608 G 1727 3219 -> 15 0 29 1608 G 1621 3220 -> 16 0 29 1608 G 1622 3220 -> 15 0 30 1608 G 1622 3221 -> 16 0 30 1608 G 1727 3221 -> 15 0 29 1608 G 1627 3222 -> 16 0 29 1608 G 1628 3222 -> 15 0 30 1608 G 1628 3223 -> 16 0 30 1608 G 1727 3223 -> 15 0 29 1608 G 1633 3224 -> 16 0 29 1608 G 1634 3224 -> 15 0 30 1608 G 1634 3225 -> 16 0 30 1608 G 1727 3225 -> 15 0 29 1608 G 1639 3226 -> 16 0 29 1608 G 1640 3226 -> 15 0 30 1608 G 1640 3227 -> 16 0 30 1608 G 1727 3227 -> 15 0 29 1608 G 1696 3228 -> 16 0 29 1608 G 1697 3228 -> 15 0 30 1608 G 1697 3229 -> 16 0 30 1608 G 1727 3229 -> 15 0 29 1608 G 1645 3230 -> 16 0 29 1608 G 1646 3230 -> 15 0 30 1608 G 1646 3231 -> 16 0 30 1608 G 1727 3231 -> 15 0 29 1608 G 1702 3232 -> 16 0 29 1608 G 1703 3232 -> 15 0 30 1608 G 1703 3233 -> 16 0 30 1608 G 1727 3233 -> 15 0 29 1608 G 1651 3234 -> 16 0 29 1608 G 1652 3234 -> 15 0 30 1608 G 1652 3235 -> 16 0 30 1608 G 1727 3235 -> 15 0 29 1608 G 1708 3236 -> 16 0 29 1608 G 1709 3236 -> 15 0 30 1608 G 1709 3237 -> 16 0 30 1608 G 1727 3237 -> 15 0 29 1608 G 1657 3238 -> 16 0 29 1608 G 1658 3238 -> 15 0 30 1608 G 1658 3239 -> 16 0 30 1608 G 1727 3239 -> 15 0 29 1608 G 1714 3240 -> 16 0 29 1608 G 1715 3240 -> 15 0 30 1608 G 1715 3241 -> 16 0 30 1608 G 1727 3241 -> 15 0 29 1608 G 1663 3242 -> 16 0 29 1608 G 1664 3242 -> 15 0 30 1608 G 1664 3243 -> 16 0 30 1608 G 1727 3243 -> 15 0 29 1608 G 1720 3244 -> 16 0 29 1608 G 1721 3244 -> 15 0 30 1608 G 1721 3245 -> 16 0 30 1608 G 1727 3245 -> 15 0 29 1608 G 1666 3246 -> 16 0 29 1608 G 1667 3246 -> 15 0 30 1608 G 1667 3247 -> 16 0 30 1608 G 1727 3247 -> 15 0 29 1608 G 1672 3248 -> 16 0 29 1608 G 1673 3248 -> 15 0 30 1608 G 1673 3249 -> 16 0 30 1608 G 1727 3249 -> 15 0 29 1608 G 1678 3250 -> 16 0 29 1608 G 1679 3250 -> 15 0 30 1608 G 1679 3251 -> 16 0 30 1608 G 1727 3251 -> 15 0 29 1608 G 1684 3252 -> 16 0 29 1608 G 1685 3252 -> 15 0 30 1608 G 1685 3253 -> 16 0 30 1608 G 1727 3253 -> 15 0 29 1608 G 1690 3254 -> 16 0 29 1608 G 1691 3254 -> 15 0 30 1608 G 1691 3255 -> 16 0 30 1608 G 1727 3255 -> 15 0 29 1608 G 1612 3256 -> 16 0 29 1608 G 1613 3256 -> 15 0 30 1608 G 1613 3257 -> 16 0 30 1608 G 1727 3257 -> 15 0 29 1608 G 1618 3258 -> 16 0 29 1608 G 1619 3258 -> 15 0 30 1608 G 1619 3259 -> 16 0 30 1608 G 1727 3259 -> 15 0 29 1608 G 1624 3260 -> 16 0 29 1608 G 1625 3260 -> 15 0 30 1608 G 1625 3261 -> 16 0 30 1608 G 1727 3261 -> 15 0 29 1608 G 1630 3262 -> 16 0 29 1608 G 1631 3262 -> 15 0 30 1608 G 1631 3263 -> 16 0 30 1608 G 1727 3263 -> 15 0 29 1728 G 1759 3264 -> 16 0 29 1728 G 1760 3264 -> 15 0 30 1728 G 1760 3265 -> 16 0 30 1728 G 1835 3265 -> 15 0 30 1728 G 1835 3266 -> 16 0 30 1728 G 1767 3266 -> 15 0 31 1728 G 1767 3267 -> 16 0 31 1728 G 1765 3267 -> 15 0 30 1728 G 1835 3268 -> 16 0 30 1728 G 1824 3268 -> 15 0 31 1728 G 1824 3269 -> 16 0 31 1728 G 1822 3269 -> 15 0 30 1728 G 1835 3270 -> 16 0 30 1728 G 1773 3270 -> 15 0 31 1728 G 1773 3271 -> 16 0 31 1728 G 1771 3271 -> 15 0 30 1728 G 1835 3272 -> 16 0 30 1728 G 1830 3272 -> 15 0 31 1728 G 1830 3273 -> 16 0 31 1728 G 1828 3273 -> 15 0 30 1728 G 1835 3274 -> 16 0 30 1728 G 1779 3274 -> 15 0 31 1728 G 1779 3275 -> 16 0 31 1728 G 1777 3275 -> 15 0 30 1728 G 1835 3276 -> 16 0 30 1728 G 1785 3276 -> 15 0 31 1728 G 1785 3277 -> 16 0 31 1728 G 1783 3277 -> 15 0 32 1728 G 1835 3278 -> 16 0 32 1728 G 1834 3278 -> 15 0 30 1728 G 1835 3279 -> 16 0 30 1728 G 1731 3279 -> 15 0 31 1728 G 1731 3280 -> 16 0 31 1728 G 1729 3280 -> 15 0 30 1728 G 1835 3281 -> 16 0 30 1728 G 1737 3281 -> 15 0 31 1728 G 1737 3282 -> 16 0 31 1728 G 1735 3282 -> 15 0 30 1728 G 1835 3283 -> 16 0 30 1728 G 1794 3283 -> 15 0 31 1728 G 1794 3284 -> 16 0 31 1728 G 1792 3284 -> 15 0 30 1728 G 1835 3285 -> 16 0 30 1728 G 1743 3285 -> 15 0 31 1728 G 1743 3286 -> 16 0 31 1728 G 1741 3286 -> 15 0 30 1728 G 1835 3287 -> 16 0 30 1728 G 1800 3287 -> 15 0 31 1728 G 1800 3288 -> 16 0 31 1728 G 1798 3288 -> 15 0 30 1728 G 1835 3289 -> 16 0 30 1728 G 1749 3289 -> 15 0 31 1728 G 1749 3290 -> 16 0 31 1728 G 1747 3290 -> 15 0 30 1728 G 1835 3291 -> 16 0 30 1728 G 1806 3291 -> 15 0 31 1728 G 1806 3292 -> 16 0 31 1728 G 1804 3292 -> 15 0 30 1728 G 1835 3293 -> 16 0 30 1728 G 1755 3293 -> 15 0 31 1728 G 1755 3294 -> 16 0 31 1728 G 1753 3294 -> 15 0 30 1728 G 1835 3295 -> 16 0 30 1728 G 1812 3295 -> 15 0 31 1728 G 1812 3296 -> 16 0 31 1728 G 1810 3296 -> 15 0 30 1728 G 1835 3297 -> 16 0 30 1728 G 1818 3297 -> 15 0 31 1728 G 1818 3298 -> 16 0 31 1728 G 1816 3298 -> 15 0 30 1728 G 1835 3299 -> 16 0 30 1728 G 1764 3299 -> 15 0 31 1728 G 1764 3300 -> 16 0 31 1728 G 1762 3300 -> 15 0 30 1728 G 1835 3301 -> 16 0 30 1728 G 1821 3301 -> 15 0 31 1728 G 1821 3302 -> 16 0 31 1728 G 1819 3302 -> 15 0 30 1728 G 1835 3303 -> 16 0 30 1728 G 1770 3303 -> 15 0 31 1728 G 1770 3304 -> 16 0 31 1728 G 1768 3304 -> 15 0 30 1728 G 1835 3305 -> 16 0 30 1728 G 1827 3305 -> 15 0 31 1728 G 1827 3306 -> 16 0 31 1728 G 1825 3306 -> 15 0 30 1728 G 1835 3307 -> 16 0 30 1728 G 1776 3307 -> 15 0 31 1728 G 1776 3308 -> 16 0 31 1728 G 1774 3308 -> 15 0 30 1728 G 1835 3309 -> 16 0 30 1728 G 1833 3309 -> 15 0 31 1728 G 1833 3310 -> 16 0 31 1728 G 1831 3310 -> 15 0 30 1728 G 1835 3311 -> 16 0 30 1728 G 1782 3311 -> 15 0 31 1728 G 1782 3312 -> 16 0 31 1728 G 1780 3312 -> 15 0 30 1728 G 1835 3313 -> 16 0 30 1728 G 1788 3313 -> 15 0 31 1728 G 1788 3314 -> 16 0 31 1728 G 1786 3314 -> 15 0 30 1728 G 1835 3315 -> 16 0 30 1728 G 1734 3315 -> 15 0 31 1728 G 1734 3316 -> 16 0 31 1728 G 1732 3316 -> 15 0 30 1728 G 1835 3317 -> 16 0 30 1728 G 1791 3317 -> 15 0 31 1728 G 1791 3318 -> 16 0 31 1728 G 1789 3318 -> 15 0 30 1728 G 1835 3319 -> 16 0 30 1728 G 1740 3319 -> 15 0 31 1728 G 1740 3320 -> 16 0 31 1728 G 1738 3320 -> 15 0 30 1728 G 1835 3321 -> 16 0 30 1728 G 1797 3321 -> 15 0 31 1728 G 1797 3322 -> 16 0 31 1728 G 1795 3322 -> 15 0 30 1728 G 1835 3323 -> 16 0 30 1728 G 1746 3323 -> 15 0 31 1728 G 1746 3324 -> 16 0 31 1728 G 1744 3324 -> 15 0 30 1728 G 1835 3325 -> 16 0 30 1728 G 1803 3325 -> 15 0 31 1728 G 1803 3326 -> 16 0 31 1728 G 1801 3326 -> 15 0 30 1728 G 1835 3327 -> 16 0 30 1728 G 1752 3327 -> 15 0 31 1728 G 1752 3328 -> 16 0 31 1728 G 1750 3328 -> 15 0 30 1728 G 1835 3329 -> 16 0 30 1728 G 1809 3329 -> 15 0 31 1728 G 1809 3330 -> 16 0 31 1728 G 1807 3330 -> 15 0 30 1728 G 1835 3331 -> 16 0 30 1728 G 1758 3331 -> 15 0 31 1728 G 1758 3332 -> 16 0 31 1728 G 1756 3332 -> 15 0 30 1728 G 1835 3333 -> 16 0 30 1728 G 1815 3333 -> 15 0 31 1728 G 1815 3334 -> 16 0 31 1728 G 1813 3334 -> 15 0 29 1728 G 1765 3335 -> 16 0 29 1728 G 1766 3335 -> 15 0 30 1728 G 1766 3336 -> 16 0 30 1728 G 1835 3336 -> 15 0 30 1728 G 1835 3337 -> 16 0 30 1728 G 1761 3337 -> 15 0 31 1728 G 1761 3338 -> 16 0 31 1728 G 1759 3338 -> 15 0 29 1728 G 1822 3339 -> 16 0 29 1728 G 1823 3339 -> 15 0 30 1728 G 1823 3340 -> 16 0 30 1728 G 1835 3340 -> 15 0 29 1728 G 1771 3341 -> 16 0 29 1728 G 1772 3341 -> 15 0 30 1728 G 1772 3342 -> 16 0 30 1728 G 1835 3342 -> 15 0 29 1728 G 1828 3343 -> 16 0 29 1728 G 1829 3343 -> 15 0 30 1728 G 1829 3344 -> 16 0 30 1728 G 1835 3344 -> 15 0 29 1728 G 1777 3345 -> 16 0 29 1728 G 1778 3345 -> 15 0 30 1728 G 1778 3346 -> 16 0 30 1728 G 1835 3346 -> 15 0 29 1728 G 1783 3347 -> 16 0 29 1728 G 1784 3347 -> 15 0 30 1728 G 1784 3348 -> 16 0 30 1728 G 1835 3348 -> 15 0 29 1728 G 1729 3349 -> 16 0 29 1728 G 1730 3349 -> 15 0 30 1728 G 1730 3350 -> 16 0 30 1728 G 1835 3350 -> 15 0 29 1728 G 1735 3351 -> 16 0 29 1728 G 1736 3351 -> 15 0 30 1728 G 1736 3352 -> 16 0 30 1728 G 1835 3352 -> 15 0 29 1728 G 1792 3353 -> 16 0 29 1728 G 1793 3353 -> 15 0 30 1728 G 1793 3354 -> 16 0 30 1728 G 1835 3354 -> 15 0 29 1728 G 1741 3355 -> 16 0 29 1728 G 1742 3355 -> 15 0 30 1728 G 1742 3356 -> 16 0 30 1728 G 1835 3356 -> 15 0 29 1728 G 1798 3357 -> 16 0 29 1728 G 1799 3357 -> 15 0 30 1728 G 1799 3358 -> 16 0 30 1728 G 1835 3358 -> 15 0 29 1728 G 1747 3359 -> 16 0 29 1728 G 1748 3359 -> 15 0 30 1728 G 1748 3360 -> 16 0 30 1728 G 1835 3360 -> 15 0 29 1728 G 1804 3361 -> 16 0 29 1728 G 1805 3361 -> 15 0 30 1728 G 1805 3362 -> 16 0 30 1728 G 1835 3362 -> 15 0 29 1728 G 1753 3363 -> 16 0 29 1728 G 1754 3363 -> 15 0 30 1728 G 1754 3364 -> 16 0 30 1728 G 1835 3364 -> 15 0 29 1728 G 1810 3365 -> 16 0 29 1728 G 1811 3365 -> 15 0 30 1728 G 1811 3366 -> 16 0 30 1728 G 1835 3366 -> 15 0 29 1728 G 1816 3367 -> 16 0 29 1728 G 1817 3367 -> 15 0 30 1728 G 1817 3368 -> 16 0 30 1728 G 1835 3368 -> 15 0 29 1728 G 1762 3369 -> 16 0 29 1728 G 1763 3369 -> 15 0 30 1728 G 1763 3370 -> 16 0 30 1728 G 1835 3370 -> 15 0 29 1728 G 1819 3371 -> 16 0 29 1728 G 1820 3371 -> 15 0 30 1728 G 1820 3372 -> 16 0 30 1728 G 1835 3372 -> 15 0 29 1728 G 1768 3373 -> 16 0 29 1728 G 1769 3373 -> 15 0 30 1728 G 1769 3374 -> 16 0 30 1728 G 1835 3374 -> 15 0 29 1728 G 1825 3375 -> 16 0 29 1728 G 1826 3375 -> 15 0 30 1728 G 1826 3376 -> 16 0 30 1728 G 1835 3376 -> 15 0 29 1728 G 1774 3377 -> 16 0 29 1728 G 1775 3377 -> 15 0 30 1728 G 1775 3378 -> 16 0 30 1728 G 1835 3378 -> 15 0 29 1728 G 1831 3379 -> 16 0 29 1728 G 1832 3379 -> 15 0 30 1728 G 1832 3380 -> 16 0 30 1728 G 1835 3380 -> 15 0 29 1728 G 1780 3381 -> 16 0 29 1728 G 1781 3381 -> 15 0 30 1728 G 1781 3382 -> 16 0 30 1728 G 1835 3382 -> 15 0 29 1728 G 1786 3383 -> 16 0 29 1728 G 1787 3383 -> 15 0 30 1728 G 1787 3384 -> 16 0 30 1728 G 1835 3384 -> 15 0 29 1728 G 1732 3385 -> 16 0 29 1728 G 1733 3385 -> 15 0 30 1728 G 1733 3386 -> 16 0 30 1728 G 1835 3386 -> 15 0 29 1728 G 1789 3387 -> 16 0 29 1728 G 1790 3387 -> 15 0 30 1728 G 1790 3388 -> 16 0 30 1728 G 1835 3388 -> 15 0 29 1728 G 1738 3389 -> 16 0 29 1728 G 1739 3389 -> 15 0 30 1728 G 1739 3390 -> 16 0 30 1728 G 1835 3390 -> 15 0 29 1728 G 1795 3391 -> 16 0 29 1728 G 1796 3391 -> 15 0 30 1728 G 1796 3392 -> 16 0 30 1728 G 1835 3392 -> 15 0 29 1728 G 1744 3393 -> 16 0 29 1728 G 1745 3393 -> 15 0 30 1728 G 1745 3394 -> 16 0 30 1728 G 1835 3394 -> 15 0 29 1728 G 1801 3395 -> 16 0 29 1728 G 1802 3395 -> 15 0 30 1728 G 1802 3396 -> 16 0 30 1728 G 1835 3396 -> 15 0 29 1728 G 1750 3397 -> 16 0 29 1728 G 1751 3397 -> 15 0 30 1728 G 1751 3398 -> 16 0 30 1728 G 1835 3398 -> 15 0 29 1728 G 1807 3399 -> 16 0 29 1728 G 1808 3399 -> 15 0 30 1728 G 1808 3400 -> 16 0 30 1728 G 1835 3400 -> 15 0 29 1728 G 1756 3401 -> 16 0 29 1728 G 1757 3401 -> 15 0 30 1728 G 1757 3402 -> 16 0 30 1728 G 1835 3402 -> 15 0 29 1728 G 1813 3403 -> 16 0 29 1728 G 1814 3403 -> 15 0 30 1728 G 1814 3404 -> 16 0 30 1728 G 1835 3404 -> 15 0 29 1836 G 1882 3405 -> 16 0 29 1836 G 1883 3405 -> 15 0 30 1836 G 1883 3406 -> 16 0 30 1836 G 1928 3406 -> 15 0 30 1836 G 1928 3407 -> 16 0 30 1836 G 1890 3407 -> 15 0 31 1836 G 1890 3408 -> 16 0 31 1836 G 1888 3408 -> 15 0 30 1836 G 1928 3409 -> 16 0 30 1836 G 1839 3409 -> 15 0 31 1836 G 1839 3410 -> 16 0 31 1836 G 1837 3410 -> 15 0 30 1836 G 1928 3411 -> 16 0 30 1836 G 1896 3411 -> 15 0 31 1836 G 1896 3412 -> 16 0 31 1836 G 1894 3412 -> 15 0 30 1836 G 1928 3413 -> 16 0 30 1836 G 1845 3413 -> 15 0 31 1836 G 1845 3414 -> 16 0 31 1836 G 1843 3414 -> 15 0 30 1836 G 1928 3415 -> 16 0 30 1836 G 1902 3415 -> 15 0 31 1836 G 1902 3416 -> 16 0 31 1836 G 1900 3416 -> 15 0 30 1836 G 1928 3417 -> 16 0 30 1836 G 1851 3417 -> 15 0 31 1836 G 1851 3418 -> 16 0 31 1836 G 1849 3418 -> 15 0 30 1836 G 1928 3419 -> 16 0 30 1836 G 1908 3419 -> 15 0 31 1836 G 1908 3420 -> 16 0 31 1836 G 1906 3420 -> 15 0 30 1836 G 1928 3421 -> 16 0 30 1836 G 1917 3421 -> 15 0 31 1836 G 1917 3422 -> 16 0 31 1836 G 1915 3422 -> 15 0 30 1836 G 1928 3423 -> 16 0 30 1836 G 1923 3423 -> 15 0 31 1836 G 1923 3424 -> 16 0 31 1836 G 1921 3424 -> 15 0 30 1836 G 1928 3425 -> 16 0 30 1836 G 1854 3425 -> 15 0 31 1836 G 1854 3426 -> 16 0 31 1836 G 1852 3426 -> 15 0 30 1836 G 1928 3427 -> 16 0 30 1836 G 1860 3427 -> 15 0 31 1836 G 1860 3428 -> 16 0 31 1836 G 1858 3428 -> 15 0 30 1836 G 1928 3429 -> 16 0 30 1836 G 1866 3429 -> 15 0 31 1836 G 1866 3430 -> 16 0 31 1836 G 1864 3430 -> 15 0 30 1836 G 1928 3431 -> 16 0 30 1836 G 1872 3431 -> 15 0 31 1836 G 1872 3432 -> 16 0 31 1836 G 1870 3432 -> 15 0 30 1836 G 1928 3433 -> 16 0 30 1836 G 1878 3433 -> 15 0 31 1836 G 1878 3434 -> 16 0 31 1836 G 1876 3434 -> 15 0 32 1836 G 1928 3435 -> 16 0 32 1836 G 1927 3435 -> 15 0 30 1836 G 1928 3436 -> 16 0 30 1836 G 1887 3436 -> 15 0 31 1836 G 1887 3437 -> 16 0 31 1836 G 1885 3437 -> 15 0 30 1836 G 1928 3438 -> 16 0 30 1836 G 1893 3438 -> 15 0 31 1836 G 1893 3439 -> 16 0 31 1836 G 1891 3439 -> 15 0 30 1836 G 1928 3440 -> 16 0 30 1836 G 1842 3440 -> 15 0 31 1836 G 1842 3441 -> 16 0 31 1836 G 1840 3441 -> 15 0 30 1836 G 1928 3442 -> 16 0 30 1836 G 1899 3442 -> 15 0 31 1836 G 1899 3443 -> 16 0 31 1836 G 1897 3443 -> 15 0 30 1836 G 1928 3444 -> 16 0 30 1836 G 1848 3444 -> 15 0 31 1836 G 1848 3445 -> 16 0 31 1836 G 1846 3445 -> 15 0 30 1836 G 1928 3446 -> 16 0 30 1836 G 1905 3446 -> 15 0 31 1836 G 1905 3447 -> 16 0 31 1836 G 1903 3447 -> 15 0 30 1836 G 1928 3448 -> 16 0 30 1836 G 1914 3448 -> 15 0 31 1836 G 1914 3449 -> 16 0 31 1836 G 1912 3449 -> 15 0 30 1836 G 1928 3450 -> 16 0 30 1836 G 1911 3450 -> 15 0 31 1836 G 1911 3451 -> 16 0 31 1836 G 1909 3451 -> 15 0 30 1836 G 1928 3452 -> 16 0 30 1836 G 1920 3452 -> 15 0 31 1836 G 1920 3453 -> 16 0 31 1836 G 1918 3453 -> 15 0 30 1836 G 1928 3454 -> 16 0 30 1836 G 1926 3454 -> 15 0 31 1836 G 1926 3455 -> 16 0 31 1836 G 1924 3455 -> 15 0 30 1836 G 1928 3456 -> 16 0 30 1836 G 1857 3456 -> 15 0 31 1836 G 1857 3457 -> 16 0 31 1836 G 1855 3457 -> 15 0 30 1836 G 1928 3458 -> 16 0 30 1836 G 1863 3458 -> 15 0 31 1836 G 1863 3459 -> 16 0 31 1836 G 1861 3459 -> 15 0 30 1836 G 1928 3460 -> 16 0 30 1836 G 1869 3460 -> 15 0 31 1836 G 1869 3461 -> 16 0 31 1836 G 1867 3461 -> 15 0 30 1836 G 1928 3462 -> 16 0 30 1836 G 1875 3462 -> 15 0 31 1836 G 1875 3463 -> 16 0 31 1836 G 1873 3463 -> 15 0 30 1836 G 1928 3464 -> 16 0 30 1836 G 1881 3464 -> 15 0 31 1836 G 1881 3465 -> 16 0 31 1836 G 1879 3465 -> 15 0 29 1836 G 1888 3466 -> 16 0 29 1836 G 1889 3466 -> 15 0 30 1836 G 1889 3467 -> 16 0 30 1836 G 1928 3467 -> 15 0 30 1836 G 1928 3468 -> 16 0 30 1836 G 1884 3468 -> 15 0 31 1836 G 1884 3469 -> 16 0 31 1836 G 1882 3469 -> 15 0 29 1836 G 1837 3470 -> 16 0 29 1836 G 1838 3470 -> 15 0 30 1836 G 1838 3471 -> 16 0 30 1836 G 1928 3471 -> 15 0 29 1836 G 1894 3472 -> 16 0 29 1836 G 1895 3472 -> 15 0 30 1836 G 1895 3473 -> 16 0 30 1836 G 1928 3473 -> 15 0 29 1836 G 1843 3474 -> 16 0 29 1836 G 1844 3474 -> 15 0 30 1836 G 1844 3475 -> 16 0 30 1836 G 1928 3475 -> 15 0 29 1836 G 1900 3476 -> 16 0 29 1836 G 1901 3476 -> 15 0 30 1836 G 1901 3477 -> 16 0 30 1836 G 1928 3477 -> 15 0 29 1836 G 1849 3478 -> 16 0 29 1836 G 1850 3478 -> 15 0 30 1836 G 1850 3479 -> 16 0 30 1836 G 1928 3479 -> 15 0 29 1836 G 1906 3480 -> 16 0 29 1836 G 1907 3480 -> 15 0 30 1836 G 1907 3481 -> 16 0 30 1836 G 1928 3481 -> 15 0 29 1836 G 1915 3482 -> 16 0 29 1836 G 1916 3482 -> 15 0 30 1836 G 1916 3483 -> 16 0 30 1836 G 1928 3483 -> 15 0 29 1836 G 1921 3484 -> 16 0 29 1836 G 1922 3484 -> 15 0 30 1836 G 1922 3485 -> 16 0 30 1836 G 1928 3485 -> 15 0 29 1836 G 1852 3486 -> 16 0 29 1836 G 1853 3486 -> 15 0 30 1836 G 1853 3487 -> 16 0 30 1836 G 1928 3487 -> 15 0 29 1836 G 1858 3488 -> 16 0 29 1836 G 1859 3488 -> 15 0 30 1836 G 1859 3489 -> 16 0 30 1836 G 1928 3489 -> 15 0 29 1836 G 1864 3490 -> 16 0 29 1836 G 1865 3490 -> 15 0 30 1836 G 1865 3491 -> 16 0 30 1836 G 1928 3491 -> 15 0 29 1836 G 1870 3492 -> 16 0 29 1836 G 1871 3492 -> 15 0 30 1836 G 1871 3493 -> 16 0 30 1836 G 1928 3493 -> 15 0 29 1836 G 1876 3494 -> 16 0 29 1836 G 1877 3494 -> 15 0 30 1836 G 1877 3495 -> 16 0 30 1836 G 1928 3495 -> 15 0 29 1836 G 1885 3496 -> 16 0 29 1836 G 1886 3496 -> 15 0 30 1836 G 1886 3497 -> 16 0 30 1836 G 1928 3497 -> 15 0 29 1836 G 1891 3498 -> 16 0 29 1836 G 1892 3498 -> 15 0 30 1836 G 1892 3499 -> 16 0 30 1836 G 1928 3499 -> 15 0 29 1836 G 1840 3500 -> 16 0 29 1836 G 1841 3500 -> 15 0 30 1836 G 1841 3501 -> 16 0 30 1836 G 1928 3501 -> 15 0 29 1836 G 1897 3502 -> 16 0 29 1836 G 1898 3502 -> 15 0 30 1836 G 1898 3503 -> 16 0 30 1836 G 1928 3503 -> 15 0 29 1836 G 1846 3504 -> 16 0 29 1836 G 1847 3504 -> 15 0 30 1836 G 1847 3505 -> 16 0 30 1836 G 1928 3505 -> 15 0 29 1836 G 1903 3506 -> 16 0 29 1836 G 1904 3506 -> 15 0 30 1836 G 1904 3507 -> 16 0 30 1836 G 1928 3507 -> 15 0 29 1836 G 1912 3508 -> 16 0 29 1836 G 1913 3508 -> 15 0 30 1836 G 1913 3509 -> 16 0 30 1836 G 1928 3509 -> 15 0 29 1836 G 1909 3510 -> 16 0 29 1836 G 1910 3510 -> 15 0 30 1836 G 1910 3511 -> 16 0 30 1836 G 1928 3511 -> 15 0 29 1836 G 1918 3512 -> 16 0 29 1836 G 1919 3512 -> 15 0 30 1836 G 1919 3513 -> 16 0 30 1836 G 1928 3513 -> 15 0 29 1836 G 1924 3514 -> 16 0 29 1836 G 1925 3514 -> 15 0 30 1836 G 1925 3515 -> 16 0 30 1836 G 1928 3515 -> 15 0 29 1836 G 1855 3516 -> 16 0 29 1836 G 1856 3516 -> 15 0 30 1836 G 1856 3517 -> 16 0 30 1836 G 1928 3517 -> 15 0 29 1836 G 1861 3518 -> 16 0 29 1836 G 1862 3518 -> 15 0 30 1836 G 1862 3519 -> 16 0 30 1836 G 1928 3519 -> 15 0 29 1836 G 1867 3520 -> 16 0 29 1836 G 1868 3520 -> 15 0 30 1836 G 1868 3521 -> 16 0 30 1836 G 1928 3521 -> 15 0 29 1836 G 1873 3522 -> 16 0 29 1836 G 1874 3522 -> 15 0 30 1836 G 1874 3523 -> 16 0 30 1836 G 1928 3523 -> 15 0 29 1836 G 1879 3524 -> 16 0 29 1836 G 1880 3524 -> 15 0 30 1836 G 1880 3525 -> 16 0 30 1836 G 1928 3525 -> 15 0 29 1929 G 1975 3526 -> 16 0 29 1929 G 1976 3526 -> 15 0 30 1929 G 1976 3527 -> 16 0 30 1929 G 2051 3527 -> 15 0 30 1929 G 2051 3528 -> 16 0 30 1929 G 2040 3528 -> 15 0 31 1929 G 2040 3529 -> 16 0 31 1929 G 2038 3529 -> 15 0 30 1929 G 2051 3530 -> 16 0 30 1929 G 1989 3530 -> 15 0 31 1929 G 1989 3531 -> 16 0 31 1929 G 1987 3531 -> 15 0 30 1929 G 2051 3532 -> 16 0 30 1929 G 1938 3532 -> 15 0 31 1929 G 1938 3533 -> 16 0 31 1929 G 1936 3533 -> 15 0 30 1929 G 2051 3534 -> 16 0 30 1929 G 2001 3534 -> 15 0 31 1929 G 2001 3535 -> 16 0 31 1929 G 1999 3535 -> 15 0 30 1929 G 2051 3536 -> 16 0 30 1929 G 1953 3536 -> 15 0 31 1929 G 1953 3537 -> 16 0 31 1929 G 1951 3537 -> 15 0 30 1929 G 2051 3538 -> 16 0 30 1929 G 2016 3538 -> 15 0 31 1929 G 2016 3539 -> 16 0 31 1929 G 2014 3539 -> 15 0 30 1929 G 2051 3540 -> 16 0 30 1929 G 1965 3540 -> 15 0 31 1929 G 1965 3541 -> 16 0 31 1929 G 1963 3541 -> 15 0 30 1929 G 2051 3542 -> 16 0 30 1929 G 2028 3542 -> 15 0 31 1929 G 2028 3543 -> 16 0 31 1929 G 2026 3543 -> 15 0 30 1929 G 2051 3544 -> 16 0 30 1929 G 1980 3544 -> 15 0 31 1929 G 1980 3545 -> 16 0 31 1929 G 1978 3545 -> 15 0 30 1929 G 2051 3546 -> 16 0 30 1929 G 2043 3546 -> 15 0 31 1929 G 2043 3547 -> 16 0 31 1929 G 2041 3547 -> 15 0 30 1929 G 2051 3548 -> 16 0 30 1929 G 1992 3548 -> 15 0 31 1929 G 1992 3549 -> 16 0 31 1929 G 1990 3549 -> 15 0 30 1929 G 2051 3550 -> 16 0 30 1929 G 1941 3550 -> 15 0 31 1929 G 1941 3551 -> 16 0 31 1929 G 1939 3551 -> 15 0 30 1929 G 2051 3552 -> 16 0 30 1929 G 2004 3552 -> 15 0 31 1929 G 2004 3553 -> 16 0 31 1929 G 2002 3553 -> 15 0 30 1929 G 2051 3554 -> 16 0 30 1929 G 2007 3554 -> 15 0 31 1929 G 2007 3555 -> 16 0 31 1929 G 2005 3555 -> 15 0 30 1929 G 2051 3556 -> 16 0 30 1929 G 1956 3556 -> 15 0 31 1929 G 1956 3557 -> 16 0 31 1929 G 1954 3557 -> 15 0 30 1929 G 2051 3558 -> 16 0 30 1929 G 2019 3558 -> 15 0 31 1929 G 2019 3559 -> 16 0 31 1929 G 2017 3559 -> 15 0 30 1929 G 2051 3560 -> 16 0 30 1929 G 1968 3560 -> 15 0 31 1929 G 1968 3561 -> 16 0 31 1929 G 1966 3561 -> 15 0 30 1929 G 2051 3562 -> 16 0 30 1929 G 2031 3562 -> 15 0 31 1929 G 2031 3563 -> 16 0 31 1929 G 2029 3563 -> 15 0 30 1929 G 2051 3564 -> 16 0 30 1929 G 1983 3564 -> 15 0 31 1929 G 1983 3565 -> 16 0 31 1929 G 1981 3565 -> 15 0 30 1929 G 2051 3566 -> 16 0 30 1929 G 1932 3566 -> 15 0 31 1929 G 1932 3567 -> 16 0 31 1929 G 1930 3567 -> 15 0 30 1929 G 2051 3568 -> 16 0 30 1929 G 2046 3568 -> 15 0 31 1929 G 2046 3569 -> 16 0 31 1929 G 2044 3569 -> 15 0 30 1929 G 2051 3570 -> 16 0 30 1929 G 1995 3570 -> 15 0 31 1929 G 1995 3571 -> 16 0 31 1929 G 1993 3571 -> 15 0 30 1929 G 2051 3572 -> 16 0 30 1929 G 1944 3572 -> 15 0 31 1929 G 1944 3573 -> 16 0 31 1929 G 1942 3573 -> 15 0 30 1929 G 2051 3574 -> 16 0 30 1929 G 1947 3574 -> 15 0 31 1929 G 1947 3575 -> 16 0 31 1929 G 1945 3575 -> 15 0 30 1929 G 2051 3576 -> 16 0 30 1929 G 2010 3576 -> 15 0 31 1929 G 2010 3577 -> 16 0 31 1929 G 2008 3577 -> 15 0 30 1929 G 2051 3578 -> 16 0 30 1929 G 1959 3578 -> 15 0 31 1929 G 1959 3579 -> 16 0 31 1929 G 1957 3579 -> 15 0 30 1929 G 2051 3580 -> 16 0 30 1929 G 2022 3580 -> 15 0 31 1929 G 2022 3581 -> 16 0 31 1929 G 2020 3581 -> 15 0 30 1929 G 2051 3582 -> 16 0 30 1929 G 1971 3582 -> 15 0 31 1929 G 1971 3583 -> 16 0 31 1929 G 1969 3583 -> 15 0 30 1929 G 2051 3584 -> 16 0 30 1929 G 2034 3584 -> 15 0 31 1929 G 2034 3585 -> 16 0 31 1929 G 2032 3585 -> 15 0 30 1929 G 2051 3586 -> 16 0 30 1929 G 2037 3586 -> 15 0 31 1929 G 2037 3587 -> 16 0 31 1929 G 2035 3587 -> 15 0 30 1929 G 2051 3588 -> 16 0 30 1929 G 1986 3588 -> 15 0 31 1929 G 1986 3589 -> 16 0 31 1929 G 1984 3589 -> 15 0 30 1929 G 2051 3590 -> 16 0 30 1929 G 1935 3590 -> 15 0 31 1929 G 1935 3591 -> 16 0 31 1929 G 1933 3591 -> 15 0 30 1929 G 2051 3592 -> 16 0 30 1929 G 2049 3592 -> 15 0 31 1929 G 2049 3593 -> 16 0 31 1929 G 2047 3593 -> 15 0 30 1929 G 2051 3594 -> 16 0 30 1929 G 1998 3594 -> 15 0 31 1929 G 1998 3595 -> 16 0 31 1929 G 1996 3595 -> 15 0 32 1929 G 2051 3596 -> 16 0 32 1929 G 2050 3596 -> 15 0 30 1929 G 2051 3597 -> 16 0 30 1929 G 1950 3597 -> 15 0 31 1929 G 1950 3598 -> 16 0 31 1929 G 1948 3598 -> 15 0 30 1929 G 2051 3599 -> 16 0 30 1929 G 2013 3599 -> 15 0 31 1929 G 2013 3600 -> 16 0 31 1929 G 2011 3600 -> 15 0 30 1929 G 2051 3601 -> 16 0 30 1929 G 1962 3601 -> 15 0 31 1929 G 1962 3602 -> 16 0 31 1929 G 1960 3602 -> 15 0 30 1929 G 2051 3603 -> 16 0 30 1929 G 2025 3603 -> 15 0 31 1929 G 2025 3604 -> 16 0 31 1929 G 2023 3604 -> 15 0 30 1929 G 2051 3605 -> 16 0 30 1929 G 1974 3605 -> 15 0 31 1929 G 1974 3606 -> 16 0 31 1929 G 1972 3606 -> 15 0 29 1929 G 2038 3607 -> 16 0 29 1929 G 2039 3607 -> 15 0 30 1929 G 2039 3608 -> 16 0 30 1929 G 2051 3608 -> 15 0 30 1929 G 2051 3609 -> 16 0 30 1929 G 1977 3609 -> 15 0 31 1929 G 1977 3610 -> 16 0 31 1929 G 1975 3610 -> 15 0 29 1929 G 1987 3611 -> 16 0 29 1929 G 1988 3611 -> 15 0 30 1929 G 1988 3612 -> 16 0 30 1929 G 2051 3612 -> 15 0 29 1929 G 1936 3613 -> 16 0 29 1929 G 1937 3613 -> 15 0 30 1929 G 1937 3614 -> 16 0 30 1929 G 2051 3614 -> 15 0 29 1929 G 1999 3615 -> 16 0 29 1929 G 2000 3615 -> 15 0 30 1929 G 2000 3616 -> 16 0 30 1929 G 2051 3616 -> 15 0 29 1929 G 1951 3617 -> 16 0 29 1929 G 1952 3617 -> 15 0 30 1929 G 1952 3618 -> 16 0 30 1929 G 2051 3618 -> 15 0 29 1929 G 2014 3619 -> 16 0 29 1929 G 2015 3619 -> 15 0 30 1929 G 2015 3620 -> 16 0 30 1929 G 2051 3620 -> 15 0 29 1929 G 1963 3621 -> 16 0 29 1929 G 1964 3621 -> 15 0 30 1929 G 1964 3622 -> 16 0 30 1929 G 2051 3622 -> 15 0 29 1929 G 2026 3623 -> 16 0 29 1929 G 2027 3623 -> 15 0 30 1929 G 2027 3624 -> 16 0 30 1929 G 2051 3624 -> 15 0 29 1929 G 1978 3625 -> 16 0 29 1929 G 1979 3625 -> 15 0 30 1929 G 1979 3626 -> 16 0 30 1929 G 2051 3626 -> 15 0 29 1929 G 2041 3627 -> 16 0 29 1929 G 2042 3627 -> 15 0 30 1929 G 2042 3628 -> 16 0 30 1929 G 2051 3628 -> 15 0 29 1929 G 1990 3629 -> 16 0 29 1929 G 1991 3629 -> 15 0 30 1929 G 1991 3630 -> 16 0 30 1929 G 2051 3630 -> 15 0 29 1929 G 1939 3631 -> 16 0 29 1929 G 1940 3631 -> 15 0 30 1929 G 1940 3632 -> 16 0 30 1929 G 2051 3632 -> 15 0 29 1929 G 2002 3633 -> 16 0 29 1929 G 2003 3633 -> 15 0 30 1929 G 2003 3634 -> 16 0 30 1929 G 2051 3634 -> 15 0 29 1929 G 2005 3635 -> 16 0 29 1929 G 2006 3635 -> 15 0 30 1929 G 2006 3636 -> 16 0 30 1929 G 2051 3636 -> 15 0 29 1929 G 1954 3637 -> 16 0 29 1929 G 1955 3637 -> 15 0 30 1929 G 1955 3638 -> 16 0 30 1929 G 2051 3638 -> 15 0 29 1929 G 2017 3639 -> 16 0 29 1929 G 2018 3639 -> 15 0 30 1929 G 2018 3640 -> 16 0 30 1929 G 2051 3640 -> 15 0 29 1929 G 1966 3641 -> 16 0 29 1929 G 1967 3641 -> 15 0 30 1929 G 1967 3642 -> 16 0 30 1929 G 2051 3642 -> 15 0 29 1929 G 2029 3643 -> 16 0 29 1929 G 2030 3643 -> 15 0 30 1929 G 2030 3644 -> 16 0 30 1929 G 2051 3644 -> 15 0 29 1929 G 1981 3645 -> 16 0 29 1929 G 1982 3645 -> 15 0 30 1929 G 1982 3646 -> 16 0 30 1929 G 2051 3646 -> 15 0 29 1929 G 1930 3647 -> 16 0 29 1929 G 1931 3647 -> 15 0 30 1929 G 1931 3648 -> 16 0 30 1929 G 2051 3648 -> 15 0 29 1929 G 2044 3649 -> 16 0 29 1929 G 2045 3649 -> 15 0 30 1929 G 2045 3650 -> 16 0 30 1929 G 2051 3650 -> 15 0 29 1929 G 1993 3651 -> 16 0 29 1929 G 1994 3651 -> 15 0 30 1929 G 1994 3652 -> 16 0 30 1929 G 2051 3652 -> 15 0 29 1929 G 1942 3653 -> 16 0 29 1929 G 1943 3653 -> 15 0 30 1929 G 1943 3654 -> 16 0 30 1929 G 2051 3654 -> 15 0 29 1929 G 1945 3655 -> 16 0 29 1929 G 1946 3655 -> 15 0 30 1929 G 1946 3656 -> 16 0 30 1929 G 2051 3656 -> 15 0 29 1929 G 2008 3657 -> 16 0 29 1929 G 2009 3657 -> 15 0 30 1929 G 2009 3658 -> 16 0 30 1929 G 2051 3658 -> 15 0 29 1929 G 1957 3659 -> 16 0 29 1929 G 1958 3659 -> 15 0 30 1929 G 1958 3660 -> 16 0 30 1929 G 2051 3660 -> 15 0 29 1929 G 2020 3661 -> 16 0 29 1929 G 2021 3661 -> 15 0 30 1929 G 2021 3662 -> 16 0 30 1929 G 2051 3662 -> 15 0 29 1929 G 1969 3663 -> 16 0 29 1929 G 1970 3663 -> 15 0 30 1929 G 1970 3664 -> 16 0 30 1929 G 2051 3664 -> 15 0 29 1929 G 2032 3665 -> 16 0 29 1929 G 2033 3665 -> 15 0 30 1929 G 2033 3666 -> 16 0 30 1929 G 2051 3666 -> 15 0 29 1929 G 2035 3667 -> 16 0 29 1929 G 2036 3667 -> 15 0 30 1929 G 2036 3668 -> 16 0 30 1929 G 2051 3668 -> 15 0 29 1929 G 1984 3669 -> 16 0 29 1929 G 1985 3669 -> 15 0 30 1929 G 1985 3670 -> 16 0 30 1929 G 2051 3670 -> 15 0 29 1929 G 1933 3671 -> 16 0 29 1929 G 1934 3671 -> 15 0 30 1929 G 1934 3672 -> 16 0 30 1929 G 2051 3672 -> 15 0 29 1929 G 2047 3673 -> 16 0 29 1929 G 2048 3673 -> 15 0 30 1929 G 2048 3674 -> 16 0 30 1929 G 2051 3674 -> 15 0 29 1929 G 1996 3675 -> 16 0 29 1929 G 1997 3675 -> 15 0 30 1929 G 1997 3676 -> 16 0 30 1929 G 2051 3676 -> 15 0 29 1929 G 1948 3677 -> 16 0 29 1929 G 1949 3677 -> 15 0 30 1929 G 1949 3678 -> 16 0 30 1929 G 2051 3678 -> 15 0 29 1929 G 2011 3679 -> 16 0 29 1929 G 2012 3679 -> 15 0 30 1929 G 2012 3680 -> 16 0 30 1929 G 2051 3680 -> 15 0 29 1929 G 1960 3681 -> 16 0 29 1929 G 1961 3681 -> 15 0 30 1929 G 1961 3682 -> 16 0 30 1929 G 2051 3682 -> 15 0 29 1929 G 2023 3683 -> 16 0 29 1929 G 2024 3683 -> 15 0 30 1929 G 2024 3684 -> 16 0 30 1929 G 2051 3684 -> 15 0 29 1929 G 1972 3685 -> 16 0 29 1929 G 1973 3685 -> 15 0 30 1929 G 1973 3686 -> 16 0 30 1929 G 2051 3686 -> 15 0 34 1607 G 2053 3687 -> 16 0 34 1607 G 2054 3687 -> 15 0 35 1607 G 2054 3688 -> 16 0 35 1607 G 1726 3688 -> 15 0 35 1607 G 2054 3689 -> 16 0 35 1607 G 1834 3689 -> 15 0 35 1607 G 2054 3690 -> 16 0 35 1607 G 1927 3690 -> 15 0 35 1607 G 2054 3691 -> 16 0 35 1607 G 2050 3691 -> 15 0 29 2057 G 2085 3692 -> 16 0 29 2057 G 2086 3692 -> 15 0 30 2057 G 2086 3693 -> 16 0 30 2057 G 2155 3693 -> 15 0 30 2057 G 2155 3694 -> 16 0 30 2057 G 2093 3694 -> 15 0 31 2057 G 2093 3695 -> 16 0 31 2057 G 2091 3695 -> 15 0 30 2057 G 2155 3696 -> 16 0 30 2057 G 2099 3696 -> 15 0 31 2057 G 2099 3697 -> 16 0 31 2057 G 2097 3697 -> 15 0 30 2057 G 2155 3698 -> 16 0 30 2057 G 2105 3698 -> 15 0 31 2057 G 2105 3699 -> 16 0 31 2057 G 2103 3699 -> 15 0 30 2057 G 2155 3700 -> 16 0 30 2057 G 2111 3700 -> 15 0 31 2057 G 2111 3701 -> 16 0 31 2057 G 2109 3701 -> 15 0 30 2057 G 2155 3702 -> 16 0 30 2057 G 2147 3702 -> 15 0 31 2057 G 2147 3703 -> 16 0 31 2057 G 2145 3703 -> 15 0 30 2057 G 2155 3704 -> 16 0 30 2057 G 2060 3704 -> 15 0 31 2057 G 2060 3705 -> 16 0 31 2057 G 2058 3705 -> 15 0 30 2057 G 2155 3706 -> 16 0 30 2057 G 2066 3706 -> 15 0 31 2057 G 2066 3707 -> 16 0 31 2057 G 2064 3707 -> 15 0 30 2057 G 2155 3708 -> 16 0 30 2057 G 2072 3708 -> 15 0 31 2057 G 2072 3709 -> 16 0 31 2057 G 2070 3709 -> 15 0 30 2057 G 2155 3710 -> 16 0 30 2057 G 2078 3710 -> 15 0 31 2057 G 2078 3711 -> 16 0 31 2057 G 2076 3711 -> 15 0 30 2057 G 2155 3712 -> 16 0 30 2057 G 2084 3712 -> 15 0 31 2057 G 2084 3713 -> 16 0 31 2057 G 2082 3713 -> 15 0 32 2057 G 2155 3714 -> 16 0 32 2057 G 2154 3714 -> 15 0 30 2057 G 2155 3715 -> 16 0 30 2057 G 2120 3715 -> 15 0 31 2057 G 2120 3716 -> 16 0 31 2057 G 2118 3716 -> 15 0 30 2057 G 2155 3717 -> 16 0 30 2057 G 2126 3717 -> 15 0 31 2057 G 2126 3718 -> 16 0 31 2057 G 2124 3718 -> 15 0 30 2057 G 2155 3719 -> 16 0 30 2057 G 2132 3719 -> 15 0 31 2057 G 2132 3720 -> 16 0 31 2057 G 2130 3720 -> 15 0 30 2057 G 2155 3721 -> 16 0 30 2057 G 2138 3721 -> 15 0 31 2057 G 2138 3722 -> 16 0 31 2057 G 2136 3722 -> 15 0 30 2057 G 2155 3723 -> 16 0 30 2057 G 2144 3723 -> 15 0 31 2057 G 2144 3724 -> 16 0 31 2057 G 2142 3724 -> 15 0 30 2057 G 2155 3725 -> 16 0 30 2057 G 2090 3725 -> 15 0 31 2057 G 2090 3726 -> 16 0 31 2057 G 2088 3726 -> 15 0 30 2057 G 2155 3727 -> 16 0 30 2057 G 2096 3727 -> 15 0 31 2057 G 2096 3728 -> 16 0 31 2057 G 2094 3728 -> 15 0 30 2057 G 2155 3729 -> 16 0 30 2057 G 2102 3729 -> 15 0 31 2057 G 2102 3730 -> 16 0 31 2057 G 2100 3730 -> 15 0 30 2057 G 2155 3731 -> 16 0 30 2057 G 2108 3731 -> 15 0 31 2057 G 2108 3732 -> 16 0 31 2057 G 2106 3732 -> 15 0 30 2057 G 2155 3733 -> 16 0 30 2057 G 2114 3733 -> 15 0 31 2057 G 2114 3734 -> 16 0 31 2057 G 2112 3734 -> 15 0 30 2057 G 2155 3735 -> 16 0 30 2057 G 2150 3735 -> 15 0 31 2057 G 2150 3736 -> 16 0 31 2057 G 2148 3736 -> 15 0 30 2057 G 2155 3737 -> 16 0 30 2057 G 2063 3737 -> 15 0 31 2057 G 2063 3738 -> 16 0 31 2057 G 2061 3738 -> 15 0 30 2057 G 2155 3739 -> 16 0 30 2057 G 2069 3739 -> 15 0 31 2057 G 2069 3740 -> 16 0 31 2057 G 2067 3740 -> 15 0 30 2057 G 2155 3741 -> 16 0 30 2057 G 2075 3741 -> 15 0 31 2057 G 2075 3742 -> 16 0 31 2057 G 2073 3742 -> 15 0 30 2057 G 2155 3743 -> 16 0 30 2057 G 2081 3743 -> 15 0 31 2057 G 2081 3744 -> 16 0 31 2057 G 2079 3744 -> 15 0 30 2057 G 2155 3745 -> 16 0 30 2057 G 2117 3745 -> 15 0 31 2057 G 2117 3746 -> 16 0 31 2057 G 2115 3746 -> 15 0 30 2057 G 2155 3747 -> 16 0 30 2057 G 2123 3747 -> 15 0 31 2057 G 2123 3748 -> 16 0 31 2057 G 2121 3748 -> 15 0 30 2057 G 2155 3749 -> 16 0 30 2057 G 2129 3749 -> 15 0 31 2057 G 2129 3750 -> 16 0 31 2057 G 2127 3750 -> 15 0 30 2057 G 2155 3751 -> 16 0 30 2057 G 2153 3751 -> 15 0 31 2057 G 2153 3752 -> 16 0 31 2057 G 2151 3752 -> 15 0 30 2057 G 2155 3753 -> 16 0 30 2057 G 2135 3753 -> 15 0 31 2057 G 2135 3754 -> 16 0 31 2057 G 2133 3754 -> 15 0 30 2057 G 2155 3755 -> 16 0 30 2057 G 2141 3755 -> 15 0 31 2057 G 2141 3756 -> 16 0 31 2057 G 2139 3756 -> 15 0 29 2057 G 2091 3757 -> 16 0 29 2057 G 2092 3757 -> 15 0 30 2057 G 2092 3758 -> 16 0 30 2057 G 2155 3758 -> 15 0 30 2057 G 2155 3759 -> 16 0 30 2057 G 2087 3759 -> 15 0 31 2057 G 2087 3760 -> 16 0 31 2057 G 2085 3760 -> 15 0 29 2057 G 2097 3761 -> 16 0 29 2057 G 2098 3761 -> 15 0 30 2057 G 2098 3762 -> 16 0 30 2057 G 2155 3762 -> 15 0 29 2057 G 2103 3763 -> 16 0 29 2057 G 2104 3763 -> 15 0 30 2057 G 2104 3764 -> 16 0 30 2057 G 2155 3764 -> 15 0 29 2057 G 2109 3765 -> 16 0 29 2057 G 2110 3765 -> 15 0 30 2057 G 2110 3766 -> 16 0 30 2057 G 2155 3766 -> 15 0 29 2057 G 2145 3767 -> 16 0 29 2057 G 2146 3767 -> 15 0 30 2057 G 2146 3768 -> 16 0 30 2057 G 2155 3768 -> 15 0 29 2057 G 2058 3769 -> 16 0 29 2057 G 2059 3769 -> 15 0 30 2057 G 2059 3770 -> 16 0 30 2057 G 2155 3770 -> 15 0 29 2057 G 2064 3771 -> 16 0 29 2057 G 2065 3771 -> 15 0 30 2057 G 2065 3772 -> 16 0 30 2057 G 2155 3772 -> 15 0 29 2057 G 2070 3773 -> 16 0 29 2057 G 2071 3773 -> 15 0 30 2057 G 2071 3774 -> 16 0 30 2057 G 2155 3774 -> 15 0 29 2057 G 2076 3775 -> 16 0 29 2057 G 2077 3775 -> 15 0 30 2057 G 2077 3776 -> 16 0 30 2057 G 2155 3776 -> 15 0 29 2057 G 2082 3777 -> 16 0 29 2057 G 2083 3777 -> 15 0 30 2057 G 2083 3778 -> 16 0 30 2057 G 2155 3778 -> 15 0 29 2057 G 2118 3779 -> 16 0 29 2057 G 2119 3779 -> 15 0 30 2057 G 2119 3780 -> 16 0 30 2057 G 2155 3780 -> 15 0 29 2057 G 2124 3781 -> 16 0 29 2057 G 2125 3781 -> 15 0 30 2057 G 2125 3782 -> 16 0 30 2057 G 2155 3782 -> 15 0 29 2057 G 2130 3783 -> 16 0 29 2057 G 2131 3783 -> 15 0 30 2057 G 2131 3784 -> 16 0 30 2057 G 2155 3784 -> 15 0 29 2057 G 2136 3785 -> 16 0 29 2057 G 2137 3785 -> 15 0 30 2057 G 2137 3786 -> 16 0 30 2057 G 2155 3786 -> 15 0 29 2057 G 2142 3787 -> 16 0 29 2057 G 2143 3787 -> 15 0 30 2057 G 2143 3788 -> 16 0 30 2057 G 2155 3788 -> 15 0 29 2057 G 2088 3789 -> 16 0 29 2057 G 2089 3789 -> 15 0 30 2057 G 2089 3790 -> 16 0 30 2057 G 2155 3790 -> 15 0 29 2057 G 2094 3791 -> 16 0 29 2057 G 2095 3791 -> 15 0 30 2057 G 2095 3792 -> 16 0 30 2057 G 2155 3792 -> 15 0 29 2057 G 2100 3793 -> 16 0 29 2057 G 2101 3793 -> 15 0 30 2057 G 2101 3794 -> 16 0 30 2057 G 2155 3794 -> 15 0 29 2057 G 2106 3795 -> 16 0 29 2057 G 2107 3795 -> 15 0 30 2057 G 2107 3796 -> 16 0 30 2057 G 2155 3796 -> 15 0 29 2057 G 2112 3797 -> 16 0 29 2057 G 2113 3797 -> 15 0 30 2057 G 2113 3798 -> 16 0 30 2057 G 2155 3798 -> 15 0 29 2057 G 2148 3799 -> 16 0 29 2057 G 2149 3799 -> 15 0 30 2057 G 2149 3800 -> 16 0 30 2057 G 2155 3800 -> 15 0 29 2057 G 2061 3801 -> 16 0 29 2057 G 2062 3801 -> 15 0 30 2057 G 2062 3802 -> 16 0 30 2057 G 2155 3802 -> 15 0 29 2057 G 2067 3803 -> 16 0 29 2057 G 2068 3803 -> 15 0 30 2057 G 2068 3804 -> 16 0 30 2057 G 2155 3804 -> 15 0 29 2057 G 2073 3805 -> 16 0 29 2057 G 2074 3805 -> 15 0 30 2057 G 2074 3806 -> 16 0 30 2057 G 2155 3806 -> 15 0 29 2057 G 2079 3807 -> 16 0 29 2057 G 2080 3807 -> 15 0 30 2057 G 2080 3808 -> 16 0 30 2057 G 2155 3808 -> 15 0 29 2057 G 2115 3809 -> 16 0 29 2057 G 2116 3809 -> 15 0 30 2057 G 2116 3810 -> 16 0 30 2057 G 2155 3810 -> 15 0 29 2057 G 2121 3811 -> 16 0 29 2057 G 2122 3811 -> 15 0 30 2057 G 2122 3812 -> 16 0 30 2057 G 2155 3812 -> 15 0 29 2057 G 2127 3813 -> 16 0 29 2057 G 2128 3813 -> 15 0 30 2057 G 2128 3814 -> 16 0 30 2057 G 2155 3814 -> 15 0 29 2057 G 2151 3815 -> 16 0 29 2057 G 2152 3815 -> 15 0 30 2057 G 2152 3816 -> 16 0 30 2057 G 2155 3816 -> 15 0 29 2057 G 2133 3817 -> 16 0 29 2057 G 2134 3817 -> 15 0 30 2057 G 2134 3818 -> 16 0 30 2057 G 2155 3818 -> 15 0 29 2057 G 2139 3819 -> 16 0 29 2057 G 2140 3819 -> 15 0 30 2057 G 2140 3820 -> 16 0 30 2057 G 2155 3820 -> 15 0 29 2156 G 2160 3821 -> 16 0 29 2156 G 2161 3821 -> 15 0 30 2156 G 2161 3822 -> 16 0 30 2156 G 2242 3822 -> 15 0 30 2156 G 2242 3823 -> 16 0 30 2156 G 2219 3823 -> 15 0 31 2156 G 2219 3824 -> 16 0 31 2156 G 2217 3824 -> 15 0 30 2156 G 2242 3825 -> 16 0 30 2156 G 2168 3825 -> 15 0 31 2156 G 2168 3826 -> 16 0 31 2156 G 2166 3826 -> 15 0 30 2156 G 2242 3827 -> 16 0 30 2156 G 2225 3827 -> 15 0 31 2156 G 2225 3828 -> 16 0 31 2156 G 2223 3828 -> 15 0 30 2156 G 2242 3829 -> 16 0 30 2156 G 2174 3829 -> 15 0 31 2156 G 2174 3830 -> 16 0 31 2156 G 2172 3830 -> 15 0 30 2156 G 2242 3831 -> 16 0 30 2156 G 2231 3831 -> 15 0 31 2156 G 2231 3832 -> 16 0 31 2156 G 2229 3832 -> 15 0 30 2156 G 2242 3833 -> 16 0 30 2156 G 2180 3833 -> 15 0 31 2156 G 2180 3834 -> 16 0 31 2156 G 2178 3834 -> 15 0 30 2156 G 2242 3835 -> 16 0 30 2156 G 2237 3835 -> 15 0 31 2156 G 2237 3836 -> 16 0 31 2156 G 2235 3836 -> 15 0 30 2156 G 2242 3837 -> 16 0 30 2156 G 2186 3837 -> 15 0 31 2156 G 2186 3838 -> 16 0 31 2156 G 2184 3838 -> 15 0 30 2156 G 2242 3839 -> 16 0 30 2156 G 2189 3839 -> 15 0 31 2156 G 2189 3840 -> 16 0 31 2156 G 2187 3840 -> 15 0 30 2156 G 2242 3841 -> 16 0 30 2156 G 2195 3841 -> 15 0 31 2156 G 2195 3842 -> 16 0 31 2156 G 2193 3842 -> 15 0 30 2156 G 2242 3843 -> 16 0 30 2156 G 2201 3843 -> 15 0 31 2156 G 2201 3844 -> 16 0 31 2156 G 2199 3844 -> 15 0 30 2156 G 2242 3845 -> 16 0 30 2156 G 2207 3845 -> 15 0 31 2156 G 2207 3846 -> 16 0 31 2156 G 2205 3846 -> 15 0 30 2156 G 2242 3847 -> 16 0 30 2156 G 2213 3847 -> 15 0 31 2156 G 2213 3848 -> 16 0 31 2156 G 2211 3848 -> 15 0 30 2156 G 2242 3849 -> 16 0 30 2156 G 2159 3849 -> 15 0 31 2156 G 2159 3850 -> 16 0 31 2156 G 2157 3850 -> 15 0 32 2156 G 2242 3851 -> 16 0 32 2156 G 2241 3851 -> 15 0 30 2156 G 2242 3852 -> 16 0 30 2156 G 2165 3852 -> 15 0 31 2156 G 2165 3853 -> 16 0 31 2156 G 2163 3853 -> 15 0 30 2156 G 2242 3854 -> 16 0 30 2156 G 2222 3854 -> 15 0 31 2156 G 2222 3855 -> 16 0 31 2156 G 2220 3855 -> 15 0 30 2156 G 2242 3856 -> 16 0 30 2156 G 2171 3856 -> 15 0 31 2156 G 2171 3857 -> 16 0 31 2156 G 2169 3857 -> 15 0 30 2156 G 2242 3858 -> 16 0 30 2156 G 2228 3858 -> 15 0 31 2156 G 2228 3859 -> 16 0 31 2156 G 2226 3859 -> 15 0 30 2156 G 2242 3860 -> 16 0 30 2156 G 2177 3860 -> 15 0 31 2156 G 2177 3861 -> 16 0 31 2156 G 2175 3861 -> 15 0 30 2156 G 2242 3862 -> 16 0 30 2156 G 2234 3862 -> 15 0 31 2156 G 2234 3863 -> 16 0 31 2156 G 2232 3863 -> 15 0 30 2156 G 2242 3864 -> 16 0 30 2156 G 2183 3864 -> 15 0 31 2156 G 2183 3865 -> 16 0 31 2156 G 2181 3865 -> 15 0 30 2156 G 2242 3866 -> 16 0 30 2156 G 2240 3866 -> 15 0 31 2156 G 2240 3867 -> 16 0 31 2156 G 2238 3867 -> 15 0 30 2156 G 2242 3868 -> 16 0 30 2156 G 2192 3868 -> 15 0 31 2156 G 2192 3869 -> 16 0 31 2156 G 2190 3869 -> 15 0 30 2156 G 2242 3870 -> 16 0 30 2156 G 2198 3870 -> 15 0 31 2156 G 2198 3871 -> 16 0 31 2156 G 2196 3871 -> 15 0 30 2156 G 2242 3872 -> 16 0 30 2156 G 2204 3872 -> 15 0 31 2156 G 2204 3873 -> 16 0 31 2156 G 2202 3873 -> 15 0 30 2156 G 2242 3874 -> 16 0 30 2156 G 2210 3874 -> 15 0 31 2156 G 2210 3875 -> 16 0 31 2156 G 2208 3875 -> 15 0 30 2156 G 2242 3876 -> 16 0 30 2156 G 2216 3876 -> 15 0 31 2156 G 2216 3877 -> 16 0 31 2156 G 2214 3877 -> 15 0 29 2156 G 2217 3878 -> 16 0 29 2156 G 2218 3878 -> 15 0 30 2156 G 2218 3879 -> 16 0 30 2156 G 2242 3879 -> 15 0 30 2156 G 2242 3880 -> 16 0 30 2156 G 2162 3880 -> 15 0 31 2156 G 2162 3881 -> 16 0 31 2156 G 2160 3881 -> 15 0 29 2156 G 2166 3882 -> 16 0 29 2156 G 2167 3882 -> 15 0 30 2156 G 2167 3883 -> 16 0 30 2156 G 2242 3883 -> 15 0 29 2156 G 2223 3884 -> 16 0 29 2156 G 2224 3884 -> 15 0 30 2156 G 2224 3885 -> 16 0 30 2156 G 2242 3885 -> 15 0 29 2156 G 2172 3886 -> 16 0 29 2156 G 2173 3886 -> 15 0 30 2156 G 2173 3887 -> 16 0 30 2156 G 2242 3887 -> 15 0 29 2156 G 2229 3888 -> 16 0 29 2156 G 2230 3888 -> 15 0 30 2156 G 2230 3889 -> 16 0 30 2156 G 2242 3889 -> 15 0 29 2156 G 2178 3890 -> 16 0 29 2156 G 2179 3890 -> 15 0 30 2156 G 2179 3891 -> 16 0 30 2156 G 2242 3891 -> 15 0 29 2156 G 2235 3892 -> 16 0 29 2156 G 2236 3892 -> 15 0 30 2156 G 2236 3893 -> 16 0 30 2156 G 2242 3893 -> 15 0 29 2156 G 2184 3894 -> 16 0 29 2156 G 2185 3894 -> 15 0 30 2156 G 2185 3895 -> 16 0 30 2156 G 2242 3895 -> 15 0 29 2156 G 2187 3896 -> 16 0 29 2156 G 2188 3896 -> 15 0 30 2156 G 2188 3897 -> 16 0 30 2156 G 2242 3897 -> 15 0 29 2156 G 2193 3898 -> 16 0 29 2156 G 2194 3898 -> 15 0 30 2156 G 2194 3899 -> 16 0 30 2156 G 2242 3899 -> 15 0 29 2156 G 2199 3900 -> 16 0 29 2156 G 2200 3900 -> 15 0 30 2156 G 2200 3901 -> 16 0 30 2156 G 2242 3901 -> 15 0 29 2156 G 2205 3902 -> 16 0 29 2156 G 2206 3902 -> 15 0 30 2156 G 2206 3903 -> 16 0 30 2156 G 2242 3903 -> 15 0 29 2156 G 2211 3904 -> 16 0 29 2156 G 2212 3904 -> 15 0 30 2156 G 2212 3905 -> 16 0 30 2156 G 2242 3905 -> 15 0 29 2156 G 2157 3906 -> 16 0 29 2156 G 2158 3906 -> 15 0 30 2156 G 2158 3907 -> 16 0 30 2156 G 2242 3907 -> 15 0 29 2156 G 2163 3908 -> 16 0 29 2156 G 2164 3908 -> 15 0 30 2156 G 2164 3909 -> 16 0 30 2156 G 2242 3909 -> 15 0 29 2156 G 2220 3910 -> 16 0 29 2156 G 2221 3910 -> 15 0 30 2156 G 2221 3911 -> 16 0 30 2156 G 2242 3911 -> 15 0 29 2156 G 2169 3912 -> 16 0 29 2156 G 2170 3912 -> 15 0 30 2156 G 2170 3913 -> 16 0 30 2156 G 2242 3913 -> 15 0 29 2156 G 2226 3914 -> 16 0 29 2156 G 2227 3914 -> 15 0 30 2156 G 2227 3915 -> 16 0 30 2156 G 2242 3915 -> 15 0 29 2156 G 2175 3916 -> 16 0 29 2156 G 2176 3916 -> 15 0 30 2156 G 2176 3917 -> 16 0 30 2156 G 2242 3917 -> 15 0 29 2156 G 2232 3918 -> 16 0 29 2156 G 2233 3918 -> 15 0 30 2156 G 2233 3919 -> 16 0 30 2156 G 2242 3919 -> 15 0 29 2156 G 2181 3920 -> 16 0 29 2156 G 2182 3920 -> 15 0 30 2156 G 2182 3921 -> 16 0 30 2156 G 2242 3921 -> 15 0 29 2156 G 2238 3922 -> 16 0 29 2156 G 2239 3922 -> 15 0 30 2156 G 2239 3923 -> 16 0 30 2156 G 2242 3923 -> 15 0 29 2156 G 2190 3924 -> 16 0 29 2156 G 2191 3924 -> 15 0 30 2156 G 2191 3925 -> 16 0 30 2156 G 2242 3925 -> 15 0 29 2156 G 2196 3926 -> 16 0 29 2156 G 2197 3926 -> 15 0 30 2156 G 2197 3927 -> 16 0 30 2156 G 2242 3927 -> 15 0 29 2156 G 2202 3928 -> 16 0 29 2156 G 2203 3928 -> 15 0 30 2156 G 2203 3929 -> 16 0 30 2156 G 2242 3929 -> 15 0 29 2156 G 2208 3930 -> 16 0 29 2156 G 2209 3930 -> 15 0 30 2156 G 2209 3931 -> 16 0 30 2156 G 2242 3931 -> 15 0 29 2156 G 2214 3932 -> 16 0 29 2156 G 2215 3932 -> 15 0 30 2156 G 2215 3933 -> 16 0 30 2156 G 2242 3933 -> 15 0 29 2243 G 2274 3934 -> 16 0 29 2243 G 2275 3934 -> 15 0 30 2243 G 2275 3935 -> 16 0 30 2243 G 2341 3935 -> 15 0 30 2243 G 2341 3936 -> 16 0 30 2243 G 2333 3936 -> 15 0 31 2243 G 2333 3937 -> 16 0 31 2243 G 2331 3937 -> 15 0 30 2243 G 2341 3938 -> 16 0 30 2243 G 2282 3938 -> 15 0 31 2243 G 2282 3939 -> 16 0 31 2243 G 2280 3939 -> 15 0 30 2243 G 2341 3940 -> 16 0 30 2243 G 2339 3940 -> 15 0 31 2243 G 2339 3941 -> 16 0 31 2243 G 2337 3941 -> 15 0 30 2243 G 2341 3942 -> 16 0 30 2243 G 2288 3942 -> 15 0 31 2243 G 2288 3943 -> 16 0 31 2243 G 2286 3943 -> 15 0 30 2243 G 2341 3944 -> 16 0 30 2243 G 2294 3944 -> 15 0 31 2243 G 2294 3945 -> 16 0 31 2243 G 2292 3945 -> 15 0 30 2243 G 2341 3946 -> 16 0 30 2243 G 2300 3946 -> 15 0 31 2243 G 2300 3947 -> 16 0 31 2243 G 2298 3947 -> 15 0 30 2243 G 2341 3948 -> 16 0 30 2243 G 2246 3948 -> 15 0 31 2243 G 2246 3949 -> 16 0 31 2243 G 2244 3949 -> 15 0 30 2243 G 2341 3950 -> 16 0 30 2243 G 2303 3950 -> 15 0 31 2243 G 2303 3951 -> 16 0 31 2243 G 2301 3951 -> 15 0 30 2243 G 2341 3952 -> 16 0 30 2243 G 2252 3952 -> 15 0 31 2243 G 2252 3953 -> 16 0 31 2243 G 2250 3953 -> 15 0 30 2243 G 2341 3954 -> 16 0 30 2243 G 2309 3954 -> 15 0 31 2243 G 2309 3955 -> 16 0 31 2243 G 2307 3955 -> 15 0 30 2243 G 2341 3956 -> 16 0 30 2243 G 2258 3956 -> 15 0 31 2243 G 2258 3957 -> 16 0 31 2243 G 2256 3957 -> 15 0 30 2243 G 2341 3958 -> 16 0 30 2243 G 2315 3958 -> 15 0 31 2243 G 2315 3959 -> 16 0 31 2243 G 2313 3959 -> 15 0 30 2243 G 2341 3960 -> 16 0 30 2243 G 2264 3960 -> 15 0 31 2243 G 2264 3961 -> 16 0 31 2243 G 2262 3961 -> 15 0 30 2243 G 2341 3962 -> 16 0 30 2243 G 2321 3962 -> 15 0 31 2243 G 2321 3963 -> 16 0 31 2243 G 2319 3963 -> 15 0 30 2243 G 2341 3964 -> 16 0 30 2243 G 2270 3964 -> 15 0 31 2243 G 2270 3965 -> 16 0 31 2243 G 2268 3965 -> 15 0 30 2243 G 2341 3966 -> 16 0 30 2243 G 2327 3966 -> 15 0 31 2243 G 2327 3967 -> 16 0 31 2243 G 2325 3967 -> 15 0 30 2243 G 2341 3968 -> 16 0 30 2243 G 2273 3968 -> 15 0 31 2243 G 2273 3969 -> 16 0 31 2243 G 2271 3969 -> 15 0 30 2243 G 2341 3970 -> 16 0 30 2243 G 2279 3970 -> 15 0 31 2243 G 2279 3971 -> 16 0 31 2243 G 2277 3971 -> 15 0 30 2243 G 2341 3972 -> 16 0 30 2243 G 2336 3972 -> 15 0 31 2243 G 2336 3973 -> 16 0 31 2243 G 2334 3973 -> 15 0 30 2243 G 2341 3974 -> 16 0 30 2243 G 2285 3974 -> 15 0 31 2243 G 2285 3975 -> 16 0 31 2243 G 2283 3975 -> 15 0 30 2243 G 2341 3976 -> 16 0 30 2243 G 2291 3976 -> 15 0 31 2243 G 2291 3977 -> 16 0 31 2243 G 2289 3977 -> 15 0 30 2243 G 2341 3978 -> 16 0 30 2243 G 2297 3978 -> 15 0 31 2243 G 2297 3979 -> 16 0 31 2243 G 2295 3979 -> 15 0 32 2243 G 2341 3980 -> 16 0 32 2243 G 2340 3980 -> 15 0 30 2243 G 2341 3981 -> 16 0 30 2243 G 2249 3981 -> 15 0 31 2243 G 2249 3982 -> 16 0 31 2243 G 2247 3982 -> 15 0 30 2243 G 2341 3983 -> 16 0 30 2243 G 2306 3983 -> 15 0 31 2243 G 2306 3984 -> 16 0 31 2243 G 2304 3984 -> 15 0 30 2243 G 2341 3985 -> 16 0 30 2243 G 2255 3985 -> 15 0 31 2243 G 2255 3986 -> 16 0 31 2243 G 2253 3986 -> 15 0 30 2243 G 2341 3987 -> 16 0 30 2243 G 2312 3987 -> 15 0 31 2243 G 2312 3988 -> 16 0 31 2243 G 2310 3988 -> 15 0 30 2243 G 2341 3989 -> 16 0 30 2243 G 2261 3989 -> 15 0 31 2243 G 2261 3990 -> 16 0 31 2243 G 2259 3990 -> 15 0 30 2243 G 2341 3991 -> 16 0 30 2243 G 2318 3991 -> 15 0 31 2243 G 2318 3992 -> 16 0 31 2243 G 2316 3992 -> 15 0 30 2243 G 2341 3993 -> 16 0 30 2243 G 2267 3993 -> 15 0 31 2243 G 2267 3994 -> 16 0 31 2243 G 2265 3994 -> 15 0 30 2243 G 2341 3995 -> 16 0 30 2243 G 2324 3995 -> 15 0 31 2243 G 2324 3996 -> 16 0 31 2243 G 2322 3996 -> 15 0 30 2243 G 2341 3997 -> 16 0 30 2243 G 2330 3997 -> 15 0 31 2243 G 2330 3998 -> 16 0 31 2243 G 2328 3998 -> 15 0 29 2243 G 2331 3999 -> 16 0 29 2243 G 2332 3999 -> 15 0 30 2243 G 2332 4000 -> 16 0 30 2243 G 2341 4000 -> 15 0 30 2243 G 2341 4001 -> 16 0 30 2243 G 2276 4001 -> 15 0 31 2243 G 2276 4002 -> 16 0 31 2243 G 2274 4002 -> 15 0 29 2243 G 2280 4003 -> 16 0 29 2243 G 2281 4003 -> 15 0 30 2243 G 2281 4004 -> 16 0 30 2243 G 2341 4004 -> 15 0 29 2243 G 2337 4005 -> 16 0 29 2243 G 2338 4005 -> 15 0 30 2243 G 2338 4006 -> 16 0 30 2243 G 2341 4006 -> 15 0 29 2243 G 2286 4007 -> 16 0 29 2243 G 2287 4007 -> 15 0 30 2243 G 2287 4008 -> 16 0 30 2243 G 2341 4008 -> 15 0 29 2243 G 2292 4009 -> 16 0 29 2243 G 2293 4009 -> 15 0 30 2243 G 2293 4010 -> 16 0 30 2243 G 2341 4010 -> 15 0 29 2243 G 2298 4011 -> 16 0 29 2243 G 2299 4011 -> 15 0 30 2243 G 2299 4012 -> 16 0 30 2243 G 2341 4012 -> 15 0 29 2243 G 2244 4013 -> 16 0 29 2243 G 2245 4013 -> 15 0 30 2243 G 2245 4014 -> 16 0 30 2243 G 2341 4014 -> 15 0 29 2243 G 2301 4015 -> 16 0 29 2243 G 2302 4015 -> 15 0 30 2243 G 2302 4016 -> 16 0 30 2243 G 2341 4016 -> 15 0 29 2243 G 2250 4017 -> 16 0 29 2243 G 2251 4017 -> 15 0 30 2243 G 2251 4018 -> 16 0 30 2243 G 2341 4018 -> 15 0 29 2243 G 2307 4019 -> 16 0 29 2243 G 2308 4019 -> 15 0 30 2243 G 2308 4020 -> 16 0 30 2243 G 2341 4020 -> 15 0 29 2243 G 2256 4021 -> 16 0 29 2243 G 2257 4021 -> 15 0 30 2243 G 2257 4022 -> 16 0 30 2243 G 2341 4022 -> 15 0 29 2243 G 2313 4023 -> 16 0 29 2243 G 2314 4023 -> 15 0 30 2243 G 2314 4024 -> 16 0 30 2243 G 2341 4024 -> 15 0 29 2243 G 2262 4025 -> 16 0 29 2243 G 2263 4025 -> 15 0 30 2243 G 2263 4026 -> 16 0 30 2243 G 2341 4026 -> 15 0 29 2243 G 2319 4027 -> 16 0 29 2243 G 2320 4027 -> 15 0 30 2243 G 2320 4028 -> 16 0 30 2243 G 2341 4028 -> 15 0 29 2243 G 2268 4029 -> 16 0 29 2243 G 2269 4029 -> 15 0 30 2243 G 2269 4030 -> 16 0 30 2243 G 2341 4030 -> 15 0 29 2243 G 2325 4031 -> 16 0 29 2243 G 2326 4031 -> 15 0 30 2243 G 2326 4032 -> 16 0 30 2243 G 2341 4032 -> 15 0 29 2243 G 2271 4033 -> 16 0 29 2243 G 2272 4033 -> 15 0 30 2243 G 2272 4034 -> 16 0 30 2243 G 2341 4034 -> 15 0 29 2243 G 2277 4035 -> 16 0 29 2243 G 2278 4035 -> 15 0 30 2243 G 2278 4036 -> 16 0 30 2243 G 2341 4036 -> 15 0 29 2243 G 2334 4037 -> 16 0 29 2243 G 2335 4037 -> 15 0 30 2243 G 2335 4038 -> 16 0 30 2243 G 2341 4038 -> 15 0 29 2243 G 2283 4039 -> 16 0 29 2243 G 2284 4039 -> 15 0 30 2243 G 2284 4040 -> 16 0 30 2243 G 2341 4040 -> 15 0 29 2243 G 2289 4041 -> 16 0 29 2243 G 2290 4041 -> 15 0 30 2243 G 2290 4042 -> 16 0 30 2243 G 2341 4042 -> 15 0 29 2243 G 2295 4043 -> 16 0 29 2243 G 2296 4043 -> 15 0 30 2243 G 2296 4044 -> 16 0 30 2243 G 2341 4044 -> 15 0 29 2243 G 2247 4045 -> 16 0 29 2243 G 2248 4045 -> 15 0 30 2243 G 2248 4046 -> 16 0 30 2243 G 2341 4046 -> 15 0 29 2243 G 2304 4047 -> 16 0 29 2243 G 2305 4047 -> 15 0 30 2243 G 2305 4048 -> 16 0 30 2243 G 2341 4048 -> 15 0 29 2243 G 2253 4049 -> 16 0 29 2243 G 2254 4049 -> 15 0 30 2243 G 2254 4050 -> 16 0 30 2243 G 2341 4050 -> 15 0 29 2243 G 2310 4051 -> 16 0 29 2243 G 2311 4051 -> 15 0 30 2243 G 2311 4052 -> 16 0 30 2243 G 2341 4052 -> 15 0 29 2243 G 2259 4053 -> 16 0 29 2243 G 2260 4053 -> 15 0 30 2243 G 2260 4054 -> 16 0 30 2243 G 2341 4054 -> 15 0 29 2243 G 2316 4055 -> 16 0 29 2243 G 2317 4055 -> 15 0 30 2243 G 2317 4056 -> 16 0 30 2243 G 2341 4056 -> 15 0 29 2243 G 2265 4057 -> 16 0 29 2243 G 2266 4057 -> 15 0 30 2243 G 2266 4058 -> 16 0 30 2243 G 2341 4058 -> 15 0 29 2243 G 2322 4059 -> 16 0 29 2243 G 2323 4059 -> 15 0 30 2243 G 2323 4060 -> 16 0 30 2243 G 2341 4060 -> 15 0 29 2243 G 2328 4061 -> 16 0 29 2243 G 2329 4061 -> 15 0 30 2243 G 2329 4062 -> 16 0 30 2243 G 2341 4062 -> 15 0 34 2056 G 2343 4063 -> 16 0 34 2056 G 2344 4063 -> 15 0 35 2056 G 2344 4064 -> 16 0 35 2056 G 2154 4064 -> 15 0 35 2056 G 2344 4065 -> 16 0 35 2056 G 2241 4065 -> 15 0 35 2056 G 2344 4066 -> 16 0 35 2056 G 2340 4066 -> 15 0 37 1606 G 2053 4067 -> 16 0 37 1606 G 2055 4067 -> 15 0 21 1606 G 2055 4068 -> 16 0 21 1606 G 2345 4068 -> 15 0 36 1606 G 2345 4069 -> 16 0 36 1606 G 2343 4069 -> 15 0 28 1606 G 2055 4070 -> 16 0 28 1606 G 2347 4070 -> 15 0 28 1606 G 2345 4071 -> 16 0 28 1606 G 2347 4071 -> 15 0 23 462 G 469 4072 -> 16 0 23 462 G 470 4072 -> 15 0 24 462 G 470 4073 -> 16 0 24 462 G 494 4073 -> 15 0 24 462 G 494 4074 -> 16 0 24 462 G 483 4074 -> 15 0 25 462 G 483 4075 -> 16 0 25 462 G 481 4075 -> 15 0 26 462 G 494 4076 -> 16 0 26 462 G 493 4076 -> 15 0 24 462 G 494 4077 -> 16 0 24 462 G 492 4077 -> 15 0 25 462 G 492 4078 -> 16 0 25 462 G 490 4078 -> 15 0 24 462 G 494 4079 -> 16 0 24 462 G 474 4079 -> 15 0 25 462 G 474 4080 -> 16 0 25 462 G 472 4080 -> 15 0 24 462 G 494 4081 -> 16 0 24 462 G 486 4081 -> 15 0 25 462 G 486 4082 -> 16 0 25 462 G 484 4082 -> 15 0 24 462 G 494 4083 -> 16 0 24 462 G 465 4083 -> 15 0 25 462 G 465 4084 -> 16 0 25 462 G 463 4084 -> 15 0 24 462 G 494 4085 -> 16 0 24 462 G 477 4085 -> 15 0 25 462 G 477 4086 -> 16 0 25 462 G 475 4086 -> 15 0 24 462 G 494 4087 -> 16 0 24 462 G 489 4087 -> 15 0 25 462 G 489 4088 -> 16 0 25 462 G 487 4088 -> 15 0 24 462 G 494 4089 -> 16 0 24 462 G 468 4089 -> 15 0 25 462 G 468 4090 -> 16 0 25 462 G 466 4090 -> 15 0 24 462 G 494 4091 -> 16 0 24 462 G 480 4091 -> 15 0 25 462 G 480 4092 -> 16 0 25 462 G 478 4092 -> 15 0 23 462 G 481 4093 -> 16 0 23 462 G 482 4093 -> 15 0 24 462 G 482 4094 -> 16 0 24 462 G 494 4094 -> 15 0 24 462 G 494 4095 -> 16 0 24 462 G 471 4095 -> 15 0 25 462 G 471 4096 -> 16 0 25 462 G 469 4096 -> 15 0 23 462 G 490 4097 -> 16 0 23 462 G 491 4097 -> 15 0 24 462 G 491 4098 -> 16 0 24 462 G 494 4098 -> 15 0 23 462 G 472 4099 -> 16 0 23 462 G 473 4099 -> 15 0 24 462 G 473 4100 -> 16 0 24 462 G 494 4100 -> 15 0 23 462 G 484 4101 -> 16 0 23 462 G 485 4101 -> 15 0 24 462 G 485 4102 -> 16 0 24 462 G 494 4102 -> 15 0 23 462 G 463 4103 -> 16 0 23 462 G 464 4103 -> 15 0 24 462 G 464 4104 -> 16 0 24 462 G 494 4104 -> 15 0 23 462 G 475 4105 -> 16 0 23 462 G 476 4105 -> 15 0 24 462 G 476 4106 -> 16 0 24 462 G 494 4106 -> 15 0 23 462 G 487 4107 -> 16 0 23 462 G 488 4107 -> 15 0 24 462 G 488 4108 -> 16 0 24 462 G 494 4108 -> 15 0 23 462 G 466 4109 -> 16 0 23 462 G 467 4109 -> 15 0 24 462 G 467 4110 -> 16 0 24 462 G 494 4110 -> 15 0 23 462 G 478 4111 -> 16 0 23 462 G 479 4111 -> 15 0 24 462 G 479 4112 -> 16 0 24 462 G 494 4112 -> 15 0 23 22 G 35 4113 -> 16 0 23 22 G 36 4113 -> 15 0 24 22 G 36 4114 -> 16 0 24 22 G 177 4114 -> 15 0 24 22 G 177 4115 -> 16 0 24 22 G 49 4115 -> 15 0 25 22 G 49 4116 -> 16 0 25 22 G 47 4116 -> 15 0 24 22 G 177 4117 -> 16 0 24 22 G 85 4117 -> 15 0 25 22 G 85 4118 -> 16 0 25 22 G 83 4118 -> 15 0 24 22 G 177 4119 -> 16 0 24 22 G 61 4119 -> 15 0 25 22 G 61 4120 -> 16 0 25 22 G 59 4120 -> 15 0 24 22 G 177 4121 -> 16 0 24 22 G 145 4121 -> 15 0 25 22 G 145 4122 -> 16 0 25 22 G 143 4122 -> 15 0 24 22 G 177 4123 -> 16 0 24 22 G 121 4123 -> 15 0 25 22 G 121 4124 -> 16 0 25 22 G 119 4124 -> 15 0 24 22 G 177 4125 -> 16 0 24 22 G 97 4125 -> 15 0 25 22 G 97 4126 -> 16 0 25 22 G 95 4126 -> 15 0 24 22 G 177 4127 -> 16 0 24 22 G 73 4127 -> 15 0 25 22 G 73 4128 -> 16 0 25 22 G 71 4128 -> 15 0 24 22 G 177 4129 -> 16 0 24 22 G 157 4129 -> 15 0 25 22 G 157 4130 -> 16 0 25 22 G 155 4130 -> 15 0 24 22 G 177 4131 -> 16 0 24 22 G 133 4131 -> 15 0 25 22 G 133 4132 -> 16 0 25 22 G 131 4132 -> 15 0 24 22 G 177 4133 -> 16 0 24 22 G 109 4133 -> 15 0 25 22 G 109 4134 -> 16 0 25 22 G 107 4134 -> 15 0 24 22 G 177 4135 -> 16 0 24 22 G 169 4135 -> 15 0 25 22 G 169 4136 -> 16 0 25 22 G 167 4136 -> 15 0 24 22 G 177 4137 -> 16 0 24 22 G 28 4137 -> 15 0 25 22 G 28 4138 -> 16 0 25 22 G 26 4138 -> 15 0 24 22 G 177 4139 -> 16 0 24 22 G 40 4139 -> 15 0 25 22 G 40 4140 -> 16 0 25 22 G 38 4140 -> 15 0 24 22 G 177 4141 -> 16 0 24 22 G 52 4141 -> 15 0 25 22 G 52 4142 -> 16 0 25 22 G 50 4142 -> 15 0 24 22 G 177 4143 -> 16 0 24 22 G 112 4143 -> 15 0 25 22 G 112 4144 -> 16 0 25 22 G 110 4144 -> 15 0 24 22 G 177 4145 -> 16 0 24 22 G 88 4145 -> 15 0 25 22 G 88 4146 -> 16 0 25 22 G 86 4146 -> 15 0 24 22 G 177 4147 -> 16 0 24 22 G 64 4147 -> 15 0 25 22 G 64 4148 -> 16 0 25 22 G 62 4148 -> 15 0 24 22 G 177 4149 -> 16 0 24 22 G 172 4149 -> 15 0 25 22 G 172 4150 -> 16 0 25 22 G 170 4150 -> 15 0 24 22 G 177 4151 -> 16 0 24 22 G 148 4151 -> 15 0 25 22 G 148 4152 -> 16 0 25 22 G 146 4152 -> 15 0 24 22 G 177 4153 -> 16 0 24 22 G 124 4153 -> 15 0 25 22 G 124 4154 -> 16 0 25 22 G 122 4154 -> 15 0 24 22 G 177 4155 -> 16 0 24 22 G 100 4155 -> 15 0 25 22 G 100 4156 -> 16 0 25 22 G 98 4156 -> 15 0 24 22 G 177 4157 -> 16 0 24 22 G 76 4157 -> 15 0 25 22 G 76 4158 -> 16 0 25 22 G 74 4158 -> 15 0 24 22 G 177 4159 -> 16 0 24 22 G 160 4159 -> 15 0 25 22 G 160 4160 -> 16 0 25 22 G 158 4160 -> 15 0 24 22 G 177 4161 -> 16 0 24 22 G 136 4161 -> 15 0 25 22 G 136 4162 -> 16 0 25 22 G 134 4162 -> 15 0 24 22 G 177 4163 -> 16 0 24 22 G 31 4163 -> 15 0 25 22 G 31 4164 -> 16 0 25 22 G 29 4164 -> 15 0 24 22 G 177 4165 -> 16 0 24 22 G 43 4165 -> 15 0 25 22 G 43 4166 -> 16 0 25 22 G 41 4166 -> 15 0 24 22 G 177 4167 -> 16 0 24 22 G 55 4167 -> 15 0 25 22 G 55 4168 -> 16 0 25 22 G 53 4168 -> 15 0 24 22 G 177 4169 -> 16 0 24 22 G 115 4169 -> 15 0 25 22 G 115 4170 -> 16 0 25 22 G 113 4170 -> 15 0 24 22 G 177 4171 -> 16 0 24 22 G 91 4171 -> 15 0 25 22 G 91 4172 -> 16 0 25 22 G 89 4172 -> 15 0 24 22 G 177 4173 -> 16 0 24 22 G 67 4173 -> 15 0 25 22 G 67 4174 -> 16 0 25 22 G 65 4174 -> 15 0 24 22 G 177 4175 -> 16 0 24 22 G 175 4175 -> 15 0 25 22 G 175 4176 -> 16 0 25 22 G 173 4176 -> 15 0 24 22 G 177 4177 -> 16 0 24 22 G 151 4177 -> 15 0 25 22 G 151 4178 -> 16 0 25 22 G 149 4178 -> 15 0 24 22 G 177 4179 -> 16 0 24 22 G 127 4179 -> 15 0 25 22 G 127 4180 -> 16 0 25 22 G 125 4180 -> 15 0 24 22 G 177 4181 -> 16 0 24 22 G 103 4181 -> 15 0 25 22 G 103 4182 -> 16 0 25 22 G 101 4182 -> 15 0 24 22 G 177 4183 -> 16 0 24 22 G 79 4183 -> 15 0 25 22 G 79 4184 -> 16 0 25 22 G 77 4184 -> 15 0 24 22 G 177 4185 -> 16 0 24 22 G 163 4185 -> 15 0 25 22 G 163 4186 -> 16 0 25 22 G 161 4186 -> 15 0 24 22 G 177 4187 -> 16 0 24 22 G 139 4187 -> 15 0 25 22 G 139 4188 -> 16 0 25 22 G 137 4188 -> 15 0 24 22 G 177 4189 -> 16 0 24 22 G 34 4189 -> 15 0 25 22 G 34 4190 -> 16 0 25 22 G 32 4190 -> 15 0 24 22 G 177 4191 -> 16 0 24 22 G 46 4191 -> 15 0 25 22 G 46 4192 -> 16 0 25 22 G 44 4192 -> 15 0 24 22 G 177 4193 -> 16 0 24 22 G 82 4193 -> 15 0 25 22 G 82 4194 -> 16 0 25 22 G 80 4194 -> 15 0 24 22 G 177 4195 -> 16 0 24 22 G 58 4195 -> 15 0 25 22 G 58 4196 -> 16 0 25 22 G 56 4196 -> 15 0 24 22 G 177 4197 -> 16 0 24 22 G 142 4197 -> 15 0 25 22 G 142 4198 -> 16 0 25 22 G 140 4198 -> 15 0 24 22 G 177 4199 -> 16 0 24 22 G 118 4199 -> 15 0 25 22 G 118 4200 -> 16 0 25 22 G 116 4200 -> 15 0 24 22 G 177 4201 -> 16 0 24 22 G 94 4201 -> 15 0 25 22 G 94 4202 -> 16 0 25 22 G 92 4202 -> 15 0 24 22 G 177 4203 -> 16 0 24 22 G 70 4203 -> 15 0 25 22 G 70 4204 -> 16 0 25 22 G 68 4204 -> 15 0 24 22 G 177 4205 -> 16 0 24 22 G 154 4205 -> 15 0 25 22 G 154 4206 -> 16 0 25 22 G 152 4206 -> 15 0 26 22 G 177 4207 -> 16 0 26 22 G 176 4207 -> 15 0 24 22 G 177 4208 -> 16 0 24 22 G 130 4208 -> 15 0 25 22 G 130 4209 -> 16 0 25 22 G 128 4209 -> 15 0 24 22 G 177 4210 -> 16 0 24 22 G 106 4210 -> 15 0 25 22 G 106 4211 -> 16 0 25 22 G 104 4211 -> 15 0 24 22 G 177 4212 -> 16 0 24 22 G 166 4212 -> 15 0 25 22 G 166 4213 -> 16 0 25 22 G 164 4213 -> 15 0 24 22 G 177 4214 -> 16 0 24 22 G 25 4214 -> 15 0 25 22 G 25 4215 -> 16 0 25 22 G 23 4215 -> 15 0 23 22 G 47 4216 -> 16 0 23 22 G 48 4216 -> 15 0 24 22 G 48 4217 -> 16 0 24 22 G 177 4217 -> 15 0 24 22 G 177 4218 -> 16 0 24 22 G 37 4218 -> 15 0 25 22 G 37 4219 -> 16 0 25 22 G 35 4219 -> 15 0 23 22 G 83 4220 -> 16 0 23 22 G 84 4220 -> 15 0 24 22 G 84 4221 -> 16 0 24 22 G 177 4221 -> 15 0 23 22 G 59 4222 -> 16 0 23 22 G 60 4222 -> 15 0 24 22 G 60 4223 -> 16 0 24 22 G 177 4223 -> 15 0 23 22 G 143 4224 -> 16 0 23 22 G 144 4224 -> 15 0 24 22 G 144 4225 -> 16 0 24 22 G 177 4225 -> 15 0 23 22 G 119 4226 -> 16 0 23 22 G 120 4226 -> 15 0 24 22 G 120 4227 -> 16 0 24 22 G 177 4227 -> 15 0 23 22 G 95 4228 -> 16 0 23 22 G 96 4228 -> 15 0 24 22 G 96 4229 -> 16 0 24 22 G 177 4229 -> 15 0 23 22 G 71 4230 -> 16 0 23 22 G 72 4230 -> 15 0 24 22 G 72 4231 -> 16 0 24 22 G 177 4231 -> 15 0 23 22 G 155 4232 -> 16 0 23 22 G 156 4232 -> 15 0 24 22 G 156 4233 -> 16 0 24 22 G 177 4233 -> 15 0 23 22 G 131 4234 -> 16 0 23 22 G 132 4234 -> 15 0 24 22 G 132 4235 -> 16 0 24 22 G 177 4235 -> 15 0 23 22 G 107 4236 -> 16 0 23 22 G 108 4236 -> 15 0 24 22 G 108 4237 -> 16 0 24 22 G 177 4237 -> 15 0 23 22 G 167 4238 -> 16 0 23 22 G 168 4238 -> 15 0 24 22 G 168 4239 -> 16 0 24 22 G 177 4239 -> 15 0 23 22 G 26 4240 -> 16 0 23 22 G 27 4240 -> 15 0 24 22 G 27 4241 -> 16 0 24 22 G 177 4241 -> 15 0 23 22 G 38 4242 -> 16 0 23 22 G 39 4242 -> 15 0 24 22 G 39 4243 -> 16 0 24 22 G 177 4243 -> 15 0 23 22 G 50 4244 -> 16 0 23 22 G 51 4244 -> 15 0 24 22 G 51 4245 -> 16 0 24 22 G 177 4245 -> 15 0 23 22 G 110 4246 -> 16 0 23 22 G 111 4246 -> 15 0 24 22 G 111 4247 -> 16 0 24 22 G 177 4247 -> 15 0 23 22 G 86 4248 -> 16 0 23 22 G 87 4248 -> 15 0 24 22 G 87 4249 -> 16 0 24 22 G 177 4249 -> 15 0 23 22 G 62 4250 -> 16 0 23 22 G 63 4250 -> 15 0 24 22 G 63 4251 -> 16 0 24 22 G 177 4251 -> 15 0 23 22 G 170 4252 -> 16 0 23 22 G 171 4252 -> 15 0 24 22 G 171 4253 -> 16 0 24 22 G 177 4253 -> 15 0 23 22 G 146 4254 -> 16 0 23 22 G 147 4254 -> 15 0 24 22 G 147 4255 -> 16 0 24 22 G 177 4255 -> 15 0 23 22 G 122 4256 -> 16 0 23 22 G 123 4256 -> 15 0 24 22 G 123 4257 -> 16 0 24 22 G 177 4257 -> 15 0 23 22 G 98 4258 -> 16 0 23 22 G 99 4258 -> 15 0 24 22 G 99 4259 -> 16 0 24 22 G 177 4259 -> 15 0 23 22 G 74 4260 -> 16 0 23 22 G 75 4260 -> 15 0 24 22 G 75 4261 -> 16 0 24 22 G 177 4261 -> 15 0 23 22 G 158 4262 -> 16 0 23 22 G 159 4262 -> 15 0 24 22 G 159 4263 -> 16 0 24 22 G 177 4263 -> 15 0 23 22 G 134 4264 -> 16 0 23 22 G 135 4264 -> 15 0 24 22 G 135 4265 -> 16 0 24 22 G 177 4265 -> 15 0 23 22 G 29 4266 -> 16 0 23 22 G 30 4266 -> 15 0 24 22 G 30 4267 -> 16 0 24 22 G 177 4267 -> 15 0 23 22 G 41 4268 -> 16 0 23 22 G 42 4268 -> 15 0 24 22 G 42 4269 -> 16 0 24 22 G 177 4269 -> 15 0 23 22 G 53 4270 -> 16 0 23 22 G 54 4270 -> 15 0 24 22 G 54 4271 -> 16 0 24 22 G 177 4271 -> 15 0 23 22 G 113 4272 -> 16 0 23 22 G 114 4272 -> 15 0 24 22 G 114 4273 -> 16 0 24 22 G 177 4273 -> 15 0 23 22 G 89 4274 -> 16 0 23 22 G 90 4274 -> 15 0 24 22 G 90 4275 -> 16 0 24 22 G 177 4275 -> 15 0 23 22 G 65 4276 -> 16 0 23 22 G 66 4276 -> 15 0 24 22 G 66 4277 -> 16 0 24 22 G 177 4277 -> 15 0 23 22 G 173 4278 -> 16 0 23 22 G 174 4278 -> 15 0 24 22 G 174 4279 -> 16 0 24 22 G 177 4279 -> 15 0 23 22 G 149 4280 -> 16 0 23 22 G 150 4280 -> 15 0 24 22 G 150 4281 -> 16 0 24 22 G 177 4281 -> 15 0 23 22 G 125 4282 -> 16 0 23 22 G 126 4282 -> 15 0 24 22 G 126 4283 -> 16 0 24 22 G 177 4283 -> 15 0 23 22 G 101 4284 -> 16 0 23 22 G 102 4284 -> 15 0 24 22 G 102 4285 -> 16 0 24 22 G 177 4285 -> 15 0 23 22 G 77 4286 -> 16 0 23 22 G 78 4286 -> 15 0 24 22 G 78 4287 -> 16 0 24 22 G 177 4287 -> 15 0 23 22 G 161 4288 -> 16 0 23 22 G 162 4288 -> 15 0 24 22 G 162 4289 -> 16 0 24 22 G 177 4289 -> 15 0 23 22 G 137 4290 -> 16 0 23 22 G 138 4290 -> 15 0 24 22 G 138 4291 -> 16 0 24 22 G 177 4291 -> 15 0 23 22 G 32 4292 -> 16 0 23 22 G 33 4292 -> 15 0 24 22 G 33 4293 -> 16 0 24 22 G 177 4293 -> 15 0 23 22 G 44 4294 -> 16 0 23 22 G 45 4294 -> 15 0 24 22 G 45 4295 -> 16 0 24 22 G 177 4295 -> 15 0 23 22 G 80 4296 -> 16 0 23 22 G 81 4296 -> 15 0 24 22 G 81 4297 -> 16 0 24 22 G 177 4297 -> 15 0 23 22 G 56 4298 -> 16 0 23 22 G 57 4298 -> 15 0 24 22 G 57 4299 -> 16 0 24 22 G 177 4299 -> 15 0 23 22 G 140 4300 -> 16 0 23 22 G 141 4300 -> 15 0 24 22 G 141 4301 -> 16 0 24 22 G 177 4301 -> 15 0 23 22 G 116 4302 -> 16 0 23 22 G 117 4302 -> 15 0 24 22 G 117 4303 -> 16 0 24 22 G 177 4303 -> 15 0 23 22 G 92 4304 -> 16 0 23 22 G 93 4304 -> 15 0 24 22 G 93 4305 -> 16 0 24 22 G 177 4305 -> 15 0 23 22 G 68 4306 -> 16 0 23 22 G 69 4306 -> 15 0 24 22 G 69 4307 -> 16 0 24 22 G 177 4307 -> 15 0 23 22 G 152 4308 -> 16 0 23 22 G 153 4308 -> 15 0 24 22 G 153 4309 -> 16 0 24 22 G 177 4309 -> 15 0 23 22 G 128 4310 -> 16 0 23 22 G 129 4310 -> 15 0 24 22 G 129 4311 -> 16 0 24 22 G 177 4311 -> 15 0 23 22 G 104 4312 -> 16 0 23 22 G 105 4312 -> 15 0 24 22 G 105 4313 -> 16 0 24 22 G 177 4313 -> 15 0 23 22 G 164 4314 -> 16 0 23 22 G 165 4314 -> 15 0 24 22 G 165 4315 -> 16 0 24 22 G 177 4315 -> 15 0 23 22 G 23 4316 -> 16 0 23 22 G 24 4316 -> 15 0 24 22 G 24 4317 -> 16 0 24 22 G 177 4317 -> 15 0 23 179 G 441 4318 -> 16 0 23 179 G 442 4318 -> 15 0 24 179 G 442 4319 -> 16 0 24 179 G 460 4319 -> 15 0 24 179 G 460 4320 -> 16 0 24 179 G 182 4320 -> 15 0 25 179 G 182 4321 -> 16 0 25 179 G 180 4321 -> 15 0 24 179 G 460 4322 -> 16 0 24 179 G 206 4322 -> 15 0 25 179 G 206 4323 -> 16 0 25 179 G 204 4323 -> 15 0 24 179 G 460 4324 -> 16 0 24 179 G 242 4324 -> 15 0 25 179 G 242 4325 -> 16 0 25 179 G 240 4325 -> 15 0 24 179 G 460 4326 -> 16 0 24 179 G 278 4326 -> 15 0 25 179 G 278 4327 -> 16 0 25 179 G 276 4327 -> 15 0 24 179 G 460 4328 -> 16 0 24 179 G 362 4328 -> 15 0 25 179 G 362 4329 -> 16 0 25 179 G 360 4329 -> 15 0 24 179 G 460 4330 -> 16 0 24 179 G 230 4330 -> 15 0 25 179 G 230 4331 -> 16 0 25 179 G 228 4331 -> 15 0 24 179 G 460 4332 -> 16 0 24 179 G 314 4332 -> 15 0 25 179 G 314 4333 -> 16 0 25 179 G 312 4333 -> 15 0 24 179 G 460 4334 -> 16 0 24 179 G 398 4334 -> 15 0 25 179 G 398 4335 -> 16 0 25 179 G 396 4335 -> 15 0 24 179 G 460 4336 -> 16 0 24 179 G 266 4336 -> 15 0 25 179 G 266 4337 -> 16 0 25 179 G 264 4337 -> 15 0 24 179 G 460 4338 -> 16 0 24 179 G 350 4338 -> 15 0 25 179 G 350 4339 -> 16 0 25 179 G 348 4339 -> 15 0 24 179 G 460 4340 -> 16 0 24 179 G 434 4340 -> 15 0 25 179 G 434 4341 -> 16 0 25 179 G 432 4341 -> 15 0 24 179 G 460 4342 -> 16 0 24 179 G 386 4342 -> 15 0 25 179 G 386 4343 -> 16 0 25 179 G 384 4343 -> 15 0 24 179 G 460 4344 -> 16 0 24 179 G 197 4344 -> 15 0 25 179 G 197 4345 -> 16 0 25 179 G 195 4345 -> 15 0 24 179 G 460 4346 -> 16 0 24 179 G 269 4346 -> 15 0 25 179 G 269 4347 -> 16 0 25 179 G 267 4347 -> 15 0 24 179 G 460 4348 -> 16 0 24 179 G 221 4348 -> 15 0 25 179 G 221 4349 -> 16 0 25 179 G 219 4349 -> 15 0 24 179 G 460 4350 -> 16 0 24 179 G 305 4350 -> 15 0 25 179 G 305 4351 -> 16 0 25 179 G 303 4351 -> 15 0 24 179 G 460 4352 -> 16 0 24 179 G 389 4352 -> 15 0 25 179 G 389 4353 -> 16 0 25 179 G 387 4353 -> 15 0 24 179 G 460 4354 -> 16 0 24 179 G 257 4354 -> 15 0 25 179 G 257 4355 -> 16 0 25 179 G 255 4355 -> 15 0 24 179 G 460 4356 -> 16 0 24 179 G 341 4356 -> 15 0 25 179 G 341 4357 -> 16 0 25 179 G 339 4357 -> 15 0 24 179 G 460 4358 -> 16 0 24 179 G 425 4358 -> 15 0 25 179 G 425 4359 -> 16 0 25 179 G 423 4359 -> 15 0 24 179 G 460 4360 -> 16 0 24 179 G 293 4360 -> 15 0 25 179 G 293 4361 -> 16 0 25 179 G 291 4361 -> 15 0 24 179 G 460 4362 -> 16 0 24 179 G 377 4362 -> 15 0 25 179 G 377 4363 -> 16 0 25 179 G 375 4363 -> 15 0 24 179 G 460 4364 -> 16 0 24 179 G 413 4364 -> 15 0 25 179 G 413 4365 -> 16 0 25 179 G 411 4365 -> 15 0 24 179 G 460 4366 -> 16 0 24 179 G 188 4366 -> 15 0 25 179 G 188 4367 -> 16 0 25 179 G 186 4367 -> 15 0 24 179 G 460 4368 -> 16 0 24 179 G 212 4368 -> 15 0 25 179 G 212 4369 -> 16 0 25 179 G 210 4369 -> 15 0 24 179 G 460 4370 -> 16 0 24 179 G 248 4370 -> 15 0 25 179 G 248 4371 -> 16 0 25 179 G 246 4371 -> 15 0 24 179 G 460 4372 -> 16 0 24 179 G 332 4372 -> 15 0 25 179 G 332 4373 -> 16 0 25 179 G 330 4373 -> 15 0 24 179 G 460 4374 -> 16 0 24 179 G 284 4374 -> 15 0 25 179 G 284 4375 -> 16 0 25 179 G 282 4375 -> 15 0 24 179 G 460 4376 -> 16 0 24 179 G 368 4376 -> 15 0 25 179 G 368 4377 -> 16 0 25 179 G 366 4377 -> 15 0 24 179 G 460 4378 -> 16 0 24 179 G 236 4378 -> 15 0 25 179 G 236 4379 -> 16 0 25 179 G 234 4379 -> 15 0 24 179 G 460 4380 -> 16 0 24 179 G 452 4380 -> 15 0 25 179 G 452 4381 -> 16 0 25 179 G 450 4381 -> 15 0 24 179 G 460 4382 -> 16 0 24 179 G 320 4382 -> 15 0 25 179 G 320 4383 -> 16 0 25 179 G 318 4383 -> 15 0 24 179 G 460 4384 -> 16 0 24 179 G 404 4384 -> 15 0 25 179 G 404 4385 -> 16 0 25 179 G 402 4385 -> 15 0 24 179 G 460 4386 -> 16 0 24 179 G 356 4386 -> 15 0 25 179 G 356 4387 -> 16 0 25 179 G 354 4387 -> 15 0 24 179 G 460 4388 -> 16 0 24 179 G 440 4388 -> 15 0 25 179 G 440 4389 -> 16 0 25 179 G 438 4389 -> 15 0 24 179 G 460 4390 -> 16 0 24 179 G 203 4390 -> 15 0 25 179 G 203 4391 -> 16 0 25 179 G 201 4391 -> 15 0 24 179 G 460 4392 -> 16 0 24 179 G 239 4392 -> 15 0 25 179 G 239 4393 -> 16 0 25 179 G 237 4393 -> 15 0 24 179 G 460 4394 -> 16 0 24 179 G 275 4394 -> 15 0 25 179 G 275 4395 -> 16 0 25 179 G 273 4395 -> 15 0 24 179 G 460 4396 -> 16 0 24 179 G 359 4396 -> 15 0 25 179 G 359 4397 -> 16 0 25 179 G 357 4397 -> 15 0 24 179 G 460 4398 -> 16 0 24 179 G 227 4398 -> 15 0 25 179 G 227 4399 -> 16 0 25 179 G 225 4399 -> 15 0 24 179 G 460 4400 -> 16 0 24 179 G 311 4400 -> 15 0 25 179 G 311 4401 -> 16 0 25 179 G 309 4401 -> 15 0 24 179 G 460 4402 -> 16 0 24 179 G 395 4402 -> 15 0 25 179 G 395 4403 -> 16 0 25 179 G 393 4403 -> 15 0 24 179 G 460 4404 -> 16 0 24 179 G 263 4404 -> 15 0 25 179 G 263 4405 -> 16 0 25 179 G 261 4405 -> 15 0 24 179 G 460 4406 -> 16 0 24 179 G 347 4406 -> 15 0 25 179 G 347 4407 -> 16 0 25 179 G 345 4407 -> 15 0 24 179 G 460 4408 -> 16 0 24 179 G 431 4408 -> 15 0 25 179 G 431 4409 -> 16 0 25 179 G 429 4409 -> 15 0 24 179 G 460 4410 -> 16 0 24 179 G 383 4410 -> 15 0 25 179 G 383 4411 -> 16 0 25 179 G 381 4411 -> 15 0 24 179 G 460 4412 -> 16 0 24 179 G 194 4412 -> 15 0 25 179 G 194 4413 -> 16 0 25 179 G 192 4413 -> 15 0 24 179 G 460 4414 -> 16 0 24 179 G 218 4414 -> 15 0 25 179 G 218 4415 -> 16 0 25 179 G 216 4415 -> 15 0 24 179 G 460 4416 -> 16 0 24 179 G 302 4416 -> 15 0 25 179 G 302 4417 -> 16 0 25 179 G 300 4417 -> 15 0 24 179 G 460 4418 -> 16 0 24 179 G 254 4418 -> 15 0 25 179 G 254 4419 -> 16 0 25 179 G 252 4419 -> 15 0 24 179 G 460 4420 -> 16 0 24 179 G 338 4420 -> 15 0 25 179 G 338 4421 -> 16 0 25 179 G 336 4421 -> 15 0 24 179 G 460 4422 -> 16 0 24 179 G 422 4422 -> 15 0 25 179 G 422 4423 -> 16 0 25 179 G 420 4423 -> 15 0 24 179 G 460 4424 -> 16 0 24 179 G 290 4424 -> 15 0 25 179 G 290 4425 -> 16 0 25 179 G 288 4425 -> 15 0 24 179 G 460 4426 -> 16 0 24 179 G 374 4426 -> 15 0 25 179 G 374 4427 -> 16 0 25 179 G 372 4427 -> 15 0 24 179 G 460 4428 -> 16 0 24 179 G 458 4428 -> 15 0 25 179 G 458 4429 -> 16 0 25 179 G 456 4429 -> 15 0 24 179 G 460 4430 -> 16 0 24 179 G 326 4430 -> 15 0 25 179 G 326 4431 -> 16 0 25 179 G 324 4431 -> 15 0 24 179 G 460 4432 -> 16 0 24 179 G 410 4432 -> 15 0 25 179 G 410 4433 -> 16 0 25 179 G 408 4433 -> 15 0 24 179 G 460 4434 -> 16 0 24 179 G 446 4434 -> 15 0 25 179 G 446 4435 -> 16 0 25 179 G 444 4435 -> 15 0 24 179 G 460 4436 -> 16 0 24 179 G 185 4436 -> 15 0 25 179 G 185 4437 -> 16 0 25 179 G 183 4437 -> 15 0 24 179 G 460 4438 -> 16 0 24 179 G 209 4438 -> 15 0 25 179 G 209 4439 -> 16 0 25 179 G 207 4439 -> 15 0 24 179 G 460 4440 -> 16 0 24 179 G 245 4440 -> 15 0 25 179 G 245 4441 -> 16 0 25 179 G 243 4441 -> 15 0 24 179 G 460 4442 -> 16 0 24 179 G 329 4442 -> 15 0 25 179 G 329 4443 -> 16 0 25 179 G 327 4443 -> 15 0 24 179 G 460 4444 -> 16 0 24 179 G 281 4444 -> 15 0 25 179 G 281 4445 -> 16 0 25 179 G 279 4445 -> 15 0 24 179 G 460 4446 -> 16 0 24 179 G 365 4446 -> 15 0 25 179 G 365 4447 -> 16 0 25 179 G 363 4447 -> 15 0 24 179 G 460 4448 -> 16 0 24 179 G 233 4448 -> 15 0 25 179 G 233 4449 -> 16 0 25 179 G 231 4449 -> 15 0 24 179 G 460 4450 -> 16 0 24 179 G 449 4450 -> 15 0 25 179 G 449 4451 -> 16 0 25 179 G 447 4451 -> 15 0 24 179 G 460 4452 -> 16 0 24 179 G 317 4452 -> 15 0 25 179 G 317 4453 -> 16 0 25 179 G 315 4453 -> 15 0 24 179 G 460 4454 -> 16 0 24 179 G 401 4454 -> 15 0 25 179 G 401 4455 -> 16 0 25 179 G 399 4455 -> 15 0 24 179 G 460 4456 -> 16 0 24 179 G 353 4456 -> 15 0 25 179 G 353 4457 -> 16 0 25 179 G 351 4457 -> 15 0 24 179 G 460 4458 -> 16 0 24 179 G 437 4458 -> 15 0 25 179 G 437 4459 -> 16 0 25 179 G 435 4459 -> 15 0 24 179 G 460 4460 -> 16 0 24 179 G 200 4460 -> 15 0 25 179 G 200 4461 -> 16 0 25 179 G 198 4461 -> 15 0 24 179 G 460 4462 -> 16 0 24 179 G 272 4462 -> 15 0 25 179 G 272 4463 -> 16 0 25 179 G 270 4463 -> 15 0 24 179 G 460 4464 -> 16 0 24 179 G 224 4464 -> 15 0 25 179 G 224 4465 -> 16 0 25 179 G 222 4465 -> 15 0 24 179 G 460 4466 -> 16 0 24 179 G 308 4466 -> 15 0 25 179 G 308 4467 -> 16 0 25 179 G 306 4467 -> 15 0 24 179 G 460 4468 -> 16 0 24 179 G 392 4468 -> 15 0 25 179 G 392 4469 -> 16 0 25 179 G 390 4469 -> 15 0 24 179 G 460 4470 -> 16 0 24 179 G 260 4470 -> 15 0 25 179 G 260 4471 -> 16 0 25 179 G 258 4471 -> 15 0 24 179 G 460 4472 -> 16 0 24 179 G 344 4472 -> 15 0 25 179 G 344 4473 -> 16 0 25 179 G 342 4473 -> 15 0 24 179 G 460 4474 -> 16 0 24 179 G 428 4474 -> 15 0 25 179 G 428 4475 -> 16 0 25 179 G 426 4475 -> 15 0 24 179 G 460 4476 -> 16 0 24 179 G 296 4476 -> 15 0 25 179 G 296 4477 -> 16 0 25 179 G 294 4477 -> 15 0 26 179 G 460 4478 -> 16 0 26 179 G 459 4478 -> 15 0 24 179 G 460 4479 -> 16 0 24 179 G 380 4479 -> 15 0 25 179 G 380 4480 -> 16 0 25 179 G 378 4480 -> 15 0 24 179 G 460 4481 -> 16 0 24 179 G 416 4481 -> 15 0 25 179 G 416 4482 -> 16 0 25 179 G 414 4482 -> 15 0 24 179 G 460 4483 -> 16 0 24 179 G 191 4483 -> 15 0 25 179 G 191 4484 -> 16 0 25 179 G 189 4484 -> 15 0 24 179 G 460 4485 -> 16 0 24 179 G 215 4485 -> 15 0 25 179 G 215 4486 -> 16 0 25 179 G 213 4486 -> 15 0 24 179 G 460 4487 -> 16 0 24 179 G 299 4487 -> 15 0 25 179 G 299 4488 -> 16 0 25 179 G 297 4488 -> 15 0 24 179 G 460 4489 -> 16 0 24 179 G 251 4489 -> 15 0 25 179 G 251 4490 -> 16 0 25 179 G 249 4490 -> 15 0 24 179 G 460 4491 -> 16 0 24 179 G 335 4491 -> 15 0 25 179 G 335 4492 -> 16 0 25 179 G 333 4492 -> 15 0 24 179 G 460 4493 -> 16 0 24 179 G 419 4493 -> 15 0 25 179 G 419 4494 -> 16 0 25 179 G 417 4494 -> 15 0 24 179 G 460 4495 -> 16 0 24 179 G 287 4495 -> 15 0 25 179 G 287 4496 -> 16 0 25 179 G 285 4496 -> 15 0 24 179 G 460 4497 -> 16 0 24 179 G 371 4497 -> 15 0 25 179 G 371 4498 -> 16 0 25 179 G 369 4498 -> 15 0 24 179 G 460 4499 -> 16 0 24 179 G 455 4499 -> 15 0 25 179 G 455 4500 -> 16 0 25 179 G 453 4500 -> 15 0 24 179 G 460 4501 -> 16 0 24 179 G 323 4501 -> 15 0 25 179 G 323 4502 -> 16 0 25 179 G 321 4502 -> 15 0 24 179 G 460 4503 -> 16 0 24 179 G 407 4503 -> 15 0 25 179 G 407 4504 -> 16 0 25 179 G 405 4504 -> 15 0 23 179 G 180 4505 -> 16 0 23 179 G 181 4505 -> 15 0 24 179 G 181 4506 -> 16 0 24 179 G 460 4506 -> 15 0 24 179 G 460 4507 -> 16 0 24 179 G 443 4507 -> 15 0 25 179 G 443 4508 -> 16 0 25 179 G 441 4508 -> 15 0 23 179 G 204 4509 -> 16 0 23 179 G 205 4509 -> 15 0 24 179 G 205 4510 -> 16 0 24 179 G 460 4510 -> 15 0 23 179 G 240 4511 -> 16 0 23 179 G 241 4511 -> 15 0 24 179 G 241 4512 -> 16 0 24 179 G 460 4512 -> 15 0 23 179 G 276 4513 -> 16 0 23 179 G 277 4513 -> 15 0 24 179 G 277 4514 -> 16 0 24 179 G 460 4514 -> 15 0 23 179 G 360 4515 -> 16 0 23 179 G 361 4515 -> 15 0 24 179 G 361 4516 -> 16 0 24 179 G 460 4516 -> 15 0 23 179 G 228 4517 -> 16 0 23 179 G 229 4517 -> 15 0 24 179 G 229 4518 -> 16 0 24 179 G 460 4518 -> 15 0 23 179 G 312 4519 -> 16 0 23 179 G 313 4519 -> 15 0 24 179 G 313 4520 -> 16 0 24 179 G 460 4520 -> 15 0 23 179 G 396 4521 -> 16 0 23 179 G 397 4521 -> 15 0 24 179 G 397 4522 -> 16 0 24 179 G 460 4522 -> 15 0 23 179 G 264 4523 -> 16 0 23 179 G 265 4523 -> 15 0 24 179 G 265 4524 -> 16 0 24 179 G 460 4524 -> 15 0 23 179 G 348 4525 -> 16 0 23 179 G 349 4525 -> 15 0 24 179 G 349 4526 -> 16 0 24 179 G 460 4526 -> 15 0 23 179 G 432 4527 -> 16 0 23 179 G 433 4527 -> 15 0 24 179 G 433 4528 -> 16 0 24 179 G 460 4528 -> 15 0 23 179 G 384 4529 -> 16 0 23 179 G 385 4529 -> 15 0 24 179 G 385 4530 -> 16 0 24 179 G 460 4530 -> 15 0 23 179 G 195 4531 -> 16 0 23 179 G 196 4531 -> 15 0 24 179 G 196 4532 -> 16 0 24 179 G 460 4532 -> 15 0 23 179 G 267 4533 -> 16 0 23 179 G 268 4533 -> 15 0 24 179 G 268 4534 -> 16 0 24 179 G 460 4534 -> 15 0 23 179 G 219 4535 -> 16 0 23 179 G 220 4535 -> 15 0 24 179 G 220 4536 -> 16 0 24 179 G 460 4536 -> 15 0 23 179 G 303 4537 -> 16 0 23 179 G 304 4537 -> 15 0 24 179 G 304 4538 -> 16 0 24 179 G 460 4538 -> 15 0 23 179 G 387 4539 -> 16 0 23 179 G 388 4539 -> 15 0 24 179 G 388 4540 -> 16 0 24 179 G 460 4540 -> 15 0 23 179 G 255 4541 -> 16 0 23 179 G 256 4541 -> 15 0 24 179 G 256 4542 -> 16 0 24 179 G 460 4542 -> 15 0 23 179 G 339 4543 -> 16 0 23 179 G 340 4543 -> 15 0 24 179 G 340 4544 -> 16 0 24 179 G 460 4544 -> 15 0 23 179 G 423 4545 -> 16 0 23 179 G 424 4545 -> 15 0 24 179 G 424 4546 -> 16 0 24 179 G 460 4546 -> 15 0 23 179 G 291 4547 -> 16 0 23 179 G 292 4547 -> 15 0 24 179 G 292 4548 -> 16 0 24 179 G 460 4548 -> 15 0 23 179 G 375 4549 -> 16 0 23 179 G 376 4549 -> 15 0 24 179 G 376 4550 -> 16 0 24 179 G 460 4550 -> 15 0 23 179 G 411 4551 -> 16 0 23 179 G 412 4551 -> 15 0 24 179 G 412 4552 -> 16 0 24 179 G 460 4552 -> 15 0 23 179 G 186 4553 -> 16 0 23 179 G 187 4553 -> 15 0 24 179 G 187 4554 -> 16 0 24 179 G 460 4554 -> 15 0 23 179 G 210 4555 -> 16 0 23 179 G 211 4555 -> 15 0 24 179 G 211 4556 -> 16 0 24 179 G 460 4556 -> 15 0 23 179 G 246 4557 -> 16 0 23 179 G 247 4557 -> 15 0 24 179 G 247 4558 -> 16 0 24 179 G 460 4558 -> 15 0 23 179 G 330 4559 -> 16 0 23 179 G 331 4559 -> 15 0 24 179 G 331 4560 -> 16 0 24 179 G 460 4560 -> 15 0 23 179 G 282 4561 -> 16 0 23 179 G 283 4561 -> 15 0 24 179 G 283 4562 -> 16 0 24 179 G 460 4562 -> 15 0 23 179 G 366 4563 -> 16 0 23 179 G 367 4563 -> 15 0 24 179 G 367 4564 -> 16 0 24 179 G 460 4564 -> 15 0 23 179 G 234 4565 -> 16 0 23 179 G 235 4565 -> 15 0 24 179 G 235 4566 -> 16 0 24 179 G 460 4566 -> 15 0 23 179 G 450 4567 -> 16 0 23 179 G 451 4567 -> 15 0 24 179 G 451 4568 -> 16 0 24 179 G 460 4568 -> 15 0 23 179 G 318 4569 -> 16 0 23 179 G 319 4569 -> 15 0 24 179 G 319 4570 -> 16 0 24 179 G 460 4570 -> 15 0 23 179 G 402 4571 -> 16 0 23 179 G 403 4571 -> 15 0 24 179 G 403 4572 -> 16 0 24 179 G 460 4572 -> 15 0 23 179 G 354 4573 -> 16 0 23 179 G 355 4573 -> 15 0 24 179 G 355 4574 -> 16 0 24 179 G 460 4574 -> 15 0 23 179 G 438 4575 -> 16 0 23 179 G 439 4575 -> 15 0 24 179 G 439 4576 -> 16 0 24 179 G 460 4576 -> 15 0 23 179 G 201 4577 -> 16 0 23 179 G 202 4577 -> 15 0 24 179 G 202 4578 -> 16 0 24 179 G 460 4578 -> 15 0 23 179 G 237 4579 -> 16 0 23 179 G 238 4579 -> 15 0 24 179 G 238 4580 -> 16 0 24 179 G 460 4580 -> 15 0 23 179 G 273 4581 -> 16 0 23 179 G 274 4581 -> 15 0 24 179 G 274 4582 -> 16 0 24 179 G 460 4582 -> 15 0 23 179 G 357 4583 -> 16 0 23 179 G 358 4583 -> 15 0 24 179 G 358 4584 -> 16 0 24 179 G 460 4584 -> 15 0 23 179 G 225 4585 -> 16 0 23 179 G 226 4585 -> 15 0 24 179 G 226 4586 -> 16 0 24 179 G 460 4586 -> 15 0 23 179 G 309 4587 -> 16 0 23 179 G 310 4587 -> 15 0 24 179 G 310 4588 -> 16 0 24 179 G 460 4588 -> 15 0 23 179 G 393 4589 -> 16 0 23 179 G 394 4589 -> 15 0 24 179 G 394 4590 -> 16 0 24 179 G 460 4590 -> 15 0 23 179 G 261 4591 -> 16 0 23 179 G 262 4591 -> 15 0 24 179 G 262 4592 -> 16 0 24 179 G 460 4592 -> 15 0 23 179 G 345 4593 -> 16 0 23 179 G 346 4593 -> 15 0 24 179 G 346 4594 -> 16 0 24 179 G 460 4594 -> 15 0 23 179 G 429 4595 -> 16 0 23 179 G 430 4595 -> 15 0 24 179 G 430 4596 -> 16 0 24 179 G 460 4596 -> 15 0 23 179 G 381 4597 -> 16 0 23 179 G 382 4597 -> 15 0 24 179 G 382 4598 -> 16 0 24 179 G 460 4598 -> 15 0 23 179 G 192 4599 -> 16 0 23 179 G 193 4599 -> 15 0 24 179 G 193 4600 -> 16 0 24 179 G 460 4600 -> 15 0 23 179 G 216 4601 -> 16 0 23 179 G 217 4601 -> 15 0 24 179 G 217 4602 -> 16 0 24 179 G 460 4602 -> 15 0 23 179 G 300 4603 -> 16 0 23 179 G 301 4603 -> 15 0 24 179 G 301 4604 -> 16 0 24 179 G 460 4604 -> 15 0 23 179 G 252 4605 -> 16 0 23 179 G 253 4605 -> 15 0 24 179 G 253 4606 -> 16 0 24 179 G 460 4606 -> 15 0 23 179 G 336 4607 -> 16 0 23 179 G 337 4607 -> 15 0 24 179 G 337 4608 -> 16 0 24 179 G 460 4608 -> 15 0 23 179 G 420 4609 -> 16 0 23 179 G 421 4609 -> 15 0 24 179 G 421 4610 -> 16 0 24 179 G 460 4610 -> 15 0 23 179 G 288 4611 -> 16 0 23 179 G 289 4611 -> 15 0 24 179 G 289 4612 -> 16 0 24 179 G 460 4612 -> 15 0 23 179 G 372 4613 -> 16 0 23 179 G 373 4613 -> 15 0 24 179 G 373 4614 -> 16 0 24 179 G 460 4614 -> 15 0 23 179 G 456 4615 -> 16 0 23 179 G 457 4615 -> 15 0 24 179 G 457 4616 -> 16 0 24 179 G 460 4616 -> 15 0 23 179 G 324 4617 -> 16 0 23 179 G 325 4617 -> 15 0 24 179 G 325 4618 -> 16 0 24 179 G 460 4618 -> 15 0 23 179 G 408 4619 -> 16 0 23 179 G 409 4619 -> 15 0 24 179 G 409 4620 -> 16 0 24 179 G 460 4620 -> 15 0 23 179 G 444 4621 -> 16 0 23 179 G 445 4621 -> 15 0 24 179 G 445 4622 -> 16 0 24 179 G 460 4622 -> 15 0 23 179 G 183 4623 -> 16 0 23 179 G 184 4623 -> 15 0 24 179 G 184 4624 -> 16 0 24 179 G 460 4624 -> 15 0 23 179 G 207 4625 -> 16 0 23 179 G 208 4625 -> 15 0 24 179 G 208 4626 -> 16 0 24 179 G 460 4626 -> 15 0 23 179 G 243 4627 -> 16 0 23 179 G 244 4627 -> 15 0 24 179 G 244 4628 -> 16 0 24 179 G 460 4628 -> 15 0 23 179 G 327 4629 -> 16 0 23 179 G 328 4629 -> 15 0 24 179 G 328 4630 -> 16 0 24 179 G 460 4630 -> 15 0 23 179 G 279 4631 -> 16 0 23 179 G 280 4631 -> 15 0 24 179 G 280 4632 -> 16 0 24 179 G 460 4632 -> 15 0 23 179 G 363 4633 -> 16 0 23 179 G 364 4633 -> 15 0 24 179 G 364 4634 -> 16 0 24 179 G 460 4634 -> 15 0 23 179 G 231 4635 -> 16 0 23 179 G 232 4635 -> 15 0 24 179 G 232 4636 -> 16 0 24 179 G 460 4636 -> 15 0 23 179 G 447 4637 -> 16 0 23 179 G 448 4637 -> 15 0 24 179 G 448 4638 -> 16 0 24 179 G 460 4638 -> 15 0 23 179 G 315 4639 -> 16 0 23 179 G 316 4639 -> 15 0 24 179 G 316 4640 -> 16 0 24 179 G 460 4640 -> 15 0 23 179 G 399 4641 -> 16 0 23 179 G 400 4641 -> 15 0 24 179 G 400 4642 -> 16 0 24 179 G 460 4642 -> 15 0 23 179 G 351 4643 -> 16 0 23 179 G 352 4643 -> 15 0 24 179 G 352 4644 -> 16 0 24 179 G 460 4644 -> 15 0 23 179 G 435 4645 -> 16 0 23 179 G 436 4645 -> 15 0 24 179 G 436 4646 -> 16 0 24 179 G 460 4646 -> 15 0 23 179 G 198 4647 -> 16 0 23 179 G 199 4647 -> 15 0 24 179 G 199 4648 -> 16 0 24 179 G 460 4648 -> 15 0 23 179 G 270 4649 -> 16 0 23 179 G 271 4649 -> 15 0 24 179 G 271 4650 -> 16 0 24 179 G 460 4650 -> 15 0 23 179 G 222 4651 -> 16 0 23 179 G 223 4651 -> 15 0 24 179 G 223 4652 -> 16 0 24 179 G 460 4652 -> 15 0 23 179 G 306 4653 -> 16 0 23 179 G 307 4653 -> 15 0 24 179 G 307 4654 -> 16 0 24 179 G 460 4654 -> 15 0 23 179 G 390 4655 -> 16 0 23 179 G 391 4655 -> 15 0 24 179 G 391 4656 -> 16 0 24 179 G 460 4656 -> 15 0 23 179 G 258 4657 -> 16 0 23 179 G 259 4657 -> 15 0 24 179 G 259 4658 -> 16 0 24 179 G 460 4658 -> 15 0 23 179 G 342 4659 -> 16 0 23 179 G 343 4659 -> 15 0 24 179 G 343 4660 -> 16 0 24 179 G 460 4660 -> 15 0 23 179 G 426 4661 -> 16 0 23 179 G 427 4661 -> 15 0 24 179 G 427 4662 -> 16 0 24 179 G 460 4662 -> 15 0 23 179 G 294 4663 -> 16 0 23 179 G 295 4663 -> 15 0 24 179 G 295 4664 -> 16 0 24 179 G 460 4664 -> 15 0 23 179 G 378 4665 -> 16 0 23 179 G 379 4665 -> 15 0 24 179 G 379 4666 -> 16 0 24 179 G 460 4666 -> 15 0 23 179 G 414 4667 -> 16 0 23 179 G 415 4667 -> 15 0 24 179 G 415 4668 -> 16 0 24 179 G 460 4668 -> 15 0 23 179 G 189 4669 -> 16 0 23 179 G 190 4669 -> 15 0 24 179 G 190 4670 -> 16 0 24 179 G 460 4670 -> 15 0 23 179 G 213 4671 -> 16 0 23 179 G 214 4671 -> 15 0 24 179 G 214 4672 -> 16 0 24 179 G 460 4672 -> 15 0 23 179 G 297 4673 -> 16 0 23 179 G 298 4673 -> 15 0 24 179 G 298 4674 -> 16 0 24 179 G 460 4674 -> 15 0 23 179 G 249 4675 -> 16 0 23 179 G 250 4675 -> 15 0 24 179 G 250 4676 -> 16 0 24 179 G 460 4676 -> 15 0 23 179 G 333 4677 -> 16 0 23 179 G 334 4677 -> 15 0 24 179 G 334 4678 -> 16 0 24 179 G 460 4678 -> 15 0 23 179 G 417 4679 -> 16 0 23 179 G 418 4679 -> 15 0 24 179 G 418 4680 -> 16 0 24 179 G 460 4680 -> 15 0 23 179 G 285 4681 -> 16 0 23 179 G 286 4681 -> 15 0 24 179 G 286 4682 -> 16 0 24 179 G 460 4682 -> 15 0 23 179 G 369 4683 -> 16 0 23 179 G 370 4683 -> 15 0 24 179 G 370 4684 -> 16 0 24 179 G 460 4684 -> 15 0 23 179 G 453 4685 -> 16 0 23 179 G 454 4685 -> 15 0 24 179 G 454 4686 -> 16 0 24 179 G 460 4686 -> 15 0 23 179 G 321 4687 -> 16 0 23 179 G 322 4687 -> 15 0 24 179 G 322 4688 -> 16 0 24 179 G 460 4688 -> 15 0 23 179 G 405 4689 -> 16 0 23 179 G 406 4689 -> 15 0 24 179 G 406 4690 -> 16 0 24 179 G 460 4690 -> 15 0 27 21 G 493 4691 -> 16 0 27 21 G 495 4691 -> 15 0 21 21 G 495 4692 -> 16 0 21 21 G 178 4692 -> 15 0 28 21 G 178 4693 -> 16 0 28 21 G 176 4693 -> 15 0 28 21 G 495 4694 -> 16 0 28 21 G 497 4694 -> 15 0 21 21 G 495 4695 -> 16 0 21 21 G 461 4695 -> 15 0 28 21 G 461 4696 -> 16 0 28 21 G 459 4696 -> 15 0 28 21 G 178 4697 -> 16 0 28 21 G 497 4697 -> 15 0 21 21 G 178 4698 -> 16 0 21 21 G 461 4698 -> 15 0 27 21 G 497 4699 -> 16 0 27 21 G 461 4699 -> 15 0 23 1362 G 1375 4700 -> 16 0 23 1362 G 1376 4700 -> 15 0 24 1362 G 1376 4701 -> 16 0 24 1362 G 1601 4701 -> 15 0 24 1362 G 1601 4702 -> 16 0 24 1362 G 1425 4702 -> 15 0 25 1362 G 1425 4703 -> 16 0 25 1362 G 1423 4703 -> 15 0 24 1362 G 1601 4704 -> 16 0 24 1362 G 1401 4704 -> 15 0 25 1362 G 1401 4705 -> 16 0 25 1362 G 1399 4705 -> 15 0 24 1362 G 1601 4706 -> 16 0 24 1362 G 1545 4706 -> 15 0 25 1362 G 1545 4707 -> 16 0 25 1362 G 1543 4707 -> 15 0 24 1362 G 1601 4708 -> 16 0 24 1362 G 1521 4708 -> 15 0 25 1362 G 1521 4709 -> 16 0 25 1362 G 1519 4709 -> 15 0 24 1362 G 1601 4710 -> 16 0 24 1362 G 1497 4710 -> 15 0 25 1362 G 1497 4711 -> 16 0 25 1362 G 1495 4711 -> 15 0 24 1362 G 1601 4712 -> 16 0 24 1362 G 1473 4712 -> 15 0 25 1362 G 1473 4713 -> 16 0 25 1362 G 1471 4713 -> 15 0 24 1362 G 1601 4714 -> 16 0 24 1362 G 1449 4714 -> 15 0 25 1362 G 1449 4715 -> 16 0 25 1362 G 1447 4715 -> 15 0 24 1362 G 1601 4716 -> 16 0 24 1362 G 1593 4716 -> 15 0 25 1362 G 1593 4717 -> 16 0 25 1362 G 1591 4717 -> 15 0 24 1362 G 1601 4718 -> 16 0 24 1362 G 1569 4718 -> 15 0 25 1362 G 1569 4719 -> 16 0 25 1362 G 1567 4719 -> 15 0 24 1362 G 1601 4720 -> 16 0 24 1362 G 1380 4720 -> 15 0 25 1362 G 1380 4721 -> 16 0 25 1362 G 1378 4721 -> 15 0 24 1362 G 1601 4722 -> 16 0 24 1362 G 1452 4722 -> 15 0 25 1362 G 1452 4723 -> 16 0 25 1362 G 1450 4723 -> 15 0 24 1362 G 1601 4724 -> 16 0 24 1362 G 1428 4724 -> 15 0 25 1362 G 1428 4725 -> 16 0 25 1362 G 1426 4725 -> 15 0 24 1362 G 1601 4726 -> 16 0 24 1362 G 1404 4726 -> 15 0 25 1362 G 1404 4727 -> 16 0 25 1362 G 1402 4727 -> 15 0 24 1362 G 1601 4728 -> 16 0 24 1362 G 1572 4728 -> 15 0 25 1362 G 1572 4729 -> 16 0 25 1362 G 1570 4729 -> 15 0 24 1362 G 1601 4730 -> 16 0 24 1362 G 1548 4730 -> 15 0 25 1362 G 1548 4731 -> 16 0 25 1362 G 1546 4731 -> 15 0 24 1362 G 1601 4732 -> 16 0 24 1362 G 1524 4732 -> 15 0 25 1362 G 1524 4733 -> 16 0 25 1362 G 1522 4733 -> 15 0 24 1362 G 1601 4734 -> 16 0 24 1362 G 1500 4734 -> 15 0 25 1362 G 1500 4735 -> 16 0 25 1362 G 1498 4735 -> 15 0 24 1362 G 1601 4736 -> 16 0 24 1362 G 1476 4736 -> 15 0 25 1362 G 1476 4737 -> 16 0 25 1362 G 1474 4737 -> 15 0 24 1362 G 1601 4738 -> 16 0 24 1362 G 1596 4738 -> 15 0 25 1362 G 1596 4739 -> 16 0 25 1362 G 1594 4739 -> 15 0 24 1362 G 1601 4740 -> 16 0 24 1362 G 1383 4740 -> 15 0 25 1362 G 1383 4741 -> 16 0 25 1362 G 1381 4741 -> 15 0 24 1362 G 1601 4742 -> 16 0 24 1362 G 1455 4742 -> 15 0 25 1362 G 1455 4743 -> 16 0 25 1362 G 1453 4743 -> 15 0 24 1362 G 1601 4744 -> 16 0 24 1362 G 1431 4744 -> 15 0 25 1362 G 1431 4745 -> 16 0 25 1362 G 1429 4745 -> 15 0 24 1362 G 1601 4746 -> 16 0 24 1362 G 1407 4746 -> 15 0 25 1362 G 1407 4747 -> 16 0 25 1362 G 1405 4747 -> 15 0 24 1362 G 1601 4748 -> 16 0 24 1362 G 1575 4748 -> 15 0 25 1362 G 1575 4749 -> 16 0 25 1362 G 1573 4749 -> 15 0 24 1362 G 1601 4750 -> 16 0 24 1362 G 1551 4750 -> 15 0 25 1362 G 1551 4751 -> 16 0 25 1362 G 1549 4751 -> 15 0 24 1362 G 1601 4752 -> 16 0 24 1362 G 1527 4752 -> 15 0 25 1362 G 1527 4753 -> 16 0 25 1362 G 1525 4753 -> 15 0 24 1362 G 1601 4754 -> 16 0 24 1362 G 1503 4754 -> 15 0 25 1362 G 1503 4755 -> 16 0 25 1362 G 1501 4755 -> 15 0 24 1362 G 1601 4756 -> 16 0 24 1362 G 1479 4756 -> 15 0 25 1362 G 1479 4757 -> 16 0 25 1362 G 1477 4757 -> 15 0 24 1362 G 1601 4758 -> 16 0 24 1362 G 1599 4758 -> 15 0 25 1362 G 1599 4759 -> 16 0 25 1362 G 1597 4759 -> 15 0 24 1362 G 1601 4760 -> 16 0 24 1362 G 1386 4760 -> 15 0 25 1362 G 1386 4761 -> 16 0 25 1362 G 1384 4761 -> 15 0 26 1362 G 1601 4762 -> 16 0 26 1362 G 1600 4762 -> 15 0 24 1362 G 1601 4763 -> 16 0 24 1362 G 1482 4763 -> 15 0 25 1362 G 1482 4764 -> 16 0 25 1362 G 1480 4764 -> 15 0 24 1362 G 1601 4765 -> 16 0 24 1362 G 1458 4765 -> 15 0 25 1362 G 1458 4766 -> 16 0 25 1362 G 1456 4766 -> 15 0 24 1362 G 1601 4767 -> 16 0 24 1362 G 1434 4767 -> 15 0 25 1362 G 1434 4768 -> 16 0 25 1362 G 1432 4768 -> 15 0 24 1362 G 1601 4769 -> 16 0 24 1362 G 1410 4769 -> 15 0 25 1362 G 1410 4770 -> 16 0 25 1362 G 1408 4770 -> 15 0 24 1362 G 1601 4771 -> 16 0 24 1362 G 1578 4771 -> 15 0 25 1362 G 1578 4772 -> 16 0 25 1362 G 1576 4772 -> 15 0 24 1362 G 1601 4773 -> 16 0 24 1362 G 1554 4773 -> 15 0 25 1362 G 1554 4774 -> 16 0 25 1362 G 1552 4774 -> 15 0 24 1362 G 1601 4775 -> 16 0 24 1362 G 1530 4775 -> 15 0 25 1362 G 1530 4776 -> 16 0 25 1362 G 1528 4776 -> 15 0 24 1362 G 1601 4777 -> 16 0 24 1362 G 1506 4777 -> 15 0 25 1362 G 1506 4778 -> 16 0 25 1362 G 1504 4778 -> 15 0 24 1362 G 1601 4779 -> 16 0 24 1362 G 1365 4779 -> 15 0 25 1362 G 1365 4780 -> 16 0 25 1362 G 1363 4780 -> 15 0 24 1362 G 1601 4781 -> 16 0 24 1362 G 1389 4781 -> 15 0 25 1362 G 1389 4782 -> 16 0 25 1362 G 1387 4782 -> 15 0 24 1362 G 1601 4783 -> 16 0 24 1362 G 1485 4783 -> 15 0 25 1362 G 1485 4784 -> 16 0 25 1362 G 1483 4784 -> 15 0 24 1362 G 1601 4785 -> 16 0 24 1362 G 1461 4785 -> 15 0 25 1362 G 1461 4786 -> 16 0 25 1362 G 1459 4786 -> 15 0 24 1362 G 1601 4787 -> 16 0 24 1362 G 1437 4787 -> 15 0 25 1362 G 1437 4788 -> 16 0 25 1362 G 1435 4788 -> 15 0 24 1362 G 1601 4789 -> 16 0 24 1362 G 1413 4789 -> 15 0 25 1362 G 1413 4790 -> 16 0 25 1362 G 1411 4790 -> 15 0 24 1362 G 1601 4791 -> 16 0 24 1362 G 1581 4791 -> 15 0 25 1362 G 1581 4792 -> 16 0 25 1362 G 1579 4792 -> 15 0 24 1362 G 1601 4793 -> 16 0 24 1362 G 1557 4793 -> 15 0 25 1362 G 1557 4794 -> 16 0 25 1362 G 1555 4794 -> 15 0 24 1362 G 1601 4795 -> 16 0 24 1362 G 1533 4795 -> 15 0 25 1362 G 1533 4796 -> 16 0 25 1362 G 1531 4796 -> 15 0 24 1362 G 1601 4797 -> 16 0 24 1362 G 1509 4797 -> 15 0 25 1362 G 1509 4798 -> 16 0 25 1362 G 1507 4798 -> 15 0 24 1362 G 1601 4799 -> 16 0 24 1362 G 1368 4799 -> 15 0 25 1362 G 1368 4800 -> 16 0 25 1362 G 1366 4800 -> 15 0 24 1362 G 1601 4801 -> 16 0 24 1362 G 1392 4801 -> 15 0 25 1362 G 1392 4802 -> 16 0 25 1362 G 1390 4802 -> 15 0 24 1362 G 1601 4803 -> 16 0 24 1362 G 1512 4803 -> 15 0 25 1362 G 1512 4804 -> 16 0 25 1362 G 1510 4804 -> 15 0 24 1362 G 1601 4805 -> 16 0 24 1362 G 1488 4805 -> 15 0 25 1362 G 1488 4806 -> 16 0 25 1362 G 1486 4806 -> 15 0 24 1362 G 1601 4807 -> 16 0 24 1362 G 1464 4807 -> 15 0 25 1362 G 1464 4808 -> 16 0 25 1362 G 1462 4808 -> 15 0 24 1362 G 1601 4809 -> 16 0 24 1362 G 1440 4809 -> 15 0 25 1362 G 1440 4810 -> 16 0 25 1362 G 1438 4810 -> 15 0 24 1362 G 1601 4811 -> 16 0 24 1362 G 1416 4811 -> 15 0 25 1362 G 1416 4812 -> 16 0 25 1362 G 1414 4812 -> 15 0 24 1362 G 1601 4813 -> 16 0 24 1362 G 1584 4813 -> 15 0 25 1362 G 1584 4814 -> 16 0 25 1362 G 1582 4814 -> 15 0 24 1362 G 1601 4815 -> 16 0 24 1362 G 1560 4815 -> 15 0 25 1362 G 1560 4816 -> 16 0 25 1362 G 1558 4816 -> 15 0 24 1362 G 1601 4817 -> 16 0 24 1362 G 1536 4817 -> 15 0 25 1362 G 1536 4818 -> 16 0 25 1362 G 1534 4818 -> 15 0 24 1362 G 1601 4819 -> 16 0 24 1362 G 1371 4819 -> 15 0 25 1362 G 1371 4820 -> 16 0 25 1362 G 1369 4820 -> 15 0 24 1362 G 1601 4821 -> 16 0 24 1362 G 1395 4821 -> 15 0 25 1362 G 1395 4822 -> 16 0 25 1362 G 1393 4822 -> 15 0 24 1362 G 1601 4823 -> 16 0 24 1362 G 1515 4823 -> 15 0 25 1362 G 1515 4824 -> 16 0 25 1362 G 1513 4824 -> 15 0 24 1362 G 1601 4825 -> 16 0 24 1362 G 1491 4825 -> 15 0 25 1362 G 1491 4826 -> 16 0 25 1362 G 1489 4826 -> 15 0 24 1362 G 1601 4827 -> 16 0 24 1362 G 1467 4827 -> 15 0 25 1362 G 1467 4828 -> 16 0 25 1362 G 1465 4828 -> 15 0 24 1362 G 1601 4829 -> 16 0 24 1362 G 1443 4829 -> 15 0 25 1362 G 1443 4830 -> 16 0 25 1362 G 1441 4830 -> 15 0 24 1362 G 1601 4831 -> 16 0 24 1362 G 1419 4831 -> 15 0 25 1362 G 1419 4832 -> 16 0 25 1362 G 1417 4832 -> 15 0 24 1362 G 1601 4833 -> 16 0 24 1362 G 1587 4833 -> 15 0 25 1362 G 1587 4834 -> 16 0 25 1362 G 1585 4834 -> 15 0 24 1362 G 1601 4835 -> 16 0 24 1362 G 1563 4835 -> 15 0 25 1362 G 1563 4836 -> 16 0 25 1362 G 1561 4836 -> 15 0 24 1362 G 1601 4837 -> 16 0 24 1362 G 1539 4837 -> 15 0 25 1362 G 1539 4838 -> 16 0 25 1362 G 1537 4838 -> 15 0 24 1362 G 1601 4839 -> 16 0 24 1362 G 1374 4839 -> 15 0 25 1362 G 1374 4840 -> 16 0 25 1362 G 1372 4840 -> 15 0 24 1362 G 1601 4841 -> 16 0 24 1362 G 1422 4841 -> 15 0 25 1362 G 1422 4842 -> 16 0 25 1362 G 1420 4842 -> 15 0 24 1362 G 1601 4843 -> 16 0 24 1362 G 1398 4843 -> 15 0 25 1362 G 1398 4844 -> 16 0 25 1362 G 1396 4844 -> 15 0 24 1362 G 1601 4845 -> 16 0 24 1362 G 1542 4845 -> 15 0 25 1362 G 1542 4846 -> 16 0 25 1362 G 1540 4846 -> 15 0 24 1362 G 1601 4847 -> 16 0 24 1362 G 1518 4847 -> 15 0 25 1362 G 1518 4848 -> 16 0 25 1362 G 1516 4848 -> 15 0 24 1362 G 1601 4849 -> 16 0 24 1362 G 1494 4849 -> 15 0 25 1362 G 1494 4850 -> 16 0 25 1362 G 1492 4850 -> 15 0 24 1362 G 1601 4851 -> 16 0 24 1362 G 1470 4851 -> 15 0 25 1362 G 1470 4852 -> 16 0 25 1362 G 1468 4852 -> 15 0 24 1362 G 1601 4853 -> 16 0 24 1362 G 1446 4853 -> 15 0 25 1362 G 1446 4854 -> 16 0 25 1362 G 1444 4854 -> 15 0 24 1362 G 1601 4855 -> 16 0 24 1362 G 1590 4855 -> 15 0 25 1362 G 1590 4856 -> 16 0 25 1362 G 1588 4856 -> 15 0 24 1362 G 1601 4857 -> 16 0 24 1362 G 1566 4857 -> 15 0 25 1362 G 1566 4858 -> 16 0 25 1362 G 1564 4858 -> 15 0 23 1362 G 1423 4859 -> 16 0 23 1362 G 1424 4859 -> 15 0 24 1362 G 1424 4860 -> 16 0 24 1362 G 1601 4860 -> 15 0 24 1362 G 1601 4861 -> 16 0 24 1362 G 1377 4861 -> 15 0 25 1362 G 1377 4862 -> 16 0 25 1362 G 1375 4862 -> 15 0 23 1362 G 1399 4863 -> 16 0 23 1362 G 1400 4863 -> 15 0 24 1362 G 1400 4864 -> 16 0 24 1362 G 1601 4864 -> 15 0 23 1362 G 1543 4865 -> 16 0 23 1362 G 1544 4865 -> 15 0 24 1362 G 1544 4866 -> 16 0 24 1362 G 1601 4866 -> 15 0 23 1362 G 1519 4867 -> 16 0 23 1362 G 1520 4867 -> 15 0 24 1362 G 1520 4868 -> 16 0 24 1362 G 1601 4868 -> 15 0 23 1362 G 1495 4869 -> 16 0 23 1362 G 1496 4869 -> 15 0 24 1362 G 1496 4870 -> 16 0 24 1362 G 1601 4870 -> 15 0 23 1362 G 1471 4871 -> 16 0 23 1362 G 1472 4871 -> 15 0 24 1362 G 1472 4872 -> 16 0 24 1362 G 1601 4872 -> 15 0 23 1362 G 1447 4873 -> 16 0 23 1362 G 1448 4873 -> 15 0 24 1362 G 1448 4874 -> 16 0 24 1362 G 1601 4874 -> 15 0 23 1362 G 1591 4875 -> 16 0 23 1362 G 1592 4875 -> 15 0 24 1362 G 1592 4876 -> 16 0 24 1362 G 1601 4876 -> 15 0 23 1362 G 1567 4877 -> 16 0 23 1362 G 1568 4877 -> 15 0 24 1362 G 1568 4878 -> 16 0 24 1362 G 1601 4878 -> 15 0 23 1362 G 1378 4879 -> 16 0 23 1362 G 1379 4879 -> 15 0 24 1362 G 1379 4880 -> 16 0 24 1362 G 1601 4880 -> 15 0 23 1362 G 1450 4881 -> 16 0 23 1362 G 1451 4881 -> 15 0 24 1362 G 1451 4882 -> 16 0 24 1362 G 1601 4882 -> 15 0 23 1362 G 1426 4883 -> 16 0 23 1362 G 1427 4883 -> 15 0 24 1362 G 1427 4884 -> 16 0 24 1362 G 1601 4884 -> 15 0 23 1362 G 1402 4885 -> 16 0 23 1362 G 1403 4885 -> 15 0 24 1362 G 1403 4886 -> 16 0 24 1362 G 1601 4886 -> 15 0 23 1362 G 1570 4887 -> 16 0 23 1362 G 1571 4887 -> 15 0 24 1362 G 1571 4888 -> 16 0 24 1362 G 1601 4888 -> 15 0 23 1362 G 1546 4889 -> 16 0 23 1362 G 1547 4889 -> 15 0 24 1362 G 1547 4890 -> 16 0 24 1362 G 1601 4890 -> 15 0 23 1362 G 1522 4891 -> 16 0 23 1362 G 1523 4891 -> 15 0 24 1362 G 1523 4892 -> 16 0 24 1362 G 1601 4892 -> 15 0 23 1362 G 1498 4893 -> 16 0 23 1362 G 1499 4893 -> 15 0 24 1362 G 1499 4894 -> 16 0 24 1362 G 1601 4894 -> 15 0 23 1362 G 1474 4895 -> 16 0 23 1362 G 1475 4895 -> 15 0 24 1362 G 1475 4896 -> 16 0 24 1362 G 1601 4896 -> 15 0 23 1362 G 1594 4897 -> 16 0 23 1362 G 1595 4897 -> 15 0 24 1362 G 1595 4898 -> 16 0 24 1362 G 1601 4898 -> 15 0 23 1362 G 1381 4899 -> 16 0 23 1362 G 1382 4899 -> 15 0 24 1362 G 1382 4900 -> 16 0 24 1362 G 1601 4900 -> 15 0 23 1362 G 1453 4901 -> 16 0 23 1362 G 1454 4901 -> 15 0 24 1362 G 1454 4902 -> 16 0 24 1362 G 1601 4902 -> 15 0 23 1362 G 1429 4903 -> 16 0 23 1362 G 1430 4903 -> 15 0 24 1362 G 1430 4904 -> 16 0 24 1362 G 1601 4904 -> 15 0 23 1362 G 1405 4905 -> 16 0 23 1362 G 1406 4905 -> 15 0 24 1362 G 1406 4906 -> 16 0 24 1362 G 1601 4906 -> 15 0 23 1362 G 1573 4907 -> 16 0 23 1362 G 1574 4907 -> 15 0 24 1362 G 1574 4908 -> 16 0 24 1362 G 1601 4908 -> 15 0 23 1362 G 1549 4909 -> 16 0 23 1362 G 1550 4909 -> 15 0 24 1362 G 1550 4910 -> 16 0 24 1362 G 1601 4910 -> 15 0 23 1362 G 1525 4911 -> 16 0 23 1362 G 1526 4911 -> 15 0 24 1362 G 1526 4912 -> 16 0 24 1362 G 1601 4912 -> 15 0 23 1362 G 1501 4913 -> 16 0 23 1362 G 1502 4913 -> 15 0 24 1362 G 1502 4914 -> 16 0 24 1362 G 1601 4914 -> 15 0 23 1362 G 1477 4915 -> 16 0 23 1362 G 1478 4915 -> 15 0 24 1362 G 1478 4916 -> 16 0 24 1362 G 1601 4916 -> 15 0 23 1362 G 1597 4917 -> 16 0 23 1362 G 1598 4917 -> 15 0 24 1362 G 1598 4918 -> 16 0 24 1362 G 1601 4918 -> 15 0 23 1362 G 1384 4919 -> 16 0 23 1362 G 1385 4919 -> 15 0 24 1362 G 1385 4920 -> 16 0 24 1362 G 1601 4920 -> 15 0 23 1362 G 1480 4921 -> 16 0 23 1362 G 1481 4921 -> 15 0 24 1362 G 1481 4922 -> 16 0 24 1362 G 1601 4922 -> 15 0 23 1362 G 1456 4923 -> 16 0 23 1362 G 1457 4923 -> 15 0 24 1362 G 1457 4924 -> 16 0 24 1362 G 1601 4924 -> 15 0 23 1362 G 1432 4925 -> 16 0 23 1362 G 1433 4925 -> 15 0 24 1362 G 1433 4926 -> 16 0 24 1362 G 1601 4926 -> 15 0 23 1362 G 1408 4927 -> 16 0 23 1362 G 1409 4927 -> 15 0 24 1362 G 1409 4928 -> 16 0 24 1362 G 1601 4928 -> 15 0 23 1362 G 1576 4929 -> 16 0 23 1362 G 1577 4929 -> 15 0 24 1362 G 1577 4930 -> 16 0 24 1362 G 1601 4930 -> 15 0 23 1362 G 1552 4931 -> 16 0 23 1362 G 1553 4931 -> 15 0 24 1362 G 1553 4932 -> 16 0 24 1362 G 1601 4932 -> 15 0 23 1362 G 1528 4933 -> 16 0 23 1362 G 1529 4933 -> 15 0 24 1362 G 1529 4934 -> 16 0 24 1362 G 1601 4934 -> 15 0 23 1362 G 1504 4935 -> 16 0 23 1362 G 1505 4935 -> 15 0 24 1362 G 1505 4936 -> 16 0 24 1362 G 1601 4936 -> 15 0 23 1362 G 1363 4937 -> 16 0 23 1362 G 1364 4937 -> 15 0 24 1362 G 1364 4938 -> 16 0 24 1362 G 1601 4938 -> 15 0 23 1362 G 1387 4939 -> 16 0 23 1362 G 1388 4939 -> 15 0 24 1362 G 1388 4940 -> 16 0 24 1362 G 1601 4940 -> 15 0 23 1362 G 1483 4941 -> 16 0 23 1362 G 1484 4941 -> 15 0 24 1362 G 1484 4942 -> 16 0 24 1362 G 1601 4942 -> 15 0 23 1362 G 1459 4943 -> 16 0 23 1362 G 1460 4943 -> 15 0 24 1362 G 1460 4944 -> 16 0 24 1362 G 1601 4944 -> 15 0 23 1362 G 1435 4945 -> 16 0 23 1362 G 1436 4945 -> 15 0 24 1362 G 1436 4946 -> 16 0 24 1362 G 1601 4946 -> 15 0 23 1362 G 1411 4947 -> 16 0 23 1362 G 1412 4947 -> 15 0 24 1362 G 1412 4948 -> 16 0 24 1362 G 1601 4948 -> 15 0 23 1362 G 1579 4949 -> 16 0 23 1362 G 1580 4949 -> 15 0 24 1362 G 1580 4950 -> 16 0 24 1362 G 1601 4950 -> 15 0 23 1362 G 1555 4951 -> 16 0 23 1362 G 1556 4951 -> 15 0 24 1362 G 1556 4952 -> 16 0 24 1362 G 1601 4952 -> 15 0 23 1362 G 1531 4953 -> 16 0 23 1362 G 1532 4953 -> 15 0 24 1362 G 1532 4954 -> 16 0 24 1362 G 1601 4954 -> 15 0 23 1362 G 1507 4955 -> 16 0 23 1362 G 1508 4955 -> 15 0 24 1362 G 1508 4956 -> 16 0 24 1362 G 1601 4956 -> 15 0 23 1362 G 1366 4957 -> 16 0 23 1362 G 1367 4957 -> 15 0 24 1362 G 1367 4958 -> 16 0 24 1362 G 1601 4958 -> 15 0 23 1362 G 1390 4959 -> 16 0 23 1362 G 1391 4959 -> 15 0 24 1362 G 1391 4960 -> 16 0 24 1362 G 1601 4960 -> 15 0 23 1362 G 1510 4961 -> 16 0 23 1362 G 1511 4961 -> 15 0 24 1362 G 1511 4962 -> 16 0 24 1362 G 1601 4962 -> 15 0 23 1362 G 1486 4963 -> 16 0 23 1362 G 1487 4963 -> 15 0 24 1362 G 1487 4964 -> 16 0 24 1362 G 1601 4964 -> 15 0 23 1362 G 1462 4965 -> 16 0 23 1362 G 1463 4965 -> 15 0 24 1362 G 1463 4966 -> 16 0 24 1362 G 1601 4966 -> 15 0 23 1362 G 1438 4967 -> 16 0 23 1362 G 1439 4967 -> 15 0 24 1362 G 1439 4968 -> 16 0 24 1362 G 1601 4968 -> 15 0 23 1362 G 1414 4969 -> 16 0 23 1362 G 1415 4969 -> 15 0 24 1362 G 1415 4970 -> 16 0 24 1362 G 1601 4970 -> 15 0 23 1362 G 1582 4971 -> 16 0 23 1362 G 1583 4971 -> 15 0 24 1362 G 1583 4972 -> 16 0 24 1362 G 1601 4972 -> 15 0 23 1362 G 1558 4973 -> 16 0 23 1362 G 1559 4973 -> 15 0 24 1362 G 1559 4974 -> 16 0 24 1362 G 1601 4974 -> 15 0 23 1362 G 1534 4975 -> 16 0 23 1362 G 1535 4975 -> 15 0 24 1362 G 1535 4976 -> 16 0 24 1362 G 1601 4976 -> 15 0 23 1362 G 1369 4977 -> 16 0 23 1362 G 1370 4977 -> 15 0 24 1362 G 1370 4978 -> 16 0 24 1362 G 1601 4978 -> 15 0 23 1362 G 1393 4979 -> 16 0 23 1362 G 1394 4979 -> 15 0 24 1362 G 1394 4980 -> 16 0 24 1362 G 1601 4980 -> 15 0 23 1362 G 1513 4981 -> 16 0 23 1362 G 1514 4981 -> 15 0 24 1362 G 1514 4982 -> 16 0 24 1362 G 1601 4982 -> 15 0 23 1362 G 1489 4983 -> 16 0 23 1362 G 1490 4983 -> 15 0 24 1362 G 1490 4984 -> 16 0 24 1362 G 1601 4984 -> 15 0 23 1362 G 1465 4985 -> 16 0 23 1362 G 1466 4985 -> 15 0 24 1362 G 1466 4986 -> 16 0 24 1362 G 1601 4986 -> 15 0 23 1362 G 1441 4987 -> 16 0 23 1362 G 1442 4987 -> 15 0 24 1362 G 1442 4988 -> 16 0 24 1362 G 1601 4988 -> 15 0 23 1362 G 1417 4989 -> 16 0 23 1362 G 1418 4989 -> 15 0 24 1362 G 1418 4990 -> 16 0 24 1362 G 1601 4990 -> 15 0 23 1362 G 1585 4991 -> 16 0 23 1362 G 1586 4991 -> 15 0 24 1362 G 1586 4992 -> 16 0 24 1362 G 1601 4992 -> 15 0 23 1362 G 1561 4993 -> 16 0 23 1362 G 1562 4993 -> 15 0 24 1362 G 1562 4994 -> 16 0 24 1362 G 1601 4994 -> 15 0 23 1362 G 1537 4995 -> 16 0 23 1362 G 1538 4995 -> 15 0 24 1362 G 1538 4996 -> 16 0 24 1362 G 1601 4996 -> 15 0 23 1362 G 1372 4997 -> 16 0 23 1362 G 1373 4997 -> 15 0 24 1362 G 1373 4998 -> 16 0 24 1362 G 1601 4998 -> 15 0 23 1362 G 1420 4999 -> 16 0 23 1362 G 1421 4999 -> 15 0 24 1362 G 1421 5000 -> 16 0 24 1362 G 1601 5000 -> 15 0 23 1362 G 1396 5001 -> 16 0 23 1362 G 1397 5001 -> 15 0 24 1362 G 1397 5002 -> 16 0 24 1362 G 1601 5002 -> 15 0 23 1362 G 1540 5003 -> 16 0 23 1362 G 1541 5003 -> 15 0 24 1362 G 1541 5004 -> 16 0 24 1362 G 1601 5004 -> 15 0 23 1362 G 1516 5005 -> 16 0 23 1362 G 1517 5005 -> 15 0 24 1362 G 1517 5006 -> 16 0 24 1362 G 1601 5006 -> 15 0 23 1362 G 1492 5007 -> 16 0 23 1362 G 1493 5007 -> 15 0 24 1362 G 1493 5008 -> 16 0 24 1362 G 1601 5008 -> 15 0 23 1362 G 1468 5009 -> 16 0 23 1362 G 1469 5009 -> 15 0 24 1362 G 1469 5010 -> 16 0 24 1362 G 1601 5010 -> 15 0 23 1362 G 1444 5011 -> 16 0 23 1362 G 1445 5011 -> 15 0 24 1362 G 1445 5012 -> 16 0 24 1362 G 1601 5012 -> 15 0 23 1362 G 1588 5013 -> 16 0 23 1362 G 1589 5013 -> 15 0 24 1362 G 1589 5014 -> 16 0 24 1362 G 1601 5014 -> 15 0 23 1362 G 1564 5015 -> 16 0 23 1362 G 1565 5015 -> 15 0 24 1362 G 1565 5016 -> 16 0 24 1362 G 1601 5016 -> 15 0 23 1190 G 1221 5017 -> 16 0 23 1190 G 1222 5017 -> 15 0 24 1190 G 1222 5018 -> 16 0 24 1190 G 1360 5018 -> 15 0 24 1190 G 1360 5019 -> 16 0 24 1190 G 1283 5019 -> 15 0 25 1190 G 1283 5020 -> 16 0 25 1190 G 1281 5020 -> 15 0 24 1190 G 1360 5021 -> 16 0 24 1190 G 1259 5021 -> 15 0 25 1190 G 1259 5022 -> 16 0 25 1190 G 1257 5022 -> 15 0 24 1190 G 1360 5023 -> 16 0 24 1190 G 1235 5023 -> 15 0 25 1190 G 1235 5024 -> 16 0 25 1190 G 1233 5024 -> 15 0 24 1190 G 1360 5025 -> 16 0 24 1190 G 1343 5025 -> 15 0 25 1190 G 1343 5026 -> 16 0 25 1190 G 1341 5026 -> 15 0 24 1190 G 1360 5027 -> 16 0 24 1190 G 1319 5027 -> 15 0 25 1190 G 1319 5028 -> 16 0 25 1190 G 1317 5028 -> 15 0 24 1190 G 1360 5029 -> 16 0 24 1190 G 1295 5029 -> 15 0 25 1190 G 1295 5030 -> 16 0 25 1190 G 1293 5030 -> 15 0 24 1190 G 1360 5031 -> 16 0 24 1190 G 1271 5031 -> 15 0 25 1190 G 1271 5032 -> 16 0 25 1190 G 1269 5032 -> 15 0 24 1190 G 1360 5033 -> 16 0 24 1190 G 1247 5033 -> 15 0 25 1190 G 1247 5034 -> 16 0 25 1190 G 1245 5034 -> 15 0 24 1190 G 1360 5035 -> 16 0 24 1190 G 1355 5035 -> 15 0 25 1190 G 1355 5036 -> 16 0 25 1190 G 1353 5036 -> 15 0 24 1190 G 1360 5037 -> 16 0 24 1190 G 1331 5037 -> 15 0 25 1190 G 1331 5038 -> 16 0 25 1190 G 1329 5038 -> 15 0 24 1190 G 1360 5039 -> 16 0 24 1190 G 1307 5039 -> 15 0 25 1190 G 1307 5040 -> 16 0 25 1190 G 1305 5040 -> 15 0 24 1190 G 1360 5041 -> 16 0 24 1190 G 1193 5041 -> 15 0 25 1190 G 1193 5042 -> 16 0 25 1190 G 1191 5042 -> 15 0 24 1190 G 1360 5043 -> 16 0 24 1190 G 1205 5043 -> 15 0 25 1190 G 1205 5044 -> 16 0 25 1190 G 1203 5044 -> 15 0 24 1190 G 1360 5045 -> 16 0 24 1190 G 1217 5045 -> 15 0 25 1190 G 1217 5046 -> 16 0 25 1190 G 1215 5046 -> 15 0 26 1190 G 1360 5047 -> 16 0 26 1190 G 1359 5047 -> 15 0 24 1190 G 1360 5048 -> 16 0 24 1190 G 1250 5048 -> 15 0 25 1190 G 1250 5049 -> 16 0 25 1190 G 1248 5049 -> 15 0 24 1190 G 1360 5050 -> 16 0 24 1190 G 1226 5050 -> 15 0 25 1190 G 1226 5051 -> 16 0 25 1190 G 1224 5051 -> 15 0 24 1190 G 1360 5052 -> 16 0 24 1190 G 1310 5052 -> 15 0 25 1190 G 1310 5053 -> 16 0 25 1190 G 1308 5053 -> 15 0 24 1190 G 1360 5054 -> 16 0 24 1190 G 1286 5054 -> 15 0 25 1190 G 1286 5055 -> 16 0 25 1190 G 1284 5055 -> 15 0 24 1190 G 1360 5056 -> 16 0 24 1190 G 1262 5056 -> 15 0 25 1190 G 1262 5057 -> 16 0 25 1190 G 1260 5057 -> 15 0 24 1190 G 1360 5058 -> 16 0 24 1190 G 1238 5058 -> 15 0 25 1190 G 1238 5059 -> 16 0 25 1190 G 1236 5059 -> 15 0 24 1190 G 1360 5060 -> 16 0 24 1190 G 1346 5060 -> 15 0 25 1190 G 1346 5061 -> 16 0 25 1190 G 1344 5061 -> 15 0 24 1190 G 1360 5062 -> 16 0 24 1190 G 1322 5062 -> 15 0 25 1190 G 1322 5063 -> 16 0 25 1190 G 1320 5063 -> 15 0 24 1190 G 1360 5064 -> 16 0 24 1190 G 1298 5064 -> 15 0 25 1190 G 1298 5065 -> 16 0 25 1190 G 1296 5065 -> 15 0 24 1190 G 1360 5066 -> 16 0 24 1190 G 1274 5066 -> 15 0 25 1190 G 1274 5067 -> 16 0 25 1190 G 1272 5067 -> 15 0 24 1190 G 1360 5068 -> 16 0 24 1190 G 1358 5068 -> 15 0 25 1190 G 1358 5069 -> 16 0 25 1190 G 1356 5069 -> 15 0 24 1190 G 1360 5070 -> 16 0 24 1190 G 1334 5070 -> 15 0 25 1190 G 1334 5071 -> 16 0 25 1190 G 1332 5071 -> 15 0 24 1190 G 1360 5072 -> 16 0 24 1190 G 1196 5072 -> 15 0 25 1190 G 1196 5073 -> 16 0 25 1190 G 1194 5073 -> 15 0 24 1190 G 1360 5074 -> 16 0 24 1190 G 1208 5074 -> 15 0 25 1190 G 1208 5075 -> 16 0 25 1190 G 1206 5075 -> 15 0 24 1190 G 1360 5076 -> 16 0 24 1190 G 1253 5076 -> 15 0 25 1190 G 1253 5077 -> 16 0 25 1190 G 1251 5077 -> 15 0 24 1190 G 1360 5078 -> 16 0 24 1190 G 1229 5078 -> 15 0 25 1190 G 1229 5079 -> 16 0 25 1190 G 1227 5079 -> 15 0 24 1190 G 1360 5080 -> 16 0 24 1190 G 1313 5080 -> 15 0 25 1190 G 1313 5081 -> 16 0 25 1190 G 1311 5081 -> 15 0 24 1190 G 1360 5082 -> 16 0 24 1190 G 1289 5082 -> 15 0 25 1190 G 1289 5083 -> 16 0 25 1190 G 1287 5083 -> 15 0 24 1190 G 1360 5084 -> 16 0 24 1190 G 1265 5084 -> 15 0 25 1190 G 1265 5085 -> 16 0 25 1190 G 1263 5085 -> 15 0 24 1190 G 1360 5086 -> 16 0 24 1190 G 1241 5086 -> 15 0 25 1190 G 1241 5087 -> 16 0 25 1190 G 1239 5087 -> 15 0 24 1190 G 1360 5088 -> 16 0 24 1190 G 1349 5088 -> 15 0 25 1190 G 1349 5089 -> 16 0 25 1190 G 1347 5089 -> 15 0 24 1190 G 1360 5090 -> 16 0 24 1190 G 1325 5090 -> 15 0 25 1190 G 1325 5091 -> 16 0 25 1190 G 1323 5091 -> 15 0 24 1190 G 1360 5092 -> 16 0 24 1190 G 1301 5092 -> 15 0 25 1190 G 1301 5093 -> 16 0 25 1190 G 1299 5093 -> 15 0 24 1190 G 1360 5094 -> 16 0 24 1190 G 1277 5094 -> 15 0 25 1190 G 1277 5095 -> 16 0 25 1190 G 1275 5095 -> 15 0 24 1190 G 1360 5096 -> 16 0 24 1190 G 1337 5096 -> 15 0 25 1190 G 1337 5097 -> 16 0 25 1190 G 1335 5097 -> 15 0 24 1190 G 1360 5098 -> 16 0 24 1190 G 1199 5098 -> 15 0 25 1190 G 1199 5099 -> 16 0 25 1190 G 1197 5099 -> 15 0 24 1190 G 1360 5100 -> 16 0 24 1190 G 1211 5100 -> 15 0 25 1190 G 1211 5101 -> 16 0 25 1190 G 1209 5101 -> 15 0 24 1190 G 1360 5102 -> 16 0 24 1190 G 1220 5102 -> 15 0 25 1190 G 1220 5103 -> 16 0 25 1190 G 1218 5103 -> 15 0 24 1190 G 1360 5104 -> 16 0 24 1190 G 1280 5104 -> 15 0 25 1190 G 1280 5105 -> 16 0 25 1190 G 1278 5105 -> 15 0 24 1190 G 1360 5106 -> 16 0 24 1190 G 1256 5106 -> 15 0 25 1190 G 1256 5107 -> 16 0 25 1190 G 1254 5107 -> 15 0 24 1190 G 1360 5108 -> 16 0 24 1190 G 1232 5108 -> 15 0 25 1190 G 1232 5109 -> 16 0 25 1190 G 1230 5109 -> 15 0 24 1190 G 1360 5110 -> 16 0 24 1190 G 1340 5110 -> 15 0 25 1190 G 1340 5111 -> 16 0 25 1190 G 1338 5111 -> 15 0 24 1190 G 1360 5112 -> 16 0 24 1190 G 1316 5112 -> 15 0 25 1190 G 1316 5113 -> 16 0 25 1190 G 1314 5113 -> 15 0 24 1190 G 1360 5114 -> 16 0 24 1190 G 1292 5114 -> 15 0 25 1190 G 1292 5115 -> 16 0 25 1190 G 1290 5115 -> 15 0 24 1190 G 1360 5116 -> 16 0 24 1190 G 1268 5116 -> 15 0 25 1190 G 1268 5117 -> 16 0 25 1190 G 1266 5117 -> 15 0 24 1190 G 1360 5118 -> 16 0 24 1190 G 1244 5118 -> 15 0 25 1190 G 1244 5119 -> 16 0 25 1190 G 1242 5119 -> 15 0 24 1190 G 1360 5120 -> 16 0 24 1190 G 1352 5120 -> 15 0 25 1190 G 1352 5121 -> 16 0 25 1190 G 1350 5121 -> 15 0 24 1190 G 1360 5122 -> 16 0 24 1190 G 1328 5122 -> 15 0 25 1190 G 1328 5123 -> 16 0 25 1190 G 1326 5123 -> 15 0 24 1190 G 1360 5124 -> 16 0 24 1190 G 1304 5124 -> 15 0 25 1190 G 1304 5125 -> 16 0 25 1190 G 1302 5125 -> 15 0 24 1190 G 1360 5126 -> 16 0 24 1190 G 1202 5126 -> 15 0 25 1190 G 1202 5127 -> 16 0 25 1190 G 1200 5127 -> 15 0 24 1190 G 1360 5128 -> 16 0 24 1190 G 1214 5128 -> 15 0 25 1190 G 1214 5129 -> 16 0 25 1190 G 1212 5129 -> 15 0 23 1190 G 1281 5130 -> 16 0 23 1190 G 1282 5130 -> 15 0 24 1190 G 1282 5131 -> 16 0 24 1190 G 1360 5131 -> 15 0 24 1190 G 1360 5132 -> 16 0 24 1190 G 1223 5132 -> 15 0 25 1190 G 1223 5133 -> 16 0 25 1190 G 1221 5133 -> 15 0 23 1190 G 1257 5134 -> 16 0 23 1190 G 1258 5134 -> 15 0 24 1190 G 1258 5135 -> 16 0 24 1190 G 1360 5135 -> 15 0 23 1190 G 1233 5136 -> 16 0 23 1190 G 1234 5136 -> 15 0 24 1190 G 1234 5137 -> 16 0 24 1190 G 1360 5137 -> 15 0 23 1190 G 1341 5138 -> 16 0 23 1190 G 1342 5138 -> 15 0 24 1190 G 1342 5139 -> 16 0 24 1190 G 1360 5139 -> 15 0 23 1190 G 1317 5140 -> 16 0 23 1190 G 1318 5140 -> 15 0 24 1190 G 1318 5141 -> 16 0 24 1190 G 1360 5141 -> 15 0 23 1190 G 1293 5142 -> 16 0 23 1190 G 1294 5142 -> 15 0 24 1190 G 1294 5143 -> 16 0 24 1190 G 1360 5143 -> 15 0 23 1190 G 1269 5144 -> 16 0 23 1190 G 1270 5144 -> 15 0 24 1190 G 1270 5145 -> 16 0 24 1190 G 1360 5145 -> 15 0 23 1190 G 1245 5146 -> 16 0 23 1190 G 1246 5146 -> 15 0 24 1190 G 1246 5147 -> 16 0 24 1190 G 1360 5147 -> 15 0 23 1190 G 1353 5148 -> 16 0 23 1190 G 1354 5148 -> 15 0 24 1190 G 1354 5149 -> 16 0 24 1190 G 1360 5149 -> 15 0 23 1190 G 1329 5150 -> 16 0 23 1190 G 1330 5150 -> 15 0 24 1190 G 1330 5151 -> 16 0 24 1190 G 1360 5151 -> 15 0 23 1190 G 1305 5152 -> 16 0 23 1190 G 1306 5152 -> 15 0 24 1190 G 1306 5153 -> 16 0 24 1190 G 1360 5153 -> 15 0 23 1190 G 1191 5154 -> 16 0 23 1190 G 1192 5154 -> 15 0 24 1190 G 1192 5155 -> 16 0 24 1190 G 1360 5155 -> 15 0 23 1190 G 1203 5156 -> 16 0 23 1190 G 1204 5156 -> 15 0 24 1190 G 1204 5157 -> 16 0 24 1190 G 1360 5157 -> 15 0 23 1190 G 1215 5158 -> 16 0 23 1190 G 1216 5158 -> 15 0 24 1190 G 1216 5159 -> 16 0 24 1190 G 1360 5159 -> 15 0 23 1190 G 1248 5160 -> 16 0 23 1190 G 1249 5160 -> 15 0 24 1190 G 1249 5161 -> 16 0 24 1190 G 1360 5161 -> 15 0 23 1190 G 1224 5162 -> 16 0 23 1190 G 1225 5162 -> 15 0 24 1190 G 1225 5163 -> 16 0 24 1190 G 1360 5163 -> 15 0 23 1190 G 1308 5164 -> 16 0 23 1190 G 1309 5164 -> 15 0 24 1190 G 1309 5165 -> 16 0 24 1190 G 1360 5165 -> 15 0 23 1190 G 1284 5166 -> 16 0 23 1190 G 1285 5166 -> 15 0 24 1190 G 1285 5167 -> 16 0 24 1190 G 1360 5167 -> 15 0 23 1190 G 1260 5168 -> 16 0 23 1190 G 1261 5168 -> 15 0 24 1190 G 1261 5169 -> 16 0 24 1190 G 1360 5169 -> 15 0 23 1190 G 1236 5170 -> 16 0 23 1190 G 1237 5170 -> 15 0 24 1190 G 1237 5171 -> 16 0 24 1190 G 1360 5171 -> 15 0 23 1190 G 1344 5172 -> 16 0 23 1190 G 1345 5172 -> 15 0 24 1190 G 1345 5173 -> 16 0 24 1190 G 1360 5173 -> 15 0 23 1190 G 1320 5174 -> 16 0 23 1190 G 1321 5174 -> 15 0 24 1190 G 1321 5175 -> 16 0 24 1190 G 1360 5175 -> 15 0 23 1190 G 1296 5176 -> 16 0 23 1190 G 1297 5176 -> 15 0 24 1190 G 1297 5177 -> 16 0 24 1190 G 1360 5177 -> 15 0 23 1190 G 1272 5178 -> 16 0 23 1190 G 1273 5178 -> 15 0 24 1190 G 1273 5179 -> 16 0 24 1190 G 1360 5179 -> 15 0 23 1190 G 1356 5180 -> 16 0 23 1190 G 1357 5180 -> 15 0 24 1190 G 1357 5181 -> 16 0 24 1190 G 1360 5181 -> 15 0 23 1190 G 1332 5182 -> 16 0 23 1190 G 1333 5182 -> 15 0 24 1190 G 1333 5183 -> 16 0 24 1190 G 1360 5183 -> 15 0 23 1190 G 1194 5184 -> 16 0 23 1190 G 1195 5184 -> 15 0 24 1190 G 1195 5185 -> 16 0 24 1190 G 1360 5185 -> 15 0 23 1190 G 1206 5186 -> 16 0 23 1190 G 1207 5186 -> 15 0 24 1190 G 1207 5187 -> 16 0 24 1190 G 1360 5187 -> 15 0 23 1190 G 1251 5188 -> 16 0 23 1190 G 1252 5188 -> 15 0 24 1190 G 1252 5189 -> 16 0 24 1190 G 1360 5189 -> 15 0 23 1190 G 1227 5190 -> 16 0 23 1190 G 1228 5190 -> 15 0 24 1190 G 1228 5191 -> 16 0 24 1190 G 1360 5191 -> 15 0 23 1190 G 1311 5192 -> 16 0 23 1190 G 1312 5192 -> 15 0 24 1190 G 1312 5193 -> 16 0 24 1190 G 1360 5193 -> 15 0 23 1190 G 1287 5194 -> 16 0 23 1190 G 1288 5194 -> 15 0 24 1190 G 1288 5195 -> 16 0 24 1190 G 1360 5195 -> 15 0 23 1190 G 1263 5196 -> 16 0 23 1190 G 1264 5196 -> 15 0 24 1190 G 1264 5197 -> 16 0 24 1190 G 1360 5197 -> 15 0 23 1190 G 1239 5198 -> 16 0 23 1190 G 1240 5198 -> 15 0 24 1190 G 1240 5199 -> 16 0 24 1190 G 1360 5199 -> 15 0 23 1190 G 1347 5200 -> 16 0 23 1190 G 1348 5200 -> 15 0 24 1190 G 1348 5201 -> 16 0 24 1190 G 1360 5201 -> 15 0 23 1190 G 1323 5202 -> 16 0 23 1190 G 1324 5202 -> 15 0 24 1190 G 1324 5203 -> 16 0 24 1190 G 1360 5203 -> 15 0 23 1190 G 1299 5204 -> 16 0 23 1190 G 1300 5204 -> 15 0 24 1190 G 1300 5205 -> 16 0 24 1190 G 1360 5205 -> 15 0 23 1190 G 1275 5206 -> 16 0 23 1190 G 1276 5206 -> 15 0 24 1190 G 1276 5207 -> 16 0 24 1190 G 1360 5207 -> 15 0 23 1190 G 1335 5208 -> 16 0 23 1190 G 1336 5208 -> 15 0 24 1190 G 1336 5209 -> 16 0 24 1190 G 1360 5209 -> 15 0 23 1190 G 1197 5210 -> 16 0 23 1190 G 1198 5210 -> 15 0 24 1190 G 1198 5211 -> 16 0 24 1190 G 1360 5211 -> 15 0 23 1190 G 1209 5212 -> 16 0 23 1190 G 1210 5212 -> 15 0 24 1190 G 1210 5213 -> 16 0 24 1190 G 1360 5213 -> 15 0 23 1190 G 1218 5214 -> 16 0 23 1190 G 1219 5214 -> 15 0 24 1190 G 1219 5215 -> 16 0 24 1190 G 1360 5215 -> 15 0 23 1190 G 1278 5216 -> 16 0 23 1190 G 1279 5216 -> 15 0 24 1190 G 1279 5217 -> 16 0 24 1190 G 1360 5217 -> 15 0 23 1190 G 1254 5218 -> 16 0 23 1190 G 1255 5218 -> 15 0 24 1190 G 1255 5219 -> 16 0 24 1190 G 1360 5219 -> 15 0 23 1190 G 1230 5220 -> 16 0 23 1190 G 1231 5220 -> 15 0 24 1190 G 1231 5221 -> 16 0 24 1190 G 1360 5221 -> 15 0 23 1190 G 1338 5222 -> 16 0 23 1190 G 1339 5222 -> 15 0 24 1190 G 1339 5223 -> 16 0 24 1190 G 1360 5223 -> 15 0 23 1190 G 1314 5224 -> 16 0 23 1190 G 1315 5224 -> 15 0 24 1190 G 1315 5225 -> 16 0 24 1190 G 1360 5225 -> 15 0 23 1190 G 1290 5226 -> 16 0 23 1190 G 1291 5226 -> 15 0 24 1190 G 1291 5227 -> 16 0 24 1190 G 1360 5227 -> 15 0 23 1190 G 1266 5228 -> 16 0 23 1190 G 1267 5228 -> 15 0 24 1190 G 1267 5229 -> 16 0 24 1190 G 1360 5229 -> 15 0 23 1190 G 1242 5230 -> 16 0 23 1190 G 1243 5230 -> 15 0 24 1190 G 1243 5231 -> 16 0 24 1190 G 1360 5231 -> 15 0 23 1190 G 1350 5232 -> 16 0 23 1190 G 1351 5232 -> 15 0 24 1190 G 1351 5233 -> 16 0 24 1190 G 1360 5233 -> 15 0 23 1190 G 1326 5234 -> 16 0 23 1190 G 1327 5234 -> 15 0 24 1190 G 1327 5235 -> 16 0 24 1190 G 1360 5235 -> 15 0 23 1190 G 1302 5236 -> 16 0 23 1190 G 1303 5236 -> 15 0 24 1190 G 1303 5237 -> 16 0 24 1190 G 1360 5237 -> 15 0 23 1190 G 1200 5238 -> 16 0 23 1190 G 1201 5238 -> 15 0 24 1190 G 1201 5239 -> 16 0 24 1190 G 1360 5239 -> 15 0 23 1190 G 1212 5240 -> 16 0 23 1190 G 1213 5240 -> 15 0 24 1190 G 1213 5241 -> 16 0 24 1190 G 1360 5241 -> 15 0 27 1189 G 1600 5242 -> 16 0 27 1189 G 1602 5242 -> 15 0 28 1189 G 1602 5243 -> 16 0 28 1189 G 1604 5243 -> 15 0 21 1189 G 1602 5244 -> 16 0 21 1189 G 1361 5244 -> 15 0 28 1189 G 1361 5245 -> 16 0 28 1189 G 1359 5245 -> 15 0 27 1189 G 1604 5246 -> 16 0 27 1189 G 1361 5246 -> 15 0 23 1016 G 1059 5247 -> 16 0 23 1016 G 1060 5247 -> 15 0 24 1016 G 1060 5248 -> 16 0 24 1016 G 1156 5248 -> 15 0 24 1016 G 1156 5249 -> 16 0 24 1016 G 1124 5249 -> 15 0 25 1016 G 1124 5250 -> 16 0 25 1016 G 1122 5250 -> 15 0 24 1016 G 1156 5251 -> 16 0 24 1016 G 1073 5251 -> 15 0 25 1016 G 1073 5252 -> 16 0 25 1016 G 1071 5252 -> 15 0 24 1016 G 1156 5253 -> 16 0 24 1016 G 1019 5253 -> 15 0 25 1016 G 1019 5254 -> 16 0 25 1016 G 1017 5254 -> 15 0 24 1016 G 1156 5255 -> 16 0 24 1016 G 1031 5255 -> 15 0 25 1016 G 1031 5256 -> 16 0 25 1016 G 1029 5256 -> 15 0 24 1016 G 1156 5257 -> 16 0 24 1016 G 1043 5257 -> 15 0 25 1016 G 1043 5258 -> 16 0 25 1016 G 1041 5258 -> 15 0 26 1016 G 1156 5259 -> 16 0 26 1016 G 1155 5259 -> 15 0 24 1016 G 1156 5260 -> 16 0 24 1016 G 1076 5260 -> 15 0 25 1016 G 1076 5261 -> 16 0 25 1016 G 1074 5261 -> 15 0 24 1016 G 1156 5262 -> 16 0 24 1016 G 1139 5262 -> 15 0 25 1016 G 1139 5263 -> 16 0 25 1016 G 1137 5263 -> 15 0 24 1016 G 1156 5264 -> 16 0 24 1016 G 1088 5264 -> 15 0 25 1016 G 1088 5265 -> 16 0 25 1016 G 1086 5265 -> 15 0 24 1016 G 1156 5266 -> 16 0 24 1016 G 1151 5266 -> 15 0 25 1016 G 1151 5267 -> 16 0 25 1016 G 1149 5267 -> 15 0 24 1016 G 1156 5268 -> 16 0 24 1016 G 1100 5268 -> 15 0 25 1016 G 1100 5269 -> 16 0 25 1016 G 1098 5269 -> 15 0 24 1016 G 1156 5270 -> 16 0 24 1016 G 1052 5270 -> 15 0 25 1016 G 1052 5271 -> 16 0 25 1016 G 1050 5271 -> 15 0 24 1016 G 1156 5272 -> 16 0 24 1016 G 1115 5272 -> 15 0 25 1016 G 1115 5273 -> 16 0 25 1016 G 1113 5273 -> 15 0 24 1016 G 1156 5274 -> 16 0 24 1016 G 1064 5274 -> 15 0 25 1016 G 1064 5275 -> 16 0 25 1016 G 1062 5275 -> 15 0 24 1016 G 1156 5276 -> 16 0 24 1016 G 1127 5276 -> 15 0 25 1016 G 1127 5277 -> 16 0 25 1016 G 1125 5277 -> 15 0 24 1016 G 1156 5278 -> 16 0 24 1016 G 1022 5278 -> 15 0 25 1016 G 1022 5279 -> 16 0 25 1016 G 1020 5279 -> 15 0 24 1016 G 1156 5280 -> 16 0 24 1016 G 1034 5280 -> 15 0 25 1016 G 1034 5281 -> 16 0 25 1016 G 1032 5281 -> 15 0 24 1016 G 1156 5282 -> 16 0 24 1016 G 1079 5282 -> 15 0 25 1016 G 1079 5283 -> 16 0 25 1016 G 1077 5283 -> 15 0 24 1016 G 1156 5284 -> 16 0 24 1016 G 1142 5284 -> 15 0 25 1016 G 1142 5285 -> 16 0 25 1016 G 1140 5285 -> 15 0 24 1016 G 1156 5286 -> 16 0 24 1016 G 1091 5286 -> 15 0 25 1016 G 1091 5287 -> 16 0 25 1016 G 1089 5287 -> 15 0 24 1016 G 1156 5288 -> 16 0 24 1016 G 1154 5288 -> 15 0 25 1016 G 1154 5289 -> 16 0 25 1016 G 1152 5289 -> 15 0 24 1016 G 1156 5290 -> 16 0 24 1016 G 1103 5290 -> 15 0 25 1016 G 1103 5291 -> 16 0 25 1016 G 1101 5291 -> 15 0 24 1016 G 1156 5292 -> 16 0 24 1016 G 1106 5292 -> 15 0 25 1016 G 1106 5293 -> 16 0 25 1016 G 1104 5293 -> 15 0 24 1016 G 1156 5294 -> 16 0 24 1016 G 1055 5294 -> 15 0 25 1016 G 1055 5295 -> 16 0 25 1016 G 1053 5295 -> 15 0 24 1016 G 1156 5296 -> 16 0 24 1016 G 1118 5296 -> 15 0 25 1016 G 1118 5297 -> 16 0 25 1016 G 1116 5297 -> 15 0 24 1016 G 1156 5298 -> 16 0 24 1016 G 1067 5298 -> 15 0 25 1016 G 1067 5299 -> 16 0 25 1016 G 1065 5299 -> 15 0 24 1016 G 1156 5300 -> 16 0 24 1016 G 1130 5300 -> 15 0 25 1016 G 1130 5301 -> 16 0 25 1016 G 1128 5301 -> 15 0 24 1016 G 1156 5302 -> 16 0 24 1016 G 1025 5302 -> 15 0 25 1016 G 1025 5303 -> 16 0 25 1016 G 1023 5303 -> 15 0 24 1016 G 1156 5304 -> 16 0 24 1016 G 1037 5304 -> 15 0 25 1016 G 1037 5305 -> 16 0 25 1016 G 1035 5305 -> 15 0 24 1016 G 1156 5306 -> 16 0 24 1016 G 1082 5306 -> 15 0 25 1016 G 1082 5307 -> 16 0 25 1016 G 1080 5307 -> 15 0 24 1016 G 1156 5308 -> 16 0 24 1016 G 1145 5308 -> 15 0 25 1016 G 1145 5309 -> 16 0 25 1016 G 1143 5309 -> 15 0 24 1016 G 1156 5310 -> 16 0 24 1016 G 1094 5310 -> 15 0 25 1016 G 1094 5311 -> 16 0 25 1016 G 1092 5311 -> 15 0 24 1016 G 1156 5312 -> 16 0 24 1016 G 1046 5312 -> 15 0 25 1016 G 1046 5313 -> 16 0 25 1016 G 1044 5313 -> 15 0 24 1016 G 1156 5314 -> 16 0 24 1016 G 1109 5314 -> 15 0 25 1016 G 1109 5315 -> 16 0 25 1016 G 1107 5315 -> 15 0 24 1016 G 1156 5316 -> 16 0 24 1016 G 1058 5316 -> 15 0 25 1016 G 1058 5317 -> 16 0 25 1016 G 1056 5317 -> 15 0 24 1016 G 1156 5318 -> 16 0 24 1016 G 1121 5318 -> 15 0 25 1016 G 1121 5319 -> 16 0 25 1016 G 1119 5319 -> 15 0 24 1016 G 1156 5320 -> 16 0 24 1016 G 1070 5320 -> 15 0 25 1016 G 1070 5321 -> 16 0 25 1016 G 1068 5321 -> 15 0 24 1016 G 1156 5322 -> 16 0 24 1016 G 1133 5322 -> 15 0 25 1016 G 1133 5323 -> 16 0 25 1016 G 1131 5323 -> 15 0 24 1016 G 1156 5324 -> 16 0 24 1016 G 1028 5324 -> 15 0 25 1016 G 1028 5325 -> 16 0 25 1016 G 1026 5325 -> 15 0 24 1016 G 1156 5326 -> 16 0 24 1016 G 1040 5326 -> 15 0 25 1016 G 1040 5327 -> 16 0 25 1016 G 1038 5327 -> 15 0 24 1016 G 1156 5328 -> 16 0 24 1016 G 1136 5328 -> 15 0 25 1016 G 1136 5329 -> 16 0 25 1016 G 1134 5329 -> 15 0 24 1016 G 1156 5330 -> 16 0 24 1016 G 1085 5330 -> 15 0 25 1016 G 1085 5331 -> 16 0 25 1016 G 1083 5331 -> 15 0 24 1016 G 1156 5332 -> 16 0 24 1016 G 1148 5332 -> 15 0 25 1016 G 1148 5333 -> 16 0 25 1016 G 1146 5333 -> 15 0 24 1016 G 1156 5334 -> 16 0 24 1016 G 1097 5334 -> 15 0 25 1016 G 1097 5335 -> 16 0 25 1016 G 1095 5335 -> 15 0 24 1016 G 1156 5336 -> 16 0 24 1016 G 1049 5336 -> 15 0 25 1016 G 1049 5337 -> 16 0 25 1016 G 1047 5337 -> 15 0 24 1016 G 1156 5338 -> 16 0 24 1016 G 1112 5338 -> 15 0 25 1016 G 1112 5339 -> 16 0 25 1016 G 1110 5339 -> 15 0 23 1016 G 1122 5340 -> 16 0 23 1016 G 1123 5340 -> 15 0 24 1016 G 1123 5341 -> 16 0 24 1016 G 1156 5341 -> 15 0 24 1016 G 1156 5342 -> 16 0 24 1016 G 1061 5342 -> 15 0 25 1016 G 1061 5343 -> 16 0 25 1016 G 1059 5343 -> 15 0 23 1016 G 1071 5344 -> 16 0 23 1016 G 1072 5344 -> 15 0 24 1016 G 1072 5345 -> 16 0 24 1016 G 1156 5345 -> 15 0 23 1016 G 1017 5346 -> 16 0 23 1016 G 1018 5346 -> 15 0 24 1016 G 1018 5347 -> 16 0 24 1016 G 1156 5347 -> 15 0 23 1016 G 1029 5348 -> 16 0 23 1016 G 1030 5348 -> 15 0 24 1016 G 1030 5349 -> 16 0 24 1016 G 1156 5349 -> 15 0 23 1016 G 1041 5350 -> 16 0 23 1016 G 1042 5350 -> 15 0 24 1016 G 1042 5351 -> 16 0 24 1016 G 1156 5351 -> 15 0 23 1016 G 1074 5352 -> 16 0 23 1016 G 1075 5352 -> 15 0 24 1016 G 1075 5353 -> 16 0 24 1016 G 1156 5353 -> 15 0 23 1016 G 1137 5354 -> 16 0 23 1016 G 1138 5354 -> 15 0 24 1016 G 1138 5355 -> 16 0 24 1016 G 1156 5355 -> 15 0 23 1016 G 1086 5356 -> 16 0 23 1016 G 1087 5356 -> 15 0 24 1016 G 1087 5357 -> 16 0 24 1016 G 1156 5357 -> 15 0 23 1016 G 1149 5358 -> 16 0 23 1016 G 1150 5358 -> 15 0 24 1016 G 1150 5359 -> 16 0 24 1016 G 1156 5359 -> 15 0 23 1016 G 1098 5360 -> 16 0 23 1016 G 1099 5360 -> 15 0 24 1016 G 1099 5361 -> 16 0 24 1016 G 1156 5361 -> 15 0 23 1016 G 1050 5362 -> 16 0 23 1016 G 1051 5362 -> 15 0 24 1016 G 1051 5363 -> 16 0 24 1016 G 1156 5363 -> 15 0 23 1016 G 1113 5364 -> 16 0 23 1016 G 1114 5364 -> 15 0 24 1016 G 1114 5365 -> 16 0 24 1016 G 1156 5365 -> 15 0 23 1016 G 1062 5366 -> 16 0 23 1016 G 1063 5366 -> 15 0 24 1016 G 1063 5367 -> 16 0 24 1016 G 1156 5367 -> 15 0 23 1016 G 1125 5368 -> 16 0 23 1016 G 1126 5368 -> 15 0 24 1016 G 1126 5369 -> 16 0 24 1016 G 1156 5369 -> 15 0 23 1016 G 1020 5370 -> 16 0 23 1016 G 1021 5370 -> 15 0 24 1016 G 1021 5371 -> 16 0 24 1016 G 1156 5371 -> 15 0 23 1016 G 1032 5372 -> 16 0 23 1016 G 1033 5372 -> 15 0 24 1016 G 1033 5373 -> 16 0 24 1016 G 1156 5373 -> 15 0 23 1016 G 1077 5374 -> 16 0 23 1016 G 1078 5374 -> 15 0 24 1016 G 1078 5375 -> 16 0 24 1016 G 1156 5375 -> 15 0 23 1016 G 1140 5376 -> 16 0 23 1016 G 1141 5376 -> 15 0 24 1016 G 1141 5377 -> 16 0 24 1016 G 1156 5377 -> 15 0 23 1016 G 1089 5378 -> 16 0 23 1016 G 1090 5378 -> 15 0 24 1016 G 1090 5379 -> 16 0 24 1016 G 1156 5379 -> 15 0 23 1016 G 1152 5380 -> 16 0 23 1016 G 1153 5380 -> 15 0 24 1016 G 1153 5381 -> 16 0 24 1016 G 1156 5381 -> 15 0 23 1016 G 1101 5382 -> 16 0 23 1016 G 1102 5382 -> 15 0 24 1016 G 1102 5383 -> 16 0 24 1016 G 1156 5383 -> 15 0 23 1016 G 1104 5384 -> 16 0 23 1016 G 1105 5384 -> 15 0 24 1016 G 1105 5385 -> 16 0 24 1016 G 1156 5385 -> 15 0 23 1016 G 1053 5386 -> 16 0 23 1016 G 1054 5386 -> 15 0 24 1016 G 1054 5387 -> 16 0 24 1016 G 1156 5387 -> 15 0 23 1016 G 1116 5388 -> 16 0 23 1016 G 1117 5388 -> 15 0 24 1016 G 1117 5389 -> 16 0 24 1016 G 1156 5389 -> 15 0 23 1016 G 1065 5390 -> 16 0 23 1016 G 1066 5390 -> 15 0 24 1016 G 1066 5391 -> 16 0 24 1016 G 1156 5391 -> 15 0 23 1016 G 1128 5392 -> 16 0 23 1016 G 1129 5392 -> 15 0 24 1016 G 1129 5393 -> 16 0 24 1016 G 1156 5393 -> 15 0 23 1016 G 1023 5394 -> 16 0 23 1016 G 1024 5394 -> 15 0 24 1016 G 1024 5395 -> 16 0 24 1016 G 1156 5395 -> 15 0 23 1016 G 1035 5396 -> 16 0 23 1016 G 1036 5396 -> 15 0 24 1016 G 1036 5397 -> 16 0 24 1016 G 1156 5397 -> 15 0 23 1016 G 1080 5398 -> 16 0 23 1016 G 1081 5398 -> 15 0 24 1016 G 1081 5399 -> 16 0 24 1016 G 1156 5399 -> 15 0 23 1016 G 1143 5400 -> 16 0 23 1016 G 1144 5400 -> 15 0 24 1016 G 1144 5401 -> 16 0 24 1016 G 1156 5401 -> 15 0 23 1016 G 1092 5402 -> 16 0 23 1016 G 1093 5402 -> 15 0 24 1016 G 1093 5403 -> 16 0 24 1016 G 1156 5403 -> 15 0 23 1016 G 1044 5404 -> 16 0 23 1016 G 1045 5404 -> 15 0 24 1016 G 1045 5405 -> 16 0 24 1016 G 1156 5405 -> 15 0 23 1016 G 1107 5406 -> 16 0 23 1016 G 1108 5406 -> 15 0 24 1016 G 1108 5407 -> 16 0 24 1016 G 1156 5407 -> 15 0 23 1016 G 1056 5408 -> 16 0 23 1016 G 1057 5408 -> 15 0 24 1016 G 1057 5409 -> 16 0 24 1016 G 1156 5409 -> 15 0 23 1016 G 1119 5410 -> 16 0 23 1016 G 1120 5410 -> 15 0 24 1016 G 1120 5411 -> 16 0 24 1016 G 1156 5411 -> 15 0 23 1016 G 1068 5412 -> 16 0 23 1016 G 1069 5412 -> 15 0 24 1016 G 1069 5413 -> 16 0 24 1016 G 1156 5413 -> 15 0 23 1016 G 1131 5414 -> 16 0 23 1016 G 1132 5414 -> 15 0 24 1016 G 1132 5415 -> 16 0 24 1016 G 1156 5415 -> 15 0 23 1016 G 1026 5416 -> 16 0 23 1016 G 1027 5416 -> 15 0 24 1016 G 1027 5417 -> 16 0 24 1016 G 1156 5417 -> 15 0 23 1016 G 1038 5418 -> 16 0 23 1016 G 1039 5418 -> 15 0 24 1016 G 1039 5419 -> 16 0 24 1016 G 1156 5419 -> 15 0 23 1016 G 1134 5420 -> 16 0 23 1016 G 1135 5420 -> 15 0 24 1016 G 1135 5421 -> 16 0 24 1016 G 1156 5421 -> 15 0 23 1016 G 1083 5422 -> 16 0 23 1016 G 1084 5422 -> 15 0 24 1016 G 1084 5423 -> 16 0 24 1016 G 1156 5423 -> 15 0 23 1016 G 1146 5424 -> 16 0 23 1016 G 1147 5424 -> 15 0 24 1016 G 1147 5425 -> 16 0 24 1016 G 1156 5425 -> 15 0 23 1016 G 1095 5426 -> 16 0 23 1016 G 1096 5426 -> 15 0 24 1016 G 1096 5427 -> 16 0 24 1016 G 1156 5427 -> 15 0 23 1016 G 1047 5428 -> 16 0 23 1016 G 1048 5428 -> 15 0 24 1016 G 1048 5429 -> 16 0 24 1016 G 1156 5429 -> 15 0 23 1016 G 1110 5430 -> 16 0 23 1016 G 1111 5430 -> 15 0 24 1016 G 1111 5431 -> 16 0 24 1016 G 1156 5431 -> 15 0 23 952 G 989 5432 -> 16 0 23 952 G 990 5432 -> 15 0 24 952 G 990 5433 -> 16 0 24 952 G 1014 5433 -> 15 0 24 952 G 1014 5434 -> 16 0 24 952 G 997 5434 -> 15 0 25 952 G 997 5435 -> 16 0 25 952 G 995 5435 -> 15 0 24 952 G 1014 5436 -> 16 0 24 952 G 1003 5436 -> 15 0 25 952 G 1003 5437 -> 16 0 25 952 G 1001 5437 -> 15 0 24 952 G 1014 5438 -> 16 0 24 952 G 1009 5438 -> 15 0 25 952 G 1009 5439 -> 16 0 25 952 G 1007 5439 -> 15 0 24 952 G 1014 5440 -> 16 0 24 952 G 1012 5440 -> 15 0 25 952 G 1012 5441 -> 16 0 25 952 G 1010 5441 -> 15 0 24 952 G 1014 5442 -> 16 0 24 952 G 955 5442 -> 15 0 25 952 G 955 5443 -> 16 0 25 952 G 953 5443 -> 15 0 24 952 G 1014 5444 -> 16 0 24 952 G 961 5444 -> 15 0 25 952 G 961 5445 -> 16 0 25 952 G 959 5445 -> 15 0 24 952 G 1014 5446 -> 16 0 24 952 G 967 5446 -> 15 0 25 952 G 967 5447 -> 16 0 25 952 G 965 5447 -> 15 0 24 952 G 1014 5448 -> 16 0 24 952 G 973 5448 -> 15 0 25 952 G 973 5449 -> 16 0 25 952 G 971 5449 -> 15 0 24 952 G 1014 5450 -> 16 0 24 952 G 979 5450 -> 15 0 25 952 G 979 5451 -> 16 0 25 952 G 977 5451 -> 15 0 24 952 G 1014 5452 -> 16 0 24 952 G 982 5452 -> 15 0 25 952 G 982 5453 -> 16 0 25 952 G 980 5453 -> 15 0 24 952 G 1014 5454 -> 16 0 24 952 G 988 5454 -> 15 0 25 952 G 988 5455 -> 16 0 25 952 G 986 5455 -> 15 0 24 952 G 1014 5456 -> 16 0 24 952 G 994 5456 -> 15 0 25 952 G 994 5457 -> 16 0 25 952 G 992 5457 -> 15 0 24 952 G 1014 5458 -> 16 0 24 952 G 1000 5458 -> 15 0 25 952 G 1000 5459 -> 16 0 25 952 G 998 5459 -> 15 0 24 952 G 1014 5460 -> 16 0 24 952 G 1006 5460 -> 15 0 25 952 G 1006 5461 -> 16 0 25 952 G 1004 5461 -> 15 0 26 952 G 1014 5462 -> 16 0 26 952 G 1013 5462 -> 15 0 24 952 G 1014 5463 -> 16 0 24 952 G 958 5463 -> 15 0 25 952 G 958 5464 -> 16 0 25 952 G 956 5464 -> 15 0 24 952 G 1014 5465 -> 16 0 24 952 G 964 5465 -> 15 0 25 952 G 964 5466 -> 16 0 25 952 G 962 5466 -> 15 0 24 952 G 1014 5467 -> 16 0 24 952 G 970 5467 -> 15 0 25 952 G 970 5468 -> 16 0 25 952 G 968 5468 -> 15 0 24 952 G 1014 5469 -> 16 0 24 952 G 976 5469 -> 15 0 25 952 G 976 5470 -> 16 0 25 952 G 974 5470 -> 15 0 24 952 G 1014 5471 -> 16 0 24 952 G 985 5471 -> 15 0 25 952 G 985 5472 -> 16 0 25 952 G 983 5472 -> 15 0 23 952 G 995 5473 -> 16 0 23 952 G 996 5473 -> 15 0 24 952 G 996 5474 -> 16 0 24 952 G 1014 5474 -> 15 0 24 952 G 1014 5475 -> 16 0 24 952 G 991 5475 -> 15 0 25 952 G 991 5476 -> 16 0 25 952 G 989 5476 -> 15 0 23 952 G 1001 5477 -> 16 0 23 952 G 1002 5477 -> 15 0 24 952 G 1002 5478 -> 16 0 24 952 G 1014 5478 -> 15 0 23 952 G 1007 5479 -> 16 0 23 952 G 1008 5479 -> 15 0 24 952 G 1008 5480 -> 16 0 24 952 G 1014 5480 -> 15 0 23 952 G 1010 5481 -> 16 0 23 952 G 1011 5481 -> 15 0 24 952 G 1011 5482 -> 16 0 24 952 G 1014 5482 -> 15 0 23 952 G 953 5483 -> 16 0 23 952 G 954 5483 -> 15 0 24 952 G 954 5484 -> 16 0 24 952 G 1014 5484 -> 15 0 23 952 G 959 5485 -> 16 0 23 952 G 960 5485 -> 15 0 24 952 G 960 5486 -> 16 0 24 952 G 1014 5486 -> 15 0 23 952 G 965 5487 -> 16 0 23 952 G 966 5487 -> 15 0 24 952 G 966 5488 -> 16 0 24 952 G 1014 5488 -> 15 0 23 952 G 971 5489 -> 16 0 23 952 G 972 5489 -> 15 0 24 952 G 972 5490 -> 16 0 24 952 G 1014 5490 -> 15 0 23 952 G 977 5491 -> 16 0 23 952 G 978 5491 -> 15 0 24 952 G 978 5492 -> 16 0 24 952 G 1014 5492 -> 15 0 23 952 G 980 5493 -> 16 0 23 952 G 981 5493 -> 15 0 24 952 G 981 5494 -> 16 0 24 952 G 1014 5494 -> 15 0 23 952 G 986 5495 -> 16 0 23 952 G 987 5495 -> 15 0 24 952 G 987 5496 -> 16 0 24 952 G 1014 5496 -> 15 0 23 952 G 992 5497 -> 16 0 23 952 G 993 5497 -> 15 0 24 952 G 993 5498 -> 16 0 24 952 G 1014 5498 -> 15 0 23 952 G 998 5499 -> 16 0 23 952 G 999 5499 -> 15 0 24 952 G 999 5500 -> 16 0 24 952 G 1014 5500 -> 15 0 23 952 G 1004 5501 -> 16 0 23 952 G 1005 5501 -> 15 0 24 952 G 1005 5502 -> 16 0 24 952 G 1014 5502 -> 15 0 23 952 G 956 5503 -> 16 0 23 952 G 957 5503 -> 15 0 24 952 G 957 5504 -> 16 0 24 952 G 1014 5504 -> 15 0 23 952 G 962 5505 -> 16 0 23 952 G 963 5505 -> 15 0 24 952 G 963 5506 -> 16 0 24 952 G 1014 5506 -> 15 0 23 952 G 968 5507 -> 16 0 23 952 G 969 5507 -> 15 0 24 952 G 969 5508 -> 16 0 24 952 G 1014 5508 -> 15 0 23 952 G 974 5509 -> 16 0 23 952 G 975 5509 -> 15 0 24 952 G 975 5510 -> 16 0 24 952 G 1014 5510 -> 15 0 23 952 G 983 5511 -> 16 0 23 952 G 984 5511 -> 15 0 24 952 G 984 5512 -> 16 0 24 952 G 1014 5512 -> 15 0 23 1158 G 1159 5513 -> 16 0 23 1158 G 1160 5513 -> 15 0 24 1158 G 1160 5514 -> 16 0 24 1158 G 1184 5514 -> 15 0 24 1158 G 1184 5515 -> 16 0 24 1158 G 1167 5515 -> 15 0 25 1158 G 1167 5516 -> 16 0 25 1158 G 1165 5516 -> 15 0 24 1158 G 1184 5517 -> 16 0 24 1158 G 1173 5517 -> 15 0 25 1158 G 1173 5518 -> 16 0 25 1158 G 1171 5518 -> 15 0 24 1158 G 1184 5519 -> 16 0 24 1158 G 1179 5519 -> 15 0 25 1158 G 1179 5520 -> 16 0 25 1158 G 1177 5520 -> 15 0 26 1158 G 1184 5521 -> 16 0 26 1158 G 1183 5521 -> 15 0 24 1158 G 1184 5522 -> 16 0 24 1158 G 1164 5522 -> 15 0 25 1158 G 1164 5523 -> 16 0 25 1158 G 1162 5523 -> 15 0 24 1158 G 1184 5524 -> 16 0 24 1158 G 1170 5524 -> 15 0 25 1158 G 1170 5525 -> 16 0 25 1158 G 1168 5525 -> 15 0 24 1158 G 1184 5526 -> 16 0 24 1158 G 1176 5526 -> 15 0 25 1158 G 1176 5527 -> 16 0 25 1158 G 1174 5527 -> 15 0 24 1158 G 1184 5528 -> 16 0 24 1158 G 1182 5528 -> 15 0 25 1158 G 1182 5529 -> 16 0 25 1158 G 1180 5529 -> 15 0 23 1158 G 1165 5530 -> 16 0 23 1158 G 1166 5530 -> 15 0 24 1158 G 1166 5531 -> 16 0 24 1158 G 1184 5531 -> 15 0 24 1158 G 1184 5532 -> 16 0 24 1158 G 1161 5532 -> 15 0 25 1158 G 1161 5533 -> 16 0 25 1158 G 1159 5533 -> 15 0 23 1158 G 1171 5534 -> 16 0 23 1158 G 1172 5534 -> 15 0 24 1158 G 1172 5535 -> 16 0 24 1158 G 1184 5535 -> 15 0 23 1158 G 1177 5536 -> 16 0 23 1158 G 1178 5536 -> 15 0 24 1158 G 1178 5537 -> 16 0 24 1158 G 1184 5537 -> 15 0 23 1158 G 1162 5538 -> 16 0 23 1158 G 1163 5538 -> 15 0 24 1158 G 1163 5539 -> 16 0 24 1158 G 1184 5539 -> 15 0 23 1158 G 1168 5540 -> 16 0 23 1158 G 1169 5540 -> 15 0 24 1158 G 1169 5541 -> 16 0 24 1158 G 1184 5541 -> 15 0 23 1158 G 1174 5542 -> 16 0 23 1158 G 1175 5542 -> 15 0 24 1158 G 1175 5543 -> 16 0 24 1158 G 1184 5543 -> 15 0 23 1158 G 1180 5544 -> 16 0 23 1158 G 1181 5544 -> 15 0 24 1158 G 1181 5545 -> 16 0 24 1158 G 1184 5545 -> 15 0 23 870 G 931 5546 -> 16 0 23 870 G 932 5546 -> 15 0 24 870 G 932 5547 -> 16 0 24 870 G 950 5547 -> 15 0 24 870 G 950 5548 -> 16 0 24 870 G 939 5548 -> 15 0 25 870 G 939 5549 -> 16 0 25 870 G 937 5549 -> 15 0 24 870 G 950 5550 -> 16 0 24 870 G 945 5550 -> 15 0 25 870 G 945 5551 -> 16 0 25 870 G 943 5551 -> 15 0 24 870 G 950 5552 -> 16 0 24 870 G 876 5552 -> 15 0 25 870 G 876 5553 -> 16 0 25 870 G 874 5553 -> 15 0 24 870 G 950 5554 -> 16 0 24 870 G 882 5554 -> 15 0 25 870 G 882 5555 -> 16 0 25 870 G 880 5555 -> 15 0 24 870 G 950 5556 -> 16 0 24 870 G 888 5556 -> 15 0 25 870 G 888 5557 -> 16 0 25 870 G 886 5557 -> 15 0 24 870 G 950 5558 -> 16 0 24 870 G 894 5558 -> 15 0 25 870 G 894 5559 -> 16 0 25 870 G 892 5559 -> 15 0 24 870 G 950 5560 -> 16 0 24 870 G 903 5560 -> 15 0 25 870 G 903 5561 -> 16 0 25 870 G 901 5561 -> 15 0 24 870 G 950 5562 -> 16 0 24 870 G 909 5562 -> 15 0 25 870 G 909 5563 -> 16 0 25 870 G 907 5563 -> 15 0 24 870 G 950 5564 -> 16 0 24 870 G 915 5564 -> 15 0 25 870 G 915 5565 -> 16 0 25 870 G 913 5565 -> 15 0 26 870 G 950 5566 -> 16 0 26 870 G 949 5566 -> 15 0 24 870 G 950 5567 -> 16 0 24 870 G 921 5567 -> 15 0 25 870 G 921 5568 -> 16 0 25 870 G 919 5568 -> 15 0 24 870 G 950 5569 -> 16 0 24 870 G 927 5569 -> 15 0 25 870 G 927 5570 -> 16 0 25 870 G 925 5570 -> 15 0 24 870 G 950 5571 -> 16 0 24 870 G 930 5571 -> 15 0 25 870 G 930 5572 -> 16 0 25 870 G 928 5572 -> 15 0 24 870 G 950 5573 -> 16 0 24 870 G 936 5573 -> 15 0 25 870 G 936 5574 -> 16 0 25 870 G 934 5574 -> 15 0 24 870 G 950 5575 -> 16 0 24 870 G 942 5575 -> 15 0 25 870 G 942 5576 -> 16 0 25 870 G 940 5576 -> 15 0 24 870 G 950 5577 -> 16 0 24 870 G 948 5577 -> 15 0 25 870 G 948 5578 -> 16 0 25 870 G 946 5578 -> 15 0 24 870 G 950 5579 -> 16 0 24 870 G 873 5579 -> 15 0 25 870 G 873 5580 -> 16 0 25 870 G 871 5580 -> 15 0 24 870 G 950 5581 -> 16 0 24 870 G 879 5581 -> 15 0 25 870 G 879 5582 -> 16 0 25 870 G 877 5582 -> 15 0 24 870 G 950 5583 -> 16 0 24 870 G 885 5583 -> 15 0 25 870 G 885 5584 -> 16 0 25 870 G 883 5584 -> 15 0 24 870 G 950 5585 -> 16 0 24 870 G 891 5585 -> 15 0 25 870 G 891 5586 -> 16 0 25 870 G 889 5586 -> 15 0 24 870 G 950 5587 -> 16 0 24 870 G 897 5587 -> 15 0 25 870 G 897 5588 -> 16 0 25 870 G 895 5588 -> 15 0 24 870 G 950 5589 -> 16 0 24 870 G 900 5589 -> 15 0 25 870 G 900 5590 -> 16 0 25 870 G 898 5590 -> 15 0 24 870 G 950 5591 -> 16 0 24 870 G 906 5591 -> 15 0 25 870 G 906 5592 -> 16 0 25 870 G 904 5592 -> 15 0 24 870 G 950 5593 -> 16 0 24 870 G 912 5593 -> 15 0 25 870 G 912 5594 -> 16 0 25 870 G 910 5594 -> 15 0 24 870 G 950 5595 -> 16 0 24 870 G 918 5595 -> 15 0 25 870 G 918 5596 -> 16 0 25 870 G 916 5596 -> 15 0 24 870 G 950 5597 -> 16 0 24 870 G 924 5597 -> 15 0 25 870 G 924 5598 -> 16 0 25 870 G 922 5598 -> 15 0 23 870 G 937 5599 -> 16 0 23 870 G 938 5599 -> 15 0 24 870 G 938 5600 -> 16 0 24 870 G 950 5600 -> 15 0 24 870 G 950 5601 -> 16 0 24 870 G 933 5601 -> 15 0 25 870 G 933 5602 -> 16 0 25 870 G 931 5602 -> 15 0 23 870 G 943 5603 -> 16 0 23 870 G 944 5603 -> 15 0 24 870 G 944 5604 -> 16 0 24 870 G 950 5604 -> 15 0 23 870 G 874 5605 -> 16 0 23 870 G 875 5605 -> 15 0 24 870 G 875 5606 -> 16 0 24 870 G 950 5606 -> 15 0 23 870 G 880 5607 -> 16 0 23 870 G 881 5607 -> 15 0 24 870 G 881 5608 -> 16 0 24 870 G 950 5608 -> 15 0 23 870 G 886 5609 -> 16 0 23 870 G 887 5609 -> 15 0 24 870 G 887 5610 -> 16 0 24 870 G 950 5610 -> 15 0 23 870 G 892 5611 -> 16 0 23 870 G 893 5611 -> 15 0 24 870 G 893 5612 -> 16 0 24 870 G 950 5612 -> 15 0 23 870 G 901 5613 -> 16 0 23 870 G 902 5613 -> 15 0 24 870 G 902 5614 -> 16 0 24 870 G 950 5614 -> 15 0 23 870 G 907 5615 -> 16 0 23 870 G 908 5615 -> 15 0 24 870 G 908 5616 -> 16 0 24 870 G 950 5616 -> 15 0 23 870 G 913 5617 -> 16 0 23 870 G 914 5617 -> 15 0 24 870 G 914 5618 -> 16 0 24 870 G 950 5618 -> 15 0 23 870 G 919 5619 -> 16 0 23 870 G 920 5619 -> 15 0 24 870 G 920 5620 -> 16 0 24 870 G 950 5620 -> 15 0 23 870 G 925 5621 -> 16 0 23 870 G 926 5621 -> 15 0 24 870 G 926 5622 -> 16 0 24 870 G 950 5622 -> 15 0 23 870 G 928 5623 -> 16 0 23 870 G 929 5623 -> 15 0 24 870 G 929 5624 -> 16 0 24 870 G 950 5624 -> 15 0 23 870 G 934 5625 -> 16 0 23 870 G 935 5625 -> 15 0 24 870 G 935 5626 -> 16 0 24 870 G 950 5626 -> 15 0 23 870 G 940 5627 -> 16 0 23 870 G 941 5627 -> 15 0 24 870 G 941 5628 -> 16 0 24 870 G 950 5628 -> 15 0 23 870 G 946 5629 -> 16 0 23 870 G 947 5629 -> 15 0 24 870 G 947 5630 -> 16 0 24 870 G 950 5630 -> 15 0 23 870 G 871 5631 -> 16 0 23 870 G 872 5631 -> 15 0 24 870 G 872 5632 -> 16 0 24 870 G 950 5632 -> 15 0 23 870 G 877 5633 -> 16 0 23 870 G 878 5633 -> 15 0 24 870 G 878 5634 -> 16 0 24 870 G 950 5634 -> 15 0 23 870 G 883 5635 -> 16 0 23 870 G 884 5635 -> 15 0 24 870 G 884 5636 -> 16 0 24 870 G 950 5636 -> 15 0 23 870 G 889 5637 -> 16 0 23 870 G 890 5637 -> 15 0 24 870 G 890 5638 -> 16 0 24 870 G 950 5638 -> 15 0 23 870 G 895 5639 -> 16 0 23 870 G 896 5639 -> 15 0 24 870 G 896 5640 -> 16 0 24 870 G 950 5640 -> 15 0 23 870 G 898 5641 -> 16 0 23 870 G 899 5641 -> 15 0 24 870 G 899 5642 -> 16 0 24 870 G 950 5642 -> 15 0 23 870 G 904 5643 -> 16 0 23 870 G 905 5643 -> 15 0 24 870 G 905 5644 -> 16 0 24 870 G 950 5644 -> 15 0 23 870 G 910 5645 -> 16 0 23 870 G 911 5645 -> 15 0 24 870 G 911 5646 -> 16 0 24 870 G 950 5646 -> 15 0 23 870 G 916 5647 -> 16 0 23 870 G 917 5647 -> 15 0 24 870 G 917 5648 -> 16 0 24 870 G 950 5648 -> 15 0 23 870 G 922 5649 -> 16 0 23 870 G 923 5649 -> 15 0 24 870 G 923 5650 -> 16 0 24 870 G 950 5650 -> 15 0 27 869 G 1155 5651 -> 16 0 27 869 G 1157 5651 -> 15 0 21 869 G 1157 5652 -> 16 0 21 869 G 1015 5652 -> 15 0 28 869 G 1015 5653 -> 16 0 28 869 G 1013 5653 -> 15 0 21 869 G 1157 5654 -> 16 0 21 869 G 1185 5654 -> 15 0 28 869 G 1185 5655 -> 16 0 28 869 G 1183 5655 -> 15 0 28 869 G 1157 5656 -> 16 0 28 869 G 1187 5656 -> 15 0 21 869 G 1157 5657 -> 16 0 21 869 G 951 5657 -> 15 0 28 869 G 951 5658 -> 16 0 28 869 G 949 5658 -> 15 0 21 869 G 1015 5659 -> 16 0 21 869 G 1185 5659 -> 15 0 28 869 G 1015 5660 -> 16 0 28 869 G 1187 5660 -> 15 0 21 869 G 1015 5661 -> 16 0 21 869 G 951 5661 -> 15 0 28 869 G 1185 5662 -> 16 0 28 869 G 1187 5662 -> 15 0 21 869 G 1185 5663 -> 16 0 21 869 G 951 5663 -> 15 0 27 869 G 1187 5664 -> 16 0 27 869 G 951 5664 -> 15 0 23 3922 G 3989 5665 -> 16 0 23 3922 G 3990 5665 -> 15 0 24 3922 G 3990 5666 -> 16 0 24 3922 G 4092 5666 -> 15 0 24 3922 G 4092 5667 -> 16 0 24 3922 G 4051 5667 -> 15 0 25 3922 G 4051 5668 -> 16 0 25 3922 G 4049 5668 -> 15 0 24 3922 G 4092 5669 -> 16 0 24 3922 G 3973 5669 -> 15 0 25 3922 G 3973 5670 -> 16 0 25 3922 G 3971 5670 -> 15 0 24 3922 G 4092 5671 -> 16 0 24 3922 G 4033 5671 -> 15 0 25 3922 G 4033 5672 -> 16 0 25 3922 G 4031 5672 -> 15 0 24 3922 G 4092 5673 -> 16 0 24 3922 G 3931 5673 -> 15 0 25 3922 G 3931 5674 -> 16 0 25 3922 G 3929 5674 -> 15 0 24 3922 G 4092 5675 -> 16 0 24 3922 G 3958 5675 -> 15 0 25 3922 G 3958 5676 -> 16 0 25 3922 G 3956 5676 -> 15 0 24 3922 G 4092 5677 -> 16 0 24 3922 G 4018 5677 -> 15 0 25 3922 G 4018 5678 -> 16 0 25 3922 G 4016 5678 -> 15 0 24 3922 G 4092 5679 -> 16 0 24 3922 G 4078 5679 -> 15 0 25 3922 G 4078 5680 -> 16 0 25 3922 G 4076 5680 -> 15 0 24 3922 G 4092 5681 -> 16 0 24 3922 G 4000 5681 -> 15 0 25 3922 G 4000 5682 -> 16 0 25 3922 G 3998 5682 -> 15 0 24 3922 G 4092 5683 -> 16 0 24 3922 G 4060 5683 -> 15 0 25 3922 G 4060 5684 -> 16 0 25 3922 G 4058 5684 -> 15 0 24 3922 G 4092 5685 -> 16 0 24 3922 G 3940 5685 -> 15 0 25 3922 G 3940 5686 -> 16 0 25 3922 G 3938 5686 -> 15 0 24 3922 G 4092 5687 -> 16 0 24 3922 G 3985 5687 -> 15 0 25 3922 G 3985 5688 -> 16 0 25 3922 G 3983 5688 -> 15 0 24 3922 G 4092 5689 -> 16 0 24 3922 G 4045 5689 -> 15 0 25 3922 G 4045 5690 -> 16 0 25 3922 G 4043 5690 -> 15 0 24 3922 G 4092 5691 -> 16 0 24 3922 G 3967 5691 -> 15 0 25 3922 G 3967 5692 -> 16 0 25 3922 G 3965 5692 -> 15 0 24 3922 G 4092 5693 -> 16 0 24 3922 G 4027 5693 -> 15 0 25 3922 G 4027 5694 -> 16 0 25 3922 G 4025 5694 -> 15 0 24 3922 G 4092 5695 -> 16 0 24 3922 G 4087 5695 -> 15 0 25 3922 G 4087 5696 -> 16 0 25 3922 G 4085 5696 -> 15 0 24 3922 G 4092 5697 -> 16 0 24 3922 G 4009 5697 -> 15 0 25 3922 G 4009 5698 -> 16 0 25 3922 G 4007 5698 -> 15 0 24 3922 G 4092 5699 -> 16 0 24 3922 G 4069 5699 -> 15 0 25 3922 G 4069 5700 -> 16 0 25 3922 G 4067 5700 -> 15 0 24 3922 G 4092 5701 -> 16 0 24 3922 G 3925 5701 -> 15 0 25 3922 G 3925 5702 -> 16 0 25 3922 G 3923 5702 -> 15 0 24 3922 G 4092 5703 -> 16 0 24 3922 G 3949 5703 -> 15 0 25 3922 G 3949 5704 -> 16 0 25 3922 G 3947 5704 -> 15 0 24 3922 G 4092 5705 -> 16 0 24 3922 G 3952 5705 -> 15 0 25 3922 G 3952 5706 -> 16 0 25 3922 G 3950 5706 -> 15 0 24 3922 G 4092 5707 -> 16 0 24 3922 G 4012 5707 -> 15 0 25 3922 G 4012 5708 -> 16 0 25 3922 G 4010 5708 -> 15 0 24 3922 G 4092 5709 -> 16 0 24 3922 G 4072 5709 -> 15 0 25 3922 G 4072 5710 -> 16 0 25 3922 G 4070 5710 -> 15 0 24 3922 G 4092 5711 -> 16 0 24 3922 G 3994 5711 -> 15 0 25 3922 G 3994 5712 -> 16 0 25 3922 G 3992 5712 -> 15 0 24 3922 G 4092 5713 -> 16 0 24 3922 G 4054 5713 -> 15 0 25 3922 G 4054 5714 -> 16 0 25 3922 G 4052 5714 -> 15 0 24 3922 G 4092 5715 -> 16 0 24 3922 G 3976 5715 -> 15 0 25 3922 G 3976 5716 -> 16 0 25 3922 G 3974 5716 -> 15 0 24 3922 G 4092 5717 -> 16 0 24 3922 G 4036 5717 -> 15 0 25 3922 G 4036 5718 -> 16 0 25 3922 G 4034 5718 -> 15 0 24 3922 G 4092 5719 -> 16 0 24 3922 G 3934 5719 -> 15 0 25 3922 G 3934 5720 -> 16 0 25 3922 G 3932 5720 -> 15 0 24 3922 G 4092 5721 -> 16 0 24 3922 G 3961 5721 -> 15 0 25 3922 G 3961 5722 -> 16 0 25 3922 G 3959 5722 -> 15 0 24 3922 G 4092 5723 -> 16 0 24 3922 G 4021 5723 -> 15 0 25 3922 G 4021 5724 -> 16 0 25 3922 G 4019 5724 -> 15 0 24 3922 G 4092 5725 -> 16 0 24 3922 G 4081 5725 -> 15 0 25 3922 G 4081 5726 -> 16 0 25 3922 G 4079 5726 -> 15 0 24 3922 G 4092 5727 -> 16 0 24 3922 G 4003 5727 -> 15 0 25 3922 G 4003 5728 -> 16 0 25 3922 G 4001 5728 -> 15 0 24 3922 G 4092 5729 -> 16 0 24 3922 G 4063 5729 -> 15 0 25 3922 G 4063 5730 -> 16 0 25 3922 G 4061 5730 -> 15 0 24 3922 G 4092 5731 -> 16 0 24 3922 G 3943 5731 -> 15 0 25 3922 G 3943 5732 -> 16 0 25 3922 G 3941 5732 -> 15 0 24 3922 G 4092 5733 -> 16 0 24 3922 G 3988 5733 -> 15 0 25 3922 G 3988 5734 -> 16 0 25 3922 G 3986 5734 -> 15 0 24 3922 G 4092 5735 -> 16 0 24 3922 G 4048 5735 -> 15 0 25 3922 G 4048 5736 -> 16 0 25 3922 G 4046 5736 -> 15 0 24 3922 G 4092 5737 -> 16 0 24 3922 G 3970 5737 -> 15 0 25 3922 G 3970 5738 -> 16 0 25 3922 G 3968 5738 -> 15 0 24 3922 G 4092 5739 -> 16 0 24 3922 G 4030 5739 -> 15 0 25 3922 G 4030 5740 -> 16 0 25 3922 G 4028 5740 -> 15 0 24 3922 G 4092 5741 -> 16 0 24 3922 G 4090 5741 -> 15 0 25 3922 G 4090 5742 -> 16 0 25 3922 G 4088 5742 -> 15 0 24 3922 G 4092 5743 -> 16 0 24 3922 G 3928 5743 -> 15 0 25 3922 G 3928 5744 -> 16 0 25 3922 G 3926 5744 -> 15 0 26 3922 G 4092 5745 -> 16 0 26 3922 G 4091 5745 -> 15 0 24 3922 G 4092 5746 -> 16 0 24 3922 G 3955 5746 -> 15 0 25 3922 G 3955 5747 -> 16 0 25 3922 G 3953 5747 -> 15 0 24 3922 G 4092 5748 -> 16 0 24 3922 G 4015 5748 -> 15 0 25 3922 G 4015 5749 -> 16 0 25 3922 G 4013 5749 -> 15 0 24 3922 G 4092 5750 -> 16 0 24 3922 G 4075 5750 -> 15 0 25 3922 G 4075 5751 -> 16 0 25 3922 G 4073 5751 -> 15 0 24 3922 G 4092 5752 -> 16 0 24 3922 G 3997 5752 -> 15 0 25 3922 G 3997 5753 -> 16 0 25 3922 G 3995 5753 -> 15 0 24 3922 G 4092 5754 -> 16 0 24 3922 G 4057 5754 -> 15 0 25 3922 G 4057 5755 -> 16 0 25 3922 G 4055 5755 -> 15 0 24 3922 G 4092 5756 -> 16 0 24 3922 G 3979 5756 -> 15 0 25 3922 G 3979 5757 -> 16 0 25 3922 G 3977 5757 -> 15 0 24 3922 G 4092 5758 -> 16 0 24 3922 G 4039 5758 -> 15 0 25 3922 G 4039 5759 -> 16 0 25 3922 G 4037 5759 -> 15 0 24 3922 G 4092 5760 -> 16 0 24 3922 G 3937 5760 -> 15 0 25 3922 G 3937 5761 -> 16 0 25 3922 G 3935 5761 -> 15 0 24 3922 G 4092 5762 -> 16 0 24 3922 G 3982 5762 -> 15 0 25 3922 G 3982 5763 -> 16 0 25 3922 G 3980 5763 -> 15 0 24 3922 G 4092 5764 -> 16 0 24 3922 G 4042 5764 -> 15 0 25 3922 G 4042 5765 -> 16 0 25 3922 G 4040 5765 -> 15 0 24 3922 G 4092 5766 -> 16 0 24 3922 G 3964 5766 -> 15 0 25 3922 G 3964 5767 -> 16 0 25 3922 G 3962 5767 -> 15 0 24 3922 G 4092 5768 -> 16 0 24 3922 G 4024 5768 -> 15 0 25 3922 G 4024 5769 -> 16 0 25 3922 G 4022 5769 -> 15 0 24 3922 G 4092 5770 -> 16 0 24 3922 G 4084 5770 -> 15 0 25 3922 G 4084 5771 -> 16 0 25 3922 G 4082 5771 -> 15 0 24 3922 G 4092 5772 -> 16 0 24 3922 G 4006 5772 -> 15 0 25 3922 G 4006 5773 -> 16 0 25 3922 G 4004 5773 -> 15 0 24 3922 G 4092 5774 -> 16 0 24 3922 G 4066 5774 -> 15 0 25 3922 G 4066 5775 -> 16 0 25 3922 G 4064 5775 -> 15 0 24 3922 G 4092 5776 -> 16 0 24 3922 G 3946 5776 -> 15 0 25 3922 G 3946 5777 -> 16 0 25 3922 G 3944 5777 -> 15 0 23 3922 G 4049 5778 -> 16 0 23 3922 G 4050 5778 -> 15 0 24 3922 G 4050 5779 -> 16 0 24 3922 G 4092 5779 -> 15 0 24 3922 G 4092 5780 -> 16 0 24 3922 G 3991 5780 -> 15 0 25 3922 G 3991 5781 -> 16 0 25 3922 G 3989 5781 -> 15 0 23 3922 G 3971 5782 -> 16 0 23 3922 G 3972 5782 -> 15 0 24 3922 G 3972 5783 -> 16 0 24 3922 G 4092 5783 -> 15 0 23 3922 G 4031 5784 -> 16 0 23 3922 G 4032 5784 -> 15 0 24 3922 G 4032 5785 -> 16 0 24 3922 G 4092 5785 -> 15 0 23 3922 G 3929 5786 -> 16 0 23 3922 G 3930 5786 -> 15 0 24 3922 G 3930 5787 -> 16 0 24 3922 G 4092 5787 -> 15 0 23 3922 G 3956 5788 -> 16 0 23 3922 G 3957 5788 -> 15 0 24 3922 G 3957 5789 -> 16 0 24 3922 G 4092 5789 -> 15 0 23 3922 G 4016 5790 -> 16 0 23 3922 G 4017 5790 -> 15 0 24 3922 G 4017 5791 -> 16 0 24 3922 G 4092 5791 -> 15 0 23 3922 G 4076 5792 -> 16 0 23 3922 G 4077 5792 -> 15 0 24 3922 G 4077 5793 -> 16 0 24 3922 G 4092 5793 -> 15 0 23 3922 G 3998 5794 -> 16 0 23 3922 G 3999 5794 -> 15 0 24 3922 G 3999 5795 -> 16 0 24 3922 G 4092 5795 -> 15 0 23 3922 G 4058 5796 -> 16 0 23 3922 G 4059 5796 -> 15 0 24 3922 G 4059 5797 -> 16 0 24 3922 G 4092 5797 -> 15 0 23 3922 G 3938 5798 -> 16 0 23 3922 G 3939 5798 -> 15 0 24 3922 G 3939 5799 -> 16 0 24 3922 G 4092 5799 -> 15 0 23 3922 G 3983 5800 -> 16 0 23 3922 G 3984 5800 -> 15 0 24 3922 G 3984 5801 -> 16 0 24 3922 G 4092 5801 -> 15 0 23 3922 G 4043 5802 -> 16 0 23 3922 G 4044 5802 -> 15 0 24 3922 G 4044 5803 -> 16 0 24 3922 G 4092 5803 -> 15 0 23 3922 G 3965 5804 -> 16 0 23 3922 G 3966 5804 -> 15 0 24 3922 G 3966 5805 -> 16 0 24 3922 G 4092 5805 -> 15 0 23 3922 G 4025 5806 -> 16 0 23 3922 G 4026 5806 -> 15 0 24 3922 G 4026 5807 -> 16 0 24 3922 G 4092 5807 -> 15 0 23 3922 G 4085 5808 -> 16 0 23 3922 G 4086 5808 -> 15 0 24 3922 G 4086 5809 -> 16 0 24 3922 G 4092 5809 -> 15 0 23 3922 G 4007 5810 -> 16 0 23 3922 G 4008 5810 -> 15 0 24 3922 G 4008 5811 -> 16 0 24 3922 G 4092 5811 -> 15 0 23 3922 G 4067 5812 -> 16 0 23 3922 G 4068 5812 -> 15 0 24 3922 G 4068 5813 -> 16 0 24 3922 G 4092 5813 -> 15 0 23 3922 G 3923 5814 -> 16 0 23 3922 G 3924 5814 -> 15 0 24 3922 G 3924 5815 -> 16 0 24 3922 G 4092 5815 -> 15 0 23 3922 G 3947 5816 -> 16 0 23 3922 G 3948 5816 -> 15 0 24 3922 G 3948 5817 -> 16 0 24 3922 G 4092 5817 -> 15 0 23 3922 G 3950 5818 -> 16 0 23 3922 G 3951 5818 -> 15 0 24 3922 G 3951 5819 -> 16 0 24 3922 G 4092 5819 -> 15 0 23 3922 G 4010 5820 -> 16 0 23 3922 G 4011 5820 -> 15 0 24 3922 G 4011 5821 -> 16 0 24 3922 G 4092 5821 -> 15 0 23 3922 G 4070 5822 -> 16 0 23 3922 G 4071 5822 -> 15 0 24 3922 G 4071 5823 -> 16 0 24 3922 G 4092 5823 -> 15 0 23 3922 G 3992 5824 -> 16 0 23 3922 G 3993 5824 -> 15 0 24 3922 G 3993 5825 -> 16 0 24 3922 G 4092 5825 -> 15 0 23 3922 G 4052 5826 -> 16 0 23 3922 G 4053 5826 -> 15 0 24 3922 G 4053 5827 -> 16 0 24 3922 G 4092 5827 -> 15 0 23 3922 G 3974 5828 -> 16 0 23 3922 G 3975 5828 -> 15 0 24 3922 G 3975 5829 -> 16 0 24 3922 G 4092 5829 -> 15 0 23 3922 G 4034 5830 -> 16 0 23 3922 G 4035 5830 -> 15 0 24 3922 G 4035 5831 -> 16 0 24 3922 G 4092 5831 -> 15 0 23 3922 G 3932 5832 -> 16 0 23 3922 G 3933 5832 -> 15 0 24 3922 G 3933 5833 -> 16 0 24 3922 G 4092 5833 -> 15 0 23 3922 G 3959 5834 -> 16 0 23 3922 G 3960 5834 -> 15 0 24 3922 G 3960 5835 -> 16 0 24 3922 G 4092 5835 -> 15 0 23 3922 G 4019 5836 -> 16 0 23 3922 G 4020 5836 -> 15 0 24 3922 G 4020 5837 -> 16 0 24 3922 G 4092 5837 -> 15 0 23 3922 G 4079 5838 -> 16 0 23 3922 G 4080 5838 -> 15 0 24 3922 G 4080 5839 -> 16 0 24 3922 G 4092 5839 -> 15 0 23 3922 G 4001 5840 -> 16 0 23 3922 G 4002 5840 -> 15 0 24 3922 G 4002 5841 -> 16 0 24 3922 G 4092 5841 -> 15 0 23 3922 G 4061 5842 -> 16 0 23 3922 G 4062 5842 -> 15 0 24 3922 G 4062 5843 -> 16 0 24 3922 G 4092 5843 -> 15 0 23 3922 G 3941 5844 -> 16 0 23 3922 G 3942 5844 -> 15 0 24 3922 G 3942 5845 -> 16 0 24 3922 G 4092 5845 -> 15 0 23 3922 G 3986 5846 -> 16 0 23 3922 G 3987 5846 -> 15 0 24 3922 G 3987 5847 -> 16 0 24 3922 G 4092 5847 -> 15 0 23 3922 G 4046 5848 -> 16 0 23 3922 G 4047 5848 -> 15 0 24 3922 G 4047 5849 -> 16 0 24 3922 G 4092 5849 -> 15 0 23 3922 G 3968 5850 -> 16 0 23 3922 G 3969 5850 -> 15 0 24 3922 G 3969 5851 -> 16 0 24 3922 G 4092 5851 -> 15 0 23 3922 G 4028 5852 -> 16 0 23 3922 G 4029 5852 -> 15 0 24 3922 G 4029 5853 -> 16 0 24 3922 G 4092 5853 -> 15 0 23 3922 G 4088 5854 -> 16 0 23 3922 G 4089 5854 -> 15 0 24 3922 G 4089 5855 -> 16 0 24 3922 G 4092 5855 -> 15 0 23 3922 G 3926 5856 -> 16 0 23 3922 G 3927 5856 -> 15 0 24 3922 G 3927 5857 -> 16 0 24 3922 G 4092 5857 -> 15 0 23 3922 G 3953 5858 -> 16 0 23 3922 G 3954 5858 -> 15 0 24 3922 G 3954 5859 -> 16 0 24 3922 G 4092 5859 -> 15 0 23 3922 G 4013 5860 -> 16 0 23 3922 G 4014 5860 -> 15 0 24 3922 G 4014 5861 -> 16 0 24 3922 G 4092 5861 -> 15 0 23 3922 G 4073 5862 -> 16 0 23 3922 G 4074 5862 -> 15 0 24 3922 G 4074 5863 -> 16 0 24 3922 G 4092 5863 -> 15 0 23 3922 G 3995 5864 -> 16 0 23 3922 G 3996 5864 -> 15 0 24 3922 G 3996 5865 -> 16 0 24 3922 G 4092 5865 -> 15 0 23 3922 G 4055 5866 -> 16 0 23 3922 G 4056 5866 -> 15 0 24 3922 G 4056 5867 -> 16 0 24 3922 G 4092 5867 -> 15 0 23 3922 G 3977 5868 -> 16 0 23 3922 G 3978 5868 -> 15 0 24 3922 G 3978 5869 -> 16 0 24 3922 G 4092 5869 -> 15 0 23 3922 G 4037 5870 -> 16 0 23 3922 G 4038 5870 -> 15 0 24 3922 G 4038 5871 -> 16 0 24 3922 G 4092 5871 -> 15 0 23 3922 G 3935 5872 -> 16 0 23 3922 G 3936 5872 -> 15 0 24 3922 G 3936 5873 -> 16 0 24 3922 G 4092 5873 -> 15 0 23 3922 G 3980 5874 -> 16 0 23 3922 G 3981 5874 -> 15 0 24 3922 G 3981 5875 -> 16 0 24 3922 G 4092 5875 -> 15 0 23 3922 G 4040 5876 -> 16 0 23 3922 G 4041 5876 -> 15 0 24 3922 G 4041 5877 -> 16 0 24 3922 G 4092 5877 -> 15 0 23 3922 G 3962 5878 -> 16 0 23 3922 G 3963 5878 -> 15 0 24 3922 G 3963 5879 -> 16 0 24 3922 G 4092 5879 -> 15 0 23 3922 G 4022 5880 -> 16 0 23 3922 G 4023 5880 -> 15 0 24 3922 G 4023 5881 -> 16 0 24 3922 G 4092 5881 -> 15 0 23 3922 G 4082 5882 -> 16 0 23 3922 G 4083 5882 -> 15 0 24 3922 G 4083 5883 -> 16 0 24 3922 G 4092 5883 -> 15 0 23 3922 G 4004 5884 -> 16 0 23 3922 G 4005 5884 -> 15 0 24 3922 G 4005 5885 -> 16 0 24 3922 G 4092 5885 -> 15 0 23 3922 G 4064 5886 -> 16 0 23 3922 G 4065 5886 -> 15 0 24 3922 G 4065 5887 -> 16 0 24 3922 G 4092 5887 -> 15 0 23 3922 G 3944 5888 -> 16 0 23 3922 G 3945 5888 -> 15 0 24 3922 G 3945 5889 -> 16 0 24 3922 G 4092 5889 -> 15 0 23 4248 G 4273 5890 -> 16 0 23 4248 G 4274 5890 -> 15 0 24 4248 G 4274 5891 -> 16 0 24 4248 G 4385 5891 -> 15 0 24 4248 G 4385 5892 -> 16 0 24 4248 G 4281 5892 -> 15 0 25 4248 G 4281 5893 -> 16 0 25 4248 G 4279 5893 -> 15 0 24 4248 G 4385 5894 -> 16 0 24 4248 G 4311 5894 -> 15 0 25 4248 G 4311 5895 -> 16 0 25 4248 G 4309 5895 -> 15 0 24 4248 G 4385 5896 -> 16 0 24 4248 G 4341 5896 -> 15 0 25 4248 G 4341 5897 -> 16 0 25 4248 G 4339 5897 -> 15 0 24 4248 G 4385 5898 -> 16 0 24 4248 G 4371 5898 -> 15 0 25 4248 G 4371 5899 -> 16 0 25 4248 G 4369 5899 -> 15 0 24 4248 G 4385 5900 -> 16 0 24 4248 G 4293 5900 -> 15 0 25 4248 G 4293 5901 -> 16 0 25 4248 G 4291 5901 -> 15 0 24 4248 G 4385 5902 -> 16 0 24 4248 G 4323 5902 -> 15 0 25 4248 G 4323 5903 -> 16 0 25 4248 G 4321 5903 -> 15 0 24 4248 G 4385 5904 -> 16 0 24 4248 G 4353 5904 -> 15 0 25 4248 G 4353 5905 -> 16 0 25 4248 G 4351 5905 -> 15 0 24 4248 G 4385 5906 -> 16 0 24 4248 G 4383 5906 -> 15 0 25 4248 G 4383 5907 -> 16 0 25 4248 G 4381 5907 -> 15 0 24 4248 G 4385 5908 -> 16 0 24 4248 G 4305 5908 -> 15 0 25 4248 G 4305 5909 -> 16 0 25 4248 G 4303 5909 -> 15 0 24 4248 G 4385 5910 -> 16 0 24 4248 G 4335 5910 -> 15 0 25 4248 G 4335 5911 -> 16 0 25 4248 G 4333 5911 -> 15 0 24 4248 G 4385 5912 -> 16 0 24 4248 G 4365 5912 -> 15 0 25 4248 G 4365 5913 -> 16 0 25 4248 G 4363 5913 -> 15 0 24 4248 G 4385 5914 -> 16 0 24 4248 G 4260 5914 -> 15 0 25 4248 G 4260 5915 -> 16 0 25 4248 G 4258 5915 -> 15 0 24 4248 G 4385 5916 -> 16 0 24 4248 G 4272 5916 -> 15 0 25 4248 G 4272 5917 -> 16 0 25 4248 G 4270 5917 -> 15 0 24 4248 G 4385 5918 -> 16 0 24 4248 G 4278 5918 -> 15 0 25 4248 G 4278 5919 -> 16 0 25 4248 G 4276 5919 -> 15 0 24 4248 G 4385 5920 -> 16 0 24 4248 G 4308 5920 -> 15 0 25 4248 G 4308 5921 -> 16 0 25 4248 G 4306 5921 -> 15 0 24 4248 G 4385 5922 -> 16 0 24 4248 G 4338 5922 -> 15 0 25 4248 G 4338 5923 -> 16 0 25 4248 G 4336 5923 -> 15 0 24 4248 G 4385 5924 -> 16 0 24 4248 G 4368 5924 -> 15 0 25 4248 G 4368 5925 -> 16 0 25 4248 G 4366 5925 -> 15 0 24 4248 G 4385 5926 -> 16 0 24 4248 G 4290 5926 -> 15 0 25 4248 G 4290 5927 -> 16 0 25 4248 G 4288 5927 -> 15 0 24 4248 G 4385 5928 -> 16 0 24 4248 G 4320 5928 -> 15 0 25 4248 G 4320 5929 -> 16 0 25 4248 G 4318 5929 -> 15 0 24 4248 G 4385 5930 -> 16 0 24 4248 G 4350 5930 -> 15 0 25 4248 G 4350 5931 -> 16 0 25 4248 G 4348 5931 -> 15 0 24 4248 G 4385 5932 -> 16 0 24 4248 G 4380 5932 -> 15 0 25 4248 G 4380 5933 -> 16 0 25 4248 G 4378 5933 -> 15 0 24 4248 G 4385 5934 -> 16 0 24 4248 G 4302 5934 -> 15 0 25 4248 G 4302 5935 -> 16 0 25 4248 G 4300 5935 -> 15 0 24 4248 G 4385 5936 -> 16 0 24 4248 G 4332 5936 -> 15 0 25 4248 G 4332 5937 -> 16 0 25 4248 G 4330 5937 -> 15 0 24 4248 G 4385 5938 -> 16 0 24 4248 G 4362 5938 -> 15 0 25 4248 G 4362 5939 -> 16 0 25 4248 G 4360 5939 -> 15 0 24 4248 G 4385 5940 -> 16 0 24 4248 G 4257 5940 -> 15 0 25 4248 G 4257 5941 -> 16 0 25 4248 G 4255 5941 -> 15 0 24 4248 G 4385 5942 -> 16 0 24 4248 G 4269 5942 -> 15 0 25 4248 G 4269 5943 -> 16 0 25 4248 G 4267 5943 -> 15 0 26 4248 G 4385 5944 -> 16 0 26 4248 G 4384 5944 -> 15 0 24 4248 G 4385 5945 -> 16 0 24 4248 G 4287 5945 -> 15 0 25 4248 G 4287 5946 -> 16 0 25 4248 G 4285 5946 -> 15 0 24 4248 G 4385 5947 -> 16 0 24 4248 G 4317 5947 -> 15 0 25 4248 G 4317 5948 -> 16 0 25 4248 G 4315 5948 -> 15 0 24 4248 G 4385 5949 -> 16 0 24 4248 G 4347 5949 -> 15 0 25 4248 G 4347 5950 -> 16 0 25 4248 G 4345 5950 -> 15 0 24 4248 G 4385 5951 -> 16 0 24 4248 G 4377 5951 -> 15 0 25 4248 G 4377 5952 -> 16 0 25 4248 G 4375 5952 -> 15 0 24 4248 G 4385 5953 -> 16 0 24 4248 G 4299 5953 -> 15 0 25 4248 G 4299 5954 -> 16 0 25 4248 G 4297 5954 -> 15 0 24 4248 G 4385 5955 -> 16 0 24 4248 G 4329 5955 -> 15 0 25 4248 G 4329 5956 -> 16 0 25 4248 G 4327 5956 -> 15 0 24 4248 G 4385 5957 -> 16 0 24 4248 G 4359 5957 -> 15 0 25 4248 G 4359 5958 -> 16 0 25 4248 G 4357 5958 -> 15 0 24 4248 G 4385 5959 -> 16 0 24 4248 G 4254 5959 -> 15 0 25 4248 G 4254 5960 -> 16 0 25 4248 G 4252 5960 -> 15 0 24 4248 G 4385 5961 -> 16 0 24 4248 G 4266 5961 -> 15 0 25 4248 G 4266 5962 -> 16 0 25 4248 G 4264 5962 -> 15 0 24 4248 G 4385 5963 -> 16 0 24 4248 G 4284 5963 -> 15 0 25 4248 G 4284 5964 -> 16 0 25 4248 G 4282 5964 -> 15 0 24 4248 G 4385 5965 -> 16 0 24 4248 G 4314 5965 -> 15 0 25 4248 G 4314 5966 -> 16 0 25 4248 G 4312 5966 -> 15 0 24 4248 G 4385 5967 -> 16 0 24 4248 G 4344 5967 -> 15 0 25 4248 G 4344 5968 -> 16 0 25 4248 G 4342 5968 -> 15 0 24 4248 G 4385 5969 -> 16 0 24 4248 G 4374 5969 -> 15 0 25 4248 G 4374 5970 -> 16 0 25 4248 G 4372 5970 -> 15 0 24 4248 G 4385 5971 -> 16 0 24 4248 G 4296 5971 -> 15 0 25 4248 G 4296 5972 -> 16 0 25 4248 G 4294 5972 -> 15 0 24 4248 G 4385 5973 -> 16 0 24 4248 G 4326 5973 -> 15 0 25 4248 G 4326 5974 -> 16 0 25 4248 G 4324 5974 -> 15 0 24 4248 G 4385 5975 -> 16 0 24 4248 G 4356 5975 -> 15 0 25 4248 G 4356 5976 -> 16 0 25 4248 G 4354 5976 -> 15 0 24 4248 G 4385 5977 -> 16 0 24 4248 G 4251 5977 -> 15 0 25 4248 G 4251 5978 -> 16 0 25 4248 G 4249 5978 -> 15 0 24 4248 G 4385 5979 -> 16 0 24 4248 G 4263 5979 -> 15 0 25 4248 G 4263 5980 -> 16 0 25 4248 G 4261 5980 -> 15 0 23 4248 G 4279 5981 -> 16 0 23 4248 G 4280 5981 -> 15 0 24 4248 G 4280 5982 -> 16 0 24 4248 G 4385 5982 -> 15 0 24 4248 G 4385 5983 -> 16 0 24 4248 G 4275 5983 -> 15 0 25 4248 G 4275 5984 -> 16 0 25 4248 G 4273 5984 -> 15 0 23 4248 G 4309 5985 -> 16 0 23 4248 G 4310 5985 -> 15 0 24 4248 G 4310 5986 -> 16 0 24 4248 G 4385 5986 -> 15 0 23 4248 G 4339 5987 -> 16 0 23 4248 G 4340 5987 -> 15 0 24 4248 G 4340 5988 -> 16 0 24 4248 G 4385 5988 -> 15 0 23 4248 G 4369 5989 -> 16 0 23 4248 G 4370 5989 -> 15 0 24 4248 G 4370 5990 -> 16 0 24 4248 G 4385 5990 -> 15 0 23 4248 G 4291 5991 -> 16 0 23 4248 G 4292 5991 -> 15 0 24 4248 G 4292 5992 -> 16 0 24 4248 G 4385 5992 -> 15 0 23 4248 G 4321 5993 -> 16 0 23 4248 G 4322 5993 -> 15 0 24 4248 G 4322 5994 -> 16 0 24 4248 G 4385 5994 -> 15 0 23 4248 G 4351 5995 -> 16 0 23 4248 G 4352 5995 -> 15 0 24 4248 G 4352 5996 -> 16 0 24 4248 G 4385 5996 -> 15 0 23 4248 G 4381 5997 -> 16 0 23 4248 G 4382 5997 -> 15 0 24 4248 G 4382 5998 -> 16 0 24 4248 G 4385 5998 -> 15 0 23 4248 G 4303 5999 -> 16 0 23 4248 G 4304 5999 -> 15 0 24 4248 G 4304 6000 -> 16 0 24 4248 G 4385 6000 -> 15 0 23 4248 G 4333 6001 -> 16 0 23 4248 G 4334 6001 -> 15 0 24 4248 G 4334 6002 -> 16 0 24 4248 G 4385 6002 -> 15 0 23 4248 G 4363 6003 -> 16 0 23 4248 G 4364 6003 -> 15 0 24 4248 G 4364 6004 -> 16 0 24 4248 G 4385 6004 -> 15 0 23 4248 G 4258 6005 -> 16 0 23 4248 G 4259 6005 -> 15 0 24 4248 G 4259 6006 -> 16 0 24 4248 G 4385 6006 -> 15 0 23 4248 G 4270 6007 -> 16 0 23 4248 G 4271 6007 -> 15 0 24 4248 G 4271 6008 -> 16 0 24 4248 G 4385 6008 -> 15 0 23 4248 G 4276 6009 -> 16 0 23 4248 G 4277 6009 -> 15 0 24 4248 G 4277 6010 -> 16 0 24 4248 G 4385 6010 -> 15 0 23 4248 G 4306 6011 -> 16 0 23 4248 G 4307 6011 -> 15 0 24 4248 G 4307 6012 -> 16 0 24 4248 G 4385 6012 -> 15 0 23 4248 G 4336 6013 -> 16 0 23 4248 G 4337 6013 -> 15 0 24 4248 G 4337 6014 -> 16 0 24 4248 G 4385 6014 -> 15 0 23 4248 G 4366 6015 -> 16 0 23 4248 G 4367 6015 -> 15 0 24 4248 G 4367 6016 -> 16 0 24 4248 G 4385 6016 -> 15 0 23 4248 G 4288 6017 -> 16 0 23 4248 G 4289 6017 -> 15 0 24 4248 G 4289 6018 -> 16 0 24 4248 G 4385 6018 -> 15 0 23 4248 G 4318 6019 -> 16 0 23 4248 G 4319 6019 -> 15 0 24 4248 G 4319 6020 -> 16 0 24 4248 G 4385 6020 -> 15 0 23 4248 G 4348 6021 -> 16 0 23 4248 G 4349 6021 -> 15 0 24 4248 G 4349 6022 -> 16 0 24 4248 G 4385 6022 -> 15 0 23 4248 G 4378 6023 -> 16 0 23 4248 G 4379 6023 -> 15 0 24 4248 G 4379 6024 -> 16 0 24 4248 G 4385 6024 -> 15 0 23 4248 G 4300 6025 -> 16 0 23 4248 G 4301 6025 -> 15 0 24 4248 G 4301 6026 -> 16 0 24 4248 G 4385 6026 -> 15 0 23 4248 G 4330 6027 -> 16 0 23 4248 G 4331 6027 -> 15 0 24 4248 G 4331 6028 -> 16 0 24 4248 G 4385 6028 -> 15 0 23 4248 G 4360 6029 -> 16 0 23 4248 G 4361 6029 -> 15 0 24 4248 G 4361 6030 -> 16 0 24 4248 G 4385 6030 -> 15 0 23 4248 G 4255 6031 -> 16 0 23 4248 G 4256 6031 -> 15 0 24 4248 G 4256 6032 -> 16 0 24 4248 G 4385 6032 -> 15 0 23 4248 G 4267 6033 -> 16 0 23 4248 G 4268 6033 -> 15 0 24 4248 G 4268 6034 -> 16 0 24 4248 G 4385 6034 -> 15 0 23 4248 G 4285 6035 -> 16 0 23 4248 G 4286 6035 -> 15 0 24 4248 G 4286 6036 -> 16 0 24 4248 G 4385 6036 -> 15 0 23 4248 G 4315 6037 -> 16 0 23 4248 G 4316 6037 -> 15 0 24 4248 G 4316 6038 -> 16 0 24 4248 G 4385 6038 -> 15 0 23 4248 G 4345 6039 -> 16 0 23 4248 G 4346 6039 -> 15 0 24 4248 G 4346 6040 -> 16 0 24 4248 G 4385 6040 -> 15 0 23 4248 G 4375 6041 -> 16 0 23 4248 G 4376 6041 -> 15 0 24 4248 G 4376 6042 -> 16 0 24 4248 G 4385 6042 -> 15 0 23 4248 G 4297 6043 -> 16 0 23 4248 G 4298 6043 -> 15 0 24 4248 G 4298 6044 -> 16 0 24 4248 G 4385 6044 -> 15 0 23 4248 G 4327 6045 -> 16 0 23 4248 G 4328 6045 -> 15 0 24 4248 G 4328 6046 -> 16 0 24 4248 G 4385 6046 -> 15 0 23 4248 G 4357 6047 -> 16 0 23 4248 G 4358 6047 -> 15 0 24 4248 G 4358 6048 -> 16 0 24 4248 G 4385 6048 -> 15 0 23 4248 G 4252 6049 -> 16 0 23 4248 G 4253 6049 -> 15 0 24 4248 G 4253 6050 -> 16 0 24 4248 G 4385 6050 -> 15 0 23 4248 G 4264 6051 -> 16 0 23 4248 G 4265 6051 -> 15 0 24 4248 G 4265 6052 -> 16 0 24 4248 G 4385 6052 -> 15 0 23 4248 G 4282 6053 -> 16 0 23 4248 G 4283 6053 -> 15 0 24 4248 G 4283 6054 -> 16 0 24 4248 G 4385 6054 -> 15 0 23 4248 G 4312 6055 -> 16 0 23 4248 G 4313 6055 -> 15 0 24 4248 G 4313 6056 -> 16 0 24 4248 G 4385 6056 -> 15 0 23 4248 G 4342 6057 -> 16 0 23 4248 G 4343 6057 -> 15 0 24 4248 G 4343 6058 -> 16 0 24 4248 G 4385 6058 -> 15 0 23 4248 G 4372 6059 -> 16 0 23 4248 G 4373 6059 -> 15 0 24 4248 G 4373 6060 -> 16 0 24 4248 G 4385 6060 -> 15 0 23 4248 G 4294 6061 -> 16 0 23 4248 G 4295 6061 -> 15 0 24 4248 G 4295 6062 -> 16 0 24 4248 G 4385 6062 -> 15 0 23 4248 G 4324 6063 -> 16 0 23 4248 G 4325 6063 -> 15 0 24 4248 G 4325 6064 -> 16 0 24 4248 G 4385 6064 -> 15 0 23 4248 G 4354 6065 -> 16 0 23 4248 G 4355 6065 -> 15 0 24 4248 G 4355 6066 -> 16 0 24 4248 G 4385 6066 -> 15 0 23 4248 G 4249 6067 -> 16 0 23 4248 G 4250 6067 -> 15 0 24 4248 G 4250 6068 -> 16 0 24 4248 G 4385 6068 -> 15 0 23 4248 G 4261 6069 -> 16 0 23 4248 G 4262 6069 -> 15 0 24 4248 G 4262 6070 -> 16 0 24 4248 G 4385 6070 -> 15 0 23 4094 G 4095 6071 -> 16 0 23 4094 G 4096 6071 -> 15 0 24 4094 G 4096 6072 -> 16 0 24 4094 G 4246 6072 -> 15 0 24 4094 G 4246 6073 -> 16 0 24 4094 G 4109 6073 -> 15 0 25 4094 G 4109 6074 -> 16 0 25 4094 G 4107 6074 -> 15 0 24 4094 G 4246 6075 -> 16 0 24 4094 G 4121 6075 -> 15 0 25 4094 G 4121 6076 -> 16 0 25 4094 G 4119 6076 -> 15 0 24 4094 G 4246 6077 -> 16 0 24 4094 G 4130 6077 -> 15 0 25 4094 G 4130 6078 -> 16 0 25 4094 G 4128 6078 -> 15 0 24 4094 G 4246 6079 -> 16 0 24 4094 G 4160 6079 -> 15 0 25 4094 G 4160 6080 -> 16 0 25 4094 G 4158 6080 -> 15 0 24 4094 G 4246 6081 -> 16 0 24 4094 G 4190 6081 -> 15 0 25 4094 G 4190 6082 -> 16 0 25 4094 G 4188 6082 -> 15 0 24 4094 G 4246 6083 -> 16 0 24 4094 G 4220 6083 -> 15 0 25 4094 G 4220 6084 -> 16 0 25 4094 G 4218 6084 -> 15 0 24 4094 G 4246 6085 -> 16 0 24 4094 G 4142 6085 -> 15 0 25 4094 G 4142 6086 -> 16 0 25 4094 G 4140 6086 -> 15 0 24 4094 G 4246 6087 -> 16 0 24 4094 G 4172 6087 -> 15 0 25 4094 G 4172 6088 -> 16 0 25 4094 G 4170 6088 -> 15 0 24 4094 G 4246 6089 -> 16 0 24 4094 G 4202 6089 -> 15 0 25 4094 G 4202 6090 -> 16 0 25 4094 G 4200 6090 -> 15 0 24 4094 G 4246 6091 -> 16 0 24 4094 G 4232 6091 -> 15 0 25 4094 G 4232 6092 -> 16 0 25 4094 G 4230 6092 -> 15 0 24 4094 G 4246 6093 -> 16 0 24 4094 G 4106 6093 -> 15 0 25 4094 G 4106 6094 -> 16 0 25 4094 G 4104 6094 -> 15 0 24 4094 G 4246 6095 -> 16 0 24 4094 G 4118 6095 -> 15 0 25 4094 G 4118 6096 -> 16 0 25 4094 G 4116 6096 -> 15 0 24 4094 G 4246 6097 -> 16 0 24 4094 G 4127 6097 -> 15 0 25 4094 G 4127 6098 -> 16 0 25 4094 G 4125 6098 -> 15 0 24 4094 G 4246 6099 -> 16 0 24 4094 G 4157 6099 -> 15 0 25 4094 G 4157 6100 -> 16 0 25 4094 G 4155 6100 -> 15 0 24 4094 G 4246 6101 -> 16 0 24 4094 G 4187 6101 -> 15 0 25 4094 G 4187 6102 -> 16 0 25 4094 G 4185 6102 -> 15 0 24 4094 G 4246 6103 -> 16 0 24 4094 G 4217 6103 -> 15 0 25 4094 G 4217 6104 -> 16 0 25 4094 G 4215 6104 -> 15 0 24 4094 G 4246 6105 -> 16 0 24 4094 G 4139 6105 -> 15 0 25 4094 G 4139 6106 -> 16 0 25 4094 G 4137 6106 -> 15 0 24 4094 G 4246 6107 -> 16 0 24 4094 G 4169 6107 -> 15 0 25 4094 G 4169 6108 -> 16 0 25 4094 G 4167 6108 -> 15 0 24 4094 G 4246 6109 -> 16 0 24 4094 G 4199 6109 -> 15 0 25 4094 G 4199 6110 -> 16 0 25 4094 G 4197 6110 -> 15 0 24 4094 G 4246 6111 -> 16 0 24 4094 G 4229 6111 -> 15 0 25 4094 G 4229 6112 -> 16 0 25 4094 G 4227 6112 -> 15 0 24 4094 G 4246 6113 -> 16 0 24 4094 G 4151 6113 -> 15 0 25 4094 G 4151 6114 -> 16 0 25 4094 G 4149 6114 -> 15 0 24 4094 G 4246 6115 -> 16 0 24 4094 G 4181 6115 -> 15 0 25 4094 G 4181 6116 -> 16 0 25 4094 G 4179 6116 -> 15 0 24 4094 G 4246 6117 -> 16 0 24 4094 G 4211 6117 -> 15 0 25 4094 G 4211 6118 -> 16 0 25 4094 G 4209 6118 -> 15 0 24 4094 G 4246 6119 -> 16 0 24 4094 G 4241 6119 -> 15 0 25 4094 G 4241 6120 -> 16 0 25 4094 G 4239 6120 -> 15 0 24 4094 G 4246 6121 -> 16 0 24 4094 G 4103 6121 -> 15 0 25 4094 G 4103 6122 -> 16 0 25 4094 G 4101 6122 -> 15 0 24 4094 G 4246 6123 -> 16 0 24 4094 G 4115 6123 -> 15 0 25 4094 G 4115 6124 -> 16 0 25 4094 G 4113 6124 -> 15 0 24 4094 G 4246 6125 -> 16 0 24 4094 G 4124 6125 -> 15 0 25 4094 G 4124 6126 -> 16 0 25 4094 G 4122 6126 -> 15 0 26 4094 G 4246 6127 -> 16 0 26 4094 G 4245 6127 -> 15 0 24 4094 G 4246 6128 -> 16 0 24 4094 G 4154 6128 -> 15 0 25 4094 G 4154 6129 -> 16 0 25 4094 G 4152 6129 -> 15 0 24 4094 G 4246 6130 -> 16 0 24 4094 G 4184 6130 -> 15 0 25 4094 G 4184 6131 -> 16 0 25 4094 G 4182 6131 -> 15 0 24 4094 G 4246 6132 -> 16 0 24 4094 G 4214 6132 -> 15 0 25 4094 G 4214 6133 -> 16 0 25 4094 G 4212 6133 -> 15 0 24 4094 G 4246 6134 -> 16 0 24 4094 G 4136 6134 -> 15 0 25 4094 G 4136 6135 -> 16 0 25 4094 G 4134 6135 -> 15 0 24 4094 G 4246 6136 -> 16 0 24 4094 G 4244 6136 -> 15 0 25 4094 G 4244 6137 -> 16 0 25 4094 G 4242 6137 -> 15 0 24 4094 G 4246 6138 -> 16 0 24 4094 G 4166 6138 -> 15 0 25 4094 G 4166 6139 -> 16 0 25 4094 G 4164 6139 -> 15 0 24 4094 G 4246 6140 -> 16 0 24 4094 G 4196 6140 -> 15 0 25 4094 G 4196 6141 -> 16 0 25 4094 G 4194 6141 -> 15 0 24 4094 G 4246 6142 -> 16 0 24 4094 G 4226 6142 -> 15 0 25 4094 G 4226 6143 -> 16 0 25 4094 G 4224 6143 -> 15 0 24 4094 G 4246 6144 -> 16 0 24 4094 G 4148 6144 -> 15 0 25 4094 G 4148 6145 -> 16 0 25 4094 G 4146 6145 -> 15 0 24 4094 G 4246 6146 -> 16 0 24 4094 G 4178 6146 -> 15 0 25 4094 G 4178 6147 -> 16 0 25 4094 G 4176 6147 -> 15 0 24 4094 G 4246 6148 -> 16 0 24 4094 G 4208 6148 -> 15 0 25 4094 G 4208 6149 -> 16 0 25 4094 G 4206 6149 -> 15 0 24 4094 G 4246 6150 -> 16 0 24 4094 G 4238 6150 -> 15 0 25 4094 G 4238 6151 -> 16 0 25 4094 G 4236 6151 -> 15 0 24 4094 G 4246 6152 -> 16 0 24 4094 G 4100 6152 -> 15 0 25 4094 G 4100 6153 -> 16 0 25 4094 G 4098 6153 -> 15 0 24 4094 G 4246 6154 -> 16 0 24 4094 G 4112 6154 -> 15 0 25 4094 G 4112 6155 -> 16 0 25 4094 G 4110 6155 -> 15 0 24 4094 G 4246 6156 -> 16 0 24 4094 G 4133 6156 -> 15 0 25 4094 G 4133 6157 -> 16 0 25 4094 G 4131 6157 -> 15 0 24 4094 G 4246 6158 -> 16 0 24 4094 G 4163 6158 -> 15 0 25 4094 G 4163 6159 -> 16 0 25 4094 G 4161 6159 -> 15 0 24 4094 G 4246 6160 -> 16 0 24 4094 G 4193 6160 -> 15 0 25 4094 G 4193 6161 -> 16 0 25 4094 G 4191 6161 -> 15 0 24 4094 G 4246 6162 -> 16 0 24 4094 G 4223 6162 -> 15 0 25 4094 G 4223 6163 -> 16 0 25 4094 G 4221 6163 -> 15 0 24 4094 G 4246 6164 -> 16 0 24 4094 G 4145 6164 -> 15 0 25 4094 G 4145 6165 -> 16 0 25 4094 G 4143 6165 -> 15 0 24 4094 G 4246 6166 -> 16 0 24 4094 G 4175 6166 -> 15 0 25 4094 G 4175 6167 -> 16 0 25 4094 G 4173 6167 -> 15 0 24 4094 G 4246 6168 -> 16 0 24 4094 G 4205 6168 -> 15 0 25 4094 G 4205 6169 -> 16 0 25 4094 G 4203 6169 -> 15 0 24 4094 G 4246 6170 -> 16 0 24 4094 G 4235 6170 -> 15 0 25 4094 G 4235 6171 -> 16 0 25 4094 G 4233 6171 -> 15 0 23 4094 G 4107 6172 -> 16 0 23 4094 G 4108 6172 -> 15 0 24 4094 G 4108 6173 -> 16 0 24 4094 G 4246 6173 -> 15 0 24 4094 G 4246 6174 -> 16 0 24 4094 G 4097 6174 -> 15 0 25 4094 G 4097 6175 -> 16 0 25 4094 G 4095 6175 -> 15 0 23 4094 G 4119 6176 -> 16 0 23 4094 G 4120 6176 -> 15 0 24 4094 G 4120 6177 -> 16 0 24 4094 G 4246 6177 -> 15 0 23 4094 G 4128 6178 -> 16 0 23 4094 G 4129 6178 -> 15 0 24 4094 G 4129 6179 -> 16 0 24 4094 G 4246 6179 -> 15 0 23 4094 G 4158 6180 -> 16 0 23 4094 G 4159 6180 -> 15 0 24 4094 G 4159 6181 -> 16 0 24 4094 G 4246 6181 -> 15 0 23 4094 G 4188 6182 -> 16 0 23 4094 G 4189 6182 -> 15 0 24 4094 G 4189 6183 -> 16 0 24 4094 G 4246 6183 -> 15 0 23 4094 G 4218 6184 -> 16 0 23 4094 G 4219 6184 -> 15 0 24 4094 G 4219 6185 -> 16 0 24 4094 G 4246 6185 -> 15 0 23 4094 G 4140 6186 -> 16 0 23 4094 G 4141 6186 -> 15 0 24 4094 G 4141 6187 -> 16 0 24 4094 G 4246 6187 -> 15 0 23 4094 G 4170 6188 -> 16 0 23 4094 G 4171 6188 -> 15 0 24 4094 G 4171 6189 -> 16 0 24 4094 G 4246 6189 -> 15 0 23 4094 G 4200 6190 -> 16 0 23 4094 G 4201 6190 -> 15 0 24 4094 G 4201 6191 -> 16 0 24 4094 G 4246 6191 -> 15 0 23 4094 G 4230 6192 -> 16 0 23 4094 G 4231 6192 -> 15 0 24 4094 G 4231 6193 -> 16 0 24 4094 G 4246 6193 -> 15 0 23 4094 G 4104 6194 -> 16 0 23 4094 G 4105 6194 -> 15 0 24 4094 G 4105 6195 -> 16 0 24 4094 G 4246 6195 -> 15 0 23 4094 G 4116 6196 -> 16 0 23 4094 G 4117 6196 -> 15 0 24 4094 G 4117 6197 -> 16 0 24 4094 G 4246 6197 -> 15 0 23 4094 G 4125 6198 -> 16 0 23 4094 G 4126 6198 -> 15 0 24 4094 G 4126 6199 -> 16 0 24 4094 G 4246 6199 -> 15 0 23 4094 G 4155 6200 -> 16 0 23 4094 G 4156 6200 -> 15 0 24 4094 G 4156 6201 -> 16 0 24 4094 G 4246 6201 -> 15 0 23 4094 G 4185 6202 -> 16 0 23 4094 G 4186 6202 -> 15 0 24 4094 G 4186 6203 -> 16 0 24 4094 G 4246 6203 -> 15 0 23 4094 G 4215 6204 -> 16 0 23 4094 G 4216 6204 -> 15 0 24 4094 G 4216 6205 -> 16 0 24 4094 G 4246 6205 -> 15 0 23 4094 G 4137 6206 -> 16 0 23 4094 G 4138 6206 -> 15 0 24 4094 G 4138 6207 -> 16 0 24 4094 G 4246 6207 -> 15 0 23 4094 G 4167 6208 -> 16 0 23 4094 G 4168 6208 -> 15 0 24 4094 G 4168 6209 -> 16 0 24 4094 G 4246 6209 -> 15 0 23 4094 G 4197 6210 -> 16 0 23 4094 G 4198 6210 -> 15 0 24 4094 G 4198 6211 -> 16 0 24 4094 G 4246 6211 -> 15 0 23 4094 G 4227 6212 -> 16 0 23 4094 G 4228 6212 -> 15 0 24 4094 G 4228 6213 -> 16 0 24 4094 G 4246 6213 -> 15 0 23 4094 G 4149 6214 -> 16 0 23 4094 G 4150 6214 -> 15 0 24 4094 G 4150 6215 -> 16 0 24 4094 G 4246 6215 -> 15 0 23 4094 G 4179 6216 -> 16 0 23 4094 G 4180 6216 -> 15 0 24 4094 G 4180 6217 -> 16 0 24 4094 G 4246 6217 -> 15 0 23 4094 G 4209 6218 -> 16 0 23 4094 G 4210 6218 -> 15 0 24 4094 G 4210 6219 -> 16 0 24 4094 G 4246 6219 -> 15 0 23 4094 G 4239 6220 -> 16 0 23 4094 G 4240 6220 -> 15 0 24 4094 G 4240 6221 -> 16 0 24 4094 G 4246 6221 -> 15 0 23 4094 G 4101 6222 -> 16 0 23 4094 G 4102 6222 -> 15 0 24 4094 G 4102 6223 -> 16 0 24 4094 G 4246 6223 -> 15 0 23 4094 G 4113 6224 -> 16 0 23 4094 G 4114 6224 -> 15 0 24 4094 G 4114 6225 -> 16 0 24 4094 G 4246 6225 -> 15 0 23 4094 G 4122 6226 -> 16 0 23 4094 G 4123 6226 -> 15 0 24 4094 G 4123 6227 -> 16 0 24 4094 G 4246 6227 -> 15 0 23 4094 G 4152 6228 -> 16 0 23 4094 G 4153 6228 -> 15 0 24 4094 G 4153 6229 -> 16 0 24 4094 G 4246 6229 -> 15 0 23 4094 G 4182 6230 -> 16 0 23 4094 G 4183 6230 -> 15 0 24 4094 G 4183 6231 -> 16 0 24 4094 G 4246 6231 -> 15 0 23 4094 G 4212 6232 -> 16 0 23 4094 G 4213 6232 -> 15 0 24 4094 G 4213 6233 -> 16 0 24 4094 G 4246 6233 -> 15 0 23 4094 G 4134 6234 -> 16 0 23 4094 G 4135 6234 -> 15 0 24 4094 G 4135 6235 -> 16 0 24 4094 G 4246 6235 -> 15 0 23 4094 G 4242 6236 -> 16 0 23 4094 G 4243 6236 -> 15 0 24 4094 G 4243 6237 -> 16 0 24 4094 G 4246 6237 -> 15 0 23 4094 G 4164 6238 -> 16 0 23 4094 G 4165 6238 -> 15 0 24 4094 G 4165 6239 -> 16 0 24 4094 G 4246 6239 -> 15 0 23 4094 G 4194 6240 -> 16 0 23 4094 G 4195 6240 -> 15 0 24 4094 G 4195 6241 -> 16 0 24 4094 G 4246 6241 -> 15 0 23 4094 G 4224 6242 -> 16 0 23 4094 G 4225 6242 -> 15 0 24 4094 G 4225 6243 -> 16 0 24 4094 G 4246 6243 -> 15 0 23 4094 G 4146 6244 -> 16 0 23 4094 G 4147 6244 -> 15 0 24 4094 G 4147 6245 -> 16 0 24 4094 G 4246 6245 -> 15 0 23 4094 G 4176 6246 -> 16 0 23 4094 G 4177 6246 -> 15 0 24 4094 G 4177 6247 -> 16 0 24 4094 G 4246 6247 -> 15 0 23 4094 G 4206 6248 -> 16 0 23 4094 G 4207 6248 -> 15 0 24 4094 G 4207 6249 -> 16 0 24 4094 G 4246 6249 -> 15 0 23 4094 G 4236 6250 -> 16 0 23 4094 G 4237 6250 -> 15 0 24 4094 G 4237 6251 -> 16 0 24 4094 G 4246 6251 -> 15 0 23 4094 G 4098 6252 -> 16 0 23 4094 G 4099 6252 -> 15 0 24 4094 G 4099 6253 -> 16 0 24 4094 G 4246 6253 -> 15 0 23 4094 G 4110 6254 -> 16 0 23 4094 G 4111 6254 -> 15 0 24 4094 G 4111 6255 -> 16 0 24 4094 G 4246 6255 -> 15 0 23 4094 G 4131 6256 -> 16 0 23 4094 G 4132 6256 -> 15 0 24 4094 G 4132 6257 -> 16 0 24 4094 G 4246 6257 -> 15 0 23 4094 G 4161 6258 -> 16 0 23 4094 G 4162 6258 -> 15 0 24 4094 G 4162 6259 -> 16 0 24 4094 G 4246 6259 -> 15 0 23 4094 G 4191 6260 -> 16 0 23 4094 G 4192 6260 -> 15 0 24 4094 G 4192 6261 -> 16 0 24 4094 G 4246 6261 -> 15 0 23 4094 G 4221 6262 -> 16 0 23 4094 G 4222 6262 -> 15 0 24 4094 G 4222 6263 -> 16 0 24 4094 G 4246 6263 -> 15 0 23 4094 G 4143 6264 -> 16 0 23 4094 G 4144 6264 -> 15 0 24 4094 G 4144 6265 -> 16 0 24 4094 G 4246 6265 -> 15 0 23 4094 G 4173 6266 -> 16 0 23 4094 G 4174 6266 -> 15 0 24 4094 G 4174 6267 -> 16 0 24 4094 G 4246 6267 -> 15 0 23 4094 G 4203 6268 -> 16 0 23 4094 G 4204 6268 -> 15 0 24 4094 G 4204 6269 -> 16 0 24 4094 G 4246 6269 -> 15 0 23 4094 G 4233 6270 -> 16 0 23 4094 G 4234 6270 -> 15 0 24 4094 G 4234 6271 -> 16 0 24 4094 G 4246 6271 -> 15 0 27 3921 G 4091 6272 -> 16 0 27 3921 G 4093 6272 -> 15 0 28 3921 G 4093 6273 -> 16 0 28 3921 G 4388 6273 -> 15 0 21 3921 G 4093 6274 -> 16 0 21 3921 G 4386 6274 -> 15 0 28 3921 G 4386 6275 -> 16 0 28 3921 G 4384 6275 -> 15 0 21 3921 G 4093 6276 -> 16 0 21 3921 G 4247 6276 -> 15 0 28 3921 G 4247 6277 -> 16 0 28 3921 G 4245 6277 -> 15 0 27 3921 G 4388 6278 -> 16 0 27 3921 G 4386 6278 -> 15 0 27 3921 G 4388 6279 -> 16 0 27 3921 G 4247 6279 -> 15 0 21 3921 G 4386 6280 -> 16 0 21 3921 G 4247 6280 -> 15 0 38 0 G 10 6281 -> 16 0 38 0 G 4797 6281 -> 15 0 28 4390 G 4797 6282 -> 16 0 28 4390 G 4796 6282 -> 15 0 38 0 G 5 6283 -> 16 0 38 0 G 3920 6283 -> 15 0 28 3415 G 3920 6284 -> 16 0 28 3415 G 3919 6284 -> 15 0 38 0 G 8 6285 -> 16 0 38 0 G 868 6285 -> 15 0 28 499 G 868 6286 -> 16 0 28 499 G 867 6286 -> 15 0 38 0 G 3 6287 -> 16 0 38 0 G 3414 6287 -> 15 0 28 2349 G 3414 6288 -> 16 0 28 2349 G 3413 6288 -> 15 0 38 0 G 4 6289 -> 16 0 38 0 G 2348 6289 -> 15 0 28 1606 G 2348 6290 -> 16 0 28 1606 G 2347 6290 -> 15 0 38 0 G 7 6291 -> 16 0 38 0 G 498 6291 -> 15 0 28 21 G 498 6292 -> 16 0 28 21 G 497 6292 -> 15 0 38 0 G 6 6293 -> 16 0 38 0 G 1605 6293 -> 15 0 28 1189 G 1605 6294 -> 16 0 28 1189 G 1604 6294 -> 15 0 38 0 G 2 6295 -> 16 0 38 0 G 1188 6295 -> 15 0 28 869 G 1188 6296 -> 16 0 28 869 G 1187 6296 -> 15 0 38 0 G 11 6297 -> 16 0 38 0 G 4389 6297 -> 15 0 28 3921 G 4389 6298 -> 16 0 28 3921 G 4388 6298 -> 15 0 39 0 G 4797 6299 -> 16 0 39 0 G 20 6299 -> 15 0 39 0 G 14 6300 -> 16 0 39 0 G 3920 6300 -> 15 0 39 0 G 17 6301 -> 16 0 39 0 G 868 6301 -> 15 0 39 0 G 15 6302 -> 16 0 39 0 G 3414 6302 -> 15 0 39 0 G 13 6303 -> 16 0 39 0 G 2348 6303 -> 15 0 39 0 G 16 6304 -> 16 0 39 0 G 498 6304 -> 15 0 39 0 G 18 6305 -> 16 0 39 0 G 1605 6305 -> 15 0 39 0 G 12 6306 -> 16 0 39 0 G 1188 6306 -> 15 0 39 0 G 19 6307 -> 16 0 39 0 G 4389 6307 -> 15 0 39 0 G 14 6308 -> 16 0 39 0 G 3414 6308 -> 15 0 39 0 G 15 6309 -> 16 0 39 0 G 1605 6309 -> 15 0 39 0 G 17 6310 -> 16 0 39 0 G 1605 6310 -> 15 0 39 0 G 3414 6311 -> 16 0 39 0 G 13 6311 -> 15 0 39 0 G 3414 6312 -> 16 0 39 0 G 12 6312 -> 15 0 39 0 G 16 6313 -> 16 0 39 0 G 1605 6313 +> 15 0 20 1 topology 9 0 +> 16 0 20 1 topology 18 0 +> 15 0 21 1 topology 18 1 +> 16 0 21 1 topology 15 1 +> 15 0 21 1 topology 15 2 +> 16 0 21 1 topology 12 2 +> 15 0 22 1 topology 12 3 +> 16 0 22 1 topology 2 3 +> 15 0 20 1 topology 9 4 +> 16 0 20 1 topology 20 4 +> 15 0 22 1 topology 20 5 +> 16 0 22 1 topology 10 5 +> 15 0 21 1 topology 18 6 +> 16 0 21 1 topology 17 6 +> 15 0 22 1 topology 17 7 +> 16 0 22 1 topology 8 7 +> 15 0 22 1 topology 15 8 +> 16 0 22 1 topology 3 8 +> 15 0 20 1 topology 9 9 +> 16 0 20 1 topology 19 9 +> 15 0 22 1 topology 19 10 +> 16 0 22 1 topology 11 10 +> 15 0 21 1 topology 18 11 +> 16 0 21 1 topology 16 11 +> 15 0 22 1 topology 16 12 +> 16 0 22 1 topology 7 12 +> 15 0 22 1 topology 18 13 +> 16 0 22 1 topology 6 13 +> 15 0 21 1 topology 15 14 +> 16 0 21 1 topology 14 14 +> 15 0 22 1 topology 14 15 +> 16 0 22 1 topology 5 15 +> 15 0 21 1 topology 15 16 +> 16 0 21 1 topology 13 16 +> 15 0 22 1 topology 13 17 +> 16 0 22 1 topology 4 17 +> 15 0 21 1 topology 18 18 +> 16 0 21 1 topology 20 18 +> 15 0 21 1 topology 15 19 +> 16 0 21 1 topology 17 19 +> 15 0 22 1 topology 12 20 +> 16 0 22 1 topology 3 20 +> 15 0 21 1 topology 18 21 +> 16 0 21 1 topology 19 21 +> 15 0 21 1 topology 15 22 +> 16 0 21 1 topology 16 22 +> 15 0 22 1 topology 15 23 +> 16 0 22 1 topology 6 23 +> 15 0 21 1 topology 12 24 +> 16 0 21 1 topology 14 24 +> 15 0 21 1 topology 12 25 +> 16 0 21 1 topology 13 25 +> 15 0 21 1 topology 20 26 +> 16 0 21 1 topology 19 26 +> 15 0 21 1 topology 17 27 +> 16 0 21 1 topology 16 27 +> 15 0 22 1 topology 17 28 +> 16 0 22 1 topology 6 28 +> 15 0 20 1 topology 3 29 +> 16 0 20 1 topology 14 29 +> 15 0 20 1 topology 3 30 +> 16 0 20 1 topology 13 30 +> 15 0 22 1 topology 16 31 +> 16 0 22 1 topology 6 31 +> 15 0 21 1 topology 14 32 +> 16 0 21 1 topology 13 32 +> 15 0 23 4635 topology 4648 33 +> 16 0 23 4635 topology 4649 33 +> 15 0 24 4635 topology 4649 34 +> 16 0 24 4635 topology 4793 34 +> 15 0 24 4635 topology 4793 35 +> 16 0 24 4635 topology 4662 35 +> 15 0 25 4635 topology 4662 36 +> 16 0 25 4635 topology 4660 36 +> 15 0 24 4635 topology 4793 37 +> 16 0 24 4635 topology 4665 37 +> 15 0 25 4635 topology 4665 38 +> 16 0 25 4635 topology 4663 38 +> 15 0 24 4635 topology 4793 39 +> 16 0 24 4635 topology 4725 39 +> 15 0 25 4635 topology 4725 40 +> 16 0 25 4635 topology 4723 40 +> 15 0 24 4635 topology 4793 41 +> 16 0 24 4635 topology 4701 41 +> 15 0 25 4635 topology 4701 42 +> 16 0 25 4635 topology 4699 42 +> 15 0 24 4635 topology 4793 43 +> 16 0 24 4635 topology 4677 43 +> 15 0 25 4635 topology 4677 44 +> 16 0 25 4635 topology 4675 44 +> 15 0 24 4635 topology 4793 45 +> 16 0 24 4635 topology 4785 45 +> 15 0 25 4635 topology 4785 46 +> 16 0 25 4635 topology 4783 46 +> 15 0 24 4635 topology 4793 47 +> 16 0 24 4635 topology 4761 47 +> 15 0 25 4635 topology 4761 48 +> 16 0 25 4635 topology 4759 48 +> 15 0 24 4635 topology 4793 49 +> 16 0 24 4635 topology 4737 49 +> 15 0 25 4635 topology 4737 50 +> 16 0 25 4635 topology 4735 50 +> 15 0 24 4635 topology 4793 51 +> 16 0 24 4635 topology 4713 51 +> 15 0 25 4635 topology 4713 52 +> 16 0 25 4635 topology 4711 52 +> 15 0 24 4635 topology 4793 53 +> 16 0 24 4635 topology 4689 53 +> 15 0 25 4635 topology 4689 54 +> 16 0 25 4635 topology 4687 54 +> 15 0 24 4635 topology 4793 55 +> 16 0 24 4635 topology 4773 55 +> 15 0 25 4635 topology 4773 56 +> 16 0 25 4635 topology 4771 56 +> 15 0 24 4635 topology 4793 57 +> 16 0 24 4635 topology 4749 57 +> 15 0 25 4635 topology 4749 58 +> 16 0 25 4635 topology 4747 58 +> 15 0 24 4635 topology 4793 59 +> 16 0 24 4635 topology 4641 59 +> 15 0 25 4635 topology 4641 60 +> 16 0 25 4635 topology 4639 60 +> 15 0 24 4635 topology 4793 61 +> 16 0 24 4635 topology 4653 61 +> 15 0 25 4635 topology 4653 62 +> 16 0 25 4635 topology 4651 62 +> 15 0 26 4635 topology 4793 63 +> 16 0 26 4635 topology 4792 63 +> 15 0 24 4635 topology 4793 64 +> 16 0 24 4635 topology 4668 64 +> 15 0 25 4635 topology 4668 65 +> 16 0 25 4635 topology 4666 65 +> 15 0 24 4635 topology 4793 66 +> 16 0 24 4635 topology 4728 66 +> 15 0 25 4635 topology 4728 67 +> 16 0 25 4635 topology 4726 67 +> 15 0 24 4635 topology 4793 68 +> 16 0 24 4635 topology 4704 68 +> 15 0 25 4635 topology 4704 69 +> 16 0 25 4635 topology 4702 69 +> 15 0 24 4635 topology 4793 70 +> 16 0 24 4635 topology 4680 70 +> 15 0 25 4635 topology 4680 71 +> 16 0 25 4635 topology 4678 71 +> 15 0 24 4635 topology 4793 72 +> 16 0 24 4635 topology 4788 72 +> 15 0 25 4635 topology 4788 73 +> 16 0 25 4635 topology 4786 73 +> 15 0 24 4635 topology 4793 74 +> 16 0 24 4635 topology 4764 74 +> 15 0 25 4635 topology 4764 75 +> 16 0 25 4635 topology 4762 75 +> 15 0 24 4635 topology 4793 76 +> 16 0 24 4635 topology 4740 76 +> 15 0 25 4635 topology 4740 77 +> 16 0 25 4635 topology 4738 77 +> 15 0 24 4635 topology 4793 78 +> 16 0 24 4635 topology 4716 78 +> 15 0 25 4635 topology 4716 79 +> 16 0 25 4635 topology 4714 79 +> 15 0 24 4635 topology 4793 80 +> 16 0 24 4635 topology 4692 80 +> 15 0 25 4635 topology 4692 81 +> 16 0 25 4635 topology 4690 81 +> 15 0 24 4635 topology 4793 82 +> 16 0 24 4635 topology 4776 82 +> 15 0 25 4635 topology 4776 83 +> 16 0 25 4635 topology 4774 83 +> 15 0 24 4635 topology 4793 84 +> 16 0 24 4635 topology 4752 84 +> 15 0 25 4635 topology 4752 85 +> 16 0 25 4635 topology 4750 85 +> 15 0 24 4635 topology 4793 86 +> 16 0 24 4635 topology 4644 86 +> 15 0 25 4635 topology 4644 87 +> 16 0 25 4635 topology 4642 87 +> 15 0 24 4635 topology 4793 88 +> 16 0 24 4635 topology 4656 88 +> 15 0 25 4635 topology 4656 89 +> 16 0 25 4635 topology 4654 89 +> 15 0 24 4635 topology 4793 90 +> 16 0 24 4635 topology 4695 90 +> 15 0 25 4635 topology 4695 91 +> 16 0 25 4635 topology 4693 91 +> 15 0 24 4635 topology 4793 92 +> 16 0 24 4635 topology 4671 92 +> 15 0 25 4635 topology 4671 93 +> 16 0 25 4635 topology 4669 93 +> 15 0 24 4635 topology 4793 94 +> 16 0 24 4635 topology 4755 94 +> 15 0 25 4635 topology 4755 95 +> 16 0 25 4635 topology 4753 95 +> 15 0 24 4635 topology 4793 96 +> 16 0 24 4635 topology 4731 96 +> 15 0 25 4635 topology 4731 97 +> 16 0 25 4635 topology 4729 97 +> 15 0 24 4635 topology 4793 98 +> 16 0 24 4635 topology 4707 98 +> 15 0 25 4635 topology 4707 99 +> 16 0 25 4635 topology 4705 99 +> 15 0 24 4635 topology 4793 100 +> 16 0 24 4635 topology 4683 100 +> 15 0 25 4635 topology 4683 101 +> 16 0 25 4635 topology 4681 101 +> 15 0 24 4635 topology 4793 102 +> 16 0 24 4635 topology 4791 102 +> 15 0 25 4635 topology 4791 103 +> 16 0 25 4635 topology 4789 103 +> 15 0 24 4635 topology 4793 104 +> 16 0 24 4635 topology 4767 104 +> 15 0 25 4635 topology 4767 105 +> 16 0 25 4635 topology 4765 105 +> 15 0 24 4635 topology 4793 106 +> 16 0 24 4635 topology 4743 106 +> 15 0 25 4635 topology 4743 107 +> 16 0 25 4635 topology 4741 107 +> 15 0 24 4635 topology 4793 108 +> 16 0 24 4635 topology 4719 108 +> 15 0 25 4635 topology 4719 109 +> 16 0 25 4635 topology 4717 109 +> 15 0 24 4635 topology 4793 110 +> 16 0 24 4635 topology 4779 110 +> 15 0 25 4635 topology 4779 111 +> 16 0 25 4635 topology 4777 111 +> 15 0 24 4635 topology 4793 112 +> 16 0 24 4635 topology 4647 112 +> 15 0 25 4635 topology 4647 113 +> 16 0 25 4635 topology 4645 113 +> 15 0 24 4635 topology 4793 114 +> 16 0 24 4635 topology 4659 114 +> 15 0 25 4635 topology 4659 115 +> 16 0 25 4635 topology 4657 115 +> 15 0 24 4635 topology 4793 116 +> 16 0 24 4635 topology 4698 116 +> 15 0 25 4635 topology 4698 117 +> 16 0 25 4635 topology 4696 117 +> 15 0 24 4635 topology 4793 118 +> 16 0 24 4635 topology 4674 118 +> 15 0 25 4635 topology 4674 119 +> 16 0 25 4635 topology 4672 119 +> 15 0 24 4635 topology 4793 120 +> 16 0 24 4635 topology 4758 120 +> 15 0 25 4635 topology 4758 121 +> 16 0 25 4635 topology 4756 121 +> 15 0 24 4635 topology 4793 122 +> 16 0 24 4635 topology 4734 122 +> 15 0 25 4635 topology 4734 123 +> 16 0 25 4635 topology 4732 123 +> 15 0 24 4635 topology 4793 124 +> 16 0 24 4635 topology 4710 124 +> 15 0 25 4635 topology 4710 125 +> 16 0 25 4635 topology 4708 125 +> 15 0 24 4635 topology 4793 126 +> 16 0 24 4635 topology 4686 126 +> 15 0 25 4635 topology 4686 127 +> 16 0 25 4635 topology 4684 127 +> 15 0 24 4635 topology 4793 128 +> 16 0 24 4635 topology 4770 128 +> 15 0 25 4635 topology 4770 129 +> 16 0 25 4635 topology 4768 129 +> 15 0 24 4635 topology 4793 130 +> 16 0 24 4635 topology 4746 130 +> 15 0 25 4635 topology 4746 131 +> 16 0 25 4635 topology 4744 131 +> 15 0 24 4635 topology 4793 132 +> 16 0 24 4635 topology 4722 132 +> 15 0 25 4635 topology 4722 133 +> 16 0 25 4635 topology 4720 133 +> 15 0 24 4635 topology 4793 134 +> 16 0 24 4635 topology 4782 134 +> 15 0 25 4635 topology 4782 135 +> 16 0 25 4635 topology 4780 135 +> 15 0 24 4635 topology 4793 136 +> 16 0 24 4635 topology 4638 136 +> 15 0 25 4635 topology 4638 137 +> 16 0 25 4635 topology 4636 137 +> 15 0 23 4635 topology 4660 138 +> 16 0 23 4635 topology 4661 138 +> 15 0 24 4635 topology 4661 139 +> 16 0 24 4635 topology 4793 139 +> 15 0 24 4635 topology 4793 140 +> 16 0 24 4635 topology 4650 140 +> 15 0 25 4635 topology 4650 141 +> 16 0 25 4635 topology 4648 141 +> 15 0 23 4635 topology 4663 142 +> 16 0 23 4635 topology 4664 142 +> 15 0 24 4635 topology 4664 143 +> 16 0 24 4635 topology 4793 143 +> 15 0 23 4635 topology 4723 144 +> 16 0 23 4635 topology 4724 144 +> 15 0 24 4635 topology 4724 145 +> 16 0 24 4635 topology 4793 145 +> 15 0 23 4635 topology 4699 146 +> 16 0 23 4635 topology 4700 146 +> 15 0 24 4635 topology 4700 147 +> 16 0 24 4635 topology 4793 147 +> 15 0 23 4635 topology 4675 148 +> 16 0 23 4635 topology 4676 148 +> 15 0 24 4635 topology 4676 149 +> 16 0 24 4635 topology 4793 149 +> 15 0 23 4635 topology 4783 150 +> 16 0 23 4635 topology 4784 150 +> 15 0 24 4635 topology 4784 151 +> 16 0 24 4635 topology 4793 151 +> 15 0 23 4635 topology 4759 152 +> 16 0 23 4635 topology 4760 152 +> 15 0 24 4635 topology 4760 153 +> 16 0 24 4635 topology 4793 153 +> 15 0 23 4635 topology 4735 154 +> 16 0 23 4635 topology 4736 154 +> 15 0 24 4635 topology 4736 155 +> 16 0 24 4635 topology 4793 155 +> 15 0 23 4635 topology 4711 156 +> 16 0 23 4635 topology 4712 156 +> 15 0 24 4635 topology 4712 157 +> 16 0 24 4635 topology 4793 157 +> 15 0 23 4635 topology 4687 158 +> 16 0 23 4635 topology 4688 158 +> 15 0 24 4635 topology 4688 159 +> 16 0 24 4635 topology 4793 159 +> 15 0 23 4635 topology 4771 160 +> 16 0 23 4635 topology 4772 160 +> 15 0 24 4635 topology 4772 161 +> 16 0 24 4635 topology 4793 161 +> 15 0 23 4635 topology 4747 162 +> 16 0 23 4635 topology 4748 162 +> 15 0 24 4635 topology 4748 163 +> 16 0 24 4635 topology 4793 163 +> 15 0 23 4635 topology 4639 164 +> 16 0 23 4635 topology 4640 164 +> 15 0 24 4635 topology 4640 165 +> 16 0 24 4635 topology 4793 165 +> 15 0 23 4635 topology 4651 166 +> 16 0 23 4635 topology 4652 166 +> 15 0 24 4635 topology 4652 167 +> 16 0 24 4635 topology 4793 167 +> 15 0 23 4635 topology 4666 168 +> 16 0 23 4635 topology 4667 168 +> 15 0 24 4635 topology 4667 169 +> 16 0 24 4635 topology 4793 169 +> 15 0 23 4635 topology 4726 170 +> 16 0 23 4635 topology 4727 170 +> 15 0 24 4635 topology 4727 171 +> 16 0 24 4635 topology 4793 171 +> 15 0 23 4635 topology 4702 172 +> 16 0 23 4635 topology 4703 172 +> 15 0 24 4635 topology 4703 173 +> 16 0 24 4635 topology 4793 173 +> 15 0 23 4635 topology 4678 174 +> 16 0 23 4635 topology 4679 174 +> 15 0 24 4635 topology 4679 175 +> 16 0 24 4635 topology 4793 175 +> 15 0 23 4635 topology 4786 176 +> 16 0 23 4635 topology 4787 176 +> 15 0 24 4635 topology 4787 177 +> 16 0 24 4635 topology 4793 177 +> 15 0 23 4635 topology 4762 178 +> 16 0 23 4635 topology 4763 178 +> 15 0 24 4635 topology 4763 179 +> 16 0 24 4635 topology 4793 179 +> 15 0 23 4635 topology 4738 180 +> 16 0 23 4635 topology 4739 180 +> 15 0 24 4635 topology 4739 181 +> 16 0 24 4635 topology 4793 181 +> 15 0 23 4635 topology 4714 182 +> 16 0 23 4635 topology 4715 182 +> 15 0 24 4635 topology 4715 183 +> 16 0 24 4635 topology 4793 183 +> 15 0 23 4635 topology 4690 184 +> 16 0 23 4635 topology 4691 184 +> 15 0 24 4635 topology 4691 185 +> 16 0 24 4635 topology 4793 185 +> 15 0 23 4635 topology 4774 186 +> 16 0 23 4635 topology 4775 186 +> 15 0 24 4635 topology 4775 187 +> 16 0 24 4635 topology 4793 187 +> 15 0 23 4635 topology 4750 188 +> 16 0 23 4635 topology 4751 188 +> 15 0 24 4635 topology 4751 189 +> 16 0 24 4635 topology 4793 189 +> 15 0 23 4635 topology 4642 190 +> 16 0 23 4635 topology 4643 190 +> 15 0 24 4635 topology 4643 191 +> 16 0 24 4635 topology 4793 191 +> 15 0 23 4635 topology 4654 192 +> 16 0 23 4635 topology 4655 192 +> 15 0 24 4635 topology 4655 193 +> 16 0 24 4635 topology 4793 193 +> 15 0 23 4635 topology 4693 194 +> 16 0 23 4635 topology 4694 194 +> 15 0 24 4635 topology 4694 195 +> 16 0 24 4635 topology 4793 195 +> 15 0 23 4635 topology 4669 196 +> 16 0 23 4635 topology 4670 196 +> 15 0 24 4635 topology 4670 197 +> 16 0 24 4635 topology 4793 197 +> 15 0 23 4635 topology 4753 198 +> 16 0 23 4635 topology 4754 198 +> 15 0 24 4635 topology 4754 199 +> 16 0 24 4635 topology 4793 199 +> 15 0 23 4635 topology 4729 200 +> 16 0 23 4635 topology 4730 200 +> 15 0 24 4635 topology 4730 201 +> 16 0 24 4635 topology 4793 201 +> 15 0 23 4635 topology 4705 202 +> 16 0 23 4635 topology 4706 202 +> 15 0 24 4635 topology 4706 203 +> 16 0 24 4635 topology 4793 203 +> 15 0 23 4635 topology 4681 204 +> 16 0 23 4635 topology 4682 204 +> 15 0 24 4635 topology 4682 205 +> 16 0 24 4635 topology 4793 205 +> 15 0 23 4635 topology 4789 206 +> 16 0 23 4635 topology 4790 206 +> 15 0 24 4635 topology 4790 207 +> 16 0 24 4635 topology 4793 207 +> 15 0 23 4635 topology 4765 208 +> 16 0 23 4635 topology 4766 208 +> 15 0 24 4635 topology 4766 209 +> 16 0 24 4635 topology 4793 209 +> 15 0 23 4635 topology 4741 210 +> 16 0 23 4635 topology 4742 210 +> 15 0 24 4635 topology 4742 211 +> 16 0 24 4635 topology 4793 211 +> 15 0 23 4635 topology 4717 212 +> 16 0 23 4635 topology 4718 212 +> 15 0 24 4635 topology 4718 213 +> 16 0 24 4635 topology 4793 213 +> 15 0 23 4635 topology 4777 214 +> 16 0 23 4635 topology 4778 214 +> 15 0 24 4635 topology 4778 215 +> 16 0 24 4635 topology 4793 215 +> 15 0 23 4635 topology 4645 216 +> 16 0 23 4635 topology 4646 216 +> 15 0 24 4635 topology 4646 217 +> 16 0 24 4635 topology 4793 217 +> 15 0 23 4635 topology 4657 218 +> 16 0 23 4635 topology 4658 218 +> 15 0 24 4635 topology 4658 219 +> 16 0 24 4635 topology 4793 219 +> 15 0 23 4635 topology 4696 220 +> 16 0 23 4635 topology 4697 220 +> 15 0 24 4635 topology 4697 221 +> 16 0 24 4635 topology 4793 221 +> 15 0 23 4635 topology 4672 222 +> 16 0 23 4635 topology 4673 222 +> 15 0 24 4635 topology 4673 223 +> 16 0 24 4635 topology 4793 223 +> 15 0 23 4635 topology 4756 224 +> 16 0 23 4635 topology 4757 224 +> 15 0 24 4635 topology 4757 225 +> 16 0 24 4635 topology 4793 225 +> 15 0 23 4635 topology 4732 226 +> 16 0 23 4635 topology 4733 226 +> 15 0 24 4635 topology 4733 227 +> 16 0 24 4635 topology 4793 227 +> 15 0 23 4635 topology 4708 228 +> 16 0 23 4635 topology 4709 228 +> 15 0 24 4635 topology 4709 229 +> 16 0 24 4635 topology 4793 229 +> 15 0 23 4635 topology 4684 230 +> 16 0 23 4635 topology 4685 230 +> 15 0 24 4635 topology 4685 231 +> 16 0 24 4635 topology 4793 231 +> 15 0 23 4635 topology 4768 232 +> 16 0 23 4635 topology 4769 232 +> 15 0 24 4635 topology 4769 233 +> 16 0 24 4635 topology 4793 233 +> 15 0 23 4635 topology 4744 234 +> 16 0 23 4635 topology 4745 234 +> 15 0 24 4635 topology 4745 235 +> 16 0 24 4635 topology 4793 235 +> 15 0 23 4635 topology 4720 236 +> 16 0 23 4635 topology 4721 236 +> 15 0 24 4635 topology 4721 237 +> 16 0 24 4635 topology 4793 237 +> 15 0 23 4635 topology 4780 238 +> 16 0 23 4635 topology 4781 238 +> 15 0 24 4635 topology 4781 239 +> 16 0 24 4635 topology 4793 239 +> 15 0 23 4635 topology 4636 240 +> 16 0 23 4635 topology 4637 240 +> 15 0 24 4635 topology 4637 241 +> 16 0 24 4635 topology 4793 241 +> 15 0 23 4391 topology 4422 242 +> 16 0 23 4391 topology 4423 242 +> 15 0 24 4391 topology 4423 243 +> 16 0 24 4391 topology 4633 243 +> 15 0 24 4391 topology 4633 244 +> 16 0 24 4391 topology 4460 244 +> 15 0 25 4391 topology 4460 245 +> 16 0 25 4391 topology 4458 245 +> 15 0 24 4391 topology 4633 246 +> 16 0 24 4391 topology 4544 246 +> 15 0 25 4391 topology 4544 247 +> 16 0 25 4391 topology 4542 247 +> 15 0 24 4391 topology 4633 248 +> 16 0 24 4391 topology 4496 248 +> 15 0 25 4391 topology 4496 249 +> 16 0 25 4391 topology 4494 249 +> 15 0 24 4391 topology 4633 250 +> 16 0 24 4391 topology 4580 250 +> 15 0 25 4391 topology 4580 251 +> 16 0 25 4391 topology 4578 251 +> 15 0 24 4391 topology 4633 252 +> 16 0 24 4391 topology 4448 252 +> 15 0 25 4391 topology 4448 253 +> 16 0 25 4391 topology 4446 253 +> 15 0 24 4391 topology 4633 254 +> 16 0 24 4391 topology 4532 254 +> 15 0 25 4391 topology 4532 255 +> 16 0 25 4391 topology 4530 255 +> 15 0 24 4391 topology 4633 256 +> 16 0 24 4391 topology 4616 256 +> 15 0 25 4391 topology 4616 257 +> 16 0 25 4391 topology 4614 257 +> 15 0 24 4391 topology 4633 258 +> 16 0 24 4391 topology 4568 258 +> 15 0 25 4391 topology 4568 259 +> 16 0 25 4391 topology 4566 259 +> 15 0 24 4391 topology 4633 260 +> 16 0 24 4391 topology 4415 260 +> 15 0 25 4391 topology 4415 261 +> 16 0 25 4391 topology 4413 261 +> 15 0 24 4391 topology 4633 262 +> 16 0 24 4391 topology 4451 262 +> 15 0 25 4391 topology 4451 263 +> 16 0 25 4391 topology 4449 263 +> 15 0 24 4391 topology 4633 264 +> 16 0 24 4391 topology 4487 264 +> 15 0 25 4391 topology 4487 265 +> 16 0 25 4391 topology 4485 265 +> 15 0 24 4391 topology 4633 266 +> 16 0 24 4391 topology 4571 266 +> 15 0 25 4391 topology 4571 267 +> 16 0 25 4391 topology 4569 267 +> 15 0 24 4391 topology 4633 268 +> 16 0 24 4391 topology 4439 268 +> 15 0 25 4391 topology 4439 269 +> 16 0 25 4391 topology 4437 269 +> 15 0 24 4391 topology 4633 270 +> 16 0 24 4391 topology 4523 270 +> 15 0 25 4391 topology 4523 271 +> 16 0 25 4391 topology 4521 271 +> 15 0 24 4391 topology 4633 272 +> 16 0 24 4391 topology 4607 272 +> 15 0 25 4391 topology 4607 273 +> 16 0 25 4391 topology 4605 273 +> 15 0 24 4391 topology 4633 274 +> 16 0 24 4391 topology 4475 274 +> 15 0 25 4391 topology 4475 275 +> 16 0 25 4391 topology 4473 275 +> 15 0 24 4391 topology 4633 276 +> 16 0 24 4391 topology 4559 276 +> 15 0 25 4391 topology 4559 277 +> 16 0 25 4391 topology 4557 277 +> 15 0 24 4391 topology 4633 278 +> 16 0 24 4391 topology 4595 278 +> 15 0 25 4391 topology 4595 279 +> 16 0 25 4391 topology 4593 279 +> 15 0 24 4391 topology 4633 280 +> 16 0 24 4391 topology 4406 280 +> 15 0 25 4391 topology 4406 281 +> 16 0 25 4391 topology 4404 281 +> 15 0 24 4391 topology 4633 282 +> 16 0 24 4391 topology 4430 282 +> 15 0 25 4391 topology 4430 283 +> 16 0 25 4391 topology 4428 283 +> 15 0 24 4391 topology 4633 284 +> 16 0 24 4391 topology 4514 284 +> 15 0 25 4391 topology 4514 285 +> 16 0 25 4391 topology 4512 285 +> 15 0 24 4391 topology 4633 286 +> 16 0 24 4391 topology 4466 286 +> 15 0 25 4391 topology 4466 287 +> 16 0 25 4391 topology 4464 287 +> 15 0 24 4391 topology 4633 288 +> 16 0 24 4391 topology 4550 288 +> 15 0 25 4391 topology 4550 289 +> 16 0 25 4391 topology 4548 289 +> 15 0 24 4391 topology 4633 290 +> 16 0 24 4391 topology 4502 290 +> 15 0 25 4391 topology 4502 291 +> 16 0 25 4391 topology 4500 291 +> 15 0 24 4391 topology 4633 292 +> 16 0 24 4391 topology 4586 292 +> 15 0 25 4391 topology 4586 293 +> 16 0 25 4391 topology 4584 293 +> 15 0 24 4391 topology 4633 294 +> 16 0 24 4391 topology 4538 294 +> 15 0 25 4391 topology 4538 295 +> 16 0 25 4391 topology 4536 295 +> 15 0 24 4391 topology 4633 296 +> 16 0 24 4391 topology 4622 296 +> 15 0 25 4391 topology 4622 297 +> 16 0 25 4391 topology 4620 297 +> 15 0 24 4391 topology 4633 298 +> 16 0 24 4391 topology 4397 298 +> 15 0 25 4391 topology 4397 299 +> 16 0 25 4391 topology 4395 299 +> 15 0 24 4391 topology 4633 300 +> 16 0 24 4391 topology 4421 300 +> 15 0 25 4391 topology 4421 301 +> 16 0 25 4391 topology 4419 301 +> 15 0 24 4391 topology 4633 302 +> 16 0 24 4391 topology 4457 302 +> 15 0 25 4391 topology 4457 303 +> 16 0 25 4391 topology 4455 303 +> 15 0 24 4391 topology 4633 304 +> 16 0 24 4391 topology 4541 304 +> 15 0 25 4391 topology 4541 305 +> 16 0 25 4391 topology 4539 305 +> 15 0 24 4391 topology 4633 306 +> 16 0 24 4391 topology 4493 306 +> 15 0 25 4391 topology 4493 307 +> 16 0 25 4391 topology 4491 307 +> 15 0 24 4391 topology 4633 308 +> 16 0 24 4391 topology 4577 308 +> 15 0 25 4391 topology 4577 309 +> 16 0 25 4391 topology 4575 309 +> 15 0 24 4391 topology 4633 310 +> 16 0 24 4391 topology 4445 310 +> 15 0 25 4391 topology 4445 311 +> 16 0 25 4391 topology 4443 311 +> 15 0 24 4391 topology 4633 312 +> 16 0 24 4391 topology 4529 312 +> 15 0 25 4391 topology 4529 313 +> 16 0 25 4391 topology 4527 313 +> 15 0 24 4391 topology 4633 314 +> 16 0 24 4391 topology 4613 314 +> 15 0 25 4391 topology 4613 315 +> 16 0 25 4391 topology 4611 315 +> 15 0 24 4391 topology 4633 316 +> 16 0 24 4391 topology 4565 316 +> 15 0 25 4391 topology 4565 317 +> 16 0 25 4391 topology 4563 317 +> 15 0 24 4391 topology 4633 318 +> 16 0 24 4391 topology 4412 318 +> 15 0 25 4391 topology 4412 319 +> 16 0 25 4391 topology 4410 319 +> 15 0 24 4391 topology 4633 320 +> 16 0 24 4391 topology 4484 320 +> 15 0 25 4391 topology 4484 321 +> 16 0 25 4391 topology 4482 321 +> 15 0 24 4391 topology 4633 322 +> 16 0 24 4391 topology 4436 322 +> 15 0 25 4391 topology 4436 323 +> 16 0 25 4391 topology 4434 323 +> 15 0 24 4391 topology 4633 324 +> 16 0 24 4391 topology 4520 324 +> 15 0 25 4391 topology 4520 325 +> 16 0 25 4391 topology 4518 325 +> 15 0 24 4391 topology 4633 326 +> 16 0 24 4391 topology 4604 326 +> 15 0 25 4391 topology 4604 327 +> 16 0 25 4391 topology 4602 327 +> 15 0 24 4391 topology 4633 328 +> 16 0 24 4391 topology 4472 328 +> 15 0 25 4391 topology 4472 329 +> 16 0 25 4391 topology 4470 329 +> 15 0 24 4391 topology 4633 330 +> 16 0 24 4391 topology 4556 330 +> 15 0 25 4391 topology 4556 331 +> 16 0 25 4391 topology 4554 331 +> 15 0 24 4391 topology 4633 332 +> 16 0 24 4391 topology 4508 332 +> 15 0 25 4391 topology 4508 333 +> 16 0 25 4391 topology 4506 333 +> 15 0 24 4391 topology 4633 334 +> 16 0 24 4391 topology 4592 334 +> 15 0 25 4391 topology 4592 335 +> 16 0 25 4391 topology 4590 335 +> 15 0 24 4391 topology 4633 336 +> 16 0 24 4391 topology 4628 336 +> 15 0 25 4391 topology 4628 337 +> 16 0 25 4391 topology 4626 337 +> 15 0 24 4391 topology 4633 338 +> 16 0 24 4391 topology 4403 338 +> 15 0 25 4391 topology 4403 339 +> 16 0 25 4391 topology 4401 339 +> 15 0 26 4391 topology 4633 340 +> 16 0 26 4391 topology 4632 340 +> 15 0 24 4391 topology 4633 341 +> 16 0 24 4391 topology 4427 341 +> 15 0 25 4391 topology 4427 342 +> 16 0 25 4391 topology 4425 342 +> 15 0 24 4391 topology 4633 343 +> 16 0 24 4391 topology 4511 343 +> 15 0 25 4391 topology 4511 344 +> 16 0 25 4391 topology 4509 344 +> 15 0 24 4391 topology 4633 345 +> 16 0 24 4391 topology 4463 345 +> 15 0 25 4391 topology 4463 346 +> 16 0 25 4391 topology 4461 346 +> 15 0 24 4391 topology 4633 347 +> 16 0 24 4391 topology 4547 347 +> 15 0 25 4391 topology 4547 348 +> 16 0 25 4391 topology 4545 348 +> 15 0 24 4391 topology 4633 349 +> 16 0 24 4391 topology 4631 349 +> 15 0 25 4391 topology 4631 350 +> 16 0 25 4391 topology 4629 350 +> 15 0 24 4391 topology 4633 351 +> 16 0 24 4391 topology 4499 351 +> 15 0 25 4391 topology 4499 352 +> 16 0 25 4391 topology 4497 352 +> 15 0 24 4391 topology 4633 353 +> 16 0 24 4391 topology 4583 353 +> 15 0 25 4391 topology 4583 354 +> 16 0 25 4391 topology 4581 354 +> 15 0 24 4391 topology 4633 355 +> 16 0 24 4391 topology 4535 355 +> 15 0 25 4391 topology 4535 356 +> 16 0 25 4391 topology 4533 356 +> 15 0 24 4391 topology 4633 357 +> 16 0 24 4391 topology 4619 357 +> 15 0 25 4391 topology 4619 358 +> 16 0 25 4391 topology 4617 358 +> 15 0 24 4391 topology 4633 359 +> 16 0 24 4391 topology 4394 359 +> 15 0 25 4391 topology 4394 360 +> 16 0 25 4391 topology 4392 360 +> 15 0 24 4391 topology 4633 361 +> 16 0 24 4391 topology 4418 361 +> 15 0 25 4391 topology 4418 362 +> 16 0 25 4391 topology 4416 362 +> 15 0 24 4391 topology 4633 363 +> 16 0 24 4391 topology 4454 363 +> 15 0 25 4391 topology 4454 364 +> 16 0 25 4391 topology 4452 364 +> 15 0 24 4391 topology 4633 365 +> 16 0 24 4391 topology 4490 365 +> 15 0 25 4391 topology 4490 366 +> 16 0 25 4391 topology 4488 366 +> 15 0 24 4391 topology 4633 367 +> 16 0 24 4391 topology 4574 367 +> 15 0 25 4391 topology 4574 368 +> 16 0 25 4391 topology 4572 368 +> 15 0 24 4391 topology 4633 369 +> 16 0 24 4391 topology 4442 369 +> 15 0 25 4391 topology 4442 370 +> 16 0 25 4391 topology 4440 370 +> 15 0 24 4391 topology 4633 371 +> 16 0 24 4391 topology 4526 371 +> 15 0 25 4391 topology 4526 372 +> 16 0 25 4391 topology 4524 372 +> 15 0 24 4391 topology 4633 373 +> 16 0 24 4391 topology 4610 373 +> 15 0 25 4391 topology 4610 374 +> 16 0 25 4391 topology 4608 374 +> 15 0 24 4391 topology 4633 375 +> 16 0 24 4391 topology 4478 375 +> 15 0 25 4391 topology 4478 376 +> 16 0 25 4391 topology 4476 376 +> 15 0 24 4391 topology 4633 377 +> 16 0 24 4391 topology 4562 377 +> 15 0 25 4391 topology 4562 378 +> 16 0 25 4391 topology 4560 378 +> 15 0 24 4391 topology 4633 379 +> 16 0 24 4391 topology 4598 379 +> 15 0 25 4391 topology 4598 380 +> 16 0 25 4391 topology 4596 380 +> 15 0 24 4391 topology 4633 381 +> 16 0 24 4391 topology 4409 381 +> 15 0 25 4391 topology 4409 382 +> 16 0 25 4391 topology 4407 382 +> 15 0 24 4391 topology 4633 383 +> 16 0 24 4391 topology 4481 383 +> 15 0 25 4391 topology 4481 384 +> 16 0 25 4391 topology 4479 384 +> 15 0 24 4391 topology 4633 385 +> 16 0 24 4391 topology 4433 385 +> 15 0 25 4391 topology 4433 386 +> 16 0 25 4391 topology 4431 386 +> 15 0 24 4391 topology 4633 387 +> 16 0 24 4391 topology 4517 387 +> 15 0 25 4391 topology 4517 388 +> 16 0 25 4391 topology 4515 388 +> 15 0 24 4391 topology 4633 389 +> 16 0 24 4391 topology 4601 389 +> 15 0 25 4391 topology 4601 390 +> 16 0 25 4391 topology 4599 390 +> 15 0 24 4391 topology 4633 391 +> 16 0 24 4391 topology 4469 391 +> 15 0 25 4391 topology 4469 392 +> 16 0 25 4391 topology 4467 392 +> 15 0 24 4391 topology 4633 393 +> 16 0 24 4391 topology 4553 393 +> 15 0 25 4391 topology 4553 394 +> 16 0 25 4391 topology 4551 394 +> 15 0 24 4391 topology 4633 395 +> 16 0 24 4391 topology 4505 395 +> 15 0 25 4391 topology 4505 396 +> 16 0 25 4391 topology 4503 396 +> 15 0 24 4391 topology 4633 397 +> 16 0 24 4391 topology 4589 397 +> 15 0 25 4391 topology 4589 398 +> 16 0 25 4391 topology 4587 398 +> 15 0 24 4391 topology 4633 399 +> 16 0 24 4391 topology 4625 399 +> 15 0 25 4391 topology 4625 400 +> 16 0 25 4391 topology 4623 400 +> 15 0 24 4391 topology 4633 401 +> 16 0 24 4391 topology 4400 401 +> 15 0 25 4391 topology 4400 402 +> 16 0 25 4391 topology 4398 402 +> 15 0 23 4391 topology 4458 403 +> 16 0 23 4391 topology 4459 403 +> 15 0 24 4391 topology 4459 404 +> 16 0 24 4391 topology 4633 404 +> 15 0 24 4391 topology 4633 405 +> 16 0 24 4391 topology 4424 405 +> 15 0 25 4391 topology 4424 406 +> 16 0 25 4391 topology 4422 406 +> 15 0 23 4391 topology 4542 407 +> 16 0 23 4391 topology 4543 407 +> 15 0 24 4391 topology 4543 408 +> 16 0 24 4391 topology 4633 408 +> 15 0 23 4391 topology 4494 409 +> 16 0 23 4391 topology 4495 409 +> 15 0 24 4391 topology 4495 410 +> 16 0 24 4391 topology 4633 410 +> 15 0 23 4391 topology 4578 411 +> 16 0 23 4391 topology 4579 411 +> 15 0 24 4391 topology 4579 412 +> 16 0 24 4391 topology 4633 412 +> 15 0 23 4391 topology 4446 413 +> 16 0 23 4391 topology 4447 413 +> 15 0 24 4391 topology 4447 414 +> 16 0 24 4391 topology 4633 414 +> 15 0 23 4391 topology 4530 415 +> 16 0 23 4391 topology 4531 415 +> 15 0 24 4391 topology 4531 416 +> 16 0 24 4391 topology 4633 416 +> 15 0 23 4391 topology 4614 417 +> 16 0 23 4391 topology 4615 417 +> 15 0 24 4391 topology 4615 418 +> 16 0 24 4391 topology 4633 418 +> 15 0 23 4391 topology 4566 419 +> 16 0 23 4391 topology 4567 419 +> 15 0 24 4391 topology 4567 420 +> 16 0 24 4391 topology 4633 420 +> 15 0 23 4391 topology 4413 421 +> 16 0 23 4391 topology 4414 421 +> 15 0 24 4391 topology 4414 422 +> 16 0 24 4391 topology 4633 422 +> 15 0 23 4391 topology 4449 423 +> 16 0 23 4391 topology 4450 423 +> 15 0 24 4391 topology 4450 424 +> 16 0 24 4391 topology 4633 424 +> 15 0 23 4391 topology 4485 425 +> 16 0 23 4391 topology 4486 425 +> 15 0 24 4391 topology 4486 426 +> 16 0 24 4391 topology 4633 426 +> 15 0 23 4391 topology 4569 427 +> 16 0 23 4391 topology 4570 427 +> 15 0 24 4391 topology 4570 428 +> 16 0 24 4391 topology 4633 428 +> 15 0 23 4391 topology 4437 429 +> 16 0 23 4391 topology 4438 429 +> 15 0 24 4391 topology 4438 430 +> 16 0 24 4391 topology 4633 430 +> 15 0 23 4391 topology 4521 431 +> 16 0 23 4391 topology 4522 431 +> 15 0 24 4391 topology 4522 432 +> 16 0 24 4391 topology 4633 432 +> 15 0 23 4391 topology 4605 433 +> 16 0 23 4391 topology 4606 433 +> 15 0 24 4391 topology 4606 434 +> 16 0 24 4391 topology 4633 434 +> 15 0 23 4391 topology 4473 435 +> 16 0 23 4391 topology 4474 435 +> 15 0 24 4391 topology 4474 436 +> 16 0 24 4391 topology 4633 436 +> 15 0 23 4391 topology 4557 437 +> 16 0 23 4391 topology 4558 437 +> 15 0 24 4391 topology 4558 438 +> 16 0 24 4391 topology 4633 438 +> 15 0 23 4391 topology 4593 439 +> 16 0 23 4391 topology 4594 439 +> 15 0 24 4391 topology 4594 440 +> 16 0 24 4391 topology 4633 440 +> 15 0 23 4391 topology 4404 441 +> 16 0 23 4391 topology 4405 441 +> 15 0 24 4391 topology 4405 442 +> 16 0 24 4391 topology 4633 442 +> 15 0 23 4391 topology 4428 443 +> 16 0 23 4391 topology 4429 443 +> 15 0 24 4391 topology 4429 444 +> 16 0 24 4391 topology 4633 444 +> 15 0 23 4391 topology 4512 445 +> 16 0 23 4391 topology 4513 445 +> 15 0 24 4391 topology 4513 446 +> 16 0 24 4391 topology 4633 446 +> 15 0 23 4391 topology 4464 447 +> 16 0 23 4391 topology 4465 447 +> 15 0 24 4391 topology 4465 448 +> 16 0 24 4391 topology 4633 448 +> 15 0 23 4391 topology 4548 449 +> 16 0 23 4391 topology 4549 449 +> 15 0 24 4391 topology 4549 450 +> 16 0 24 4391 topology 4633 450 +> 15 0 23 4391 topology 4500 451 +> 16 0 23 4391 topology 4501 451 +> 15 0 24 4391 topology 4501 452 +> 16 0 24 4391 topology 4633 452 +> 15 0 23 4391 topology 4584 453 +> 16 0 23 4391 topology 4585 453 +> 15 0 24 4391 topology 4585 454 +> 16 0 24 4391 topology 4633 454 +> 15 0 23 4391 topology 4536 455 +> 16 0 23 4391 topology 4537 455 +> 15 0 24 4391 topology 4537 456 +> 16 0 24 4391 topology 4633 456 +> 15 0 23 4391 topology 4620 457 +> 16 0 23 4391 topology 4621 457 +> 15 0 24 4391 topology 4621 458 +> 16 0 24 4391 topology 4633 458 +> 15 0 23 4391 topology 4395 459 +> 16 0 23 4391 topology 4396 459 +> 15 0 24 4391 topology 4396 460 +> 16 0 24 4391 topology 4633 460 +> 15 0 23 4391 topology 4419 461 +> 16 0 23 4391 topology 4420 461 +> 15 0 24 4391 topology 4420 462 +> 16 0 24 4391 topology 4633 462 +> 15 0 23 4391 topology 4455 463 +> 16 0 23 4391 topology 4456 463 +> 15 0 24 4391 topology 4456 464 +> 16 0 24 4391 topology 4633 464 +> 15 0 23 4391 topology 4539 465 +> 16 0 23 4391 topology 4540 465 +> 15 0 24 4391 topology 4540 466 +> 16 0 24 4391 topology 4633 466 +> 15 0 23 4391 topology 4491 467 +> 16 0 23 4391 topology 4492 467 +> 15 0 24 4391 topology 4492 468 +> 16 0 24 4391 topology 4633 468 +> 15 0 23 4391 topology 4575 469 +> 16 0 23 4391 topology 4576 469 +> 15 0 24 4391 topology 4576 470 +> 16 0 24 4391 topology 4633 470 +> 15 0 23 4391 topology 4443 471 +> 16 0 23 4391 topology 4444 471 +> 15 0 24 4391 topology 4444 472 +> 16 0 24 4391 topology 4633 472 +> 15 0 23 4391 topology 4527 473 +> 16 0 23 4391 topology 4528 473 +> 15 0 24 4391 topology 4528 474 +> 16 0 24 4391 topology 4633 474 +> 15 0 23 4391 topology 4611 475 +> 16 0 23 4391 topology 4612 475 +> 15 0 24 4391 topology 4612 476 +> 16 0 24 4391 topology 4633 476 +> 15 0 23 4391 topology 4563 477 +> 16 0 23 4391 topology 4564 477 +> 15 0 24 4391 topology 4564 478 +> 16 0 24 4391 topology 4633 478 +> 15 0 23 4391 topology 4410 479 +> 16 0 23 4391 topology 4411 479 +> 15 0 24 4391 topology 4411 480 +> 16 0 24 4391 topology 4633 480 +> 15 0 23 4391 topology 4482 481 +> 16 0 23 4391 topology 4483 481 +> 15 0 24 4391 topology 4483 482 +> 16 0 24 4391 topology 4633 482 +> 15 0 23 4391 topology 4434 483 +> 16 0 23 4391 topology 4435 483 +> 15 0 24 4391 topology 4435 484 +> 16 0 24 4391 topology 4633 484 +> 15 0 23 4391 topology 4518 485 +> 16 0 23 4391 topology 4519 485 +> 15 0 24 4391 topology 4519 486 +> 16 0 24 4391 topology 4633 486 +> 15 0 23 4391 topology 4602 487 +> 16 0 23 4391 topology 4603 487 +> 15 0 24 4391 topology 4603 488 +> 16 0 24 4391 topology 4633 488 +> 15 0 23 4391 topology 4470 489 +> 16 0 23 4391 topology 4471 489 +> 15 0 24 4391 topology 4471 490 +> 16 0 24 4391 topology 4633 490 +> 15 0 23 4391 topology 4554 491 +> 16 0 23 4391 topology 4555 491 +> 15 0 24 4391 topology 4555 492 +> 16 0 24 4391 topology 4633 492 +> 15 0 23 4391 topology 4506 493 +> 16 0 23 4391 topology 4507 493 +> 15 0 24 4391 topology 4507 494 +> 16 0 24 4391 topology 4633 494 +> 15 0 23 4391 topology 4590 495 +> 16 0 23 4391 topology 4591 495 +> 15 0 24 4391 topology 4591 496 +> 16 0 24 4391 topology 4633 496 +> 15 0 23 4391 topology 4626 497 +> 16 0 23 4391 topology 4627 497 +> 15 0 24 4391 topology 4627 498 +> 16 0 24 4391 topology 4633 498 +> 15 0 23 4391 topology 4401 499 +> 16 0 23 4391 topology 4402 499 +> 15 0 24 4391 topology 4402 500 +> 16 0 24 4391 topology 4633 500 +> 15 0 23 4391 topology 4425 501 +> 16 0 23 4391 topology 4426 501 +> 15 0 24 4391 topology 4426 502 +> 16 0 24 4391 topology 4633 502 +> 15 0 23 4391 topology 4509 503 +> 16 0 23 4391 topology 4510 503 +> 15 0 24 4391 topology 4510 504 +> 16 0 24 4391 topology 4633 504 +> 15 0 23 4391 topology 4461 505 +> 16 0 23 4391 topology 4462 505 +> 15 0 24 4391 topology 4462 506 +> 16 0 24 4391 topology 4633 506 +> 15 0 23 4391 topology 4545 507 +> 16 0 23 4391 topology 4546 507 +> 15 0 24 4391 topology 4546 508 +> 16 0 24 4391 topology 4633 508 +> 15 0 23 4391 topology 4629 509 +> 16 0 23 4391 topology 4630 509 +> 15 0 24 4391 topology 4630 510 +> 16 0 24 4391 topology 4633 510 +> 15 0 23 4391 topology 4497 511 +> 16 0 23 4391 topology 4498 511 +> 15 0 24 4391 topology 4498 512 +> 16 0 24 4391 topology 4633 512 +> 15 0 23 4391 topology 4581 513 +> 16 0 23 4391 topology 4582 513 +> 15 0 24 4391 topology 4582 514 +> 16 0 24 4391 topology 4633 514 +> 15 0 23 4391 topology 4533 515 +> 16 0 23 4391 topology 4534 515 +> 15 0 24 4391 topology 4534 516 +> 16 0 24 4391 topology 4633 516 +> 15 0 23 4391 topology 4617 517 +> 16 0 23 4391 topology 4618 517 +> 15 0 24 4391 topology 4618 518 +> 16 0 24 4391 topology 4633 518 +> 15 0 23 4391 topology 4392 519 +> 16 0 23 4391 topology 4393 519 +> 15 0 24 4391 topology 4393 520 +> 16 0 24 4391 topology 4633 520 +> 15 0 23 4391 topology 4416 521 +> 16 0 23 4391 topology 4417 521 +> 15 0 24 4391 topology 4417 522 +> 16 0 24 4391 topology 4633 522 +> 15 0 23 4391 topology 4452 523 +> 16 0 23 4391 topology 4453 523 +> 15 0 24 4391 topology 4453 524 +> 16 0 24 4391 topology 4633 524 +> 15 0 23 4391 topology 4488 525 +> 16 0 23 4391 topology 4489 525 +> 15 0 24 4391 topology 4489 526 +> 16 0 24 4391 topology 4633 526 +> 15 0 23 4391 topology 4572 527 +> 16 0 23 4391 topology 4573 527 +> 15 0 24 4391 topology 4573 528 +> 16 0 24 4391 topology 4633 528 +> 15 0 23 4391 topology 4440 529 +> 16 0 23 4391 topology 4441 529 +> 15 0 24 4391 topology 4441 530 +> 16 0 24 4391 topology 4633 530 +> 15 0 23 4391 topology 4524 531 +> 16 0 23 4391 topology 4525 531 +> 15 0 24 4391 topology 4525 532 +> 16 0 24 4391 topology 4633 532 +> 15 0 23 4391 topology 4608 533 +> 16 0 23 4391 topology 4609 533 +> 15 0 24 4391 topology 4609 534 +> 16 0 24 4391 topology 4633 534 +> 15 0 23 4391 topology 4476 535 +> 16 0 23 4391 topology 4477 535 +> 15 0 24 4391 topology 4477 536 +> 16 0 24 4391 topology 4633 536 +> 15 0 23 4391 topology 4560 537 +> 16 0 23 4391 topology 4561 537 +> 15 0 24 4391 topology 4561 538 +> 16 0 24 4391 topology 4633 538 +> 15 0 23 4391 topology 4596 539 +> 16 0 23 4391 topology 4597 539 +> 15 0 24 4391 topology 4597 540 +> 16 0 24 4391 topology 4633 540 +> 15 0 23 4391 topology 4407 541 +> 16 0 23 4391 topology 4408 541 +> 15 0 24 4391 topology 4408 542 +> 16 0 24 4391 topology 4633 542 +> 15 0 23 4391 topology 4479 543 +> 16 0 23 4391 topology 4480 543 +> 15 0 24 4391 topology 4480 544 +> 16 0 24 4391 topology 4633 544 +> 15 0 23 4391 topology 4431 545 +> 16 0 23 4391 topology 4432 545 +> 15 0 24 4391 topology 4432 546 +> 16 0 24 4391 topology 4633 546 +> 15 0 23 4391 topology 4515 547 +> 16 0 23 4391 topology 4516 547 +> 15 0 24 4391 topology 4516 548 +> 16 0 24 4391 topology 4633 548 +> 15 0 23 4391 topology 4599 549 +> 16 0 23 4391 topology 4600 549 +> 15 0 24 4391 topology 4600 550 +> 16 0 24 4391 topology 4633 550 +> 15 0 23 4391 topology 4467 551 +> 16 0 23 4391 topology 4468 551 +> 15 0 24 4391 topology 4468 552 +> 16 0 24 4391 topology 4633 552 +> 15 0 23 4391 topology 4551 553 +> 16 0 23 4391 topology 4552 553 +> 15 0 24 4391 topology 4552 554 +> 16 0 24 4391 topology 4633 554 +> 15 0 23 4391 topology 4503 555 +> 16 0 23 4391 topology 4504 555 +> 15 0 24 4391 topology 4504 556 +> 16 0 24 4391 topology 4633 556 +> 15 0 23 4391 topology 4587 557 +> 16 0 23 4391 topology 4588 557 +> 15 0 24 4391 topology 4588 558 +> 16 0 24 4391 topology 4633 558 +> 15 0 23 4391 topology 4623 559 +> 16 0 23 4391 topology 4624 559 +> 15 0 24 4391 topology 4624 560 +> 16 0 24 4391 topology 4633 560 +> 15 0 23 4391 topology 4398 561 +> 16 0 23 4391 topology 4399 561 +> 15 0 24 4391 topology 4399 562 +> 16 0 24 4391 topology 4633 562 +> 15 0 27 4390 topology 4792 563 +> 16 0 27 4390 topology 4794 563 +> 15 0 28 4390 topology 4794 564 +> 16 0 28 4390 topology 4796 564 +> 15 0 21 4390 topology 4794 565 +> 16 0 21 4390 topology 4634 565 +> 15 0 28 4390 topology 4634 566 +> 16 0 28 4390 topology 4632 566 +> 15 0 27 4390 topology 4796 567 +> 16 0 27 4390 topology 4634 567 +> 15 0 23 3794 topology 3801 568 +> 16 0 23 3794 topology 3802 568 +> 15 0 24 3794 topology 3802 569 +> 16 0 24 3794 topology 3916 569 +> 15 0 26 3794 topology 3916 570 +> 16 0 26 3794 topology 3915 570 +> 15 0 24 3794 topology 3916 571 +> 16 0 24 3794 topology 3815 571 +> 15 0 25 3794 topology 3815 572 +> 16 0 25 3794 topology 3813 572 +> 15 0 24 3794 topology 3916 573 +> 16 0 24 3794 topology 3827 573 +> 15 0 25 3794 topology 3827 574 +> 16 0 25 3794 topology 3825 574 +> 15 0 24 3794 topology 3916 575 +> 16 0 24 3794 topology 3857 575 +> 15 0 25 3794 topology 3857 576 +> 16 0 25 3794 topology 3855 576 +> 15 0 24 3794 topology 3916 577 +> 16 0 24 3794 topology 3887 577 +> 15 0 25 3794 topology 3887 578 +> 16 0 25 3794 topology 3885 578 +> 15 0 24 3794 topology 3916 579 +> 16 0 24 3794 topology 3839 579 +> 15 0 25 3794 topology 3839 580 +> 16 0 25 3794 topology 3837 580 +> 15 0 24 3794 topology 3916 581 +> 16 0 24 3794 topology 3869 581 +> 15 0 25 3794 topology 3869 582 +> 16 0 25 3794 topology 3867 582 +> 15 0 24 3794 topology 3916 583 +> 16 0 24 3794 topology 3899 583 +> 15 0 25 3794 topology 3899 584 +> 16 0 25 3794 topology 3897 584 +> 15 0 24 3794 topology 3916 585 +> 16 0 24 3794 topology 3851 585 +> 15 0 25 3794 topology 3851 586 +> 16 0 25 3794 topology 3849 586 +> 15 0 24 3794 topology 3916 587 +> 16 0 24 3794 topology 3881 587 +> 15 0 25 3794 topology 3881 588 +> 16 0 25 3794 topology 3879 588 +> 15 0 24 3794 topology 3916 589 +> 16 0 24 3794 topology 3911 589 +> 15 0 25 3794 topology 3911 590 +> 16 0 25 3794 topology 3909 590 +> 15 0 24 3794 topology 3916 591 +> 16 0 24 3794 topology 3800 591 +> 15 0 25 3794 topology 3800 592 +> 16 0 25 3794 topology 3798 592 +> 15 0 24 3794 topology 3916 593 +> 16 0 24 3794 topology 3812 593 +> 15 0 25 3794 topology 3812 594 +> 16 0 25 3794 topology 3810 594 +> 15 0 24 3794 topology 3916 595 +> 16 0 24 3794 topology 3824 595 +> 15 0 25 3794 topology 3824 596 +> 16 0 25 3794 topology 3822 596 +> 15 0 24 3794 topology 3916 597 +> 16 0 24 3794 topology 3854 597 +> 15 0 25 3794 topology 3854 598 +> 16 0 25 3794 topology 3852 598 +> 15 0 24 3794 topology 3916 599 +> 16 0 24 3794 topology 3884 599 +> 15 0 25 3794 topology 3884 600 +> 16 0 25 3794 topology 3882 600 +> 15 0 24 3794 topology 3916 601 +> 16 0 24 3794 topology 3914 601 +> 15 0 25 3794 topology 3914 602 +> 16 0 25 3794 topology 3912 602 +> 15 0 24 3794 topology 3916 603 +> 16 0 24 3794 topology 3836 603 +> 15 0 25 3794 topology 3836 604 +> 16 0 25 3794 topology 3834 604 +> 15 0 24 3794 topology 3916 605 +> 16 0 24 3794 topology 3866 605 +> 15 0 25 3794 topology 3866 606 +> 16 0 25 3794 topology 3864 606 +> 15 0 24 3794 topology 3916 607 +> 16 0 24 3794 topology 3896 607 +> 15 0 25 3794 topology 3896 608 +> 16 0 25 3794 topology 3894 608 +> 15 0 24 3794 topology 3916 609 +> 16 0 24 3794 topology 3848 609 +> 15 0 25 3794 topology 3848 610 +> 16 0 25 3794 topology 3846 610 +> 15 0 24 3794 topology 3916 611 +> 16 0 24 3794 topology 3878 611 +> 15 0 25 3794 topology 3878 612 +> 16 0 25 3794 topology 3876 612 +> 15 0 24 3794 topology 3916 613 +> 16 0 24 3794 topology 3908 613 +> 15 0 25 3794 topology 3908 614 +> 16 0 25 3794 topology 3906 614 +> 15 0 24 3794 topology 3916 615 +> 16 0 24 3794 topology 3797 615 +> 15 0 25 3794 topology 3797 616 +> 16 0 25 3794 topology 3795 616 +> 15 0 24 3794 topology 3916 617 +> 16 0 24 3794 topology 3809 617 +> 15 0 25 3794 topology 3809 618 +> 16 0 25 3794 topology 3807 618 +> 15 0 24 3794 topology 3916 619 +> 16 0 24 3794 topology 3821 619 +> 15 0 25 3794 topology 3821 620 +> 16 0 25 3794 topology 3819 620 +> 15 0 24 3794 topology 3916 621 +> 16 0 24 3794 topology 3833 621 +> 15 0 25 3794 topology 3833 622 +> 16 0 25 3794 topology 3831 622 +> 15 0 24 3794 topology 3916 623 +> 16 0 24 3794 topology 3863 623 +> 15 0 25 3794 topology 3863 624 +> 16 0 25 3794 topology 3861 624 +> 15 0 24 3794 topology 3916 625 +> 16 0 24 3794 topology 3893 625 +> 15 0 25 3794 topology 3893 626 +> 16 0 25 3794 topology 3891 626 +> 15 0 24 3794 topology 3916 627 +> 16 0 24 3794 topology 3845 627 +> 15 0 25 3794 topology 3845 628 +> 16 0 25 3794 topology 3843 628 +> 15 0 24 3794 topology 3916 629 +> 16 0 24 3794 topology 3875 629 +> 15 0 25 3794 topology 3875 630 +> 16 0 25 3794 topology 3873 630 +> 15 0 24 3794 topology 3916 631 +> 16 0 24 3794 topology 3905 631 +> 15 0 25 3794 topology 3905 632 +> 16 0 25 3794 topology 3903 632 +> 15 0 24 3794 topology 3916 633 +> 16 0 24 3794 topology 3806 633 +> 15 0 25 3794 topology 3806 634 +> 16 0 25 3794 topology 3804 634 +> 15 0 24 3794 topology 3916 635 +> 16 0 24 3794 topology 3818 635 +> 15 0 25 3794 topology 3818 636 +> 16 0 25 3794 topology 3816 636 +> 15 0 24 3794 topology 3916 637 +> 16 0 24 3794 topology 3830 637 +> 15 0 25 3794 topology 3830 638 +> 16 0 25 3794 topology 3828 638 +> 15 0 24 3794 topology 3916 639 +> 16 0 24 3794 topology 3860 639 +> 15 0 25 3794 topology 3860 640 +> 16 0 25 3794 topology 3858 640 +> 15 0 24 3794 topology 3916 641 +> 16 0 24 3794 topology 3890 641 +> 15 0 25 3794 topology 3890 642 +> 16 0 25 3794 topology 3888 642 +> 15 0 24 3794 topology 3916 643 +> 16 0 24 3794 topology 3842 643 +> 15 0 25 3794 topology 3842 644 +> 16 0 25 3794 topology 3840 644 +> 15 0 24 3794 topology 3916 645 +> 16 0 24 3794 topology 3872 645 +> 15 0 25 3794 topology 3872 646 +> 16 0 25 3794 topology 3870 646 +> 15 0 24 3794 topology 3916 647 +> 16 0 24 3794 topology 3902 647 +> 15 0 25 3794 topology 3902 648 +> 16 0 25 3794 topology 3900 648 +> 15 0 24 3794 topology 3916 649 +> 16 0 24 3794 topology 3803 649 +> 15 0 25 3794 topology 3803 650 +> 16 0 25 3794 topology 3801 650 +> 15 0 23 3794 topology 3813 651 +> 16 0 23 3794 topology 3814 651 +> 15 0 24 3794 topology 3814 652 +> 16 0 24 3794 topology 3916 652 +> 15 0 23 3794 topology 3825 653 +> 16 0 23 3794 topology 3826 653 +> 15 0 24 3794 topology 3826 654 +> 16 0 24 3794 topology 3916 654 +> 15 0 23 3794 topology 3855 655 +> 16 0 23 3794 topology 3856 655 +> 15 0 24 3794 topology 3856 656 +> 16 0 24 3794 topology 3916 656 +> 15 0 23 3794 topology 3885 657 +> 16 0 23 3794 topology 3886 657 +> 15 0 24 3794 topology 3886 658 +> 16 0 24 3794 topology 3916 658 +> 15 0 23 3794 topology 3837 659 +> 16 0 23 3794 topology 3838 659 +> 15 0 24 3794 topology 3838 660 +> 16 0 24 3794 topology 3916 660 +> 15 0 23 3794 topology 3867 661 +> 16 0 23 3794 topology 3868 661 +> 15 0 24 3794 topology 3868 662 +> 16 0 24 3794 topology 3916 662 +> 15 0 23 3794 topology 3897 663 +> 16 0 23 3794 topology 3898 663 +> 15 0 24 3794 topology 3898 664 +> 16 0 24 3794 topology 3916 664 +> 15 0 23 3794 topology 3849 665 +> 16 0 23 3794 topology 3850 665 +> 15 0 24 3794 topology 3850 666 +> 16 0 24 3794 topology 3916 666 +> 15 0 23 3794 topology 3879 667 +> 16 0 23 3794 topology 3880 667 +> 15 0 24 3794 topology 3880 668 +> 16 0 24 3794 topology 3916 668 +> 15 0 23 3794 topology 3909 669 +> 16 0 23 3794 topology 3910 669 +> 15 0 24 3794 topology 3910 670 +> 16 0 24 3794 topology 3916 670 +> 15 0 23 3794 topology 3798 671 +> 16 0 23 3794 topology 3799 671 +> 15 0 24 3794 topology 3799 672 +> 16 0 24 3794 topology 3916 672 +> 15 0 23 3794 topology 3810 673 +> 16 0 23 3794 topology 3811 673 +> 15 0 24 3794 topology 3811 674 +> 16 0 24 3794 topology 3916 674 +> 15 0 23 3794 topology 3822 675 +> 16 0 23 3794 topology 3823 675 +> 15 0 24 3794 topology 3823 676 +> 16 0 24 3794 topology 3916 676 +> 15 0 23 3794 topology 3852 677 +> 16 0 23 3794 topology 3853 677 +> 15 0 24 3794 topology 3853 678 +> 16 0 24 3794 topology 3916 678 +> 15 0 23 3794 topology 3882 679 +> 16 0 23 3794 topology 3883 679 +> 15 0 24 3794 topology 3883 680 +> 16 0 24 3794 topology 3916 680 +> 15 0 23 3794 topology 3912 681 +> 16 0 23 3794 topology 3913 681 +> 15 0 24 3794 topology 3913 682 +> 16 0 24 3794 topology 3916 682 +> 15 0 23 3794 topology 3834 683 +> 16 0 23 3794 topology 3835 683 +> 15 0 24 3794 topology 3835 684 +> 16 0 24 3794 topology 3916 684 +> 15 0 23 3794 topology 3864 685 +> 16 0 23 3794 topology 3865 685 +> 15 0 24 3794 topology 3865 686 +> 16 0 24 3794 topology 3916 686 +> 15 0 23 3794 topology 3894 687 +> 16 0 23 3794 topology 3895 687 +> 15 0 24 3794 topology 3895 688 +> 16 0 24 3794 topology 3916 688 +> 15 0 23 3794 topology 3846 689 +> 16 0 23 3794 topology 3847 689 +> 15 0 24 3794 topology 3847 690 +> 16 0 24 3794 topology 3916 690 +> 15 0 23 3794 topology 3876 691 +> 16 0 23 3794 topology 3877 691 +> 15 0 24 3794 topology 3877 692 +> 16 0 24 3794 topology 3916 692 +> 15 0 23 3794 topology 3906 693 +> 16 0 23 3794 topology 3907 693 +> 15 0 24 3794 topology 3907 694 +> 16 0 24 3794 topology 3916 694 +> 15 0 23 3794 topology 3795 695 +> 16 0 23 3794 topology 3796 695 +> 15 0 24 3794 topology 3796 696 +> 16 0 24 3794 topology 3916 696 +> 15 0 23 3794 topology 3807 697 +> 16 0 23 3794 topology 3808 697 +> 15 0 24 3794 topology 3808 698 +> 16 0 24 3794 topology 3916 698 +> 15 0 23 3794 topology 3819 699 +> 16 0 23 3794 topology 3820 699 +> 15 0 24 3794 topology 3820 700 +> 16 0 24 3794 topology 3916 700 +> 15 0 23 3794 topology 3831 701 +> 16 0 23 3794 topology 3832 701 +> 15 0 24 3794 topology 3832 702 +> 16 0 24 3794 topology 3916 702 +> 15 0 23 3794 topology 3861 703 +> 16 0 23 3794 topology 3862 703 +> 15 0 24 3794 topology 3862 704 +> 16 0 24 3794 topology 3916 704 +> 15 0 23 3794 topology 3891 705 +> 16 0 23 3794 topology 3892 705 +> 15 0 24 3794 topology 3892 706 +> 16 0 24 3794 topology 3916 706 +> 15 0 23 3794 topology 3843 707 +> 16 0 23 3794 topology 3844 707 +> 15 0 24 3794 topology 3844 708 +> 16 0 24 3794 topology 3916 708 +> 15 0 23 3794 topology 3873 709 +> 16 0 23 3794 topology 3874 709 +> 15 0 24 3794 topology 3874 710 +> 16 0 24 3794 topology 3916 710 +> 15 0 23 3794 topology 3903 711 +> 16 0 23 3794 topology 3904 711 +> 15 0 24 3794 topology 3904 712 +> 16 0 24 3794 topology 3916 712 +> 15 0 23 3794 topology 3804 713 +> 16 0 23 3794 topology 3805 713 +> 15 0 24 3794 topology 3805 714 +> 16 0 24 3794 topology 3916 714 +> 15 0 23 3794 topology 3816 715 +> 16 0 23 3794 topology 3817 715 +> 15 0 24 3794 topology 3817 716 +> 16 0 24 3794 topology 3916 716 +> 15 0 23 3794 topology 3828 717 +> 16 0 23 3794 topology 3829 717 +> 15 0 24 3794 topology 3829 718 +> 16 0 24 3794 topology 3916 718 +> 15 0 23 3794 topology 3858 719 +> 16 0 23 3794 topology 3859 719 +> 15 0 24 3794 topology 3859 720 +> 16 0 24 3794 topology 3916 720 +> 15 0 23 3794 topology 3888 721 +> 16 0 23 3794 topology 3889 721 +> 15 0 24 3794 topology 3889 722 +> 16 0 24 3794 topology 3916 722 +> 15 0 23 3794 topology 3840 723 +> 16 0 23 3794 topology 3841 723 +> 15 0 24 3794 topology 3841 724 +> 16 0 24 3794 topology 3916 724 +> 15 0 23 3794 topology 3870 725 +> 16 0 23 3794 topology 3871 725 +> 15 0 24 3794 topology 3871 726 +> 16 0 24 3794 topology 3916 726 +> 15 0 23 3794 topology 3900 727 +> 16 0 23 3794 topology 3901 727 +> 15 0 24 3794 topology 3901 728 +> 16 0 24 3794 topology 3916 728 +> 15 0 23 3416 topology 3462 729 +> 16 0 23 3416 topology 3463 729 +> 15 0 24 3416 topology 3463 730 +> 16 0 24 3416 topology 3610 730 +> 15 0 24 3416 topology 3610 731 +> 16 0 24 3416 topology 3572 731 +> 15 0 25 3416 topology 3572 732 +> 16 0 25 3416 topology 3570 732 +> 15 0 24 3416 topology 3610 733 +> 16 0 24 3416 topology 3494 733 +> 15 0 25 3416 topology 3494 734 +> 16 0 25 3416 topology 3492 734 +> 15 0 24 3416 topology 3610 735 +> 16 0 24 3416 topology 3602 735 +> 15 0 25 3416 topology 3602 736 +> 16 0 25 3416 topology 3600 736 +> 15 0 24 3416 topology 3610 737 +> 16 0 24 3416 topology 3524 737 +> 15 0 25 3416 topology 3524 738 +> 16 0 25 3416 topology 3522 738 +> 15 0 24 3416 topology 3610 739 +> 16 0 24 3416 topology 3554 739 +> 15 0 25 3416 topology 3554 740 +> 16 0 25 3416 topology 3552 740 +> 15 0 24 3416 topology 3610 741 +> 16 0 24 3416 topology 3584 741 +> 15 0 25 3416 topology 3584 742 +> 16 0 25 3416 topology 3582 742 +> 15 0 24 3416 topology 3610 743 +> 16 0 24 3416 topology 3425 743 +> 15 0 25 3416 topology 3425 744 +> 16 0 25 3416 topology 3423 744 +> 15 0 24 3416 topology 3610 745 +> 16 0 24 3416 topology 3437 745 +> 15 0 25 3416 topology 3437 746 +> 16 0 25 3416 topology 3435 746 +> 15 0 24 3416 topology 3610 747 +> 16 0 24 3416 topology 3449 747 +> 15 0 25 3416 topology 3449 748 +> 16 0 25 3416 topology 3447 748 +> 15 0 24 3416 topology 3610 749 +> 16 0 24 3416 topology 3479 749 +> 15 0 25 3416 topology 3479 750 +> 16 0 25 3416 topology 3477 750 +> 15 0 24 3416 topology 3610 751 +> 16 0 24 3416 topology 3509 751 +> 15 0 25 3416 topology 3509 752 +> 16 0 25 3416 topology 3507 752 +> 15 0 24 3416 topology 3610 753 +> 16 0 24 3416 topology 3539 753 +> 15 0 25 3416 topology 3539 754 +> 16 0 25 3416 topology 3537 754 +> 15 0 24 3416 topology 3610 755 +> 16 0 24 3416 topology 3461 755 +> 15 0 25 3416 topology 3461 756 +> 16 0 25 3416 topology 3459 756 +> 15 0 24 3416 topology 3610 757 +> 16 0 24 3416 topology 3569 757 +> 15 0 25 3416 topology 3569 758 +> 16 0 25 3416 topology 3567 758 +> 15 0 24 3416 topology 3610 759 +> 16 0 24 3416 topology 3491 759 +> 15 0 25 3416 topology 3491 760 +> 16 0 25 3416 topology 3489 760 +> 15 0 24 3416 topology 3610 761 +> 16 0 24 3416 topology 3599 761 +> 15 0 25 3416 topology 3599 762 +> 16 0 25 3416 topology 3597 762 +> 15 0 24 3416 topology 3610 763 +> 16 0 24 3416 topology 3521 763 +> 15 0 25 3416 topology 3521 764 +> 16 0 25 3416 topology 3519 764 +> 15 0 24 3416 topology 3610 765 +> 16 0 24 3416 topology 3551 765 +> 15 0 25 3416 topology 3551 766 +> 16 0 25 3416 topology 3549 766 +> 15 0 24 3416 topology 3610 767 +> 16 0 24 3416 topology 3473 767 +> 15 0 25 3416 topology 3473 768 +> 16 0 25 3416 topology 3471 768 +> 15 0 24 3416 topology 3610 769 +> 16 0 24 3416 topology 3581 769 +> 15 0 25 3416 topology 3581 770 +> 16 0 25 3416 topology 3579 770 +> 15 0 24 3416 topology 3610 771 +> 16 0 24 3416 topology 3503 771 +> 15 0 25 3416 topology 3503 772 +> 16 0 25 3416 topology 3501 772 +> 15 0 24 3416 topology 3610 773 +> 16 0 24 3416 topology 3533 773 +> 15 0 25 3416 topology 3533 774 +> 16 0 25 3416 topology 3531 774 +> 15 0 24 3416 topology 3610 775 +> 16 0 24 3416 topology 3563 775 +> 15 0 25 3416 topology 3563 776 +> 16 0 25 3416 topology 3561 776 +> 15 0 24 3416 topology 3610 777 +> 16 0 24 3416 topology 3593 777 +> 15 0 25 3416 topology 3593 778 +> 16 0 25 3416 topology 3591 778 +> 15 0 24 3416 topology 3610 779 +> 16 0 24 3416 topology 3422 779 +> 15 0 25 3416 topology 3422 780 +> 16 0 25 3416 topology 3420 780 +> 15 0 24 3416 topology 3610 781 +> 16 0 24 3416 topology 3434 781 +> 15 0 25 3416 topology 3434 782 +> 16 0 25 3416 topology 3432 782 +> 15 0 24 3416 topology 3610 783 +> 16 0 24 3416 topology 3446 783 +> 15 0 25 3416 topology 3446 784 +> 16 0 25 3416 topology 3444 784 +> 15 0 24 3416 topology 3610 785 +> 16 0 24 3416 topology 3476 785 +> 15 0 25 3416 topology 3476 786 +> 16 0 25 3416 topology 3474 786 +> 15 0 26 3416 topology 3610 787 +> 16 0 26 3416 topology 3609 787 +> 15 0 24 3416 topology 3610 788 +> 16 0 24 3416 topology 3506 788 +> 15 0 25 3416 topology 3506 789 +> 16 0 25 3416 topology 3504 789 +> 15 0 24 3416 topology 3610 790 +> 16 0 24 3416 topology 3536 790 +> 15 0 25 3416 topology 3536 791 +> 16 0 25 3416 topology 3534 791 +> 15 0 24 3416 topology 3610 792 +> 16 0 24 3416 topology 3458 792 +> 15 0 25 3416 topology 3458 793 +> 16 0 25 3416 topology 3456 793 +> 15 0 24 3416 topology 3610 794 +> 16 0 24 3416 topology 3566 794 +> 15 0 25 3416 topology 3566 795 +> 16 0 25 3416 topology 3564 795 +> 15 0 24 3416 topology 3610 796 +> 16 0 24 3416 topology 3488 796 +> 15 0 25 3416 topology 3488 797 +> 16 0 25 3416 topology 3486 797 +> 15 0 24 3416 topology 3610 798 +> 16 0 24 3416 topology 3596 798 +> 15 0 25 3416 topology 3596 799 +> 16 0 25 3416 topology 3594 799 +> 15 0 24 3416 topology 3610 800 +> 16 0 24 3416 topology 3518 800 +> 15 0 25 3416 topology 3518 801 +> 16 0 25 3416 topology 3516 801 +> 15 0 24 3416 topology 3610 802 +> 16 0 24 3416 topology 3548 802 +> 15 0 25 3416 topology 3548 803 +> 16 0 25 3416 topology 3546 803 +> 15 0 24 3416 topology 3610 804 +> 16 0 24 3416 topology 3470 804 +> 15 0 25 3416 topology 3470 805 +> 16 0 25 3416 topology 3468 805 +> 15 0 24 3416 topology 3610 806 +> 16 0 24 3416 topology 3578 806 +> 15 0 25 3416 topology 3578 807 +> 16 0 25 3416 topology 3576 807 +> 15 0 24 3416 topology 3610 808 +> 16 0 24 3416 topology 3500 808 +> 15 0 25 3416 topology 3500 809 +> 16 0 25 3416 topology 3498 809 +> 15 0 24 3416 topology 3610 810 +> 16 0 24 3416 topology 3608 810 +> 15 0 25 3416 topology 3608 811 +> 16 0 25 3416 topology 3606 811 +> 15 0 24 3416 topology 3610 812 +> 16 0 24 3416 topology 3530 812 +> 15 0 25 3416 topology 3530 813 +> 16 0 25 3416 topology 3528 813 +> 15 0 24 3416 topology 3610 814 +> 16 0 24 3416 topology 3560 814 +> 15 0 25 3416 topology 3560 815 +> 16 0 25 3416 topology 3558 815 +> 15 0 24 3416 topology 3610 816 +> 16 0 24 3416 topology 3590 816 +> 15 0 25 3416 topology 3590 817 +> 16 0 25 3416 topology 3588 817 +> 15 0 24 3416 topology 3610 818 +> 16 0 24 3416 topology 3419 818 +> 15 0 25 3416 topology 3419 819 +> 16 0 25 3416 topology 3417 819 +> 15 0 24 3416 topology 3610 820 +> 16 0 24 3416 topology 3431 820 +> 15 0 25 3416 topology 3431 821 +> 16 0 25 3416 topology 3429 821 +> 15 0 24 3416 topology 3610 822 +> 16 0 24 3416 topology 3443 822 +> 15 0 25 3416 topology 3443 823 +> 16 0 25 3416 topology 3441 823 +> 15 0 24 3416 topology 3610 824 +> 16 0 24 3416 topology 3455 824 +> 15 0 25 3416 topology 3455 825 +> 16 0 25 3416 topology 3453 825 +> 15 0 24 3416 topology 3610 826 +> 16 0 24 3416 topology 3485 826 +> 15 0 25 3416 topology 3485 827 +> 16 0 25 3416 topology 3483 827 +> 15 0 24 3416 topology 3610 828 +> 16 0 24 3416 topology 3515 828 +> 15 0 25 3416 topology 3515 829 +> 16 0 25 3416 topology 3513 829 +> 15 0 24 3416 topology 3610 830 +> 16 0 24 3416 topology 3545 830 +> 15 0 25 3416 topology 3545 831 +> 16 0 25 3416 topology 3543 831 +> 15 0 24 3416 topology 3610 832 +> 16 0 24 3416 topology 3467 832 +> 15 0 25 3416 topology 3467 833 +> 16 0 25 3416 topology 3465 833 +> 15 0 24 3416 topology 3610 834 +> 16 0 24 3416 topology 3575 834 +> 15 0 25 3416 topology 3575 835 +> 16 0 25 3416 topology 3573 835 +> 15 0 24 3416 topology 3610 836 +> 16 0 24 3416 topology 3497 836 +> 15 0 25 3416 topology 3497 837 +> 16 0 25 3416 topology 3495 837 +> 15 0 24 3416 topology 3610 838 +> 16 0 24 3416 topology 3605 838 +> 15 0 25 3416 topology 3605 839 +> 16 0 25 3416 topology 3603 839 +> 15 0 24 3416 topology 3610 840 +> 16 0 24 3416 topology 3527 840 +> 15 0 25 3416 topology 3527 841 +> 16 0 25 3416 topology 3525 841 +> 15 0 24 3416 topology 3610 842 +> 16 0 24 3416 topology 3557 842 +> 15 0 25 3416 topology 3557 843 +> 16 0 25 3416 topology 3555 843 +> 15 0 24 3416 topology 3610 844 +> 16 0 24 3416 topology 3587 844 +> 15 0 25 3416 topology 3587 845 +> 16 0 25 3416 topology 3585 845 +> 15 0 24 3416 topology 3610 846 +> 16 0 24 3416 topology 3428 846 +> 15 0 25 3416 topology 3428 847 +> 16 0 25 3416 topology 3426 847 +> 15 0 24 3416 topology 3610 848 +> 16 0 24 3416 topology 3440 848 +> 15 0 25 3416 topology 3440 849 +> 16 0 25 3416 topology 3438 849 +> 15 0 24 3416 topology 3610 850 +> 16 0 24 3416 topology 3452 850 +> 15 0 25 3416 topology 3452 851 +> 16 0 25 3416 topology 3450 851 +> 15 0 24 3416 topology 3610 852 +> 16 0 24 3416 topology 3482 852 +> 15 0 25 3416 topology 3482 853 +> 16 0 25 3416 topology 3480 853 +> 15 0 24 3416 topology 3610 854 +> 16 0 24 3416 topology 3512 854 +> 15 0 25 3416 topology 3512 855 +> 16 0 25 3416 topology 3510 855 +> 15 0 24 3416 topology 3610 856 +> 16 0 24 3416 topology 3542 856 +> 15 0 25 3416 topology 3542 857 +> 16 0 25 3416 topology 3540 857 +> 15 0 23 3416 topology 3570 858 +> 16 0 23 3416 topology 3571 858 +> 15 0 24 3416 topology 3571 859 +> 16 0 24 3416 topology 3610 859 +> 15 0 24 3416 topology 3610 860 +> 16 0 24 3416 topology 3464 860 +> 15 0 25 3416 topology 3464 861 +> 16 0 25 3416 topology 3462 861 +> 15 0 23 3416 topology 3492 862 +> 16 0 23 3416 topology 3493 862 +> 15 0 24 3416 topology 3493 863 +> 16 0 24 3416 topology 3610 863 +> 15 0 23 3416 topology 3600 864 +> 16 0 23 3416 topology 3601 864 +> 15 0 24 3416 topology 3601 865 +> 16 0 24 3416 topology 3610 865 +> 15 0 23 3416 topology 3522 866 +> 16 0 23 3416 topology 3523 866 +> 15 0 24 3416 topology 3523 867 +> 16 0 24 3416 topology 3610 867 +> 15 0 23 3416 topology 3552 868 +> 16 0 23 3416 topology 3553 868 +> 15 0 24 3416 topology 3553 869 +> 16 0 24 3416 topology 3610 869 +> 15 0 23 3416 topology 3582 870 +> 16 0 23 3416 topology 3583 870 +> 15 0 24 3416 topology 3583 871 +> 16 0 24 3416 topology 3610 871 +> 15 0 23 3416 topology 3423 872 +> 16 0 23 3416 topology 3424 872 +> 15 0 24 3416 topology 3424 873 +> 16 0 24 3416 topology 3610 873 +> 15 0 23 3416 topology 3435 874 +> 16 0 23 3416 topology 3436 874 +> 15 0 24 3416 topology 3436 875 +> 16 0 24 3416 topology 3610 875 +> 15 0 23 3416 topology 3447 876 +> 16 0 23 3416 topology 3448 876 +> 15 0 24 3416 topology 3448 877 +> 16 0 24 3416 topology 3610 877 +> 15 0 23 3416 topology 3477 878 +> 16 0 23 3416 topology 3478 878 +> 15 0 24 3416 topology 3478 879 +> 16 0 24 3416 topology 3610 879 +> 15 0 23 3416 topology 3507 880 +> 16 0 23 3416 topology 3508 880 +> 15 0 24 3416 topology 3508 881 +> 16 0 24 3416 topology 3610 881 +> 15 0 23 3416 topology 3537 882 +> 16 0 23 3416 topology 3538 882 +> 15 0 24 3416 topology 3538 883 +> 16 0 24 3416 topology 3610 883 +> 15 0 23 3416 topology 3459 884 +> 16 0 23 3416 topology 3460 884 +> 15 0 24 3416 topology 3460 885 +> 16 0 24 3416 topology 3610 885 +> 15 0 23 3416 topology 3567 886 +> 16 0 23 3416 topology 3568 886 +> 15 0 24 3416 topology 3568 887 +> 16 0 24 3416 topology 3610 887 +> 15 0 23 3416 topology 3489 888 +> 16 0 23 3416 topology 3490 888 +> 15 0 24 3416 topology 3490 889 +> 16 0 24 3416 topology 3610 889 +> 15 0 23 3416 topology 3597 890 +> 16 0 23 3416 topology 3598 890 +> 15 0 24 3416 topology 3598 891 +> 16 0 24 3416 topology 3610 891 +> 15 0 23 3416 topology 3519 892 +> 16 0 23 3416 topology 3520 892 +> 15 0 24 3416 topology 3520 893 +> 16 0 24 3416 topology 3610 893 +> 15 0 23 3416 topology 3549 894 +> 16 0 23 3416 topology 3550 894 +> 15 0 24 3416 topology 3550 895 +> 16 0 24 3416 topology 3610 895 +> 15 0 23 3416 topology 3471 896 +> 16 0 23 3416 topology 3472 896 +> 15 0 24 3416 topology 3472 897 +> 16 0 24 3416 topology 3610 897 +> 15 0 23 3416 topology 3579 898 +> 16 0 23 3416 topology 3580 898 +> 15 0 24 3416 topology 3580 899 +> 16 0 24 3416 topology 3610 899 +> 15 0 23 3416 topology 3501 900 +> 16 0 23 3416 topology 3502 900 +> 15 0 24 3416 topology 3502 901 +> 16 0 24 3416 topology 3610 901 +> 15 0 23 3416 topology 3531 902 +> 16 0 23 3416 topology 3532 902 +> 15 0 24 3416 topology 3532 903 +> 16 0 24 3416 topology 3610 903 +> 15 0 23 3416 topology 3561 904 +> 16 0 23 3416 topology 3562 904 +> 15 0 24 3416 topology 3562 905 +> 16 0 24 3416 topology 3610 905 +> 15 0 23 3416 topology 3591 906 +> 16 0 23 3416 topology 3592 906 +> 15 0 24 3416 topology 3592 907 +> 16 0 24 3416 topology 3610 907 +> 15 0 23 3416 topology 3420 908 +> 16 0 23 3416 topology 3421 908 +> 15 0 24 3416 topology 3421 909 +> 16 0 24 3416 topology 3610 909 +> 15 0 23 3416 topology 3432 910 +> 16 0 23 3416 topology 3433 910 +> 15 0 24 3416 topology 3433 911 +> 16 0 24 3416 topology 3610 911 +> 15 0 23 3416 topology 3444 912 +> 16 0 23 3416 topology 3445 912 +> 15 0 24 3416 topology 3445 913 +> 16 0 24 3416 topology 3610 913 +> 15 0 23 3416 topology 3474 914 +> 16 0 23 3416 topology 3475 914 +> 15 0 24 3416 topology 3475 915 +> 16 0 24 3416 topology 3610 915 +> 15 0 23 3416 topology 3504 916 +> 16 0 23 3416 topology 3505 916 +> 15 0 24 3416 topology 3505 917 +> 16 0 24 3416 topology 3610 917 +> 15 0 23 3416 topology 3534 918 +> 16 0 23 3416 topology 3535 918 +> 15 0 24 3416 topology 3535 919 +> 16 0 24 3416 topology 3610 919 +> 15 0 23 3416 topology 3456 920 +> 16 0 23 3416 topology 3457 920 +> 15 0 24 3416 topology 3457 921 +> 16 0 24 3416 topology 3610 921 +> 15 0 23 3416 topology 3564 922 +> 16 0 23 3416 topology 3565 922 +> 15 0 24 3416 topology 3565 923 +> 16 0 24 3416 topology 3610 923 +> 15 0 23 3416 topology 3486 924 +> 16 0 23 3416 topology 3487 924 +> 15 0 24 3416 topology 3487 925 +> 16 0 24 3416 topology 3610 925 +> 15 0 23 3416 topology 3594 926 +> 16 0 23 3416 topology 3595 926 +> 15 0 24 3416 topology 3595 927 +> 16 0 24 3416 topology 3610 927 +> 15 0 23 3416 topology 3516 928 +> 16 0 23 3416 topology 3517 928 +> 15 0 24 3416 topology 3517 929 +> 16 0 24 3416 topology 3610 929 +> 15 0 23 3416 topology 3546 930 +> 16 0 23 3416 topology 3547 930 +> 15 0 24 3416 topology 3547 931 +> 16 0 24 3416 topology 3610 931 +> 15 0 23 3416 topology 3468 932 +> 16 0 23 3416 topology 3469 932 +> 15 0 24 3416 topology 3469 933 +> 16 0 24 3416 topology 3610 933 +> 15 0 23 3416 topology 3576 934 +> 16 0 23 3416 topology 3577 934 +> 15 0 24 3416 topology 3577 935 +> 16 0 24 3416 topology 3610 935 +> 15 0 23 3416 topology 3498 936 +> 16 0 23 3416 topology 3499 936 +> 15 0 24 3416 topology 3499 937 +> 16 0 24 3416 topology 3610 937 +> 15 0 23 3416 topology 3606 938 +> 16 0 23 3416 topology 3607 938 +> 15 0 24 3416 topology 3607 939 +> 16 0 24 3416 topology 3610 939 +> 15 0 23 3416 topology 3528 940 +> 16 0 23 3416 topology 3529 940 +> 15 0 24 3416 topology 3529 941 +> 16 0 24 3416 topology 3610 941 +> 15 0 23 3416 topology 3558 942 +> 16 0 23 3416 topology 3559 942 +> 15 0 24 3416 topology 3559 943 +> 16 0 24 3416 topology 3610 943 +> 15 0 23 3416 topology 3588 944 +> 16 0 23 3416 topology 3589 944 +> 15 0 24 3416 topology 3589 945 +> 16 0 24 3416 topology 3610 945 +> 15 0 23 3416 topology 3417 946 +> 16 0 23 3416 topology 3418 946 +> 15 0 24 3416 topology 3418 947 +> 16 0 24 3416 topology 3610 947 +> 15 0 23 3416 topology 3429 948 +> 16 0 23 3416 topology 3430 948 +> 15 0 24 3416 topology 3430 949 +> 16 0 24 3416 topology 3610 949 +> 15 0 23 3416 topology 3441 950 +> 16 0 23 3416 topology 3442 950 +> 15 0 24 3416 topology 3442 951 +> 16 0 24 3416 topology 3610 951 +> 15 0 23 3416 topology 3453 952 +> 16 0 23 3416 topology 3454 952 +> 15 0 24 3416 topology 3454 953 +> 16 0 24 3416 topology 3610 953 +> 15 0 23 3416 topology 3483 954 +> 16 0 23 3416 topology 3484 954 +> 15 0 24 3416 topology 3484 955 +> 16 0 24 3416 topology 3610 955 +> 15 0 23 3416 topology 3513 956 +> 16 0 23 3416 topology 3514 956 +> 15 0 24 3416 topology 3514 957 +> 16 0 24 3416 topology 3610 957 +> 15 0 23 3416 topology 3543 958 +> 16 0 23 3416 topology 3544 958 +> 15 0 24 3416 topology 3544 959 +> 16 0 24 3416 topology 3610 959 +> 15 0 23 3416 topology 3465 960 +> 16 0 23 3416 topology 3466 960 +> 15 0 24 3416 topology 3466 961 +> 16 0 24 3416 topology 3610 961 +> 15 0 23 3416 topology 3573 962 +> 16 0 23 3416 topology 3574 962 +> 15 0 24 3416 topology 3574 963 +> 16 0 24 3416 topology 3610 963 +> 15 0 23 3416 topology 3495 964 +> 16 0 23 3416 topology 3496 964 +> 15 0 24 3416 topology 3496 965 +> 16 0 24 3416 topology 3610 965 +> 15 0 23 3416 topology 3603 966 +> 16 0 23 3416 topology 3604 966 +> 15 0 24 3416 topology 3604 967 +> 16 0 24 3416 topology 3610 967 +> 15 0 23 3416 topology 3525 968 +> 16 0 23 3416 topology 3526 968 +> 15 0 24 3416 topology 3526 969 +> 16 0 24 3416 topology 3610 969 +> 15 0 23 3416 topology 3555 970 +> 16 0 23 3416 topology 3556 970 +> 15 0 24 3416 topology 3556 971 +> 16 0 24 3416 topology 3610 971 +> 15 0 23 3416 topology 3585 972 +> 16 0 23 3416 topology 3586 972 +> 15 0 24 3416 topology 3586 973 +> 16 0 24 3416 topology 3610 973 +> 15 0 23 3416 topology 3426 974 +> 16 0 23 3416 topology 3427 974 +> 15 0 24 3416 topology 3427 975 +> 16 0 24 3416 topology 3610 975 +> 15 0 23 3416 topology 3438 976 +> 16 0 23 3416 topology 3439 976 +> 15 0 24 3416 topology 3439 977 +> 16 0 24 3416 topology 3610 977 +> 15 0 23 3416 topology 3450 978 +> 16 0 23 3416 topology 3451 978 +> 15 0 24 3416 topology 3451 979 +> 16 0 24 3416 topology 3610 979 +> 15 0 23 3416 topology 3480 980 +> 16 0 23 3416 topology 3481 980 +> 15 0 24 3416 topology 3481 981 +> 16 0 24 3416 topology 3610 981 +> 15 0 23 3416 topology 3510 982 +> 16 0 23 3416 topology 3511 982 +> 15 0 24 3416 topology 3511 983 +> 16 0 24 3416 topology 3610 983 +> 15 0 23 3416 topology 3540 984 +> 16 0 23 3416 topology 3541 984 +> 15 0 24 3416 topology 3541 985 +> 16 0 24 3416 topology 3610 985 +> 15 0 23 3612 topology 3640 986 +> 16 0 23 3612 topology 3641 986 +> 15 0 24 3612 topology 3641 987 +> 16 0 24 3612 topology 3713 987 +> 15 0 24 3612 topology 3713 988 +> 16 0 24 3612 topology 3672 988 +> 15 0 25 3612 topology 3672 989 +> 16 0 25 3612 topology 3670 989 +> 15 0 24 3612 topology 3713 990 +> 16 0 24 3612 topology 3702 990 +> 15 0 25 3612 topology 3702 991 +> 16 0 25 3612 topology 3700 991 +> 15 0 24 3612 topology 3713 992 +> 16 0 24 3612 topology 3654 992 +> 15 0 25 3612 topology 3654 993 +> 16 0 25 3612 topology 3652 993 +> 15 0 24 3612 topology 3713 994 +> 16 0 24 3612 topology 3684 994 +> 15 0 25 3612 topology 3684 995 +> 16 0 25 3612 topology 3682 995 +> 15 0 24 3612 topology 3713 996 +> 16 0 24 3612 topology 3666 996 +> 15 0 25 3612 topology 3666 997 +> 16 0 25 3612 topology 3664 997 +> 15 0 24 3612 topology 3713 998 +> 16 0 24 3612 topology 3696 998 +> 15 0 25 3612 topology 3696 999 +> 16 0 25 3612 topology 3694 999 +> 15 0 24 3612 topology 3713 1000 +> 16 0 24 3612 topology 3615 1000 +> 15 0 25 3612 topology 3615 1001 +> 16 0 25 3612 topology 3613 1001 +> 15 0 24 3612 topology 3713 1002 +> 16 0 24 3612 topology 3627 1002 +> 15 0 25 3612 topology 3627 1003 +> 16 0 25 3612 topology 3625 1003 +> 15 0 24 3612 topology 3713 1004 +> 16 0 24 3612 topology 3639 1004 +> 15 0 25 3612 topology 3639 1005 +> 16 0 25 3612 topology 3637 1005 +> 15 0 24 3612 topology 3713 1006 +> 16 0 24 3612 topology 3651 1006 +> 15 0 25 3612 topology 3651 1007 +> 16 0 25 3612 topology 3649 1007 +> 15 0 24 3612 topology 3713 1008 +> 16 0 24 3612 topology 3681 1008 +> 15 0 25 3612 topology 3681 1009 +> 16 0 25 3612 topology 3679 1009 +> 15 0 24 3612 topology 3713 1010 +> 16 0 24 3612 topology 3711 1010 +> 15 0 25 3612 topology 3711 1011 +> 16 0 25 3612 topology 3709 1011 +> 15 0 24 3612 topology 3713 1012 +> 16 0 24 3612 topology 3663 1012 +> 15 0 25 3612 topology 3663 1013 +> 16 0 25 3612 topology 3661 1013 +> 15 0 24 3612 topology 3713 1014 +> 16 0 24 3612 topology 3693 1014 +> 15 0 25 3612 topology 3693 1015 +> 16 0 25 3612 topology 3691 1015 +> 15 0 26 3612 topology 3713 1016 +> 16 0 26 3612 topology 3712 1016 +> 15 0 24 3612 topology 3713 1017 +> 16 0 24 3612 topology 3624 1017 +> 15 0 25 3612 topology 3624 1018 +> 16 0 25 3612 topology 3622 1018 +> 15 0 24 3612 topology 3713 1019 +> 16 0 24 3612 topology 3636 1019 +> 15 0 25 3612 topology 3636 1020 +> 16 0 25 3612 topology 3634 1020 +> 15 0 24 3612 topology 3713 1021 +> 16 0 24 3612 topology 3648 1021 +> 15 0 25 3612 topology 3648 1022 +> 16 0 25 3612 topology 3646 1022 +> 15 0 24 3612 topology 3713 1023 +> 16 0 24 3612 topology 3678 1023 +> 15 0 25 3612 topology 3678 1024 +> 16 0 25 3612 topology 3676 1024 +> 15 0 24 3612 topology 3713 1025 +> 16 0 24 3612 topology 3708 1025 +> 15 0 25 3612 topology 3708 1026 +> 16 0 25 3612 topology 3706 1026 +> 15 0 24 3612 topology 3713 1027 +> 16 0 24 3612 topology 3660 1027 +> 15 0 25 3612 topology 3660 1028 +> 16 0 25 3612 topology 3658 1028 +> 15 0 24 3612 topology 3713 1029 +> 16 0 24 3612 topology 3690 1029 +> 15 0 25 3612 topology 3690 1030 +> 16 0 25 3612 topology 3688 1030 +> 15 0 24 3612 topology 3713 1031 +> 16 0 24 3612 topology 3621 1031 +> 15 0 25 3612 topology 3621 1032 +> 16 0 25 3612 topology 3619 1032 +> 15 0 24 3612 topology 3713 1033 +> 16 0 24 3612 topology 3633 1033 +> 15 0 25 3612 topology 3633 1034 +> 16 0 25 3612 topology 3631 1034 +> 15 0 24 3612 topology 3713 1035 +> 16 0 24 3612 topology 3645 1035 +> 15 0 25 3612 topology 3645 1036 +> 16 0 25 3612 topology 3643 1036 +> 15 0 24 3612 topology 3713 1037 +> 16 0 24 3612 topology 3675 1037 +> 15 0 25 3612 topology 3675 1038 +> 16 0 25 3612 topology 3673 1038 +> 15 0 24 3612 topology 3713 1039 +> 16 0 24 3612 topology 3705 1039 +> 15 0 25 3612 topology 3705 1040 +> 16 0 25 3612 topology 3703 1040 +> 15 0 24 3612 topology 3713 1041 +> 16 0 24 3612 topology 3657 1041 +> 15 0 25 3612 topology 3657 1042 +> 16 0 25 3612 topology 3655 1042 +> 15 0 24 3612 topology 3713 1043 +> 16 0 24 3612 topology 3687 1043 +> 15 0 25 3612 topology 3687 1044 +> 16 0 25 3612 topology 3685 1044 +> 15 0 24 3612 topology 3713 1045 +> 16 0 24 3612 topology 3669 1045 +> 15 0 25 3612 topology 3669 1046 +> 16 0 25 3612 topology 3667 1046 +> 15 0 24 3612 topology 3713 1047 +> 16 0 24 3612 topology 3699 1047 +> 15 0 25 3612 topology 3699 1048 +> 16 0 25 3612 topology 3697 1048 +> 15 0 24 3612 topology 3713 1049 +> 16 0 24 3612 topology 3618 1049 +> 15 0 25 3612 topology 3618 1050 +> 16 0 25 3612 topology 3616 1050 +> 15 0 24 3612 topology 3713 1051 +> 16 0 24 3612 topology 3630 1051 +> 15 0 25 3612 topology 3630 1052 +> 16 0 25 3612 topology 3628 1052 +> 15 0 23 3612 topology 3670 1053 +> 16 0 23 3612 topology 3671 1053 +> 15 0 24 3612 topology 3671 1054 +> 16 0 24 3612 topology 3713 1054 +> 15 0 24 3612 topology 3713 1055 +> 16 0 24 3612 topology 3642 1055 +> 15 0 25 3612 topology 3642 1056 +> 16 0 25 3612 topology 3640 1056 +> 15 0 23 3612 topology 3700 1057 +> 16 0 23 3612 topology 3701 1057 +> 15 0 24 3612 topology 3701 1058 +> 16 0 24 3612 topology 3713 1058 +> 15 0 23 3612 topology 3652 1059 +> 16 0 23 3612 topology 3653 1059 +> 15 0 24 3612 topology 3653 1060 +> 16 0 24 3612 topology 3713 1060 +> 15 0 23 3612 topology 3682 1061 +> 16 0 23 3612 topology 3683 1061 +> 15 0 24 3612 topology 3683 1062 +> 16 0 24 3612 topology 3713 1062 +> 15 0 23 3612 topology 3664 1063 +> 16 0 23 3612 topology 3665 1063 +> 15 0 24 3612 topology 3665 1064 +> 16 0 24 3612 topology 3713 1064 +> 15 0 23 3612 topology 3694 1065 +> 16 0 23 3612 topology 3695 1065 +> 15 0 24 3612 topology 3695 1066 +> 16 0 24 3612 topology 3713 1066 +> 15 0 23 3612 topology 3613 1067 +> 16 0 23 3612 topology 3614 1067 +> 15 0 24 3612 topology 3614 1068 +> 16 0 24 3612 topology 3713 1068 +> 15 0 23 3612 topology 3625 1069 +> 16 0 23 3612 topology 3626 1069 +> 15 0 24 3612 topology 3626 1070 +> 16 0 24 3612 topology 3713 1070 +> 15 0 23 3612 topology 3637 1071 +> 16 0 23 3612 topology 3638 1071 +> 15 0 24 3612 topology 3638 1072 +> 16 0 24 3612 topology 3713 1072 +> 15 0 23 3612 topology 3649 1073 +> 16 0 23 3612 topology 3650 1073 +> 15 0 24 3612 topology 3650 1074 +> 16 0 24 3612 topology 3713 1074 +> 15 0 23 3612 topology 3679 1075 +> 16 0 23 3612 topology 3680 1075 +> 15 0 24 3612 topology 3680 1076 +> 16 0 24 3612 topology 3713 1076 +> 15 0 23 3612 topology 3709 1077 +> 16 0 23 3612 topology 3710 1077 +> 15 0 24 3612 topology 3710 1078 +> 16 0 24 3612 topology 3713 1078 +> 15 0 23 3612 topology 3661 1079 +> 16 0 23 3612 topology 3662 1079 +> 15 0 24 3612 topology 3662 1080 +> 16 0 24 3612 topology 3713 1080 +> 15 0 23 3612 topology 3691 1081 +> 16 0 23 3612 topology 3692 1081 +> 15 0 24 3612 topology 3692 1082 +> 16 0 24 3612 topology 3713 1082 +> 15 0 23 3612 topology 3622 1083 +> 16 0 23 3612 topology 3623 1083 +> 15 0 24 3612 topology 3623 1084 +> 16 0 24 3612 topology 3713 1084 +> 15 0 23 3612 topology 3634 1085 +> 16 0 23 3612 topology 3635 1085 +> 15 0 24 3612 topology 3635 1086 +> 16 0 24 3612 topology 3713 1086 +> 15 0 23 3612 topology 3646 1087 +> 16 0 23 3612 topology 3647 1087 +> 15 0 24 3612 topology 3647 1088 +> 16 0 24 3612 topology 3713 1088 +> 15 0 23 3612 topology 3676 1089 +> 16 0 23 3612 topology 3677 1089 +> 15 0 24 3612 topology 3677 1090 +> 16 0 24 3612 topology 3713 1090 +> 15 0 23 3612 topology 3706 1091 +> 16 0 23 3612 topology 3707 1091 +> 15 0 24 3612 topology 3707 1092 +> 16 0 24 3612 topology 3713 1092 +> 15 0 23 3612 topology 3658 1093 +> 16 0 23 3612 topology 3659 1093 +> 15 0 24 3612 topology 3659 1094 +> 16 0 24 3612 topology 3713 1094 +> 15 0 23 3612 topology 3688 1095 +> 16 0 23 3612 topology 3689 1095 +> 15 0 24 3612 topology 3689 1096 +> 16 0 24 3612 topology 3713 1096 +> 15 0 23 3612 topology 3619 1097 +> 16 0 23 3612 topology 3620 1097 +> 15 0 24 3612 topology 3620 1098 +> 16 0 24 3612 topology 3713 1098 +> 15 0 23 3612 topology 3631 1099 +> 16 0 23 3612 topology 3632 1099 +> 15 0 24 3612 topology 3632 1100 +> 16 0 24 3612 topology 3713 1100 +> 15 0 23 3612 topology 3643 1101 +> 16 0 23 3612 topology 3644 1101 +> 15 0 24 3612 topology 3644 1102 +> 16 0 24 3612 topology 3713 1102 +> 15 0 23 3612 topology 3673 1103 +> 16 0 23 3612 topology 3674 1103 +> 15 0 24 3612 topology 3674 1104 +> 16 0 24 3612 topology 3713 1104 +> 15 0 23 3612 topology 3703 1105 +> 16 0 23 3612 topology 3704 1105 +> 15 0 24 3612 topology 3704 1106 +> 16 0 24 3612 topology 3713 1106 +> 15 0 23 3612 topology 3655 1107 +> 16 0 23 3612 topology 3656 1107 +> 15 0 24 3612 topology 3656 1108 +> 16 0 24 3612 topology 3713 1108 +> 15 0 23 3612 topology 3685 1109 +> 16 0 23 3612 topology 3686 1109 +> 15 0 24 3612 topology 3686 1110 +> 16 0 24 3612 topology 3713 1110 +> 15 0 23 3612 topology 3667 1111 +> 16 0 23 3612 topology 3668 1111 +> 15 0 24 3612 topology 3668 1112 +> 16 0 24 3612 topology 3713 1112 +> 15 0 23 3612 topology 3697 1113 +> 16 0 23 3612 topology 3698 1113 +> 15 0 24 3612 topology 3698 1114 +> 16 0 24 3612 topology 3713 1114 +> 15 0 23 3612 topology 3616 1115 +> 16 0 23 3612 topology 3617 1115 +> 15 0 24 3612 topology 3617 1116 +> 16 0 24 3612 topology 3713 1116 +> 15 0 23 3612 topology 3628 1117 +> 16 0 23 3612 topology 3629 1117 +> 15 0 24 3612 topology 3629 1118 +> 16 0 24 3612 topology 3713 1118 +> 15 0 23 3715 topology 3725 1119 +> 16 0 23 3715 topology 3726 1119 +> 15 0 24 3715 topology 3726 1120 +> 16 0 24 3715 topology 3792 1120 +> 15 0 24 3715 topology 3792 1121 +> 16 0 24 3715 topology 3739 1121 +> 15 0 25 3715 topology 3739 1122 +> 16 0 25 3715 topology 3737 1122 +> 15 0 24 3715 topology 3792 1123 +> 16 0 24 3715 topology 3748 1123 +> 15 0 25 3715 topology 3748 1124 +> 16 0 25 3715 topology 3746 1124 +> 15 0 24 3715 topology 3792 1125 +> 16 0 24 3715 topology 3778 1125 +> 15 0 25 3715 topology 3778 1126 +> 16 0 25 3715 topology 3776 1126 +> 15 0 24 3715 topology 3792 1127 +> 16 0 24 3715 topology 3760 1127 +> 15 0 25 3715 topology 3760 1128 +> 16 0 25 3715 topology 3758 1128 +> 15 0 24 3715 topology 3792 1129 +> 16 0 24 3715 topology 3790 1129 +> 15 0 25 3715 topology 3790 1130 +> 16 0 25 3715 topology 3788 1130 +> 15 0 24 3715 topology 3792 1131 +> 16 0 24 3715 topology 3772 1131 +> 15 0 25 3715 topology 3772 1132 +> 16 0 25 3715 topology 3770 1132 +> 15 0 24 3715 topology 3792 1133 +> 16 0 24 3715 topology 3724 1133 +> 15 0 25 3715 topology 3724 1134 +> 16 0 25 3715 topology 3722 1134 +> 15 0 24 3715 topology 3792 1135 +> 16 0 24 3715 topology 3736 1135 +> 15 0 25 3715 topology 3736 1136 +> 16 0 25 3715 topology 3734 1136 +> 15 0 26 3715 topology 3792 1137 +> 16 0 26 3715 topology 3791 1137 +> 15 0 24 3715 topology 3792 1138 +> 16 0 24 3715 topology 3745 1138 +> 15 0 25 3715 topology 3745 1139 +> 16 0 25 3715 topology 3743 1139 +> 15 0 24 3715 topology 3792 1140 +> 16 0 24 3715 topology 3775 1140 +> 15 0 25 3715 topology 3775 1141 +> 16 0 25 3715 topology 3773 1141 +> 15 0 24 3715 topology 3792 1142 +> 16 0 24 3715 topology 3757 1142 +> 15 0 25 3715 topology 3757 1143 +> 16 0 25 3715 topology 3755 1143 +> 15 0 24 3715 topology 3792 1144 +> 16 0 24 3715 topology 3787 1144 +> 15 0 25 3715 topology 3787 1145 +> 16 0 25 3715 topology 3785 1145 +> 15 0 24 3715 topology 3792 1146 +> 16 0 24 3715 topology 3769 1146 +> 15 0 25 3715 topology 3769 1147 +> 16 0 25 3715 topology 3767 1147 +> 15 0 24 3715 topology 3792 1148 +> 16 0 24 3715 topology 3721 1148 +> 15 0 25 3715 topology 3721 1149 +> 16 0 25 3715 topology 3719 1149 +> 15 0 24 3715 topology 3792 1150 +> 16 0 24 3715 topology 3733 1150 +> 15 0 25 3715 topology 3733 1151 +> 16 0 25 3715 topology 3731 1151 +> 15 0 24 3715 topology 3792 1152 +> 16 0 24 3715 topology 3754 1152 +> 15 0 25 3715 topology 3754 1153 +> 16 0 25 3715 topology 3752 1153 +> 15 0 24 3715 topology 3792 1154 +> 16 0 24 3715 topology 3784 1154 +> 15 0 25 3715 topology 3784 1155 +> 16 0 25 3715 topology 3782 1155 +> 15 0 24 3715 topology 3792 1156 +> 16 0 24 3715 topology 3766 1156 +> 15 0 25 3715 topology 3766 1157 +> 16 0 25 3715 topology 3764 1157 +> 15 0 24 3715 topology 3792 1158 +> 16 0 24 3715 topology 3718 1158 +> 15 0 25 3715 topology 3718 1159 +> 16 0 25 3715 topology 3716 1159 +> 15 0 24 3715 topology 3792 1160 +> 16 0 24 3715 topology 3730 1160 +> 15 0 25 3715 topology 3730 1161 +> 16 0 25 3715 topology 3728 1161 +> 15 0 24 3715 topology 3792 1162 +> 16 0 24 3715 topology 3742 1162 +> 15 0 25 3715 topology 3742 1163 +> 16 0 25 3715 topology 3740 1163 +> 15 0 24 3715 topology 3792 1164 +> 16 0 24 3715 topology 3751 1164 +> 15 0 25 3715 topology 3751 1165 +> 16 0 25 3715 topology 3749 1165 +> 15 0 24 3715 topology 3792 1166 +> 16 0 24 3715 topology 3781 1166 +> 15 0 25 3715 topology 3781 1167 +> 16 0 25 3715 topology 3779 1167 +> 15 0 24 3715 topology 3792 1168 +> 16 0 24 3715 topology 3763 1168 +> 15 0 25 3715 topology 3763 1169 +> 16 0 25 3715 topology 3761 1169 +> 15 0 23 3715 topology 3737 1170 +> 16 0 23 3715 topology 3738 1170 +> 15 0 24 3715 topology 3738 1171 +> 16 0 24 3715 topology 3792 1171 +> 15 0 24 3715 topology 3792 1172 +> 16 0 24 3715 topology 3727 1172 +> 15 0 25 3715 topology 3727 1173 +> 16 0 25 3715 topology 3725 1173 +> 15 0 23 3715 topology 3746 1174 +> 16 0 23 3715 topology 3747 1174 +> 15 0 24 3715 topology 3747 1175 +> 16 0 24 3715 topology 3792 1175 +> 15 0 23 3715 topology 3776 1176 +> 16 0 23 3715 topology 3777 1176 +> 15 0 24 3715 topology 3777 1177 +> 16 0 24 3715 topology 3792 1177 +> 15 0 23 3715 topology 3758 1178 +> 16 0 23 3715 topology 3759 1178 +> 15 0 24 3715 topology 3759 1179 +> 16 0 24 3715 topology 3792 1179 +> 15 0 23 3715 topology 3788 1180 +> 16 0 23 3715 topology 3789 1180 +> 15 0 24 3715 topology 3789 1181 +> 16 0 24 3715 topology 3792 1181 +> 15 0 23 3715 topology 3770 1182 +> 16 0 23 3715 topology 3771 1182 +> 15 0 24 3715 topology 3771 1183 +> 16 0 24 3715 topology 3792 1183 +> 15 0 23 3715 topology 3722 1184 +> 16 0 23 3715 topology 3723 1184 +> 15 0 24 3715 topology 3723 1185 +> 16 0 24 3715 topology 3792 1185 +> 15 0 23 3715 topology 3734 1186 +> 16 0 23 3715 topology 3735 1186 +> 15 0 24 3715 topology 3735 1187 +> 16 0 24 3715 topology 3792 1187 +> 15 0 23 3715 topology 3743 1188 +> 16 0 23 3715 topology 3744 1188 +> 15 0 24 3715 topology 3744 1189 +> 16 0 24 3715 topology 3792 1189 +> 15 0 23 3715 topology 3773 1190 +> 16 0 23 3715 topology 3774 1190 +> 15 0 24 3715 topology 3774 1191 +> 16 0 24 3715 topology 3792 1191 +> 15 0 23 3715 topology 3755 1192 +> 16 0 23 3715 topology 3756 1192 +> 15 0 24 3715 topology 3756 1193 +> 16 0 24 3715 topology 3792 1193 +> 15 0 23 3715 topology 3785 1194 +> 16 0 23 3715 topology 3786 1194 +> 15 0 24 3715 topology 3786 1195 +> 16 0 24 3715 topology 3792 1195 +> 15 0 23 3715 topology 3767 1196 +> 16 0 23 3715 topology 3768 1196 +> 15 0 24 3715 topology 3768 1197 +> 16 0 24 3715 topology 3792 1197 +> 15 0 23 3715 topology 3719 1198 +> 16 0 23 3715 topology 3720 1198 +> 15 0 24 3715 topology 3720 1199 +> 16 0 24 3715 topology 3792 1199 +> 15 0 23 3715 topology 3731 1200 +> 16 0 23 3715 topology 3732 1200 +> 15 0 24 3715 topology 3732 1201 +> 16 0 24 3715 topology 3792 1201 +> 15 0 23 3715 topology 3752 1202 +> 16 0 23 3715 topology 3753 1202 +> 15 0 24 3715 topology 3753 1203 +> 16 0 24 3715 topology 3792 1203 +> 15 0 23 3715 topology 3782 1204 +> 16 0 23 3715 topology 3783 1204 +> 15 0 24 3715 topology 3783 1205 +> 16 0 24 3715 topology 3792 1205 +> 15 0 23 3715 topology 3764 1206 +> 16 0 23 3715 topology 3765 1206 +> 15 0 24 3715 topology 3765 1207 +> 16 0 24 3715 topology 3792 1207 +> 15 0 23 3715 topology 3716 1208 +> 16 0 23 3715 topology 3717 1208 +> 15 0 24 3715 topology 3717 1209 +> 16 0 24 3715 topology 3792 1209 +> 15 0 23 3715 topology 3728 1210 +> 16 0 23 3715 topology 3729 1210 +> 15 0 24 3715 topology 3729 1211 +> 16 0 24 3715 topology 3792 1211 +> 15 0 23 3715 topology 3740 1212 +> 16 0 23 3715 topology 3741 1212 +> 15 0 24 3715 topology 3741 1213 +> 16 0 24 3715 topology 3792 1213 +> 15 0 23 3715 topology 3749 1214 +> 16 0 23 3715 topology 3750 1214 +> 15 0 24 3715 topology 3750 1215 +> 16 0 24 3715 topology 3792 1215 +> 15 0 23 3715 topology 3779 1216 +> 16 0 23 3715 topology 3780 1216 +> 15 0 24 3715 topology 3780 1217 +> 16 0 24 3715 topology 3792 1217 +> 15 0 23 3715 topology 3761 1218 +> 16 0 23 3715 topology 3762 1218 +> 15 0 24 3715 topology 3762 1219 +> 16 0 24 3715 topology 3792 1219 +> 15 0 27 3415 topology 3919 1220 +> 16 0 27 3415 topology 3917 1220 +> 15 0 28 3415 topology 3917 1221 +> 16 0 28 3415 topology 3915 1221 +> 15 0 27 3415 topology 3919 1222 +> 16 0 27 3415 topology 3611 1222 +> 15 0 28 3415 topology 3611 1223 +> 16 0 28 3415 topology 3609 1223 +> 15 0 27 3415 topology 3919 1224 +> 16 0 27 3415 topology 3714 1224 +> 15 0 28 3415 topology 3714 1225 +> 16 0 28 3415 topology 3712 1225 +> 15 0 27 3415 topology 3919 1226 +> 16 0 27 3415 topology 3793 1226 +> 15 0 28 3415 topology 3793 1227 +> 16 0 28 3415 topology 3791 1227 +> 15 0 21 3415 topology 3917 1228 +> 16 0 21 3415 topology 3611 1228 +> 15 0 21 3415 topology 3917 1229 +> 16 0 21 3415 topology 3714 1229 +> 15 0 21 3415 topology 3917 1230 +> 16 0 21 3415 topology 3793 1230 +> 15 0 21 3415 topology 3611 1231 +> 16 0 21 3415 topology 3714 1231 +> 15 0 21 3415 topology 3611 1232 +> 16 0 21 3415 topology 3793 1232 +> 15 0 21 3415 topology 3714 1233 +> 16 0 21 3415 topology 3793 1233 +> 15 0 23 540 topology 628 1234 +> 16 0 23 540 topology 629 1234 +> 15 0 24 540 topology 629 1235 +> 16 0 24 540 topology 758 1235 +> 15 0 24 540 topology 758 1236 +> 16 0 24 540 topology 582 1236 +> 15 0 25 540 topology 582 1237 +> 16 0 25 540 topology 580 1237 +> 15 0 24 540 topology 758 1238 +> 16 0 24 540 topology 666 1238 +> 15 0 25 540 topology 666 1239 +> 16 0 25 540 topology 664 1239 +> 15 0 24 540 topology 758 1240 +> 16 0 24 540 topology 750 1240 +> 15 0 25 540 topology 750 1241 +> 16 0 25 540 topology 748 1241 +> 15 0 24 540 topology 758 1242 +> 16 0 24 540 topology 618 1242 +> 15 0 25 540 topology 618 1243 +> 16 0 25 540 topology 616 1243 +> 15 0 24 540 topology 758 1244 +> 16 0 24 540 topology 702 1244 +> 15 0 25 540 topology 702 1245 +> 16 0 25 540 topology 700 1245 +> 15 0 24 540 topology 758 1246 +> 16 0 24 540 topology 654 1246 +> 15 0 25 540 topology 654 1247 +> 16 0 25 540 topology 652 1247 +> 15 0 24 540 topology 758 1248 +> 16 0 24 540 topology 738 1248 +> 15 0 25 540 topology 738 1249 +> 16 0 25 540 topology 736 1249 +> 15 0 24 540 topology 758 1250 +> 16 0 24 540 topology 564 1250 +> 15 0 25 540 topology 564 1251 +> 16 0 25 540 topology 562 1251 +> 15 0 24 540 topology 758 1252 +> 16 0 24 540 topology 573 1252 +> 15 0 25 540 topology 573 1253 +> 16 0 25 540 topology 571 1253 +> 15 0 24 540 topology 758 1254 +> 16 0 24 540 topology 609 1254 +> 15 0 25 540 topology 609 1255 +> 16 0 25 540 topology 607 1255 +> 15 0 24 540 topology 758 1256 +> 16 0 24 540 topology 693 1256 +> 15 0 25 540 topology 693 1257 +> 16 0 25 540 topology 691 1257 +> 15 0 24 540 topology 758 1258 +> 16 0 24 540 topology 645 1258 +> 15 0 25 540 topology 645 1259 +> 16 0 25 540 topology 643 1259 +> 15 0 24 540 topology 758 1260 +> 16 0 24 540 topology 729 1260 +> 15 0 25 540 topology 729 1261 +> 16 0 25 540 topology 727 1261 +> 15 0 24 540 topology 758 1262 +> 16 0 24 540 topology 597 1262 +> 15 0 25 540 topology 597 1263 +> 16 0 25 540 topology 595 1263 +> 15 0 24 540 topology 758 1264 +> 16 0 24 540 topology 681 1264 +> 15 0 25 540 topology 681 1265 +> 16 0 25 540 topology 679 1265 +> 15 0 24 540 topology 758 1266 +> 16 0 24 540 topology 717 1266 +> 15 0 25 540 topology 717 1267 +> 16 0 25 540 topology 715 1267 +> 15 0 24 540 topology 758 1268 +> 16 0 24 540 topology 555 1268 +> 15 0 25 540 topology 555 1269 +> 16 0 25 540 topology 553 1269 +> 15 0 24 540 topology 758 1270 +> 16 0 24 540 topology 600 1270 +> 15 0 25 540 topology 600 1271 +> 16 0 25 540 topology 598 1271 +> 15 0 24 540 topology 758 1272 +> 16 0 24 540 topology 636 1272 +> 15 0 25 540 topology 636 1273 +> 16 0 25 540 topology 634 1273 +> 15 0 24 540 topology 758 1274 +> 16 0 24 540 topology 720 1274 +> 15 0 25 540 topology 720 1275 +> 16 0 25 540 topology 718 1275 +> 15 0 24 540 topology 758 1276 +> 16 0 24 540 topology 588 1276 +> 15 0 25 540 topology 588 1277 +> 16 0 25 540 topology 586 1277 +> 15 0 24 540 topology 758 1278 +> 16 0 24 540 topology 672 1278 +> 15 0 25 540 topology 672 1279 +> 16 0 25 540 topology 670 1279 +> 15 0 24 540 topology 758 1280 +> 16 0 24 540 topology 756 1280 +> 15 0 25 540 topology 756 1281 +> 16 0 25 540 topology 754 1281 +> 15 0 24 540 topology 758 1282 +> 16 0 24 540 topology 624 1282 +> 15 0 25 540 topology 624 1283 +> 16 0 25 540 topology 622 1283 +> 15 0 24 540 topology 758 1284 +> 16 0 24 540 topology 708 1284 +> 15 0 25 540 topology 708 1285 +> 16 0 25 540 topology 706 1285 +> 15 0 24 540 topology 758 1286 +> 16 0 24 540 topology 744 1286 +> 15 0 25 540 topology 744 1287 +> 16 0 25 540 topology 742 1287 +> 15 0 24 540 topology 758 1288 +> 16 0 24 540 topology 546 1288 +> 15 0 25 540 topology 546 1289 +> 16 0 25 540 topology 544 1289 +> 15 0 24 540 topology 758 1290 +> 16 0 24 540 topology 579 1290 +> 15 0 25 540 topology 579 1291 +> 16 0 25 540 topology 577 1291 +> 15 0 24 540 topology 758 1292 +> 16 0 24 540 topology 663 1292 +> 15 0 25 540 topology 663 1293 +> 16 0 25 540 topology 661 1293 +> 15 0 24 540 topology 758 1294 +> 16 0 24 540 topology 615 1294 +> 15 0 25 540 topology 615 1295 +> 16 0 25 540 topology 613 1295 +> 15 0 24 540 topology 758 1296 +> 16 0 24 540 topology 699 1296 +> 15 0 25 540 topology 699 1297 +> 16 0 25 540 topology 697 1297 +> 15 0 24 540 topology 758 1298 +> 16 0 24 540 topology 651 1298 +> 15 0 25 540 topology 651 1299 +> 16 0 25 540 topology 649 1299 +> 15 0 24 540 topology 758 1300 +> 16 0 24 540 topology 735 1300 +> 15 0 25 540 topology 735 1301 +> 16 0 25 540 topology 733 1301 +> 15 0 24 540 topology 758 1302 +> 16 0 24 540 topology 687 1302 +> 15 0 25 540 topology 687 1303 +> 16 0 25 540 topology 685 1303 +> 15 0 24 540 topology 758 1304 +> 16 0 24 540 topology 561 1304 +> 15 0 25 540 topology 561 1305 +> 16 0 25 540 topology 559 1305 +> 15 0 24 540 topology 758 1306 +> 16 0 24 540 topology 570 1306 +> 15 0 25 540 topology 570 1307 +> 16 0 25 540 topology 568 1307 +> 15 0 24 540 topology 758 1308 +> 16 0 24 540 topology 606 1308 +> 15 0 25 540 topology 606 1309 +> 16 0 25 540 topology 604 1309 +> 15 0 24 540 topology 758 1310 +> 16 0 24 540 topology 690 1310 +> 15 0 25 540 topology 690 1311 +> 16 0 25 540 topology 688 1311 +> 15 0 24 540 topology 758 1312 +> 16 0 24 540 topology 642 1312 +> 15 0 25 540 topology 642 1313 +> 16 0 25 540 topology 640 1313 +> 15 0 24 540 topology 758 1314 +> 16 0 24 540 topology 726 1314 +> 15 0 25 540 topology 726 1315 +> 16 0 25 540 topology 724 1315 +> 15 0 24 540 topology 758 1316 +> 16 0 24 540 topology 594 1316 +> 15 0 25 540 topology 594 1317 +> 16 0 25 540 topology 592 1317 +> 15 0 24 540 topology 758 1318 +> 16 0 24 540 topology 678 1318 +> 15 0 25 540 topology 678 1319 +> 16 0 25 540 topology 676 1319 +> 15 0 24 540 topology 758 1320 +> 16 0 24 540 topology 714 1320 +> 15 0 25 540 topology 714 1321 +> 16 0 25 540 topology 712 1321 +> 15 0 26 540 topology 758 1322 +> 16 0 26 540 topology 757 1322 +> 15 0 24 540 topology 758 1323 +> 16 0 24 540 topology 552 1323 +> 15 0 25 540 topology 552 1324 +> 16 0 25 540 topology 550 1324 +> 15 0 24 540 topology 758 1325 +> 16 0 24 540 topology 633 1325 +> 15 0 25 540 topology 633 1326 +> 16 0 25 540 topology 631 1326 +> 15 0 24 540 topology 758 1327 +> 16 0 24 540 topology 585 1327 +> 15 0 25 540 topology 585 1328 +> 16 0 25 540 topology 583 1328 +> 15 0 24 540 topology 758 1329 +> 16 0 24 540 topology 669 1329 +> 15 0 25 540 topology 669 1330 +> 16 0 25 540 topology 667 1330 +> 15 0 24 540 topology 758 1331 +> 16 0 24 540 topology 753 1331 +> 15 0 25 540 topology 753 1332 +> 16 0 25 540 topology 751 1332 +> 15 0 24 540 topology 758 1333 +> 16 0 24 540 topology 621 1333 +> 15 0 25 540 topology 621 1334 +> 16 0 25 540 topology 619 1334 +> 15 0 24 540 topology 758 1335 +> 16 0 24 540 topology 705 1335 +> 15 0 25 540 topology 705 1336 +> 16 0 25 540 topology 703 1336 +> 15 0 24 540 topology 758 1337 +> 16 0 24 540 topology 657 1337 +> 15 0 25 540 topology 657 1338 +> 16 0 25 540 topology 655 1338 +> 15 0 24 540 topology 758 1339 +> 16 0 24 540 topology 741 1339 +> 15 0 25 540 topology 741 1340 +> 16 0 25 540 topology 739 1340 +> 15 0 24 540 topology 758 1341 +> 16 0 24 540 topology 543 1341 +> 15 0 25 540 topology 543 1342 +> 16 0 25 540 topology 541 1342 +> 15 0 24 540 topology 758 1343 +> 16 0 24 540 topology 567 1343 +> 15 0 25 540 topology 567 1344 +> 16 0 25 540 topology 565 1344 +> 15 0 24 540 topology 758 1345 +> 16 0 24 540 topology 576 1345 +> 15 0 25 540 topology 576 1346 +> 16 0 25 540 topology 574 1346 +> 15 0 24 540 topology 758 1347 +> 16 0 24 540 topology 660 1347 +> 15 0 25 540 topology 660 1348 +> 16 0 25 540 topology 658 1348 +> 15 0 24 540 topology 758 1349 +> 16 0 24 540 topology 612 1349 +> 15 0 25 540 topology 612 1350 +> 16 0 25 540 topology 610 1350 +> 15 0 24 540 topology 758 1351 +> 16 0 24 540 topology 696 1351 +> 15 0 25 540 topology 696 1352 +> 16 0 25 540 topology 694 1352 +> 15 0 24 540 topology 758 1353 +> 16 0 24 540 topology 648 1353 +> 15 0 25 540 topology 648 1354 +> 16 0 25 540 topology 646 1354 +> 15 0 24 540 topology 758 1355 +> 16 0 24 540 topology 732 1355 +> 15 0 25 540 topology 732 1356 +> 16 0 25 540 topology 730 1356 +> 15 0 24 540 topology 758 1357 +> 16 0 24 540 topology 684 1357 +> 15 0 25 540 topology 684 1358 +> 16 0 25 540 topology 682 1358 +> 15 0 24 540 topology 758 1359 +> 16 0 24 540 topology 558 1359 +> 15 0 25 540 topology 558 1360 +> 16 0 25 540 topology 556 1360 +> 15 0 24 540 topology 758 1361 +> 16 0 24 540 topology 603 1361 +> 15 0 25 540 topology 603 1362 +> 16 0 25 540 topology 601 1362 +> 15 0 24 540 topology 758 1363 +> 16 0 24 540 topology 639 1363 +> 15 0 25 540 topology 639 1364 +> 16 0 25 540 topology 637 1364 +> 15 0 24 540 topology 758 1365 +> 16 0 24 540 topology 723 1365 +> 15 0 25 540 topology 723 1366 +> 16 0 25 540 topology 721 1366 +> 15 0 24 540 topology 758 1367 +> 16 0 24 540 topology 591 1367 +> 15 0 25 540 topology 591 1368 +> 16 0 25 540 topology 589 1368 +> 15 0 24 540 topology 758 1369 +> 16 0 24 540 topology 675 1369 +> 15 0 25 540 topology 675 1370 +> 16 0 25 540 topology 673 1370 +> 15 0 24 540 topology 758 1371 +> 16 0 24 540 topology 627 1371 +> 15 0 25 540 topology 627 1372 +> 16 0 25 540 topology 625 1372 +> 15 0 24 540 topology 758 1373 +> 16 0 24 540 topology 711 1373 +> 15 0 25 540 topology 711 1374 +> 16 0 25 540 topology 709 1374 +> 15 0 24 540 topology 758 1375 +> 16 0 24 540 topology 747 1375 +> 15 0 25 540 topology 747 1376 +> 16 0 25 540 topology 745 1376 +> 15 0 24 540 topology 758 1377 +> 16 0 24 540 topology 549 1377 +> 15 0 25 540 topology 549 1378 +> 16 0 25 540 topology 547 1378 +> 15 0 23 540 topology 580 1379 +> 16 0 23 540 topology 581 1379 +> 15 0 24 540 topology 581 1380 +> 16 0 24 540 topology 758 1380 +> 15 0 24 540 topology 758 1381 +> 16 0 24 540 topology 630 1381 +> 15 0 25 540 topology 630 1382 +> 16 0 25 540 topology 628 1382 +> 15 0 23 540 topology 664 1383 +> 16 0 23 540 topology 665 1383 +> 15 0 24 540 topology 665 1384 +> 16 0 24 540 topology 758 1384 +> 15 0 23 540 topology 748 1385 +> 16 0 23 540 topology 749 1385 +> 15 0 24 540 topology 749 1386 +> 16 0 24 540 topology 758 1386 +> 15 0 23 540 topology 616 1387 +> 16 0 23 540 topology 617 1387 +> 15 0 24 540 topology 617 1388 +> 16 0 24 540 topology 758 1388 +> 15 0 23 540 topology 700 1389 +> 16 0 23 540 topology 701 1389 +> 15 0 24 540 topology 701 1390 +> 16 0 24 540 topology 758 1390 +> 15 0 23 540 topology 652 1391 +> 16 0 23 540 topology 653 1391 +> 15 0 24 540 topology 653 1392 +> 16 0 24 540 topology 758 1392 +> 15 0 23 540 topology 736 1393 +> 16 0 23 540 topology 737 1393 +> 15 0 24 540 topology 737 1394 +> 16 0 24 540 topology 758 1394 +> 15 0 23 540 topology 562 1395 +> 16 0 23 540 topology 563 1395 +> 15 0 24 540 topology 563 1396 +> 16 0 24 540 topology 758 1396 +> 15 0 23 540 topology 571 1397 +> 16 0 23 540 topology 572 1397 +> 15 0 24 540 topology 572 1398 +> 16 0 24 540 topology 758 1398 +> 15 0 23 540 topology 607 1399 +> 16 0 23 540 topology 608 1399 +> 15 0 24 540 topology 608 1400 +> 16 0 24 540 topology 758 1400 +> 15 0 23 540 topology 691 1401 +> 16 0 23 540 topology 692 1401 +> 15 0 24 540 topology 692 1402 +> 16 0 24 540 topology 758 1402 +> 15 0 23 540 topology 643 1403 +> 16 0 23 540 topology 644 1403 +> 15 0 24 540 topology 644 1404 +> 16 0 24 540 topology 758 1404 +> 15 0 23 540 topology 727 1405 +> 16 0 23 540 topology 728 1405 +> 15 0 24 540 topology 728 1406 +> 16 0 24 540 topology 758 1406 +> 15 0 23 540 topology 595 1407 +> 16 0 23 540 topology 596 1407 +> 15 0 24 540 topology 596 1408 +> 16 0 24 540 topology 758 1408 +> 15 0 23 540 topology 679 1409 +> 16 0 23 540 topology 680 1409 +> 15 0 24 540 topology 680 1410 +> 16 0 24 540 topology 758 1410 +> 15 0 23 540 topology 715 1411 +> 16 0 23 540 topology 716 1411 +> 15 0 24 540 topology 716 1412 +> 16 0 24 540 topology 758 1412 +> 15 0 23 540 topology 553 1413 +> 16 0 23 540 topology 554 1413 +> 15 0 24 540 topology 554 1414 +> 16 0 24 540 topology 758 1414 +> 15 0 23 540 topology 598 1415 +> 16 0 23 540 topology 599 1415 +> 15 0 24 540 topology 599 1416 +> 16 0 24 540 topology 758 1416 +> 15 0 23 540 topology 634 1417 +> 16 0 23 540 topology 635 1417 +> 15 0 24 540 topology 635 1418 +> 16 0 24 540 topology 758 1418 +> 15 0 23 540 topology 718 1419 +> 16 0 23 540 topology 719 1419 +> 15 0 24 540 topology 719 1420 +> 16 0 24 540 topology 758 1420 +> 15 0 23 540 topology 586 1421 +> 16 0 23 540 topology 587 1421 +> 15 0 24 540 topology 587 1422 +> 16 0 24 540 topology 758 1422 +> 15 0 23 540 topology 670 1423 +> 16 0 23 540 topology 671 1423 +> 15 0 24 540 topology 671 1424 +> 16 0 24 540 topology 758 1424 +> 15 0 23 540 topology 754 1425 +> 16 0 23 540 topology 755 1425 +> 15 0 24 540 topology 755 1426 +> 16 0 24 540 topology 758 1426 +> 15 0 23 540 topology 622 1427 +> 16 0 23 540 topology 623 1427 +> 15 0 24 540 topology 623 1428 +> 16 0 24 540 topology 758 1428 +> 15 0 23 540 topology 706 1429 +> 16 0 23 540 topology 707 1429 +> 15 0 24 540 topology 707 1430 +> 16 0 24 540 topology 758 1430 +> 15 0 23 540 topology 742 1431 +> 16 0 23 540 topology 743 1431 +> 15 0 24 540 topology 743 1432 +> 16 0 24 540 topology 758 1432 +> 15 0 23 540 topology 544 1433 +> 16 0 23 540 topology 545 1433 +> 15 0 24 540 topology 545 1434 +> 16 0 24 540 topology 758 1434 +> 15 0 23 540 topology 577 1435 +> 16 0 23 540 topology 578 1435 +> 15 0 24 540 topology 578 1436 +> 16 0 24 540 topology 758 1436 +> 15 0 23 540 topology 661 1437 +> 16 0 23 540 topology 662 1437 +> 15 0 24 540 topology 662 1438 +> 16 0 24 540 topology 758 1438 +> 15 0 23 540 topology 613 1439 +> 16 0 23 540 topology 614 1439 +> 15 0 24 540 topology 614 1440 +> 16 0 24 540 topology 758 1440 +> 15 0 23 540 topology 697 1441 +> 16 0 23 540 topology 698 1441 +> 15 0 24 540 topology 698 1442 +> 16 0 24 540 topology 758 1442 +> 15 0 23 540 topology 649 1443 +> 16 0 23 540 topology 650 1443 +> 15 0 24 540 topology 650 1444 +> 16 0 24 540 topology 758 1444 +> 15 0 23 540 topology 733 1445 +> 16 0 23 540 topology 734 1445 +> 15 0 24 540 topology 734 1446 +> 16 0 24 540 topology 758 1446 +> 15 0 23 540 topology 685 1447 +> 16 0 23 540 topology 686 1447 +> 15 0 24 540 topology 686 1448 +> 16 0 24 540 topology 758 1448 +> 15 0 23 540 topology 559 1449 +> 16 0 23 540 topology 560 1449 +> 15 0 24 540 topology 560 1450 +> 16 0 24 540 topology 758 1450 +> 15 0 23 540 topology 568 1451 +> 16 0 23 540 topology 569 1451 +> 15 0 24 540 topology 569 1452 +> 16 0 24 540 topology 758 1452 +> 15 0 23 540 topology 604 1453 +> 16 0 23 540 topology 605 1453 +> 15 0 24 540 topology 605 1454 +> 16 0 24 540 topology 758 1454 +> 15 0 23 540 topology 688 1455 +> 16 0 23 540 topology 689 1455 +> 15 0 24 540 topology 689 1456 +> 16 0 24 540 topology 758 1456 +> 15 0 23 540 topology 640 1457 +> 16 0 23 540 topology 641 1457 +> 15 0 24 540 topology 641 1458 +> 16 0 24 540 topology 758 1458 +> 15 0 23 540 topology 724 1459 +> 16 0 23 540 topology 725 1459 +> 15 0 24 540 topology 725 1460 +> 16 0 24 540 topology 758 1460 +> 15 0 23 540 topology 592 1461 +> 16 0 23 540 topology 593 1461 +> 15 0 24 540 topology 593 1462 +> 16 0 24 540 topology 758 1462 +> 15 0 23 540 topology 676 1463 +> 16 0 23 540 topology 677 1463 +> 15 0 24 540 topology 677 1464 +> 16 0 24 540 topology 758 1464 +> 15 0 23 540 topology 712 1465 +> 16 0 23 540 topology 713 1465 +> 15 0 24 540 topology 713 1466 +> 16 0 24 540 topology 758 1466 +> 15 0 23 540 topology 550 1467 +> 16 0 23 540 topology 551 1467 +> 15 0 24 540 topology 551 1468 +> 16 0 24 540 topology 758 1468 +> 15 0 23 540 topology 631 1469 +> 16 0 23 540 topology 632 1469 +> 15 0 24 540 topology 632 1470 +> 16 0 24 540 topology 758 1470 +> 15 0 23 540 topology 583 1471 +> 16 0 23 540 topology 584 1471 +> 15 0 24 540 topology 584 1472 +> 16 0 24 540 topology 758 1472 +> 15 0 23 540 topology 667 1473 +> 16 0 23 540 topology 668 1473 +> 15 0 24 540 topology 668 1474 +> 16 0 24 540 topology 758 1474 +> 15 0 23 540 topology 751 1475 +> 16 0 23 540 topology 752 1475 +> 15 0 24 540 topology 752 1476 +> 16 0 24 540 topology 758 1476 +> 15 0 23 540 topology 619 1477 +> 16 0 23 540 topology 620 1477 +> 15 0 24 540 topology 620 1478 +> 16 0 24 540 topology 758 1478 +> 15 0 23 540 topology 703 1479 +> 16 0 23 540 topology 704 1479 +> 15 0 24 540 topology 704 1480 +> 16 0 24 540 topology 758 1480 +> 15 0 23 540 topology 655 1481 +> 16 0 23 540 topology 656 1481 +> 15 0 24 540 topology 656 1482 +> 16 0 24 540 topology 758 1482 +> 15 0 23 540 topology 739 1483 +> 16 0 23 540 topology 740 1483 +> 15 0 24 540 topology 740 1484 +> 16 0 24 540 topology 758 1484 +> 15 0 23 540 topology 541 1485 +> 16 0 23 540 topology 542 1485 +> 15 0 24 540 topology 542 1486 +> 16 0 24 540 topology 758 1486 +> 15 0 23 540 topology 565 1487 +> 16 0 23 540 topology 566 1487 +> 15 0 24 540 topology 566 1488 +> 16 0 24 540 topology 758 1488 +> 15 0 23 540 topology 574 1489 +> 16 0 23 540 topology 575 1489 +> 15 0 24 540 topology 575 1490 +> 16 0 24 540 topology 758 1490 +> 15 0 23 540 topology 658 1491 +> 16 0 23 540 topology 659 1491 +> 15 0 24 540 topology 659 1492 +> 16 0 24 540 topology 758 1492 +> 15 0 23 540 topology 610 1493 +> 16 0 23 540 topology 611 1493 +> 15 0 24 540 topology 611 1494 +> 16 0 24 540 topology 758 1494 +> 15 0 23 540 topology 694 1495 +> 16 0 23 540 topology 695 1495 +> 15 0 24 540 topology 695 1496 +> 16 0 24 540 topology 758 1496 +> 15 0 23 540 topology 646 1497 +> 16 0 23 540 topology 647 1497 +> 15 0 24 540 topology 647 1498 +> 16 0 24 540 topology 758 1498 +> 15 0 23 540 topology 730 1499 +> 16 0 23 540 topology 731 1499 +> 15 0 24 540 topology 731 1500 +> 16 0 24 540 topology 758 1500 +> 15 0 23 540 topology 682 1501 +> 16 0 23 540 topology 683 1501 +> 15 0 24 540 topology 683 1502 +> 16 0 24 540 topology 758 1502 +> 15 0 23 540 topology 556 1503 +> 16 0 23 540 topology 557 1503 +> 15 0 24 540 topology 557 1504 +> 16 0 24 540 topology 758 1504 +> 15 0 23 540 topology 601 1505 +> 16 0 23 540 topology 602 1505 +> 15 0 24 540 topology 602 1506 +> 16 0 24 540 topology 758 1506 +> 15 0 23 540 topology 637 1507 +> 16 0 23 540 topology 638 1507 +> 15 0 24 540 topology 638 1508 +> 16 0 24 540 topology 758 1508 +> 15 0 23 540 topology 721 1509 +> 16 0 23 540 topology 722 1509 +> 15 0 24 540 topology 722 1510 +> 16 0 24 540 topology 758 1510 +> 15 0 23 540 topology 589 1511 +> 16 0 23 540 topology 590 1511 +> 15 0 24 540 topology 590 1512 +> 16 0 24 540 topology 758 1512 +> 15 0 23 540 topology 673 1513 +> 16 0 23 540 topology 674 1513 +> 15 0 24 540 topology 674 1514 +> 16 0 24 540 topology 758 1514 +> 15 0 23 540 topology 625 1515 +> 16 0 23 540 topology 626 1515 +> 15 0 24 540 topology 626 1516 +> 16 0 24 540 topology 758 1516 +> 15 0 23 540 topology 709 1517 +> 16 0 23 540 topology 710 1517 +> 15 0 24 540 topology 710 1518 +> 16 0 24 540 topology 758 1518 +> 15 0 23 540 topology 745 1519 +> 16 0 23 540 topology 746 1519 +> 15 0 24 540 topology 746 1520 +> 16 0 24 540 topology 758 1520 +> 15 0 23 540 topology 547 1521 +> 16 0 23 540 topology 548 1521 +> 15 0 24 540 topology 548 1522 +> 16 0 24 540 topology 758 1522 +> 15 0 23 760 topology 788 1523 +> 16 0 23 760 topology 789 1523 +> 15 0 24 760 topology 789 1524 +> 16 0 24 760 topology 864 1524 +> 15 0 24 760 topology 864 1525 +> 16 0 24 760 topology 850 1525 +> 15 0 25 760 topology 850 1526 +> 16 0 25 760 topology 848 1526 +> 15 0 24 760 topology 864 1527 +> 16 0 24 760 topology 826 1527 +> 15 0 25 760 topology 826 1528 +> 16 0 25 760 topology 824 1528 +> 15 0 24 760 topology 864 1529 +> 16 0 24 760 topology 802 1529 +> 15 0 25 760 topology 802 1530 +> 16 0 25 760 topology 800 1530 +> 15 0 24 760 topology 864 1531 +> 16 0 24 760 topology 862 1531 +> 15 0 25 760 topology 862 1532 +> 16 0 25 760 topology 860 1532 +> 15 0 24 760 topology 864 1533 +> 16 0 24 760 topology 838 1533 +> 15 0 25 760 topology 838 1534 +> 16 0 25 760 topology 836 1534 +> 15 0 24 760 topology 864 1535 +> 16 0 24 760 topology 814 1535 +> 15 0 25 760 topology 814 1536 +> 16 0 25 760 topology 812 1536 +> 15 0 26 760 topology 864 1537 +> 16 0 26 760 topology 863 1537 +> 15 0 24 760 topology 864 1538 +> 16 0 24 760 topology 766 1538 +> 15 0 25 760 topology 766 1539 +> 16 0 25 760 topology 764 1539 +> 15 0 24 760 topology 864 1540 +> 16 0 24 760 topology 778 1540 +> 15 0 25 760 topology 778 1541 +> 16 0 25 760 topology 776 1541 +> 15 0 24 760 topology 864 1542 +> 16 0 24 760 topology 793 1542 +> 15 0 25 760 topology 793 1543 +> 16 0 25 760 topology 791 1543 +> 15 0 24 760 topology 864 1544 +> 16 0 24 760 topology 853 1544 +> 15 0 25 760 topology 853 1545 +> 16 0 25 760 topology 851 1545 +> 15 0 24 760 topology 864 1546 +> 16 0 24 760 topology 829 1546 +> 15 0 25 760 topology 829 1547 +> 16 0 25 760 topology 827 1547 +> 15 0 24 760 topology 864 1548 +> 16 0 24 760 topology 805 1548 +> 15 0 25 760 topology 805 1549 +> 16 0 25 760 topology 803 1549 +> 15 0 24 760 topology 864 1550 +> 16 0 24 760 topology 841 1550 +> 15 0 25 760 topology 841 1551 +> 16 0 25 760 topology 839 1551 +> 15 0 24 760 topology 864 1552 +> 16 0 24 760 topology 817 1552 +> 15 0 25 760 topology 817 1553 +> 16 0 25 760 topology 815 1553 +> 15 0 24 760 topology 864 1554 +> 16 0 24 760 topology 769 1554 +> 15 0 25 760 topology 769 1555 +> 16 0 25 760 topology 767 1555 +> 15 0 24 760 topology 864 1556 +> 16 0 24 760 topology 781 1556 +> 15 0 25 760 topology 781 1557 +> 16 0 25 760 topology 779 1557 +> 15 0 24 760 topology 864 1558 +> 16 0 24 760 topology 820 1558 +> 15 0 25 760 topology 820 1559 +> 16 0 25 760 topology 818 1559 +> 15 0 24 760 topology 864 1560 +> 16 0 24 760 topology 796 1560 +> 15 0 25 760 topology 796 1561 +> 16 0 25 760 topology 794 1561 +> 15 0 24 760 topology 864 1562 +> 16 0 24 760 topology 856 1562 +> 15 0 25 760 topology 856 1563 +> 16 0 25 760 topology 854 1563 +> 15 0 24 760 topology 864 1564 +> 16 0 24 760 topology 832 1564 +> 15 0 25 760 topology 832 1565 +> 16 0 25 760 topology 830 1565 +> 15 0 24 760 topology 864 1566 +> 16 0 24 760 topology 808 1566 +> 15 0 25 760 topology 808 1567 +> 16 0 25 760 topology 806 1567 +> 15 0 24 760 topology 864 1568 +> 16 0 24 760 topology 844 1568 +> 15 0 25 760 topology 844 1569 +> 16 0 25 760 topology 842 1569 +> 15 0 24 760 topology 864 1570 +> 16 0 24 760 topology 772 1570 +> 15 0 25 760 topology 772 1571 +> 16 0 25 760 topology 770 1571 +> 15 0 24 760 topology 864 1572 +> 16 0 24 760 topology 784 1572 +> 15 0 25 760 topology 784 1573 +> 16 0 25 760 topology 782 1573 +> 15 0 24 760 topology 864 1574 +> 16 0 24 760 topology 823 1574 +> 15 0 25 760 topology 823 1575 +> 16 0 25 760 topology 821 1575 +> 15 0 24 760 topology 864 1576 +> 16 0 24 760 topology 799 1576 +> 15 0 25 760 topology 799 1577 +> 16 0 25 760 topology 797 1577 +> 15 0 24 760 topology 864 1578 +> 16 0 24 760 topology 859 1578 +> 15 0 25 760 topology 859 1579 +> 16 0 25 760 topology 857 1579 +> 15 0 24 760 topology 864 1580 +> 16 0 24 760 topology 835 1580 +> 15 0 25 760 topology 835 1581 +> 16 0 25 760 topology 833 1581 +> 15 0 24 760 topology 864 1582 +> 16 0 24 760 topology 811 1582 +> 15 0 25 760 topology 811 1583 +> 16 0 25 760 topology 809 1583 +> 15 0 24 760 topology 864 1584 +> 16 0 24 760 topology 847 1584 +> 15 0 25 760 topology 847 1585 +> 16 0 25 760 topology 845 1585 +> 15 0 24 760 topology 864 1586 +> 16 0 24 760 topology 763 1586 +> 15 0 25 760 topology 763 1587 +> 16 0 25 760 topology 761 1587 +> 15 0 24 760 topology 864 1588 +> 16 0 24 760 topology 775 1588 +> 15 0 25 760 topology 775 1589 +> 16 0 25 760 topology 773 1589 +> 15 0 24 760 topology 864 1590 +> 16 0 24 760 topology 787 1590 +> 15 0 25 760 topology 787 1591 +> 16 0 25 760 topology 785 1591 +> 15 0 23 760 topology 848 1592 +> 16 0 23 760 topology 849 1592 +> 15 0 24 760 topology 849 1593 +> 16 0 24 760 topology 864 1593 +> 15 0 24 760 topology 864 1594 +> 16 0 24 760 topology 790 1594 +> 15 0 25 760 topology 790 1595 +> 16 0 25 760 topology 788 1595 +> 15 0 23 760 topology 824 1596 +> 16 0 23 760 topology 825 1596 +> 15 0 24 760 topology 825 1597 +> 16 0 24 760 topology 864 1597 +> 15 0 23 760 topology 800 1598 +> 16 0 23 760 topology 801 1598 +> 15 0 24 760 topology 801 1599 +> 16 0 24 760 topology 864 1599 +> 15 0 23 760 topology 860 1600 +> 16 0 23 760 topology 861 1600 +> 15 0 24 760 topology 861 1601 +> 16 0 24 760 topology 864 1601 +> 15 0 23 760 topology 836 1602 +> 16 0 23 760 topology 837 1602 +> 15 0 24 760 topology 837 1603 +> 16 0 24 760 topology 864 1603 +> 15 0 23 760 topology 812 1604 +> 16 0 23 760 topology 813 1604 +> 15 0 24 760 topology 813 1605 +> 16 0 24 760 topology 864 1605 +> 15 0 23 760 topology 764 1606 +> 16 0 23 760 topology 765 1606 +> 15 0 24 760 topology 765 1607 +> 16 0 24 760 topology 864 1607 +> 15 0 23 760 topology 776 1608 +> 16 0 23 760 topology 777 1608 +> 15 0 24 760 topology 777 1609 +> 16 0 24 760 topology 864 1609 +> 15 0 23 760 topology 791 1610 +> 16 0 23 760 topology 792 1610 +> 15 0 24 760 topology 792 1611 +> 16 0 24 760 topology 864 1611 +> 15 0 23 760 topology 851 1612 +> 16 0 23 760 topology 852 1612 +> 15 0 24 760 topology 852 1613 +> 16 0 24 760 topology 864 1613 +> 15 0 23 760 topology 827 1614 +> 16 0 23 760 topology 828 1614 +> 15 0 24 760 topology 828 1615 +> 16 0 24 760 topology 864 1615 +> 15 0 23 760 topology 803 1616 +> 16 0 23 760 topology 804 1616 +> 15 0 24 760 topology 804 1617 +> 16 0 24 760 topology 864 1617 +> 15 0 23 760 topology 839 1618 +> 16 0 23 760 topology 840 1618 +> 15 0 24 760 topology 840 1619 +> 16 0 24 760 topology 864 1619 +> 15 0 23 760 topology 815 1620 +> 16 0 23 760 topology 816 1620 +> 15 0 24 760 topology 816 1621 +> 16 0 24 760 topology 864 1621 +> 15 0 23 760 topology 767 1622 +> 16 0 23 760 topology 768 1622 +> 15 0 24 760 topology 768 1623 +> 16 0 24 760 topology 864 1623 +> 15 0 23 760 topology 779 1624 +> 16 0 23 760 topology 780 1624 +> 15 0 24 760 topology 780 1625 +> 16 0 24 760 topology 864 1625 +> 15 0 23 760 topology 818 1626 +> 16 0 23 760 topology 819 1626 +> 15 0 24 760 topology 819 1627 +> 16 0 24 760 topology 864 1627 +> 15 0 23 760 topology 794 1628 +> 16 0 23 760 topology 795 1628 +> 15 0 24 760 topology 795 1629 +> 16 0 24 760 topology 864 1629 +> 15 0 23 760 topology 854 1630 +> 16 0 23 760 topology 855 1630 +> 15 0 24 760 topology 855 1631 +> 16 0 24 760 topology 864 1631 +> 15 0 23 760 topology 830 1632 +> 16 0 23 760 topology 831 1632 +> 15 0 24 760 topology 831 1633 +> 16 0 24 760 topology 864 1633 +> 15 0 23 760 topology 806 1634 +> 16 0 23 760 topology 807 1634 +> 15 0 24 760 topology 807 1635 +> 16 0 24 760 topology 864 1635 +> 15 0 23 760 topology 842 1636 +> 16 0 23 760 topology 843 1636 +> 15 0 24 760 topology 843 1637 +> 16 0 24 760 topology 864 1637 +> 15 0 23 760 topology 770 1638 +> 16 0 23 760 topology 771 1638 +> 15 0 24 760 topology 771 1639 +> 16 0 24 760 topology 864 1639 +> 15 0 23 760 topology 782 1640 +> 16 0 23 760 topology 783 1640 +> 15 0 24 760 topology 783 1641 +> 16 0 24 760 topology 864 1641 +> 15 0 23 760 topology 821 1642 +> 16 0 23 760 topology 822 1642 +> 15 0 24 760 topology 822 1643 +> 16 0 24 760 topology 864 1643 +> 15 0 23 760 topology 797 1644 +> 16 0 23 760 topology 798 1644 +> 15 0 24 760 topology 798 1645 +> 16 0 24 760 topology 864 1645 +> 15 0 23 760 topology 857 1646 +> 16 0 23 760 topology 858 1646 +> 15 0 24 760 topology 858 1647 +> 16 0 24 760 topology 864 1647 +> 15 0 23 760 topology 833 1648 +> 16 0 23 760 topology 834 1648 +> 15 0 24 760 topology 834 1649 +> 16 0 24 760 topology 864 1649 +> 15 0 23 760 topology 809 1650 +> 16 0 23 760 topology 810 1650 +> 15 0 24 760 topology 810 1651 +> 16 0 24 760 topology 864 1651 +> 15 0 23 760 topology 845 1652 +> 16 0 23 760 topology 846 1652 +> 15 0 24 760 topology 846 1653 +> 16 0 24 760 topology 864 1653 +> 15 0 23 760 topology 761 1654 +> 16 0 23 760 topology 762 1654 +> 15 0 24 760 topology 762 1655 +> 16 0 24 760 topology 864 1655 +> 15 0 23 760 topology 773 1656 +> 16 0 23 760 topology 774 1656 +> 15 0 24 760 topology 774 1657 +> 16 0 24 760 topology 864 1657 +> 15 0 23 760 topology 785 1658 +> 16 0 23 760 topology 786 1658 +> 15 0 24 760 topology 786 1659 +> 16 0 24 760 topology 864 1659 +> 15 0 23 500 topology 519 1660 +> 16 0 23 500 topology 520 1660 +> 15 0 24 500 topology 520 1661 +> 16 0 24 500 topology 538 1661 +> 15 0 24 500 topology 538 1662 +> 16 0 24 500 topology 530 1662 +> 15 0 25 500 topology 530 1663 +> 16 0 25 500 topology 528 1663 +> 15 0 26 500 topology 538 1664 +> 16 0 26 500 topology 537 1664 +> 15 0 24 500 topology 538 1665 +> 16 0 24 500 topology 512 1665 +> 15 0 25 500 topology 512 1666 +> 16 0 25 500 topology 510 1666 +> 15 0 24 500 topology 538 1667 +> 16 0 24 500 topology 524 1667 +> 15 0 25 500 topology 524 1668 +> 16 0 25 500 topology 522 1668 +> 15 0 24 500 topology 538 1669 +> 16 0 24 500 topology 533 1669 +> 15 0 25 500 topology 533 1670 +> 16 0 25 500 topology 531 1670 +> 15 0 24 500 topology 538 1671 +> 16 0 24 500 topology 503 1671 +> 15 0 25 500 topology 503 1672 +> 16 0 25 500 topology 501 1672 +> 15 0 24 500 topology 538 1673 +> 16 0 24 500 topology 515 1673 +> 15 0 25 500 topology 515 1674 +> 16 0 25 500 topology 513 1674 +> 15 0 24 500 topology 538 1675 +> 16 0 24 500 topology 527 1675 +> 15 0 25 500 topology 527 1676 +> 16 0 25 500 topology 525 1676 +> 15 0 24 500 topology 538 1677 +> 16 0 24 500 topology 536 1677 +> 15 0 25 500 topology 536 1678 +> 16 0 25 500 topology 534 1678 +> 15 0 24 500 topology 538 1679 +> 16 0 24 500 topology 506 1679 +> 15 0 25 500 topology 506 1680 +> 16 0 25 500 topology 504 1680 +> 15 0 24 500 topology 538 1681 +> 16 0 24 500 topology 518 1681 +> 15 0 25 500 topology 518 1682 +> 16 0 25 500 topology 516 1682 +> 15 0 24 500 topology 538 1683 +> 16 0 24 500 topology 509 1683 +> 15 0 25 500 topology 509 1684 +> 16 0 25 500 topology 507 1684 +> 15 0 23 500 topology 528 1685 +> 16 0 23 500 topology 529 1685 +> 15 0 24 500 topology 529 1686 +> 16 0 24 500 topology 538 1686 +> 15 0 24 500 topology 538 1687 +> 16 0 24 500 topology 521 1687 +> 15 0 25 500 topology 521 1688 +> 16 0 25 500 topology 519 1688 +> 15 0 23 500 topology 510 1689 +> 16 0 23 500 topology 511 1689 +> 15 0 24 500 topology 511 1690 +> 16 0 24 500 topology 538 1690 +> 15 0 23 500 topology 522 1691 +> 16 0 23 500 topology 523 1691 +> 15 0 24 500 topology 523 1692 +> 16 0 24 500 topology 538 1692 +> 15 0 23 500 topology 531 1693 +> 16 0 23 500 topology 532 1693 +> 15 0 24 500 topology 532 1694 +> 16 0 24 500 topology 538 1694 +> 15 0 23 500 topology 501 1695 +> 16 0 23 500 topology 502 1695 +> 15 0 24 500 topology 502 1696 +> 16 0 24 500 topology 538 1696 +> 15 0 23 500 topology 513 1697 +> 16 0 23 500 topology 514 1697 +> 15 0 24 500 topology 514 1698 +> 16 0 24 500 topology 538 1698 +> 15 0 23 500 topology 525 1699 +> 16 0 23 500 topology 526 1699 +> 15 0 24 500 topology 526 1700 +> 16 0 24 500 topology 538 1700 +> 15 0 23 500 topology 534 1701 +> 16 0 23 500 topology 535 1701 +> 15 0 24 500 topology 535 1702 +> 16 0 24 500 topology 538 1702 +> 15 0 23 500 topology 504 1703 +> 16 0 23 500 topology 505 1703 +> 15 0 24 500 topology 505 1704 +> 16 0 24 500 topology 538 1704 +> 15 0 23 500 topology 516 1705 +> 16 0 23 500 topology 517 1705 +> 15 0 24 500 topology 517 1706 +> 16 0 24 500 topology 538 1706 +> 15 0 23 500 topology 507 1707 +> 16 0 23 500 topology 508 1707 +> 15 0 24 500 topology 508 1708 +> 16 0 24 500 topology 538 1708 +> 15 0 27 499 topology 757 1709 +> 16 0 27 499 topology 759 1709 +> 15 0 28 499 topology 759 1710 +> 16 0 28 499 topology 867 1710 +> 15 0 21 499 topology 759 1711 +> 16 0 21 499 topology 865 1711 +> 15 0 28 499 topology 865 1712 +> 16 0 28 499 topology 863 1712 +> 15 0 21 499 topology 759 1713 +> 16 0 21 499 topology 539 1713 +> 15 0 28 499 topology 539 1714 +> 16 0 28 499 topology 537 1714 +> 15 0 27 499 topology 867 1715 +> 16 0 27 499 topology 865 1715 +> 15 0 27 499 topology 867 1716 +> 16 0 27 499 topology 539 1716 +> 15 0 21 499 topology 865 1717 +> 16 0 21 499 topology 539 1717 +> 15 0 23 3318 topology 3373 1718 +> 16 0 23 3318 topology 3374 1718 +> 15 0 24 3318 topology 3374 1719 +> 16 0 24 3318 topology 3410 1719 +> 15 0 24 3318 topology 3410 1720 +> 16 0 24 3318 topology 3378 1720 +> 15 0 25 3318 topology 3378 1721 +> 16 0 25 3318 topology 3376 1721 +> 15 0 24 3318 topology 3410 1722 +> 16 0 24 3318 topology 3384 1722 +> 15 0 25 3318 topology 3384 1723 +> 16 0 25 3318 topology 3382 1723 +> 15 0 24 3318 topology 3410 1724 +> 16 0 24 3318 topology 3390 1724 +> 15 0 25 3318 topology 3390 1725 +> 16 0 25 3318 topology 3388 1725 +> 15 0 24 3318 topology 3410 1726 +> 16 0 24 3318 topology 3396 1726 +> 15 0 25 3318 topology 3396 1727 +> 16 0 25 3318 topology 3394 1727 +> 15 0 24 3318 topology 3410 1728 +> 16 0 24 3318 topology 3402 1728 +> 15 0 25 3318 topology 3402 1729 +> 16 0 25 3318 topology 3400 1729 +> 15 0 24 3318 topology 3410 1730 +> 16 0 24 3318 topology 3324 1730 +> 15 0 25 3318 topology 3324 1731 +> 16 0 25 3318 topology 3322 1731 +> 15 0 24 3318 topology 3410 1732 +> 16 0 24 3318 topology 3330 1732 +> 15 0 25 3318 topology 3330 1733 +> 16 0 25 3318 topology 3328 1733 +> 15 0 24 3318 topology 3410 1734 +> 16 0 24 3318 topology 3336 1734 +> 15 0 25 3318 topology 3336 1735 +> 16 0 25 3318 topology 3334 1735 +> 15 0 24 3318 topology 3410 1736 +> 16 0 24 3318 topology 3342 1736 +> 15 0 25 3318 topology 3342 1737 +> 16 0 25 3318 topology 3340 1737 +> 15 0 24 3318 topology 3410 1738 +> 16 0 24 3318 topology 3348 1738 +> 15 0 25 3318 topology 3348 1739 +> 16 0 25 3318 topology 3346 1739 +> 15 0 24 3318 topology 3410 1740 +> 16 0 24 3318 topology 3354 1740 +> 15 0 25 3318 topology 3354 1741 +> 16 0 25 3318 topology 3352 1741 +> 15 0 24 3318 topology 3410 1742 +> 16 0 24 3318 topology 3360 1742 +> 15 0 25 3318 topology 3360 1743 +> 16 0 25 3318 topology 3358 1743 +> 15 0 24 3318 topology 3410 1744 +> 16 0 24 3318 topology 3366 1744 +> 15 0 25 3318 topology 3366 1745 +> 16 0 25 3318 topology 3364 1745 +> 15 0 24 3318 topology 3410 1746 +> 16 0 24 3318 topology 3372 1746 +> 15 0 25 3318 topology 3372 1747 +> 16 0 25 3318 topology 3370 1747 +> 15 0 24 3318 topology 3410 1748 +> 16 0 24 3318 topology 3381 1748 +> 15 0 25 3318 topology 3381 1749 +> 16 0 25 3318 topology 3379 1749 +> 15 0 24 3318 topology 3410 1750 +> 16 0 24 3318 topology 3387 1750 +> 15 0 25 3318 topology 3387 1751 +> 16 0 25 3318 topology 3385 1751 +> 15 0 24 3318 topology 3410 1752 +> 16 0 24 3318 topology 3393 1752 +> 15 0 25 3318 topology 3393 1753 +> 16 0 25 3318 topology 3391 1753 +> 15 0 24 3318 topology 3410 1754 +> 16 0 24 3318 topology 3399 1754 +> 15 0 25 3318 topology 3399 1755 +> 16 0 25 3318 topology 3397 1755 +> 15 0 24 3318 topology 3410 1756 +> 16 0 24 3318 topology 3405 1756 +> 15 0 25 3318 topology 3405 1757 +> 16 0 25 3318 topology 3403 1757 +> 15 0 24 3318 topology 3410 1758 +> 16 0 24 3318 topology 3321 1758 +> 15 0 25 3318 topology 3321 1759 +> 16 0 25 3318 topology 3319 1759 +> 15 0 24 3318 topology 3410 1760 +> 16 0 24 3318 topology 3327 1760 +> 15 0 25 3318 topology 3327 1761 +> 16 0 25 3318 topology 3325 1761 +> 15 0 24 3318 topology 3410 1762 +> 16 0 24 3318 topology 3333 1762 +> 15 0 25 3318 topology 3333 1763 +> 16 0 25 3318 topology 3331 1763 +> 15 0 24 3318 topology 3410 1764 +> 16 0 24 3318 topology 3339 1764 +> 15 0 25 3318 topology 3339 1765 +> 16 0 25 3318 topology 3337 1765 +> 15 0 24 3318 topology 3410 1766 +> 16 0 24 3318 topology 3345 1766 +> 15 0 25 3318 topology 3345 1767 +> 16 0 25 3318 topology 3343 1767 +> 15 0 26 3318 topology 3410 1768 +> 16 0 26 3318 topology 3409 1768 +> 15 0 24 3318 topology 3410 1769 +> 16 0 24 3318 topology 3351 1769 +> 15 0 25 3318 topology 3351 1770 +> 16 0 25 3318 topology 3349 1770 +> 15 0 24 3318 topology 3410 1771 +> 16 0 24 3318 topology 3408 1771 +> 15 0 25 3318 topology 3408 1772 +> 16 0 25 3318 topology 3406 1772 +> 15 0 24 3318 topology 3410 1773 +> 16 0 24 3318 topology 3357 1773 +> 15 0 25 3318 topology 3357 1774 +> 16 0 25 3318 topology 3355 1774 +> 15 0 24 3318 topology 3410 1775 +> 16 0 24 3318 topology 3363 1775 +> 15 0 25 3318 topology 3363 1776 +> 16 0 25 3318 topology 3361 1776 +> 15 0 24 3318 topology 3410 1777 +> 16 0 24 3318 topology 3369 1777 +> 15 0 25 3318 topology 3369 1778 +> 16 0 25 3318 topology 3367 1778 +> 15 0 23 3318 topology 3376 1779 +> 16 0 23 3318 topology 3377 1779 +> 15 0 24 3318 topology 3377 1780 +> 16 0 24 3318 topology 3410 1780 +> 15 0 24 3318 topology 3410 1781 +> 16 0 24 3318 topology 3375 1781 +> 15 0 25 3318 topology 3375 1782 +> 16 0 25 3318 topology 3373 1782 +> 15 0 23 3318 topology 3382 1783 +> 16 0 23 3318 topology 3383 1783 +> 15 0 24 3318 topology 3383 1784 +> 16 0 24 3318 topology 3410 1784 +> 15 0 23 3318 topology 3388 1785 +> 16 0 23 3318 topology 3389 1785 +> 15 0 24 3318 topology 3389 1786 +> 16 0 24 3318 topology 3410 1786 +> 15 0 23 3318 topology 3394 1787 +> 16 0 23 3318 topology 3395 1787 +> 15 0 24 3318 topology 3395 1788 +> 16 0 24 3318 topology 3410 1788 +> 15 0 23 3318 topology 3400 1789 +> 16 0 23 3318 topology 3401 1789 +> 15 0 24 3318 topology 3401 1790 +> 16 0 24 3318 topology 3410 1790 +> 15 0 23 3318 topology 3322 1791 +> 16 0 23 3318 topology 3323 1791 +> 15 0 24 3318 topology 3323 1792 +> 16 0 24 3318 topology 3410 1792 +> 15 0 23 3318 topology 3328 1793 +> 16 0 23 3318 topology 3329 1793 +> 15 0 24 3318 topology 3329 1794 +> 16 0 24 3318 topology 3410 1794 +> 15 0 23 3318 topology 3334 1795 +> 16 0 23 3318 topology 3335 1795 +> 15 0 24 3318 topology 3335 1796 +> 16 0 24 3318 topology 3410 1796 +> 15 0 23 3318 topology 3340 1797 +> 16 0 23 3318 topology 3341 1797 +> 15 0 24 3318 topology 3341 1798 +> 16 0 24 3318 topology 3410 1798 +> 15 0 23 3318 topology 3346 1799 +> 16 0 23 3318 topology 3347 1799 +> 15 0 24 3318 topology 3347 1800 +> 16 0 24 3318 topology 3410 1800 +> 15 0 23 3318 topology 3352 1801 +> 16 0 23 3318 topology 3353 1801 +> 15 0 24 3318 topology 3353 1802 +> 16 0 24 3318 topology 3410 1802 +> 15 0 23 3318 topology 3358 1803 +> 16 0 23 3318 topology 3359 1803 +> 15 0 24 3318 topology 3359 1804 +> 16 0 24 3318 topology 3410 1804 +> 15 0 23 3318 topology 3364 1805 +> 16 0 23 3318 topology 3365 1805 +> 15 0 24 3318 topology 3365 1806 +> 16 0 24 3318 topology 3410 1806 +> 15 0 23 3318 topology 3370 1807 +> 16 0 23 3318 topology 3371 1807 +> 15 0 24 3318 topology 3371 1808 +> 16 0 24 3318 topology 3410 1808 +> 15 0 23 3318 topology 3379 1809 +> 16 0 23 3318 topology 3380 1809 +> 15 0 24 3318 topology 3380 1810 +> 16 0 24 3318 topology 3410 1810 +> 15 0 23 3318 topology 3385 1811 +> 16 0 23 3318 topology 3386 1811 +> 15 0 24 3318 topology 3386 1812 +> 16 0 24 3318 topology 3410 1812 +> 15 0 23 3318 topology 3391 1813 +> 16 0 23 3318 topology 3392 1813 +> 15 0 24 3318 topology 3392 1814 +> 16 0 24 3318 topology 3410 1814 +> 15 0 23 3318 topology 3397 1815 +> 16 0 23 3318 topology 3398 1815 +> 15 0 24 3318 topology 3398 1816 +> 16 0 24 3318 topology 3410 1816 +> 15 0 23 3318 topology 3403 1817 +> 16 0 23 3318 topology 3404 1817 +> 15 0 24 3318 topology 3404 1818 +> 16 0 24 3318 topology 3410 1818 +> 15 0 23 3318 topology 3319 1819 +> 16 0 23 3318 topology 3320 1819 +> 15 0 24 3318 topology 3320 1820 +> 16 0 24 3318 topology 3410 1820 +> 15 0 23 3318 topology 3325 1821 +> 16 0 23 3318 topology 3326 1821 +> 15 0 24 3318 topology 3326 1822 +> 16 0 24 3318 topology 3410 1822 +> 15 0 23 3318 topology 3331 1823 +> 16 0 23 3318 topology 3332 1823 +> 15 0 24 3318 topology 3332 1824 +> 16 0 24 3318 topology 3410 1824 +> 15 0 23 3318 topology 3337 1825 +> 16 0 23 3318 topology 3338 1825 +> 15 0 24 3318 topology 3338 1826 +> 16 0 24 3318 topology 3410 1826 +> 15 0 23 3318 topology 3343 1827 +> 16 0 23 3318 topology 3344 1827 +> 15 0 24 3318 topology 3344 1828 +> 16 0 24 3318 topology 3410 1828 +> 15 0 23 3318 topology 3349 1829 +> 16 0 23 3318 topology 3350 1829 +> 15 0 24 3318 topology 3350 1830 +> 16 0 24 3318 topology 3410 1830 +> 15 0 23 3318 topology 3406 1831 +> 16 0 23 3318 topology 3407 1831 +> 15 0 24 3318 topology 3407 1832 +> 16 0 24 3318 topology 3410 1832 +> 15 0 23 3318 topology 3355 1833 +> 16 0 23 3318 topology 3356 1833 +> 15 0 24 3318 topology 3356 1834 +> 16 0 24 3318 topology 3410 1834 +> 15 0 23 3318 topology 3361 1835 +> 16 0 23 3318 topology 3362 1835 +> 15 0 24 3318 topology 3362 1836 +> 16 0 24 3318 topology 3410 1836 +> 15 0 23 3318 topology 3367 1837 +> 16 0 23 3318 topology 3368 1837 +> 15 0 24 3318 topology 3368 1838 +> 16 0 24 3318 topology 3410 1838 +> 15 0 29 3092 topology 3144 1839 +> 16 0 29 3092 topology 3145 1839 +> 15 0 30 3092 topology 3145 1840 +> 16 0 30 3092 topology 3202 1840 +> 15 0 30 3092 topology 3202 1841 +> 16 0 30 3092 topology 3095 1841 +> 15 0 31 3092 topology 3095 1842 +> 16 0 31 3092 topology 3093 1842 +> 15 0 30 3092 topology 3202 1843 +> 16 0 30 3092 topology 3152 1843 +> 15 0 31 3092 topology 3152 1844 +> 16 0 31 3092 topology 3150 1844 +> 15 0 30 3092 topology 3202 1845 +> 16 0 30 3092 topology 3101 1845 +> 15 0 31 3092 topology 3101 1846 +> 16 0 31 3092 topology 3099 1846 +> 15 0 30 3092 topology 3202 1847 +> 16 0 30 3092 topology 3158 1847 +> 15 0 31 3092 topology 3158 1848 +> 16 0 31 3092 topology 3156 1848 +> 15 0 30 3092 topology 3202 1849 +> 16 0 30 3092 topology 3107 1849 +> 15 0 31 3092 topology 3107 1850 +> 16 0 31 3092 topology 3105 1850 +> 15 0 30 3092 topology 3202 1851 +> 16 0 30 3092 topology 3164 1851 +> 15 0 31 3092 topology 3164 1852 +> 16 0 31 3092 topology 3162 1852 +> 15 0 30 3092 topology 3202 1853 +> 16 0 30 3092 topology 3113 1853 +> 15 0 31 3092 topology 3113 1854 +> 16 0 31 3092 topology 3111 1854 +> 15 0 30 3092 topology 3202 1855 +> 16 0 30 3092 topology 3170 1855 +> 15 0 31 3092 topology 3170 1856 +> 16 0 31 3092 topology 3168 1856 +> 15 0 30 3092 topology 3202 1857 +> 16 0 30 3092 topology 3116 1857 +> 15 0 31 3092 topology 3116 1858 +> 16 0 31 3092 topology 3114 1858 +> 15 0 30 3092 topology 3202 1859 +> 16 0 30 3092 topology 3122 1859 +> 15 0 31 3092 topology 3122 1860 +> 16 0 31 3092 topology 3120 1860 +> 15 0 30 3092 topology 3202 1861 +> 16 0 30 3092 topology 3179 1861 +> 15 0 31 3092 topology 3179 1862 +> 16 0 31 3092 topology 3177 1862 +> 15 0 30 3092 topology 3202 1863 +> 16 0 30 3092 topology 3128 1863 +> 15 0 31 3092 topology 3128 1864 +> 16 0 31 3092 topology 3126 1864 +> 15 0 30 3092 topology 3202 1865 +> 16 0 30 3092 topology 3185 1865 +> 15 0 31 3092 topology 3185 1866 +> 16 0 31 3092 topology 3183 1866 +> 15 0 30 3092 topology 3202 1867 +> 16 0 30 3092 topology 3134 1867 +> 15 0 31 3092 topology 3134 1868 +> 16 0 31 3092 topology 3132 1868 +> 15 0 30 3092 topology 3202 1869 +> 16 0 30 3092 topology 3191 1869 +> 15 0 31 3092 topology 3191 1870 +> 16 0 31 3092 topology 3189 1870 +> 15 0 30 3092 topology 3202 1871 +> 16 0 30 3092 topology 3140 1871 +> 15 0 31 3092 topology 3140 1872 +> 16 0 31 3092 topology 3138 1872 +> 15 0 30 3092 topology 3202 1873 +> 16 0 30 3092 topology 3197 1873 +> 15 0 31 3092 topology 3197 1874 +> 16 0 31 3092 topology 3195 1874 +> 15 0 30 3092 topology 3202 1875 +> 16 0 30 3092 topology 3149 1875 +> 15 0 31 3092 topology 3149 1876 +> 16 0 31 3092 topology 3147 1876 +> 15 0 30 3092 topology 3202 1877 +> 16 0 30 3092 topology 3098 1877 +> 15 0 31 3092 topology 3098 1878 +> 16 0 31 3092 topology 3096 1878 +> 15 0 30 3092 topology 3202 1879 +> 16 0 30 3092 topology 3155 1879 +> 15 0 31 3092 topology 3155 1880 +> 16 0 31 3092 topology 3153 1880 +> 15 0 32 3092 topology 3202 1881 +> 16 0 32 3092 topology 3201 1881 +> 15 0 30 3092 topology 3202 1882 +> 16 0 30 3092 topology 3104 1882 +> 15 0 31 3092 topology 3104 1883 +> 16 0 31 3092 topology 3102 1883 +> 15 0 30 3092 topology 3202 1884 +> 16 0 30 3092 topology 3161 1884 +> 15 0 31 3092 topology 3161 1885 +> 16 0 31 3092 topology 3159 1885 +> 15 0 30 3092 topology 3202 1886 +> 16 0 30 3092 topology 3110 1886 +> 15 0 31 3092 topology 3110 1887 +> 16 0 31 3092 topology 3108 1887 +> 15 0 30 3092 topology 3202 1888 +> 16 0 30 3092 topology 3167 1888 +> 15 0 31 3092 topology 3167 1889 +> 16 0 31 3092 topology 3165 1889 +> 15 0 30 3092 topology 3202 1890 +> 16 0 30 3092 topology 3173 1890 +> 15 0 31 3092 topology 3173 1891 +> 16 0 31 3092 topology 3171 1891 +> 15 0 30 3092 topology 3202 1892 +> 16 0 30 3092 topology 3119 1892 +> 15 0 31 3092 topology 3119 1893 +> 16 0 31 3092 topology 3117 1893 +> 15 0 30 3092 topology 3202 1894 +> 16 0 30 3092 topology 3176 1894 +> 15 0 31 3092 topology 3176 1895 +> 16 0 31 3092 topology 3174 1895 +> 15 0 30 3092 topology 3202 1896 +> 16 0 30 3092 topology 3125 1896 +> 15 0 31 3092 topology 3125 1897 +> 16 0 31 3092 topology 3123 1897 +> 15 0 30 3092 topology 3202 1898 +> 16 0 30 3092 topology 3182 1898 +> 15 0 31 3092 topology 3182 1899 +> 16 0 31 3092 topology 3180 1899 +> 15 0 30 3092 topology 3202 1900 +> 16 0 30 3092 topology 3131 1900 +> 15 0 31 3092 topology 3131 1901 +> 16 0 31 3092 topology 3129 1901 +> 15 0 30 3092 topology 3202 1902 +> 16 0 30 3092 topology 3188 1902 +> 15 0 31 3092 topology 3188 1903 +> 16 0 31 3092 topology 3186 1903 +> 15 0 30 3092 topology 3202 1904 +> 16 0 30 3092 topology 3137 1904 +> 15 0 31 3092 topology 3137 1905 +> 16 0 31 3092 topology 3135 1905 +> 15 0 30 3092 topology 3202 1906 +> 16 0 30 3092 topology 3194 1906 +> 15 0 31 3092 topology 3194 1907 +> 16 0 31 3092 topology 3192 1907 +> 15 0 30 3092 topology 3202 1908 +> 16 0 30 3092 topology 3143 1908 +> 15 0 31 3092 topology 3143 1909 +> 16 0 31 3092 topology 3141 1909 +> 15 0 30 3092 topology 3202 1910 +> 16 0 30 3092 topology 3200 1910 +> 15 0 31 3092 topology 3200 1911 +> 16 0 31 3092 topology 3198 1911 +> 15 0 29 3092 topology 3093 1912 +> 16 0 29 3092 topology 3094 1912 +> 15 0 30 3092 topology 3094 1913 +> 16 0 30 3092 topology 3202 1913 +> 15 0 30 3092 topology 3202 1914 +> 16 0 30 3092 topology 3146 1914 +> 15 0 31 3092 topology 3146 1915 +> 16 0 31 3092 topology 3144 1915 +> 15 0 29 3092 topology 3150 1916 +> 16 0 29 3092 topology 3151 1916 +> 15 0 30 3092 topology 3151 1917 +> 16 0 30 3092 topology 3202 1917 +> 15 0 29 3092 topology 3099 1918 +> 16 0 29 3092 topology 3100 1918 +> 15 0 30 3092 topology 3100 1919 +> 16 0 30 3092 topology 3202 1919 +> 15 0 29 3092 topology 3156 1920 +> 16 0 29 3092 topology 3157 1920 +> 15 0 30 3092 topology 3157 1921 +> 16 0 30 3092 topology 3202 1921 +> 15 0 29 3092 topology 3105 1922 +> 16 0 29 3092 topology 3106 1922 +> 15 0 30 3092 topology 3106 1923 +> 16 0 30 3092 topology 3202 1923 +> 15 0 29 3092 topology 3162 1924 +> 16 0 29 3092 topology 3163 1924 +> 15 0 30 3092 topology 3163 1925 +> 16 0 30 3092 topology 3202 1925 +> 15 0 29 3092 topology 3111 1926 +> 16 0 29 3092 topology 3112 1926 +> 15 0 30 3092 topology 3112 1927 +> 16 0 30 3092 topology 3202 1927 +> 15 0 29 3092 topology 3168 1928 +> 16 0 29 3092 topology 3169 1928 +> 15 0 30 3092 topology 3169 1929 +> 16 0 30 3092 topology 3202 1929 +> 15 0 29 3092 topology 3114 1930 +> 16 0 29 3092 topology 3115 1930 +> 15 0 30 3092 topology 3115 1931 +> 16 0 30 3092 topology 3202 1931 +> 15 0 29 3092 topology 3120 1932 +> 16 0 29 3092 topology 3121 1932 +> 15 0 30 3092 topology 3121 1933 +> 16 0 30 3092 topology 3202 1933 +> 15 0 29 3092 topology 3177 1934 +> 16 0 29 3092 topology 3178 1934 +> 15 0 30 3092 topology 3178 1935 +> 16 0 30 3092 topology 3202 1935 +> 15 0 29 3092 topology 3126 1936 +> 16 0 29 3092 topology 3127 1936 +> 15 0 30 3092 topology 3127 1937 +> 16 0 30 3092 topology 3202 1937 +> 15 0 29 3092 topology 3183 1938 +> 16 0 29 3092 topology 3184 1938 +> 15 0 30 3092 topology 3184 1939 +> 16 0 30 3092 topology 3202 1939 +> 15 0 29 3092 topology 3132 1940 +> 16 0 29 3092 topology 3133 1940 +> 15 0 30 3092 topology 3133 1941 +> 16 0 30 3092 topology 3202 1941 +> 15 0 29 3092 topology 3189 1942 +> 16 0 29 3092 topology 3190 1942 +> 15 0 30 3092 topology 3190 1943 +> 16 0 30 3092 topology 3202 1943 +> 15 0 29 3092 topology 3138 1944 +> 16 0 29 3092 topology 3139 1944 +> 15 0 30 3092 topology 3139 1945 +> 16 0 30 3092 topology 3202 1945 +> 15 0 29 3092 topology 3195 1946 +> 16 0 29 3092 topology 3196 1946 +> 15 0 30 3092 topology 3196 1947 +> 16 0 30 3092 topology 3202 1947 +> 15 0 29 3092 topology 3147 1948 +> 16 0 29 3092 topology 3148 1948 +> 15 0 30 3092 topology 3148 1949 +> 16 0 30 3092 topology 3202 1949 +> 15 0 29 3092 topology 3096 1950 +> 16 0 29 3092 topology 3097 1950 +> 15 0 30 3092 topology 3097 1951 +> 16 0 30 3092 topology 3202 1951 +> 15 0 29 3092 topology 3153 1952 +> 16 0 29 3092 topology 3154 1952 +> 15 0 30 3092 topology 3154 1953 +> 16 0 30 3092 topology 3202 1953 +> 15 0 29 3092 topology 3102 1954 +> 16 0 29 3092 topology 3103 1954 +> 15 0 30 3092 topology 3103 1955 +> 16 0 30 3092 topology 3202 1955 +> 15 0 29 3092 topology 3159 1956 +> 16 0 29 3092 topology 3160 1956 +> 15 0 30 3092 topology 3160 1957 +> 16 0 30 3092 topology 3202 1957 +> 15 0 29 3092 topology 3108 1958 +> 16 0 29 3092 topology 3109 1958 +> 15 0 30 3092 topology 3109 1959 +> 16 0 30 3092 topology 3202 1959 +> 15 0 29 3092 topology 3165 1960 +> 16 0 29 3092 topology 3166 1960 +> 15 0 30 3092 topology 3166 1961 +> 16 0 30 3092 topology 3202 1961 +> 15 0 29 3092 topology 3171 1962 +> 16 0 29 3092 topology 3172 1962 +> 15 0 30 3092 topology 3172 1963 +> 16 0 30 3092 topology 3202 1963 +> 15 0 29 3092 topology 3117 1964 +> 16 0 29 3092 topology 3118 1964 +> 15 0 30 3092 topology 3118 1965 +> 16 0 30 3092 topology 3202 1965 +> 15 0 29 3092 topology 3174 1966 +> 16 0 29 3092 topology 3175 1966 +> 15 0 30 3092 topology 3175 1967 +> 16 0 30 3092 topology 3202 1967 +> 15 0 29 3092 topology 3123 1968 +> 16 0 29 3092 topology 3124 1968 +> 15 0 30 3092 topology 3124 1969 +> 16 0 30 3092 topology 3202 1969 +> 15 0 29 3092 topology 3180 1970 +> 16 0 29 3092 topology 3181 1970 +> 15 0 30 3092 topology 3181 1971 +> 16 0 30 3092 topology 3202 1971 +> 15 0 29 3092 topology 3129 1972 +> 16 0 29 3092 topology 3130 1972 +> 15 0 30 3092 topology 3130 1973 +> 16 0 30 3092 topology 3202 1973 +> 15 0 29 3092 topology 3186 1974 +> 16 0 29 3092 topology 3187 1974 +> 15 0 30 3092 topology 3187 1975 +> 16 0 30 3092 topology 3202 1975 +> 15 0 29 3092 topology 3135 1976 +> 16 0 29 3092 topology 3136 1976 +> 15 0 30 3092 topology 3136 1977 +> 16 0 30 3092 topology 3202 1977 +> 15 0 29 3092 topology 3192 1978 +> 16 0 29 3092 topology 3193 1978 +> 15 0 30 3092 topology 3193 1979 +> 16 0 30 3092 topology 3202 1979 +> 15 0 29 3092 topology 3141 1980 +> 16 0 29 3092 topology 3142 1980 +> 15 0 30 3092 topology 3142 1981 +> 16 0 30 3092 topology 3202 1981 +> 15 0 29 3092 topology 3198 1982 +> 16 0 29 3092 topology 3199 1982 +> 15 0 30 3092 topology 3199 1983 +> 16 0 30 3092 topology 3202 1983 +> 15 0 29 3272 topology 3273 1984 +> 16 0 29 3272 topology 3274 1984 +> 15 0 30 3272 topology 3274 1985 +> 16 0 30 3272 topology 3292 1985 +> 15 0 30 3272 topology 3292 1986 +> 16 0 30 3272 topology 3281 1986 +> 15 0 31 3272 topology 3281 1987 +> 16 0 31 3272 topology 3279 1987 +> 15 0 30 3272 topology 3292 1988 +> 16 0 30 3272 topology 3287 1988 +> 15 0 31 3272 topology 3287 1989 +> 16 0 31 3272 topology 3285 1989 +> 15 0 30 3272 topology 3292 1990 +> 16 0 30 3272 topology 3278 1990 +> 15 0 31 3272 topology 3278 1991 +> 16 0 31 3272 topology 3276 1991 +> 15 0 30 3272 topology 3292 1992 +> 16 0 30 3272 topology 3284 1992 +> 15 0 31 3272 topology 3284 1993 +> 16 0 31 3272 topology 3282 1993 +> 15 0 30 3272 topology 3292 1994 +> 16 0 30 3272 topology 3290 1994 +> 15 0 31 3272 topology 3290 1995 +> 16 0 31 3272 topology 3288 1995 +> 15 0 32 3272 topology 3292 1996 +> 16 0 32 3272 topology 3291 1996 +> 15 0 29 3272 topology 3279 1997 +> 16 0 29 3272 topology 3280 1997 +> 15 0 30 3272 topology 3280 1998 +> 16 0 30 3272 topology 3292 1998 +> 15 0 30 3272 topology 3292 1999 +> 16 0 30 3272 topology 3275 1999 +> 15 0 31 3272 topology 3275 2000 +> 16 0 31 3272 topology 3273 2000 +> 15 0 29 3272 topology 3285 2001 +> 16 0 29 3272 topology 3286 2001 +> 15 0 30 3272 topology 3286 2002 +> 16 0 30 3272 topology 3292 2002 +> 15 0 29 3272 topology 3276 2003 +> 16 0 29 3272 topology 3277 2003 +> 15 0 30 3272 topology 3277 2004 +> 16 0 30 3272 topology 3292 2004 +> 15 0 29 3272 topology 3282 2005 +> 16 0 29 3272 topology 3283 2005 +> 15 0 30 3272 topology 3283 2006 +> 16 0 30 3272 topology 3292 2006 +> 15 0 29 3272 topology 3288 2007 +> 16 0 29 3272 topology 3289 2007 +> 15 0 30 3272 topology 3289 2008 +> 16 0 30 3272 topology 3292 2008 +> 15 0 29 2351 topology 2352 2009 +> 16 0 29 2351 topology 2353 2009 +> 15 0 30 2351 topology 2353 2010 +> 16 0 30 2351 topology 2461 2010 +> 15 0 30 2351 topology 2461 2011 +> 16 0 30 2351 topology 2360 2011 +> 15 0 31 2351 topology 2360 2012 +> 16 0 31 2351 topology 2358 2012 +> 15 0 30 2351 topology 2461 2013 +> 16 0 30 2351 topology 2366 2013 +> 15 0 31 2351 topology 2366 2014 +> 16 0 31 2351 topology 2364 2014 +> 15 0 30 2351 topology 2461 2015 +> 16 0 30 2351 topology 2372 2015 +> 15 0 31 2351 topology 2372 2016 +> 16 0 31 2351 topology 2370 2016 +> 15 0 30 2351 topology 2461 2017 +> 16 0 30 2351 topology 2378 2017 +> 15 0 31 2351 topology 2378 2018 +> 16 0 31 2351 topology 2376 2018 +> 15 0 30 2351 topology 2461 2019 +> 16 0 30 2351 topology 2414 2019 +> 15 0 31 2351 topology 2414 2020 +> 16 0 31 2351 topology 2412 2020 +> 15 0 30 2351 topology 2461 2021 +> 16 0 30 2351 topology 2420 2021 +> 15 0 31 2351 topology 2420 2022 +> 16 0 31 2351 topology 2418 2022 +> 15 0 30 2351 topology 2461 2023 +> 16 0 30 2351 topology 2426 2023 +> 15 0 31 2351 topology 2426 2024 +> 16 0 31 2351 topology 2424 2024 +> 15 0 30 2351 topology 2461 2025 +> 16 0 30 2351 topology 2432 2025 +> 15 0 31 2351 topology 2432 2026 +> 16 0 31 2351 topology 2430 2026 +> 15 0 30 2351 topology 2461 2027 +> 16 0 30 2351 topology 2438 2027 +> 15 0 31 2351 topology 2438 2028 +> 16 0 31 2351 topology 2436 2028 +> 15 0 32 2351 topology 2461 2029 +> 16 0 32 2351 topology 2460 2029 +> 15 0 30 2351 topology 2461 2030 +> 16 0 30 2351 topology 2384 2030 +> 15 0 31 2351 topology 2384 2031 +> 16 0 31 2351 topology 2382 2031 +> 15 0 30 2351 topology 2461 2032 +> 16 0 30 2351 topology 2441 2032 +> 15 0 31 2351 topology 2441 2033 +> 16 0 31 2351 topology 2439 2033 +> 15 0 30 2351 topology 2461 2034 +> 16 0 30 2351 topology 2390 2034 +> 15 0 31 2351 topology 2390 2035 +> 16 0 31 2351 topology 2388 2035 +> 15 0 30 2351 topology 2461 2036 +> 16 0 30 2351 topology 2447 2036 +> 15 0 31 2351 topology 2447 2037 +> 16 0 31 2351 topology 2445 2037 +> 15 0 30 2351 topology 2461 2038 +> 16 0 30 2351 topology 2396 2038 +> 15 0 31 2351 topology 2396 2039 +> 16 0 31 2351 topology 2394 2039 +> 15 0 30 2351 topology 2461 2040 +> 16 0 30 2351 topology 2453 2040 +> 15 0 31 2351 topology 2453 2041 +> 16 0 31 2351 topology 2451 2041 +> 15 0 30 2351 topology 2461 2042 +> 16 0 30 2351 topology 2402 2042 +> 15 0 31 2351 topology 2402 2043 +> 16 0 31 2351 topology 2400 2043 +> 15 0 30 2351 topology 2461 2044 +> 16 0 30 2351 topology 2459 2044 +> 15 0 31 2351 topology 2459 2045 +> 16 0 31 2351 topology 2457 2045 +> 15 0 30 2351 topology 2461 2046 +> 16 0 30 2351 topology 2408 2046 +> 15 0 31 2351 topology 2408 2047 +> 16 0 31 2351 topology 2406 2047 +> 15 0 30 2351 topology 2461 2048 +> 16 0 30 2351 topology 2357 2048 +> 15 0 31 2351 topology 2357 2049 +> 16 0 31 2351 topology 2355 2049 +> 15 0 30 2351 topology 2461 2050 +> 16 0 30 2351 topology 2363 2050 +> 15 0 31 2351 topology 2363 2051 +> 16 0 31 2351 topology 2361 2051 +> 15 0 30 2351 topology 2461 2052 +> 16 0 30 2351 topology 2369 2052 +> 15 0 31 2351 topology 2369 2053 +> 16 0 31 2351 topology 2367 2053 +> 15 0 30 2351 topology 2461 2054 +> 16 0 30 2351 topology 2375 2054 +> 15 0 31 2351 topology 2375 2055 +> 16 0 31 2351 topology 2373 2055 +> 15 0 30 2351 topology 2461 2056 +> 16 0 30 2351 topology 2411 2056 +> 15 0 31 2351 topology 2411 2057 +> 16 0 31 2351 topology 2409 2057 +> 15 0 30 2351 topology 2461 2058 +> 16 0 30 2351 topology 2417 2058 +> 15 0 31 2351 topology 2417 2059 +> 16 0 31 2351 topology 2415 2059 +> 15 0 30 2351 topology 2461 2060 +> 16 0 30 2351 topology 2423 2060 +> 15 0 31 2351 topology 2423 2061 +> 16 0 31 2351 topology 2421 2061 +> 15 0 30 2351 topology 2461 2062 +> 16 0 30 2351 topology 2429 2062 +> 15 0 31 2351 topology 2429 2063 +> 16 0 31 2351 topology 2427 2063 +> 15 0 30 2351 topology 2461 2064 +> 16 0 30 2351 topology 2435 2064 +> 15 0 31 2351 topology 2435 2065 +> 16 0 31 2351 topology 2433 2065 +> 15 0 30 2351 topology 2461 2066 +> 16 0 30 2351 topology 2381 2066 +> 15 0 31 2351 topology 2381 2067 +> 16 0 31 2351 topology 2379 2067 +> 15 0 30 2351 topology 2461 2068 +> 16 0 30 2351 topology 2387 2068 +> 15 0 31 2351 topology 2387 2069 +> 16 0 31 2351 topology 2385 2069 +> 15 0 30 2351 topology 2461 2070 +> 16 0 30 2351 topology 2444 2070 +> 15 0 31 2351 topology 2444 2071 +> 16 0 31 2351 topology 2442 2071 +> 15 0 30 2351 topology 2461 2072 +> 16 0 30 2351 topology 2393 2072 +> 15 0 31 2351 topology 2393 2073 +> 16 0 31 2351 topology 2391 2073 +> 15 0 30 2351 topology 2461 2074 +> 16 0 30 2351 topology 2450 2074 +> 15 0 31 2351 topology 2450 2075 +> 16 0 31 2351 topology 2448 2075 +> 15 0 30 2351 topology 2461 2076 +> 16 0 30 2351 topology 2399 2076 +> 15 0 31 2351 topology 2399 2077 +> 16 0 31 2351 topology 2397 2077 +> 15 0 30 2351 topology 2461 2078 +> 16 0 30 2351 topology 2456 2078 +> 15 0 31 2351 topology 2456 2079 +> 16 0 31 2351 topology 2454 2079 +> 15 0 30 2351 topology 2461 2080 +> 16 0 30 2351 topology 2405 2080 +> 15 0 31 2351 topology 2405 2081 +> 16 0 31 2351 topology 2403 2081 +> 15 0 29 2351 topology 2358 2082 +> 16 0 29 2351 topology 2359 2082 +> 15 0 30 2351 topology 2359 2083 +> 16 0 30 2351 topology 2461 2083 +> 15 0 30 2351 topology 2461 2084 +> 16 0 30 2351 topology 2354 2084 +> 15 0 31 2351 topology 2354 2085 +> 16 0 31 2351 topology 2352 2085 +> 15 0 29 2351 topology 2364 2086 +> 16 0 29 2351 topology 2365 2086 +> 15 0 30 2351 topology 2365 2087 +> 16 0 30 2351 topology 2461 2087 +> 15 0 29 2351 topology 2370 2088 +> 16 0 29 2351 topology 2371 2088 +> 15 0 30 2351 topology 2371 2089 +> 16 0 30 2351 topology 2461 2089 +> 15 0 29 2351 topology 2376 2090 +> 16 0 29 2351 topology 2377 2090 +> 15 0 30 2351 topology 2377 2091 +> 16 0 30 2351 topology 2461 2091 +> 15 0 29 2351 topology 2412 2092 +> 16 0 29 2351 topology 2413 2092 +> 15 0 30 2351 topology 2413 2093 +> 16 0 30 2351 topology 2461 2093 +> 15 0 29 2351 topology 2418 2094 +> 16 0 29 2351 topology 2419 2094 +> 15 0 30 2351 topology 2419 2095 +> 16 0 30 2351 topology 2461 2095 +> 15 0 29 2351 topology 2424 2096 +> 16 0 29 2351 topology 2425 2096 +> 15 0 30 2351 topology 2425 2097 +> 16 0 30 2351 topology 2461 2097 +> 15 0 29 2351 topology 2430 2098 +> 16 0 29 2351 topology 2431 2098 +> 15 0 30 2351 topology 2431 2099 +> 16 0 30 2351 topology 2461 2099 +> 15 0 29 2351 topology 2436 2100 +> 16 0 29 2351 topology 2437 2100 +> 15 0 30 2351 topology 2437 2101 +> 16 0 30 2351 topology 2461 2101 +> 15 0 29 2351 topology 2382 2102 +> 16 0 29 2351 topology 2383 2102 +> 15 0 30 2351 topology 2383 2103 +> 16 0 30 2351 topology 2461 2103 +> 15 0 29 2351 topology 2439 2104 +> 16 0 29 2351 topology 2440 2104 +> 15 0 30 2351 topology 2440 2105 +> 16 0 30 2351 topology 2461 2105 +> 15 0 29 2351 topology 2388 2106 +> 16 0 29 2351 topology 2389 2106 +> 15 0 30 2351 topology 2389 2107 +> 16 0 30 2351 topology 2461 2107 +> 15 0 29 2351 topology 2445 2108 +> 16 0 29 2351 topology 2446 2108 +> 15 0 30 2351 topology 2446 2109 +> 16 0 30 2351 topology 2461 2109 +> 15 0 29 2351 topology 2394 2110 +> 16 0 29 2351 topology 2395 2110 +> 15 0 30 2351 topology 2395 2111 +> 16 0 30 2351 topology 2461 2111 +> 15 0 29 2351 topology 2451 2112 +> 16 0 29 2351 topology 2452 2112 +> 15 0 30 2351 topology 2452 2113 +> 16 0 30 2351 topology 2461 2113 +> 15 0 29 2351 topology 2400 2114 +> 16 0 29 2351 topology 2401 2114 +> 15 0 30 2351 topology 2401 2115 +> 16 0 30 2351 topology 2461 2115 +> 15 0 29 2351 topology 2457 2116 +> 16 0 29 2351 topology 2458 2116 +> 15 0 30 2351 topology 2458 2117 +> 16 0 30 2351 topology 2461 2117 +> 15 0 29 2351 topology 2406 2118 +> 16 0 29 2351 topology 2407 2118 +> 15 0 30 2351 topology 2407 2119 +> 16 0 30 2351 topology 2461 2119 +> 15 0 29 2351 topology 2355 2120 +> 16 0 29 2351 topology 2356 2120 +> 15 0 30 2351 topology 2356 2121 +> 16 0 30 2351 topology 2461 2121 +> 15 0 29 2351 topology 2361 2122 +> 16 0 29 2351 topology 2362 2122 +> 15 0 30 2351 topology 2362 2123 +> 16 0 30 2351 topology 2461 2123 +> 15 0 29 2351 topology 2367 2124 +> 16 0 29 2351 topology 2368 2124 +> 15 0 30 2351 topology 2368 2125 +> 16 0 30 2351 topology 2461 2125 +> 15 0 29 2351 topology 2373 2126 +> 16 0 29 2351 topology 2374 2126 +> 15 0 30 2351 topology 2374 2127 +> 16 0 30 2351 topology 2461 2127 +> 15 0 29 2351 topology 2409 2128 +> 16 0 29 2351 topology 2410 2128 +> 15 0 30 2351 topology 2410 2129 +> 16 0 30 2351 topology 2461 2129 +> 15 0 29 2351 topology 2415 2130 +> 16 0 29 2351 topology 2416 2130 +> 15 0 30 2351 topology 2416 2131 +> 16 0 30 2351 topology 2461 2131 +> 15 0 29 2351 topology 2421 2132 +> 16 0 29 2351 topology 2422 2132 +> 15 0 30 2351 topology 2422 2133 +> 16 0 30 2351 topology 2461 2133 +> 15 0 29 2351 topology 2427 2134 +> 16 0 29 2351 topology 2428 2134 +> 15 0 30 2351 topology 2428 2135 +> 16 0 30 2351 topology 2461 2135 +> 15 0 29 2351 topology 2433 2136 +> 16 0 29 2351 topology 2434 2136 +> 15 0 30 2351 topology 2434 2137 +> 16 0 30 2351 topology 2461 2137 +> 15 0 29 2351 topology 2379 2138 +> 16 0 29 2351 topology 2380 2138 +> 15 0 30 2351 topology 2380 2139 +> 16 0 30 2351 topology 2461 2139 +> 15 0 29 2351 topology 2385 2140 +> 16 0 29 2351 topology 2386 2140 +> 15 0 30 2351 topology 2386 2141 +> 16 0 30 2351 topology 2461 2141 +> 15 0 29 2351 topology 2442 2142 +> 16 0 29 2351 topology 2443 2142 +> 15 0 30 2351 topology 2443 2143 +> 16 0 30 2351 topology 2461 2143 +> 15 0 29 2351 topology 2391 2144 +> 16 0 29 2351 topology 2392 2144 +> 15 0 30 2351 topology 2392 2145 +> 16 0 30 2351 topology 2461 2145 +> 15 0 29 2351 topology 2448 2146 +> 16 0 29 2351 topology 2449 2146 +> 15 0 30 2351 topology 2449 2147 +> 16 0 30 2351 topology 2461 2147 +> 15 0 29 2351 topology 2397 2148 +> 16 0 29 2351 topology 2398 2148 +> 15 0 30 2351 topology 2398 2149 +> 16 0 30 2351 topology 2461 2149 +> 15 0 29 2351 topology 2454 2150 +> 16 0 29 2351 topology 2455 2150 +> 15 0 30 2351 topology 2455 2151 +> 16 0 30 2351 topology 2461 2151 +> 15 0 29 2351 topology 2403 2152 +> 16 0 29 2351 topology 2404 2152 +> 15 0 30 2351 topology 2404 2153 +> 16 0 30 2351 topology 2461 2153 +> 15 0 29 2573 topology 2592 2154 +> 16 0 29 2573 topology 2593 2154 +> 15 0 30 2573 topology 2593 2155 +> 16 0 30 2573 topology 2683 2155 +> 15 0 30 2573 topology 2683 2156 +> 16 0 30 2573 topology 2651 2156 +> 15 0 31 2573 topology 2651 2157 +> 16 0 31 2573 topology 2649 2157 +> 15 0 30 2573 topology 2683 2158 +> 16 0 30 2573 topology 2597 2158 +> 15 0 31 2573 topology 2597 2159 +> 16 0 31 2573 topology 2595 2159 +> 15 0 30 2573 topology 2683 2160 +> 16 0 30 2573 topology 2603 2160 +> 15 0 31 2573 topology 2603 2161 +> 16 0 31 2573 topology 2601 2161 +> 15 0 30 2573 topology 2683 2162 +> 16 0 30 2573 topology 2609 2162 +> 15 0 31 2573 topology 2609 2163 +> 16 0 31 2573 topology 2607 2163 +> 15 0 30 2573 topology 2683 2164 +> 16 0 30 2573 topology 2615 2164 +> 15 0 31 2573 topology 2615 2165 +> 16 0 31 2573 topology 2613 2165 +> 15 0 30 2573 topology 2683 2166 +> 16 0 30 2573 topology 2621 2166 +> 15 0 31 2573 topology 2621 2167 +> 16 0 31 2573 topology 2619 2167 +> 15 0 30 2573 topology 2683 2168 +> 16 0 30 2573 topology 2660 2168 +> 15 0 31 2573 topology 2660 2169 +> 16 0 31 2573 topology 2658 2169 +> 15 0 30 2573 topology 2683 2170 +> 16 0 30 2573 topology 2666 2170 +> 15 0 31 2573 topology 2666 2171 +> 16 0 31 2573 topology 2664 2171 +> 15 0 30 2573 topology 2683 2172 +> 16 0 30 2573 topology 2672 2172 +> 15 0 31 2573 topology 2672 2173 +> 16 0 31 2573 topology 2670 2173 +> 15 0 30 2573 topology 2683 2174 +> 16 0 30 2573 topology 2678 2174 +> 15 0 31 2573 topology 2678 2175 +> 16 0 31 2573 topology 2676 2175 +> 15 0 30 2573 topology 2683 2176 +> 16 0 30 2573 topology 2630 2176 +> 15 0 31 2573 topology 2630 2177 +> 16 0 31 2573 topology 2628 2177 +> 15 0 30 2573 topology 2683 2178 +> 16 0 30 2573 topology 2579 2178 +> 15 0 31 2573 topology 2579 2179 +> 16 0 31 2573 topology 2577 2179 +> 15 0 30 2573 topology 2683 2180 +> 16 0 30 2573 topology 2636 2180 +> 15 0 31 2573 topology 2636 2181 +> 16 0 31 2573 topology 2634 2181 +> 15 0 30 2573 topology 2683 2182 +> 16 0 30 2573 topology 2585 2182 +> 15 0 31 2573 topology 2585 2183 +> 16 0 31 2573 topology 2583 2183 +> 15 0 30 2573 topology 2683 2184 +> 16 0 30 2573 topology 2642 2184 +> 15 0 31 2573 topology 2642 2185 +> 16 0 31 2573 topology 2640 2185 +> 15 0 30 2573 topology 2683 2186 +> 16 0 30 2573 topology 2591 2186 +> 15 0 31 2573 topology 2591 2187 +> 16 0 31 2573 topology 2589 2187 +> 15 0 30 2573 topology 2683 2188 +> 16 0 30 2573 topology 2648 2188 +> 15 0 31 2573 topology 2648 2189 +> 16 0 31 2573 topology 2646 2189 +> 15 0 30 2573 topology 2683 2190 +> 16 0 30 2573 topology 2654 2190 +> 15 0 31 2573 topology 2654 2191 +> 16 0 31 2573 topology 2652 2191 +> 15 0 30 2573 topology 2683 2192 +> 16 0 30 2573 topology 2600 2192 +> 15 0 31 2573 topology 2600 2193 +> 16 0 31 2573 topology 2598 2193 +> 15 0 30 2573 topology 2683 2194 +> 16 0 30 2573 topology 2606 2194 +> 15 0 31 2573 topology 2606 2195 +> 16 0 31 2573 topology 2604 2195 +> 15 0 30 2573 topology 2683 2196 +> 16 0 30 2573 topology 2612 2196 +> 15 0 31 2573 topology 2612 2197 +> 16 0 31 2573 topology 2610 2197 +> 15 0 30 2573 topology 2683 2198 +> 16 0 30 2573 topology 2618 2198 +> 15 0 31 2573 topology 2618 2199 +> 16 0 31 2573 topology 2616 2199 +> 15 0 30 2573 topology 2683 2200 +> 16 0 30 2573 topology 2624 2200 +> 15 0 31 2573 topology 2624 2201 +> 16 0 31 2573 topology 2622 2201 +> 15 0 30 2573 topology 2683 2202 +> 16 0 30 2573 topology 2657 2202 +> 15 0 31 2573 topology 2657 2203 +> 16 0 31 2573 topology 2655 2203 +> 15 0 30 2573 topology 2683 2204 +> 16 0 30 2573 topology 2663 2204 +> 15 0 31 2573 topology 2663 2205 +> 16 0 31 2573 topology 2661 2205 +> 15 0 30 2573 topology 2683 2206 +> 16 0 30 2573 topology 2669 2206 +> 15 0 31 2573 topology 2669 2207 +> 16 0 31 2573 topology 2667 2207 +> 15 0 30 2573 topology 2683 2208 +> 16 0 30 2573 topology 2675 2208 +> 15 0 31 2573 topology 2675 2209 +> 16 0 31 2573 topology 2673 2209 +> 15 0 32 2573 topology 2683 2210 +> 16 0 32 2573 topology 2682 2210 +> 15 0 30 2573 topology 2683 2211 +> 16 0 30 2573 topology 2681 2211 +> 15 0 31 2573 topology 2681 2212 +> 16 0 31 2573 topology 2679 2212 +> 15 0 30 2573 topology 2683 2213 +> 16 0 30 2573 topology 2627 2213 +> 15 0 31 2573 topology 2627 2214 +> 16 0 31 2573 topology 2625 2214 +> 15 0 30 2573 topology 2683 2215 +> 16 0 30 2573 topology 2576 2215 +> 15 0 31 2573 topology 2576 2216 +> 16 0 31 2573 topology 2574 2216 +> 15 0 30 2573 topology 2683 2217 +> 16 0 30 2573 topology 2633 2217 +> 15 0 31 2573 topology 2633 2218 +> 16 0 31 2573 topology 2631 2218 +> 15 0 30 2573 topology 2683 2219 +> 16 0 30 2573 topology 2582 2219 +> 15 0 31 2573 topology 2582 2220 +> 16 0 31 2573 topology 2580 2220 +> 15 0 30 2573 topology 2683 2221 +> 16 0 30 2573 topology 2639 2221 +> 15 0 31 2573 topology 2639 2222 +> 16 0 31 2573 topology 2637 2222 +> 15 0 30 2573 topology 2683 2223 +> 16 0 30 2573 topology 2588 2223 +> 15 0 31 2573 topology 2588 2224 +> 16 0 31 2573 topology 2586 2224 +> 15 0 30 2573 topology 2683 2225 +> 16 0 30 2573 topology 2645 2225 +> 15 0 31 2573 topology 2645 2226 +> 16 0 31 2573 topology 2643 2226 +> 15 0 29 2573 topology 2649 2227 +> 16 0 29 2573 topology 2650 2227 +> 15 0 30 2573 topology 2650 2228 +> 16 0 30 2573 topology 2683 2228 +> 15 0 30 2573 topology 2683 2229 +> 16 0 30 2573 topology 2594 2229 +> 15 0 31 2573 topology 2594 2230 +> 16 0 31 2573 topology 2592 2230 +> 15 0 29 2573 topology 2595 2231 +> 16 0 29 2573 topology 2596 2231 +> 15 0 30 2573 topology 2596 2232 +> 16 0 30 2573 topology 2683 2232 +> 15 0 29 2573 topology 2601 2233 +> 16 0 29 2573 topology 2602 2233 +> 15 0 30 2573 topology 2602 2234 +> 16 0 30 2573 topology 2683 2234 +> 15 0 29 2573 topology 2607 2235 +> 16 0 29 2573 topology 2608 2235 +> 15 0 30 2573 topology 2608 2236 +> 16 0 30 2573 topology 2683 2236 +> 15 0 29 2573 topology 2613 2237 +> 16 0 29 2573 topology 2614 2237 +> 15 0 30 2573 topology 2614 2238 +> 16 0 30 2573 topology 2683 2238 +> 15 0 29 2573 topology 2619 2239 +> 16 0 29 2573 topology 2620 2239 +> 15 0 30 2573 topology 2620 2240 +> 16 0 30 2573 topology 2683 2240 +> 15 0 29 2573 topology 2658 2241 +> 16 0 29 2573 topology 2659 2241 +> 15 0 30 2573 topology 2659 2242 +> 16 0 30 2573 topology 2683 2242 +> 15 0 29 2573 topology 2664 2243 +> 16 0 29 2573 topology 2665 2243 +> 15 0 30 2573 topology 2665 2244 +> 16 0 30 2573 topology 2683 2244 +> 15 0 29 2573 topology 2670 2245 +> 16 0 29 2573 topology 2671 2245 +> 15 0 30 2573 topology 2671 2246 +> 16 0 30 2573 topology 2683 2246 +> 15 0 29 2573 topology 2676 2247 +> 16 0 29 2573 topology 2677 2247 +> 15 0 30 2573 topology 2677 2248 +> 16 0 30 2573 topology 2683 2248 +> 15 0 29 2573 topology 2628 2249 +> 16 0 29 2573 topology 2629 2249 +> 15 0 30 2573 topology 2629 2250 +> 16 0 30 2573 topology 2683 2250 +> 15 0 29 2573 topology 2577 2251 +> 16 0 29 2573 topology 2578 2251 +> 15 0 30 2573 topology 2578 2252 +> 16 0 30 2573 topology 2683 2252 +> 15 0 29 2573 topology 2634 2253 +> 16 0 29 2573 topology 2635 2253 +> 15 0 30 2573 topology 2635 2254 +> 16 0 30 2573 topology 2683 2254 +> 15 0 29 2573 topology 2583 2255 +> 16 0 29 2573 topology 2584 2255 +> 15 0 30 2573 topology 2584 2256 +> 16 0 30 2573 topology 2683 2256 +> 15 0 29 2573 topology 2640 2257 +> 16 0 29 2573 topology 2641 2257 +> 15 0 30 2573 topology 2641 2258 +> 16 0 30 2573 topology 2683 2258 +> 15 0 29 2573 topology 2589 2259 +> 16 0 29 2573 topology 2590 2259 +> 15 0 30 2573 topology 2590 2260 +> 16 0 30 2573 topology 2683 2260 +> 15 0 29 2573 topology 2646 2261 +> 16 0 29 2573 topology 2647 2261 +> 15 0 30 2573 topology 2647 2262 +> 16 0 30 2573 topology 2683 2262 +> 15 0 29 2573 topology 2652 2263 +> 16 0 29 2573 topology 2653 2263 +> 15 0 30 2573 topology 2653 2264 +> 16 0 30 2573 topology 2683 2264 +> 15 0 29 2573 topology 2598 2265 +> 16 0 29 2573 topology 2599 2265 +> 15 0 30 2573 topology 2599 2266 +> 16 0 30 2573 topology 2683 2266 +> 15 0 29 2573 topology 2604 2267 +> 16 0 29 2573 topology 2605 2267 +> 15 0 30 2573 topology 2605 2268 +> 16 0 30 2573 topology 2683 2268 +> 15 0 29 2573 topology 2610 2269 +> 16 0 29 2573 topology 2611 2269 +> 15 0 30 2573 topology 2611 2270 +> 16 0 30 2573 topology 2683 2270 +> 15 0 29 2573 topology 2616 2271 +> 16 0 29 2573 topology 2617 2271 +> 15 0 30 2573 topology 2617 2272 +> 16 0 30 2573 topology 2683 2272 +> 15 0 29 2573 topology 2622 2273 +> 16 0 29 2573 topology 2623 2273 +> 15 0 30 2573 topology 2623 2274 +> 16 0 30 2573 topology 2683 2274 +> 15 0 29 2573 topology 2655 2275 +> 16 0 29 2573 topology 2656 2275 +> 15 0 30 2573 topology 2656 2276 +> 16 0 30 2573 topology 2683 2276 +> 15 0 29 2573 topology 2661 2277 +> 16 0 29 2573 topology 2662 2277 +> 15 0 30 2573 topology 2662 2278 +> 16 0 30 2573 topology 2683 2278 +> 15 0 29 2573 topology 2667 2279 +> 16 0 29 2573 topology 2668 2279 +> 15 0 30 2573 topology 2668 2280 +> 16 0 30 2573 topology 2683 2280 +> 15 0 29 2573 topology 2673 2281 +> 16 0 29 2573 topology 2674 2281 +> 15 0 30 2573 topology 2674 2282 +> 16 0 30 2573 topology 2683 2282 +> 15 0 29 2573 topology 2679 2283 +> 16 0 29 2573 topology 2680 2283 +> 15 0 30 2573 topology 2680 2284 +> 16 0 30 2573 topology 2683 2284 +> 15 0 29 2573 topology 2625 2285 +> 16 0 29 2573 topology 2626 2285 +> 15 0 30 2573 topology 2626 2286 +> 16 0 30 2573 topology 2683 2286 +> 15 0 29 2573 topology 2574 2287 +> 16 0 29 2573 topology 2575 2287 +> 15 0 30 2573 topology 2575 2288 +> 16 0 30 2573 topology 2683 2288 +> 15 0 29 2573 topology 2631 2289 +> 16 0 29 2573 topology 2632 2289 +> 15 0 30 2573 topology 2632 2290 +> 16 0 30 2573 topology 2683 2290 +> 15 0 29 2573 topology 2580 2291 +> 16 0 29 2573 topology 2581 2291 +> 15 0 30 2573 topology 2581 2292 +> 16 0 30 2573 topology 2683 2292 +> 15 0 29 2573 topology 2637 2293 +> 16 0 29 2573 topology 2638 2293 +> 15 0 30 2573 topology 2638 2294 +> 16 0 30 2573 topology 2683 2294 +> 15 0 29 2573 topology 2586 2295 +> 16 0 29 2573 topology 2587 2295 +> 15 0 30 2573 topology 2587 2296 +> 16 0 30 2573 topology 2683 2296 +> 15 0 29 2573 topology 2643 2297 +> 16 0 29 2573 topology 2644 2297 +> 15 0 30 2573 topology 2644 2298 +> 16 0 30 2573 topology 2683 2298 +> 15 0 29 2795 topology 2814 2299 +> 16 0 29 2795 topology 2815 2299 +> 15 0 30 2795 topology 2815 2300 +> 16 0 30 2795 topology 2905 2300 +> 15 0 30 2795 topology 2905 2301 +> 16 0 30 2795 topology 2873 2301 +> 15 0 31 2795 topology 2873 2302 +> 16 0 31 2795 topology 2871 2302 +> 15 0 30 2795 topology 2905 2303 +> 16 0 30 2795 topology 2822 2303 +> 15 0 31 2795 topology 2822 2304 +> 16 0 31 2795 topology 2820 2304 +> 15 0 30 2795 topology 2905 2305 +> 16 0 30 2795 topology 2879 2305 +> 15 0 31 2795 topology 2879 2306 +> 16 0 31 2795 topology 2877 2306 +> 15 0 30 2795 topology 2905 2307 +> 16 0 30 2795 topology 2828 2307 +> 15 0 31 2795 topology 2828 2308 +> 16 0 31 2795 topology 2826 2308 +> 15 0 30 2795 topology 2905 2309 +> 16 0 30 2795 topology 2885 2309 +> 15 0 31 2795 topology 2885 2310 +> 16 0 31 2795 topology 2883 2310 +> 15 0 30 2795 topology 2905 2311 +> 16 0 30 2795 topology 2834 2311 +> 15 0 31 2795 topology 2834 2312 +> 16 0 31 2795 topology 2832 2312 +> 15 0 30 2795 topology 2905 2313 +> 16 0 30 2795 topology 2891 2313 +> 15 0 31 2795 topology 2891 2314 +> 16 0 31 2795 topology 2889 2314 +> 15 0 30 2795 topology 2905 2315 +> 16 0 30 2795 topology 2840 2315 +> 15 0 31 2795 topology 2840 2316 +> 16 0 31 2795 topology 2838 2316 +> 15 0 30 2795 topology 2905 2317 +> 16 0 30 2795 topology 2897 2317 +> 15 0 31 2795 topology 2897 2318 +> 16 0 31 2795 topology 2895 2318 +> 15 0 30 2795 topology 2905 2319 +> 16 0 30 2795 topology 2843 2319 +> 15 0 31 2795 topology 2843 2320 +> 16 0 31 2795 topology 2841 2320 +> 15 0 30 2795 topology 2905 2321 +> 16 0 30 2795 topology 2849 2321 +> 15 0 31 2795 topology 2849 2322 +> 16 0 31 2795 topology 2847 2322 +> 15 0 32 2795 topology 2905 2323 +> 16 0 32 2795 topology 2904 2323 +> 15 0 30 2795 topology 2905 2324 +> 16 0 30 2795 topology 2798 2324 +> 15 0 31 2795 topology 2798 2325 +> 16 0 31 2795 topology 2796 2325 +> 15 0 30 2795 topology 2905 2326 +> 16 0 30 2795 topology 2855 2326 +> 15 0 31 2795 topology 2855 2327 +> 16 0 31 2795 topology 2853 2327 +> 15 0 30 2795 topology 2905 2328 +> 16 0 30 2795 topology 2804 2328 +> 15 0 31 2795 topology 2804 2329 +> 16 0 31 2795 topology 2802 2329 +> 15 0 30 2795 topology 2905 2330 +> 16 0 30 2795 topology 2861 2330 +> 15 0 31 2795 topology 2861 2331 +> 16 0 31 2795 topology 2859 2331 +> 15 0 30 2795 topology 2905 2332 +> 16 0 30 2795 topology 2810 2332 +> 15 0 31 2795 topology 2810 2333 +> 16 0 31 2795 topology 2808 2333 +> 15 0 30 2795 topology 2905 2334 +> 16 0 30 2795 topology 2867 2334 +> 15 0 31 2795 topology 2867 2335 +> 16 0 31 2795 topology 2865 2335 +> 15 0 30 2795 topology 2905 2336 +> 16 0 30 2795 topology 2813 2336 +> 15 0 31 2795 topology 2813 2337 +> 16 0 31 2795 topology 2811 2337 +> 15 0 30 2795 topology 2905 2338 +> 16 0 30 2795 topology 2819 2338 +> 15 0 31 2795 topology 2819 2339 +> 16 0 31 2795 topology 2817 2339 +> 15 0 30 2795 topology 2905 2340 +> 16 0 30 2795 topology 2876 2340 +> 15 0 31 2795 topology 2876 2341 +> 16 0 31 2795 topology 2874 2341 +> 15 0 30 2795 topology 2905 2342 +> 16 0 30 2795 topology 2825 2342 +> 15 0 31 2795 topology 2825 2343 +> 16 0 31 2795 topology 2823 2343 +> 15 0 30 2795 topology 2905 2344 +> 16 0 30 2795 topology 2882 2344 +> 15 0 31 2795 topology 2882 2345 +> 16 0 31 2795 topology 2880 2345 +> 15 0 30 2795 topology 2905 2346 +> 16 0 30 2795 topology 2831 2346 +> 15 0 31 2795 topology 2831 2347 +> 16 0 31 2795 topology 2829 2347 +> 15 0 30 2795 topology 2905 2348 +> 16 0 30 2795 topology 2888 2348 +> 15 0 31 2795 topology 2888 2349 +> 16 0 31 2795 topology 2886 2349 +> 15 0 30 2795 topology 2905 2350 +> 16 0 30 2795 topology 2837 2350 +> 15 0 31 2795 topology 2837 2351 +> 16 0 31 2795 topology 2835 2351 +> 15 0 30 2795 topology 2905 2352 +> 16 0 30 2795 topology 2894 2352 +> 15 0 31 2795 topology 2894 2353 +> 16 0 31 2795 topology 2892 2353 +> 15 0 30 2795 topology 2905 2354 +> 16 0 30 2795 topology 2900 2354 +> 15 0 31 2795 topology 2900 2355 +> 16 0 31 2795 topology 2898 2355 +> 15 0 30 2795 topology 2905 2356 +> 16 0 30 2795 topology 2846 2356 +> 15 0 31 2795 topology 2846 2357 +> 16 0 31 2795 topology 2844 2357 +> 15 0 30 2795 topology 2905 2358 +> 16 0 30 2795 topology 2903 2358 +> 15 0 31 2795 topology 2903 2359 +> 16 0 31 2795 topology 2901 2359 +> 15 0 30 2795 topology 2905 2360 +> 16 0 30 2795 topology 2852 2360 +> 15 0 31 2795 topology 2852 2361 +> 16 0 31 2795 topology 2850 2361 +> 15 0 30 2795 topology 2905 2362 +> 16 0 30 2795 topology 2801 2362 +> 15 0 31 2795 topology 2801 2363 +> 16 0 31 2795 topology 2799 2363 +> 15 0 30 2795 topology 2905 2364 +> 16 0 30 2795 topology 2858 2364 +> 15 0 31 2795 topology 2858 2365 +> 16 0 31 2795 topology 2856 2365 +> 15 0 30 2795 topology 2905 2366 +> 16 0 30 2795 topology 2807 2366 +> 15 0 31 2795 topology 2807 2367 +> 16 0 31 2795 topology 2805 2367 +> 15 0 30 2795 topology 2905 2368 +> 16 0 30 2795 topology 2864 2368 +> 15 0 31 2795 topology 2864 2369 +> 16 0 31 2795 topology 2862 2369 +> 15 0 30 2795 topology 2905 2370 +> 16 0 30 2795 topology 2870 2370 +> 15 0 31 2795 topology 2870 2371 +> 16 0 31 2795 topology 2868 2371 +> 15 0 29 2795 topology 2871 2372 +> 16 0 29 2795 topology 2872 2372 +> 15 0 30 2795 topology 2872 2373 +> 16 0 30 2795 topology 2905 2373 +> 15 0 30 2795 topology 2905 2374 +> 16 0 30 2795 topology 2816 2374 +> 15 0 31 2795 topology 2816 2375 +> 16 0 31 2795 topology 2814 2375 +> 15 0 29 2795 topology 2820 2376 +> 16 0 29 2795 topology 2821 2376 +> 15 0 30 2795 topology 2821 2377 +> 16 0 30 2795 topology 2905 2377 +> 15 0 29 2795 topology 2877 2378 +> 16 0 29 2795 topology 2878 2378 +> 15 0 30 2795 topology 2878 2379 +> 16 0 30 2795 topology 2905 2379 +> 15 0 29 2795 topology 2826 2380 +> 16 0 29 2795 topology 2827 2380 +> 15 0 30 2795 topology 2827 2381 +> 16 0 30 2795 topology 2905 2381 +> 15 0 29 2795 topology 2883 2382 +> 16 0 29 2795 topology 2884 2382 +> 15 0 30 2795 topology 2884 2383 +> 16 0 30 2795 topology 2905 2383 +> 15 0 29 2795 topology 2832 2384 +> 16 0 29 2795 topology 2833 2384 +> 15 0 30 2795 topology 2833 2385 +> 16 0 30 2795 topology 2905 2385 +> 15 0 29 2795 topology 2889 2386 +> 16 0 29 2795 topology 2890 2386 +> 15 0 30 2795 topology 2890 2387 +> 16 0 30 2795 topology 2905 2387 +> 15 0 29 2795 topology 2838 2388 +> 16 0 29 2795 topology 2839 2388 +> 15 0 30 2795 topology 2839 2389 +> 16 0 30 2795 topology 2905 2389 +> 15 0 29 2795 topology 2895 2390 +> 16 0 29 2795 topology 2896 2390 +> 15 0 30 2795 topology 2896 2391 +> 16 0 30 2795 topology 2905 2391 +> 15 0 29 2795 topology 2841 2392 +> 16 0 29 2795 topology 2842 2392 +> 15 0 30 2795 topology 2842 2393 +> 16 0 30 2795 topology 2905 2393 +> 15 0 29 2795 topology 2847 2394 +> 16 0 29 2795 topology 2848 2394 +> 15 0 30 2795 topology 2848 2395 +> 16 0 30 2795 topology 2905 2395 +> 15 0 29 2795 topology 2796 2396 +> 16 0 29 2795 topology 2797 2396 +> 15 0 30 2795 topology 2797 2397 +> 16 0 30 2795 topology 2905 2397 +> 15 0 29 2795 topology 2853 2398 +> 16 0 29 2795 topology 2854 2398 +> 15 0 30 2795 topology 2854 2399 +> 16 0 30 2795 topology 2905 2399 +> 15 0 29 2795 topology 2802 2400 +> 16 0 29 2795 topology 2803 2400 +> 15 0 30 2795 topology 2803 2401 +> 16 0 30 2795 topology 2905 2401 +> 15 0 29 2795 topology 2859 2402 +> 16 0 29 2795 topology 2860 2402 +> 15 0 30 2795 topology 2860 2403 +> 16 0 30 2795 topology 2905 2403 +> 15 0 29 2795 topology 2808 2404 +> 16 0 29 2795 topology 2809 2404 +> 15 0 30 2795 topology 2809 2405 +> 16 0 30 2795 topology 2905 2405 +> 15 0 29 2795 topology 2865 2406 +> 16 0 29 2795 topology 2866 2406 +> 15 0 30 2795 topology 2866 2407 +> 16 0 30 2795 topology 2905 2407 +> 15 0 29 2795 topology 2811 2408 +> 16 0 29 2795 topology 2812 2408 +> 15 0 30 2795 topology 2812 2409 +> 16 0 30 2795 topology 2905 2409 +> 15 0 29 2795 topology 2817 2410 +> 16 0 29 2795 topology 2818 2410 +> 15 0 30 2795 topology 2818 2411 +> 16 0 30 2795 topology 2905 2411 +> 15 0 29 2795 topology 2874 2412 +> 16 0 29 2795 topology 2875 2412 +> 15 0 30 2795 topology 2875 2413 +> 16 0 30 2795 topology 2905 2413 +> 15 0 29 2795 topology 2823 2414 +> 16 0 29 2795 topology 2824 2414 +> 15 0 30 2795 topology 2824 2415 +> 16 0 30 2795 topology 2905 2415 +> 15 0 29 2795 topology 2880 2416 +> 16 0 29 2795 topology 2881 2416 +> 15 0 30 2795 topology 2881 2417 +> 16 0 30 2795 topology 2905 2417 +> 15 0 29 2795 topology 2829 2418 +> 16 0 29 2795 topology 2830 2418 +> 15 0 30 2795 topology 2830 2419 +> 16 0 30 2795 topology 2905 2419 +> 15 0 29 2795 topology 2886 2420 +> 16 0 29 2795 topology 2887 2420 +> 15 0 30 2795 topology 2887 2421 +> 16 0 30 2795 topology 2905 2421 +> 15 0 29 2795 topology 2835 2422 +> 16 0 29 2795 topology 2836 2422 +> 15 0 30 2795 topology 2836 2423 +> 16 0 30 2795 topology 2905 2423 +> 15 0 29 2795 topology 2892 2424 +> 16 0 29 2795 topology 2893 2424 +> 15 0 30 2795 topology 2893 2425 +> 16 0 30 2795 topology 2905 2425 +> 15 0 29 2795 topology 2898 2426 +> 16 0 29 2795 topology 2899 2426 +> 15 0 30 2795 topology 2899 2427 +> 16 0 30 2795 topology 2905 2427 +> 15 0 29 2795 topology 2844 2428 +> 16 0 29 2795 topology 2845 2428 +> 15 0 30 2795 topology 2845 2429 +> 16 0 30 2795 topology 2905 2429 +> 15 0 29 2795 topology 2901 2430 +> 16 0 29 2795 topology 2902 2430 +> 15 0 30 2795 topology 2902 2431 +> 16 0 30 2795 topology 2905 2431 +> 15 0 29 2795 topology 2850 2432 +> 16 0 29 2795 topology 2851 2432 +> 15 0 30 2795 topology 2851 2433 +> 16 0 30 2795 topology 2905 2433 +> 15 0 29 2795 topology 2799 2434 +> 16 0 29 2795 topology 2800 2434 +> 15 0 30 2795 topology 2800 2435 +> 16 0 30 2795 topology 2905 2435 +> 15 0 29 2795 topology 2856 2436 +> 16 0 29 2795 topology 2857 2436 +> 15 0 30 2795 topology 2857 2437 +> 16 0 30 2795 topology 2905 2437 +> 15 0 29 2795 topology 2805 2438 +> 16 0 29 2795 topology 2806 2438 +> 15 0 30 2795 topology 2806 2439 +> 16 0 30 2795 topology 2905 2439 +> 15 0 29 2795 topology 2862 2440 +> 16 0 29 2795 topology 2863 2440 +> 15 0 30 2795 topology 2863 2441 +> 16 0 30 2795 topology 2905 2441 +> 15 0 29 2795 topology 2868 2442 +> 16 0 29 2795 topology 2869 2442 +> 15 0 30 2795 topology 2869 2443 +> 16 0 30 2795 topology 2905 2443 +> 15 0 29 2981 topology 3021 2444 +> 16 0 29 2981 topology 3022 2444 +> 15 0 30 2981 topology 3022 2445 +> 16 0 30 2981 topology 3091 2445 +> 15 0 30 2981 topology 3091 2446 +> 16 0 30 2981 topology 3029 2446 +> 15 0 31 2981 topology 3029 2447 +> 16 0 31 2981 topology 3027 2447 +> 15 0 30 2981 topology 3091 2448 +> 16 0 30 2981 topology 3086 2448 +> 15 0 31 2981 topology 3086 2449 +> 16 0 31 2981 topology 3084 2449 +> 15 0 30 2981 topology 3091 2450 +> 16 0 30 2981 topology 3035 2450 +> 15 0 31 2981 topology 3035 2451 +> 16 0 31 2981 topology 3033 2451 +> 15 0 30 2981 topology 3091 2452 +> 16 0 30 2981 topology 2984 2452 +> 15 0 31 2981 topology 2984 2453 +> 16 0 31 2981 topology 2982 2453 +> 15 0 30 2981 topology 3091 2454 +> 16 0 30 2981 topology 3041 2454 +> 15 0 31 2981 topology 3041 2455 +> 16 0 31 2981 topology 3039 2455 +> 15 0 30 2981 topology 3091 2456 +> 16 0 30 2981 topology 2990 2456 +> 15 0 31 2981 topology 2990 2457 +> 16 0 31 2981 topology 2988 2457 +> 15 0 30 2981 topology 3091 2458 +> 16 0 30 2981 topology 3047 2458 +> 15 0 31 2981 topology 3047 2459 +> 16 0 31 2981 topology 3045 2459 +> 15 0 30 2981 topology 3091 2460 +> 16 0 30 2981 topology 2993 2460 +> 15 0 31 2981 topology 2993 2461 +> 16 0 31 2981 topology 2991 2461 +> 15 0 30 2981 topology 3091 2462 +> 16 0 30 2981 topology 2999 2462 +> 15 0 31 2981 topology 2999 2463 +> 16 0 31 2981 topology 2997 2463 +> 15 0 30 2981 topology 3091 2464 +> 16 0 30 2981 topology 3056 2464 +> 15 0 31 2981 topology 3056 2465 +> 16 0 31 2981 topology 3054 2465 +> 15 0 30 2981 topology 3091 2466 +> 16 0 30 2981 topology 3005 2466 +> 15 0 31 2981 topology 3005 2467 +> 16 0 31 2981 topology 3003 2467 +> 15 0 30 2981 topology 3091 2468 +> 16 0 30 2981 topology 3062 2468 +> 15 0 31 2981 topology 3062 2469 +> 16 0 31 2981 topology 3060 2469 +> 15 0 30 2981 topology 3091 2470 +> 16 0 30 2981 topology 3011 2470 +> 15 0 31 2981 topology 3011 2471 +> 16 0 31 2981 topology 3009 2471 +> 15 0 30 2981 topology 3091 2472 +> 16 0 30 2981 topology 3068 2472 +> 15 0 31 2981 topology 3068 2473 +> 16 0 31 2981 topology 3066 2473 +> 15 0 30 2981 topology 3091 2474 +> 16 0 30 2981 topology 3017 2474 +> 15 0 31 2981 topology 3017 2475 +> 16 0 31 2981 topology 3015 2475 +> 15 0 30 2981 topology 3091 2476 +> 16 0 30 2981 topology 3074 2476 +> 15 0 31 2981 topology 3074 2477 +> 16 0 31 2981 topology 3072 2477 +> 15 0 30 2981 topology 3091 2478 +> 16 0 30 2981 topology 3080 2478 +> 15 0 31 2981 topology 3080 2479 +> 16 0 31 2981 topology 3078 2479 +> 15 0 30 2981 topology 3091 2480 +> 16 0 30 2981 topology 3026 2480 +> 15 0 31 2981 topology 3026 2481 +> 16 0 31 2981 topology 3024 2481 +> 15 0 30 2981 topology 3091 2482 +> 16 0 30 2981 topology 3083 2482 +> 15 0 31 2981 topology 3083 2483 +> 16 0 31 2981 topology 3081 2483 +> 15 0 30 2981 topology 3091 2484 +> 16 0 30 2981 topology 3032 2484 +> 15 0 31 2981 topology 3032 2485 +> 16 0 31 2981 topology 3030 2485 +> 15 0 30 2981 topology 3091 2486 +> 16 0 30 2981 topology 3089 2486 +> 15 0 31 2981 topology 3089 2487 +> 16 0 31 2981 topology 3087 2487 +> 15 0 30 2981 topology 3091 2488 +> 16 0 30 2981 topology 3038 2488 +> 15 0 31 2981 topology 3038 2489 +> 16 0 31 2981 topology 3036 2489 +> 15 0 30 2981 topology 3091 2490 +> 16 0 30 2981 topology 2987 2490 +> 15 0 31 2981 topology 2987 2491 +> 16 0 31 2981 topology 2985 2491 +> 15 0 30 2981 topology 3091 2492 +> 16 0 30 2981 topology 3044 2492 +> 15 0 31 2981 topology 3044 2493 +> 16 0 31 2981 topology 3042 2493 +> 15 0 30 2981 topology 3091 2494 +> 16 0 30 2981 topology 3050 2494 +> 15 0 31 2981 topology 3050 2495 +> 16 0 31 2981 topology 3048 2495 +> 15 0 30 2981 topology 3091 2496 +> 16 0 30 2981 topology 2996 2496 +> 15 0 31 2981 topology 2996 2497 +> 16 0 31 2981 topology 2994 2497 +> 15 0 30 2981 topology 3091 2498 +> 16 0 30 2981 topology 3053 2498 +> 15 0 31 2981 topology 3053 2499 +> 16 0 31 2981 topology 3051 2499 +> 15 0 30 2981 topology 3091 2500 +> 16 0 30 2981 topology 3002 2500 +> 15 0 31 2981 topology 3002 2501 +> 16 0 31 2981 topology 3000 2501 +> 15 0 30 2981 topology 3091 2502 +> 16 0 30 2981 topology 3059 2502 +> 15 0 31 2981 topology 3059 2503 +> 16 0 31 2981 topology 3057 2503 +> 15 0 30 2981 topology 3091 2504 +> 16 0 30 2981 topology 3008 2504 +> 15 0 31 2981 topology 3008 2505 +> 16 0 31 2981 topology 3006 2505 +> 15 0 30 2981 topology 3091 2506 +> 16 0 30 2981 topology 3065 2506 +> 15 0 31 2981 topology 3065 2507 +> 16 0 31 2981 topology 3063 2507 +> 15 0 30 2981 topology 3091 2508 +> 16 0 30 2981 topology 3014 2508 +> 15 0 31 2981 topology 3014 2509 +> 16 0 31 2981 topology 3012 2509 +> 15 0 32 2981 topology 3091 2510 +> 16 0 32 2981 topology 3090 2510 +> 15 0 30 2981 topology 3091 2511 +> 16 0 30 2981 topology 3071 2511 +> 15 0 31 2981 topology 3071 2512 +> 16 0 31 2981 topology 3069 2512 +> 15 0 30 2981 topology 3091 2513 +> 16 0 30 2981 topology 3020 2513 +> 15 0 31 2981 topology 3020 2514 +> 16 0 31 2981 topology 3018 2514 +> 15 0 30 2981 topology 3091 2515 +> 16 0 30 2981 topology 3077 2515 +> 15 0 31 2981 topology 3077 2516 +> 16 0 31 2981 topology 3075 2516 +> 15 0 29 2981 topology 3027 2517 +> 16 0 29 2981 topology 3028 2517 +> 15 0 30 2981 topology 3028 2518 +> 16 0 30 2981 topology 3091 2518 +> 15 0 30 2981 topology 3091 2519 +> 16 0 30 2981 topology 3023 2519 +> 15 0 31 2981 topology 3023 2520 +> 16 0 31 2981 topology 3021 2520 +> 15 0 29 2981 topology 3084 2521 +> 16 0 29 2981 topology 3085 2521 +> 15 0 30 2981 topology 3085 2522 +> 16 0 30 2981 topology 3091 2522 +> 15 0 29 2981 topology 3033 2523 +> 16 0 29 2981 topology 3034 2523 +> 15 0 30 2981 topology 3034 2524 +> 16 0 30 2981 topology 3091 2524 +> 15 0 29 2981 topology 2982 2525 +> 16 0 29 2981 topology 2983 2525 +> 15 0 30 2981 topology 2983 2526 +> 16 0 30 2981 topology 3091 2526 +> 15 0 29 2981 topology 3039 2527 +> 16 0 29 2981 topology 3040 2527 +> 15 0 30 2981 topology 3040 2528 +> 16 0 30 2981 topology 3091 2528 +> 15 0 29 2981 topology 2988 2529 +> 16 0 29 2981 topology 2989 2529 +> 15 0 30 2981 topology 2989 2530 +> 16 0 30 2981 topology 3091 2530 +> 15 0 29 2981 topology 3045 2531 +> 16 0 29 2981 topology 3046 2531 +> 15 0 30 2981 topology 3046 2532 +> 16 0 30 2981 topology 3091 2532 +> 15 0 29 2981 topology 2991 2533 +> 16 0 29 2981 topology 2992 2533 +> 15 0 30 2981 topology 2992 2534 +> 16 0 30 2981 topology 3091 2534 +> 15 0 29 2981 topology 2997 2535 +> 16 0 29 2981 topology 2998 2535 +> 15 0 30 2981 topology 2998 2536 +> 16 0 30 2981 topology 3091 2536 +> 15 0 29 2981 topology 3054 2537 +> 16 0 29 2981 topology 3055 2537 +> 15 0 30 2981 topology 3055 2538 +> 16 0 30 2981 topology 3091 2538 +> 15 0 29 2981 topology 3003 2539 +> 16 0 29 2981 topology 3004 2539 +> 15 0 30 2981 topology 3004 2540 +> 16 0 30 2981 topology 3091 2540 +> 15 0 29 2981 topology 3060 2541 +> 16 0 29 2981 topology 3061 2541 +> 15 0 30 2981 topology 3061 2542 +> 16 0 30 2981 topology 3091 2542 +> 15 0 29 2981 topology 3009 2543 +> 16 0 29 2981 topology 3010 2543 +> 15 0 30 2981 topology 3010 2544 +> 16 0 30 2981 topology 3091 2544 +> 15 0 29 2981 topology 3066 2545 +> 16 0 29 2981 topology 3067 2545 +> 15 0 30 2981 topology 3067 2546 +> 16 0 30 2981 topology 3091 2546 +> 15 0 29 2981 topology 3015 2547 +> 16 0 29 2981 topology 3016 2547 +> 15 0 30 2981 topology 3016 2548 +> 16 0 30 2981 topology 3091 2548 +> 15 0 29 2981 topology 3072 2549 +> 16 0 29 2981 topology 3073 2549 +> 15 0 30 2981 topology 3073 2550 +> 16 0 30 2981 topology 3091 2550 +> 15 0 29 2981 topology 3078 2551 +> 16 0 29 2981 topology 3079 2551 +> 15 0 30 2981 topology 3079 2552 +> 16 0 30 2981 topology 3091 2552 +> 15 0 29 2981 topology 3024 2553 +> 16 0 29 2981 topology 3025 2553 +> 15 0 30 2981 topology 3025 2554 +> 16 0 30 2981 topology 3091 2554 +> 15 0 29 2981 topology 3081 2555 +> 16 0 29 2981 topology 3082 2555 +> 15 0 30 2981 topology 3082 2556 +> 16 0 30 2981 topology 3091 2556 +> 15 0 29 2981 topology 3030 2557 +> 16 0 29 2981 topology 3031 2557 +> 15 0 30 2981 topology 3031 2558 +> 16 0 30 2981 topology 3091 2558 +> 15 0 29 2981 topology 3087 2559 +> 16 0 29 2981 topology 3088 2559 +> 15 0 30 2981 topology 3088 2560 +> 16 0 30 2981 topology 3091 2560 +> 15 0 29 2981 topology 3036 2561 +> 16 0 29 2981 topology 3037 2561 +> 15 0 30 2981 topology 3037 2562 +> 16 0 30 2981 topology 3091 2562 +> 15 0 29 2981 topology 2985 2563 +> 16 0 29 2981 topology 2986 2563 +> 15 0 30 2981 topology 2986 2564 +> 16 0 30 2981 topology 3091 2564 +> 15 0 29 2981 topology 3042 2565 +> 16 0 29 2981 topology 3043 2565 +> 15 0 30 2981 topology 3043 2566 +> 16 0 30 2981 topology 3091 2566 +> 15 0 29 2981 topology 3048 2567 +> 16 0 29 2981 topology 3049 2567 +> 15 0 30 2981 topology 3049 2568 +> 16 0 30 2981 topology 3091 2568 +> 15 0 29 2981 topology 2994 2569 +> 16 0 29 2981 topology 2995 2569 +> 15 0 30 2981 topology 2995 2570 +> 16 0 30 2981 topology 3091 2570 +> 15 0 29 2981 topology 3051 2571 +> 16 0 29 2981 topology 3052 2571 +> 15 0 30 2981 topology 3052 2572 +> 16 0 30 2981 topology 3091 2572 +> 15 0 29 2981 topology 3000 2573 +> 16 0 29 2981 topology 3001 2573 +> 15 0 30 2981 topology 3001 2574 +> 16 0 30 2981 topology 3091 2574 +> 15 0 29 2981 topology 3057 2575 +> 16 0 29 2981 topology 3058 2575 +> 15 0 30 2981 topology 3058 2576 +> 16 0 30 2981 topology 3091 2576 +> 15 0 29 2981 topology 3006 2577 +> 16 0 29 2981 topology 3007 2577 +> 15 0 30 2981 topology 3007 2578 +> 16 0 30 2981 topology 3091 2578 +> 15 0 29 2981 topology 3063 2579 +> 16 0 29 2981 topology 3064 2579 +> 15 0 30 2981 topology 3064 2580 +> 16 0 30 2981 topology 3091 2580 +> 15 0 29 2981 topology 3012 2581 +> 16 0 29 2981 topology 3013 2581 +> 15 0 30 2981 topology 3013 2582 +> 16 0 30 2981 topology 3091 2582 +> 15 0 29 2981 topology 3069 2583 +> 16 0 29 2981 topology 3070 2583 +> 15 0 30 2981 topology 3070 2584 +> 16 0 30 2981 topology 3091 2584 +> 15 0 29 2981 topology 3018 2585 +> 16 0 29 2981 topology 3019 2585 +> 15 0 30 2981 topology 3019 2586 +> 16 0 30 2981 topology 3091 2586 +> 15 0 29 2981 topology 3075 2587 +> 16 0 29 2981 topology 3076 2587 +> 15 0 30 2981 topology 3076 2588 +> 16 0 30 2981 topology 3091 2588 +> 15 0 29 3293 topology 3306 2589 +> 16 0 29 3293 topology 3307 2589 +> 15 0 30 3293 topology 3307 2590 +> 16 0 30 3293 topology 3313 2590 +> 15 0 30 3293 topology 3313 2591 +> 16 0 30 3293 topology 3296 2591 +> 15 0 31 3293 topology 3296 2592 +> 16 0 31 3293 topology 3294 2592 +> 15 0 30 3293 topology 3313 2593 +> 16 0 30 3293 topology 3302 2593 +> 15 0 31 3293 topology 3302 2594 +> 16 0 31 3293 topology 3300 2594 +> 15 0 30 3293 topology 3313 2595 +> 16 0 30 3293 topology 3305 2595 +> 15 0 31 3293 topology 3305 2596 +> 16 0 31 3293 topology 3303 2596 +> 15 0 30 3293 topology 3313 2597 +> 16 0 30 3293 topology 3311 2597 +> 15 0 31 3293 topology 3311 2598 +> 16 0 31 3293 topology 3309 2598 +> 15 0 32 3293 topology 3313 2599 +> 16 0 32 3293 topology 3312 2599 +> 15 0 30 3293 topology 3313 2600 +> 16 0 30 3293 topology 3299 2600 +> 15 0 31 3293 topology 3299 2601 +> 16 0 31 3293 topology 3297 2601 +> 15 0 29 3293 topology 3294 2602 +> 16 0 29 3293 topology 3295 2602 +> 15 0 30 3293 topology 3295 2603 +> 16 0 30 3293 topology 3313 2603 +> 15 0 30 3293 topology 3313 2604 +> 16 0 30 3293 topology 3308 2604 +> 15 0 31 3293 topology 3308 2605 +> 16 0 31 3293 topology 3306 2605 +> 15 0 29 3293 topology 3300 2606 +> 16 0 29 3293 topology 3301 2606 +> 15 0 30 3293 topology 3301 2607 +> 16 0 30 3293 topology 3313 2607 +> 15 0 29 3293 topology 3303 2608 +> 16 0 29 3293 topology 3304 2608 +> 15 0 30 3293 topology 3304 2609 +> 16 0 30 3293 topology 3313 2609 +> 15 0 29 3293 topology 3309 2610 +> 16 0 29 3293 topology 3310 2610 +> 15 0 30 3293 topology 3310 2611 +> 16 0 30 3293 topology 3313 2611 +> 15 0 29 3293 topology 3297 2612 +> 16 0 29 3293 topology 3298 2612 +> 15 0 30 3293 topology 3298 2613 +> 16 0 30 3293 topology 3313 2613 +> 15 0 29 3203 topology 3210 2614 +> 16 0 29 3203 topology 3211 2614 +> 15 0 30 3203 topology 3211 2615 +> 16 0 30 3203 topology 3271 2615 +> 15 0 30 3203 topology 3271 2616 +> 16 0 30 3203 topology 3218 2616 +> 15 0 31 3203 topology 3218 2617 +> 16 0 31 3203 topology 3216 2617 +> 15 0 30 3203 topology 3271 2618 +> 16 0 30 3203 topology 3224 2618 +> 15 0 31 3203 topology 3224 2619 +> 16 0 31 3203 topology 3222 2619 +> 15 0 30 3203 topology 3271 2620 +> 16 0 30 3203 topology 3230 2620 +> 15 0 31 3203 topology 3230 2621 +> 16 0 31 3203 topology 3228 2621 +> 15 0 30 3203 topology 3271 2622 +> 16 0 30 3203 topology 3236 2622 +> 15 0 31 3203 topology 3236 2623 +> 16 0 31 3203 topology 3234 2623 +> 15 0 30 3203 topology 3271 2624 +> 16 0 30 3203 topology 3242 2624 +> 15 0 31 3203 topology 3242 2625 +> 16 0 31 3203 topology 3240 2625 +> 15 0 30 3203 topology 3271 2626 +> 16 0 30 3203 topology 3248 2626 +> 15 0 31 3203 topology 3248 2627 +> 16 0 31 3203 topology 3246 2627 +> 15 0 30 3203 topology 3271 2628 +> 16 0 30 3203 topology 3254 2628 +> 15 0 31 3203 topology 3254 2629 +> 16 0 31 3203 topology 3252 2629 +> 15 0 30 3203 topology 3271 2630 +> 16 0 30 3203 topology 3260 2630 +> 15 0 31 3203 topology 3260 2631 +> 16 0 31 3203 topology 3258 2631 +> 15 0 30 3203 topology 3271 2632 +> 16 0 30 3203 topology 3266 2632 +> 15 0 31 3203 topology 3266 2633 +> 16 0 31 3203 topology 3264 2633 +> 15 0 30 3203 topology 3271 2634 +> 16 0 30 3203 topology 3206 2634 +> 15 0 31 3203 topology 3206 2635 +> 16 0 31 3203 topology 3204 2635 +> 15 0 30 3203 topology 3271 2636 +> 16 0 30 3203 topology 3269 2636 +> 15 0 31 3203 topology 3269 2637 +> 16 0 31 3203 topology 3267 2637 +> 15 0 32 3203 topology 3271 2638 +> 16 0 32 3203 topology 3270 2638 +> 15 0 30 3203 topology 3271 2639 +> 16 0 30 3203 topology 3209 2639 +> 15 0 31 3203 topology 3209 2640 +> 16 0 31 3203 topology 3207 2640 +> 15 0 30 3203 topology 3271 2641 +> 16 0 30 3203 topology 3215 2641 +> 15 0 31 3203 topology 3215 2642 +> 16 0 31 3203 topology 3213 2642 +> 15 0 30 3203 topology 3271 2643 +> 16 0 30 3203 topology 3221 2643 +> 15 0 31 3203 topology 3221 2644 +> 16 0 31 3203 topology 3219 2644 +> 15 0 30 3203 topology 3271 2645 +> 16 0 30 3203 topology 3227 2645 +> 15 0 31 3203 topology 3227 2646 +> 16 0 31 3203 topology 3225 2646 +> 15 0 30 3203 topology 3271 2647 +> 16 0 30 3203 topology 3233 2647 +> 15 0 31 3203 topology 3233 2648 +> 16 0 31 3203 topology 3231 2648 +> 15 0 30 3203 topology 3271 2649 +> 16 0 30 3203 topology 3239 2649 +> 15 0 31 3203 topology 3239 2650 +> 16 0 31 3203 topology 3237 2650 +> 15 0 30 3203 topology 3271 2651 +> 16 0 30 3203 topology 3245 2651 +> 15 0 31 3203 topology 3245 2652 +> 16 0 31 3203 topology 3243 2652 +> 15 0 30 3203 topology 3271 2653 +> 16 0 30 3203 topology 3251 2653 +> 15 0 31 3203 topology 3251 2654 +> 16 0 31 3203 topology 3249 2654 +> 15 0 30 3203 topology 3271 2655 +> 16 0 30 3203 topology 3257 2655 +> 15 0 31 3203 topology 3257 2656 +> 16 0 31 3203 topology 3255 2656 +> 15 0 30 3203 topology 3271 2657 +> 16 0 30 3203 topology 3263 2657 +> 15 0 31 3203 topology 3263 2658 +> 16 0 31 3203 topology 3261 2658 +> 15 0 29 3203 topology 3216 2659 +> 16 0 29 3203 topology 3217 2659 +> 15 0 30 3203 topology 3217 2660 +> 16 0 30 3203 topology 3271 2660 +> 15 0 30 3203 topology 3271 2661 +> 16 0 30 3203 topology 3212 2661 +> 15 0 31 3203 topology 3212 2662 +> 16 0 31 3203 topology 3210 2662 +> 15 0 29 3203 topology 3222 2663 +> 16 0 29 3203 topology 3223 2663 +> 15 0 30 3203 topology 3223 2664 +> 16 0 30 3203 topology 3271 2664 +> 15 0 29 3203 topology 3228 2665 +> 16 0 29 3203 topology 3229 2665 +> 15 0 30 3203 topology 3229 2666 +> 16 0 30 3203 topology 3271 2666 +> 15 0 29 3203 topology 3234 2667 +> 16 0 29 3203 topology 3235 2667 +> 15 0 30 3203 topology 3235 2668 +> 16 0 30 3203 topology 3271 2668 +> 15 0 29 3203 topology 3240 2669 +> 16 0 29 3203 topology 3241 2669 +> 15 0 30 3203 topology 3241 2670 +> 16 0 30 3203 topology 3271 2670 +> 15 0 29 3203 topology 3246 2671 +> 16 0 29 3203 topology 3247 2671 +> 15 0 30 3203 topology 3247 2672 +> 16 0 30 3203 topology 3271 2672 +> 15 0 29 3203 topology 3252 2673 +> 16 0 29 3203 topology 3253 2673 +> 15 0 30 3203 topology 3253 2674 +> 16 0 30 3203 topology 3271 2674 +> 15 0 29 3203 topology 3258 2675 +> 16 0 29 3203 topology 3259 2675 +> 15 0 30 3203 topology 3259 2676 +> 16 0 30 3203 topology 3271 2676 +> 15 0 29 3203 topology 3264 2677 +> 16 0 29 3203 topology 3265 2677 +> 15 0 30 3203 topology 3265 2678 +> 16 0 30 3203 topology 3271 2678 +> 15 0 29 3203 topology 3204 2679 +> 16 0 29 3203 topology 3205 2679 +> 15 0 30 3203 topology 3205 2680 +> 16 0 30 3203 topology 3271 2680 +> 15 0 29 3203 topology 3267 2681 +> 16 0 29 3203 topology 3268 2681 +> 15 0 30 3203 topology 3268 2682 +> 16 0 30 3203 topology 3271 2682 +> 15 0 29 3203 topology 3207 2683 +> 16 0 29 3203 topology 3208 2683 +> 15 0 30 3203 topology 3208 2684 +> 16 0 30 3203 topology 3271 2684 +> 15 0 29 3203 topology 3213 2685 +> 16 0 29 3203 topology 3214 2685 +> 15 0 30 3203 topology 3214 2686 +> 16 0 30 3203 topology 3271 2686 +> 15 0 29 3203 topology 3219 2687 +> 16 0 29 3203 topology 3220 2687 +> 15 0 30 3203 topology 3220 2688 +> 16 0 30 3203 topology 3271 2688 +> 15 0 29 3203 topology 3225 2689 +> 16 0 29 3203 topology 3226 2689 +> 15 0 30 3203 topology 3226 2690 +> 16 0 30 3203 topology 3271 2690 +> 15 0 29 3203 topology 3231 2691 +> 16 0 29 3203 topology 3232 2691 +> 15 0 30 3203 topology 3232 2692 +> 16 0 30 3203 topology 3271 2692 +> 15 0 29 3203 topology 3237 2693 +> 16 0 29 3203 topology 3238 2693 +> 15 0 30 3203 topology 3238 2694 +> 16 0 30 3203 topology 3271 2694 +> 15 0 29 3203 topology 3243 2695 +> 16 0 29 3203 topology 3244 2695 +> 15 0 30 3203 topology 3244 2696 +> 16 0 30 3203 topology 3271 2696 +> 15 0 29 3203 topology 3249 2697 +> 16 0 29 3203 topology 3250 2697 +> 15 0 30 3203 topology 3250 2698 +> 16 0 30 3203 topology 3271 2698 +> 15 0 29 3203 topology 3255 2699 +> 16 0 29 3203 topology 3256 2699 +> 15 0 30 3203 topology 3256 2700 +> 16 0 30 3203 topology 3271 2700 +> 15 0 29 3203 topology 3261 2701 +> 16 0 29 3203 topology 3262 2701 +> 15 0 30 3203 topology 3262 2702 +> 16 0 30 3203 topology 3271 2702 +> 15 0 33 2462 topology 2571 2703 +> 16 0 33 2462 topology 2572 2703 +> 15 0 30 2462 topology 2572 2704 +> 16 0 30 2462 topology 2474 2704 +> 15 0 31 2462 topology 2474 2705 +> 16 0 31 2462 topology 2472 2705 +> 15 0 30 2462 topology 2572 2706 +> 16 0 30 2462 topology 2480 2706 +> 15 0 31 2462 topology 2480 2707 +> 16 0 31 2462 topology 2478 2707 +> 15 0 30 2462 topology 2572 2708 +> 16 0 30 2462 topology 2537 2708 +> 15 0 31 2462 topology 2537 2709 +> 16 0 31 2462 topology 2535 2709 +> 15 0 30 2462 topology 2572 2710 +> 16 0 30 2462 topology 2486 2710 +> 15 0 31 2462 topology 2486 2711 +> 16 0 31 2462 topology 2484 2711 +> 15 0 30 2462 topology 2572 2712 +> 16 0 30 2462 topology 2543 2712 +> 15 0 31 2462 topology 2543 2713 +> 16 0 31 2462 topology 2541 2713 +> 15 0 30 2462 topology 2572 2714 +> 16 0 30 2462 topology 2492 2714 +> 15 0 31 2462 topology 2492 2715 +> 16 0 31 2462 topology 2490 2715 +> 15 0 30 2462 topology 2572 2716 +> 16 0 30 2462 topology 2549 2716 +> 15 0 31 2462 topology 2549 2717 +> 16 0 31 2462 topology 2547 2717 +> 15 0 30 2462 topology 2572 2718 +> 16 0 30 2462 topology 2498 2718 +> 15 0 31 2462 topology 2498 2719 +> 16 0 31 2462 topology 2496 2719 +> 15 0 30 2462 topology 2572 2720 +> 16 0 30 2462 topology 2555 2720 +> 15 0 31 2462 topology 2555 2721 +> 16 0 31 2462 topology 2553 2721 +> 15 0 30 2462 topology 2572 2722 +> 16 0 30 2462 topology 2561 2722 +> 15 0 31 2462 topology 2561 2723 +> 16 0 31 2462 topology 2559 2723 +> 15 0 30 2462 topology 2572 2724 +> 16 0 30 2462 topology 2507 2724 +> 15 0 31 2462 topology 2507 2725 +> 16 0 31 2462 topology 2505 2725 +> 15 0 30 2462 topology 2572 2726 +> 16 0 30 2462 topology 2564 2726 +> 15 0 31 2462 topology 2564 2727 +> 16 0 31 2462 topology 2562 2727 +> 15 0 30 2462 topology 2572 2728 +> 16 0 30 2462 topology 2513 2728 +> 15 0 31 2462 topology 2513 2729 +> 16 0 31 2462 topology 2511 2729 +> 15 0 30 2462 topology 2572 2730 +> 16 0 30 2462 topology 2570 2730 +> 15 0 31 2462 topology 2570 2731 +> 16 0 31 2462 topology 2568 2731 +> 15 0 30 2462 topology 2572 2732 +> 16 0 30 2462 topology 2519 2732 +> 15 0 31 2462 topology 2519 2733 +> 16 0 31 2462 topology 2517 2733 +> 15 0 30 2462 topology 2572 2734 +> 16 0 30 2462 topology 2468 2734 +> 15 0 31 2462 topology 2468 2735 +> 16 0 31 2462 topology 2466 2735 +> 15 0 30 2462 topology 2572 2736 +> 16 0 30 2462 topology 2525 2736 +> 15 0 31 2462 topology 2525 2737 +> 16 0 31 2462 topology 2523 2737 +> 15 0 30 2462 topology 2572 2738 +> 16 0 30 2462 topology 2531 2738 +> 15 0 31 2462 topology 2531 2739 +> 16 0 31 2462 topology 2529 2739 +> 15 0 30 2462 topology 2572 2740 +> 16 0 30 2462 topology 2477 2740 +> 15 0 31 2462 topology 2477 2741 +> 16 0 31 2462 topology 2475 2741 +> 15 0 30 2462 topology 2572 2742 +> 16 0 30 2462 topology 2534 2742 +> 15 0 31 2462 topology 2534 2743 +> 16 0 31 2462 topology 2532 2743 +> 15 0 30 2462 topology 2572 2744 +> 16 0 30 2462 topology 2483 2744 +> 15 0 31 2462 topology 2483 2745 +> 16 0 31 2462 topology 2481 2745 +> 15 0 30 2462 topology 2572 2746 +> 16 0 30 2462 topology 2540 2746 +> 15 0 31 2462 topology 2540 2747 +> 16 0 31 2462 topology 2538 2747 +> 15 0 30 2462 topology 2572 2748 +> 16 0 30 2462 topology 2489 2748 +> 15 0 31 2462 topology 2489 2749 +> 16 0 31 2462 topology 2487 2749 +> 15 0 30 2462 topology 2572 2750 +> 16 0 30 2462 topology 2546 2750 +> 15 0 31 2462 topology 2546 2751 +> 16 0 31 2462 topology 2544 2751 +> 15 0 30 2462 topology 2572 2752 +> 16 0 30 2462 topology 2495 2752 +> 15 0 31 2462 topology 2495 2753 +> 16 0 31 2462 topology 2493 2753 +> 15 0 30 2462 topology 2572 2754 +> 16 0 30 2462 topology 2552 2754 +> 15 0 31 2462 topology 2552 2755 +> 16 0 31 2462 topology 2550 2755 +> 15 0 30 2462 topology 2572 2756 +> 16 0 30 2462 topology 2501 2756 +> 15 0 31 2462 topology 2501 2757 +> 16 0 31 2462 topology 2499 2757 +> 15 0 30 2462 topology 2572 2758 +> 16 0 30 2462 topology 2558 2758 +> 15 0 31 2462 topology 2558 2759 +> 16 0 31 2462 topology 2556 2759 +> 15 0 30 2462 topology 2572 2760 +> 16 0 30 2462 topology 2504 2760 +> 15 0 31 2462 topology 2504 2761 +> 16 0 31 2462 topology 2502 2761 +> 15 0 30 2462 topology 2572 2762 +> 16 0 30 2462 topology 2510 2762 +> 15 0 31 2462 topology 2510 2763 +> 16 0 31 2462 topology 2508 2763 +> 15 0 30 2462 topology 2572 2764 +> 16 0 30 2462 topology 2567 2764 +> 15 0 31 2462 topology 2567 2765 +> 16 0 31 2462 topology 2565 2765 +> 15 0 30 2462 topology 2572 2766 +> 16 0 30 2462 topology 2516 2766 +> 15 0 31 2462 topology 2516 2767 +> 16 0 31 2462 topology 2514 2767 +> 15 0 30 2462 topology 2572 2768 +> 16 0 30 2462 topology 2465 2768 +> 15 0 31 2462 topology 2465 2769 +> 16 0 31 2462 topology 2463 2769 +> 15 0 30 2462 topology 2572 2770 +> 16 0 30 2462 topology 2522 2770 +> 15 0 31 2462 topology 2522 2771 +> 16 0 31 2462 topology 2520 2771 +> 15 0 30 2462 topology 2572 2772 +> 16 0 30 2462 topology 2471 2772 +> 15 0 31 2462 topology 2471 2773 +> 16 0 31 2462 topology 2469 2773 +> 15 0 30 2462 topology 2572 2774 +> 16 0 30 2462 topology 2528 2774 +> 15 0 31 2462 topology 2528 2775 +> 16 0 31 2462 topology 2526 2775 +> 15 0 29 2462 topology 2472 2776 +> 16 0 29 2462 topology 2473 2776 +> 15 0 30 2462 topology 2473 2777 +> 16 0 30 2462 topology 2572 2777 +> 15 0 29 2462 topology 2478 2778 +> 16 0 29 2462 topology 2479 2778 +> 15 0 30 2462 topology 2479 2779 +> 16 0 30 2462 topology 2572 2779 +> 15 0 29 2462 topology 2535 2780 +> 16 0 29 2462 topology 2536 2780 +> 15 0 30 2462 topology 2536 2781 +> 16 0 30 2462 topology 2572 2781 +> 15 0 29 2462 topology 2484 2782 +> 16 0 29 2462 topology 2485 2782 +> 15 0 30 2462 topology 2485 2783 +> 16 0 30 2462 topology 2572 2783 +> 15 0 29 2462 topology 2541 2784 +> 16 0 29 2462 topology 2542 2784 +> 15 0 30 2462 topology 2542 2785 +> 16 0 30 2462 topology 2572 2785 +> 15 0 29 2462 topology 2490 2786 +> 16 0 29 2462 topology 2491 2786 +> 15 0 30 2462 topology 2491 2787 +> 16 0 30 2462 topology 2572 2787 +> 15 0 29 2462 topology 2547 2788 +> 16 0 29 2462 topology 2548 2788 +> 15 0 30 2462 topology 2548 2789 +> 16 0 30 2462 topology 2572 2789 +> 15 0 29 2462 topology 2496 2790 +> 16 0 29 2462 topology 2497 2790 +> 15 0 30 2462 topology 2497 2791 +> 16 0 30 2462 topology 2572 2791 +> 15 0 29 2462 topology 2553 2792 +> 16 0 29 2462 topology 2554 2792 +> 15 0 30 2462 topology 2554 2793 +> 16 0 30 2462 topology 2572 2793 +> 15 0 29 2462 topology 2559 2794 +> 16 0 29 2462 topology 2560 2794 +> 15 0 30 2462 topology 2560 2795 +> 16 0 30 2462 topology 2572 2795 +> 15 0 29 2462 topology 2505 2796 +> 16 0 29 2462 topology 2506 2796 +> 15 0 30 2462 topology 2506 2797 +> 16 0 30 2462 topology 2572 2797 +> 15 0 29 2462 topology 2562 2798 +> 16 0 29 2462 topology 2563 2798 +> 15 0 30 2462 topology 2563 2799 +> 16 0 30 2462 topology 2572 2799 +> 15 0 29 2462 topology 2511 2800 +> 16 0 29 2462 topology 2512 2800 +> 15 0 30 2462 topology 2512 2801 +> 16 0 30 2462 topology 2572 2801 +> 15 0 29 2462 topology 2568 2802 +> 16 0 29 2462 topology 2569 2802 +> 15 0 30 2462 topology 2569 2803 +> 16 0 30 2462 topology 2572 2803 +> 15 0 29 2462 topology 2517 2804 +> 16 0 29 2462 topology 2518 2804 +> 15 0 30 2462 topology 2518 2805 +> 16 0 30 2462 topology 2572 2805 +> 15 0 29 2462 topology 2466 2806 +> 16 0 29 2462 topology 2467 2806 +> 15 0 30 2462 topology 2467 2807 +> 16 0 30 2462 topology 2572 2807 +> 15 0 29 2462 topology 2523 2808 +> 16 0 29 2462 topology 2524 2808 +> 15 0 30 2462 topology 2524 2809 +> 16 0 30 2462 topology 2572 2809 +> 15 0 29 2462 topology 2529 2810 +> 16 0 29 2462 topology 2530 2810 +> 15 0 30 2462 topology 2530 2811 +> 16 0 30 2462 topology 2572 2811 +> 15 0 29 2462 topology 2475 2812 +> 16 0 29 2462 topology 2476 2812 +> 15 0 30 2462 topology 2476 2813 +> 16 0 30 2462 topology 2572 2813 +> 15 0 29 2462 topology 2532 2814 +> 16 0 29 2462 topology 2533 2814 +> 15 0 30 2462 topology 2533 2815 +> 16 0 30 2462 topology 2572 2815 +> 15 0 29 2462 topology 2481 2816 +> 16 0 29 2462 topology 2482 2816 +> 15 0 30 2462 topology 2482 2817 +> 16 0 30 2462 topology 2572 2817 +> 15 0 29 2462 topology 2538 2818 +> 16 0 29 2462 topology 2539 2818 +> 15 0 30 2462 topology 2539 2819 +> 16 0 30 2462 topology 2572 2819 +> 15 0 29 2462 topology 2487 2820 +> 16 0 29 2462 topology 2488 2820 +> 15 0 30 2462 topology 2488 2821 +> 16 0 30 2462 topology 2572 2821 +> 15 0 29 2462 topology 2544 2822 +> 16 0 29 2462 topology 2545 2822 +> 15 0 30 2462 topology 2545 2823 +> 16 0 30 2462 topology 2572 2823 +> 15 0 29 2462 topology 2493 2824 +> 16 0 29 2462 topology 2494 2824 +> 15 0 30 2462 topology 2494 2825 +> 16 0 30 2462 topology 2572 2825 +> 15 0 29 2462 topology 2550 2826 +> 16 0 29 2462 topology 2551 2826 +> 15 0 30 2462 topology 2551 2827 +> 16 0 30 2462 topology 2572 2827 +> 15 0 29 2462 topology 2499 2828 +> 16 0 29 2462 topology 2500 2828 +> 15 0 30 2462 topology 2500 2829 +> 16 0 30 2462 topology 2572 2829 +> 15 0 29 2462 topology 2556 2830 +> 16 0 29 2462 topology 2557 2830 +> 15 0 30 2462 topology 2557 2831 +> 16 0 30 2462 topology 2572 2831 +> 15 0 29 2462 topology 2502 2832 +> 16 0 29 2462 topology 2503 2832 +> 15 0 30 2462 topology 2503 2833 +> 16 0 30 2462 topology 2572 2833 +> 15 0 29 2462 topology 2508 2834 +> 16 0 29 2462 topology 2509 2834 +> 15 0 30 2462 topology 2509 2835 +> 16 0 30 2462 topology 2572 2835 +> 15 0 29 2462 topology 2565 2836 +> 16 0 29 2462 topology 2566 2836 +> 15 0 30 2462 topology 2566 2837 +> 16 0 30 2462 topology 2572 2837 +> 15 0 29 2462 topology 2514 2838 +> 16 0 29 2462 topology 2515 2838 +> 15 0 30 2462 topology 2515 2839 +> 16 0 30 2462 topology 2572 2839 +> 15 0 29 2462 topology 2463 2840 +> 16 0 29 2462 topology 2464 2840 +> 15 0 30 2462 topology 2464 2841 +> 16 0 30 2462 topology 2572 2841 +> 15 0 29 2462 topology 2520 2842 +> 16 0 29 2462 topology 2521 2842 +> 15 0 30 2462 topology 2521 2843 +> 16 0 30 2462 topology 2572 2843 +> 15 0 29 2462 topology 2469 2844 +> 16 0 29 2462 topology 2470 2844 +> 15 0 30 2462 topology 2470 2845 +> 16 0 30 2462 topology 2572 2845 +> 15 0 29 2462 topology 2526 2846 +> 16 0 29 2462 topology 2527 2846 +> 15 0 30 2462 topology 2527 2847 +> 16 0 30 2462 topology 2572 2847 +> 15 0 29 2684 topology 2691 2848 +> 16 0 29 2684 topology 2692 2848 +> 15 0 30 2684 topology 2692 2849 +> 16 0 30 2684 topology 2794 2849 +> 15 0 30 2684 topology 2794 2850 +> 16 0 30 2684 topology 2750 2850 +> 15 0 31 2684 topology 2750 2851 +> 16 0 31 2684 topology 2748 2851 +> 15 0 30 2684 topology 2794 2852 +> 16 0 30 2684 topology 2699 2852 +> 15 0 31 2684 topology 2699 2853 +> 16 0 31 2684 topology 2697 2853 +> 15 0 30 2684 topology 2794 2854 +> 16 0 30 2684 topology 2756 2854 +> 15 0 31 2684 topology 2756 2855 +> 16 0 31 2684 topology 2754 2855 +> 15 0 30 2684 topology 2794 2856 +> 16 0 30 2684 topology 2705 2856 +> 15 0 31 2684 topology 2705 2857 +> 16 0 31 2684 topology 2703 2857 +> 15 0 30 2684 topology 2794 2858 +> 16 0 30 2684 topology 2762 2858 +> 15 0 31 2684 topology 2762 2859 +> 16 0 31 2684 topology 2760 2859 +> 15 0 30 2684 topology 2794 2860 +> 16 0 30 2684 topology 2711 2860 +> 15 0 31 2684 topology 2711 2861 +> 16 0 31 2684 topology 2709 2861 +> 15 0 30 2684 topology 2794 2862 +> 16 0 30 2684 topology 2768 2862 +> 15 0 31 2684 topology 2768 2863 +> 16 0 31 2684 topology 2766 2863 +> 15 0 30 2684 topology 2794 2864 +> 16 0 30 2684 topology 2717 2864 +> 15 0 31 2684 topology 2717 2865 +> 16 0 31 2684 topology 2715 2865 +> 15 0 30 2684 topology 2794 2866 +> 16 0 30 2684 topology 2774 2866 +> 15 0 31 2684 topology 2774 2867 +> 16 0 31 2684 topology 2772 2867 +> 15 0 30 2684 topology 2794 2868 +> 16 0 30 2684 topology 2720 2868 +> 15 0 31 2684 topology 2720 2869 +> 16 0 31 2684 topology 2718 2869 +> 15 0 30 2684 topology 2794 2870 +> 16 0 30 2684 topology 2726 2870 +> 15 0 31 2684 topology 2726 2871 +> 16 0 31 2684 topology 2724 2871 +> 15 0 30 2684 topology 2794 2872 +> 16 0 30 2684 topology 2783 2872 +> 15 0 31 2684 topology 2783 2873 +> 16 0 31 2684 topology 2781 2873 +> 15 0 30 2684 topology 2794 2874 +> 16 0 30 2684 topology 2732 2874 +> 15 0 31 2684 topology 2732 2875 +> 16 0 31 2684 topology 2730 2875 +> 15 0 30 2684 topology 2794 2876 +> 16 0 30 2684 topology 2789 2876 +> 15 0 31 2684 topology 2789 2877 +> 16 0 31 2684 topology 2787 2877 +> 15 0 30 2684 topology 2794 2878 +> 16 0 30 2684 topology 2738 2878 +> 15 0 31 2684 topology 2738 2879 +> 16 0 31 2684 topology 2736 2879 +> 15 0 30 2684 topology 2794 2880 +> 16 0 30 2684 topology 2687 2880 +> 15 0 31 2684 topology 2687 2881 +> 16 0 31 2684 topology 2685 2881 +> 15 0 30 2684 topology 2794 2882 +> 16 0 30 2684 topology 2744 2882 +> 15 0 31 2684 topology 2744 2883 +> 16 0 31 2684 topology 2742 2883 +> 15 0 30 2684 topology 2794 2884 +> 16 0 30 2684 topology 2690 2884 +> 15 0 31 2684 topology 2690 2885 +> 16 0 31 2684 topology 2688 2885 +> 15 0 30 2684 topology 2794 2886 +> 16 0 30 2684 topology 2696 2886 +> 15 0 31 2684 topology 2696 2887 +> 16 0 31 2684 topology 2694 2887 +> 15 0 30 2684 topology 2794 2888 +> 16 0 30 2684 topology 2753 2888 +> 15 0 31 2684 topology 2753 2889 +> 16 0 31 2684 topology 2751 2889 +> 15 0 30 2684 topology 2794 2890 +> 16 0 30 2684 topology 2702 2890 +> 15 0 31 2684 topology 2702 2891 +> 16 0 31 2684 topology 2700 2891 +> 15 0 30 2684 topology 2794 2892 +> 16 0 30 2684 topology 2759 2892 +> 15 0 31 2684 topology 2759 2893 +> 16 0 31 2684 topology 2757 2893 +> 15 0 30 2684 topology 2794 2894 +> 16 0 30 2684 topology 2708 2894 +> 15 0 31 2684 topology 2708 2895 +> 16 0 31 2684 topology 2706 2895 +> 15 0 32 2684 topology 2794 2896 +> 16 0 32 2684 topology 2793 2896 +> 15 0 30 2684 topology 2794 2897 +> 16 0 30 2684 topology 2765 2897 +> 15 0 31 2684 topology 2765 2898 +> 16 0 31 2684 topology 2763 2898 +> 15 0 30 2684 topology 2794 2899 +> 16 0 30 2684 topology 2714 2899 +> 15 0 31 2684 topology 2714 2900 +> 16 0 31 2684 topology 2712 2900 +> 15 0 30 2684 topology 2794 2901 +> 16 0 30 2684 topology 2771 2901 +> 15 0 31 2684 topology 2771 2902 +> 16 0 31 2684 topology 2769 2902 +> 15 0 30 2684 topology 2794 2903 +> 16 0 30 2684 topology 2777 2903 +> 15 0 31 2684 topology 2777 2904 +> 16 0 31 2684 topology 2775 2904 +> 15 0 30 2684 topology 2794 2905 +> 16 0 30 2684 topology 2723 2905 +> 15 0 31 2684 topology 2723 2906 +> 16 0 31 2684 topology 2721 2906 +> 15 0 30 2684 topology 2794 2907 +> 16 0 30 2684 topology 2780 2907 +> 15 0 31 2684 topology 2780 2908 +> 16 0 31 2684 topology 2778 2908 +> 15 0 30 2684 topology 2794 2909 +> 16 0 30 2684 topology 2729 2909 +> 15 0 31 2684 topology 2729 2910 +> 16 0 31 2684 topology 2727 2910 +> 15 0 30 2684 topology 2794 2911 +> 16 0 30 2684 topology 2786 2911 +> 15 0 31 2684 topology 2786 2912 +> 16 0 31 2684 topology 2784 2912 +> 15 0 30 2684 topology 2794 2913 +> 16 0 30 2684 topology 2735 2913 +> 15 0 31 2684 topology 2735 2914 +> 16 0 31 2684 topology 2733 2914 +> 15 0 30 2684 topology 2794 2915 +> 16 0 30 2684 topology 2792 2915 +> 15 0 31 2684 topology 2792 2916 +> 16 0 31 2684 topology 2790 2916 +> 15 0 30 2684 topology 2794 2917 +> 16 0 30 2684 topology 2741 2917 +> 15 0 31 2684 topology 2741 2918 +> 16 0 31 2684 topology 2739 2918 +> 15 0 30 2684 topology 2794 2919 +> 16 0 30 2684 topology 2747 2919 +> 15 0 31 2684 topology 2747 2920 +> 16 0 31 2684 topology 2745 2920 +> 15 0 29 2684 topology 2748 2921 +> 16 0 29 2684 topology 2749 2921 +> 15 0 30 2684 topology 2749 2922 +> 16 0 30 2684 topology 2794 2922 +> 15 0 30 2684 topology 2794 2923 +> 16 0 30 2684 topology 2693 2923 +> 15 0 31 2684 topology 2693 2924 +> 16 0 31 2684 topology 2691 2924 +> 15 0 29 2684 topology 2697 2925 +> 16 0 29 2684 topology 2698 2925 +> 15 0 30 2684 topology 2698 2926 +> 16 0 30 2684 topology 2794 2926 +> 15 0 29 2684 topology 2754 2927 +> 16 0 29 2684 topology 2755 2927 +> 15 0 30 2684 topology 2755 2928 +> 16 0 30 2684 topology 2794 2928 +> 15 0 29 2684 topology 2703 2929 +> 16 0 29 2684 topology 2704 2929 +> 15 0 30 2684 topology 2704 2930 +> 16 0 30 2684 topology 2794 2930 +> 15 0 29 2684 topology 2760 2931 +> 16 0 29 2684 topology 2761 2931 +> 15 0 30 2684 topology 2761 2932 +> 16 0 30 2684 topology 2794 2932 +> 15 0 29 2684 topology 2709 2933 +> 16 0 29 2684 topology 2710 2933 +> 15 0 30 2684 topology 2710 2934 +> 16 0 30 2684 topology 2794 2934 +> 15 0 29 2684 topology 2766 2935 +> 16 0 29 2684 topology 2767 2935 +> 15 0 30 2684 topology 2767 2936 +> 16 0 30 2684 topology 2794 2936 +> 15 0 29 2684 topology 2715 2937 +> 16 0 29 2684 topology 2716 2937 +> 15 0 30 2684 topology 2716 2938 +> 16 0 30 2684 topology 2794 2938 +> 15 0 29 2684 topology 2772 2939 +> 16 0 29 2684 topology 2773 2939 +> 15 0 30 2684 topology 2773 2940 +> 16 0 30 2684 topology 2794 2940 +> 15 0 29 2684 topology 2718 2941 +> 16 0 29 2684 topology 2719 2941 +> 15 0 30 2684 topology 2719 2942 +> 16 0 30 2684 topology 2794 2942 +> 15 0 29 2684 topology 2724 2943 +> 16 0 29 2684 topology 2725 2943 +> 15 0 30 2684 topology 2725 2944 +> 16 0 30 2684 topology 2794 2944 +> 15 0 29 2684 topology 2781 2945 +> 16 0 29 2684 topology 2782 2945 +> 15 0 30 2684 topology 2782 2946 +> 16 0 30 2684 topology 2794 2946 +> 15 0 29 2684 topology 2730 2947 +> 16 0 29 2684 topology 2731 2947 +> 15 0 30 2684 topology 2731 2948 +> 16 0 30 2684 topology 2794 2948 +> 15 0 29 2684 topology 2787 2949 +> 16 0 29 2684 topology 2788 2949 +> 15 0 30 2684 topology 2788 2950 +> 16 0 30 2684 topology 2794 2950 +> 15 0 29 2684 topology 2736 2951 +> 16 0 29 2684 topology 2737 2951 +> 15 0 30 2684 topology 2737 2952 +> 16 0 30 2684 topology 2794 2952 +> 15 0 29 2684 topology 2685 2953 +> 16 0 29 2684 topology 2686 2953 +> 15 0 30 2684 topology 2686 2954 +> 16 0 30 2684 topology 2794 2954 +> 15 0 29 2684 topology 2742 2955 +> 16 0 29 2684 topology 2743 2955 +> 15 0 30 2684 topology 2743 2956 +> 16 0 30 2684 topology 2794 2956 +> 15 0 29 2684 topology 2688 2957 +> 16 0 29 2684 topology 2689 2957 +> 15 0 30 2684 topology 2689 2958 +> 16 0 30 2684 topology 2794 2958 +> 15 0 29 2684 topology 2694 2959 +> 16 0 29 2684 topology 2695 2959 +> 15 0 30 2684 topology 2695 2960 +> 16 0 30 2684 topology 2794 2960 +> 15 0 29 2684 topology 2751 2961 +> 16 0 29 2684 topology 2752 2961 +> 15 0 30 2684 topology 2752 2962 +> 16 0 30 2684 topology 2794 2962 +> 15 0 29 2684 topology 2700 2963 +> 16 0 29 2684 topology 2701 2963 +> 15 0 30 2684 topology 2701 2964 +> 16 0 30 2684 topology 2794 2964 +> 15 0 29 2684 topology 2757 2965 +> 16 0 29 2684 topology 2758 2965 +> 15 0 30 2684 topology 2758 2966 +> 16 0 30 2684 topology 2794 2966 +> 15 0 29 2684 topology 2706 2967 +> 16 0 29 2684 topology 2707 2967 +> 15 0 30 2684 topology 2707 2968 +> 16 0 30 2684 topology 2794 2968 +> 15 0 29 2684 topology 2763 2969 +> 16 0 29 2684 topology 2764 2969 +> 15 0 30 2684 topology 2764 2970 +> 16 0 30 2684 topology 2794 2970 +> 15 0 29 2684 topology 2712 2971 +> 16 0 29 2684 topology 2713 2971 +> 15 0 30 2684 topology 2713 2972 +> 16 0 30 2684 topology 2794 2972 +> 15 0 29 2684 topology 2769 2973 +> 16 0 29 2684 topology 2770 2973 +> 15 0 30 2684 topology 2770 2974 +> 16 0 30 2684 topology 2794 2974 +> 15 0 29 2684 topology 2775 2975 +> 16 0 29 2684 topology 2776 2975 +> 15 0 30 2684 topology 2776 2976 +> 16 0 30 2684 topology 2794 2976 +> 15 0 29 2684 topology 2721 2977 +> 16 0 29 2684 topology 2722 2977 +> 15 0 30 2684 topology 2722 2978 +> 16 0 30 2684 topology 2794 2978 +> 15 0 29 2684 topology 2778 2979 +> 16 0 29 2684 topology 2779 2979 +> 15 0 30 2684 topology 2779 2980 +> 16 0 30 2684 topology 2794 2980 +> 15 0 29 2684 topology 2727 2981 +> 16 0 29 2684 topology 2728 2981 +> 15 0 30 2684 topology 2728 2982 +> 16 0 30 2684 topology 2794 2982 +> 15 0 29 2684 topology 2784 2983 +> 16 0 29 2684 topology 2785 2983 +> 15 0 30 2684 topology 2785 2984 +> 16 0 30 2684 topology 2794 2984 +> 15 0 29 2684 topology 2733 2985 +> 16 0 29 2684 topology 2734 2985 +> 15 0 30 2684 topology 2734 2986 +> 16 0 30 2684 topology 2794 2986 +> 15 0 29 2684 topology 2790 2987 +> 16 0 29 2684 topology 2791 2987 +> 15 0 30 2684 topology 2791 2988 +> 16 0 30 2684 topology 2794 2988 +> 15 0 29 2684 topology 2739 2989 +> 16 0 29 2684 topology 2740 2989 +> 15 0 30 2684 topology 2740 2990 +> 16 0 30 2684 topology 2794 2990 +> 15 0 29 2684 topology 2745 2991 +> 16 0 29 2684 topology 2746 2991 +> 15 0 30 2684 topology 2746 2992 +> 16 0 30 2684 topology 2794 2992 +> 15 0 29 2906 topology 2961 2993 +> 16 0 29 2906 topology 2962 2993 +> 15 0 30 2906 topology 2962 2994 +> 16 0 30 2906 topology 2980 2994 +> 15 0 30 2906 topology 2980 2995 +> 16 0 30 2906 topology 2969 2995 +> 15 0 31 2906 topology 2969 2996 +> 16 0 31 2906 topology 2967 2996 +> 15 0 30 2906 topology 2980 2997 +> 16 0 30 2906 topology 2975 2997 +> 15 0 31 2906 topology 2975 2998 +> 16 0 31 2906 topology 2973 2998 +> 15 0 32 2906 topology 2980 2999 +> 16 0 32 2906 topology 2979 2999 +> 15 0 30 2906 topology 2980 3000 +> 16 0 30 2906 topology 2909 3000 +> 15 0 31 2906 topology 2909 3001 +> 16 0 31 2906 topology 2907 3001 +> 15 0 30 2906 topology 2980 3002 +> 16 0 30 2906 topology 2915 3002 +> 15 0 31 2906 topology 2915 3003 +> 16 0 31 2906 topology 2913 3003 +> 15 0 30 2906 topology 2980 3004 +> 16 0 30 2906 topology 2921 3004 +> 15 0 31 2906 topology 2921 3005 +> 16 0 31 2906 topology 2919 3005 +> 15 0 30 2906 topology 2980 3006 +> 16 0 30 2906 topology 2927 3006 +> 15 0 31 2906 topology 2927 3007 +> 16 0 31 2906 topology 2925 3007 +> 15 0 30 2906 topology 2980 3008 +> 16 0 30 2906 topology 2933 3008 +> 15 0 31 2906 topology 2933 3009 +> 16 0 31 2906 topology 2931 3009 +> 15 0 30 2906 topology 2980 3010 +> 16 0 30 2906 topology 2939 3010 +> 15 0 31 2906 topology 2939 3011 +> 16 0 31 2906 topology 2937 3011 +> 15 0 30 2906 topology 2980 3012 +> 16 0 30 2906 topology 2945 3012 +> 15 0 31 2906 topology 2945 3013 +> 16 0 31 2906 topology 2943 3013 +> 15 0 30 2906 topology 2980 3014 +> 16 0 30 2906 topology 2951 3014 +> 15 0 31 2906 topology 2951 3015 +> 16 0 31 2906 topology 2949 3015 +> 15 0 30 2906 topology 2980 3016 +> 16 0 30 2906 topology 2957 3016 +> 15 0 31 2906 topology 2957 3017 +> 16 0 31 2906 topology 2955 3017 +> 15 0 30 2906 topology 2980 3018 +> 16 0 30 2906 topology 2960 3018 +> 15 0 31 2906 topology 2960 3019 +> 16 0 31 2906 topology 2958 3019 +> 15 0 30 2906 topology 2980 3020 +> 16 0 30 2906 topology 2966 3020 +> 15 0 31 2906 topology 2966 3021 +> 16 0 31 2906 topology 2964 3021 +> 15 0 30 2906 topology 2980 3022 +> 16 0 30 2906 topology 2972 3022 +> 15 0 31 2906 topology 2972 3023 +> 16 0 31 2906 topology 2970 3023 +> 15 0 30 2906 topology 2980 3024 +> 16 0 30 2906 topology 2978 3024 +> 15 0 31 2906 topology 2978 3025 +> 16 0 31 2906 topology 2976 3025 +> 15 0 30 2906 topology 2980 3026 +> 16 0 30 2906 topology 2912 3026 +> 15 0 31 2906 topology 2912 3027 +> 16 0 31 2906 topology 2910 3027 +> 15 0 30 2906 topology 2980 3028 +> 16 0 30 2906 topology 2918 3028 +> 15 0 31 2906 topology 2918 3029 +> 16 0 31 2906 topology 2916 3029 +> 15 0 30 2906 topology 2980 3030 +> 16 0 30 2906 topology 2924 3030 +> 15 0 31 2906 topology 2924 3031 +> 16 0 31 2906 topology 2922 3031 +> 15 0 30 2906 topology 2980 3032 +> 16 0 30 2906 topology 2930 3032 +> 15 0 31 2906 topology 2930 3033 +> 16 0 31 2906 topology 2928 3033 +> 15 0 30 2906 topology 2980 3034 +> 16 0 30 2906 topology 2936 3034 +> 15 0 31 2906 topology 2936 3035 +> 16 0 31 2906 topology 2934 3035 +> 15 0 30 2906 topology 2980 3036 +> 16 0 30 2906 topology 2942 3036 +> 15 0 31 2906 topology 2942 3037 +> 16 0 31 2906 topology 2940 3037 +> 15 0 30 2906 topology 2980 3038 +> 16 0 30 2906 topology 2948 3038 +> 15 0 31 2906 topology 2948 3039 +> 16 0 31 2906 topology 2946 3039 +> 15 0 30 2906 topology 2980 3040 +> 16 0 30 2906 topology 2954 3040 +> 15 0 31 2906 topology 2954 3041 +> 16 0 31 2906 topology 2952 3041 +> 15 0 29 2906 topology 2967 3042 +> 16 0 29 2906 topology 2968 3042 +> 15 0 30 2906 topology 2968 3043 +> 16 0 30 2906 topology 2980 3043 +> 15 0 30 2906 topology 2980 3044 +> 16 0 30 2906 topology 2963 3044 +> 15 0 31 2906 topology 2963 3045 +> 16 0 31 2906 topology 2961 3045 +> 15 0 29 2906 topology 2973 3046 +> 16 0 29 2906 topology 2974 3046 +> 15 0 30 2906 topology 2974 3047 +> 16 0 30 2906 topology 2980 3047 +> 15 0 29 2906 topology 2907 3048 +> 16 0 29 2906 topology 2908 3048 +> 15 0 30 2906 topology 2908 3049 +> 16 0 30 2906 topology 2980 3049 +> 15 0 29 2906 topology 2913 3050 +> 16 0 29 2906 topology 2914 3050 +> 15 0 30 2906 topology 2914 3051 +> 16 0 30 2906 topology 2980 3051 +> 15 0 29 2906 topology 2919 3052 +> 16 0 29 2906 topology 2920 3052 +> 15 0 30 2906 topology 2920 3053 +> 16 0 30 2906 topology 2980 3053 +> 15 0 29 2906 topology 2925 3054 +> 16 0 29 2906 topology 2926 3054 +> 15 0 30 2906 topology 2926 3055 +> 16 0 30 2906 topology 2980 3055 +> 15 0 29 2906 topology 2931 3056 +> 16 0 29 2906 topology 2932 3056 +> 15 0 30 2906 topology 2932 3057 +> 16 0 30 2906 topology 2980 3057 +> 15 0 29 2906 topology 2937 3058 +> 16 0 29 2906 topology 2938 3058 +> 15 0 30 2906 topology 2938 3059 +> 16 0 30 2906 topology 2980 3059 +> 15 0 29 2906 topology 2943 3060 +> 16 0 29 2906 topology 2944 3060 +> 15 0 30 2906 topology 2944 3061 +> 16 0 30 2906 topology 2980 3061 +> 15 0 29 2906 topology 2949 3062 +> 16 0 29 2906 topology 2950 3062 +> 15 0 30 2906 topology 2950 3063 +> 16 0 30 2906 topology 2980 3063 +> 15 0 29 2906 topology 2955 3064 +> 16 0 29 2906 topology 2956 3064 +> 15 0 30 2906 topology 2956 3065 +> 16 0 30 2906 topology 2980 3065 +> 15 0 29 2906 topology 2958 3066 +> 16 0 29 2906 topology 2959 3066 +> 15 0 30 2906 topology 2959 3067 +> 16 0 30 2906 topology 2980 3067 +> 15 0 29 2906 topology 2964 3068 +> 16 0 29 2906 topology 2965 3068 +> 15 0 30 2906 topology 2965 3069 +> 16 0 30 2906 topology 2980 3069 +> 15 0 29 2906 topology 2970 3070 +> 16 0 29 2906 topology 2971 3070 +> 15 0 30 2906 topology 2971 3071 +> 16 0 30 2906 topology 2980 3071 +> 15 0 29 2906 topology 2976 3072 +> 16 0 29 2906 topology 2977 3072 +> 15 0 30 2906 topology 2977 3073 +> 16 0 30 2906 topology 2980 3073 +> 15 0 29 2906 topology 2910 3074 +> 16 0 29 2906 topology 2911 3074 +> 15 0 30 2906 topology 2911 3075 +> 16 0 30 2906 topology 2980 3075 +> 15 0 29 2906 topology 2916 3076 +> 16 0 29 2906 topology 2917 3076 +> 15 0 30 2906 topology 2917 3077 +> 16 0 30 2906 topology 2980 3077 +> 15 0 29 2906 topology 2922 3078 +> 16 0 29 2906 topology 2923 3078 +> 15 0 30 2906 topology 2923 3079 +> 16 0 30 2906 topology 2980 3079 +> 15 0 29 2906 topology 2928 3080 +> 16 0 29 2906 topology 2929 3080 +> 15 0 30 2906 topology 2929 3081 +> 16 0 30 2906 topology 2980 3081 +> 15 0 29 2906 topology 2934 3082 +> 16 0 29 2906 topology 2935 3082 +> 15 0 30 2906 topology 2935 3083 +> 16 0 30 2906 topology 2980 3083 +> 15 0 29 2906 topology 2940 3084 +> 16 0 29 2906 topology 2941 3084 +> 15 0 30 2906 topology 2941 3085 +> 16 0 30 2906 topology 2980 3085 +> 15 0 29 2906 topology 2946 3086 +> 16 0 29 2906 topology 2947 3086 +> 15 0 30 2906 topology 2947 3087 +> 16 0 30 2906 topology 2980 3087 +> 15 0 29 2906 topology 2952 3088 +> 16 0 29 2906 topology 2953 3088 +> 15 0 30 2906 topology 2953 3089 +> 16 0 30 2906 topology 2980 3089 +> 15 0 34 2350 topology 3201 3090 +> 16 0 34 2350 topology 3316 3090 +> 15 0 35 2350 topology 3316 3091 +> 16 0 35 2350 topology 3291 3091 +> 15 0 35 2350 topology 3316 3092 +> 16 0 35 2350 topology 2460 3092 +> 15 0 35 2350 topology 3316 3093 +> 16 0 35 2350 topology 2682 3093 +> 15 0 35 2350 topology 3316 3094 +> 16 0 35 2350 topology 2904 3094 +> 15 0 35 2350 topology 3316 3095 +> 16 0 35 2350 topology 3090 3095 +> 15 0 35 2350 topology 3316 3096 +> 16 0 35 2350 topology 3312 3096 +> 15 0 35 2350 topology 3316 3097 +> 16 0 35 2350 topology 3270 3097 +> 15 0 35 2350 topology 3316 3098 +> 16 0 35 2350 topology 3315 3098 +> 15 0 35 2350 topology 3316 3099 +> 16 0 35 2350 topology 2571 3099 +> 15 0 35 2350 topology 3316 3100 +> 16 0 35 2350 topology 2793 3100 +> 15 0 35 2350 topology 3316 3101 +> 16 0 35 2350 topology 2979 3101 +> 15 0 27 2349 topology 3409 3102 +> 16 0 27 2349 topology 3411 3102 +> 15 0 28 2349 topology 3411 3103 +> 16 0 28 2349 topology 3413 3103 +> 15 0 21 2349 topology 3411 3104 +> 16 0 21 2349 topology 3317 3104 +> 15 0 36 2349 topology 3317 3105 +> 16 0 36 2349 topology 3315 3105 +> 15 0 27 2349 topology 3413 3106 +> 16 0 27 2349 topology 3317 3106 +> 15 0 29 1608 topology 1636 3107 +> 16 0 29 1608 topology 1637 3107 +> 15 0 30 1608 topology 1637 3108 +> 16 0 30 1608 topology 1727 3108 +> 15 0 32 1608 topology 1727 3109 +> 16 0 32 1608 topology 1726 3109 +> 15 0 30 1608 topology 1727 3110 +> 16 0 30 1608 topology 1644 3110 +> 15 0 31 1608 topology 1644 3111 +> 16 0 31 1608 topology 1642 3111 +> 15 0 30 1608 topology 1727 3112 +> 16 0 30 1608 topology 1701 3112 +> 15 0 31 1608 topology 1701 3113 +> 16 0 31 1608 topology 1699 3113 +> 15 0 30 1608 topology 1727 3114 +> 16 0 30 1608 topology 1650 3114 +> 15 0 31 1608 topology 1650 3115 +> 16 0 31 1608 topology 1648 3115 +> 15 0 30 1608 topology 1727 3116 +> 16 0 30 1608 topology 1707 3116 +> 15 0 31 1608 topology 1707 3117 +> 16 0 31 1608 topology 1705 3117 +> 15 0 30 1608 topology 1727 3118 +> 16 0 30 1608 topology 1656 3118 +> 15 0 31 1608 topology 1656 3119 +> 16 0 31 1608 topology 1654 3119 +> 15 0 30 1608 topology 1727 3120 +> 16 0 30 1608 topology 1713 3120 +> 15 0 31 1608 topology 1713 3121 +> 16 0 31 1608 topology 1711 3121 +> 15 0 30 1608 topology 1727 3122 +> 16 0 30 1608 topology 1662 3122 +> 15 0 31 1608 topology 1662 3123 +> 16 0 31 1608 topology 1660 3123 +> 15 0 30 1608 topology 1727 3124 +> 16 0 30 1608 topology 1719 3124 +> 15 0 31 1608 topology 1719 3125 +> 16 0 31 1608 topology 1717 3125 +> 15 0 30 1608 topology 1727 3126 +> 16 0 30 1608 topology 1725 3126 +> 15 0 31 1608 topology 1725 3127 +> 16 0 31 1608 topology 1723 3127 +> 15 0 30 1608 topology 1727 3128 +> 16 0 30 1608 topology 1671 3128 +> 15 0 31 1608 topology 1671 3129 +> 16 0 31 1608 topology 1669 3129 +> 15 0 30 1608 topology 1727 3130 +> 16 0 30 1608 topology 1677 3130 +> 15 0 31 1608 topology 1677 3131 +> 16 0 31 1608 topology 1675 3131 +> 15 0 30 1608 topology 1727 3132 +> 16 0 30 1608 topology 1683 3132 +> 15 0 31 1608 topology 1683 3133 +> 16 0 31 1608 topology 1681 3133 +> 15 0 30 1608 topology 1727 3134 +> 16 0 30 1608 topology 1689 3134 +> 15 0 31 1608 topology 1689 3135 +> 16 0 31 1608 topology 1687 3135 +> 15 0 30 1608 topology 1727 3136 +> 16 0 30 1608 topology 1695 3136 +> 15 0 31 1608 topology 1695 3137 +> 16 0 31 1608 topology 1693 3137 +> 15 0 30 1608 topology 1727 3138 +> 16 0 30 1608 topology 1611 3138 +> 15 0 31 1608 topology 1611 3139 +> 16 0 31 1608 topology 1609 3139 +> 15 0 30 1608 topology 1727 3140 +> 16 0 30 1608 topology 1617 3140 +> 15 0 31 1608 topology 1617 3141 +> 16 0 31 1608 topology 1615 3141 +> 15 0 30 1608 topology 1727 3142 +> 16 0 30 1608 topology 1623 3142 +> 15 0 31 1608 topology 1623 3143 +> 16 0 31 1608 topology 1621 3143 +> 15 0 30 1608 topology 1727 3144 +> 16 0 30 1608 topology 1629 3144 +> 15 0 31 1608 topology 1629 3145 +> 16 0 31 1608 topology 1627 3145 +> 15 0 30 1608 topology 1727 3146 +> 16 0 30 1608 topology 1635 3146 +> 15 0 31 1608 topology 1635 3147 +> 16 0 31 1608 topology 1633 3147 +> 15 0 30 1608 topology 1727 3148 +> 16 0 30 1608 topology 1641 3148 +> 15 0 31 1608 topology 1641 3149 +> 16 0 31 1608 topology 1639 3149 +> 15 0 30 1608 topology 1727 3150 +> 16 0 30 1608 topology 1698 3150 +> 15 0 31 1608 topology 1698 3151 +> 16 0 31 1608 topology 1696 3151 +> 15 0 30 1608 topology 1727 3152 +> 16 0 30 1608 topology 1647 3152 +> 15 0 31 1608 topology 1647 3153 +> 16 0 31 1608 topology 1645 3153 +> 15 0 30 1608 topology 1727 3154 +> 16 0 30 1608 topology 1704 3154 +> 15 0 31 1608 topology 1704 3155 +> 16 0 31 1608 topology 1702 3155 +> 15 0 30 1608 topology 1727 3156 +> 16 0 30 1608 topology 1653 3156 +> 15 0 31 1608 topology 1653 3157 +> 16 0 31 1608 topology 1651 3157 +> 15 0 30 1608 topology 1727 3158 +> 16 0 30 1608 topology 1710 3158 +> 15 0 31 1608 topology 1710 3159 +> 16 0 31 1608 topology 1708 3159 +> 15 0 30 1608 topology 1727 3160 +> 16 0 30 1608 topology 1659 3160 +> 15 0 31 1608 topology 1659 3161 +> 16 0 31 1608 topology 1657 3161 +> 15 0 30 1608 topology 1727 3162 +> 16 0 30 1608 topology 1716 3162 +> 15 0 31 1608 topology 1716 3163 +> 16 0 31 1608 topology 1714 3163 +> 15 0 30 1608 topology 1727 3164 +> 16 0 30 1608 topology 1665 3164 +> 15 0 31 1608 topology 1665 3165 +> 16 0 31 1608 topology 1663 3165 +> 15 0 30 1608 topology 1727 3166 +> 16 0 30 1608 topology 1722 3166 +> 15 0 31 1608 topology 1722 3167 +> 16 0 31 1608 topology 1720 3167 +> 15 0 30 1608 topology 1727 3168 +> 16 0 30 1608 topology 1668 3168 +> 15 0 31 1608 topology 1668 3169 +> 16 0 31 1608 topology 1666 3169 +> 15 0 30 1608 topology 1727 3170 +> 16 0 30 1608 topology 1674 3170 +> 15 0 31 1608 topology 1674 3171 +> 16 0 31 1608 topology 1672 3171 +> 15 0 30 1608 topology 1727 3172 +> 16 0 30 1608 topology 1680 3172 +> 15 0 31 1608 topology 1680 3173 +> 16 0 31 1608 topology 1678 3173 +> 15 0 30 1608 topology 1727 3174 +> 16 0 30 1608 topology 1686 3174 +> 15 0 31 1608 topology 1686 3175 +> 16 0 31 1608 topology 1684 3175 +> 15 0 30 1608 topology 1727 3176 +> 16 0 30 1608 topology 1692 3176 +> 15 0 31 1608 topology 1692 3177 +> 16 0 31 1608 topology 1690 3177 +> 15 0 30 1608 topology 1727 3178 +> 16 0 30 1608 topology 1614 3178 +> 15 0 31 1608 topology 1614 3179 +> 16 0 31 1608 topology 1612 3179 +> 15 0 30 1608 topology 1727 3180 +> 16 0 30 1608 topology 1620 3180 +> 15 0 31 1608 topology 1620 3181 +> 16 0 31 1608 topology 1618 3181 +> 15 0 30 1608 topology 1727 3182 +> 16 0 30 1608 topology 1626 3182 +> 15 0 31 1608 topology 1626 3183 +> 16 0 31 1608 topology 1624 3183 +> 15 0 30 1608 topology 1727 3184 +> 16 0 30 1608 topology 1632 3184 +> 15 0 31 1608 topology 1632 3185 +> 16 0 31 1608 topology 1630 3185 +> 15 0 30 1608 topology 1727 3186 +> 16 0 30 1608 topology 1638 3186 +> 15 0 31 1608 topology 1638 3187 +> 16 0 31 1608 topology 1636 3187 +> 15 0 29 1608 topology 1642 3188 +> 16 0 29 1608 topology 1643 3188 +> 15 0 30 1608 topology 1643 3189 +> 16 0 30 1608 topology 1727 3189 +> 15 0 29 1608 topology 1699 3190 +> 16 0 29 1608 topology 1700 3190 +> 15 0 30 1608 topology 1700 3191 +> 16 0 30 1608 topology 1727 3191 +> 15 0 29 1608 topology 1648 3192 +> 16 0 29 1608 topology 1649 3192 +> 15 0 30 1608 topology 1649 3193 +> 16 0 30 1608 topology 1727 3193 +> 15 0 29 1608 topology 1705 3194 +> 16 0 29 1608 topology 1706 3194 +> 15 0 30 1608 topology 1706 3195 +> 16 0 30 1608 topology 1727 3195 +> 15 0 29 1608 topology 1654 3196 +> 16 0 29 1608 topology 1655 3196 +> 15 0 30 1608 topology 1655 3197 +> 16 0 30 1608 topology 1727 3197 +> 15 0 29 1608 topology 1711 3198 +> 16 0 29 1608 topology 1712 3198 +> 15 0 30 1608 topology 1712 3199 +> 16 0 30 1608 topology 1727 3199 +> 15 0 29 1608 topology 1660 3200 +> 16 0 29 1608 topology 1661 3200 +> 15 0 30 1608 topology 1661 3201 +> 16 0 30 1608 topology 1727 3201 +> 15 0 29 1608 topology 1717 3202 +> 16 0 29 1608 topology 1718 3202 +> 15 0 30 1608 topology 1718 3203 +> 16 0 30 1608 topology 1727 3203 +> 15 0 29 1608 topology 1723 3204 +> 16 0 29 1608 topology 1724 3204 +> 15 0 30 1608 topology 1724 3205 +> 16 0 30 1608 topology 1727 3205 +> 15 0 29 1608 topology 1669 3206 +> 16 0 29 1608 topology 1670 3206 +> 15 0 30 1608 topology 1670 3207 +> 16 0 30 1608 topology 1727 3207 +> 15 0 29 1608 topology 1675 3208 +> 16 0 29 1608 topology 1676 3208 +> 15 0 30 1608 topology 1676 3209 +> 16 0 30 1608 topology 1727 3209 +> 15 0 29 1608 topology 1681 3210 +> 16 0 29 1608 topology 1682 3210 +> 15 0 30 1608 topology 1682 3211 +> 16 0 30 1608 topology 1727 3211 +> 15 0 29 1608 topology 1687 3212 +> 16 0 29 1608 topology 1688 3212 +> 15 0 30 1608 topology 1688 3213 +> 16 0 30 1608 topology 1727 3213 +> 15 0 29 1608 topology 1693 3214 +> 16 0 29 1608 topology 1694 3214 +> 15 0 30 1608 topology 1694 3215 +> 16 0 30 1608 topology 1727 3215 +> 15 0 29 1608 topology 1609 3216 +> 16 0 29 1608 topology 1610 3216 +> 15 0 30 1608 topology 1610 3217 +> 16 0 30 1608 topology 1727 3217 +> 15 0 29 1608 topology 1615 3218 +> 16 0 29 1608 topology 1616 3218 +> 15 0 30 1608 topology 1616 3219 +> 16 0 30 1608 topology 1727 3219 +> 15 0 29 1608 topology 1621 3220 +> 16 0 29 1608 topology 1622 3220 +> 15 0 30 1608 topology 1622 3221 +> 16 0 30 1608 topology 1727 3221 +> 15 0 29 1608 topology 1627 3222 +> 16 0 29 1608 topology 1628 3222 +> 15 0 30 1608 topology 1628 3223 +> 16 0 30 1608 topology 1727 3223 +> 15 0 29 1608 topology 1633 3224 +> 16 0 29 1608 topology 1634 3224 +> 15 0 30 1608 topology 1634 3225 +> 16 0 30 1608 topology 1727 3225 +> 15 0 29 1608 topology 1639 3226 +> 16 0 29 1608 topology 1640 3226 +> 15 0 30 1608 topology 1640 3227 +> 16 0 30 1608 topology 1727 3227 +> 15 0 29 1608 topology 1696 3228 +> 16 0 29 1608 topology 1697 3228 +> 15 0 30 1608 topology 1697 3229 +> 16 0 30 1608 topology 1727 3229 +> 15 0 29 1608 topology 1645 3230 +> 16 0 29 1608 topology 1646 3230 +> 15 0 30 1608 topology 1646 3231 +> 16 0 30 1608 topology 1727 3231 +> 15 0 29 1608 topology 1702 3232 +> 16 0 29 1608 topology 1703 3232 +> 15 0 30 1608 topology 1703 3233 +> 16 0 30 1608 topology 1727 3233 +> 15 0 29 1608 topology 1651 3234 +> 16 0 29 1608 topology 1652 3234 +> 15 0 30 1608 topology 1652 3235 +> 16 0 30 1608 topology 1727 3235 +> 15 0 29 1608 topology 1708 3236 +> 16 0 29 1608 topology 1709 3236 +> 15 0 30 1608 topology 1709 3237 +> 16 0 30 1608 topology 1727 3237 +> 15 0 29 1608 topology 1657 3238 +> 16 0 29 1608 topology 1658 3238 +> 15 0 30 1608 topology 1658 3239 +> 16 0 30 1608 topology 1727 3239 +> 15 0 29 1608 topology 1714 3240 +> 16 0 29 1608 topology 1715 3240 +> 15 0 30 1608 topology 1715 3241 +> 16 0 30 1608 topology 1727 3241 +> 15 0 29 1608 topology 1663 3242 +> 16 0 29 1608 topology 1664 3242 +> 15 0 30 1608 topology 1664 3243 +> 16 0 30 1608 topology 1727 3243 +> 15 0 29 1608 topology 1720 3244 +> 16 0 29 1608 topology 1721 3244 +> 15 0 30 1608 topology 1721 3245 +> 16 0 30 1608 topology 1727 3245 +> 15 0 29 1608 topology 1666 3246 +> 16 0 29 1608 topology 1667 3246 +> 15 0 30 1608 topology 1667 3247 +> 16 0 30 1608 topology 1727 3247 +> 15 0 29 1608 topology 1672 3248 +> 16 0 29 1608 topology 1673 3248 +> 15 0 30 1608 topology 1673 3249 +> 16 0 30 1608 topology 1727 3249 +> 15 0 29 1608 topology 1678 3250 +> 16 0 29 1608 topology 1679 3250 +> 15 0 30 1608 topology 1679 3251 +> 16 0 30 1608 topology 1727 3251 +> 15 0 29 1608 topology 1684 3252 +> 16 0 29 1608 topology 1685 3252 +> 15 0 30 1608 topology 1685 3253 +> 16 0 30 1608 topology 1727 3253 +> 15 0 29 1608 topology 1690 3254 +> 16 0 29 1608 topology 1691 3254 +> 15 0 30 1608 topology 1691 3255 +> 16 0 30 1608 topology 1727 3255 +> 15 0 29 1608 topology 1612 3256 +> 16 0 29 1608 topology 1613 3256 +> 15 0 30 1608 topology 1613 3257 +> 16 0 30 1608 topology 1727 3257 +> 15 0 29 1608 topology 1618 3258 +> 16 0 29 1608 topology 1619 3258 +> 15 0 30 1608 topology 1619 3259 +> 16 0 30 1608 topology 1727 3259 +> 15 0 29 1608 topology 1624 3260 +> 16 0 29 1608 topology 1625 3260 +> 15 0 30 1608 topology 1625 3261 +> 16 0 30 1608 topology 1727 3261 +> 15 0 29 1608 topology 1630 3262 +> 16 0 29 1608 topology 1631 3262 +> 15 0 30 1608 topology 1631 3263 +> 16 0 30 1608 topology 1727 3263 +> 15 0 29 1728 topology 1759 3264 +> 16 0 29 1728 topology 1760 3264 +> 15 0 30 1728 topology 1760 3265 +> 16 0 30 1728 topology 1835 3265 +> 15 0 30 1728 topology 1835 3266 +> 16 0 30 1728 topology 1767 3266 +> 15 0 31 1728 topology 1767 3267 +> 16 0 31 1728 topology 1765 3267 +> 15 0 30 1728 topology 1835 3268 +> 16 0 30 1728 topology 1824 3268 +> 15 0 31 1728 topology 1824 3269 +> 16 0 31 1728 topology 1822 3269 +> 15 0 30 1728 topology 1835 3270 +> 16 0 30 1728 topology 1773 3270 +> 15 0 31 1728 topology 1773 3271 +> 16 0 31 1728 topology 1771 3271 +> 15 0 30 1728 topology 1835 3272 +> 16 0 30 1728 topology 1830 3272 +> 15 0 31 1728 topology 1830 3273 +> 16 0 31 1728 topology 1828 3273 +> 15 0 30 1728 topology 1835 3274 +> 16 0 30 1728 topology 1779 3274 +> 15 0 31 1728 topology 1779 3275 +> 16 0 31 1728 topology 1777 3275 +> 15 0 30 1728 topology 1835 3276 +> 16 0 30 1728 topology 1785 3276 +> 15 0 31 1728 topology 1785 3277 +> 16 0 31 1728 topology 1783 3277 +> 15 0 32 1728 topology 1835 3278 +> 16 0 32 1728 topology 1834 3278 +> 15 0 30 1728 topology 1835 3279 +> 16 0 30 1728 topology 1731 3279 +> 15 0 31 1728 topology 1731 3280 +> 16 0 31 1728 topology 1729 3280 +> 15 0 30 1728 topology 1835 3281 +> 16 0 30 1728 topology 1737 3281 +> 15 0 31 1728 topology 1737 3282 +> 16 0 31 1728 topology 1735 3282 +> 15 0 30 1728 topology 1835 3283 +> 16 0 30 1728 topology 1794 3283 +> 15 0 31 1728 topology 1794 3284 +> 16 0 31 1728 topology 1792 3284 +> 15 0 30 1728 topology 1835 3285 +> 16 0 30 1728 topology 1743 3285 +> 15 0 31 1728 topology 1743 3286 +> 16 0 31 1728 topology 1741 3286 +> 15 0 30 1728 topology 1835 3287 +> 16 0 30 1728 topology 1800 3287 +> 15 0 31 1728 topology 1800 3288 +> 16 0 31 1728 topology 1798 3288 +> 15 0 30 1728 topology 1835 3289 +> 16 0 30 1728 topology 1749 3289 +> 15 0 31 1728 topology 1749 3290 +> 16 0 31 1728 topology 1747 3290 +> 15 0 30 1728 topology 1835 3291 +> 16 0 30 1728 topology 1806 3291 +> 15 0 31 1728 topology 1806 3292 +> 16 0 31 1728 topology 1804 3292 +> 15 0 30 1728 topology 1835 3293 +> 16 0 30 1728 topology 1755 3293 +> 15 0 31 1728 topology 1755 3294 +> 16 0 31 1728 topology 1753 3294 +> 15 0 30 1728 topology 1835 3295 +> 16 0 30 1728 topology 1812 3295 +> 15 0 31 1728 topology 1812 3296 +> 16 0 31 1728 topology 1810 3296 +> 15 0 30 1728 topology 1835 3297 +> 16 0 30 1728 topology 1818 3297 +> 15 0 31 1728 topology 1818 3298 +> 16 0 31 1728 topology 1816 3298 +> 15 0 30 1728 topology 1835 3299 +> 16 0 30 1728 topology 1764 3299 +> 15 0 31 1728 topology 1764 3300 +> 16 0 31 1728 topology 1762 3300 +> 15 0 30 1728 topology 1835 3301 +> 16 0 30 1728 topology 1821 3301 +> 15 0 31 1728 topology 1821 3302 +> 16 0 31 1728 topology 1819 3302 +> 15 0 30 1728 topology 1835 3303 +> 16 0 30 1728 topology 1770 3303 +> 15 0 31 1728 topology 1770 3304 +> 16 0 31 1728 topology 1768 3304 +> 15 0 30 1728 topology 1835 3305 +> 16 0 30 1728 topology 1827 3305 +> 15 0 31 1728 topology 1827 3306 +> 16 0 31 1728 topology 1825 3306 +> 15 0 30 1728 topology 1835 3307 +> 16 0 30 1728 topology 1776 3307 +> 15 0 31 1728 topology 1776 3308 +> 16 0 31 1728 topology 1774 3308 +> 15 0 30 1728 topology 1835 3309 +> 16 0 30 1728 topology 1833 3309 +> 15 0 31 1728 topology 1833 3310 +> 16 0 31 1728 topology 1831 3310 +> 15 0 30 1728 topology 1835 3311 +> 16 0 30 1728 topology 1782 3311 +> 15 0 31 1728 topology 1782 3312 +> 16 0 31 1728 topology 1780 3312 +> 15 0 30 1728 topology 1835 3313 +> 16 0 30 1728 topology 1788 3313 +> 15 0 31 1728 topology 1788 3314 +> 16 0 31 1728 topology 1786 3314 +> 15 0 30 1728 topology 1835 3315 +> 16 0 30 1728 topology 1734 3315 +> 15 0 31 1728 topology 1734 3316 +> 16 0 31 1728 topology 1732 3316 +> 15 0 30 1728 topology 1835 3317 +> 16 0 30 1728 topology 1791 3317 +> 15 0 31 1728 topology 1791 3318 +> 16 0 31 1728 topology 1789 3318 +> 15 0 30 1728 topology 1835 3319 +> 16 0 30 1728 topology 1740 3319 +> 15 0 31 1728 topology 1740 3320 +> 16 0 31 1728 topology 1738 3320 +> 15 0 30 1728 topology 1835 3321 +> 16 0 30 1728 topology 1797 3321 +> 15 0 31 1728 topology 1797 3322 +> 16 0 31 1728 topology 1795 3322 +> 15 0 30 1728 topology 1835 3323 +> 16 0 30 1728 topology 1746 3323 +> 15 0 31 1728 topology 1746 3324 +> 16 0 31 1728 topology 1744 3324 +> 15 0 30 1728 topology 1835 3325 +> 16 0 30 1728 topology 1803 3325 +> 15 0 31 1728 topology 1803 3326 +> 16 0 31 1728 topology 1801 3326 +> 15 0 30 1728 topology 1835 3327 +> 16 0 30 1728 topology 1752 3327 +> 15 0 31 1728 topology 1752 3328 +> 16 0 31 1728 topology 1750 3328 +> 15 0 30 1728 topology 1835 3329 +> 16 0 30 1728 topology 1809 3329 +> 15 0 31 1728 topology 1809 3330 +> 16 0 31 1728 topology 1807 3330 +> 15 0 30 1728 topology 1835 3331 +> 16 0 30 1728 topology 1758 3331 +> 15 0 31 1728 topology 1758 3332 +> 16 0 31 1728 topology 1756 3332 +> 15 0 30 1728 topology 1835 3333 +> 16 0 30 1728 topology 1815 3333 +> 15 0 31 1728 topology 1815 3334 +> 16 0 31 1728 topology 1813 3334 +> 15 0 29 1728 topology 1765 3335 +> 16 0 29 1728 topology 1766 3335 +> 15 0 30 1728 topology 1766 3336 +> 16 0 30 1728 topology 1835 3336 +> 15 0 30 1728 topology 1835 3337 +> 16 0 30 1728 topology 1761 3337 +> 15 0 31 1728 topology 1761 3338 +> 16 0 31 1728 topology 1759 3338 +> 15 0 29 1728 topology 1822 3339 +> 16 0 29 1728 topology 1823 3339 +> 15 0 30 1728 topology 1823 3340 +> 16 0 30 1728 topology 1835 3340 +> 15 0 29 1728 topology 1771 3341 +> 16 0 29 1728 topology 1772 3341 +> 15 0 30 1728 topology 1772 3342 +> 16 0 30 1728 topology 1835 3342 +> 15 0 29 1728 topology 1828 3343 +> 16 0 29 1728 topology 1829 3343 +> 15 0 30 1728 topology 1829 3344 +> 16 0 30 1728 topology 1835 3344 +> 15 0 29 1728 topology 1777 3345 +> 16 0 29 1728 topology 1778 3345 +> 15 0 30 1728 topology 1778 3346 +> 16 0 30 1728 topology 1835 3346 +> 15 0 29 1728 topology 1783 3347 +> 16 0 29 1728 topology 1784 3347 +> 15 0 30 1728 topology 1784 3348 +> 16 0 30 1728 topology 1835 3348 +> 15 0 29 1728 topology 1729 3349 +> 16 0 29 1728 topology 1730 3349 +> 15 0 30 1728 topology 1730 3350 +> 16 0 30 1728 topology 1835 3350 +> 15 0 29 1728 topology 1735 3351 +> 16 0 29 1728 topology 1736 3351 +> 15 0 30 1728 topology 1736 3352 +> 16 0 30 1728 topology 1835 3352 +> 15 0 29 1728 topology 1792 3353 +> 16 0 29 1728 topology 1793 3353 +> 15 0 30 1728 topology 1793 3354 +> 16 0 30 1728 topology 1835 3354 +> 15 0 29 1728 topology 1741 3355 +> 16 0 29 1728 topology 1742 3355 +> 15 0 30 1728 topology 1742 3356 +> 16 0 30 1728 topology 1835 3356 +> 15 0 29 1728 topology 1798 3357 +> 16 0 29 1728 topology 1799 3357 +> 15 0 30 1728 topology 1799 3358 +> 16 0 30 1728 topology 1835 3358 +> 15 0 29 1728 topology 1747 3359 +> 16 0 29 1728 topology 1748 3359 +> 15 0 30 1728 topology 1748 3360 +> 16 0 30 1728 topology 1835 3360 +> 15 0 29 1728 topology 1804 3361 +> 16 0 29 1728 topology 1805 3361 +> 15 0 30 1728 topology 1805 3362 +> 16 0 30 1728 topology 1835 3362 +> 15 0 29 1728 topology 1753 3363 +> 16 0 29 1728 topology 1754 3363 +> 15 0 30 1728 topology 1754 3364 +> 16 0 30 1728 topology 1835 3364 +> 15 0 29 1728 topology 1810 3365 +> 16 0 29 1728 topology 1811 3365 +> 15 0 30 1728 topology 1811 3366 +> 16 0 30 1728 topology 1835 3366 +> 15 0 29 1728 topology 1816 3367 +> 16 0 29 1728 topology 1817 3367 +> 15 0 30 1728 topology 1817 3368 +> 16 0 30 1728 topology 1835 3368 +> 15 0 29 1728 topology 1762 3369 +> 16 0 29 1728 topology 1763 3369 +> 15 0 30 1728 topology 1763 3370 +> 16 0 30 1728 topology 1835 3370 +> 15 0 29 1728 topology 1819 3371 +> 16 0 29 1728 topology 1820 3371 +> 15 0 30 1728 topology 1820 3372 +> 16 0 30 1728 topology 1835 3372 +> 15 0 29 1728 topology 1768 3373 +> 16 0 29 1728 topology 1769 3373 +> 15 0 30 1728 topology 1769 3374 +> 16 0 30 1728 topology 1835 3374 +> 15 0 29 1728 topology 1825 3375 +> 16 0 29 1728 topology 1826 3375 +> 15 0 30 1728 topology 1826 3376 +> 16 0 30 1728 topology 1835 3376 +> 15 0 29 1728 topology 1774 3377 +> 16 0 29 1728 topology 1775 3377 +> 15 0 30 1728 topology 1775 3378 +> 16 0 30 1728 topology 1835 3378 +> 15 0 29 1728 topology 1831 3379 +> 16 0 29 1728 topology 1832 3379 +> 15 0 30 1728 topology 1832 3380 +> 16 0 30 1728 topology 1835 3380 +> 15 0 29 1728 topology 1780 3381 +> 16 0 29 1728 topology 1781 3381 +> 15 0 30 1728 topology 1781 3382 +> 16 0 30 1728 topology 1835 3382 +> 15 0 29 1728 topology 1786 3383 +> 16 0 29 1728 topology 1787 3383 +> 15 0 30 1728 topology 1787 3384 +> 16 0 30 1728 topology 1835 3384 +> 15 0 29 1728 topology 1732 3385 +> 16 0 29 1728 topology 1733 3385 +> 15 0 30 1728 topology 1733 3386 +> 16 0 30 1728 topology 1835 3386 +> 15 0 29 1728 topology 1789 3387 +> 16 0 29 1728 topology 1790 3387 +> 15 0 30 1728 topology 1790 3388 +> 16 0 30 1728 topology 1835 3388 +> 15 0 29 1728 topology 1738 3389 +> 16 0 29 1728 topology 1739 3389 +> 15 0 30 1728 topology 1739 3390 +> 16 0 30 1728 topology 1835 3390 +> 15 0 29 1728 topology 1795 3391 +> 16 0 29 1728 topology 1796 3391 +> 15 0 30 1728 topology 1796 3392 +> 16 0 30 1728 topology 1835 3392 +> 15 0 29 1728 topology 1744 3393 +> 16 0 29 1728 topology 1745 3393 +> 15 0 30 1728 topology 1745 3394 +> 16 0 30 1728 topology 1835 3394 +> 15 0 29 1728 topology 1801 3395 +> 16 0 29 1728 topology 1802 3395 +> 15 0 30 1728 topology 1802 3396 +> 16 0 30 1728 topology 1835 3396 +> 15 0 29 1728 topology 1750 3397 +> 16 0 29 1728 topology 1751 3397 +> 15 0 30 1728 topology 1751 3398 +> 16 0 30 1728 topology 1835 3398 +> 15 0 29 1728 topology 1807 3399 +> 16 0 29 1728 topology 1808 3399 +> 15 0 30 1728 topology 1808 3400 +> 16 0 30 1728 topology 1835 3400 +> 15 0 29 1728 topology 1756 3401 +> 16 0 29 1728 topology 1757 3401 +> 15 0 30 1728 topology 1757 3402 +> 16 0 30 1728 topology 1835 3402 +> 15 0 29 1728 topology 1813 3403 +> 16 0 29 1728 topology 1814 3403 +> 15 0 30 1728 topology 1814 3404 +> 16 0 30 1728 topology 1835 3404 +> 15 0 29 1836 topology 1882 3405 +> 16 0 29 1836 topology 1883 3405 +> 15 0 30 1836 topology 1883 3406 +> 16 0 30 1836 topology 1928 3406 +> 15 0 30 1836 topology 1928 3407 +> 16 0 30 1836 topology 1890 3407 +> 15 0 31 1836 topology 1890 3408 +> 16 0 31 1836 topology 1888 3408 +> 15 0 30 1836 topology 1928 3409 +> 16 0 30 1836 topology 1839 3409 +> 15 0 31 1836 topology 1839 3410 +> 16 0 31 1836 topology 1837 3410 +> 15 0 30 1836 topology 1928 3411 +> 16 0 30 1836 topology 1896 3411 +> 15 0 31 1836 topology 1896 3412 +> 16 0 31 1836 topology 1894 3412 +> 15 0 30 1836 topology 1928 3413 +> 16 0 30 1836 topology 1845 3413 +> 15 0 31 1836 topology 1845 3414 +> 16 0 31 1836 topology 1843 3414 +> 15 0 30 1836 topology 1928 3415 +> 16 0 30 1836 topology 1902 3415 +> 15 0 31 1836 topology 1902 3416 +> 16 0 31 1836 topology 1900 3416 +> 15 0 30 1836 topology 1928 3417 +> 16 0 30 1836 topology 1851 3417 +> 15 0 31 1836 topology 1851 3418 +> 16 0 31 1836 topology 1849 3418 +> 15 0 30 1836 topology 1928 3419 +> 16 0 30 1836 topology 1908 3419 +> 15 0 31 1836 topology 1908 3420 +> 16 0 31 1836 topology 1906 3420 +> 15 0 30 1836 topology 1928 3421 +> 16 0 30 1836 topology 1917 3421 +> 15 0 31 1836 topology 1917 3422 +> 16 0 31 1836 topology 1915 3422 +> 15 0 30 1836 topology 1928 3423 +> 16 0 30 1836 topology 1923 3423 +> 15 0 31 1836 topology 1923 3424 +> 16 0 31 1836 topology 1921 3424 +> 15 0 30 1836 topology 1928 3425 +> 16 0 30 1836 topology 1854 3425 +> 15 0 31 1836 topology 1854 3426 +> 16 0 31 1836 topology 1852 3426 +> 15 0 30 1836 topology 1928 3427 +> 16 0 30 1836 topology 1860 3427 +> 15 0 31 1836 topology 1860 3428 +> 16 0 31 1836 topology 1858 3428 +> 15 0 30 1836 topology 1928 3429 +> 16 0 30 1836 topology 1866 3429 +> 15 0 31 1836 topology 1866 3430 +> 16 0 31 1836 topology 1864 3430 +> 15 0 30 1836 topology 1928 3431 +> 16 0 30 1836 topology 1872 3431 +> 15 0 31 1836 topology 1872 3432 +> 16 0 31 1836 topology 1870 3432 +> 15 0 30 1836 topology 1928 3433 +> 16 0 30 1836 topology 1878 3433 +> 15 0 31 1836 topology 1878 3434 +> 16 0 31 1836 topology 1876 3434 +> 15 0 32 1836 topology 1928 3435 +> 16 0 32 1836 topology 1927 3435 +> 15 0 30 1836 topology 1928 3436 +> 16 0 30 1836 topology 1887 3436 +> 15 0 31 1836 topology 1887 3437 +> 16 0 31 1836 topology 1885 3437 +> 15 0 30 1836 topology 1928 3438 +> 16 0 30 1836 topology 1893 3438 +> 15 0 31 1836 topology 1893 3439 +> 16 0 31 1836 topology 1891 3439 +> 15 0 30 1836 topology 1928 3440 +> 16 0 30 1836 topology 1842 3440 +> 15 0 31 1836 topology 1842 3441 +> 16 0 31 1836 topology 1840 3441 +> 15 0 30 1836 topology 1928 3442 +> 16 0 30 1836 topology 1899 3442 +> 15 0 31 1836 topology 1899 3443 +> 16 0 31 1836 topology 1897 3443 +> 15 0 30 1836 topology 1928 3444 +> 16 0 30 1836 topology 1848 3444 +> 15 0 31 1836 topology 1848 3445 +> 16 0 31 1836 topology 1846 3445 +> 15 0 30 1836 topology 1928 3446 +> 16 0 30 1836 topology 1905 3446 +> 15 0 31 1836 topology 1905 3447 +> 16 0 31 1836 topology 1903 3447 +> 15 0 30 1836 topology 1928 3448 +> 16 0 30 1836 topology 1914 3448 +> 15 0 31 1836 topology 1914 3449 +> 16 0 31 1836 topology 1912 3449 +> 15 0 30 1836 topology 1928 3450 +> 16 0 30 1836 topology 1911 3450 +> 15 0 31 1836 topology 1911 3451 +> 16 0 31 1836 topology 1909 3451 +> 15 0 30 1836 topology 1928 3452 +> 16 0 30 1836 topology 1920 3452 +> 15 0 31 1836 topology 1920 3453 +> 16 0 31 1836 topology 1918 3453 +> 15 0 30 1836 topology 1928 3454 +> 16 0 30 1836 topology 1926 3454 +> 15 0 31 1836 topology 1926 3455 +> 16 0 31 1836 topology 1924 3455 +> 15 0 30 1836 topology 1928 3456 +> 16 0 30 1836 topology 1857 3456 +> 15 0 31 1836 topology 1857 3457 +> 16 0 31 1836 topology 1855 3457 +> 15 0 30 1836 topology 1928 3458 +> 16 0 30 1836 topology 1863 3458 +> 15 0 31 1836 topology 1863 3459 +> 16 0 31 1836 topology 1861 3459 +> 15 0 30 1836 topology 1928 3460 +> 16 0 30 1836 topology 1869 3460 +> 15 0 31 1836 topology 1869 3461 +> 16 0 31 1836 topology 1867 3461 +> 15 0 30 1836 topology 1928 3462 +> 16 0 30 1836 topology 1875 3462 +> 15 0 31 1836 topology 1875 3463 +> 16 0 31 1836 topology 1873 3463 +> 15 0 30 1836 topology 1928 3464 +> 16 0 30 1836 topology 1881 3464 +> 15 0 31 1836 topology 1881 3465 +> 16 0 31 1836 topology 1879 3465 +> 15 0 29 1836 topology 1888 3466 +> 16 0 29 1836 topology 1889 3466 +> 15 0 30 1836 topology 1889 3467 +> 16 0 30 1836 topology 1928 3467 +> 15 0 30 1836 topology 1928 3468 +> 16 0 30 1836 topology 1884 3468 +> 15 0 31 1836 topology 1884 3469 +> 16 0 31 1836 topology 1882 3469 +> 15 0 29 1836 topology 1837 3470 +> 16 0 29 1836 topology 1838 3470 +> 15 0 30 1836 topology 1838 3471 +> 16 0 30 1836 topology 1928 3471 +> 15 0 29 1836 topology 1894 3472 +> 16 0 29 1836 topology 1895 3472 +> 15 0 30 1836 topology 1895 3473 +> 16 0 30 1836 topology 1928 3473 +> 15 0 29 1836 topology 1843 3474 +> 16 0 29 1836 topology 1844 3474 +> 15 0 30 1836 topology 1844 3475 +> 16 0 30 1836 topology 1928 3475 +> 15 0 29 1836 topology 1900 3476 +> 16 0 29 1836 topology 1901 3476 +> 15 0 30 1836 topology 1901 3477 +> 16 0 30 1836 topology 1928 3477 +> 15 0 29 1836 topology 1849 3478 +> 16 0 29 1836 topology 1850 3478 +> 15 0 30 1836 topology 1850 3479 +> 16 0 30 1836 topology 1928 3479 +> 15 0 29 1836 topology 1906 3480 +> 16 0 29 1836 topology 1907 3480 +> 15 0 30 1836 topology 1907 3481 +> 16 0 30 1836 topology 1928 3481 +> 15 0 29 1836 topology 1915 3482 +> 16 0 29 1836 topology 1916 3482 +> 15 0 30 1836 topology 1916 3483 +> 16 0 30 1836 topology 1928 3483 +> 15 0 29 1836 topology 1921 3484 +> 16 0 29 1836 topology 1922 3484 +> 15 0 30 1836 topology 1922 3485 +> 16 0 30 1836 topology 1928 3485 +> 15 0 29 1836 topology 1852 3486 +> 16 0 29 1836 topology 1853 3486 +> 15 0 30 1836 topology 1853 3487 +> 16 0 30 1836 topology 1928 3487 +> 15 0 29 1836 topology 1858 3488 +> 16 0 29 1836 topology 1859 3488 +> 15 0 30 1836 topology 1859 3489 +> 16 0 30 1836 topology 1928 3489 +> 15 0 29 1836 topology 1864 3490 +> 16 0 29 1836 topology 1865 3490 +> 15 0 30 1836 topology 1865 3491 +> 16 0 30 1836 topology 1928 3491 +> 15 0 29 1836 topology 1870 3492 +> 16 0 29 1836 topology 1871 3492 +> 15 0 30 1836 topology 1871 3493 +> 16 0 30 1836 topology 1928 3493 +> 15 0 29 1836 topology 1876 3494 +> 16 0 29 1836 topology 1877 3494 +> 15 0 30 1836 topology 1877 3495 +> 16 0 30 1836 topology 1928 3495 +> 15 0 29 1836 topology 1885 3496 +> 16 0 29 1836 topology 1886 3496 +> 15 0 30 1836 topology 1886 3497 +> 16 0 30 1836 topology 1928 3497 +> 15 0 29 1836 topology 1891 3498 +> 16 0 29 1836 topology 1892 3498 +> 15 0 30 1836 topology 1892 3499 +> 16 0 30 1836 topology 1928 3499 +> 15 0 29 1836 topology 1840 3500 +> 16 0 29 1836 topology 1841 3500 +> 15 0 30 1836 topology 1841 3501 +> 16 0 30 1836 topology 1928 3501 +> 15 0 29 1836 topology 1897 3502 +> 16 0 29 1836 topology 1898 3502 +> 15 0 30 1836 topology 1898 3503 +> 16 0 30 1836 topology 1928 3503 +> 15 0 29 1836 topology 1846 3504 +> 16 0 29 1836 topology 1847 3504 +> 15 0 30 1836 topology 1847 3505 +> 16 0 30 1836 topology 1928 3505 +> 15 0 29 1836 topology 1903 3506 +> 16 0 29 1836 topology 1904 3506 +> 15 0 30 1836 topology 1904 3507 +> 16 0 30 1836 topology 1928 3507 +> 15 0 29 1836 topology 1912 3508 +> 16 0 29 1836 topology 1913 3508 +> 15 0 30 1836 topology 1913 3509 +> 16 0 30 1836 topology 1928 3509 +> 15 0 29 1836 topology 1909 3510 +> 16 0 29 1836 topology 1910 3510 +> 15 0 30 1836 topology 1910 3511 +> 16 0 30 1836 topology 1928 3511 +> 15 0 29 1836 topology 1918 3512 +> 16 0 29 1836 topology 1919 3512 +> 15 0 30 1836 topology 1919 3513 +> 16 0 30 1836 topology 1928 3513 +> 15 0 29 1836 topology 1924 3514 +> 16 0 29 1836 topology 1925 3514 +> 15 0 30 1836 topology 1925 3515 +> 16 0 30 1836 topology 1928 3515 +> 15 0 29 1836 topology 1855 3516 +> 16 0 29 1836 topology 1856 3516 +> 15 0 30 1836 topology 1856 3517 +> 16 0 30 1836 topology 1928 3517 +> 15 0 29 1836 topology 1861 3518 +> 16 0 29 1836 topology 1862 3518 +> 15 0 30 1836 topology 1862 3519 +> 16 0 30 1836 topology 1928 3519 +> 15 0 29 1836 topology 1867 3520 +> 16 0 29 1836 topology 1868 3520 +> 15 0 30 1836 topology 1868 3521 +> 16 0 30 1836 topology 1928 3521 +> 15 0 29 1836 topology 1873 3522 +> 16 0 29 1836 topology 1874 3522 +> 15 0 30 1836 topology 1874 3523 +> 16 0 30 1836 topology 1928 3523 +> 15 0 29 1836 topology 1879 3524 +> 16 0 29 1836 topology 1880 3524 +> 15 0 30 1836 topology 1880 3525 +> 16 0 30 1836 topology 1928 3525 +> 15 0 29 1929 topology 1975 3526 +> 16 0 29 1929 topology 1976 3526 +> 15 0 30 1929 topology 1976 3527 +> 16 0 30 1929 topology 2051 3527 +> 15 0 30 1929 topology 2051 3528 +> 16 0 30 1929 topology 2040 3528 +> 15 0 31 1929 topology 2040 3529 +> 16 0 31 1929 topology 2038 3529 +> 15 0 30 1929 topology 2051 3530 +> 16 0 30 1929 topology 1989 3530 +> 15 0 31 1929 topology 1989 3531 +> 16 0 31 1929 topology 1987 3531 +> 15 0 30 1929 topology 2051 3532 +> 16 0 30 1929 topology 1938 3532 +> 15 0 31 1929 topology 1938 3533 +> 16 0 31 1929 topology 1936 3533 +> 15 0 30 1929 topology 2051 3534 +> 16 0 30 1929 topology 2001 3534 +> 15 0 31 1929 topology 2001 3535 +> 16 0 31 1929 topology 1999 3535 +> 15 0 30 1929 topology 2051 3536 +> 16 0 30 1929 topology 1953 3536 +> 15 0 31 1929 topology 1953 3537 +> 16 0 31 1929 topology 1951 3537 +> 15 0 30 1929 topology 2051 3538 +> 16 0 30 1929 topology 2016 3538 +> 15 0 31 1929 topology 2016 3539 +> 16 0 31 1929 topology 2014 3539 +> 15 0 30 1929 topology 2051 3540 +> 16 0 30 1929 topology 1965 3540 +> 15 0 31 1929 topology 1965 3541 +> 16 0 31 1929 topology 1963 3541 +> 15 0 30 1929 topology 2051 3542 +> 16 0 30 1929 topology 2028 3542 +> 15 0 31 1929 topology 2028 3543 +> 16 0 31 1929 topology 2026 3543 +> 15 0 30 1929 topology 2051 3544 +> 16 0 30 1929 topology 1980 3544 +> 15 0 31 1929 topology 1980 3545 +> 16 0 31 1929 topology 1978 3545 +> 15 0 30 1929 topology 2051 3546 +> 16 0 30 1929 topology 2043 3546 +> 15 0 31 1929 topology 2043 3547 +> 16 0 31 1929 topology 2041 3547 +> 15 0 30 1929 topology 2051 3548 +> 16 0 30 1929 topology 1992 3548 +> 15 0 31 1929 topology 1992 3549 +> 16 0 31 1929 topology 1990 3549 +> 15 0 30 1929 topology 2051 3550 +> 16 0 30 1929 topology 1941 3550 +> 15 0 31 1929 topology 1941 3551 +> 16 0 31 1929 topology 1939 3551 +> 15 0 30 1929 topology 2051 3552 +> 16 0 30 1929 topology 2004 3552 +> 15 0 31 1929 topology 2004 3553 +> 16 0 31 1929 topology 2002 3553 +> 15 0 30 1929 topology 2051 3554 +> 16 0 30 1929 topology 2007 3554 +> 15 0 31 1929 topology 2007 3555 +> 16 0 31 1929 topology 2005 3555 +> 15 0 30 1929 topology 2051 3556 +> 16 0 30 1929 topology 1956 3556 +> 15 0 31 1929 topology 1956 3557 +> 16 0 31 1929 topology 1954 3557 +> 15 0 30 1929 topology 2051 3558 +> 16 0 30 1929 topology 2019 3558 +> 15 0 31 1929 topology 2019 3559 +> 16 0 31 1929 topology 2017 3559 +> 15 0 30 1929 topology 2051 3560 +> 16 0 30 1929 topology 1968 3560 +> 15 0 31 1929 topology 1968 3561 +> 16 0 31 1929 topology 1966 3561 +> 15 0 30 1929 topology 2051 3562 +> 16 0 30 1929 topology 2031 3562 +> 15 0 31 1929 topology 2031 3563 +> 16 0 31 1929 topology 2029 3563 +> 15 0 30 1929 topology 2051 3564 +> 16 0 30 1929 topology 1983 3564 +> 15 0 31 1929 topology 1983 3565 +> 16 0 31 1929 topology 1981 3565 +> 15 0 30 1929 topology 2051 3566 +> 16 0 30 1929 topology 1932 3566 +> 15 0 31 1929 topology 1932 3567 +> 16 0 31 1929 topology 1930 3567 +> 15 0 30 1929 topology 2051 3568 +> 16 0 30 1929 topology 2046 3568 +> 15 0 31 1929 topology 2046 3569 +> 16 0 31 1929 topology 2044 3569 +> 15 0 30 1929 topology 2051 3570 +> 16 0 30 1929 topology 1995 3570 +> 15 0 31 1929 topology 1995 3571 +> 16 0 31 1929 topology 1993 3571 +> 15 0 30 1929 topology 2051 3572 +> 16 0 30 1929 topology 1944 3572 +> 15 0 31 1929 topology 1944 3573 +> 16 0 31 1929 topology 1942 3573 +> 15 0 30 1929 topology 2051 3574 +> 16 0 30 1929 topology 1947 3574 +> 15 0 31 1929 topology 1947 3575 +> 16 0 31 1929 topology 1945 3575 +> 15 0 30 1929 topology 2051 3576 +> 16 0 30 1929 topology 2010 3576 +> 15 0 31 1929 topology 2010 3577 +> 16 0 31 1929 topology 2008 3577 +> 15 0 30 1929 topology 2051 3578 +> 16 0 30 1929 topology 1959 3578 +> 15 0 31 1929 topology 1959 3579 +> 16 0 31 1929 topology 1957 3579 +> 15 0 30 1929 topology 2051 3580 +> 16 0 30 1929 topology 2022 3580 +> 15 0 31 1929 topology 2022 3581 +> 16 0 31 1929 topology 2020 3581 +> 15 0 30 1929 topology 2051 3582 +> 16 0 30 1929 topology 1971 3582 +> 15 0 31 1929 topology 1971 3583 +> 16 0 31 1929 topology 1969 3583 +> 15 0 30 1929 topology 2051 3584 +> 16 0 30 1929 topology 2034 3584 +> 15 0 31 1929 topology 2034 3585 +> 16 0 31 1929 topology 2032 3585 +> 15 0 30 1929 topology 2051 3586 +> 16 0 30 1929 topology 2037 3586 +> 15 0 31 1929 topology 2037 3587 +> 16 0 31 1929 topology 2035 3587 +> 15 0 30 1929 topology 2051 3588 +> 16 0 30 1929 topology 1986 3588 +> 15 0 31 1929 topology 1986 3589 +> 16 0 31 1929 topology 1984 3589 +> 15 0 30 1929 topology 2051 3590 +> 16 0 30 1929 topology 1935 3590 +> 15 0 31 1929 topology 1935 3591 +> 16 0 31 1929 topology 1933 3591 +> 15 0 30 1929 topology 2051 3592 +> 16 0 30 1929 topology 2049 3592 +> 15 0 31 1929 topology 2049 3593 +> 16 0 31 1929 topology 2047 3593 +> 15 0 30 1929 topology 2051 3594 +> 16 0 30 1929 topology 1998 3594 +> 15 0 31 1929 topology 1998 3595 +> 16 0 31 1929 topology 1996 3595 +> 15 0 32 1929 topology 2051 3596 +> 16 0 32 1929 topology 2050 3596 +> 15 0 30 1929 topology 2051 3597 +> 16 0 30 1929 topology 1950 3597 +> 15 0 31 1929 topology 1950 3598 +> 16 0 31 1929 topology 1948 3598 +> 15 0 30 1929 topology 2051 3599 +> 16 0 30 1929 topology 2013 3599 +> 15 0 31 1929 topology 2013 3600 +> 16 0 31 1929 topology 2011 3600 +> 15 0 30 1929 topology 2051 3601 +> 16 0 30 1929 topology 1962 3601 +> 15 0 31 1929 topology 1962 3602 +> 16 0 31 1929 topology 1960 3602 +> 15 0 30 1929 topology 2051 3603 +> 16 0 30 1929 topology 2025 3603 +> 15 0 31 1929 topology 2025 3604 +> 16 0 31 1929 topology 2023 3604 +> 15 0 30 1929 topology 2051 3605 +> 16 0 30 1929 topology 1974 3605 +> 15 0 31 1929 topology 1974 3606 +> 16 0 31 1929 topology 1972 3606 +> 15 0 29 1929 topology 2038 3607 +> 16 0 29 1929 topology 2039 3607 +> 15 0 30 1929 topology 2039 3608 +> 16 0 30 1929 topology 2051 3608 +> 15 0 30 1929 topology 2051 3609 +> 16 0 30 1929 topology 1977 3609 +> 15 0 31 1929 topology 1977 3610 +> 16 0 31 1929 topology 1975 3610 +> 15 0 29 1929 topology 1987 3611 +> 16 0 29 1929 topology 1988 3611 +> 15 0 30 1929 topology 1988 3612 +> 16 0 30 1929 topology 2051 3612 +> 15 0 29 1929 topology 1936 3613 +> 16 0 29 1929 topology 1937 3613 +> 15 0 30 1929 topology 1937 3614 +> 16 0 30 1929 topology 2051 3614 +> 15 0 29 1929 topology 1999 3615 +> 16 0 29 1929 topology 2000 3615 +> 15 0 30 1929 topology 2000 3616 +> 16 0 30 1929 topology 2051 3616 +> 15 0 29 1929 topology 1951 3617 +> 16 0 29 1929 topology 1952 3617 +> 15 0 30 1929 topology 1952 3618 +> 16 0 30 1929 topology 2051 3618 +> 15 0 29 1929 topology 2014 3619 +> 16 0 29 1929 topology 2015 3619 +> 15 0 30 1929 topology 2015 3620 +> 16 0 30 1929 topology 2051 3620 +> 15 0 29 1929 topology 1963 3621 +> 16 0 29 1929 topology 1964 3621 +> 15 0 30 1929 topology 1964 3622 +> 16 0 30 1929 topology 2051 3622 +> 15 0 29 1929 topology 2026 3623 +> 16 0 29 1929 topology 2027 3623 +> 15 0 30 1929 topology 2027 3624 +> 16 0 30 1929 topology 2051 3624 +> 15 0 29 1929 topology 1978 3625 +> 16 0 29 1929 topology 1979 3625 +> 15 0 30 1929 topology 1979 3626 +> 16 0 30 1929 topology 2051 3626 +> 15 0 29 1929 topology 2041 3627 +> 16 0 29 1929 topology 2042 3627 +> 15 0 30 1929 topology 2042 3628 +> 16 0 30 1929 topology 2051 3628 +> 15 0 29 1929 topology 1990 3629 +> 16 0 29 1929 topology 1991 3629 +> 15 0 30 1929 topology 1991 3630 +> 16 0 30 1929 topology 2051 3630 +> 15 0 29 1929 topology 1939 3631 +> 16 0 29 1929 topology 1940 3631 +> 15 0 30 1929 topology 1940 3632 +> 16 0 30 1929 topology 2051 3632 +> 15 0 29 1929 topology 2002 3633 +> 16 0 29 1929 topology 2003 3633 +> 15 0 30 1929 topology 2003 3634 +> 16 0 30 1929 topology 2051 3634 +> 15 0 29 1929 topology 2005 3635 +> 16 0 29 1929 topology 2006 3635 +> 15 0 30 1929 topology 2006 3636 +> 16 0 30 1929 topology 2051 3636 +> 15 0 29 1929 topology 1954 3637 +> 16 0 29 1929 topology 1955 3637 +> 15 0 30 1929 topology 1955 3638 +> 16 0 30 1929 topology 2051 3638 +> 15 0 29 1929 topology 2017 3639 +> 16 0 29 1929 topology 2018 3639 +> 15 0 30 1929 topology 2018 3640 +> 16 0 30 1929 topology 2051 3640 +> 15 0 29 1929 topology 1966 3641 +> 16 0 29 1929 topology 1967 3641 +> 15 0 30 1929 topology 1967 3642 +> 16 0 30 1929 topology 2051 3642 +> 15 0 29 1929 topology 2029 3643 +> 16 0 29 1929 topology 2030 3643 +> 15 0 30 1929 topology 2030 3644 +> 16 0 30 1929 topology 2051 3644 +> 15 0 29 1929 topology 1981 3645 +> 16 0 29 1929 topology 1982 3645 +> 15 0 30 1929 topology 1982 3646 +> 16 0 30 1929 topology 2051 3646 +> 15 0 29 1929 topology 1930 3647 +> 16 0 29 1929 topology 1931 3647 +> 15 0 30 1929 topology 1931 3648 +> 16 0 30 1929 topology 2051 3648 +> 15 0 29 1929 topology 2044 3649 +> 16 0 29 1929 topology 2045 3649 +> 15 0 30 1929 topology 2045 3650 +> 16 0 30 1929 topology 2051 3650 +> 15 0 29 1929 topology 1993 3651 +> 16 0 29 1929 topology 1994 3651 +> 15 0 30 1929 topology 1994 3652 +> 16 0 30 1929 topology 2051 3652 +> 15 0 29 1929 topology 1942 3653 +> 16 0 29 1929 topology 1943 3653 +> 15 0 30 1929 topology 1943 3654 +> 16 0 30 1929 topology 2051 3654 +> 15 0 29 1929 topology 1945 3655 +> 16 0 29 1929 topology 1946 3655 +> 15 0 30 1929 topology 1946 3656 +> 16 0 30 1929 topology 2051 3656 +> 15 0 29 1929 topology 2008 3657 +> 16 0 29 1929 topology 2009 3657 +> 15 0 30 1929 topology 2009 3658 +> 16 0 30 1929 topology 2051 3658 +> 15 0 29 1929 topology 1957 3659 +> 16 0 29 1929 topology 1958 3659 +> 15 0 30 1929 topology 1958 3660 +> 16 0 30 1929 topology 2051 3660 +> 15 0 29 1929 topology 2020 3661 +> 16 0 29 1929 topology 2021 3661 +> 15 0 30 1929 topology 2021 3662 +> 16 0 30 1929 topology 2051 3662 +> 15 0 29 1929 topology 1969 3663 +> 16 0 29 1929 topology 1970 3663 +> 15 0 30 1929 topology 1970 3664 +> 16 0 30 1929 topology 2051 3664 +> 15 0 29 1929 topology 2032 3665 +> 16 0 29 1929 topology 2033 3665 +> 15 0 30 1929 topology 2033 3666 +> 16 0 30 1929 topology 2051 3666 +> 15 0 29 1929 topology 2035 3667 +> 16 0 29 1929 topology 2036 3667 +> 15 0 30 1929 topology 2036 3668 +> 16 0 30 1929 topology 2051 3668 +> 15 0 29 1929 topology 1984 3669 +> 16 0 29 1929 topology 1985 3669 +> 15 0 30 1929 topology 1985 3670 +> 16 0 30 1929 topology 2051 3670 +> 15 0 29 1929 topology 1933 3671 +> 16 0 29 1929 topology 1934 3671 +> 15 0 30 1929 topology 1934 3672 +> 16 0 30 1929 topology 2051 3672 +> 15 0 29 1929 topology 2047 3673 +> 16 0 29 1929 topology 2048 3673 +> 15 0 30 1929 topology 2048 3674 +> 16 0 30 1929 topology 2051 3674 +> 15 0 29 1929 topology 1996 3675 +> 16 0 29 1929 topology 1997 3675 +> 15 0 30 1929 topology 1997 3676 +> 16 0 30 1929 topology 2051 3676 +> 15 0 29 1929 topology 1948 3677 +> 16 0 29 1929 topology 1949 3677 +> 15 0 30 1929 topology 1949 3678 +> 16 0 30 1929 topology 2051 3678 +> 15 0 29 1929 topology 2011 3679 +> 16 0 29 1929 topology 2012 3679 +> 15 0 30 1929 topology 2012 3680 +> 16 0 30 1929 topology 2051 3680 +> 15 0 29 1929 topology 1960 3681 +> 16 0 29 1929 topology 1961 3681 +> 15 0 30 1929 topology 1961 3682 +> 16 0 30 1929 topology 2051 3682 +> 15 0 29 1929 topology 2023 3683 +> 16 0 29 1929 topology 2024 3683 +> 15 0 30 1929 topology 2024 3684 +> 16 0 30 1929 topology 2051 3684 +> 15 0 29 1929 topology 1972 3685 +> 16 0 29 1929 topology 1973 3685 +> 15 0 30 1929 topology 1973 3686 +> 16 0 30 1929 topology 2051 3686 +> 15 0 34 1607 topology 2053 3687 +> 16 0 34 1607 topology 2054 3687 +> 15 0 35 1607 topology 2054 3688 +> 16 0 35 1607 topology 1726 3688 +> 15 0 35 1607 topology 2054 3689 +> 16 0 35 1607 topology 1834 3689 +> 15 0 35 1607 topology 2054 3690 +> 16 0 35 1607 topology 1927 3690 +> 15 0 35 1607 topology 2054 3691 +> 16 0 35 1607 topology 2050 3691 +> 15 0 29 2057 topology 2085 3692 +> 16 0 29 2057 topology 2086 3692 +> 15 0 30 2057 topology 2086 3693 +> 16 0 30 2057 topology 2155 3693 +> 15 0 30 2057 topology 2155 3694 +> 16 0 30 2057 topology 2093 3694 +> 15 0 31 2057 topology 2093 3695 +> 16 0 31 2057 topology 2091 3695 +> 15 0 30 2057 topology 2155 3696 +> 16 0 30 2057 topology 2099 3696 +> 15 0 31 2057 topology 2099 3697 +> 16 0 31 2057 topology 2097 3697 +> 15 0 30 2057 topology 2155 3698 +> 16 0 30 2057 topology 2105 3698 +> 15 0 31 2057 topology 2105 3699 +> 16 0 31 2057 topology 2103 3699 +> 15 0 30 2057 topology 2155 3700 +> 16 0 30 2057 topology 2111 3700 +> 15 0 31 2057 topology 2111 3701 +> 16 0 31 2057 topology 2109 3701 +> 15 0 30 2057 topology 2155 3702 +> 16 0 30 2057 topology 2147 3702 +> 15 0 31 2057 topology 2147 3703 +> 16 0 31 2057 topology 2145 3703 +> 15 0 30 2057 topology 2155 3704 +> 16 0 30 2057 topology 2060 3704 +> 15 0 31 2057 topology 2060 3705 +> 16 0 31 2057 topology 2058 3705 +> 15 0 30 2057 topology 2155 3706 +> 16 0 30 2057 topology 2066 3706 +> 15 0 31 2057 topology 2066 3707 +> 16 0 31 2057 topology 2064 3707 +> 15 0 30 2057 topology 2155 3708 +> 16 0 30 2057 topology 2072 3708 +> 15 0 31 2057 topology 2072 3709 +> 16 0 31 2057 topology 2070 3709 +> 15 0 30 2057 topology 2155 3710 +> 16 0 30 2057 topology 2078 3710 +> 15 0 31 2057 topology 2078 3711 +> 16 0 31 2057 topology 2076 3711 +> 15 0 30 2057 topology 2155 3712 +> 16 0 30 2057 topology 2084 3712 +> 15 0 31 2057 topology 2084 3713 +> 16 0 31 2057 topology 2082 3713 +> 15 0 32 2057 topology 2155 3714 +> 16 0 32 2057 topology 2154 3714 +> 15 0 30 2057 topology 2155 3715 +> 16 0 30 2057 topology 2120 3715 +> 15 0 31 2057 topology 2120 3716 +> 16 0 31 2057 topology 2118 3716 +> 15 0 30 2057 topology 2155 3717 +> 16 0 30 2057 topology 2126 3717 +> 15 0 31 2057 topology 2126 3718 +> 16 0 31 2057 topology 2124 3718 +> 15 0 30 2057 topology 2155 3719 +> 16 0 30 2057 topology 2132 3719 +> 15 0 31 2057 topology 2132 3720 +> 16 0 31 2057 topology 2130 3720 +> 15 0 30 2057 topology 2155 3721 +> 16 0 30 2057 topology 2138 3721 +> 15 0 31 2057 topology 2138 3722 +> 16 0 31 2057 topology 2136 3722 +> 15 0 30 2057 topology 2155 3723 +> 16 0 30 2057 topology 2144 3723 +> 15 0 31 2057 topology 2144 3724 +> 16 0 31 2057 topology 2142 3724 +> 15 0 30 2057 topology 2155 3725 +> 16 0 30 2057 topology 2090 3725 +> 15 0 31 2057 topology 2090 3726 +> 16 0 31 2057 topology 2088 3726 +> 15 0 30 2057 topology 2155 3727 +> 16 0 30 2057 topology 2096 3727 +> 15 0 31 2057 topology 2096 3728 +> 16 0 31 2057 topology 2094 3728 +> 15 0 30 2057 topology 2155 3729 +> 16 0 30 2057 topology 2102 3729 +> 15 0 31 2057 topology 2102 3730 +> 16 0 31 2057 topology 2100 3730 +> 15 0 30 2057 topology 2155 3731 +> 16 0 30 2057 topology 2108 3731 +> 15 0 31 2057 topology 2108 3732 +> 16 0 31 2057 topology 2106 3732 +> 15 0 30 2057 topology 2155 3733 +> 16 0 30 2057 topology 2114 3733 +> 15 0 31 2057 topology 2114 3734 +> 16 0 31 2057 topology 2112 3734 +> 15 0 30 2057 topology 2155 3735 +> 16 0 30 2057 topology 2150 3735 +> 15 0 31 2057 topology 2150 3736 +> 16 0 31 2057 topology 2148 3736 +> 15 0 30 2057 topology 2155 3737 +> 16 0 30 2057 topology 2063 3737 +> 15 0 31 2057 topology 2063 3738 +> 16 0 31 2057 topology 2061 3738 +> 15 0 30 2057 topology 2155 3739 +> 16 0 30 2057 topology 2069 3739 +> 15 0 31 2057 topology 2069 3740 +> 16 0 31 2057 topology 2067 3740 +> 15 0 30 2057 topology 2155 3741 +> 16 0 30 2057 topology 2075 3741 +> 15 0 31 2057 topology 2075 3742 +> 16 0 31 2057 topology 2073 3742 +> 15 0 30 2057 topology 2155 3743 +> 16 0 30 2057 topology 2081 3743 +> 15 0 31 2057 topology 2081 3744 +> 16 0 31 2057 topology 2079 3744 +> 15 0 30 2057 topology 2155 3745 +> 16 0 30 2057 topology 2117 3745 +> 15 0 31 2057 topology 2117 3746 +> 16 0 31 2057 topology 2115 3746 +> 15 0 30 2057 topology 2155 3747 +> 16 0 30 2057 topology 2123 3747 +> 15 0 31 2057 topology 2123 3748 +> 16 0 31 2057 topology 2121 3748 +> 15 0 30 2057 topology 2155 3749 +> 16 0 30 2057 topology 2129 3749 +> 15 0 31 2057 topology 2129 3750 +> 16 0 31 2057 topology 2127 3750 +> 15 0 30 2057 topology 2155 3751 +> 16 0 30 2057 topology 2153 3751 +> 15 0 31 2057 topology 2153 3752 +> 16 0 31 2057 topology 2151 3752 +> 15 0 30 2057 topology 2155 3753 +> 16 0 30 2057 topology 2135 3753 +> 15 0 31 2057 topology 2135 3754 +> 16 0 31 2057 topology 2133 3754 +> 15 0 30 2057 topology 2155 3755 +> 16 0 30 2057 topology 2141 3755 +> 15 0 31 2057 topology 2141 3756 +> 16 0 31 2057 topology 2139 3756 +> 15 0 29 2057 topology 2091 3757 +> 16 0 29 2057 topology 2092 3757 +> 15 0 30 2057 topology 2092 3758 +> 16 0 30 2057 topology 2155 3758 +> 15 0 30 2057 topology 2155 3759 +> 16 0 30 2057 topology 2087 3759 +> 15 0 31 2057 topology 2087 3760 +> 16 0 31 2057 topology 2085 3760 +> 15 0 29 2057 topology 2097 3761 +> 16 0 29 2057 topology 2098 3761 +> 15 0 30 2057 topology 2098 3762 +> 16 0 30 2057 topology 2155 3762 +> 15 0 29 2057 topology 2103 3763 +> 16 0 29 2057 topology 2104 3763 +> 15 0 30 2057 topology 2104 3764 +> 16 0 30 2057 topology 2155 3764 +> 15 0 29 2057 topology 2109 3765 +> 16 0 29 2057 topology 2110 3765 +> 15 0 30 2057 topology 2110 3766 +> 16 0 30 2057 topology 2155 3766 +> 15 0 29 2057 topology 2145 3767 +> 16 0 29 2057 topology 2146 3767 +> 15 0 30 2057 topology 2146 3768 +> 16 0 30 2057 topology 2155 3768 +> 15 0 29 2057 topology 2058 3769 +> 16 0 29 2057 topology 2059 3769 +> 15 0 30 2057 topology 2059 3770 +> 16 0 30 2057 topology 2155 3770 +> 15 0 29 2057 topology 2064 3771 +> 16 0 29 2057 topology 2065 3771 +> 15 0 30 2057 topology 2065 3772 +> 16 0 30 2057 topology 2155 3772 +> 15 0 29 2057 topology 2070 3773 +> 16 0 29 2057 topology 2071 3773 +> 15 0 30 2057 topology 2071 3774 +> 16 0 30 2057 topology 2155 3774 +> 15 0 29 2057 topology 2076 3775 +> 16 0 29 2057 topology 2077 3775 +> 15 0 30 2057 topology 2077 3776 +> 16 0 30 2057 topology 2155 3776 +> 15 0 29 2057 topology 2082 3777 +> 16 0 29 2057 topology 2083 3777 +> 15 0 30 2057 topology 2083 3778 +> 16 0 30 2057 topology 2155 3778 +> 15 0 29 2057 topology 2118 3779 +> 16 0 29 2057 topology 2119 3779 +> 15 0 30 2057 topology 2119 3780 +> 16 0 30 2057 topology 2155 3780 +> 15 0 29 2057 topology 2124 3781 +> 16 0 29 2057 topology 2125 3781 +> 15 0 30 2057 topology 2125 3782 +> 16 0 30 2057 topology 2155 3782 +> 15 0 29 2057 topology 2130 3783 +> 16 0 29 2057 topology 2131 3783 +> 15 0 30 2057 topology 2131 3784 +> 16 0 30 2057 topology 2155 3784 +> 15 0 29 2057 topology 2136 3785 +> 16 0 29 2057 topology 2137 3785 +> 15 0 30 2057 topology 2137 3786 +> 16 0 30 2057 topology 2155 3786 +> 15 0 29 2057 topology 2142 3787 +> 16 0 29 2057 topology 2143 3787 +> 15 0 30 2057 topology 2143 3788 +> 16 0 30 2057 topology 2155 3788 +> 15 0 29 2057 topology 2088 3789 +> 16 0 29 2057 topology 2089 3789 +> 15 0 30 2057 topology 2089 3790 +> 16 0 30 2057 topology 2155 3790 +> 15 0 29 2057 topology 2094 3791 +> 16 0 29 2057 topology 2095 3791 +> 15 0 30 2057 topology 2095 3792 +> 16 0 30 2057 topology 2155 3792 +> 15 0 29 2057 topology 2100 3793 +> 16 0 29 2057 topology 2101 3793 +> 15 0 30 2057 topology 2101 3794 +> 16 0 30 2057 topology 2155 3794 +> 15 0 29 2057 topology 2106 3795 +> 16 0 29 2057 topology 2107 3795 +> 15 0 30 2057 topology 2107 3796 +> 16 0 30 2057 topology 2155 3796 +> 15 0 29 2057 topology 2112 3797 +> 16 0 29 2057 topology 2113 3797 +> 15 0 30 2057 topology 2113 3798 +> 16 0 30 2057 topology 2155 3798 +> 15 0 29 2057 topology 2148 3799 +> 16 0 29 2057 topology 2149 3799 +> 15 0 30 2057 topology 2149 3800 +> 16 0 30 2057 topology 2155 3800 +> 15 0 29 2057 topology 2061 3801 +> 16 0 29 2057 topology 2062 3801 +> 15 0 30 2057 topology 2062 3802 +> 16 0 30 2057 topology 2155 3802 +> 15 0 29 2057 topology 2067 3803 +> 16 0 29 2057 topology 2068 3803 +> 15 0 30 2057 topology 2068 3804 +> 16 0 30 2057 topology 2155 3804 +> 15 0 29 2057 topology 2073 3805 +> 16 0 29 2057 topology 2074 3805 +> 15 0 30 2057 topology 2074 3806 +> 16 0 30 2057 topology 2155 3806 +> 15 0 29 2057 topology 2079 3807 +> 16 0 29 2057 topology 2080 3807 +> 15 0 30 2057 topology 2080 3808 +> 16 0 30 2057 topology 2155 3808 +> 15 0 29 2057 topology 2115 3809 +> 16 0 29 2057 topology 2116 3809 +> 15 0 30 2057 topology 2116 3810 +> 16 0 30 2057 topology 2155 3810 +> 15 0 29 2057 topology 2121 3811 +> 16 0 29 2057 topology 2122 3811 +> 15 0 30 2057 topology 2122 3812 +> 16 0 30 2057 topology 2155 3812 +> 15 0 29 2057 topology 2127 3813 +> 16 0 29 2057 topology 2128 3813 +> 15 0 30 2057 topology 2128 3814 +> 16 0 30 2057 topology 2155 3814 +> 15 0 29 2057 topology 2151 3815 +> 16 0 29 2057 topology 2152 3815 +> 15 0 30 2057 topology 2152 3816 +> 16 0 30 2057 topology 2155 3816 +> 15 0 29 2057 topology 2133 3817 +> 16 0 29 2057 topology 2134 3817 +> 15 0 30 2057 topology 2134 3818 +> 16 0 30 2057 topology 2155 3818 +> 15 0 29 2057 topology 2139 3819 +> 16 0 29 2057 topology 2140 3819 +> 15 0 30 2057 topology 2140 3820 +> 16 0 30 2057 topology 2155 3820 +> 15 0 29 2156 topology 2160 3821 +> 16 0 29 2156 topology 2161 3821 +> 15 0 30 2156 topology 2161 3822 +> 16 0 30 2156 topology 2242 3822 +> 15 0 30 2156 topology 2242 3823 +> 16 0 30 2156 topology 2219 3823 +> 15 0 31 2156 topology 2219 3824 +> 16 0 31 2156 topology 2217 3824 +> 15 0 30 2156 topology 2242 3825 +> 16 0 30 2156 topology 2168 3825 +> 15 0 31 2156 topology 2168 3826 +> 16 0 31 2156 topology 2166 3826 +> 15 0 30 2156 topology 2242 3827 +> 16 0 30 2156 topology 2225 3827 +> 15 0 31 2156 topology 2225 3828 +> 16 0 31 2156 topology 2223 3828 +> 15 0 30 2156 topology 2242 3829 +> 16 0 30 2156 topology 2174 3829 +> 15 0 31 2156 topology 2174 3830 +> 16 0 31 2156 topology 2172 3830 +> 15 0 30 2156 topology 2242 3831 +> 16 0 30 2156 topology 2231 3831 +> 15 0 31 2156 topology 2231 3832 +> 16 0 31 2156 topology 2229 3832 +> 15 0 30 2156 topology 2242 3833 +> 16 0 30 2156 topology 2180 3833 +> 15 0 31 2156 topology 2180 3834 +> 16 0 31 2156 topology 2178 3834 +> 15 0 30 2156 topology 2242 3835 +> 16 0 30 2156 topology 2237 3835 +> 15 0 31 2156 topology 2237 3836 +> 16 0 31 2156 topology 2235 3836 +> 15 0 30 2156 topology 2242 3837 +> 16 0 30 2156 topology 2186 3837 +> 15 0 31 2156 topology 2186 3838 +> 16 0 31 2156 topology 2184 3838 +> 15 0 30 2156 topology 2242 3839 +> 16 0 30 2156 topology 2189 3839 +> 15 0 31 2156 topology 2189 3840 +> 16 0 31 2156 topology 2187 3840 +> 15 0 30 2156 topology 2242 3841 +> 16 0 30 2156 topology 2195 3841 +> 15 0 31 2156 topology 2195 3842 +> 16 0 31 2156 topology 2193 3842 +> 15 0 30 2156 topology 2242 3843 +> 16 0 30 2156 topology 2201 3843 +> 15 0 31 2156 topology 2201 3844 +> 16 0 31 2156 topology 2199 3844 +> 15 0 30 2156 topology 2242 3845 +> 16 0 30 2156 topology 2207 3845 +> 15 0 31 2156 topology 2207 3846 +> 16 0 31 2156 topology 2205 3846 +> 15 0 30 2156 topology 2242 3847 +> 16 0 30 2156 topology 2213 3847 +> 15 0 31 2156 topology 2213 3848 +> 16 0 31 2156 topology 2211 3848 +> 15 0 30 2156 topology 2242 3849 +> 16 0 30 2156 topology 2159 3849 +> 15 0 31 2156 topology 2159 3850 +> 16 0 31 2156 topology 2157 3850 +> 15 0 32 2156 topology 2242 3851 +> 16 0 32 2156 topology 2241 3851 +> 15 0 30 2156 topology 2242 3852 +> 16 0 30 2156 topology 2165 3852 +> 15 0 31 2156 topology 2165 3853 +> 16 0 31 2156 topology 2163 3853 +> 15 0 30 2156 topology 2242 3854 +> 16 0 30 2156 topology 2222 3854 +> 15 0 31 2156 topology 2222 3855 +> 16 0 31 2156 topology 2220 3855 +> 15 0 30 2156 topology 2242 3856 +> 16 0 30 2156 topology 2171 3856 +> 15 0 31 2156 topology 2171 3857 +> 16 0 31 2156 topology 2169 3857 +> 15 0 30 2156 topology 2242 3858 +> 16 0 30 2156 topology 2228 3858 +> 15 0 31 2156 topology 2228 3859 +> 16 0 31 2156 topology 2226 3859 +> 15 0 30 2156 topology 2242 3860 +> 16 0 30 2156 topology 2177 3860 +> 15 0 31 2156 topology 2177 3861 +> 16 0 31 2156 topology 2175 3861 +> 15 0 30 2156 topology 2242 3862 +> 16 0 30 2156 topology 2234 3862 +> 15 0 31 2156 topology 2234 3863 +> 16 0 31 2156 topology 2232 3863 +> 15 0 30 2156 topology 2242 3864 +> 16 0 30 2156 topology 2183 3864 +> 15 0 31 2156 topology 2183 3865 +> 16 0 31 2156 topology 2181 3865 +> 15 0 30 2156 topology 2242 3866 +> 16 0 30 2156 topology 2240 3866 +> 15 0 31 2156 topology 2240 3867 +> 16 0 31 2156 topology 2238 3867 +> 15 0 30 2156 topology 2242 3868 +> 16 0 30 2156 topology 2192 3868 +> 15 0 31 2156 topology 2192 3869 +> 16 0 31 2156 topology 2190 3869 +> 15 0 30 2156 topology 2242 3870 +> 16 0 30 2156 topology 2198 3870 +> 15 0 31 2156 topology 2198 3871 +> 16 0 31 2156 topology 2196 3871 +> 15 0 30 2156 topology 2242 3872 +> 16 0 30 2156 topology 2204 3872 +> 15 0 31 2156 topology 2204 3873 +> 16 0 31 2156 topology 2202 3873 +> 15 0 30 2156 topology 2242 3874 +> 16 0 30 2156 topology 2210 3874 +> 15 0 31 2156 topology 2210 3875 +> 16 0 31 2156 topology 2208 3875 +> 15 0 30 2156 topology 2242 3876 +> 16 0 30 2156 topology 2216 3876 +> 15 0 31 2156 topology 2216 3877 +> 16 0 31 2156 topology 2214 3877 +> 15 0 29 2156 topology 2217 3878 +> 16 0 29 2156 topology 2218 3878 +> 15 0 30 2156 topology 2218 3879 +> 16 0 30 2156 topology 2242 3879 +> 15 0 30 2156 topology 2242 3880 +> 16 0 30 2156 topology 2162 3880 +> 15 0 31 2156 topology 2162 3881 +> 16 0 31 2156 topology 2160 3881 +> 15 0 29 2156 topology 2166 3882 +> 16 0 29 2156 topology 2167 3882 +> 15 0 30 2156 topology 2167 3883 +> 16 0 30 2156 topology 2242 3883 +> 15 0 29 2156 topology 2223 3884 +> 16 0 29 2156 topology 2224 3884 +> 15 0 30 2156 topology 2224 3885 +> 16 0 30 2156 topology 2242 3885 +> 15 0 29 2156 topology 2172 3886 +> 16 0 29 2156 topology 2173 3886 +> 15 0 30 2156 topology 2173 3887 +> 16 0 30 2156 topology 2242 3887 +> 15 0 29 2156 topology 2229 3888 +> 16 0 29 2156 topology 2230 3888 +> 15 0 30 2156 topology 2230 3889 +> 16 0 30 2156 topology 2242 3889 +> 15 0 29 2156 topology 2178 3890 +> 16 0 29 2156 topology 2179 3890 +> 15 0 30 2156 topology 2179 3891 +> 16 0 30 2156 topology 2242 3891 +> 15 0 29 2156 topology 2235 3892 +> 16 0 29 2156 topology 2236 3892 +> 15 0 30 2156 topology 2236 3893 +> 16 0 30 2156 topology 2242 3893 +> 15 0 29 2156 topology 2184 3894 +> 16 0 29 2156 topology 2185 3894 +> 15 0 30 2156 topology 2185 3895 +> 16 0 30 2156 topology 2242 3895 +> 15 0 29 2156 topology 2187 3896 +> 16 0 29 2156 topology 2188 3896 +> 15 0 30 2156 topology 2188 3897 +> 16 0 30 2156 topology 2242 3897 +> 15 0 29 2156 topology 2193 3898 +> 16 0 29 2156 topology 2194 3898 +> 15 0 30 2156 topology 2194 3899 +> 16 0 30 2156 topology 2242 3899 +> 15 0 29 2156 topology 2199 3900 +> 16 0 29 2156 topology 2200 3900 +> 15 0 30 2156 topology 2200 3901 +> 16 0 30 2156 topology 2242 3901 +> 15 0 29 2156 topology 2205 3902 +> 16 0 29 2156 topology 2206 3902 +> 15 0 30 2156 topology 2206 3903 +> 16 0 30 2156 topology 2242 3903 +> 15 0 29 2156 topology 2211 3904 +> 16 0 29 2156 topology 2212 3904 +> 15 0 30 2156 topology 2212 3905 +> 16 0 30 2156 topology 2242 3905 +> 15 0 29 2156 topology 2157 3906 +> 16 0 29 2156 topology 2158 3906 +> 15 0 30 2156 topology 2158 3907 +> 16 0 30 2156 topology 2242 3907 +> 15 0 29 2156 topology 2163 3908 +> 16 0 29 2156 topology 2164 3908 +> 15 0 30 2156 topology 2164 3909 +> 16 0 30 2156 topology 2242 3909 +> 15 0 29 2156 topology 2220 3910 +> 16 0 29 2156 topology 2221 3910 +> 15 0 30 2156 topology 2221 3911 +> 16 0 30 2156 topology 2242 3911 +> 15 0 29 2156 topology 2169 3912 +> 16 0 29 2156 topology 2170 3912 +> 15 0 30 2156 topology 2170 3913 +> 16 0 30 2156 topology 2242 3913 +> 15 0 29 2156 topology 2226 3914 +> 16 0 29 2156 topology 2227 3914 +> 15 0 30 2156 topology 2227 3915 +> 16 0 30 2156 topology 2242 3915 +> 15 0 29 2156 topology 2175 3916 +> 16 0 29 2156 topology 2176 3916 +> 15 0 30 2156 topology 2176 3917 +> 16 0 30 2156 topology 2242 3917 +> 15 0 29 2156 topology 2232 3918 +> 16 0 29 2156 topology 2233 3918 +> 15 0 30 2156 topology 2233 3919 +> 16 0 30 2156 topology 2242 3919 +> 15 0 29 2156 topology 2181 3920 +> 16 0 29 2156 topology 2182 3920 +> 15 0 30 2156 topology 2182 3921 +> 16 0 30 2156 topology 2242 3921 +> 15 0 29 2156 topology 2238 3922 +> 16 0 29 2156 topology 2239 3922 +> 15 0 30 2156 topology 2239 3923 +> 16 0 30 2156 topology 2242 3923 +> 15 0 29 2156 topology 2190 3924 +> 16 0 29 2156 topology 2191 3924 +> 15 0 30 2156 topology 2191 3925 +> 16 0 30 2156 topology 2242 3925 +> 15 0 29 2156 topology 2196 3926 +> 16 0 29 2156 topology 2197 3926 +> 15 0 30 2156 topology 2197 3927 +> 16 0 30 2156 topology 2242 3927 +> 15 0 29 2156 topology 2202 3928 +> 16 0 29 2156 topology 2203 3928 +> 15 0 30 2156 topology 2203 3929 +> 16 0 30 2156 topology 2242 3929 +> 15 0 29 2156 topology 2208 3930 +> 16 0 29 2156 topology 2209 3930 +> 15 0 30 2156 topology 2209 3931 +> 16 0 30 2156 topology 2242 3931 +> 15 0 29 2156 topology 2214 3932 +> 16 0 29 2156 topology 2215 3932 +> 15 0 30 2156 topology 2215 3933 +> 16 0 30 2156 topology 2242 3933 +> 15 0 29 2243 topology 2274 3934 +> 16 0 29 2243 topology 2275 3934 +> 15 0 30 2243 topology 2275 3935 +> 16 0 30 2243 topology 2341 3935 +> 15 0 30 2243 topology 2341 3936 +> 16 0 30 2243 topology 2333 3936 +> 15 0 31 2243 topology 2333 3937 +> 16 0 31 2243 topology 2331 3937 +> 15 0 30 2243 topology 2341 3938 +> 16 0 30 2243 topology 2282 3938 +> 15 0 31 2243 topology 2282 3939 +> 16 0 31 2243 topology 2280 3939 +> 15 0 30 2243 topology 2341 3940 +> 16 0 30 2243 topology 2339 3940 +> 15 0 31 2243 topology 2339 3941 +> 16 0 31 2243 topology 2337 3941 +> 15 0 30 2243 topology 2341 3942 +> 16 0 30 2243 topology 2288 3942 +> 15 0 31 2243 topology 2288 3943 +> 16 0 31 2243 topology 2286 3943 +> 15 0 30 2243 topology 2341 3944 +> 16 0 30 2243 topology 2294 3944 +> 15 0 31 2243 topology 2294 3945 +> 16 0 31 2243 topology 2292 3945 +> 15 0 30 2243 topology 2341 3946 +> 16 0 30 2243 topology 2300 3946 +> 15 0 31 2243 topology 2300 3947 +> 16 0 31 2243 topology 2298 3947 +> 15 0 30 2243 topology 2341 3948 +> 16 0 30 2243 topology 2246 3948 +> 15 0 31 2243 topology 2246 3949 +> 16 0 31 2243 topology 2244 3949 +> 15 0 30 2243 topology 2341 3950 +> 16 0 30 2243 topology 2303 3950 +> 15 0 31 2243 topology 2303 3951 +> 16 0 31 2243 topology 2301 3951 +> 15 0 30 2243 topology 2341 3952 +> 16 0 30 2243 topology 2252 3952 +> 15 0 31 2243 topology 2252 3953 +> 16 0 31 2243 topology 2250 3953 +> 15 0 30 2243 topology 2341 3954 +> 16 0 30 2243 topology 2309 3954 +> 15 0 31 2243 topology 2309 3955 +> 16 0 31 2243 topology 2307 3955 +> 15 0 30 2243 topology 2341 3956 +> 16 0 30 2243 topology 2258 3956 +> 15 0 31 2243 topology 2258 3957 +> 16 0 31 2243 topology 2256 3957 +> 15 0 30 2243 topology 2341 3958 +> 16 0 30 2243 topology 2315 3958 +> 15 0 31 2243 topology 2315 3959 +> 16 0 31 2243 topology 2313 3959 +> 15 0 30 2243 topology 2341 3960 +> 16 0 30 2243 topology 2264 3960 +> 15 0 31 2243 topology 2264 3961 +> 16 0 31 2243 topology 2262 3961 +> 15 0 30 2243 topology 2341 3962 +> 16 0 30 2243 topology 2321 3962 +> 15 0 31 2243 topology 2321 3963 +> 16 0 31 2243 topology 2319 3963 +> 15 0 30 2243 topology 2341 3964 +> 16 0 30 2243 topology 2270 3964 +> 15 0 31 2243 topology 2270 3965 +> 16 0 31 2243 topology 2268 3965 +> 15 0 30 2243 topology 2341 3966 +> 16 0 30 2243 topology 2327 3966 +> 15 0 31 2243 topology 2327 3967 +> 16 0 31 2243 topology 2325 3967 +> 15 0 30 2243 topology 2341 3968 +> 16 0 30 2243 topology 2273 3968 +> 15 0 31 2243 topology 2273 3969 +> 16 0 31 2243 topology 2271 3969 +> 15 0 30 2243 topology 2341 3970 +> 16 0 30 2243 topology 2279 3970 +> 15 0 31 2243 topology 2279 3971 +> 16 0 31 2243 topology 2277 3971 +> 15 0 30 2243 topology 2341 3972 +> 16 0 30 2243 topology 2336 3972 +> 15 0 31 2243 topology 2336 3973 +> 16 0 31 2243 topology 2334 3973 +> 15 0 30 2243 topology 2341 3974 +> 16 0 30 2243 topology 2285 3974 +> 15 0 31 2243 topology 2285 3975 +> 16 0 31 2243 topology 2283 3975 +> 15 0 30 2243 topology 2341 3976 +> 16 0 30 2243 topology 2291 3976 +> 15 0 31 2243 topology 2291 3977 +> 16 0 31 2243 topology 2289 3977 +> 15 0 30 2243 topology 2341 3978 +> 16 0 30 2243 topology 2297 3978 +> 15 0 31 2243 topology 2297 3979 +> 16 0 31 2243 topology 2295 3979 +> 15 0 32 2243 topology 2341 3980 +> 16 0 32 2243 topology 2340 3980 +> 15 0 30 2243 topology 2341 3981 +> 16 0 30 2243 topology 2249 3981 +> 15 0 31 2243 topology 2249 3982 +> 16 0 31 2243 topology 2247 3982 +> 15 0 30 2243 topology 2341 3983 +> 16 0 30 2243 topology 2306 3983 +> 15 0 31 2243 topology 2306 3984 +> 16 0 31 2243 topology 2304 3984 +> 15 0 30 2243 topology 2341 3985 +> 16 0 30 2243 topology 2255 3985 +> 15 0 31 2243 topology 2255 3986 +> 16 0 31 2243 topology 2253 3986 +> 15 0 30 2243 topology 2341 3987 +> 16 0 30 2243 topology 2312 3987 +> 15 0 31 2243 topology 2312 3988 +> 16 0 31 2243 topology 2310 3988 +> 15 0 30 2243 topology 2341 3989 +> 16 0 30 2243 topology 2261 3989 +> 15 0 31 2243 topology 2261 3990 +> 16 0 31 2243 topology 2259 3990 +> 15 0 30 2243 topology 2341 3991 +> 16 0 30 2243 topology 2318 3991 +> 15 0 31 2243 topology 2318 3992 +> 16 0 31 2243 topology 2316 3992 +> 15 0 30 2243 topology 2341 3993 +> 16 0 30 2243 topology 2267 3993 +> 15 0 31 2243 topology 2267 3994 +> 16 0 31 2243 topology 2265 3994 +> 15 0 30 2243 topology 2341 3995 +> 16 0 30 2243 topology 2324 3995 +> 15 0 31 2243 topology 2324 3996 +> 16 0 31 2243 topology 2322 3996 +> 15 0 30 2243 topology 2341 3997 +> 16 0 30 2243 topology 2330 3997 +> 15 0 31 2243 topology 2330 3998 +> 16 0 31 2243 topology 2328 3998 +> 15 0 29 2243 topology 2331 3999 +> 16 0 29 2243 topology 2332 3999 +> 15 0 30 2243 topology 2332 4000 +> 16 0 30 2243 topology 2341 4000 +> 15 0 30 2243 topology 2341 4001 +> 16 0 30 2243 topology 2276 4001 +> 15 0 31 2243 topology 2276 4002 +> 16 0 31 2243 topology 2274 4002 +> 15 0 29 2243 topology 2280 4003 +> 16 0 29 2243 topology 2281 4003 +> 15 0 30 2243 topology 2281 4004 +> 16 0 30 2243 topology 2341 4004 +> 15 0 29 2243 topology 2337 4005 +> 16 0 29 2243 topology 2338 4005 +> 15 0 30 2243 topology 2338 4006 +> 16 0 30 2243 topology 2341 4006 +> 15 0 29 2243 topology 2286 4007 +> 16 0 29 2243 topology 2287 4007 +> 15 0 30 2243 topology 2287 4008 +> 16 0 30 2243 topology 2341 4008 +> 15 0 29 2243 topology 2292 4009 +> 16 0 29 2243 topology 2293 4009 +> 15 0 30 2243 topology 2293 4010 +> 16 0 30 2243 topology 2341 4010 +> 15 0 29 2243 topology 2298 4011 +> 16 0 29 2243 topology 2299 4011 +> 15 0 30 2243 topology 2299 4012 +> 16 0 30 2243 topology 2341 4012 +> 15 0 29 2243 topology 2244 4013 +> 16 0 29 2243 topology 2245 4013 +> 15 0 30 2243 topology 2245 4014 +> 16 0 30 2243 topology 2341 4014 +> 15 0 29 2243 topology 2301 4015 +> 16 0 29 2243 topology 2302 4015 +> 15 0 30 2243 topology 2302 4016 +> 16 0 30 2243 topology 2341 4016 +> 15 0 29 2243 topology 2250 4017 +> 16 0 29 2243 topology 2251 4017 +> 15 0 30 2243 topology 2251 4018 +> 16 0 30 2243 topology 2341 4018 +> 15 0 29 2243 topology 2307 4019 +> 16 0 29 2243 topology 2308 4019 +> 15 0 30 2243 topology 2308 4020 +> 16 0 30 2243 topology 2341 4020 +> 15 0 29 2243 topology 2256 4021 +> 16 0 29 2243 topology 2257 4021 +> 15 0 30 2243 topology 2257 4022 +> 16 0 30 2243 topology 2341 4022 +> 15 0 29 2243 topology 2313 4023 +> 16 0 29 2243 topology 2314 4023 +> 15 0 30 2243 topology 2314 4024 +> 16 0 30 2243 topology 2341 4024 +> 15 0 29 2243 topology 2262 4025 +> 16 0 29 2243 topology 2263 4025 +> 15 0 30 2243 topology 2263 4026 +> 16 0 30 2243 topology 2341 4026 +> 15 0 29 2243 topology 2319 4027 +> 16 0 29 2243 topology 2320 4027 +> 15 0 30 2243 topology 2320 4028 +> 16 0 30 2243 topology 2341 4028 +> 15 0 29 2243 topology 2268 4029 +> 16 0 29 2243 topology 2269 4029 +> 15 0 30 2243 topology 2269 4030 +> 16 0 30 2243 topology 2341 4030 +> 15 0 29 2243 topology 2325 4031 +> 16 0 29 2243 topology 2326 4031 +> 15 0 30 2243 topology 2326 4032 +> 16 0 30 2243 topology 2341 4032 +> 15 0 29 2243 topology 2271 4033 +> 16 0 29 2243 topology 2272 4033 +> 15 0 30 2243 topology 2272 4034 +> 16 0 30 2243 topology 2341 4034 +> 15 0 29 2243 topology 2277 4035 +> 16 0 29 2243 topology 2278 4035 +> 15 0 30 2243 topology 2278 4036 +> 16 0 30 2243 topology 2341 4036 +> 15 0 29 2243 topology 2334 4037 +> 16 0 29 2243 topology 2335 4037 +> 15 0 30 2243 topology 2335 4038 +> 16 0 30 2243 topology 2341 4038 +> 15 0 29 2243 topology 2283 4039 +> 16 0 29 2243 topology 2284 4039 +> 15 0 30 2243 topology 2284 4040 +> 16 0 30 2243 topology 2341 4040 +> 15 0 29 2243 topology 2289 4041 +> 16 0 29 2243 topology 2290 4041 +> 15 0 30 2243 topology 2290 4042 +> 16 0 30 2243 topology 2341 4042 +> 15 0 29 2243 topology 2295 4043 +> 16 0 29 2243 topology 2296 4043 +> 15 0 30 2243 topology 2296 4044 +> 16 0 30 2243 topology 2341 4044 +> 15 0 29 2243 topology 2247 4045 +> 16 0 29 2243 topology 2248 4045 +> 15 0 30 2243 topology 2248 4046 +> 16 0 30 2243 topology 2341 4046 +> 15 0 29 2243 topology 2304 4047 +> 16 0 29 2243 topology 2305 4047 +> 15 0 30 2243 topology 2305 4048 +> 16 0 30 2243 topology 2341 4048 +> 15 0 29 2243 topology 2253 4049 +> 16 0 29 2243 topology 2254 4049 +> 15 0 30 2243 topology 2254 4050 +> 16 0 30 2243 topology 2341 4050 +> 15 0 29 2243 topology 2310 4051 +> 16 0 29 2243 topology 2311 4051 +> 15 0 30 2243 topology 2311 4052 +> 16 0 30 2243 topology 2341 4052 +> 15 0 29 2243 topology 2259 4053 +> 16 0 29 2243 topology 2260 4053 +> 15 0 30 2243 topology 2260 4054 +> 16 0 30 2243 topology 2341 4054 +> 15 0 29 2243 topology 2316 4055 +> 16 0 29 2243 topology 2317 4055 +> 15 0 30 2243 topology 2317 4056 +> 16 0 30 2243 topology 2341 4056 +> 15 0 29 2243 topology 2265 4057 +> 16 0 29 2243 topology 2266 4057 +> 15 0 30 2243 topology 2266 4058 +> 16 0 30 2243 topology 2341 4058 +> 15 0 29 2243 topology 2322 4059 +> 16 0 29 2243 topology 2323 4059 +> 15 0 30 2243 topology 2323 4060 +> 16 0 30 2243 topology 2341 4060 +> 15 0 29 2243 topology 2328 4061 +> 16 0 29 2243 topology 2329 4061 +> 15 0 30 2243 topology 2329 4062 +> 16 0 30 2243 topology 2341 4062 +> 15 0 34 2056 topology 2343 4063 +> 16 0 34 2056 topology 2344 4063 +> 15 0 35 2056 topology 2344 4064 +> 16 0 35 2056 topology 2154 4064 +> 15 0 35 2056 topology 2344 4065 +> 16 0 35 2056 topology 2241 4065 +> 15 0 35 2056 topology 2344 4066 +> 16 0 35 2056 topology 2340 4066 +> 15 0 37 1606 topology 2053 4067 +> 16 0 37 1606 topology 2055 4067 +> 15 0 21 1606 topology 2055 4068 +> 16 0 21 1606 topology 2345 4068 +> 15 0 36 1606 topology 2345 4069 +> 16 0 36 1606 topology 2343 4069 +> 15 0 28 1606 topology 2055 4070 +> 16 0 28 1606 topology 2347 4070 +> 15 0 28 1606 topology 2345 4071 +> 16 0 28 1606 topology 2347 4071 +> 15 0 23 462 topology 469 4072 +> 16 0 23 462 topology 470 4072 +> 15 0 24 462 topology 470 4073 +> 16 0 24 462 topology 494 4073 +> 15 0 24 462 topology 494 4074 +> 16 0 24 462 topology 483 4074 +> 15 0 25 462 topology 483 4075 +> 16 0 25 462 topology 481 4075 +> 15 0 26 462 topology 494 4076 +> 16 0 26 462 topology 493 4076 +> 15 0 24 462 topology 494 4077 +> 16 0 24 462 topology 492 4077 +> 15 0 25 462 topology 492 4078 +> 16 0 25 462 topology 490 4078 +> 15 0 24 462 topology 494 4079 +> 16 0 24 462 topology 474 4079 +> 15 0 25 462 topology 474 4080 +> 16 0 25 462 topology 472 4080 +> 15 0 24 462 topology 494 4081 +> 16 0 24 462 topology 486 4081 +> 15 0 25 462 topology 486 4082 +> 16 0 25 462 topology 484 4082 +> 15 0 24 462 topology 494 4083 +> 16 0 24 462 topology 465 4083 +> 15 0 25 462 topology 465 4084 +> 16 0 25 462 topology 463 4084 +> 15 0 24 462 topology 494 4085 +> 16 0 24 462 topology 477 4085 +> 15 0 25 462 topology 477 4086 +> 16 0 25 462 topology 475 4086 +> 15 0 24 462 topology 494 4087 +> 16 0 24 462 topology 489 4087 +> 15 0 25 462 topology 489 4088 +> 16 0 25 462 topology 487 4088 +> 15 0 24 462 topology 494 4089 +> 16 0 24 462 topology 468 4089 +> 15 0 25 462 topology 468 4090 +> 16 0 25 462 topology 466 4090 +> 15 0 24 462 topology 494 4091 +> 16 0 24 462 topology 480 4091 +> 15 0 25 462 topology 480 4092 +> 16 0 25 462 topology 478 4092 +> 15 0 23 462 topology 481 4093 +> 16 0 23 462 topology 482 4093 +> 15 0 24 462 topology 482 4094 +> 16 0 24 462 topology 494 4094 +> 15 0 24 462 topology 494 4095 +> 16 0 24 462 topology 471 4095 +> 15 0 25 462 topology 471 4096 +> 16 0 25 462 topology 469 4096 +> 15 0 23 462 topology 490 4097 +> 16 0 23 462 topology 491 4097 +> 15 0 24 462 topology 491 4098 +> 16 0 24 462 topology 494 4098 +> 15 0 23 462 topology 472 4099 +> 16 0 23 462 topology 473 4099 +> 15 0 24 462 topology 473 4100 +> 16 0 24 462 topology 494 4100 +> 15 0 23 462 topology 484 4101 +> 16 0 23 462 topology 485 4101 +> 15 0 24 462 topology 485 4102 +> 16 0 24 462 topology 494 4102 +> 15 0 23 462 topology 463 4103 +> 16 0 23 462 topology 464 4103 +> 15 0 24 462 topology 464 4104 +> 16 0 24 462 topology 494 4104 +> 15 0 23 462 topology 475 4105 +> 16 0 23 462 topology 476 4105 +> 15 0 24 462 topology 476 4106 +> 16 0 24 462 topology 494 4106 +> 15 0 23 462 topology 487 4107 +> 16 0 23 462 topology 488 4107 +> 15 0 24 462 topology 488 4108 +> 16 0 24 462 topology 494 4108 +> 15 0 23 462 topology 466 4109 +> 16 0 23 462 topology 467 4109 +> 15 0 24 462 topology 467 4110 +> 16 0 24 462 topology 494 4110 +> 15 0 23 462 topology 478 4111 +> 16 0 23 462 topology 479 4111 +> 15 0 24 462 topology 479 4112 +> 16 0 24 462 topology 494 4112 +> 15 0 23 22 topology 35 4113 +> 16 0 23 22 topology 36 4113 +> 15 0 24 22 topology 36 4114 +> 16 0 24 22 topology 177 4114 +> 15 0 24 22 topology 177 4115 +> 16 0 24 22 topology 49 4115 +> 15 0 25 22 topology 49 4116 +> 16 0 25 22 topology 47 4116 +> 15 0 24 22 topology 177 4117 +> 16 0 24 22 topology 85 4117 +> 15 0 25 22 topology 85 4118 +> 16 0 25 22 topology 83 4118 +> 15 0 24 22 topology 177 4119 +> 16 0 24 22 topology 61 4119 +> 15 0 25 22 topology 61 4120 +> 16 0 25 22 topology 59 4120 +> 15 0 24 22 topology 177 4121 +> 16 0 24 22 topology 145 4121 +> 15 0 25 22 topology 145 4122 +> 16 0 25 22 topology 143 4122 +> 15 0 24 22 topology 177 4123 +> 16 0 24 22 topology 121 4123 +> 15 0 25 22 topology 121 4124 +> 16 0 25 22 topology 119 4124 +> 15 0 24 22 topology 177 4125 +> 16 0 24 22 topology 97 4125 +> 15 0 25 22 topology 97 4126 +> 16 0 25 22 topology 95 4126 +> 15 0 24 22 topology 177 4127 +> 16 0 24 22 topology 73 4127 +> 15 0 25 22 topology 73 4128 +> 16 0 25 22 topology 71 4128 +> 15 0 24 22 topology 177 4129 +> 16 0 24 22 topology 157 4129 +> 15 0 25 22 topology 157 4130 +> 16 0 25 22 topology 155 4130 +> 15 0 24 22 topology 177 4131 +> 16 0 24 22 topology 133 4131 +> 15 0 25 22 topology 133 4132 +> 16 0 25 22 topology 131 4132 +> 15 0 24 22 topology 177 4133 +> 16 0 24 22 topology 109 4133 +> 15 0 25 22 topology 109 4134 +> 16 0 25 22 topology 107 4134 +> 15 0 24 22 topology 177 4135 +> 16 0 24 22 topology 169 4135 +> 15 0 25 22 topology 169 4136 +> 16 0 25 22 topology 167 4136 +> 15 0 24 22 topology 177 4137 +> 16 0 24 22 topology 28 4137 +> 15 0 25 22 topology 28 4138 +> 16 0 25 22 topology 26 4138 +> 15 0 24 22 topology 177 4139 +> 16 0 24 22 topology 40 4139 +> 15 0 25 22 topology 40 4140 +> 16 0 25 22 topology 38 4140 +> 15 0 24 22 topology 177 4141 +> 16 0 24 22 topology 52 4141 +> 15 0 25 22 topology 52 4142 +> 16 0 25 22 topology 50 4142 +> 15 0 24 22 topology 177 4143 +> 16 0 24 22 topology 112 4143 +> 15 0 25 22 topology 112 4144 +> 16 0 25 22 topology 110 4144 +> 15 0 24 22 topology 177 4145 +> 16 0 24 22 topology 88 4145 +> 15 0 25 22 topology 88 4146 +> 16 0 25 22 topology 86 4146 +> 15 0 24 22 topology 177 4147 +> 16 0 24 22 topology 64 4147 +> 15 0 25 22 topology 64 4148 +> 16 0 25 22 topology 62 4148 +> 15 0 24 22 topology 177 4149 +> 16 0 24 22 topology 172 4149 +> 15 0 25 22 topology 172 4150 +> 16 0 25 22 topology 170 4150 +> 15 0 24 22 topology 177 4151 +> 16 0 24 22 topology 148 4151 +> 15 0 25 22 topology 148 4152 +> 16 0 25 22 topology 146 4152 +> 15 0 24 22 topology 177 4153 +> 16 0 24 22 topology 124 4153 +> 15 0 25 22 topology 124 4154 +> 16 0 25 22 topology 122 4154 +> 15 0 24 22 topology 177 4155 +> 16 0 24 22 topology 100 4155 +> 15 0 25 22 topology 100 4156 +> 16 0 25 22 topology 98 4156 +> 15 0 24 22 topology 177 4157 +> 16 0 24 22 topology 76 4157 +> 15 0 25 22 topology 76 4158 +> 16 0 25 22 topology 74 4158 +> 15 0 24 22 topology 177 4159 +> 16 0 24 22 topology 160 4159 +> 15 0 25 22 topology 160 4160 +> 16 0 25 22 topology 158 4160 +> 15 0 24 22 topology 177 4161 +> 16 0 24 22 topology 136 4161 +> 15 0 25 22 topology 136 4162 +> 16 0 25 22 topology 134 4162 +> 15 0 24 22 topology 177 4163 +> 16 0 24 22 topology 31 4163 +> 15 0 25 22 topology 31 4164 +> 16 0 25 22 topology 29 4164 +> 15 0 24 22 topology 177 4165 +> 16 0 24 22 topology 43 4165 +> 15 0 25 22 topology 43 4166 +> 16 0 25 22 topology 41 4166 +> 15 0 24 22 topology 177 4167 +> 16 0 24 22 topology 55 4167 +> 15 0 25 22 topology 55 4168 +> 16 0 25 22 topology 53 4168 +> 15 0 24 22 topology 177 4169 +> 16 0 24 22 topology 115 4169 +> 15 0 25 22 topology 115 4170 +> 16 0 25 22 topology 113 4170 +> 15 0 24 22 topology 177 4171 +> 16 0 24 22 topology 91 4171 +> 15 0 25 22 topology 91 4172 +> 16 0 25 22 topology 89 4172 +> 15 0 24 22 topology 177 4173 +> 16 0 24 22 topology 67 4173 +> 15 0 25 22 topology 67 4174 +> 16 0 25 22 topology 65 4174 +> 15 0 24 22 topology 177 4175 +> 16 0 24 22 topology 175 4175 +> 15 0 25 22 topology 175 4176 +> 16 0 25 22 topology 173 4176 +> 15 0 24 22 topology 177 4177 +> 16 0 24 22 topology 151 4177 +> 15 0 25 22 topology 151 4178 +> 16 0 25 22 topology 149 4178 +> 15 0 24 22 topology 177 4179 +> 16 0 24 22 topology 127 4179 +> 15 0 25 22 topology 127 4180 +> 16 0 25 22 topology 125 4180 +> 15 0 24 22 topology 177 4181 +> 16 0 24 22 topology 103 4181 +> 15 0 25 22 topology 103 4182 +> 16 0 25 22 topology 101 4182 +> 15 0 24 22 topology 177 4183 +> 16 0 24 22 topology 79 4183 +> 15 0 25 22 topology 79 4184 +> 16 0 25 22 topology 77 4184 +> 15 0 24 22 topology 177 4185 +> 16 0 24 22 topology 163 4185 +> 15 0 25 22 topology 163 4186 +> 16 0 25 22 topology 161 4186 +> 15 0 24 22 topology 177 4187 +> 16 0 24 22 topology 139 4187 +> 15 0 25 22 topology 139 4188 +> 16 0 25 22 topology 137 4188 +> 15 0 24 22 topology 177 4189 +> 16 0 24 22 topology 34 4189 +> 15 0 25 22 topology 34 4190 +> 16 0 25 22 topology 32 4190 +> 15 0 24 22 topology 177 4191 +> 16 0 24 22 topology 46 4191 +> 15 0 25 22 topology 46 4192 +> 16 0 25 22 topology 44 4192 +> 15 0 24 22 topology 177 4193 +> 16 0 24 22 topology 82 4193 +> 15 0 25 22 topology 82 4194 +> 16 0 25 22 topology 80 4194 +> 15 0 24 22 topology 177 4195 +> 16 0 24 22 topology 58 4195 +> 15 0 25 22 topology 58 4196 +> 16 0 25 22 topology 56 4196 +> 15 0 24 22 topology 177 4197 +> 16 0 24 22 topology 142 4197 +> 15 0 25 22 topology 142 4198 +> 16 0 25 22 topology 140 4198 +> 15 0 24 22 topology 177 4199 +> 16 0 24 22 topology 118 4199 +> 15 0 25 22 topology 118 4200 +> 16 0 25 22 topology 116 4200 +> 15 0 24 22 topology 177 4201 +> 16 0 24 22 topology 94 4201 +> 15 0 25 22 topology 94 4202 +> 16 0 25 22 topology 92 4202 +> 15 0 24 22 topology 177 4203 +> 16 0 24 22 topology 70 4203 +> 15 0 25 22 topology 70 4204 +> 16 0 25 22 topology 68 4204 +> 15 0 24 22 topology 177 4205 +> 16 0 24 22 topology 154 4205 +> 15 0 25 22 topology 154 4206 +> 16 0 25 22 topology 152 4206 +> 15 0 26 22 topology 177 4207 +> 16 0 26 22 topology 176 4207 +> 15 0 24 22 topology 177 4208 +> 16 0 24 22 topology 130 4208 +> 15 0 25 22 topology 130 4209 +> 16 0 25 22 topology 128 4209 +> 15 0 24 22 topology 177 4210 +> 16 0 24 22 topology 106 4210 +> 15 0 25 22 topology 106 4211 +> 16 0 25 22 topology 104 4211 +> 15 0 24 22 topology 177 4212 +> 16 0 24 22 topology 166 4212 +> 15 0 25 22 topology 166 4213 +> 16 0 25 22 topology 164 4213 +> 15 0 24 22 topology 177 4214 +> 16 0 24 22 topology 25 4214 +> 15 0 25 22 topology 25 4215 +> 16 0 25 22 topology 23 4215 +> 15 0 23 22 topology 47 4216 +> 16 0 23 22 topology 48 4216 +> 15 0 24 22 topology 48 4217 +> 16 0 24 22 topology 177 4217 +> 15 0 24 22 topology 177 4218 +> 16 0 24 22 topology 37 4218 +> 15 0 25 22 topology 37 4219 +> 16 0 25 22 topology 35 4219 +> 15 0 23 22 topology 83 4220 +> 16 0 23 22 topology 84 4220 +> 15 0 24 22 topology 84 4221 +> 16 0 24 22 topology 177 4221 +> 15 0 23 22 topology 59 4222 +> 16 0 23 22 topology 60 4222 +> 15 0 24 22 topology 60 4223 +> 16 0 24 22 topology 177 4223 +> 15 0 23 22 topology 143 4224 +> 16 0 23 22 topology 144 4224 +> 15 0 24 22 topology 144 4225 +> 16 0 24 22 topology 177 4225 +> 15 0 23 22 topology 119 4226 +> 16 0 23 22 topology 120 4226 +> 15 0 24 22 topology 120 4227 +> 16 0 24 22 topology 177 4227 +> 15 0 23 22 topology 95 4228 +> 16 0 23 22 topology 96 4228 +> 15 0 24 22 topology 96 4229 +> 16 0 24 22 topology 177 4229 +> 15 0 23 22 topology 71 4230 +> 16 0 23 22 topology 72 4230 +> 15 0 24 22 topology 72 4231 +> 16 0 24 22 topology 177 4231 +> 15 0 23 22 topology 155 4232 +> 16 0 23 22 topology 156 4232 +> 15 0 24 22 topology 156 4233 +> 16 0 24 22 topology 177 4233 +> 15 0 23 22 topology 131 4234 +> 16 0 23 22 topology 132 4234 +> 15 0 24 22 topology 132 4235 +> 16 0 24 22 topology 177 4235 +> 15 0 23 22 topology 107 4236 +> 16 0 23 22 topology 108 4236 +> 15 0 24 22 topology 108 4237 +> 16 0 24 22 topology 177 4237 +> 15 0 23 22 topology 167 4238 +> 16 0 23 22 topology 168 4238 +> 15 0 24 22 topology 168 4239 +> 16 0 24 22 topology 177 4239 +> 15 0 23 22 topology 26 4240 +> 16 0 23 22 topology 27 4240 +> 15 0 24 22 topology 27 4241 +> 16 0 24 22 topology 177 4241 +> 15 0 23 22 topology 38 4242 +> 16 0 23 22 topology 39 4242 +> 15 0 24 22 topology 39 4243 +> 16 0 24 22 topology 177 4243 +> 15 0 23 22 topology 50 4244 +> 16 0 23 22 topology 51 4244 +> 15 0 24 22 topology 51 4245 +> 16 0 24 22 topology 177 4245 +> 15 0 23 22 topology 110 4246 +> 16 0 23 22 topology 111 4246 +> 15 0 24 22 topology 111 4247 +> 16 0 24 22 topology 177 4247 +> 15 0 23 22 topology 86 4248 +> 16 0 23 22 topology 87 4248 +> 15 0 24 22 topology 87 4249 +> 16 0 24 22 topology 177 4249 +> 15 0 23 22 topology 62 4250 +> 16 0 23 22 topology 63 4250 +> 15 0 24 22 topology 63 4251 +> 16 0 24 22 topology 177 4251 +> 15 0 23 22 topology 170 4252 +> 16 0 23 22 topology 171 4252 +> 15 0 24 22 topology 171 4253 +> 16 0 24 22 topology 177 4253 +> 15 0 23 22 topology 146 4254 +> 16 0 23 22 topology 147 4254 +> 15 0 24 22 topology 147 4255 +> 16 0 24 22 topology 177 4255 +> 15 0 23 22 topology 122 4256 +> 16 0 23 22 topology 123 4256 +> 15 0 24 22 topology 123 4257 +> 16 0 24 22 topology 177 4257 +> 15 0 23 22 topology 98 4258 +> 16 0 23 22 topology 99 4258 +> 15 0 24 22 topology 99 4259 +> 16 0 24 22 topology 177 4259 +> 15 0 23 22 topology 74 4260 +> 16 0 23 22 topology 75 4260 +> 15 0 24 22 topology 75 4261 +> 16 0 24 22 topology 177 4261 +> 15 0 23 22 topology 158 4262 +> 16 0 23 22 topology 159 4262 +> 15 0 24 22 topology 159 4263 +> 16 0 24 22 topology 177 4263 +> 15 0 23 22 topology 134 4264 +> 16 0 23 22 topology 135 4264 +> 15 0 24 22 topology 135 4265 +> 16 0 24 22 topology 177 4265 +> 15 0 23 22 topology 29 4266 +> 16 0 23 22 topology 30 4266 +> 15 0 24 22 topology 30 4267 +> 16 0 24 22 topology 177 4267 +> 15 0 23 22 topology 41 4268 +> 16 0 23 22 topology 42 4268 +> 15 0 24 22 topology 42 4269 +> 16 0 24 22 topology 177 4269 +> 15 0 23 22 topology 53 4270 +> 16 0 23 22 topology 54 4270 +> 15 0 24 22 topology 54 4271 +> 16 0 24 22 topology 177 4271 +> 15 0 23 22 topology 113 4272 +> 16 0 23 22 topology 114 4272 +> 15 0 24 22 topology 114 4273 +> 16 0 24 22 topology 177 4273 +> 15 0 23 22 topology 89 4274 +> 16 0 23 22 topology 90 4274 +> 15 0 24 22 topology 90 4275 +> 16 0 24 22 topology 177 4275 +> 15 0 23 22 topology 65 4276 +> 16 0 23 22 topology 66 4276 +> 15 0 24 22 topology 66 4277 +> 16 0 24 22 topology 177 4277 +> 15 0 23 22 topology 173 4278 +> 16 0 23 22 topology 174 4278 +> 15 0 24 22 topology 174 4279 +> 16 0 24 22 topology 177 4279 +> 15 0 23 22 topology 149 4280 +> 16 0 23 22 topology 150 4280 +> 15 0 24 22 topology 150 4281 +> 16 0 24 22 topology 177 4281 +> 15 0 23 22 topology 125 4282 +> 16 0 23 22 topology 126 4282 +> 15 0 24 22 topology 126 4283 +> 16 0 24 22 topology 177 4283 +> 15 0 23 22 topology 101 4284 +> 16 0 23 22 topology 102 4284 +> 15 0 24 22 topology 102 4285 +> 16 0 24 22 topology 177 4285 +> 15 0 23 22 topology 77 4286 +> 16 0 23 22 topology 78 4286 +> 15 0 24 22 topology 78 4287 +> 16 0 24 22 topology 177 4287 +> 15 0 23 22 topology 161 4288 +> 16 0 23 22 topology 162 4288 +> 15 0 24 22 topology 162 4289 +> 16 0 24 22 topology 177 4289 +> 15 0 23 22 topology 137 4290 +> 16 0 23 22 topology 138 4290 +> 15 0 24 22 topology 138 4291 +> 16 0 24 22 topology 177 4291 +> 15 0 23 22 topology 32 4292 +> 16 0 23 22 topology 33 4292 +> 15 0 24 22 topology 33 4293 +> 16 0 24 22 topology 177 4293 +> 15 0 23 22 topology 44 4294 +> 16 0 23 22 topology 45 4294 +> 15 0 24 22 topology 45 4295 +> 16 0 24 22 topology 177 4295 +> 15 0 23 22 topology 80 4296 +> 16 0 23 22 topology 81 4296 +> 15 0 24 22 topology 81 4297 +> 16 0 24 22 topology 177 4297 +> 15 0 23 22 topology 56 4298 +> 16 0 23 22 topology 57 4298 +> 15 0 24 22 topology 57 4299 +> 16 0 24 22 topology 177 4299 +> 15 0 23 22 topology 140 4300 +> 16 0 23 22 topology 141 4300 +> 15 0 24 22 topology 141 4301 +> 16 0 24 22 topology 177 4301 +> 15 0 23 22 topology 116 4302 +> 16 0 23 22 topology 117 4302 +> 15 0 24 22 topology 117 4303 +> 16 0 24 22 topology 177 4303 +> 15 0 23 22 topology 92 4304 +> 16 0 23 22 topology 93 4304 +> 15 0 24 22 topology 93 4305 +> 16 0 24 22 topology 177 4305 +> 15 0 23 22 topology 68 4306 +> 16 0 23 22 topology 69 4306 +> 15 0 24 22 topology 69 4307 +> 16 0 24 22 topology 177 4307 +> 15 0 23 22 topology 152 4308 +> 16 0 23 22 topology 153 4308 +> 15 0 24 22 topology 153 4309 +> 16 0 24 22 topology 177 4309 +> 15 0 23 22 topology 128 4310 +> 16 0 23 22 topology 129 4310 +> 15 0 24 22 topology 129 4311 +> 16 0 24 22 topology 177 4311 +> 15 0 23 22 topology 104 4312 +> 16 0 23 22 topology 105 4312 +> 15 0 24 22 topology 105 4313 +> 16 0 24 22 topology 177 4313 +> 15 0 23 22 topology 164 4314 +> 16 0 23 22 topology 165 4314 +> 15 0 24 22 topology 165 4315 +> 16 0 24 22 topology 177 4315 +> 15 0 23 22 topology 23 4316 +> 16 0 23 22 topology 24 4316 +> 15 0 24 22 topology 24 4317 +> 16 0 24 22 topology 177 4317 +> 15 0 23 179 topology 441 4318 +> 16 0 23 179 topology 442 4318 +> 15 0 24 179 topology 442 4319 +> 16 0 24 179 topology 460 4319 +> 15 0 24 179 topology 460 4320 +> 16 0 24 179 topology 182 4320 +> 15 0 25 179 topology 182 4321 +> 16 0 25 179 topology 180 4321 +> 15 0 24 179 topology 460 4322 +> 16 0 24 179 topology 206 4322 +> 15 0 25 179 topology 206 4323 +> 16 0 25 179 topology 204 4323 +> 15 0 24 179 topology 460 4324 +> 16 0 24 179 topology 242 4324 +> 15 0 25 179 topology 242 4325 +> 16 0 25 179 topology 240 4325 +> 15 0 24 179 topology 460 4326 +> 16 0 24 179 topology 278 4326 +> 15 0 25 179 topology 278 4327 +> 16 0 25 179 topology 276 4327 +> 15 0 24 179 topology 460 4328 +> 16 0 24 179 topology 362 4328 +> 15 0 25 179 topology 362 4329 +> 16 0 25 179 topology 360 4329 +> 15 0 24 179 topology 460 4330 +> 16 0 24 179 topology 230 4330 +> 15 0 25 179 topology 230 4331 +> 16 0 25 179 topology 228 4331 +> 15 0 24 179 topology 460 4332 +> 16 0 24 179 topology 314 4332 +> 15 0 25 179 topology 314 4333 +> 16 0 25 179 topology 312 4333 +> 15 0 24 179 topology 460 4334 +> 16 0 24 179 topology 398 4334 +> 15 0 25 179 topology 398 4335 +> 16 0 25 179 topology 396 4335 +> 15 0 24 179 topology 460 4336 +> 16 0 24 179 topology 266 4336 +> 15 0 25 179 topology 266 4337 +> 16 0 25 179 topology 264 4337 +> 15 0 24 179 topology 460 4338 +> 16 0 24 179 topology 350 4338 +> 15 0 25 179 topology 350 4339 +> 16 0 25 179 topology 348 4339 +> 15 0 24 179 topology 460 4340 +> 16 0 24 179 topology 434 4340 +> 15 0 25 179 topology 434 4341 +> 16 0 25 179 topology 432 4341 +> 15 0 24 179 topology 460 4342 +> 16 0 24 179 topology 386 4342 +> 15 0 25 179 topology 386 4343 +> 16 0 25 179 topology 384 4343 +> 15 0 24 179 topology 460 4344 +> 16 0 24 179 topology 197 4344 +> 15 0 25 179 topology 197 4345 +> 16 0 25 179 topology 195 4345 +> 15 0 24 179 topology 460 4346 +> 16 0 24 179 topology 269 4346 +> 15 0 25 179 topology 269 4347 +> 16 0 25 179 topology 267 4347 +> 15 0 24 179 topology 460 4348 +> 16 0 24 179 topology 221 4348 +> 15 0 25 179 topology 221 4349 +> 16 0 25 179 topology 219 4349 +> 15 0 24 179 topology 460 4350 +> 16 0 24 179 topology 305 4350 +> 15 0 25 179 topology 305 4351 +> 16 0 25 179 topology 303 4351 +> 15 0 24 179 topology 460 4352 +> 16 0 24 179 topology 389 4352 +> 15 0 25 179 topology 389 4353 +> 16 0 25 179 topology 387 4353 +> 15 0 24 179 topology 460 4354 +> 16 0 24 179 topology 257 4354 +> 15 0 25 179 topology 257 4355 +> 16 0 25 179 topology 255 4355 +> 15 0 24 179 topology 460 4356 +> 16 0 24 179 topology 341 4356 +> 15 0 25 179 topology 341 4357 +> 16 0 25 179 topology 339 4357 +> 15 0 24 179 topology 460 4358 +> 16 0 24 179 topology 425 4358 +> 15 0 25 179 topology 425 4359 +> 16 0 25 179 topology 423 4359 +> 15 0 24 179 topology 460 4360 +> 16 0 24 179 topology 293 4360 +> 15 0 25 179 topology 293 4361 +> 16 0 25 179 topology 291 4361 +> 15 0 24 179 topology 460 4362 +> 16 0 24 179 topology 377 4362 +> 15 0 25 179 topology 377 4363 +> 16 0 25 179 topology 375 4363 +> 15 0 24 179 topology 460 4364 +> 16 0 24 179 topology 413 4364 +> 15 0 25 179 topology 413 4365 +> 16 0 25 179 topology 411 4365 +> 15 0 24 179 topology 460 4366 +> 16 0 24 179 topology 188 4366 +> 15 0 25 179 topology 188 4367 +> 16 0 25 179 topology 186 4367 +> 15 0 24 179 topology 460 4368 +> 16 0 24 179 topology 212 4368 +> 15 0 25 179 topology 212 4369 +> 16 0 25 179 topology 210 4369 +> 15 0 24 179 topology 460 4370 +> 16 0 24 179 topology 248 4370 +> 15 0 25 179 topology 248 4371 +> 16 0 25 179 topology 246 4371 +> 15 0 24 179 topology 460 4372 +> 16 0 24 179 topology 332 4372 +> 15 0 25 179 topology 332 4373 +> 16 0 25 179 topology 330 4373 +> 15 0 24 179 topology 460 4374 +> 16 0 24 179 topology 284 4374 +> 15 0 25 179 topology 284 4375 +> 16 0 25 179 topology 282 4375 +> 15 0 24 179 topology 460 4376 +> 16 0 24 179 topology 368 4376 +> 15 0 25 179 topology 368 4377 +> 16 0 25 179 topology 366 4377 +> 15 0 24 179 topology 460 4378 +> 16 0 24 179 topology 236 4378 +> 15 0 25 179 topology 236 4379 +> 16 0 25 179 topology 234 4379 +> 15 0 24 179 topology 460 4380 +> 16 0 24 179 topology 452 4380 +> 15 0 25 179 topology 452 4381 +> 16 0 25 179 topology 450 4381 +> 15 0 24 179 topology 460 4382 +> 16 0 24 179 topology 320 4382 +> 15 0 25 179 topology 320 4383 +> 16 0 25 179 topology 318 4383 +> 15 0 24 179 topology 460 4384 +> 16 0 24 179 topology 404 4384 +> 15 0 25 179 topology 404 4385 +> 16 0 25 179 topology 402 4385 +> 15 0 24 179 topology 460 4386 +> 16 0 24 179 topology 356 4386 +> 15 0 25 179 topology 356 4387 +> 16 0 25 179 topology 354 4387 +> 15 0 24 179 topology 460 4388 +> 16 0 24 179 topology 440 4388 +> 15 0 25 179 topology 440 4389 +> 16 0 25 179 topology 438 4389 +> 15 0 24 179 topology 460 4390 +> 16 0 24 179 topology 203 4390 +> 15 0 25 179 topology 203 4391 +> 16 0 25 179 topology 201 4391 +> 15 0 24 179 topology 460 4392 +> 16 0 24 179 topology 239 4392 +> 15 0 25 179 topology 239 4393 +> 16 0 25 179 topology 237 4393 +> 15 0 24 179 topology 460 4394 +> 16 0 24 179 topology 275 4394 +> 15 0 25 179 topology 275 4395 +> 16 0 25 179 topology 273 4395 +> 15 0 24 179 topology 460 4396 +> 16 0 24 179 topology 359 4396 +> 15 0 25 179 topology 359 4397 +> 16 0 25 179 topology 357 4397 +> 15 0 24 179 topology 460 4398 +> 16 0 24 179 topology 227 4398 +> 15 0 25 179 topology 227 4399 +> 16 0 25 179 topology 225 4399 +> 15 0 24 179 topology 460 4400 +> 16 0 24 179 topology 311 4400 +> 15 0 25 179 topology 311 4401 +> 16 0 25 179 topology 309 4401 +> 15 0 24 179 topology 460 4402 +> 16 0 24 179 topology 395 4402 +> 15 0 25 179 topology 395 4403 +> 16 0 25 179 topology 393 4403 +> 15 0 24 179 topology 460 4404 +> 16 0 24 179 topology 263 4404 +> 15 0 25 179 topology 263 4405 +> 16 0 25 179 topology 261 4405 +> 15 0 24 179 topology 460 4406 +> 16 0 24 179 topology 347 4406 +> 15 0 25 179 topology 347 4407 +> 16 0 25 179 topology 345 4407 +> 15 0 24 179 topology 460 4408 +> 16 0 24 179 topology 431 4408 +> 15 0 25 179 topology 431 4409 +> 16 0 25 179 topology 429 4409 +> 15 0 24 179 topology 460 4410 +> 16 0 24 179 topology 383 4410 +> 15 0 25 179 topology 383 4411 +> 16 0 25 179 topology 381 4411 +> 15 0 24 179 topology 460 4412 +> 16 0 24 179 topology 194 4412 +> 15 0 25 179 topology 194 4413 +> 16 0 25 179 topology 192 4413 +> 15 0 24 179 topology 460 4414 +> 16 0 24 179 topology 218 4414 +> 15 0 25 179 topology 218 4415 +> 16 0 25 179 topology 216 4415 +> 15 0 24 179 topology 460 4416 +> 16 0 24 179 topology 302 4416 +> 15 0 25 179 topology 302 4417 +> 16 0 25 179 topology 300 4417 +> 15 0 24 179 topology 460 4418 +> 16 0 24 179 topology 254 4418 +> 15 0 25 179 topology 254 4419 +> 16 0 25 179 topology 252 4419 +> 15 0 24 179 topology 460 4420 +> 16 0 24 179 topology 338 4420 +> 15 0 25 179 topology 338 4421 +> 16 0 25 179 topology 336 4421 +> 15 0 24 179 topology 460 4422 +> 16 0 24 179 topology 422 4422 +> 15 0 25 179 topology 422 4423 +> 16 0 25 179 topology 420 4423 +> 15 0 24 179 topology 460 4424 +> 16 0 24 179 topology 290 4424 +> 15 0 25 179 topology 290 4425 +> 16 0 25 179 topology 288 4425 +> 15 0 24 179 topology 460 4426 +> 16 0 24 179 topology 374 4426 +> 15 0 25 179 topology 374 4427 +> 16 0 25 179 topology 372 4427 +> 15 0 24 179 topology 460 4428 +> 16 0 24 179 topology 458 4428 +> 15 0 25 179 topology 458 4429 +> 16 0 25 179 topology 456 4429 +> 15 0 24 179 topology 460 4430 +> 16 0 24 179 topology 326 4430 +> 15 0 25 179 topology 326 4431 +> 16 0 25 179 topology 324 4431 +> 15 0 24 179 topology 460 4432 +> 16 0 24 179 topology 410 4432 +> 15 0 25 179 topology 410 4433 +> 16 0 25 179 topology 408 4433 +> 15 0 24 179 topology 460 4434 +> 16 0 24 179 topology 446 4434 +> 15 0 25 179 topology 446 4435 +> 16 0 25 179 topology 444 4435 +> 15 0 24 179 topology 460 4436 +> 16 0 24 179 topology 185 4436 +> 15 0 25 179 topology 185 4437 +> 16 0 25 179 topology 183 4437 +> 15 0 24 179 topology 460 4438 +> 16 0 24 179 topology 209 4438 +> 15 0 25 179 topology 209 4439 +> 16 0 25 179 topology 207 4439 +> 15 0 24 179 topology 460 4440 +> 16 0 24 179 topology 245 4440 +> 15 0 25 179 topology 245 4441 +> 16 0 25 179 topology 243 4441 +> 15 0 24 179 topology 460 4442 +> 16 0 24 179 topology 329 4442 +> 15 0 25 179 topology 329 4443 +> 16 0 25 179 topology 327 4443 +> 15 0 24 179 topology 460 4444 +> 16 0 24 179 topology 281 4444 +> 15 0 25 179 topology 281 4445 +> 16 0 25 179 topology 279 4445 +> 15 0 24 179 topology 460 4446 +> 16 0 24 179 topology 365 4446 +> 15 0 25 179 topology 365 4447 +> 16 0 25 179 topology 363 4447 +> 15 0 24 179 topology 460 4448 +> 16 0 24 179 topology 233 4448 +> 15 0 25 179 topology 233 4449 +> 16 0 25 179 topology 231 4449 +> 15 0 24 179 topology 460 4450 +> 16 0 24 179 topology 449 4450 +> 15 0 25 179 topology 449 4451 +> 16 0 25 179 topology 447 4451 +> 15 0 24 179 topology 460 4452 +> 16 0 24 179 topology 317 4452 +> 15 0 25 179 topology 317 4453 +> 16 0 25 179 topology 315 4453 +> 15 0 24 179 topology 460 4454 +> 16 0 24 179 topology 401 4454 +> 15 0 25 179 topology 401 4455 +> 16 0 25 179 topology 399 4455 +> 15 0 24 179 topology 460 4456 +> 16 0 24 179 topology 353 4456 +> 15 0 25 179 topology 353 4457 +> 16 0 25 179 topology 351 4457 +> 15 0 24 179 topology 460 4458 +> 16 0 24 179 topology 437 4458 +> 15 0 25 179 topology 437 4459 +> 16 0 25 179 topology 435 4459 +> 15 0 24 179 topology 460 4460 +> 16 0 24 179 topology 200 4460 +> 15 0 25 179 topology 200 4461 +> 16 0 25 179 topology 198 4461 +> 15 0 24 179 topology 460 4462 +> 16 0 24 179 topology 272 4462 +> 15 0 25 179 topology 272 4463 +> 16 0 25 179 topology 270 4463 +> 15 0 24 179 topology 460 4464 +> 16 0 24 179 topology 224 4464 +> 15 0 25 179 topology 224 4465 +> 16 0 25 179 topology 222 4465 +> 15 0 24 179 topology 460 4466 +> 16 0 24 179 topology 308 4466 +> 15 0 25 179 topology 308 4467 +> 16 0 25 179 topology 306 4467 +> 15 0 24 179 topology 460 4468 +> 16 0 24 179 topology 392 4468 +> 15 0 25 179 topology 392 4469 +> 16 0 25 179 topology 390 4469 +> 15 0 24 179 topology 460 4470 +> 16 0 24 179 topology 260 4470 +> 15 0 25 179 topology 260 4471 +> 16 0 25 179 topology 258 4471 +> 15 0 24 179 topology 460 4472 +> 16 0 24 179 topology 344 4472 +> 15 0 25 179 topology 344 4473 +> 16 0 25 179 topology 342 4473 +> 15 0 24 179 topology 460 4474 +> 16 0 24 179 topology 428 4474 +> 15 0 25 179 topology 428 4475 +> 16 0 25 179 topology 426 4475 +> 15 0 24 179 topology 460 4476 +> 16 0 24 179 topology 296 4476 +> 15 0 25 179 topology 296 4477 +> 16 0 25 179 topology 294 4477 +> 15 0 26 179 topology 460 4478 +> 16 0 26 179 topology 459 4478 +> 15 0 24 179 topology 460 4479 +> 16 0 24 179 topology 380 4479 +> 15 0 25 179 topology 380 4480 +> 16 0 25 179 topology 378 4480 +> 15 0 24 179 topology 460 4481 +> 16 0 24 179 topology 416 4481 +> 15 0 25 179 topology 416 4482 +> 16 0 25 179 topology 414 4482 +> 15 0 24 179 topology 460 4483 +> 16 0 24 179 topology 191 4483 +> 15 0 25 179 topology 191 4484 +> 16 0 25 179 topology 189 4484 +> 15 0 24 179 topology 460 4485 +> 16 0 24 179 topology 215 4485 +> 15 0 25 179 topology 215 4486 +> 16 0 25 179 topology 213 4486 +> 15 0 24 179 topology 460 4487 +> 16 0 24 179 topology 299 4487 +> 15 0 25 179 topology 299 4488 +> 16 0 25 179 topology 297 4488 +> 15 0 24 179 topology 460 4489 +> 16 0 24 179 topology 251 4489 +> 15 0 25 179 topology 251 4490 +> 16 0 25 179 topology 249 4490 +> 15 0 24 179 topology 460 4491 +> 16 0 24 179 topology 335 4491 +> 15 0 25 179 topology 335 4492 +> 16 0 25 179 topology 333 4492 +> 15 0 24 179 topology 460 4493 +> 16 0 24 179 topology 419 4493 +> 15 0 25 179 topology 419 4494 +> 16 0 25 179 topology 417 4494 +> 15 0 24 179 topology 460 4495 +> 16 0 24 179 topology 287 4495 +> 15 0 25 179 topology 287 4496 +> 16 0 25 179 topology 285 4496 +> 15 0 24 179 topology 460 4497 +> 16 0 24 179 topology 371 4497 +> 15 0 25 179 topology 371 4498 +> 16 0 25 179 topology 369 4498 +> 15 0 24 179 topology 460 4499 +> 16 0 24 179 topology 455 4499 +> 15 0 25 179 topology 455 4500 +> 16 0 25 179 topology 453 4500 +> 15 0 24 179 topology 460 4501 +> 16 0 24 179 topology 323 4501 +> 15 0 25 179 topology 323 4502 +> 16 0 25 179 topology 321 4502 +> 15 0 24 179 topology 460 4503 +> 16 0 24 179 topology 407 4503 +> 15 0 25 179 topology 407 4504 +> 16 0 25 179 topology 405 4504 +> 15 0 23 179 topology 180 4505 +> 16 0 23 179 topology 181 4505 +> 15 0 24 179 topology 181 4506 +> 16 0 24 179 topology 460 4506 +> 15 0 24 179 topology 460 4507 +> 16 0 24 179 topology 443 4507 +> 15 0 25 179 topology 443 4508 +> 16 0 25 179 topology 441 4508 +> 15 0 23 179 topology 204 4509 +> 16 0 23 179 topology 205 4509 +> 15 0 24 179 topology 205 4510 +> 16 0 24 179 topology 460 4510 +> 15 0 23 179 topology 240 4511 +> 16 0 23 179 topology 241 4511 +> 15 0 24 179 topology 241 4512 +> 16 0 24 179 topology 460 4512 +> 15 0 23 179 topology 276 4513 +> 16 0 23 179 topology 277 4513 +> 15 0 24 179 topology 277 4514 +> 16 0 24 179 topology 460 4514 +> 15 0 23 179 topology 360 4515 +> 16 0 23 179 topology 361 4515 +> 15 0 24 179 topology 361 4516 +> 16 0 24 179 topology 460 4516 +> 15 0 23 179 topology 228 4517 +> 16 0 23 179 topology 229 4517 +> 15 0 24 179 topology 229 4518 +> 16 0 24 179 topology 460 4518 +> 15 0 23 179 topology 312 4519 +> 16 0 23 179 topology 313 4519 +> 15 0 24 179 topology 313 4520 +> 16 0 24 179 topology 460 4520 +> 15 0 23 179 topology 396 4521 +> 16 0 23 179 topology 397 4521 +> 15 0 24 179 topology 397 4522 +> 16 0 24 179 topology 460 4522 +> 15 0 23 179 topology 264 4523 +> 16 0 23 179 topology 265 4523 +> 15 0 24 179 topology 265 4524 +> 16 0 24 179 topology 460 4524 +> 15 0 23 179 topology 348 4525 +> 16 0 23 179 topology 349 4525 +> 15 0 24 179 topology 349 4526 +> 16 0 24 179 topology 460 4526 +> 15 0 23 179 topology 432 4527 +> 16 0 23 179 topology 433 4527 +> 15 0 24 179 topology 433 4528 +> 16 0 24 179 topology 460 4528 +> 15 0 23 179 topology 384 4529 +> 16 0 23 179 topology 385 4529 +> 15 0 24 179 topology 385 4530 +> 16 0 24 179 topology 460 4530 +> 15 0 23 179 topology 195 4531 +> 16 0 23 179 topology 196 4531 +> 15 0 24 179 topology 196 4532 +> 16 0 24 179 topology 460 4532 +> 15 0 23 179 topology 267 4533 +> 16 0 23 179 topology 268 4533 +> 15 0 24 179 topology 268 4534 +> 16 0 24 179 topology 460 4534 +> 15 0 23 179 topology 219 4535 +> 16 0 23 179 topology 220 4535 +> 15 0 24 179 topology 220 4536 +> 16 0 24 179 topology 460 4536 +> 15 0 23 179 topology 303 4537 +> 16 0 23 179 topology 304 4537 +> 15 0 24 179 topology 304 4538 +> 16 0 24 179 topology 460 4538 +> 15 0 23 179 topology 387 4539 +> 16 0 23 179 topology 388 4539 +> 15 0 24 179 topology 388 4540 +> 16 0 24 179 topology 460 4540 +> 15 0 23 179 topology 255 4541 +> 16 0 23 179 topology 256 4541 +> 15 0 24 179 topology 256 4542 +> 16 0 24 179 topology 460 4542 +> 15 0 23 179 topology 339 4543 +> 16 0 23 179 topology 340 4543 +> 15 0 24 179 topology 340 4544 +> 16 0 24 179 topology 460 4544 +> 15 0 23 179 topology 423 4545 +> 16 0 23 179 topology 424 4545 +> 15 0 24 179 topology 424 4546 +> 16 0 24 179 topology 460 4546 +> 15 0 23 179 topology 291 4547 +> 16 0 23 179 topology 292 4547 +> 15 0 24 179 topology 292 4548 +> 16 0 24 179 topology 460 4548 +> 15 0 23 179 topology 375 4549 +> 16 0 23 179 topology 376 4549 +> 15 0 24 179 topology 376 4550 +> 16 0 24 179 topology 460 4550 +> 15 0 23 179 topology 411 4551 +> 16 0 23 179 topology 412 4551 +> 15 0 24 179 topology 412 4552 +> 16 0 24 179 topology 460 4552 +> 15 0 23 179 topology 186 4553 +> 16 0 23 179 topology 187 4553 +> 15 0 24 179 topology 187 4554 +> 16 0 24 179 topology 460 4554 +> 15 0 23 179 topology 210 4555 +> 16 0 23 179 topology 211 4555 +> 15 0 24 179 topology 211 4556 +> 16 0 24 179 topology 460 4556 +> 15 0 23 179 topology 246 4557 +> 16 0 23 179 topology 247 4557 +> 15 0 24 179 topology 247 4558 +> 16 0 24 179 topology 460 4558 +> 15 0 23 179 topology 330 4559 +> 16 0 23 179 topology 331 4559 +> 15 0 24 179 topology 331 4560 +> 16 0 24 179 topology 460 4560 +> 15 0 23 179 topology 282 4561 +> 16 0 23 179 topology 283 4561 +> 15 0 24 179 topology 283 4562 +> 16 0 24 179 topology 460 4562 +> 15 0 23 179 topology 366 4563 +> 16 0 23 179 topology 367 4563 +> 15 0 24 179 topology 367 4564 +> 16 0 24 179 topology 460 4564 +> 15 0 23 179 topology 234 4565 +> 16 0 23 179 topology 235 4565 +> 15 0 24 179 topology 235 4566 +> 16 0 24 179 topology 460 4566 +> 15 0 23 179 topology 450 4567 +> 16 0 23 179 topology 451 4567 +> 15 0 24 179 topology 451 4568 +> 16 0 24 179 topology 460 4568 +> 15 0 23 179 topology 318 4569 +> 16 0 23 179 topology 319 4569 +> 15 0 24 179 topology 319 4570 +> 16 0 24 179 topology 460 4570 +> 15 0 23 179 topology 402 4571 +> 16 0 23 179 topology 403 4571 +> 15 0 24 179 topology 403 4572 +> 16 0 24 179 topology 460 4572 +> 15 0 23 179 topology 354 4573 +> 16 0 23 179 topology 355 4573 +> 15 0 24 179 topology 355 4574 +> 16 0 24 179 topology 460 4574 +> 15 0 23 179 topology 438 4575 +> 16 0 23 179 topology 439 4575 +> 15 0 24 179 topology 439 4576 +> 16 0 24 179 topology 460 4576 +> 15 0 23 179 topology 201 4577 +> 16 0 23 179 topology 202 4577 +> 15 0 24 179 topology 202 4578 +> 16 0 24 179 topology 460 4578 +> 15 0 23 179 topology 237 4579 +> 16 0 23 179 topology 238 4579 +> 15 0 24 179 topology 238 4580 +> 16 0 24 179 topology 460 4580 +> 15 0 23 179 topology 273 4581 +> 16 0 23 179 topology 274 4581 +> 15 0 24 179 topology 274 4582 +> 16 0 24 179 topology 460 4582 +> 15 0 23 179 topology 357 4583 +> 16 0 23 179 topology 358 4583 +> 15 0 24 179 topology 358 4584 +> 16 0 24 179 topology 460 4584 +> 15 0 23 179 topology 225 4585 +> 16 0 23 179 topology 226 4585 +> 15 0 24 179 topology 226 4586 +> 16 0 24 179 topology 460 4586 +> 15 0 23 179 topology 309 4587 +> 16 0 23 179 topology 310 4587 +> 15 0 24 179 topology 310 4588 +> 16 0 24 179 topology 460 4588 +> 15 0 23 179 topology 393 4589 +> 16 0 23 179 topology 394 4589 +> 15 0 24 179 topology 394 4590 +> 16 0 24 179 topology 460 4590 +> 15 0 23 179 topology 261 4591 +> 16 0 23 179 topology 262 4591 +> 15 0 24 179 topology 262 4592 +> 16 0 24 179 topology 460 4592 +> 15 0 23 179 topology 345 4593 +> 16 0 23 179 topology 346 4593 +> 15 0 24 179 topology 346 4594 +> 16 0 24 179 topology 460 4594 +> 15 0 23 179 topology 429 4595 +> 16 0 23 179 topology 430 4595 +> 15 0 24 179 topology 430 4596 +> 16 0 24 179 topology 460 4596 +> 15 0 23 179 topology 381 4597 +> 16 0 23 179 topology 382 4597 +> 15 0 24 179 topology 382 4598 +> 16 0 24 179 topology 460 4598 +> 15 0 23 179 topology 192 4599 +> 16 0 23 179 topology 193 4599 +> 15 0 24 179 topology 193 4600 +> 16 0 24 179 topology 460 4600 +> 15 0 23 179 topology 216 4601 +> 16 0 23 179 topology 217 4601 +> 15 0 24 179 topology 217 4602 +> 16 0 24 179 topology 460 4602 +> 15 0 23 179 topology 300 4603 +> 16 0 23 179 topology 301 4603 +> 15 0 24 179 topology 301 4604 +> 16 0 24 179 topology 460 4604 +> 15 0 23 179 topology 252 4605 +> 16 0 23 179 topology 253 4605 +> 15 0 24 179 topology 253 4606 +> 16 0 24 179 topology 460 4606 +> 15 0 23 179 topology 336 4607 +> 16 0 23 179 topology 337 4607 +> 15 0 24 179 topology 337 4608 +> 16 0 24 179 topology 460 4608 +> 15 0 23 179 topology 420 4609 +> 16 0 23 179 topology 421 4609 +> 15 0 24 179 topology 421 4610 +> 16 0 24 179 topology 460 4610 +> 15 0 23 179 topology 288 4611 +> 16 0 23 179 topology 289 4611 +> 15 0 24 179 topology 289 4612 +> 16 0 24 179 topology 460 4612 +> 15 0 23 179 topology 372 4613 +> 16 0 23 179 topology 373 4613 +> 15 0 24 179 topology 373 4614 +> 16 0 24 179 topology 460 4614 +> 15 0 23 179 topology 456 4615 +> 16 0 23 179 topology 457 4615 +> 15 0 24 179 topology 457 4616 +> 16 0 24 179 topology 460 4616 +> 15 0 23 179 topology 324 4617 +> 16 0 23 179 topology 325 4617 +> 15 0 24 179 topology 325 4618 +> 16 0 24 179 topology 460 4618 +> 15 0 23 179 topology 408 4619 +> 16 0 23 179 topology 409 4619 +> 15 0 24 179 topology 409 4620 +> 16 0 24 179 topology 460 4620 +> 15 0 23 179 topology 444 4621 +> 16 0 23 179 topology 445 4621 +> 15 0 24 179 topology 445 4622 +> 16 0 24 179 topology 460 4622 +> 15 0 23 179 topology 183 4623 +> 16 0 23 179 topology 184 4623 +> 15 0 24 179 topology 184 4624 +> 16 0 24 179 topology 460 4624 +> 15 0 23 179 topology 207 4625 +> 16 0 23 179 topology 208 4625 +> 15 0 24 179 topology 208 4626 +> 16 0 24 179 topology 460 4626 +> 15 0 23 179 topology 243 4627 +> 16 0 23 179 topology 244 4627 +> 15 0 24 179 topology 244 4628 +> 16 0 24 179 topology 460 4628 +> 15 0 23 179 topology 327 4629 +> 16 0 23 179 topology 328 4629 +> 15 0 24 179 topology 328 4630 +> 16 0 24 179 topology 460 4630 +> 15 0 23 179 topology 279 4631 +> 16 0 23 179 topology 280 4631 +> 15 0 24 179 topology 280 4632 +> 16 0 24 179 topology 460 4632 +> 15 0 23 179 topology 363 4633 +> 16 0 23 179 topology 364 4633 +> 15 0 24 179 topology 364 4634 +> 16 0 24 179 topology 460 4634 +> 15 0 23 179 topology 231 4635 +> 16 0 23 179 topology 232 4635 +> 15 0 24 179 topology 232 4636 +> 16 0 24 179 topology 460 4636 +> 15 0 23 179 topology 447 4637 +> 16 0 23 179 topology 448 4637 +> 15 0 24 179 topology 448 4638 +> 16 0 24 179 topology 460 4638 +> 15 0 23 179 topology 315 4639 +> 16 0 23 179 topology 316 4639 +> 15 0 24 179 topology 316 4640 +> 16 0 24 179 topology 460 4640 +> 15 0 23 179 topology 399 4641 +> 16 0 23 179 topology 400 4641 +> 15 0 24 179 topology 400 4642 +> 16 0 24 179 topology 460 4642 +> 15 0 23 179 topology 351 4643 +> 16 0 23 179 topology 352 4643 +> 15 0 24 179 topology 352 4644 +> 16 0 24 179 topology 460 4644 +> 15 0 23 179 topology 435 4645 +> 16 0 23 179 topology 436 4645 +> 15 0 24 179 topology 436 4646 +> 16 0 24 179 topology 460 4646 +> 15 0 23 179 topology 198 4647 +> 16 0 23 179 topology 199 4647 +> 15 0 24 179 topology 199 4648 +> 16 0 24 179 topology 460 4648 +> 15 0 23 179 topology 270 4649 +> 16 0 23 179 topology 271 4649 +> 15 0 24 179 topology 271 4650 +> 16 0 24 179 topology 460 4650 +> 15 0 23 179 topology 222 4651 +> 16 0 23 179 topology 223 4651 +> 15 0 24 179 topology 223 4652 +> 16 0 24 179 topology 460 4652 +> 15 0 23 179 topology 306 4653 +> 16 0 23 179 topology 307 4653 +> 15 0 24 179 topology 307 4654 +> 16 0 24 179 topology 460 4654 +> 15 0 23 179 topology 390 4655 +> 16 0 23 179 topology 391 4655 +> 15 0 24 179 topology 391 4656 +> 16 0 24 179 topology 460 4656 +> 15 0 23 179 topology 258 4657 +> 16 0 23 179 topology 259 4657 +> 15 0 24 179 topology 259 4658 +> 16 0 24 179 topology 460 4658 +> 15 0 23 179 topology 342 4659 +> 16 0 23 179 topology 343 4659 +> 15 0 24 179 topology 343 4660 +> 16 0 24 179 topology 460 4660 +> 15 0 23 179 topology 426 4661 +> 16 0 23 179 topology 427 4661 +> 15 0 24 179 topology 427 4662 +> 16 0 24 179 topology 460 4662 +> 15 0 23 179 topology 294 4663 +> 16 0 23 179 topology 295 4663 +> 15 0 24 179 topology 295 4664 +> 16 0 24 179 topology 460 4664 +> 15 0 23 179 topology 378 4665 +> 16 0 23 179 topology 379 4665 +> 15 0 24 179 topology 379 4666 +> 16 0 24 179 topology 460 4666 +> 15 0 23 179 topology 414 4667 +> 16 0 23 179 topology 415 4667 +> 15 0 24 179 topology 415 4668 +> 16 0 24 179 topology 460 4668 +> 15 0 23 179 topology 189 4669 +> 16 0 23 179 topology 190 4669 +> 15 0 24 179 topology 190 4670 +> 16 0 24 179 topology 460 4670 +> 15 0 23 179 topology 213 4671 +> 16 0 23 179 topology 214 4671 +> 15 0 24 179 topology 214 4672 +> 16 0 24 179 topology 460 4672 +> 15 0 23 179 topology 297 4673 +> 16 0 23 179 topology 298 4673 +> 15 0 24 179 topology 298 4674 +> 16 0 24 179 topology 460 4674 +> 15 0 23 179 topology 249 4675 +> 16 0 23 179 topology 250 4675 +> 15 0 24 179 topology 250 4676 +> 16 0 24 179 topology 460 4676 +> 15 0 23 179 topology 333 4677 +> 16 0 23 179 topology 334 4677 +> 15 0 24 179 topology 334 4678 +> 16 0 24 179 topology 460 4678 +> 15 0 23 179 topology 417 4679 +> 16 0 23 179 topology 418 4679 +> 15 0 24 179 topology 418 4680 +> 16 0 24 179 topology 460 4680 +> 15 0 23 179 topology 285 4681 +> 16 0 23 179 topology 286 4681 +> 15 0 24 179 topology 286 4682 +> 16 0 24 179 topology 460 4682 +> 15 0 23 179 topology 369 4683 +> 16 0 23 179 topology 370 4683 +> 15 0 24 179 topology 370 4684 +> 16 0 24 179 topology 460 4684 +> 15 0 23 179 topology 453 4685 +> 16 0 23 179 topology 454 4685 +> 15 0 24 179 topology 454 4686 +> 16 0 24 179 topology 460 4686 +> 15 0 23 179 topology 321 4687 +> 16 0 23 179 topology 322 4687 +> 15 0 24 179 topology 322 4688 +> 16 0 24 179 topology 460 4688 +> 15 0 23 179 topology 405 4689 +> 16 0 23 179 topology 406 4689 +> 15 0 24 179 topology 406 4690 +> 16 0 24 179 topology 460 4690 +> 15 0 27 21 topology 493 4691 +> 16 0 27 21 topology 495 4691 +> 15 0 21 21 topology 495 4692 +> 16 0 21 21 topology 178 4692 +> 15 0 28 21 topology 178 4693 +> 16 0 28 21 topology 176 4693 +> 15 0 28 21 topology 495 4694 +> 16 0 28 21 topology 497 4694 +> 15 0 21 21 topology 495 4695 +> 16 0 21 21 topology 461 4695 +> 15 0 28 21 topology 461 4696 +> 16 0 28 21 topology 459 4696 +> 15 0 28 21 topology 178 4697 +> 16 0 28 21 topology 497 4697 +> 15 0 21 21 topology 178 4698 +> 16 0 21 21 topology 461 4698 +> 15 0 27 21 topology 497 4699 +> 16 0 27 21 topology 461 4699 +> 15 0 23 1362 topology 1375 4700 +> 16 0 23 1362 topology 1376 4700 +> 15 0 24 1362 topology 1376 4701 +> 16 0 24 1362 topology 1601 4701 +> 15 0 24 1362 topology 1601 4702 +> 16 0 24 1362 topology 1425 4702 +> 15 0 25 1362 topology 1425 4703 +> 16 0 25 1362 topology 1423 4703 +> 15 0 24 1362 topology 1601 4704 +> 16 0 24 1362 topology 1401 4704 +> 15 0 25 1362 topology 1401 4705 +> 16 0 25 1362 topology 1399 4705 +> 15 0 24 1362 topology 1601 4706 +> 16 0 24 1362 topology 1545 4706 +> 15 0 25 1362 topology 1545 4707 +> 16 0 25 1362 topology 1543 4707 +> 15 0 24 1362 topology 1601 4708 +> 16 0 24 1362 topology 1521 4708 +> 15 0 25 1362 topology 1521 4709 +> 16 0 25 1362 topology 1519 4709 +> 15 0 24 1362 topology 1601 4710 +> 16 0 24 1362 topology 1497 4710 +> 15 0 25 1362 topology 1497 4711 +> 16 0 25 1362 topology 1495 4711 +> 15 0 24 1362 topology 1601 4712 +> 16 0 24 1362 topology 1473 4712 +> 15 0 25 1362 topology 1473 4713 +> 16 0 25 1362 topology 1471 4713 +> 15 0 24 1362 topology 1601 4714 +> 16 0 24 1362 topology 1449 4714 +> 15 0 25 1362 topology 1449 4715 +> 16 0 25 1362 topology 1447 4715 +> 15 0 24 1362 topology 1601 4716 +> 16 0 24 1362 topology 1593 4716 +> 15 0 25 1362 topology 1593 4717 +> 16 0 25 1362 topology 1591 4717 +> 15 0 24 1362 topology 1601 4718 +> 16 0 24 1362 topology 1569 4718 +> 15 0 25 1362 topology 1569 4719 +> 16 0 25 1362 topology 1567 4719 +> 15 0 24 1362 topology 1601 4720 +> 16 0 24 1362 topology 1380 4720 +> 15 0 25 1362 topology 1380 4721 +> 16 0 25 1362 topology 1378 4721 +> 15 0 24 1362 topology 1601 4722 +> 16 0 24 1362 topology 1452 4722 +> 15 0 25 1362 topology 1452 4723 +> 16 0 25 1362 topology 1450 4723 +> 15 0 24 1362 topology 1601 4724 +> 16 0 24 1362 topology 1428 4724 +> 15 0 25 1362 topology 1428 4725 +> 16 0 25 1362 topology 1426 4725 +> 15 0 24 1362 topology 1601 4726 +> 16 0 24 1362 topology 1404 4726 +> 15 0 25 1362 topology 1404 4727 +> 16 0 25 1362 topology 1402 4727 +> 15 0 24 1362 topology 1601 4728 +> 16 0 24 1362 topology 1572 4728 +> 15 0 25 1362 topology 1572 4729 +> 16 0 25 1362 topology 1570 4729 +> 15 0 24 1362 topology 1601 4730 +> 16 0 24 1362 topology 1548 4730 +> 15 0 25 1362 topology 1548 4731 +> 16 0 25 1362 topology 1546 4731 +> 15 0 24 1362 topology 1601 4732 +> 16 0 24 1362 topology 1524 4732 +> 15 0 25 1362 topology 1524 4733 +> 16 0 25 1362 topology 1522 4733 +> 15 0 24 1362 topology 1601 4734 +> 16 0 24 1362 topology 1500 4734 +> 15 0 25 1362 topology 1500 4735 +> 16 0 25 1362 topology 1498 4735 +> 15 0 24 1362 topology 1601 4736 +> 16 0 24 1362 topology 1476 4736 +> 15 0 25 1362 topology 1476 4737 +> 16 0 25 1362 topology 1474 4737 +> 15 0 24 1362 topology 1601 4738 +> 16 0 24 1362 topology 1596 4738 +> 15 0 25 1362 topology 1596 4739 +> 16 0 25 1362 topology 1594 4739 +> 15 0 24 1362 topology 1601 4740 +> 16 0 24 1362 topology 1383 4740 +> 15 0 25 1362 topology 1383 4741 +> 16 0 25 1362 topology 1381 4741 +> 15 0 24 1362 topology 1601 4742 +> 16 0 24 1362 topology 1455 4742 +> 15 0 25 1362 topology 1455 4743 +> 16 0 25 1362 topology 1453 4743 +> 15 0 24 1362 topology 1601 4744 +> 16 0 24 1362 topology 1431 4744 +> 15 0 25 1362 topology 1431 4745 +> 16 0 25 1362 topology 1429 4745 +> 15 0 24 1362 topology 1601 4746 +> 16 0 24 1362 topology 1407 4746 +> 15 0 25 1362 topology 1407 4747 +> 16 0 25 1362 topology 1405 4747 +> 15 0 24 1362 topology 1601 4748 +> 16 0 24 1362 topology 1575 4748 +> 15 0 25 1362 topology 1575 4749 +> 16 0 25 1362 topology 1573 4749 +> 15 0 24 1362 topology 1601 4750 +> 16 0 24 1362 topology 1551 4750 +> 15 0 25 1362 topology 1551 4751 +> 16 0 25 1362 topology 1549 4751 +> 15 0 24 1362 topology 1601 4752 +> 16 0 24 1362 topology 1527 4752 +> 15 0 25 1362 topology 1527 4753 +> 16 0 25 1362 topology 1525 4753 +> 15 0 24 1362 topology 1601 4754 +> 16 0 24 1362 topology 1503 4754 +> 15 0 25 1362 topology 1503 4755 +> 16 0 25 1362 topology 1501 4755 +> 15 0 24 1362 topology 1601 4756 +> 16 0 24 1362 topology 1479 4756 +> 15 0 25 1362 topology 1479 4757 +> 16 0 25 1362 topology 1477 4757 +> 15 0 24 1362 topology 1601 4758 +> 16 0 24 1362 topology 1599 4758 +> 15 0 25 1362 topology 1599 4759 +> 16 0 25 1362 topology 1597 4759 +> 15 0 24 1362 topology 1601 4760 +> 16 0 24 1362 topology 1386 4760 +> 15 0 25 1362 topology 1386 4761 +> 16 0 25 1362 topology 1384 4761 +> 15 0 26 1362 topology 1601 4762 +> 16 0 26 1362 topology 1600 4762 +> 15 0 24 1362 topology 1601 4763 +> 16 0 24 1362 topology 1482 4763 +> 15 0 25 1362 topology 1482 4764 +> 16 0 25 1362 topology 1480 4764 +> 15 0 24 1362 topology 1601 4765 +> 16 0 24 1362 topology 1458 4765 +> 15 0 25 1362 topology 1458 4766 +> 16 0 25 1362 topology 1456 4766 +> 15 0 24 1362 topology 1601 4767 +> 16 0 24 1362 topology 1434 4767 +> 15 0 25 1362 topology 1434 4768 +> 16 0 25 1362 topology 1432 4768 +> 15 0 24 1362 topology 1601 4769 +> 16 0 24 1362 topology 1410 4769 +> 15 0 25 1362 topology 1410 4770 +> 16 0 25 1362 topology 1408 4770 +> 15 0 24 1362 topology 1601 4771 +> 16 0 24 1362 topology 1578 4771 +> 15 0 25 1362 topology 1578 4772 +> 16 0 25 1362 topology 1576 4772 +> 15 0 24 1362 topology 1601 4773 +> 16 0 24 1362 topology 1554 4773 +> 15 0 25 1362 topology 1554 4774 +> 16 0 25 1362 topology 1552 4774 +> 15 0 24 1362 topology 1601 4775 +> 16 0 24 1362 topology 1530 4775 +> 15 0 25 1362 topology 1530 4776 +> 16 0 25 1362 topology 1528 4776 +> 15 0 24 1362 topology 1601 4777 +> 16 0 24 1362 topology 1506 4777 +> 15 0 25 1362 topology 1506 4778 +> 16 0 25 1362 topology 1504 4778 +> 15 0 24 1362 topology 1601 4779 +> 16 0 24 1362 topology 1365 4779 +> 15 0 25 1362 topology 1365 4780 +> 16 0 25 1362 topology 1363 4780 +> 15 0 24 1362 topology 1601 4781 +> 16 0 24 1362 topology 1389 4781 +> 15 0 25 1362 topology 1389 4782 +> 16 0 25 1362 topology 1387 4782 +> 15 0 24 1362 topology 1601 4783 +> 16 0 24 1362 topology 1485 4783 +> 15 0 25 1362 topology 1485 4784 +> 16 0 25 1362 topology 1483 4784 +> 15 0 24 1362 topology 1601 4785 +> 16 0 24 1362 topology 1461 4785 +> 15 0 25 1362 topology 1461 4786 +> 16 0 25 1362 topology 1459 4786 +> 15 0 24 1362 topology 1601 4787 +> 16 0 24 1362 topology 1437 4787 +> 15 0 25 1362 topology 1437 4788 +> 16 0 25 1362 topology 1435 4788 +> 15 0 24 1362 topology 1601 4789 +> 16 0 24 1362 topology 1413 4789 +> 15 0 25 1362 topology 1413 4790 +> 16 0 25 1362 topology 1411 4790 +> 15 0 24 1362 topology 1601 4791 +> 16 0 24 1362 topology 1581 4791 +> 15 0 25 1362 topology 1581 4792 +> 16 0 25 1362 topology 1579 4792 +> 15 0 24 1362 topology 1601 4793 +> 16 0 24 1362 topology 1557 4793 +> 15 0 25 1362 topology 1557 4794 +> 16 0 25 1362 topology 1555 4794 +> 15 0 24 1362 topology 1601 4795 +> 16 0 24 1362 topology 1533 4795 +> 15 0 25 1362 topology 1533 4796 +> 16 0 25 1362 topology 1531 4796 +> 15 0 24 1362 topology 1601 4797 +> 16 0 24 1362 topology 1509 4797 +> 15 0 25 1362 topology 1509 4798 +> 16 0 25 1362 topology 1507 4798 +> 15 0 24 1362 topology 1601 4799 +> 16 0 24 1362 topology 1368 4799 +> 15 0 25 1362 topology 1368 4800 +> 16 0 25 1362 topology 1366 4800 +> 15 0 24 1362 topology 1601 4801 +> 16 0 24 1362 topology 1392 4801 +> 15 0 25 1362 topology 1392 4802 +> 16 0 25 1362 topology 1390 4802 +> 15 0 24 1362 topology 1601 4803 +> 16 0 24 1362 topology 1512 4803 +> 15 0 25 1362 topology 1512 4804 +> 16 0 25 1362 topology 1510 4804 +> 15 0 24 1362 topology 1601 4805 +> 16 0 24 1362 topology 1488 4805 +> 15 0 25 1362 topology 1488 4806 +> 16 0 25 1362 topology 1486 4806 +> 15 0 24 1362 topology 1601 4807 +> 16 0 24 1362 topology 1464 4807 +> 15 0 25 1362 topology 1464 4808 +> 16 0 25 1362 topology 1462 4808 +> 15 0 24 1362 topology 1601 4809 +> 16 0 24 1362 topology 1440 4809 +> 15 0 25 1362 topology 1440 4810 +> 16 0 25 1362 topology 1438 4810 +> 15 0 24 1362 topology 1601 4811 +> 16 0 24 1362 topology 1416 4811 +> 15 0 25 1362 topology 1416 4812 +> 16 0 25 1362 topology 1414 4812 +> 15 0 24 1362 topology 1601 4813 +> 16 0 24 1362 topology 1584 4813 +> 15 0 25 1362 topology 1584 4814 +> 16 0 25 1362 topology 1582 4814 +> 15 0 24 1362 topology 1601 4815 +> 16 0 24 1362 topology 1560 4815 +> 15 0 25 1362 topology 1560 4816 +> 16 0 25 1362 topology 1558 4816 +> 15 0 24 1362 topology 1601 4817 +> 16 0 24 1362 topology 1536 4817 +> 15 0 25 1362 topology 1536 4818 +> 16 0 25 1362 topology 1534 4818 +> 15 0 24 1362 topology 1601 4819 +> 16 0 24 1362 topology 1371 4819 +> 15 0 25 1362 topology 1371 4820 +> 16 0 25 1362 topology 1369 4820 +> 15 0 24 1362 topology 1601 4821 +> 16 0 24 1362 topology 1395 4821 +> 15 0 25 1362 topology 1395 4822 +> 16 0 25 1362 topology 1393 4822 +> 15 0 24 1362 topology 1601 4823 +> 16 0 24 1362 topology 1515 4823 +> 15 0 25 1362 topology 1515 4824 +> 16 0 25 1362 topology 1513 4824 +> 15 0 24 1362 topology 1601 4825 +> 16 0 24 1362 topology 1491 4825 +> 15 0 25 1362 topology 1491 4826 +> 16 0 25 1362 topology 1489 4826 +> 15 0 24 1362 topology 1601 4827 +> 16 0 24 1362 topology 1467 4827 +> 15 0 25 1362 topology 1467 4828 +> 16 0 25 1362 topology 1465 4828 +> 15 0 24 1362 topology 1601 4829 +> 16 0 24 1362 topology 1443 4829 +> 15 0 25 1362 topology 1443 4830 +> 16 0 25 1362 topology 1441 4830 +> 15 0 24 1362 topology 1601 4831 +> 16 0 24 1362 topology 1419 4831 +> 15 0 25 1362 topology 1419 4832 +> 16 0 25 1362 topology 1417 4832 +> 15 0 24 1362 topology 1601 4833 +> 16 0 24 1362 topology 1587 4833 +> 15 0 25 1362 topology 1587 4834 +> 16 0 25 1362 topology 1585 4834 +> 15 0 24 1362 topology 1601 4835 +> 16 0 24 1362 topology 1563 4835 +> 15 0 25 1362 topology 1563 4836 +> 16 0 25 1362 topology 1561 4836 +> 15 0 24 1362 topology 1601 4837 +> 16 0 24 1362 topology 1539 4837 +> 15 0 25 1362 topology 1539 4838 +> 16 0 25 1362 topology 1537 4838 +> 15 0 24 1362 topology 1601 4839 +> 16 0 24 1362 topology 1374 4839 +> 15 0 25 1362 topology 1374 4840 +> 16 0 25 1362 topology 1372 4840 +> 15 0 24 1362 topology 1601 4841 +> 16 0 24 1362 topology 1422 4841 +> 15 0 25 1362 topology 1422 4842 +> 16 0 25 1362 topology 1420 4842 +> 15 0 24 1362 topology 1601 4843 +> 16 0 24 1362 topology 1398 4843 +> 15 0 25 1362 topology 1398 4844 +> 16 0 25 1362 topology 1396 4844 +> 15 0 24 1362 topology 1601 4845 +> 16 0 24 1362 topology 1542 4845 +> 15 0 25 1362 topology 1542 4846 +> 16 0 25 1362 topology 1540 4846 +> 15 0 24 1362 topology 1601 4847 +> 16 0 24 1362 topology 1518 4847 +> 15 0 25 1362 topology 1518 4848 +> 16 0 25 1362 topology 1516 4848 +> 15 0 24 1362 topology 1601 4849 +> 16 0 24 1362 topology 1494 4849 +> 15 0 25 1362 topology 1494 4850 +> 16 0 25 1362 topology 1492 4850 +> 15 0 24 1362 topology 1601 4851 +> 16 0 24 1362 topology 1470 4851 +> 15 0 25 1362 topology 1470 4852 +> 16 0 25 1362 topology 1468 4852 +> 15 0 24 1362 topology 1601 4853 +> 16 0 24 1362 topology 1446 4853 +> 15 0 25 1362 topology 1446 4854 +> 16 0 25 1362 topology 1444 4854 +> 15 0 24 1362 topology 1601 4855 +> 16 0 24 1362 topology 1590 4855 +> 15 0 25 1362 topology 1590 4856 +> 16 0 25 1362 topology 1588 4856 +> 15 0 24 1362 topology 1601 4857 +> 16 0 24 1362 topology 1566 4857 +> 15 0 25 1362 topology 1566 4858 +> 16 0 25 1362 topology 1564 4858 +> 15 0 23 1362 topology 1423 4859 +> 16 0 23 1362 topology 1424 4859 +> 15 0 24 1362 topology 1424 4860 +> 16 0 24 1362 topology 1601 4860 +> 15 0 24 1362 topology 1601 4861 +> 16 0 24 1362 topology 1377 4861 +> 15 0 25 1362 topology 1377 4862 +> 16 0 25 1362 topology 1375 4862 +> 15 0 23 1362 topology 1399 4863 +> 16 0 23 1362 topology 1400 4863 +> 15 0 24 1362 topology 1400 4864 +> 16 0 24 1362 topology 1601 4864 +> 15 0 23 1362 topology 1543 4865 +> 16 0 23 1362 topology 1544 4865 +> 15 0 24 1362 topology 1544 4866 +> 16 0 24 1362 topology 1601 4866 +> 15 0 23 1362 topology 1519 4867 +> 16 0 23 1362 topology 1520 4867 +> 15 0 24 1362 topology 1520 4868 +> 16 0 24 1362 topology 1601 4868 +> 15 0 23 1362 topology 1495 4869 +> 16 0 23 1362 topology 1496 4869 +> 15 0 24 1362 topology 1496 4870 +> 16 0 24 1362 topology 1601 4870 +> 15 0 23 1362 topology 1471 4871 +> 16 0 23 1362 topology 1472 4871 +> 15 0 24 1362 topology 1472 4872 +> 16 0 24 1362 topology 1601 4872 +> 15 0 23 1362 topology 1447 4873 +> 16 0 23 1362 topology 1448 4873 +> 15 0 24 1362 topology 1448 4874 +> 16 0 24 1362 topology 1601 4874 +> 15 0 23 1362 topology 1591 4875 +> 16 0 23 1362 topology 1592 4875 +> 15 0 24 1362 topology 1592 4876 +> 16 0 24 1362 topology 1601 4876 +> 15 0 23 1362 topology 1567 4877 +> 16 0 23 1362 topology 1568 4877 +> 15 0 24 1362 topology 1568 4878 +> 16 0 24 1362 topology 1601 4878 +> 15 0 23 1362 topology 1378 4879 +> 16 0 23 1362 topology 1379 4879 +> 15 0 24 1362 topology 1379 4880 +> 16 0 24 1362 topology 1601 4880 +> 15 0 23 1362 topology 1450 4881 +> 16 0 23 1362 topology 1451 4881 +> 15 0 24 1362 topology 1451 4882 +> 16 0 24 1362 topology 1601 4882 +> 15 0 23 1362 topology 1426 4883 +> 16 0 23 1362 topology 1427 4883 +> 15 0 24 1362 topology 1427 4884 +> 16 0 24 1362 topology 1601 4884 +> 15 0 23 1362 topology 1402 4885 +> 16 0 23 1362 topology 1403 4885 +> 15 0 24 1362 topology 1403 4886 +> 16 0 24 1362 topology 1601 4886 +> 15 0 23 1362 topology 1570 4887 +> 16 0 23 1362 topology 1571 4887 +> 15 0 24 1362 topology 1571 4888 +> 16 0 24 1362 topology 1601 4888 +> 15 0 23 1362 topology 1546 4889 +> 16 0 23 1362 topology 1547 4889 +> 15 0 24 1362 topology 1547 4890 +> 16 0 24 1362 topology 1601 4890 +> 15 0 23 1362 topology 1522 4891 +> 16 0 23 1362 topology 1523 4891 +> 15 0 24 1362 topology 1523 4892 +> 16 0 24 1362 topology 1601 4892 +> 15 0 23 1362 topology 1498 4893 +> 16 0 23 1362 topology 1499 4893 +> 15 0 24 1362 topology 1499 4894 +> 16 0 24 1362 topology 1601 4894 +> 15 0 23 1362 topology 1474 4895 +> 16 0 23 1362 topology 1475 4895 +> 15 0 24 1362 topology 1475 4896 +> 16 0 24 1362 topology 1601 4896 +> 15 0 23 1362 topology 1594 4897 +> 16 0 23 1362 topology 1595 4897 +> 15 0 24 1362 topology 1595 4898 +> 16 0 24 1362 topology 1601 4898 +> 15 0 23 1362 topology 1381 4899 +> 16 0 23 1362 topology 1382 4899 +> 15 0 24 1362 topology 1382 4900 +> 16 0 24 1362 topology 1601 4900 +> 15 0 23 1362 topology 1453 4901 +> 16 0 23 1362 topology 1454 4901 +> 15 0 24 1362 topology 1454 4902 +> 16 0 24 1362 topology 1601 4902 +> 15 0 23 1362 topology 1429 4903 +> 16 0 23 1362 topology 1430 4903 +> 15 0 24 1362 topology 1430 4904 +> 16 0 24 1362 topology 1601 4904 +> 15 0 23 1362 topology 1405 4905 +> 16 0 23 1362 topology 1406 4905 +> 15 0 24 1362 topology 1406 4906 +> 16 0 24 1362 topology 1601 4906 +> 15 0 23 1362 topology 1573 4907 +> 16 0 23 1362 topology 1574 4907 +> 15 0 24 1362 topology 1574 4908 +> 16 0 24 1362 topology 1601 4908 +> 15 0 23 1362 topology 1549 4909 +> 16 0 23 1362 topology 1550 4909 +> 15 0 24 1362 topology 1550 4910 +> 16 0 24 1362 topology 1601 4910 +> 15 0 23 1362 topology 1525 4911 +> 16 0 23 1362 topology 1526 4911 +> 15 0 24 1362 topology 1526 4912 +> 16 0 24 1362 topology 1601 4912 +> 15 0 23 1362 topology 1501 4913 +> 16 0 23 1362 topology 1502 4913 +> 15 0 24 1362 topology 1502 4914 +> 16 0 24 1362 topology 1601 4914 +> 15 0 23 1362 topology 1477 4915 +> 16 0 23 1362 topology 1478 4915 +> 15 0 24 1362 topology 1478 4916 +> 16 0 24 1362 topology 1601 4916 +> 15 0 23 1362 topology 1597 4917 +> 16 0 23 1362 topology 1598 4917 +> 15 0 24 1362 topology 1598 4918 +> 16 0 24 1362 topology 1601 4918 +> 15 0 23 1362 topology 1384 4919 +> 16 0 23 1362 topology 1385 4919 +> 15 0 24 1362 topology 1385 4920 +> 16 0 24 1362 topology 1601 4920 +> 15 0 23 1362 topology 1480 4921 +> 16 0 23 1362 topology 1481 4921 +> 15 0 24 1362 topology 1481 4922 +> 16 0 24 1362 topology 1601 4922 +> 15 0 23 1362 topology 1456 4923 +> 16 0 23 1362 topology 1457 4923 +> 15 0 24 1362 topology 1457 4924 +> 16 0 24 1362 topology 1601 4924 +> 15 0 23 1362 topology 1432 4925 +> 16 0 23 1362 topology 1433 4925 +> 15 0 24 1362 topology 1433 4926 +> 16 0 24 1362 topology 1601 4926 +> 15 0 23 1362 topology 1408 4927 +> 16 0 23 1362 topology 1409 4927 +> 15 0 24 1362 topology 1409 4928 +> 16 0 24 1362 topology 1601 4928 +> 15 0 23 1362 topology 1576 4929 +> 16 0 23 1362 topology 1577 4929 +> 15 0 24 1362 topology 1577 4930 +> 16 0 24 1362 topology 1601 4930 +> 15 0 23 1362 topology 1552 4931 +> 16 0 23 1362 topology 1553 4931 +> 15 0 24 1362 topology 1553 4932 +> 16 0 24 1362 topology 1601 4932 +> 15 0 23 1362 topology 1528 4933 +> 16 0 23 1362 topology 1529 4933 +> 15 0 24 1362 topology 1529 4934 +> 16 0 24 1362 topology 1601 4934 +> 15 0 23 1362 topology 1504 4935 +> 16 0 23 1362 topology 1505 4935 +> 15 0 24 1362 topology 1505 4936 +> 16 0 24 1362 topology 1601 4936 +> 15 0 23 1362 topology 1363 4937 +> 16 0 23 1362 topology 1364 4937 +> 15 0 24 1362 topology 1364 4938 +> 16 0 24 1362 topology 1601 4938 +> 15 0 23 1362 topology 1387 4939 +> 16 0 23 1362 topology 1388 4939 +> 15 0 24 1362 topology 1388 4940 +> 16 0 24 1362 topology 1601 4940 +> 15 0 23 1362 topology 1483 4941 +> 16 0 23 1362 topology 1484 4941 +> 15 0 24 1362 topology 1484 4942 +> 16 0 24 1362 topology 1601 4942 +> 15 0 23 1362 topology 1459 4943 +> 16 0 23 1362 topology 1460 4943 +> 15 0 24 1362 topology 1460 4944 +> 16 0 24 1362 topology 1601 4944 +> 15 0 23 1362 topology 1435 4945 +> 16 0 23 1362 topology 1436 4945 +> 15 0 24 1362 topology 1436 4946 +> 16 0 24 1362 topology 1601 4946 +> 15 0 23 1362 topology 1411 4947 +> 16 0 23 1362 topology 1412 4947 +> 15 0 24 1362 topology 1412 4948 +> 16 0 24 1362 topology 1601 4948 +> 15 0 23 1362 topology 1579 4949 +> 16 0 23 1362 topology 1580 4949 +> 15 0 24 1362 topology 1580 4950 +> 16 0 24 1362 topology 1601 4950 +> 15 0 23 1362 topology 1555 4951 +> 16 0 23 1362 topology 1556 4951 +> 15 0 24 1362 topology 1556 4952 +> 16 0 24 1362 topology 1601 4952 +> 15 0 23 1362 topology 1531 4953 +> 16 0 23 1362 topology 1532 4953 +> 15 0 24 1362 topology 1532 4954 +> 16 0 24 1362 topology 1601 4954 +> 15 0 23 1362 topology 1507 4955 +> 16 0 23 1362 topology 1508 4955 +> 15 0 24 1362 topology 1508 4956 +> 16 0 24 1362 topology 1601 4956 +> 15 0 23 1362 topology 1366 4957 +> 16 0 23 1362 topology 1367 4957 +> 15 0 24 1362 topology 1367 4958 +> 16 0 24 1362 topology 1601 4958 +> 15 0 23 1362 topology 1390 4959 +> 16 0 23 1362 topology 1391 4959 +> 15 0 24 1362 topology 1391 4960 +> 16 0 24 1362 topology 1601 4960 +> 15 0 23 1362 topology 1510 4961 +> 16 0 23 1362 topology 1511 4961 +> 15 0 24 1362 topology 1511 4962 +> 16 0 24 1362 topology 1601 4962 +> 15 0 23 1362 topology 1486 4963 +> 16 0 23 1362 topology 1487 4963 +> 15 0 24 1362 topology 1487 4964 +> 16 0 24 1362 topology 1601 4964 +> 15 0 23 1362 topology 1462 4965 +> 16 0 23 1362 topology 1463 4965 +> 15 0 24 1362 topology 1463 4966 +> 16 0 24 1362 topology 1601 4966 +> 15 0 23 1362 topology 1438 4967 +> 16 0 23 1362 topology 1439 4967 +> 15 0 24 1362 topology 1439 4968 +> 16 0 24 1362 topology 1601 4968 +> 15 0 23 1362 topology 1414 4969 +> 16 0 23 1362 topology 1415 4969 +> 15 0 24 1362 topology 1415 4970 +> 16 0 24 1362 topology 1601 4970 +> 15 0 23 1362 topology 1582 4971 +> 16 0 23 1362 topology 1583 4971 +> 15 0 24 1362 topology 1583 4972 +> 16 0 24 1362 topology 1601 4972 +> 15 0 23 1362 topology 1558 4973 +> 16 0 23 1362 topology 1559 4973 +> 15 0 24 1362 topology 1559 4974 +> 16 0 24 1362 topology 1601 4974 +> 15 0 23 1362 topology 1534 4975 +> 16 0 23 1362 topology 1535 4975 +> 15 0 24 1362 topology 1535 4976 +> 16 0 24 1362 topology 1601 4976 +> 15 0 23 1362 topology 1369 4977 +> 16 0 23 1362 topology 1370 4977 +> 15 0 24 1362 topology 1370 4978 +> 16 0 24 1362 topology 1601 4978 +> 15 0 23 1362 topology 1393 4979 +> 16 0 23 1362 topology 1394 4979 +> 15 0 24 1362 topology 1394 4980 +> 16 0 24 1362 topology 1601 4980 +> 15 0 23 1362 topology 1513 4981 +> 16 0 23 1362 topology 1514 4981 +> 15 0 24 1362 topology 1514 4982 +> 16 0 24 1362 topology 1601 4982 +> 15 0 23 1362 topology 1489 4983 +> 16 0 23 1362 topology 1490 4983 +> 15 0 24 1362 topology 1490 4984 +> 16 0 24 1362 topology 1601 4984 +> 15 0 23 1362 topology 1465 4985 +> 16 0 23 1362 topology 1466 4985 +> 15 0 24 1362 topology 1466 4986 +> 16 0 24 1362 topology 1601 4986 +> 15 0 23 1362 topology 1441 4987 +> 16 0 23 1362 topology 1442 4987 +> 15 0 24 1362 topology 1442 4988 +> 16 0 24 1362 topology 1601 4988 +> 15 0 23 1362 topology 1417 4989 +> 16 0 23 1362 topology 1418 4989 +> 15 0 24 1362 topology 1418 4990 +> 16 0 24 1362 topology 1601 4990 +> 15 0 23 1362 topology 1585 4991 +> 16 0 23 1362 topology 1586 4991 +> 15 0 24 1362 topology 1586 4992 +> 16 0 24 1362 topology 1601 4992 +> 15 0 23 1362 topology 1561 4993 +> 16 0 23 1362 topology 1562 4993 +> 15 0 24 1362 topology 1562 4994 +> 16 0 24 1362 topology 1601 4994 +> 15 0 23 1362 topology 1537 4995 +> 16 0 23 1362 topology 1538 4995 +> 15 0 24 1362 topology 1538 4996 +> 16 0 24 1362 topology 1601 4996 +> 15 0 23 1362 topology 1372 4997 +> 16 0 23 1362 topology 1373 4997 +> 15 0 24 1362 topology 1373 4998 +> 16 0 24 1362 topology 1601 4998 +> 15 0 23 1362 topology 1420 4999 +> 16 0 23 1362 topology 1421 4999 +> 15 0 24 1362 topology 1421 5000 +> 16 0 24 1362 topology 1601 5000 +> 15 0 23 1362 topology 1396 5001 +> 16 0 23 1362 topology 1397 5001 +> 15 0 24 1362 topology 1397 5002 +> 16 0 24 1362 topology 1601 5002 +> 15 0 23 1362 topology 1540 5003 +> 16 0 23 1362 topology 1541 5003 +> 15 0 24 1362 topology 1541 5004 +> 16 0 24 1362 topology 1601 5004 +> 15 0 23 1362 topology 1516 5005 +> 16 0 23 1362 topology 1517 5005 +> 15 0 24 1362 topology 1517 5006 +> 16 0 24 1362 topology 1601 5006 +> 15 0 23 1362 topology 1492 5007 +> 16 0 23 1362 topology 1493 5007 +> 15 0 24 1362 topology 1493 5008 +> 16 0 24 1362 topology 1601 5008 +> 15 0 23 1362 topology 1468 5009 +> 16 0 23 1362 topology 1469 5009 +> 15 0 24 1362 topology 1469 5010 +> 16 0 24 1362 topology 1601 5010 +> 15 0 23 1362 topology 1444 5011 +> 16 0 23 1362 topology 1445 5011 +> 15 0 24 1362 topology 1445 5012 +> 16 0 24 1362 topology 1601 5012 +> 15 0 23 1362 topology 1588 5013 +> 16 0 23 1362 topology 1589 5013 +> 15 0 24 1362 topology 1589 5014 +> 16 0 24 1362 topology 1601 5014 +> 15 0 23 1362 topology 1564 5015 +> 16 0 23 1362 topology 1565 5015 +> 15 0 24 1362 topology 1565 5016 +> 16 0 24 1362 topology 1601 5016 +> 15 0 23 1190 topology 1221 5017 +> 16 0 23 1190 topology 1222 5017 +> 15 0 24 1190 topology 1222 5018 +> 16 0 24 1190 topology 1360 5018 +> 15 0 24 1190 topology 1360 5019 +> 16 0 24 1190 topology 1283 5019 +> 15 0 25 1190 topology 1283 5020 +> 16 0 25 1190 topology 1281 5020 +> 15 0 24 1190 topology 1360 5021 +> 16 0 24 1190 topology 1259 5021 +> 15 0 25 1190 topology 1259 5022 +> 16 0 25 1190 topology 1257 5022 +> 15 0 24 1190 topology 1360 5023 +> 16 0 24 1190 topology 1235 5023 +> 15 0 25 1190 topology 1235 5024 +> 16 0 25 1190 topology 1233 5024 +> 15 0 24 1190 topology 1360 5025 +> 16 0 24 1190 topology 1343 5025 +> 15 0 25 1190 topology 1343 5026 +> 16 0 25 1190 topology 1341 5026 +> 15 0 24 1190 topology 1360 5027 +> 16 0 24 1190 topology 1319 5027 +> 15 0 25 1190 topology 1319 5028 +> 16 0 25 1190 topology 1317 5028 +> 15 0 24 1190 topology 1360 5029 +> 16 0 24 1190 topology 1295 5029 +> 15 0 25 1190 topology 1295 5030 +> 16 0 25 1190 topology 1293 5030 +> 15 0 24 1190 topology 1360 5031 +> 16 0 24 1190 topology 1271 5031 +> 15 0 25 1190 topology 1271 5032 +> 16 0 25 1190 topology 1269 5032 +> 15 0 24 1190 topology 1360 5033 +> 16 0 24 1190 topology 1247 5033 +> 15 0 25 1190 topology 1247 5034 +> 16 0 25 1190 topology 1245 5034 +> 15 0 24 1190 topology 1360 5035 +> 16 0 24 1190 topology 1355 5035 +> 15 0 25 1190 topology 1355 5036 +> 16 0 25 1190 topology 1353 5036 +> 15 0 24 1190 topology 1360 5037 +> 16 0 24 1190 topology 1331 5037 +> 15 0 25 1190 topology 1331 5038 +> 16 0 25 1190 topology 1329 5038 +> 15 0 24 1190 topology 1360 5039 +> 16 0 24 1190 topology 1307 5039 +> 15 0 25 1190 topology 1307 5040 +> 16 0 25 1190 topology 1305 5040 +> 15 0 24 1190 topology 1360 5041 +> 16 0 24 1190 topology 1193 5041 +> 15 0 25 1190 topology 1193 5042 +> 16 0 25 1190 topology 1191 5042 +> 15 0 24 1190 topology 1360 5043 +> 16 0 24 1190 topology 1205 5043 +> 15 0 25 1190 topology 1205 5044 +> 16 0 25 1190 topology 1203 5044 +> 15 0 24 1190 topology 1360 5045 +> 16 0 24 1190 topology 1217 5045 +> 15 0 25 1190 topology 1217 5046 +> 16 0 25 1190 topology 1215 5046 +> 15 0 26 1190 topology 1360 5047 +> 16 0 26 1190 topology 1359 5047 +> 15 0 24 1190 topology 1360 5048 +> 16 0 24 1190 topology 1250 5048 +> 15 0 25 1190 topology 1250 5049 +> 16 0 25 1190 topology 1248 5049 +> 15 0 24 1190 topology 1360 5050 +> 16 0 24 1190 topology 1226 5050 +> 15 0 25 1190 topology 1226 5051 +> 16 0 25 1190 topology 1224 5051 +> 15 0 24 1190 topology 1360 5052 +> 16 0 24 1190 topology 1310 5052 +> 15 0 25 1190 topology 1310 5053 +> 16 0 25 1190 topology 1308 5053 +> 15 0 24 1190 topology 1360 5054 +> 16 0 24 1190 topology 1286 5054 +> 15 0 25 1190 topology 1286 5055 +> 16 0 25 1190 topology 1284 5055 +> 15 0 24 1190 topology 1360 5056 +> 16 0 24 1190 topology 1262 5056 +> 15 0 25 1190 topology 1262 5057 +> 16 0 25 1190 topology 1260 5057 +> 15 0 24 1190 topology 1360 5058 +> 16 0 24 1190 topology 1238 5058 +> 15 0 25 1190 topology 1238 5059 +> 16 0 25 1190 topology 1236 5059 +> 15 0 24 1190 topology 1360 5060 +> 16 0 24 1190 topology 1346 5060 +> 15 0 25 1190 topology 1346 5061 +> 16 0 25 1190 topology 1344 5061 +> 15 0 24 1190 topology 1360 5062 +> 16 0 24 1190 topology 1322 5062 +> 15 0 25 1190 topology 1322 5063 +> 16 0 25 1190 topology 1320 5063 +> 15 0 24 1190 topology 1360 5064 +> 16 0 24 1190 topology 1298 5064 +> 15 0 25 1190 topology 1298 5065 +> 16 0 25 1190 topology 1296 5065 +> 15 0 24 1190 topology 1360 5066 +> 16 0 24 1190 topology 1274 5066 +> 15 0 25 1190 topology 1274 5067 +> 16 0 25 1190 topology 1272 5067 +> 15 0 24 1190 topology 1360 5068 +> 16 0 24 1190 topology 1358 5068 +> 15 0 25 1190 topology 1358 5069 +> 16 0 25 1190 topology 1356 5069 +> 15 0 24 1190 topology 1360 5070 +> 16 0 24 1190 topology 1334 5070 +> 15 0 25 1190 topology 1334 5071 +> 16 0 25 1190 topology 1332 5071 +> 15 0 24 1190 topology 1360 5072 +> 16 0 24 1190 topology 1196 5072 +> 15 0 25 1190 topology 1196 5073 +> 16 0 25 1190 topology 1194 5073 +> 15 0 24 1190 topology 1360 5074 +> 16 0 24 1190 topology 1208 5074 +> 15 0 25 1190 topology 1208 5075 +> 16 0 25 1190 topology 1206 5075 +> 15 0 24 1190 topology 1360 5076 +> 16 0 24 1190 topology 1253 5076 +> 15 0 25 1190 topology 1253 5077 +> 16 0 25 1190 topology 1251 5077 +> 15 0 24 1190 topology 1360 5078 +> 16 0 24 1190 topology 1229 5078 +> 15 0 25 1190 topology 1229 5079 +> 16 0 25 1190 topology 1227 5079 +> 15 0 24 1190 topology 1360 5080 +> 16 0 24 1190 topology 1313 5080 +> 15 0 25 1190 topology 1313 5081 +> 16 0 25 1190 topology 1311 5081 +> 15 0 24 1190 topology 1360 5082 +> 16 0 24 1190 topology 1289 5082 +> 15 0 25 1190 topology 1289 5083 +> 16 0 25 1190 topology 1287 5083 +> 15 0 24 1190 topology 1360 5084 +> 16 0 24 1190 topology 1265 5084 +> 15 0 25 1190 topology 1265 5085 +> 16 0 25 1190 topology 1263 5085 +> 15 0 24 1190 topology 1360 5086 +> 16 0 24 1190 topology 1241 5086 +> 15 0 25 1190 topology 1241 5087 +> 16 0 25 1190 topology 1239 5087 +> 15 0 24 1190 topology 1360 5088 +> 16 0 24 1190 topology 1349 5088 +> 15 0 25 1190 topology 1349 5089 +> 16 0 25 1190 topology 1347 5089 +> 15 0 24 1190 topology 1360 5090 +> 16 0 24 1190 topology 1325 5090 +> 15 0 25 1190 topology 1325 5091 +> 16 0 25 1190 topology 1323 5091 +> 15 0 24 1190 topology 1360 5092 +> 16 0 24 1190 topology 1301 5092 +> 15 0 25 1190 topology 1301 5093 +> 16 0 25 1190 topology 1299 5093 +> 15 0 24 1190 topology 1360 5094 +> 16 0 24 1190 topology 1277 5094 +> 15 0 25 1190 topology 1277 5095 +> 16 0 25 1190 topology 1275 5095 +> 15 0 24 1190 topology 1360 5096 +> 16 0 24 1190 topology 1337 5096 +> 15 0 25 1190 topology 1337 5097 +> 16 0 25 1190 topology 1335 5097 +> 15 0 24 1190 topology 1360 5098 +> 16 0 24 1190 topology 1199 5098 +> 15 0 25 1190 topology 1199 5099 +> 16 0 25 1190 topology 1197 5099 +> 15 0 24 1190 topology 1360 5100 +> 16 0 24 1190 topology 1211 5100 +> 15 0 25 1190 topology 1211 5101 +> 16 0 25 1190 topology 1209 5101 +> 15 0 24 1190 topology 1360 5102 +> 16 0 24 1190 topology 1220 5102 +> 15 0 25 1190 topology 1220 5103 +> 16 0 25 1190 topology 1218 5103 +> 15 0 24 1190 topology 1360 5104 +> 16 0 24 1190 topology 1280 5104 +> 15 0 25 1190 topology 1280 5105 +> 16 0 25 1190 topology 1278 5105 +> 15 0 24 1190 topology 1360 5106 +> 16 0 24 1190 topology 1256 5106 +> 15 0 25 1190 topology 1256 5107 +> 16 0 25 1190 topology 1254 5107 +> 15 0 24 1190 topology 1360 5108 +> 16 0 24 1190 topology 1232 5108 +> 15 0 25 1190 topology 1232 5109 +> 16 0 25 1190 topology 1230 5109 +> 15 0 24 1190 topology 1360 5110 +> 16 0 24 1190 topology 1340 5110 +> 15 0 25 1190 topology 1340 5111 +> 16 0 25 1190 topology 1338 5111 +> 15 0 24 1190 topology 1360 5112 +> 16 0 24 1190 topology 1316 5112 +> 15 0 25 1190 topology 1316 5113 +> 16 0 25 1190 topology 1314 5113 +> 15 0 24 1190 topology 1360 5114 +> 16 0 24 1190 topology 1292 5114 +> 15 0 25 1190 topology 1292 5115 +> 16 0 25 1190 topology 1290 5115 +> 15 0 24 1190 topology 1360 5116 +> 16 0 24 1190 topology 1268 5116 +> 15 0 25 1190 topology 1268 5117 +> 16 0 25 1190 topology 1266 5117 +> 15 0 24 1190 topology 1360 5118 +> 16 0 24 1190 topology 1244 5118 +> 15 0 25 1190 topology 1244 5119 +> 16 0 25 1190 topology 1242 5119 +> 15 0 24 1190 topology 1360 5120 +> 16 0 24 1190 topology 1352 5120 +> 15 0 25 1190 topology 1352 5121 +> 16 0 25 1190 topology 1350 5121 +> 15 0 24 1190 topology 1360 5122 +> 16 0 24 1190 topology 1328 5122 +> 15 0 25 1190 topology 1328 5123 +> 16 0 25 1190 topology 1326 5123 +> 15 0 24 1190 topology 1360 5124 +> 16 0 24 1190 topology 1304 5124 +> 15 0 25 1190 topology 1304 5125 +> 16 0 25 1190 topology 1302 5125 +> 15 0 24 1190 topology 1360 5126 +> 16 0 24 1190 topology 1202 5126 +> 15 0 25 1190 topology 1202 5127 +> 16 0 25 1190 topology 1200 5127 +> 15 0 24 1190 topology 1360 5128 +> 16 0 24 1190 topology 1214 5128 +> 15 0 25 1190 topology 1214 5129 +> 16 0 25 1190 topology 1212 5129 +> 15 0 23 1190 topology 1281 5130 +> 16 0 23 1190 topology 1282 5130 +> 15 0 24 1190 topology 1282 5131 +> 16 0 24 1190 topology 1360 5131 +> 15 0 24 1190 topology 1360 5132 +> 16 0 24 1190 topology 1223 5132 +> 15 0 25 1190 topology 1223 5133 +> 16 0 25 1190 topology 1221 5133 +> 15 0 23 1190 topology 1257 5134 +> 16 0 23 1190 topology 1258 5134 +> 15 0 24 1190 topology 1258 5135 +> 16 0 24 1190 topology 1360 5135 +> 15 0 23 1190 topology 1233 5136 +> 16 0 23 1190 topology 1234 5136 +> 15 0 24 1190 topology 1234 5137 +> 16 0 24 1190 topology 1360 5137 +> 15 0 23 1190 topology 1341 5138 +> 16 0 23 1190 topology 1342 5138 +> 15 0 24 1190 topology 1342 5139 +> 16 0 24 1190 topology 1360 5139 +> 15 0 23 1190 topology 1317 5140 +> 16 0 23 1190 topology 1318 5140 +> 15 0 24 1190 topology 1318 5141 +> 16 0 24 1190 topology 1360 5141 +> 15 0 23 1190 topology 1293 5142 +> 16 0 23 1190 topology 1294 5142 +> 15 0 24 1190 topology 1294 5143 +> 16 0 24 1190 topology 1360 5143 +> 15 0 23 1190 topology 1269 5144 +> 16 0 23 1190 topology 1270 5144 +> 15 0 24 1190 topology 1270 5145 +> 16 0 24 1190 topology 1360 5145 +> 15 0 23 1190 topology 1245 5146 +> 16 0 23 1190 topology 1246 5146 +> 15 0 24 1190 topology 1246 5147 +> 16 0 24 1190 topology 1360 5147 +> 15 0 23 1190 topology 1353 5148 +> 16 0 23 1190 topology 1354 5148 +> 15 0 24 1190 topology 1354 5149 +> 16 0 24 1190 topology 1360 5149 +> 15 0 23 1190 topology 1329 5150 +> 16 0 23 1190 topology 1330 5150 +> 15 0 24 1190 topology 1330 5151 +> 16 0 24 1190 topology 1360 5151 +> 15 0 23 1190 topology 1305 5152 +> 16 0 23 1190 topology 1306 5152 +> 15 0 24 1190 topology 1306 5153 +> 16 0 24 1190 topology 1360 5153 +> 15 0 23 1190 topology 1191 5154 +> 16 0 23 1190 topology 1192 5154 +> 15 0 24 1190 topology 1192 5155 +> 16 0 24 1190 topology 1360 5155 +> 15 0 23 1190 topology 1203 5156 +> 16 0 23 1190 topology 1204 5156 +> 15 0 24 1190 topology 1204 5157 +> 16 0 24 1190 topology 1360 5157 +> 15 0 23 1190 topology 1215 5158 +> 16 0 23 1190 topology 1216 5158 +> 15 0 24 1190 topology 1216 5159 +> 16 0 24 1190 topology 1360 5159 +> 15 0 23 1190 topology 1248 5160 +> 16 0 23 1190 topology 1249 5160 +> 15 0 24 1190 topology 1249 5161 +> 16 0 24 1190 topology 1360 5161 +> 15 0 23 1190 topology 1224 5162 +> 16 0 23 1190 topology 1225 5162 +> 15 0 24 1190 topology 1225 5163 +> 16 0 24 1190 topology 1360 5163 +> 15 0 23 1190 topology 1308 5164 +> 16 0 23 1190 topology 1309 5164 +> 15 0 24 1190 topology 1309 5165 +> 16 0 24 1190 topology 1360 5165 +> 15 0 23 1190 topology 1284 5166 +> 16 0 23 1190 topology 1285 5166 +> 15 0 24 1190 topology 1285 5167 +> 16 0 24 1190 topology 1360 5167 +> 15 0 23 1190 topology 1260 5168 +> 16 0 23 1190 topology 1261 5168 +> 15 0 24 1190 topology 1261 5169 +> 16 0 24 1190 topology 1360 5169 +> 15 0 23 1190 topology 1236 5170 +> 16 0 23 1190 topology 1237 5170 +> 15 0 24 1190 topology 1237 5171 +> 16 0 24 1190 topology 1360 5171 +> 15 0 23 1190 topology 1344 5172 +> 16 0 23 1190 topology 1345 5172 +> 15 0 24 1190 topology 1345 5173 +> 16 0 24 1190 topology 1360 5173 +> 15 0 23 1190 topology 1320 5174 +> 16 0 23 1190 topology 1321 5174 +> 15 0 24 1190 topology 1321 5175 +> 16 0 24 1190 topology 1360 5175 +> 15 0 23 1190 topology 1296 5176 +> 16 0 23 1190 topology 1297 5176 +> 15 0 24 1190 topology 1297 5177 +> 16 0 24 1190 topology 1360 5177 +> 15 0 23 1190 topology 1272 5178 +> 16 0 23 1190 topology 1273 5178 +> 15 0 24 1190 topology 1273 5179 +> 16 0 24 1190 topology 1360 5179 +> 15 0 23 1190 topology 1356 5180 +> 16 0 23 1190 topology 1357 5180 +> 15 0 24 1190 topology 1357 5181 +> 16 0 24 1190 topology 1360 5181 +> 15 0 23 1190 topology 1332 5182 +> 16 0 23 1190 topology 1333 5182 +> 15 0 24 1190 topology 1333 5183 +> 16 0 24 1190 topology 1360 5183 +> 15 0 23 1190 topology 1194 5184 +> 16 0 23 1190 topology 1195 5184 +> 15 0 24 1190 topology 1195 5185 +> 16 0 24 1190 topology 1360 5185 +> 15 0 23 1190 topology 1206 5186 +> 16 0 23 1190 topology 1207 5186 +> 15 0 24 1190 topology 1207 5187 +> 16 0 24 1190 topology 1360 5187 +> 15 0 23 1190 topology 1251 5188 +> 16 0 23 1190 topology 1252 5188 +> 15 0 24 1190 topology 1252 5189 +> 16 0 24 1190 topology 1360 5189 +> 15 0 23 1190 topology 1227 5190 +> 16 0 23 1190 topology 1228 5190 +> 15 0 24 1190 topology 1228 5191 +> 16 0 24 1190 topology 1360 5191 +> 15 0 23 1190 topology 1311 5192 +> 16 0 23 1190 topology 1312 5192 +> 15 0 24 1190 topology 1312 5193 +> 16 0 24 1190 topology 1360 5193 +> 15 0 23 1190 topology 1287 5194 +> 16 0 23 1190 topology 1288 5194 +> 15 0 24 1190 topology 1288 5195 +> 16 0 24 1190 topology 1360 5195 +> 15 0 23 1190 topology 1263 5196 +> 16 0 23 1190 topology 1264 5196 +> 15 0 24 1190 topology 1264 5197 +> 16 0 24 1190 topology 1360 5197 +> 15 0 23 1190 topology 1239 5198 +> 16 0 23 1190 topology 1240 5198 +> 15 0 24 1190 topology 1240 5199 +> 16 0 24 1190 topology 1360 5199 +> 15 0 23 1190 topology 1347 5200 +> 16 0 23 1190 topology 1348 5200 +> 15 0 24 1190 topology 1348 5201 +> 16 0 24 1190 topology 1360 5201 +> 15 0 23 1190 topology 1323 5202 +> 16 0 23 1190 topology 1324 5202 +> 15 0 24 1190 topology 1324 5203 +> 16 0 24 1190 topology 1360 5203 +> 15 0 23 1190 topology 1299 5204 +> 16 0 23 1190 topology 1300 5204 +> 15 0 24 1190 topology 1300 5205 +> 16 0 24 1190 topology 1360 5205 +> 15 0 23 1190 topology 1275 5206 +> 16 0 23 1190 topology 1276 5206 +> 15 0 24 1190 topology 1276 5207 +> 16 0 24 1190 topology 1360 5207 +> 15 0 23 1190 topology 1335 5208 +> 16 0 23 1190 topology 1336 5208 +> 15 0 24 1190 topology 1336 5209 +> 16 0 24 1190 topology 1360 5209 +> 15 0 23 1190 topology 1197 5210 +> 16 0 23 1190 topology 1198 5210 +> 15 0 24 1190 topology 1198 5211 +> 16 0 24 1190 topology 1360 5211 +> 15 0 23 1190 topology 1209 5212 +> 16 0 23 1190 topology 1210 5212 +> 15 0 24 1190 topology 1210 5213 +> 16 0 24 1190 topology 1360 5213 +> 15 0 23 1190 topology 1218 5214 +> 16 0 23 1190 topology 1219 5214 +> 15 0 24 1190 topology 1219 5215 +> 16 0 24 1190 topology 1360 5215 +> 15 0 23 1190 topology 1278 5216 +> 16 0 23 1190 topology 1279 5216 +> 15 0 24 1190 topology 1279 5217 +> 16 0 24 1190 topology 1360 5217 +> 15 0 23 1190 topology 1254 5218 +> 16 0 23 1190 topology 1255 5218 +> 15 0 24 1190 topology 1255 5219 +> 16 0 24 1190 topology 1360 5219 +> 15 0 23 1190 topology 1230 5220 +> 16 0 23 1190 topology 1231 5220 +> 15 0 24 1190 topology 1231 5221 +> 16 0 24 1190 topology 1360 5221 +> 15 0 23 1190 topology 1338 5222 +> 16 0 23 1190 topology 1339 5222 +> 15 0 24 1190 topology 1339 5223 +> 16 0 24 1190 topology 1360 5223 +> 15 0 23 1190 topology 1314 5224 +> 16 0 23 1190 topology 1315 5224 +> 15 0 24 1190 topology 1315 5225 +> 16 0 24 1190 topology 1360 5225 +> 15 0 23 1190 topology 1290 5226 +> 16 0 23 1190 topology 1291 5226 +> 15 0 24 1190 topology 1291 5227 +> 16 0 24 1190 topology 1360 5227 +> 15 0 23 1190 topology 1266 5228 +> 16 0 23 1190 topology 1267 5228 +> 15 0 24 1190 topology 1267 5229 +> 16 0 24 1190 topology 1360 5229 +> 15 0 23 1190 topology 1242 5230 +> 16 0 23 1190 topology 1243 5230 +> 15 0 24 1190 topology 1243 5231 +> 16 0 24 1190 topology 1360 5231 +> 15 0 23 1190 topology 1350 5232 +> 16 0 23 1190 topology 1351 5232 +> 15 0 24 1190 topology 1351 5233 +> 16 0 24 1190 topology 1360 5233 +> 15 0 23 1190 topology 1326 5234 +> 16 0 23 1190 topology 1327 5234 +> 15 0 24 1190 topology 1327 5235 +> 16 0 24 1190 topology 1360 5235 +> 15 0 23 1190 topology 1302 5236 +> 16 0 23 1190 topology 1303 5236 +> 15 0 24 1190 topology 1303 5237 +> 16 0 24 1190 topology 1360 5237 +> 15 0 23 1190 topology 1200 5238 +> 16 0 23 1190 topology 1201 5238 +> 15 0 24 1190 topology 1201 5239 +> 16 0 24 1190 topology 1360 5239 +> 15 0 23 1190 topology 1212 5240 +> 16 0 23 1190 topology 1213 5240 +> 15 0 24 1190 topology 1213 5241 +> 16 0 24 1190 topology 1360 5241 +> 15 0 27 1189 topology 1600 5242 +> 16 0 27 1189 topology 1602 5242 +> 15 0 28 1189 topology 1602 5243 +> 16 0 28 1189 topology 1604 5243 +> 15 0 21 1189 topology 1602 5244 +> 16 0 21 1189 topology 1361 5244 +> 15 0 28 1189 topology 1361 5245 +> 16 0 28 1189 topology 1359 5245 +> 15 0 27 1189 topology 1604 5246 +> 16 0 27 1189 topology 1361 5246 +> 15 0 23 1016 topology 1059 5247 +> 16 0 23 1016 topology 1060 5247 +> 15 0 24 1016 topology 1060 5248 +> 16 0 24 1016 topology 1156 5248 +> 15 0 24 1016 topology 1156 5249 +> 16 0 24 1016 topology 1124 5249 +> 15 0 25 1016 topology 1124 5250 +> 16 0 25 1016 topology 1122 5250 +> 15 0 24 1016 topology 1156 5251 +> 16 0 24 1016 topology 1073 5251 +> 15 0 25 1016 topology 1073 5252 +> 16 0 25 1016 topology 1071 5252 +> 15 0 24 1016 topology 1156 5253 +> 16 0 24 1016 topology 1019 5253 +> 15 0 25 1016 topology 1019 5254 +> 16 0 25 1016 topology 1017 5254 +> 15 0 24 1016 topology 1156 5255 +> 16 0 24 1016 topology 1031 5255 +> 15 0 25 1016 topology 1031 5256 +> 16 0 25 1016 topology 1029 5256 +> 15 0 24 1016 topology 1156 5257 +> 16 0 24 1016 topology 1043 5257 +> 15 0 25 1016 topology 1043 5258 +> 16 0 25 1016 topology 1041 5258 +> 15 0 26 1016 topology 1156 5259 +> 16 0 26 1016 topology 1155 5259 +> 15 0 24 1016 topology 1156 5260 +> 16 0 24 1016 topology 1076 5260 +> 15 0 25 1016 topology 1076 5261 +> 16 0 25 1016 topology 1074 5261 +> 15 0 24 1016 topology 1156 5262 +> 16 0 24 1016 topology 1139 5262 +> 15 0 25 1016 topology 1139 5263 +> 16 0 25 1016 topology 1137 5263 +> 15 0 24 1016 topology 1156 5264 +> 16 0 24 1016 topology 1088 5264 +> 15 0 25 1016 topology 1088 5265 +> 16 0 25 1016 topology 1086 5265 +> 15 0 24 1016 topology 1156 5266 +> 16 0 24 1016 topology 1151 5266 +> 15 0 25 1016 topology 1151 5267 +> 16 0 25 1016 topology 1149 5267 +> 15 0 24 1016 topology 1156 5268 +> 16 0 24 1016 topology 1100 5268 +> 15 0 25 1016 topology 1100 5269 +> 16 0 25 1016 topology 1098 5269 +> 15 0 24 1016 topology 1156 5270 +> 16 0 24 1016 topology 1052 5270 +> 15 0 25 1016 topology 1052 5271 +> 16 0 25 1016 topology 1050 5271 +> 15 0 24 1016 topology 1156 5272 +> 16 0 24 1016 topology 1115 5272 +> 15 0 25 1016 topology 1115 5273 +> 16 0 25 1016 topology 1113 5273 +> 15 0 24 1016 topology 1156 5274 +> 16 0 24 1016 topology 1064 5274 +> 15 0 25 1016 topology 1064 5275 +> 16 0 25 1016 topology 1062 5275 +> 15 0 24 1016 topology 1156 5276 +> 16 0 24 1016 topology 1127 5276 +> 15 0 25 1016 topology 1127 5277 +> 16 0 25 1016 topology 1125 5277 +> 15 0 24 1016 topology 1156 5278 +> 16 0 24 1016 topology 1022 5278 +> 15 0 25 1016 topology 1022 5279 +> 16 0 25 1016 topology 1020 5279 +> 15 0 24 1016 topology 1156 5280 +> 16 0 24 1016 topology 1034 5280 +> 15 0 25 1016 topology 1034 5281 +> 16 0 25 1016 topology 1032 5281 +> 15 0 24 1016 topology 1156 5282 +> 16 0 24 1016 topology 1079 5282 +> 15 0 25 1016 topology 1079 5283 +> 16 0 25 1016 topology 1077 5283 +> 15 0 24 1016 topology 1156 5284 +> 16 0 24 1016 topology 1142 5284 +> 15 0 25 1016 topology 1142 5285 +> 16 0 25 1016 topology 1140 5285 +> 15 0 24 1016 topology 1156 5286 +> 16 0 24 1016 topology 1091 5286 +> 15 0 25 1016 topology 1091 5287 +> 16 0 25 1016 topology 1089 5287 +> 15 0 24 1016 topology 1156 5288 +> 16 0 24 1016 topology 1154 5288 +> 15 0 25 1016 topology 1154 5289 +> 16 0 25 1016 topology 1152 5289 +> 15 0 24 1016 topology 1156 5290 +> 16 0 24 1016 topology 1103 5290 +> 15 0 25 1016 topology 1103 5291 +> 16 0 25 1016 topology 1101 5291 +> 15 0 24 1016 topology 1156 5292 +> 16 0 24 1016 topology 1106 5292 +> 15 0 25 1016 topology 1106 5293 +> 16 0 25 1016 topology 1104 5293 +> 15 0 24 1016 topology 1156 5294 +> 16 0 24 1016 topology 1055 5294 +> 15 0 25 1016 topology 1055 5295 +> 16 0 25 1016 topology 1053 5295 +> 15 0 24 1016 topology 1156 5296 +> 16 0 24 1016 topology 1118 5296 +> 15 0 25 1016 topology 1118 5297 +> 16 0 25 1016 topology 1116 5297 +> 15 0 24 1016 topology 1156 5298 +> 16 0 24 1016 topology 1067 5298 +> 15 0 25 1016 topology 1067 5299 +> 16 0 25 1016 topology 1065 5299 +> 15 0 24 1016 topology 1156 5300 +> 16 0 24 1016 topology 1130 5300 +> 15 0 25 1016 topology 1130 5301 +> 16 0 25 1016 topology 1128 5301 +> 15 0 24 1016 topology 1156 5302 +> 16 0 24 1016 topology 1025 5302 +> 15 0 25 1016 topology 1025 5303 +> 16 0 25 1016 topology 1023 5303 +> 15 0 24 1016 topology 1156 5304 +> 16 0 24 1016 topology 1037 5304 +> 15 0 25 1016 topology 1037 5305 +> 16 0 25 1016 topology 1035 5305 +> 15 0 24 1016 topology 1156 5306 +> 16 0 24 1016 topology 1082 5306 +> 15 0 25 1016 topology 1082 5307 +> 16 0 25 1016 topology 1080 5307 +> 15 0 24 1016 topology 1156 5308 +> 16 0 24 1016 topology 1145 5308 +> 15 0 25 1016 topology 1145 5309 +> 16 0 25 1016 topology 1143 5309 +> 15 0 24 1016 topology 1156 5310 +> 16 0 24 1016 topology 1094 5310 +> 15 0 25 1016 topology 1094 5311 +> 16 0 25 1016 topology 1092 5311 +> 15 0 24 1016 topology 1156 5312 +> 16 0 24 1016 topology 1046 5312 +> 15 0 25 1016 topology 1046 5313 +> 16 0 25 1016 topology 1044 5313 +> 15 0 24 1016 topology 1156 5314 +> 16 0 24 1016 topology 1109 5314 +> 15 0 25 1016 topology 1109 5315 +> 16 0 25 1016 topology 1107 5315 +> 15 0 24 1016 topology 1156 5316 +> 16 0 24 1016 topology 1058 5316 +> 15 0 25 1016 topology 1058 5317 +> 16 0 25 1016 topology 1056 5317 +> 15 0 24 1016 topology 1156 5318 +> 16 0 24 1016 topology 1121 5318 +> 15 0 25 1016 topology 1121 5319 +> 16 0 25 1016 topology 1119 5319 +> 15 0 24 1016 topology 1156 5320 +> 16 0 24 1016 topology 1070 5320 +> 15 0 25 1016 topology 1070 5321 +> 16 0 25 1016 topology 1068 5321 +> 15 0 24 1016 topology 1156 5322 +> 16 0 24 1016 topology 1133 5322 +> 15 0 25 1016 topology 1133 5323 +> 16 0 25 1016 topology 1131 5323 +> 15 0 24 1016 topology 1156 5324 +> 16 0 24 1016 topology 1028 5324 +> 15 0 25 1016 topology 1028 5325 +> 16 0 25 1016 topology 1026 5325 +> 15 0 24 1016 topology 1156 5326 +> 16 0 24 1016 topology 1040 5326 +> 15 0 25 1016 topology 1040 5327 +> 16 0 25 1016 topology 1038 5327 +> 15 0 24 1016 topology 1156 5328 +> 16 0 24 1016 topology 1136 5328 +> 15 0 25 1016 topology 1136 5329 +> 16 0 25 1016 topology 1134 5329 +> 15 0 24 1016 topology 1156 5330 +> 16 0 24 1016 topology 1085 5330 +> 15 0 25 1016 topology 1085 5331 +> 16 0 25 1016 topology 1083 5331 +> 15 0 24 1016 topology 1156 5332 +> 16 0 24 1016 topology 1148 5332 +> 15 0 25 1016 topology 1148 5333 +> 16 0 25 1016 topology 1146 5333 +> 15 0 24 1016 topology 1156 5334 +> 16 0 24 1016 topology 1097 5334 +> 15 0 25 1016 topology 1097 5335 +> 16 0 25 1016 topology 1095 5335 +> 15 0 24 1016 topology 1156 5336 +> 16 0 24 1016 topology 1049 5336 +> 15 0 25 1016 topology 1049 5337 +> 16 0 25 1016 topology 1047 5337 +> 15 0 24 1016 topology 1156 5338 +> 16 0 24 1016 topology 1112 5338 +> 15 0 25 1016 topology 1112 5339 +> 16 0 25 1016 topology 1110 5339 +> 15 0 23 1016 topology 1122 5340 +> 16 0 23 1016 topology 1123 5340 +> 15 0 24 1016 topology 1123 5341 +> 16 0 24 1016 topology 1156 5341 +> 15 0 24 1016 topology 1156 5342 +> 16 0 24 1016 topology 1061 5342 +> 15 0 25 1016 topology 1061 5343 +> 16 0 25 1016 topology 1059 5343 +> 15 0 23 1016 topology 1071 5344 +> 16 0 23 1016 topology 1072 5344 +> 15 0 24 1016 topology 1072 5345 +> 16 0 24 1016 topology 1156 5345 +> 15 0 23 1016 topology 1017 5346 +> 16 0 23 1016 topology 1018 5346 +> 15 0 24 1016 topology 1018 5347 +> 16 0 24 1016 topology 1156 5347 +> 15 0 23 1016 topology 1029 5348 +> 16 0 23 1016 topology 1030 5348 +> 15 0 24 1016 topology 1030 5349 +> 16 0 24 1016 topology 1156 5349 +> 15 0 23 1016 topology 1041 5350 +> 16 0 23 1016 topology 1042 5350 +> 15 0 24 1016 topology 1042 5351 +> 16 0 24 1016 topology 1156 5351 +> 15 0 23 1016 topology 1074 5352 +> 16 0 23 1016 topology 1075 5352 +> 15 0 24 1016 topology 1075 5353 +> 16 0 24 1016 topology 1156 5353 +> 15 0 23 1016 topology 1137 5354 +> 16 0 23 1016 topology 1138 5354 +> 15 0 24 1016 topology 1138 5355 +> 16 0 24 1016 topology 1156 5355 +> 15 0 23 1016 topology 1086 5356 +> 16 0 23 1016 topology 1087 5356 +> 15 0 24 1016 topology 1087 5357 +> 16 0 24 1016 topology 1156 5357 +> 15 0 23 1016 topology 1149 5358 +> 16 0 23 1016 topology 1150 5358 +> 15 0 24 1016 topology 1150 5359 +> 16 0 24 1016 topology 1156 5359 +> 15 0 23 1016 topology 1098 5360 +> 16 0 23 1016 topology 1099 5360 +> 15 0 24 1016 topology 1099 5361 +> 16 0 24 1016 topology 1156 5361 +> 15 0 23 1016 topology 1050 5362 +> 16 0 23 1016 topology 1051 5362 +> 15 0 24 1016 topology 1051 5363 +> 16 0 24 1016 topology 1156 5363 +> 15 0 23 1016 topology 1113 5364 +> 16 0 23 1016 topology 1114 5364 +> 15 0 24 1016 topology 1114 5365 +> 16 0 24 1016 topology 1156 5365 +> 15 0 23 1016 topology 1062 5366 +> 16 0 23 1016 topology 1063 5366 +> 15 0 24 1016 topology 1063 5367 +> 16 0 24 1016 topology 1156 5367 +> 15 0 23 1016 topology 1125 5368 +> 16 0 23 1016 topology 1126 5368 +> 15 0 24 1016 topology 1126 5369 +> 16 0 24 1016 topology 1156 5369 +> 15 0 23 1016 topology 1020 5370 +> 16 0 23 1016 topology 1021 5370 +> 15 0 24 1016 topology 1021 5371 +> 16 0 24 1016 topology 1156 5371 +> 15 0 23 1016 topology 1032 5372 +> 16 0 23 1016 topology 1033 5372 +> 15 0 24 1016 topology 1033 5373 +> 16 0 24 1016 topology 1156 5373 +> 15 0 23 1016 topology 1077 5374 +> 16 0 23 1016 topology 1078 5374 +> 15 0 24 1016 topology 1078 5375 +> 16 0 24 1016 topology 1156 5375 +> 15 0 23 1016 topology 1140 5376 +> 16 0 23 1016 topology 1141 5376 +> 15 0 24 1016 topology 1141 5377 +> 16 0 24 1016 topology 1156 5377 +> 15 0 23 1016 topology 1089 5378 +> 16 0 23 1016 topology 1090 5378 +> 15 0 24 1016 topology 1090 5379 +> 16 0 24 1016 topology 1156 5379 +> 15 0 23 1016 topology 1152 5380 +> 16 0 23 1016 topology 1153 5380 +> 15 0 24 1016 topology 1153 5381 +> 16 0 24 1016 topology 1156 5381 +> 15 0 23 1016 topology 1101 5382 +> 16 0 23 1016 topology 1102 5382 +> 15 0 24 1016 topology 1102 5383 +> 16 0 24 1016 topology 1156 5383 +> 15 0 23 1016 topology 1104 5384 +> 16 0 23 1016 topology 1105 5384 +> 15 0 24 1016 topology 1105 5385 +> 16 0 24 1016 topology 1156 5385 +> 15 0 23 1016 topology 1053 5386 +> 16 0 23 1016 topology 1054 5386 +> 15 0 24 1016 topology 1054 5387 +> 16 0 24 1016 topology 1156 5387 +> 15 0 23 1016 topology 1116 5388 +> 16 0 23 1016 topology 1117 5388 +> 15 0 24 1016 topology 1117 5389 +> 16 0 24 1016 topology 1156 5389 +> 15 0 23 1016 topology 1065 5390 +> 16 0 23 1016 topology 1066 5390 +> 15 0 24 1016 topology 1066 5391 +> 16 0 24 1016 topology 1156 5391 +> 15 0 23 1016 topology 1128 5392 +> 16 0 23 1016 topology 1129 5392 +> 15 0 24 1016 topology 1129 5393 +> 16 0 24 1016 topology 1156 5393 +> 15 0 23 1016 topology 1023 5394 +> 16 0 23 1016 topology 1024 5394 +> 15 0 24 1016 topology 1024 5395 +> 16 0 24 1016 topology 1156 5395 +> 15 0 23 1016 topology 1035 5396 +> 16 0 23 1016 topology 1036 5396 +> 15 0 24 1016 topology 1036 5397 +> 16 0 24 1016 topology 1156 5397 +> 15 0 23 1016 topology 1080 5398 +> 16 0 23 1016 topology 1081 5398 +> 15 0 24 1016 topology 1081 5399 +> 16 0 24 1016 topology 1156 5399 +> 15 0 23 1016 topology 1143 5400 +> 16 0 23 1016 topology 1144 5400 +> 15 0 24 1016 topology 1144 5401 +> 16 0 24 1016 topology 1156 5401 +> 15 0 23 1016 topology 1092 5402 +> 16 0 23 1016 topology 1093 5402 +> 15 0 24 1016 topology 1093 5403 +> 16 0 24 1016 topology 1156 5403 +> 15 0 23 1016 topology 1044 5404 +> 16 0 23 1016 topology 1045 5404 +> 15 0 24 1016 topology 1045 5405 +> 16 0 24 1016 topology 1156 5405 +> 15 0 23 1016 topology 1107 5406 +> 16 0 23 1016 topology 1108 5406 +> 15 0 24 1016 topology 1108 5407 +> 16 0 24 1016 topology 1156 5407 +> 15 0 23 1016 topology 1056 5408 +> 16 0 23 1016 topology 1057 5408 +> 15 0 24 1016 topology 1057 5409 +> 16 0 24 1016 topology 1156 5409 +> 15 0 23 1016 topology 1119 5410 +> 16 0 23 1016 topology 1120 5410 +> 15 0 24 1016 topology 1120 5411 +> 16 0 24 1016 topology 1156 5411 +> 15 0 23 1016 topology 1068 5412 +> 16 0 23 1016 topology 1069 5412 +> 15 0 24 1016 topology 1069 5413 +> 16 0 24 1016 topology 1156 5413 +> 15 0 23 1016 topology 1131 5414 +> 16 0 23 1016 topology 1132 5414 +> 15 0 24 1016 topology 1132 5415 +> 16 0 24 1016 topology 1156 5415 +> 15 0 23 1016 topology 1026 5416 +> 16 0 23 1016 topology 1027 5416 +> 15 0 24 1016 topology 1027 5417 +> 16 0 24 1016 topology 1156 5417 +> 15 0 23 1016 topology 1038 5418 +> 16 0 23 1016 topology 1039 5418 +> 15 0 24 1016 topology 1039 5419 +> 16 0 24 1016 topology 1156 5419 +> 15 0 23 1016 topology 1134 5420 +> 16 0 23 1016 topology 1135 5420 +> 15 0 24 1016 topology 1135 5421 +> 16 0 24 1016 topology 1156 5421 +> 15 0 23 1016 topology 1083 5422 +> 16 0 23 1016 topology 1084 5422 +> 15 0 24 1016 topology 1084 5423 +> 16 0 24 1016 topology 1156 5423 +> 15 0 23 1016 topology 1146 5424 +> 16 0 23 1016 topology 1147 5424 +> 15 0 24 1016 topology 1147 5425 +> 16 0 24 1016 topology 1156 5425 +> 15 0 23 1016 topology 1095 5426 +> 16 0 23 1016 topology 1096 5426 +> 15 0 24 1016 topology 1096 5427 +> 16 0 24 1016 topology 1156 5427 +> 15 0 23 1016 topology 1047 5428 +> 16 0 23 1016 topology 1048 5428 +> 15 0 24 1016 topology 1048 5429 +> 16 0 24 1016 topology 1156 5429 +> 15 0 23 1016 topology 1110 5430 +> 16 0 23 1016 topology 1111 5430 +> 15 0 24 1016 topology 1111 5431 +> 16 0 24 1016 topology 1156 5431 +> 15 0 23 952 topology 989 5432 +> 16 0 23 952 topology 990 5432 +> 15 0 24 952 topology 990 5433 +> 16 0 24 952 topology 1014 5433 +> 15 0 24 952 topology 1014 5434 +> 16 0 24 952 topology 997 5434 +> 15 0 25 952 topology 997 5435 +> 16 0 25 952 topology 995 5435 +> 15 0 24 952 topology 1014 5436 +> 16 0 24 952 topology 1003 5436 +> 15 0 25 952 topology 1003 5437 +> 16 0 25 952 topology 1001 5437 +> 15 0 24 952 topology 1014 5438 +> 16 0 24 952 topology 1009 5438 +> 15 0 25 952 topology 1009 5439 +> 16 0 25 952 topology 1007 5439 +> 15 0 24 952 topology 1014 5440 +> 16 0 24 952 topology 1012 5440 +> 15 0 25 952 topology 1012 5441 +> 16 0 25 952 topology 1010 5441 +> 15 0 24 952 topology 1014 5442 +> 16 0 24 952 topology 955 5442 +> 15 0 25 952 topology 955 5443 +> 16 0 25 952 topology 953 5443 +> 15 0 24 952 topology 1014 5444 +> 16 0 24 952 topology 961 5444 +> 15 0 25 952 topology 961 5445 +> 16 0 25 952 topology 959 5445 +> 15 0 24 952 topology 1014 5446 +> 16 0 24 952 topology 967 5446 +> 15 0 25 952 topology 967 5447 +> 16 0 25 952 topology 965 5447 +> 15 0 24 952 topology 1014 5448 +> 16 0 24 952 topology 973 5448 +> 15 0 25 952 topology 973 5449 +> 16 0 25 952 topology 971 5449 +> 15 0 24 952 topology 1014 5450 +> 16 0 24 952 topology 979 5450 +> 15 0 25 952 topology 979 5451 +> 16 0 25 952 topology 977 5451 +> 15 0 24 952 topology 1014 5452 +> 16 0 24 952 topology 982 5452 +> 15 0 25 952 topology 982 5453 +> 16 0 25 952 topology 980 5453 +> 15 0 24 952 topology 1014 5454 +> 16 0 24 952 topology 988 5454 +> 15 0 25 952 topology 988 5455 +> 16 0 25 952 topology 986 5455 +> 15 0 24 952 topology 1014 5456 +> 16 0 24 952 topology 994 5456 +> 15 0 25 952 topology 994 5457 +> 16 0 25 952 topology 992 5457 +> 15 0 24 952 topology 1014 5458 +> 16 0 24 952 topology 1000 5458 +> 15 0 25 952 topology 1000 5459 +> 16 0 25 952 topology 998 5459 +> 15 0 24 952 topology 1014 5460 +> 16 0 24 952 topology 1006 5460 +> 15 0 25 952 topology 1006 5461 +> 16 0 25 952 topology 1004 5461 +> 15 0 26 952 topology 1014 5462 +> 16 0 26 952 topology 1013 5462 +> 15 0 24 952 topology 1014 5463 +> 16 0 24 952 topology 958 5463 +> 15 0 25 952 topology 958 5464 +> 16 0 25 952 topology 956 5464 +> 15 0 24 952 topology 1014 5465 +> 16 0 24 952 topology 964 5465 +> 15 0 25 952 topology 964 5466 +> 16 0 25 952 topology 962 5466 +> 15 0 24 952 topology 1014 5467 +> 16 0 24 952 topology 970 5467 +> 15 0 25 952 topology 970 5468 +> 16 0 25 952 topology 968 5468 +> 15 0 24 952 topology 1014 5469 +> 16 0 24 952 topology 976 5469 +> 15 0 25 952 topology 976 5470 +> 16 0 25 952 topology 974 5470 +> 15 0 24 952 topology 1014 5471 +> 16 0 24 952 topology 985 5471 +> 15 0 25 952 topology 985 5472 +> 16 0 25 952 topology 983 5472 +> 15 0 23 952 topology 995 5473 +> 16 0 23 952 topology 996 5473 +> 15 0 24 952 topology 996 5474 +> 16 0 24 952 topology 1014 5474 +> 15 0 24 952 topology 1014 5475 +> 16 0 24 952 topology 991 5475 +> 15 0 25 952 topology 991 5476 +> 16 0 25 952 topology 989 5476 +> 15 0 23 952 topology 1001 5477 +> 16 0 23 952 topology 1002 5477 +> 15 0 24 952 topology 1002 5478 +> 16 0 24 952 topology 1014 5478 +> 15 0 23 952 topology 1007 5479 +> 16 0 23 952 topology 1008 5479 +> 15 0 24 952 topology 1008 5480 +> 16 0 24 952 topology 1014 5480 +> 15 0 23 952 topology 1010 5481 +> 16 0 23 952 topology 1011 5481 +> 15 0 24 952 topology 1011 5482 +> 16 0 24 952 topology 1014 5482 +> 15 0 23 952 topology 953 5483 +> 16 0 23 952 topology 954 5483 +> 15 0 24 952 topology 954 5484 +> 16 0 24 952 topology 1014 5484 +> 15 0 23 952 topology 959 5485 +> 16 0 23 952 topology 960 5485 +> 15 0 24 952 topology 960 5486 +> 16 0 24 952 topology 1014 5486 +> 15 0 23 952 topology 965 5487 +> 16 0 23 952 topology 966 5487 +> 15 0 24 952 topology 966 5488 +> 16 0 24 952 topology 1014 5488 +> 15 0 23 952 topology 971 5489 +> 16 0 23 952 topology 972 5489 +> 15 0 24 952 topology 972 5490 +> 16 0 24 952 topology 1014 5490 +> 15 0 23 952 topology 977 5491 +> 16 0 23 952 topology 978 5491 +> 15 0 24 952 topology 978 5492 +> 16 0 24 952 topology 1014 5492 +> 15 0 23 952 topology 980 5493 +> 16 0 23 952 topology 981 5493 +> 15 0 24 952 topology 981 5494 +> 16 0 24 952 topology 1014 5494 +> 15 0 23 952 topology 986 5495 +> 16 0 23 952 topology 987 5495 +> 15 0 24 952 topology 987 5496 +> 16 0 24 952 topology 1014 5496 +> 15 0 23 952 topology 992 5497 +> 16 0 23 952 topology 993 5497 +> 15 0 24 952 topology 993 5498 +> 16 0 24 952 topology 1014 5498 +> 15 0 23 952 topology 998 5499 +> 16 0 23 952 topology 999 5499 +> 15 0 24 952 topology 999 5500 +> 16 0 24 952 topology 1014 5500 +> 15 0 23 952 topology 1004 5501 +> 16 0 23 952 topology 1005 5501 +> 15 0 24 952 topology 1005 5502 +> 16 0 24 952 topology 1014 5502 +> 15 0 23 952 topology 956 5503 +> 16 0 23 952 topology 957 5503 +> 15 0 24 952 topology 957 5504 +> 16 0 24 952 topology 1014 5504 +> 15 0 23 952 topology 962 5505 +> 16 0 23 952 topology 963 5505 +> 15 0 24 952 topology 963 5506 +> 16 0 24 952 topology 1014 5506 +> 15 0 23 952 topology 968 5507 +> 16 0 23 952 topology 969 5507 +> 15 0 24 952 topology 969 5508 +> 16 0 24 952 topology 1014 5508 +> 15 0 23 952 topology 974 5509 +> 16 0 23 952 topology 975 5509 +> 15 0 24 952 topology 975 5510 +> 16 0 24 952 topology 1014 5510 +> 15 0 23 952 topology 983 5511 +> 16 0 23 952 topology 984 5511 +> 15 0 24 952 topology 984 5512 +> 16 0 24 952 topology 1014 5512 +> 15 0 23 1158 topology 1159 5513 +> 16 0 23 1158 topology 1160 5513 +> 15 0 24 1158 topology 1160 5514 +> 16 0 24 1158 topology 1184 5514 +> 15 0 24 1158 topology 1184 5515 +> 16 0 24 1158 topology 1167 5515 +> 15 0 25 1158 topology 1167 5516 +> 16 0 25 1158 topology 1165 5516 +> 15 0 24 1158 topology 1184 5517 +> 16 0 24 1158 topology 1173 5517 +> 15 0 25 1158 topology 1173 5518 +> 16 0 25 1158 topology 1171 5518 +> 15 0 24 1158 topology 1184 5519 +> 16 0 24 1158 topology 1179 5519 +> 15 0 25 1158 topology 1179 5520 +> 16 0 25 1158 topology 1177 5520 +> 15 0 26 1158 topology 1184 5521 +> 16 0 26 1158 topology 1183 5521 +> 15 0 24 1158 topology 1184 5522 +> 16 0 24 1158 topology 1164 5522 +> 15 0 25 1158 topology 1164 5523 +> 16 0 25 1158 topology 1162 5523 +> 15 0 24 1158 topology 1184 5524 +> 16 0 24 1158 topology 1170 5524 +> 15 0 25 1158 topology 1170 5525 +> 16 0 25 1158 topology 1168 5525 +> 15 0 24 1158 topology 1184 5526 +> 16 0 24 1158 topology 1176 5526 +> 15 0 25 1158 topology 1176 5527 +> 16 0 25 1158 topology 1174 5527 +> 15 0 24 1158 topology 1184 5528 +> 16 0 24 1158 topology 1182 5528 +> 15 0 25 1158 topology 1182 5529 +> 16 0 25 1158 topology 1180 5529 +> 15 0 23 1158 topology 1165 5530 +> 16 0 23 1158 topology 1166 5530 +> 15 0 24 1158 topology 1166 5531 +> 16 0 24 1158 topology 1184 5531 +> 15 0 24 1158 topology 1184 5532 +> 16 0 24 1158 topology 1161 5532 +> 15 0 25 1158 topology 1161 5533 +> 16 0 25 1158 topology 1159 5533 +> 15 0 23 1158 topology 1171 5534 +> 16 0 23 1158 topology 1172 5534 +> 15 0 24 1158 topology 1172 5535 +> 16 0 24 1158 topology 1184 5535 +> 15 0 23 1158 topology 1177 5536 +> 16 0 23 1158 topology 1178 5536 +> 15 0 24 1158 topology 1178 5537 +> 16 0 24 1158 topology 1184 5537 +> 15 0 23 1158 topology 1162 5538 +> 16 0 23 1158 topology 1163 5538 +> 15 0 24 1158 topology 1163 5539 +> 16 0 24 1158 topology 1184 5539 +> 15 0 23 1158 topology 1168 5540 +> 16 0 23 1158 topology 1169 5540 +> 15 0 24 1158 topology 1169 5541 +> 16 0 24 1158 topology 1184 5541 +> 15 0 23 1158 topology 1174 5542 +> 16 0 23 1158 topology 1175 5542 +> 15 0 24 1158 topology 1175 5543 +> 16 0 24 1158 topology 1184 5543 +> 15 0 23 1158 topology 1180 5544 +> 16 0 23 1158 topology 1181 5544 +> 15 0 24 1158 topology 1181 5545 +> 16 0 24 1158 topology 1184 5545 +> 15 0 23 870 topology 931 5546 +> 16 0 23 870 topology 932 5546 +> 15 0 24 870 topology 932 5547 +> 16 0 24 870 topology 950 5547 +> 15 0 24 870 topology 950 5548 +> 16 0 24 870 topology 939 5548 +> 15 0 25 870 topology 939 5549 +> 16 0 25 870 topology 937 5549 +> 15 0 24 870 topology 950 5550 +> 16 0 24 870 topology 945 5550 +> 15 0 25 870 topology 945 5551 +> 16 0 25 870 topology 943 5551 +> 15 0 24 870 topology 950 5552 +> 16 0 24 870 topology 876 5552 +> 15 0 25 870 topology 876 5553 +> 16 0 25 870 topology 874 5553 +> 15 0 24 870 topology 950 5554 +> 16 0 24 870 topology 882 5554 +> 15 0 25 870 topology 882 5555 +> 16 0 25 870 topology 880 5555 +> 15 0 24 870 topology 950 5556 +> 16 0 24 870 topology 888 5556 +> 15 0 25 870 topology 888 5557 +> 16 0 25 870 topology 886 5557 +> 15 0 24 870 topology 950 5558 +> 16 0 24 870 topology 894 5558 +> 15 0 25 870 topology 894 5559 +> 16 0 25 870 topology 892 5559 +> 15 0 24 870 topology 950 5560 +> 16 0 24 870 topology 903 5560 +> 15 0 25 870 topology 903 5561 +> 16 0 25 870 topology 901 5561 +> 15 0 24 870 topology 950 5562 +> 16 0 24 870 topology 909 5562 +> 15 0 25 870 topology 909 5563 +> 16 0 25 870 topology 907 5563 +> 15 0 24 870 topology 950 5564 +> 16 0 24 870 topology 915 5564 +> 15 0 25 870 topology 915 5565 +> 16 0 25 870 topology 913 5565 +> 15 0 26 870 topology 950 5566 +> 16 0 26 870 topology 949 5566 +> 15 0 24 870 topology 950 5567 +> 16 0 24 870 topology 921 5567 +> 15 0 25 870 topology 921 5568 +> 16 0 25 870 topology 919 5568 +> 15 0 24 870 topology 950 5569 +> 16 0 24 870 topology 927 5569 +> 15 0 25 870 topology 927 5570 +> 16 0 25 870 topology 925 5570 +> 15 0 24 870 topology 950 5571 +> 16 0 24 870 topology 930 5571 +> 15 0 25 870 topology 930 5572 +> 16 0 25 870 topology 928 5572 +> 15 0 24 870 topology 950 5573 +> 16 0 24 870 topology 936 5573 +> 15 0 25 870 topology 936 5574 +> 16 0 25 870 topology 934 5574 +> 15 0 24 870 topology 950 5575 +> 16 0 24 870 topology 942 5575 +> 15 0 25 870 topology 942 5576 +> 16 0 25 870 topology 940 5576 +> 15 0 24 870 topology 950 5577 +> 16 0 24 870 topology 948 5577 +> 15 0 25 870 topology 948 5578 +> 16 0 25 870 topology 946 5578 +> 15 0 24 870 topology 950 5579 +> 16 0 24 870 topology 873 5579 +> 15 0 25 870 topology 873 5580 +> 16 0 25 870 topology 871 5580 +> 15 0 24 870 topology 950 5581 +> 16 0 24 870 topology 879 5581 +> 15 0 25 870 topology 879 5582 +> 16 0 25 870 topology 877 5582 +> 15 0 24 870 topology 950 5583 +> 16 0 24 870 topology 885 5583 +> 15 0 25 870 topology 885 5584 +> 16 0 25 870 topology 883 5584 +> 15 0 24 870 topology 950 5585 +> 16 0 24 870 topology 891 5585 +> 15 0 25 870 topology 891 5586 +> 16 0 25 870 topology 889 5586 +> 15 0 24 870 topology 950 5587 +> 16 0 24 870 topology 897 5587 +> 15 0 25 870 topology 897 5588 +> 16 0 25 870 topology 895 5588 +> 15 0 24 870 topology 950 5589 +> 16 0 24 870 topology 900 5589 +> 15 0 25 870 topology 900 5590 +> 16 0 25 870 topology 898 5590 +> 15 0 24 870 topology 950 5591 +> 16 0 24 870 topology 906 5591 +> 15 0 25 870 topology 906 5592 +> 16 0 25 870 topology 904 5592 +> 15 0 24 870 topology 950 5593 +> 16 0 24 870 topology 912 5593 +> 15 0 25 870 topology 912 5594 +> 16 0 25 870 topology 910 5594 +> 15 0 24 870 topology 950 5595 +> 16 0 24 870 topology 918 5595 +> 15 0 25 870 topology 918 5596 +> 16 0 25 870 topology 916 5596 +> 15 0 24 870 topology 950 5597 +> 16 0 24 870 topology 924 5597 +> 15 0 25 870 topology 924 5598 +> 16 0 25 870 topology 922 5598 +> 15 0 23 870 topology 937 5599 +> 16 0 23 870 topology 938 5599 +> 15 0 24 870 topology 938 5600 +> 16 0 24 870 topology 950 5600 +> 15 0 24 870 topology 950 5601 +> 16 0 24 870 topology 933 5601 +> 15 0 25 870 topology 933 5602 +> 16 0 25 870 topology 931 5602 +> 15 0 23 870 topology 943 5603 +> 16 0 23 870 topology 944 5603 +> 15 0 24 870 topology 944 5604 +> 16 0 24 870 topology 950 5604 +> 15 0 23 870 topology 874 5605 +> 16 0 23 870 topology 875 5605 +> 15 0 24 870 topology 875 5606 +> 16 0 24 870 topology 950 5606 +> 15 0 23 870 topology 880 5607 +> 16 0 23 870 topology 881 5607 +> 15 0 24 870 topology 881 5608 +> 16 0 24 870 topology 950 5608 +> 15 0 23 870 topology 886 5609 +> 16 0 23 870 topology 887 5609 +> 15 0 24 870 topology 887 5610 +> 16 0 24 870 topology 950 5610 +> 15 0 23 870 topology 892 5611 +> 16 0 23 870 topology 893 5611 +> 15 0 24 870 topology 893 5612 +> 16 0 24 870 topology 950 5612 +> 15 0 23 870 topology 901 5613 +> 16 0 23 870 topology 902 5613 +> 15 0 24 870 topology 902 5614 +> 16 0 24 870 topology 950 5614 +> 15 0 23 870 topology 907 5615 +> 16 0 23 870 topology 908 5615 +> 15 0 24 870 topology 908 5616 +> 16 0 24 870 topology 950 5616 +> 15 0 23 870 topology 913 5617 +> 16 0 23 870 topology 914 5617 +> 15 0 24 870 topology 914 5618 +> 16 0 24 870 topology 950 5618 +> 15 0 23 870 topology 919 5619 +> 16 0 23 870 topology 920 5619 +> 15 0 24 870 topology 920 5620 +> 16 0 24 870 topology 950 5620 +> 15 0 23 870 topology 925 5621 +> 16 0 23 870 topology 926 5621 +> 15 0 24 870 topology 926 5622 +> 16 0 24 870 topology 950 5622 +> 15 0 23 870 topology 928 5623 +> 16 0 23 870 topology 929 5623 +> 15 0 24 870 topology 929 5624 +> 16 0 24 870 topology 950 5624 +> 15 0 23 870 topology 934 5625 +> 16 0 23 870 topology 935 5625 +> 15 0 24 870 topology 935 5626 +> 16 0 24 870 topology 950 5626 +> 15 0 23 870 topology 940 5627 +> 16 0 23 870 topology 941 5627 +> 15 0 24 870 topology 941 5628 +> 16 0 24 870 topology 950 5628 +> 15 0 23 870 topology 946 5629 +> 16 0 23 870 topology 947 5629 +> 15 0 24 870 topology 947 5630 +> 16 0 24 870 topology 950 5630 +> 15 0 23 870 topology 871 5631 +> 16 0 23 870 topology 872 5631 +> 15 0 24 870 topology 872 5632 +> 16 0 24 870 topology 950 5632 +> 15 0 23 870 topology 877 5633 +> 16 0 23 870 topology 878 5633 +> 15 0 24 870 topology 878 5634 +> 16 0 24 870 topology 950 5634 +> 15 0 23 870 topology 883 5635 +> 16 0 23 870 topology 884 5635 +> 15 0 24 870 topology 884 5636 +> 16 0 24 870 topology 950 5636 +> 15 0 23 870 topology 889 5637 +> 16 0 23 870 topology 890 5637 +> 15 0 24 870 topology 890 5638 +> 16 0 24 870 topology 950 5638 +> 15 0 23 870 topology 895 5639 +> 16 0 23 870 topology 896 5639 +> 15 0 24 870 topology 896 5640 +> 16 0 24 870 topology 950 5640 +> 15 0 23 870 topology 898 5641 +> 16 0 23 870 topology 899 5641 +> 15 0 24 870 topology 899 5642 +> 16 0 24 870 topology 950 5642 +> 15 0 23 870 topology 904 5643 +> 16 0 23 870 topology 905 5643 +> 15 0 24 870 topology 905 5644 +> 16 0 24 870 topology 950 5644 +> 15 0 23 870 topology 910 5645 +> 16 0 23 870 topology 911 5645 +> 15 0 24 870 topology 911 5646 +> 16 0 24 870 topology 950 5646 +> 15 0 23 870 topology 916 5647 +> 16 0 23 870 topology 917 5647 +> 15 0 24 870 topology 917 5648 +> 16 0 24 870 topology 950 5648 +> 15 0 23 870 topology 922 5649 +> 16 0 23 870 topology 923 5649 +> 15 0 24 870 topology 923 5650 +> 16 0 24 870 topology 950 5650 +> 15 0 27 869 topology 1155 5651 +> 16 0 27 869 topology 1157 5651 +> 15 0 21 869 topology 1157 5652 +> 16 0 21 869 topology 1015 5652 +> 15 0 28 869 topology 1015 5653 +> 16 0 28 869 topology 1013 5653 +> 15 0 21 869 topology 1157 5654 +> 16 0 21 869 topology 1185 5654 +> 15 0 28 869 topology 1185 5655 +> 16 0 28 869 topology 1183 5655 +> 15 0 28 869 topology 1157 5656 +> 16 0 28 869 topology 1187 5656 +> 15 0 21 869 topology 1157 5657 +> 16 0 21 869 topology 951 5657 +> 15 0 28 869 topology 951 5658 +> 16 0 28 869 topology 949 5658 +> 15 0 21 869 topology 1015 5659 +> 16 0 21 869 topology 1185 5659 +> 15 0 28 869 topology 1015 5660 +> 16 0 28 869 topology 1187 5660 +> 15 0 21 869 topology 1015 5661 +> 16 0 21 869 topology 951 5661 +> 15 0 28 869 topology 1185 5662 +> 16 0 28 869 topology 1187 5662 +> 15 0 21 869 topology 1185 5663 +> 16 0 21 869 topology 951 5663 +> 15 0 27 869 topology 1187 5664 +> 16 0 27 869 topology 951 5664 +> 15 0 23 3922 topology 3989 5665 +> 16 0 23 3922 topology 3990 5665 +> 15 0 24 3922 topology 3990 5666 +> 16 0 24 3922 topology 4092 5666 +> 15 0 24 3922 topology 4092 5667 +> 16 0 24 3922 topology 4051 5667 +> 15 0 25 3922 topology 4051 5668 +> 16 0 25 3922 topology 4049 5668 +> 15 0 24 3922 topology 4092 5669 +> 16 0 24 3922 topology 3973 5669 +> 15 0 25 3922 topology 3973 5670 +> 16 0 25 3922 topology 3971 5670 +> 15 0 24 3922 topology 4092 5671 +> 16 0 24 3922 topology 4033 5671 +> 15 0 25 3922 topology 4033 5672 +> 16 0 25 3922 topology 4031 5672 +> 15 0 24 3922 topology 4092 5673 +> 16 0 24 3922 topology 3931 5673 +> 15 0 25 3922 topology 3931 5674 +> 16 0 25 3922 topology 3929 5674 +> 15 0 24 3922 topology 4092 5675 +> 16 0 24 3922 topology 3958 5675 +> 15 0 25 3922 topology 3958 5676 +> 16 0 25 3922 topology 3956 5676 +> 15 0 24 3922 topology 4092 5677 +> 16 0 24 3922 topology 4018 5677 +> 15 0 25 3922 topology 4018 5678 +> 16 0 25 3922 topology 4016 5678 +> 15 0 24 3922 topology 4092 5679 +> 16 0 24 3922 topology 4078 5679 +> 15 0 25 3922 topology 4078 5680 +> 16 0 25 3922 topology 4076 5680 +> 15 0 24 3922 topology 4092 5681 +> 16 0 24 3922 topology 4000 5681 +> 15 0 25 3922 topology 4000 5682 +> 16 0 25 3922 topology 3998 5682 +> 15 0 24 3922 topology 4092 5683 +> 16 0 24 3922 topology 4060 5683 +> 15 0 25 3922 topology 4060 5684 +> 16 0 25 3922 topology 4058 5684 +> 15 0 24 3922 topology 4092 5685 +> 16 0 24 3922 topology 3940 5685 +> 15 0 25 3922 topology 3940 5686 +> 16 0 25 3922 topology 3938 5686 +> 15 0 24 3922 topology 4092 5687 +> 16 0 24 3922 topology 3985 5687 +> 15 0 25 3922 topology 3985 5688 +> 16 0 25 3922 topology 3983 5688 +> 15 0 24 3922 topology 4092 5689 +> 16 0 24 3922 topology 4045 5689 +> 15 0 25 3922 topology 4045 5690 +> 16 0 25 3922 topology 4043 5690 +> 15 0 24 3922 topology 4092 5691 +> 16 0 24 3922 topology 3967 5691 +> 15 0 25 3922 topology 3967 5692 +> 16 0 25 3922 topology 3965 5692 +> 15 0 24 3922 topology 4092 5693 +> 16 0 24 3922 topology 4027 5693 +> 15 0 25 3922 topology 4027 5694 +> 16 0 25 3922 topology 4025 5694 +> 15 0 24 3922 topology 4092 5695 +> 16 0 24 3922 topology 4087 5695 +> 15 0 25 3922 topology 4087 5696 +> 16 0 25 3922 topology 4085 5696 +> 15 0 24 3922 topology 4092 5697 +> 16 0 24 3922 topology 4009 5697 +> 15 0 25 3922 topology 4009 5698 +> 16 0 25 3922 topology 4007 5698 +> 15 0 24 3922 topology 4092 5699 +> 16 0 24 3922 topology 4069 5699 +> 15 0 25 3922 topology 4069 5700 +> 16 0 25 3922 topology 4067 5700 +> 15 0 24 3922 topology 4092 5701 +> 16 0 24 3922 topology 3925 5701 +> 15 0 25 3922 topology 3925 5702 +> 16 0 25 3922 topology 3923 5702 +> 15 0 24 3922 topology 4092 5703 +> 16 0 24 3922 topology 3949 5703 +> 15 0 25 3922 topology 3949 5704 +> 16 0 25 3922 topology 3947 5704 +> 15 0 24 3922 topology 4092 5705 +> 16 0 24 3922 topology 3952 5705 +> 15 0 25 3922 topology 3952 5706 +> 16 0 25 3922 topology 3950 5706 +> 15 0 24 3922 topology 4092 5707 +> 16 0 24 3922 topology 4012 5707 +> 15 0 25 3922 topology 4012 5708 +> 16 0 25 3922 topology 4010 5708 +> 15 0 24 3922 topology 4092 5709 +> 16 0 24 3922 topology 4072 5709 +> 15 0 25 3922 topology 4072 5710 +> 16 0 25 3922 topology 4070 5710 +> 15 0 24 3922 topology 4092 5711 +> 16 0 24 3922 topology 3994 5711 +> 15 0 25 3922 topology 3994 5712 +> 16 0 25 3922 topology 3992 5712 +> 15 0 24 3922 topology 4092 5713 +> 16 0 24 3922 topology 4054 5713 +> 15 0 25 3922 topology 4054 5714 +> 16 0 25 3922 topology 4052 5714 +> 15 0 24 3922 topology 4092 5715 +> 16 0 24 3922 topology 3976 5715 +> 15 0 25 3922 topology 3976 5716 +> 16 0 25 3922 topology 3974 5716 +> 15 0 24 3922 topology 4092 5717 +> 16 0 24 3922 topology 4036 5717 +> 15 0 25 3922 topology 4036 5718 +> 16 0 25 3922 topology 4034 5718 +> 15 0 24 3922 topology 4092 5719 +> 16 0 24 3922 topology 3934 5719 +> 15 0 25 3922 topology 3934 5720 +> 16 0 25 3922 topology 3932 5720 +> 15 0 24 3922 topology 4092 5721 +> 16 0 24 3922 topology 3961 5721 +> 15 0 25 3922 topology 3961 5722 +> 16 0 25 3922 topology 3959 5722 +> 15 0 24 3922 topology 4092 5723 +> 16 0 24 3922 topology 4021 5723 +> 15 0 25 3922 topology 4021 5724 +> 16 0 25 3922 topology 4019 5724 +> 15 0 24 3922 topology 4092 5725 +> 16 0 24 3922 topology 4081 5725 +> 15 0 25 3922 topology 4081 5726 +> 16 0 25 3922 topology 4079 5726 +> 15 0 24 3922 topology 4092 5727 +> 16 0 24 3922 topology 4003 5727 +> 15 0 25 3922 topology 4003 5728 +> 16 0 25 3922 topology 4001 5728 +> 15 0 24 3922 topology 4092 5729 +> 16 0 24 3922 topology 4063 5729 +> 15 0 25 3922 topology 4063 5730 +> 16 0 25 3922 topology 4061 5730 +> 15 0 24 3922 topology 4092 5731 +> 16 0 24 3922 topology 3943 5731 +> 15 0 25 3922 topology 3943 5732 +> 16 0 25 3922 topology 3941 5732 +> 15 0 24 3922 topology 4092 5733 +> 16 0 24 3922 topology 3988 5733 +> 15 0 25 3922 topology 3988 5734 +> 16 0 25 3922 topology 3986 5734 +> 15 0 24 3922 topology 4092 5735 +> 16 0 24 3922 topology 4048 5735 +> 15 0 25 3922 topology 4048 5736 +> 16 0 25 3922 topology 4046 5736 +> 15 0 24 3922 topology 4092 5737 +> 16 0 24 3922 topology 3970 5737 +> 15 0 25 3922 topology 3970 5738 +> 16 0 25 3922 topology 3968 5738 +> 15 0 24 3922 topology 4092 5739 +> 16 0 24 3922 topology 4030 5739 +> 15 0 25 3922 topology 4030 5740 +> 16 0 25 3922 topology 4028 5740 +> 15 0 24 3922 topology 4092 5741 +> 16 0 24 3922 topology 4090 5741 +> 15 0 25 3922 topology 4090 5742 +> 16 0 25 3922 topology 4088 5742 +> 15 0 24 3922 topology 4092 5743 +> 16 0 24 3922 topology 3928 5743 +> 15 0 25 3922 topology 3928 5744 +> 16 0 25 3922 topology 3926 5744 +> 15 0 26 3922 topology 4092 5745 +> 16 0 26 3922 topology 4091 5745 +> 15 0 24 3922 topology 4092 5746 +> 16 0 24 3922 topology 3955 5746 +> 15 0 25 3922 topology 3955 5747 +> 16 0 25 3922 topology 3953 5747 +> 15 0 24 3922 topology 4092 5748 +> 16 0 24 3922 topology 4015 5748 +> 15 0 25 3922 topology 4015 5749 +> 16 0 25 3922 topology 4013 5749 +> 15 0 24 3922 topology 4092 5750 +> 16 0 24 3922 topology 4075 5750 +> 15 0 25 3922 topology 4075 5751 +> 16 0 25 3922 topology 4073 5751 +> 15 0 24 3922 topology 4092 5752 +> 16 0 24 3922 topology 3997 5752 +> 15 0 25 3922 topology 3997 5753 +> 16 0 25 3922 topology 3995 5753 +> 15 0 24 3922 topology 4092 5754 +> 16 0 24 3922 topology 4057 5754 +> 15 0 25 3922 topology 4057 5755 +> 16 0 25 3922 topology 4055 5755 +> 15 0 24 3922 topology 4092 5756 +> 16 0 24 3922 topology 3979 5756 +> 15 0 25 3922 topology 3979 5757 +> 16 0 25 3922 topology 3977 5757 +> 15 0 24 3922 topology 4092 5758 +> 16 0 24 3922 topology 4039 5758 +> 15 0 25 3922 topology 4039 5759 +> 16 0 25 3922 topology 4037 5759 +> 15 0 24 3922 topology 4092 5760 +> 16 0 24 3922 topology 3937 5760 +> 15 0 25 3922 topology 3937 5761 +> 16 0 25 3922 topology 3935 5761 +> 15 0 24 3922 topology 4092 5762 +> 16 0 24 3922 topology 3982 5762 +> 15 0 25 3922 topology 3982 5763 +> 16 0 25 3922 topology 3980 5763 +> 15 0 24 3922 topology 4092 5764 +> 16 0 24 3922 topology 4042 5764 +> 15 0 25 3922 topology 4042 5765 +> 16 0 25 3922 topology 4040 5765 +> 15 0 24 3922 topology 4092 5766 +> 16 0 24 3922 topology 3964 5766 +> 15 0 25 3922 topology 3964 5767 +> 16 0 25 3922 topology 3962 5767 +> 15 0 24 3922 topology 4092 5768 +> 16 0 24 3922 topology 4024 5768 +> 15 0 25 3922 topology 4024 5769 +> 16 0 25 3922 topology 4022 5769 +> 15 0 24 3922 topology 4092 5770 +> 16 0 24 3922 topology 4084 5770 +> 15 0 25 3922 topology 4084 5771 +> 16 0 25 3922 topology 4082 5771 +> 15 0 24 3922 topology 4092 5772 +> 16 0 24 3922 topology 4006 5772 +> 15 0 25 3922 topology 4006 5773 +> 16 0 25 3922 topology 4004 5773 +> 15 0 24 3922 topology 4092 5774 +> 16 0 24 3922 topology 4066 5774 +> 15 0 25 3922 topology 4066 5775 +> 16 0 25 3922 topology 4064 5775 +> 15 0 24 3922 topology 4092 5776 +> 16 0 24 3922 topology 3946 5776 +> 15 0 25 3922 topology 3946 5777 +> 16 0 25 3922 topology 3944 5777 +> 15 0 23 3922 topology 4049 5778 +> 16 0 23 3922 topology 4050 5778 +> 15 0 24 3922 topology 4050 5779 +> 16 0 24 3922 topology 4092 5779 +> 15 0 24 3922 topology 4092 5780 +> 16 0 24 3922 topology 3991 5780 +> 15 0 25 3922 topology 3991 5781 +> 16 0 25 3922 topology 3989 5781 +> 15 0 23 3922 topology 3971 5782 +> 16 0 23 3922 topology 3972 5782 +> 15 0 24 3922 topology 3972 5783 +> 16 0 24 3922 topology 4092 5783 +> 15 0 23 3922 topology 4031 5784 +> 16 0 23 3922 topology 4032 5784 +> 15 0 24 3922 topology 4032 5785 +> 16 0 24 3922 topology 4092 5785 +> 15 0 23 3922 topology 3929 5786 +> 16 0 23 3922 topology 3930 5786 +> 15 0 24 3922 topology 3930 5787 +> 16 0 24 3922 topology 4092 5787 +> 15 0 23 3922 topology 3956 5788 +> 16 0 23 3922 topology 3957 5788 +> 15 0 24 3922 topology 3957 5789 +> 16 0 24 3922 topology 4092 5789 +> 15 0 23 3922 topology 4016 5790 +> 16 0 23 3922 topology 4017 5790 +> 15 0 24 3922 topology 4017 5791 +> 16 0 24 3922 topology 4092 5791 +> 15 0 23 3922 topology 4076 5792 +> 16 0 23 3922 topology 4077 5792 +> 15 0 24 3922 topology 4077 5793 +> 16 0 24 3922 topology 4092 5793 +> 15 0 23 3922 topology 3998 5794 +> 16 0 23 3922 topology 3999 5794 +> 15 0 24 3922 topology 3999 5795 +> 16 0 24 3922 topology 4092 5795 +> 15 0 23 3922 topology 4058 5796 +> 16 0 23 3922 topology 4059 5796 +> 15 0 24 3922 topology 4059 5797 +> 16 0 24 3922 topology 4092 5797 +> 15 0 23 3922 topology 3938 5798 +> 16 0 23 3922 topology 3939 5798 +> 15 0 24 3922 topology 3939 5799 +> 16 0 24 3922 topology 4092 5799 +> 15 0 23 3922 topology 3983 5800 +> 16 0 23 3922 topology 3984 5800 +> 15 0 24 3922 topology 3984 5801 +> 16 0 24 3922 topology 4092 5801 +> 15 0 23 3922 topology 4043 5802 +> 16 0 23 3922 topology 4044 5802 +> 15 0 24 3922 topology 4044 5803 +> 16 0 24 3922 topology 4092 5803 +> 15 0 23 3922 topology 3965 5804 +> 16 0 23 3922 topology 3966 5804 +> 15 0 24 3922 topology 3966 5805 +> 16 0 24 3922 topology 4092 5805 +> 15 0 23 3922 topology 4025 5806 +> 16 0 23 3922 topology 4026 5806 +> 15 0 24 3922 topology 4026 5807 +> 16 0 24 3922 topology 4092 5807 +> 15 0 23 3922 topology 4085 5808 +> 16 0 23 3922 topology 4086 5808 +> 15 0 24 3922 topology 4086 5809 +> 16 0 24 3922 topology 4092 5809 +> 15 0 23 3922 topology 4007 5810 +> 16 0 23 3922 topology 4008 5810 +> 15 0 24 3922 topology 4008 5811 +> 16 0 24 3922 topology 4092 5811 +> 15 0 23 3922 topology 4067 5812 +> 16 0 23 3922 topology 4068 5812 +> 15 0 24 3922 topology 4068 5813 +> 16 0 24 3922 topology 4092 5813 +> 15 0 23 3922 topology 3923 5814 +> 16 0 23 3922 topology 3924 5814 +> 15 0 24 3922 topology 3924 5815 +> 16 0 24 3922 topology 4092 5815 +> 15 0 23 3922 topology 3947 5816 +> 16 0 23 3922 topology 3948 5816 +> 15 0 24 3922 topology 3948 5817 +> 16 0 24 3922 topology 4092 5817 +> 15 0 23 3922 topology 3950 5818 +> 16 0 23 3922 topology 3951 5818 +> 15 0 24 3922 topology 3951 5819 +> 16 0 24 3922 topology 4092 5819 +> 15 0 23 3922 topology 4010 5820 +> 16 0 23 3922 topology 4011 5820 +> 15 0 24 3922 topology 4011 5821 +> 16 0 24 3922 topology 4092 5821 +> 15 0 23 3922 topology 4070 5822 +> 16 0 23 3922 topology 4071 5822 +> 15 0 24 3922 topology 4071 5823 +> 16 0 24 3922 topology 4092 5823 +> 15 0 23 3922 topology 3992 5824 +> 16 0 23 3922 topology 3993 5824 +> 15 0 24 3922 topology 3993 5825 +> 16 0 24 3922 topology 4092 5825 +> 15 0 23 3922 topology 4052 5826 +> 16 0 23 3922 topology 4053 5826 +> 15 0 24 3922 topology 4053 5827 +> 16 0 24 3922 topology 4092 5827 +> 15 0 23 3922 topology 3974 5828 +> 16 0 23 3922 topology 3975 5828 +> 15 0 24 3922 topology 3975 5829 +> 16 0 24 3922 topology 4092 5829 +> 15 0 23 3922 topology 4034 5830 +> 16 0 23 3922 topology 4035 5830 +> 15 0 24 3922 topology 4035 5831 +> 16 0 24 3922 topology 4092 5831 +> 15 0 23 3922 topology 3932 5832 +> 16 0 23 3922 topology 3933 5832 +> 15 0 24 3922 topology 3933 5833 +> 16 0 24 3922 topology 4092 5833 +> 15 0 23 3922 topology 3959 5834 +> 16 0 23 3922 topology 3960 5834 +> 15 0 24 3922 topology 3960 5835 +> 16 0 24 3922 topology 4092 5835 +> 15 0 23 3922 topology 4019 5836 +> 16 0 23 3922 topology 4020 5836 +> 15 0 24 3922 topology 4020 5837 +> 16 0 24 3922 topology 4092 5837 +> 15 0 23 3922 topology 4079 5838 +> 16 0 23 3922 topology 4080 5838 +> 15 0 24 3922 topology 4080 5839 +> 16 0 24 3922 topology 4092 5839 +> 15 0 23 3922 topology 4001 5840 +> 16 0 23 3922 topology 4002 5840 +> 15 0 24 3922 topology 4002 5841 +> 16 0 24 3922 topology 4092 5841 +> 15 0 23 3922 topology 4061 5842 +> 16 0 23 3922 topology 4062 5842 +> 15 0 24 3922 topology 4062 5843 +> 16 0 24 3922 topology 4092 5843 +> 15 0 23 3922 topology 3941 5844 +> 16 0 23 3922 topology 3942 5844 +> 15 0 24 3922 topology 3942 5845 +> 16 0 24 3922 topology 4092 5845 +> 15 0 23 3922 topology 3986 5846 +> 16 0 23 3922 topology 3987 5846 +> 15 0 24 3922 topology 3987 5847 +> 16 0 24 3922 topology 4092 5847 +> 15 0 23 3922 topology 4046 5848 +> 16 0 23 3922 topology 4047 5848 +> 15 0 24 3922 topology 4047 5849 +> 16 0 24 3922 topology 4092 5849 +> 15 0 23 3922 topology 3968 5850 +> 16 0 23 3922 topology 3969 5850 +> 15 0 24 3922 topology 3969 5851 +> 16 0 24 3922 topology 4092 5851 +> 15 0 23 3922 topology 4028 5852 +> 16 0 23 3922 topology 4029 5852 +> 15 0 24 3922 topology 4029 5853 +> 16 0 24 3922 topology 4092 5853 +> 15 0 23 3922 topology 4088 5854 +> 16 0 23 3922 topology 4089 5854 +> 15 0 24 3922 topology 4089 5855 +> 16 0 24 3922 topology 4092 5855 +> 15 0 23 3922 topology 3926 5856 +> 16 0 23 3922 topology 3927 5856 +> 15 0 24 3922 topology 3927 5857 +> 16 0 24 3922 topology 4092 5857 +> 15 0 23 3922 topology 3953 5858 +> 16 0 23 3922 topology 3954 5858 +> 15 0 24 3922 topology 3954 5859 +> 16 0 24 3922 topology 4092 5859 +> 15 0 23 3922 topology 4013 5860 +> 16 0 23 3922 topology 4014 5860 +> 15 0 24 3922 topology 4014 5861 +> 16 0 24 3922 topology 4092 5861 +> 15 0 23 3922 topology 4073 5862 +> 16 0 23 3922 topology 4074 5862 +> 15 0 24 3922 topology 4074 5863 +> 16 0 24 3922 topology 4092 5863 +> 15 0 23 3922 topology 3995 5864 +> 16 0 23 3922 topology 3996 5864 +> 15 0 24 3922 topology 3996 5865 +> 16 0 24 3922 topology 4092 5865 +> 15 0 23 3922 topology 4055 5866 +> 16 0 23 3922 topology 4056 5866 +> 15 0 24 3922 topology 4056 5867 +> 16 0 24 3922 topology 4092 5867 +> 15 0 23 3922 topology 3977 5868 +> 16 0 23 3922 topology 3978 5868 +> 15 0 24 3922 topology 3978 5869 +> 16 0 24 3922 topology 4092 5869 +> 15 0 23 3922 topology 4037 5870 +> 16 0 23 3922 topology 4038 5870 +> 15 0 24 3922 topology 4038 5871 +> 16 0 24 3922 topology 4092 5871 +> 15 0 23 3922 topology 3935 5872 +> 16 0 23 3922 topology 3936 5872 +> 15 0 24 3922 topology 3936 5873 +> 16 0 24 3922 topology 4092 5873 +> 15 0 23 3922 topology 3980 5874 +> 16 0 23 3922 topology 3981 5874 +> 15 0 24 3922 topology 3981 5875 +> 16 0 24 3922 topology 4092 5875 +> 15 0 23 3922 topology 4040 5876 +> 16 0 23 3922 topology 4041 5876 +> 15 0 24 3922 topology 4041 5877 +> 16 0 24 3922 topology 4092 5877 +> 15 0 23 3922 topology 3962 5878 +> 16 0 23 3922 topology 3963 5878 +> 15 0 24 3922 topology 3963 5879 +> 16 0 24 3922 topology 4092 5879 +> 15 0 23 3922 topology 4022 5880 +> 16 0 23 3922 topology 4023 5880 +> 15 0 24 3922 topology 4023 5881 +> 16 0 24 3922 topology 4092 5881 +> 15 0 23 3922 topology 4082 5882 +> 16 0 23 3922 topology 4083 5882 +> 15 0 24 3922 topology 4083 5883 +> 16 0 24 3922 topology 4092 5883 +> 15 0 23 3922 topology 4004 5884 +> 16 0 23 3922 topology 4005 5884 +> 15 0 24 3922 topology 4005 5885 +> 16 0 24 3922 topology 4092 5885 +> 15 0 23 3922 topology 4064 5886 +> 16 0 23 3922 topology 4065 5886 +> 15 0 24 3922 topology 4065 5887 +> 16 0 24 3922 topology 4092 5887 +> 15 0 23 3922 topology 3944 5888 +> 16 0 23 3922 topology 3945 5888 +> 15 0 24 3922 topology 3945 5889 +> 16 0 24 3922 topology 4092 5889 +> 15 0 23 4248 topology 4273 5890 +> 16 0 23 4248 topology 4274 5890 +> 15 0 24 4248 topology 4274 5891 +> 16 0 24 4248 topology 4385 5891 +> 15 0 24 4248 topology 4385 5892 +> 16 0 24 4248 topology 4281 5892 +> 15 0 25 4248 topology 4281 5893 +> 16 0 25 4248 topology 4279 5893 +> 15 0 24 4248 topology 4385 5894 +> 16 0 24 4248 topology 4311 5894 +> 15 0 25 4248 topology 4311 5895 +> 16 0 25 4248 topology 4309 5895 +> 15 0 24 4248 topology 4385 5896 +> 16 0 24 4248 topology 4341 5896 +> 15 0 25 4248 topology 4341 5897 +> 16 0 25 4248 topology 4339 5897 +> 15 0 24 4248 topology 4385 5898 +> 16 0 24 4248 topology 4371 5898 +> 15 0 25 4248 topology 4371 5899 +> 16 0 25 4248 topology 4369 5899 +> 15 0 24 4248 topology 4385 5900 +> 16 0 24 4248 topology 4293 5900 +> 15 0 25 4248 topology 4293 5901 +> 16 0 25 4248 topology 4291 5901 +> 15 0 24 4248 topology 4385 5902 +> 16 0 24 4248 topology 4323 5902 +> 15 0 25 4248 topology 4323 5903 +> 16 0 25 4248 topology 4321 5903 +> 15 0 24 4248 topology 4385 5904 +> 16 0 24 4248 topology 4353 5904 +> 15 0 25 4248 topology 4353 5905 +> 16 0 25 4248 topology 4351 5905 +> 15 0 24 4248 topology 4385 5906 +> 16 0 24 4248 topology 4383 5906 +> 15 0 25 4248 topology 4383 5907 +> 16 0 25 4248 topology 4381 5907 +> 15 0 24 4248 topology 4385 5908 +> 16 0 24 4248 topology 4305 5908 +> 15 0 25 4248 topology 4305 5909 +> 16 0 25 4248 topology 4303 5909 +> 15 0 24 4248 topology 4385 5910 +> 16 0 24 4248 topology 4335 5910 +> 15 0 25 4248 topology 4335 5911 +> 16 0 25 4248 topology 4333 5911 +> 15 0 24 4248 topology 4385 5912 +> 16 0 24 4248 topology 4365 5912 +> 15 0 25 4248 topology 4365 5913 +> 16 0 25 4248 topology 4363 5913 +> 15 0 24 4248 topology 4385 5914 +> 16 0 24 4248 topology 4260 5914 +> 15 0 25 4248 topology 4260 5915 +> 16 0 25 4248 topology 4258 5915 +> 15 0 24 4248 topology 4385 5916 +> 16 0 24 4248 topology 4272 5916 +> 15 0 25 4248 topology 4272 5917 +> 16 0 25 4248 topology 4270 5917 +> 15 0 24 4248 topology 4385 5918 +> 16 0 24 4248 topology 4278 5918 +> 15 0 25 4248 topology 4278 5919 +> 16 0 25 4248 topology 4276 5919 +> 15 0 24 4248 topology 4385 5920 +> 16 0 24 4248 topology 4308 5920 +> 15 0 25 4248 topology 4308 5921 +> 16 0 25 4248 topology 4306 5921 +> 15 0 24 4248 topology 4385 5922 +> 16 0 24 4248 topology 4338 5922 +> 15 0 25 4248 topology 4338 5923 +> 16 0 25 4248 topology 4336 5923 +> 15 0 24 4248 topology 4385 5924 +> 16 0 24 4248 topology 4368 5924 +> 15 0 25 4248 topology 4368 5925 +> 16 0 25 4248 topology 4366 5925 +> 15 0 24 4248 topology 4385 5926 +> 16 0 24 4248 topology 4290 5926 +> 15 0 25 4248 topology 4290 5927 +> 16 0 25 4248 topology 4288 5927 +> 15 0 24 4248 topology 4385 5928 +> 16 0 24 4248 topology 4320 5928 +> 15 0 25 4248 topology 4320 5929 +> 16 0 25 4248 topology 4318 5929 +> 15 0 24 4248 topology 4385 5930 +> 16 0 24 4248 topology 4350 5930 +> 15 0 25 4248 topology 4350 5931 +> 16 0 25 4248 topology 4348 5931 +> 15 0 24 4248 topology 4385 5932 +> 16 0 24 4248 topology 4380 5932 +> 15 0 25 4248 topology 4380 5933 +> 16 0 25 4248 topology 4378 5933 +> 15 0 24 4248 topology 4385 5934 +> 16 0 24 4248 topology 4302 5934 +> 15 0 25 4248 topology 4302 5935 +> 16 0 25 4248 topology 4300 5935 +> 15 0 24 4248 topology 4385 5936 +> 16 0 24 4248 topology 4332 5936 +> 15 0 25 4248 topology 4332 5937 +> 16 0 25 4248 topology 4330 5937 +> 15 0 24 4248 topology 4385 5938 +> 16 0 24 4248 topology 4362 5938 +> 15 0 25 4248 topology 4362 5939 +> 16 0 25 4248 topology 4360 5939 +> 15 0 24 4248 topology 4385 5940 +> 16 0 24 4248 topology 4257 5940 +> 15 0 25 4248 topology 4257 5941 +> 16 0 25 4248 topology 4255 5941 +> 15 0 24 4248 topology 4385 5942 +> 16 0 24 4248 topology 4269 5942 +> 15 0 25 4248 topology 4269 5943 +> 16 0 25 4248 topology 4267 5943 +> 15 0 26 4248 topology 4385 5944 +> 16 0 26 4248 topology 4384 5944 +> 15 0 24 4248 topology 4385 5945 +> 16 0 24 4248 topology 4287 5945 +> 15 0 25 4248 topology 4287 5946 +> 16 0 25 4248 topology 4285 5946 +> 15 0 24 4248 topology 4385 5947 +> 16 0 24 4248 topology 4317 5947 +> 15 0 25 4248 topology 4317 5948 +> 16 0 25 4248 topology 4315 5948 +> 15 0 24 4248 topology 4385 5949 +> 16 0 24 4248 topology 4347 5949 +> 15 0 25 4248 topology 4347 5950 +> 16 0 25 4248 topology 4345 5950 +> 15 0 24 4248 topology 4385 5951 +> 16 0 24 4248 topology 4377 5951 +> 15 0 25 4248 topology 4377 5952 +> 16 0 25 4248 topology 4375 5952 +> 15 0 24 4248 topology 4385 5953 +> 16 0 24 4248 topology 4299 5953 +> 15 0 25 4248 topology 4299 5954 +> 16 0 25 4248 topology 4297 5954 +> 15 0 24 4248 topology 4385 5955 +> 16 0 24 4248 topology 4329 5955 +> 15 0 25 4248 topology 4329 5956 +> 16 0 25 4248 topology 4327 5956 +> 15 0 24 4248 topology 4385 5957 +> 16 0 24 4248 topology 4359 5957 +> 15 0 25 4248 topology 4359 5958 +> 16 0 25 4248 topology 4357 5958 +> 15 0 24 4248 topology 4385 5959 +> 16 0 24 4248 topology 4254 5959 +> 15 0 25 4248 topology 4254 5960 +> 16 0 25 4248 topology 4252 5960 +> 15 0 24 4248 topology 4385 5961 +> 16 0 24 4248 topology 4266 5961 +> 15 0 25 4248 topology 4266 5962 +> 16 0 25 4248 topology 4264 5962 +> 15 0 24 4248 topology 4385 5963 +> 16 0 24 4248 topology 4284 5963 +> 15 0 25 4248 topology 4284 5964 +> 16 0 25 4248 topology 4282 5964 +> 15 0 24 4248 topology 4385 5965 +> 16 0 24 4248 topology 4314 5965 +> 15 0 25 4248 topology 4314 5966 +> 16 0 25 4248 topology 4312 5966 +> 15 0 24 4248 topology 4385 5967 +> 16 0 24 4248 topology 4344 5967 +> 15 0 25 4248 topology 4344 5968 +> 16 0 25 4248 topology 4342 5968 +> 15 0 24 4248 topology 4385 5969 +> 16 0 24 4248 topology 4374 5969 +> 15 0 25 4248 topology 4374 5970 +> 16 0 25 4248 topology 4372 5970 +> 15 0 24 4248 topology 4385 5971 +> 16 0 24 4248 topology 4296 5971 +> 15 0 25 4248 topology 4296 5972 +> 16 0 25 4248 topology 4294 5972 +> 15 0 24 4248 topology 4385 5973 +> 16 0 24 4248 topology 4326 5973 +> 15 0 25 4248 topology 4326 5974 +> 16 0 25 4248 topology 4324 5974 +> 15 0 24 4248 topology 4385 5975 +> 16 0 24 4248 topology 4356 5975 +> 15 0 25 4248 topology 4356 5976 +> 16 0 25 4248 topology 4354 5976 +> 15 0 24 4248 topology 4385 5977 +> 16 0 24 4248 topology 4251 5977 +> 15 0 25 4248 topology 4251 5978 +> 16 0 25 4248 topology 4249 5978 +> 15 0 24 4248 topology 4385 5979 +> 16 0 24 4248 topology 4263 5979 +> 15 0 25 4248 topology 4263 5980 +> 16 0 25 4248 topology 4261 5980 +> 15 0 23 4248 topology 4279 5981 +> 16 0 23 4248 topology 4280 5981 +> 15 0 24 4248 topology 4280 5982 +> 16 0 24 4248 topology 4385 5982 +> 15 0 24 4248 topology 4385 5983 +> 16 0 24 4248 topology 4275 5983 +> 15 0 25 4248 topology 4275 5984 +> 16 0 25 4248 topology 4273 5984 +> 15 0 23 4248 topology 4309 5985 +> 16 0 23 4248 topology 4310 5985 +> 15 0 24 4248 topology 4310 5986 +> 16 0 24 4248 topology 4385 5986 +> 15 0 23 4248 topology 4339 5987 +> 16 0 23 4248 topology 4340 5987 +> 15 0 24 4248 topology 4340 5988 +> 16 0 24 4248 topology 4385 5988 +> 15 0 23 4248 topology 4369 5989 +> 16 0 23 4248 topology 4370 5989 +> 15 0 24 4248 topology 4370 5990 +> 16 0 24 4248 topology 4385 5990 +> 15 0 23 4248 topology 4291 5991 +> 16 0 23 4248 topology 4292 5991 +> 15 0 24 4248 topology 4292 5992 +> 16 0 24 4248 topology 4385 5992 +> 15 0 23 4248 topology 4321 5993 +> 16 0 23 4248 topology 4322 5993 +> 15 0 24 4248 topology 4322 5994 +> 16 0 24 4248 topology 4385 5994 +> 15 0 23 4248 topology 4351 5995 +> 16 0 23 4248 topology 4352 5995 +> 15 0 24 4248 topology 4352 5996 +> 16 0 24 4248 topology 4385 5996 +> 15 0 23 4248 topology 4381 5997 +> 16 0 23 4248 topology 4382 5997 +> 15 0 24 4248 topology 4382 5998 +> 16 0 24 4248 topology 4385 5998 +> 15 0 23 4248 topology 4303 5999 +> 16 0 23 4248 topology 4304 5999 +> 15 0 24 4248 topology 4304 6000 +> 16 0 24 4248 topology 4385 6000 +> 15 0 23 4248 topology 4333 6001 +> 16 0 23 4248 topology 4334 6001 +> 15 0 24 4248 topology 4334 6002 +> 16 0 24 4248 topology 4385 6002 +> 15 0 23 4248 topology 4363 6003 +> 16 0 23 4248 topology 4364 6003 +> 15 0 24 4248 topology 4364 6004 +> 16 0 24 4248 topology 4385 6004 +> 15 0 23 4248 topology 4258 6005 +> 16 0 23 4248 topology 4259 6005 +> 15 0 24 4248 topology 4259 6006 +> 16 0 24 4248 topology 4385 6006 +> 15 0 23 4248 topology 4270 6007 +> 16 0 23 4248 topology 4271 6007 +> 15 0 24 4248 topology 4271 6008 +> 16 0 24 4248 topology 4385 6008 +> 15 0 23 4248 topology 4276 6009 +> 16 0 23 4248 topology 4277 6009 +> 15 0 24 4248 topology 4277 6010 +> 16 0 24 4248 topology 4385 6010 +> 15 0 23 4248 topology 4306 6011 +> 16 0 23 4248 topology 4307 6011 +> 15 0 24 4248 topology 4307 6012 +> 16 0 24 4248 topology 4385 6012 +> 15 0 23 4248 topology 4336 6013 +> 16 0 23 4248 topology 4337 6013 +> 15 0 24 4248 topology 4337 6014 +> 16 0 24 4248 topology 4385 6014 +> 15 0 23 4248 topology 4366 6015 +> 16 0 23 4248 topology 4367 6015 +> 15 0 24 4248 topology 4367 6016 +> 16 0 24 4248 topology 4385 6016 +> 15 0 23 4248 topology 4288 6017 +> 16 0 23 4248 topology 4289 6017 +> 15 0 24 4248 topology 4289 6018 +> 16 0 24 4248 topology 4385 6018 +> 15 0 23 4248 topology 4318 6019 +> 16 0 23 4248 topology 4319 6019 +> 15 0 24 4248 topology 4319 6020 +> 16 0 24 4248 topology 4385 6020 +> 15 0 23 4248 topology 4348 6021 +> 16 0 23 4248 topology 4349 6021 +> 15 0 24 4248 topology 4349 6022 +> 16 0 24 4248 topology 4385 6022 +> 15 0 23 4248 topology 4378 6023 +> 16 0 23 4248 topology 4379 6023 +> 15 0 24 4248 topology 4379 6024 +> 16 0 24 4248 topology 4385 6024 +> 15 0 23 4248 topology 4300 6025 +> 16 0 23 4248 topology 4301 6025 +> 15 0 24 4248 topology 4301 6026 +> 16 0 24 4248 topology 4385 6026 +> 15 0 23 4248 topology 4330 6027 +> 16 0 23 4248 topology 4331 6027 +> 15 0 24 4248 topology 4331 6028 +> 16 0 24 4248 topology 4385 6028 +> 15 0 23 4248 topology 4360 6029 +> 16 0 23 4248 topology 4361 6029 +> 15 0 24 4248 topology 4361 6030 +> 16 0 24 4248 topology 4385 6030 +> 15 0 23 4248 topology 4255 6031 +> 16 0 23 4248 topology 4256 6031 +> 15 0 24 4248 topology 4256 6032 +> 16 0 24 4248 topology 4385 6032 +> 15 0 23 4248 topology 4267 6033 +> 16 0 23 4248 topology 4268 6033 +> 15 0 24 4248 topology 4268 6034 +> 16 0 24 4248 topology 4385 6034 +> 15 0 23 4248 topology 4285 6035 +> 16 0 23 4248 topology 4286 6035 +> 15 0 24 4248 topology 4286 6036 +> 16 0 24 4248 topology 4385 6036 +> 15 0 23 4248 topology 4315 6037 +> 16 0 23 4248 topology 4316 6037 +> 15 0 24 4248 topology 4316 6038 +> 16 0 24 4248 topology 4385 6038 +> 15 0 23 4248 topology 4345 6039 +> 16 0 23 4248 topology 4346 6039 +> 15 0 24 4248 topology 4346 6040 +> 16 0 24 4248 topology 4385 6040 +> 15 0 23 4248 topology 4375 6041 +> 16 0 23 4248 topology 4376 6041 +> 15 0 24 4248 topology 4376 6042 +> 16 0 24 4248 topology 4385 6042 +> 15 0 23 4248 topology 4297 6043 +> 16 0 23 4248 topology 4298 6043 +> 15 0 24 4248 topology 4298 6044 +> 16 0 24 4248 topology 4385 6044 +> 15 0 23 4248 topology 4327 6045 +> 16 0 23 4248 topology 4328 6045 +> 15 0 24 4248 topology 4328 6046 +> 16 0 24 4248 topology 4385 6046 +> 15 0 23 4248 topology 4357 6047 +> 16 0 23 4248 topology 4358 6047 +> 15 0 24 4248 topology 4358 6048 +> 16 0 24 4248 topology 4385 6048 +> 15 0 23 4248 topology 4252 6049 +> 16 0 23 4248 topology 4253 6049 +> 15 0 24 4248 topology 4253 6050 +> 16 0 24 4248 topology 4385 6050 +> 15 0 23 4248 topology 4264 6051 +> 16 0 23 4248 topology 4265 6051 +> 15 0 24 4248 topology 4265 6052 +> 16 0 24 4248 topology 4385 6052 +> 15 0 23 4248 topology 4282 6053 +> 16 0 23 4248 topology 4283 6053 +> 15 0 24 4248 topology 4283 6054 +> 16 0 24 4248 topology 4385 6054 +> 15 0 23 4248 topology 4312 6055 +> 16 0 23 4248 topology 4313 6055 +> 15 0 24 4248 topology 4313 6056 +> 16 0 24 4248 topology 4385 6056 +> 15 0 23 4248 topology 4342 6057 +> 16 0 23 4248 topology 4343 6057 +> 15 0 24 4248 topology 4343 6058 +> 16 0 24 4248 topology 4385 6058 +> 15 0 23 4248 topology 4372 6059 +> 16 0 23 4248 topology 4373 6059 +> 15 0 24 4248 topology 4373 6060 +> 16 0 24 4248 topology 4385 6060 +> 15 0 23 4248 topology 4294 6061 +> 16 0 23 4248 topology 4295 6061 +> 15 0 24 4248 topology 4295 6062 +> 16 0 24 4248 topology 4385 6062 +> 15 0 23 4248 topology 4324 6063 +> 16 0 23 4248 topology 4325 6063 +> 15 0 24 4248 topology 4325 6064 +> 16 0 24 4248 topology 4385 6064 +> 15 0 23 4248 topology 4354 6065 +> 16 0 23 4248 topology 4355 6065 +> 15 0 24 4248 topology 4355 6066 +> 16 0 24 4248 topology 4385 6066 +> 15 0 23 4248 topology 4249 6067 +> 16 0 23 4248 topology 4250 6067 +> 15 0 24 4248 topology 4250 6068 +> 16 0 24 4248 topology 4385 6068 +> 15 0 23 4248 topology 4261 6069 +> 16 0 23 4248 topology 4262 6069 +> 15 0 24 4248 topology 4262 6070 +> 16 0 24 4248 topology 4385 6070 +> 15 0 23 4094 topology 4095 6071 +> 16 0 23 4094 topology 4096 6071 +> 15 0 24 4094 topology 4096 6072 +> 16 0 24 4094 topology 4246 6072 +> 15 0 24 4094 topology 4246 6073 +> 16 0 24 4094 topology 4109 6073 +> 15 0 25 4094 topology 4109 6074 +> 16 0 25 4094 topology 4107 6074 +> 15 0 24 4094 topology 4246 6075 +> 16 0 24 4094 topology 4121 6075 +> 15 0 25 4094 topology 4121 6076 +> 16 0 25 4094 topology 4119 6076 +> 15 0 24 4094 topology 4246 6077 +> 16 0 24 4094 topology 4130 6077 +> 15 0 25 4094 topology 4130 6078 +> 16 0 25 4094 topology 4128 6078 +> 15 0 24 4094 topology 4246 6079 +> 16 0 24 4094 topology 4160 6079 +> 15 0 25 4094 topology 4160 6080 +> 16 0 25 4094 topology 4158 6080 +> 15 0 24 4094 topology 4246 6081 +> 16 0 24 4094 topology 4190 6081 +> 15 0 25 4094 topology 4190 6082 +> 16 0 25 4094 topology 4188 6082 +> 15 0 24 4094 topology 4246 6083 +> 16 0 24 4094 topology 4220 6083 +> 15 0 25 4094 topology 4220 6084 +> 16 0 25 4094 topology 4218 6084 +> 15 0 24 4094 topology 4246 6085 +> 16 0 24 4094 topology 4142 6085 +> 15 0 25 4094 topology 4142 6086 +> 16 0 25 4094 topology 4140 6086 +> 15 0 24 4094 topology 4246 6087 +> 16 0 24 4094 topology 4172 6087 +> 15 0 25 4094 topology 4172 6088 +> 16 0 25 4094 topology 4170 6088 +> 15 0 24 4094 topology 4246 6089 +> 16 0 24 4094 topology 4202 6089 +> 15 0 25 4094 topology 4202 6090 +> 16 0 25 4094 topology 4200 6090 +> 15 0 24 4094 topology 4246 6091 +> 16 0 24 4094 topology 4232 6091 +> 15 0 25 4094 topology 4232 6092 +> 16 0 25 4094 topology 4230 6092 +> 15 0 24 4094 topology 4246 6093 +> 16 0 24 4094 topology 4106 6093 +> 15 0 25 4094 topology 4106 6094 +> 16 0 25 4094 topology 4104 6094 +> 15 0 24 4094 topology 4246 6095 +> 16 0 24 4094 topology 4118 6095 +> 15 0 25 4094 topology 4118 6096 +> 16 0 25 4094 topology 4116 6096 +> 15 0 24 4094 topology 4246 6097 +> 16 0 24 4094 topology 4127 6097 +> 15 0 25 4094 topology 4127 6098 +> 16 0 25 4094 topology 4125 6098 +> 15 0 24 4094 topology 4246 6099 +> 16 0 24 4094 topology 4157 6099 +> 15 0 25 4094 topology 4157 6100 +> 16 0 25 4094 topology 4155 6100 +> 15 0 24 4094 topology 4246 6101 +> 16 0 24 4094 topology 4187 6101 +> 15 0 25 4094 topology 4187 6102 +> 16 0 25 4094 topology 4185 6102 +> 15 0 24 4094 topology 4246 6103 +> 16 0 24 4094 topology 4217 6103 +> 15 0 25 4094 topology 4217 6104 +> 16 0 25 4094 topology 4215 6104 +> 15 0 24 4094 topology 4246 6105 +> 16 0 24 4094 topology 4139 6105 +> 15 0 25 4094 topology 4139 6106 +> 16 0 25 4094 topology 4137 6106 +> 15 0 24 4094 topology 4246 6107 +> 16 0 24 4094 topology 4169 6107 +> 15 0 25 4094 topology 4169 6108 +> 16 0 25 4094 topology 4167 6108 +> 15 0 24 4094 topology 4246 6109 +> 16 0 24 4094 topology 4199 6109 +> 15 0 25 4094 topology 4199 6110 +> 16 0 25 4094 topology 4197 6110 +> 15 0 24 4094 topology 4246 6111 +> 16 0 24 4094 topology 4229 6111 +> 15 0 25 4094 topology 4229 6112 +> 16 0 25 4094 topology 4227 6112 +> 15 0 24 4094 topology 4246 6113 +> 16 0 24 4094 topology 4151 6113 +> 15 0 25 4094 topology 4151 6114 +> 16 0 25 4094 topology 4149 6114 +> 15 0 24 4094 topology 4246 6115 +> 16 0 24 4094 topology 4181 6115 +> 15 0 25 4094 topology 4181 6116 +> 16 0 25 4094 topology 4179 6116 +> 15 0 24 4094 topology 4246 6117 +> 16 0 24 4094 topology 4211 6117 +> 15 0 25 4094 topology 4211 6118 +> 16 0 25 4094 topology 4209 6118 +> 15 0 24 4094 topology 4246 6119 +> 16 0 24 4094 topology 4241 6119 +> 15 0 25 4094 topology 4241 6120 +> 16 0 25 4094 topology 4239 6120 +> 15 0 24 4094 topology 4246 6121 +> 16 0 24 4094 topology 4103 6121 +> 15 0 25 4094 topology 4103 6122 +> 16 0 25 4094 topology 4101 6122 +> 15 0 24 4094 topology 4246 6123 +> 16 0 24 4094 topology 4115 6123 +> 15 0 25 4094 topology 4115 6124 +> 16 0 25 4094 topology 4113 6124 +> 15 0 24 4094 topology 4246 6125 +> 16 0 24 4094 topology 4124 6125 +> 15 0 25 4094 topology 4124 6126 +> 16 0 25 4094 topology 4122 6126 +> 15 0 26 4094 topology 4246 6127 +> 16 0 26 4094 topology 4245 6127 +> 15 0 24 4094 topology 4246 6128 +> 16 0 24 4094 topology 4154 6128 +> 15 0 25 4094 topology 4154 6129 +> 16 0 25 4094 topology 4152 6129 +> 15 0 24 4094 topology 4246 6130 +> 16 0 24 4094 topology 4184 6130 +> 15 0 25 4094 topology 4184 6131 +> 16 0 25 4094 topology 4182 6131 +> 15 0 24 4094 topology 4246 6132 +> 16 0 24 4094 topology 4214 6132 +> 15 0 25 4094 topology 4214 6133 +> 16 0 25 4094 topology 4212 6133 +> 15 0 24 4094 topology 4246 6134 +> 16 0 24 4094 topology 4136 6134 +> 15 0 25 4094 topology 4136 6135 +> 16 0 25 4094 topology 4134 6135 +> 15 0 24 4094 topology 4246 6136 +> 16 0 24 4094 topology 4244 6136 +> 15 0 25 4094 topology 4244 6137 +> 16 0 25 4094 topology 4242 6137 +> 15 0 24 4094 topology 4246 6138 +> 16 0 24 4094 topology 4166 6138 +> 15 0 25 4094 topology 4166 6139 +> 16 0 25 4094 topology 4164 6139 +> 15 0 24 4094 topology 4246 6140 +> 16 0 24 4094 topology 4196 6140 +> 15 0 25 4094 topology 4196 6141 +> 16 0 25 4094 topology 4194 6141 +> 15 0 24 4094 topology 4246 6142 +> 16 0 24 4094 topology 4226 6142 +> 15 0 25 4094 topology 4226 6143 +> 16 0 25 4094 topology 4224 6143 +> 15 0 24 4094 topology 4246 6144 +> 16 0 24 4094 topology 4148 6144 +> 15 0 25 4094 topology 4148 6145 +> 16 0 25 4094 topology 4146 6145 +> 15 0 24 4094 topology 4246 6146 +> 16 0 24 4094 topology 4178 6146 +> 15 0 25 4094 topology 4178 6147 +> 16 0 25 4094 topology 4176 6147 +> 15 0 24 4094 topology 4246 6148 +> 16 0 24 4094 topology 4208 6148 +> 15 0 25 4094 topology 4208 6149 +> 16 0 25 4094 topology 4206 6149 +> 15 0 24 4094 topology 4246 6150 +> 16 0 24 4094 topology 4238 6150 +> 15 0 25 4094 topology 4238 6151 +> 16 0 25 4094 topology 4236 6151 +> 15 0 24 4094 topology 4246 6152 +> 16 0 24 4094 topology 4100 6152 +> 15 0 25 4094 topology 4100 6153 +> 16 0 25 4094 topology 4098 6153 +> 15 0 24 4094 topology 4246 6154 +> 16 0 24 4094 topology 4112 6154 +> 15 0 25 4094 topology 4112 6155 +> 16 0 25 4094 topology 4110 6155 +> 15 0 24 4094 topology 4246 6156 +> 16 0 24 4094 topology 4133 6156 +> 15 0 25 4094 topology 4133 6157 +> 16 0 25 4094 topology 4131 6157 +> 15 0 24 4094 topology 4246 6158 +> 16 0 24 4094 topology 4163 6158 +> 15 0 25 4094 topology 4163 6159 +> 16 0 25 4094 topology 4161 6159 +> 15 0 24 4094 topology 4246 6160 +> 16 0 24 4094 topology 4193 6160 +> 15 0 25 4094 topology 4193 6161 +> 16 0 25 4094 topology 4191 6161 +> 15 0 24 4094 topology 4246 6162 +> 16 0 24 4094 topology 4223 6162 +> 15 0 25 4094 topology 4223 6163 +> 16 0 25 4094 topology 4221 6163 +> 15 0 24 4094 topology 4246 6164 +> 16 0 24 4094 topology 4145 6164 +> 15 0 25 4094 topology 4145 6165 +> 16 0 25 4094 topology 4143 6165 +> 15 0 24 4094 topology 4246 6166 +> 16 0 24 4094 topology 4175 6166 +> 15 0 25 4094 topology 4175 6167 +> 16 0 25 4094 topology 4173 6167 +> 15 0 24 4094 topology 4246 6168 +> 16 0 24 4094 topology 4205 6168 +> 15 0 25 4094 topology 4205 6169 +> 16 0 25 4094 topology 4203 6169 +> 15 0 24 4094 topology 4246 6170 +> 16 0 24 4094 topology 4235 6170 +> 15 0 25 4094 topology 4235 6171 +> 16 0 25 4094 topology 4233 6171 +> 15 0 23 4094 topology 4107 6172 +> 16 0 23 4094 topology 4108 6172 +> 15 0 24 4094 topology 4108 6173 +> 16 0 24 4094 topology 4246 6173 +> 15 0 24 4094 topology 4246 6174 +> 16 0 24 4094 topology 4097 6174 +> 15 0 25 4094 topology 4097 6175 +> 16 0 25 4094 topology 4095 6175 +> 15 0 23 4094 topology 4119 6176 +> 16 0 23 4094 topology 4120 6176 +> 15 0 24 4094 topology 4120 6177 +> 16 0 24 4094 topology 4246 6177 +> 15 0 23 4094 topology 4128 6178 +> 16 0 23 4094 topology 4129 6178 +> 15 0 24 4094 topology 4129 6179 +> 16 0 24 4094 topology 4246 6179 +> 15 0 23 4094 topology 4158 6180 +> 16 0 23 4094 topology 4159 6180 +> 15 0 24 4094 topology 4159 6181 +> 16 0 24 4094 topology 4246 6181 +> 15 0 23 4094 topology 4188 6182 +> 16 0 23 4094 topology 4189 6182 +> 15 0 24 4094 topology 4189 6183 +> 16 0 24 4094 topology 4246 6183 +> 15 0 23 4094 topology 4218 6184 +> 16 0 23 4094 topology 4219 6184 +> 15 0 24 4094 topology 4219 6185 +> 16 0 24 4094 topology 4246 6185 +> 15 0 23 4094 topology 4140 6186 +> 16 0 23 4094 topology 4141 6186 +> 15 0 24 4094 topology 4141 6187 +> 16 0 24 4094 topology 4246 6187 +> 15 0 23 4094 topology 4170 6188 +> 16 0 23 4094 topology 4171 6188 +> 15 0 24 4094 topology 4171 6189 +> 16 0 24 4094 topology 4246 6189 +> 15 0 23 4094 topology 4200 6190 +> 16 0 23 4094 topology 4201 6190 +> 15 0 24 4094 topology 4201 6191 +> 16 0 24 4094 topology 4246 6191 +> 15 0 23 4094 topology 4230 6192 +> 16 0 23 4094 topology 4231 6192 +> 15 0 24 4094 topology 4231 6193 +> 16 0 24 4094 topology 4246 6193 +> 15 0 23 4094 topology 4104 6194 +> 16 0 23 4094 topology 4105 6194 +> 15 0 24 4094 topology 4105 6195 +> 16 0 24 4094 topology 4246 6195 +> 15 0 23 4094 topology 4116 6196 +> 16 0 23 4094 topology 4117 6196 +> 15 0 24 4094 topology 4117 6197 +> 16 0 24 4094 topology 4246 6197 +> 15 0 23 4094 topology 4125 6198 +> 16 0 23 4094 topology 4126 6198 +> 15 0 24 4094 topology 4126 6199 +> 16 0 24 4094 topology 4246 6199 +> 15 0 23 4094 topology 4155 6200 +> 16 0 23 4094 topology 4156 6200 +> 15 0 24 4094 topology 4156 6201 +> 16 0 24 4094 topology 4246 6201 +> 15 0 23 4094 topology 4185 6202 +> 16 0 23 4094 topology 4186 6202 +> 15 0 24 4094 topology 4186 6203 +> 16 0 24 4094 topology 4246 6203 +> 15 0 23 4094 topology 4215 6204 +> 16 0 23 4094 topology 4216 6204 +> 15 0 24 4094 topology 4216 6205 +> 16 0 24 4094 topology 4246 6205 +> 15 0 23 4094 topology 4137 6206 +> 16 0 23 4094 topology 4138 6206 +> 15 0 24 4094 topology 4138 6207 +> 16 0 24 4094 topology 4246 6207 +> 15 0 23 4094 topology 4167 6208 +> 16 0 23 4094 topology 4168 6208 +> 15 0 24 4094 topology 4168 6209 +> 16 0 24 4094 topology 4246 6209 +> 15 0 23 4094 topology 4197 6210 +> 16 0 23 4094 topology 4198 6210 +> 15 0 24 4094 topology 4198 6211 +> 16 0 24 4094 topology 4246 6211 +> 15 0 23 4094 topology 4227 6212 +> 16 0 23 4094 topology 4228 6212 +> 15 0 24 4094 topology 4228 6213 +> 16 0 24 4094 topology 4246 6213 +> 15 0 23 4094 topology 4149 6214 +> 16 0 23 4094 topology 4150 6214 +> 15 0 24 4094 topology 4150 6215 +> 16 0 24 4094 topology 4246 6215 +> 15 0 23 4094 topology 4179 6216 +> 16 0 23 4094 topology 4180 6216 +> 15 0 24 4094 topology 4180 6217 +> 16 0 24 4094 topology 4246 6217 +> 15 0 23 4094 topology 4209 6218 +> 16 0 23 4094 topology 4210 6218 +> 15 0 24 4094 topology 4210 6219 +> 16 0 24 4094 topology 4246 6219 +> 15 0 23 4094 topology 4239 6220 +> 16 0 23 4094 topology 4240 6220 +> 15 0 24 4094 topology 4240 6221 +> 16 0 24 4094 topology 4246 6221 +> 15 0 23 4094 topology 4101 6222 +> 16 0 23 4094 topology 4102 6222 +> 15 0 24 4094 topology 4102 6223 +> 16 0 24 4094 topology 4246 6223 +> 15 0 23 4094 topology 4113 6224 +> 16 0 23 4094 topology 4114 6224 +> 15 0 24 4094 topology 4114 6225 +> 16 0 24 4094 topology 4246 6225 +> 15 0 23 4094 topology 4122 6226 +> 16 0 23 4094 topology 4123 6226 +> 15 0 24 4094 topology 4123 6227 +> 16 0 24 4094 topology 4246 6227 +> 15 0 23 4094 topology 4152 6228 +> 16 0 23 4094 topology 4153 6228 +> 15 0 24 4094 topology 4153 6229 +> 16 0 24 4094 topology 4246 6229 +> 15 0 23 4094 topology 4182 6230 +> 16 0 23 4094 topology 4183 6230 +> 15 0 24 4094 topology 4183 6231 +> 16 0 24 4094 topology 4246 6231 +> 15 0 23 4094 topology 4212 6232 +> 16 0 23 4094 topology 4213 6232 +> 15 0 24 4094 topology 4213 6233 +> 16 0 24 4094 topology 4246 6233 +> 15 0 23 4094 topology 4134 6234 +> 16 0 23 4094 topology 4135 6234 +> 15 0 24 4094 topology 4135 6235 +> 16 0 24 4094 topology 4246 6235 +> 15 0 23 4094 topology 4242 6236 +> 16 0 23 4094 topology 4243 6236 +> 15 0 24 4094 topology 4243 6237 +> 16 0 24 4094 topology 4246 6237 +> 15 0 23 4094 topology 4164 6238 +> 16 0 23 4094 topology 4165 6238 +> 15 0 24 4094 topology 4165 6239 +> 16 0 24 4094 topology 4246 6239 +> 15 0 23 4094 topology 4194 6240 +> 16 0 23 4094 topology 4195 6240 +> 15 0 24 4094 topology 4195 6241 +> 16 0 24 4094 topology 4246 6241 +> 15 0 23 4094 topology 4224 6242 +> 16 0 23 4094 topology 4225 6242 +> 15 0 24 4094 topology 4225 6243 +> 16 0 24 4094 topology 4246 6243 +> 15 0 23 4094 topology 4146 6244 +> 16 0 23 4094 topology 4147 6244 +> 15 0 24 4094 topology 4147 6245 +> 16 0 24 4094 topology 4246 6245 +> 15 0 23 4094 topology 4176 6246 +> 16 0 23 4094 topology 4177 6246 +> 15 0 24 4094 topology 4177 6247 +> 16 0 24 4094 topology 4246 6247 +> 15 0 23 4094 topology 4206 6248 +> 16 0 23 4094 topology 4207 6248 +> 15 0 24 4094 topology 4207 6249 +> 16 0 24 4094 topology 4246 6249 +> 15 0 23 4094 topology 4236 6250 +> 16 0 23 4094 topology 4237 6250 +> 15 0 24 4094 topology 4237 6251 +> 16 0 24 4094 topology 4246 6251 +> 15 0 23 4094 topology 4098 6252 +> 16 0 23 4094 topology 4099 6252 +> 15 0 24 4094 topology 4099 6253 +> 16 0 24 4094 topology 4246 6253 +> 15 0 23 4094 topology 4110 6254 +> 16 0 23 4094 topology 4111 6254 +> 15 0 24 4094 topology 4111 6255 +> 16 0 24 4094 topology 4246 6255 +> 15 0 23 4094 topology 4131 6256 +> 16 0 23 4094 topology 4132 6256 +> 15 0 24 4094 topology 4132 6257 +> 16 0 24 4094 topology 4246 6257 +> 15 0 23 4094 topology 4161 6258 +> 16 0 23 4094 topology 4162 6258 +> 15 0 24 4094 topology 4162 6259 +> 16 0 24 4094 topology 4246 6259 +> 15 0 23 4094 topology 4191 6260 +> 16 0 23 4094 topology 4192 6260 +> 15 0 24 4094 topology 4192 6261 +> 16 0 24 4094 topology 4246 6261 +> 15 0 23 4094 topology 4221 6262 +> 16 0 23 4094 topology 4222 6262 +> 15 0 24 4094 topology 4222 6263 +> 16 0 24 4094 topology 4246 6263 +> 15 0 23 4094 topology 4143 6264 +> 16 0 23 4094 topology 4144 6264 +> 15 0 24 4094 topology 4144 6265 +> 16 0 24 4094 topology 4246 6265 +> 15 0 23 4094 topology 4173 6266 +> 16 0 23 4094 topology 4174 6266 +> 15 0 24 4094 topology 4174 6267 +> 16 0 24 4094 topology 4246 6267 +> 15 0 23 4094 topology 4203 6268 +> 16 0 23 4094 topology 4204 6268 +> 15 0 24 4094 topology 4204 6269 +> 16 0 24 4094 topology 4246 6269 +> 15 0 23 4094 topology 4233 6270 +> 16 0 23 4094 topology 4234 6270 +> 15 0 24 4094 topology 4234 6271 +> 16 0 24 4094 topology 4246 6271 +> 15 0 27 3921 topology 4091 6272 +> 16 0 27 3921 topology 4093 6272 +> 15 0 28 3921 topology 4093 6273 +> 16 0 28 3921 topology 4388 6273 +> 15 0 21 3921 topology 4093 6274 +> 16 0 21 3921 topology 4386 6274 +> 15 0 28 3921 topology 4386 6275 +> 16 0 28 3921 topology 4384 6275 +> 15 0 21 3921 topology 4093 6276 +> 16 0 21 3921 topology 4247 6276 +> 15 0 28 3921 topology 4247 6277 +> 16 0 28 3921 topology 4245 6277 +> 15 0 27 3921 topology 4388 6278 +> 16 0 27 3921 topology 4386 6278 +> 15 0 27 3921 topology 4388 6279 +> 16 0 27 3921 topology 4247 6279 +> 15 0 21 3921 topology 4386 6280 +> 16 0 21 3921 topology 4247 6280 +> 15 0 38 0 topology 10 6281 +> 16 0 38 0 topology 4797 6281 +> 15 0 28 4390 topology 4797 6282 +> 16 0 28 4390 topology 4796 6282 +> 15 0 38 0 topology 5 6283 +> 16 0 38 0 topology 3920 6283 +> 15 0 28 3415 topology 3920 6284 +> 16 0 28 3415 topology 3919 6284 +> 15 0 38 0 topology 8 6285 +> 16 0 38 0 topology 868 6285 +> 15 0 28 499 topology 868 6286 +> 16 0 28 499 topology 867 6286 +> 15 0 38 0 topology 3 6287 +> 16 0 38 0 topology 3414 6287 +> 15 0 28 2349 topology 3414 6288 +> 16 0 28 2349 topology 3413 6288 +> 15 0 38 0 topology 4 6289 +> 16 0 38 0 topology 2348 6289 +> 15 0 28 1606 topology 2348 6290 +> 16 0 28 1606 topology 2347 6290 +> 15 0 38 0 topology 7 6291 +> 16 0 38 0 topology 498 6291 +> 15 0 28 21 topology 498 6292 +> 16 0 28 21 topology 497 6292 +> 15 0 38 0 topology 6 6293 +> 16 0 38 0 topology 1605 6293 +> 15 0 28 1189 topology 1605 6294 +> 16 0 28 1189 topology 1604 6294 +> 15 0 38 0 topology 2 6295 +> 16 0 38 0 topology 1188 6295 +> 15 0 28 869 topology 1188 6296 +> 16 0 28 869 topology 1187 6296 +> 15 0 38 0 topology 11 6297 +> 16 0 38 0 topology 4389 6297 +> 15 0 28 3921 topology 4389 6298 +> 16 0 28 3921 topology 4388 6298 +> 15 0 39 0 topology 4797 6299 +> 16 0 39 0 topology 20 6299 +> 15 0 39 0 topology 14 6300 +> 16 0 39 0 topology 3920 6300 +> 15 0 39 0 topology 17 6301 +> 16 0 39 0 topology 868 6301 +> 15 0 39 0 topology 15 6302 +> 16 0 39 0 topology 3414 6302 +> 15 0 39 0 topology 13 6303 +> 16 0 39 0 topology 2348 6303 +> 15 0 39 0 topology 16 6304 +> 16 0 39 0 topology 498 6304 +> 15 0 39 0 topology 18 6305 +> 16 0 39 0 topology 1605 6305 +> 15 0 39 0 topology 12 6306 +> 16 0 39 0 topology 1188 6306 +> 15 0 39 0 topology 19 6307 +> 16 0 39 0 topology 4389 6307 +> 15 0 39 0 topology 14 6308 +> 16 0 39 0 topology 3414 6308 +> 15 0 39 0 topology 15 6309 +> 16 0 39 0 topology 1605 6309 +> 15 0 39 0 topology 17 6310 +> 16 0 39 0 topology 1605 6310 +> 15 0 39 0 topology 3414 6311 +> 16 0 39 0 topology 13 6311 +> 15 0 39 0 topology 3414 6312 +> 16 0 39 0 topology 12 6312 +> 15 0 39 0 topology 16 6313 +> 16 0 39 0 topology 1605 6313 > 7 0 2 9 > 7 0 3 18 > 7 0 3 19 diff --git a/examples/simdag/CMakeLists.txt b/examples/simdag/CMakeLists.txt index 02e1579ee9..a3525c5682 100644 --- a/examples/simdag/CMakeLists.txt +++ b/examples/simdag/CMakeLists.txt @@ -32,7 +32,7 @@ if(NOT WIN32) PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/sd_test") -else(NOT WIN32) +else() target_link_libraries(ex_sd_test simgrid) target_link_libraries(sd_test2 simgrid) target_link_libraries(sd_fail simgrid) @@ -51,7 +51,7 @@ else(NOT WIN32) set_directory_properties( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/sd_test.exe") -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/simdag/dax/CMakeLists.txt b/examples/simdag/dax/CMakeLists.txt index 5711972f46..585e989432 100644 --- a/examples/simdag/dax/CMakeLists.txt +++ b/examples/simdag/dax/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(dax_test dax_test.c) ### Add definitions for compile if(NOT WIN32) target_link_libraries(dax_test simgrid pthread m ) -else(NOT WIN32) +else() target_link_libraries(dax_test simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/simdag/dot/CMakeLists.txt b/examples/simdag/dot/CMakeLists.txt index 09ccb85b76..eaabdf8e40 100644 --- a/examples/simdag/dot/CMakeLists.txt +++ b/examples/simdag/dot/CMakeLists.txt @@ -18,15 +18,15 @@ if(HAVE_GRAPHVIZ) PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/dot_test; ${CMAKE_CURRENT_BINARY_DIR}/simulate_dot;") - else(NOT WIN32) + else() target_link_libraries(dot_test simgrid) #target_link_libraries( ) target_link_libraries(simulate_dot simgrid) #target_link_libraries( ) target_link_libraries(dot_test2 simgrid) #target_link_libraries( ) set_directory_properties( PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${extra_clean_files};${CMAKE_CURRENT_BINARY_DIR}/dot_test; ${CMAKE_CURRENT_BINARY_DIR}/simulate_dot;") - endif(NOT WIN32) -endif(HAVE_GRAPHVIZ) + endif() +endif() set(tesh_files ${tesh_files} diff --git a/examples/simdag/goal/CMakeLists.txt b/examples/simdag/goal/CMakeLists.txt index feab0542d1..c6267e4927 100644 --- a/examples/simdag/goal/CMakeLists.txt +++ b/examples/simdag/goal/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(goal_test goal_test.c) ### Add definitions for compile if(NOT WIN32) target_link_libraries(goal_test simgrid pthread m ) -else(NOT WIN32) +else() target_link_libraries(goal_test simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/simdag/metaxml/CMakeLists.txt b/examples/simdag/metaxml/CMakeLists.txt index a7150cdcbc..3f0417fca7 100644 --- a/examples/simdag/metaxml/CMakeLists.txt +++ b/examples/simdag/metaxml/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(sd_meta sd_meta.c) ### Add definitions for compile if(NOT WIN32) target_link_libraries(sd_meta simgrid pthread m ) -else(NOT WIN32) +else() target_link_libraries(sd_meta simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/simdag/properties/CMakeLists.txt b/examples/simdag/properties/CMakeLists.txt index c7b5192ca1..04e4cce888 100644 --- a/examples/simdag/properties/CMakeLists.txt +++ b/examples/simdag/properties/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(sd_prop sd_prop.c) ### Add definitions for compile if(NOT WIN32) target_link_libraries(sd_prop simgrid pthread m ) -else(NOT WIN32) +else() target_link_libraries(sd_prop simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/simdag/scheduling/CMakeLists.txt b/examples/simdag/scheduling/CMakeLists.txt index 7e07f06097..c562c144e8 100644 --- a/examples/simdag/scheduling/CMakeLists.txt +++ b/examples/simdag/scheduling/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(minmin_test minmin_test.c) ### Add definitions for compile if(NOT WIN32) target_link_libraries(minmin_test simgrid pthread m) -else(NOT WIN32) +else() target_link_libraries(minmin_test simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/examples/simdag/test_simdag_tracing.tesh b/examples/simdag/test_simdag_tracing.tesh index 06da7a3f6d..c02396670a 100644 --- a/examples/simdag/test_simdag_tracing.tesh +++ b/examples/simdag/test_simdag_tracing.tesh @@ -199,54 +199,54 @@ $ tail -n +3 ./simgrid.trace > 8 0 5 24 0.000100 > 8 0 4 25 125000000.000000 > 8 0 5 25 0.000100 -> 15 0 6 0 G 10 0 -> 16 0 6 0 G 25 0 -> 15 0 7 0 G 25 1 -> 16 0 7 0 G 12 1 -> 15 0 7 0 G 12 2 -> 16 0 7 0 G 11 2 -> 15 0 8 0 G 11 3 -> 16 0 8 0 G 1 3 -> 15 0 7 0 G 12 4 -> 16 0 7 0 G 14 4 -> 15 0 8 0 G 14 5 -> 16 0 8 0 G 3 5 -> 15 0 7 0 G 12 6 -> 16 0 7 0 G 19 6 -> 15 0 8 0 G 19 7 -> 16 0 8 0 G 6 7 -> 15 0 7 0 G 12 8 -> 16 0 7 0 G 15 8 -> 15 0 8 0 G 15 9 -> 16 0 8 0 G 4 9 -> 15 0 7 0 G 12 10 -> 16 0 7 0 G 23 10 -> 15 0 7 0 G 23 11 -> 16 0 7 0 G 18 11 -> 15 0 7 0 G 18 12 -> 16 0 7 0 G 16 12 -> 15 0 7 0 G 16 13 -> 16 0 7 0 G 24 13 -> 15 0 7 0 G 24 14 -> 16 0 7 0 G 22 14 -> 15 0 8 0 G 22 15 -> 16 0 8 0 G 9 15 -> 15 0 7 0 G 24 16 -> 16 0 7 0 G 20 16 -> 15 0 8 0 G 20 17 -> 16 0 8 0 G 7 17 -> 15 0 7 0 G 24 18 -> 16 0 7 0 G 17 18 -> 15 0 8 0 G 17 19 -> 16 0 8 0 G 5 19 -> 15 0 7 0 G 24 20 -> 16 0 7 0 G 13 20 -> 15 0 8 0 G 13 21 -> 16 0 8 0 G 2 21 -> 15 0 7 0 G 24 22 -> 16 0 7 0 G 21 22 -> 15 0 8 0 G 21 23 -> 16 0 8 0 G 8 23 +> 15 0 6 0 topology 10 0 +> 16 0 6 0 topology 25 0 +> 15 0 7 0 topology 25 1 +> 16 0 7 0 topology 12 1 +> 15 0 7 0 topology 12 2 +> 16 0 7 0 topology 11 2 +> 15 0 8 0 topology 11 3 +> 16 0 8 0 topology 1 3 +> 15 0 7 0 topology 12 4 +> 16 0 7 0 topology 14 4 +> 15 0 8 0 topology 14 5 +> 16 0 8 0 topology 3 5 +> 15 0 7 0 topology 12 6 +> 16 0 7 0 topology 19 6 +> 15 0 8 0 topology 19 7 +> 16 0 8 0 topology 6 7 +> 15 0 7 0 topology 12 8 +> 16 0 7 0 topology 15 8 +> 15 0 8 0 topology 15 9 +> 16 0 8 0 topology 4 9 +> 15 0 7 0 topology 12 10 +> 16 0 7 0 topology 23 10 +> 15 0 7 0 topology 23 11 +> 16 0 7 0 topology 18 11 +> 15 0 7 0 topology 18 12 +> 16 0 7 0 topology 16 12 +> 15 0 7 0 topology 16 13 +> 16 0 7 0 topology 24 13 +> 15 0 7 0 topology 24 14 +> 16 0 7 0 topology 22 14 +> 15 0 8 0 topology 22 15 +> 16 0 8 0 topology 9 15 +> 15 0 7 0 topology 24 16 +> 16 0 7 0 topology 20 16 +> 15 0 8 0 topology 20 17 +> 16 0 8 0 topology 7 17 +> 15 0 7 0 topology 24 18 +> 16 0 7 0 topology 17 18 +> 15 0 8 0 topology 17 19 +> 16 0 8 0 topology 5 19 +> 15 0 7 0 topology 24 20 +> 16 0 7 0 topology 13 20 +> 15 0 8 0 topology 13 21 +> 16 0 8 0 topology 2 21 +> 15 0 7 0 topology 24 22 +> 16 0 7 0 topology 21 22 +> 15 0 8 0 topology 21 23 +> 16 0 8 0 topology 8 23 > 1 9 3 btaskA "0.000000 0.000985 0.041631" > 1 10 1 ptaskA "0.000000 0.000985 0.041631" > 1 11 3 btaskB "0.176643 0.364602 0.091331" diff --git a/examples/smpi/CMakeLists.txt b/examples/smpi/CMakeLists.txt index ad50c21c49..4f8d6218d8 100644 --- a/examples/smpi/CMakeLists.txt +++ b/examples/smpi/CMakeLists.txt @@ -1,7 +1,11 @@ cmake_minimum_required(VERSION 2.6) if(enable_smpi) - set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/bin/smpicc") + if(WIN32) + set(CMAKE_C_FLAGS "-include ${CMAKE_HOME_DIRECTORY}/include/smpi/smpi_main.h") + else() + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + endif() set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") @@ -24,7 +28,7 @@ if(enable_smpi) target_link_libraries(mc_bugged2 m simgrid smpi ) target_link_libraries(smpi_replay m simgrid smpi ) -endif(enable_smpi) +endif() set(tesh_files ${tesh_files} @@ -61,4 +65,4 @@ set(txt_files ${CMAKE_CURRENT_SOURCE_DIR}/replay/one_trace ${CMAKE_CURRENT_SOURCE_DIR}/replay/split_traces PARENT_SCOPE - ) \ No newline at end of file + ) diff --git a/examples/smpi/MM/CMakeLists.txt b/examples/smpi/MM/CMakeLists.txt index f61e470054..ece8c47d8e 100644 --- a/examples/smpi/MM/CMakeLists.txt +++ b/examples/smpi/MM/CMakeLists.txt @@ -1,21 +1,16 @@ cmake_minimum_required(VERSION 2.6) if(enable_smpi) - set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/bin/smpicc") - + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") - include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") -add_executable(MM_mpi MM_mpi.c 2.5D_MM.c Summa.c Matrix_init.c) - -### Add definitions for compile -if(NOT WIN32) - target_link_libraries(MM_mpi simgrid pthread m smpi) -else(NOT WIN32) - target_link_libraries(MM_mpi simgrid smpi) -endif(NOT WIN32) -endif(enable_smpi) + if(NOT WIN32) + add_executable(MM_mpi MM_mpi.c 2.5D_MM.c Summa.c Matrix_init.c) + ### Add definitions for compile + target_link_libraries(MM_mpi simgrid pthread m smpi) + endif() +endif() set(tesh_files ${tesh_files} diff --git a/examples/smpi/MM/MM_mpi.c b/examples/smpi/MM/MM_mpi.c index df0b9bcc4d..d112cdea18 100644 --- a/examples/smpi/MM/MM_mpi.c +++ b/examples/smpi/MM/MM_mpi.c @@ -11,11 +11,11 @@ /*int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); */ +#include +#include #include #include #include -#include -#include XBT_LOG_NEW_DEFAULT_CATEGORY(MM_mpi, "Messages specific for this msg example"); diff --git a/examples/smpi/NAS/MPI_dummy/mpi_dummy.c b/examples/smpi/NAS/MPI_dummy/mpi_dummy.c index d2cbfb84bc..4cb7f06e63 100644 --- a/examples/smpi/NAS/MPI_dummy/mpi_dummy.c +++ b/examples/smpi/NAS/MPI_dummy/mpi_dummy.c @@ -1,8 +1,6 @@ +#include #include "mpi.h" #include "wtime.h" -#include - - void mpi_error( void ) { diff --git a/examples/smpi/bcbench.c b/examples/smpi/bcbench.c index 75defac0eb..5cd2f64280 100644 --- a/examples/smpi/bcbench.c +++ b/examples/smpi/bcbench.c @@ -8,6 +8,11 @@ #include #include +#ifdef _WIN32 + #define srandom srand + #define random rand +#endif + #define GETTIMEOFDAY_ERROR 1 #define N_START 1 diff --git a/examples/smpi/replay/replay.c b/examples/smpi/replay/replay.c index 3aad3c2b52..f508f9d958 100644 --- a/examples/smpi/replay/replay.c +++ b/examples/smpi/replay/replay.c @@ -4,6 +4,7 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ +#include #include "smpi/smpi.h" int main(int argc, char *argv[]) diff --git a/examples/smpi/tracing/smpi_traced.c b/examples/smpi/tracing/smpi_traced.c index f23bb7b8fa..6c9e8febde 100644 --- a/examples/smpi/tracing/smpi_traced.c +++ b/examples/smpi/tracing/smpi_traced.c @@ -4,8 +4,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "mpi.h" #include +#include "mpi.h" #include "instr/instr.h" #define DATATOSENT 100000 diff --git a/examples/smpi/tracing/smpi_traced_simple.c b/examples/smpi/tracing/smpi_traced_simple.c index 1de11155f5..ff92c0e3f9 100644 --- a/examples/smpi/tracing/smpi_traced_simple.c +++ b/examples/smpi/tracing/smpi_traced_simple.c @@ -3,8 +3,9 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include + #include +#include int main(int argc, char *argv[]) { diff --git a/include/gras/process.h b/include/gras/process.h index 073df64e27..5fe6d6ead0 100644 --- a/include/gras/process.h +++ b/include/gras/process.h @@ -18,7 +18,7 @@ SG_BEGIN_DECL() * @{ */ /** \brief Create a new thread */ -void gras_agent_spawn(const char *name, xbt_main_func_t code, +XBT_PUBLIC(void) gras_agent_spawn(const char *name, xbt_main_func_t code, int argc, char *argv[], xbt_dict_t properties); /** @} */ diff --git a/include/gras/virtu.h b/include/gras/virtu.h index d4b80ca809..c735cdf0b8 100644 --- a/include/gras/virtu.h +++ b/include/gras/virtu.h @@ -17,14 +17,14 @@ SG_BEGIN_DECL() /* Initialization of the simulation world. Do not call them in RL. Indeed, do not call them at all. Let gras_stub_generator do it for you. */ -void gras_global_init(int *argc, char **argv); -void gras_create_environment(const char *file); -void gras_function_register(const char *name, xbt_main_func_t code); -void gras_function_register_default(xbt_main_func_t code); -void gras_launch_application(const char *file); -void gras_load_environment_script(const char *file); -void gras_clean(void); -void gras_main(void); +XBT_PUBLIC(void) gras_global_init(int *argc, char **argv); +XBT_PUBLIC(void) gras_create_environment(const char *file); +XBT_PUBLIC(void) gras_function_register(const char *name, xbt_main_func_t code); +XBT_PUBLIC(void) gras_function_register_default(xbt_main_func_t code); +XBT_PUBLIC(void) gras_launch_application(const char *file); +XBT_PUBLIC(void) gras_load_environment_script(const char *file); +XBT_PUBLIC(void) gras_clean(void); +XBT_PUBLIC(void) gras_main(void); /** @addtogroup GRAS_virtu diff --git a/include/msg/msg.h b/include/msg/msg.h index 19f733a196..a0f6261927 100644 --- a/include/msg/msg.h +++ b/include/msg/msg.h @@ -273,7 +273,7 @@ void MSG_mailbox_set_async(const char *alias); /************************** Action handling **********************************/ -msg_error_t MSG_action_trace_run(char *path); +XBT_PUBLIC(msg_error_t) MSG_action_trace_run(char *path); #ifdef MSG_USE_DEPRECATED diff --git a/include/smpi/mpif.h b/include/smpi/mpif.h index 5222b5c2c1..6c71f116e7 100644 --- a/include/smpi/mpif.h +++ b/include/smpi/mpif.h @@ -77,7 +77,7 @@ > MPI_INTEGER8, MPI_REAL, MPI_REAL4, MPI_REAL8, > MPI_DOUBLE_PRECISION, MPI_COMPLEX, MPI_DOUBLE_COMPLEX, > MPI_2INTEGER, MPI_LOGICAL1, MPI_LOGICAL2, MPI_LOGICAL4, - > MPI_LOGICAL8 + > MPI_LOGICAL8, MPI_2REAL, MPI_2DOUBLE_PRECISION parameter(MPI_DATATYPE_NULL=-1) parameter(MPI_BYTE=0) parameter(MPI_CHARACTER=1) @@ -98,6 +98,8 @@ parameter(MPI_LOGICAL2=16) parameter(MPI_LOGICAL4=17) parameter(MPI_LOGICAL8=18) + parameter(MPI_2REAL=19) + parameter(MPI_2DOUBLE_PRECISION=19) ! These should be ordered as in smpi_f77.c integer MPI_OP_NULL,MPI_MAX, MPI_MIN, MPI_MAXLOC, MPI_MINLOC, @@ -128,4 +130,7 @@ > MPI_ALLTOALL external MPI_WTIME + external MPI_WTICK + double precision MPI_WTIME + double precision MPI_WTICK diff --git a/include/smpi/smpi.h b/include/smpi/smpi.h index 50e61d152b..567cafa3b4 100644 --- a/include/smpi/smpi.h +++ b/include/smpi/smpi.h @@ -15,9 +15,15 @@ #define sleep(x) smpi_sleep(x) #define gettimeofday(x, y) smpi_gettimeofday(x, y) +#ifdef _WIN32 +#define MPI_CALL(type,name,args) \ + type name args; \ + type P##name args +#else #define MPI_CALL(type,name,args) \ type name args __attribute__((weak)); \ type P##name args +#endif SG_BEGIN_DECL() #define MPI_THREAD_SINGLE 0 @@ -53,6 +59,8 @@ SG_BEGIN_DECL() #define MPI_ERR_GROUP 10 #define MPI_ERR_OP 11 #define MPI_ERR_OTHER 12 +#define MPI_ERR_IN_STATUS 13 +#define MPI_ERR_PENDING 14 #define MPI_IDENT 0 #define MPI_SIMILAR 1 #define MPI_UNEQUAL 2 @@ -61,6 +69,13 @@ SG_BEGIN_DECL() #define MPI_TAG_UB 1000000 #define MPI_HOST 0 #define MPI_IO 0 +#define MPI_BSEND_OVERHEAD 0 + +typedef enum MPIR_Topo_type { + MPI_GRAPH=1, + MPI_CART=2, + MPI_DIST_GRAPH=3 +} MPIR_Topo_type; typedef ptrdiff_t MPI_Aint; typedef long long MPI_Offset; @@ -79,47 +94,49 @@ typedef struct { #define MPI_STATUSES_IGNORE NULL #define MPI_DATATYPE_NULL NULL -extern MPI_Datatype MPI_CHAR; -extern MPI_Datatype MPI_SHORT; -extern MPI_Datatype MPI_INT; -extern MPI_Datatype MPI_LONG; -extern MPI_Datatype MPI_LONG_LONG; +XBT_PUBLIC( MPI_Datatype ) MPI_CHAR; +XBT_PUBLIC( MPI_Datatype ) MPI_SHORT; +XBT_PUBLIC( MPI_Datatype ) MPI_INT; +XBT_PUBLIC( MPI_Datatype ) MPI_LONG; +XBT_PUBLIC( MPI_Datatype ) MPI_LONG_LONG; #define MPI_LONG_LONG_INT MPI_LONG_LONG -extern MPI_Datatype MPI_SIGNED_CHAR; -extern MPI_Datatype MPI_UNSIGNED_CHAR; -extern MPI_Datatype MPI_UNSIGNED_SHORT; -extern MPI_Datatype MPI_UNSIGNED; -extern MPI_Datatype MPI_UNSIGNED_LONG; -extern MPI_Datatype MPI_UNSIGNED_LONG_LONG; -extern MPI_Datatype MPI_FLOAT; -extern MPI_Datatype MPI_DOUBLE; -extern MPI_Datatype MPI_LONG_DOUBLE; -extern MPI_Datatype MPI_WCHAR; -extern MPI_Datatype MPI_C_BOOL; -extern MPI_Datatype MPI_INT8_T; -extern MPI_Datatype MPI_INT16_T; -extern MPI_Datatype MPI_INT32_T; -extern MPI_Datatype MPI_INT64_T; -extern MPI_Datatype MPI_UINT8_T; +XBT_PUBLIC( MPI_Datatype ) MPI_SIGNED_CHAR; +XBT_PUBLIC( MPI_Datatype ) MPI_UNSIGNED_CHAR; +XBT_PUBLIC( MPI_Datatype ) MPI_UNSIGNED_SHORT; +XBT_PUBLIC( MPI_Datatype ) MPI_UNSIGNED; +XBT_PUBLIC( MPI_Datatype ) MPI_UNSIGNED_LONG; +XBT_PUBLIC( MPI_Datatype ) MPI_UNSIGNED_LONG_LONG; +XBT_PUBLIC( MPI_Datatype ) MPI_FLOAT; +XBT_PUBLIC( MPI_Datatype ) MPI_DOUBLE; +XBT_PUBLIC( MPI_Datatype ) MPI_LONG_DOUBLE; +XBT_PUBLIC( MPI_Datatype ) MPI_WCHAR; +XBT_PUBLIC( MPI_Datatype ) MPI_C_BOOL; +XBT_PUBLIC( MPI_Datatype ) MPI_INT8_T; +XBT_PUBLIC( MPI_Datatype ) MPI_INT16_T; +XBT_PUBLIC( MPI_Datatype ) MPI_INT32_T; +XBT_PUBLIC( MPI_Datatype ) MPI_INT64_T; +XBT_PUBLIC( MPI_Datatype ) MPI_UINT8_T; #define MPI_BYTE MPI_UINT8_T -extern MPI_Datatype MPI_UINT16_T; -extern MPI_Datatype MPI_UINT32_T; -extern MPI_Datatype MPI_UINT64_T; -extern MPI_Datatype MPI_C_FLOAT_COMPLEX; +XBT_PUBLIC( MPI_Datatype ) MPI_UINT16_T; +XBT_PUBLIC( MPI_Datatype ) MPI_UINT32_T; +XBT_PUBLIC( MPI_Datatype ) MPI_UINT64_T; +XBT_PUBLIC( MPI_Datatype ) MPI_C_FLOAT_COMPLEX; #define MPI_C_COMPLEX MPI_C_FLOAT_COMPLEX -extern MPI_Datatype MPI_C_DOUBLE_COMPLEX; -extern MPI_Datatype MPI_C_LONG_DOUBLE_COMPLEX; -extern MPI_Datatype MPI_AINT; -extern MPI_Datatype MPI_OFFSET; -extern MPI_Datatype MPI_LB; -extern MPI_Datatype MPI_UB; +XBT_PUBLIC( MPI_Datatype ) MPI_C_DOUBLE_COMPLEX; +XBT_PUBLIC( MPI_Datatype ) MPI_C_LONG_DOUBLE_COMPLEX; +XBT_PUBLIC( MPI_Datatype ) MPI_AINT; +XBT_PUBLIC( MPI_Datatype ) MPI_OFFSET; +XBT_PUBLIC( MPI_Datatype ) MPI_LB; +XBT_PUBLIC( MPI_Datatype ) MPI_UB; //The following are datatypes for the MPI functions MPI_MAXLOC and MPI_MINLOC. -extern MPI_Datatype MPI_FLOAT_INT; -extern MPI_Datatype MPI_LONG_INT; -extern MPI_Datatype MPI_DOUBLE_INT; -extern MPI_Datatype MPI_SHORT_INT; -extern MPI_Datatype MPI_2INT; -extern MPI_Datatype MPI_LONG_DOUBLE_INT; +XBT_PUBLIC(MPI_Datatype) MPI_FLOAT_INT; +XBT_PUBLIC(MPI_Datatype) MPI_LONG_INT; +XBT_PUBLIC(MPI_Datatype) MPI_DOUBLE_INT; +XBT_PUBLIC(MPI_Datatype) MPI_SHORT_INT; +XBT_PUBLIC(MPI_Datatype) MPI_2INT; +XBT_PUBLIC(MPI_Datatype) MPI_LONG_DOUBLE_INT; +XBT_PUBLIC(MPI_Datatype) MPI_2FLOAT; +XBT_PUBLIC(MPI_Datatype) MPI_2DOUBLE; typedef void MPI_User_function(void *invec, void *inoutvec, int *len, MPI_Datatype * datatype); @@ -127,31 +144,31 @@ struct s_smpi_mpi_op; typedef struct s_smpi_mpi_op *MPI_Op; #define MPI_OP_NULL NULL -extern MPI_Op MPI_MAX; -extern MPI_Op MPI_MIN; -extern MPI_Op MPI_MAXLOC; -extern MPI_Op MPI_MINLOC; -extern MPI_Op MPI_SUM; -extern MPI_Op MPI_PROD; -extern MPI_Op MPI_LAND; -extern MPI_Op MPI_LOR; -extern MPI_Op MPI_LXOR; -extern MPI_Op MPI_BAND; -extern MPI_Op MPI_BOR; -extern MPI_Op MPI_BXOR; +XBT_PUBLIC( MPI_Op ) MPI_MAX; +XBT_PUBLIC( MPI_Op ) MPI_MIN; +XBT_PUBLIC( MPI_Op ) MPI_MAXLOC; +XBT_PUBLIC( MPI_Op ) MPI_MINLOC; +XBT_PUBLIC( MPI_Op ) MPI_SUM; +XBT_PUBLIC( MPI_Op ) MPI_PROD; +XBT_PUBLIC( MPI_Op ) MPI_LAND; +XBT_PUBLIC( MPI_Op ) MPI_LOR; +XBT_PUBLIC( MPI_Op ) MPI_LXOR; +XBT_PUBLIC( MPI_Op ) MPI_BAND; +XBT_PUBLIC( MPI_Op ) MPI_BOR; +XBT_PUBLIC( MPI_Op ) MPI_BXOR; struct s_smpi_mpi_group; typedef struct s_smpi_mpi_group *MPI_Group; #define MPI_GROUP_NULL NULL -extern MPI_Group MPI_GROUP_EMPTY; +XBT_PUBLIC( MPI_Group ) MPI_GROUP_EMPTY; struct s_smpi_mpi_communicator; typedef struct s_smpi_mpi_communicator *MPI_Comm; #define MPI_COMM_NULL NULL -extern MPI_Comm MPI_COMM_WORLD; +XBT_PUBLIC( MPI_Comm ) MPI_COMM_WORLD; #define MPI_COMM_SELF smpi_process_comm_self() struct s_smpi_mpi_request; @@ -392,6 +409,11 @@ typedef int MPI_Copy_function(MPI_Comm oldcomm, int keyval, void* extra_state, v typedef int MPI_Delete_function(MPI_Comm comm, int keyval, void* attribute_val, void* extra_state); XBT_PUBLIC(MPI_Datatype) MPI_PACKED; +XBT_PUBLIC(MPI_Errhandler*) MPI_ERRORS_RETURN; +XBT_PUBLIC(MPI_Errhandler*) MPI_ERRORS_ARE_FATAL; +XBT_PUBLIC(MPI_Errhandler*) MPI_ERRHANDLER_NULL; + + MPI_CALL(XBT_PUBLIC(int), MPI_Pack_size, (int incount, MPI_Datatype datatype, MPI_Comm comm, int* size)); MPI_CALL(XBT_PUBLIC(int), MPI_Cart_coords, (MPI_Comm comm, int rank, int maxdims, int* coords)); MPI_CALL(XBT_PUBLIC(int), MPI_Cart_create, (MPI_Comm comm_old, int ndims, int* dims, int* periods, int reorder, MPI_Comm* comm_cart)); @@ -448,7 +470,6 @@ MPI_CALL(XBT_PUBLIC(int), MPI_Pcontrol, (const int level )); //FIXME: End of all the not yet implemented stuff // smpi functions -XBT_IMPORT_NO_EXPORT(int) smpi_simulated_main(int argc, char **argv); XBT_PUBLIC(MPI_Comm) smpi_process_comm_self(void); /* XBT_PUBLIC(void) smpi_exit(int); @@ -489,7 +510,9 @@ XBT_PUBLIC(void*) smpi_shared_set_call(const char* func, const char* input, void : smpi_shared_set_call(#func, input, func(__VA_ARGS__))) /* Fortran specific stuff */ -XBT_PUBLIC(int) MAIN__(void); +XBT_PUBLIC(int) __attribute__((weak)) smpi_simulated_main(int argc, char** argv); +XBT_PUBLIC(int) __attribute__((weak)) MAIN__(void); +XBT_PUBLIC(int) smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]); XBT_PUBLIC(int) smpi_process_index(void); diff --git a/include/smpi/smpi_main.h b/include/smpi/smpi_main.h new file mode 100644 index 0000000000..0e5d259aa5 --- /dev/null +++ b/include/smpi/smpi_main.h @@ -0,0 +1,6 @@ +#define main smpi_simulated_main(int argc, char **argv);\ +int main(int argc, char **argv){\ +MAIN__(&smpi_simulated_main,&argc,argv);\ +return 0;\ +}\ +int smpi_simulated_main diff --git a/include/surf/surf_routing.h b/include/surf/surf_routing.h index 2d0e95ed6c..86379ba18c 100644 --- a/include/surf/surf_routing.h +++ b/include/surf/surf_routing.h @@ -10,34 +10,34 @@ #include "xbt/lib.h" #include "simgrid/platf_interface.h" -extern xbt_lib_t host_lib; -extern int ROUTING_HOST_LEVEL; //Routing level -extern int SURF_CPU_LEVEL; //Surf cpu level -extern int SURF_WKS_LEVEL; //Surf workstation level -extern int SIMIX_HOST_LEVEL; //Simix level -extern int MSG_HOST_LEVEL; //Msg level -extern int SD_HOST_LEVEL; //Simdag level -extern int COORD_HOST_LEVEL; //Coordinates level -extern int NS3_HOST_LEVEL; //host node for ns3 - -extern xbt_lib_t link_lib; -extern int SD_LINK_LEVEL; //Simdag level -extern int SURF_LINK_LEVEL; //Surf level -extern int NS3_LINK_LEVEL; //link for ns3 - -extern xbt_lib_t as_router_lib; -extern int ROUTING_ASR_LEVEL; //Routing level -extern int COORD_ASR_LEVEL; //Coordinates level -extern int NS3_ASR_LEVEL; //host node for ns3 -extern int ROUTING_PROP_ASR_LEVEL; //Properties for AS and router - -extern xbt_lib_t storage_lib; -extern int ROUTING_STORAGE_LEVEL; //Routing storage level -extern int ROUTING_STORAGE_HOST_LEVEL; -extern int SURF_STORAGE_LEVEL; - -extern xbt_lib_t storage_type_lib; -extern int ROUTING_STORAGE_TYPE_LEVEL; //Routing storage_type level +XBT_PUBLIC(xbt_lib_t) host_lib; +XBT_PUBLIC(int) ROUTING_HOST_LEVEL; //Routing level +XBT_PUBLIC(int) SURF_CPU_LEVEL; //Surf cpu level +XBT_PUBLIC(int) SURF_WKS_LEVEL; //Surf workstation level +XBT_PUBLIC(int) SIMIX_HOST_LEVEL; //Simix level +XBT_PUBLIC(int) MSG_HOST_LEVEL; //Msg level +XBT_PUBLIC(int) SD_HOST_LEVEL; //Simdag level +XBT_PUBLIC(int) COORD_HOST_LEVEL; //Coordinates level +XBT_PUBLIC(int) NS3_HOST_LEVEL; //host node for ns3 + +XBT_PUBLIC(xbt_lib_t) link_lib; +XBT_PUBLIC(int) SD_LINK_LEVEL; //Simdag level +XBT_PUBLIC(int) SURF_LINK_LEVEL; //Surf level +XBT_PUBLIC(int) NS3_LINK_LEVEL; //link for ns3 + +XBT_PUBLIC(xbt_lib_t) as_router_lib; +XBT_PUBLIC(int) ROUTING_ASR_LEVEL; //Routing level +XBT_PUBLIC(int) COORD_ASR_LEVEL; //Coordinates level +XBT_PUBLIC(int) NS3_ASR_LEVEL; //host node for ns3 +XBT_PUBLIC(int) ROUTING_PROP_ASR_LEVEL; //Properties for AS and router + +XBT_PUBLIC(xbt_lib_t) storage_lib; +XBT_PUBLIC(int) ROUTING_STORAGE_LEVEL; //Routing storage level +XBT_PUBLIC(int) ROUTING_STORAGE_HOST_LEVEL; +XBT_PUBLIC(int) SURF_STORAGE_LEVEL; + +XBT_PUBLIC(xbt_lib_t) storage_type_lib; +XBT_PUBLIC(int) ROUTING_STORAGE_TYPE_LEVEL; //Routing storage_type level /* The callbacks to register for the routing to work */ void routing_AS_begin(sg_platf_AS_cbarg_t AS); diff --git a/include/xbt/ex.h b/include/xbt/ex.h index a6db6fc792..2d17bffe1c 100644 --- a/include/xbt/ex.h +++ b/include/xbt/ex.h @@ -313,12 +313,12 @@ XBT_PUBLIC_DATA(const xbt_running_ctx_t) __xbt_ex_ctx_initializer; /* the exception context */ typedef xbt_running_ctx_t *(*xbt_running_ctx_fetcher_t) (void); XBT_PUBLIC_DATA(xbt_running_ctx_fetcher_t) __xbt_running_ctx_fetch; -extern xbt_running_ctx_t *__xbt_ex_ctx_default(void); +XBT_PUBLIC( xbt_running_ctx_t *)__xbt_ex_ctx_default(void); /* the termination handler */ typedef void (*ex_term_cb_t) (xbt_ex_t *); XBT_PUBLIC_DATA(ex_term_cb_t) __xbt_ex_terminate; -extern void __xbt_ex_terminate_default(xbt_ex_t * e); +XBT_PUBLIC( void )__xbt_ex_terminate_default(xbt_ex_t * e); /** @brief Introduce a block where exception may be dealed with * @hideinitializer diff --git a/include/xbt/mmalloc.h b/include/xbt/mmalloc.h index 6963c4a7e3..74904083c6 100644 --- a/include/xbt/mmalloc.h +++ b/include/xbt/mmalloc.h @@ -30,32 +30,32 @@ typedef struct mdesc *xbt_mheap_t; /* Allocate SIZE bytes of memory (and memset it to 0). */ -extern void *mmalloc(xbt_mheap_t md, size_t size); +XBT_PUBLIC( void ) *mmalloc(xbt_mheap_t md, size_t size); /* Allocate SIZE bytes of memory (and don't mess with it) */ void *mmalloc_no_memset(xbt_mheap_t mdp, size_t size); /* Re-allocate the previously allocated block in void*, making the new block SIZE bytes long. */ -extern void *mrealloc(xbt_mheap_t md, void *ptr, size_t size); +XBT_PUBLIC( void ) *mrealloc(xbt_mheap_t md, void *ptr, size_t size); /* Free a block allocated by `mmalloc', `mrealloc' or `mcalloc'. */ -extern void mfree(xbt_mheap_t md, void *ptr); +XBT_PUBLIC( void ) mfree(xbt_mheap_t md, void *ptr); /* Allocate SIZE bytes allocated to ALIGNMENT bytes. */ -extern void *mmemalign(xbt_mheap_t md, size_t alignment, size_t size); +XBT_PUBLIC( void ) *mmemalign(xbt_mheap_t md, size_t alignment, size_t size); /* Allocate SIZE bytes on a page boundary. */ -extern void *mvalloc(xbt_mheap_t md, size_t size); +XBT_PUBLIC( void ) *mvalloc(xbt_mheap_t md, size_t size); -extern xbt_mheap_t xbt_mheap_new(int fd, void *baseaddr); +XBT_PUBLIC( xbt_mheap_t ) xbt_mheap_new(int fd, void *baseaddr); -extern void xbt_mheap_destroy_no_free(xbt_mheap_t md); +XBT_PUBLIC( void ) xbt_mheap_destroy_no_free(xbt_mheap_t md); -extern void *xbt_mheap_destroy(xbt_mheap_t md); +XBT_PUBLIC( void ) *xbt_mheap_destroy(xbt_mheap_t md); /* return the heap used when NULL is passed as first argument to any mm* function */ -extern xbt_mheap_t mmalloc_get_default_md(void); +XBT_PUBLIC( xbt_mheap_t ) mmalloc_get_default_md(void); /* To change the heap used when using the legacy version malloc/free/realloc and such */ void mmalloc_set_current_heap(xbt_mheap_t new_heap); diff --git a/include/xbt/module.h b/include/xbt/module.h index af669467bf..f3f5a44d22 100644 --- a/include/xbt/module.h +++ b/include/xbt/module.h @@ -11,7 +11,7 @@ #include /* XBT_PUBLIC */ -extern char *xbt_binary_name; +XBT_PUBLIC(char *)xbt_binary_name; XBT_PUBLIC(void) xbt_init(int *argc, char **argv); XBT_PUBLIC(void) xbt_exit(void); diff --git a/src/include/simgrid/platf_interface.h b/src/include/simgrid/platf_interface.h index 691f2381fb..63cff21115 100644 --- a/src/include/simgrid/platf_interface.h +++ b/src/include/simgrid/platf_interface.h @@ -13,8 +13,8 @@ #include "xbt/RngStream.h" /* Module management functions */ -void sg_platf_init(void); -void sg_platf_exit(void); +XBT_PUBLIC(void) sg_platf_init(void); +XBT_PUBLIC(void) sg_platf_exit(void); /* Managing the parsing callbacks */ @@ -42,43 +42,42 @@ typedef void (*sg_platf_mstorage_cb_t)(sg_platf_mstorage_cbarg_t); /* TUTORIAL: New TAG */ typedef void (*sg_platf_gpu_cb_t)(sg_platf_gpu_cbarg_t); -void sg_platf_gpu_add_cb(sg_platf_gpu_cb_t); +XBT_PUBLIC(void) sg_platf_gpu_add_cb(sg_platf_gpu_cb_t); /* ***************************************** */ - -void sg_platf_host_add_cb(sg_platf_host_cb_t); -void sg_platf_host_link_add_cb(sg_platf_host_link_cb_t); -void sg_platf_router_add_cb(sg_platf_router_cb_t); -void sg_platf_link_add_cb(sg_platf_link_cb_t); -void sg_platf_peer_add_cb(sg_platf_peer_cb_t fct); -void sg_platf_cluster_add_cb(sg_platf_cluster_cb_t fct); -void sg_platf_cabinet_add_cb(sg_platf_cabinet_cb_t fct); -void sg_platf_postparse_add_cb(void_f_void_t fct); -void sg_platf_AS_begin_add_cb(sg_platf_AS_cb_t fct); -void sg_platf_AS_end_add_cb(sg_platf_AS_cb_t fct); -void sg_platf_prop_add_cb(sg_platf_prop_cb_t fct); - -void sg_platf_route_add_cb(sg_platf_route_cb_t); -void sg_platf_ASroute_add_cb(sg_platf_route_cb_t); -void sg_platf_bypassRoute_add_cb(sg_platf_route_cb_t); -void sg_platf_bypassASroute_add_cb(sg_platf_route_cb_t); - -void sg_platf_trace_add_cb(sg_platf_trace_cb_t); -void sg_platf_trace_connect_add_cb(sg_platf_trace_connect_cb_t); - -void sg_platf_storage_add_cb(sg_platf_storage_cb_t fct); -void sg_platf_mstorage_add_cb(sg_platf_mstorage_cb_t fct); -void sg_platf_storage_type_add_cb(sg_platf_storage_type_cb_t fct); -void sg_platf_mount_add_cb(sg_platf_mount_cb_t fct); +XBT_PUBLIC(void) sg_platf_host_add_cb(sg_platf_host_cb_t); +XBT_PUBLIC(void) sg_platf_host_link_add_cb(sg_platf_host_link_cb_t); +XBT_PUBLIC(void) sg_platf_router_add_cb(sg_platf_router_cb_t); +XBT_PUBLIC(void) sg_platf_link_add_cb(sg_platf_link_cb_t); +XBT_PUBLIC(void) sg_platf_peer_add_cb(sg_platf_peer_cb_t fct); +XBT_PUBLIC(void) sg_platf_cluster_add_cb(sg_platf_cluster_cb_t fct); +XBT_PUBLIC(void) sg_platf_cabinet_add_cb(sg_platf_cabinet_cb_t fct); +XBT_PUBLIC(void) sg_platf_postparse_add_cb(void_f_void_t fct); +XBT_PUBLIC(void) sg_platf_AS_begin_add_cb(sg_platf_AS_cb_t fct); +XBT_PUBLIC(void) sg_platf_AS_end_add_cb(sg_platf_AS_cb_t fct); +XBT_PUBLIC(void) sg_platf_prop_add_cb(sg_platf_prop_cb_t fct); + +XBT_PUBLIC(void) sg_platf_route_add_cb(sg_platf_route_cb_t); +XBT_PUBLIC(void) sg_platf_ASroute_add_cb(sg_platf_route_cb_t); +XBT_PUBLIC(void) sg_platf_bypassRoute_add_cb(sg_platf_route_cb_t); +XBT_PUBLIC(void) sg_platf_bypassASroute_add_cb(sg_platf_route_cb_t); + +XBT_PUBLIC(void) sg_platf_trace_add_cb(sg_platf_trace_cb_t); +XBT_PUBLIC(void) sg_platf_trace_connect_add_cb(sg_platf_trace_connect_cb_t); + +XBT_PUBLIC(void) sg_platf_storage_add_cb(sg_platf_storage_cb_t fct); +XBT_PUBLIC(void) sg_platf_mstorage_add_cb(sg_platf_mstorage_cb_t fct); +XBT_PUBLIC(void) sg_platf_storage_type_add_cb(sg_platf_storage_type_cb_t fct); +XBT_PUBLIC(void) sg_platf_mount_add_cb(sg_platf_mount_cb_t fct); /** \brief Pick the right models for CPU, net and workstation, and call their model_init_preparse * * Must be called within parsing/creating the environment (after the s, if any, and before or friends such as ) */ -void surf_config_models_setup(void); +XBT_PUBLIC(void) surf_config_models_setup(void); /* RngStream management functions */ -void sg_platf_rng_stream_init(unsigned long seed[6]); -RngStream sg_platf_rng_stream_get(const char* id); +XBT_PUBLIC(void) sg_platf_rng_stream_init(unsigned long seed[6]); +XBT_PUBLIC(RngStream) sg_platf_rng_stream_get(const char* id); #endif /* SG_PLATF_INTERFACE_H */ diff --git a/src/include/surf/maxmin.h b/src/include/surf/maxmin.h index 9fd51c0725..5445c62471 100644 --- a/src/include/surf/maxmin.h +++ b/src/include/surf/maxmin.h @@ -46,7 +46,7 @@ XBT_PUBLIC(lmm_variable_t) lmm_variable_new(lmm_system_t sys, void *id, double weight_value, double bound, int number_of_constraints); -void lmm_variable_free(lmm_system_t sys, lmm_variable_t var); +XBT_PUBLIC(void) lmm_variable_free(lmm_system_t sys, lmm_variable_t var); XBT_PUBLIC(double) lmm_variable_getvalue(lmm_variable_t var); XBT_PUBLIC(double) lmm_variable_getbound(lmm_variable_t var); diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 2790a3da34..f5de0740f2 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -673,6 +673,11 @@ XBT_PUBLIC_DATA(xbt_dynar_t) model_list; /*** SURF Globals **************************/ /*******************************************/ XBT_PUBLIC_DATA(xbt_cfg_t) _surf_cfg_set; +XBT_PUBLIC(int) surf_cfg_get_int(const char* name); +XBT_PUBLIC(double) surf_cfg_get_double(const char* name); +XBT_PUBLIC(char*) surf_cfg_get_string(const char* name); +XBT_PUBLIC(void) surf_cfg_get_peer(const char *name, char **peer, int *port); +XBT_PUBLIC(xbt_dynar_t) surf_cfg_get_dynar(const char* name); /** \ingroup SURF_simulation * \brief Initialize SURF diff --git a/src/instr/instr_routing.c b/src/instr/instr_routing.c index 0dbd2c448e..256eb7c3dd 100644 --- a/src/instr/instr_routing.c +++ b/src/instr/instr_routing.c @@ -119,8 +119,8 @@ static void linkContainers (container_t src, container_t dst, xbt_dict_t filter) static long long counter = 0; char key[INSTR_DEFAULT_STR_SIZE]; snprintf (key, INSTR_DEFAULT_STR_SIZE, "%lld", counter++); - new_pajeStartLink(SIMIX_get_clock(), father, link_type, src, "G", key); - new_pajeEndLink(SIMIX_get_clock(), father, link_type, dst, "G", key); + new_pajeStartLink(SIMIX_get_clock(), father, link_type, src, "topology", key); + new_pajeEndLink(SIMIX_get_clock(), father, link_type, dst, "topology", key); XBT_DEBUG (" linkContainers %s <-> %s", src->name, dst->name); } diff --git a/src/msg/msg_task.c b/src/msg/msg_task.c index fce74f585d..b280a7c541 100644 --- a/src/msg/msg_task.c +++ b/src/msg/msg_task.c @@ -312,7 +312,9 @@ msg_error_t MSG_task_cancel(msg_task_t task) /** \ingroup m_task_management * \brief Returns the computation amount needed to process a task #msg_task_t. - * Once a task has been processed, this amount is thus set to 0... + * + * Once a task has been processed, this amount is set to 0. If you want, you + * can reset this value with #MSG_task_set_compute_duration before restarting the task. */ double MSG_task_get_compute_duration(msg_task_t task) { @@ -325,6 +327,11 @@ double MSG_task_get_compute_duration(msg_task_t task) /** \ingroup m_task_management * \brief set the computation amount needed to process a task #msg_task_t. + * + * \warning If the computation is ongoing (already started and not finished), + * it is not modified by this call. And the termination of the ongoing task with + * set the computation_amount to zero, overriding any value set during the + * execution. */ void MSG_task_set_compute_duration(msg_task_t task, @@ -338,6 +345,9 @@ void MSG_task_set_compute_duration(msg_task_t task, /** \ingroup m_task_management * \brief Returns the remaining computation amount of a task #msg_task_t. * + * If the task is ongoing, this call retrieves the remaining amount of work. + * If it is not ongoing, it returns the total amount of work that will be + * executed when the task starts. */ double MSG_task_get_remaining_computation(msg_task_t task) { diff --git a/src/simix/smx_network.c b/src/simix/smx_network.c index 6a7a7a4a7d..8d9e915f3b 100644 --- a/src/simix/smx_network.c +++ b/src/simix/smx_network.c @@ -13,7 +13,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_network, simix, "Logging specific to SIMIX (network)"); static xbt_dict_t rdv_points = NULL; -unsigned long int smx_total_comms = 0; +XBT_IMPORT_NO_EXPORT(unsigned long int) smx_total_comms = 0; static void SIMIX_waitany_remove_simcall_from_actions(smx_simcall_t simcall); static void SIMIX_comm_copy_data(smx_action_t comm); diff --git a/src/smpi/private.h b/src/smpi/private.h index 74b35689e7..fe03a57c09 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -177,7 +177,7 @@ int smpi_mpi_get_count(MPI_Status * status, MPI_Datatype datatype); void smpi_mpi_wait(MPI_Request * request, MPI_Status * status); int smpi_mpi_waitany(int count, MPI_Request requests[], MPI_Status * status); -void smpi_mpi_waitall(int count, MPI_Request requests[], +int smpi_mpi_waitall(int count, MPI_Request requests[], MPI_Status status[]); int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices, MPI_Status status[]); @@ -250,6 +250,7 @@ void mpi_abort__(int* comm, int* errorcode, int* ierr); void mpi_comm_rank__(int* comm, int* rank, int* ierr); void mpi_comm_size__(int* comm, int* size, int* ierr); double mpi_wtime__(void); +double mpi_wtick__(void); void mpi_comm_dup__(int* comm, int* newcomm, int* ierr); void mpi_comm_split__(int* comm, int* color, int* key, int* comm_out, int* ierr); @@ -287,9 +288,20 @@ void mpi_gather__(void* sendbuf, int* sendcount, int* sendtype, void mpi_allgather__(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* recvtype, int* comm, int* ierr); +void mpi_allgatherv__(void* sendbuf, int* sendcount, int* sendtype, + void* recvbuf, int* recvcount,int* displs, int* recvtype, + int* comm, int* ierr) ; +void mpi_type_size__(int* datatype, int *size, int* ierr); + void mpi_scan__(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* comm, int* ierr); void mpi_alltoall__(void* sendbuf, int* sendcount, int* sendtype, void* recvbuf, int* recvcount, int* recvtype, int* comm, int* ierr); +void mpi_get_processor_name__(char *name, int *resultlen, int* ierr); +void mpi_test__ (int * request, int *flag, MPI_Status * status, int* ierr); +void mpi_get_count__(MPI_Status * status, int* datatype, int *count, int* ierr); +void mpi_type_extent__(int* datatype, MPI_Aint * extent, int* ierr); +void mpi_type_lb__(int* datatype, MPI_Aint * extent, int* ierr); +void mpi_type_ub__(int* datatype, MPI_Aint * extent, int* ierr); #endif diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 9ad302a889..29b8eb7645 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -152,7 +152,7 @@ void smpi_mpi_start(MPI_Request request) "Cannot (re)start a non-finished communication"); if(request->flags & RECV) { print_request("New recv", request); - if (request->size < xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres")) + if (request->size < surf_cfg_get_int("smpi/async_small_thres")) mailbox = smpi_process_mailbox_small(); else mailbox = smpi_process_mailbox(); @@ -167,7 +167,7 @@ void smpi_mpi_start(MPI_Request request) /* return;*/ /* }*/ print_request("New send", request); - if (request->size < xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres")) { // eager mode + if (request->size < surf_cfg_get_int("smpi/async_small_thres")) { // eager mode mailbox = smpi_process_remote_mailbox_small(receiver); }else{ XBT_DEBUG("Send request %p is not in the permanent receive mailbox (buf: %p)",request,request->buf); @@ -306,6 +306,7 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) { MPI_Request req = *request; // if we have a sender, we should use its data, and not the data from the receive + //FIXME : mail fail if req->action has already been freed, the pointer being invalid if((req->action)&& (req->src==MPI_ANY_SOURCE || req->tag== MPI_ANY_TAG)) req = (MPI_Request)SIMIX_comm_get_src_data((*request)->action); @@ -313,7 +314,10 @@ static void finish_wait(MPI_Request * request, MPI_Status * status) if(status != MPI_STATUS_IGNORE) { status->MPI_SOURCE = req->src; status->MPI_TAG = req->tag; + //if((*request)->action && ((MPI_Request)SIMIX_comm_get_src_data((*request)->action))->size == (*request)->size) status->MPI_ERROR = MPI_SUCCESS; + //else status->MPI_ERROR = MPI_ERR_TRUNCATE; + // this handles the case were size in receive differs from size in send // FIXME: really this should just contain the count of receive-type blocks, // right? status->count = req->size; @@ -440,7 +444,7 @@ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* print_request("New iprobe", request); // We have to test both mailboxes as we don't know if we will receive one one or another - if (xbt_cfg_get_int(_surf_cfg_set, "smpi/async_small_thres")>0){ + if (surf_cfg_get_int("smpi/async_small_thres")>0){ mailbox = smpi_process_mailbox_small(); XBT_DEBUG("trying to probe the perm recv mailbox"); request->action = simcall_comm_iprobe(mailbox, request->src, request->tag, &match_recv, (void*)request); @@ -457,8 +461,10 @@ void smpi_mpi_iprobe(int source, int tag, MPI_Comm comm, int* flag, MPI_Status* if(status != MPI_STATUS_IGNORE) { status->MPI_SOURCE = req->src; status->MPI_TAG = req->tag; - status->MPI_ERROR = MPI_SUCCESS; - status->count = req->size; + if(req->size == request->size) + status->MPI_ERROR = MPI_SUCCESS; + else status->MPI_ERROR = MPI_ERR_TRUNCATE; + status->count = request->size; } } else *flag = 0; @@ -518,12 +524,13 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], return index; } -void smpi_mpi_waitall(int count, MPI_Request requests[], +int smpi_mpi_waitall(int count, MPI_Request requests[], MPI_Status status[]) { int index, c; MPI_Status stat; MPI_Status *pstat = status == MPI_STATUSES_IGNORE ? MPI_STATUS_IGNORE : &stat; + int retvalue=MPI_SUCCESS; //tag invalid requests in the set for(c = 0; c < count; c++) { if(requests[c]==MPI_REQUEST_NULL || requests[c]->dst == MPI_PROC_NULL ){ @@ -548,10 +555,12 @@ void smpi_mpi_waitall(int count, MPI_Request requests[], } if(status != MPI_STATUSES_IGNORE) { memcpy(&status[index], pstat, sizeof(*pstat)); + if(status[index].MPI_ERROR==MPI_ERR_TRUNCATE)retvalue=MPI_ERR_IN_STATUS; } } } + return retvalue; } int smpi_mpi_waitsome(int incount, MPI_Request requests[], int *indices, diff --git a/src/smpi/smpi_bench.c b/src/smpi/smpi_bench.c index 58c8c5a852..cf8ac0d546 100644 --- a/src/smpi/smpi_bench.c +++ b/src/smpi/smpi_bench.c @@ -136,14 +136,13 @@ void smpi_execute_flops(double flops) { static void smpi_execute(double duration) { /* FIXME: a global variable would be less expensive to consult than a call to xbt_cfg_get_double() right on the critical path */ - if (duration >= xbt_cfg_get_double(_surf_cfg_set, "smpi/cpu_threshold")) { + if (duration >= surf_cfg_get_double("smpi/cpu_threshold")) { XBT_DEBUG("Sleep for %f to handle real computation time", duration); smpi_execute_flops(duration * - xbt_cfg_get_double(_surf_cfg_set, - "smpi/running_power")); + surf_cfg_get_double("smpi/running_power")); } else { XBT_DEBUG("Real computation took %f while option smpi/cpu_threshold is set to %f => ignore it", - duration, xbt_cfg_get_double(_surf_cfg_set, "smpi/cpu_threshold")); + duration, surf_cfg_get_double("smpi/cpu_threshold")); } } diff --git a/src/smpi/smpi_f77.c b/src/smpi/smpi_f77.c index c467cc84f0..ffe8916651 100644 --- a/src/smpi/smpi_f77.c +++ b/src/smpi/smpi_f77.c @@ -101,6 +101,9 @@ void mpi_init__(int* ierr) { new_datatype(MPI_UINT16_T); new_datatype(MPI_UINT32_T); new_datatype(MPI_UINT64_T); + new_datatype(MPI_2FLOAT); + new_datatype(MPI_2DOUBLE); + op_lookup = xbt_dynar_new(sizeof(MPI_Op), NULL); new_op(MPI_MAX); @@ -148,6 +151,10 @@ double mpi_wtime__(void) { return MPI_Wtime(); } +double mpi_wtick__(void) { + return MPI_Wtick(); +} + void mpi_comm_dup__(int* comm, int* newcomm, int* ierr) { MPI_Comm tmp; @@ -311,6 +318,13 @@ void mpi_allgather__(void* sendbuf, int* sendcount, int* sendtype, recvbuf, *recvcount, get_datatype(*recvtype), get_comm(*comm)); } +void mpi_allgatherv__(void* sendbuf, int* sendcount, int* sendtype, + void* recvbuf, int* recvcount,int* displs, int* recvtype, + int* comm, int* ierr) { + *ierr = MPI_Allgatherv(sendbuf, *sendcount, get_datatype(*sendtype), + recvbuf, recvcount, displs, get_datatype(*recvtype), get_comm(*comm)); +} + void mpi_scan__(void* sendbuf, void* recvbuf, int* count, int* datatype, int* op, int* comm, int* ierr) { *ierr = MPI_Scan(sendbuf, recvbuf, *count, get_datatype(*datatype), @@ -322,3 +336,32 @@ void mpi_alltoall__(void* sendbuf, int* sendcount, int* sendtype, *ierr = MPI_Alltoall(sendbuf, *sendcount, get_datatype(*sendtype), recvbuf, *recvcount, get_datatype(*recvtype), get_comm(*comm)); } + +void mpi_test__ (int * request, int *flag, MPI_Status * status, int* ierr){ + MPI_Request req = find_request(*request); + *ierr= MPI_Test(&req, flag, status); +} +void mpi_get_processor_name__(char *name, int *resultlen, int* ierr){ + *ierr = MPI_Get_processor_name(name, resultlen); +} + +void mpi_get_count__(MPI_Status * status, int* datatype, int *count, int* ierr){ + *ierr = MPI_Get_count(status, get_datatype(*datatype), count); +} + +void mpi_type_extent__(int* datatype, MPI_Aint * extent, int* ierr){ + *ierr= MPI_Type_extent(get_datatype(*datatype), extent); +} + +void mpi_type_ub__(int* datatype, MPI_Aint * disp, int* ierr){ + *ierr= MPI_Type_ub(get_datatype(*datatype), disp); +} + +void mpi_type_lb__(int* datatype, MPI_Aint * extent, int* ierr){ + *ierr= MPI_Type_extent(get_datatype(*datatype), extent); +} + +void mpi_type_size__(int* datatype, int *size, int* ierr) +{ + *ierr = MPI_Type_size(get_datatype(*datatype), size); +} diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index 8c02fb48b3..1baf3ea86b 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -35,6 +35,10 @@ static int process_count = 0; MPI_Comm MPI_COMM_WORLD = MPI_COMM_NULL; +MPI_Errhandler* MPI_ERRORS_RETURN = NULL; +MPI_Errhandler* MPI_ERRORS_ARE_FATAL = NULL; +MPI_Errhandler* MPI_ERRHANDLER_NULL = NULL; + #define MAILBOX_NAME_MAXLEN (5 + sizeof(int) * 2 + 1) static char* get_mailbox_name(char* str, int index) { @@ -282,33 +286,24 @@ void smpi_global_destroy(void) /* Fortran specific stuff */ /* With smpicc, the following weak symbols are used */ /* With smpiff, the following weak symbols are replaced by those in libf2c */ + int __attribute__((weak)) xargc; char** __attribute__((weak)) xargv; -int __attribute__((weak)) main(int argc, char** argv) { - xargc = argc; - xargv = argv; - return MAIN__(); -} - -#ifdef WIN32 -#include - int __attribute__((weak)) smpi_simulated_main(int argc, char** argv) { xbt_die("Should not be in this smpi_simulated_main"); return 1; } -/* TODO FOR WIN32 */ -/* Dummy prototype to make gcc happy */ -int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hInst2,LPSTR lpstr01,int nCmdShow) -{ - return MAIN__(); +int __attribute__((weak)) main(int argc, char** argv) { + return smpi_main(smpi_simulated_main,argc,argv); } -#endif +int __attribute__((weak)) MAIN__(){ + return smpi_main(smpi_simulated_main,xargc, xargv); +}; -int MAIN__(void) +int smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]) { srand(SMPI_RAND_SEED); @@ -332,20 +327,20 @@ int MAIN__(void) XBT_LOG_CONNECT(smpi_replay); #ifdef HAVE_TRACING - TRACE_global_init(&xargc, xargv); + TRACE_global_init(&argc, argv); #endif - SIMIX_global_init(&xargc, xargv); + SIMIX_global_init(&argc, argv); #ifdef HAVE_TRACING TRACE_start(); #endif // parse the platform file: get the host list - SIMIX_create_environment(xargv[1]); + SIMIX_create_environment(argv[1]); - SIMIX_function_register_default(smpi_simulated_main); - SIMIX_launch_application(xargv[2]); + SIMIX_function_register_default(realmain); + SIMIX_launch_application(argv[2]); smpi_global_init(); @@ -358,7 +353,7 @@ int MAIN__(void) else SIMIX_run(); - if (xbt_cfg_get_int(_surf_cfg_set, "smpi/display_timing")) + if (surf_cfg_get_int("smpi/display_timing")) XBT_INFO("Simulation time: %g seconds.", SIMIX_get_clock()); smpi_global_destroy(); diff --git a/src/smpi/smpi_mpi_dt.c b/src/smpi/smpi_mpi_dt.c index efc7f6b1b6..1477cec75c 100644 --- a/src/smpi/smpi_mpi_dt.c +++ b/src/smpi/smpi_mpi_dt.c @@ -44,6 +44,14 @@ typedef struct { float value; int index; } float_int; +typedef struct { + float value; + float index; +} float_float; +typedef struct { + double value; + double index; +} double_double; typedef struct { long value; int index; @@ -101,6 +109,9 @@ CREATE_MPI_DATATYPE(MPI_LONG_INT, long_int); CREATE_MPI_DATATYPE(MPI_DOUBLE_INT, double_int); CREATE_MPI_DATATYPE(MPI_SHORT_INT, short_int); CREATE_MPI_DATATYPE(MPI_2INT, int_int); +CREATE_MPI_DATATYPE(MPI_2FLOAT, float_float); +CREATE_MPI_DATATYPE(MPI_2DOUBLE, double_double); + CREATE_MPI_DATATYPE(MPI_LONG_DOUBLE_INT, long_double_int); CREATE_MPI_DATATYPE_NULL(MPI_UB); @@ -1148,6 +1159,10 @@ static void minloc_func(void *a, void *b, int *length, APPLY_FUNC(a, b, length, int_int, MINLOC_OP); } else if (*datatype == MPI_LONG_DOUBLE_INT) { APPLY_FUNC(a, b, length, long_double_int, MINLOC_OP); + } else if (*datatype == MPI_2FLOAT) { + APPLY_FUNC(a, b, length, float_float, MINLOC_OP); + } else if (*datatype == MPI_2DOUBLE) { + APPLY_FUNC(a, b, length, double_double, MINLOC_OP); } } @@ -1166,6 +1181,10 @@ static void maxloc_func(void *a, void *b, int *length, APPLY_FUNC(a, b, length, int_int, MAXLOC_OP); } else if (*datatype == MPI_LONG_DOUBLE_INT) { APPLY_FUNC(a, b, length, long_double_int, MAXLOC_OP); + } else if (*datatype == MPI_2FLOAT) { + APPLY_FUNC(a, b, length, float_float, MAXLOC_OP); + } else if (*datatype == MPI_2DOUBLE) { + APPLY_FUNC(a, b, length, double_double, MAXLOC_OP); } } diff --git a/src/smpi/smpi_pmpi.c b/src/smpi/smpi_pmpi.c index 0db0452ed9..5f4e6a2eea 100644 --- a/src/smpi/smpi_pmpi.c +++ b/src/smpi/smpi_pmpi.c @@ -523,8 +523,9 @@ int PMPI_Group_excl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup) if (i >= n) { index = smpi_group_index(group, rank); smpi_group_set_mapping(*newgroup, index, rank); - rank++; + } + rank++; } } smpi_group_use(*newgroup); @@ -622,6 +623,7 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3], smpi_group_set_mapping(*newgroup, index, newrank); } } + newrank++; //added to avoid looping, need to be checked .. } } } @@ -1151,15 +1153,23 @@ int PMPI_Sendrecv_replace(void *buf, int count, MPI_Datatype datatype, { //TODO: suboptimal implementation void *recvbuf; - int retval, size; + int retval; + if ((datatype == MPI_DATATYPE_NULL)||(datatype->has_subtype==1)) { + retval = MPI_ERR_TYPE; + } else if (count < 0) { + retval = MPI_ERR_COUNT; + } else { + int size = smpi_datatype_size(datatype) * count; + recvbuf = xbt_new(char, size); + retval = + MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count, + datatype, src, recvtag, comm, status); + if(retval==MPI_SUCCESS){ + memcpy(buf, recvbuf, size * sizeof(char)); + } + xbt_free(recvbuf); - size = smpi_datatype_size(datatype) * count; - recvbuf = xbt_new(char, size); - retval = - MPI_Sendrecv(buf, count, datatype, dst, sendtag, recvbuf, count, - datatype, src, recvtag, comm, status); - memcpy(buf, recvbuf, size * sizeof(char)); - xbt_free(recvbuf); + } return retval; } @@ -1404,7 +1414,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) TRACE_smpi_ptp_in(rank_traced, -1, -1, __FUNCTION__); #endif - smpi_mpi_waitall(count, requests, status); + int retval = smpi_mpi_waitall(count, requests, status); #ifdef HAVE_TRACING for (i = 0; i < count; i++) { int src_traced, dst_traced, is_wait_for_receive; @@ -1423,7 +1433,7 @@ int PMPI_Waitall(int count, MPI_Request requests[], MPI_Status status[]) TRACE_smpi_computing_in(rank_traced); #endif smpi_bench_begin(); - return MPI_SUCCESS; + return retval; } int PMPI_Waitsome(int incount, MPI_Request requests[], int *outcount, @@ -1914,7 +1924,9 @@ int PMPI_Get_processor_name(char *name, int *resultlen) smpi_bench_end(); strncpy(name, SIMIX_host_get_name(SIMIX_host_self()), - MPI_MAX_PROCESSOR_NAME - 1); + strlen(SIMIX_host_get_name(SIMIX_host_self())) < MPI_MAX_PROCESSOR_NAME - 1 ? + strlen(SIMIX_host_get_name(SIMIX_host_self())) +1 : + MPI_MAX_PROCESSOR_NAME - 1 ); *resultlen = strlen(name) > MPI_MAX_PROCESSOR_NAME ? MPI_MAX_PROCESSOR_NAME : strlen(name); @@ -2051,6 +2063,11 @@ int PMPI_Type_struct(int count, int* blocklens, MPI_Aint* indices, MPI_Datatype* smpi_bench_begin(); return retval;} +int PMPI_Error_class(int errorcode, int* errorclass) { + // assume smpi uses only standard mpi error codes + *errorclass=errorcode; + return MPI_SUCCESS; +} /* The following calls are not yet implemented and will fail at runtime. */ /* Once implemented, please move them above this notice. */ @@ -2124,10 +2141,6 @@ int PMPI_Topo_test(MPI_Comm comm, int* top_type) { return not_yet_implemented(); } -int PMPI_Error_class(int errorcode, int* errorclass) { - return not_yet_implemented(); -} - int PMPI_Errhandler_create(MPI_Handler_function* function, MPI_Errhandler* errhandler) { return not_yet_implemented(); } diff --git a/src/smpi/smpicc.in b/src/smpi/smpicc.in index a1d1de1d54..833cfa8688 100755 --- a/src/smpi/smpicc.in +++ b/src/smpi/smpicc.in @@ -1,11 +1,17 @@ #! /bin/bash CC=@CMAKE_C_COMPILER@ -CFLAGS="-O2 -Dmain=smpi_simulated_main" -INCLUDEARGS="-I@includedir@ -I@includedir@/smpi" -CMAKE_LINKARGS="-L@CMAKE_LINKARGS@" -LINKARGS="-lsimgrid -lsmpi -lm" +INCLUDEARGS="@includeflag@" +CMAKE_LINKARGS="-L@libdir@" + +if [ "@WIN32@" != "1" ]; then + LINKARGS="-lsimgrid -lsmpi -lm" + CFLAGS="-O2 -Dmain=smpi_simulated_main" +else + CFLAGS="-O2 -include @includedir@/smpi/smpi_main.h" + LINKARGS="@libdir@\libsimgrid.dll @libdir@\libsmpi.dll" +fi CMDLINE="" while [ -n "$1" ]; do diff --git a/src/smpi/smpif2c.in b/src/smpi/smpif2c.in index bdcbe867e2..c620b38e51 100755 --- a/src/smpi/smpif2c.in +++ b/src/smpi/smpif2c.in @@ -5,16 +5,25 @@ use strict; use File::Temp; use File::Copy; -my $include="-I@top_srcdir@/include -I@top_srcdir@/include/smpi -I@includedir@ -I@includedir@/smpi"; +my $include="@includeflag@@f2cflags@"; foreach my $fortran (@ARGV) { my $output = $fortran; $output =~ s/.f$/.c/; + + #print "F2C INPUT : ".$fortran."\n"; + #print "F2C OUTPUT: ".$output."\n"; + + my$outputdir = $output; + $outputdir=~s/[^\/]*\.c$//g; + #print "F2C DIR : ".$outputdir."\n"; + my $tmp = new File::Temp; $tmp->autoflush(1); - `f2c $include -w -a $fortran`; + #print "f2c -d$outputdir $include -w -a $fortran\n"; + `f2c -d$outputdir $include -w -a $fortran`; die "F2C failed\n" if $?; - open F2C,"<$output"; + open F2C,"<$output" or die "Unable to open file $output"; my $started = 0; my $cutext = 0; print $tmp "#ifndef INTEGER_STAR_8\n"; diff --git a/src/smpi/smpirun.in b/src/smpi/smpirun.in index d1d395edbb..70a4fba81a 100755 --- a/src/smpi/smpirun.in +++ b/src/smpi/smpirun.in @@ -168,7 +168,7 @@ if [ -z "${HOSTFILE}" ] ; then fi # Don't use wc -l to compute it to avoid issues with trailing \n at EOF -hostfile_procs=`grep -c [a-zA-Z0-9] $HOSTFILE` +hostfile_procs=`grep -c "[a-zA-Z0-9]" $HOSTFILE` if [ -z "${NUMPROCS}" ] ; then # Use the amount of processes in the hostfile as default value for the -np parameter diff --git a/src/surf/network.c b/src/surf/network.c index e295c736cb..b6f836bcce 100644 --- a/src/surf/network.c +++ b/src/surf/network.c @@ -118,7 +118,7 @@ static double smpi_bandwidth_factor(double size) { if (!smpi_bw_factor) smpi_bw_factor = - parse_factor(xbt_cfg_get_string(_surf_cfg_set, "smpi/bw_factor")); + parse_factor(surf_cfg_get_string("smpi/bw_factor")); unsigned int iter = 0; s_smpi_factor_t fact; @@ -139,7 +139,7 @@ static double smpi_latency_factor(double size) { if (!smpi_lat_factor) smpi_lat_factor = - parse_factor(xbt_cfg_get_string(_surf_cfg_set, "smpi/lat_factor")); + parse_factor(surf_cfg_get_string("smpi/lat_factor")); unsigned int iter = 0; s_smpi_factor_t fact; diff --git a/src/surf/surf.c b/src/surf/surf.c index 136390ed33..fc1e385857 100644 --- a/src/surf/surf.c +++ b/src/surf/surf.c @@ -55,6 +55,26 @@ static const char *disk_drives_letter_table[MAX_DRIVE] = { }; #endif /* #ifdef _XBT_WIN32 */ +int surf_cfg_get_int(const char* name) +{ + return xbt_cfg_get_int(_surf_cfg_set,name); +} +double surf_cfg_get_double(const char* name) +{ + return xbt_cfg_get_double(_surf_cfg_set,name); +} +char* surf_cfg_get_string(const char* name) +{ + return xbt_cfg_get_string(_surf_cfg_set,name); +} +void surf_cfg_get_peer(const char *name, char **peer, int *port) +{ + xbt_cfg_get_peer(_surf_cfg_set,name, peer, port); +} +xbt_dynar_t surf_cfg_get_dynar(const char* name) +{ + return xbt_cfg_get_dynar(_surf_cfg_set,name); +} /* * Returns the initial path. On Windows the initial path is * the current directory for the current process in the other @@ -425,6 +445,7 @@ void surf_init(int *argc, char **argv) history = tmgr_history_new(); surf_config_init(argc, argv); + surf_action_init(); if (MC_is_active()) MC_memory_init(); diff --git a/src/surf/surfxml_parseplatf.c b/src/surf/surfxml_parseplatf.c index 92040f056d..b3fdf29e52 100644 --- a/src/surf/surfxml_parseplatf.c +++ b/src/surf/surfxml_parseplatf.c @@ -25,8 +25,8 @@ int surfxml_bufferstack_size = 2048; static char *old_buff = NULL; -unsigned int surfxml_buffer_stack_stack_ptr; -unsigned int surfxml_buffer_stack_stack[1024]; +XBT_IMPORT_NO_EXPORT(unsigned int) surfxml_buffer_stack_stack_ptr; +XBT_IMPORT_NO_EXPORT(unsigned int) surfxml_buffer_stack_stack[1024]; void surfxml_bufferstack_push(int new) diff --git a/src/xbt/mmalloc/mmprivate.h b/src/xbt/mmalloc/mmprivate.h index 4fce4c64d0..a0c0b560a7 100644 --- a/src/xbt/mmalloc/mmprivate.h +++ b/src/xbt/mmalloc/mmprivate.h @@ -263,16 +263,16 @@ struct mdesc { /* A default malloc descriptor for the single sbrk() managed region. */ -extern struct mdesc *__mmalloc_default_mdp; +XBT_PUBLIC( struct mdesc ) *__mmalloc_default_mdp; /* Remap a mmalloc region that was previously mapped. */ -extern void *__mmalloc_remap_core(xbt_mheap_t mdp); +XBT_PUBLIC( void *)__mmalloc_remap_core(xbt_mheap_t mdp); /* Get core for the memory region specified by MDP, using SIZE as the amount to either add to or subtract from the existing region. Works like sbrk(), but using mmap(). */ -extern void *mmorecore(struct mdesc *mdp, int size); +XBT_PUBLIC( void *)mmorecore(struct mdesc *mdp, int size); /* Thread-safety (if the sem is already created) * diff --git a/teshsuite/gras/datadesc/CMakeLists.txt b/teshsuite/gras/datadesc/CMakeLists.txt index 7d80a671d8..1693115c20 100644 --- a/teshsuite/gras/datadesc/CMakeLists.txt +++ b/teshsuite/gras/datadesc/CMakeLists.txt @@ -7,7 +7,7 @@ if(NOT WIN32) ### Add definitions for compile target_link_libraries(datadesc_usage gras m pthread) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/gras/empty_main/CMakeLists.txt b/teshsuite/gras/empty_main/CMakeLists.txt index 49e5079fab..7439d20e98 100644 --- a/teshsuite/gras/empty_main/CMakeLists.txt +++ b/teshsuite/gras/empty_main/CMakeLists.txt @@ -23,10 +23,10 @@ add_custom_command( if(NOT WIN32) target_link_libraries(empty_main_simulator simgrid m pthread) target_link_libraries(empty_main_function gras m pthread) -else(NOT WIN32) +else() target_link_libraries(empty_main_simulator simgrid) target_link_libraries(empty_main_function gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/gras/msg_handle/CMakeLists.txt b/teshsuite/gras/msg_handle/CMakeLists.txt index 63d5d19b89..7f5a91603e 100644 --- a/teshsuite/gras/msg_handle/CMakeLists.txt +++ b/teshsuite/gras/msg_handle/CMakeLists.txt @@ -28,11 +28,11 @@ if(NOT WIN32) target_link_libraries(msg_handle_simulator simgrid m pthread ) target_link_libraries(msg_handle_client gras m pthread ) target_link_libraries(msg_handle_server gras m pthread ) -else(NOT WIN32) +else() target_link_libraries(msg_handle_simulator simgrid) target_link_libraries(msg_handle_client gras) target_link_libraries(msg_handle_server gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/gras/numerous_rpc/CMakeLists.txt b/teshsuite/gras/numerous_rpc/CMakeLists.txt index 129d3e13aa..9c155aa423 100644 --- a/teshsuite/gras/numerous_rpc/CMakeLists.txt +++ b/teshsuite/gras/numerous_rpc/CMakeLists.txt @@ -23,10 +23,10 @@ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/_numerous_rpc_s if(NOT WIN32) target_link_libraries(numerous_rpc_client gras m pthread ) target_link_libraries(numerous_rpc_server gras m pthread ) -else(NOT WIN32) +else() target_link_libraries(numerous_rpc_client gras) target_link_libraries(numerous_rpc_server gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/gras/small_sleep/CMakeLists.txt b/teshsuite/gras/small_sleep/CMakeLists.txt index 8820c5b5e2..e215f2e38c 100644 --- a/teshsuite/gras/small_sleep/CMakeLists.txt +++ b/teshsuite/gras/small_sleep/CMakeLists.txt @@ -23,10 +23,10 @@ add_custom_command( if(NOT WIN32) target_link_libraries(small_sleep_simulator simgrid m pthread) target_link_libraries(small_sleep_function gras m pthread) -else(NOT WIN32) +else() target_link_libraries(small_sleep_simulator simgrid) target_link_libraries(small_sleep_function gras) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/msg/CMakeLists.txt b/teshsuite/msg/CMakeLists.txt index 8b0c5e3f97..4f22b3c611 100644 --- a/teshsuite/msg/CMakeLists.txt +++ b/teshsuite/msg/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(get_sender ${CMAKE_HOME_DIRECTORY}/teshsuite/msg/get_sender.c) ### Add definitions for compile if(NOT WIN32) target_link_libraries(get_sender simgrid m pthread ) -else(NOT WIN32) +else() target_link_libraries(get_sender simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/simdag/CMakeLists.txt b/teshsuite/simdag/CMakeLists.txt index c930be9fde..32d833481a 100644 --- a/teshsuite/simdag/CMakeLists.txt +++ b/teshsuite/simdag/CMakeLists.txt @@ -21,7 +21,7 @@ if(NOT WIN32) target_link_libraries(basic5 simgrid m pthread ) target_link_libraries(basic6 simgrid m pthread ) target_link_libraries(incomplete simgrid m pthread ) -else(NOT WIN32) +else() target_link_libraries(basic0 simgrid) target_link_libraries(basic1 simgrid) target_link_libraries(basic2 simgrid) @@ -30,7 +30,7 @@ else(NOT WIN32) target_link_libraries(basic5 simgrid) target_link_libraries(basic6 simgrid) target_link_libraries(incomplete simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/simdag/network/CMakeLists.txt b/teshsuite/simdag/network/CMakeLists.txt index 4417d1035b..a89ec1cbe4 100644 --- a/teshsuite/simdag/network/CMakeLists.txt +++ b/teshsuite/simdag/network/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(test_reinit_costs test_reinit_costs.c) ### Add definitions for compile if(NOT WIN32) target_link_libraries(test_reinit_costs simgrid m pthread ) -else(NOT WIN32) +else() target_link_libraries(test_reinit_costs simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/simdag/network/mxn/CMakeLists.txt b/teshsuite/simdag/network/mxn/CMakeLists.txt index 35fdb68eca..e25af1cf78 100644 --- a/teshsuite/simdag/network/mxn/CMakeLists.txt +++ b/teshsuite/simdag/network/mxn/CMakeLists.txt @@ -11,11 +11,11 @@ if(NOT WIN32) target_link_libraries(test_intra_all2all simgrid m pthread ) target_link_libraries(test_intra_independent_comm simgrid m pthread ) target_link_libraries(test_intra_scatter simgrid m pthread ) -else(NOT WIN32) +else() target_link_libraries(test_intra_all2all simgrid) target_link_libraries(test_intra_independent_comm simgrid) target_link_libraries(test_intra_scatter simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/simdag/network/p2p/CMakeLists.txt b/teshsuite/simdag/network/p2p/CMakeLists.txt index f1a5abfcb9..d511b08a89 100644 --- a/teshsuite/simdag/network/p2p/CMakeLists.txt +++ b/teshsuite/simdag/network/p2p/CMakeLists.txt @@ -13,12 +13,12 @@ if(NOT WIN32) target_link_libraries(test_latency2 simgrid m pthread ) target_link_libraries(test_latency3 simgrid m pthread ) target_link_libraries(test_latency_bound simgrid m pthread ) -else(NOT WIN32) +else() target_link_libraries(test_latency1 simgrid) target_link_libraries(test_latency2 simgrid) target_link_libraries(test_latency3 simgrid) target_link_libraries(test_latency_bound simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/simdag/partask/CMakeLists.txt b/teshsuite/simdag/partask/CMakeLists.txt index 0a02f18569..1d57c19cb6 100644 --- a/teshsuite/simdag/partask/CMakeLists.txt +++ b/teshsuite/simdag/partask/CMakeLists.txt @@ -9,10 +9,10 @@ add_executable(test_comp_only_par test_comp_only_par.c) if(NOT WIN32) target_link_libraries(test_comp_only_seq simgrid m pthread ) target_link_libraries(test_comp_only_par simgrid m pthread ) -else(NOT WIN32) +else() target_link_libraries(test_comp_only_seq simgrid) target_link_libraries(test_comp_only_par simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/simdag/platforms/CMakeLists.txt b/teshsuite/simdag/platforms/CMakeLists.txt index 4a478fd568..5c34236310 100644 --- a/teshsuite/simdag/platforms/CMakeLists.txt +++ b/teshsuite/simdag/platforms/CMakeLists.txt @@ -19,13 +19,13 @@ if(NOT WIN32) target_link_libraries(flatifier simgrid m) target_link_libraries(basic_tracing simgrid m) target_link_libraries(basic_link_test simgrid m) -else(NOT WIN32) +else() target_link_libraries(basic_parsing_test simgrid) target_link_libraries(is_router_test simgrid) target_link_libraries(flatifier simgrid) target_link_libraries(basic_tracing simgrid) target_link_libraries(basic_link_test simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/teshsuite/smpi/CMakeLists.txt b/teshsuite/smpi/CMakeLists.txt index a743421b15..8c9d40d590 100644 --- a/teshsuite/smpi/CMakeLists.txt +++ b/teshsuite/smpi/CMakeLists.txt @@ -1,11 +1,16 @@ cmake_minimum_required(VERSION 2.6) if(enable_smpi) - set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/bin/smpicc") - + if(WIN32) + set(CMAKE_C_FLAGS "-include ${CMAKE_HOME_DIRECTORY}/include/smpi/smpi_main.h") + else() + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + endif() + set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") - + include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") + include("${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/mpich-test/CMakeLists.txt") add_executable(alltoall2 alltoall2.c ) add_executable(alltoall_basic alltoall_basic.c) @@ -19,7 +24,6 @@ if(enable_smpi) add_executable(scatter scatter.c) add_executable(reduce reduce.c) add_executable(split split.c) - add_executable(dsend dsend.c) add_executable(smpi_sendrecv sendrecv.c) add_executable(ttest01 ttest01.c) add_executable(vector_test vector_test.c) @@ -39,7 +43,6 @@ if(enable_smpi) target_link_libraries(scatter m simgrid smpi ) target_link_libraries(reduce m simgrid smpi ) target_link_libraries(split m simgrid smpi ) - target_link_libraries(dsend m simgrid smpi ) target_link_libraries(smpi_sendrecv m simgrid smpi ) target_link_libraries(ttest01 m simgrid smpi ) target_link_libraries(vector_test m simgrid smpi ) @@ -48,7 +51,14 @@ if(enable_smpi) target_link_libraries(struct_test m simgrid smpi ) set_target_properties(smpi_sendrecv PROPERTIES RENAME sendrecv) -endif(enable_smpi) + + if(NOT WIN32) + add_executable(dsend dsend.c) + target_link_libraries(dsend m simgrid smpi ) + endif() + +endif() + set(tesh_files ${tesh_files} @@ -98,5 +108,6 @@ set(bin_files ) set(txt_files ${txt_files} + PARENT_SCOPE ) diff --git a/teshsuite/smpi/alltoall2.c b/teshsuite/smpi/alltoall2.c index ef2068e0a7..34e5912f17 100644 --- a/teshsuite/smpi/alltoall2.c +++ b/teshsuite/smpi/alltoall2.c @@ -34,12 +34,11 @@ **************************************************************************** */ -#include "mpi.h" #include #include #include #include - +#include "mpi.h" #define MAXLEN 10000 diff --git a/teshsuite/smpi/alltoall_basic.c b/teshsuite/smpi/alltoall_basic.c index 485752e2ef..ad25e7a24c 100644 --- a/teshsuite/smpi/alltoall_basic.c +++ b/teshsuite/smpi/alltoall_basic.c @@ -4,11 +4,11 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "mpi.h" #include #include #include #include +#include "mpi.h" #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 diff --git a/teshsuite/smpi/alltoallv.c b/teshsuite/smpi/alltoallv.c index 492db4e072..f2717b9c56 100644 --- a/teshsuite/smpi/alltoallv.c +++ b/teshsuite/smpi/alltoallv.c @@ -3,11 +3,11 @@ * (C) 2001 by Argonne National Laboratory. * See COPYRIGHT in top-level directory. */ -#include "mpi.h" #include #include #include +#include "mpi.h" /* This program tests MPI_Alltoallv by having processor i send different diff --git a/teshsuite/smpi/hostfile b/teshsuite/smpi/hostfile index ee2e2815b7..8426f5a45d 100644 --- a/teshsuite/smpi/hostfile +++ b/teshsuite/smpi/hostfile @@ -3,4 +3,3 @@ Jupiter Fafard Ginette Bourassa - \ No newline at end of file diff --git a/teshsuite/smpi/hvector.tesh b/teshsuite/smpi/hvector.tesh index 9eb822df60..a4ea550c4c 100644 --- a/teshsuite/smpi/hvector.tesh +++ b/teshsuite/smpi/hvector.tesh @@ -1,4 +1,43 @@ -p Test indexed +p Test hvector ! setenv LD_LIBRARY_PATH=../../lib ! output sort -$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./indexed_test -q +$ ../../bin/smpirun -map -hostfile ${srcdir:=.}/hostfile -platform ${srcdir:=.}/../../examples/msg/small_platform.xml -np 2 ./hvector_test -q +> [0.000000] [surf_config/INFO] Switching workstation model to compound since you changed the network and/or cpu model(s) +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'maxmin/precision' to '1e-9' +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/model' to 'SMPI' +> [0.000000] [xbt_cfg/INFO] Configuration change: Set 'network/TCP_gamma' to '4194304' +> [rank 0] -> Tremblay +> [rank 1] -> Jupiter +> rank= 0, a[0][0]=0.000000 +> rank= 0, a[0][1]=1.000000 +> rank= 0, a[0][2]=2.000000 +> rank= 0, a[0][3]=3.000000 +> rank= 0, a[1][0]=4.000000 +> rank= 0, a[1][1]=5.000000 +> rank= 0, a[1][2]=6.000000 +> rank= 0, a[1][3]=7.000000 +> rank= 0, a[2][0]=8.000000 +> rank= 0, a[2][1]=9.000000 +> rank= 0, a[2][2]=10.000000 +> rank= 0, a[2][3]=11.000000 +> rank= 0, a[3][0]=12.000000 +> rank= 0, a[3][1]=13.000000 +> rank= 0, a[3][2]=14.000000 +> rank= 0, a[3][3]=15.000000 +> rank= 1, a[0][0]=0.000000 +> rank= 1, a[0][1]=0.000000 +> rank= 1, a[0][2]=0.000000 +> rank= 1, a[0][3]=0.000000 +> rank= 1, a[1][0]=4.000000 +> rank= 1, a[1][1]=0.000000 +> rank= 1, a[1][2]=0.000000 +> rank= 1, a[1][3]=0.000000 +> rank= 1, a[2][0]=8.000000 +> rank= 1, a[2][1]=0.000000 +> rank= 1, a[2][2]=0.000000 +> rank= 1, a[2][3]=0.000000 +> rank= 1, a[3][0]=12.000000 +> rank= 1, a[3][1]=0.000000 +> rank= 1, a[3][2]=0.000000 +> rank= 1, a[3][3]=0.000000 + diff --git a/teshsuite/smpi/indexed_test.c b/teshsuite/smpi/indexed_test.c index e557575b6f..3afb4402ce 100644 --- a/teshsuite/smpi/indexed_test.c +++ b/teshsuite/smpi/indexed_test.c @@ -1,5 +1,5 @@ -#include "mpi.h" #include +#include "mpi.h" int main(int argc, char *argv[]) { diff --git a/teshsuite/smpi/mpich-test/CMakeLists.txt b/teshsuite/smpi/mpich-test/CMakeLists.txt new file mode 100644 index 0000000000..ca3a518b6f --- /dev/null +++ b/teshsuite/smpi/mpich-test/CMakeLists.txt @@ -0,0 +1,74 @@ +set(tesh_files + ${tesh_files} + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + PARENT_SCOPE + ) + +set(stdo_std_smpi + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/context/attrt.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/context/attrerr.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/context/context.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/context/commnames.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/self.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/sndrcvrep.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/waitany.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/reqcreate.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/persistent.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/allpair2.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/typeub3.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/waitall.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/nullproc2.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/allpair.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/hindexed.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/ssendtest2.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/sendmany.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/nullproc.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/nbtest.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/sendcplx.stdo + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/hvec.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/typebase.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/typeub2.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/structf.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/typecreate.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/pt2pt/nblock.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/topol/cartmap.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/topol/graphtest.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/topol/cartf.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/env/aborttest.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/env/errstringsf.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/env/env.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/profile/ptest.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/coll/allredmany.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/coll/allred.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/coll/allredf.std + ${CMAKE_CURRENT_SOURCE_DIR}/mpich-test/coll/scatterv.std +) + +if("${CMAKE_BINARY_DIR}" STREQUAL "${CMAKE_HOME_DIRECTORY}") +else() + foreach(srcfile ${stdo_std_smpi}) + set(dstfile ${srcfile}) + string(REPLACE "${CMAKE_HOME_DIRECTORY}" "${CMAKE_BINARY_DIR}" dstfile "${dstfile}") + string(REGEX REPLACE "/[^/]*.stdo" "/" dstfile "${dstfile}") + string(REGEX REPLACE "/[^/]*.std" "/" dstfile "${dstfile}") + #message("copy ${srcfile} to ${dstfile}") + file(COPY ${srcfile} DESTINATION ${dstfile}) + endforeach() +endif() + +set(txt_files + ${txt_files} + ${stdo_std_smpi} + PARENT_SCOPE + ) diff --git a/teshsuite/smpi/mpich-test/README b/teshsuite/smpi/mpich-test/README new file mode 100644 index 0000000000..dcb011acea --- /dev/null +++ b/teshsuite/smpi/mpich-test/README @@ -0,0 +1,75 @@ +This directory contains a variety of different test codes +of different types. This directory and many of the files in +it are still undergoing active development and change. Please +forgive (and report) any problems you have with these programs. + +These tests may be used with any MPI implementation. In a few cases, +differences in error messages may be reported; these are not errors, of +course. However, the accuracy and detail of the messages should be evaluated. + +To build and run the tests, execute configure followed by make testing. +The options to configure for some MPI implementations follow: + +SGI: + ./configure -cc=cc -fc=f77 +IBM: + ./configure -cc=mpcc -fc=mpxlf + (You also need a script called "mpirun" that takes a -np number-of-procs + argument, since there are so many different ways to run parallel + programs on IBM systems) +MPICH: + ./configure -mpichpath= + +The directories are as follows: + +pt2pt - Test cases that generally cover various point to point + routines, such as send, isend, probe, etc... The + README in this directory contains some additional + useful information about running the tests. The tests + in this directory are most complete. + + +coll - Test programs for various collective operations + +context - Test programs for context operations + +env - Test programs for the environment routines + +profile - Test program(s) for MPI_Pcontrol + +topol - Test programs for the topology routines + +lederman- A series of tests of various types written by Steve + Lederman + + +Other directories and additional tests will be added in the future. + +To run the test, but not leave the executables around, do (in this directory) + + make TESTARGS=-small testing >& testing.out + +If your MPI requires a boot step before running programs, use the target +testing-boot instead of testint: + + make TESTARGS=-small testing-boot >& testing.out + +This will boot any MPI startup demons, and it will stop them at the end of the +test. + +If you are NOT using the MPICH implementation, then you can run the configure +script in this directory. If you need to view the configure options, then type + configure -help +and a list of configure options will be provided. + +You will probably also have to provide an "mpirun" program or script. +This has roughly the form + + mpirun -mvhome -np n -mvback "string" programname programargs + +The options -mvhome and -mvback "string" can be ignored; they are needed only +on systems that do not share file systems with the system running the runtests +script (yes, there is one such system). The option "-np n" specifies that +"n" processes are needed. Note that this is not always a power of 2; systems +must be prepared to accept any (small) value of n. + diff --git a/teshsuite/smpi/mpich-test/coll/CMakeLists.txt b/teshsuite/smpi/mpich-test/coll/CMakeLists.txt new file mode 100644 index 0000000000..cce0e0b308 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/CMakeLists.txt @@ -0,0 +1,181 @@ +cmake_minimum_required(VERSION 2.6) + +if(enable_smpi) + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff") + set(CMAKE_Fortran_LINKER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1") + + include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") + + add_executable(coll1 coll1.c test.c) + add_executable(coll2 coll2.c test.c) + add_executable(coll3 coll3.c test.c) + add_executable(coll4 coll4.c test.c) + add_executable(coll5 coll5.c test.c) + add_executable(coll6 coll6.c test.c) + add_executable(coll7 coll7.c test.c) + add_executable(coll8 coll8.c test.c) + add_executable(coll9 coll9.c test.c) + add_executable(coll10 coll10.c test.c) + add_executable(coll11 coll11.c test.c) + add_executable(coll12 coll12.c test.c) + add_executable(coll13 coll13.c) + add_executable(allredmany allredmany.c) + add_executable(bcastbug2 bcastbug2.c test.c) + add_executable(bcastbug bcastbug.c test.c) + add_executable(bcastvec bcastvec.c test.c ) + add_executable(grouptest grouptest.c test.c) + add_executable(redtst redtst.c test.c) + add_executable(barrier barrier.c test.c) + add_executable(bcast_mpich bcast.c test.c) + add_executable(allred allred.c ../pt2pt/gcomm.c) + add_executable(allred2 allred2.c ../pt2pt/gcomm.c) + add_executable(scatterv scatterv.c) + add_executable(scattern scattern.c) + add_executable(redscat redscat.c) + add_executable(alltoallv_mpich alltoallv.c) + add_executable(scantst scantst.c test.c) + add_executable(longuser longuser.c test.c) + + if(SMPI_F2C) + add_executable(allredf allredf.f) + add_executable(assocf assocf.f) + add_executable(allgatherf allgatherf.f) + add_executable(bcastlog bcastlog.f) + endif() + + target_link_libraries(coll1 m simgrid smpi ) + target_link_libraries(coll2 m simgrid smpi ) + target_link_libraries(coll3 m simgrid smpi ) + target_link_libraries(coll4 m simgrid smpi ) + target_link_libraries(coll5 m simgrid smpi ) + target_link_libraries(coll6 m simgrid smpi ) + target_link_libraries(coll7 m simgrid smpi ) + target_link_libraries(coll8 m simgrid smpi ) + target_link_libraries(coll9 m simgrid smpi ) + target_link_libraries(coll10 m simgrid smpi ) + target_link_libraries(coll11 m simgrid smpi ) + target_link_libraries(coll12 m simgrid smpi ) + target_link_libraries(coll13 m simgrid smpi ) + target_link_libraries(allredmany m simgrid smpi ) + target_link_libraries(bcastbug m simgrid smpi ) + target_link_libraries(bcastbug2 m simgrid smpi ) + target_link_libraries(bcastvec m simgrid smpi ) + target_link_libraries(grouptest m simgrid smpi ) + target_link_libraries(redtst m simgrid smpi ) + target_link_libraries(barrier m simgrid smpi ) + target_link_libraries(bcast_mpich m simgrid smpi ) + target_link_libraries(allred m simgrid smpi ) + target_link_libraries(allred2 m simgrid smpi ) + target_link_libraries(scatterv m simgrid smpi ) + target_link_libraries(scattern m simgrid smpi ) + target_link_libraries(redscat m simgrid smpi ) + target_link_libraries(longuser m simgrid smpi ) + target_link_libraries(alltoallv_mpich m simgrid smpi ) + target_link_libraries(scantst m simgrid smpi ) + if(SMPI_F2C) + target_link_libraries(allredf m simgrid smpi ) + target_link_libraries(assocf m simgrid smpi ) + target_link_libraries(allgatherf m simgrid smpi ) + target_link_libraries(bcastlog m simgrid smpi ) + endif() + + set_target_properties(coll1 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll4 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll5 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll6 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll7 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll8 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll9 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll10 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll11 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll12 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(coll13 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(allredmany PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(bcastbug PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(bcastbug2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(bcastvec PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(grouptest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(redtst PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(barrier PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(bcast_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(allred PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(allred2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(scatterv PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(scattern PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(redscat PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(longuser PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(alltoallv_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(scantst PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + if(SMPI_F2C) + set_target_properties(allredf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(assocf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(allgatherf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(bcastlog PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + endif() + +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/coll.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/coll1 .c + ${CMAKE_CURRENT_SOURCE_DIR}/coll2.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll3.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll4.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll5.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll6.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll7.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll8.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll9.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll10.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll11.c + ${CMAKE_CURRENT_SOURCE_DIR}/coll12 .c + ${CMAKE_CURRENT_SOURCE_DIR}/coll13.c + ${CMAKE_CURRENT_SOURCE_DIR}/allredmany.c + ${CMAKE_CURRENT_SOURCE_DIR}/bcastbug.c + ${CMAKE_CURRENT_SOURCE_DIR}/bcastbug2.c + ${CMAKE_CURRENT_SOURCE_DIR}/bcastvec.c + ${CMAKE_CURRENT_SOURCE_DIR}/grouptest.c + ${CMAKE_CURRENT_SOURCE_DIR}/redtst.c + ${CMAKE_CURRENT_SOURCE_DIR}/barrier.c + ${CMAKE_CURRENT_SOURCE_DIR}/bcast.c + ${CMAKE_CURRENT_SOURCE_DIR}/allred.c + ${CMAKE_CURRENT_SOURCE_DIR}/allred2.c + ${CMAKE_CURRENT_SOURCE_DIR}/scatterv.c + ${CMAKE_CURRENT_SOURCE_DIR}/scattern.c + ${CMAKE_CURRENT_SOURCE_DIR}/redscat.c + ${CMAKE_CURRENT_SOURCE_DIR}/longuser.c + ${CMAKE_CURRENT_SOURCE_DIR}/alltoallv.c + ${CMAKE_CURRENT_SOURCE_DIR}/scantst.c + ${CMAKE_CURRENT_SOURCE_DIR}/test.c + ${CMAKE_CURRENT_SOURCE_DIR}/test.h + ${CMAKE_CURRENT_SOURCE_DIR}/allgatherf.f + ${CMAKE_CURRENT_SOURCE_DIR}/allredf.f + ${CMAKE_CURRENT_SOURCE_DIR}/allredf.std + ${CMAKE_CURRENT_SOURCE_DIR}/assocf.f + ${CMAKE_CURRENT_SOURCE_DIR}/bcastlog.f + + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + ${CMAKE_CURRENT_SOURCE_DIR}/../hostfile + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/teshsuite/smpi/mpich-test/coll/allgatherf.f b/teshsuite/smpi/mpich-test/coll/allgatherf.f new file mode 100644 index 0000000000..462d3e0f73 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/allgatherf.f @@ -0,0 +1,41 @@ +c +c This test looks at sending some data with a count of zero. +c + program testmpi + integer mnprocs, lcwk1 + parameter ( mnprocs = 2, lcwk1 = 6 ) + integer comm, rc, myid, nprocs, ierr, i, + & recvts(0:mnprocs-1), displs(0:mnprocs-1) + double precision wrkbuf(3), cwk1(lcwk1) + include 'mpif.h' +c + call MPI_INIT( ierr ) + comm = MPI_COMM_WORLD + call MPI_COMM_RANK( comm, myid, ierr ) + call MPI_COMM_SIZE( comm, nprocs, ierr ) +c + do i = 1, lcwk1 + cwk1(i) = -10 + end do + do i=1,3 + wrkbuf(i) = myid + end do + do i = 0, mnprocs-1 + recvts(i) = 3 + displs(i) = 3 * i + end do + recvts(mnprocs-1) = 0 + displs(mnprocs-1) = 0 +c + call MPI_ALLGATHERV( wrkbuf, recvts(myid), + & MPI_DOUBLE_PRECISION, cwk1, recvts, + & displs, MPI_DOUBLE_PRECISION, comm, ierr ) +c + do i = 1, lcwk1 + print *, myid, i, cwk1(i) + end do +c + call MPI_FINALIZE(rc) +c + end +c diff --git a/teshsuite/smpi/mpich-test/coll/allred.c b/teshsuite/smpi/mpich-test/coll/allred.c new file mode 100644 index 0000000000..792565ced7 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/allred.c @@ -0,0 +1,2464 @@ + +#include +#include "mpi.h" +#include +#include +#include "test.h" +#include "../pt2pt/gcomm.h" + +int verbose = 1; +int main( int argc, char **argv ) +{ +int count, errcnt = 0, gerr = 0, toterr, size, rank; +MPI_Comm comm; + +int world_rank; + +MPI_Init( &argc, &argv ); +MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); + +/* First tests */ +//MakeComms( comms, 10, &ncomm, 0 ); +//for (ii=0; ii 0) + printf( "Found %d errors on %d for MPI_SUM\n", errcnt, rank ); +errcnt = 0; + +/* Test product */ +if (world_rank == 0 && verbose) printf( "Testing MPI_PROD...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_INT, MPI_PROD, comm ); +for (i=0; i 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_LONG, MPI_PROD, comm ); +for (i=0; i 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_SHORT, MPI_PROD, comm ); +for (i=0; i 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_PROD, comm ); +for (i=0; i 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_PROD, comm ); +for (i=0; i 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_PROD, comm ); +for (i=0; i 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_FLOAT, MPI_PROD, comm ); +for (i=0; i 0) ? (int)(pow((double)(i),(double)size)+0.1) : 0; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_DOUBLE, MPI_PROD, comm ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_PROD\n", errcnt, rank ); +errcnt = 0; + +/* Test max */ +if (world_rank == 0 && verbose) printf( "Testing MPI_MAX...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_MAX\n", errcnt, rank ); +errcnt = 0; + +/* Test min */ +if (world_rank == 0 && verbose) printf( "Testing MPI_MIN...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_MIN\n", errcnt, rank ); +errcnt = 0; + +/* Test LOR */ +if (world_rank == 0 && verbose) printf( "Testing MPI_LOR...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_INT, MPI_LOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_LONG, MPI_LOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LOR, comm ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_LOR(1)\n", errcnt, rank ); +errcnt = 0; + + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_LOR(0)\n", errcnt, rank ); +errcnt = 0; + +/* Test LXOR */ +if (world_rank == 0 && verbose) printf( "Testing MPI_LXOR...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_INT, MPI_LXOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_LONG, MPI_LXOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_SHORT, MPI_LXOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_LXOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_LXOR, comm ); +for (i=0; i 1); + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_LXOR, comm ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_LXOR(1)\n", errcnt, rank ); +errcnt = 0; + + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_LXOR(0)\n", errcnt, rank ); +errcnt = 0; + + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_LXOR(1-0)\n", errcnt, rank ); +errcnt = 0; + +/* Test LAND */ +if (world_rank == 0 && verbose) printf( "Testing MPI_LAND...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_LAND(0)\n", errcnt, rank ); +errcnt = 0; + + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_LAND(1)\n", errcnt, rank ); +errcnt = 0; + +/* Test BOR */ +if (world_rank == 0 && verbose) printf( "Testing MPI_BOR...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_BOR(1)\n", errcnt, rank ); +errcnt = 0; + +/* Test BAND */ +if (world_rank == 0 && verbose) printf( "Testing MPI_BAND...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_BAND(1)\n", errcnt, rank ); +errcnt = 0; + + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_BAND(0)\n", errcnt, rank ); +errcnt = 0; + +/* Test BXOR */ +if (world_rank == 0 && verbose) printf( "Testing MPI_BXOR...\n" ); + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 1)*0xf0 ; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_INT, MPI_BXOR, comm ); +for (i=0; i 1)*0xf0 ; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_LONG, MPI_BXOR, comm ); +for (i=0; i 1)*0xf0 ; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_SHORT, MPI_BXOR, comm ); +for (i=0; i 1)*0xf0 ; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED_SHORT, MPI_BXOR, comm ); +for (i=0; i 1)*0xf0 ; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED, MPI_BXOR, comm ); +for (i=0; i 1)*0xf0 ; + *(out + i) = 0; } +MPI_Allreduce( in, out, count, MPI_UNSIGNED_LONG, MPI_BXOR, comm ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_BXOR(1)\n", errcnt, rank ); +errcnt = 0; + + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_BXOR(0)\n", errcnt, rank ); +errcnt = 0; + + +{ +int *in, *out, *sol; +int i, fnderr=0; +in = (int *)malloc( count * sizeof(int) ); +out = (int *)malloc( count * sizeof(int) ); +sol = (int *)malloc( count * sizeof(int) ); +for (i=0; i 0) + printf( "Found %d errors on %d for MPI_BXOR(1-0)\n", errcnt, rank ); +errcnt = 0; + +/* Test Maxloc */ +if (world_rank == 0 && verbose) printf( "Testing MPI_MAXLOC...\n" ); + +{ +struct int_test { int a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct int_test *)malloc( count * sizeof(struct int_test) ); +out = (struct int_test *)malloc( count * sizeof(struct int_test) ); +sol = (struct int_test *)malloc( count * sizeof(struct int_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1); + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_2INT, MPI_MAXLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_2INT and op MPI_MAXLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +{ +struct long_test { long a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct long_test *)malloc( count * sizeof(struct long_test) ); +out = (struct long_test *)malloc( count * sizeof(struct long_test) ); +sol = (struct long_test *)malloc( count * sizeof(struct long_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1); + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_LONG_INT, MPI_MAXLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_LONG_INT and op MPI_MAXLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +{ +struct short_test { short a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct short_test *)malloc( count * sizeof(struct short_test) ); +out = (struct short_test *)malloc( count * sizeof(struct short_test) ); +sol = (struct short_test *)malloc( count * sizeof(struct short_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1); + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_SHORT_INT, MPI_MAXLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_SHORT_INT and op MPI_MAXLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +{ +struct float_test { float a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct float_test *)malloc( count * sizeof(struct float_test) ); +out = (struct float_test *)malloc( count * sizeof(struct float_test) ); +sol = (struct float_test *)malloc( count * sizeof(struct float_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1); + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_FLOAT_INT, MPI_MAXLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_FLOAT_INT and op MPI_MAXLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +{ +struct double_test { double a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct double_test *)malloc( count * sizeof(struct double_test) ); +out = (struct double_test *)malloc( count * sizeof(struct double_test) ); +sol = (struct double_test *)malloc( count * sizeof(struct double_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = (size - 1 + i); (sol + i)->b = (size-1); + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_DOUBLE_INT, MPI_MAXLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_DOUBLE_INT and op MPI_MAXLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +gerr += errcnt; +if (errcnt > 0) + printf( "Found %d errors on %d for MPI_MAXLOC\n", errcnt, rank ); +errcnt = 0; + +/* Test minloc */ +if (world_rank == 0 && verbose) printf( "Testing MPI_MINLOC...\n" ); + + +{ +struct int_test { int a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct int_test *)malloc( count * sizeof(struct int_test) ); +out = (struct int_test *)malloc( count * sizeof(struct int_test) ); +sol = (struct int_test *)malloc( count * sizeof(struct int_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = i; (sol + i)->b = 0; + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_2INT, MPI_MINLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_2INT and op MPI_MINLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +{ +struct long_test { long a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct long_test *)malloc( count * sizeof(struct long_test) ); +out = (struct long_test *)malloc( count * sizeof(struct long_test) ); +sol = (struct long_test *)malloc( count * sizeof(struct long_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = i; (sol + i)->b = 0; + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_LONG_INT, MPI_MINLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_LONG_INT and op MPI_MINLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +{ +struct short_test { short a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct short_test *)malloc( count * sizeof(struct short_test) ); +out = (struct short_test *)malloc( count * sizeof(struct short_test) ); +sol = (struct short_test *)malloc( count * sizeof(struct short_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = i; (sol + i)->b = 0; + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_SHORT_INT, MPI_MINLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_SHORT_INT and op MPI_MINLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +{ +struct float_test { float a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct float_test *)malloc( count * sizeof(struct float_test) ); +out = (struct float_test *)malloc( count * sizeof(struct float_test) ); +sol = (struct float_test *)malloc( count * sizeof(struct float_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = i; (sol + i)->b = 0; + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_FLOAT_INT, MPI_MINLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_FLOAT_INT and op MPI_MINLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +} + + +{ +struct double_test { double a; int b; } *in, *out, *sol; +int i,fnderr=0; +in = (struct double_test *)malloc( count * sizeof(struct double_test) ); +out = (struct double_test *)malloc( count * sizeof(struct double_test) ); +sol = (struct double_test *)malloc( count * sizeof(struct double_test) ); +for (i=0; ia = (rank + i); (in + i)->b = rank; + (sol + i)->a = i; (sol + i)->b = 0; + (out + i)->a = 0; (out + i)->b = -1; } +MPI_Allreduce( in, out, count, MPI_DOUBLE_INT, MPI_MINLOC, comm ); +for (i=0; ia != (sol + i)->a || + (out + i)->b != (sol + i)->b) { + errcnt++; fnderr++; + fprintf( stderr, "(%d) Expected (%d,%d) got (%d,%d)\n", world_rank, + (int)((sol + i)->a), + (sol+i)->b, (int)((out+i)->a), (out+i)->b ); +}} +if (fnderr) fprintf( stderr, + "(%d) Error for type MPI_DOUBLE_INT and op MPI_MINLOC (%d of %d wrong)\n", + world_rank, fnderr, count ); +free( in ); +free( out ); +free( sol ); +//} + + +gerr += errcnt; +if (errcnt > 0) + printf( "Found %d errors on %d for MPI_MINLOC\n", errcnt, rank ); +errcnt = 0; + +} +if (gerr > 0) { + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + printf( "Found %d errors overall on %d\n", gerr, rank ); + } +MPI_Allreduce( &gerr, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } +//FreeComms( comms, ncomm ); +MPI_Finalize( ); +return 0; +} diff --git a/teshsuite/smpi/mpich-test/coll/allred.std b/teshsuite/smpi/mpich-test/coll/allred.std new file mode 100644 index 0000000000..06d9e1259f --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/allred.std @@ -0,0 +1,13 @@ +Testing MPI_SUM... +Testing MPI_PROD... +Testing MPI_MAX... +Testing MPI_MIN... +Testing MPI_LOR... +Testing MPI_LXOR... +Testing MPI_LAND... +Testing MPI_BOR... +Testing MPI_BAND... +Testing MPI_BXOR... +Testing MPI_MAXLOC... +Testing MPI_MINLOC... + No Errors diff --git a/teshsuite/smpi/mpich-test/coll/allred2.c b/teshsuite/smpi/mpich-test/coll/allred2.c new file mode 100644 index 0000000000..a9dc98a214 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/allred2.c @@ -0,0 +1,50 @@ +/* + This test checks for possible interference between + successive calls to MPI_Allreduce. Some users, on some MPI implementations + and platforms, have had to add MPI_Barrier before MPI_Allreduce calls. + */ +#include "mpi.h" +#include + +#define MAX_LOOP 1000 + +int main( int argc, char *argv[] ) +{ + int i, in_val, out_val; + int rank, size; + int errs = 0, toterrs; + + MPI_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + for (i=0; i +#include "mpi.h" +#include "test.h" + +/* + * This example should be run with 2 processes and tests the ability of the + * implementation to handle a flood of one-way messages. + */ + +int main( int argc, char **argv ) +{ + double wscale = 10.0, scale; + int numprocs, myid,i,namelen; + char processor_name[MPI_MAX_PROCESSOR_NAME]; + + MPI_Init(&argc,&argv); + MPI_Comm_size(MPI_COMM_WORLD,&numprocs); + MPI_Comm_rank(MPI_COMM_WORLD,&myid); + MPI_Get_processor_name(processor_name,&namelen); + + /* fprintf(stderr,"Process %d on %s\n", + myid, processor_name); */ + for ( i=0; i<10000; i++) { + MPI_Allreduce(&wscale,&scale,1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD); + } + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/coll/allredmany.std b/teshsuite/smpi/mpich-test/coll/allredmany.std new file mode 100644 index 0000000000..e7c3f62796 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/allredmany.std @@ -0,0 +1,22 @@ +*** allredmany *** +*** allredmany run 0 *** +*** allredmany run 1 *** +*** allredmany run 2 *** +*** allredmany run 3 *** +*** allredmany run 4 *** +*** allredmany run 5 *** +*** allredmany run 6 *** +*** allredmany run 7 *** +*** allredmany run 8 *** +*** allredmany run 9 *** +*** allredmany run 10 *** +*** allredmany run 11 *** +*** allredmany run 12 *** +*** allredmany run 13 *** +*** allredmany run 14 *** +*** allredmany run 15 *** +*** allredmany run 16 *** +*** allredmany run 17 *** +*** allredmany run 18 *** +*** allredmany run 19 *** +*** allredmany *** diff --git a/teshsuite/smpi/mpich-test/coll/alltoallv.c b/teshsuite/smpi/mpich-test/coll/alltoallv.c new file mode 100644 index 0000000000..b08979bbca --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/alltoallv.c @@ -0,0 +1,97 @@ +#include "mpi.h" +#include +#include +#include "test.h" + +/* + This program tests MPI_Alltoallv by having processor i send different + amounts of data to each processor. + + Because there are separate send and receive types to alltoallv, + there need to be tests to rearrange data on the fly. Not done yet. + + The first test sends i items to processor i from all processors. + + Currently, the test uses only MPI_INT; this is adequate for testing systems + that use point-to-point operations + */ + +int main( int argc, char **argv ) +{ + + MPI_Comm comm; + int *sbuf, *rbuf; + int rank, size; + int *sendcounts, *recvcounts, *rdispls, *sdispls; + int i, j, *p, err, toterr; + + MPI_Init( &argc, &argv ); + err = 0; + + comm = MPI_COMM_WORLD; + + /* Create the buffer */ + MPI_Comm_size( comm, &size ); + MPI_Comm_rank( comm, &rank ); + sbuf = (int *)malloc( size * size * sizeof(int) ); + rbuf = (int *)malloc( size * size * sizeof(int) ); + if (!sbuf || !rbuf) { + fprintf( stderr, "Could not allocated buffers!\n" ); + MPI_Abort( comm, 1 ); + } + + /* Load up the buffers */ + for (i=0; i 0) + fprintf( stderr, "Test FAILED with %d errors\n", toterr ); + else + fprintf( stderr, " No Errors\n" ); + } + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/coll/assocf.f b/teshsuite/smpi/mpich-test/coll/assocf.f new file mode 100644 index 0000000000..f39747c39e --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/assocf.f @@ -0,0 +1,73 @@ +C +C Thanks to zollweg@tc.cornell.edu (John A. Zollweg) for this test +C which detected a problem in one version of the IBM product +C implementation of MPI. The source of the problem in that implementation +C was assuming that floating point arithmetic was associative (it isn't +C even commutative on IBM hardware). +C +C This program was designed for IEEE and may be uninteresting on other +C systems. Note that since it is testing that the same VALUE is +C delivered at each system, it will run correctly on all systems. +C + PROGRAM ALLREDUCE + include 'mpif.h' + real*8 myval(4), sum, recvbuf(4) + integer ier, me, size, tsize, dtype, i, errors, toterr + data myval /-12830196119319614d0,9154042893114674d0, + &2371516219785616d0,1304637006419324.8d0/ + call MPI_INIT(ier) + call MPI_COMM_SIZE(MPI_COMM_WORLD,size,ier) + if (size.ne.4) then + print *,"This test case must be run as a four-way job" + call MPI_FINALIZE(ier) + stop + end if + call MPI_TYPE_SIZE( MPI_REAL, tsize, ier ) + if (tsize .eq. 8) then + dtype = MPI_REAL + else + call MPI_TYPE_SIZE( MPI_DOUBLE_PRECISION, tsize, ier ) + if (tsize .ne. 8) then + print *, " Can not test allreduce without an 8 byte" + print *, " floating double type." + call MPI_FINALIZE(ier) + stop + endif + dtype = MPI_DOUBLE_PRECISION + endif + call MPI_COMM_RANK(MPI_COMM_WORLD,me,ier) + call MPI_ALLREDUCE(myval(me+1),sum,1,dtype,MPI_SUM, + &MPI_COMM_WORLD,ier) +C +C collect the values and make sure that they are all the same BITWISE +C We could use Gather, but this gives us an added test. +C + do 5 i=1,4 + recvbuf(i) = i + 5 continue + call MPI_ALLGATHER( sum, 1, dtype, recvbuf, 1, dtype, + & MPI_COMM_WORLD, ier ) + errors = 0 + do 10 i=2,4 +C print *, "recvbuf(",i,") = ", recvbuf(i), " on ", me + if (recvbuf(1) .ne. recvbuf(i)) then + errors = errors + 1 + print *, "Inconsistent values for ", i, "th entry on ", + & me + print *, recvbuf(1), " not equal to ", recvbuf(i) + endif + 10 continue + call MPI_ALLREDUCE( errors, toterr, 1, MPI_INTEGER, MPI_SUM, + & MPI_COMM_WORLD, ier ) + if (me .eq. 0) then + if (toterr .gt. 0) then + print *, " FAILED with ", toterr, " errors." + else + print *, " No Errors" + endif + endif +C print *," The value of the sum on node ",me,"is",sum + call MPI_FINALIZE(ier) +C Calling stop can generate unwanted noise on some systems, and is not +C required. + end diff --git a/teshsuite/smpi/mpich-test/coll/barrier.c b/teshsuite/smpi/mpich-test/coll/barrier.c new file mode 100644 index 0000000000..94fd3621d1 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/barrier.c @@ -0,0 +1,88 @@ +/* This program provides some simple verification of the MPI_Barrier + * program. All of the clients send a message to indicate that they + * are alive (a simple character string) and then the all of the + * clients enter an MPI_Barrier. The server then Iprobes for a while + * to make sure that none of the "through barrier" messages that the + * clients send after leaving the barrier arive before the server enters + * the barrier. The server then enters the barrier, and upon leaving, + * waits for a message from each client. + */ + +#include "test.h" +#include "mpi.h" + +#define WAIT_TIMES 500 + +int +main( int argc, char **argv) +{ + int rank, size, i, recv_flag, ret, passed; + MPI_Status Status; + char message[17]; + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + if (rank == 0) { + Test_Init("barrier", rank); + /* Receive the startup messages from each of the + other clients */ + for (i = 0; i < size - 1; i++) { + MPI_Recv(message, 17, MPI_CHAR, MPI_ANY_SOURCE, 2000, + MPI_COMM_WORLD, &Status); + } + + /* Now use Iprobe to make sure no more messages arive for a + while */ + passed = 1; + for (i = 0; i < WAIT_TIMES; i++){ + recv_flag = 0; + MPI_Iprobe(MPI_ANY_SOURCE, 2000, MPI_COMM_WORLD, + &recv_flag, &Status); + if (recv_flag) + passed = 0; + } + + if (passed) + Test_Passed("Barrier Test 1"); + else + Test_Failed("Barrier Test 1"); + + /* Now go into the barrier myself */ + MPI_Barrier(MPI_COMM_WORLD); + + /* And get everyones message who came out */ + for (i = 0; i < size - 1; i++) { + MPI_Recv(message, 13, MPI_CHAR, MPI_ANY_SOURCE, 2000, + MPI_COMM_WORLD, &Status); + } + + /* Now use Iprobe to make sure no more messages arive for a + while */ + passed = 1; + for (i = 0; i < WAIT_TIMES; i++){ + recv_flag = 0; + MPI_Iprobe(MPI_ANY_SOURCE, 2000, MPI_COMM_WORLD, + &recv_flag, &Status); + if (recv_flag) + passed = 0; + } + if (passed) + Test_Passed("Barrier Test 2"); + else + Test_Failed("Barrier Test 2"); + + Test_Waitforall( ); + ret = Summarize_Test_Results(); + Test_Finalize(); + MPI_Finalize(); + return ret; + } else { + MPI_Send((char*)"Entering Barrier", 17, MPI_CHAR, 0, 2000, MPI_COMM_WORLD); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Send((char*)"Past Barrier", 13, MPI_CHAR, 0, 2000, MPI_COMM_WORLD); + Test_Waitforall( ); + MPI_Finalize(); + return 0; + } +} diff --git a/teshsuite/smpi/mpich-test/coll/bcast.c b/teshsuite/smpi/mpich-test/coll/bcast.c new file mode 100644 index 0000000000..f8c983a5ac --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/bcast.c @@ -0,0 +1,53 @@ +/* + * This program performs some simple tests of the MPI_Bcast broadcast + * functionality. + */ + +#include "test.h" +#include "mpi.h" +#include + +int +main( int argc, char **argv) +{ + int rank, size, ret, passed, i, *test_array; + + /* Set up MPI */ + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + /* Setup the tests */ + Test_Init("bcast", rank); + test_array = (int *)malloc(size*sizeof(int)); + + /* Perform the test - this operation should really be done + with an allgather, but it makes a good test... */ + passed = 1; + for (i=0; i < size; i++) { + if (i == rank) + test_array[i] = i; + MPI_Bcast(test_array, size, MPI_INT, i, MPI_COMM_WORLD); + if (test_array[i] != i) + passed = 0; + } + if (!passed) + Test_Failed("Simple Broadcast test"); + else { + if (rank == 0) + Test_Passed("Simple Broadcast test"); + } + + /* Close down the tests */ + free(test_array); + if (rank == 0) + ret = Summarize_Test_Results(); + else + ret = 0; + Test_Finalize(); + + /* Close down MPI */ + Test_Waitforall( ); + MPI_Finalize(); + return ret; +} diff --git a/teshsuite/smpi/mpich-test/coll/bcast2.f b/teshsuite/smpi/mpich-test/coll/bcast2.f new file mode 100644 index 0000000000..25b6aa3a3c --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/bcast2.f @@ -0,0 +1,36 @@ + program test +C +C This program hangs when run with the version of MPICH (1.1.2) distributed +C by Myricom using their ch_gm device. I've added it to our collection +C on general principle; note that it hasn't been put into a form usable +C by our tests yet +C + include 'mpif.h' + integer comm_size,comm_rank,status(mpi_status_size) + integer at_number,chunk + double precision T0,D + at_number=0 + chunk=0 + T0=3D3048.48883 + D=3D3877.4888 + call mpi_init(ierror) + call mpi_comm_size(mpi_comm_world,comm_size,ierror) + call mpi_comm_rank(mpi_comm_world,comm_rank,ierror) + CALL MPI_BCAST(at_number,1,mpi_integer,0,mpi_comm_world,ierr) + CALL MPI_BCAST(chunk,1,mpi_integer,0,mpi_comm_world,ierr) + CALL MPI_BCAST(T0,1,mpi_double_precision,0,mpi_comm_world,ierr) + CALL MPI_BCAST(D,1,mpi_double_precision,0,mpi_comm_world,ierr) + + write(6,*) 'Rank=3D',comm_rank,' finished bcast' + do i=3D1,99999 + T0=3Di*1.0d0 + d=3Dt0**.987 + do j=3D1,100 + a=3Dj**.2 + enddo + enddo + write(6,*) 'Rank=3D',comm_rank,' finished calculations' + call mpi_finalize(ierror) + end +C +C Run with mpirun -np 16 test diff --git a/teshsuite/smpi/mpich-test/coll/bcastbug.c b/teshsuite/smpi/mpich-test/coll/bcastbug.c new file mode 100644 index 0000000000..dc2d81af99 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/bcastbug.c @@ -0,0 +1,70 @@ +#include "mpi.h" +#include +#include +#include "test.h" + +int main( int argc, char **argv ) +{ + char *buf; + int rank, size, i; + MPI_Request req[10]; + MPI_Status stat[10]; + MPI_Status status; + + buf = (char *)malloc(32*1024); + MPI_Init(&argc, &argv); + MPI_Comm_rank ( MPI_COMM_WORLD, &rank ); + MPI_Comm_size ( MPI_COMM_WORLD, &size ); + + if (size > 10) return 1; + + if (rank == 0) { + for ( i = 1; i < size; i++ ) + MPI_Isend(buf,1024,MPI_BYTE,i,0,MPI_COMM_WORLD,&req[i]); + MPI_Waitall(size-1, &req[1], &stat[1]); /* Core dumps here! */ + } + else + MPI_Recv(buf,1024,MPI_BYTE,0,0,MPI_COMM_WORLD,&status); + + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} + +#if 0 +int MPIND_Waitall(count, array_of_requests, array_of_statuses ) +int count; +MPI_Request array_of_requests[]; +MPI_Status array_of_statuses[]; +{ + int i; + MPIR_BOOL completed; + + for (i = 0; i < count; i++) { + if (!array_of_requests[i]) continue; + MPID_complete_send(&array_of_requests[i]->shandle, + &(array_of_statuses[i]) ); + + MPIND_Request_free( &array_of_requests[i] ); /* Core dumps here! */ + array_of_requests[i] = NULL; + } + return MPI_SUCCESS; +} + + +#define MPID_ND_free_send_handle( a ) if ((a)->buffer) {FREE((a)->buffer);} + +int MPIND_Request_free( request ) +MPI_Request *request; +{ + int errno = MPI_SUCCESS; + + printf("Should be core dumping here (buffer = %d)...\n", + (&((*request)->shandle.dev_shandle))->buffer); + MPID_ND_free_send_handle(&((*request)->shandle.dev_shandle)); + printf("and not reaching here!\n"); + SBfree( MPIR_shandles, *request ); + + return MPI_SUCCESS; +} +#endif diff --git a/teshsuite/smpi/mpich-test/coll/bcastbug2.c b/teshsuite/smpi/mpich-test/coll/bcastbug2.c new file mode 100644 index 0000000000..4870195388 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/bcastbug2.c @@ -0,0 +1,29 @@ +#include "mpi.h" +#include +#include +#include "test.h" + +int main( int argc, char **argv) +{ + char *buf; + int i, iam; + MPI_Init(&argc, &argv); + MPI_Barrier(MPI_COMM_WORLD); + buf = (char *)malloc(32*1024); + MPI_Comm_rank(MPI_COMM_WORLD, &iam); + for(i=1; i<=32; i++){ + if (iam == 0){ + *buf=i; + printf("Broadcasting %d bytes\n", i*64); + } + MPI_Bcast(buf, i*64, MPI_BYTE, 0, MPI_COMM_WORLD); + if (*buf != i) printf("Sanity check error on node %d\n", iam); +/* gsync(); +*/ + MPI_Barrier(MPI_COMM_WORLD); + } + Test_Waitforall( ); + MPI_Finalize(); + + return 0; +} diff --git a/teshsuite/smpi/mpich-test/coll/bcastlog.f b/teshsuite/smpi/mpich-test/coll/bcastlog.f new file mode 100644 index 0000000000..a36cc68232 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/bcastlog.f @@ -0,0 +1,39 @@ + program main +c test bcast of logical +c works on suns, needs mpich fix and heterogeneous test on alpha with PC + include 'mpif.h' + integer myid, numprocs, rc, ierr + integer errs, toterrs + logical boo + + call MPI_INIT( ierr ) + call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) + call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) +C + errs = 0 + boo = .true. + call MPI_BCAST(boo,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) + if (boo .neqv. .true.) then + print *, 'Did not broadcast Fortran logical (true)' + errs = errs + 1 + endif +C + boo = .false. + call MPI_BCAST(boo,1,MPI_LOGICAL,0,MPI_COMM_WORLD,ierr) + if (boo .neqv. .false.) then + print *, 'Did not broadcast Fortran logical (false)' + errs = errs + 1 + endif + call MPI_Reduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, + $ 0, MPI_COMM_WORLD, ierr ) + if (myid .eq. 0) then + if (toterrs .eq. 0) then + print *, ' No Errors' + else + print *, ' Found ', toterrs, ' errors' + endif + endif + call MPI_FINALIZE(rc) +C stop +C do not use stop with smpi, it causes errors, as does exit + end diff --git a/teshsuite/smpi/mpich-test/coll/bcastvec.c b/teshsuite/smpi/mpich-test/coll/bcastvec.c new file mode 100644 index 0000000000..b587174a86 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/bcastvec.c @@ -0,0 +1,83 @@ +/* + * This program performs some simple tests of the MPI_Bcast broadcast + * functionality. + * + * It checks the handling of different datatypes by different participants + * (with matching type signatures, of course), as well as different + * roots and communicators. + */ + +#include "test.h" +#include "mpi.h" +#include + +int main( int argc, char **argv ) +{ + int rank, size, ret, passed, i, *test_array; + int stride, count, root; + MPI_Datatype newtype; + MPI_Comm comm = MPI_COMM_WORLD; + + /* Set up MPI */ + MPI_Init(&argc, &argv); + MPI_Comm_rank(comm, &rank); + + /* Setup the tests */ + Test_Init("bcastvec", rank); + + /* Allow for additional communicators */ + MPI_Comm_size(comm, &size); + /* MPI_Comm_rank(comm, &rank); */ + stride = (rank + 1); + test_array = (int *)malloc(size*stride*sizeof(int)); + + /* Create the vector datatype EXCEPT for process 0 (vector of + stride 1 is contiguous) */ + if (rank > 0) { + count = 1; + MPI_Type_vector( size, 1, stride, MPI_INT, &newtype); + MPI_Type_commit( &newtype ); + } + else { + count = size; + newtype = MPI_INT; + } + + /* Perform the test. Each process in turn becomes the root. + After each operation, check that nothing has gone wrong */ + passed = 1; + for (root = 0; root < size; root++) { + /* Fill the array with -1 for unset, rank + i * size for set */ + for (i=0; i +#include + +int main( int argc, char **argv ) +{ + int rank, size, i; + int *table; + int errors=0; + MPI_Aint address; + MPI_Datatype type, newtype; + int lens; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* Make data table */ + table = (int *) calloc (size, sizeof(int)); + table[rank] = rank + 1; + + MPI_Barrier ( MPI_COMM_WORLD ); + /* Broadcast the data */ + for ( i=0; i +#include "test.h" +#define BAD_ANSWER 100000 + +int assoc ( int *, int *, int *, MPI_Datatype * ); + +/* + The operation is inoutvec[i] = invec[i] op inoutvec[i] + (see 4.9.4). The order is important. + + Note that the computation is in process rank (in the communicator) + order, independant of the root. + */ +int assoc(invec, inoutvec, len, dtype) +int *invec, *inoutvec, *len; +MPI_Datatype *dtype; +{ + int i; + for ( i=0; i<*len; i++ ) { + if (inoutvec[i] <= invec[i] ) { + int rank; + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + fprintf( stderr, "[%d] inout[0] = %d, in[0] = %d\n", + rank, inoutvec[0], invec[0] ); + inoutvec[i] = BAD_ANSWER; + } + else + inoutvec[i] = invec[i]; + } + return (1); +} + +int main( int argc, char **argv ) +{ + int rank, size; + int data; + int errors=0; + int result = -100; + MPI_Op op; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + data = rank; + + MPI_Op_create( (MPI_User_function*)assoc, 0, &op ); + MPI_Reduce ( &data, &result, 1, MPI_INT, op, size-1, MPI_COMM_WORLD ); + MPI_Bcast ( &result, 1, MPI_INT, size-1, MPI_COMM_WORLD ); + MPI_Op_free( &op ); + if (result == BAD_ANSWER) errors++; + + if (errors) + printf( "[%d] done with ERRORS(%d)!\n", rank, errors ); + Test_Waitforall( ); + MPI_Finalize(); + + return errors; +} diff --git a/teshsuite/smpi/mpich-test/coll/coll11.c b/teshsuite/smpi/mpich-test/coll/coll11.c new file mode 100644 index 0000000000..e3ce6c8525 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/coll11.c @@ -0,0 +1,110 @@ +#include "mpi.h" +#include +#include "test.h" + +void addem ( int *, int *, int *, MPI_Datatype * ); +void assoc ( int *, int *, int *, MPI_Datatype * ); + +void addem(invec, inoutvec, len, dtype) +int *invec, *inoutvec, *len; +MPI_Datatype *dtype; +{ + int i; + for ( i=0; i<*len; i++ ) + inoutvec[i] += invec[i]; +} + +#define BAD_ANSWER 100000 + +/* + The operation is inoutvec[i] = invec[i] op inoutvec[i] + (see 4.9.4). The order is important. + + Note that the computation is in process rank (in the communicator) + order, independant of the root. + */ +void assoc(invec, inoutvec, len, dtype) +int *invec, *inoutvec, *len; +MPI_Datatype *dtype; +{ + int i; + for ( i=0; i<*len; i++ ) { + if (inoutvec[i] <= invec[i] ) { + int rank; + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + fprintf( stderr, "[%d] inout[0] = %d, in[0] = %d\n", + rank, inoutvec[0], invec[0] ); + inoutvec[i] = BAD_ANSWER; + } + else + inoutvec[i] = invec[i]; + } +} + +int main( int argc, char **argv ) +{ + int rank, size, i; + int data; + int errors=0; + int result = -100; + int correct_result; + MPI_Op op_assoc, op_addem; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + data = rank; + + correct_result = 0; + for (i=0;i<=rank;i++) + correct_result += i; + + MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (result != correct_result) { + fprintf( stderr, "[%d] Error suming ints with scan\n", rank ); + errors++; + } + + MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (result != correct_result) { + fprintf( stderr, "[%d] Error summing ints with scan (2)\n", rank ); + errors++; + } + + data = rank; + result = -100; + MPI_Op_create( (MPI_User_function *)assoc, 0, &op_assoc ); + MPI_Op_create( (MPI_User_function *)addem, 1, &op_addem ); + MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, MPI_COMM_WORLD ); + if (result != correct_result) { + fprintf( stderr, "[%d] Error summing ints with scan (userop)\n", + rank ); + errors++; + } + + MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, MPI_COMM_WORLD ); + if (result != correct_result) { + fprintf( stderr, "[%d] Error summing ints with scan (userop2)\n", + rank ); + errors++; + } + /*result = -100; + data = rank; + MPI_Scan ( &data, &result, 1, MPI_INT, op_assoc, MPI_COMM_WORLD ); + if (result == BAD_ANSWER) { + fprintf( stderr, "[%d] Error scanning with non-commutative op\n", + rank ); + errors++; + }*/ + + MPI_Op_free( &op_assoc ); + MPI_Op_free( &op_addem ); + + if (errors) + printf( "[%d] done with ERRORS(%d)!\n", rank, errors ); + + Test_Waitforall( ); + MPI_Finalize(); + return errors; +} diff --git a/teshsuite/smpi/mpich-test/coll/coll12.c b/teshsuite/smpi/mpich-test/coll/coll12.c new file mode 100644 index 0000000000..b25b52c8fe --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/coll12.c @@ -0,0 +1,76 @@ + +#include +#include "mpi.h" +#include "test.h" + +#define TABLE_SIZE 2 + +int main( int argc, char **argv ) +{ + int rank, size; + double a[TABLE_SIZE]; + struct { double a; int b; } in[TABLE_SIZE], out[TABLE_SIZE]; + int i; + int errors = 0, toterrors; + + /* Initialize the environment and some variables */ + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* Initialize the maxloc data */ + for ( i=0; i +#include + +#include +#include +#ifndef EXIT_SUCCESS +#define EXIT_SUCCESS 0 +#define EXIT_FAILURE 1 +#endif + +int main( int argc, char *argv[] ) +{ + int rank, size; + int chunk = 4096; + int i; + int *sb; + int *rb; + int status, gstatus; + + MPI_Init(&argc,&argv); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + MPI_Comm_size(MPI_COMM_WORLD,&size); + + for ( i=1 ; i < argc ; ++i ) { + if ( argv[i][0] != '-' ) + continue; + switch(argv[i][1]) { + case 'm': + chunk = atoi(argv[++i]); + break; + default: + fprintf(stderr,"Unrecognized argument %s\n", + argv[i]); + MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE); + } + } + + sb = (int *)malloc(size*chunk*sizeof(int)); + if ( !sb ) { + perror( "can't allocate send buffer" ); + MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE); + } + rb = (int *)malloc(size*chunk*sizeof(int)); + if ( !rb ) { + perror( "can't allocate recv buffer"); + free(sb); + MPI_Abort(MPI_COMM_WORLD,EXIT_FAILURE); + } + for ( i=0 ; i < size*chunk ; ++i ) { + sb[i] = rank + 1; + rb[i] = 0; + } + + /* fputs("Before MPI_Alltoall\n",stdout); */ + + /* This should really send MPI_CHAR, but since sb and rb were allocated + as chunk*size*sizeof(int), the buffers are large enough */ + status = MPI_Alltoall(sb,chunk,MPI_INT,rb,chunk,MPI_INT, + MPI_COMM_WORLD); + + /* fputs("Before MPI_Allreduce\n",stdout); */ + MPI_Allreduce( &status, &gstatus, 1, MPI_INT, MPI_SUM, + MPI_COMM_WORLD ); + + /* fputs("After MPI_Allreduce\n",stdout); */ + if (rank == 0) { + if (gstatus == 0) printf( " No Errors\n" ); + else + printf("all_to_all returned %d\n",gstatus); + } + + free(sb); + free(rb); + + MPI_Finalize(); + + return(EXIT_SUCCESS); +} + diff --git a/teshsuite/smpi/mpich-test/coll/coll2.c b/teshsuite/smpi/mpich-test/coll/coll2.c new file mode 100644 index 0000000000..d5871712f4 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/coll2.c @@ -0,0 +1,68 @@ +#include "mpi.h" +#include +#include "test.h" + +#define MAX_PROCESSES 10 + +int main( int argc, char **argv ) +{ + int rank, size, i,j; + int table[MAX_PROCESSES][MAX_PROCESSES]; + int errors=0; + int participants; + MPI_Comm testcomm; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* A maximum of MAX_PROCESSES processes can participate */ + if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES; + else participants = size; + /* Set the particpants so that it divides the MAX_PROCESSES */ + while (MAX_PROCESSES % participants) participants--; + /* Create the communicator */ + MPI_Comm_split( MPI_COMM_WORLD, rank < participants, rank, &testcomm ); + + if (MAX_PROCESSES % participants) { + fprintf( stderr, "Number of processors must divide %d\n", + MAX_PROCESSES ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + if ( (rank < participants) ) { + + /* Determine what rows are my responsibility */ + int block_size = MAX_PROCESSES / participants; + int begin_row = rank * block_size; + int end_row = (rank+1) * block_size; + int send_count = block_size * MAX_PROCESSES; + int recv_count = send_count; + + /* Paint my rows my color */ + for (i=begin_row; i +#include "test.h" + +#define MAX_PROCESSES 10 + +int main( int argc, char **argv ) +{ + int rank, size, i,j; + int table[MAX_PROCESSES][MAX_PROCESSES]; + int errors=0; + int participants; + int displs[MAX_PROCESSES]; + int recv_counts[MAX_PROCESSES]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* A maximum of MAX_PROCESSES processes can participate */ + if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES; + else participants = size; + /* while (MAX_PROCESSES % participants) participants--; */ + if (MAX_PROCESSES % participants) { + fprintf( stderr, "Number of processors must divide %d\n", + MAX_PROCESSES ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + if ( (rank < participants) ) { + + /* Determine what rows are my responsibility */ + int block_size = MAX_PROCESSES / participants; + int begin_row = rank * block_size; + int end_row = (rank+1) * block_size; + int send_count = block_size * MAX_PROCESSES; + + /* Fill in the displacements and recv_counts */ + for (i=0; i +#include "test.h" + +#define MAX_PROCESSES 10 + +int main( int argc, char **argv ) +{ + int rank, size, i,j; + int table[MAX_PROCESSES][MAX_PROCESSES]; + int row[MAX_PROCESSES]; + int errors=0; + int participants; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* A maximum of MAX_PROCESSES processes can participate */ + if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES; + else participants = size; + if ( (rank < participants) ) { + int send_count = MAX_PROCESSES; + int recv_count = MAX_PROCESSES; + + /* If I'm the root (process 0), then fill out the big table */ + if (rank == 0) + for ( i=0; i +#include "test.h" + +#define MAX_PROCESSES 10 + +int main( int argc, char **argv ) +{ + int rank, size, i,j; + int table[MAX_PROCESSES][MAX_PROCESSES]; + int row[MAX_PROCESSES]; + int errors=0; + int participants; + int displs[MAX_PROCESSES]; + int send_counts[MAX_PROCESSES]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* A maximum of MAX_PROCESSES processes can participate */ + if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES; + else participants = size; + if ( (rank < participants) ) { + int recv_count = MAX_PROCESSES; + + /* If I'm the root (process 0), then fill out the big table */ + /* and setup send_counts and displs arrays */ + if (rank == 0) + for ( i=0; i +#include "test.h" + +#define MAX_PROCESSES 10 + +int main( int argc, char **argv ) +{ + int rank, size, i,j; + int table[MAX_PROCESSES][MAX_PROCESSES]; + int errors=0; + int participants; + int displs[MAX_PROCESSES]; + int recv_counts[MAX_PROCESSES]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* A maximum of MAX_PROCESSES processes can participate */ + if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES; + else participants = size; + /* while (MAX_PROCESSES % participants) participants--; */ + if (MAX_PROCESSES % participants) { + fprintf( stderr, "Number of processors must divide %d\n", + MAX_PROCESSES ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + if ( (rank < participants) ) { + + /* Determine what rows are my responsibility */ + int block_size = MAX_PROCESSES / participants; + int begin_row = rank * block_size; + int end_row = (rank+1) * block_size; + int send_count = block_size * MAX_PROCESSES; + + /* Fill in the displacements and recv_counts */ + for (i=0; i +#include "test.h" + +#define MAX_PROCESSES 10 + +int main( int argc, char **argv ) +{ + int rank, size, i,j; + int table[MAX_PROCESSES][MAX_PROCESSES]; + int errors=0; + int participants; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* A maximum of MAX_PROCESSES processes can participate */ + if ( size > MAX_PROCESSES ) participants = MAX_PROCESSES; + else participants = size; + if (MAX_PROCESSES % participants) { + fprintf( stderr, "Number of processors must divide %d\n", + MAX_PROCESSES ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + /* while (MAX_PROCESSES % participants) participants--; */ + if ( (rank < participants) ) { + + /* Determine what rows are my responsibility */ + int block_size = MAX_PROCESSES / participants; + int begin_row = rank * block_size; + int end_row = (rank+1) * block_size; + int send_count = block_size * MAX_PROCESSES; + int recv_count = send_count; + + /* Paint my rows my color */ + for (i=begin_row; i +#include "test.h" + +int main( int argc, char **argv ) +{ + int rank, size, i; + int data; + int errors=0; + int result = -100; + int correct_result; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + data = rank; + + MPI_Reduce ( &data, &result, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD ); + MPI_Bcast ( &result, 1, MPI_INT, 0, MPI_COMM_WORLD ); + correct_result = 0; + for(i=0;i +#include "test.h" + +void addem ( int *, int *, int *, MPI_Datatype * ); + +void addem(invec, inoutvec, len, dtype) +int *invec, *inoutvec, *len; +MPI_Datatype *dtype; +{ + int i; + for ( i=0; i<*len; i++ ) + inoutvec[i] += invec[i]; +} + +int main( int argc, char **argv ) +{ + int rank, size, i; + int data; + int errors=0; + int result = -100; + int correct_result; + MPI_Op op; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + data = rank; + MPI_Op_create( (MPI_User_function *)addem, 1, &op ); + MPI_Reduce ( &data, &result, 1, MPI_INT, op, 0, MPI_COMM_WORLD ); + MPI_Bcast ( &result, 1, MPI_INT, 0, MPI_COMM_WORLD ); + MPI_Op_free( &op ); + correct_result = 0; + for(i=0;i +#include "test.h" + +int main( int argc, char **argv ) +{ + int rank, size, i; + MPI_Group group1, group2, group3, groupall, groupunion, newgroup; + MPI_Comm newcomm; + int ranks1[100], ranks2[100], ranks3[100]; + int nranks1=0, nranks2=0, nranks3=0; + + MPI_Init( &argc, &argv ); + MPI_Barrier( MPI_COMM_WORLD ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_group( MPI_COMM_WORLD, &groupall ); + + /* Divide groups */ + for (i=0; i +#include +#include "test.h" + +int add ( double *, double *, int *, MPI_Datatype * ); +/* + * User-defined operation on a long value (tests proper handling of + * possible pipelining in the implementation of reductions with user-defined + * operations). + */ +int add( invec, inoutvec, len, dtype ) +double *invec, *inoutvec; +int *len; +MPI_Datatype *dtype; +{ + int i, n = *len; + for (i=0; i + +int main( int argc, char *argv[] ) +{ + int rank, size; + MPI_Comm local_comm; + MPI_Request r; + MPI_Status status; + double t0; + + + MPI_Init( &argc, &argv ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + if (size < 3) { + fprintf( stderr, "Need at least 3 processors\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_split( MPI_COMM_WORLD, rank < 2, rank, &local_comm ); + + MPI_Barrier( MPI_COMM_WORLD ); + if (rank == 0) { + /* First, ensure ssend works */ + t0 = MPI_Wtime(); + MPI_Ssend( MPI_BOTTOM, 0, MPI_INT, 1, 1, MPI_COMM_WORLD ); + t0 = MPI_Wtime() - t0; + if (t0 < 1.0) { + fprintf( stderr, "Ssend does not wait for recv!\n" ); + fflush( stderr ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + MPI_Barrier( MPI_COMM_WORLD ); + /* Start the ssend after process 1 is well into its barrier */ + t0 = MPI_Wtime(); + while (MPI_Wtime() - t0 < 1.0) ; + MPI_Ssend( MPI_BOTTOM, 0, MPI_INT, 1, 0, MPI_COMM_WORLD ); + MPI_Barrier( local_comm ); + /* Send process 2 an alls well */ + MPI_Send( MPI_BOTTOM, 0, MPI_INT, 2, 0, MPI_COMM_WORLD ); + } + else if (rank == 1) { + t0 = MPI_Wtime(); + while (MPI_Wtime() - t0 < 2.0) ; + MPI_Recv( MPI_BOTTOM, 0, MPI_INT, 0, 1, MPI_COMM_WORLD, &status ); + MPI_Barrier( MPI_COMM_WORLD ); + MPI_Irecv( MPI_BOTTOM, 0, MPI_INT, 0, 0, MPI_COMM_WORLD, &r ); + MPI_Barrier( local_comm ); + MPI_Wait( &r, &status ); + } + else if (rank == 2) { + int flag; + + MPI_Barrier( MPI_COMM_WORLD ); + MPI_Irecv( MPI_BOTTOM, 0, MPI_INT, 0, 0, MPI_COMM_WORLD, &r ); + t0 = MPI_Wtime(); + while (MPI_Wtime() - t0 < 3.0) ; + MPI_Test( &r, &flag, &status ); + if (!flag) { + fprintf( stderr, "Test failed!\n" ); + fflush( stderr ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + else + fprintf( stderr, "Test succeeded\n" ); + } + else { + MPI_Barrier( MPI_COMM_WORLD ); + } + + MPI_Comm_free( &local_comm ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/coll/redscat.c b/teshsuite/smpi/mpich-test/coll/redscat.c new file mode 100644 index 0000000000..3cb057da76 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/redscat.c @@ -0,0 +1,53 @@ +/* + * Test of reduce scatter. + * + * Each processor contributes its rank + the index to the reduction, + * then receives the ith sum + * + * Can be called with any number of processors. + */ + +#include "mpi.h" +#include +#include +#include "test.h" + +int main( int argc, char **argv ) +{ + int err = 0, toterr; + int *sendbuf, *recvbuf, *recvcounts; + int size, rank, i, sumval; + MPI_Comm comm; + + + MPI_Init( &argc, &argv ); + comm = MPI_COMM_WORLD; + + MPI_Comm_size( comm, &size ); + MPI_Comm_rank( comm, &rank ); + sendbuf = (int *) malloc( size * sizeof(int) ); + for (i=0; i +#include "test.h" + +int main( int argc, char **argv ) +{ + int rank, value, result; + + MPI_Init (&argc, &argv); + MPI_Comm_rank (MPI_COMM_WORLD, &rank); + + value = (rank == 0) ? 3 : 6; + MPI_Allreduce (&value, &result, 1, MPI_INT, MPI_BOR, MPI_COMM_WORLD); + if (rank == 0) printf ("Result of 3 BOR 6 is %d, result of 3|6 is %d\n", + result, 3|6); + + Test_Waitforall( ); + MPI_Finalize (); + + return 0; +} diff --git a/teshsuite/smpi/mpich-test/coll/runtests b/teshsuite/smpi/mpich-test/coll/runtests new file mode 100755 index 0000000000..fe5080e3a7 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/runtests @@ -0,0 +1,190 @@ +#! /bin/sh +# This version puts the output from each program into a separate file. +# -mvhome is needed for the ANL SP, and is ignored by others +args= +device= +#top_srcdir=/home/degomme/Downloads/mpich-test +#srcdir=/home/degomme/Downloads/mpich-test/coll +MPICH_VERSION= +STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"} + +MAKE="make --no-print-directory" +MPIRUNMVBACK='' +# + +# Set mpirun to the name/path of the mpirun program +#FindMPIRUN +# +runtests=1 +makeeach=0 +writesummaryfile=no +have_fortran=0 +quiet=0 +MAKE="make --no-print-directory" +for arg in "$@" ; do + case $arg in + -basedir=* ) + basedir=`echo $arg | sed 's/-basedir=//'` + ;; + -srcdir=* ) + srcdir=`echo $arg | sed 's/-srcdir=//'` + ;; + -fort=* ) + have_fortran=`echo $arg | sed 's/-fort=//'` + ;; + -checkonly ) + runtests=0 + ;; + -margs=*) + margs=`echo $arg | sed 's/-margs=//'` + args="$args $margs" + ;; + -small) + shift + makeeach=1 + ;; + -summaryfile=*) + writesummaryfile=yes + summaryfile=`echo A$arg | sed 's/A-summaryfile=//'` + ;; + -quiet) + shift + quiet=1 + ;; + -help|-u) + echo "runtests [-checkonly] [-margs='...']" + echo "run tests in this directory. If -checkonly set, just run" + echo "the differences check (do NO rerun the test programs)." + echo "If -margs is used, these options are passed to mpirun." + echo "If -small is used, the examples are built, run, and deleted." + exit 1 + ;; + *) + if test -n "$arg" ; then + echo "runtests: Unknown argument ($arg)" + exit 1 + fi + ;; + esac +done +# Load basic procedures +. ${srcdir}/../runbase +# +# If the programs are not available, run make. +if [ ! -x coll1 -a $makeeach = 0 -a $runtests = 1 ] ; then + $MAKE +fi + +mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile --log=root.thres:critical" +testfiles="" +if [ $runtests = 1 ] ; then +echo '**** Testing MPI Collective routines ****' + +RunTest barrier 4 "*** Barrier Test ***" "" "barrier-0.out" + +RunTest bcast_mpich 4 "*** Broadcast Test ***" "" "bcast-0.out bcast-1.out bcast-2.out bcast-3.out" + +RunTest bcastvec 4 "*** Broadcast Datatype Test ***" "" "bcastvec-0.out bcastvec-1.out bcastvec-2.out bcastvec-3.out" + + +#TODO : handle MPI_BOTTOM to allow som operations to use absolute addresses +RunTest coll1 4 + +RunTest coll2 5 + +RunTest coll3 5 + +RunTest coll4 4 + +RunTest coll5 4 + +RunTest coll6 5 + +RunTest coll7 5 + +RunTest coll8 4 + +RunTest coll9 4 + +#smpi does not handle non commutative operations, removed +#RunTest coll10 4 + +#smpi does not handle non commutative operations, removed +RunTest coll11 4 + +#weird manipulations of ranks in split, and comms -> deadlock, removed +#RunTest scantst 4 + +RunTest coll12 4 + +# coll13 is very picky about arguments +RunTest coll13 4 + +RunTest longuser 4 + +# Some implementations (e.g., IBM's) forget to handle the np = 1 case. +#RunTest longuser 1 "*** longuser (np == 1) ***" +MakeExe longuser +cp longuser longuser1 +RunTest longuser1 1 '*** longuser (np == 1) ***' +rm -f longuser1 + +#OutTime +#testfiles="$testfiles allredmany.out" +#rm -f allredmany.out +#MakeExe allredmany +#echo '**** allredmany ****' +#echo '*** allredmany ***' >> allredmany.out +#cnt=0 +## Run several times to try and catch timing/race conditions in managing +## the flood of one-way messages. +#while [ $cnt -lt 20 ] ; do +# echo "*** allredmany run $cnt ***" >> allredmany.out +# $mpirun -np 2 $args allredmany >> allredmany.out 2>&1 +# cnt=`expr $cnt + 1` +#done +#echo '*** allredmany ***' >> allredmany.out +#CleanExe allredmany + +RunTest grouptest 4 +#uses MPI_Dims_create, MPI_Cart_create ... removed +RunTest allred 4 "*** Allred ***" + +RunTest allred2 4 "*** Allred2 ***" +#uses MPI_Dims_create, MPI_Cart_create ... removed +#RunTest scatterv 4 "*** Scatterv ***" + +RunTest scattern 4 "*** Scattern ***" + +#fails, more debug needed to understand +#RunTest redscat 4 "*** Reduce_scatter ***" + +RunTest alltoallv_mpich 4 "*** Alltoallv ***" +echo "runtests: fortran ($have_fortran)" +# +# Run Fortran tests ONLY if Fortran available +if [ $have_fortran -eq "1" ] ; then + echo "FORTRAN TESTS" + + RunTest allredf 4 "*** Testing allreduce from Fortran ***" + + RunTest assocf 4 "*** Testing allreduce from Fortran (2) ***" + + RunTest bcastlog 4 "*** Testing logical datatype in BCAST ***" + #buggy test, not available in original test, removed + #RunTest allgatherf 2 "*** Testing allgather from Fortran ***" + echo "END OF FORTRAN TESTS" +fi + +else + # Just run checks + testfiles=`echo *.out` + if test "$testfiles" = "*.out" ; then + echo "No output files remain from previous test!" + exit 1 + fi +fi + +echo '*** Checking for differences from expected output ***' +CheckAllOutput coll.diff +exit 0 diff --git a/teshsuite/smpi/mpich-test/coll/scantst.c b/teshsuite/smpi/mpich-test/coll/scantst.c new file mode 100644 index 0000000000..63561be65b --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/scantst.c @@ -0,0 +1,152 @@ +#include "mpi.h" +#include +#include "test.h" + +MPI_Comm GetNextComm( void ); +void addem ( int *, int *, int *, MPI_Datatype * ); +void assoc ( int *, int *, int *, MPI_Datatype * ); + +void addem( int *invec, int *inoutvec, int *len, MPI_Datatype *dtype) +{ + int i; + for ( i=0; i<*len; i++ ) + inoutvec[i] += invec[i]; +} + +#define BAD_ANSWER 100000 + +/* + The operation is inoutvec[i] = invec[i] op inoutvec[i] + (see 4.9.4). The order is important. + + Note that the computation is in process rank (in the communicator) + order, independant of the root. + */ +void assoc( int *invec, int *inoutvec, int *len, MPI_Datatype *dtype) +{ + int i; + for ( i=0; i<*len; i++ ) { + if (inoutvec[i] <= invec[i] ) { + int rank; + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + fprintf( stderr, "[%d] inout[0] = %d, in[0] = %d\n", + rank, inoutvec[0], invec[0] ); + inoutvec[i] = BAD_ANSWER; + } + else + inoutvec[i] = invec[i]; + } +} + +MPI_Comm GetNextComm( void ) +{ + MPI_Comm comm = MPI_COMM_NULL; + static int idx = 0; + int size, rank; + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + switch (idx) { + case 0: + MPI_Comm_dup( MPI_COMM_WORLD, &comm ); + break; + case 1: + /* invert the rank order */ + MPI_Comm_split( MPI_COMM_WORLD, 0, size - rank, &comm ); + break; + case 2: + /* Divide into subsets */ + MPI_Comm_split( MPI_COMM_WORLD, rank < (size/2), rank, &comm ); + break; + case 3: + /* Another division */ + MPI_Comm_split( MPI_COMM_WORLD, rank < (size/3), size-rank, &comm ); + break; + case 4: + /* odd and even */ + MPI_Comm_split( MPI_COMM_WORLD, (rank % 2) == 0, rank, &comm ); + break; + case 5: + /* Last case: startover */ + idx = -1; + break; + } + idx++; + return comm; +} + +int main( int argc, char **argv ) +{ + int rank, size, i; + int data; + int errors=0; + int result = -100; + int correct_result; + MPI_Op op_assoc, op_addem; + MPI_Comm comm; + + MPI_Init( &argc, &argv ); + MPI_Op_create( (MPI_User_function *)assoc, 0, &op_assoc ); + MPI_Op_create( (MPI_User_function *)addem, 1, &op_addem ); + + /* Run this for a variety of communicator sizes */ + while ((comm = GetNextComm()) != MPI_COMM_NULL) { + MPI_Comm_rank( comm, &rank ); + MPI_Comm_size( comm, &size ); + + data = rank; + + correct_result = 0; + for (i=0;i<=rank;i++) + correct_result += i; + + MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, comm ); + if (result != correct_result) { + fprintf( stderr, "[%d] Error suming ints with scan\n", rank ); + errors++; + } + + MPI_Scan ( &data, &result, 1, MPI_INT, MPI_SUM, comm ); + if (result != correct_result) { + fprintf( stderr, "[%d] Error summing ints with scan (2)\n", rank ); + errors++; + } + + data = rank; + result = -100; + MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, comm ); + if (result != correct_result) { + fprintf( stderr, "[%d] Error summing ints with scan (userop)\n", + rank ); + errors++; + } + + MPI_Scan ( &data, &result, 1, MPI_INT, op_addem, comm ); + if (result != correct_result) { + fprintf( stderr, "[%d] Error summing ints with scan (userop2)\n", + rank ); + errors++; + } +/* result = -100;*/ +/* data = rank;*/ +/* MPI_Scan ( &data, &result, 1, MPI_INT, op_assoc, comm );*/ +/* if (result == BAD_ANSWER) {*/ +/* fprintf( stderr, "[%d] Error scanning with non-commutative op\n",*/ +/* rank );*/ +/* errors++;*/ +/* }*/ + MPI_Comm_free( &comm ); + } + + MPI_Op_free( &op_assoc ); + MPI_Op_free( &op_addem ); + + if (errors) { + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + printf( "[%d] done with ERRORS(%d)!\n", rank, errors ); + } + + Test_Waitforall( ); + MPI_Finalize(); + return errors; +} diff --git a/teshsuite/smpi/mpich-test/coll/scattern.c b/teshsuite/smpi/mpich-test/coll/scattern.c new file mode 100644 index 0000000000..082fe6a15f --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/scattern.c @@ -0,0 +1,54 @@ +#include "mpi.h" +#include +#include +#include "test.h" + +/* This example sends a vector and receives individual elements */ + +int main( int argc, char **argv ) +{ + MPI_Datatype vec; + double *vecin, *vecout, ivalue; + int root, i, n, stride, err = 0; + int rank, size; + + MPI_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + n = 12; + stride = 10; + vecin = (double *)malloc( n * stride * size * sizeof(double) ); + vecout = (double *)malloc( n * sizeof(double) ); + + MPI_Type_vector( n, 1, stride, MPI_DOUBLE, &vec ); + MPI_Type_commit( &vec ); + + for (i=0; i 0) printf( "Found %d errors!\n", err ); + else printf( " No Errors\n" ); + } + MPI_Type_free( &vec ); + MPI_Finalize(); + return 0; + +} + diff --git a/teshsuite/smpi/mpich-test/coll/scatterv.c b/teshsuite/smpi/mpich-test/coll/scatterv.c new file mode 100644 index 0000000000..aefcb2e1ac --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/scatterv.c @@ -0,0 +1,167 @@ +#include "mpi.h" +#include +#include +#include "test.h" + +/* Prototypes for picky compilers */ +void SetData ( double *, double *, int, int, int, int, int, int ); +int CheckData ( double *, int, int, int, int, int ); +/* + This is an example of using scatterv to send a matrix from one + process to all others, with the matrix stored in Fortran order. + Note the use of an explicit UB to enable the sources to overlap. + + This tests scatterv to make sure that it uses the datatype size + and extent correctly. It requires number of processors that + can be split with MPI_Dims_create. + + */ + +void SetData( sendbuf, recvbuf, nx, ny, myrow, mycol, nrow, ncol ) +double *sendbuf, *recvbuf; +int nx, ny, myrow, mycol, nrow, ncol; +{ +int coldim, i, j, m, k; +double *p; + +if (myrow == 0 && mycol == 0) { + coldim = nx * nrow; + for (j=0; j +typedef struct { short a; int b } s1; + +main( int argc, char **argv ) +{ +s1 s[10], sout[10]; +int i, rank; +MPI_Status status; + +MPI_Init( &argc, &argv ); +MPI_Comm_rank( MPI_COMM_WORLD, &rank ); +for (i=0; i<10; i++) { + s[i].a = rank + i; + s[i].b = rank; + sout[i].a = -1; + sout[i].b = -1; + } +/* MPI_Allreduce( s, sout, 10, MPI_SHORT_INT, MPI_MINLOC, MPI_COMM_WORLD ); */ +/* if (rank == 1) + for (i=0; i<10; i++) + sout[i] = s[i]; + */ +MPI_Reduce( s, sout, 10, MPI_SHORT_INT, MPI_MINLOC, 1, MPI_COMM_WORLD ); +if (rank == 1) +for (i=0; i<10; i++) { + printf( "[%d] (%x,%x)\n", rank, (int)sout[i].a, sout[i].b ); + } +if (rank == 1) + MPI_Send( sout, 10, MPI_SHORT_INT, 0, 0, MPI_COMM_WORLD ); +else if (rank == 0) + MPI_Recv( sout, 10, MPI_SHORT_INT, 1, 0, MPI_COMM_WORLD, &status ); +/* MPI_Bcast( sout, 10, MPI_SHORT_INT, 1, MPI_COMM_WORLD ); */ +for (i=0; i<10; i++) { + printf( "[%d] (%x,%x)\n", rank, (int)sout[i].a, sout[i].b ); + } +MPI_Finalize(); +return 0; +} diff --git a/teshsuite/smpi/mpich-test/coll/temprun b/teshsuite/smpi/mpich-test/coll/temprun new file mode 100755 index 0000000000..4bcd93c309 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/temprun @@ -0,0 +1,269 @@ +#!/bin/sh +# This version puts the output from each program into a separate file. +# -mvhome is needed for the ANL SP, and is ignored by others +args="-pg -mvhome" +# +runtests=1 +makeeach=0 +for arg in "$@" ; do + case $arg in + -checkonly ) + runtests=0 + ;; + -margs=*) + margs=`echo $arg | sed 's/-margs=//'` + args="$args $margs" + ;; + -small) + makeeach=1 + ;; + -help|-u) + echo "runtests [-checkonly] [-margs='...']" + echo "run tests in this directory. If -checkonly set, just run" + echo "the differences check (do NO rerun the test programs)." + echo "If -margs is used, these options are passed to mpirun." + echo "If -small is used, the examples are built, run, and deleted." + exit 1 + ;; + *) + if test -n "$arg" ; then + echo "runtests: Unknown argument ($arg)" + exit 1 + fi + ;; + esac +done + +MakeExe() { + if [ $makeeach = 1 -o ! -x $1 ] ; then + make $1 + fi +} +CleanExe() { + if [ $makeeach = 1 ] ; then + /bin/rm -f $1 $1.o + fi +} + +# If the programs are not available, run make. +if [ ! -x coll1 -a $makeeach = 0 ] ; then + make +fi + +testfiles="" +if [ $runtests = 1 ] ; then +echo '**** Testing MPI Collective routines ****' + +testfiles="$testfiles barrier.out" +/bin/rm -f barrier.out barrier-0.out +MakeExe barrier +echo '*** Barrier Test ***' >> barrier.out +echo '**** Barrier Test ****' +mpirun $args -np 4 -mvback "barrier-0.out" barrier $* >> barrier.out +cat barrier-0.out >> barrier.out +/bin/rm -f barrier-[01234].out +echo '*** Barrier Test ***' >> barrier.out +CleanExe barrier + +testfiles="$testfiles bcast.out" +/bin/rm -f bcast.out bcast-[0-3].out +MakeExe bcast +echo '**** Broadcast Test ****' +echo '*** Broadcast Test ***' >> bcast.out +mpirun $args -np 4 \ + -mvback "bcast-0.out bcast-1.out bcast-2.out bcast-3.out" \ + bcast $* >> bcast.out +cat bcast-[0123].out >> bcast.out +/bin/rm -f bcast-[0123].out +echo '*** Broadcast Test ***' >> bcast.out +CleanExe bcast + +testfiles="$testfiles coll1.out" +/bin/rm -f coll1.out +MakeExe coll1 +echo '**** coll1 ****' +echo '*** coll1 ***' >> coll1.out +mpirun $args -np 4 coll1 $* >> coll1.out +echo '*** coll1 ***' >> coll1.out +CleanExe coll1 + +testfiles="$testfiles coll2.out" +/bin/rm -f coll2.out +MakeExe coll2 +echo '**** coll2 ****' +echo '*** coll2 ***' >> coll2.out +# mpirun $args -np 5 coll2 $* >> coll2.out +echo '*** coll2 ***' >> coll2.out +CleanExe coll2 + +testfiles="$testfiles coll3.out" +/bin/rm -f coll3.out +MakeExe coll3 +echo '**** coll3 ****' +echo '*** coll3 ***' >> coll3.out +mpirun $args -np 5 coll3 $* >> coll3.out +echo '*** coll3 ***' >> coll3.out +CleanExe coll3 + +testfiles="$testfiles coll4.out" +/bin/rm -f coll4.out +MakeExe coll4 +echo '**** coll4 ****' +echo '*** coll4 ***' >> coll4.out +mpirun $args -np 4 coll4 $* >> coll4.out +echo '*** coll4 ***' >> coll4.out +CleanExe coll4 + +testfiles="$testfiles coll5.out" +/bin/rm -f coll5.out +MakeExe coll5 +echo '**** coll5 ****' +echo '*** coll5 ***' >> coll5.out +mpirun $args -np 4 coll5 $* >> coll5.out +echo '*** coll5 ***' >> coll5.out +CleanExe coll5 + +testfiles="$testfiles coll6.out" +/bin/rm -f coll6.out +MakeExe coll6 +echo '**** coll6 ****' +echo '*** coll6 ***' >> coll6.out +mpirun $args -np 5 coll6 $* >> coll6.out +echo '*** coll6 ***' >> coll6.out +CleanExe coll6 + +testfiles="$testfiles coll7.out" +/bin/rm -f coll7.out +MakeExe coll7 +echo '**** coll7 ****' +echo '*** coll7 ***' >> coll7.out +mpirun $args -np 5 coll7 $* >> coll7.out +echo '*** coll7 ***' >> coll7.out +CleanExe coll7 + +testfiles="$testfiles coll8.out" +/bin/rm -f coll8.out +MakeExe coll8 +echo '**** coll8 ****' +echo '*** coll8 ***' >> coll8.out +mpirun $args -np 4 coll8 $* >> coll8.out +echo '*** coll8 ***' >> coll8.out +CleanExe coll8 + +testfiles="$testfiles coll9.out" +/bin/rm -f coll9.out +MakeExe coll9 +echo '**** coll9 ****' +echo '*** coll9 ***' >> coll9.out +mpirun $args -np 4 coll9 $* >> coll9.out +echo '*** coll9 ***' >> coll9.out +CleanExe coll9 + +testfiles="$testfiles coll10.out" +/bin/rm -f coll10.out +MakeExe coll10 +echo '**** coll10 ****' +echo '*** coll10 ***' >> coll10.out +mpirun -np 4 $args coll10 $* >> coll10.out +echo '*** coll10 ***' >> coll10.out +CleanExe coll10 + +testfiles="$testfiles coll11.out" +/bin/rm -f coll11.out +MakeExe coll11 +echo '**** coll11 ****' +echo '*** coll11 ***' >> coll11.out +mpirun -np 4 $args coll11 $* >> coll11.out +echo '*** coll11 ***' >> coll11.out +CleanExe coll11 + +testfiles="$testfiles coll12.out" +/bin/rm -f coll12.out +MakeExe coll12 +echo '**** coll12 ****' +echo '*** coll12 ***' >> coll12.out +mpirun -np 4 $args coll12 $* >> coll12.out +echo '*** coll12 ***' >> coll12.out +CleanExe coll12 + +testfiles="$testfiles coll13.out" +/bin/rm -f coll13.out +MakeExe coll13 +echo '**** coll13 ****' +echo '*** coll13 ***' >> coll13.out +mpirun -np 4 $args coll13 $* >> coll13.out +echo '*** coll13 ***' >> coll13.out +CleanExe coll13 + +testfiles="$testfiles grouptest.out" +/bin/rm -f grouptest.out +MakeExe grouptest +echo '*** Grouptest ***' +echo '*** grouptest ***' >> grouptest.out +mpirun $args -np 4 grouptest $* >> grouptest.out +echo '*** grouptest ***' >> grouptest.out +CleanExe grouptest + +testfiles="$testfiles allred.out" +/bin/rm -f allred.out +MakeExe allred +echo '*** Allred ***' +echo '*** Allred ***' >> allred.out +mpirun $args -np 4 allred $* >> allred.out +echo '*** Allred ***' >> allred.out +CleanExe allred + +testfiles="$testfiles scatterv.out" +/bin/rm -f scatterv.out +MakeExe scatterv +echo '*** Scatterv ***' +echo '*** Scatterv ***' >> scatterv.out +mpirun $args -np 4 scatterv $* >> scatterv.out +echo '*** Scatterv ***' >> scatterv.out +CleanExe scatterv + +# +# Run Fortran tests ONLY if Fortran available +if [ 1 = 1 ] ; then + echo "FORTRAN TESTS" + # + testfiles="$testfiles allredf.out" + /bin/rm -f allredf.out + MakeExe allredf + echo '*** Testing allreduce from Fortran ***' + echo '*** Testing allreduce from Fortran ***' >> allredf.out + mpirun $args -np 4 allredf "$@" >> allredf.out + echo '*** Testing allreduce from Fortran ***' >> allredf.out + CleanExe allredf + # + echo "END OF FORTRAN TESTS" +fi + +else + # Just run checks + testfiles=`echo *.out` + if test "$testfiles" = "*.out" ; then + echo "No output files remain from previous test!" + exit 1 + fi +fi + +echo '*** Differences from expected output ***' +/bin/rm -f coll.diff +for file in $testfiles ; do + stdfile=`basename $file .out`.std + if [ -s $stdfile ] ; then + if diff -b $file `basename $file .out`.std > /dev/null ; then + true + else + echo "Differences in `basename $file .out`" >> coll.diff + diff -b $file `basename $file .out`.std >> coll.diff + fi + else + echo "Can not find file $stdfile to compare against for test `basename $file .out`" + fi +done +if [ -s coll.diff ] ; then + cat coll.diff +fi +exit 0 diff --git a/teshsuite/smpi/mpich-test/coll/test.c b/teshsuite/smpi/mpich-test/coll/test.c new file mode 100644 index 0000000000..5a8d6f2114 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/test.c @@ -0,0 +1,97 @@ +/* Procedures for recording and printing test results */ + +#include +#include +#include "test.h" +#include "mpi.h" + +static int tests_passed = 0; +static int tests_failed = 0; +static char failed_tests[255][81]; +static char suite_name[255]; +FILE *fileout = NULL; + +void Test_Init( const char *suite, int rank) +{ + char filename[512]; + + sprintf(filename, "%s-%d.out", suite, rank); + strncpy(suite_name, suite, 255); + fileout = fopen(filename, "w"); + if (!fileout) { + fprintf( stderr, "Could not open %s on node %d\n", filename, rank ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } +} + +void Test_Message( const char *mess) +{ + fprintf(fileout, "[%s]: %s\n", suite_name, mess); + if(fileout)fflush(fileout); +} + +void Test_Failed(const char *test) +{ + fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test); + strncpy(failed_tests[tests_failed], test, 81); + if(fileout)fflush(fileout); + tests_failed++; +} + +void Test_Passed(const char *test) +{ +#ifdef VERBOSE + fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test); + if(fileout)fflush(fileout); +#endif + tests_passed++; +} + +int Summarize_Test_Results(void) +{ +#ifdef VERBOSE + fprintf(fileout, "For test suite '%s':\n", suite_name); +#else + if (tests_failed > 0) +#endif + { + fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", + tests_passed + tests_failed, tests_passed, tests_failed); + } + if (tests_failed > 0) { + int i; + + fprintf(fileout, "*** Tests Failed:\n"); + for (i = 0; i < tests_failed; i++) + fprintf(fileout, "*** %s\n", failed_tests[i]); + } + return tests_failed; +} + +void Test_Finalize(void) +{ + if(fileout)fflush(fileout); + //fclose(fileout); +} + +#include "mpi.h" +/* Wait for every process to pass through this point. This test is used + to make sure that all processes complete, and that a test "passes" because + it executed, not because some process failed. + */ +void Test_Waitforall(void) +{ + int m, one, myrank, n; + + MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); + MPI_Comm_size( MPI_COMM_WORLD, &n ); + one = 1; + MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + + if (m != n) { + printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, + n, m ); + } + if (myrank == 0) + printf( " No Errors\n" ); +} diff --git a/teshsuite/smpi/mpich-test/coll/test.h b/teshsuite/smpi/mpich-test/coll/test.h new file mode 100644 index 0000000000..7360323a60 --- /dev/null +++ b/teshsuite/smpi/mpich-test/coll/test.h @@ -0,0 +1,18 @@ +/* Header for testing procedures */ + +#ifndef _INCLUDED_TEST_H_ +#define _INCLUDED_TEST_H_ + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +void Test_Init (const char *, int); +void Test_Message (const char *); +void Test_Failed (const char *); +void Test_Passed (const char *); +int Summarize_Test_Results (void); +void Test_Finalize (void); +void Test_Waitforall (void); + +#endif diff --git a/teshsuite/smpi/mpich-test/context/CMakeLists.txt b/teshsuite/smpi/mpich-test/context/CMakeLists.txt new file mode 100644 index 0000000000..db189a0dff --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/CMakeLists.txt @@ -0,0 +1,94 @@ +cmake_minimum_required(VERSION 2.6) + +if(enable_smpi) + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff") + set(CMAKE_Fortran_LINKER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1") + + include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") + + add_executable(attrerr attrerr.c test.c) + # add_executable(attrt attrt.c test.c) + # add_executable(commnames commnames.c) + add_executable(groupcreate groupcreate.c) + add_executable(grouptest_mpich grouptest.c) + add_executable(icdup icdup.c) + add_executable(ictest ictest.c ) + add_executable(ictest2 ictest2.c) + add_executable(ictest3 ictest3.c) + + if(SMPI_F2C) + #add_executable(attrtest_f attrtest.f) + #add_executable(commnames_f commnamesf.f) + endif() + + target_link_libraries(attrerr m simgrid smpi ) + # target_link_libraries(attrt m simgrid smpi ) + # target_link_libraries(commnames m simgrid smpi ) + target_link_libraries(groupcreate m simgrid smpi ) + target_link_libraries(grouptest_mpich m simgrid smpi ) + target_link_libraries(icdup m simgrid smpi ) + target_link_libraries(ictest m simgrid smpi ) + target_link_libraries(ictest2 m simgrid smpi ) + target_link_libraries(ictest3 m simgrid smpi ) + + if(SMPI_F2C) + #target_link_libraries(attrtest_f m simgrid smpi f2c) + #target_link_libraries(commnames_f m simgrid smpi f2c) + endif() + + set_target_properties(attrerr PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + # set_target_properties(attrt PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + # set_target_properties(commnames PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(groupcreate PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(grouptest_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(icdup PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(ictest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(ictest2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(ictest3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + + + if(SMPI_F2C) + #set_target_properties(commnames_f PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}" ) + #set_target_properties(attrtest_f PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}" ) + endif() + +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/context.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/test.c + ${CMAKE_CURRENT_SOURCE_DIR}/attrerr.c + # ${CMAKE_CURRENT_SOURCE_DIR}/attrt.c + # ${CMAKE_CURRENT_SOURCE_DIR}/commnames.c + ${CMAKE_CURRENT_SOURCE_DIR}/groupcreate.c + ${CMAKE_CURRENT_SOURCE_DIR}/grouptest.c + ${CMAKE_CURRENT_SOURCE_DIR}/icdup.c + ${CMAKE_CURRENT_SOURCE_DIR}/ictest.c + ${CMAKE_CURRENT_SOURCE_DIR}/ictest2.c + ${CMAKE_CURRENT_SOURCE_DIR}/ictest3.c + ${CMAKE_CURRENT_SOURCE_DIR}/attrtest.f + ${CMAKE_CURRENT_SOURCE_DIR}/commnamesf.f + ${CMAKE_CURRENT_SOURCE_DIR}/test.h + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + ${CMAKE_CURRENT_SOURCE_DIR}/../hostfile + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/teshsuite/smpi/mpich-test/context/attrerr.c b/teshsuite/smpi/mpich-test/context/attrerr.c new file mode 100644 index 0000000000..a73d0f0d97 --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/attrerr.c @@ -0,0 +1,114 @@ +/* + + Exercise attribute routines. + This version checks for correct behavior of the copy and delete functions + on an attribute, particularly the correct behavior when the routine returns + failure. + + */ +#include +#include "mpi.h" +#include "test.h" + +int test_communicators ( void ); +void abort_msg ( const char *, int ); +int copybomb_fn ( MPI_Comm, int, void *, void *, void *, int * ); +int deletebomb_fn ( MPI_Comm, int, void *, void * ); + +int main( int argc, char **argv ) +{ + MPI_Init( &argc, &argv ); + test_communicators(); + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} + +/* + * MPI 1.2 Clarification: Clarification of Error Behavior of + * Attribute Callback Functions + * Any return value other than MPI_SUCCESS is erroneous. The specific value + * returned to the user is undefined (other than it can't be MPI_SUCCESS). + * Proposals to specify particular values (e.g., user's value) failed. + */ +/* Return an error as the value */ +int copybomb_fn( MPI_Comm oldcomm, int keyval, void *extra_state, + void *attribute_val_in, void *attribute_val_out, int *flag) +{ +/* Note that if (sizeof(int) < sizeof(void *), just setting the int + part of attribute_val_out may leave some dirty bits + */ + *flag = 1; + return MPI_ERR_OTHER; +} + +/* Set delete flag to 1 to allow the attribute to be deleted */ +static int delete_flag = 0; +int deletebomb_fn( MPI_Comm comm, int keyval, void *attribute_val, + void *extra_state) +{ + if (delete_flag) return MPI_SUCCESS; + return MPI_ERR_OTHER; +} + +void abort_msg( const char *str, int code ) +{ + fprintf( stderr, "%s, err = %d\n", str, code ); + MPI_Abort( MPI_COMM_WORLD, code ); +} + +int test_communicators( void ) +{ + MPI_Comm dup_comm_world, d2; + ptrdiff_t world_rank; + int world_size, key_1; + int err; + MPI_Aint value; + int rank; + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + world_rank=rank; + MPI_Comm_size( MPI_COMM_WORLD, &world_size ); + if (world_rank == 0) { + printf( "*** Attribute copy/delete return codes ***\n" ); + } + + MPI_Comm_dup( MPI_COMM_WORLD, &dup_comm_world ); + MPI_Barrier( dup_comm_world ); + + MPI_Errhandler_set( dup_comm_world, MPI_ERRORS_RETURN ); + + value = - 11; + if ((err=MPI_Keyval_create( copybomb_fn, deletebomb_fn, &key_1, &value ))) + abort_msg( "Keyval_create", err ); + + err = MPI_Attr_put( dup_comm_world, key_1, (void *)world_rank ); + if (err) { + printf( "Error with first put\n" ); + } + + err = MPI_Attr_put( dup_comm_world, key_1, (void *)(2*world_rank) ); + if (err == MPI_SUCCESS) { + printf( "delete function return code was MPI_SUCCESS in put\n" ); + } + + /* Because the attribute delete function should fail, the attribute + should *not be removed* */ + err = MPI_Attr_delete( dup_comm_world, key_1 ); + if (err == MPI_SUCCESS) { + printf( "delete function return code was MPI_SUCCESS in delete\n" ); + } + + err = MPI_Comm_dup( dup_comm_world, &d2 ); + if (err == MPI_SUCCESS) { + printf( "copy function return code was MPI_SUCCESS in dup\n" ); + } + if (err && d2 != MPI_COMM_NULL) { + printf( "dup did not return MPI_COMM_NULL on error\n" ); + } + + delete_flag = 1; + MPI_Comm_free( &dup_comm_world ); + + return 0; +} + diff --git a/teshsuite/smpi/mpich-test/context/attrerr.std b/teshsuite/smpi/mpich-test/context/attrerr.std new file mode 100644 index 0000000000..9db5ec977b --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/attrerr.std @@ -0,0 +1,4 @@ +*** Testing attributes (2) *** +*** Attribute copy/delete return codes *** +All processes completed test +*** Testing attributes (2) *** diff --git a/teshsuite/smpi/mpich-test/context/attrt.c b/teshsuite/smpi/mpich-test/context/attrt.c new file mode 100644 index 0000000000..858db14728 --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/attrt.c @@ -0,0 +1,260 @@ +/* + + Exercise communicator routines. + + This C version derived from a Fortran test program from .... + + */ +#include +#include "mpi.h" +#include "test.h" + +int test_communicators ( void ); +int copy_fn ( MPI_Comm, int, void *, void *, void *, int * ); +int delete_fn ( MPI_Comm, int, void *, void * ); + +int main( int argc, char **argv ) +{ + MPI_Init( &argc, &argv ); + test_communicators(); + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} + +int copy_fn( MPI_Comm oldcomm, int keyval, void *extra_state, + void *attribute_val_in, void *attribute_val_out, + int *flag) +{ +/* Note that if (sizeof(int) < sizeof(void *), just setting the int + part of attribute_val_out may leave some dirty bits + */ +*(MPI_Aint *)attribute_val_out = (MPI_Aint)attribute_val_in; +*flag = 1; +return MPI_SUCCESS; +} + +int delete_fn( MPI_Comm comm, int keyval, void *attribute_val, + void *extra_state) +{ +int world_rank; +MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); +if ((MPI_Aint)attribute_val != (MPI_Aint)world_rank) { + printf( "incorrect attribute value %d\n", *(int*)attribute_val ); + MPI_Abort(MPI_COMM_WORLD, 1005 ); + } +return MPI_SUCCESS; +} + +int test_communicators( void ) +{ +MPI_Comm dup_comm_world, lo_comm, rev_comm, dup_comm, split_comm, world_comm; +MPI_Group world_group, lo_group, rev_group; +void *vvalue; +int ranges[1][3]; +int flag, world_rank, world_size, rank, size, n, key_1, key_3; +int color, key, result; +/* integer n, , + . key_2 + + */ +MPI_Aint value; + +MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); +MPI_Comm_size( MPI_COMM_WORLD, &world_size ); +if (world_rank == 0) { + printf( "*** Communicators ***\n" ); + } + +MPI_Comm_dup( MPI_COMM_WORLD, &dup_comm_world ); + +/* + Exercise Comm_create by creating an equivalent to dup_comm_world + (sans attributes) and a half-world communicator. + */ + +if (world_rank == 0) + printf( " Comm_create\n" ); + +MPI_Comm_group( dup_comm_world, &world_group ); +MPI_Comm_create( dup_comm_world, world_group, &world_comm ); +MPI_Comm_rank( world_comm, &rank ); +if (rank != world_rank) { + printf( "incorrect rank in world comm: %d\n", rank ); + MPI_Abort(MPI_COMM_WORLD, 3001 ); + } + +n = world_size / 2; + +ranges[0][0] = 0; +ranges[0][1] = (world_size - n) - 1; +ranges[0][2] = 1; + +MPI_Group_range_incl(world_group, 1, ranges, &lo_group ); +MPI_Comm_create(world_comm, lo_group, &lo_comm ); +MPI_Group_free( &lo_group ); + +if (world_rank < (world_size - n)) { + MPI_Comm_rank(lo_comm, &rank ); + if (rank == MPI_UNDEFINED) { + printf( "incorrect lo group rank: %d\n", rank ); + MPI_Abort(MPI_COMM_WORLD, 3002 ); + } + else { + MPI_Barrier(lo_comm ); + } + } +else { + if (lo_comm != MPI_COMM_NULL) { + printf( "incorrect lo comm:\n" ); + MPI_Abort(MPI_COMM_WORLD, 3003 ); + } + } + +MPI_Barrier(world_comm); +/* + Check Comm_dup by adding attributes to lo_comm & duplicating + */ +if (world_rank == 0) + printf( " Comm_dup\n" ); + +if (lo_comm != MPI_COMM_NULL) { + value = 9; + MPI_Keyval_create(copy_fn, delete_fn, &key_1, &value ); + value = 8; +/* MPI_Keyval_create(MPI_DUP_FN, MPI_NULL_DELETE_FN, + &key_2, &value ); */ + value = 7; + MPI_Keyval_create(MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN, + &key_3, &value ); + + /* This may generate a compilation warning; it is, however, an + easy way to cache a value instead of a pointer */ + MPI_Attr_put(lo_comm, key_1, (void *)world_rank ); +/* MPI_Attr_put(lo_comm, key_2, world_size ) */ + MPI_Attr_put(lo_comm, key_3, (void *)0 ); + + MPI_Comm_dup(lo_comm, &dup_comm ); + + /* Note that if sizeof(int) < sizeof(void *), we can't use + (void **)&value to get the value we passed into Attr_put. To avoid + problems (e.g., alignment errors), we recover the value into + a (void *) and cast to int. Note that this may generate warning + messages from the compiler. */ + MPI_Attr_get(dup_comm, key_1, (void **)&vvalue, &flag ); + value = (MPI_Aint)vvalue; + + if (! flag) { + printf( "dup_comm key_1 not found on %d\n", world_rank ); + MPI_Abort(MPI_COMM_WORLD, 3004 ); + } + + if (value != world_rank) { + printf( "dup_comm key_1 value incorrect: %ld\n", (long)value ); + MPI_Abort(MPI_COMM_WORLD, 3005 ); + } + +/* MPI_Attr_get(dup_comm, key_2, (int *)&value, &flag ); */ +/* + if (! flag) { + printf( "dup_comm key_2 not found\n" ); + MPI_Abort(MPI_COMM_WORLD, 3006 ); + } + + if (value != world_size) { + printf( "dup_comm key_2 value incorrect: %d\n", value ); + MPI_Abort(MPI_COMM_WORLD, 3007 ); + } + */ + MPI_Attr_get(dup_comm, key_3, (void **)&vvalue, &flag ); + value = (int)vvalue; + if (flag) { + printf( "dup_comm key_3 found!\n" ); + MPI_Abort(MPI_COMM_WORLD, 3008 ); + } + MPI_Keyval_free(&key_1 ); +/* +c MPI_Keyval_free(&key_2 ) + */ + MPI_Keyval_free(&key_3 ); + } +/* + Split the world into even & odd communicators with reversed ranks. + */ + if (world_rank == 0) + printf( " Comm_split\n" ); + + color = world_rank % 2; + key = world_size - world_rank; + + MPI_Comm_split(dup_comm_world, color, key, &split_comm ); + MPI_Comm_size(split_comm, &size ); + MPI_Comm_rank(split_comm, &rank ); + if (rank != ((size - world_rank/2) - 1)) { + printf( "incorrect split rank: %d\n", rank ); + MPI_Abort(MPI_COMM_WORLD, 3009 ); + } + + MPI_Barrier(split_comm ); +/* + Test each possible Comm_compare result + */ + if (world_rank == 0) + printf( " Comm_compare\n" ); + + MPI_Comm_compare(world_comm, world_comm, &result ); + if (result != MPI_IDENT) { + printf( "incorrect ident result: %d\n", result ); + MPI_Abort(MPI_COMM_WORLD, 3010 ); + } + + if (lo_comm != MPI_COMM_NULL) { + MPI_Comm_compare(lo_comm, dup_comm, &result ); + if (result != MPI_CONGRUENT) { + printf( "incorrect congruent result: %d\n", result ); + MPI_Abort(MPI_COMM_WORLD, 3011 ); + } + } + + ranges[0][0] = world_size - 1; + ranges[0][1] = 0; + ranges[0][2] = -1; + + MPI_Group_range_incl(world_group, 1, ranges, &rev_group ); + MPI_Comm_create(world_comm, rev_group, &rev_comm ); + MPI_Comm_compare(world_comm, rev_comm, &result ); + if (result != MPI_SIMILAR) { + printf( "incorrect similar result: %d\n", result ); + MPI_Abort(MPI_COMM_WORLD, 3012 ); + } + + if (lo_comm != MPI_COMM_NULL) { + MPI_Comm_compare(world_comm, lo_comm, &result ); + if (result != MPI_UNEQUAL) { + printf( "incorrect unequal result: %d\n", result ); + MPI_Abort(MPI_COMM_WORLD, 3013 ); + } + } +/* + Free all communicators created + */ + if (world_rank == 0) + printf( " Comm_free\n" ); + + MPI_Comm_free( &world_comm ); + MPI_Comm_free( &dup_comm_world ); + + MPI_Comm_free( &rev_comm ); + MPI_Comm_free( &split_comm ); + + MPI_Group_free( &world_group ); + MPI_Group_free( &rev_group ); + + if (lo_comm != MPI_COMM_NULL) { + MPI_Comm_free( &lo_comm ); + MPI_Comm_free( &dup_comm ); + } + + return 0; +} + diff --git a/teshsuite/smpi/mpich-test/context/attrt.std b/teshsuite/smpi/mpich-test/context/attrt.std new file mode 100644 index 0000000000..4693c037cf --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/attrt.std @@ -0,0 +1,9 @@ +*** Testing attributes *** +*** Communicators *** + Comm_create + Comm_dup + Comm_split + Comm_compare + Comm_free +All processes completed test +*** Testing attributes *** diff --git a/teshsuite/smpi/mpich-test/context/attrtest.f b/teshsuite/smpi/mpich-test/context/attrtest.f new file mode 100644 index 0000000000..6e63bca19e --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/attrtest.f @@ -0,0 +1,105 @@ + PROGRAM MAIN + + include 'mpif.h' + +C. Data layout +C. Number of tests + integer PM_GLOBAL_ERROR, PM_NUM_NODES + integer PM_MAX_TESTS + parameter (PM_MAX_TESTS=3) +C. Test data + integer PM_TEST_INTEGER, fuzzy, Error, FazAttr + integer PM_RANK_SELF + integer Faz_World, FazTag + integer errs + parameter (PM_TEST_INTEGER=12345) + logical FazFlag + external FazCreate, FazDelete +C +C. Initialize MPI + errs = 0 + call MPI_INIT(PM_GLOBAL_ERROR) + + PM_GLOBAL_ERROR = MPI_SUCCESS +C. Find out the number of processes + call MPI_COMM_SIZE (MPI_COMM_WORLD,PM_NUM_NODES,PM_GLOBAL_ERROR) + call MPI_COMM_RANK (MPI_COMM_WORLD,PM_RANK_SELF,PM_GLOBAL_ERROR) + + + call MPI_keyval_create ( FazCreate, FazDelete, FazTag, + & fuzzy, Error ) + +C. Make sure that we can get an attribute that hasn't been set yet (flag +C. is false) + call MPI_attr_get (MPI_COMM_WORLD, FazTag, FazAttr, + & FazFlag, Error) + + if (FazFlag) then + errs = errs + 1 + print *, 'Did not get flag==false when attr_get of key that' + print *, 'had not had a value set with attr_put' + endif + + FazAttr = 120 + call MPI_attr_put (MPI_COMM_WORLD, FazTag, FazAttr, Error) + +C. Check that the put worked + call MPI_attr_get (MPI_COMM_WORLD, FazTag, FazAttr, + & FazFlag, Error) + + if (FazAttr .ne. 120) then + errs = errs + 1 + print 1, ' Proc=',PM_Rank_self, ' ATTR=', FazAttr + endif +C. Duplicate the Communicator and it's cached attributes + + call MPI_Comm_Dup (MPI_COMM_WORLD, Faz_WORLD, Error) + + + call MPI_Attr_Get ( Faz_WORLD, FazTag, FazAttr, + & FazFlag, Error) + + if (FazFlag) then + if (FazAttr .ne. 121) then + errs = errs + 1 + print 1, ' T-Flag, Proc=',PM_Rank_self,' ATTR=', FazAttr + endif + else + errs = errs + 1 + print 1, ' F-Flag, Proc=',PM_Rank_self,' ATTR=',FazAttr + end if + 1 format( a, i5, a, i5 ) + +C. Clean up MPI + if (PM_Rank_self .eq. 0) then + if (errs .eq. 0) then + print *, ' No Errors' + else + print *, ' Found ', errs, ' errors' + endif + endif + call MPI_Comm_free( Faz_WORLD, Error ) + call MPI_FINALIZE (PM_GLOBAL_ERROR) + + end +C +C MPI 1.1 changed these from functions to subroutines. +C + SUBROUTINE FazCreate (comm, keyval, fuzzy, + & attr_in, attr_out, flag, ierr ) + INTEGER comm, keyval, fuzzy, attr_in, attr_out + LOGICAL flag + include 'mpif.h' + attr_out = attr_in + 1 + flag = .true. + ierr = MPI_SUCCESS + END + + SUBROUTINE FazDelete (comm, keyval, attr, extra, ierr ) + INTEGER comm, keyval, attr, extra, ierr + include 'mpif.h' + ierr = MPI_SUCCESS + if (keyval .ne. MPI_KEYVAL_INVALID)then + attr = attr - 1 + end if + END diff --git a/teshsuite/smpi/mpich-test/context/commnames.c b/teshsuite/smpi/mpich-test/context/commnames.c new file mode 100644 index 0000000000..e552c238cf --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/commnames.c @@ -0,0 +1,62 @@ +/* + * Check that we can put names on communicators and get them back. + */ + +#include + +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char **argv ) +{ + char commName [MPI_MAX_NAME_STRING+1]; + int namelen; + + MPI_Init( &argc, &argv ); + + if (MPI_Comm_get_name(MPI_COMM_WORLD, commName, &namelen) != MPI_SUCCESS) + { + printf("Failed to get a name from COMM_WORLD\n"); + MPI_Abort(MPI_COMM_WORLD, -1); + } + + if (strcmp("MPI_COMM_WORLD", commName)) + { + printf("Name on MPI_COMM_WORLD is \"%s\" should be \"MPI_COMM_WORLD\"\n", commName); + MPI_Abort(MPI_COMM_WORLD, -1); + } + + if (namelen != strlen (commName)) + { + printf("Length of name on MPI_COMM_WORLD is %d should be %d\n", + namelen, (int) strlen(commName)); + MPI_Abort(MPI_COMM_WORLD, -1); + } + + /* Check that we can replace it */ + if (MPI_Comm_set_name(MPI_COMM_WORLD,"foobar") != MPI_SUCCESS) + { + printf("Failed to put a name onto COMM_WORLD\n"); + MPI_Abort(MPI_COMM_WORLD, -1); + } + + if (MPI_Comm_get_name(MPI_COMM_WORLD, commName, &namelen) != MPI_SUCCESS) + { + printf("Failed to get a name from COMM_WORLD after changing it\n"); + MPI_Abort(MPI_COMM_WORLD, -1); + } + + if (strcmp("foobar", commName)) + { + printf("Name on MPI_COMM_WORLD is \"%s\" should be \"foobar\"\n", + commName ); + MPI_Abort(MPI_COMM_WORLD, -1); + } + + printf("Name tests OK\n"); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/context/commnames.std b/teshsuite/smpi/mpich-test/context/commnames.std new file mode 100644 index 0000000000..819a2a6eda --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/commnames.std @@ -0,0 +1,4 @@ +*** Testing Communicator Names *** +Name tests OK +Name tests OK +*** Testing Communicator Names *** diff --git a/teshsuite/smpi/mpich-test/context/commnamesf.f b/teshsuite/smpi/mpich-test/context/commnamesf.f new file mode 100644 index 0000000000..e816a8c862 --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/commnamesf.f @@ -0,0 +1,75 @@ +C +C Check the communicator naming functions from Fortran +C + + include 'mpif.h' + + integer error, namelen + integer errcnt, rank + character*40 the_name + character*40 other_name + + call mpi_init (error) + + errcnt = 0 + call xify(the_name) + + call mpi_comm_get_name (MPI_COMM_WORLD, the_name, namelen, error) + if (error .ne. mpi_success) then + errcnt = errcnt + 1 + print *,'Failed to get the name from MPI_COMM_WORLD' + call MPI_Abort( MPI_COMM_WORLD, 1, error ) + end if + + if (the_name .ne. 'MPI_COMM_WORLD') then + errcnt = errcnt + 1 + print *,'The name on MPI_COMM_WORLD is not "MPI_COMM_WORLD"' + call MPI_Abort( MPI_COMM_WORLD, 1, error ) + end if + + other_name = 'foobarH' + call mpi_comm_set_name(MPI_COMM_WORLD, other_name(1:6), error) + + if (error .ne. mpi_success) then + errcnt = errcnt + 1 + print *,'Failed to put a name onto MPI_COMM_WORLD' + call MPI_Abort( MPI_COMM_WORLD, 1, error ) + end if + + call xify(the_name) + + call mpi_comm_get_name (MPI_COMM_WORLD, the_name, namelen, error) + if (error .ne. mpi_success) then + errcnt = errcnt + 1 + print *,'Failed to get the name from MPI_COMM_WORLD ', + $ 'after setting it' + call MPI_Abort( MPI_COMM_WORLD, 1, error ) + end if + + if (the_name .ne. 'foobar') then + errcnt = errcnt + 1 + print *,'The name on MPI_COMM_WORLD is not "foobar"' + print *, 'Got ', the_name + call MPI_Abort( MPI_COMM_WORLD, 1, error ) + end if + + call mpi_comm_rank( MPI_COMM_WORLD, rank, error ) + if (errcnt .eq. 0 .and. rank .eq. 0) then + print *, ' No Errors' + endif + call mpi_finalize(error) + end + + + subroutine xify( string ) + character*(*) string + + integer i + + do i = 1,len(string) + string(i:i) = 'X' + end do + + end + + diff --git a/teshsuite/smpi/mpich-test/context/context.std b/teshsuite/smpi/mpich-test/context/context.std new file mode 100644 index 0000000000..6ab43a20bb --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/context.std @@ -0,0 +1,3 @@ +FORTRAN TESTS +*** attrtest *** +END OF FORTRAN TESTS diff --git a/teshsuite/smpi/mpich-test/context/groupcreate.c b/teshsuite/smpi/mpich-test/context/groupcreate.c new file mode 100644 index 0000000000..686fa9b936 --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/groupcreate.c @@ -0,0 +1,67 @@ +#include "mpi.h" +#include +/* stdlib.h Needed for malloc declaration */ +#include +#include "test.h" + +int main( int argc, char **argv ) +{ + int i, n, n_goal = 2048, n_all, rc, n_ranks, *ranks, rank, size, len; + MPI_Group *group_array, world_group; + char msg[MPI_MAX_ERROR_STRING]; + + MPI_Init( &argc, &argv ); + MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + n = n_goal; + + group_array = (MPI_Group *)malloc( n * sizeof(MPI_Group) ); + + MPI_Comm_group( MPI_COMM_WORLD, &world_group ); + + n_ranks = size; + ranks = (int *)malloc( size * sizeof(int) ); + for (i=0; i +/* stdlib.h Needed for malloc declaration */ +#include +#include "test.h" + +int main( int argc, char **argv ) +{ + int errs=0, toterr; + MPI_Group basegroup; + MPI_Group g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12; + MPI_Comm comm, newcomm, splitcomm, dupcomm; + int i, grp_rank, rank, grp_size, size, result; + int nranks, *ranks, *ranks_out; + int range[2][3]; + int worldrank; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &worldrank ); + + comm = MPI_COMM_WORLD; + + MPI_Comm_group( comm, &basegroup ); + +/* Get the basic information on this group */ + MPI_Group_rank( basegroup, &grp_rank ); + MPI_Comm_rank( comm, &rank ); + if (grp_rank != rank) { + errs++; + fprintf( stdout, "group rank %d != comm rank %d\n", grp_rank, rank ); + } + + MPI_Group_size( basegroup, &grp_size ); + MPI_Comm_size( comm, &size ); + if (grp_size != size) { + errs++; + fprintf( stdout, "group size %d != comm size %d\n", grp_size, size ); + } + + +/* Form a new communicator with inverted ranking */ + MPI_Comm_split( comm, 0, size - rank, &newcomm ); + MPI_Comm_group( newcomm, &g1 ); + ranks = (int *)malloc( size * sizeof(int) ); + ranks_out = (int *)malloc( size * sizeof(int) ); + for (i=0; i + +/* + * intended to be run with at least 3 procs + */ +int main(int argc, char ** argv) +{ + MPI_Comm new_intercomm; + MPI_Comm new_comm; + int my_rank, my_size; + int rrank; + int procA, procB; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + MPI_Comm_size( MPI_COMM_WORLD, &my_size ); + + if (my_size < 3) { + printf( "This test requires at least 3 processes: only %d provided\n", + my_size ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } +#ifdef DBG + printf("%d: Entering main()\n", my_rank); fflush(stdout); +#endif + /* pick one of the following two settings for procA,procB */ + + /* uncomment these and program will work */ + /* procA = 0; procB = 2; */ + + /* uncomment these and program will hang */ + procA = 1; procB = 2; + /* The SGI implementation of MPI fails this test */ + if (my_rank == procA || my_rank == procB) + { + if (my_rank == procA) + { + rrank = procB; + } + else + { + rrank = procA; + } +#ifdef DBG + printf("%d: Calling MPI_Intercomm_create()\n", my_rank); fflush(stdout); +#endif + MPI_Intercomm_create(MPI_COMM_SELF, 0, + MPI_COMM_WORLD, rrank, + 0, &new_intercomm); + +#ifdef DBG + printf("%d: Calling MPI_Comm_dup()\n", my_rank); fflush(stdout); +#endif + MPI_Comm_dup(new_intercomm, &new_comm); + + /* Free these new communicators */ + MPI_Comm_free( &new_comm ); + MPI_Comm_free( &new_intercomm ); + } + + MPI_Barrier( MPI_COMM_WORLD ); + if (my_rank == 0) { + printf( " No Errors\n" ); + } +#ifdef DBG + printf("%d: Calling MPI_Finalize()\n", my_rank); fflush(stdout); +#endif + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/context/ictest.c b/teshsuite/smpi/mpich-test/context/ictest.c new file mode 100644 index 0000000000..cba25223f8 --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/ictest.c @@ -0,0 +1,124 @@ +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* ictest.c */ +#include +#include "mpi.h" +#include "test.h" + +int verbose = 0; + +int main( int argc, char **argv ) +{ + int size, rank, key, his_key, lrank, result; + MPI_Comm myComm; + MPI_Comm myFirstComm; + MPI_Comm mySecondComm; + int errors = 0, sum_errors; + MPI_Status status; + + /* Initialization */ + MPI_Init ( &argc, &argv ); + MPI_Comm_rank ( MPI_COMM_WORLD, &rank); + MPI_Comm_size ( MPI_COMM_WORLD, &size); + + /* Only works for 2 or more processes */ + if (size >= 2) { + MPI_Comm merge1, merge2, merge3, merge4; + + /* Generate membership key in the range [0,1] */ + key = rank % 2; + + MPI_Comm_split ( MPI_COMM_WORLD, key, rank, &myComm ); + /* This creates an intercomm that is the size of comm world + but has processes grouped by even and odd */ + MPI_Intercomm_create (myComm, 0, MPI_COMM_WORLD, (key+1)%2, 1, + &myFirstComm ); + /* Dup an intercomm */ + MPI_Comm_dup ( myFirstComm, &mySecondComm ); + MPI_Comm_rank( mySecondComm, &lrank ); + his_key = -1; + + /* Leaders communicate with each other */ + if (lrank == 0) { + MPI_Sendrecv (&key, 1, MPI_INT, 0, 0, + &his_key, 1, MPI_INT, 0, 0, mySecondComm, &status); + if (key != (his_key+1)%2) { + printf( "Received %d but expected %d\n", his_key, (his_key+1)%2 ); + errors++; + } + } + + if (errors) + printf("[%d] Failed!\n",rank); + + if (verbose) printf( "About to merge intercommunicators\n" ); + MPI_Intercomm_merge ( mySecondComm, key, &merge1 ); + MPI_Intercomm_merge ( mySecondComm, (key+1)%2, &merge2 ); + MPI_Intercomm_merge ( mySecondComm, 0, &merge3 ); + MPI_Intercomm_merge ( mySecondComm, 1, &merge4 ); + + /* We should check that these are correct! An easy test is that + the merged comms are all MPI_SIMILAR (unless 2 processes used, + in which case MPI_CONGRUENT is ok */ + MPI_Comm_compare( merge1, MPI_COMM_WORLD, &result ); + if ((size > 2 && result != MPI_SIMILAR) || + (size == 2 && result != MPI_CONGRUENT)) { + errors ++; + printf( "merge1 is not the same size as comm world\n" ); + } + /* merge 2 isn't ordered the same way as the others, even for 2 processes */ + MPI_Comm_compare( merge2, MPI_COMM_WORLD, &result ); + if (result != MPI_SIMILAR) { + errors ++; + printf( "merge2 is not the same size as comm world\n" ); + } + MPI_Comm_compare( merge3, MPI_COMM_WORLD, &result ); + if ((size > 2 && result != MPI_SIMILAR) || + (size == 2 && result != MPI_CONGRUENT)) { + errors ++; + printf( "merge3 is not the same size as comm world\n" ); + } + MPI_Comm_compare( merge4, MPI_COMM_WORLD, &result ); + if ((size > 2 && result != MPI_SIMILAR) || + (size == 2 && result != MPI_CONGRUENT)) { + errors ++; + printf( "merge4 is not the same size as comm world\n" ); + } + + /* Free communicators */ + if (verbose) printf( "About to free communicators\n" ); + MPI_Comm_free( &myComm ); + MPI_Comm_free( &myFirstComm ); + MPI_Comm_free( &mySecondComm ); + MPI_Comm_free( &merge1 ); + MPI_Comm_free( &merge2 ); + MPI_Comm_free( &merge3 ); + MPI_Comm_free( &merge4 ); + } + else { + errors ++; + printf("[%d] Failed - at least 2 nodes must be used\n",rank); + } + + MPI_Barrier( MPI_COMM_WORLD ); + MPI_Allreduce( &errors, &sum_errors, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (sum_errors > 0) { + printf( "%d errors on process %d\n", errors, rank ); + } + else if (rank == 0) { + printf( " No Errors\n" ); + } + /* Finalize and end! */ + + MPI_Finalize(); + return 0; +} + + + + + + + + + + diff --git a/teshsuite/smpi/mpich-test/context/ictest2.c b/teshsuite/smpi/mpich-test/context/ictest2.c new file mode 100644 index 0000000000..4b615bcc0c --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/ictest2.c @@ -0,0 +1,209 @@ +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* ictest2.c + This is like ictest.c, but it creates communictors that are valid only + at the "leaders"; other members of the local communicator are NOT + in the remote communicator. This is done by creating two communicators: + 0, + odd rank and even rank. Only 0 is in in both communicators. + + This test originally tested the part of the standard that allowed the + leader to be in both groups. This has been disallowed. This test was + recently changed to operate correctly under the new definition. + + Note that it generates unordered printf output, and is not suitable for + automated testing. + */ +#include "mpi.h" +#include +#include "test.h" + +int verbose = 0; + +int main( int argc, char **argv ) +{ + int size, rank, key, lrank, rsize, result, remLeader = 0; + MPI_Comm myComm; + MPI_Comm myFirstComm; + MPI_Comm mySecondComm; + MPI_Comm evenComm, oddComm, remComm; + int errors = 0, sum_errors; + MPI_Status status; + + /* Initialization */ + MPI_Init ( &argc, &argv ); + MPI_Comm_rank ( MPI_COMM_WORLD, &rank); + MPI_Comm_size ( MPI_COMM_WORLD, &size); + + /* Only works for 2 or more processes */ + if (size >= 2) { + MPI_Comm merge1, merge2, merge3, merge4; + + /* Generate membership key in the range [0,1] */ + key = rank % 2; + /* Create the even communicator */ + MPI_Comm_split ( MPI_COMM_WORLD, key, rank, &evenComm ); + if (key == 1) { + /* Odd rank communicator discarded */ + MPI_Comm_free( &evenComm ); + } + + /* Create the odd communicator */ + MPI_Comm_split ( MPI_COMM_WORLD, key, rank, &oddComm ); + if (key == 0) { + /* Even rank communicator discarded */ + MPI_Comm_free( &oddComm ); + } + + /* Create the odd + 0 communicator */ + if (rank == 0) key = 1; + MPI_Comm_split( MPI_COMM_WORLD, key, rank, &remComm ); + if (key == 0) { + /* Even rank communicator discarded */ + MPI_Comm_free( &remComm ); + } + else { + MPI_Comm_rank( remComm, &lrank ); + if (verbose) { + printf( "[%d] lrank in remComm is %d (color = %d, key=%d)\n", + rank, lrank, rank, key ); + } + remLeader = (lrank == 0) ? 1 : 0; + } + /* Now, choose the local and remote communicators */ + if (rank % 2) { + /* Odd */ + myComm = oddComm; + } + else { + myComm = evenComm; + } + + /* Check that the leader is who we think he is */ + MPI_Comm_rank( myComm, &lrank ); + if (verbose) { + printf( "[%d] local rank is %d\n", rank, lrank ); + } + if (rank == 0) { + int trank; + MPI_Comm_rank( myComm, &trank ); + if (trank != 0) { + printf( "[%d] Comm split improperly ordered group (myComm)\n", + rank ); + fflush(stdout); + errors++; + } + MPI_Comm_rank( remComm, &trank ); + if (trank != 0) { + printf( "[%d] Comm split improperly ordered group (remComm)\n", + rank ); + fflush(stdout); + errors++; + } + } + /* Perform the intercomm create and test it */ + /* local leader is first process in local_comm, i.e., has rank 0 */ + /* remote leader is process 0 (if odd) or 1 (if even) in remComm */ + MPI_Intercomm_create (myComm, 0, remComm, remLeader, 1, &myFirstComm ); +/* temp */ + if (verbose) { + printf( "[%d] through intercom create\n", rank ); + fflush( stdout ); + } + MPI_Barrier( MPI_COMM_WORLD ); + if (verbose) { + printf( "[%d] through barrier at end of intercom create\n", rank ); + fflush( stdout ); + } +/* temp */ + + /* Try to dup this communicator */ + MPI_Comm_dup ( myFirstComm, &mySecondComm ); + +/* temp */ + if (verbose) { + printf( "[%d] through comm dup\n", rank ); + fflush( stdout ); + } + MPI_Barrier( MPI_COMM_WORLD ); + if (verbose) { + printf( "[%d] through barrier at end of comm dup\n", rank ); + fflush( stdout ); + } +/* temp */ + + /* Each member shares data with his "partner". Note that process 0 in + MPI_COMM_WORLD is sending to itself, since it is process 0 in both + remote groups */ + MPI_Comm_rank( mySecondComm, &lrank ); + MPI_Comm_remote_size( mySecondComm, &rsize ); + + if (verbose) { + printf( "[%d] lrank in secondcomm is %d and remote size is %d\n", + rank, lrank, rsize ); + fflush( stdout ); + } + + /* Send key * size + rank in communicator */ + if (lrank < rsize) { + int myval, hisval; + key = rank % 2; + myval = key * size + lrank; + hisval = -1; + if (verbose) { + printf( "[%d] exchanging %d with %d in intercomm\n", + rank, myval, lrank ); + fflush( stdout ); + } + MPI_Sendrecv (&myval, 1, MPI_INT, lrank, 0, + &hisval, 1, MPI_INT, lrank, 0, mySecondComm, &status); + if (hisval != (lrank + (!key)*size)) { + printf( "[%d] expected %d but got %d\n", rank, lrank + (!key)*size, + hisval ); + errors++; + } + } + + if (errors) { + printf("[%d] Failed!\n",rank); + fflush(stdout); + } + + /* Key is 1 for oddComm, 0 for evenComm (note both contain 0 in WORLD) */ + MPI_Intercomm_merge ( mySecondComm, key, &merge1 ); + MPI_Intercomm_merge ( mySecondComm, (key+1)%2, &merge2 ); + MPI_Intercomm_merge ( mySecondComm, 0, &merge3 ); + MPI_Intercomm_merge ( mySecondComm, 1, &merge4 ); + + MPI_Comm_compare( merge1, MPI_COMM_WORLD, &result ); + if (result != MPI_SIMILAR && size > 2) { + printf( "[%d] comparision with merge1 failed\n", rank ); + errors++; + } + + /* Free communicators */ + MPI_Comm_free( &myComm ); + /* remComm may have been freed above */ + if (remComm != MPI_COMM_NULL) + MPI_Comm_free( &remComm ); + MPI_Comm_free( &myFirstComm ); + MPI_Comm_free( &mySecondComm ); + MPI_Comm_free( &merge1 ); + MPI_Comm_free( &merge2 ); + MPI_Comm_free( &merge3 ); + MPI_Comm_free( &merge4 ); + } + else { + printf("[%d] Failed - at least 2 nodes must be used\n",rank); + } + + MPI_Barrier( MPI_COMM_WORLD ); + MPI_Allreduce( &errors, &sum_errors, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (sum_errors > 0) { + printf( "%d errors on process %d\n", errors, rank ); + } + else if (rank == 0) { + printf( " No Errors\n" ); + } + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/context/ictest3.c b/teshsuite/smpi/mpich-test/context/ictest3.c new file mode 100644 index 0000000000..26b2d970da --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/ictest3.c @@ -0,0 +1,195 @@ +/* ictest3.c + This is like ictest2.c, but it creates communictors that are valid only + at the "leaders"; other members of the local communicator are NOT + in the remote communicator. A peer communicator is constructed that + contains both leaders. + + + */ +#include "mpi.h" +#include +#include "test.h" + +/* #define DEBUG */ + +int verbose = 0; + +int main( int argc, char **argv ) +{ + int size, rank, key, lrank, rsize, result; + MPI_Comm myFirstComm; + MPI_Comm mySecondComm; + MPI_Comm newComm, peerComm; + MPI_Group rgroup, lgroup, igroup; + int errors = 0, sum_errors; + int flag; + MPI_Status status; + + /* Initialization */ + MPI_Init ( &argc, &argv ); + MPI_Comm_rank ( MPI_COMM_WORLD, &rank); + MPI_Comm_size ( MPI_COMM_WORLD, &size); + + /* Only works for 2 or more processes */ + /* + We create an even and odd communicator, then create an + intercommunicator out of them. For this purpose, we use a + "peer" communicator valid only at one member of each of the odd and + even communicators. + */ + if (size >= 2) { + MPI_Comm merge1, merge2, merge3, merge4; + + /* Generate membership key in the range [0,1] */ + key = rank % 2; + /* Create the even communicator and odd communicators */ + MPI_Comm_split ( MPI_COMM_WORLD, key, rank, &newComm ); + + MPI_Comm_test_inter( newComm, &flag ); + if (flag) { + errors++; + printf( "[%d] got test_inter gave true for intra comm\n", rank ); + } + + /* Create the "peer" communicator */ + key = 0; + if (rank < 2) key = 1; + MPI_Comm_split( MPI_COMM_WORLD, key, rank, &peerComm ); + if (key == 0) { + MPI_Comm_free( &peerComm ); + } +#ifdef DEBUG + else { + MPI_Comm_rank( peerComm, &lrank ); + printf( "[%d] lrank in peerComm is %d (color = %d, key=%d)\n", + rank, lrank, key, rank ); + } +#endif + + /* Check that the leader is who we think he is */ + MPI_Comm_rank( newComm, &lrank ); + /* printf( "[%d] local rank is %d\n", rank, lrank ); + fflush(stdout); */ + /* Perform the intercomm create and test it */ + /* Local leader is always the one at rank 0. */ + /* If even, the remote leader is rank 1, if odd, the remote leader + is rank 0 in the peercomm */ + MPI_Intercomm_create (newComm, 0, peerComm, !(rank % 2), 1, &myFirstComm ); +#ifdef DEBUG + printf( "[%d] through intercom create\n", rank ); + fflush( stdout ); + MPI_Barrier( MPI_COMM_WORLD ); + printf( "[%d] through barrier at end of intercom create\n", rank ); +#endif + MPI_Comm_test_inter( myFirstComm, &flag ); + if (!flag) { + errors++; + printf( "[%d] got test_inter gave false for inter comm\n", rank ); + } + + /* Try to dup this communicator */ + MPI_Comm_dup ( myFirstComm, &mySecondComm ); + MPI_Comm_test_inter( mySecondComm, &flag ); + if (!flag) { + errors++; + printf( "[%d] got test_inter gave false for dup of inter comm\n", + rank ); + } + +#ifdef DEBUG + printf( "[%d] through comm dup\n", rank ); + fflush( stdout ); + MPI_Barrier( MPI_COMM_WORLD ); + printf( "[%d] through barrier at end of comm dup\n", rank ); +#endif + + /* Each member shares data with his "partner". */ + MPI_Comm_rank( mySecondComm, &lrank ); + MPI_Comm_remote_size( mySecondComm, &rsize ); + +#ifdef DEBUG + printf( "[%d] lrank in secondcomm is %d and remote size is %d\n", + rank, lrank, rsize ); + fflush( stdout ); +#endif + + /* Check that the remote group is what we think */ + MPI_Comm_remote_group( mySecondComm, &rgroup ); + MPI_Comm_group( newComm, &lgroup ); + MPI_Group_intersection( rgroup, lgroup, &igroup ); + MPI_Group_compare( igroup, MPI_GROUP_EMPTY, &flag ); + if (flag != MPI_IDENT) { + errors++; + printf( "[%d] intersection of remote and local group is not empty\n", + rank ); + } + MPI_Group_free( &rgroup ); + MPI_Group_free( &lgroup ); + MPI_Group_free( &igroup ); + + /* Send key * size + rank in communicator */ + if (lrank < rsize) { + int myval, hisval; + key = rank % 2; + myval = key * size + lrank; + hisval = -1; +#ifdef DEBUG + printf( "[%d] exchanging %d with %d in intercomm\n", + rank, myval, lrank ); + fflush( stdout ); +#endif + MPI_Sendrecv (&myval, 1, MPI_INT, lrank, 0, + &hisval, 1, MPI_INT, lrank, 0, mySecondComm, &status); + if (hisval != (lrank + (!key)*size)) { + printf( "[%d] expected %d but got %d\n", rank, lrank + (!key)*size, + hisval ); + errors++; + } + } + + if (errors) + printf("[%d] Failed!\n",rank); + + /* Key is 1 for oddComm, 0 for evenComm (note both contain 0 in WORLD) */ +#ifdef DEBUG + printf( "[%d] starting intercom merge\n", rank ); + fflush( stdout ); +#endif + MPI_Intercomm_merge ( mySecondComm, key, &merge1 ); + MPI_Intercomm_merge ( mySecondComm, (key+1)%2, &merge2 ); + MPI_Intercomm_merge ( mySecondComm, 0, &merge3 ); + MPI_Intercomm_merge ( mySecondComm, 1, &merge4 ); + + MPI_Comm_compare( merge1, MPI_COMM_WORLD, &result ); + if (result != MPI_SIMILAR && size > 2) { + printf( "[%d] comparision with merge1 failed\n", rank ); + errors++; + } + + /* Free communicators */ + if (verbose) printf( "about to free communicators\n" ); + MPI_Comm_free( &newComm ); + if (peerComm != MPI_COMM_NULL) MPI_Comm_free( &peerComm ); + MPI_Comm_free( &myFirstComm ); + MPI_Comm_free( &mySecondComm ); + MPI_Comm_free( &merge1 ); + MPI_Comm_free( &merge2 ); + MPI_Comm_free( &merge3 ); + MPI_Comm_free( &merge4 ); + } + else + printf("[%d] Failed - at least 2 nodes must be used\n",rank); + + MPI_Barrier( MPI_COMM_WORLD ); + MPI_Allreduce( &errors, &sum_errors, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (sum_errors > 0) { + printf( "%d errors on process %d\n", errors, rank ); + } + else if (rank == 0) { + printf( " No Errors\n" ); + } + /* Finalize and end! */ + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/context/runtests b/teshsuite/smpi/mpich-test/context/runtests new file mode 100755 index 0000000000..c676a16b55 --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/runtests @@ -0,0 +1,136 @@ +#! /bin/sh +# +# Run some of the tests. If any arguments are provided, pass them to the +# test programs. +# +# -mvhome is needed for the ANL SP, and is ignored by others +args= +device= +MPICH_VERSION= +STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"} +MAKE="make --no-print-directory" + +# +# Set mpirun to the name/path of the mpirun program +#FindMPIRUN +# +# +test_mpi2=1 +runtests=1 +quiet=0 +makeeach=0 +have_fortran=0 +writesummaryfile=no +MAKE="make --no-print-directory" +for arg in "$@" ; do + case $arg in + -basedir=* ) + basedir=`echo $arg | sed 's/-basedir=//'` + ;; + -srcdir=* ) + srcdir=`echo $arg | sed 's/-srcdir=//'` + ;; + -fort=* ) + have_fortran=`echo $arg | sed 's/-fort=//'` + ;; + -checkonly ) + runtests=0 + ;; + -margs=*) + margs=`echo $arg | sed 's/-margs=//'` + args="$args $margs" + ;; + -summaryfile=*) + writesummaryfile=yes + summaryfile=`echo A$arg | sed 's/A-summaryfile=//'` + ;; + -small) + makeeach=1 + ;; + -quiet) + shift + quiet=1 + ;; + -help|-u) + echo "runtests [-checkonly] [-margs='...']" + echo "run tests in this directory. If -checkonly set, just run" + echo "the differences check (do NO rerun the test programs)." + echo "If -margs is used, these options are passed to mpirun." + echo "If -small is used, the examples are built, run, and deleted." + exit 1 + ;; + *) + if test -n "$arg" ; then + echo "runtests: Unknown argument ($arg)" + exit 1 + fi + ;; + esac +done + +# +# Load basic procedures +. ${srcdir}/../runbase + +# If the programs are not available, run make. +if [ ! -x attrerr -a $makeeach = 0 -a $runtests = 1 ] ; then + $MAKE +fi +mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile --log=root.thres:critical" +testfiles="" +if [ $runtests = 1 ] ; then + +# +# Run Fortran tests ONLY if Fortran available +if [ 0 = 1 ] ; then + RunTest attrtest 2 "*** Testing attributes from Fortran ***" + + if [ $test_mpi2 = 1 ] ; then + RunTest commnamesf 1 "*** Testing Communicator Names from Fortran ***" + fi +fi +#uses attr, not implemented +#RunTest attrt 2 "*** Testing attributes ***" +#fails, uses MPI_Attr_get, et MPI_Attr_put +#RunTest attrerr 1 "*** Testing attributes (2) ***" + +#TODO : fails with unions, excludes or intersections, need debug in smpi to work +#RunTest grouptest_mpich 4 "*** Testing Groups ***" + +RunTest groupcreate 4 "*** Testing Group creation ***" + +#uses MPI_Intercomm_create +#RunTest ictest 4 "*** Testing Intercommunicators ***" + +RunTest icdup 3 "*** Testing dup of an intercommunicator ***" + +# +# ictest2 relies on a inconsistency in the standard, to wit, that the +# leader in both groups can be the same process. This seems to be +# essential in a dynamic setting, since the only process both groups can +# access may be the single parent process (other than using client/server +# intercommunicator creating routines, with the parent providing the common +# information). +# +#testfiles="$testfiles ictest2.out" +#rm -f ictest2.out +#MakeExe ictest2 +#echo '*** Testing Intercommunicators (2) ***' +#echo '*** Testing Intercommunicators (2) ***' >> ictest2.out +#$mpirun $args -np 4 ictest2 $* >> ictest2.out 2>&1 +#echo '*** Testing Intercommunicators (2) ***' >> ictest2.out +#CleanExe ictest2 +#uses MPI_Comm_test_inter and MPI_Intercomm_create +#RunTest ictest3 4 "*** Testing Intercommunicators (3) ***" + +#if [ $have_fortran -eq "1" ] ; then +# RunTest commnamesf 2 "*** Testing Communicator Names ***" +#fi +#else + # Just run checks +# testfiles=`echo *.out` +fi + +echo '*** Checking for differences from expected output ***' +CheckAllOutput context.diff +exit 0 diff --git a/teshsuite/smpi/mpich-test/context/test.c b/teshsuite/smpi/mpich-test/context/test.c new file mode 100644 index 0000000000..f276bb6ce9 --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/test.c @@ -0,0 +1,94 @@ +/* Procedures for recording and printing test results */ + +#include +#include +#include "test.h" +#include "mpi.h" + +static int tests_passed = 0; +static int tests_failed = 0; +static char failed_tests[255][81]; +static char suite_name[255]; +FILE *fileout = NULL; + +void Test_Init(suite, rank) +const char *suite; +int rank; +{ + char filename[512]; + + sprintf(filename, "%s-%d.out", suite, rank); + strncpy(suite_name, suite, 255); + fileout = fopen(filename, "w"); + if (!fileout) { + fprintf( stderr, "Could not open %s on node %d\n", filename, rank ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } +} + +void Test_Message(mess) +const char *mess; +{ + fprintf(fileout, "[%s]: %s\n", suite_name, mess); + fflush(fileout); +} + +void Test_Failed(test) +const char *test; +{ + fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test); + strncpy(failed_tests[tests_failed], test, 81); + fflush(fileout); + tests_failed++; +} + +void Test_Passed(test) +const char *test; +{ + fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test); + fflush(fileout); + tests_passed++; +} + +int Summarize_Test_Results() +{ + fprintf(fileout, "For test suite '%s':\n", suite_name); + fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", + tests_passed + tests_failed, tests_passed, tests_failed); + if (tests_failed > 0) { + int i; + + fprintf(fileout, "*** Tests Failed:\n"); + for (i = 0; i < tests_failed; i++) + fprintf(fileout, "*** %s\n", failed_tests[i]); + } + return tests_failed; +} + +void Test_Finalize() +{ + fflush(fileout); + fclose(fileout); +} + +#include "mpi.h" +/* Wait for every process to pass through this point. This test is used + to make sure that all processes complete, and that a test "passes" because + it executed, not because it some process failed. + */ +void Test_Waitforall( ) +{ +int m, one, myrank, n; + +MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); +MPI_Comm_size( MPI_COMM_WORLD, &n ); +one = 1; +MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + +if (m != n) { + printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, + n, m ); + } +if (myrank == 0) + printf( "All processes completed test\n" ); +} diff --git a/teshsuite/smpi/mpich-test/context/test.h b/teshsuite/smpi/mpich-test/context/test.h new file mode 100644 index 0000000000..1eaf6fc0c6 --- /dev/null +++ b/teshsuite/smpi/mpich-test/context/test.h @@ -0,0 +1,24 @@ +/* Header for testing procedures */ + +#ifndef _INCLUDED_TEST_H_ +#define _INCLUDED_TEST_H_ + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +void Test_Init (const char *, int); +#ifdef USE_STDARG +void Test_Printf (const char *, ...); +#else +/* No prototype */ +void Test_Printf(); +#endif +void Test_Message (const char *); +void Test_Failed (const char *); +void Test_Passed (const char *); +int Summarize_Test_Results (void); +void Test_Finalize (void); +void Test_Waitforall (void); + +#endif diff --git a/teshsuite/smpi/mpich-test/env/CMakeLists.txt b/teshsuite/smpi/mpich-test/env/CMakeLists.txt new file mode 100644 index 0000000000..69f5b63662 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/CMakeLists.txt @@ -0,0 +1,96 @@ +cmake_minimum_required(VERSION 2.6) + +if(enable_smpi) + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff") + set(CMAKE_Fortran_LINKER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + + set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1") + + include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") + + add_executable(init init.c ) + add_executable(timers timers.c test.c) + add_executable(timertest timertest.c test.c) + add_executable(baseattr baseattr.c test.c) + add_executable(gtime gtime.c test.c) + add_executable(errhand errhand.c test.c) + add_executable(sigchk sigchk.c test.c) + add_executable(aborttest aborttest.c) + add_executable(testerr testerr.c) + add_executable(getproc getproc.c) + if(SMPI_F2C) +# add_executable(baseattrf baseattrf.f) +# add_executable(errhandf errhandf.f) +# add_executable(errstringsf errstringsf.f) + add_executable(getprocf getprocf.f) + endif() + target_link_libraries(init m simgrid smpi ) + target_link_libraries(timers m simgrid smpi ) + target_link_libraries(timertest m simgrid smpi ) + target_link_libraries(baseattr m simgrid smpi ) + target_link_libraries(gtime m simgrid smpi ) + target_link_libraries(errhand m simgrid smpi ) + target_link_libraries(sigchk m simgrid smpi ) + target_link_libraries(aborttest m simgrid smpi ) + target_link_libraries(testerr m simgrid smpi ) + target_link_libraries(getproc m simgrid smpi ) + if(SMPI_F2C) +# target_link_libraries(baseattrf m simgrid smpi ) +# target_link_libraries(errhandf m simgrid smpi ) +# target_link_libraries(errstringsf m simgrid smpi ) + target_link_libraries(getprocf m simgrid smpi ) + endif() + + set_target_properties(timers PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(timers PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(timertest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(baseattr PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(gtime PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(errhand PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sigchk PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(aborttest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(testerr PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(getproc PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + if(SMPI_F2C) +# set_target_properties(baseattrf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") +# set_target_properties(errhandf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") +# set_target_properties(errstringsf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(getprocf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + endif() +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/env.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/test.c + ${CMAKE_CURRENT_SOURCE_DIR}/init.c + ${CMAKE_CURRENT_SOURCE_DIR}/timers.c + ${CMAKE_CURRENT_SOURCE_DIR}/baseattr.c + ${CMAKE_CURRENT_SOURCE_DIR}/gtime.c + ${CMAKE_CURRENT_SOURCE_DIR}/errhand.c + ${CMAKE_CURRENT_SOURCE_DIR}/sigchk.c + ${CMAKE_CURRENT_SOURCE_DIR}/aborttest.c + ${CMAKE_CURRENT_SOURCE_DIR}/testerr.c + ${CMAKE_CURRENT_SOURCE_DIR}/getproc.c + ${CMAKE_CURRENT_SOURCE_DIR}/test.h + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + ${CMAKE_CURRENT_SOURCE_DIR}/../hostfile + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/teshsuite/smpi/mpich-test/env/aborttest.c b/teshsuite/smpi/mpich-test/env/aborttest.c new file mode 100644 index 0000000000..244cb9e733 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/aborttest.c @@ -0,0 +1,34 @@ +#include "mpi.h" +/* This simple test checks that MPI_Abort kills all processes + * There are two interesting cases: + * masternode == 0 + * masternode != 0 + */ +int main( int argc, char **argv ) +{ + int node, size, i; + int masternode = 0; + + MPI_Init(&argc, &argv); + + MPI_Comm_rank(MPI_COMM_WORLD, &node); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + /* Check for -altmaster */ + for (i=1; i +#include "mpi.h" + +int main( int argc, char **argv ) +{ + int i; + + fprintf(stdout,"Before MPI_Init\n"); + for (i = 0; i < argc; i++) + fprintf(stdout,"arg %d is %s\n", i, argv[i]); + + MPI_Init( &argc, &argv ); + + fprintf(stdout,"After MPI_Init\n"); + for (i = 0; i < argc; i++) + fprintf(stdout,"arg %d is %s\n", i, argv[i]); + + MPI_Finalize( ); +} diff --git a/teshsuite/smpi/mpich-test/env/baseattr.c b/teshsuite/smpi/mpich-test/env/baseattr.c new file mode 100644 index 0000000000..9555fb7792 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/baseattr.c @@ -0,0 +1,48 @@ +#include +#include "mpi.h" +#include "test.h" + +int main( int argc, char **argv) +{ + int err = 0; + void *v; + int flag; + int vval; + int rank, size; + + MPI_Init( &argc, &argv ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, &v, &flag ); + if (!flag || (vval = *(int*)v)< 32767) { + err++; + fprintf( stderr, "Could not get TAG_UB or got too-small value\n" ); + } + MPI_Attr_get( MPI_COMM_WORLD, MPI_HOST, &v, &flag ); + vval = *(int*)v; + if (!flag || ((vval < 0 || vval >= size) && vval != MPI_PROC_NULL)) { + err++; + fprintf( stderr, "Could not get HOST or got invalid value\n" ); + } + MPI_Attr_get( MPI_COMM_WORLD, MPI_IO, &v, &flag ); + vval = *(int*)v; + if (!flag || ((vval < 0 || vval >= size) && vval != MPI_ANY_SOURCE && + vval != MPI_PROC_NULL)) { + err++; + fprintf( stderr, "Could not get IO or got invalid value\n" ); + } + MPI_Attr_get( MPI_COMM_WORLD, MPI_WTIME_IS_GLOBAL, &v, &flag ); + if (flag) { + /* Wtime need not be set */ + vval = *(int*)v; + if (vval < 0 || vval > 1) { + err++; + fprintf( stderr, "Invalid value for WTIME_IS_GLOBAL (got %d)\n", + vval ); + } + } + Test_Waitforall( ); + MPI_Finalize( ); + + return err; +} diff --git a/teshsuite/smpi/mpich-test/env/baseattrf.f b/teshsuite/smpi/mpich-test/env/baseattrf.f new file mode 100644 index 0000000000..b07935c84f --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/baseattrf.f @@ -0,0 +1,35 @@ + + program main + integer err, ierr + integer v + logical flag + integer rank, size + include 'mpif.h' + + err = 0 + call MPI_Init( ierr ) + call MPI_Comm_size( MPI_COMM_WORLD, size, ierr ) + call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr ) + call MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, v, flag, ierr ) + if (.not. flag .or. v .lt. 32767) then + err = err + 1 + print *, 'Could not get TAG_UB or got too-small value', v + endif +c + call MPI_Attr_get( MPI_COMM_WORLD, MPI_HOST, v, flag, ierr ) + if (.not. flag .or. ((v .lt. 0 .or. v .ge. size) .and. + * v .ne. MPI_PROC_NULL)) then + err = err + 1 + print *, 'Could not get HOST or got invalid value', v + endif +c + call MPI_Attr_get( MPI_COMM_WORLD, MPI_IO, v, flag, ierr ) + if (.not. flag .or. (( v .lt. 0 .or. v .gt. size) .and. + * v .ne. MPI_PROC_NULL .and. + * v .ne. MPI_ANY_SOURCE)) then + err = err + 1 + print *, 'Could not get IO or got invalid value', v + endif + call MPI_Finalize( ierr ) + + end diff --git a/teshsuite/smpi/mpich-test/env/cmdline.c b/teshsuite/smpi/mpich-test/env/cmdline.c new file mode 100644 index 0000000000..87f62edc84 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/cmdline.c @@ -0,0 +1,54 @@ +#include +#include +#include "mpi.h" + +/* + This is a test program to see if command line arguments are handled + well. Note that MPI doesn't *require* anything here, so this is + simply used to acess "quality of implementation" + + run with arguments + a "b c" "d'e" 'f"g" h' + */ +int main( int argc, char *argv[] ) +{ + int i, rank, toterr, err = 0; + static char *eargv[5]; + + eargv[1] = "a"; + eargv[2] = "b c"; + eargv[3] = "d'e"; + eargv[4] = "f\"g\" h"; + + MPI_Init( &argc, &argv ); + + for (i=1; i<=4; i++) { + if (!argv[i]) { + printf( "Argument %d is null!\n", i ); + err++; + } + } + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (toterr) { + MPI_Abort( 1, MPI_COMM_WORLD ); + return 0; + } + + /* a "b c" "d'e" 'f"g" h' */ + for (i=1; i<=4; i++) { + if (strcmp( argv[i], eargv[i] ) != 0) { + err++; + printf( "Found %s but expected %s\n", argv[i], eargv[i] ); + } + } + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + if (rank == 0) { + if (toterr) printf( "Found %d errors\n", toterr ); + else printf( " No Errors\n" ); + } + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/env/env.std b/teshsuite/smpi/mpich-test/env/env.std new file mode 100644 index 0000000000..f421d7c9bb --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/env.std @@ -0,0 +1,10 @@ +Timer tests +Basic attributes test +Error handling test +*** Error Handling *** + Three error messages (from two errors) are expected +which should both show an error class of 13 +(first) 13 : Invalid group passed to function +(errhandler) 13 : Invalid group passed to function +(second) 13 : Invalid group passed to function +Signal test diff --git a/teshsuite/smpi/mpich-test/env/errhand.c b/teshsuite/smpi/mpich-test/env/errhand.c new file mode 100644 index 0000000000..fe7766cb30 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/errhand.c @@ -0,0 +1,242 @@ +#include +#include "mpi.h" +#include "test.h" + +int verbose = 0; +int global_errors = 0; +int Test_errorhandling (void); +/* This is complicated by the fact that not all systems correctly + implement stdargs (for the ...) declarations). MPICH uses USE_STDARG + as the choice here, instead of the cases + if defined(__STDC__) || defined(__cplusplus) || defined(HAVE_PROTOTYPES) + */ +#if defined(USE_STDARG) +void handler_a( MPI_Comm *, int *, ...); +void handler_b( MPI_Comm *, int *, ...); +void error_handler(MPI_Comm *, int *, ...); +#else +void handler_a ( MPI_Comm *, int * ); +void handler_b ( MPI_Comm *, int * ); +void error_handler ( MPI_Comm *, int * ); +#endif + +/* + Test the error handers (based on a Fortran test program) + */ +int main( int argc, char **argv ) +{ + MPI_Init( &argc, &argv ); + + Test_errorhandling(); + + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} + +static int a_errors, b_errors; + +int Test_errorhandling( void ) +{ + char errstring[MPI_MAX_ERROR_STRING]; + MPI_Comm dup_comm_world, dummy; + MPI_Comm tempcomm; + MPI_Errhandler errhandler_a, errhandler_b, errhandler, old_handler; + int err, world_rank, class, resultlen; + +#ifdef FOO + logical test_default, test_abort +#endif + + MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); + MPI_Comm_dup( MPI_COMM_WORLD, &dup_comm_world ); + + if (world_rank == 0 && verbose) { + printf( "*** Error Handling ***\n" ); + } + +/* + Exercise save/restore of user error handlers. + */ + a_errors = 0; + MPI_Errhandler_create(handler_a, &errhandler_a); + + MPI_Errhandler_set(dup_comm_world, errhandler_a); + MPI_Errhandler_free(&errhandler_a); + + if (verbose) printf( "create with null group 1\n" ); + MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy); + if (a_errors != 1) { + Test_Failed( " error handler A not invoked\n" ); + global_errors ++; + } + b_errors = 0; + MPI_Errhandler_create(handler_b, &errhandler_b); + MPI_Errhandler_get(dup_comm_world, &old_handler); + /* The following is needed to preserve an old handler */ + MPI_Comm_dup( MPI_COMM_SELF, &tempcomm ); + MPI_Errhandler_set( tempcomm, old_handler ); + MPI_Errhandler_set(dup_comm_world, errhandler_b); + MPI_Errhandler_free(&errhandler_b); + if (verbose) printf( "create with null group 2\n" ); + MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy); + if (b_errors != 1) { + Test_Failed( " error handler B not invoked\n" ); + global_errors++; + } + + MPI_Errhandler_set(dup_comm_world, old_handler); + MPI_Comm_free( &tempcomm ); + /* MPI_Errhandler_free(&old_handler); */ + if (verbose) printf( "create with null group 3\n" ); + MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy); + if (a_errors != 2) { + Test_Failed( " error handler A not re-invoked\n" ); + global_errors++; + } +/* + Exercise class & string interrogation. + */ + MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_ARE_FATAL); + + if (verbose) + printf( " Three error messages (from two errors) are expected\n\ +which should both show an error class of %d\n", MPI_ERR_GROUP ); + + MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_RETURN); + if (verbose) printf( "create with null group 4\n" ); + err = MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy); + if (err != MPI_SUCCESS) { + MPI_Error_class(err, &class); + MPI_Error_string(err, errstring, &resultlen); + if (verbose) + printf( "(first) %d : %s\n", class, errstring ); + else if (class != MPI_ERR_GROUP) { + Test_Failed( "(first) Class is not MPI_ERR_GROUP\n" ); + global_errors++; + } + } + else { + MPI_Comm_free( &dummy ); + Test_Failed( "Did not detect error when building communicator\n" ); + global_errors++; + } + MPI_Errhandler_create(error_handler, &errhandler); + MPI_Errhandler_set(dup_comm_world, errhandler); + MPI_Errhandler_free(&errhandler); + if (verbose) printf( "create with null group 5\n" ); + err = MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy); + if (err != MPI_SUCCESS) { + MPI_Error_class(err, &class); + MPI_Error_string(err, errstring, &resultlen); + if (verbose) + printf( "(second) %d : %s\n", class, errstring ); + else if (class != MPI_ERR_GROUP) { + Test_Failed( "(second) class was not MPI_ERR_GROUP" ); + global_errors++; + } + } + else { + MPI_Comm_free( &dummy ); + Test_Failed( "Did not detect error in building communicator\n" ); + global_errors++; + } + MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_ARE_FATAL); + +#ifdef FOO + if (test_default) { + printf("Forcing error for default handler...\n"); + MPI_Comm_create(dup_comm_world, MPI_GROUP_NULL, &dummy); + } + if (test_abort) { + printf( "Calling MPI_Abort...\n" ); + MPI_Abort(MPI_COMM_WORLD, 123456768); + } +#endif + + MPI_Comm_free( &dup_comm_world ); + +#if 0 + errs = global_errors; + MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterrs == 0) + printf( " No Errors\n" ); + else + printf( " Found %d errors\n", toterrs ); + } +#endif + return 0; +} + + +/* + + Trivial error handler. Note that FORTRAN error handlers can't + deal with the varargs stuff the C handlers can. + + */ +#if defined(USE_STDARG) +void error_handler(MPI_Comm *comm, int *err, ...) +#else +void error_handler(MPI_Comm *comm, int *err) +#endif +{ + int class; + int resultlen; + char string[MPI_MAX_ERROR_STRING]; + + MPI_Error_class(*err, &class); + MPI_Error_string(*err, string, &resultlen); + if (verbose) + printf( "(errhandler) %d : %s\n", class, string ); + else { + if (class != MPI_ERR_GROUP) { + printf( "(errhandler) class = %d, expected %d (MPI_ERR_GROUP)\n", + class, MPI_ERR_GROUP ); + printf( " message %s\n", string ); + global_errors++; + } + } +} +/* + Error handler A, used for save/restore testing. + */ + +#if defined(USE_STDARG) +void handler_a( MPI_Comm *comm, int *err, ...) +#else +void handler_a(MPI_Comm *comm, int err) +#endif +{ + int class; + + MPI_Error_class(*err, &class); + if (class != MPI_ERR_GROUP) { + printf( "handler_a: incorrect error class %d\n", class ); + } + *err = MPI_SUCCESS; + a_errors++; +} + +/* + Error handler B, used for save/restore testing. + */ + +#if defined(USE_STDARG) +void handler_b(MPI_Comm *comm, int *err, ...) +#else +void handler_b(comm, err) +MPI_Comm *comm; +int *err; +#endif +{ + int class; + + MPI_Error_class(*err, &class); + if (class != MPI_ERR_GROUP) { + printf( "handler_b: incorrect error class %d\n", class ); + } + *err = MPI_SUCCESS; + b_errors++; +} diff --git a/teshsuite/smpi/mpich-test/env/errhand2.c b/teshsuite/smpi/mpich-test/env/errhand2.c new file mode 100644 index 0000000000..7a9f4b91e6 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/errhand2.c @@ -0,0 +1,62 @@ +#include +#include "mpi.h" +#include "test.h" + +#ifdef USE_STDARG +void errfunc( MPI_Comm *, int *, ... ); +#else +void errfunc( MPI_Comm *, int * ); +#endif + +/* + * Test the reference count semantics of error handlers. + */ +int main( int argc, char *argv[] ) +{ + MPI_Errhandler errhandler, olderrhandler; + MPI_Comm newcomm; + int rc, errcnt = 0; + + MPI_Init( &argc, &argv ); + + MPI_Comm_dup( MPI_COMM_WORLD, &newcomm ); + MPI_Errhandler_create( errfunc, &errhandler ); + MPI_Errhandler_set( newcomm, errhandler ); + /* Once you set it, you should be able to free it */ + MPI_Errhandler_free( &errhandler ); + if (errhandler != MPI_ERRHANDLER_NULL) { + printf( "Freed errhandler is not set to NULL\n" ); + errcnt++; + } + MPI_Errhandler_get( newcomm, &olderrhandler ); + MPI_Comm_free( &newcomm ); + + /* olderrhandler should now be invalid. Is it? */ + /* This test is based on an interpretation of the MPI standard that + was subsequently overturned. See the MPI-1.1 errata. + An Errhandler_get is similar to an MPI_Comm_group (having the + effect of creating a copy to the object). */ + MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN ); + rc = MPI_Errhandler_set( MPI_COMM_WORLD, olderrhandler ); + /* In the old interpretation, the test is !rc */ + if (rc) { + printf( "Olderrhandler invalid after get and comm freed!\n" ); + errcnt ++; + } + + if (errcnt) + printf( "Found %d errors!\n", errcnt ); + else + printf( " No Errors\n" ); + + MPI_Finalize( ); + return 0; +} + +#if defined(USE_STDARG) +void errfunc( MPI_Comm *comm, int *err, ...) +#else +void errfunc( MPI_Comm *comm, int *err) +#endif +{ +} diff --git a/teshsuite/smpi/mpich-test/env/errhandf.f b/teshsuite/smpi/mpich-test/env/errhandf.f new file mode 100644 index 0000000000..ad82413fbf --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/errhandf.f @@ -0,0 +1,56 @@ +C +C Test that error handlers can be applied and used through Fortran +C + program main + + include 'mpif.h' + integer ierr, errorclass + integer buf, errors, request +C + call mpi_init(ierr) +C +C Try to set the errors-return handler +C + call mpi_errhandler_set(mpi_comm_world, mpi_errors_return, ierr) + errors = 0 +C +C Activate the handler with a simple case +C + call mpi_send( buf, 1, MPI_INTEGER, -99, 0, MPI_COMM_WORLD, ierr ) + if (IERR .eq. MPI_SUCCESS) then + errors = errors + 1 + print *, 'MPI_Send of negative rank did not return error' + endif +C +C Check for a reasonable error message + call mpi_error_class(ierr, errorclass, err) + if (errorclass .ne. MPI_ERR_RANK) then + errors = errors + 1 + print *, 'Error class was not MPI_ERR_RANK, was ', errorclass + endif +C +C Activate the handler with a simple case +C + call mpi_irecv( buf, 1, MPI_INTEGER, -100, 2, MPI_COMM_WORLD, + * request, ierr ) + if (IERR .eq. MPI_SUCCESS) then + errors = errors + 1 + print *, 'MPI_Irecv of negative rank did not return error' + endif +C +C Check for a reasonable error message + call mpi_error_class(ierr, errorclass, err) + if (errorclass .ne. MPI_ERR_RANK) then + errors = errors + 1 + print *, 'Error class was not MPI_ERR_RANK, was ', errorclass + endif + + if (errors .eq. 0) then + print *, ' No Errors' + else + print *, ' Found ', errors, ' errors' + endif +C + call mpi_finalize(ierr) +C + end diff --git a/teshsuite/smpi/mpich-test/env/errstringsf.f b/teshsuite/smpi/mpich-test/env/errstringsf.f new file mode 100644 index 0000000000..2f2167c680 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/errstringsf.f @@ -0,0 +1,48 @@ +c +c Check the handling of error strings from Fortran +c + + program errstringsf + + include 'mpif.h' + + character*(MPI_MAX_ERROR_STRING) errs + integer i, reslen, reserr, ierr + +c +c Fill the string with 'x' to check that +c blank padding happens correctly. +c + call MPI_Init( ierr ) + do i = 1,MPI_MAX_ERROR_STRING + errs(i:i) = 'x' + end do + + call mpi_error_string(mpi_err_buffer, errs, reslen, reserr) + + if (errs(reslen+1:) .ne. ' ') then + print *,' Fortran strings are not correctly blank padded' + if (errs(reslen+1:reslen+1) .eq. char(0)) then +c +c Very strictly interpreted, an since an error string must be +c MPI_MAX_ERROR_STRING characters long, and the Fortran rules +c for such assignements is to blank pad them, there should not +c be a null character (C-like) in them. However, the standard +c is ambiguous on this. +c + print *, ' Fortran strings have bogus null character' + end if + else + print *,' Fortran strings are assigned ok' + end if + +c Check that the length was right + if (errs(reslen:reslen) .eq. ' ') then + print *,' Length of result is wrong' + else + print *,' Length of result is correct' + end if + + call MPI_Finalize( ierr ) + + end diff --git a/teshsuite/smpi/mpich-test/env/errstringsf.std b/teshsuite/smpi/mpich-test/env/errstringsf.std new file mode 100644 index 0000000000..0b9177d028 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/errstringsf.std @@ -0,0 +1,4 @@ +*** Tests of Fortran error strings *** + Fortran strings are assigned ok + Length of result is correct +*** Tests of Fortran error strings *** diff --git a/teshsuite/smpi/mpich-test/env/getproc.c b/teshsuite/smpi/mpich-test/env/getproc.c new file mode 100644 index 0000000000..0553323abc --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/getproc.c @@ -0,0 +1,57 @@ +/* + * Test get processor name + * + */ +#include "mpi.h" +#include +#include +#include + +int main( int argc, char *argv[] ) +{ + char name[MPI_MAX_PROCESSOR_NAME+10]; + int resultlen; + int err = 0; + + MPI_Init( &argc, &argv ); + + memset( name, 0xFF, MPI_MAX_PROCESSOR_NAME+10 ); + resultlen = 0; + + MPI_Get_processor_name( name, &resultlen ); + /* Test that name has only printing characters */ + if (resultlen > MPI_MAX_PROCESSOR_NAME || resultlen <= 0) { + fprintf( stderr, "resultlen (%d) invalid\n", resultlen ); + err++; + } + if (!err) { + int i; + for (i=0; i +#include "mpi.h" +#include "test.h" +#include + +/* # define MPI_Wtime PMPI_Wtime */ + +/* + * This program tests that if MPI_WTIME_IS_GLOBAL is set, the timer + * IS in fact global. We have some suspicions about certain vendor systems + */ + +int CheckTime( void ); + +/* + * Check time tests that the timers are synchronized + */ +int CheckTime( void ) +{ + int rank, size, i; + double wtick, t1, t2, t3, delta_t; + int ntest=20; + MPI_Status status; + int err = 0; + double max_diff = 0.0; + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + if (rank == 0) { + wtick = MPI_Wtick(); +#ifdef DEBUG + printf( "Wtick is %lf\n", wtick ); +#endif + while (ntest--) { + for (i=1; i (t3 - t1 + wtick)) { + err++; + printf( "Process %d has %f; Process 0 has %f\n", + i, t2, 0.5 * (t1 + t3) ); + } + if (delta_t > max_diff) max_diff = delta_t; + } +#ifdef DEBUG + printf( "delta_t = %lf\n", delta_t ); +#endif + /* Release all process for the next pass */ + for (i=1; i 1) { + err++; + fprintf( stderr, "Invalid value for WTIME_IS_GLOBAL (got %d)\n", + vval ); + } + } + if (flag && vval) { + /* Wtime is global is true. Check it */ +#ifdef DEBUG + printf( "WTIME_IS_GLOBAL\n" ); +#endif + err += CheckTime(); + + /* Wait for 10 seconds */ + t1 = MPI_Wtime(); + while (MPI_Wtime() - t1 < 10.0) ; + + err += CheckTime(); + } + if (rank == 0) { + if (err > 0) { + printf( "Errors in MPI_WTIME_IS_GLOBAL\n" ); + } + else { + printf( " No Errors\n" ); + } + } + /* The SGI implementation of MPI sometimes fails to flush stdout + properly. This fflush will work around that bug. */ + /* fflush( stdout ); */ + MPI_Finalize( ); + + return err; +} diff --git a/teshsuite/smpi/mpich-test/env/hang.c b/teshsuite/smpi/mpich-test/env/hang.c new file mode 100644 index 0000000000..36adc16f9f --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/hang.c @@ -0,0 +1,15 @@ + +#include +#include "mpi.h" + +int main( int argc, char **args ) +{ + int mytid; + printf("doing mpi_init\n"); + MPI_Init(&argc,&args); + + MPI_Comm_rank(MPI_COMM_WORLD,&mytid); + if (mytid < 2) MPI_Abort( MPI_COMM_WORLD, 1 ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/env/init.c b/teshsuite/smpi/mpich-test/env/init.c new file mode 100644 index 0000000000..477494cdd5 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/init.c @@ -0,0 +1,30 @@ +#include "mpi.h" +#include +#include "test.h" + +int main( int argc, char **argv ) +{ + int flag; + MPI_Status status; + int size, rank, partner, i; + + for (i=0; i<2; i++ ) { + MPI_Initialized(&flag); + if(flag == 0) + MPI_Init(&argc,&argv); + } + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + if (size != 2) { + printf( "Test must be run with 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + partner = (rank + 1) % size; + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_COMM_WORLD, &status ); + if (rank == 0) printf( " No Errors\n" ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/env/runtests b/teshsuite/smpi/mpich-test/env/runtests new file mode 100755 index 0000000000..d4c6d154ea --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/runtests @@ -0,0 +1,235 @@ +#! /bin/sh +# +# Run some of the tests. If any arguments are provided, pass them to the +# test programs. +# +# -mvhome is needed for the ANL SP, and is ignored by others + +device= +MPICH_VERSION= +STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"} +MAKE="make --no-print-directory" + +# +# Set mpirun to the name/path of the mpirun program +#FindMPIRUN +# +quiet=0 +runtests=1 +makeeach=0 +have_fortran=0 +writesummaryfile=no +MAKE="make --no-print-directory" +for arg in "$@" ; do + case $arg in + -basedir=* ) + basedir=`echo $arg | sed 's/-basedir=//'` + ;; + -srcdir=* ) + srcdir=`echo $arg | sed 's/-srcdir=//'` + ;; + -fort=* ) + have_fortran=`echo $arg | sed 's/-fort=//'` + ;; + -checkonly ) + runtests=0 + ;; + -margs=*) + margs=`echo $arg | sed 's/-margs=//'` + args="$args $margs" + ;; + -summaryfile=*) + writesummaryfile=yes + summaryfile=`echo A$arg | sed 's/A-summaryfile=//'` + ;; + -small) + makeeach=1 + shift + ;; + -quiet) + shift + quiet=1 + ;; + -help|-u) + echo "runtests [-checkonly] [-margs='...']" + echo "run tests in this directory. If -checkonly set, just run" + echo "the differences check (do NO rerun the test programs)." + echo "If -margs is used, these options are passed to mpirun." + echo "If -small is used, the examples are built, run, and deleted." + exit 1 + ;; + *) + if test -n "$arg" ; then + echo "runtests: Unknown argument ($arg)" + exit 1 + fi + ;; + esac +done + +mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile --log=root.thres:critical" +# +# Load basic procedures +. ${srcdir}/../runbase + +# If the programs are not available, run make. +if [ ! -x timers -a $makeeach = 0 -a $runtests = 1 ] ; then + $MAKE +fi +# +testfiles="" +if [ $runtests = 1 ] ; then +#replaced sleep by smpi_sleep to avoid problems with real/simulation powers +#RunTest timers 1 "*** Timer tests ***" + +RunTest init 2 "*** MPI_Initialized tests ***" +# uses MPI_Attr_get +#RunTest baseattr 1 "*** Basic attributes ***" + +RunTest gtime 1 "*** WTIME_IS_GLOBAL ***" +#uses errhandlers +#RunTest errhand 1 "*** Tests of error handling ***" + +#RunTest errhand2 1 "*** Tests of error handling reference counting ***" + +# Do not run sigchk by default because it generates warnings that are not +# errors, and the basic test should be clean +if [ "$MPICH_TESTS_SIGCHK" = yes ] ; then + RunTest sigchk 1 "*** Tests of signals used ***" +fi + +RunTest getproc 1 "*** Test Get Processor Name ***" + +#OutTime +#testfiles="$testfiles cmdline.out" +#rm -f cmdline.out +#MakeExe cmdline +#echo "*** Tests of command line handling ***" +#echo "*** Tests of command line handling ***" >> cmdline.out +#$mpirun $args -np 2 ./cmdline a "b c" "d'e" 'f"g" h' $* > cmdline.out 2>&1 +#echo "*** Tests of command line handling ***" >> cmdline.out +#CleanExe cmdline +#if [ ! -s cmdline.stdo ] ; then +# cat >cmdline.stdo < /dev/null 2>&1 ; then + # This is a better choice than ps aux because it restricts the list of + # processes to those of the running user. The w is needed on some + # systems to get a long output for the command + PSPGM="ps -fwu $LOGNAME" +elif ps -fu $LOGNAME > /dev/null 2>&1 ; then + # This is a better choice than ps aux because it restricts the list of + # processes to those of the running user. + PSPGM="ps -fu $LOGNAME" +else + PSPGM="ps auxww" +fi +OutTime +testfiles="$testfiles aborttest.out" +rm -f aborttest.out aborttest.p1 aborttest.p2 aborttest.out2 +MakeExe aborttest +echo "*** Tests of MPI_Abort ***" +echo "*** Tests of MPI_Abort ***" >> aborttest.out +# We also remove lines that look like build lines in case this system +# is being used for other tests. This is incomplete, but +# it may help reduce false positives +$PSPGM | grep $LOGNAME | grep -v grep | grep -v runtests | \ + grep -v 'make ' | grep -v ' /ld' | grep -v 'gcc' | \ + grep -v 'collect2' > aborttest.p1 +# Send the output of aborttest to a file in case there is a problem +$mpirun $args -np 2 ./aborttest $* < /dev/null >> aborttest.out2 2>&1 +# allow some time for processes to exit +sleep 5 +$PSPGM | grep $LOGNAME | grep -v grep | grep -v runtests | \ + grep -v 'make ' | grep -v ' /ld' | grep -v 'gcc' | \ + grep -v 'collect2' > aborttest.p2 +# If there was a consistant format, we could process it ... +ndiff="`cat aborttest.p1 | wc -l` - `cat aborttest.p2 | wc -l`" +ndiff=`expr $ndiff` +if test "$ndiff" = 0 ; then + echo "All processes aborted" >> aborttest.out +else + echo "Suspicious processes remain" >> aborttest.out + #echo "Processes before" >> aborttest.out + #cat aborttest.p1 >> aborttest.out + #echo "Processes after" >> aborttest.out + #cat aborttest.p2 >> aborttest.out + echo "Differences are" >> aborttest.out + diff -b aborttest.p1 aborttest.p2 >> aborttest.out + if [ -s aborttest.out2 ] ; then + echo "Output from mpirun was" + cat aborttest.out2 >> aborttest.out + fi + # Try to kill them + $PSPGM | grep $LOGNAME | grep aborttest | awk '{ print "kill ", $2 }' | sh +fi +echo "*** Tests of MPI_Abort ***" >> aborttest.out +rm -f aborttest.p1 aborttest.p2 aborttest.out2 + +OutTime +rm -f aborttest.p1 aborttest.p2 aborttest.out2 +echo "*** Tests of MPI_Abort (alt) ***" +echo "*** Tests of MPI_Abort (alt) ***" >> aborttest.out +$PSPGM | grep $LOGNAME | grep -v grep | grep -v runtests | \ + grep -v 'make ' | grep -v ' /ld' | grep -v 'gcc' | \ + grep -v 'collect2' > aborttest.p1 +$mpirun $args -np 2 ./aborttest -altmaster $* >aborttest.out2 2>&1 +sleep 5 +$PSPGM | grep $LOGNAME | grep -v grep | grep -v runtests | \ + grep -v 'make ' | grep -v ' /ld' | grep -v 'gcc' | \ + grep -v 'collect2' > aborttest.p2 +ndiff="`cat aborttest.p1 | wc -l` - `cat aborttest.p2 | wc -l`" +ndiff=`expr $ndiff` +if test "$ndiff" = 0 ; then + echo "All processes aborted" >> aborttest.out +else + echo "Suspicious processes remain" >> aborttest.out + #echo "Processes before" >> aborttest.out + #cat aborttest.p1 >> aborttest.out + #echo "Processes after" >> aborttest.out + #cat aborttest.p2 >> aborttest.out + echo "Differences are" >> aborttest.out + diff -b aborttest.p1 aborttest.p2 >> aborttest.out + if [ -s aborttest.out2 ] ; then + echo "Output from mpirun was" + cat aborttest.out2 >> aborttest.out + fi + # Try to kill them + $PSPGM | grep $LOGNAME | grep aborttest | awk '{ print "kill ", $2 }' | sh +fi +echo "*** Tests of MPI_Abort (alt) ***" >> aborttest.out +rm -f aborttest.p1 aborttest.p2 aborttest.out2 +CleanExe aborttest + +# +# Run Fortran tests ONLY if Fortran available +if [ $have_fortran -eq "1" ] ; then + +# RunTest errstringsf 1 "*** Tests of Fortran error strings ***" + + RunTest getprocf 1 "*** Test MPI_Get_processor_name in Fortran ***" + +# RunTest errhandf 1 "*** Tests of error handling in Fortran ***" +fi + +else + # Just run checks + testfiles=*.out + if test "$testfiles" eq "*.out" ; then + echo "No output files remain from previous test!" + exit 1 + fi +fi + +# +echo '*** Checking for differences from expected output ***' +CheckAllOutput env.diff +exit 0 diff --git a/teshsuite/smpi/mpich-test/env/sigchk.c b/teshsuite/smpi/mpich-test/env/sigchk.c new file mode 100644 index 0000000000..9294a05925 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/sigchk.c @@ -0,0 +1,201 @@ +/* This file provides routines to check for the use of signals by software */ + +#include +#include +#include "test.h" +#include "mpi.h" + +/* In order to quiet noisy C compilers, we provide ANSI-style prototypes + where possible */ +int SYiCheckSig ( FILE *, int, const char * ); +int SYCheckSignals ( FILE * ); + +#ifdef HAVE_SIGACTION +int SYiCheckSig( fp, sig, signame ) +FILE *fp; +int sig; +const char *signame; +{ +static int firstmsg = 1; +struct sigaction libsig; + +sigaction( sig, NULL, &libsig); +if (libsig.sa_handler != SIG_IGN && libsig.sa_handler != SIG_DFL) { + if (firstmsg) { + firstmsg = 0; + fprintf( fp, "Some signals have been changed. This is not an error\n\ +but rather is a warning that user programs should not redefine the signals\n\ +listed here\n" ); + } + fprintf( fp, "Signal %s has been changed\n", signame ); + return 1; + } +return 0; +} +#else +int SYiCheckSig( fp, sig, signame ) +FILE *fp; +int sig; +const char *signame; +{ +void (*oldsig)(); +static int firstmsg = 1; + +oldsig = signal(sig,SIG_IGN); +if (oldsig != SIG_IGN && oldsig != SIG_DFL) { + if (firstmsg) { + firstmsg = 0; + fprintf( fp, "Some signals have been changed. This is not an error\n\ +but rather is a warning that user programs should not redefine the signals\n\ +listed here\n" ); + } + fprintf( fp, "Signal %s has been changed\n", signame ); + return 1; + } +signal(sig,oldsig); +return 0; +} +#endif + +int SYCheckSignals( fp ) +FILE *fp; +{ +int ndiff = 0; + +#ifdef SIGHUP +ndiff += SYiCheckSig( fp, SIGHUP, "SIGHUP" ); +#endif + +#ifdef SIGINT +ndiff += SYiCheckSig( fp, SIGINT, "SIGINT" ); +#endif + +#ifdef SIGQUIT +ndiff += SYiCheckSig( fp, SIGQUIT, "SIGQUIT" ); +#endif + +#ifdef SIGILL +ndiff += SYiCheckSig( fp, SIGILL, "SIGILL" ); +#endif + +#ifdef SIGTRAP +ndiff += SYiCheckSig( fp, SIGTRAP, "SIGTRAP" ); +#endif + +#ifdef SIGIOT +ndiff += SYiCheckSig( fp, SIGIOT, "SIGIOT" ); +#endif + +#ifdef SIGABRT +ndiff += SYiCheckSig( fp, SIGABRT, "SIGABRT" ); +#endif + +#ifdef SIGEMT +ndiff += SYiCheckSig( fp, SIGEMT, "SIGEMT" ); +#endif + +#ifdef SIGFPE +ndiff += SYiCheckSig( fp, SIGFPE, "SIGFPE" ); +#endif + +#ifdef SIGBUS +ndiff += SYiCheckSig( fp, SIGBUS, "SIGBUS" ); +#endif + +#ifdef SIGSEGV +ndiff += SYiCheckSig( fp, SIGSEGV, "SIGSEGV" ); +#endif + +#ifdef SIGSYS +ndiff += SYiCheckSig( fp, SIGSYS, "SIGSYS" ); +#endif + +#ifdef SIGPIPE +ndiff += SYiCheckSig( fp, SIGPIPE, "SIGPIPE" ); +#endif + +#ifdef SIGALRM +ndiff += SYiCheckSig( fp, SIGALRM, "SIGALRM" ); +#endif + +#ifdef SIGTERM +ndiff += SYiCheckSig( fp, SIGTERM, "SIGTERM" ); +#endif + +#ifdef SIGURG +ndiff += SYiCheckSig( fp, SIGURG, "SIGURG" ); +#endif + +#ifdef SIGTSTP +ndiff += SYiCheckSig( fp, SIGTSTP, "SIGTSTP" ); +#endif + +#ifdef SIGCONT +ndiff += SYiCheckSig( fp, SIGCONT, "SIGCONT" ); +#endif + +#ifdef SIGCHLD +ndiff += SYiCheckSig( fp, SIGCHLD, "SIGCHLD" ); +#endif + +#ifdef SIGTTIN +ndiff += SYiCheckSig( fp, SIGTTIN, "SIGTTIN" ); +#endif + +#ifdef SIGTTOU +ndiff += SYiCheckSig( fp, SIGTTOU, "SIGTTOU" ); +#endif + +#ifdef SIGIO +ndiff += SYiCheckSig( fp, SIGIO, "SIGIO" ); +#endif + +#ifdef SIGPOLL +ndiff += SYiCheckSig( fp, SIGPOLL, "SIGPOLL" ); +#endif + +#ifdef SIGXCPU +ndiff += SYiCheckSig( fp, SIGXCPU, "SIGXCPU" ); +#endif + +#ifdef SIGXFSZ +ndiff += SYiCheckSig( fp, SIGXFSZ, "SIGXFSZ" ); +#endif + +#ifdef SIGVTALRM +ndiff += SYiCheckSig( fp, SIGVTALRM, "SIGVTALRM" ); +#endif + +#ifdef SIGPROF +ndiff += SYiCheckSig( fp, SIGPROF, "SIGPROF" ); +#endif + +#ifdef SIGWINCH +ndiff += SYiCheckSig( fp, SIGWINCH, "SIGWINCH" ); +#endif + +#ifdef SIGLOST +ndiff += SYiCheckSig( fp, SIGLOST, "SIGLOST" ); +#endif + +#ifdef SIGUSR1 +ndiff += SYiCheckSig( fp, SIGUSR1, "SIGUSR1" ); +#endif + +#ifdef SIGUSR2 +ndiff += SYiCheckSig( fp, SIGUSR2, "SIGUSR2" ); +#endif + +return ndiff; +} + + +int main( int argc, char **argv ) +{ + int err; + MPI_Init( &argc, &argv ); + err = SYCheckSignals( stdout ); + Test_Waitforall( ); + MPI_Finalize(); + return err; +} diff --git a/teshsuite/smpi/mpich-test/env/test.c b/teshsuite/smpi/mpich-test/env/test.c new file mode 100644 index 0000000000..e1b892598f --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/test.c @@ -0,0 +1,130 @@ +/* Procedures for recording and printing test results */ + +#include +#include +#include "test.h" +#include "mpi.h" + +#if defined(USE_STDARG) +#include +#endif + +static int tests_passed = 0; +static int tests_failed = 0; +static char failed_tests[255][81]; +static char suite_name[255]; +FILE *fileout = NULL; + +void Test_Init(suite, rank) +char *suite; +int rank; +{ + char filename[512]; + + sprintf(filename, "%s-%d.out", suite, rank); + strncpy(suite_name, suite, 255); + fileout = fopen(filename, "w"); + if (!fileout) { + fprintf( stderr, "Could not open %s on node %d\n", filename, rank ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } +} + +#ifdef USE_STDARG +void Test_Printf(char *format, ...) +{ + va_list arglist; + + va_start(arglist, format); + (void)vfprintf(fileout, format, arglist); + va_end(arglist); +} +#else +void Test_Printf(va_alist) +va_dcl +{ + char *format; + va_list arglist; + + va_start(arglist); + format = va_arg(arglist, char *); + (void)vfprintf(fileout, format, arglist); + fflush(fileout); + va_end(arglist); +} +#endif + +void Test_Message(mess) +const char *mess; +{ + fprintf(fileout, "[%s]: %s\n", suite_name, mess); + fflush(fileout); +} + +void Test_Failed(test) +const char *test; +{ + fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test); + strncpy(failed_tests[tests_failed], test, 81); + fflush(fileout); + tests_failed++; +} + +void Test_Passed(test) +const char *test; +{ +#ifdef VERBOSE + fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test); + fflush(fileout); +#endif + tests_passed++; +} + +int Summarize_Test_Results() +{ +#ifdef VERBOSE + fprintf(fileout, "For test suite '%s':\n", suite_name); +#else + if (tests_failed > 0) +#endif + { + fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", + tests_passed + tests_failed, tests_passed, tests_failed); + } + if (tests_failed > 0) { + int i; + + fprintf(fileout, "*** Tests Failed:\n"); + for (i = 0; i < tests_failed; i++) + fprintf(fileout, "*** %s\n", failed_tests[i]); + } + return tests_failed; +} + +void Test_Finalize() +{ + fflush(fileout); + fclose(fileout); +} + +#include "mpi.h" +/* Wait for every process to pass through this point. This test is used + to make sure that all processes complete, and that a test "passes" because + it executed, not because it some process failed. + */ +void Test_Waitforall( ) +{ +int m, one, myrank, n; + +MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); +MPI_Comm_size( MPI_COMM_WORLD, &n ); +one = 1; +MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + +if (m != n) { + printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, + n, m ); + } +if (myrank == 0) + printf( " No Errors\n" ); +} diff --git a/teshsuite/smpi/mpich-test/env/test.h b/teshsuite/smpi/mpich-test/env/test.h new file mode 100644 index 0000000000..87bcde36ca --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/test.h @@ -0,0 +1,24 @@ +/* Header for testing procedures */ + +#ifndef _INCLUDED_TEST_H_ +#define _INCLUDED_TEST_H_ + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +void Test_Init (char *, int); +#ifdef USE_STDARG +void Test_Printf (char *, ...); +#else +/* No prototype */ +void Test_Printf(); +#endif +void Test_Message (const char *); +void Test_Failed (const char *); +void Test_Passed (const char *); +int Summarize_Test_Results (void); +void Test_Finalize (void); +void Test_Waitforall (void); + +#endif diff --git a/teshsuite/smpi/mpich-test/env/testerr.c b/teshsuite/smpi/mpich-test/env/testerr.c new file mode 100644 index 0000000000..fa6ead6830 --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/testerr.c @@ -0,0 +1,170 @@ +#include +#include "mpi.h" +/* Test error handling. This is MPICH specific */ +void Test_Send( void ); +void Test_Recv( void ); +void Test_Datatype( void ); +void Test_Errors_warn( MPI_Comm *comm, int *code, ... ); +void Test_Failed( const char * msg ); +void Test_Passed(const char * msg ); + +void Test_Errors_warn( MPI_Comm *comm, int *code, ... ) +{ + char buf[MPI_MAX_ERROR_STRING+1]; + int result_len; + static int in_handler = 0; + + if (in_handler) return; + in_handler = 1; + /* Convert code to message and print */ + MPI_Error_string( *code, buf, &result_len ); + printf( "%s\n", buf ); + in_handler = 0; +} + +static int errcount = 0; +void Test_Failed( const char * msg ) +{ + printf( "FAILED: %s\n", msg ); + errcount++; +} +void Test_Passed(const char * msg ) +{ + printf( "Passed: %s\n", msg ); +} + +int main( int argc, char *argv[] ) +{ + MPI_Errhandler TEST_ERRORS_WARN; + + MPI_Init( &argc, &argv ); + + MPI_Errhandler_create( Test_Errors_warn, &TEST_ERRORS_WARN ); + MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN); + + Test_Send(); + + Test_Recv(); + + Test_Datatype(); + + MPI_Finalize(); + + return 0; +} + +void Test_Send( void ) +{ + int buffer[100]; + int dest; + MPI_Datatype bogus_type = MPI_DATATYPE_NULL; + int myrank, size; + int large_tag, flag, small_tag; + int *tag_ubp; + + MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + dest = size - 1; + + if (MPI_Send(buffer, 20, MPI_INT, dest, + 1, MPI_COMM_NULL) == MPI_SUCCESS){ + Test_Failed("NULL Communicator Test"); + } + else + Test_Passed("NULL Communicator Test"); + + if (MPI_Send(buffer, -1, MPI_INT, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Count Test"); + } + else + Test_Passed("Invalid Count Test"); + + if (MPI_Send(buffer, 20, bogus_type, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Type Test"); + } + else + Test_Passed("Invalid Type Test"); + + small_tag = -1; + if (small_tag == MPI_ANY_TAG) small_tag = -2; + if (MPI_Send(buffer, 20, MPI_INT, dest, + small_tag, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Tag Test"); + } + else + Test_Passed("Invalid Tag Test"); + + /* Form a tag that is too large */ + MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, (void **)&tag_ubp, &flag ); + if (!flag) Test_Failed("Could not get tag ub!" ); + large_tag = *tag_ubp + 1; + if (large_tag > *tag_ubp) { + if (MPI_Send(buffer, 20, MPI_INT, dest, + -1, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Tag Test"); + } + else + Test_Passed("Invalid Tag Test"); + } + + if (MPI_Send(buffer, 20, MPI_INT, 300, + 1, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Destination Test"); + } + else + Test_Passed("Invalid Destination Test"); + + if (MPI_Send((void *)0, 10, MPI_INT, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Buffer Test (send)"); + } + else + Test_Passed("Invalid Buffer Test (send)"); +} + +void Test_Recv( void ) +{ +} + +void Test_Datatype( void ) +{ +} + +#ifdef FOO +void +ReceiverTest3() +{ + int buffer[20]; + MPI_Datatype bogus_type = MPI_DATATYPE_NULL; + MPI_Status status; + int myrank; + int *tag_ubp; + int large_tag, flag, small_tag; + + MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); + + if (myrank == 0) { + fprintf( stderr, +"There should be eight error messages about invalid communicator\n\ +count argument, datatype argument, tag, rank, buffer send and buffer recv\n" ); + } + + /* A receive test might not fail until it is triggered... */ + if (MPI_Recv((void *)0, 10, MPI_INT, src, + 15, MPI_COMM_WORLD, &status) == MPI_SUCCESS){ + Test_Failed("Invalid Buffer Test (recv)"); + } + else + Test_Passed("Invalid Buffer Test (recv)"); + + /* Just to keep things happy, see if there is a message to receive */ + { int flag, ibuf[10]; + + MPI_Iprobe( src, 15, MPI_COMM_WORLD, &flag, &status ); + if (flag) + MPI_Recv( ibuf, 10, MPI_INT, src, 15, MPI_COMM_WORLD, &status ); + } + return; +#endif diff --git a/teshsuite/smpi/mpich-test/env/timers.c b/teshsuite/smpi/mpich-test/env/timers.c new file mode 100644 index 0000000000..810cbfe80d --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/timers.c @@ -0,0 +1,54 @@ +#include +#include +#include "mpi.h" +#include "test.h" +#ifdef HAVE_WINDOWS_H +#define sleep(a_) Sleep((a_)*1000) +#include +#endif + +int main( int argc, char **argv ) +{ + int err = 0; + double t1, t2; + double tick; + int i; + + MPI_Init( &argc, &argv ); + t1 = MPI_Wtime(); + t2 = MPI_Wtime(); + if (t2 - t1 > 0.1 || t2 - t1 < 0.0) { + err++; + fprintf( stderr, + "Two successive calls to MPI_Wtime gave strange results: (%f) (%f)\n", + t1, t2 ); + } +/* Try several times to get a 1 second sleep */ + for (i = 0; i<10; i++) { + t1 = MPI_Wtime(); + sleep(1); + t2 = MPI_Wtime(); + if (t2 - t1 >= (1.0 - 0.01) && t2 - t1 <= 5.0) break; + if (t2 - t1 > 5.0) i = 9; + } + if (i == 10) { + fprintf( stderr, + "Timer around sleep(1) did not give 1 second; gave %f\n", + t2 - t1 ); + fprintf( stderr, "If the sigchk check shows that SIGALRM is in use, \n\ +this indicates only that user programs must NOT use any system call or\n\ +library that uses SIGALRM. SIGALRM is not used by MPICH but may be used\n\ +by the software the MPICH uses to implement communication to other \n\ +processes\n" ); + err++; + } + tick = MPI_Wtick(); + if (tick > 1.0 || tick <= 0.0) { + err++; + fprintf( stderr, "MPI_Wtick gave a strange result: (%f)\n", tick ); + } + Test_Waitforall( ); + MPI_Finalize( ); + + return err; +} diff --git a/teshsuite/smpi/mpich-test/env/timertest.c b/teshsuite/smpi/mpich-test/env/timertest.c new file mode 100644 index 0000000000..a77d29005b --- /dev/null +++ b/teshsuite/smpi/mpich-test/env/timertest.c @@ -0,0 +1,35 @@ +#include +#include +#include "mpi.h" +#include "test.h" +#ifdef HAVE_WINDOWS_H +#define sleep(a_) Sleep((a_)*1000) +#include +#endif + +int main( int argc, char **argv ) +{ + double t1, t2; + double tick; + int i; + + MPI_Init( &argc, &argv ); + t1 = MPI_Wtime(); + t2 = MPI_Wtime(); + fprintf( stdout, "Two successive calls to MPI_Wtime gave: (%f) (%f)\n", + t1, t2 ); + fprintf( stdout, "Five approximations to one second:\n"); + for (i = 0; i < 5; i++) + { + t1 = MPI_Wtime(); + smpi_sleep(1); + t2 = MPI_Wtime(); + fprintf( stdout, "%f seconds\n", t2 - t1 ); + } + tick = MPI_Wtick(); + fprintf( stdout, "MPI_Wtick gave: (%10.8f)\n", tick ); + + MPI_Finalize( ); + + return 0; +} diff --git a/teshsuite/smpi/mpich-test/profile/CMakeLists.txt b/teshsuite/smpi/mpich-test/profile/CMakeLists.txt new file mode 100644 index 0000000000..4170b1b65a --- /dev/null +++ b/teshsuite/smpi/mpich-test/profile/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 2.6) + +if(enable_smpi) + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + + set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1") + + include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") + + add_executable(ptest ptest.c ) + add_executable(colluses colluses.c ) + + target_link_libraries(ptest m simgrid smpi ) + target_link_libraries(colluses m simgrid smpi ) + + set_target_properties(ptest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(colluses PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/profile.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/ptest.c + ${CMAKE_CURRENT_SOURCE_DIR}/colluses.c + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + ${CMAKE_CURRENT_SOURCE_DIR}/../hostfile + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/teshsuite/smpi/mpich-test/profile/colluses.c b/teshsuite/smpi/mpich-test/profile/colluses.c new file mode 100644 index 0000000000..a76604e732 --- /dev/null +++ b/teshsuite/smpi/mpich-test/profile/colluses.c @@ -0,0 +1,81 @@ +/* + * This file checks to see if the collective routine MPI_Allreduce uses + * MPI_Send or MPI_Isend to implement the operation. It should use either + * a PMPI routine or a non-MPI routine. + */ + +#include "mpi.h" +#include + +static int used_send = 0, + used_isend = 0, + used_sendrecv = 0; +int main( int argc, char *argv[] ) +{ + int in, out; + int rank; + int in_sends[3], out_sends[3]; + + MPI_Init( &argc, &argv ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + in = 1; + MPI_Allreduce( &in, &out, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + + /* Now, see whether MPI routines were used */ + in_sends[0] = used_send; + in_sends[1] = used_isend; + in_sends[2] = used_sendrecv; + MPI_Reduce( in_sends, out_sends, 3, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD ); + if (rank == 0) { + int errs = 0; + if (in_sends[0] > 0) { + printf( " Allreduce used MPI_SEND (%d)\n", in_sends[0] ); + errs++; + } + if (in_sends[1] > 0) { + printf( " Allreduce used MPI_ISEND (%d)\n", in_sends[1] ); + errs++; + } + if (in_sends[2] > 0) { + printf( " Allreduce used MPI_SENDRECV (%d)\n", in_sends[2] ); + errs++; + } + if (!errs) { + printf( " No Errors\n" ); + } + } + + MPI_Finalize( ); + return 0; +} + +/* + * Replacements for MPI_Send, Isend, and Sendrecv that detect their use + */ + +int MPI_Send( void *buf, int count, MPI_Datatype datatype, int dest, + int tag, MPI_Comm comm ) +{ + used_send++; + return PMPI_Send( buf, count, datatype, dest, tag, comm ); +} + +int MPI_Sendrecv( void *sendbuf, int sendcount, MPI_Datatype sendtype, + int dest, int sendtag, + void *recvbuf, int recvcount, MPI_Datatype recvtype, + int source, int recvtag, MPI_Comm comm, MPI_Status *status ) +{ + used_sendrecv++; + return PMPI_Sendrecv( sendbuf, sendcount, sendtype, dest, sendtag, + recvbuf, recvcount, recvtype, source, recvtag, + comm, status ); +} + +int MPI_Isend( void *buf, int count, MPI_Datatype datatype, int dest, int tag, + MPI_Comm comm, MPI_Request *request ) +{ + used_isend++; + return PMPI_Isend( buf, count, datatype, dest, tag, comm, request ); +} + diff --git a/teshsuite/smpi/mpich-test/profile/ptest.c b/teshsuite/smpi/mpich-test/profile/ptest.c new file mode 100644 index 0000000000..672742ce5f --- /dev/null +++ b/teshsuite/smpi/mpich-test/profile/ptest.c @@ -0,0 +1,21 @@ +#include +#include "mpi.h" + +/* Header for testing procedures */ + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + * This tests for the existence of MPI_Pcontrol; nothing more. + */ +int main( int argc, char **argv ) +{ + MPI_Init( &argc, &argv ); + + MPI_Pcontrol( 0 ); + printf( "Pcontrol test passed\n" ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/profile/ptest.std b/teshsuite/smpi/mpich-test/profile/ptest.std new file mode 100644 index 0000000000..70c49f8e69 --- /dev/null +++ b/teshsuite/smpi/mpich-test/profile/ptest.std @@ -0,0 +1,3 @@ +**** Testing MPI_Pcontrol **** +Pcontrol test passed +**** Testing MPI_Pcontrol **** diff --git a/teshsuite/smpi/mpich-test/profile/runtests b/teshsuite/smpi/mpich-test/profile/runtests new file mode 100755 index 0000000000..57e8f59903 --- /dev/null +++ b/teshsuite/smpi/mpich-test/profile/runtests @@ -0,0 +1,116 @@ +#! /bin/sh +# +# Run some of the tests. If any arguments are provided, pass them to the +# test programs. +# +# -mvhome is needed for the ANL SP, and is ignored by others +args= +device= +top_srcdir=/home/degomme/Downloads/mpich-test +srcdir=/home/degomme/Downloads/mpich-test/profile +MPICH_VERSION= +STOPFILE=${MPITEST_STOPTEST:-"$HOME/.stopmpichtests"} + +MAKE="make --no-print-directory" +MPIRUNMVBACK="" +# +# Load basic procedures +. ${top_srcdir}/runbase +# +# Set mpirun to the name/path of the mpirun program +#FindMPIRUN +#if [ -z "$mpirun" ] ; then +# echo "No mpirun in path. Testing cannot proceed." +# exit 1 +#fi +# +# If the programs are not available, run make. +runtests=1 +makeeach=0 +writesummaryfile=no +quiet=0 +have_fortran=0 +check_at_once=1 +MAKE="make --no-print-directory" +for arg in "$@" ; do + case $arg in + -basedir=* ) + basedir=`echo $arg | sed 's/-basedir=//'` + ;; + -srcdir=* ) + srcdir=`echo $arg | sed 's/-srcdir=//'` + ;; + -fort=* ) + have_fortran=`echo $arg | sed 's/-fort=//'` + ;; + -checkonly) + runtests=0 + ;; + -margs=*) + margs=`echo $arg | sed 's/-margs=//'` + args="$args $margs" + ;; + -summaryfile=*) + writesummaryfile=yes + summaryfile=`echo A$arg | sed 's/A-summaryfile=//'` + ;; + -echo) + set -x + ;; + -small) + makeeach=1 + ;; + -quiet) + shift + quiet=1 + ;; + -atend) + check_at_once=0 + ;; + -help|-u) + echo "runtests [-checkonly] [-margs='...'] [-atend]" + echo "run tests in this directory. If -checkonly set, just run" + echo "the differences check (do NO rerun the test programs)." + echo "If -margs is used, these options are passed to mpirun." + echo "If -small is used, the examples are built, run, and deleted." + echo "If -atend is used, the success of the tests is checked only" + echo "at the end of the test rather than also after each test." + exit 1 + ;; + *) + if test -n "$arg" ; then + echo "Passing remaining arguments to programs ($*)" + break + fi + ;; + esac +done +mpirun=" ${basedir}/bin/smpirun -platform ${srcdir}/../../../../examples/msg/small_platform_with_routers.xml -hostfile ${srcdir}/../../hostfile --log=root.thres:critical" +# If the programs are not available, run make. +if [ ! -x sendrecv -a $makeeach = 0 -a $runtests = 1 ] ; then + $MAKE default +fi + +testfiles="" +if [ $runtests = 1 ] ; then +echo '**** Testing MPI Profiling routines ****' +#just a test for MPI_Pcontrol, which is not implemented +RunTest ptest 1 "**** Testing MPI_Pcontrol ****" + +RunTest colluses 4 "**** Testing for PMPI in Allreduce ****" + +else + # Just run checks + testfiles=`echo *.out` + if test "$testfiles" = "*.out" ; then + echo "No output files remain from previous test!" + exit 1 + fi +fi +# +echo '*** Checking for differences from expected output ***' +CheckAllOutput profile.diff +exit 0 + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt b/teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt new file mode 100644 index 0000000000..01ee3eb649 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/CMakeLists.txt @@ -0,0 +1,404 @@ +cmake_minimum_required(VERSION 2.6) + +if(enable_smpi) + set(CMAKE_C_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + set(CMAKE_Fortran_COMPILER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpiff") + set(CMAKE_Fortran_LINKER "${CMAKE_BINARY_DIR}/smpi_script/bin/smpicc") + set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") + set(MPICH_FLAGS "-DHAVE_STDLIB_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING_H=1 -DUSE_STDARG=1 -DHAVE_LONG_DOUBLE=1 -DHAVE_PROTOTYPES=1 -DHAVE_SIGNAL_H=1 -DHAVE_SIGACTION=1 -DHAVE_SLEEP=1 -DHAVE_SYSCONF=1") + + include_directories("${CMAKE_HOME_DIRECTORY}/include/smpi") + add_executable(overtake overtake.c test.c) + add_executable(bsendtest bsendtest.c test.c) + add_executable(relrank relrank.c test.c) + add_executable(sendrecv_mpich sendrecv.c test.c) + add_executable(persistent persistent.c) + add_executable(flood flood.c test.c) + add_executable(flood2 flood2.c test.c) + add_executable(persist persist.c) + add_executable(persist2 persist2.c) + add_executable(sendrecv2 sendrecv2.c dtypes.c gcomm.c) + add_executable(sendrecv3 sendrecv3.c dtypes.c gcomm.c) + add_executable(sendrecv4 sendrecv4.c dtypes.c gcomm.c) + add_executable(irsend irsend.c dtypes.c gcomm.c) + add_executable(irsendinit irsendinit.c dtypes.c gcomm.c) + add_executable(longmsgs longmsgs.c) + add_executable(testsome testsome.c dtypes.c gcomm.c) + add_executable(testall_mpich testall.c dtypes.c gcomm.c) + add_executable(sndrcv sndrcv.c dtypes.c gcomm.c) + add_executable(sndrcvrep sndrcvrep.c) + add_executable(sndrcvrpl2 sndrcvrpl2.c) + add_executable(getelm getelm.c ) + add_executable(self self.c test.c) + add_executable(typelb typelb.c test.c) + add_executable(structlb structlb.c test.c) + add_executable(typeub typeub.c test.c) + add_executable(typeub2 typeub2.c) + add_executable(typeub3 typeub3.c) + add_executable(typecreate typecreate.c) + add_executable(reqcreate reqcreate.c) + add_executable(reqfree reqfree.c) + add_executable(isndrcv isndrcv.c test.c) + add_executable(nullproc nullproc.c) + add_executable(nullproc2 nullproc2.c) + add_executable(trunc trunc.c) + add_executable(truncmult truncmult.c) + add_executable(typetest typetest.c test.c) + add_executable(typebase typebase.c) + add_executable(ssendtest ssendtest.c test.c) + add_executable(ssendtest2 ssendtest2.c) + add_executable(issendtest issendtest.c test.c) + add_executable(issend2 issend2.c) + add_executable(issendinit issendinit.c test.c) + add_executable(testtypes testtypes.c test.c) + add_executable(dataalign dataalign.c) + add_executable(dtyperecv dtyperecv.c) + add_executable(dtypelife dtypelife.c test.c) + add_executable(htmsg htmsg.c) + add_executable(isendtest isendtest.c) + add_executable(third third.c test.c) + add_executable(fourth fourth.c test.c) + add_executable(fifth fifth.c test.c) + add_executable(sixth sixth.c test.c) + add_executable(probe probe.c test.c) + add_executable(nblock nblock.c ) + add_executable(sendmany sendmany.c) + add_executable(order order.c) + add_executable(pack pack.c) + add_executable(probe1 probe1.c test.c) + add_executable(testtest1 testtest1.c test.c) + add_executable(hvectest hvectest.c test.c) + add_executable(hvectest2 hvectest2.c test.c) + add_executable(hvec hvec.c) + add_executable(hindexed hindexed.c) + add_executable(irecvtest irecvtest.c test.c) + add_executable(nbtest nbtest.c) + add_executable(waitany waitany.c) + add_executable(waitall waitall.c) + add_executable(waitall2 waitall2.c) + add_executable(waitall3 waitall3.c) + add_executable(waitall4 waitall4.c) + add_executable(commit commit.c) + add_executable(cancel cancel.c) + add_executable(cancel2 cancel2.c) + add_executable(cancel3 cancel3.c) + add_executable(cancelmessages cancelmessages.c) + add_executable(cancelibm cancelibm.c) + add_executable(cancelissend cancelissend.c) + add_executable(sendorder sendorder.c) + add_executable(exittest exittest.c) + add_executable(selfvsworld selfvsworld.c) + if(SMPI_F2C) + add_executable(secondf secondf.f) +# add_executable(allpair2 allpair2.f) +# add_executable(allpair allpair.f) + add_executable(isendf isendf.f) + add_executable(pingpong_f pingpong.f) + add_executable(send1 send1.f) + add_executable(sendfort sendfort.f) +# add_executable(structf structf.f) + add_executable(typebasef typebasef.f) + add_executable(sendcplx sendcplx.f) + endif() + + target_link_libraries(overtake m simgrid smpi ) + target_link_libraries(bsendtest m simgrid smpi ) + target_link_libraries(relrank m simgrid smpi ) + target_link_libraries(sendrecv_mpich m simgrid smpi ) + target_link_libraries(persistent m simgrid smpi ) + target_link_libraries(flood m simgrid smpi ) + target_link_libraries(flood2 m simgrid smpi ) + target_link_libraries(persist m simgrid smpi ) + target_link_libraries(persist2 m simgrid smpi ) + target_link_libraries(sendrecv2 m simgrid smpi ) + target_link_libraries(sendrecv3 m simgrid smpi ) + target_link_libraries(sendrecv4 m simgrid smpi ) + target_link_libraries(irsend m simgrid smpi ) + target_link_libraries(irsendinit m simgrid smpi ) + target_link_libraries(longmsgs m simgrid smpi ) + target_link_libraries(testsome m simgrid smpi ) + target_link_libraries(testall_mpich m simgrid smpi ) + target_link_libraries(sndrcv m simgrid smpi ) + target_link_libraries(sndrcvrep m simgrid smpi ) + target_link_libraries(sndrcvrpl2 m simgrid smpi ) + target_link_libraries(getelm m simgrid smpi ) + target_link_libraries(self m simgrid smpi ) + target_link_libraries(typelb m simgrid smpi ) + target_link_libraries(structlb m simgrid smpi ) + target_link_libraries(typeub m simgrid smpi ) + target_link_libraries(typeub2 m simgrid smpi ) + target_link_libraries(typeub3 m simgrid smpi ) + target_link_libraries(typecreate m simgrid smpi ) + target_link_libraries(reqcreate m simgrid smpi ) + target_link_libraries(reqfree m simgrid smpi ) + target_link_libraries(isndrcv m simgrid smpi ) + target_link_libraries(nullproc m simgrid smpi ) + target_link_libraries(nullproc2 m simgrid smpi ) + target_link_libraries(trunc m simgrid smpi ) + target_link_libraries(truncmult m simgrid smpi ) + target_link_libraries(typetest m simgrid smpi ) + target_link_libraries(typebase m simgrid smpi ) + target_link_libraries(ssendtest m simgrid smpi ) + target_link_libraries(ssendtest2 m simgrid smpi ) + target_link_libraries(issendtest m simgrid smpi ) + target_link_libraries(issend2 m simgrid smpi ) + target_link_libraries(issendinit m simgrid smpi ) + target_link_libraries(testtypes m simgrid smpi ) + target_link_libraries(dataalign m simgrid smpi ) + target_link_libraries(dtyperecv m simgrid smpi ) + target_link_libraries(dtypelife m simgrid smpi ) + target_link_libraries(htmsg m simgrid smpi ) + target_link_libraries(isendtest m simgrid smpi ) + target_link_libraries(third m simgrid smpi ) + target_link_libraries(fourth m simgrid smpi ) + target_link_libraries(fifth m simgrid smpi ) + target_link_libraries(sixth m simgrid smpi ) + target_link_libraries(probe m simgrid smpi ) + target_link_libraries(nblock m simgrid smpi ) + target_link_libraries(sendmany m simgrid smpi ) + target_link_libraries(order m simgrid smpi ) + target_link_libraries(pack m simgrid smpi ) + target_link_libraries(probe1 m simgrid smpi ) + target_link_libraries(testtest1 m simgrid smpi ) + target_link_libraries(hvectest m simgrid smpi ) + target_link_libraries(hvectest2 m simgrid smpi ) + target_link_libraries(hvec m simgrid smpi ) + target_link_libraries(hindexed m simgrid smpi ) + target_link_libraries(irecvtest m simgrid smpi ) + target_link_libraries(nbtest m simgrid smpi ) + target_link_libraries(waitany m simgrid smpi ) + target_link_libraries(waitall m simgrid smpi ) + target_link_libraries(waitall2 m simgrid smpi ) + target_link_libraries(waitall3 m simgrid smpi ) + target_link_libraries(waitall4 m simgrid smpi ) + target_link_libraries(commit m simgrid smpi ) + target_link_libraries(cancel m simgrid smpi ) + target_link_libraries(cancel2 m simgrid smpi ) + target_link_libraries(cancel3 m simgrid smpi ) + target_link_libraries(cancelmessages m simgrid smpi ) + target_link_libraries(cancelibm m simgrid smpi ) + target_link_libraries(cancelissend m simgrid smpi ) + target_link_libraries(sendorder m simgrid smpi ) + target_link_libraries(exittest m simgrid smpi ) + target_link_libraries(selfvsworld m simgrid smpi ) + if(SMPI_F2C) + target_link_libraries(secondf m simgrid smpi f2c) +# target_link_libraries(allpair2 m simgrid smpi f2c) +# target_link_libraries(allpair m simgrid smpi f2c) + target_link_libraries(isendf m simgrid smpi f2c) + target_link_libraries(pingpong_f m simgrid smpi f2c) + target_link_libraries(send1 m simgrid smpi f2c) + target_link_libraries(sendcplx m simgrid smpi f2c) + target_link_libraries(sendfort m simgrid smpi f2c) +# target_link_libraries(structf m simgrid smpi f2c) + target_link_libraries(typebasef m simgrid smpi f2c) + endif() + + set_target_properties(overtake PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(bsendtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(relrank PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sendrecv_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(persistent PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(flood PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(flood2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(persist PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(persist2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sendrecv2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sendrecv3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sendrecv4 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(irsend PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(irsendinit PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(longmsgs PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(testsome PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(testall_mpich PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sndrcv PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sndrcvrep PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sndrcvrpl2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(getelm PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(self PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(typelb PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(structlb PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(typeub PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(typeub2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(typeub3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(typecreate PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(reqcreate PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(reqfree PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(isndrcv PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(nullproc PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(nullproc2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(trunc PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(truncmult PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(typetest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(typebase PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(ssendtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(ssendtest2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(issendtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(issend2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(issendinit PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(testtypes PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(dataalign PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(dtyperecv PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(dtypelife PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(htmsg PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(isendtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(third PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(fourth PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(fifth PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sixth PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(probe PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(nblock PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sendmany PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(order PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(pack PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(probe1 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(testtest1 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(hvectest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(hvectest2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(hvec PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(hindexed PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(irecvtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(nbtest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(waitany PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(waitall PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(waitall2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(waitall3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(waitall4 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(commit PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(cancel PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(cancel2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(cancel3 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(cancelmessages PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(cancelibm PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(cancelissend PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sendorder PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(exittest PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(selfvsworld PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + if(SMPI_F2C) + set_target_properties(secondf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}" ) +# set_target_properties(allpair2 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}" ) +# set_target_properties(allpair PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}" ) + set_target_properties(isendf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}" ) + set_target_properties(pingpong_f PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(send1 PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sendcplx PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(sendfort PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") +# set_target_properties(structf PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + set_target_properties(typebasef PROPERTIES COMPILE_FLAGS "${MPICH_FLAGS}") + endif() +endif() + +set(tesh_files + ${tesh_files} + ${CMAKE_CURRENT_SOURCE_DIR}/coll.tesh + PARENT_SCOPE + ) +set(xml_files + ${xml_files} + PARENT_SCOPE + ) +set(examples_src + ${examples_src} + ${CMAKE_CURRENT_SOURCE_DIR}/overtake.c + ${CMAKE_CURRENT_SOURCE_DIR}/bsendtest.c + ${CMAKE_CURRENT_SOURCE_DIR}/relrank.c + ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv.c + ${CMAKE_CURRENT_SOURCE_DIR}/persistent.c + ${CMAKE_CURRENT_SOURCE_DIR}/flood.c + ${CMAKE_CURRENT_SOURCE_DIR}/flood2.c + ${CMAKE_CURRENT_SOURCE_DIR}/persist.c + ${CMAKE_CURRENT_SOURCE_DIR}/persist2.c + ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv2.c + ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv3.c + ${CMAKE_CURRENT_SOURCE_DIR}/sendrecv4.c + ${CMAKE_CURRENT_SOURCE_DIR}/irsend.c + ${CMAKE_CURRENT_SOURCE_DIR}/irsendinit.c + ${CMAKE_CURRENT_SOURCE_DIR}/longmsgs.c + ${CMAKE_CURRENT_SOURCE_DIR}/testsome.c + ${CMAKE_CURRENT_SOURCE_DIR}/testall.c + ${CMAKE_CURRENT_SOURCE_DIR}/sndrcv.c + ${CMAKE_CURRENT_SOURCE_DIR}/sndrcvrep.c + ${CMAKE_CURRENT_SOURCE_DIR}/sndrcvrpl2.c + ${CMAKE_CURRENT_SOURCE_DIR}/getelm.c + ${CMAKE_CURRENT_SOURCE_DIR}/self.c + ${CMAKE_CURRENT_SOURCE_DIR}/typelb.c + ${CMAKE_CURRENT_SOURCE_DIR}/structlb.c + ${CMAKE_CURRENT_SOURCE_DIR}/typeub.c + ${CMAKE_CURRENT_SOURCE_DIR}/typeub2.c + ${CMAKE_CURRENT_SOURCE_DIR}/typeub3.c + ${CMAKE_CURRENT_SOURCE_DIR}/typecreate.c + ${CMAKE_CURRENT_SOURCE_DIR}/reqcreate.c + ${CMAKE_CURRENT_SOURCE_DIR}/reqfree.c + ${CMAKE_CURRENT_SOURCE_DIR}/isndrcv.c + ${CMAKE_CURRENT_SOURCE_DIR}/nullproc.c + ${CMAKE_CURRENT_SOURCE_DIR}/nullproc2.c + ${CMAKE_CURRENT_SOURCE_DIR}/trunc.c + ${CMAKE_CURRENT_SOURCE_DIR}/truncmult.c + ${CMAKE_CURRENT_SOURCE_DIR}/typetest.c + ${CMAKE_CURRENT_SOURCE_DIR}/typebase.c + ${CMAKE_CURRENT_SOURCE_DIR}/ssendtest.c + ${CMAKE_CURRENT_SOURCE_DIR}/ssendtest2.c + ${CMAKE_CURRENT_SOURCE_DIR}/issendtest.c + ${CMAKE_CURRENT_SOURCE_DIR}/issend2.c + ${CMAKE_CURRENT_SOURCE_DIR}/issendinit.c + ${CMAKE_CURRENT_SOURCE_DIR}/testtypes.c + ${CMAKE_CURRENT_SOURCE_DIR}/dataalign.c + ${CMAKE_CURRENT_SOURCE_DIR}/dtyperecv.c + ${CMAKE_CURRENT_SOURCE_DIR}/dtypelife.c + ${CMAKE_CURRENT_SOURCE_DIR}/htmsg.c + ${CMAKE_CURRENT_SOURCE_DIR}/isendtest.c + ${CMAKE_CURRENT_SOURCE_DIR}/third.c + ${CMAKE_CURRENT_SOURCE_DIR}/fourth.c + ${CMAKE_CURRENT_SOURCE_DIR}/fifth.c + ${CMAKE_CURRENT_SOURCE_DIR}/sixth.c + ${CMAKE_CURRENT_SOURCE_DIR}/probe.c + ${CMAKE_CURRENT_SOURCE_DIR}/nblock.c + ${CMAKE_CURRENT_SOURCE_DIR}/sendmany.c + ${CMAKE_CURRENT_SOURCE_DIR}/order.c + ${CMAKE_CURRENT_SOURCE_DIR}/pack.c + ${CMAKE_CURRENT_SOURCE_DIR}/probe1.c + ${CMAKE_CURRENT_SOURCE_DIR}/testtest1 .c + ${CMAKE_CURRENT_SOURCE_DIR}/hvectest.c + ${CMAKE_CURRENT_SOURCE_DIR}/hvectest2.c + ${CMAKE_CURRENT_SOURCE_DIR}/hvec.c + ${CMAKE_CURRENT_SOURCE_DIR}/hindexed.c + ${CMAKE_CURRENT_SOURCE_DIR}/irecvtest.c + ${CMAKE_CURRENT_SOURCE_DIR}/nbtest.c + ${CMAKE_CURRENT_SOURCE_DIR}/waitany.c + ${CMAKE_CURRENT_SOURCE_DIR}/waitall.c + ${CMAKE_CURRENT_SOURCE_DIR}/waitall2.c + ${CMAKE_CURRENT_SOURCE_DIR}/waitall3.c + ${CMAKE_CURRENT_SOURCE_DIR}/waitall4.c + ${CMAKE_CURRENT_SOURCE_DIR}/commit.c + ${CMAKE_CURRENT_SOURCE_DIR}/cancel.c + ${CMAKE_CURRENT_SOURCE_DIR}/cancel2.c + ${CMAKE_CURRENT_SOURCE_DIR}/cancel3.c + ${CMAKE_CURRENT_SOURCE_DIR}/cancelmessages.c + ${CMAKE_CURRENT_SOURCE_DIR}/cancelibm.c + ${CMAKE_CURRENT_SOURCE_DIR}/cancelissend.c + ${CMAKE_CURRENT_SOURCE_DIR}/sendorder.c + ${CMAKE_CURRENT_SOURCE_DIR}/exittest.c + ${CMAKE_CURRENT_SOURCE_DIR}/selfvsworld.c + ${CMAKE_CURRENT_SOURCE_DIR}/test.c + ${CMAKE_CURRENT_SOURCE_DIR}/test.h + ${CMAKE_CURRENT_SOURCE_DIR}/secondf.f + ${CMAKE_CURRENT_SOURCE_DIR}/allpair2.f + ${CMAKE_CURRENT_SOURCE_DIR}/allpair.f + ${CMAKE_CURRENT_SOURCE_DIR}/isendf.f + ${CMAKE_CURRENT_SOURCE_DIR}/pingpong.f + ${CMAKE_CURRENT_SOURCE_DIR}/send1.f + ${CMAKE_CURRENT_SOURCE_DIR}/sendcplx.f + ${CMAKE_CURRENT_SOURCE_DIR}/sendfort.f + ${CMAKE_CURRENT_SOURCE_DIR}/structf.f + ${CMAKE_CURRENT_SOURCE_DIR}/typebasef.f + PARENT_SCOPE + ) +set(bin_files + ${bin_files} + ${CMAKE_CURRENT_SOURCE_DIR}/../hostfile + PARENT_SCOPE + ) +set(txt_files + ${txt_files} + PARENT_SCOPE + ) diff --git a/teshsuite/smpi/mpich-test/pt2pt/README b/teshsuite/smpi/mpich-test/pt2pt/README new file mode 100644 index 0000000000..9251e04a78 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/README @@ -0,0 +1,36 @@ +These files are meant to test the point-to-point layer of MPI. +The runtests script is now setup to use mpirun (from the toplevel util +directory. MPIRUN is installed in $PREFIX/bin if you make install). Of couse, +mpirun is still being ported to various different machines. + +All of the following programs use 2 nodes : + +Their output is generally in -.out + +sendrecv - exercises sends and receives of all basic types with + large variations in sizes of the messages sent. + +isndrcv - Same as sndrcv, but uses nonblocking pt2pt calls. + +overtake - tests that messages sent with send and isend are not + overtaking (the standard requires that they are not) + by sending a large message followed immediately by several small + ones. + +testtypes - Tests the datatypes codes by making several hairy types + that should be compatible and trying them out. + +Other test programs (which may use more than 2 nodes...) - +probe and probe1 do minor tests on MPI_probe. +hvectest tests vector sends and receives (with derived vector datatypes) +etc... + +If you need any help with these programs or find any bugs or make any +improvements, let me know. I have some improvements in mind for the testing +harness (test.[ch]), because I'm not quite perfectly happy +with it yet... :-) Enjoy. + + + Patrick Bridges + bridges@mcs.anl.gov + patrick@CS.MsState.Edu diff --git a/teshsuite/smpi/mpich-test/pt2pt/allpair.f b/teshsuite/smpi/mpich-test/pt2pt/allpair.f new file mode 100644 index 0000000000..dfd2df684a --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/allpair.f @@ -0,0 +1,767 @@ +c +c This program was inspired by a bug report from +c fsset@corelli.lerc.nasa.gov (Scott Townsend) +c The original version of this program was submitted by email to +c mpi-bugs and is in the directory mpich/bugs/ssend (not distributed +c with the distribution). This program was modified by William +c Gropp (to correct a few errors and make more consistent with the +c structure of the test programs in the examples/test/pt2pt directory. + +c A C version of this program is in allpairc.c +c + program allpair + include 'mpif.h' + integer ierr + + call MPI_Init(ierr) + + call test_pair + + call MPI_Finalize(ierr) + + end + +c------------------------------------------------------------------------------ +c +c Simple pair communication exercises. +c +c------------------------------------------------------------------------------ + subroutine test_pair + include 'mpif.h' + integer TEST_SIZE + parameter (TEST_SIZE=2000) + + integer ierr, prev, next, count, tag, index, i, outcount, + . requests(2), indices(2), rank, size, + . status(MPI_STATUS_SIZE), statuses(MPI_STATUS_SIZE,2) + integer dupcom + logical flag + real send_buf( TEST_SIZE ), recv_buf ( TEST_SIZE ) + + call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr ) + call MPI_Comm_size( MPI_COMM_WORLD, size, ierr ) + if (size .ne. 2) then + print *, 'Allpair test requires exactly 2 processes' + call MPI_Abort( MPI_COMM_WORLD, 1, ierr ) + endif +C print *, ' about to do dup' + call MPI_Comm_dup( MPI_COMM_WORLD, dupcom, ierr ) +C print *, ' did dup' + next = rank + 1 + if (next .ge. size) next = 0 + + prev = rank - 1 + if (prev .lt. 0) prev = size - 1 +c +c Normal sends +c + if (rank .eq. 0) then + print *, ' Send' + end if + + tag = 1123 + count = TEST_SIZE / 5 + + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Send(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'send and recv' ) + else + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'send and recv' ) + + call MPI_Send(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if +c +c Ready sends. Note that we must insure that the receive is posted +c before the rsend; this requires using Irecv. +c + if (rank .eq. 0) then + print *, ' Rsend' + end if + + tag = 1456 + count = TEST_SIZE / 3 + + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, + . MPI_COMM_WORLD, status, ierr ) + + call MPI_Rsend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + + call MPI_Probe(MPI_ANY_SOURCE, tag, + . MPI_COMM_WORLD, status, ierr) + + if (status(MPI_SOURCE) .ne. prev) then + print *, 'Incorrect source, expected', prev, + . ', got', status(MPI_SOURCE) + end if + + if (status(MPI_TAG) .ne. tag) then + print *, 'Incorrect tag, expected', tag, + . ', got', status(MPI_TAG) + end if + + call MPI_Get_count(status, MPI_REAL, i, ierr) + + if (i .ne. count) then + print *, 'Incorrect count, expected', count, + . ', got', i + end if + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'rsend and recv' ) + + else + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, + . MPI_COMM_WORLD, ierr ) + call MPI_Wait( requests(1), status, ierr ) + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'rsend and recv' ) + + call MPI_Send(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if +c +c Synchronous sends +c + if (rank .eq. 0) then + print *, ' Ssend' + end if + + tag = 1789 + count = TEST_SIZE / 3 + + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Iprobe(MPI_ANY_SOURCE, tag, + . MPI_COMM_WORLD, flag, status, ierr) + + if (flag) then + print *, 'Iprobe succeeded! source', status(MPI_SOURCE), + . ', tag', status(MPI_TAG) + end if + + call MPI_Ssend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + + do while (.not. flag) + call MPI_Iprobe(MPI_ANY_SOURCE, tag, + . MPI_COMM_WORLD, flag, status, ierr) + end do + + if (status(MPI_SOURCE) .ne. prev) then + print *, 'Incorrect source, expected', prev, + . ', got', status(MPI_SOURCE) + end if + + if (status(MPI_TAG) .ne. tag) then + print *, 'Incorrect tag, expected', tag, + . ', got', status(MPI_TAG) + end if + + call MPI_Get_count(status, MPI_REAL, i, ierr) + + if (i .ne. count) then + print *, 'Incorrect count, expected', count, + . ', got', i + end if + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, + $ TEST_SIZE, 'ssend and recv' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'ssend and recv' ) + + call MPI_Ssend(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if +c +c Nonblocking normal sends +c + if (rank .eq. 0) then + print *, ' Isend' + end if + + tag = 2123 + count = TEST_SIZE / 5 + + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Isend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(2), ierr) + + call MPI_Waitall(2, requests, statuses, ierr) + + call rq_check( requests, 2, 'isend and irecv' ) + + call msg_check( recv_buf, prev, tag, count, statuses(1,1), + $ TEST_SIZE, 'isend and irecv' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'isend and irecv' ) + + call MPI_Isend(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + call MPI_Wait(requests(1), status, ierr) + + call rq_check( requests(1), 1, 'isend and irecv' ) + + end if +c +c Nonblocking ready sends +c + if (rank .eq. 0) then + print *, ' Irsend' + end if + + tag = 2456 + count = TEST_SIZE / 3 + + call clear_test_data(recv_buf,TEST_SIZE) + +c +c This test needs work for comm_size > 2 +c + if (rank .eq. 0) then + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, + . MPI_BOTTOM, 0, MPI_INTEGER, next, 0, + . dupcom, status, ierr ) + + call MPI_Irsend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(2), ierr) + + index = -1 + do while (index .ne. 1) + call MPI_Waitany(2, requests, index, statuses, ierr) + end do + + call rq_check( requests(1), 1, 'irsend and irecv' ) + + call msg_check( recv_buf, prev, tag, count, statuses, + $ TEST_SIZE, 'irsend and irecv' ) + + else + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, + . MPI_BOTTOM, 0, MPI_INTEGER, next, 0, + . dupcom, status, ierr ) + + flag = .FALSE. + do while (.not. flag) + call MPI_Test(requests(1), flag, status, ierr) + end do + + call rq_check( requests, 1, 'irsend and irecv (test)' ) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'irsend and irecv' ) + + call MPI_Irsend(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + call MPI_Waitall(1, requests, statuses, ierr) + + call rq_check( requests, 1, 'irsend and irecv' ) + + end if + +c +c Nonblocking synchronous sends +c + if (rank .eq. 0) then + print *, ' Issend' + end if + + tag = 2789 + count = TEST_SIZE / 3 + + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Issend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(2), ierr) + + flag = .FALSE. + do while (.not. flag) + call MPI_Testall(2, requests, flag, statuses, ierr) +C print *, 'flag = ', flag + end do + + call rq_check( requests, 2, 'issend and irecv (testall)' ) + + call msg_check( recv_buf, prev, tag, count, statuses(1,1), + $ TEST_SIZE, 'issend and recv (testall)' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'issend and recv' ) + + call MPI_Issend(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + flag = .FALSE. + do while (.not. flag) + call MPI_Testany(1, requests(1), index, flag, + . statuses(1,1), ierr) +c print *, 'flag = ', flag + end do + + call rq_check( requests, 1, 'issend and recv (testany)' ) + + end if +c +c Persistent normal sends +c + if (rank .eq. 0) then + print *, ' Send_init' + end if + + tag = 3123 + count = TEST_SIZE / 5 + + call clear_test_data(recv_buf,TEST_SIZE) + + call MPI_Send_init(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(2), ierr) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Startall(2, requests, ierr) + call MPI_Waitall(2, requests, statuses, ierr) + + call msg_check( recv_buf, prev, tag, count, statuses(1,2), + $ TEST_SIZE, 'persistent send/recv' ) + + else + + call MPI_Start(requests(2), ierr) + call MPI_Wait(requests(2), status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + * 'persistent send/recv') + + do i = 1,count + send_buf(i) = recv_buf(i) + end do + + call MPI_Start(requests(1), ierr) + call MPI_Wait(requests(1), status, ierr) + + end if + + call MPI_Request_free(requests(1), ierr) + call MPI_Request_free(requests(2), ierr) +c +c Persistent ready sends +c + if (rank .eq. 0) then + print *, ' Rsend_init' + end if + + tag = 3456 + count = TEST_SIZE / 3 + + call clear_test_data(recv_buf,TEST_SIZE) + + call MPI_Rsend_init(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(2), ierr) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, + . MPI_COMM_WORLD, status, ierr ) + + call MPI_Startall(2, requests, ierr) + + index = -1 + + do while (index .ne. 2) + call MPI_Waitsome(2, requests, outcount, + . indices, statuses, ierr) + do i = 1,outcount + if (indices(i) .eq. 2) then + call msg_check( recv_buf, prev, tag, count, + $ statuses(1,i), TEST_SIZE, 'waitsome' ) + index = 2 + end if + end do + end do + + else + + call MPI_Start(requests(2), ierr) + + call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, + . MPI_COMM_WORLD, ierr ) + + flag = .FALSE. + do while (.not. flag) + call MPI_Test(requests(2), flag, status, ierr) + end do + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + * 'test' ) + + do i = 1,count + send_buf(i) = recv_buf(i) + end do + + call MPI_Start(requests(1), ierr) + call MPI_Wait(requests(1), status, ierr) + + end if + + call MPI_Request_free(requests(1), ierr) + call MPI_Request_free(requests(2), ierr) +c +c Persistent synchronous sends +c + if (rank .eq. 0) then + print *, ' Ssend_init' + end if + + tag = 3789 + count = TEST_SIZE / 3 + + call clear_test_data(recv_buf,TEST_SIZE) + + call MPI_Ssend_init(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(2), ierr) + + call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Startall(2, requests, ierr) + + index = -1 + do while (index .ne. 1) + call MPI_Testsome(2, requests, outcount, + . indices, statuses, ierr) + do i = 1,outcount + if (indices(i) .eq. 1) then + call msg_check( recv_buf, prev, tag, count, + $ statuses(1,i), TEST_SIZE, 'testsome' ) + index = 1 + end if + end do + end do + else + + call MPI_Start(requests(1), ierr) + + flag = .FALSE. + do while (.not. flag) + call MPI_Testany(1, requests(1), index, flag, + . statuses(1,1), ierr) + end do + call msg_check( recv_buf, prev, tag, count, statuses(1,1), + $ TEST_SIZE, 'testany' ) + + do i = 1,count + send_buf(i) = recv_buf(i) + end do + + call MPI_Start(requests(2), ierr) + call MPI_Wait(requests(2), status, ierr) + + end if + + call MPI_Request_free(requests(1), ierr) + call MPI_Request_free(requests(2), ierr) +c +c Send/receive. +c + if (rank .eq. 0) then + print *, ' Sendrecv' + end if + + tag = 4123 + count = TEST_SIZE / 5 + + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Sendrecv(send_buf, count, MPI_REAL, next, tag, + . recv_buf, count, MPI_REAL, prev, tag, + . MPI_COMM_WORLD, status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'sendrecv' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'recv/send' ) + + call MPI_Send(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if +c +c Send/receive replace. +c + if (rank .eq. 0) then + print *, ' Sendrecv_replace' + end if + + tag = 4456 + count = TEST_SIZE / 3 + + if (rank .eq. 0) then + + call init_test_data(recv_buf, TEST_SIZE) + + do 11 i = count+1,TEST_SIZE + recv_buf(i) = 0.0 + 11 continue + + call MPI_Sendrecv_replace(recv_buf, count, MPI_REAL, + . next, tag, prev, tag, + . MPI_COMM_WORLD, status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'sendrecvreplace' ) + + else + + call clear_test_data(recv_buf,TEST_SIZE) + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'recv/send for replace' ) + + call MPI_Send(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if + + call MPI_Comm_free( dupcom, ierr ) + return + end + +c------------------------------------------------------------------------------ +c +c Check for correct source, tag, count, and data in test message. +c +c------------------------------------------------------------------------------ + subroutine msg_check( recv_buf, source, tag, count, status, n, + * name ) + include 'mpif.h' + integer n + real recv_buf(n) + integer source, tag, count, rank, status(MPI_STATUS_SIZE) + character*(*) name + + integer ierr, recv_src, recv_tag, recv_count + + recv_src = status(MPI_SOURCE) + recv_tag = status(MPI_TAG) + call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr ) + call MPI_Get_count(status, MPI_REAL, recv_count, ierr) + + if (recv_src .ne. source) then + print *, '[', rank, '] Unexpected source:', recv_src, + * ' in ', name + call MPI_Abort(MPI_COMM_WORLD, 101, ierr) + end if + + if (recv_tag .ne. tag) then + print *, '[', rank, '] Unexpected tag:', recv_tag, ' in ', name + call MPI_Abort(MPI_COMM_WORLD, 102, ierr) + end if + + if (recv_count .ne. count) then + print *, '[', rank, '] Unexpected count:', recv_count, + * ' in ', name + call MPI_Abort(MPI_COMM_WORLD, 103, ierr) + end if + + call verify_test_data(recv_buf, count, n, name ) + + end +c------------------------------------------------------------------------------ +c +c Check that requests have been set to null +c +c------------------------------------------------------------------------------ + subroutine rq_check( requests, n, msg ) + include 'mpif.h' + integer n, requests(n) + character*(*) msg + integer i +c + do 10 i=1, n + if (requests(i) .ne. MPI_REQUEST_NULL) then + print *, 'Nonnull request in ', msg + endif + 10 continue +c + end +c------------------------------------------------------------------------------ +c +c Initialize test data buffer with integral sequence. +c +c------------------------------------------------------------------------------ + subroutine init_test_data(buf,n) + integer n + real buf(n) + integer i + + do 10 i = 1, n + buf(i) = REAL(i) + 10 continue + end + +c------------------------------------------------------------------------------ +c +c Clear test data buffer +c +c------------------------------------------------------------------------------ + subroutine clear_test_data(buf, n) + integer n + real buf(n) + integer i + + do 10 i = 1, n + buf(i) = 0. + 10 continue + + end + +c------------------------------------------------------------------------------ +c +c Verify test data buffer +c +c------------------------------------------------------------------------------ + subroutine verify_test_data(buf, count, n, name) + include 'mpif.h' + integer n + real buf(n) + character *(*) name + + integer count, ierr, i + + do 10 i = 1, count + if (buf(i) .ne. REAL(i)) then + print 100, buf(i), i, count, name + call MPI_Abort(MPI_COMM_WORLD, 108, ierr) + endif + 10 continue + + do 20 i = count + 1, n + if (buf(i) .ne. 0.) then + print 100, buf(i), i, n, name + call MPI_Abort(MPI_COMM_WORLD, 109, ierr) + endif + 20 continue + +100 format('Invalid data', f6.1, ' at ', i4, ' of ', i4, ' in ', a) + + end diff --git a/teshsuite/smpi/mpich-test/pt2pt/allpair.std b/teshsuite/smpi/mpich-test/pt2pt/allpair.std new file mode 100644 index 0000000000..31a1d0704c --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/allpair.std @@ -0,0 +1,13 @@ +*** Testing pt-2-pt from Fortran *** + Send + Rsend + Ssend + Isend + Irsend + Issend + Send_init + Rsend_init + Ssend_init + Sendrecv + Sendrecv_replace +*** Testing pt-2-pt from Fortran *** diff --git a/teshsuite/smpi/mpich-test/pt2pt/allpair2.f b/teshsuite/smpi/mpich-test/pt2pt/allpair2.f new file mode 100644 index 0000000000..12b91bad08 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/allpair2.f @@ -0,0 +1,809 @@ +c +c This program was inspired by a bug report from +c fsset@corelli.lerc.nasa.gov (Scott Townsend) +c The original version of this program was submitted by email to +c mpi-bugs and is in the directory mpich/bugs/ssend (not distributed +c with the distribution). This program was modified by William +c Gropp (to correct a few errors and make more consistent with the +c structure of the test programs in the examples/test/pt2pt directory. + +c A C version of this program is in allpairc.c +c +c This version is intended to test for memory leaks; it runs each test +c a number of times (TEST_COUNT + some in test_pair). +c + program allpair2 + include 'mpif.h' + integer ierr + + call MPI_Init(ierr) + + call test_pair + + call MPI_Finalize(ierr) + + end + +c------------------------------------------------------------------------------ +c +c Simple pair communication exercises. +c +c------------------------------------------------------------------------------ + subroutine test_pair + include 'mpif.h' + integer TEST_SIZE, TEST_COUNT + parameter (TEST_SIZE=2000) + parameter (TEST_COUNT=100) + + integer ierr, prev, next, count, tag, index, i, outcount, + . requests(2), indices(2), rank, size, + . status(MPI_STATUS_SIZE), statuses(MPI_STATUS_SIZE,2) + integer dupcom + integer c + logical flag + real send_buf( TEST_SIZE ), recv_buf ( TEST_SIZE ) + + call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr ) + call MPI_Comm_size( MPI_COMM_WORLD, size, ierr ) + call MPI_Comm_dup( MPI_COMM_WORLD, dupcom, ierr ) + next = rank + 1 + if (next .ge. size) next = 0 + + prev = rank - 1 + if (prev .lt. 0) prev = size - 1 +c +c Normal sends +c + if (rank .eq. 0) then + print *, ' Send' + end if + + tag = 1123 + count = TEST_SIZE / 5 + + do 111 c=1, TEST_COUNT+1 + + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Send(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'send and recv' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'send and recv' ) + + call MPI_Send(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if + 111 continue +c +c Ready sends. Note that we must ensure that the receive is posted +c before the rsend; this requires using Irecv. +c + if (rank .eq. 0) then + print *, ' Rsend' + end if + + tag = 1456 + count = TEST_SIZE / 3 + + do 112 c = 1, TEST_COUNT+2 + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, + . MPI_COMM_WORLD, status, ierr ) + + call MPI_Rsend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + + call MPI_Probe(MPI_ANY_SOURCE, tag, + . MPI_COMM_WORLD, status, ierr) + + if (status(MPI_SOURCE) .ne. prev) then + print *, 'Incorrect source, expected', prev, + . ', got', status(MPI_SOURCE) + end if + + if (status(MPI_TAG) .ne. tag) then + print *, 'Incorrect tag, expected', tag, + . ', got', status(MPI_TAG) + end if + + call MPI_Get_count(status, MPI_REAL, i, ierr) + + if (i .ne. count) then + print *, 'Incorrect count, expected', count, + . ', got', i + end if + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'rsend and recv' ) + + else + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, next, tag, + . MPI_COMM_WORLD, ierr ) + call MPI_Wait( requests(1), status, ierr ) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'rsend and recv' ) + + call MPI_Send(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if + 112 continue +c +c Synchronous sends +c + if (rank .eq. 0) then + print *, ' Ssend' + end if + + tag = 1789 + count = TEST_SIZE / 3 + + do 113 c = 1, TEST_COUNT+3 + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Iprobe(MPI_ANY_SOURCE, tag, + . MPI_COMM_WORLD, flag, status, ierr) + + if (flag) then + print *, 'Iprobe succeeded! source', status(MPI_SOURCE), + . ', tag', status(MPI_TAG) + end if + + call MPI_Ssend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + + do while (.not. flag) + call MPI_Iprobe(MPI_ANY_SOURCE, tag, + . MPI_COMM_WORLD, flag, status, ierr) + end do + + if (status(MPI_SOURCE) .ne. prev) then + print *, 'Incorrect source, expected', prev, + . ', got', status(MPI_SOURCE) + end if + + if (status(MPI_TAG) .ne. tag) then + print *, 'Incorrect tag, expected', tag, + . ', got', status(MPI_TAG) + end if + + call MPI_Get_count(status, MPI_REAL, i, ierr) + + if (i .ne. count) then + print *, 'Incorrect count, expected', count, + . ', got', i + end if + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, + $ TEST_SIZE, 'ssend and recv' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'ssend and recv' ) + + call MPI_Ssend(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if + 113 continue +c +c Nonblocking normal sends +c + if (rank .eq. 0) then + print *, ' Isend' + end if + + tag = 2123 + count = TEST_SIZE / 5 + + do 114 c = 1, TEST_COUNT+4 + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Isend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(2), ierr) + + call MPI_Waitall(2, requests, statuses, ierr) + + call rq_check( requests, 2, 'isend and irecv' ) + + call msg_check( recv_buf, prev, tag, count, statuses(1,1), + $ TEST_SIZE, 'isend and irecv' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'isend and irecv' ) + + call MPI_Isend(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + call MPI_Wait(requests(1), status, ierr) + + call rq_check( requests(1), 1, 'isend and irecv' ) + + end if + 114 continue +c +c Nonblocking ready sends +c + if (rank .eq. 0) then + print *, ' Irsend' + end if + + tag = 2456 + count = TEST_SIZE / 3 + + do 115 c = 1, TEST_COUNT+5 + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, + . MPI_BOTTOM, 0, MPI_INTEGER, next, 0, + . dupcom, status, ierr ) + + call MPI_Irsend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(2), ierr) + + index = -1 + do while (index .ne. 1) + call MPI_Waitany(2, requests, index, statuses, ierr) + end do + + call rq_check( requests(1), 1, 'irsend and irecv' ) + + call msg_check( recv_buf, prev, tag, count, statuses, + $ TEST_SIZE, 'irsend and irecv' ) + +C +C In case the send didn't complete yet. + call MPI_Waitall( 2, requests, statuses, ierr ) + + else + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0, + . MPI_BOTTOM, 0, MPI_INTEGER, next, 0, + . dupcom, status, ierr ) + + flag = .FALSE. + do while (.not. flag) + call MPI_Test(requests(1), flag, status, ierr) + end do + + call rq_check( requests, 1, 'irsend and irecv (test)' ) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'irsend and irecv' ) + + call MPI_Irsend(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + call MPI_Waitall(1, requests, statuses, ierr) + + call rq_check( requests, 1, 'irsend and irecv' ) + + end if + 115 continue +c +c Nonblocking synchronous sends +c + if (rank .eq. 0) then + print *, ' Issend' + end if + + tag = 2789 + count = TEST_SIZE / 3 + + do 116 c = 1, TEST_COUNT+6 + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Issend(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(2), ierr) + + flag = .FALSE. + do while (.not. flag) + call MPI_Testall(2, requests, flag, statuses, ierr) +C print *, 'flag = ', flag + end do + + call rq_check( requests, 2, 'issend and irecv (testall)' ) + + call msg_check( recv_buf, prev, tag, count, statuses(1,1), + $ TEST_SIZE, 'issend and recv (testall)' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'issend and recv' ) + + call MPI_Issend(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + flag = .FALSE. + do while (.not. flag) + call MPI_Testany(1, requests(1), index, flag, + . statuses(1,1), ierr) +c print *, 'flag = ', flag + end do + + call rq_check( requests, 1, 'issend and recv (testany)' ) + + end if + 116 continue +c +c Persistent normal sends +c + if (rank .eq. 0) then + print *, ' Send_init' + end if + + tag = 3123 + count = TEST_SIZE / 5 + + do 117 c = 1, TEST_COUNT+7 + call clear_test_data(recv_buf,TEST_SIZE) + + call MPI_Send_init(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(2), ierr) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Startall(2, requests, ierr) + call MPI_Waitall(2, requests, statuses, ierr) + + call msg_check( recv_buf, prev, tag, count, statuses(1,2), + $ TEST_SIZE, 'persistent send/recv' ) + + else + + call MPI_Start(requests(2), ierr) + call MPI_Wait(requests(2), status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + * 'persistent send/recv') + + do i = 1,count + send_buf(i) = recv_buf(i) + end do + + call MPI_Start(requests(1), ierr) + call MPI_Wait(requests(1), status, ierr) + + end if + + call MPI_Request_free(requests(1), ierr) + call MPI_Request_free(requests(2), ierr) + 117 continue +c +c Persistent ready sends +c Like the ready send, we must ensure that the receive is posted +c before the ready send is started. +c + if (rank .eq. 0) then + print *, ' Rsend_init' + end if + + tag = 3456 + count = TEST_SIZE / 3 + + do 118 c = 1, TEST_COUNT+8 + call clear_test_data(recv_buf,TEST_SIZE) + + call MPI_Rsend_init(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(1), ierr) + + call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(2), ierr) + +c +c receive a clear-to-go from the destination, so that the ready send +c will find the matching receive when it arrives + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, 1, 321, + $ MPI_COMM_WORLD, status, ierr ) + call MPI_Startall(2, requests, ierr) + + index = -1 + do while (index .ne. 2) + call MPI_Waitsome(2, requests, outcount, + . indices, statuses, ierr) + do i = 1,outcount + if (indices(i) .eq. 2) then + call msg_check( recv_buf, prev, tag, count, + $ statuses(1,i), TEST_SIZE, 'waitsome' ) + index = 2 + end if + end do + end do + + else + + call MPI_Start(requests(2), ierr) + +c Let the target know that is may begin the ready send + call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, 0, 321, + $ MPI_COMM_WORLD, ierr ) + + flag = .FALSE. + do while (.not. flag) + call MPI_Test(requests(2), flag, status, ierr) + end do + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + * 'test' ) + + do i = 1,count + send_buf(i) = recv_buf(i) + end do + + call MPI_Start(requests(1), ierr) + call MPI_Wait(requests(1), status, ierr) + + end if + + call MPI_Request_free(requests(1), ierr) + call MPI_Request_free(requests(2), ierr) + 118 continue +c +c Persistent synchronous sends +c + if (rank .eq. 0) then + print *, ' Ssend_init' + end if + + tag = 3789 + count = TEST_SIZE / 3 + + do 119 c = 1, TEST_COUNT+9 + call clear_test_data(recv_buf,TEST_SIZE) + + call MPI_Ssend_init(send_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, requests(2), ierr) + + call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . requests(1), ierr) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Startall(2, requests, ierr) + + index = -1 + do while (index .ne. 1) + call MPI_Testsome(2, requests, outcount, + . indices, statuses, ierr) + do i = 1,outcount + if (indices(i) .eq. 1) then + call msg_check( recv_buf, prev, tag, count, + $ statuses(1,i), TEST_SIZE, 'testsome' ) + index = 1 + end if + end do + end do + + else + + call MPI_Start(requests(1), ierr) + + flag = .FALSE. + do while (.not. flag) + call MPI_Testany(1, requests(1), index, flag, + . statuses(1,1), ierr) + end do + + call msg_check( recv_buf, prev, tag, count, statuses(1,1), + $ TEST_SIZE, 'testany' ) + + do i = 1,count + send_buf(i) = recv_buf(i) + end do + + call MPI_Start(requests(2), ierr) + call MPI_Wait(requests(2), status, ierr) + + end if + + call MPI_Request_free(requests(1), ierr) + call MPI_Request_free(requests(2), ierr) + 119 continue +c +c Send/receive. +c + if (rank .eq. 0) then + print *, ' Sendrecv' + end if + + tag = 4123 + count = TEST_SIZE / 5 + + do 120 c = 1, TEST_COUNT+10 + call clear_test_data(recv_buf,TEST_SIZE) + + if (rank .eq. 0) then + + call init_test_data(send_buf,TEST_SIZE) + + call MPI_Sendrecv(send_buf, count, MPI_REAL, next, tag, + . recv_buf, count, MPI_REAL, prev, tag, + . MPI_COMM_WORLD, status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'sendrecv' ) + + else + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'recv/send' ) + + call MPI_Send(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if + 120 continue +c +c Send/receive replace. +c + if (rank .eq. 0) then + print *, ' Sendrecv_replace' + end if + + tag = 4456 + count = TEST_SIZE / 3 + + do 121 c = 1, TEST_COUNT+11 + if (rank .eq. 0) then + + call init_test_data(recv_buf, TEST_SIZE) + + do 11 i = count+1,TEST_SIZE + recv_buf(i) = 0.0 + 11 continue + + call MPI_Sendrecv_replace(recv_buf, count, MPI_REAL, + . next, tag, prev, tag, + . MPI_COMM_WORLD, status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'sendrecvreplace' ) + + else + + call clear_test_data(recv_buf,TEST_SIZE) + + call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL, + . MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + . status, ierr) + + call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE, + . 'recv/send for replace' ) + + call MPI_Send(recv_buf, count, MPI_REAL, next, tag, + . MPI_COMM_WORLD, ierr) + end if + + 121 continue + + call MPI_Comm_free( dupcom, ierr ) + return + + end + +c------------------------------------------------------------------------------ +c +c Check for correct source, tag, count, and data in test message. +c +c------------------------------------------------------------------------------ + subroutine msg_check( recv_buf, source, tag, count, status, n, + * name ) + include 'mpif.h' + integer n + real recv_buf(n) + integer source, tag, count, rank, status(MPI_STATUS_SIZE) + character*(*) name + + integer ierr, recv_src, recv_tag, recv_count + + recv_src = status(MPI_SOURCE) + recv_tag = status(MPI_TAG) + call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr ) + call MPI_Get_count(status, MPI_REAL, recv_count, ierr) + +C Check for null status + if (recv_src .eq. MPI_ANY_SOURCE .and. + * recv_tag .eq. MPI_ANY_TAG .and. + * status(MPI_ERROR) .eq. MPI_SUCCESS) then + print *, '[', rank, '] Unexpected NULL status in ', name + call MPI_Abort( MPI_COMM_WORLD, 104, ierr ) + end if + if (recv_src .ne. source) then + print *, '[', rank, '] Unexpected source:', recv_src, + * ' in ', name + call MPI_Abort(MPI_COMM_WORLD, 101, ierr) + end if + + if (recv_tag .ne. tag) then + print *, '[', rank, '] Unexpected tag:', recv_tag, ' in ', name + call MPI_Abort(MPI_COMM_WORLD, 102, ierr) + end if + + if (recv_count .ne. count) then + print *, '[', rank, '] Unexpected count:', recv_count, + * ' in ', name + call MPI_Abort(MPI_COMM_WORLD, 103, ierr) + end if + + call verify_test_data(recv_buf, count, n, name ) + + end +c------------------------------------------------------------------------------ +c +c Check that requests have been set to null +c +c------------------------------------------------------------------------------ + subroutine rq_check( requests, n, msg ) + include 'mpif.h' + integer n, requests(n) + character*(*) msg + integer i +c + do 10 i=1, n + if (requests(i) .ne. MPI_REQUEST_NULL) then + print *, 'Nonnull request in ', msg + endif + 10 continue +c + end +c------------------------------------------------------------------------------ +c +c Initialize test data buffer with integral sequence. +c +c------------------------------------------------------------------------------ + subroutine init_test_data(buf,n) + integer n + real buf(n) + integer i + + do 10 i = 1, n + buf(i) = REAL(i) + 10 continue + end + +c------------------------------------------------------------------------------ +c +c Clear test data buffer +c +c------------------------------------------------------------------------------ + subroutine clear_test_data(buf, n) + integer n + real buf(n) + integer i + + do 10 i = 1, n + buf(i) = 0. + 10 continue + + end + +c------------------------------------------------------------------------------ +c +c Verify test data buffer +c +c------------------------------------------------------------------------------ + subroutine verify_test_data(buf, count, n, name) + include 'mpif.h' + integer n + real buf(n) + character *(*) name + + integer count, ierr, i + + do 10 i = 1, count + if (buf(i) .ne. REAL(i)) then + print 100, buf(i), i, count, name + call MPI_Abort(MPI_COMM_WORLD, 108, ierr) + endif + 10 continue + + do 20 i = count + 1, n + if (buf(i) .ne. 0.) then + print 100, buf(i), i, n, name + call MPI_Abort(MPI_COMM_WORLD, 109, ierr) + endif + 20 continue + +100 format('Invalid data', f6.1, ' at ', i4, ' of ', i4, ' in ', a) + + end diff --git a/teshsuite/smpi/mpich-test/pt2pt/allpair2.std b/teshsuite/smpi/mpich-test/pt2pt/allpair2.std new file mode 100644 index 0000000000..f1c4b3c712 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/allpair2.std @@ -0,0 +1,13 @@ +*** Testing pt-2-pt from Fortran (many calls) *** + Send + Rsend + Ssend + Isend + Irsend + Issend + Send_init + Rsend_init + Ssend_init + Sendrecv + Sendrecv_replace +*** Testing pt-2-pt from Fortran (many calls) *** diff --git a/teshsuite/smpi/mpich-test/pt2pt/bsendtest.c b/teshsuite/smpi/mpich-test/pt2pt/bsendtest.c new file mode 100644 index 0000000000..afd2eefe63 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/bsendtest.c @@ -0,0 +1,211 @@ +/* + * Program to test that the "no overtaking messages" semantics + * of point to point communications in MPI is satisfied. + * A long message is sent using MPI_BSend and received using MPI_Recv, + * followed by lots of short messages sent the same way. + * + * Patrick Bridges + * bridges@mcs.anl.gov + * patrick@CS.MsState.Edu + */ + +#include +/* Needed for malloc declaration */ +#include +#include "test.h" +#include "mpi.h" + +#define SIZE 10000 + +static int src = 0; +static int dest = 1; + +/* Which tests to perform (not yet implemented) */ +/* static int Do_Buffer = 1; */ +/* static int Do_Standard = 1; */ + +/* Prototypes for picky compilers */ +void Generate_Data ( double *, int ); +void Normal_Test_Recv ( double *, int ); +void Buffered_Test_Send ( double *, int ); +void Buffered_Test_Ibsend ( double *, int ); +int Check_Data ( double *, int ); +void Clear_Buffer ( double *, int ); + +void Generate_Data(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + + for (i = 0; i < buff_size; i++) + buffer[i] = (double)i+1; +} + +void Normal_Test_Recv(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j; + MPI_Status Stat; + double *b; + + b = buffer; + for (j = 0; j < 2; j++) { + /* Receive a long message */ + MPI_Recv(b, (buff_size/2 - 10), MPI_DOUBLE, src, + 2000, MPI_COMM_WORLD, &Stat); + b += buff_size/2 - 10; + /* Followed by 10 short ones */ + for (i = 0; i < 10; i++) { + MPI_Recv(b++, 1, MPI_DOUBLE, src, 2000, MPI_COMM_WORLD, &Stat); + } + } +} + +void Buffered_Test_Send(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j; + void *bbuffer; + int size; + + for (j = 0; j < 2; j++) { + /* send a long message */ + MPI_Bsend(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000, + MPI_COMM_WORLD); + buffer += buff_size/2 - 10; + /* Followed by 10 short ones */ + for (i = 0; i < 10; i++) + MPI_Bsend(buffer++, 1, MPI_DOUBLE, + dest, 2000, MPI_COMM_WORLD); + /* Force this set of Bsends to complete */ + MPI_Buffer_detach( &bbuffer, &size ); + MPI_Buffer_attach( bbuffer, size ); + } +} + +void Buffered_Test_Ibsend(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j; + void *bbuffer; + int size; + int cnt; + MPI_Request req[20]; + MPI_Status statuses[20]; + + for (j = 0; j < 2; j++) { + /* send a long message */ + cnt = 0; + MPI_Ibsend(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000, + MPI_COMM_WORLD, &req[cnt++]); + buffer += buff_size/2 - 10; + /* Followed by 10 short ones */ + for (i = 0; i < 10; i++) + MPI_Ibsend(buffer++, 1, MPI_DOUBLE, + dest, 2000, MPI_COMM_WORLD, &req[cnt++]); + /* Wait for these to finish (should finish immediately) */ + MPI_Waitall( cnt, req, statuses ); + + /* Force this set of Bsends to complete; this may take longer than + the Waitall */ + MPI_Buffer_detach( &bbuffer, &size ); + MPI_Buffer_attach( bbuffer, size ); + } +} + +int Check_Data(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + int err = 0; + + for (i = 0; i < buff_size; i++) + if (buffer[i] != (i + 1)) { + err++; + fprintf( stderr, "Value at %d is %f, should be %f\n", i, + buffer[i], (double)(i+1) ); + if (err > 10) return 1; + } + return err; +} + +void Clear_Buffer(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + for (i = 0; i < buff_size; i++) + buffer[i] = -1; +} + + +int main(int argc, char **argv) +{ + int rank; /* My Rank (0 or 1) */ + double buffer[SIZE], *tmpbuffer, *tmpbuf; + int tsize, bsize; + char *Current_Test = NULL; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == src) { + Generate_Data(buffer, SIZE); + MPI_Pack_size( SIZE, MPI_DOUBLE, MPI_COMM_WORLD, &bsize ); + tmpbuffer = (double *) malloc( bsize + 22*MPI_BSEND_OVERHEAD ); + if (!tmpbuffer) { + fprintf( stderr, "Could not allocate bsend buffer of size %d\n", + bsize ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + MPI_Buffer_attach( tmpbuffer, bsize + 22*MPI_BSEND_OVERHEAD ); + Buffered_Test_Send(buffer, SIZE); + Buffered_Test_Ibsend(buffer, SIZE); + MPI_Buffer_detach( &tmpbuf, &tsize ); + Test_Waitforall( ); + MPI_Finalize(); + + } else if (rank == dest) { + Test_Init("bsendtest", rank); + /* Test 3 */ + Current_Test = (char*)"Overtaking Test (Buffered Send -> Normal Receive)"; + Clear_Buffer(buffer, SIZE); + /* For Bsend */ + Normal_Test_Recv(buffer, SIZE); + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); + + /* For Ibsend */ + Current_Test = (char*)"Overtaking Test (Buffered Isend -> Normal Receive)"; + Clear_Buffer(buffer, SIZE); + Normal_Test_Recv(buffer, SIZE); + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); + + Test_Waitforall( ); + { + int rval = Summarize_Test_Results(); /* Returns number of tests; + that failed */ + Test_Finalize(); + MPI_Finalize(); + return rval; + } + } else { + fprintf(stderr, "*** This program uses exactly 2 processes! ***\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancel.c b/teshsuite/smpi/mpich-test/pt2pt/cancel.c new file mode 100644 index 0000000000..e1ca0f341f --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/cancel.c @@ -0,0 +1,117 @@ +/* + * This file shows a typical use of MPI_Cancel to free IRecv's that + * are not wanted. We check for both successful and unsuccessful + * cancels + */ + +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char **argv ) +{ + MPI_Request r1; + int size, rank; + int err = 0; + int partner, buf[10], flag; + MPI_Status status; + + MPI_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + if (size < 2) { + printf( "Cancel test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* + * Here is the test. First, we ensure an unsatisfied Irecv: + * process 0 process size-1 + * Sendrecv Sendrecv + * Irecv ---- + * Cancel ---- + * Sendrecv Sendrecv + * Next, we confirm receipt before canceling + * Irecv Send + * Sendrecv Sendrecv + * Cancel + */ + if (rank == 0) { + partner = size - 1; + /* Cancel succeeds */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Irecv( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 ); + MPI_Cancel( &r1 ); + MPI_Wait( &r1, &status ); + MPI_Test_cancelled( &status, &flag ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + if (!flag) { + err++; + printf( "Cancel of a receive failed where it should succeed.\n" ); + } + + /* Cancel fails */ + MPI_Irecv( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Cancel( &r1 ); + MPI_Test( &r1, &flag, &status ); + MPI_Test_cancelled( &status, &flag ); + /* It is technically possible for the cancel to succeed, even though + the message was (at least partially) delivered. I'm leaving + this test in since most of the MPICH devices provide this + behavior. */ + if (flag) { + err++; + printf( "Cancel of a receive succeeded where it shouldn't.\n" ); + } + + if (err) { + printf( "Test failed with %d errors.\n", err ); + } + else { + printf( " No Errors\n" ); + } + } + else if (rank == size - 1) { + partner = 0; + /* Cancel succeeds */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + /* Cancel fails */ + MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + } + + /* + Next test - check that a cancel for a request receive from + MPI_PROC_NULL succeeds (there is some suspicion that some + systems can't handle this - also, MPI_REQUEST_NULL + + Note that a null request is invalid (see the various NULL comments) + r1 = MPI_REQUEST_NULL; + MPI_Cancel( &r1 ); + */ + MPI_Irecv( buf, 10, MPI_INT, MPI_PROC_NULL, 0, MPI_COMM_WORLD, &r1 ); + MPI_Cancel( &r1 ); + + MPI_Request_free( &r1 ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancel2.c b/teshsuite/smpi/mpich-test/pt2pt/cancel2.c new file mode 100644 index 0000000000..664c20a23e --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/cancel2.c @@ -0,0 +1,230 @@ +/* + * This file shows a typical use of MPI_Cancel to free Persistent Recv's that + * are not wanted. We check for both successful and unsuccessful + * cancels + */ + +/* On 10/27/99, a test for MPI_Waitsome/MPI_Testsome was added */ + +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char **argv ) +{ + MPI_Request r1; + int size, rank; + int err = 0; + int partner, buf[10], flag, idx, index; + MPI_Status status; + + MPI_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + if (size < 2) { + printf( "Cancel test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* + * Here is the test. First, we ensure an unsatisfied Irecv: + * process 0 process size-1 + * Sendrecv Sendrecv + * Irecv ---- + * Cancel ---- + * Sendrecv Sendrecv + * Next, we confirm receipt before canceling + * Irecv Send + * Sendrecv Sendrecv + * Cancel + */ + if (rank == 0) { + partner = size - 1; + /* Cancel succeeds for wait/waitall */ + MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Start( &r1 ); + MPI_Cancel( &r1 ); + MPI_Wait( &r1, &status ); + MPI_Test_cancelled( &status, &flag ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + if (!flag) { + err++; + printf( "Cancel of a receive failed where it should succeed (Wait).\n" ); + } + + MPI_Request_free( &r1 ); + + /* Cancel fails for test/testall */ + buf[0] = -1; + MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 ); + MPI_Start( &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Cancel( &r1 ); + MPI_Test( &r1, &flag, &status ); + MPI_Test_cancelled( &status, &flag ); + if (flag) { + err++; + printf( "Cancel of a receive succeeded where it shouldn't (Test).\n" ); + if (buf[0] != -1) { + printf( "Receive buffer changed even though cancel suceeded! (Test).\n" ); + } + } + MPI_Request_free( &r1 ); + + /* Cancel succeeds for waitany */ + MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Start( &r1 ); + MPI_Cancel( &r1 ); + MPI_Waitany( 1, &r1, &idx, &status ); + MPI_Test_cancelled( &status, &flag ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + if (!flag) { + err++; + printf( "Cancel of a receive failed where it should succeed (Waitany).\n" ); + } + MPI_Request_free( &r1 ); + + /* Cancel fails for testany */ + buf[0] = -1; + MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 ); + MPI_Start( &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Cancel( &r1 ); + MPI_Testany( 1, &r1, &idx, &flag, &status ); + MPI_Test_cancelled( &status, &flag ); + if (flag) { + err++; + printf( "Cancel of a receive succeeded where it shouldn't (Testany).\n" ); + if (buf[0] != -1) { + printf( "Receive buffer changed even though cancel suceeded! (Test).\n" ); + } + } + MPI_Request_free( &r1 ); + + /* Cancel succeeds for waitsome */ + MPI_Recv_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Start( &r1 ); + MPI_Cancel( &r1 ); + MPI_Waitsome( 1, &r1, &idx, &index, &status ); + MPI_Test_cancelled( &status, &flag ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + if (!flag) { + err++; + printf( "Cancel of a receive failed where it should succeed (Waitsome).\n" ); + } + MPI_Request_free( &r1 ); + + /* Cancel fails for testsome*/ + buf[0] = -1; + MPI_Recv_init( buf, 10, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 ); + MPI_Start( &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Cancel( &r1 ); + MPI_Testsome( 1, &r1, &idx, &index, &status ); + MPI_Test_cancelled( &status, &flag ); + if (flag) { + err++; + printf( "Cancel of a receive succeeded where it shouldn't (Testsome).\n" ); + if (buf[0] != -1) { + printf( "Receive buffer changed even though cancel suceeded! (Testsome).\n" ); + } + } + MPI_Request_free( &r1 ); + + if (err) { + printf( "Test failed with %d errors.\n", err ); + } + else { + printf( " No Errors\n" ); + } + } + + else if (rank == size - 1) { + partner = 0; + /* Cancel succeeds for wait/waitall */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + /* Cancel fails for test/testall */ + buf[0] = 3; + MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + + /* Cancel succeeds for waitany */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + /* Cancel fails for testany */ + MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + + /* Cancel succeeds for waitsome */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + /* Cancel fails for waitsome */ + MPI_Send( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + + /* + Next test - check that a cancel for a request receive from + MPI_PROC_NULL succeeds (there is some suspicion that some + systems can't handle this - also, MPI_REQUEST_NULL + */ + /* A null request is an error. (null objects are errors unless otherwise + allowed) + r1 = MPI_REQUEST_NULL; + MPI_Cancel( &r1 ); + */ + MPI_Recv_init( buf, 10, MPI_INT, MPI_PROC_NULL, 0, MPI_COMM_WORLD, &r1 ); + MPI_Start( &r1 ); + MPI_Cancel( &r1 ); + MPI_Request_free( &r1 ); /* Must complete cancel. We know that it + won't complete, so we don't need to do + anything else */ + } + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancel3.c b/teshsuite/smpi/mpich-test/pt2pt/cancel3.c new file mode 100644 index 0000000000..c6a84e7435 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/cancel3.c @@ -0,0 +1,217 @@ +/* + * This file shows a typical use of MPI_Cancel to free Persistent Send's that + * are not wanted. We check for both successful and unsuccessful + * cancels + */ + +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char **argv ) +{ + MPI_Request r1; + int size, rank; + int err = 0; + int partner, buf[10], flag, idx, index; + MPI_Status status; + + MPI_Init( &argc, &argv ); + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + if (size < 2) { + printf( "Cancel test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* + * Here is the test. First, we ensure an unsatisfied Irecv: + * process 0 process size-1 + * Sendrecv Sendrecv + * Irecv ---- + * Cancel ---- + * Sendrecv Sendrecv + * Next, we confirm receipt before canceling + * Irecv Send + * Sendrecv Sendrecv + * Cancel + */ + if (rank == 0) { + partner = size - 1; + /* Cancel succeeds for wait/waitall */ + MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Start( &r1 ); + MPI_Cancel( &r1 ); + MPI_Wait( &r1, &status ); + MPI_Test_cancelled( &status, &flag ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + if (!flag) { + err++; + printf( "Cancel of a send failed where it should succeed (Wait).\n" ); + } + MPI_Request_free( &r1 ); + + /* Cancel fails for test/testall */ + buf[0] = 3; + MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 ); + MPI_Start( &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Cancel( &r1 ); + MPI_Test( &r1, &flag, &status ); + MPI_Test_cancelled( &status, &flag ); + if (flag) { + err++; + printf( "Cancel of a send succeeded where it shouldn't (Test).\n" ); + } + MPI_Request_free( &r1 ); + + /* Cancel succeeds for waitany */ + MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Start( &r1 ); + MPI_Cancel( &r1 ); + MPI_Waitany( 1, &r1, &idx, &status ); + MPI_Test_cancelled( &status, &flag ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + if (!flag) { + err++; + printf( "Cancel of a send failed where it should succeed (Waitany).\n" ); + } + MPI_Request_free( &r1 ); + + /* Cancel fails for testany */ + buf[0] = 3; + MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 ); + MPI_Start( &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Cancel( &r1 ); + MPI_Testany( 1, &r1, &idx, &flag, &status ); + MPI_Test_cancelled( &status, &flag ); + if (flag) { + err++; + printf( "Cancel of a send succeeded where it shouldn't (Testany).\n" ); + } + MPI_Request_free( &r1 ); + + /* Cancel succeeds for waitsome */ + MPI_Send_init( buf, 10, MPI_INT, partner, 0, MPI_COMM_WORLD, &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Start( &r1 ); + MPI_Cancel( &r1 ); + MPI_Waitsome( 1, &r1, &idx, &index, &status ); + MPI_Test_cancelled( &status, &flag ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + if (!flag) { + err++; + printf( "Cancel of a send failed where it should succeed (Waitsome).\n" ); + } + MPI_Request_free( &r1 ); + + /* Cancel fails for testsome*/ + buf[0] = 3; + MPI_Send_init( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &r1 ); + MPI_Start( &r1 ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Cancel( &r1 ); + MPI_Testsome( 1, &r1, &idx, &index, &status ); + MPI_Test_cancelled( &status, &flag ); + if (flag) { + err++; + printf( "Cancel of a send succeeded where it shouldn't (Testsome).\n" ); + } + MPI_Request_free( &r1 ); + + if (err) { + printf( "Test failed with %d errors.\n", err ); + } + else { + printf( " No Errors\n" ); + } + } + else if (rank == size - 1) { + partner = 0; + /* Cancel succeeds for wait/waitall */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + + /* Cancel fails for test/testall */ + buf[0] = -1; + MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + + if (buf[0] == -1) { + printf( "Receive buffer did not change even though cancel should not have suceeded! (Test).\n" ); + } + + /* Cancel succeeds for waitany */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + /* Cancel fails for testany */ + buf[0] = -1; + MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + if (buf[0] == -1) { + printf( "Receive buffer did not change even though cancel should not have suceeded! (Testany).\n" ); + } + + /* Cancel succeeds for waitsome */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + /* Cancel fails for testsome */ + buf[0] = -1; + MPI_Recv( buf, 3, MPI_INT, partner, 2, MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_BOTTOM, 0, MPI_INT, partner, 1, + MPI_COMM_WORLD, &status ); + + if (buf[0] == -1) { + printf( "Receive buffer did not change even though cancel should not have suceeded! (Test).\n" ); + } + + } + + MPI_Finalize(); + return 0; +} + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancelibm.c b/teshsuite/smpi/mpich-test/pt2pt/cancelibm.c new file mode 100644 index 0000000000..3f83a525ce --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/cancelibm.c @@ -0,0 +1,146 @@ +/**************************************************************************** + + MESSAGE PASSING INTERFACE TEST CASE SUITE + + Copyright IBM Corp. 1995 + + IBM Corp. hereby grants a non-exclusive license to use, copy, modify, and + distribute this software for any purpose and without fee provided that the + above copyright notice and the following paragraphs appear in all copies. + + IBM Corp. makes no representation that the test cases comprising this + suite are correct or are an accurate representation of any standard. + + In no event shall IBM be liable to any party for direct, indirect, special + incidental, or consequential damage arising out of the use of this software + even if IBM Corp. has been advised of the possibility of such damage. + + IBM CORP. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS AND IBM + CORP. HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + ENHANCEMENTS, OR MODIFICATIONS. + + **************************************************************************** + + These test cases reflect an interpretation of the MPI Standard. They are + are, in most cases, unit tests of specific MPI behaviors. If a user of any + test case from this set believes that the MPI Standard requires behavior + different than that implied by the test case we would appreciate feedback. + + Comments may be sent to: + Richard Treumann + treumann@kgn.ibm.com + + **************************************************************************** +*/ +#include +#include "mpi.h" + +int main(int argc, char *argv[]) +{ + int me, tasks, data, flag; + int err0 = 0; + int err1 = 0; + int errs, toterrs; + MPI_Request request; + MPI_Status status; + + MPI_Init(&argc,&argv); + MPI_Comm_rank(MPI_COMM_WORLD,&me); + MPI_Comm_size(MPI_COMM_WORLD,&tasks); + + if (tasks < 2) { + printf( "Cancel test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + { int data[100000]; if (me == 0) + { + MPI_Irecv(data, 1, MPI_INT, 1, 1, MPI_COMM_WORLD,&request); + MPI_Cancel(&request); + MPI_Wait(&request,&status); + MPI_Test_cancelled(&status,&flag); + if (!flag) { + err0++; + printf("task %d ERROR: Receive request not cancelled!\n", me); + } + + MPI_Issend(data, 100000, MPI_INT, 1, 1, MPI_COMM_WORLD,&request); + MPI_Cancel(&request); + for (flag = 0;; ) + { + MPI_Test(&request,&flag,&status); + if (flag) break; + } + + MPI_Test_cancelled(&status,&flag); + if (!flag) { + err0++; + printf("task %d ERROR: Send request not cancelled! (1)\n", me); + } + }} + + if (me == 0) + { + data = 5; + MPI_Isend(&data, 1, MPI_INT, 1, 1, MPI_COMM_WORLD,&request); + MPI_Cancel(&request); + MPI_Wait(&request,&status); + MPI_Test_cancelled(&status,&flag); + if (!flag) { + err0++; + printf("task %d ERROR: Send request not cancelled! (2)\n", me); + } + MPI_Barrier(MPI_COMM_WORLD); + status.MPI_TAG=MPI_SUCCESS; + data = 6; + MPI_Send(&data, 1, MPI_INT, 1, 5, MPI_COMM_WORLD); + + data = 7; + MPI_Isend(&data, 1, MPI_INT, 1, 1, MPI_COMM_WORLD,&request); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Cancel(&request); + MPI_Wait(&request,&status); + MPI_Test_cancelled(&status,&flag); + if (flag) { + err0++; + printf("task %d ERROR: Send request cancelled!\n", me); + } + } + else if (me == 1) + { + MPI_Barrier(MPI_COMM_WORLD); + data = 0; + MPI_Recv(&data, 1, MPI_INT, 0, 1, MPI_COMM_WORLD,&status); + if (data != 7) { + err1++; + printf("task %d ERROR: Send request not cancelled!\n", me); + } + + MPI_Recv(&data, 1, MPI_INT, 0, 5, MPI_COMM_WORLD,&status); + if (data != 6) { + err1++; + printf("task %d ERROR: Send request not cancelled!\n", me); + } + MPI_Barrier(MPI_COMM_WORLD); + } + else { + /* These are needed when the size of MPI_COMM_WORLD > 2 */ + MPI_Barrier( MPI_COMM_WORLD ); + MPI_Barrier( MPI_COMM_WORLD ); + } + + errs = err0 + err1; + MPI_Reduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD ); + + if ( errs ) { + printf( "Test failed with %d errors.\n", errs ); + } + if (me == 0 && toterrs == 0) { + printf( " No Errors\n" ); + } + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancelissend.c b/teshsuite/smpi/mpich-test/pt2pt/cancelissend.c new file mode 100644 index 0000000000..277fb735af --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/cancelissend.c @@ -0,0 +1,160 @@ +/**************************************************************************** + + MESSAGE PASSING INTERFACE TEST CASE SUITE + + Copyright IBM Corp. 1995 + + IBM Corp. hereby grants a non-exclusive license to use, copy, modify, and + distribute this software for any purpose and without fee provided that the + above copyright notice and the following paragraphs appear in all copies. + + IBM Corp. makes no representation that the test cases comprising this + suite are correct or are an accurate representation of any standard. + + In no event shall IBM be liable to any party for direct, indirect, special + incidental, or consequential damage arising out of the use of this software + even if IBM Corp. has been advised of the possibility of such damage. + + IBM CORP. SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS AND IBM + CORP. HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, + ENHANCEMENTS, OR MODIFICATIONS. + + **************************************************************************** + + These test cases reflect an interpretation of the MPI Standard. They are + are, in most cases, unit tests of specific MPI behaviors. If a user of any + test case from this set believes that the MPI Standard requires behavior + different than that implied by the test case we would appreciate feedback. + + Comments may be sent to: + Richard Treumann + treumann@kgn.ibm.com + + **************************************************************************** +*/ +/* + * WDG - July 6, 2004 + * + * This is a modified version that: + * Uses a shorter message (in case the implementation uses eager delivery + * even with synchronous send) + * Allows control of which process is executing the Issend and which the + * receive (to simplify debugging) + */ +#include +#include "mpi.h" + +int main(int argc, char *argv[]) +{ + int me, tasks, data, flag; + int err0 = 0; + int err1 = 0; + int errs, toterrs; + int master = 1, worker = 0; + MPI_Request request; + MPI_Status status; + + MPI_Init(&argc,&argv); + MPI_Comm_rank(MPI_COMM_WORLD,&me); + MPI_Comm_size(MPI_COMM_WORLD,&tasks); + + if (tasks < 2) { + printf( "Cancel test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* The original test sent 10000 elements with Issend. This + one uses less data but keeps the array the same size */ + { int data[100000]; if (me == master) + { + MPI_Irecv(data, 1, MPI_INT, worker, 1, MPI_COMM_WORLD,&request); + MPI_Cancel(&request); + MPI_Wait(&request,&status); + MPI_Test_cancelled(&status,&flag); + if (!flag) { + err0++; + printf("task %d ERROR: Receive request not cancelled!\n", me); + } + + /* This is short enough to use eager but because it is + a Synchronous send, it must still be possible to + cancel it, even when it is a short message */ + MPI_Issend(data, 100, MPI_INT, worker, 1, MPI_COMM_WORLD,&request); + MPI_Cancel(&request); + for (flag = 0;; ) + { + MPI_Test(&request,&flag,&status); + if (flag) break; + } + + MPI_Test_cancelled(&status,&flag); + if (!flag) { + err0++; + printf("task %d ERROR: Send request not cancelled! (1)\n", me); + } + }} + + if (me == master) + { + data = 5; + MPI_Isend(&data, 1, MPI_INT, worker, 1, MPI_COMM_WORLD,&request); + MPI_Cancel(&request); + MPI_Wait(&request,&status); + MPI_Test_cancelled(&status,&flag); + if (!flag) { + err0++; + printf("task %d ERROR: Send request not cancelled! (2)\n", me); + } + MPI_Barrier(MPI_COMM_WORLD); + status.MPI_TAG=MPI_SUCCESS; + data = 6; + MPI_Send(&data, 1, MPI_INT, worker, 5, MPI_COMM_WORLD); + + MPI_Isend(&data, 1, MPI_INT, worker, 1, MPI_COMM_WORLD,&request); + MPI_Barrier(MPI_COMM_WORLD); + MPI_Cancel(&request); + MPI_Wait(&request,&status); + MPI_Test_cancelled(&status,&flag); + if (flag) { + err0++; + printf("task %d ERROR: Send request cancelled!\n", me); + } + } + else if (me == worker) + { + MPI_Barrier(MPI_COMM_WORLD); + data = 0; + MPI_Recv(&data, 1, MPI_INT, master, 1, MPI_COMM_WORLD,&status); + if (data != 6) { + err1++; + printf("task %d ERROR: Send request not cancelled!\n", me); + } + + MPI_Recv(&data, 1, MPI_INT, master, 5, MPI_COMM_WORLD,&status); + if (data != 6) { + err1++; + printf("task %d ERROR: Send request not cancelled!\n", me); + } + MPI_Barrier(MPI_COMM_WORLD); + } + else { + /* These are needed when the size of MPI_COMM_WORLD > 2 */ + MPI_Barrier( MPI_COMM_WORLD ); + MPI_Barrier( MPI_COMM_WORLD ); + } + + errs = err0 + err1; + MPI_Reduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD ); + + if ( errs ) { + printf( "Test failed with %d errors.\n", errs ); + } + if (me == 0 && toterrs == 0) { + printf( " No Errors\n" ); + } + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/cancelmessages.c b/teshsuite/smpi/mpich-test/pt2pt/cancelmessages.c new file mode 100644 index 0000000000..6ca255ba10 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/cancelmessages.c @@ -0,0 +1,171 @@ +/* + * This file tests to see if short,eager,and rndv messages can all be + * successfully cancelled. If they cannot be cancelled, then the + * program still must successfully complete. + */ + +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char *argv[] ) +{ + + double sbuf[20000]; +#ifdef FOO + double rbuf[20000]; +#endif + int rank; + int n, flag, size; + int err = 0; + int verbose = 0; + MPI_Status status; + MPI_Request req; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + if (size < 2) { + printf( "Cancel test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* Short Message Test */ + n = 200; + + if (rank == 1) { /* begin if rank = 1 */ + MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req ); + MPI_Cancel(&req); + MPI_Wait(&req, &status); + MPI_Test_cancelled(&status, &flag); + if (!flag) { + err++; + printf( "Cancelling a short message failed where it should succeed.\n" ); + } + else if (verbose) + { + printf("Cancelling a short message succeeded.\n"); + } + } /* end if rank == 1 */ + +#ifdef FOO +/* Note that MPI-2 specifies that status.MPI_ERROR is only set by + multiple completion (e.g., MPI_Waitsome) and not by test_cancelled. +*/ + MPI_Barrier(MPI_COMM_WORLD); + + if (rank == 0) { /* begin if rank == 0 */ + MPI_Recv( rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &status); + } /* end if rank = 0 */ + else if (rank == 1) { /* begin if rank = 1 */ + MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req ); + MPI_Cancel(&req); + MPI_Wait(&req, &status); + MPI_Test_cancelled(&status, &flag); + if (!flag && status.MPI_ERROR != MPI_SUCCESS) { + err++; + printf( "Cancel of a send returned an error in the status field.\n" ); + } + /* end if status.MPI_ERROR */ + } /* end if rank == 1 */ +#endif + + MPI_Barrier(MPI_COMM_WORLD); + + /* Eager Message Test */ + n = 3000; + + if (rank == 1) { /* begin if rank = 1 */ + MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req ); + MPI_Cancel(&req); + MPI_Wait(&req, &status); + MPI_Test_cancelled(&status, &flag); + if (!flag) { + err++; + printf( "Cancelling an eager message (3000 doubles) failed where it should succeed.\n" ); + } + else if (verbose) + { + printf("Cancelling an eager message (3000 doubles) succeeded.\n"); + } + } /* end if rank == 1 */ + +#ifdef FOO + MPI_Barrier(MPI_COMM_WORLD); + + if (rank == 0) { /* begin if rank == 0 */ + MPI_Irecv(rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &req ); + MPI_Wait( &req, &status); + } /* end if rank = 0 */ + else if (rank == 1) { /* begin if rank = 1 */ + MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req ); + MPI_Cancel(&req); + MPI_Wait(&req, &status); + MPI_Test_cancelled(&status, &flag); + if (!flag && status.MPI_ERROR != MPI_SUCCESS) { + err++; + printf( "Cancel of a send returned an error in the status field.\n" ); + } + /* end if status.MPI_ERROR */ + } /* end if rank == 1 */ +#endif + + MPI_Barrier(MPI_COMM_WORLD); + + /* Rndv Message Test */ + n = 20000; + + if (rank == 1) { /* begin if rank = 1 */ + MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req ); + MPI_Cancel(&req); + MPI_Wait(&req, &status); + MPI_Test_cancelled(&status, &flag); + if (!flag) { + err++; + printf( "Cancelling a rendezvous message failed (20000 doubles) where it should succeed.\n" ); + } + else if (verbose) + { + printf("Cancelling an rendezvous message (20000 doubles) succeeded.\n"); + } + } /* end if rank == 1 */ + +#ifdef FOO + MPI_Barrier(MPI_COMM_WORLD); + + if (rank == 0) { /* begin if rank == 0 */ + MPI_Irecv(rbuf, n, MPI_DOUBLE, 1, 1, MPI_COMM_WORLD, &req ); + MPI_Wait( &req, &status); + } /* end if rank = 0 */ + else if (rank == 1) { /* begin if rank = 1 */ + MPI_Isend( sbuf, n, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, &req ); + MPI_Cancel(&req); + MPI_Wait(&req, &status); + MPI_Test_cancelled(&status, &flag); + if (!flag && status.MPI_ERROR != MPI_SUCCESS) { + err++; + printf( "Cancel of a send returned an error in the status field.\n" ); + } + /* end if status.MPI_ERROR */ + } /* end if rank == 1 */ +#endif + + MPI_Barrier(MPI_COMM_WORLD); + + if (rank == 1) { /* begin if rank = 1 */ + if (err) { + printf( "Test failed with %d errors.\n", err ); + } + else { + printf( " No Errors\n" ); + } + } + + MPI_Finalize( ); + + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/commit.c b/teshsuite/smpi/mpich-test/pt2pt/commit.c new file mode 100644 index 0000000000..09570f0f95 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/commit.c @@ -0,0 +1,86 @@ +/* + * This is a test of Type_commit. This checks to see if Type_commit + * (or Type_struct) replaces a struct with a contiguous type, and + * that that type is constructed correctly. + */ + +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char **argv ) +{ + int nsize, n2size; + MPI_Aint nlb, nub, n2lb, n2ub; + MPI_Datatype ntype, n2type; + MPI_Aint displs[2]; + MPI_Datatype types[2]; + int blockcounts[2]; + double myarray[10]; + int err = 0; + + MPI_Init( &argc, &argv ); + + MPI_Address( &myarray[0], &displs[0] ); + MPI_Address( &myarray[3], &displs[1] ); + blockcounts[0] = 3; + blockcounts[1] = 1; + displs[1] = displs[1] - displs[0]; + displs[0] = 0; + types[0] = MPI_DOUBLE; + types[1] = MPI_DOUBLE; + MPI_Type_struct( 2, blockcounts, displs, types, &ntype ); + MPI_Type_commit( &ntype ); + + MPI_Type_size( ntype, &nsize ); + MPI_Type_lb( ntype, &nlb ); + MPI_Type_ub( ntype, &nub ); + + if (nlb != 0) { + err++; + printf( "LB for struct is %d\n", (int)nlb ); + } + if (nub != 4 * sizeof(double)) { + err++; + printf( "UB for struct is %d != %d\n", (int)nub, + 4 * (int)sizeof(double) ); + } + if (nsize != 4 * sizeof(double)) { + err++; + printf( "Size for struct %d != %d\n", nsize, 4 * (int)sizeof(double) ); + } + + MPI_Type_contiguous( 3, ntype, &n2type ); + MPI_Type_commit( &n2type ); + + MPI_Type_size( n2type, &n2size ); + MPI_Type_lb( n2type, &n2lb ); + MPI_Type_ub( n2type, &n2ub ); + + if (n2size != 3 * nsize) { + err++; + printf( "Size of contig type %d != %d\n", n2size, 3*nsize ); + } + if (n2lb != 0) { + err++; + printf( "LB for contig is %d\n", (int)n2lb ); + } + if (n2ub != 3 * nub) { + err++; + printf( "UB for contig %d != %d\n", (int)n2ub, 3 * (int)nub ); + } + + if (err) { + printf( "Found %d errors\n", err ); + } + else { + printf( " No Errors\n" ); + } + MPI_Type_free( &ntype ); + MPI_Type_free( &n2type ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/dataalign.c b/teshsuite/smpi/mpich-test/pt2pt/dataalign.c new file mode 100644 index 0000000000..a04bd9a55a --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/dataalign.c @@ -0,0 +1,105 @@ +#include "test.h" +#include +#include "mpi.h" +#include + + +int main( int argc, char *argv[]) +{ + struct a { int i; + char c; + } s[10], s1[10]; + int j; + int errs = 0, toterrs; + int rank, size, tsize; + MPI_Aint text; + int blens[2]; + MPI_Aint disps[2]; + MPI_Datatype bases[2]; + MPI_Datatype str, con; + MPI_Status status; + + MPI_Init( &argc, &argv ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + for( j = 0; j < 10; j ++ ) { + s[j].i = j + rank; + s[j].c = j + rank + 'a'; + } + + blens[0] = blens[1] = 1; + disps[0] = 0; disps[1] = sizeof(int); + bases[0] = MPI_INT; bases[1] = MPI_CHAR; + MPI_Type_struct( 2, blens, disps, bases, &str ); + MPI_Type_commit( &str ); + MPI_Type_contiguous( 10, str, &con ); + MPI_Type_commit( &con ); + MPI_Type_size( con, &tsize ); + MPI_Type_extent( con, &text ); + +#ifdef DEBUG + printf("Size of MPI array is %d, extent is %d\n", tsize, text ); +#endif + +#ifdef DEBUG + { + void * p1, *p2; + p1 = s; + p2 = &(s[10].i); /* This statement may fail on some systems */ + printf("C array starts at %p and ends at %p for a length of %d\n", + s, &(s[9].c), (char *)p2-(char *)p1 ); + } +#endif + MPI_Type_extent( str, &text ); +#ifdef DEBUG + MPI_Type_size( str, &tsize ); + printf("Size of MPI struct is %d, extent is %d\n", tsize, (int)text ); + printf("Size of C struct is %d\n", sizeof(struct a) ); +#endif + if (text != sizeof(struct a)) { + printf( "Extent of struct a (%d) does not match sizeof (%d)\n", + (int)text, (int)sizeof(struct a) ); + errs++; + } + + MPI_Send( s, 1, con, rank ^ 1, 0, MPI_COMM_WORLD ); + MPI_Recv( s1, 1, con, rank ^ 1, 0, MPI_COMM_WORLD, &status ); + + for( j = 0; j < 10; j++ ) { +#ifdef DEBUG + printf("%d Sent: %d %c, Got: %d %c\n", rank, + s[j].i, s[j].c, s1[j].i, s1[j].c ); +#endif + if ( s1[j].i != j + status.MPI_SOURCE ) { + errs++; + printf( "Got s[%d].i = %d; expected %d\n", j, s1[j].i, + j + status.MPI_SOURCE ); + } + if ( s1[j].c != 'a' + j + status.MPI_SOURCE ) { + errs++; + /* If the character is not a printing character, + this can generate an file that diff, for example, + believes is a binary file */ + if (isprint( (int)(s1[j].c) )) { + printf( "Got s[%d].c = %c; expected %c\n", j, s1[j].c, + j + status.MPI_SOURCE + 'a'); + } + else { + printf( "Got s[%d].c = %x; expected %c\n", j, (int)s1[j].c, + j + status.MPI_SOURCE + 'a'); + } + } + } + + MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (rank == 0) { + if (toterrs > 0) printf( "Found %d errors\n", toterrs ); + else printf( " No Errors\n" ); + } + MPI_Type_free( &str ); + MPI_Type_free( &con ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/dtypelife.c b/teshsuite/smpi/mpich-test/pt2pt/dtypelife.c new file mode 100644 index 0000000000..baa3d117af --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/dtypelife.c @@ -0,0 +1,84 @@ +/* + * Program to test that datatypes that are freed with MPI_TYPE_FREE + * are not actually deleted until communication that they are a part of + * has completed. + * + */ + +#include +#include "test.h" +#include "mpi.h" + +#define SIZE 10000 +static int src = 1; +static int dest = 0; + +/* Prototypes for picky compilers */ +void Generate_Data ( int *, int ); + +void Generate_Data(buffer, buff_size) +int *buffer; +int buff_size; +{ + int i; + + for (i = 0; i < buff_size; i++) + buffer[i] = i+1; +} + +int main( int argc, char **argv) +{ + int rank; /* My Rank (0 or 1) */ + int tag, count, i, errcnt = 0; + MPI_Request handle; + double data[100]; + MPI_Status status; + MPI_Datatype rowtype; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + tag = 2001; + count = 1; + for (i = 0; i < 100; i++) + data[i] = i; + MPI_Type_vector( 10, 1, 10, MPI_DOUBLE, &rowtype ); + MPI_Type_commit( &rowtype ); + if (rank == src) { + MPI_Irecv(data, count, rowtype, dest, tag, MPI_COMM_WORLD, + &handle ); + MPI_Type_free( &rowtype ); + MPI_Recv( (void *)0, 0, MPI_INT, dest, tag+1, + MPI_COMM_WORLD, &status ); + MPI_Wait( &handle, &status ); + /* Check for correct data */ + for (i = 0; i < 10; i++) if (data[i*10] != i*10) { + errcnt++; + fprintf( stderr, + "[%d](rcv row-row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 10.0*i ); + } + + } else if (rank == dest) { + MPI_Send( (void *)0, 0, MPI_INT, src, tag+1, MPI_COMM_WORLD ); + /* By using an Ssend first, we make sure that the Irecv doesn't + match until after the type has been freed */ + MPI_Isend( data, count, rowtype, src, tag, MPI_COMM_WORLD, + &handle ); + MPI_Type_free( &rowtype ); + MPI_Wait( &handle, &status ); + } + + i = errcnt; + MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (errcnt > 0) { + printf( "Found %d errors in the run\n", errcnt ); + } + Test_Waitforall( ); + MPI_Finalize(); + + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/dtyperecv.c b/teshsuite/smpi/mpich-test/pt2pt/dtyperecv.c new file mode 100644 index 0000000000..a65e484edd --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/dtyperecv.c @@ -0,0 +1,61 @@ + +/* +> so, my second question: +> +> 2. what is the output of that MPI program? +> +> i think it should be 42 -1 42 -1. +> +> but compiling with mpich-1.1.0 an running on solaris machines +> (ch_p4) writes : 42 -1 42 0. +> +> thanks, +> Holger +> +> MPI code: +> ------------------------------------------------------- +*/ +#include "test.h" +#include +#include +#include "mpi.h" + +int main( int argc, char **argv ) +{ + int my_rank, i, data[6]; + MPI_Status status; + MPI_Datatype my_type; + int errs = 0, toterrs; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); + + MPI_Type_vector(2, 1, 2, MPI_INT, &my_type); + MPI_Type_commit(&my_type); + + if (my_rank == 0) { + data[0]=42;data[1]=42; + MPI_Send(&(data[0]), 2, MPI_INT, 1, 42, MPI_COMM_WORLD); + } else { + for (i=0; i<6; i++) + data[i] = -1; + MPI_Recv(&(data[0]), 2, my_type, 0, 42, MPI_COMM_WORLD, &status); + /* Check for correct receipt */ + if (data[0] != 42 || data[1] != -1 || data[2] != 42 || data[3] != -1 + || data[4] != -1 || data[5] != -1) { + errs++; + for (i=0; i<4; i++) + printf("%i ",data[i]); + printf("\n"); + } + } + MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (my_rank == 0) { + if (toterrs > 0) printf( "Found %d errors\n", toterrs ); + else printf( " No Errors\n" ); + } + + MPI_Type_free( &my_type ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/dtypes.c b/teshsuite/smpi/mpich-test/pt2pt/dtypes.c new file mode 100644 index 0000000000..efcd4a0625 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/dtypes.c @@ -0,0 +1,343 @@ +/* This file contains code to generate a variety of MPI datatypes for testing + the various MPI routines. + + To simplify the test code, this generates an array of datatypes, buffers with + data and buffers with no data (0 bits) for use in send and receive + routines of various types. + + In addition, this doesn't even test all of the possibilities. For example, + there is currently no test of sending more than one item defined with + MPI_Type_contiguous . + + This routine should be extended as time permits. + + Note also that this test assumes that the sending and receive types are + the same. MPI requires only that the type signatures match, which is + a weaker requirement. + + THIS CODE IS FROM mpich/tsuite AND SHOULD BE CHANGED THERE ONLY + */ + +#include "mpi.h" +#include +#include +#include "dtypes.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* Change this to test only the basic, predefined types */ +static int basic_only = 0; + +/* + Arrays types, inbufs, outbufs, and counts are allocated by the + CALLER. n on input is the maximum number; on output, it is the + number defined . + names contains a string identifying the test + + See AllocateForData below for a routine to allocate these arrays. + + We may want to add a routine to call to check that the proper data + has been received. + */ +/* TYPECNT is the number of instances of each type in a test */ +#define TYPECNT 10 +#define SETUPBASICTYPE(mpi,c,name) { int i; c *a; \ +if (cnt > *n) {*n = cnt; return; }\ +types[cnt] = mpi; \ +inbufs[cnt] = (void *)calloc( TYPECNT,sizeof(c) ); \ +outbufs[cnt] = (void *)malloc( sizeof(c) * TYPECNT ); \ +a = (c *)inbufs[cnt]; for (i=0; i *n) {*n = cnt; return; }\ +MPI_Type_contiguous( TYPECNT, mpi, types + cnt );\ +MPI_Type_commit( types + cnt );\ +inbufs[cnt] = (void *)calloc( TYPECNT, sizeof(c) ); \ +outbufs[cnt] = (void *)malloc( sizeof(c) * TYPECNT ); \ +a = (c *)inbufs[cnt]; for (i=0; i *n) {*n = cnt; return; }\ +MPI_Type_vector( TYPECNT, 1, STRIDE, mpi, types + cnt );\ +MPI_Type_commit( types + cnt );\ +inbufs[cnt] = (void *)calloc( sizeof(c) * TYPECNT * STRIDE,1); \ +outbufs[cnt] = (void *)calloc( sizeof(c) * TYPECNT * STRIDE,1); \ +a = (c *)inbufs[cnt]; for (i=0; i *n) {*n = cnt; return; }\ +lens = (int *)malloc( TYPECNT * sizeof(int) ); \ +disp = (int *)malloc( TYPECNT * sizeof(int) ); \ +for (i=0; i *n) {*n = cnt; return; }\ +MPI_Type_struct( 3, cnts, disp, b, types + cnt );\ +MPI_Type_commit( types + cnt );\ +inbufs[cnt] = (void *)calloc( sizeof(struct name) * TYPECNT,1); \ +outbufs[cnt] = (void *)calloc( sizeof(struct name) * TYPECNT,1); \ +a = (struct name *)inbufs[cnt]; for (i=0; i 1 */ +#define SETUPSTRUCTTYPEUB(mpi,c,name) { int i; c *a; \ +int blens[2]; MPI_Aint disps[2]; MPI_Datatype mtypes[2]; \ +if (cnt > *n) {*n = cnt; return; }\ +blens[0] = 1; blens[1] = 1; disps[0] = 0; disps[1] = STRIDE * sizeof(c); \ +mtypes[0] = mpi; mtypes[1] = MPI_UB; \ +MPI_Type_struct( 2, blens, disps, mtypes, types + cnt );\ +MPI_Type_commit( types + cnt );\ +inbufs[cnt] = (void *)calloc( sizeof(c) * TYPECNT * STRIDE,1); \ +outbufs[cnt] = (void *)calloc( sizeof(c) * TYPECNT * STRIDE,1); \ +a = (c *)inbufs[cnt]; for (i=0; i= nbasic_types) + MPI_Type_free( types + i ); + } + free( inbufs ); + free( outbufs ); + free( names ); + free( counts ); + free( bytesize ); +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/dtypes.h b/teshsuite/smpi/mpich-test/pt2pt/dtypes.h new file mode 100644 index 0000000000..7aabe29b91 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/dtypes.h @@ -0,0 +1,13 @@ +#ifndef MPITEST_DTYPES +#define MPITEST_DTYPES + +void GenerateData ( MPI_Datatype *, void **, void **, int *, int *, + char **, int * ); +void AllocateForData ( MPI_Datatype **, void ***, void ***, + int **, int **, char ***, int * ); +int CheckData ( void *, void *, int ); +int CheckDataAndPrint ( void *, void *, int, char *, int ); +void FreeDatatypes ( MPI_Datatype *, void **, void **, + int *, int *, char **, int ); +void BasicDatatypesOnly( void ); +#endif diff --git a/teshsuite/smpi/mpich-test/pt2pt/exittest.c b/teshsuite/smpi/mpich-test/pt2pt/exittest.c new file mode 100644 index 0000000000..09f4c92e95 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/exittest.c @@ -0,0 +1,78 @@ + +/* + A report was made that this program hung on a 2 processor LINUX cluster. + We haven't seen that problem, but since this does test whether process 0 + waits for the other processes to complete before exiting, it is a good + test to have. + */ +#include +#include "mpi.h" +#define MAX_NUM_PROCS 10 + +int main( int argc, char *argv[]) +{ + int idx; + int num_procs,my_id; + int s; + int r; + MPI_Status status; + + MPI_Init(&argc,&argv); + MPI_Comm_size(MPI_COMM_WORLD,&num_procs); + MPI_Comm_rank(MPI_COMM_WORLD,&my_id); + + if (num_procs < 3) + { + fprintf(stderr, "Need at least 3 processes for this bug\n"); + MPI_Finalize(); + return 0; + } + +#ifdef DEBUG + fprintf(stderr, "%d Starting ....\n", my_id); + fflush(stderr); +#endif + + if (my_id == 1) + { + idx = 2; + s = 333; +#ifdef DEBUG + fprintf(stdout, "%d start send (%d) to %d\n", my_id, s, idx); + fflush(stdout); +#endif + MPI_Send(&s, 1, MPI_INT, idx, 0, MPI_COMM_WORLD); +#ifdef DEBUG + fprintf(stdout, "%d finished send to %d\n", my_id, idx); + fflush(stdout); +#endif + } + + if (my_id == 2) + { + idx = 1; +#ifdef DEBUG + fprintf(stdout, "%d start recv from %d\n", my_id, idx); + fflush(stdout); +#endif + MPI_Recv (&r, 1, MPI_INT, idx, 0, MPI_COMM_WORLD, &status ); +#ifdef DEBUG + fprintf(stdout, "%d finished recv (%d) from %d\n", my_id, r, idx); + fflush(stdout); +#endif + } + +#ifdef DBUG + fprintf(stdout, "%d Done ....\n",my_id); + fflush(stdout); +#endif + MPI_Barrier( MPI_COMM_WORLD ); + if (my_id == 0) { + /* If we reach here, we're done */ + printf( " No Errors\n" ); + } + + MPI_Finalize(); + return 0; +} + diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/README b/teshsuite/smpi/mpich-test/pt2pt/fairness/README new file mode 100644 index 0000000000..61bb15e73d --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/fairness/README @@ -0,0 +1,3 @@ +These are programs to test the fairness of mpi. +On some underlying devices, you don't want to know the +results... diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness-euih.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness-euih.c new file mode 100644 index 0000000000..332cc05237 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness-euih.c @@ -0,0 +1,80 @@ +/* + * Program to test the fairness of the MPI implementation over source. + * All of the programs wait on a barrier, then node 0 starts receiving + * small messages using ANY_SOURCE from all of the other nodes who + * send as much as they can. Node 0 collects statistics on the rate + * messages are received from each source. (Every N messages it + * prints out what percentage of the last N received were from each + * source. It does this for times. + * + * This program should be run with at least 8 nodes just to be (un)fair + * + * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu + */ + +#include +#include "test.h" +#define MPG 200 +#define MSZ 1 + +int +main(argc, argv) +int argc; +char **argv; +{ + int rank, size, an_int[MSZ]; + int dummy[4], d1, d2; + char *Current_Test = NULL; + int *num_array, i, j; + int dontcare, allgrp; + + /* Initialize the environment */ + mp_environ(&size,&rank); + + /* Get allgrp from the task */ + d1 = 4; d2 = 3; + mp_task_query(dummy,&d1,&d2); + allgrp = dummy[3]; + dontcare = dummy[0]; + + Test_Init("fairness", rank); + + /* Wait for everyone to be ready */ + if (rank == 0) { + /* Initialize an array to keep statistics in */ + num_array = (int *)malloc((size - 1) * sizeof(int)); + + mp_sync(&allgrp); + + for (i = 0; i < size - 1; i++) { + /* Clear the buffer of counts */ + memset(num_array, 0, (size - 1) * sizeof(int)); + for (j = 0; j < MPG; j++) { + d1 = sizeof(int)*MSZ; + d2 = 2000; + mp_brecv(an_int, &d1, &dontcare, &d2); + num_array[d1 - 1]++; + } + Test_Printf("Statistics for message group %d:\n", i + 1); + for (j = 0; j < size -1 ; j++) + Test_Printf("%f%% of last %d messages received \ +were from source %d.\n", + num_array[j]*100.0/MPG, MPG, j + 1); + } + free(num_array); + (void)Summarize_Test_Results(); + } else { + mp_sync(&allgrp); + for (i = 0; i < MPG; i++) { + int d3, d4; + + d1 = MSZ*sizeof(int); + d2 = 0; + d3 = 2000; + d4 = 0; + mp_bend(an_int, &d1, &d2, &d3, &d4); + } + } + + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness.c new file mode 100644 index 0000000000..804162e9b0 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness.c @@ -0,0 +1,72 @@ +/* + * Program to test the fairness of the MPI implementation over source. + * All of the programs wait on a barrier, then node 0 starts receiving + * small messages using ANY_SOURCE from all of the other nodes who + * send as much as they can. Node 0 collects statistics on the rate + * messages are received from each source. (Every N messages it + * prints out what percentage of the last N received were from each + * source. It does this for times. + * + * This program should be run with at least 8 nodes just to be (un)fair + * + * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu + */ + +#include +#include "test.h" +#include "mpi.h" +#define MPG 200 +#define MSZ 1 +int main(argc, argv) +int argc; +char **argv; +{ + int rank, size, an_int[MSZ]; + char *Current_Test = NULL; + int *num_array, i, j; + MPI_Status Status; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + Test_Init("fairness", rank); + + /* Wait for everyone to be ready */ + + if (rank == 0) { + /* Initialize an array to keep statistics in */ + num_array = (int *)malloc((size - 1) * sizeof(int)); + + MPI_Barrier(MPI_COMM_WORLD); + + for (i = 0; i < size - 1; i++) { + /* Clear the buffer of counts */ + memset(num_array, 0, (size - 1) * sizeof(int)); + for (j = 0; j < MPG; j++) { + MPI_Recv(an_int, MSZ, MPI_INT, MPI_ANY_SOURCE, 2000, + MPI_COMM_WORLD, &Status); + num_array[Status.MPI_SOURCE - 1]++; + } + Test_Printf("Statistics for message group %d:\n", i + 1); + for (j = 0; j < size -1 ; j++) + Test_Printf("%f%% of last %d messages received \ +were from source %d.\n", + num_array[j]*100.0/MPG, MPG, j + 1); + } + free(num_array); + (void)Summarize_Test_Results(); + MPI_Finalize(); + + } else { + MPI_Barrier(MPI_COMM_WORLD); + for (i = 0; i < MPG; i++) { + MPI_Send(an_int, MSZ, MPI_INT, 0, 2000, MPI_COMM_WORLD); + } + MPI_Finalize(); + } + + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2.c new file mode 100644 index 0000000000..5e295d528b --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2.c @@ -0,0 +1,87 @@ +/* + * This program should be run with at least 8 nodes just to (un)fair + * + * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu + */ + +#include +#include "test.h" +#include "mpi.h" + +int main(argc, argv) +int argc; +char **argv; +{ + int rank, size, an_int; + char *Current_Test = NULL; + int *num_array, i, j; + MPI_Status Status; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + Test_Init("fairness2", rank); + + /* Wait for everyone to be ready */ + + if (rank == 0) { + /* Initialize an array to keep statistics in */ + num_array = (int *)malloc((size - 1) * sizeof(int)); + + /* Make sure everyone is ready */ + MPI_Barrier(MPI_COMM_WORLD); + + /* Wait for all of the senders to send all of their messages */ + Test_Message("Waiting for all of the senders to say they're through."); + for (i = 0 ; i < size - 1; i++) + MPI_Recv(&an_int, 1, MPI_INT, MPI_ANY_SOURCE, 5000, + MPI_COMM_WORLD, &Status); + + Test_Message("Starting to dequeue messages..."); + /* Now start dequeuing messages */ + for (i = 0; i < size - 1; i++) { + /* Clear the buffer of counts */ + memset(num_array, 0, (size - 1) * sizeof(int)); + for (j = 0; j < 200; j++) { + MPI_Recv(&an_int, 1, MPI_INT, MPI_ANY_SOURCE, 2000, + MPI_COMM_WORLD, &Status); + num_array[Status.MPI_SOURCE - 1]++; + } + Test_Printf("Statistics for message group %d:\n", i + 1); + for (j = 0; j < size -1 ; j++) + Test_Printf("%f%% of last 200 messages received \ +were from source %d.\n", + num_array[j]/2.0, j + 1); + } + + free(num_array); + (void)Summarize_Test_Results(); + MPI_Finalize(); + + } else { + MPI_Request ReqArray[200]; + MPI_Status StatArray[200]; + + MPI_Barrier(MPI_COMM_WORLD); + an_int = rank; + + Test_Message("About to send all of the little messages."); + /* Send 200 tiny messages - nonblocking so we don't deadlock */ + for (i = 0; i < 200; i++) + MPI_Isend(&an_int, 1, MPI_INT, 0, 2000, MPI_COMM_WORLD, + &ReqArray[i]); + + Test_Message("Sending the final message."); + /* Tell receiver we've sent all of our messages */ + MPI_Send(&an_int, 1, MPI_INT, 0, 5000, MPI_COMM_WORLD); + Test_Message("Waiting on the nonblocking requests."); + MPI_Waitall(200,ReqArray,StatArray); + (void)Summarize_Test_Results(); + MPI_Finalize(); + } + + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2m.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2m.c new file mode 100644 index 0000000000..706a95d564 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairness2m.c @@ -0,0 +1,99 @@ +/* + * This program should be run with at least 8 nodes just to (un)fair + * + * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu + */ + +#include +#include "test.h" +#include "mpi.h" +#include "mpe.h" + +int main(argc, argv) +int argc; +char **argv; +{ + int rank, size, an_int; + char *Current_Test = NULL; + int *num_array, i, j; + MPI_Status Status; + + MPI_Init(&argc, &argv); + MPE_Init_log(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + Test_Init("fairness2m", rank); + + /* Wait for everyone to be ready */ + + if (rank == 0) { + /* Initialize an array to keep statistics in */ + num_array = (int *)malloc((size - 1) * sizeof(int)); + + /* Make sure everyone is ready */ + MPI_Barrier(MPI_COMM_WORLD); + + /* Wait for all of the senders to send all of their messages */ + Test_Message("Waiting for all of the senders to say they're through."); + for (i = 0 ; i < size - 1; i++) { + MPI_Recv(&an_int, 1, MPI_INT, MPI_ANY_SOURCE, 5000, + MPI_COMM_WORLD, &Status); + MPE_Log_receive(Status.MPI_SOURCE, 5000, sizeof(int)); + } + Test_Message("Starting to dequeue messages..."); + /* Now start dequeuing messages */ + for (i = 0; i < size - 1; i++) { + /* Clear the buffer of counts */ + memset(num_array, 0, (size - 1) * sizeof(int)); + for (j = 0; j < 200; j++) { + MPI_Recv(&an_int, 1, MPI_INT, MPI_ANY_SOURCE, 2000, + MPI_COMM_WORLD, &Status); + MPE_Log_receive(Status.MPI_SOURCE, 2000, sizeof(int)); + num_array[Status.MPI_SOURCE - 1]++; + } + Test_Printf("Statistics for message group %d:\n", i + 1); + for (j = 0; j < size -1 ; j++) + Test_Printf("%f%% of last 200 messages received \ +were from source %d.\n", + num_array[j]/2.0, j + 1); + } + + free(num_array); + (void)Summarize_Test_Results(); + + MPE_Finish_log("/home/bridges/fairness2.log"); + MPI_Finalize(); + + } else { + MPI_Request ReqArray[200]; + MPI_Status StatArray[200]; + + MPI_Barrier(MPI_COMM_WORLD); + an_int = rank; + + Test_Message("About to send all of the little messages."); + /* Send 200 tiny messages - nonblocking so we don't deadlock */ + for (i = 0; i < 200; i++) { + MPI_Isend(&an_int, 1, MPI_INT, 0, 2000, MPI_COMM_WORLD, + &ReqArray[i]); + MPE_Log_send(0, 2000, sizeof(int)); + } + Test_Message("Sending the final message."); + /* Tell receiver we've sent all of our messages */ + MPI_Send(&an_int, 1, MPI_INT, 0, 5000, MPI_COMM_WORLD); + MPE_Log_send(0, 5000, sizeof(int)); + + Test_Message("Waiting on the nonblocking requests."); + MPI_Waitall(200,ReqArray,StatArray); + (void)Summarize_Test_Results(); + + MPE_Finish_log("/home/bridges/fairness2.log"); + MPI_Finalize(); + } + + return 0; +} + + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/fairness/fairnessm.c b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairnessm.c new file mode 100644 index 0000000000..709d08a894 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/fairness/fairnessm.c @@ -0,0 +1,79 @@ +/* + * Program to test the fairness of the MPI implementation over source. + * All of the programs wait on a barrier, then node 0 starts receiving + * small messages using ANY_SOURCE from all of the other nodes who + * send as much as they can. Node 0 collects statistics on the rate + * messages are received from each source. (Every N messages it + * prints out what percentage of the last N received were from each + * source. It does this for times. + * + * This program should be run with at least 8 nodes just to be (un)fair + * + * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu + */ + +#include +#include "test.h" +#include "mpi.h" +#include "mpe.h" +#define MPG 25 +#define MSZ 1 + +int main(argc, argv) +int argc; +char **argv; +{ + int rank, size, an_int[MSZ]; + char *Current_Test = NULL; + int *num_array, i, j; + MPI_Status Status; + + MPI_Init(&argc, &argv); + MPE_Init_log(); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + Test_Init("fairnessm", rank); + + /* Wait for everyone to be ready */ + + if (rank == 0) { + /* Initialize an array to keep statistics in */ + num_array = (int *)malloc((size - 1) * sizeof(int)); + MPID_SetRecvDebugFlag(1); + MPI_Barrier(MPI_COMM_WORLD); + + for (i = 0; i < size - 1; i++) { + /* Clear the buffer of counts */ + memset(num_array, 0, (size - 1) * sizeof(int)); + for (j = 0; j < MPG; j++) { + MPI_Recv(an_int, MSZ, MPI_INT, MPI_ANY_SOURCE, 2000, + MPI_COMM_WORLD, &Status); + MPE_Log_receive(Status.MPI_SOURCE, 2000, MSZ * sizeof(int)); + num_array[Status.MPI_SOURCE - 1]++; + } + Test_Printf("Statistics for message group %d:\n", i + 1); + for (j = 0; j < size -1 ; j++) + Test_Printf("%f%% of last %d messages received \ +were from source %d.\n", + num_array[j]/2.0, MPG, j + 1); + } + free(num_array); + (void)Summarize_Test_Results(); + MPE_Finish_log("/home/bridges/fairness.log"); + MPI_Finalize(); + + } else { + MPI_Barrier(MPI_COMM_WORLD); + for (i = 0; i < MPG; i++) { + MPI_Send(an_int, MSZ, MPI_INT, 0, 2000, MPI_COMM_WORLD); + MPE_Log_send(0, 2000, MSZ * sizeof(int)); + } + MPE_Finish_log("/home/bridges/fairness.log"); + MPI_Finalize(); + } + + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/fifth.c b/teshsuite/smpi/mpich-test/pt2pt/fifth.c new file mode 100644 index 0000000000..d06c907405 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/fifth.c @@ -0,0 +1,54 @@ +#include +#include "mpi.h" +#include "test.h" + +int main( int argc, char **argv ) +{ + int rank, np, data = 777; + MPI_Request handle[4]; + MPI_Status status[4]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &np ); + + if (np < 4) { + MPI_Finalize(); + printf( "4 processors or more required, %d done\n", rank ); + return(1); + } + + if (rank == 0) { + MPI_Isend( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle[0] ); + MPI_Irecv( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle[1] ); + MPI_Isend( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle[2] ); + MPI_Irecv( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle[3] ); + MPI_Waitall ( 4, handle, status ); + } + else if (rank == 1) { + MPI_Irecv( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle[0] ); + MPI_Isend( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle[1] ); + MPI_Isend( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle[2] ); + MPI_Irecv( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle[3] ); + MPI_Waitall ( 4, handle, status ); + } + else if (rank == 2) { + MPI_Isend( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle[0] ); + MPI_Irecv( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle[1] ); + MPI_Irecv( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle[2] ); + MPI_Isend( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle[3] ); + MPI_Waitall ( 4, handle, status ); + } + else if (rank == 3) { + MPI_Irecv( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle[0] ); + MPI_Isend( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle[1] ); + MPI_Irecv( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle[2] ); + MPI_Isend( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle[3] ); + MPI_Waitall ( 4, handle, status ); + } + Test_Waitforall( ); + MPI_Finalize(); + return(0); +} + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/flood.c b/teshsuite/smpi/mpich-test/pt2pt/flood.c new file mode 100644 index 0000000000..ae25bcea86 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/flood.c @@ -0,0 +1,254 @@ +#include "mpi.h" +#include +#include +#include "test.h" + +#define MAX_REQ 16 +#define DEF_MAX_MSG 2000000 +/* + This program tests a flood of data for both unexpected and expected messages to test any internal message fragmentation or protocol shifts + + An optional argument can change the maximum message size. For example, use + flood 9000000 + to stress the memory system (the size is the number of ints, not bytes) + */ + +void SetupData ( int *, int, int ); +void SetupRdata ( int *, int ); +int CheckData ( int *, int, int, MPI_Status * ); + +#ifdef VERBOSE +static int verbose = 1; +#else +static int verbose = 0; +#endif + +int main( int argc, char **argv ) +{ + MPI_Comm comm; + MPI_Request r[MAX_REQ]; + MPI_Status s[MAX_REQ]; + int msgsize, maxmsg, root, i, size, rank, err = 0, toterr; + int max_msg_size = DEF_MAX_MSG; + int *sbuf, *rbuf; + + MPI_Init( &argc, &argv ); + + comm = MPI_COMM_WORLD; + + MPI_Comm_size( comm, &size ); + MPI_Comm_rank( comm, &rank ); + + if (size < 2) { + printf( "This test requires at least 2 processors\n" ); + MPI_Abort( comm, 1 ); + } + + /* Check for a max message argument */ + if (rank == 0) { + if (argc > 1) { + max_msg_size = atoi( argv[1] ); + /* Correct if unrecognized argument */ + if (max_msg_size <= 0) max_msg_size = DEF_MAX_MSG; + } + } + MPI_Bcast( &max_msg_size, 1, MPI_INT, 0, MPI_COMM_WORLD ); + + /* First, try large blocking sends to root */ + root = 0; + + msgsize = 128; + maxmsg = max_msg_size; + if (rank == root && verbose) printf( "Blocking sends: " ); + while (msgsize < maxmsg) { + if (rank == root) { + if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); } + rbuf = (int *)malloc( msgsize * sizeof(int) ); + if (!rbuf) { + printf( "Could not allocate %d words\n", msgsize ); + MPI_Abort( comm, 1 ); + } + for (i=0; i +#include +#include "test.h" + +#define MAX_REQ 32 +#define MAX_MSG_CNT 32000 +#define MAX_MSG 2048 +/* + This program tests a flood of data of short messages to test handling + of both incoming messages and internal message queues + */ + +void SetupData ( int *, int, int ); +void SetupRdata ( int *, int ); +int CheckData ( int *, int, int, MPI_Status * ); + +#ifdef VERBOSE +static int verbose = 1; +#else +static int verbose = 0; +#endif + + +int main( int argc, char **argv ) +{ + MPI_Comm comm; + MPI_Request r[MAX_REQ]; + MPI_Status s[MAX_REQ]; + int msgsize, maxmsg, root, i, j, size, rank, err = 0, msgcnt, toterr; + int *sbuf, *rbuf; + + MPI_Init( &argc, &argv ); + + comm = MPI_COMM_WORLD; + + MPI_Comm_size( comm, &size ); + MPI_Comm_rank( comm, &rank ); + + if (size < 2) { + printf( "This test requires at least 2 processors\n" ); + MPI_Abort( comm, 1 ); + } + + /* First, try large blocking sends to root */ + root = 0; + + maxmsg = MAX_MSG; + msgsize = 128; + msgcnt = MAX_MSG_CNT; + if (rank == root && verbose) printf( "Blocking sends: " ); + while (msgsize <= maxmsg) { + if (rank == root) { + if (verbose) { printf( "%d ", msgsize ); fflush( stdout ); } + rbuf = (int *)malloc( msgsize * sizeof(int) ); + if (!rbuf) { + printf( "Could not allocate %d words\n", msgsize ); + MPI_Abort( comm, 1 ); + } + for (i=0; i +#include "mpi.h" +#include "test.h" + +int main( int argc, char **argv ) +{ + int rank, np, data = 777; + MPI_Request handle; + MPI_Status status; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &np ); + + if (np < 4) { + MPI_Finalize(); + printf( "4 processors or more required, %d done\n", rank ); + return(1); + } + + if (rank == 0) { + MPI_Isend( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Irecv( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Isend( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Irecv( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + } + else if (rank == 1) { + MPI_Irecv( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Isend( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Isend( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Irecv( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + } + else if (rank == 2) { + MPI_Isend( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Irecv( &data, 1, MPI_INT, 3, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Irecv( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Isend( &data, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + } + else if (rank == 3) { + MPI_Irecv( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Isend( &data, 1, MPI_INT, 2, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Irecv( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + MPI_Isend( &data, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); + } + Test_Waitforall( ); + MPI_Finalize(); + return(0); +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/gcomm.c b/teshsuite/smpi/mpich-test/pt2pt/gcomm.c new file mode 100644 index 0000000000..3bbb3dd844 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/gcomm.c @@ -0,0 +1,78 @@ +/* + This file generates a few communicators for use in the test suite + + THIS CODE IS FROM mpich/tsuite AND SHOULD BE CHANGED THERE ONLY + */ + +#include "mpi.h" + +#include "gcomm.h" + +void MakeComms( comms, maxn, n, make_intercomm ) +MPI_Comm *comms; +int *n, maxn, make_intercomm; +{ +int cnt = 0; +int rank, size; +int dims[2]; +int periods[2], range[1][3]; +MPI_Group group, newgroup; + +MPI_Comm_rank( MPI_COMM_WORLD, &rank ); +MPI_Comm_size( MPI_COMM_WORLD, &size ); + +comms[cnt++] = MPI_COMM_WORLD; +if (cnt == maxn) {*n = cnt; return; } + +/* Construct a communicator with the ranks reversed */ +MPI_Comm_group( MPI_COMM_WORLD, &group ); +range[0][0] = size-1; +range[0][1] = 0; +range[0][2] = -1; +MPI_Group_range_incl( group, 1, range, &newgroup ); +MPI_Comm_create( MPI_COMM_WORLD, newgroup, &comms[cnt] ); +cnt++; +//MPI_Group_free( &group ); +//MPI_Group_free( &newgroup ); +if (cnt == maxn) {*n = cnt; return; } + +if (size > 3) { + /* Divide into odd and even processes */ + MPI_Comm_split( MPI_COMM_WORLD, rank & 0x1, rank, comms + cnt ); + cnt ++; + + /* Use the cartesian constructors */ + dims[0] = 0; dims[1] = 0; + MPI_Dims_create( size, 2, dims ); + periods[0] = 0; periods[1] = 0; + MPI_Cart_create( MPI_COMM_WORLD, 2, dims, periods, 0, comms + cnt ); + cnt ++; + if (cnt == maxn) {*n = cnt; return; } + + /* Create an intercommunicator (point-to-point operations only) + Note that in this case, codes need to use MPI_Comm_remote_size to + (added to MPI_Comm_size) to get the size of the full group */ + if (make_intercomm) { + /* The remote_leader is rank 1 in MPI_COMM_WORLD if we are even + and 0 if we are odd (the remote_leader rank is relative to the + peer communicator) + */ + MPI_Intercomm_create( comms[2], 0, MPI_COMM_WORLD, !(rank&0x1), + 37, comms + cnt ); + cnt ++; + if (cnt == maxn) {*n = cnt; return; } + } + } +*n = cnt; +} + +void FreeComms( comms, n ) +MPI_Comm *comms; +int n; +{ +int i; +for (i=1; i + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +typedef struct { + int len; + double data[1000]; + } buf_t; + +int main( int argc, char **argv ) +{ + int err = 0, toterr; + MPI_Datatype contig1, varstruct1, oldtypes[2], varstruct2; + MPI_Aint displs[2]; + int blens[2]; + MPI_Comm comm; + MPI_Status status; + int world_rank; + int rank, size, partner, count, i; + int send_ibuf[4], recv_ibuf[4]; + buf_t send_buf, recv_buf; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); + +/* Form the datatypes */ + MPI_Type_contiguous( 4, MPI_INT, &contig1 ); + MPI_Type_commit( &contig1 ); + blens[0] = 1; + blens[1] = 1000; + oldtypes[0] = MPI_INT; + oldtypes[1] = MPI_DOUBLE; +/* Note that the displacement for the data is probably double aligned */ + MPI_Address( &send_buf.len, &displs[0] ); + MPI_Address( &send_buf.data[0], &displs[1] ); +/* Make relative */ + displs[1] = displs[1] - displs[0]; + displs[0] = 0; + MPI_Type_struct( 2, blens, displs, oldtypes, &varstruct1 ); + MPI_Type_commit( &varstruct1 ); + + comm = MPI_COMM_WORLD; + + MPI_Comm_size( comm, &size ); + MPI_Comm_rank( comm, &rank ); + + if (size < 2) { + fprintf( stderr, "This test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + if (rank == size - 1) { + partner = 0; + /* Send contiguous data */ + for (i=0; i<4; i++) + send_ibuf[i] = i; + MPI_Send( send_ibuf, 1, contig1, partner, 0, comm ); + + /* Send partial structure */ + blens[1] = 23; + MPI_Type_struct( 2, blens, displs, oldtypes, &varstruct2 ); + MPI_Type_commit( &varstruct2 ); + + MPI_Send( &send_buf, 1, varstruct2, partner, 1, comm ); + MPI_Type_free( &varstruct2 ); + + /* Send NO data */ + MPI_Send( MPI_BOTTOM, 0, MPI_INT, partner, 2, comm ); + } + else if (rank == 0) { + partner = size - 1; + MPI_Recv( recv_ibuf, 1, contig1, partner, 0, comm, &status ); + MPI_Get_count( &status, MPI_INT, &count ); + if (count != 4) { + err++; + fprintf( stderr, + "Wrong count for contig recv MPI_INT; got %d expected %d\n", + count, 4 ); + } + MPI_Get_count( &status, contig1, &count ); + if (count != 1) { + err++; + fprintf( stderr, + "Wrong count for contig recv (contig); got %d expected %d\n", + count, 1 ); + } + MPI_Get_elements( &status, contig1, &count ); + if (count != 4) { + err++; + fprintf( stderr, + "Wrong elements for contig recv contig; got %d expected %d\n", + count, 4 ); + } + + /* Now, try the partial structure */ + MPI_Recv( &recv_buf, 1, varstruct1, partner, 1, comm, &status ); + MPI_Get_elements( &status, varstruct1, &count ); + if (count != 24) { + err++; + fprintf( stderr, + "Wrong number of elements for struct recv; got %d expected %d\n", + count, 24 ); + } + + { + /* Receive nothing using a 0-sized type */ + MPI_Datatype ztype; + MPI_Type_contiguous( 0, MPI_INT, &ztype ); + MPI_Type_commit( &ztype ); + MPI_Recv( &recv_buf, 10, ztype, partner, 2, comm, &status ); + /* Current clarification requires 0 for the result */ + MPI_Get_elements( &status, ztype, &count ); + if (count != 0) { + err++; + fprintf( stderr, + "Wrong number of elements for 0-size datatype; got %d\n", + count ); + } + MPI_Get_count( &status, ztype, &count ); + if (count != 0) { + err++; + fprintf( stderr, + "Wrong count for 0-size datatype; got %d\n", + count ); + } + MPI_Type_free( &ztype ); + } + } + MPI_Type_free( &contig1 ); + MPI_Type_free( &varstruct1 ); + + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) + printf( " No Errors\n" ); + else + printf( "Found %d errors in MPI_Get_elements\n", toterr ); + } + MPI_Finalize( ); + return toterr; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/hindexed.c b/teshsuite/smpi/mpich-test/pt2pt/hindexed.c new file mode 100644 index 0000000000..29b4612075 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/hindexed.c @@ -0,0 +1,106 @@ +#include "mpi.h" +#include +/* stdlib.h needed for malloc declaration */ +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + * This file tests MPI_Type_hindexed by describing parts of a triangular + * matrix, stored in a square matrix, and sending sending it. + * + * The matrix is stored in column-major, and the tests use + * MPI_Type_vector or MPI_Type_struct to define the elements that are sent + */ + +int main( int argc, char **argv ) +{ + MPI_Datatype rowtype, mattype; + int *sbuf, *rbuf; + int rank, mat_n; + static int blens[2] = { 1, 1 }; + MPI_Datatype types[2] = { MPI_INT, MPI_UB }; + int *mat_blens, i ; + MPI_Aint *mat_displs; + MPI_Aint displs[2]; + MPI_Status status; + int err, row, col; + + MPI_Init( &argc, &argv ); + + err = 0; + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + mat_n = 10; + sbuf = (int *) malloc( mat_n * mat_n * sizeof(int) ); + rbuf = (int *) malloc( mat_n * mat_n * sizeof(int) ); + if (!sbuf || !rbuf) { + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* Define a row type based on a strided struct type */ + displs[0] = 0; + displs[1] = mat_n*sizeof(int); + MPI_Type_struct( 2, blens, displs, types, &rowtype ); + MPI_Type_commit( &rowtype ); + + /* Define an hindexed type that defines all of the rows of the + triangular part of sbuf */ + + mat_blens = (int *)malloc( mat_n * sizeof(int) ); + mat_displs = (MPI_Aint *)malloc( mat_n * sizeof(MPI_Aint) ); + for (i=0; i +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + This is a very simple MPI program which can be used to check things + like the behavior of the ADI or heterogeneous code + */ +int main( int argc, char **argv ) +{ +char msg[10]; +char smsg[10]; +int rank, size; +int src, dest; +int count; +MPI_Status status; + +MPI_Init( &argc, &argv ); +MPI_Comm_size( MPI_COMM_WORLD, &size ); +MPI_Comm_rank( MPI_COMM_WORLD, &rank ); +if (size != 2) { + MPI_Abort( MPI_COMM_WORLD, 1 ); + return 1; + } +src = 1; +dest = 0; +if (rank == src) { + strcpy( msg, "MPICH!" ); + MPI_Send( msg, 7, MPI_CHAR, dest, 10, MPI_COMM_WORLD ); + } +else { + MPI_Recv( smsg, 10, MPI_CHAR, src, 10, MPI_COMM_WORLD, &status ); + if (status.MPI_TAG != 10) { + fprintf( stderr, "Error in status tag!\n" ); + } + if (status.MPI_SOURCE != src) { + fprintf( stderr, "Error in status source!\n" ); + } + MPI_Get_count( &status, MPI_CHAR, &count ); + if (count != 7) { + fprintf( stderr, "Error in count, got %d expected 7\n", count ); + } + if (strcmp( smsg, "MPICH!" )) { + fprintf( stderr, "Got wrong msg (%s), expected \"MPICH!\"\n", smsg ); + } + } + +MPI_Finalize(); +return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/hvec.c b/teshsuite/smpi/mpich-test/pt2pt/hvec.c new file mode 100644 index 0000000000..5539b18b72 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/hvec.c @@ -0,0 +1,127 @@ +#include "mpi.h" +#include "test.h" +#include + +/* The original version of this was sent by + empierce@tribble.llnl.gov (Elsie M. Pierce) + I've modified it to fit the automated tests requirements + */ +/* Prototypes for picky compilers */ +int iinit ( int *, int, int ); +int ilist1 ( int *, int, int, int ); +void Build_vect ( MPI_Datatype * ); +void Build_ctg ( int, MPI_Datatype *, MPI_Datatype * ); +void Get_d5 ( int ); + +int iinit(a, value, l) +int *a, value, l; +{ + int i; + + for (i=0; i +#include "mpi.h" +#include "test.h" +/* #define SHOWMSG */ + +#ifdef VERBOSE +static int verbose = 1; +#else +static int verbose = 0; +#endif +int main( int argc, char **argv ) +{ + int rank, size, to, from, tag, count, i; + int src, dest; + int st_source, st_tag, st_count; + int errcnt = 0; + MPI_Request handle; + MPI_Status status; + double data[100]; + MPI_Datatype rowtype; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + src = size - 1; + dest = 0; +/* + dest = size - 1; + src = 0; + */ + MPI_Type_vector( 10, 1, 10, MPI_DOUBLE, &rowtype ); + MPI_Type_commit( &rowtype ); + /* First test: send a row */ + if (rank == src) { + to = dest; + count = 1; + tag = 2001; + for (i = 0; i < 100; i++) + data[i] = i; + /* Send a row */ + MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + } + + if (rank == dest) { + tag = MPI_ANY_TAG; + count = 10; + from = MPI_ANY_SOURCE; + MPI_Recv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD, + &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i]); printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i] != 10*i) { + errcnt++; + fprintf( stderr, + "[%d](rcv double) %d'th element = %f, should be %f\n", + rank, i, data[i], 10.0*i ); + } + } + + /* Second test: receive a column into row */ + if (rank == src) + { + to = dest; + count = 10; + tag = 2001; + for (i = 0; i < 100; i++) + data[i] = i; + /* Send a row */ + MPI_Send( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n"); +#endif + } + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 1; + from = MPI_ANY_SOURCE; + MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD, + &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i*10] != i) { + errcnt++; + fprintf( stderr, + "[%d](rcv row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 1.0*i ); + } + } + + /* Third test: send AND receive a row */ + if (rank == src) + { + to = dest; + count = 1; + tag = 2001; + for (i = 0; i < 100; i++) + data[i] = i; + /* Send a row */ + MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + } + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 1; + from = MPI_ANY_SOURCE; + MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD, + &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i*10] != i*10) { + errcnt++; + fprintf( stderr, + "[%d](rcv row-row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 10.0*i ); + } + } + + /* Second Set of Tests: Use Isend and Irecv instead of Send and Recv */ + /* First test: send a row */ + if (rank == src) + { + to = dest; + count = 1; + tag = 2001; + for (i = 0; i < 100; i++) + data[i] = i; + /* Send a row */ + MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + } + + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 10; + from = MPI_ANY_SOURCE; + MPI_Irecv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD, + &handle ); + MPI_Wait( &handle, &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i]); printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i] != 10*i) { + errcnt++; + fprintf( stderr, + "[%d](ircv double) %d'th element = %f, should be %f\n", + rank, i, data[i], 10.0*i ); + } + } + + /* Second test: receive a column into row */ + if (rank == src) + { + to = dest; + count = 10; + tag = 2001; + for (i = 0; i < 100; i++) + data[i] = i; + /* Send a row */ + MPI_Isend( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD, + &handle ); + MPI_Wait( &handle, &status ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n"); +#endif + } + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 1; + from = MPI_ANY_SOURCE; + MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD, + &handle ); + MPI_Wait( &handle, &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i*10] != i) { + errcnt++; + fprintf( stderr, + "[%d](ircv row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 1.0*i ); + } + } + + /* Third test: send AND receive a row */ + if (rank == src) + { + to = dest; + count = 1; + tag = 2001; + for (i = 0; i < 100; i++) + data[i] = i; + /* Send a row */ + MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + } + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 1; + from = MPI_ANY_SOURCE; + MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD, + &handle ); + MPI_Wait( &handle, &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i*10] != i*10) { + errcnt++; + fprintf( stderr, + "[%d](ircv row-row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 10.0*i ); + } + } + + i = errcnt; + MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (errcnt > 0) { + printf( "Found %d errors in the run \n", errcnt ); + } + MPI_Type_free( &rowtype ); + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/hvectest2.c b/teshsuite/smpi/mpich-test/pt2pt/hvectest2.c new file mode 100644 index 0000000000..0414b3d334 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/hvectest2.c @@ -0,0 +1,366 @@ +/* + hvectest2 - test program that sends an array of floats from the first + process of a group to the last, using send and recv and the + struct datatype for variable length vectors +*/ + +#include "mpi.h" +#include +#include +#include "test.h" +/* #define SHOWMSG */ + +/* Prototypes for picky compilers */ +void ClearArray ( double *, int, double ); +void SetArray ( double *, int ); + +#ifdef VERBOSE +static int verbose = 1; +#else +static int verbose = 0; +#endif + +void ClearArray( a, n, v ) +double *a, v; +int n; +{ + int i; + for (i=0; i 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) { + dest = size - 1; + src = 0; + } + else { + src = size - 1; + dest = 0; + } + + displs[0] = 0; + displs[1] = 10*sizeof(double); +/* + blens[0] = 1; + blens[1] = 1; + types[0] = MPI_DOUBLE; + types[1] = MPI_UB; + */ + MPI_Type_struct( 2, blens, displs, types, &rowtype ); + MPI_Type_commit( &rowtype ); + /* First test: send a row */ + if (rank == src) + { + to = dest; + count = 10; + tag = 2001; + SetArray( data, 100 ); + /* Send a row */ + MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + } + + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 10; + from = MPI_ANY_SOURCE; + + ClearArray( data, 100, -1.0 ); + MPI_Recv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD, + &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i]); printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i] != 10*i) { + errcnt++; + fprintf( stderr, + "[%d](rcv double) %d'th element = %f, should be %f\n", + rank, i, data[i], 10.0*i ); + } + } + + /* Second test: receive a column into row */ + if (rank == src) + { + to = dest; + count = 10; + tag = 2001; + SetArray( data, 100 ); + /* Send a row */ + /* MPE_Print_datatype_pack_action( stdout, count, + MPI_DOUBLE, 0, 0 ); */ + MPI_Send( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n"); +#endif + } + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 10; + from = MPI_ANY_SOURCE; + ClearArray( data, 100, -1.0 ); + MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD, + &status ); + /* MPE_Print_datatype_unpack_action( stdout, count, rowtype, 0, 0 ); */ + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i*10] != i) { + errcnt++; + fprintf( stderr, + "[%d](rcv row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 1.0*i ); + } + } + + /* Third test: send AND receive a row */ + if (rank == src) + { + to = dest; + count = 10; + tag = 2001; + SetArray( data, 100 ); + /* Send a row */ + MPI_Send( data, count, rowtype, to, tag, MPI_COMM_WORLD ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + } + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 10; + from = MPI_ANY_SOURCE; + ClearArray( data, 100, -1.0 ); + MPI_Recv(data, count, rowtype, from, tag, MPI_COMM_WORLD, + &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i*10] != i*10) { + errcnt++; + fprintf( stderr, + "[%d](rcv row-row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 10.0*i ); + } + } + + /* Second Set of Tests: Use Isend and Irecv instead of Send and Recv */ + /* First test: send a row */ + if (rank == src) + { + to = dest; + count = 10; + tag = 2001; + SetArray( data, 100 ); + /* Send a row */ + MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + } + + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 10; + from = MPI_ANY_SOURCE; + ClearArray( data, 100, -1.0 ); + MPI_Irecv(data, count, MPI_DOUBLE, from, tag, MPI_COMM_WORLD, + &handle ); + MPI_Wait( &handle, &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i]); printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i] != 10*i) { + errcnt++; + fprintf( stderr, + "[%d](ircv double) %d'th element = %f, should be %f\n", + rank, i, data[i], 10.0*i ); + } + } + + /* Second test: receive a column into row */ + if (rank == src) + { + to = dest; + count = 10; + tag = 2001; + SetArray( data, 100 ); + /* Send a row */ + MPI_Isend( data, count, MPI_DOUBLE, to, tag, MPI_COMM_WORLD, + &handle ); + MPI_Wait( &handle, &status ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i]);printf("\n"); +#endif + } + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 10; + from = MPI_ANY_SOURCE; + ClearArray( data, 100, -1.0 ); + MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD, + &handle ); + MPI_Wait( &handle, &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i*10] != i) { + errcnt++; + fprintf( stderr, + "[%d](ircv row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 1.0*i ); + } + } + + /* Third test: send AND receive a row */ + if (rank == src) + { + to = dest; + count = 10; + tag = 2001; + SetArray( data, 100 ); + /* Send a row */ + MPI_Isend( data, count, rowtype, to, tag, MPI_COMM_WORLD, &handle ); + MPI_Wait( &handle, &status ); +#ifdef SHOWMSG + printf("%d sent", rank ); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + } + if (rank == dest) + { + tag = MPI_ANY_TAG; + count = 10; + from = MPI_ANY_SOURCE; + ClearArray( data, 100, -1.0 ); + MPI_Irecv(data, count, rowtype, from, tag, MPI_COMM_WORLD, + &handle ); + MPI_Wait( &handle, &status ); + + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + MPI_Get_count( &status, MPI_DOUBLE, &st_count ); + + if (st_source != src || st_tag != 2001 || st_count != 10 || verbose) { + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + } +#ifdef SHOWMSG + printf( "%d received", rank); + for (i = 0; i < 10; i++) printf(" %f",data[i*10]);printf("\n"); +#endif + for (i = 0; i < 10; i++) if (data[i*10] != i*10) { + errcnt++; + fprintf( stderr, + "[%d](ircv row-row) %d'th element = %f, should be %f\n", + rank, i, data[i*10], 10.0*i ); + } + } + + i = errcnt; + MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (errcnt > 0) { + printf( "Found %d errors in the run \n", errcnt ); + } + MPI_Type_free( &rowtype ); + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/irecvtest.c b/teshsuite/smpi/mpich-test/pt2pt/irecvtest.c new file mode 100644 index 0000000000..446059e3df --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/irecvtest.c @@ -0,0 +1,152 @@ +/* + * Program to test that the "no overtaking messages" semantics + * of point to point communications in MPI is satisfied, + * for a simple send/irecv operation. + * + * Derived from a program written by + * Patrick Bridges + * bridges@mcs.anl.gov + * patrick@CS.MsState.Edu + */ + +#include +#include "test.h" +#include "mpi.h" + +#define SIZE 10000 + +static int src = 0; +static int dest = 1; + +/* Which tests to perform (not yet implemented) */ +/* static int Do_Buffer = 1; */ +/* static int Do_Standard = 1; */ + +/* Prototypes for picky compilers */ +void Generate_Data ( double *, int ); +void Normal_Test_Send ( double *, int ); +void Async_Test_Recv ( double *, int ); +int Check_Data ( double *, int ); +void Clear_Buffer ( double *, int ); + +void Generate_Data(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + + for (i = 0; i < buff_size; i++) + buffer[i] = (double)i+1; +} + +#define NSHORT 10 +void Normal_Test_Send(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j; + + for (j = 0; j < 2; j++) { + /* send a long message */ + MPI_Send(buffer, (buff_size/2 - NSHORT), MPI_DOUBLE, dest, 2000, + MPI_COMM_WORLD); + buffer += buff_size/2 - NSHORT; + /* Followed by NSHORT short ones */ + for (i = 0; i < NSHORT; i++) + MPI_Send(buffer++, 1, MPI_DOUBLE, dest, 2000, MPI_COMM_WORLD); + } +} + +void Async_Test_Recv(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j, req = 0; + MPI_Status Stat[22]; + MPI_Request Hand[22]; + + for (j = 0; j < 2; j++) { + /* Receive a long message */ + MPI_Irecv(buffer, (buff_size/2 - NSHORT), MPI_DOUBLE, src, + 2000, MPI_COMM_WORLD, &(Hand[req++])); + buffer += buff_size/2 - NSHORT; + /* Followed by NSHORT short ones */ + for (i = 0; i < NSHORT; i++) + MPI_Irecv(buffer++, 1, MPI_DOUBLE, src, 2000, + MPI_COMM_WORLD, &(Hand[req++])); + } + MPI_Waitall(req, Hand, Stat); +} + +int Check_Data(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + int err = 0; + + for (i = 0; i < buff_size; i++) + if (buffer[i] != (i + 1)) { + err++; + fprintf( stderr, "Value at %d is %f, should be %f\n", i, + buffer[i], (double)(i+1) ); + fflush( stderr ); + if (err > 10) return 1; + } + return err; +} + +void Clear_Buffer(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + for (i = 0; i < buff_size; i++) + buffer[i] = -1; +} + + +int main( int argc, char **argv) +{ + int rank; /* My Rank (0 or 1) */ + double buffer[SIZE]; + char *Current_Test = NULL; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == src) { + Generate_Data(buffer, SIZE); + Normal_Test_Send(buffer, SIZE); + Test_Waitforall( ); + MPI_Finalize(); + + } else if (rank == dest) { + Test_Init("irecvtest", rank); + /* Test 2 */ + Clear_Buffer(buffer, SIZE); + Current_Test = (char*)"Overtaking Test (Normal Send -> Async Receive)"; + Async_Test_Recv(buffer, SIZE); + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); + Test_Waitforall( ); + + MPI_Finalize(); + { + int rval = Summarize_Test_Results(); /* Returns number of tests; + that failed */ + Test_Finalize(); + return rval; + } + } else { + fprintf(stderr, "*** This program uses exactly 2 processes! ***\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/irsend.c b/teshsuite/smpi/mpich-test/pt2pt/irsend.c new file mode 100644 index 0000000000..9b690de3de --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/irsend.c @@ -0,0 +1,155 @@ +#include "mpi.h" +#include +#include +#include "dtypes.h" +#include "gcomm.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int verbose = 0; +/* Nonblocking ready sends + + This is similar to a test in allpair.f, but with an expanded range of + datatypes and communicators. + */ + +int main( int argc, char **argv ) +{ + MPI_Datatype *types; + void **inbufs, **outbufs; + char **names; + int *counts, *bytesize, ntype; + MPI_Comm comms[20]; + int ncomm = 20, rank, np, partner, tag; + int i, j, k, err, toterr, world_rank, errloc; + MPI_Status status, statuses[2]; + int flag, index; + char *obuf; + MPI_Request requests[2]; + + + MPI_Init( &argc, &argv ); + + AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, + &names, &ntype ); + GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype ); + + MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); + MakeComms( comms, 20, &ncomm, 0 ); + +/* Test over a wide range of datatypes and communicators */ + err = 0; + for (i=0; i 0) { + fprintf( stderr, "%d errors on %d\n", err, rank ); + } + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } + FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype ); + FreeComms( comms, ncomm ); + MPI_Finalize(); + + return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/irsendinit.c b/teshsuite/smpi/mpich-test/pt2pt/irsendinit.c new file mode 100644 index 0000000000..d80cf5a397 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/irsendinit.c @@ -0,0 +1,167 @@ +#include "mpi.h" +#include +#include +#include "dtypes.h" +#include "gcomm.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int verbose = 0; +/* Nonblocking ready persistent sends + + This is similar to a test in allpair.f, but with an expanded range of + datatypes and communicators. + + This is like irsend.c, but with multiple starts of the same persistent + request. + */ + +int main( int argc, char **argv ) +{ + MPI_Datatype *types; + void **inbufs, **outbufs; + char **names; + int *counts, *bytesize, ntype; + MPI_Comm comms[20]; + int ncomm = 20, rank, np, partner, tag; + int i, j, k, err, toterr, world_rank, errloc; + MPI_Status status; + int flag, index; + char *obuf; + MPI_Request requests[2]; + int mcnt; + + + MPI_Init( &argc, &argv ); + + AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, + &names, &ntype ); + GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype ); + + MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); + MakeComms( comms, 20, &ncomm, 0 ); + +/* Test over a wide range of datatypes and communicators */ + err = 0; + for (i=0; i 0) { + fprintf( stderr, "%d errors on %d\n", err, rank ); + } + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } + FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype ); + FreeComms( comms, ncomm ); + MPI_Finalize(); + + return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/isendf.f b/teshsuite/smpi/mpich-test/pt2pt/isendf.f new file mode 100644 index 0000000000..18807247af --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/isendf.f @@ -0,0 +1,53 @@ + program main + include 'mpif.h' + integer ierr, errs, toterrs + integer request + integer status(MPI_STATUS_SIZE) + integer rank, size, buf(10) + logical flag +C + call MPI_Init( ierr ) + errs = 0 +C + call MPI_Comm_size( MPI_COMM_WORLD, size, ierr ) + if (size .lt. 2) then + print *, 'Must have at least two processes' + call MPI_Abort( MPI_COMM_WORLD, 1, ierr ) + endif + call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr ) + if (rank .eq. 0) then + do i = 1, 10 + buf(i) = i + enddo + call MPI_Isend( buf, 10, MPI_INTEGER, size - 1, 1, + $ MPI_COMM_WORLD, request, ierr ) + call MPI_Wait( request, status, ierr ) + endif + if (rank .eq. size - 1) then + call MPI_Irecv( buf, 10, MPI_INTEGER, 0, 1, MPI_COMM_WORLD, + $ request, ierr ) +C call MPI_Wait( request, status, ierr ) + flag = .FALSE. + do while (.not. flag) + call MPI_Test( request, flag, status, ierr ) + enddo +C +C Check the results + do i = 1, 10 + if (buf(i) .ne. i) then + errs = errs + 1 + endif + enddo + endif +C + call MPI_Allreduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, + $ MPI_COMM_WORLD, ierr ) + if (rank .eq. 0) then + if (toterrs .gt. 0) then + print *, "Found ", toterrs, " Errors" + else + PRINT *, " No Errors" + endif + endif + call MPI_Finalize( ierr ) + end diff --git a/teshsuite/smpi/mpich-test/pt2pt/isendtest.c b/teshsuite/smpi/mpich-test/pt2pt/isendtest.c new file mode 100644 index 0000000000..0a920107b4 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/isendtest.c @@ -0,0 +1,48 @@ +/* + MPICH 1.0.8 on Intel Paragons is alleged to have failed this test. + (Original code from + From: weber@zam212.zam.kfa-juelich.de (M.Weber) + Reply-To: M.Weber@kfa-juelich.de + modified slightly to meet our test rules.) + */ +#include +#include "mpi.h" +#define SIZE 100 +/* SIZE 16 worked on Paragon */ + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char *argv[]) +{ + int num_procs,my_id,flag; + int buf[SIZE][SIZE]; + MPI_Status status; + MPI_Request handle; + + MPI_Init(&argc,&argv); + MPI_Comm_size(MPI_COMM_WORLD,&num_procs); + MPI_Comm_rank(MPI_COMM_WORLD,&my_id); + + if ( my_id == 1 ) { + MPI_Isend (buf, SIZE*SIZE, MPI_INT, 0, 0, MPI_COMM_WORLD, &handle ); + + flag = 0; + while (flag == 0) { + MPI_Test (&handle, &flag, &status); + printf("%d Wait for completition flag = %d handle = %ld ....\n", + my_id, flag, (long) handle); + } + } + else if (my_id == 0 ) { + MPI_Recv (buf, SIZE*SIZE, MPI_INT, 1, 0, MPI_COMM_WORLD, &status ); + } + + printf("%d Done ....\n",my_id); + + MPI_Finalize(); + return 0; +} + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/isndrcv.c b/teshsuite/smpi/mpich-test/pt2pt/isndrcv.c new file mode 100644 index 0000000000..d15c58ac9b --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/isndrcv.c @@ -0,0 +1,507 @@ +/* + * Program to test all of the features of MPI_Send and MPI_Recv + * + * *** What is tested? *** + * 1. Sending and receiving all basic types and many sizes - check + * 2. Tag selectivity - check + * 3. Error return codes for + * a. Invalid Communicator + * b. Invalid destination or source + * c. Count out of range + * d. Invalid type + */ + +#include "test.h" +#include +#include +#include +#include "mpi.h" + +#ifdef HAVE_MPICHCONF_H +#include "mpichconf.h" +#endif + +static int src = 1; +static int dest = 0; + +static int verbose = 0; + +#define MAX_TYPES 12 +static MPI_Datatype BasicTypes[MAX_TYPES]; +#if defined(HAVE_LONG_DOUBLE) && (!defined HAS_XDR) +static int ntypes = 12; +#else +static int ntypes = 11; +#endif + +static int maxbufferlen = 10000; +static int stdbufferlen = 300; + +/* Prototypes to keep compilers quiet */ +void AllocateBuffers ( void **, MPI_Datatype *, int, int ); +void FreeBuffers ( void **, int ); +void FillBuffers ( void **, MPI_Datatype *, int, int ); +int CheckBuffer ( void *, MPI_Datatype, int ); +void SetupBasicTypes (void); +void SenderTest1 (void); +void ReceiverTest1 (void); +void SenderTest2 (void); +void ReceiverTest2 (void); +void SenderTest3 (void); +void ReceiverTest3 (void); + +void +AllocateBuffers(void **bufferspace, MPI_Datatype *buffertypes, int num_types, + int bufferlen) +{ + int i; + for (i = 0; i < ntypes; i++) { + if (buffertypes[i] == MPI_CHAR) + bufferspace[i] = malloc(bufferlen * sizeof(char)); + else if (buffertypes[i] == MPI_SHORT) + bufferspace[i] = malloc(bufferlen * sizeof(short)); + else if (buffertypes[i] == MPI_INT) + bufferspace[i] = malloc(bufferlen * sizeof(int)); + else if (buffertypes[i] == MPI_LONG) + bufferspace[i] = malloc(bufferlen * sizeof(long)); + else if (buffertypes[i] == MPI_UNSIGNED_CHAR) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned char)); + else if (buffertypes[i] == MPI_UNSIGNED_SHORT) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned short)); + else if (buffertypes[i] == MPI_UNSIGNED) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned int)); + else if (buffertypes[i] == MPI_UNSIGNED_LONG) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned long)); + else if (buffertypes[i] == MPI_FLOAT) + bufferspace[i] = malloc(bufferlen * sizeof(float)); + else if (buffertypes[i] == MPI_DOUBLE) + bufferspace[i] = malloc(bufferlen * sizeof(double)); +#if defined(HAVE_LONG_DOUBLE) && (!defined HAS_XDR) + else if (MPI_LONG_DOUBLE && buffertypes[i] == MPI_LONG_DOUBLE) { + int dlen; + MPI_Type_size( MPI_LONG_DOUBLE, &dlen ); + bufferspace[i] = malloc(bufferlen * dlen); + } +#endif + else if (buffertypes[i] == MPI_BYTE) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned char)); + } +} + +void +FreeBuffers(void **buffers, int nbuffers) +{ + int i; + for (i = 0; i < nbuffers; i++) + free(buffers[i]); +} + +void +FillBuffers(void **bufferspace, MPI_Datatype *buffertypes, int num_types, + int bufferlen) +{ + int i, j; + for (i = 0; i < ntypes; i++) { + for (j = 0; j < bufferlen; j++) { + if (buffertypes[i] == MPI_CHAR) + ((char *)bufferspace[i])[j] = (char)(j & 0x7f); + else if (buffertypes[i] == MPI_SHORT) + ((short *)bufferspace[i])[j] = (short)j; + else if (buffertypes[i] == MPI_INT) + ((int *)bufferspace[i])[j] = (int)j; + else if (buffertypes[i] == MPI_LONG) + ((long *)bufferspace[i])[j] = (long)j; + else if (buffertypes[i] == MPI_UNSIGNED_CHAR) + ((unsigned char *)bufferspace[i])[j] = (unsigned char)j; + else if (buffertypes[i] == MPI_UNSIGNED_SHORT) + ((unsigned short *)bufferspace[i])[j] = (unsigned short)j; + else if (buffertypes[i] == MPI_UNSIGNED) + ((unsigned int *)bufferspace[i])[j] = (unsigned int)j; + else if (buffertypes[i] == MPI_UNSIGNED_LONG) + ((unsigned long *)bufferspace[i])[j] = (unsigned long)j; + else if (buffertypes[i] == MPI_FLOAT) + ((float *)bufferspace[i])[j] = (float)j; + else if (buffertypes[i] == MPI_DOUBLE) + ((double *)bufferspace[i])[j] = (double)j; +#if defined(HAVE_LONG_DOUBLE) && (!defined HAS_XDR) + else if (MPI_LONG_DOUBLE && buffertypes[i] == MPI_LONG_DOUBLE) + ((long double *)bufferspace[i])[j] = (long double)j; +#endif + else if (buffertypes[i] == MPI_BYTE) + ((unsigned char *)bufferspace[i])[j] = (unsigned char)j; + } + } +} + +int +CheckBuffer(bufferspace, buffertype, bufferlen) +void *bufferspace; +MPI_Datatype buffertype; +int bufferlen; +{ + int j; + for (j = 0; j < bufferlen; j++) { + if (buffertype == MPI_CHAR) { + if (((char *)bufferspace)[j] != (char)(j & 0x7f)) + return 1; + } else if (buffertype == MPI_SHORT) { + if (((short *)bufferspace)[j] != (short)j) + return 1; + } else if (buffertype == MPI_INT) { + if (((int *)bufferspace)[j] != (int)j) + return 1; + } else if (buffertype == MPI_LONG) { + if (((long *)bufferspace)[j] != (long)j) + return 1; + } else if (buffertype == MPI_UNSIGNED_CHAR) { + if (((unsigned char *)bufferspace)[j] != (unsigned char)j) + return 1; + } else if (buffertype == MPI_UNSIGNED_SHORT) { + if (((unsigned short *)bufferspace)[j] != (unsigned short)j) + return 1; + } else if (buffertype == MPI_UNSIGNED) { + if (((unsigned int *)bufferspace)[j] != (unsigned int)j) + return 1; + } else if (buffertype == MPI_UNSIGNED_LONG) { + if (((unsigned long *)bufferspace)[j] != (unsigned long)j) + return 1; + } else if (buffertype == MPI_FLOAT) { + if (((float *)bufferspace)[j] != (float)j) + return 1; + } else if (buffertype == MPI_DOUBLE) { + if (((double *)bufferspace)[j] != (double)j) + return 1; +#if defined(HAVE_LONG_DOUBLE) && (!defined HAS_XDR) + } else if (MPI_LONG_DOUBLE && buffertype == MPI_LONG_DOUBLE) { + if (((long double *)bufferspace)[j] != (long double)j) + return 1; +#endif + } else if (buffertype == MPI_BYTE) { + if (((unsigned char *)bufferspace)[j] != (unsigned char)j) + return 1; + } + } + return 0; +} + +void SetupBasicTypes( void ) +{ + BasicTypes[0] = MPI_CHAR; + BasicTypes[1] = MPI_SHORT; + BasicTypes[2] = MPI_INT; + BasicTypes[3] = MPI_LONG; + BasicTypes[4] = MPI_UNSIGNED_CHAR; + BasicTypes[5] = MPI_UNSIGNED_SHORT; + BasicTypes[6] = MPI_UNSIGNED; + BasicTypes[7] = MPI_UNSIGNED_LONG; + BasicTypes[8] = MPI_FLOAT; + BasicTypes[9] = MPI_DOUBLE; + + /* Define the last few elements as null just in case */ + BasicTypes[11] = MPI_DATATYPE_NULL; +#if defined (HAVE_LONG_DOUBLE) && (!defined HAS_XDR) + if (MPI_LONG_DOUBLE) { + BasicTypes[10] = MPI_LONG_DOUBLE; + BasicTypes[11] = MPI_BYTE; + } + else { + ntypes = 11; + BasicTypes[10] = MPI_BYTE; + } +#else + BasicTypes[10] = MPI_BYTE; +#endif +} + +void +SenderTest1( void ) +{ + void *bufferspace[MAX_TYPES]; + int i, j; + int act_send; + MPI_Request *requests = + (MPI_Request *)malloc(sizeof(MPI_Request) * ntypes * + maxbufferlen/500); + MPI_Status *statuses = + (MPI_Status *)malloc(sizeof(MPI_Status) * ntypes * + maxbufferlen/500); + + AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + FillBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + act_send = 0; + for (i = 0; i < ntypes; i++) { + for (j = 0; j < maxbufferlen; j += 500) { + if (BasicTypes[i] == MPI_DATATYPE_NULL) continue; + MPI_Isend(bufferspace[i], j, BasicTypes[i], dest, + 2000, MPI_COMM_WORLD, + &(requests[act_send++])); + } + } + MPI_Waitall( act_send, requests, statuses); + free(requests); + free(statuses); + FreeBuffers(bufferspace, ntypes); +} + +void +ReceiverTest1( void ) +{ + void *bufferspace[MAX_TYPES]; + int i, j; + char message[81]; + MPI_Status Stat; + MPI_Request Req; + int dummy, passed; + + AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + for (i = 0; i < ntypes; i++) { + passed = 1; + /* Try different sized messages */ + for (j = 0; j < maxbufferlen; j += 500) { + /* Skip null datatypes */ + if (!BasicTypes[i]) continue; + MPI_Irecv(bufferspace[i], j, BasicTypes[i], src, + 2000, MPI_COMM_WORLD, &Req); + sprintf(message, "Send-Receive Test, Type %d, Count %d", + i, j); + MPI_Wait(&Req, &Stat); + if (Stat.MPI_SOURCE != src) { + fprintf(stderr, "*** Incorrect Source returned. ***\n"); + Test_Failed(message); + passed = 0; + } else if (Stat.MPI_TAG != 2000) { + fprintf(stderr, "*** Incorrect Tag returned. ***\n"); + Test_Failed(message); + passed = 0; + } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) || + dummy != j) { + fprintf(stderr, + "*** Incorrect Count returned, Count = %d. ***\n", + dummy); + Test_Failed(message); + passed = 0; + } else if(CheckBuffer(bufferspace[i], BasicTypes[i], j)) { + fprintf(stderr, "*** Incorrect Message received. ***\n"); + Test_Failed(message); + passed = 0; + } + } + sprintf(message, "Send-Receive Test, Type %d", + i); + if (passed) + Test_Passed(message); + else + Test_Failed(message); + } + FreeBuffers(bufferspace, ntypes); +} + +/* Test Tag Selectivity */ +void +SenderTest2( void ) +{ + int *buffer; + int i; + MPI_Request requests[10]; + MPI_Status statuses[10]; + + buffer = (int *)malloc(stdbufferlen * sizeof(int)); + + for (i = 0; i < stdbufferlen; i++) + buffer[i] = i; + + for (i = 1; i <= 10; i++) + MPI_Isend(buffer, stdbufferlen, MPI_INT, dest, + 2000+i, MPI_COMM_WORLD, &(requests[i-1])); + MPI_Waitall(10, requests, statuses); + free(buffer); + + return; +} + +void +ReceiverTest2( void ) +{ + int *buffer; + int i, j; + char message[81]; + MPI_Status Stat; + int dummy, passed; + + MPI_Request Req; + + buffer = (int *)malloc(stdbufferlen * sizeof(int)); + passed = 1; + + for (i = 2010; i >= 2001; i--) { + MPI_Irecv(buffer, stdbufferlen, MPI_INT, src, + i, MPI_COMM_WORLD, &Req); + sprintf(message, "Tag Selectivity Test, Tag %d", + i); + MPI_Wait(&Req, &Stat); + if (Stat.MPI_SOURCE != src) { + fprintf(stderr, "*** Incorrect Source returned. ***\n"); + Test_Failed(message); + } else if (Stat.MPI_TAG != i) { + fprintf(stderr, "*** Incorrect Tag returned. ***\n"); + Test_Failed(message); + } else if (MPI_Get_count(&Stat, MPI_INT, &dummy) || + dummy != stdbufferlen) { + fprintf(stderr, + "*** Incorrect Count returned, Count = %d. ***\n", + dummy); + Test_Failed(message); + } else if(CheckBuffer( (void *)buffer, MPI_INT, stdbufferlen)) { + fprintf(stderr, "*** Incorrect Message received. ***\n"); + Test_Failed(message); + passed = 0; + } + /* Clear out the buffer */ + for (j = 0; j < stdbufferlen; j++) + buffer[j] = -1; + } + strncpy(message, "Tag Selectivity Test", 81); + if (passed) + Test_Passed(message); + else + Test_Failed(message); + free(buffer); + return; +} + +void +SenderTest3( void ) +{ + return; +} + +void +ReceiverTest3( void ) +{ + int buffer[20]; + MPI_Datatype bogus_type = MPI_DATATYPE_NULL; + MPI_Request Req; +#if 0 + MPI_Status Stat; + int err_code; +#endif + if (verbose) + MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN); + else + MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN); + + if (MPI_Isend(buffer, 20, MPI_INT, dest, + 1, MPI_COMM_NULL, &Req) == MPI_SUCCESS){ + Test_Failed("NULL Communicator Test"); + } + else { + Test_Passed("NULL Communicator Test"); +#if 0 + /* If test passed (i.e. send failed, try waiting on the + request... */ + Test_Message("About to wait on failed request."); + if (MPI_Wait(&Req, &Stat) == MPI_SUCCESS) {; + Test_Failed("Wait on failed isend Test"); + } + else + Test_Passed("Wait on failed isend Test"); + Test_Message("Done waiting on failed request."); +#endif + } +/* + if (MPI_Isend(NULL, 10, MPI_INT, dest, + 1, MPI_COMM_WORLD, &Req) == MPI_SUCCESS){ + Test_Failed("Invalid Buffer Test"); + } + else + Test_Passed("Invalid Buffer Test"); +*/ + if (MPI_Isend(buffer, -1, MPI_INT, dest, + 1, MPI_COMM_WORLD, &Req) == MPI_SUCCESS){ + Test_Failed("Invalid Count Test"); + } + else + Test_Passed("Invalid Count Test"); + + if (MPI_Isend(buffer, 20, bogus_type, dest, + 1, MPI_COMM_WORLD, &Req) == MPI_SUCCESS){ + Test_Failed("Invalid Type Test"); + } + else + Test_Passed("Invalid Type Test"); + + if (MPI_Isend(buffer, 20, MPI_INT, dest, + -1000, MPI_COMM_WORLD, &Req) == MPI_SUCCESS) { + Test_Failed("Invalid Tag Test"); + } + else + Test_Passed("Invalid Tag Test"); + + if (MPI_Isend(buffer, 20, MPI_INT, 300, + 1, MPI_COMM_WORLD, &Req) == MPI_SUCCESS) { + Test_Failed("Invalid Destination Test"); + } + else + Test_Passed("Invalid Destination Test"); + return; +} + +int +main( int argc, char **argv ) +{ + int myrank, mysize; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &myrank); + MPI_Comm_size(MPI_COMM_WORLD, &mysize); + + /* dest writes out the received stats; for the output to be + consistant (with the final check), it should be procees 0 */ + if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) { + dest = 1; + src = 0; + } + else { + src = 1; + dest = 0; + } + + Test_Init("isndrcv", myrank); + SetupBasicTypes(); + + if (mysize != 2) { + fprintf(stderr, + "*** This test program requires exactly 2 processes.\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* Turn stdout's buffering to line buffered so it mixes right with + stderr in output files. (hopefully) */ + setvbuf(stdout, NULL, _IOLBF, 0); + + if (myrank == src) { + SenderTest1(); + SenderTest2(); + SenderTest3(); + } else if (myrank == dest) { + ReceiverTest1(); + ReceiverTest2(); + ReceiverTest3(); + } else { + fprintf(stderr, "*** This program uses exactly 2 processes! ***\n"); + exit(-1); + } + Test_Waitforall( ); + if (myrank == dest) { + int rval; + rval = Summarize_Test_Results(); + Test_Finalize(); + MPI_Finalize(); + return rval; + } + else { + Test_Finalize(); + MPI_Finalize(); + return 0; + } +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/isndrcv2.c b/teshsuite/smpi/mpich-test/pt2pt/isndrcv2.c new file mode 100644 index 0000000000..531e51bc98 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/isndrcv2.c @@ -0,0 +1,41 @@ +#include +#include "mpi.h" + +int main( int argc, char **argv ) +{ + int rank, size; + MPI_Request r1, r2; + MPI_Status s; + int buf[10000], buf2[10000], count, tag1, tag2; + + count = 10000; + tag1 = 100; + tag2 = 1000; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + if (rank == 0) { + MPI_Isend( buf, count, MPI_INT, 1, tag1, MPI_COMM_WORLD, &r1 ); + MPI_Isend( buf2, count, MPI_INT, 1, tag2, MPI_COMM_WORLD, &r2 ); + MPI_Wait( &r1, &s ); + MPI_Wait( &r2, &s ); + } + else if (rank == 1) { + MPI_Irecv( buf2, count, MPI_INT, 0, tag2, MPI_COMM_WORLD, &r2 ); + MPI_Irecv( buf, count, MPI_INT, 0, tag1, MPI_COMM_WORLD, &r1 ); + MPI_Wait( &r2, &s ); + if (s.MPI_TAG != tag2) { + printf( "Error in receive order\n" ); + } + MPI_Wait( &r1, &s ); + } + + MPI_Barrier( MPI_COMM_WORLD ); + if (rank == 0) { + printf( "Test completed\n" ); + } + MPI_Finalize( ); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/issend2.c b/teshsuite/smpi/mpich-test/pt2pt/issend2.c new file mode 100644 index 0000000000..0ff413a4d8 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/issend2.c @@ -0,0 +1,102 @@ +/* -*- Mode: C; c-basic-offset:4 ; -*- */ +/* This program comes from Bert Still, bert@h4p.llnl.gov + It caused problems for the T3D implementation. + */ +#include +#include "mpi.h" +#include "test.h" + +#define MESSAGE_TAG 8 +#define MESSAGE_VALUE 6 +#define MESSAGE_TYPE MPI_BYTE +#define MESSAGE_CTYPE char +static MESSAGE_CTYPE recv_msg[8]; +static MESSAGE_CTYPE send_msg[8]; + +static MPI_Status recv_status; +static MPI_Status send_status[2]; +static MPI_Request request[2]; +static int complete[2]; + +/*------------------------------------------------------------------------*/ + +void fatal ( int,const char * ); + +void fatal(rank, msg) +int rank; +const char *msg; +{ + printf("***FATAL** rank %d: %s\n", rank, msg); + MPI_Abort(MPI_COMM_WORLD, 1); + exit(1); +} + +int verbose = 0; +int main( int argc, char *argv[] ) +{ + int size, rank; + int err=0, toterr; + + if (MPI_Init(&argc, &argv)!=MPI_SUCCESS) fatal(-1, "MPI_Init failed"); + + if (MPI_Comm_size(MPI_COMM_WORLD, &size)!=MPI_SUCCESS) + fatal(-1, "MPI_Comm_size failed"); + if (MPI_Comm_rank(MPI_COMM_WORLD, &rank)!=MPI_SUCCESS) + fatal(-1, "MPI_Comm_rank failed"); + if (size!=2) fatal(rank, "issend2 test requires -np 2\n"); + + if (rank) { + if (MPI_Probe(MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + &recv_status)!=MPI_SUCCESS) + fatal(rank, "MPI_Probe failed"); + if (recv_status.MPI_SOURCE!=0 || recv_status.MPI_TAG!=MESSAGE_TAG) + fatal(rank, "message source or tag wrong"); + if (MPI_Recv(recv_msg, 8, MESSAGE_TYPE, + recv_status.MPI_SOURCE, recv_status.MPI_TAG, MPI_COMM_WORLD, + &recv_status)!=MPI_SUCCESS) + fatal(rank, "MPI_Recv failed"); + if (recv_msg[0] == MESSAGE_VALUE) { + if (verbose) printf( "test completed successfully\n" ); + } + else { + printf("test failed: rank %d: got %d but expected %d\n", + rank, recv_msg[0], MESSAGE_VALUE ); + err++; + } + + fflush(stdout); + + if (recv_msg[0]!=MESSAGE_VALUE) + fatal(rank, "received message doesn't match sent message"); + + } else { + int n_complete; + + send_msg[0]= MESSAGE_VALUE; + + if (MPI_Issend(send_msg, 1, MESSAGE_TYPE, /*rank*/1, MESSAGE_TAG, + MPI_COMM_WORLD, request) != MPI_SUCCESS) + fatal(rank, "MPI_Issend failed"); + if (MPI_Waitsome(1, request, &n_complete, complete,send_status) != + MPI_SUCCESS) + fatal(rank, "MPI_Waitsome failed"); + if (request[0]!=MPI_REQUEST_NULL || n_complete!=1 || complete[0]!=0) + fatal(rank, "Waitsome result is wrong"); + } + + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } + /* printf("rank %d: about to finalize\n", rank); */ + fflush(stdout); + MPI_Finalize(); + /* printf("rank %d: finalize completed\n", rank); */ + fflush(stdout); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/issendinit.c b/teshsuite/smpi/mpich-test/pt2pt/issendinit.c new file mode 100644 index 0000000000..42588d2d20 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/issendinit.c @@ -0,0 +1,104 @@ +/* + * Program to test that the "synchronous send" semantics + * of point to point communications in MPI is (probably) satisfied. + * This is done by starting two synchronous sends and then testing that + * they do not complete until the matchine receives are issued. + */ + +#include +#include "test.h" +#include "mpi.h" + +#define SIZE 10000 +/* Amount of time in seconds to wait for the receipt of the second Ssend + message */ +#define MAX_TIME 20 +static int src = 1; +static int dest = 0; + +/* Prototypes for picky compilers */ +void Generate_Data ( int *, int ); + +void Generate_Data(buffer, buff_size) +int *buffer; +int buff_size; +{ + int i; + + for (i = 0; i < buff_size; i++) + buffer[i] = i+1; +} + +int main( int argc, char **argv ) +{ + int rank; /* My Rank (0 or 1) */ + int act_size = 1000; + int flag; + int buffer[SIZE]; + double t0; + char *Current_Test = NULL; + MPI_Status status; + MPI_Request r[2]; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == src) { + Test_Init("issendinit", rank); + Generate_Data(buffer, SIZE); + Current_Test = (char*)"Ssend_init waits for recv"; + MPI_Recv( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD, &status ); + MPI_Send( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD ); + MPI_Ssend_init( buffer, act_size, MPI_INT, dest, 1, MPI_COMM_WORLD, + &r[0] ); + MPI_Ssend_init( buffer, act_size, MPI_INT, dest, 2, MPI_COMM_WORLD, + &r[1] ); + MPI_Startall( 2, r ); + t0 = MPI_Wtime(); + flag = 0; + while (MPI_Wtime() - t0 < MAX_TIME) { + MPI_Test( &r[0], &flag, &status ); + if (flag) { + Test_Failed(Current_Test); + break; + } + } + if (!flag) + Test_Passed(Current_Test); + MPI_Wait( &r[1], &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, dest, 13, + MPI_BOTTOM, 0, MPI_INT, dest, 13, + MPI_COMM_WORLD, &status ); + MPI_Wait( &r[0], &status ); + MPI_Request_free( &r[0] ); + MPI_Request_free( &r[1] ); + Test_Waitforall( ); + { + int rval = Summarize_Test_Results(); /* Returns number of tests; + that failed */ + Test_Finalize(); + MPI_Finalize(); + return rval; + } + + } else if (rank == dest) { + MPI_Send( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD ); + MPI_Recv( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD, &status ); + MPI_Recv( buffer, act_size, MPI_INT, src, 2, MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, src, 13, + MPI_BOTTOM, 0, MPI_INT, src, 13, + MPI_COMM_WORLD, &status ); + MPI_Recv( buffer, act_size, MPI_INT, src, 1, MPI_COMM_WORLD, &status ); + /* Test 1 */ + Test_Waitforall( ); + MPI_Finalize(); + } else { + fprintf(stderr, "*** This program uses exactly 2 processes! ***\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/issendtest.c b/teshsuite/smpi/mpich-test/pt2pt/issendtest.c new file mode 100644 index 0000000000..80a9ed1269 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/issendtest.c @@ -0,0 +1,131 @@ +/* + * Program to test that the "synchronous send" semantics + * of point to point communications in MPI is (probably) satisfied. + * This uses tests on the completions of the SENDS (unlike the MPI_Ssend + * test) since the Issends return "immediately" but can not complete + * until the matching receive begins. + * + * This program has been patterned off of "overtake.c" + * + * William Gropp + * gropp@mcs.anl.gov + */ + +#include +#include "test.h" +#include "mpi.h" + +#define SIZE 10000 +/* Amount of time in seconds to wait for the receipt of the second Ssend + message */ +#define MAX_TIME 20 +static int src = 1; +static int dest = 0; + +/* Prototypes for picky compilers */ +void Generate_Data ( int *, int ); + +void Generate_Data( int *buffer, int buff_size) +{ + int i; + + for (i = 0; i < buff_size; i++) + buffer[i] = i+1; +} + +int main( int argc, char **argv) +{ + int rank; /* My Rank (0 or 1) */ + int act_size = 1000; + int flag; + int buffer[SIZE]; + double t0; + char *Current_Test = NULL; + MPI_Status status; + MPI_Request r1, r2; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + /* This test depends on a working wtime. Make a simple check */ + Current_Test = (char*)"Testing timer"; + t0 = MPI_Wtime(); + if (t0 == 0 && MPI_Wtime() == 0) { + int loopcount = 1000000; + /* This test is too severe (systems with fast + processors and large MPI_Wtick values can + fail. Try harder to test MPI_Wtime */ + while (loopcount-- && MPI_Wtime() == 0) ; + if (loopcount <= 0) { + fprintf( stderr, + "MPI_WTIME is returning 0; a working value is needed\n\ +for this test.\n" ); + Test_Failed(Current_Test); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + t0 = MPI_Wtime(); + } + /* Test that the timer increases */ + Current_Test = (char*)"Testing timer increases"; + for (flag=0; flag<1000000; flag++) { + if (MPI_Wtime() > t0) break; + } + if (flag >= 1000000) { + fprintf( stderr, "MPI_WTIME is not returning increasing values!\n" ); + Test_Failed(Current_Test); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + Current_Test = (char*)"Issend waits for recv"; + if (rank == src) { + Test_Init("issendtest", rank); + Generate_Data(buffer, SIZE); + MPI_Recv( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD, &status ); + MPI_Send( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD ); + MPI_Issend( buffer, act_size, MPI_INT, dest, 1, MPI_COMM_WORLD, &r1 ); + MPI_Issend( buffer, act_size, MPI_INT, dest, 2, MPI_COMM_WORLD, &r2 ); + t0 = MPI_Wtime(); + flag = 0; + while ( (MPI_Wtime() - t0) < MAX_TIME) { + MPI_Test( &r1, &flag, &status ); + if (flag) { + Test_Failed(Current_Test); + break; + } + } + if (!flag) + Test_Passed(Current_Test); + MPI_Wait( &r2, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, dest, 13, + MPI_BOTTOM, 0, MPI_INT, dest, 13, + MPI_COMM_WORLD, &status ); + MPI_Wait( &r1, &status ); + Test_Waitforall( ); + { + int rval = Summarize_Test_Results(); /* Returns number of tests; + that failed */ + Test_Finalize(); + MPI_Finalize(); + return rval; + } + + } else if (rank == dest) { + /* Test 1 */ + MPI_Send( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD ); + MPI_Recv( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD, &status ); + MPI_Recv( buffer, act_size, MPI_INT, src, 2, MPI_COMM_WORLD, &status ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, src, 13, + MPI_BOTTOM, 0, MPI_INT, src, 13, + MPI_COMM_WORLD, &status ); + MPI_Recv( buffer, act_size, MPI_INT, src, 1, MPI_COMM_WORLD, &status ); + + Test_Waitforall( ); + Test_Finalize(); + MPI_Finalize(); + } else { + fprintf(stderr, "*** This program uses exactly 2 processes! ***\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/longmsgs.c b/teshsuite/smpi/mpich-test/pt2pt/longmsgs.c new file mode 100644 index 0000000000..154c945ba7 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/longmsgs.c @@ -0,0 +1,201 @@ +#include "test.h" +#include "mpi.h" +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif + +#define MIN_MESSAGE_LENGTH 256 +#define MAX_MESSAGE_LENGTH (16*1024*1024) +#define TAG1 1 +#define TAG2 2 +#define TAG3 3 +#define TAG4 4 +#define TAGSR 101 + +int verbose = 0; + +void Resetbuf( char *, int ); +void Checkbuf( char *, int, MPI_Status * ); + +void Resetbuf( char *buf, int len ) +{ + int i; + for (i=0; i 10) break; + } + ival++; + } + if (err) MPI_Abort( MPI_COMM_WORLD, 1 ); +} + +int main( int argc, char *argv[] ) +{ + int msglen, i; + int msglen_min = MIN_MESSAGE_LENGTH; + int msglen_max = MAX_MESSAGE_LENGTH; + int rank,poolsize,Master; + char *sendbuf,*recvbuf; + char ival; + MPI_Request request; + MPI_Status status; + + MPI_Init(&argc,&argv); + MPI_Comm_size(MPI_COMM_WORLD,&poolsize); + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + + if(poolsize != 2) { + printf("Expected exactly 2 MPI processes\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + +/* + The following test allows this test to run on small-memory systems + that support the sysconf call interface. This test keeps the test from + becoming swap-bound. For example, on an old Linux system or a + Sony Playstation 2 (really!) + */ +#if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) + { + long n_pages, pagesize; + int actmsglen_max; + n_pages = sysconf( _SC_PHYS_PAGES ); + pagesize = sysconf( _SC_PAGESIZE ); + /* We want to avoid integer overflow in the size calculation. + The best way is to avoid computing any products (such + as total memory = n_pages * pagesize) and instead + compute a msglen_max that fits within 1/4 of the available + pages */ + if (n_pages > 0 && pagesize > 0) { + /* Recompute msglen_max */ + int msgpages = 4 * ((msglen_max + pagesize - 1)/ pagesize); + while (n_pages < msgpages) { msglen_max /= 2; msgpages /= 2; } + } + /* printf ( "before = %d\n", msglen_max ); */ + MPI_Allreduce( &msglen_max, &actmsglen_max, 1, MPI_INT, + MPI_MIN, MPI_COMM_WORLD ); + msglen_max = actmsglen_max; + /* printf ( "after = %d\n", msglen_max ); */ + } +#endif + + Master = (rank == 0); + + if(Master && verbose) + printf("Size (bytes)\n------------\n"); + for(msglen = msglen_min; msglen <= msglen_max; msglen *= 2) { + + sendbuf = malloc(msglen); + recvbuf = malloc(msglen); + if(sendbuf == NULL || recvbuf == NULL) { + printf("Can't allocate %d bytes\n",msglen); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + ival = 0; + for (i=0; i +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +#ifndef MAXNP +#define MAXNP 16 +#endif + +/* + Test to make sure that nonblocking routines actually work. This + stresses them by sending large numbers of requests and receiving them + piecemeal. + */ +int main( int argc, char **argv ) +{ + int count, tag, nsend, myid, np, rcnt, scnt, i, j; + int *(sbuf[MAXNP]), *(rbuf[MAXNP]); + MPI_Status status; + MPI_Request *rsend, *rrecv; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &myid ); + MPI_Comm_size( MPI_COMM_WORLD, &np ); + + if (np > MAXNP) { + fprintf( stderr, + "This test must run with at most %d processes\n", MAXNP ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + nsend = 3 * np; + rsend = (MPI_Request *) malloc ( nsend * sizeof(MPI_Request) ); + rrecv = (MPI_Request *) malloc ( nsend * sizeof(MPI_Request) ); + if (!rsend || !rrecv) { + fprintf( stderr, "Failed to allocate space for requests\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + for (count = 1; count < 10000; count *= 2) { + for (i=0; i +#include +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + Test to make sure that nonblocking routines actually work + In this example, we assume that we do not know the message + sizes ahead of time. + + Just like nblock, but with the probe test. +*/ + +int main( int argc, char **argv ) +{ + int count, tag, nsend, myid, np, rcnt, scnt, i, j, *send_buf; + int length, finished; + int baselen = 1; + int **recv_buf; + MPI_Status status, rtn_status; + MPI_Request *rsend, *rrecv; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &myid ); + MPI_Comm_size( MPI_COMM_WORLD, &np ); +/* + MPE_Errors_call_dbx_in_xterm( (argv)[0], (char *)0 ); + MPE_Signals_call_debugger(); + */ + if (argc > 2 && argv[1] && strcmp( argv[1], "-first" ) == 0) + baselen = atoi(argv[2]); + +/* malloc buffers */ + nsend = 3 * np; + rsend = (MPI_Request *) malloc ( nsend * sizeof(MPI_Request) ); + rrecv = (MPI_Request *) malloc ( nsend * sizeof(MPI_Request) ); + recv_buf = (int **) malloc ( nsend * sizeof(int *) ); + if (!rsend || !rrecv) { + fprintf( stderr, "Failed to allocate space for requests\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + for (count = baselen; count < 10000; count *= 2) { + /* We'll send/recv from everyone */ + scnt = 0; + rcnt = 0; + + /* do sends */ + send_buf = (int *)malloc( count * sizeof(int) ); + for (j=0; j<3; j++) { + tag = j; + for (i=0; i +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char *argv[] ) +{ + int a[4]; + int i, nproc; + int rank, right, left; + MPI_Status status; + MPI_Request req[4]; + int index, it, count, errcnt = 0; + + /* start up */ + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + /* set up processor chain (Apps should use Cart_create/shift) */ + left = (rank == 0) ? MPI_PROC_NULL : rank - 1; + right = (rank == nproc - 1) ? MPI_PROC_NULL : rank + 1; + + /* initialize local matrix */ + /* globally: a[i] = i, i = 1 .. 2*nproc */ + /* locally : a[i] = 2*rank+i, i=1,2 */ + a[0] = -1; + a[1] = 2*rank + 1; + a[2] = 2*rank + 2; + a[3] = -1; + + /* start all receives and sends */ + MPI_Irecv(&a[0], 1, MPI_INT, left, 1, MPI_COMM_WORLD, &req[0]); + MPI_Irecv(&a[3], 1, MPI_INT, right, 0, MPI_COMM_WORLD, &req[3]); + MPI_Isend(&a[1], 1, MPI_INT, left, 0, MPI_COMM_WORLD, &req[1]); + MPI_Isend(&a[2], 1, MPI_INT, right, 1, MPI_COMM_WORLD, &req[2]); + + for (it=0; it<4; it++) { + status.MPI_SOURCE = nproc; + status.MPI_TAG = nproc; + MPI_Waitany( 4, req, &index, &status ); + if (index == 0 && left == MPI_PROC_NULL) { + if (status.MPI_TAG != MPI_ANY_TAG || + status.MPI_SOURCE != MPI_PROC_NULL) { + errcnt ++; + fprintf( stderr, "Incorrect null status for left\n" ); + } + MPI_Get_count( &status, MPI_INT, &count ); + if (count != 0) { + errcnt ++; + fprintf( stderr, "Incorrect null status for left (count)\n" ); + } + } + else if (index == 3 && right == MPI_PROC_NULL) { + if (status.MPI_TAG != MPI_ANY_TAG || + status.MPI_SOURCE != MPI_PROC_NULL) { + errcnt ++; + fprintf( stderr, "Incorrect null status for right\n" ); + } + MPI_Get_count( &status, MPI_INT, &count ); + if (count != 0) { + errcnt ++; + fprintf( stderr, "Incorrect null status for right (count)\n" ); + } + } + } + + /* Test results */ + if (left == MPI_PROC_NULL) { + if (a[0] != -1) { + fprintf( stderr, "Expected -1, found %d in left partner\n", a[0] ); + errcnt ++; + } + } + else { + if (a[0] != 2 * left + 2) { + fprintf( stderr, "Expected %d, found %d in left partner\n", + 2 * left + 2, a[0] ); + errcnt ++; + } + } + + if (right == MPI_PROC_NULL) { + if (a[3] != -1) { + fprintf( stderr, "Expected -1, found %d in right partner\n", a[3] ); + errcnt ++; + } + } + else { + if (a[3] != 2 * right + 1) { + fprintf( stderr, "Expected %d, found %d in right partner\n", + 2 * right + 1, a[3] ); + errcnt ++; + } + } + + + i = errcnt; + MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (rank == 0) { + if (errcnt > 0) { + printf( "Found %d errors in the run \n", errcnt ); + } + else + printf( "No errors in handling MPI_PROC_NULL\n" ); + } + + /* clean up */ + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/nullproc.std b/teshsuite/smpi/mpich-test/pt2pt/nullproc.std new file mode 100644 index 0000000000..a9124d5f50 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/nullproc.std @@ -0,0 +1 @@ +No errors in handling MPI_PROC_NULL diff --git a/teshsuite/smpi/mpich-test/pt2pt/nullproc2.c b/teshsuite/smpi/mpich-test/pt2pt/nullproc2.c new file mode 100644 index 0000000000..fcffd5a7f3 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/nullproc2.c @@ -0,0 +1,129 @@ +/* + * Test for null proc handling with blocking routines + */ + + +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char *argv[] ) +{ + int a[4]; + int i, nproc; + int rank, right, left; + MPI_Status st[2], sts[2]; + MPI_Request req[2]; + int count, errcnt = 0; + + /* start up */ + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + /* set up processor chain (Apps should use Cart_create/shift) */ + left = (rank == 0) ? MPI_PROC_NULL : rank - 1; + right = (rank == nproc - 1) ? MPI_PROC_NULL : rank + 1; + + /* initialize local matrix */ + /* globally: a[i] = i, i = 1 .. 2*nproc */ + /* locally : a[i] = 2*rank+i, i=1,2 */ + a[0] = -1; + a[1] = 2*rank + 1; + a[2] = 2*rank + 2; + a[3] = -1; + + /* start all receives and sends */ + MPI_Isend(&a[1], 1, MPI_INT, left, 0, MPI_COMM_WORLD, &req[0]); + MPI_Isend(&a[2], 1, MPI_INT, right, 1, MPI_COMM_WORLD, &req[1]); + st[0].MPI_SOURCE = nproc; + st[0].MPI_TAG = -1; + st[1].MPI_SOURCE = nproc; + st[1].MPI_TAG = -1; + MPI_Recv(&a[0], 1, MPI_INT, left, 1, MPI_COMM_WORLD, &st[0]); + MPI_Recv(&a[3], 1, MPI_INT, right, 0, MPI_COMM_WORLD, &st[1]); + MPI_Waitall( 2, req, sts ); + + /* Test the end points */ + if (left == MPI_PROC_NULL) { + if (st[0].MPI_TAG != MPI_ANY_TAG || + st[0].MPI_SOURCE != MPI_PROC_NULL) { + errcnt ++; + fprintf( stderr, "Incorrect null status for left\n" ); + if (st[0].MPI_SOURCE != MPI_PROC_NULL) { + fprintf( stderr, "Source returned was %d but should be %d\n", + st[0].MPI_SOURCE, MPI_PROC_NULL ); + } + } + MPI_Get_count( &st[0], MPI_INT, &count ); + if (count != 0) { + errcnt ++; + fprintf( stderr, "Incorrect null status for left (count)\n" ); + fprintf( stderr, "Count was %d but should be 0\n", count ); + } + } + else if (right == MPI_PROC_NULL) { + if (st[1].MPI_TAG != MPI_ANY_TAG || + st[1].MPI_SOURCE != MPI_PROC_NULL) { + errcnt ++; + fprintf( stderr, "Incorrect null status for right\n" ); + if (st[1].MPI_SOURCE != MPI_PROC_NULL) { + fprintf( stderr, "Source returned was %d but should be %d\n", + st[1].MPI_SOURCE, MPI_PROC_NULL ); + } + } + MPI_Get_count( &st[1], MPI_INT, &count ); + if (count != 0) { + errcnt ++; + fprintf( stderr, "Incorrect null status for right (count)\n" ); + fprintf( stderr, "Count was %d but should be 0\n", count ); + } + } + + /* Test results */ + if (left == MPI_PROC_NULL) { + if (a[0] != -1) { + fprintf( stderr, "Expected -1, found %d in left partner\n", a[0] ); + errcnt ++; + } + } + else { + if (a[0] != 2 * left + 2) { + fprintf( stderr, "Expected %d, found %d in left partner\n", + 2 * left + 2, a[0] ); + errcnt ++; + } + } + + if (right == MPI_PROC_NULL) { + if (a[3] != -1) { + fprintf( stderr, "Expected -1, found %d in right partner\n", a[3] ); + errcnt ++; + } + } + else { + if (a[3] != 2 * right + 1) { + fprintf( stderr, "Expected %d, found %d in right partner\n", + 2 * right + 1, a[3] ); + errcnt ++; + } + } + + + i = errcnt; + MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (rank == 0) { + if (errcnt > 0) { + printf( "Found %d errors in the run \n", errcnt ); + } + else + printf( "No errors in handling MPI_PROC_NULL\n" ); + } + + /* clean up */ + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/nullproc2.std b/teshsuite/smpi/mpich-test/pt2pt/nullproc2.std new file mode 100644 index 0000000000..a9124d5f50 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/nullproc2.std @@ -0,0 +1 @@ +No errors in handling MPI_PROC_NULL diff --git a/teshsuite/smpi/mpich-test/pt2pt/order.c b/teshsuite/smpi/mpich-test/pt2pt/order.c new file mode 100644 index 0000000000..2701dd3ead --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/order.c @@ -0,0 +1,71 @@ +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + + +int main( int argc, char *argv[] ) +{ + int easy; + int rank; + int size; + int a; + int b; + MPI_Request request; + MPI_Status status; + double t0; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + /* This test depends on a working wtime. Make a simple check */ + t0 = MPI_Wtime(); + if (t0 == 0 && MPI_Wtime() == 0) { + int loopcount = 1000000; + /* This test is too severe (systems with fast + processors and large MPI_Wtick values can + fail. Try harder to test MPI_Wtime */ + while (loopcount-- && MPI_Wtime() == 0) ; + if (loopcount <= 0) { + fprintf( stderr, + "MPI_WTIME is returning 0; a working value is needed\n\ +for this test.\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + t0 = MPI_Wtime(); + } + + easy = 1; + + MPI_Barrier( MPI_COMM_WORLD ); + if (rank == 0) + { + MPI_Irecv(&a, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &request); + MPI_Recv(&b, 1, MPI_INT, 1, 0, MPI_COMM_WORLD, &status); + MPI_Wait(&request, &status); + /* Check for correct values: */ + if (a == 1 && b == 2) { + printf( " No Errors\n" ); + } + else { + printf("rank = %d, a = %d, b = %d\n", rank, a, b); + } + } + else + { + MPI_Wtime(); + smpi_sleep(easy); + //while (MPI_Wtime() - t1 < easy) ; + a = 1; + b = 2; + MPI_Send(&a, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); + MPI_Send(&b, 1, MPI_INT, 0, 0, MPI_COMM_WORLD); + } + + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/overtake.c b/teshsuite/smpi/mpich-test/pt2pt/overtake.c new file mode 100644 index 0000000000..209285f75e --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/overtake.c @@ -0,0 +1,290 @@ +/* + * Program to test that the "no overtaking messages" semantics + * of point to point communications in MPI is satisfied. + * A long message is sent using MPI_Send and received using MPI_Recv, + * followed by lots of short messages sent the same way. + * Then Send -> Irecv, Bsend -> Recv, Bsend -> Irecv, + * Isend -> Recv, and Isend -> Irecv are all tried in the + * same way. + * + * Patrick Bridges + * bridges@mcs.anl.gov + * patrick@CS.MsState.Edu + */ + +#include +#include +#include "test.h" +#include "mpi.h" + +#define SIZE 10000 + +static int src = 0; +static int dest = 1; + +/* Which tests to perform (not yet implemented) */ +/* static int Do_Buffer = 1; */ +/* static int Do_Standard = 1; */ +/* In order to quiet noisy C compilers, we provide ANSI-style prototypes + where possible */ +void Generate_Data ( double *, int ); +void Normal_Test_Send ( double *, int ); +void Normal_Test_Recv ( double *, int ); +void Buffered_Test_Send ( double *, int ); +void Buffered_Test_Recv ( double *, int ); +void Async_Test_Send ( double *, int ); +void Async_Test_Recv ( double *, int ); +int Check_Data ( double *, int ); +void Clear_Buffer ( double *, int ); + + +void Generate_Data(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + + for (i = 0; i < buff_size; i++) + buffer[i] = (double)i+1; +} + +void Normal_Test_Send(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j; + + for (j = 0; j < 2; j++) { + /* send a long message */ + MPI_Send(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000, + MPI_COMM_WORLD); + buffer += buff_size/2 - 10; + /* Followed by 10 short ones */ + for (i = 0; i < 10; i++) + MPI_Send(buffer++, 1, MPI_DOUBLE, dest, 2000, MPI_COMM_WORLD); + } +} + +void Normal_Test_Recv(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j; + MPI_Status Stat; + + for (j = 0; j < 2; j++) { + /* Receive a long message */ + MPI_Recv(buffer, (buff_size/2 - 10), MPI_DOUBLE, src, + 2000, MPI_COMM_WORLD, &Stat); + buffer += buff_size/2 - 10; + /* Followed by 10 short ones */ + for (i = 0; i < 10; i++) + MPI_Recv(buffer++, 1, MPI_DOUBLE, src, 2000, MPI_COMM_WORLD, &Stat); + } +} + +void Buffered_Test_Send(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j; + void *bbuffer; + int size; + + for (j = 0; j < 2; j++) { + /* send a long message */ + MPI_Bsend(buffer, (buff_size/2 - 10), MPI_DOUBLE, dest, 2000, + MPI_COMM_WORLD); + buffer += buff_size/2 - 10; + /* Followed by 10 short ones */ + for (i = 0; i < 10; i++) + MPI_Bsend(buffer++, 1, MPI_DOUBLE, + dest, 2000, MPI_COMM_WORLD); + /* Force this set of Bsends to complete */ + MPI_Buffer_detach( &bbuffer, &size ); + MPI_Buffer_attach( bbuffer, size ); + } +} + +void Async_Test_Send(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j, req = 0; + MPI_Status Stat[22]; + MPI_Request Hand[22]; + + for (j = 0; j < 2; j++) { + /* send a long message */ + MPI_Isend(buffer, (buff_size/2 - 10), MPI_DOUBLE, + dest, 2000, MPI_COMM_WORLD, &(Hand[req++])); + buffer += buff_size/2 - 10; + /* Followed by 10 short ones */ + for (i = 0; i < 10; i++) + MPI_Isend(buffer++, 1, MPI_DOUBLE, dest, 2000, + MPI_COMM_WORLD, &(Hand[req++])); + } + MPI_Waitall(req, Hand, Stat); +} + +void Async_Test_Recv(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i, j, req = 0; + MPI_Status Stat[22]; + MPI_Request Hand[22]; + + for (j = 0; j < 2; j++) { + /* Receive a long message */ + MPI_Irecv(buffer, (buff_size/2 - 10), MPI_DOUBLE, src, + 2000, MPI_COMM_WORLD, &(Hand[req++])); + buffer += buff_size/2 - 10; + /* Followed by 10 short ones */ + for (i = 0; i < 10; i++) + MPI_Irecv(buffer++, 1, MPI_DOUBLE, src, 2000, + MPI_COMM_WORLD, &(Hand[req++])); + } + MPI_Waitall(req, Hand, Stat); +} + +int Check_Data(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + int err = 0; + + for (i = 0; i < buff_size; i++) + if (buffer[i] != (i + 1)) { + err++; + fprintf( stderr, "Value at %d is %f, should be %f\n", i, + buffer[i], (double)(i+1) ); + if (err > 10) return 1; + } + return err; +} + +void Clear_Buffer(buffer, buff_size) +double *buffer; +int buff_size; +{ + int i; + for (i = 0; i < buff_size; i++) + buffer[i] = -1; +} + + +int main( int argc, char **argv ) +{ + int rank; /* My Rank (0 or 1) */ + double buffer[SIZE], *tmpbuffer, *tmpbuf; + int tsize, bsize; + char *Current_Test = NULL; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + + if (rank == src) { + Generate_Data(buffer, SIZE); + Normal_Test_Send(buffer, SIZE); + Normal_Test_Send(buffer, SIZE); +#if !defined(SIMPLE_SENDS) && !defined(NO_BUFFERED_SENDS) + MPI_Pack_size( SIZE, MPI_DOUBLE, MPI_COMM_WORLD, &bsize ); + tmpbuffer = (double *) malloc( bsize + MPI_BSEND_OVERHEAD ); + if (!tmpbuffer) { + fprintf( stderr, "Could not allocate bsend buffer of size %d\n", + bsize ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + MPI_Buffer_attach( tmpbuffer, bsize + MPI_BSEND_OVERHEAD ); + Buffered_Test_Send(buffer, SIZE); + Buffered_Test_Send(buffer, SIZE); + MPI_Buffer_detach( &tmpbuf, &tsize ); +#endif +#if !defined(SIMPLE_SENDS) && !defined(NO_ASYNC_SENDS) + Async_Test_Send(buffer, SIZE); + Async_Test_Send(buffer, SIZE); +#endif + Test_Waitforall( ); + + } else if (rank == dest) { + Test_Init("overtake", rank); + /* Test 1 */ + Current_Test = (char*)"Overtaking Test (Normal Send -> Normal Recieve)"; + Normal_Test_Recv(buffer, SIZE); + + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); + + /* Test 2 */ + Clear_Buffer(buffer, SIZE); + Current_Test = (char*)"Overtaking Test (Normal Send -> Async Receive)"; + Async_Test_Recv(buffer, SIZE); + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); + +#if !defined(SIMPLE_SENDS) && !defined(NO_BUFFERED_SENDS) + /* Test 3 */ + Current_Test = (char*)"Overtaking Test (Buffered Send -> Normal Recieve)"; + Clear_Buffer(buffer, SIZE); + Normal_Test_Recv(buffer, SIZE); + + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); + + /* Test 4 */ + Clear_Buffer(buffer, SIZE); + Current_Test = (char*)"Overtaking Test (Buffered Send -> Async Receive)"; + Async_Test_Recv(buffer, SIZE); + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); +#endif + +#if !defined(SIMPLE_SENDS) && !defined(NO_ASYNC_SENDS) + /* Test 5 */ + Current_Test = (char*)"Overtaking Test (Async Send -> Normal Receive)"; + Clear_Buffer(buffer, SIZE); + Normal_Test_Recv(buffer, SIZE); + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); + + /* Test 6 */ + Clear_Buffer(buffer, SIZE); + Current_Test = (char*)"Overtaking Test (Async Send -> Async Receive)"; + Async_Test_Recv(buffer, SIZE); + if (Check_Data(buffer, SIZE)) + Test_Failed(Current_Test); + else + Test_Passed(Current_Test); +#endif + + Test_Waitforall( ); + { + int rval = Summarize_Test_Results(); /* Returns number of tests; + that failed */ + Test_Finalize(); + MPI_Finalize(); + return rval; + } + } else { + fprintf(stderr, "*** This program uses exactly 2 processes! ***\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + MPI_Finalize(); + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/pack.c b/teshsuite/smpi/mpich-test/pt2pt/pack.c new file mode 100644 index 0000000000..ee9a2ddc68 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/pack.c @@ -0,0 +1,77 @@ +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + Check pack/unpack of mixed datatypes. + */ +#define BUF_SIZE 100 +int main( int argc, char **argv ) +{ + int myrank; + char buffer[BUF_SIZE]; + int n, size, src, dest, errcnt, errs; + double a,b; + int pos; + + MPI_Status status; + MPI_Init(&argc, &argv); + + MPI_Comm_rank(MPI_COMM_WORLD, &myrank); + + src = 0; + dest = 1; + + src = 1; + dest = 0; + + errcnt = 0; + if (myrank == src) + { + pos = 0; + n = 10; + a = 1.1; + b = 2.2; + MPI_Pack(&n, 1, MPI_INT, buffer, BUF_SIZE, &pos, MPI_COMM_WORLD); + MPI_Pack(&a, 1, MPI_DOUBLE, buffer, BUF_SIZE, &pos, + MPI_COMM_WORLD); + MPI_Pack(&b, 1, MPI_DOUBLE, buffer, BUF_SIZE, &pos, + MPI_COMM_WORLD); + /* printf( "%d\n", pos ); */ + MPI_Send(&pos, 1, MPI_INT, dest, 999, MPI_COMM_WORLD); + MPI_Send(buffer, pos, MPI_PACKED, dest, 99, MPI_COMM_WORLD); + } + else + { + MPI_Recv(&size, 1, MPI_INT, src, 999, MPI_COMM_WORLD, &status); + MPI_Recv(buffer, size, MPI_PACKED, src, 99, + MPI_COMM_WORLD, &status); + pos = 0; + MPI_Unpack(buffer, size, &pos, &n, 1, MPI_INT, MPI_COMM_WORLD); + MPI_Unpack(buffer, size, &pos, &a, 1, MPI_DOUBLE, MPI_COMM_WORLD); + MPI_Unpack(buffer, size, &pos, &b, 1, MPI_DOUBLE, MPI_COMM_WORLD); + /* Check results */ + if (n != 10) { + errcnt++; + printf( "Wrong value for n; got %d expected %d\n", n, 10 ); + } + if (a != 1.1) { + errcnt++; + printf( "Wrong value for a; got %f expected %f\n", a, 1.1 ); + } + if (b != 2.2) { + errcnt++; + printf( "Wrong value for b; got %f expected %f\n", b, 2.2 ); + } + } + MPI_Allreduce( &errcnt, &errs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (myrank == 0) { + if (errs == 0) printf( "No errors\n" ); + else printf( "%d errors\n", errs ); + } + MPI_Finalize(); +return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/persist.c b/teshsuite/smpi/mpich-test/pt2pt/persist.c new file mode 100644 index 0000000000..7e1776286a --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/persist.c @@ -0,0 +1,54 @@ +#include "mpi.h" +#include +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + * This example causes the IBM SP2 MPI version to generate the message + * ERROR: 0032-158 Persistent request already active (2) in MPI_Startall, task 0 + * in the SECOND set of MPI_Startall (after the MPI_Request_free). + */ +int main( int argc, char **argv ) +{ + MPI_Request r[4]; + MPI_Status statuses[4]; + double sbuf1[10], sbuf2[10]; + double rbuf1[10], rbuf2[10]; + int size, rank, up_nbr, down_nbr, i; + + MPI_Init( &argc, &argv ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + up_nbr = (rank + 1) % size; + down_nbr = (size + rank - 1) % size; + + MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] ); + MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] ); + MPI_Send_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] ); + MPI_Send_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] ); + MPI_Startall( 4, r ); + MPI_Waitall( 4, r, statuses ); + + for (i=0; i<4; i++) { + MPI_Request_free( &r[i] ); + } + + MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] ); + MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] ); + MPI_Send_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] ); + MPI_Send_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] ); + MPI_Startall( 4, r ); + MPI_Waitall( 4, r, statuses ); + + for (i=0; i<4; i++) { + MPI_Request_free( &r[i] ); + } + + if (rank == 0) printf( " No Errors\n" ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/persist2.c b/teshsuite/smpi/mpich-test/pt2pt/persist2.c new file mode 100644 index 0000000000..7bdfeaf21a --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/persist2.c @@ -0,0 +1,80 @@ +#include "mpi.h" +#include +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + */ +int main( int argc, char **argv ) +{ + MPI_Request r[4]; + MPI_Status statuses[4]; + double sbuf1[10], sbuf2[10]; + double rbuf1[10], rbuf2[10]; + double userbuf[40+4*MPI_BSEND_OVERHEAD]; + int size, rank, up_nbr, down_nbr, i, err, toterr; + + MPI_Init( &argc, &argv ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + up_nbr = (rank + 1) % size; + down_nbr = (size + rank - 1) % size; + + for (i=0; i<10; i++) { + sbuf1[i] = (double)i; + sbuf2[i] = (double)(i+20); + } + MPI_Buffer_attach( userbuf, 40*sizeof(double) + 4 * MPI_BSEND_OVERHEAD ); + + MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] ); + MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] ); + MPI_Bsend_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] ); + MPI_Bsend_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] ); + MPI_Startall( 4, r ); + MPI_Waitall( 4, r, statuses ); + + for (i=0; i<4; i++) { + MPI_Request_free( &r[i] ); + } + + MPI_Recv_init( rbuf1, 10, MPI_DOUBLE, down_nbr, 0, MPI_COMM_WORLD, &r[0] ); + MPI_Recv_init( rbuf2, 10, MPI_DOUBLE, up_nbr, 1, MPI_COMM_WORLD, &r[1] ); + MPI_Bsend_init( sbuf1, 10, MPI_DOUBLE, up_nbr, 0, MPI_COMM_WORLD, &r[2] ); + MPI_Bsend_init( sbuf2, 10, MPI_DOUBLE, down_nbr, 1, MPI_COMM_WORLD, &r[3] ); + MPI_Startall( 4, r ); + MPI_Waitall( 4, r, statuses ); + + for (i=0; i<4; i++) { + MPI_Request_free( &r[i] ); + } + + /* Check data */ + err = 0; + for (i=0; i<10;i++) { + if (rbuf1[i] != i) { + err++; + if (err < 10) + fprintf( stderr, "Expected %d, rbuf1[%d] = %f\n", i, i, + rbuf1[i] ); + } + if (rbuf2[i] != i+20) { + err++; + if (err < 10) + fprintf( stderr, "Expected %d, rbuf2[%d] = %f\n", i+20, i, + rbuf2[i] ); + } + } + + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (rank == 0) { + if (toterr == 0) printf( "No errors\n" ); + else printf( "Found %d errors\n", toterr ); + } + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/persistent.c b/teshsuite/smpi/mpich-test/pt2pt/persistent.c new file mode 100644 index 0000000000..7c8e21395f --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/persistent.c @@ -0,0 +1,56 @@ +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char **argv ) +{ + int rank, size, i, len, actlen, expected_len; + MPI_Request rq; + MPI_Status status; + double data[100]; + + len = 100; + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + if (size < 3 ) { + fprintf( stderr, "This test requires more than 2 proceses\n" ); + MPI_Finalize(); + return 1; + } + + if (rank == 0) { + MPI_Recv_init( data, len, MPI_DOUBLE, MPI_ANY_SOURCE, MPI_ANY_TAG, + MPI_COMM_WORLD, &rq ); + for (i=1; i, caused problems +C on t3d with -device=t3d -arch=cray_t3d -no_short_longs -nodevdebug +C +C +C This is a very time-consuming program on a workstation cluster. +C For this reason, I've modified it to do fewer tests (1/10 as many) +C +c +c This is a simple benchmark designed to measure the latency and bandwidth +c of a message-passing MIMD computer. It is currently set up to run with +c MPI. +c +c Compile (MPI mpich version 1.0.11 or later) with +c % mpif77 -o pong pong.f +c +c (mpif77 is a script that hides details about libraries from the user) +c +c Execute as +c % mpirun -np 2 pong +c +c Make sure that ~mpi/bin is in your path. +c +c Note that the MPI-specific calls are: +c +c MPI_INIT +c MPI_COMM_RANK +c MPI_COMM_SIZE +c +c MPI_Wtime +c MPI_Wtick +c +c MPI_SEND +c MPI_RECV +c +c MPI_FINALIZE +c +c Some care needs to be taken in using the +c appropriate timing routine. Check the value of MPI_Wtick() to see if +c the clock resolution is reasonable for your tests. +c +c The benchmark measures +c the time to send a message of length N bytes from node 0 to node 1 and +c receive an acknowledging copy of that message which node 1 sends back to +c node 0. Note that node 1 waits for the completion of its receive before +c sending the message back to node 0. Note also that the program is not +c necessarily optimal any given system, but is intended +c to provide a reasonably transparent baseline measurement. +c +c For message lengths len (= num of doubles * sizedouble), +c a total of msgspersample ping-pong message exchanges are made, +c and half of the average round-trip time (i.e. the one-way message +c time) is then fit by a linear function y(N) = a + b*N via a least squares +c linear regression. The coefficient a is then interpreted as the latency +c (time to send a 0-length message) and b as the inverse bandwidth (i.e. 1/b = +c bandwidth in bytes/sec) +c +c The entire procedure is repeated twice, with the bandwidth, latency, and +c measured and fitted values of the message times reported for each instance. +c +c The underlying message passing performance characteristics of a +c particular system may not necessarily be accurately modeled by the simple +c linear function assumed here. This may be reflected in a dependency of +c the observed latency and bandwidth on the range of message sizes used. +c +c Original author: +c R. Leary, San Diego Supercomputer Center +c leary@sdsc.edu 9/20/94 +c +c Modified for MPI 10/27/95 +c frost@sdsc.edu + +c +c =========================== program header =========================== +c + + program pong + implicit none + include 'mpif.h' + +c sizedouble = size in bytes of double precision element + integer sizedouble + parameter(sizedouble=8) + +c Note: set these parameters to one of 3 cases: +c 1. size (each sample) < packetization length of architecture +c 2. size (each sample) > packetization length of architecture +c 3. size (1st sample) < packetization length of architecture +c & size (all others) > packetization length of architecture +c +c Some known packetization lengths: +c Paragon ~1500 bytes +c Cray T3D ~1500 bytes +c TCP/IP networks 256-1024 bytes +c +c samples = the number of data points collected + integer samples + parameter(samples=40) +c initsamplesize = # of elements transmitted in 1st sample + integer initsamplesize + parameter(initsamplesize=125) +c samplesizeinc = sample size increase per iteration (linear rate) + integer samplesizeinc + parameter(samplesizeinc=125) +c parameter(samplesizeinc=1) +c msgspersample = the number of messages + integer msgspersample +c parameter(msgspersample=1000) + parameter(msgspersample=100) + +c The buffer array contains the message , while x(i) is the message size +c and y(i) the corresponding measured one-way average time. +c Note that buffer is a double precision array +c +c ibufcount = total number of elements in buffer + integer ibufcount + parameter(ibufcount=(initsamplesize+((samples-1)*samplesizeinc))) +c + double precision buffer(ibufcount) + double precision x(samples), y(samples) + double precision t1, t2 + double precision a, b, bandw + double precision sumx, sumy, sumxx, sumxy + double precision det, fit + + integer stat(MPI_STATUS_SIZE) + integer ierr, ierr1, ierr2 + integer nodenum, numprocs + integer idest + integer i, iter, sample + integer num + +c +c =========================== begin =========================== +c + + call MPI_INIT( ierr ) + call MPI_COMM_RANK( MPI_COMM_WORLD, nodenum, ierr ) + call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) + + if (numprocs .ne. 2) then + write (6,*) 'This program is only valid for 2 processors' + write (6,*) 'numprocs = ', numprocs + stop + endif + +c Put something into array + do 2 i=1,ibufcount + buffer(i) = dfloat(i) + 2 continue + + if (nodenum .eq. 0) then + write (6,*) ' MPI pong test' + write (6,*) ' samples = ', samples + write (6,*) ' initsamplesize = ', initsamplesize + write (6,*) ' samplesizeinc = ', samplesizeinc + write (6,*) ' msgspersample = ', msgspersample + write (6,*) ' ibufcount = ', ibufcount + write (6,98) MPI_Wtick() + write (6,*) + endif + 98 format (' clock resolution = ',e10.5) + + call MPI_BARRIER(MPI_COMM_WORLD, ierr) + +c +c =========================== main loop =========================== +c + +c Start main loop - iterate twice to generate two complete sets of timings + do 60 iter = 1,2 + do 40 sample = 1,samples + num = initsamplesize + ((sample-1)*samplesizeinc) + +c debug + write (6,99) nodenum, iter, sample, num + call MPI_BARRIER(MPI_COMM_WORLD, ierr) + 99 format ( 1x, 'PE = ', i1, ', iter = ',i1, + + ', sample = ', i3, ', num = ', i5 ) + +c Find initial elapsed time in seconds + + if(nodenum.eq.0) then +c Send message from node 0 to 1 and receive message from 1 + idest = 1 + t1 = MPI_Wtime() + do 20 i = 1,msgspersample + call MPI_SEND(buffer, num, MPI_DOUBLE_PRECISION, + + idest, 0, MPI_COMM_WORLD, ierr1) + call MPI_RECV(buffer, num, MPI_DOUBLE_PRECISION, + + MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + + stat, ierr2) + 20 continue + t2 = MPI_Wtime() + else +c Send message from node 1 to 0 and receive message from 0 + idest = 0 + t1 = MPI_Wtime() + do 21 i = 1,msgspersample + call MPI_RECV(buffer, num, MPI_DOUBLE_PRECISION, + + MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, + + stat, ierr2) + call MPI_SEND(buffer, num, MPI_DOUBLE_PRECISION, + + idest, 0, MPI_COMM_WORLD, ierr1) + 21 continue + t2 = MPI_Wtime() + endif + +c independent variable is message length: + x(sample) = dfloat(num * sizedouble) + +c dependent variable is average one-way transit time: + y(sample) = ((t2 - t1) * 0.5) / + + dfloat(msgspersample) + + 40 continue + +c now do linear least squares fit to data +c time = a + b*x + + if (nodenum .eq. 0) then + sumy = 0.d0 + sumx = 0.d0 + sumxy = 0.d0 + sumxx = 0. d0 + do 45 i=1,samples + sumx = sumx + x(i) + sumy = sumy + y(i) + sumxy = sumxy + ( x(i) * y(i) ) + sumxx = sumxx + ( x(i) * x(i) ) + 45 continue + + det = (dfloat(samples) * sumxx) - (sumx * sumx) + a = (1.d6 * ((sumxx * sumy) - (sumx * sumxy))) / det + b = (1.d6 * ((dfloat(samples) * sumxy) - (sumx * sumy))) / det + + write(6,*) + write(6,*) ' iter = ', iter + write(6,*) + write(6,*) ' least squares fit: time = a + b * (msg length)' + write(6,200) a + write(6,300) b + bandw = 1./b + write(6,400) bandw + write(6,*) + write(6,*) ' message observed fitted' + write(6,*) ' length(bytes) time(usec) time(usec)' + write(6,*) + do 50 i=1,samples + fit = a + b*x(i) + y(i) = y(i)*1.d6 + write(6,100) x(i),y(i),fit + 50 continue + endif + + 60 continue + +c +c =========================== end loop =========================== +c + + 100 format(3x,f8.0,5x,f12.2,5x,f12.2) + 200 format(5x,'a = latency = ',f8.2,' microseconds') + 300 format(5x,'b = inverse bandwidth = ' , f8.5,' secs/Mbyte') + 400 format(5x,'1/b = bandwidth = ',f8.2,' Mbytes/sec') + +c +c =========================== end program =========================== +c + + call MPI_FINALIZE(ierr) + + end diff --git a/teshsuite/smpi/mpich-test/pt2pt/probe.c b/teshsuite/smpi/mpich-test/pt2pt/probe.c new file mode 100644 index 0000000000..6d55b48185 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/probe.c @@ -0,0 +1,56 @@ +/* + This is a test of probe to receive a message of unknown length + */ + +#include +#include +#include "mpi.h" +#include "test.h" + +int main( int argc, char **argv ) +{ +int data, to, from, tag, maxlen, np, myid, src, dest; +MPI_Status status; + +MPI_Init( &argc, &argv ); +MPI_Comm_rank( MPI_COMM_WORLD, &myid ); +MPI_Comm_size( MPI_COMM_WORLD, &np ); + +/* dest writes out the received stats; for the output to be + consistant (with the final check), it should be procees 0 */ +if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) { + dest = np - 1; + src = 0; + } +else { + src = np - 1; + dest = 0; + } + +if (myid == src) { + to = dest; + tag = 2000; +#ifdef VERBOSE + printf( "About to send\n" ); +#endif + MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD ); + } +else { + tag = 2000; + from = MPI_ANY_SOURCE; + MPI_Probe( from, tag, MPI_COMM_WORLD, &status ); + MPI_Get_count( &status, MPI_INT, &maxlen ); + /* Here I'd normally allocate space; I'll just check that it is ok */ + if (maxlen > 1) + printf( "Error; size = %d\n", maxlen ); +#ifdef VERBOSE + printf( "About to receive\n" ); +#endif + MPI_Recv( &data, 1, MPI_INT, status.MPI_SOURCE, status.MPI_TAG, + MPI_COMM_WORLD, &status ); + } +MPI_Barrier( MPI_COMM_WORLD ); +Test_Waitforall( ); +MPI_Finalize(); +return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/probe1.c b/teshsuite/smpi/mpich-test/pt2pt/probe1.c new file mode 100644 index 0000000000..389283c39b --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/probe1.c @@ -0,0 +1,78 @@ +/* + This is a test of probe to receive a message of unknown type (used as a + server) + */ +#include +#include +#include "mpi.h" +#include "test.h" + +int main( int argc, char **argv ) +{ +int data, to, from, tag, maxlen, np, myid, flag, dest, src; +MPI_Status status, status1; + +MPI_Init( &argc, &argv ); +MPI_Comm_rank( MPI_COMM_WORLD, &myid ); +MPI_Comm_size( MPI_COMM_WORLD, &np ); + +/* dest writes out the received stats; for the output to be + consistant (with the final check), it should be procees 0 */ +if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) { + dest = np - 1; + src = 0; + } +else { + src = np - 1; + dest = 0; + } + +if (myid == src) { + to = dest; + tag = 2000; +#ifdef VERBOSE + printf( "About to send\n" ); +#endif + MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD ); + tag = 2001; +#ifdef VERBOSE + printf( "About to send 'done'\n" ); +#endif + MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD ); + } +else { + /* Server loop */ + while (1) { + tag = MPI_ANY_TAG; + from = MPI_ANY_SOURCE; + /* Should really use MPI_Probe, but functionally this will work + (it is less efficient, however) */ + do { + MPI_Iprobe( from, tag, MPI_COMM_WORLD, &flag, &status ); + } while (!flag); + if (status.MPI_TAG == 2001) { +#ifdef VERBOSE + printf( "Received terminate message\n" ); +#endif + /* Actually need to receive it ... */ + MPI_Recv( &data, 1, MPI_INT, status.MPI_SOURCE, + status.MPI_TAG, MPI_COMM_WORLD, &status1 ); + break; + } + if (status.MPI_TAG == 2000) { + MPI_Get_count( &status, MPI_INT, &maxlen ); + if (maxlen > 1) + printf( "Error; size = %d\n", maxlen ); +#ifdef VERBOSE + printf( "About to receive\n" ); +#endif + MPI_Recv( &data, 1, MPI_INT, status.MPI_SOURCE, + status.MPI_TAG, MPI_COMM_WORLD, &status1 ); + } + } + } +MPI_Barrier( MPI_COMM_WORLD ); +Test_Waitforall( ); +MPI_Finalize(); +return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/relrank.c b/teshsuite/smpi/mpich-test/pt2pt/relrank.c new file mode 100644 index 0000000000..6becaf753d --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/relrank.c @@ -0,0 +1,58 @@ +#include "mpi.h" +#include +#include "test.h" + +/* + * Test that receives are done by relative rank, and that the status value + * contains the relative rank + */ +int main( int argc, char **argv ) +{ + int rank, new_world_rank, size, order, errcnt = 0, i; + int tmpint = 0; + MPI_Comm new_world; + MPI_Status s; + + MPI_Init(&argc,&argv); + + MPI_Comm_rank(MPI_COMM_WORLD,&rank); + MPI_Comm_size(MPI_COMM_WORLD,&size); + + order = size - rank - 1; + MPI_Comm_split(MPI_COMM_WORLD, 0, order, &new_world); + + MPI_Comm_rank ( new_world, &new_world_rank ); + + /* Make sure that the split worked correctly */ + if (new_world_rank != order) { + errcnt ++; + fprintf( stderr, "Comm split did not properly order ranks!\n" ); + } + if (new_world_rank==0) { + MPI_Send(&tmpint, 1, MPI_INT, 1, 0, new_world); + /* printf("%d(%d): Sent message to: %d\n", new_world_rank, rank, 1); */ + } + else if (new_world_rank == 1) { + MPI_Recv(&tmpint, 1, MPI_INT, 0, 0, new_world,&s); + if (s.MPI_SOURCE != 0) { + errcnt++; + fprintf( stderr, + "Source incorrect in recv status (%d should be %d)\n", + s.MPI_SOURCE, 0 ); + } + /* + printf("%d(%d): Recv message from: -> %d(%d) <- these 2 should equal\n", + new_world_rank, rank, 0, s.MPI_SOURCE); + */ + } + + MPI_Comm_free( &new_world ); + i = errcnt; + MPI_Allreduce( &i, &errcnt, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (errcnt > 0) { + printf( "Found %d errors in the run\n", errcnt ); + } + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/reqcreate.c b/teshsuite/smpi/mpich-test/pt2pt/reqcreate.c new file mode 100644 index 0000000000..16646cba4d --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/reqcreate.c @@ -0,0 +1,85 @@ +#include +#include "mpi.h" +#include +#include "test.h" + +/* Test request creation */ + +int main( int argc, char **argv ) +{ + int i, n, n_goal = 2048, rc, len, buf[1]; + MPI_Request *req_array; + MPI_Status status; + char msg[MPI_MAX_ERROR_STRING]; + + MPI_Init( &argc, &argv ); + MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN ); + + n = n_goal; + + req_array = (MPI_Request *)malloc( n * sizeof(MPI_Request) ); + + for (i=0; i +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#include "mpi.h" + +#define MAX_REQ 10000 + +#define DEFAULT_REQ 100 +#define DEFAULT_LEN 20000 +#define DEFAULT_LOOP 10 + +int main( int argc, char **argv ) +{ + int rank, size, loop, max_loop = DEFAULT_LOOP, max_req = DEFAULT_REQ; + int buf_len = DEFAULT_LEN; + int i, j, errs = 0, toterrs; + MPI_Request r; + MPI_Status status; + int *(b[MAX_REQ]); + MPI_Datatype dtype; + int sendrank = 0, recvrank = 1; + + MPI_Init( &argc, &argv ); + + dtype = MPI_INT; + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + +/* + The following test allows this test to run on small-memory systems + that support the sysconf call interface. This test keeps the test from + becoming swap-bound. For example, on an old Linux system or a + Sony Playstation 2 (really!) + */ +#if defined(HAVE_SYSCONF) && defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) + if (rank == sendrank) + { + long n_pages, pagesize; + int msglen_max = max_req * buf_len * sizeof(int); + n_pages = sysconf( _SC_PHYS_PAGES ); + pagesize = sysconf( _SC_PAGESIZE ); + /* printf( "Total mem = %ld\n", n_pages * pagesize ); */ + /* We want to avoid integer overflow in the size calculation. + The best way is to avoid computing any products (such + as total memory = n_pages * pagesize) and instead + compute a msglen_max that fits within 1/4 of the available + pages */ + if (n_pages > 0 && pagesize > 0) { + /* Recompute msglen_max */ + int msgpages = 4 * ((msglen_max + pagesize - 1)/ pagesize); + while (n_pages < msgpages) { + msglen_max /= 2; msgpages /= 2; buf_len /= 2; + } + } + } +#else + /* printf( "No sysconf\n" ); */ +#endif + + /* Check command line args (allow usage even with one processor */ + argv++; + argc--; + while (argc--) { + if (strcmp( "-loop" , *argv ) == 0) { + argv++; argc--; + max_loop = atoi( *argv ); + } + else if (strcmp( "-req", *argv ) == 0) { + argv++; argc--; + max_req = atoi( *argv ); + } + else if (strcmp( "-len", *argv ) == 0) { + argv++; argc--; + buf_len = atoi( *argv ); + } + else { + fprintf( stderr, + "Usage: reqfree [ -loop n ] [ -req n ] [ -len n ]\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + argv++; + } + + MPI_Comm_size( MPI_COMM_WORLD, &size ); + if (size != 2) { + fprintf( stderr, "This program requires two processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* Assume only processor 0 has the command line */ + MPI_Bcast( &max_loop, 1, MPI_INT, 0, MPI_COMM_WORLD ); + MPI_Bcast( &max_req, 1, MPI_INT, 0, MPI_COMM_WORLD ); + MPI_Bcast( &buf_len, 1, MPI_INT, 0, MPI_COMM_WORLD ); + + /* Allocate buffers */ + for (i=0; i> third.out + $mpirun $args -np 2 ./third > third.out 2>&1 + echo '*** Testing Unexpected messages ***' >> third.out + rm -f third.stdo + cat >>third.stdo < /dev/null ; then + rc=0 +# else +# echo "Failed to run simple program!" +# echo "Output from run attempt was" +# cat third.out +# echo "mpirun program was $mpirun" +# echo "mpirun command was " +# echo "$mpirun $args -np 2 ./third >third.out 2>&1" +# rc=1 +# fi +# CleanExe third +# rm -f third.out +# exit $rc +fi + +# If the programs are not available, run make. +if [ ! -x sendrecv_mpich -a $makeeach = 0 -a $runtests = 1 ] ; then + $MAKE +fi + +testfiles="" +if [ $runtests = 1 ] ; then +echo '**** Testing MPI Point-to-point routines ****' + +RunTest sendrecv_mpich 2 "**** Testing MPI_Send and MPI_Recv ****" "" "sendrecv-0.out sendrecv-1.out" + +RunTest sendrecv2 2 "**** Testing MPI_Send and MPI_Recv (2) ****" + + +#Uses MPI_Pack and Unpack +#RunTest sendrecv3 2 "**** Testing MPI_Send and MPI_Recv (3) ****" + +RunTest sendrecv4 2 "**** Testing MPI_Send and MPI_Recv (4) ****" + +#not supported +#RunTest bsendtest 2 "**** Testing MPI_Bsend and MPI_Recv (4) ****" "" "bsendtest-0.out bsendtest-1.out" + +RunTest isndrcv 2 "**** Testing MPI_Isend and MPI_Irecv ****" "" "isndrcv-0.out isndrcv-1.out" + +#RunTest irsend 2 "**** Testing MPI_Irsend ****" + +#RunTest irsendinit 2 "**** Testing MPI_Rsend_init ****" + + +#rsend and ssend to implement, removed for now +RunTest longmsgs 2 "**** Testing long messages ****" + +RunTest testsome 2 "**** Testing MPI_Testsome/Testany/Waitsome ****" + +#issend used, replaced by isend - fails +#RunTest testall_mpich 2 "**** Testing MPI_Testall ****" + +#MPI_Cancel, not yet implemented +#RunTest cancel 2 "**** Checking MPI_Cancel (Irecv's) ****" + +#RunTest cancel2 2 "**** Checking MPI_Cancel (Persistent Recv's) ****" + +#RunTest cancel3 2 "**** Checking MPI_Cancel (Persistent Send's) ****" + +#RunTest cancelmessages 2 "**** Checking MPI_Cancel (short/eager/rndv) ****" + +#RunTest cancelibm 2 "**** Checking MPI_Cancel (successful/nonsuccessful) ****" + +# This test exposes a SEGV in the MPICH1 code. However, this is an +# uncommon situtation. Users who need this feature should switch to +# MPICH2 (www.mcs.anl.gov/mpi/mpich2) +#RunTest cancelissend 2 "**** Checking MPI_Cancel and MPI_Issend (short msgs) ****" + +RunTest sndrcv 2 "**** Testing MPI_Sendrecv ****" + +RunTest sndrcvrep 2 "**** Testing MPI_Sendrecv_replace ****" + +RunTest sndrcvrpl2 2 "**** Testing MPI_Sendrecv_replace (long) ****" + +#not implemented :TODO, should be simple, add a nbelements parameter to the datatype, compute it at creation time, then multiply status->count by this number +#RunTest getelm 2 "**** Testing MPI_Get_elements ****" + +#uses Pack_size, Buffer_attach, Bsend, Buffer_detach +#RunTest overtake 2 "**** Verifying that messages are non-overtaking ****" "" "overtake-0.out overtake-1.out" + +#RunTest ssendtest 2 "**** Verifying ssend ****" + +#RunTest ssendtest2 2 "**** Verifying ssend (2) ****" + +#RunTest issendtest 2 "**** Verifying Issend ****" "" "issendtest-1.out" + +#RunTest issend2 2 "**** Verifying Issend (2) ****" + +#uses MPI_Cancel, lets a lot of orphan comms. +#RunTest reqcreate 1 "**** Checking the request creation routines ****" + + +#free does really free the request, without waiting for completion, leading to bugs. +#RunTest reqfree 2 "**** Checking request free ****" "-req 2048" + +RunTest typebase 1 "**** Checking the type (sizes) routines ****" + +RunTest typecreate 1 "**** Checking the type creation routines ****" + +RunTest typetest 2 "**** Checking the type routines ****" "" "typetest-0.out typetest-1.out" + +#weird error, because comment says smpi returned value is same as expected from mpich .. modified to handle this value as correct +RunTest typeub 2 "**** Checking the type routines: MPI_UB ****" + +#todo : handle lb correctly ! +#RunTest typeub2 1 "**** Checking the type routines: MPI_UB(2) ****" + +#types too complex for smpi (structs of vectors) +#RunTest typeub3 1 "**** Checking the type routines: MPI_UB(3) ****" + +#TODO: handle LB +#RunTest typelb 1 "**** Checking the type routines: MPI_LB ****" + +#RunTest structlb 1 "**** Checking Type_struct routines: MPI_LB ****" + +#ssend, replaced by send +RunTest dtypelife 2 "**** Checking the type routines: MPI_Type_free ****" + +#TODO: handle alignment for extent values +#RunTest dataalign 2 "**** Checking the type alignment ****" + +RunTest dtyperecv 2 "**** Checking the type recv ****" + +RunTest commit 1 "**** Checking the type routines: MPI_Type_commit ****" + +RunTest third 2 "*** Testing Unexpected messages ***" + +RunTest fourth 4 "*** Testing Irecv/Isend/Wait ***" + +RunTest fifth 4 "*** Testing Irecv/Isend/Waitall ***" + +#uses MPI_keyval_create, Attr_put, Attr_get, Attr_delete, Keyval_free +#RunTest sixth 2 "*** Testing attribute manipulation ***" + +RunTest nblock 4 "*** Testing Isend/Irecv (large numbers) ***" + +#TODO : unlock probing ... +#RunTest nbtest 4 "*** Testing Isend/Probe/Recv (large numbers) ***" + +RunTest sendmany 8 "*** Testing Send (many procs) ***" + +# ... replaced by smpi_sleep calls +RunTest order 2 "*** Testing Recv ordering ***" + +RunTest sendorder 2 "**** Checking Message Ordering ****" + +RunTest exittest 3 "**** Checking Exit Processing ****" + +#uses MPI_Errors +#RunTest trunc 2 "*** Testing Message truncation ***" +#TODO: handle MPI_ERR_IN_STATUS +#RunTest truncmult 2 '*** Testing Message trunction in multiple completions ***' + +RunTest nullproc 2 "*** Testing handling of MPI_PROC_NULL ***" + +RunTest nullproc2 2 "*** Testing handling of MPI_PROC_NULL in blocking Recv ***" + +RunTest relrank 2 "*** Testing handling of relative rank ***" + +RunTest hvectest 2 "*** Testing Vector type ***" + +RunTest hvectest2 2 "*** Testing struct type for vectors (MPI_UB) ***" + +#too complex for now +#RunTest hvec 2 "*** Testing Type_Hvector ***" +#fails +#RunTest hindexed 1 "*** Testing Type_Hindexed ***" + +RunTest probe 2 "*** Testing Probe and Get_count ***" + +RunTest probe1 2 "*** Testing Iprobe and Get_count ***" + +RunTest self 1 "*** Testing send to self ***" +#TODO : handle COMM_SELF +#RunTest selfvsworld 2 "*** Testing COMM_SELF and COMM_WORLD ***" + +RunTest testtest1 2 "*** Testing MPI_Test ***" + +RunTest persistent 4 "*** Testing MPI_Recv_init ***" + +RunTest persist 4 "*** Testing MPI_Startall/Request_free ***" +#used MPI_Buffers and Bsends +#RunTest persist2 4 "*** Testing MPI_Startall(Bsend)/Request_free ***" + +RunTest waitall 4 "*** Testing MPI_Waitall ***" + +#uses issend, replaced by isend, and ssend replaced by send +#RunTest waitall2 2 "*** Testing MPI_Waitall (order) ***" + +#RunTest waitall3 4 "*** Testing MPI_Waitall (order-irecv) ***" + +#RunTest waitall4 4 "*** Testing MPI_Waitall (order-isend) ***" +#put a big value for the message size, because it failed as a detached send (isend was used instead of issend) +RunTest waitany 4 "*** Testing MPI_Waitany ***" + +#RunTest pack 2 "*** Testing MPI_Pack ***" + +#calls to ssend replaced by send +RunTest flood 2 "**** Testing large messages ****" + +#very long +#RunTest flood2 2 "**** Testing large numbers of messages ****" +# +# Run Fortran tests ONLY if Fortran available +if [ $have_fortran -eq "1" ] ; then + echo "FORTRAN TESTS" + # + #echo "*** secondf ***" >> pt2pt.out + #$mpirun $args -np 2 ./secondf "$@" >> pt2pt.out 2>&1 + # + RunTest isendf 2 "*** Testing isend from Fortran ***" + + RunTest sendcplx 2 "*** Testing Fortran send ***" + #RunTest allpair 2 "*** Testing pt-2-pt from Fortran ***" + + #RunTest allpair2 2 "*** Testing pt-2-pt from Fortran (many calls) ***" + # +# OutTime +# testfiles="$testfiles structf.out" +# rm -f structf.out +# MakeExe structf +# echo '*** Testing Type_struct from Fortran ***' +# echo '*** Testing Type_struct from Fortran ***' >> structf.out + # This is tricky. Because of a bug in IRIX64, we need to direct + # input from /dev/null (so that we can know that we need a new process + # group). This should be ok for everyone, but SunOS 4.1.4 tends to + # panic (!!) in this case. Since both behaviors represent broken + # operating systems, we test for ARCH=IRIX64 +# if [ "LINUX" = "IRIX64" ] ; then +# $mpirun $args -np 2 ./structf "$@" >> structf.out 2>&1 < /dev/null +# else +# $mpirun $args -np 2 ./structf "$@" >> structf.out 2>&1 +# fi +# echo '*** Testing Type_struct from Fortran ***' >> structf.out +# CheckOutput structf +# CleanExe structf + # + RunTest send1 2 "*** Testing pt-2-pt from Fortran (2) ***" + + RunTest sendfort 2 "*** Testing Fortran logical datatype ***" + + # + testfiles="$testfiles pingpong.out" + rm -f pingpong.out + #MakeExe pingpong + + echo '*** Testing pt-2-pt from Fortran (3) ***' + $mpirun $args -np 2 ./pingpong_f "$@" >> /dev/null + CheckOutput pingpong + #CleanExe pingpong + # + echo "END OF FORTRAN TESTS" +fi +# +else + # Just run checks + testfiles=`echo *.out` + if test "$testfiles" = "*.out" ; then + echo "No output files remain from previous test!" + exit 1 + fi +fi +# +writesummaryfile=$savewritesummaryfile +echo '*** Checking for differences from expected output ***' +CheckAllOutput pt2pt.diff +exit 0 + diff --git a/teshsuite/smpi/mpich-test/pt2pt/secondf.f b/teshsuite/smpi/mpich-test/pt2pt/secondf.f new file mode 100644 index 0000000000..af3d2ef75f --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/secondf.f @@ -0,0 +1,59 @@ +C +C second - test program that sends an array of floats from the first process +C of a group to the last, using send and recv +C +C + program main + include 'mpif.h' +C + integer rank, size, to, from, tag, count, i, ierr + integer src, dest + integer st_source, st_tag, st_count +C MPI_Status status + integer status(MPI_STATUS_SIZE) + double precision data(100) + + call MPI_INIT( ierr ) +C print *, 'about to call comm rank' + call MPI_COMM_RANK( MPI_COMM_WORLD, rank, ierr ) +C print *, rank, 'about to call comm size' + call MPI_COMM_SIZE( MPI_COMM_WORLD, size, ierr ) + print *, 'Process ', rank, ' of ', size, ' is alive' +C +C src = size - 1 +C dest = 0 + dest = size - 1 + src = 0 +C + if (rank .eq. src) then + to = dest + count = 10 + tag = 2001 + do 10 i=1, 10 + data(i) = i + 10 continue + call MPI_SEND( data, count, MPI_DOUBLE_PRECISION, to, tag, + & MPI_COMM_WORLD, ierr ) + print *, rank, ' sent' + print *, (data(i),i=1,10) + elseif (rank .eq. dest) then + tag = MPI_ANY_TAG + count = 10 + from = MPI_ANY_SOURCE + call MPI_RECV(data, count, MPI_DOUBLE_PRECISION, from, tag, + & MPI_COMM_WORLD, status, ierr ) + + call MPI_GET_COUNT( status, MPI_DOUBLE_PRECISION, + & st_count, ierr ) + st_source = status(MPI_SOURCE) + st_tag = status(MPI_TAG) +c + print *, 'Status info: source = ', st_source, + & ' tag = ', st_tag, ' count = ', st_count + print *, rank, ' received', (data(i),i=1,10) + endif + + call MPI_FINALIZE( ierr ) + print *, 'Process ', rank, ' exiting' + end + diff --git a/teshsuite/smpi/mpich-test/pt2pt/self.c b/teshsuite/smpi/mpich-test/pt2pt/self.c new file mode 100644 index 0000000000..1cad66fd27 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/self.c @@ -0,0 +1,63 @@ +#include "mpi.h" +#include +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + * This needs to test long messages as well as short ones. + * The most likely failure mode for this program is that it will + * hang. Sorry about that.... + * + */ +int main( int argc, char **argv ) +{ +int sendbuf[10]; +int sendcount = 10; +int recvbuf[10]; +int recvcount = 10; +int source = 0, recvtag = 2; +int dest = 0, sendtag = 2; +int i, *longsend, *longrecv; + + int mpi_errno = MPI_SUCCESS; + MPI_Status status_array[2]; + MPI_Request req[2]; + + MPI_Init( &argc, &argv ); + if ((mpi_errno = MPI_Irecv ( recvbuf, recvcount, MPI_INT, + source, recvtag, MPI_COMM_WORLD, &req[1] ))) + return mpi_errno; + if ((mpi_errno = MPI_Isend ( sendbuf, sendcount, MPI_INT, dest, + sendtag, MPI_COMM_WORLD, &req[0] ))) + return mpi_errno; + + fprintf( stdout, "[%d] Starting waitall\n", 0 ); + mpi_errno = MPI_Waitall ( 2, req, status_array ); + fprintf( stdout, "[%d] Ending waitall\n", 0 ); + + for (i=16; i<257000; i *= 2) { + longsend = (int *)malloc( i * sizeof(int) ); + longrecv = (int *)malloc( i * sizeof(int) ); + if (!longsend || !longrecv) { + } + if ((mpi_errno = MPI_Irecv ( longrecv, i, MPI_INT, source, recvtag, + MPI_COMM_WORLD, &req[1] ))) + return mpi_errno; + if ((mpi_errno = MPI_Isend ( longsend, i, MPI_INT, dest, sendtag, + MPI_COMM_WORLD, &req[0] ))) + return mpi_errno; + + fprintf( stdout, "[%d] Starting waitall (%d)\n", 0, i ); + mpi_errno = MPI_Waitall ( 2, req, status_array ); + fprintf( stdout, "[%d] Ending waitall\n", 0 ); + + free( longsend ); + free( longrecv ); + } + + MPI_Finalize(); + return (mpi_errno); +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/self.std b/teshsuite/smpi/mpich-test/pt2pt/self.std new file mode 100644 index 0000000000..2abdf2f201 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/self.std @@ -0,0 +1,30 @@ +[0] Starting waitall +[0] Ending waitall +[0] Starting waitall (16) +[0] Ending waitall +[0] Starting waitall (32) +[0] Ending waitall +[0] Starting waitall (64) +[0] Ending waitall +[0] Starting waitall (128) +[0] Ending waitall +[0] Starting waitall (256) +[0] Ending waitall +[0] Starting waitall (512) +[0] Ending waitall +[0] Starting waitall (1024) +[0] Ending waitall +[0] Starting waitall (2048) +[0] Ending waitall +[0] Starting waitall (4096) +[0] Ending waitall +[0] Starting waitall (8192) +[0] Ending waitall +[0] Starting waitall (16384) +[0] Ending waitall +[0] Starting waitall (32768) +[0] Ending waitall +[0] Starting waitall (65536) +[0] Ending waitall +[0] Starting waitall (131072) +[0] Ending waitall diff --git a/teshsuite/smpi/mpich-test/pt2pt/selfvsworld.c b/teshsuite/smpi/mpich-test/pt2pt/selfvsworld.c new file mode 100644 index 0000000000..621b99d279 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/selfvsworld.c @@ -0,0 +1,104 @@ +/* ----------------------------------------------------------------------- + * Code: mismatch.c + * Lab: Parallel Processing Performance Tools + * Usage: mismatch + * Run on two nodes + * You will need to stop the deadlocked program with \ + * Author: Roslyn Leibensperger Last revised: 3/19/97 RYL + * + * Modified by Bill Gropp (ANL) to use Iprobe to detect the message and + * always produce output (no need to abort a deadlocked program). + * Unfortunately(?), the version of POE that had this bug is no longer + * available, so we can't test whether using Iprobe would show the same + * problem. + * ------------------------------------------------------------------------ */ +#include +#include "mpi.h" +#define MSGLEN 100 /* length of message in elements */ +#define TAG_A 100 +#define TAG_B 200 + +int main( int argc, char *argv[] ) +{ + float message1 [MSGLEN], /* message buffers */ + message2 [MSGLEN], + message3 [MSGLEN]; + int rank, /* rank of task in communicator */ + dest=0, source=0, /* rank in communicator of destination */ + /* and source tasks */ + send_tag=0, recv_tag=0, /* message tags */ + flag, size, i; + int errs = 0, toterrs; + MPI_Status status; /* status of communication */ + MPI_Status statuses[2]; + MPI_Request requests[2]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + if (size != 2) { + printf( "Must run with exactly 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + /* printf ( " Task %d initialized\n", rank ); */ + + /* initialize message buffers */ + for ( i=0; i +#ifdef HAVE_UNISTD_H +#include +#endif +#include +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +#define MAXPES 16 +#define MYBUFSIZE 8*1024 +static int buffer[MAXPES][MYBUFSIZE]; + +#define NUM_RUNS 10 + + +int main ( int argc, char *argv[] ) +{ + int i; + int count, size; + int self, npes; + double secs; + MPI_Request request[MAXPES]; + MPI_Status status; + + + MPI_Init (&argc, &argv); + MPI_Comm_rank (MPI_COMM_WORLD, &self); + MPI_Comm_size (MPI_COMM_WORLD, &npes); + + assert (npes <= MAXPES); + + for (size = 1; size <= MYBUFSIZE ; size += size) + { + + secs = -MPI_Wtime (); + for (count = 0; count < NUM_RUNS; count++) + { + MPI_Barrier (MPI_COMM_WORLD); + + for (i = 0; i < npes; i++) + { + if (i == self) + continue; + MPI_Irecv (buffer[i], size, MPI_INT, i, + MPI_ANY_TAG, MPI_COMM_WORLD, &request[i]); + } + + for (i = 0; i < npes; i++) + { + if (i == self) + continue; + MPI_Send (buffer[self], size, MPI_INT, i, 0, MPI_COMM_WORLD); + } + + for (i = 0; i < npes; i++) + { + if (i == self) + continue; + MPI_Wait (&request[i], &status); + } + + } + MPI_Barrier (MPI_COMM_WORLD); + secs += MPI_Wtime (); + + if (self == 0) + { + secs = secs / (double) NUM_RUNS; + printf ( "length = %d ints\n", size ); + fflush(stdout); +/* + printf ("%f\n", + (double) (size * sizeof (int) * (npes - 1)) / + (secs * 1024.0 * 1024.0)); + */ + } + } + MPI_Finalize(); + return (0); +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendmany.std b/teshsuite/smpi/mpich-test/pt2pt/sendmany.std new file mode 100644 index 0000000000..87eabe0d08 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sendmany.std @@ -0,0 +1,15 @@ +You requested to use 8 processes, but there is only 5 processes in your hostfile... +length = 1 ints +length = 2 ints +length = 4 ints +length = 8 ints +length = 16 ints +length = 32 ints +length = 64 ints +length = 128 ints +length = 256 ints +length = 512 ints +length = 1024 ints +length = 2048 ints +length = 4096 ints +length = 8192 ints diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendorder.c b/teshsuite/smpi/mpich-test/pt2pt/sendorder.c new file mode 100644 index 0000000000..b95c16e8cb --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sendorder.c @@ -0,0 +1,173 @@ +/* + Test ordering of messages that differ only in data + + sendorder [ -n number-of-sends ] [ -m length-of-long-sends ] + */ + +#include +#include +#include +#include "mpi.h" + +/* Prototypes */ +void delay( int ); +void CheckStatus( MPI_Status *, int, int, int, int * ); + +/* + This is a delay to make sure that several messages are in the queue when + the MPI_Recv is called + + 10ms delay for now. +*/ +void delay( int ms ) +{ + double deltat = ms * 0.001; + MPI_Wtime(); + //while (MPI_Wtime() - t < deltat) ; + smpi_sleep(deltat); +} + +void CheckStatus( MPI_Status *status, int tag, int src, int cnt, int *err ) +{ + int n; + + if (status->MPI_TAG != tag && status->MPI_SOURCE != src) { + if (*err < 10) { + fprintf( stdout, + "Error in message status! tag = %d and source = %d\n", status->MPI_TAG, + status->MPI_SOURCE ); + } + (void)*err++; + } + MPI_Get_count( status, MPI_INT, &n ); + if (n != cnt) { + if (*err < 10) { + fprintf( stdout, + "Error in message status! length is %d and should be %d\n", n, cnt ); + } + (void)*err++; + } +} + +int main( int argc, char *argv[] ) +{ + int i, n, m, val, *buf; + MPI_Status status; + int src, dest, tag, err = 0, toterr; + int rank, size; + MPI_Comm comm; + + MPI_Init( &argc, &argv ); + + n = 1000; /* Number of tests */ + comm = MPI_COMM_WORLD; + tag = 3; + m = 1000; /* Size in ints of longer buffer */ + + /* Check for options + */ + argc--; argv++; + while (argc > 0) { + if (argv[0] && strcmp( argv[0], "-n" ) == 0) { + argc++; + n = atoi( argv[0] ); + } + else if (argv[0] && strcmp( argv[0], "-m" ) == 0) { + argc++; + m = atoi( argv[0] ); + } + argc--; argv++; + } + /* Ensure that everyone has the values */ + MPI_Bcast( &n, 1, MPI_INT, 0, MPI_COMM_WORLD ); + MPI_Bcast( &m, 1, MPI_INT, 0, MPI_COMM_WORLD ); + + MPI_Comm_rank( comm, &rank ); + MPI_Comm_size( comm, &size ); + if (size < 2) { + fprintf( stderr, "This program requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + src = 0; + dest = size - 1; + + /* Single Int */ + MPI_Barrier( comm ); + if (rank == src) { + for (i=0; i +#include +#include +#include "mpi.h" + +#ifdef HAVE_MPICHCONF_H +#include "mpichconf.h" +#endif + +static int src = 1; +static int dest = 0; + +static int do_test1 = 1; +static int do_test2 = 1; +static int do_test3 = 1; + +static int verbose = 0; + +#define MAX_TYPES 13 +static int ntypes = 0; +static int nolongdouble = 0; +static MPI_Datatype BasicTypes[MAX_TYPES]; + +static int maxbufferlen = 10000; +static char *(BasicNames[MAX_TYPES]); + +/* In order to quiet noisy C compilers, we provide ANSI-style prototypes + where possible */ + +void AllocateBuffers ( void **, MPI_Datatype *, int, int ); +void FreeBuffers ( void **, int ); +void FillBuffers ( void **, MPI_Datatype *, int, int ); +int CheckBuffer ( void *, MPI_Datatype, int ); +void SetupBasicTypes (void); +void SenderTest1 (void); +void ReceiverTest1 (void); +void SenderTest2 (void); +void ReceiverTest2 (void); +void SenderTest3 (void); +void ReceiverTest3 (void); + +void +AllocateBuffers(bufferspace, buffertypes, num_types, bufferlen) + void **bufferspace; + MPI_Datatype *buffertypes; + int num_types; + int bufferlen; +{ + int i; + for (i = 0; i < ntypes; i++) { + if (buffertypes[i] == MPI_CHAR) + bufferspace[i] = malloc(bufferlen * sizeof(char)); + else if (buffertypes[i] == MPI_SHORT) + bufferspace[i] = malloc(bufferlen * sizeof(short)); + else if (buffertypes[i] == MPI_INT) + bufferspace[i] = malloc(bufferlen * sizeof(int)); + else if (buffertypes[i] == MPI_LONG) + bufferspace[i] = malloc(bufferlen * sizeof(long)); + else if (buffertypes[i] == MPI_UNSIGNED_CHAR) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned char)); + else if (buffertypes[i] == MPI_UNSIGNED_SHORT) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned short)); + else if (buffertypes[i] == MPI_UNSIGNED) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned int)); + else if (buffertypes[i] == MPI_UNSIGNED_LONG) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned long)); + else if (buffertypes[i] == MPI_FLOAT) + bufferspace[i] = malloc(bufferlen * sizeof(float)); + else if (buffertypes[i] == MPI_DOUBLE) + bufferspace[i] = malloc(bufferlen * sizeof(double)); +#if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) + else if (buffertypes[i] == MPI_LONG_DOUBLE) { + int dlen; + MPI_Type_size( MPI_LONG_DOUBLE, &dlen ); + bufferspace[i] = malloc(bufferlen * dlen); + } +#endif +#if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) + else if (buffertypes[i] == MPI_LONG_LONG_INT) + bufferspace[i] = malloc(bufferlen * sizeof(long long) ); +#endif + else if (buffertypes[i] == MPI_BYTE) + bufferspace[i] = malloc(bufferlen * sizeof(unsigned char)); + } +} + +void FreeBuffers(void **buffers, int nbuffers) +{ + int i; + for (i = 0; i < nbuffers; i++) + free(buffers[i]); +} + +void FillBuffers(bufferspace, buffertypes, num_types, bufferlen) + void **bufferspace; + MPI_Datatype *buffertypes; + int num_types; + int bufferlen; +{ + int i, j; + for (i = 0; i < ntypes; i++) { + for (j = 0; j < bufferlen; j++) { + if (buffertypes[i] == MPI_CHAR) + ((char *)bufferspace[i])[j] = (char)(j & 0x7f); + else if (buffertypes[i] == MPI_SHORT) + ((short *)bufferspace[i])[j] = (short)j; + else if (buffertypes[i] == MPI_INT) + ((int *)bufferspace[i])[j] = (int)j; + else if (buffertypes[i] == MPI_LONG) + ((long *)bufferspace[i])[j] = (long)j; + else if (buffertypes[i] == MPI_UNSIGNED_CHAR) + ((unsigned char *)bufferspace[i])[j] = (unsigned char)j; + else if (buffertypes[i] == MPI_UNSIGNED_SHORT) + ((unsigned short *)bufferspace[i])[j] = (unsigned short)j; + else if (buffertypes[i] == MPI_UNSIGNED) + ((unsigned int *)bufferspace[i])[j] = (unsigned int)j; + else if (buffertypes[i] == MPI_UNSIGNED_LONG) + ((unsigned long *)bufferspace[i])[j] = (unsigned long)j; + else if (buffertypes[i] == MPI_FLOAT) + ((float *)bufferspace[i])[j] = (float)j; + else if (buffertypes[i] == MPI_DOUBLE) + ((double *)bufferspace[i])[j] = (double)j; +#if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) + else if (buffertypes[i] == MPI_LONG_DOUBLE) + ((long double *)bufferspace[i])[j] = (long double)j; +#endif +#if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) + else if (buffertypes[i] == MPI_LONG_LONG_INT) + ((long long *)bufferspace[i])[j] = (long long)j; +#endif + else if (buffertypes[i] == MPI_BYTE) + ((unsigned char *)bufferspace[i])[j] = (unsigned char)j; + } + } +} + +int +CheckBuffer(bufferspace, buffertype, bufferlen) + void *bufferspace; + MPI_Datatype buffertype; + int bufferlen; +{ + int j; + char valerr[256]; + valerr[0] = 0; + for (j = 0; j < bufferlen; j++) { + if (buffertype == MPI_CHAR) { + if (((char *)bufferspace)[j] != (char)(j & 0x7f)) { + sprintf( valerr, "%x != %x", + ((char *)bufferspace)[j], (char)(j&0x7f) ); + break; + } + } else if (buffertype == MPI_SHORT) { + if (((short *)bufferspace)[j] != (short)j) { + sprintf( valerr, "%d != %d", + ((short *)bufferspace)[j], (short)j ); + break; + } + } else if (buffertype == MPI_INT) { + if (((int *)bufferspace)[j] != (int)j) { + sprintf( valerr, "%d != %d", + ((int *)bufferspace)[j], (int)j ); + break; + } + } else if (buffertype == MPI_LONG) { + if (((long *)bufferspace)[j] != (long)j) { + break; + } + } else if (buffertype == MPI_UNSIGNED_CHAR) { + if (((unsigned char *)bufferspace)[j] != (unsigned char)j) { + break; + } + } else if (buffertype == MPI_UNSIGNED_SHORT) { + if (((unsigned short *)bufferspace)[j] != (unsigned short)j) { + break; + } + } else if (buffertype == MPI_UNSIGNED) { + if (((unsigned int *)bufferspace)[j] != (unsigned int)j) { + break; + } + } else if (buffertype == MPI_UNSIGNED_LONG) { + if (((unsigned long *)bufferspace)[j] != (unsigned long)j) { + break; + } + } else if (buffertype == MPI_FLOAT) { + if (((float *)bufferspace)[j] != (float)j) { + break; + } + } else if (buffertype == MPI_DOUBLE) { + if (((double *)bufferspace)[j] != (double)j) { + break; + } +#if defined(HAVE_LONG_DOUBLE) && !defined(HAS_XDR) + } else if (buffertype == MPI_LONG_DOUBLE) { + if (((long double *)bufferspace)[j] != (long double)j) { + break; + } +#endif +#if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) + } else if (buffertype == MPI_LONG_LONG_INT) { + if (((long long *)bufferspace)[j] != (long long)j) { + break; + } +#endif + } else if (buffertype == MPI_BYTE) { + if (((unsigned char *)bufferspace)[j] != (unsigned char)j) { + break; + } + } + } + /* Return +1 so an error in the first location is > 0 */ + if (j < bufferlen) { + if (valerr[0]) fprintf( stderr, "Different value[%d] = %s\n", + j, valerr ); + else + fprintf( stderr, "Different value[%d]\n", j ); + return j+1; + } + return 0; +} + +void +SetupBasicTypes() +{ + BasicTypes[0] = MPI_CHAR; BasicNames[0] = (char*)"MPI_CHAR" ; + BasicTypes[1] = MPI_SHORT; BasicNames[1] = (char*)"MPI_SHORT"; + BasicTypes[2] = MPI_INT; BasicNames[2] = (char*)"MPI_INT" ; + BasicTypes[3] = MPI_LONG; BasicNames[3] = (char*)"MPI_LONG" ; + BasicTypes[4] = MPI_UNSIGNED_CHAR; BasicNames[4] = (char*)"MPI_UNSIGNED_CHAR"; + BasicTypes[5] = MPI_UNSIGNED_SHORT; BasicNames[5] = (char*)"MPI_UNSIGNED_SHORT"; + BasicTypes[6] = MPI_UNSIGNED; BasicNames[6] = (char*)"MPI_UNSIGNED"; + BasicTypes[7] = MPI_UNSIGNED_LONG; BasicNames[7] = (char*)"MPI_UNSIGNED_LONG"; + BasicTypes[8] = MPI_FLOAT; BasicNames[8] = (char*)"MPI_FLOAT"; + BasicTypes[9] = MPI_DOUBLE; BasicNames[9] = (char*)"MPI_DOUBLE"; + BasicTypes[10] = MPI_BYTE; BasicNames[10] = (char*)"MPI_BYTE"; + /* By making the BYTE type LAST, we make it easier to handle heterogeneous + systems that may not support all of the types */ + ntypes = 11; +#if defined (HAVE_LONG_DOUBLE) && !defined(HAS_XDR) + /* This test allows us to use MPI_LONG_DOUBLE, but rely on size > 0 + for "actually implemented" */ + if (!nolongdouble) { + int l; + MPI_Type_size( MPI_LONG_DOUBLE, &l ); + if (l > 0) { + BasicTypes[ntypes] = MPI_LONG_DOUBLE; + BasicNames[ntypes] = (char*)"MPI_LONG_DOUBLE"; + ntypes++; + } + } +#endif +#if defined(HAVE_LONG_LONG_INT) && !defined(HAS_XDR) + BasicTypes[ntypes] = MPI_LONG_LONG_INT; + BasicNames[ntypes] = (char*)"MPI_LONG_LONG_INT"; + ntypes++; +#endif +} + +void +SenderTest1() +{ + void *bufferspace[MAX_TYPES]; + int i, j; + + AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + FillBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + for (i = 0; i < ntypes; i++) { + MPI_Send( (void *)0, 0, BasicTypes[i], dest, 2000, MPI_COMM_WORLD ); + for (j = 0; j < maxbufferlen; j += 500) + MPI_Send(bufferspace[i], j, BasicTypes[i], dest, + 2000, MPI_COMM_WORLD); + } + FreeBuffers(bufferspace, ntypes); +} + +void +ReceiverTest1() +{ + void *bufferspace[MAX_TYPES]; + int i, j; + char message[81]; + MPI_Status Stat; + int dummy, passed; + + AllocateBuffers(bufferspace, BasicTypes, ntypes, maxbufferlen); + for (i = 0; i < ntypes; i++) { + passed = 1; + MPI_Recv( (void *)0, 0, BasicTypes[i], src, + 2000, MPI_COMM_WORLD, &Stat); + if (Stat.MPI_SOURCE != src) { + fprintf(stderr, "*** Incorrect Source returned. ***\n"); + Test_Failed(message); + passed = 0; + } else if (Stat.MPI_TAG != 2000) { + fprintf(stderr, "*** Incorrect Tag returned. ***\n"); + Test_Failed(message); + passed = 0; + } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) || + dummy != 0) { + fprintf(stderr, + "*** Incorrect Count returned, Count = %d. ***\n", + dummy); + Test_Failed(message); + passed = 0; + } + /* Try different sized messages */ + for (j = 0; j < maxbufferlen; j += 500) { + MPI_Recv(bufferspace[i], j, BasicTypes[i], src, + 2000, MPI_COMM_WORLD, &Stat); + sprintf(message, "Send-Receive Test, Type %d, Count %d", + i, j); + if (Stat.MPI_SOURCE != src) { + fprintf(stderr, "*** Incorrect Source returned. ***\n"); + Test_Failed(message); + passed = 0; + } else if (Stat.MPI_TAG != 2000) { + fprintf(stderr, "*** Incorrect Tag returned. ***\n"); + Test_Failed(message); + passed = 0; + } else if (MPI_Get_count(&Stat, BasicTypes[i], &dummy) || + dummy != j) { + fprintf(stderr, + "*** Incorrect Count returned, Count = %d (should be %d). ***\n", + dummy, j); + Test_Failed(message); + passed = 0; + } else if(CheckBuffer(bufferspace[i], BasicTypes[i], j)) { + fprintf(stderr, + "*** Incorrect Message received (type = %d (%s), count = %d). ***\n", + i, BasicNames[i], j ); + Test_Failed(message); + passed = 0; + } +#ifdef VERBOSE + else { + fprintf(stderr, + "Message of count %d, type %d received correctly.\n", + j, i ); + } +#endif + } + sprintf(message, "Send-Receive Test, Type %d (%s)", + i, BasicNames[i] ); + if (passed) + Test_Passed(message); + else + Test_Failed(message); + } + FreeBuffers(bufferspace, ntypes); +} + +#define MAX_ORDER_TAG 2010 +/* Test Tag Selectivity. + Note that we must use non-blocking sends here, since otherwise we could + deadlock waiting to receive/send the first message +*/ +void +SenderTest2() +{ + int *buffer; + int i; + MPI_Request r[10]; + MPI_Status s[10]; + + buffer = (int *)malloc(maxbufferlen * sizeof(int)); + for (i = 0; i < maxbufferlen; i++) + buffer[i] = i; + + for (i = 2001; i <= MAX_ORDER_TAG; i++) + MPI_Isend(buffer, maxbufferlen, MPI_INT, dest, + i, MPI_COMM_WORLD, &r[i-2001] ); + + MPI_Waitall( MAX_ORDER_TAG-2001+1, r, s ); + free(buffer); + + return; +} + +void +ReceiverTest2() +{ + int *buffer; + int i, j; + char message[81]; + MPI_Status Stat; + int dummy, passed; + int errloc; + + buffer = (int *)calloc(maxbufferlen,sizeof(int)); + passed = 1; + + for (i = MAX_ORDER_TAG; i >= 2001; i--) { + MPI_Recv(buffer, maxbufferlen, MPI_INT, src, + i, MPI_COMM_WORLD, &Stat); + sprintf(message, "Tag Selectivity Test, Tag %d", + i); + if (Stat.MPI_SOURCE != src) { + fprintf(stderr, "*** Incorrect Source returned. ***\n"); + Test_Failed(message); + } else if (Stat.MPI_TAG != i) { + fprintf(stderr, "*** Incorrect Tag returned. ***\n"); + Test_Failed(message); + } else if (MPI_Get_count(&Stat, MPI_INT, &dummy) || + dummy != maxbufferlen) { + fprintf(stderr, + "*** Incorrect Count returned, Count = %d. ***\n", + dummy); + Test_Failed(message); + } else if((errloc = + CheckBuffer((void*)buffer, MPI_INT, maxbufferlen))) { + fprintf(stderr, + "*** Incorrect Message received at %d (tag=%d). ***\n", + errloc-1, i); + Test_Failed(message); + passed = 0; + } + /* Clear out the buffer */ + for (j = 0; j < maxbufferlen; j++) + buffer[j] = -1; + } + strncpy(message, "Tag Selectivity Test", 81); + if (passed) + Test_Passed(message); + else + Test_Failed(message); + free(buffer); + return; +} + +void +SenderTest3() +{ + int ibuf[10]; + + /* A receive test might not fail until it is triggered... */ + MPI_Send( ibuf, 10, MPI_INT, dest, 15, MPI_COMM_WORLD); + + return; +} + +void +ReceiverTest3( void ) +{ + int buffer[20]; + MPI_Datatype bogus_type = MPI_DATATYPE_NULL; + MPI_Status status; + int myrank; + int small_tag; +/* + if (verbose) + MPI_Errhandler_set(MPI_COMM_WORLD, TEST_ERRORS_WARN); + else + MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN ); +*/ + MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); + + if (myrank == 0 && verbose) { + fprintf( stderr, +"There should be eight error messages about invalid communicator\n\ +count argument, datatype argument, tag, rank, buffer send and buffer recv\n" ); + } + if (MPI_Send(buffer, 20, MPI_INT, dest, + 1, MPI_COMM_NULL) == MPI_SUCCESS){ + Test_Failed("NULL Communicator Test"); + } + else + Test_Passed("NULL Communicator Test"); + + if (MPI_Send(buffer, -1, MPI_INT, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Count Test"); + } + else + Test_Passed("Invalid Count Test"); + + if (MPI_Send(buffer, 20, bogus_type, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Type Test"); + } + else + Test_Passed("Invalid Type Test"); + + small_tag = -1; + if (small_tag == MPI_ANY_TAG) small_tag = -2; + if (MPI_Send(buffer, 20, MPI_INT, dest, + small_tag, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Tag Test"); + } + else + Test_Passed("Invalid Tag Test"); + + /* Form a tag that is too large */ + /*MPI_Attr_get( MPI_COMM_WORLD, MPI_TAG_UB, (void **)&tag_ubp, &flag ); + if (!flag) Test_Failed("Could not get tag ub!" ); + large_tag = *tag_ubp + 1; + if (large_tag > *tag_ubp) { + if (MPI_Send(buffer, 20, MPI_INT, dest, + large_tag, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Tag Test"); + } + else + Test_Passed("Invalid Tag Test"); + } +*/ + if (MPI_Send(buffer, 20, MPI_INT, 300, + 1, MPI_COMM_WORLD) == MPI_SUCCESS) { + Test_Failed("Invalid Destination Test"); + } + else + Test_Passed("Invalid Destination Test"); + + if (MPI_Send((void *)0, 10, MPI_INT, dest, + 1, MPI_COMM_WORLD) == MPI_SUCCESS){ + Test_Failed("Invalid Buffer Test (send)"); + } + else + Test_Passed("Invalid Buffer Test (send)"); + + /* A receive test might not fail until it is triggered... */ + if (MPI_Recv((void *)0, 10, MPI_INT, src, + 15, MPI_COMM_WORLD, &status) == MPI_SUCCESS){ + Test_Failed("Invalid Buffer Test (recv)"); + } + else + Test_Passed("Invalid Buffer Test (recv)"); + + /* Just to keep things happy, see if there is a message to receive */ + { int flag, ibuf[10]; + + MPI_Iprobe( src, 15, MPI_COMM_WORLD, &flag, &status ); + if (flag) + MPI_Recv( ibuf, 10, MPI_INT, src, 15, MPI_COMM_WORLD, &status ); + } + MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_ARE_FATAL ); + return; +} + +/* Allow -nolongdouble to suppress long double testing */ +int main( int argc, char **argv ) +{ + int myrank, mysize; + int rc, itemp, i; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &myrank); + MPI_Comm_size(MPI_COMM_WORLD, &mysize); + Test_Init("sendrecv", myrank); + SetupBasicTypes(); + + if (mysize != 2) { + fprintf(stderr, + "*** This test program requires exactly 2 processes.\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + /* Get the min of the basic types */ + itemp = ntypes; + MPI_Allreduce( &itemp, &ntypes, 1, MPI_INT, MPI_MIN, MPI_COMM_WORLD ); + + /* dest writes out the received stats; for the output to be + consistant (with the final check), it should be procees 0 */ + for (i=1; i +#include "dtypes.h" +#include "gcomm.h" +#include "test.h" + +int verbose = 0; +/* + This program is from mpich/tsuite/pt2pt and should be changed there only. + It needs gcomm and dtype from mpich/tsuite, and can be run with + any number of processes > 1. + */ +int main( int argc, char **argv) +{ + MPI_Datatype *types; + void **inbufs, **outbufs; + char **names; + int *counts, *bytesize, ntype; + MPI_Comm comms[20]; + int ncomm = 20, rank, np, partner, tag, count; + int i, j, k, err, toterr, world_rank, errloc; + MPI_Status status; + char *obuf; + + MPI_Init( &argc, &argv ); + + /* + * Check for -basiconly to select only the simple datatypes + */ + for (i=1; i 0) { + fprintf( stderr, "%d errors on %d\n", err, rank ); + } + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } + FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype ); + FreeComms( comms, ncomm ); + MPI_Finalize(); + return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendrecv3.c b/teshsuite/smpi/mpich-test/pt2pt/sendrecv3.c new file mode 100644 index 0000000000..9664a630a5 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sendrecv3.c @@ -0,0 +1,158 @@ +#include "mpi.h" +#include +#include +#include "dtypes.h" +#include "gcomm.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int verbose = 0; +/* + This program is from mpich/tsuite/pt2pt and should be changed there only. + It needs gcomm and dtype from mpich/tsuite, and can be run with + any number of processes > 1. + + This version uses Pack to send a message and Unpack OR the datatype + to receive it. + */ +int main( int argc, char **argv ) +{ +MPI_Datatype *types; +void **inbufs, **outbufs; +char **names; +char *packbuf, *unpackbuf; +int packsize, unpacksize, position; +int *counts, *bytesize, ntype; +MPI_Comm comms[20]; +int ncomm = 20, rank, np, partner, tag, count; +int i, j, k, err, toterr, world_rank; +int errloc; +MPI_Status status; +char *obuf; + +MPI_Init( &argc, &argv ); + +AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, + &names, &ntype ); +GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype ); + +MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); +MakeComms( comms, 20, &ncomm, 0 ); + +/* Test over a wide range of datatypes and communicators */ +err = 0; +for (i=0; i 0) { + fprintf( stderr, "%d errors on %d\n", err, rank ); + } +MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } +FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype ); +FreeComms( comms, ncomm ); +MPI_Barrier( MPI_COMM_WORLD ); +MPI_Finalize(); +return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/sendrecv4.c b/teshsuite/smpi/mpich-test/pt2pt/sendrecv4.c new file mode 100644 index 0000000000..a4e5a05f51 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sendrecv4.c @@ -0,0 +1,175 @@ +#include "mpi.h" +#include +#include "dtypes.h" +#include "gcomm.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int verbose = 0; +/* + This program is from mpich/tsuite/pt2pt and should be changed there only. + It needs gcomm and dtype from mpich/tsuite, and can be run with + any number of processes > 1. + + This version sends and receives EVERYTHING from MPI_BOTTOM, by putting + the data into a structure. + + This code isn't quite correct, since the MPI_Type_struct that is + created for the type may not have the correct extent. + One possible change is to make the struct type include the count, and + send/receive one instance of the data item. + + The GenerateData call should return extents; when the extent of the + created structure doesn't match, we can at least issue an error message. + */ +int main( int argc, char **argv ) +{ +MPI_Datatype *types; +void **inbufs, **outbufs; +char **names; +int *counts, *bytesize, ntype; +MPI_Comm comms[20]; +int ncomm = 20, rank, np, partner, tag, count; +int i, j, k, err, toterr, world_rank, errloc; +MPI_Status status; +char *obuf; +MPI_Datatype offsettype; +int blen; +MPI_Aint displ, extent, natural_extent; + +MPI_Init( &argc, &argv ); + +AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, + &names, &ntype ); +GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype ); + +MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); +MakeComms( comms, 20, &ncomm, 0 ); + +/* Test over a wide range of datatypes and communicators */ +err = 0; +for (i=0; i 0) { + fprintf( stderr, "%d errors on %d\n", err, rank ); + } +MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } + +FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype ); +FreeComms( comms, ncomm ); +MPI_Finalize(); +return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/sixth.c b/teshsuite/smpi/mpich-test/pt2pt/sixth.c new file mode 100644 index 0000000000..5f56e6eac3 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sixth.c @@ -0,0 +1,114 @@ +#include +#include "mpi.h" +#ifdef HAVE_STDLIB_H +#include +#else +extern char *malloc(); +#endif +#include "test.h" + +typedef struct _table { + int references; + int length; + int *value; +} Table; + +/* Prototypes for picky compilers */ +int copy_table ( MPI_Comm, int, void *, void *, void *, int * ); +void create_table ( int, int *, Table ** ); +int delete_table ( MPI_Comm, int, void *, void * ); + +/* These are incorrect...*/ +int copy_table ( MPI_Comm oldcomm, int keyval, void *extra_state, + void *attr_in, void *attr_out, int *flag) +{ + Table *table = (Table *)attr_in;; + + table->references++; + (*(void **)attr_out) = attr_in; + (*flag) = 1; + (*(int *)extra_state)++; + return (MPI_SUCCESS); +} + +void create_table ( int num, int *values, Table **table_out ) +{ + int i; + (*table_out) = (Table *)malloc(sizeof(Table)); + (*table_out)->references = 1; + (*table_out)->length = num; + (*table_out)->value = (int *)malloc(sizeof(int)*num); + for (i=0;ivalue[i] = values[i]; +} + +int delete_table ( MPI_Comm comm, int keyval, + void *attr_val, void *extra_state) +{ + Table *table = (Table *)attr_val; + + if ( table->references == 1 ) + free(table); + else + table->references--; + (*(int *)extra_state)--; + return MPI_SUCCESS; +} + +int main ( int argc, char **argv ) +{ + int rank, size; + Table *table; + MPI_Comm new_comm; + int table_key; + int values[3]; + int table_copies = 1; + int found; + int errors = 0; + + MPI_Init ( &argc, &argv ); + MPI_Comm_rank ( MPI_COMM_WORLD, &rank ); + MPI_Comm_size ( MPI_COMM_WORLD, &size ); + + values[0] = 1; values[1] = 2; values[2] = 3; + create_table(3,values,&table); + + MPI_Keyval_create ( copy_table, delete_table, &table_key, + (void *)&table_copies ); + MPI_Attr_put ( MPI_COMM_WORLD, table_key, (void *)table ); + MPI_Comm_dup ( MPI_COMM_WORLD, &new_comm ); + MPI_Attr_get ( new_comm, table_key, (void **)&table, &found ); + + if (!found) { + printf( "did not find attribute on new comm\n" ); + errors++; + } + + if ((table_copies != 2) && (table->references != 2)) { + printf( "table_copies != 2 (=%d) and table->references != 2 (=%d)\n", + table_copies, table->references ); + errors++; + } + + MPI_Comm_free ( &new_comm ); + + if ((table_copies != 1) && (table->references != 1)) { + printf( "table_copies != 1 (=%d) and table->references != 1 (=%d)\n", + table_copies, table->references ); + errors++; + } + + MPI_Attr_delete ( MPI_COMM_WORLD, table_key ); + + if ( table_copies != 0 ) { + printf( "table_copies != 0 (=%d)\n", table_copies ); + errors++; + } + if (errors) + printf("[%d] OOPS. %d errors!\n",rank,errors); + + MPI_Keyval_free ( &table_key ); + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/sndrcv.c b/teshsuite/smpi/mpich-test/pt2pt/sndrcv.c new file mode 100644 index 0000000000..9323ccc1df --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sndrcv.c @@ -0,0 +1,138 @@ +#include "mpi.h" +#include +#include "dtypes.h" +#include "gcomm.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int verbose = 0; +/* + This program is from mpich/tsuite/pt2pt and should be changed there only. + It needs gcomm and dtype from mpich/tsuite, and can be run with + any number of processes > 1. + + This version uses sendrecv and sendrecv_replace (but only in the + head-to-head mode). + */ +int main( int argc, char **argv ) +{ +MPI_Datatype *types; +void **inbufs, **outbufs; +char **names; +int *counts, *bytesize, ntype; +MPI_Comm comms[20]; +int ncomm = 20, rank, np, partner=0, tag, count; +int i, j, k, err, toterr, world_rank, errloc; +MPI_Status status; +char *obuf, *ibuf; + +MPI_Init( &argc, &argv ); + +AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, + &names, &ntype ); +GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype ); + +MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); +MakeComms( comms, 20, &ncomm, 0 ); + +/* Test over a wide range of datatypes and communicators */ +err = 0; +for (i=0; i 0) { + fprintf( stderr, "%d errors on %d\n", err, rank ); + } +MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } +FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype ); +FreeComms( comms, ncomm ); +MPI_Finalize(); +return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.c b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.c new file mode 100644 index 0000000000..87b599935d --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.c @@ -0,0 +1,68 @@ +#include "mpi.h" +#include +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char **argv ) +{ + MPI_Status status; + int count, dest, source, sendtag, recvtag, len, rc; + int rank, size, errcnt = 0; + MPI_Comm comm; + int *buf; + MPI_Datatype dtype; + MPI_Init( &argc, &argv ); + + MPI_Comm_dup( MPI_COMM_WORLD, &comm ); + MPI_Errhandler_set( comm, MPI_ERRORS_RETURN ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + /* Check recoverable errors */ + if (rank == 0) { + rc = MPI_Sendrecv_replace( (char *)0, 1, MPI_INT, 0, 0, + 0, 0, comm, &status ); + if (!rc) { + errcnt++; + fprintf( stderr, "Failed to detect null buffer\n" ); + } + buf = 0; /* Give buf a value before use */ + rc = MPI_Sendrecv_replace( buf, 1, MPI_DATATYPE_NULL, 0, + 0, 0, 0, comm, &status ); + if (!rc) { + errcnt++; + fprintf( stderr, "Failed to detect null datatype\n" ); + } + /* Could be others */ + } + + /* Check non-contiguous datatypes */ + MPI_Type_vector( 1, 1, 10, MPI_INT, &dtype ); + MPI_Type_commit( &dtype ); + + buf = (int *)malloc( 10 * 10 * sizeof(int) ); + dest = (rank + 1) % size; + source = (rank + size - 1) % size; + + count = 0; + sendtag = 1; + recvtag = 1; + MPI_Sendrecv_replace( buf, count, dtype, dest, + sendtag, source, recvtag, MPI_COMM_WORLD, &status ); + MPI_Get_count( &status, dtype, &len ); + if (len != 0) { + errcnt ++; + fprintf( stderr, "Computed %d for count, should be %d\n", len, 0 ); + } + + MPI_Type_free( &dtype ); + MPI_Comm_free( &comm ); + if (rank == 0) { + printf( "Completed test of MPI_Sendrecv_replace\n" ); + } + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.std b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.std new file mode 100644 index 0000000000..b001334b18 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrep.std @@ -0,0 +1 @@ +Completed test of MPI_Sendrecv_replace diff --git a/teshsuite/smpi/mpich-test/pt2pt/sndrcvrpl2.c b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrpl2.c new file mode 100644 index 0000000000..fdb5c81d27 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/sndrcvrpl2.c @@ -0,0 +1,64 @@ + +/* + * Based on a program from James Clippinger (james@cs.dartmouth.edu), + * http://www.cs.dartmouth.edu/~james/. + * + */ +#include "test.h" +#include +#include +#include "mpi.h" + +int main( int argc, char **argv ) +{ + MPI_Status status; + int count, rank, size, dest, source, i, err = 0, toterr; + long *buf; + + /* Initialize MPI and get my rank and total number of + processors */ + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + /* Send-receive-replace the buffer */ + count = 1 << 14; + buf = (long *)malloc( count * sizeof(long) ); + for (i=0; i 10) break; + printf( "Received %ld in buf[%d]; expected %d\n", + buf[i], i, source + size*i ); + } + } +/* + fprintf(stderr, "Done with SRR on proc %d\n", rank); + */ + + /* Finalize everything */ + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (rank == 0) { + if (toterr == 0) + printf( " No Errors\n" ); + else + printf( "Test failed with %d errors!\n", toterr ); + } + free( buf ); + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/ssendtest.c b/teshsuite/smpi/mpich-test/pt2pt/ssendtest.c new file mode 100644 index 0000000000..6de2ca96d2 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/ssendtest.c @@ -0,0 +1,145 @@ +/* + * Program to test that the "synchronous send" semantics + * of point to point communications in MPI is (probably) satisfied. + * Two messages are send in one order; the destination uses MPI_Iprobe + * to look for the SECOND message before doing a receive on the first. + * To give a finite-termination, a fixed amount of time is used for + * the Iprobe test. + * + * This program has been patterned off of "overtake.c" + * + * William Gropp + * gropp@mcs.anl.gov + */ + +#include +#include "test.h" +#include "mpi.h" + +#define SIZE 10000 +/* Amount of time in seconds to wait for the receipt of the second Ssend + message */ +#define MAX_TIME 10 +static int src = 0; +static int dest = 1; + +/* Prototypes for picky compilers */ +void Generate_Data ( int *, int ); + +void Generate_Data( int *buffer, int buff_size) +{ + int i; + + for (i = 0; i < buff_size; i++) + buffer[i] = i+1; +} + +int main( int argc, char **argv) +{ + int rank; /* My Rank (0 or 1) */ + int act_size = 0; + int flag, np, rval, i; + int buffer[SIZE]; + double t0; + char *Current_Test = NULL; + MPI_Status status, status1, status2; + int count1, count2; + int sizes[4]; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size( MPI_COMM_WORLD, &np ); + if (np != 2) { + fprintf(stderr, "*** This program uses exactly 2 processes! ***\n"); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + sizes[0] = 0; + sizes[1] = 1; + sizes[2] = 1000; + sizes[3] = SIZE; +/* for (i = 0; i < 4; i++ ) { */ + for (i = 1; i < 2; i++ ) { + act_size = sizes[i]; + if (rank == src) { + Generate_Data(buffer, SIZE); + MPI_Recv( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD, &status ); + MPI_Send( buffer, 0, MPI_INT, dest, 0, MPI_COMM_WORLD ); + MPI_Ssend( buffer, act_size, MPI_INT, dest, 1, MPI_COMM_WORLD ); + MPI_Ssend( buffer, act_size, MPI_INT, dest, 2, MPI_COMM_WORLD ); + + } else if (rank == dest) { + Test_Init("ssendtest", rank); + /* Test 1 */ + Current_Test = (char*)"Ssend Test (Synchronous Send -> Normal Recieve)"; + MPI_Send( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD ); + MPI_Recv( buffer, 0, MPI_INT, src, 0, MPI_COMM_WORLD, &status ); + t0 = MPI_Wtime(); + flag = 0; + /* This test depends on a working wtime. Make a simple check */ + if (t0 == 0 && MPI_Wtime() == 0) { + int loopcount = 1000000; + /* This test is too severe (systems with fast + processors and large MPI_Wtick values can + fail. Try harder to test MPI_Wtime */ + while (loopcount-- && MPI_Wtime() == 0) ; + if (loopcount <= 0) { + fprintf( stderr, + "MPI_WTIME is returning 0; a working value is needed\n\ +for this test.\n" ); + Test_Failed(Current_Test); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + t0 = MPI_Wtime(); + } + while (MPI_Wtime() - t0 < MAX_TIME) { + MPI_Iprobe( src, 2, MPI_COMM_WORLD, &flag, &status ); + if (flag) { + Test_Failed(Current_Test); + break; + } + } + if (!flag) + Test_Passed(Current_Test); + MPI_Recv( buffer, act_size, MPI_INT, src, 1, MPI_COMM_WORLD, + &status1 ); + MPI_Recv( buffer, act_size, MPI_INT, src, 2, MPI_COMM_WORLD, + &status2 ); + + MPI_Get_count( &status1, MPI_INT, &count1 ); + MPI_Get_count( &status2, MPI_INT, &count2 ); + if (count1 != act_size) { + fprintf( stdout, + "(1) Wrong count from recv of ssend: got %d (%d)\n", + count1, act_size ); + } + if (status1.MPI_TAG != 1) { + fprintf( stdout, "(1) Wrong tag from recv of ssend: got %d\n", + status1.MPI_TAG ); + } + if (count2 != act_size) { + fprintf( stdout, + "(2) Wrong count from recv of ssend: got %d (%d)\n", + count1, act_size ); + } + if (status2.MPI_TAG != 2) { + fprintf( stdout, "(2) Wrong tag from recv of ssend: got %d\n", + status2.MPI_TAG ); + } + + } + } + + Test_Waitforall( ); + rval = 0; + if (rank == dest) { + rval = Summarize_Test_Results(); /* Returns number of tests; + that failed */ + Test_Finalize(); + } + MPI_Finalize(); + return rval; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.c b/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.c new file mode 100644 index 0000000000..0bc65a89a7 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.c @@ -0,0 +1,78 @@ +/* + * Test from oertel@ZIB-Berlin.DE + */ + +/* + * Test of MPI_Ssend on MPI implementation on Cray T3D + * + * Process dest should receive numbers 1,...,10 but + * receives 274878030344 instead !!! + * + * Test program works correctly with MPI_Ssend replaced by MPI_Send! + * + * + * Compiler options: /mpp/bin/cc -Tcray-t3d -g -X2 -I"directory of mpi.h" + * + * Output of run with option -mpiversion: + +ssendt3d -mpiversion +MPI model implementation 1.00.11., T3D Device Driver, Version 0.0 +MPI model implementation 1.00.11., T3D Device Driver, Version 0.0 +Configured with -arch=cray_t3d -device=t3d -opt=-g -ar_nolocal -make=gmake +Configured with -arch=cray_t3d -device=t3d -opt=-g -ar_nolocal -make=gmake +Received 274878008072 +Received 274878008072 +Received 274878008072 +Received 274878008072 +Received 274878008072 +Received 274878008072 +Received 274878008072 +Received 274878008072 +Received 274878008072 +Received 274878008072 + + */ + +#include +#include "mpi.h" + + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +#define SIZE 10 + +static int src = 0; +static int dest = 1; + +int main( int argc, char **argv ) +{ + int rank; /* My Rank (0 or 1) */ + int i, ivalue; + MPI_Status Stat; + + MPI_Init(&argc, &argv); + MPI_Comm_rank( MPI_COMM_WORLD, &rank); + + if (rank == src) { + + for (i=1; i<=SIZE; i++) + { + MPI_Ssend( &i, 1, MPI_INT, dest, 2000, MPI_COMM_WORLD); + } + + } else if (rank == dest) { + + for (i=1; i<=SIZE; i++) + { + MPI_Recv( &ivalue, 1, MPI_INT, src, 2000, MPI_COMM_WORLD, &Stat); + printf("Received %d\n", ivalue); fflush(stdout); + } + } + + MPI_Barrier( MPI_COMM_WORLD); + MPI_Finalize(); + + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.std b/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.std new file mode 100644 index 0000000000..33fda5325a --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/ssendtest2.std @@ -0,0 +1,12 @@ +**** Verifying ssend (2) **** +Received 1 +Received 2 +Received 3 +Received 4 +Received 5 +Received 6 +Received 7 +Received 8 +Received 9 +Received 10 +**** Verifying ssend (2) **** diff --git a/teshsuite/smpi/mpich-test/pt2pt/structf.f b/teshsuite/smpi/mpich-test/pt2pt/structf.f new file mode 100644 index 0000000000..efb555bc81 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/structf.f @@ -0,0 +1,87 @@ +C Thanks to +C William R. Magro +C for this test +C +C It has been modifiedly slightly to work with the automated MPI +C tests. +C WDG. +C + program bustit + implicit none + + include 'mpif.h' + + integer ierr + integer comm + integer newtype + integer me + integer position + integer type(5) + integer length(5) + integer disp(5) + integer bufsize + parameter (bufsize=100) + character buf(bufsize) + character name*(10) + integer status(MPI_STATUS_SIZE) + integer i, size + double precision x + integer src, dest + +C Enroll in MPI + call mpi_init(ierr) + +C get my rank + call mpi_comm_rank(MPI_COMM_WORLD, me, ierr) + call mpi_comm_size(MPI_COMM_WORLD, size, ierr ) + if (size .lt. 2) then + print *, "Must have at least 2 processes" + call MPI_Abort( 1, MPI_COMM_WORLD, ierr ) + endif + + comm = MPI_COMM_WORLD + src = 0 + dest = 1 + + if(me.eq.src) then + i=5 + x=5.1234d0 + name="hello" + + type(1)=MPI_CHARACTER + length(1)=5 + call mpi_address(name,disp(1),ierr) + + type(2)=MPI_DOUBLE_PRECISION + length(2)=1 + call mpi_address(x,disp(2),ierr) + + call mpi_type_struct(2,length,disp,type,newtype,ierr) + call mpi_type_commit(newtype,ierr) + call mpi_barrier( MPI_COMM_WORLD, ierr ) + call mpi_send(MPI_BOTTOM,1,newtype,dest,1,comm,ierr) + call mpi_type_free(newtype,ierr) +C write(*,*) "Sent ",name(1:5),x + else +C Everyone calls barrier incase size > 2 + call mpi_barrier( MPI_COMM_WORLD, ierr ) + if (me.eq.dest) then + position=0 + + name = " " + x = 0.0d0 + call mpi_recv(buf,bufsize,MPI_PACKED, src, + . 1, comm, status, ierr) + + call mpi_unpack(buf,bufsize,position, + . name,5,MPI_CHARACTER, comm,ierr) + call mpi_unpack(buf,bufsize,position, + . x,1,MPI_DOUBLE_PRECISION, comm,ierr) + print 1, name, x + 1 format( " Received ", a, f7.4 ) + endif + endif + + call mpi_finalize(ierr) + + end diff --git a/teshsuite/smpi/mpich-test/pt2pt/structf.std b/teshsuite/smpi/mpich-test/pt2pt/structf.std new file mode 100644 index 0000000000..fa328cec56 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/structf.std @@ -0,0 +1,3 @@ +*** Testing Type_struct from Fortran *** + Received hello 5.1234 +*** Testing Type_struct from Fortran *** diff --git a/teshsuite/smpi/mpich-test/pt2pt/structlb.c b/teshsuite/smpi/mpich-test/pt2pt/structlb.c new file mode 100644 index 0000000000..a28d29532e --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/structlb.c @@ -0,0 +1,55 @@ +#include "mpi.h" +#include + +int main( int argc, char **argv) +{ + int blockcnt[2], size; + MPI_Datatype tmptype, newtype, oldtypes[2]; + MPI_Aint offsets[2], extent, lb, ub; + + MPI_Init(&argc, &argv); + + blockcnt[0] = 1; + offsets[0] = 1; + oldtypes[0] = MPI_BYTE; + blockcnt[1] = 1; /* set upper bound to avoid padding */ + offsets[1] = 2; + oldtypes[1] = MPI_UB; + MPI_Type_struct(2, blockcnt, offsets, oldtypes, &tmptype); + MPI_Type_commit(&tmptype); + + MPI_Type_size(tmptype, &size); + MPI_Type_lb(tmptype, &lb); + MPI_Type_ub(tmptype, &ub); + MPI_Type_extent(tmptype, &extent); +#ifdef DEBUG + printf("tmptype: size: %d lb: %ld ub: %ld ex: %ld\n", size, lb, ub, + extent); +#endif + + blockcnt[0] = 1; + offsets[0] = 1; + oldtypes[0] = tmptype; + MPI_Type_struct(1, blockcnt, offsets, oldtypes, &newtype); + MPI_Type_commit(&newtype); + + MPI_Type_size(newtype, &size); + MPI_Type_lb(newtype, &lb); + MPI_Type_ub(newtype, &ub); + MPI_Type_extent(newtype, &extent); +#ifdef DEBUG + printf("newtype: size: %ld lb: %ld ub: %ld ex: %d\n", size, lb, ub, + extent); +#endif + if (size != 1 || lb != 2 || ub != 3 || extent != 1) { + printf ("lb = %ld (should be 2), ub = %ld (should be 3) extent = %ld should be 1, size = %d (should be 1)\n", lb, ub, extent, size) ; + } + else { + printf( " No Errors\n" ); + } + MPI_Type_free(&tmptype); + MPI_Type_free(&newtype); + MPI_Finalize(); + + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/systest.c b/teshsuite/smpi/mpich-test/pt2pt/systest.c new file mode 100644 index 0000000000..af5fbb8705 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/systest.c @@ -0,0 +1,433 @@ +#include "mpi.h" +#include + +#define MAX2(a,b) (((a)>(b)) ? (a) : (b)) + +int GlobalReadInteger(); +void Hello(); +/* +void Ring(); +void Stress(); +void Globals(); +*/ + +int main( int argc, char **argv ) +{ + + int me, option; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD,&me); + + fprintf(stderr,"Process %d is alive\n",me); + + while (1) { + + MPI_Barrier(MPI_COMM_WORLD); + + again: + if (me == 0) { + /* Read user input for action */ + (void) printf("\nOptions: 0=quit, 1=Hello, 2=Ring, 3=Stress, "); + (void) printf("4=Globals : "); + (void) fflush(stdout); + } + option = GlobalReadInteger(); + if ( (option < 0) || (option > 4) ) + goto again; + + switch (option) { + case 0: + MPI_Finalize(); + return; + case 1: + Hello(); break; + case 2: + Ring(); break; +/* + case 3: + Stress(); break; + case 4: + Globals(); break; +*/ + default: + fprintf(stderr,"systest: invalid option %d\n", option); break; + } + } +} + +int GlobalReadInteger() +/* + Process zero reads an integer from stdin and broadcasts + to everyone else +*/ +{ + int me, value, *msg, msg_len, type=999 ,zero=0; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + if (me == 0) { + if (scanf("%d", &value) != 1) + fprintf(stderr,"failed reading integer value from stdin\n"); + } + MPI_Bcast(&value, 1, MPI_INT, 0, MPI_COMM_WORLD); + return value; +} + +static void Hello() +/* + Everyone exchanges a hello message with everyone else. + The hello message just comprises the sending and target nodes. +*/ +{ + int nproc, me; + int type = 1; + int buffer[2], node, length; + MPI_Status status; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + + if (me == 0) { + printf("\nHello test ... show network integrity\n----------\n\n"); + fflush(stdout); + } + + for (node = 0; node= 4*1024*1024) ) + max_len = 512*1024; + if ( (buffer = malloc((unsigned) max_len)) == (char *) NULL) { + printf("process %d could not allocate buffer of size %d\n",me,max_len); + MPI_Abort(MPI_COMM_WORLD,7777); + } + + lenbuf = 1; + while (lenbuf <= max_len) { + start_ustime = MPI_Wtime(); + if (me == 0) { + MPI_Send(buffer,lenbuf,MPI_CHAR,left, type,MPI_COMM_WORLD); + MPI_Recv(buffer,lenbuf,MPI_CHAR,right,type,MPI_COMM_WORLD,&status); + } + else { + MPI_Recv(buffer,lenbuf,MPI_CHAR,right,type,MPI_COMM_WORLD,&status); + MPI_Send(buffer,lenbuf,MPI_CHAR,left, type,MPI_COMM_WORLD); + } + used_ustime = MPI_Wtime() - start_ustime; + + if (used_ustime > 0) + us_rate = 1.0 * (double) (nproc * lenbuf) / (double) used_ustime; + else + us_rate = 0.0; + if (me == 0) + printf("len=%d bytes, used= %d us, rate=%f Mbytes/sec\n", + lenbuf, used_ustime, us_rate); + + lenbuf *= 2; + } + free(buffer); +} + +double ranf() +/* Returns ran # uniform in (0,1) ... probably rather bad statistics. */ +{ + static unsigned long seed = 54321; + + seed = seed * 1812433253 + 12345; + return (seed & 0x7fffffff) * 4.6566128752458e-10; +} + +static void RandList(lo, hi, list, n) + int lo, hi, *list, n; +/* + Fill list with n random integers between lo & hi inclusively +*/ +{ + int i, ran; + double dran; + + for (i=0; i hi) + ran = hi; + list[i] = ran; + } +} + +static void Stress() +/* + Stress the system by passing messages between a randomly selected + list of nodes +*/ +{ +#define N_LEN 10 +#ifdef NCUBE + /* ncube does not handle msgs larger than + 32K at present (see nwrite) */ + static int len[N_LEN] = {0,1,2,4,8,4096,8192,16384,32768,32768}; +#else + static int len[N_LEN] = {0,1,2,4,8,4096,8192,16384,32768,65536}; +#endif + int me = p4_get_my_id(); + int nproc = p4_num_total_ids(); + int zero = 0; + int type, lenbuf, i, j, from, to; + int *list_i, *list_j, *list_n; + char *buffer; + int n_stress, mod, *msg, msg_len; + + + type = 6; + if (me == 0) { + (void) printf("\nStress test ... randomly exchange messages\n-----------"); + (void) printf("\n\nInput no. of messages: "); + (void) fflush(stdout); + } + n_stress = GlobalReadInteger(); + if ( (n_stress <= 0) || (n_stress > 100000) ) + n_stress = 1000; + p4_dprintfl(00,"n_stress=%d\n",n_stress); + + lenbuf = n_stress * sizeof(int); + + if (!(buffer = p4_shmalloc((unsigned) len[N_LEN-1]))) + p4_error("Stress: failed to allocate buffer", len[N_LEN-1]); + + type = 7; + if (me == 0) { /* Make random list of pairs and message lengths */ + if (!(list_i = (int *) p4_shmalloc((unsigned) lenbuf))) + p4_error("Stress: failed to allocate list_i",lenbuf); + if (!(list_j = (int *) p4_shmalloc((unsigned) lenbuf))) + p4_error("Stress: failed to allocate list_j",lenbuf); + if (!(list_n = (int *) p4_shmalloc((unsigned) lenbuf))) + p4_error("Stress: failed to allocate list_n",lenbuf); + + RandList((int) 0, nproc-1, list_i, n_stress); + RandList((int) 0, nproc-1, list_j, n_stress); + RandList((int) 0, N_LEN-1, list_n, n_stress); + for (i=0; i=0 ) ? (a) : -(a)) + int nerrs = 0; + double diff; + + while (n--) { + diff = *a++ - *b++; + if (ABS(diff) > 1.0e-8) + nerrs++; + } + + return nerrs; +} + +static void Globals() +/* + Test out functioning of the global operations. +*/ +{ + int nproc = p4_num_total_ids(); + int me = p4_get_my_id(); + int n, i, start, used, nerrs; + double *a, *b, rate; + +#define DO(string, op) \ + start = p4_clock(); \ + if (p4_global_op(33, (char *) a, n, sizeof(double), op, P4DBL)) \ + p4_error("p4_global_op failed",n); \ + used = p4_clock()-start; \ + rate = (used>0) ? n/(1.0e+3 * used) : 0.0; \ + nerrs = CompareVectors(n, a, b); \ + if (me == 0) \ + (void) printf("%s, len=%d, used=%d ms, rate=%f Mop/sec, nerrs=%d\n",\ + string, n, used, rate, nerrs); + + if (me == 0) { + (void) printf("\nGlobal operations test\n----------------------"); + (void) printf("\n\nInput vector length "); + (void) fflush(stdout); + } + n = GlobalReadInteger(); + if ( (n < 0) || (n > 1000000) ) + n = 1000; + + if (!(a = (double *) p4_shmalloc((unsigned) (n*sizeof(double))))) + p4_error("failed to create work space (a)",n); + if (!(b = (double *) p4_shmalloc((unsigned) (n*sizeof(double))))) + p4_error("failed to create work space (b)",n); + + /* Summation */ + + for (i=0; i + +#define MAX2(a,b) (((a)>(b)) ? (a) : (b)) + +int GlobalReadInteger(); +void Hello(); +/* +void Ring(); +void Stress(); +void Globals(); +*/ + +int main(argc,argv) +int argc; +char **argv; +{ + + int me, option; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD,&me); + + fprintf(stderr,"Process %d is alive\n",me); + + while (1) { + + MPI_Barrier(MPI_COMM_WORLD); + + again: + if (me == 0) { + /* Read user input for action */ + (void) printf("\nOptions: 0=quit, 1=Hello, 2=Ring, 3=Stress, "); + (void) printf("4=Globals : "); + (void) fflush(stdout); + } + option = GlobalReadInteger(); + if ( (option < 0) || (option > 4) ) + goto again; + + switch (option) { + case 0: + MPI_Finalize(); + return; + case 1: + Hello(); break; +/* + case 2: + Ring(); break; + case 3: + Stress(); break; + case 4: + Globals(); break; +*/ + default: + fprintf(stderr,"systest: invalid option %d\n", option); break; + } + } +} + +int GlobalReadInteger() +/* + Process zero reads an integer from stdin and broadcasts + to everyone else +*/ +{ + int me, value, *msg, msg_len, type=999 ,zero=0; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + if (me == 0) { + if (scanf("%d", &value) != 1) + fprintf(stderr,"failed reading integer value from stdin\n"); + } + MPI_Bcast(&value, 1, MPI_INT, 0, MPI_COMM_WORLD); + return value; +} + +static void Hello() +/* + Everyone exchanges a hello message with everyone else. + The hello message just comprises the sending and target nodes. +*/ +{ + int nproc, me; + int type = 1; + int buffer[2], node, length; + MPI_Status status; + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + + if (me == 0) { + printf("\nHello test ... show network integrity\n----------\n\n"); + fflush(stdout); + } + + for (node = 0; node +#include +#include "test.h" + +#if defined(USE_STDARG) +#include +#endif + +static int tests_passed = 0; +static int tests_failed = 0; +static char failed_tests[255][81]; +static char suite_name[255]; +FILE *fileout = NULL; + +void Test_Init(const char *suite, int rank) +{ + char filename[512]; + + sprintf(filename, "%s-%d.out", suite, rank); + strncpy(suite_name, suite, 255); + fileout = fopen(filename, "w"); + if (!fileout) { + fprintf( stderr, "Could not open %s on node %d\n", filename, rank ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + //MPI_Errhandler_create( Test_Errors_warn, &TEST_ERRORS_WARN ); +} + +void Test_Message(const char *mess) +{ + fprintf(fileout, "[%s]: %s\n", suite_name, mess); + fflush(fileout); +} + +void Test_Failed(const char *test) +{ + fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test); + strncpy(failed_tests[tests_failed], test, 81); + fflush(fileout); + tests_failed++; +} + +void Test_Passed(const char *test) +{ +#ifdef VERBOSE + fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test); + fflush(fileout); +#endif + tests_passed++; +} + +int Summarize_Test_Results() +{ +#ifdef VERBOSE + fprintf(fileout, "For test suite '%s':\n", suite_name); +#else + if (tests_failed > 0) +#endif + { + fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", + tests_passed + tests_failed, tests_passed, tests_failed); + } + if (tests_failed > 0) { + int i; + + fprintf(fileout, "*** Tests Failed:\n"); + for (i = 0; i < tests_failed; i++) + fprintf(fileout, "*** %s\n", failed_tests[i]); + } + return tests_failed; +} + +void Test_Finalize( void ) +{ + //if (TEST_ERRORS_WARN != MPI_ERRHANDLER_NULL) + //MPI_Errhandler_free( &TEST_ERRORS_WARN ); + if (fileout) { + fflush(fileout); + //fclose(fileout); + } +} + +#include "mpi.h" +/* Wait for every process to pass through this point. This test is used + to make sure that all processes complete, and that a test "passes" because + it executed, not because it some process failed. + */ +void Test_Waitforall( void ) +{ + int m, one, myrank, n; + + MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); + MPI_Comm_size( MPI_COMM_WORLD, &n ); + one = 1; + MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + + if (m != n) { + printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, + n, m ); + } + if (myrank == 0) + printf( " No Errors\n" ); +} + +/* + Handler prints warning messsage and returns. Internal. Not + a part of the standard. + */ +MPI_Errhandler TEST_ERRORS_WARN ; + +#ifdef USE_STDARG +void Test_Errors_warn( MPI_Comm *comm, int *code, ... ) +{ + char buf[MPI_MAX_ERROR_STRING]; + int myid; + char *string; +#ifdef MPIR_DEBUG + char *file; + int *line; +#endif + static int in_handler = 0; + va_list Argp; + +#ifdef USE_OLDSTYLE_STDARG + va_start( Argp ); +#else + va_start( Argp, code ); +#endif + string = va_arg(Argp,char *); +#ifdef MPIR_DEBUG + /* These are only needed for debugging output */ + file = va_arg(Argp,char *); + line = va_arg(Argp,int *); +#endif + va_end( Argp ); +#else +void Test_Errors_warn( MPI_Comm *comm, int *code, char *string, char *file, + int *line ) +{ + char buf[MPI_MAX_ERROR_STRING]; + int myid, result_len; + static int in_handler = 0; +#endif + + if (in_handler) return; + in_handler = 1; + + MPI_Comm_rank( MPI_COMM_WORLD, &myid ); + //MPI_Error_string( *code, buf, &result_len ); +#ifdef MPIR_DEBUG + /* Generate this information ONLY when debugging MPIR */ + fprintf( stderr, "%d - File: %s Line: %d\n", myid, + file, *line ); +#endif + fprintf( stderr, "%d - %s : %s\n", myid, + string ? string : "", buf ); + fflush( stderr ); + in_handler = 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/test.h b/teshsuite/smpi/mpich-test/pt2pt/test.h new file mode 100644 index 0000000000..fb83d2279c --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/test.h @@ -0,0 +1,29 @@ +/* Header for testing procedures */ + +#ifndef _INCLUDED_TEST_H_ +#define _INCLUDED_TEST_H_ + +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +void Test_Init (const char *, int); +#ifdef USE_STDARG +void Test_Printf (const char *, ...); +void Test_Errors_warn ( MPI_Comm *, int *, ... ); +#else +/* No prototype */ +void Test_Printf(); +void Test_Errors_warn(); +#endif +void Test_Message (const char *); +void Test_Failed (const char *); +void Test_Passed (const char *); +int Summarize_Test_Results (void); +void Test_Finalize (void); +void Test_Waitforall (void); + +extern MPI_Errhandler TEST_ERRORS_WARN; +#endif diff --git a/teshsuite/smpi/mpich-test/pt2pt/testall.c b/teshsuite/smpi/mpich-test/pt2pt/testall.c new file mode 100644 index 0000000000..22f471ba7c --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/testall.c @@ -0,0 +1,175 @@ +#include "mpi.h" +#include +#include +#include "dtypes.h" +#include "gcomm.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int verbose = 0; +/* + Multiple completions + + This is similar to a test in allpair.f, but with an expanded range of + datatypes and communicators. + */ + +int main( int argc, char **argv ) +{ +MPI_Datatype *types; +void **inbufs, **outbufs; +char **names; +int *counts, *bytesize, ntype; +MPI_Comm comms[20]; +int ncomm = 20, rank, np, partner, tag; +int i, j, k, err, toterr, world_rank; +MPI_Status status, statuses[2]; +int flag; +char *obuf; +MPI_Request requests[2]; + + +MPI_Init( &argc, &argv ); + +AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, + &names, &ntype ); +GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype ); + +MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); +MakeComms( comms, 20, &ncomm, 0 ); + +/* Test over a wide range of datatypes and communicators */ +err = 0; +for (i=0; i 0) { + fprintf( stderr, "%d errors on %d\n", err, rank ); + } +MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } +FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype ); +FreeComms( comms, ncomm ); +MPI_Finalize(); + +return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/testhetero b/teshsuite/smpi/mpich-test/pt2pt/testhetero new file mode 100755 index 0000000000..5f32e12ac9 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/testhetero @@ -0,0 +1,92 @@ +#! /bin/sh +# +# This is a simple heterogeneous test which exploits the mpicc command and +# mpirun. This is an example of how heterogeneous programs may be built and +# run +# +# +# Parameters for all programs and systems +set -x +device=ch_p4 +mpihome=../../.. +rshcmd=rsh +programs="sendrecv sendrecv2 sendrecv3 sendrecv4 getelm" +# Extra files needed for each program. +sendrecvfiles="test.c" +sendrecvargs="-nolongdouble" +sendrecv2files="dtypes.c gcomm.c" +sendrecv3files="dtypes.c gcomm.c" +sendrecv4files="dtypes.c gcomm.c" +getelmfiles="" +# +# +# arch1 is local, arch2 is remote +arch1=sun4 +arch2=freebsd +name2=dogbert +# +debug_args="" +fail_hard=1 +rebuild=0 +mpirun_args="" +for arg in "$@" ; do + case "$arg" in + -echo) set -x ;; + -noclean) noclean=1 ;; + -debug) debug_args="-p4dbg 99 -p4rdbg 99" ;; + -mpichdebug) debug_args="$debug_args -mpichdebug" ;; + -xxgdb) mpirun_args="-xxgdb" ;; + -soft) fail_hard=0 ;; + -force | -rebuild) rebuild=1 ;; + -alpha) arch2=alpha ; name2=ptera ;; + -help) + echo "Test heterogeneous operation of MPICH with ch_p4 using" + echo "the versions of MPICH built in the current tree." + echo "Should be run on a sun4; it rsh's to other machines as" + echo "necessary." + exit 1 + ;; + *) echo "Unrecognized argument $arg" + exit 1 + ;; + esac +done +# +arches="$arch1 $arch2" +# +mypwd=`pwd` +# Fixup for brain-dead automounters +mypwd=`echo $mypwd | sed s%/tmp_mnt%%g` +# +# Build local versions +if [ 1 = 1 ] ; then + for pgm in $programs ; do + eval extrafiles=$"${pgm}files" + $mpihome/lib/$arch1/$device/mpicc -o $pgm.$arch1 $pgm.c $extrafiles + done +fi +# +# Build remote versions +for pgm in $programs ; do + eval extrafiles=$"${pgm}files" + $rshcmd -n $name2 "(cd $mypwd ; $mpihome/lib/$arch2/$device/mpicc \ + -o $pgm.$arch2 $pgm.c $extrafiles)" +done +# +# Run the programs +for pgm in $programs ; do + echo "Running $pgm..." + eval extraargs=$"${pgm}args" + $mpihome/lib/$arch1/$device/mpirun $mpirun_args \ + -arch $arch1 -np 1 -arch $arch2 -np 1 $pgm.%a $debug_args \ + $extraargs +done +# +# Remove the executables +if [ -z "$noclean" ] ; then + for arch in $arches ; do + for pgm in $programs ; do + rm -f $pgm.$arch + done + done +fi diff --git a/teshsuite/smpi/mpich-test/pt2pt/testsome.c b/teshsuite/smpi/mpich-test/pt2pt/testsome.c new file mode 100644 index 0000000000..955e503baf --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/testsome.c @@ -0,0 +1,173 @@ +#include "mpi.h" +#include +#include +#include "dtypes.h" +#include "gcomm.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int verbose = 0; +/* + Multiple completions + + This is similar to a test in allpair.f, but with an expanded range of + datatypes and communicators. + */ + +int main( int argc, char **argv ) +{ +MPI_Datatype *types; +void **inbufs, **outbufs; +char **names; +int *counts, *bytesize, ntype; +MPI_Comm comms[20]; +int ncomm = 20, rank, np, partner, tag; +int i, j, k, err, toterr, world_rank; +MPI_Status status, statuses[2]; +int flag, index, outcount, indices[2]; +char *obuf; +MPI_Request requests[2]; + + +MPI_Init( &argc, &argv ); + +AllocateForData( &types, &inbufs, &outbufs, &counts, &bytesize, + &names, &ntype ); +GenerateData( types, inbufs, outbufs, counts, bytesize, names, &ntype ); + +MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); +MakeComms( comms, 20, &ncomm, 0 ); + +/* Test over a wide range of datatypes and communicators */ +err = 0; +for (i=0; i 0) { + fprintf( stderr, "%d errors on %d\n", err, rank ); + } + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) { + printf( " No Errors\n" ); + } + else { + printf (" Found %d errors\n", toterr ); + } + } +FreeDatatypes( types, inbufs, outbufs, counts, bytesize, names, ntype ); +FreeComms( comms, ncomm ); +MPI_Finalize(); + +return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/testtest1.c b/teshsuite/smpi/mpich-test/pt2pt/testtest1.c new file mode 100644 index 0000000000..e087567a89 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/testtest1.c @@ -0,0 +1,83 @@ +/* + This is a test of MPI_Test to receive a message of known length (used as a + server) + */ +#include "mpi.h" +#include +#include +#include "test.h" + +int main( int argc, char **argv ) +{ + int data, to, from, tag, maxlen, np, myid, flag, dest, src; + MPI_Status status; + MPI_Request request; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &myid ); + MPI_Comm_size( MPI_COMM_WORLD, &np ); + +/* dest writes out the received stats; for the output to be + consistant (with the final check), it should be procees 0 */ + if (argc > 1 && argv[1] && strcmp( "-alt", argv[1] ) == 0) { + dest = np - 1; + src = 0; + } + else { + src = np - 1; + dest = 0; + } + + if (myid == src) { + to = dest; + tag = 2000; + data = 100; +#ifdef VERBOSE + printf( "About to send\n" ); +#endif + MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD ); + tag = 2001; + data = 0; +#ifdef VERBOSE + printf( "About to send 'done'\n" ); +#endif + MPI_Send( &data, 1, MPI_INT, to, tag, MPI_COMM_WORLD ); + } + else { + /* Server loop */ + while (1) { + tag = MPI_ANY_TAG; + from = MPI_ANY_SOURCE; + MPI_Irecv( &data, 1, MPI_INT, from, tag, MPI_COMM_WORLD, + &request ); + /* Should really use MPI_Wait, but functionally this will work + (it is less efficient, however) */ + do { + MPI_Test( &request, &flag, &status ); + } while (!flag); + if (status.MPI_TAG == 2001) { +#ifdef VERBOSE + printf( "Received terminate message\n" ); +#endif + break; + } + if (status.MPI_TAG == 2000) { + MPI_Get_count( &status, MPI_INT, &maxlen ); + if (maxlen != 1) { + fprintf( stderr, "Should have received one integer; got %d\n", + maxlen ); + } + /* Check data: */ + if (data != 100) { + fprintf( stderr, + "Did not receive correct data: %d instead of %d\n", + data, 100 ); + } + } + } + } + MPI_Barrier( MPI_COMM_WORLD ); + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/testtypes.c b/teshsuite/smpi/mpich-test/pt2pt/testtypes.c new file mode 100644 index 0000000000..be041816e3 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/testtypes.c @@ -0,0 +1,37 @@ +#include +#include "mpi.h" +#include "test.h" + +int main( int argc, char **argv ) +{ + int i_size; + MPI_Aint i_extent; + + MPI_Init(&argc, &argv); + + + MPI_Type_extent(MPI_INT, &i_extent); + printf("MPI_Type_extent (MPI_INT) = %ld\n", i_extent); + + MPI_Type_size(MPI_INT, &i_size); + printf("MPI_Type_size (MPI_INT) = %d\n", i_size); + + + MPI_Type_extent(MPI_UNSIGNED, &i_extent); + printf("MPI_Type_extent (MPI_UNSIGNED) = %ld\n", i_extent); + + MPI_Type_size(MPI_UNSIGNED, &i_size); + printf("MPI_Type_size (MPI_UNSIGNED) = %d\n", i_size); + +#if defined(HAVE_LONG_DOUBLE) + MPI_Type_extent(MPI_LONG_DOUBLE, &i_extent); + printf("MPI_Type_extent (MPI_LONG_DOUBLE) = %ld\n", i_extent); + + MPI_Type_size(MPI_LONG_DOUBLE, &i_size); + printf("MPI_Type_size (MPI_LONG_DOUBLE) = %d\n", i_size); +#endif + + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/third.c b/teshsuite/smpi/mpich-test/pt2pt/third.c new file mode 100644 index 0000000000..f8a2f24950 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/third.c @@ -0,0 +1,121 @@ +/* + third - test program that tests queueing by sending messages with various + tags, receiving them in particular order. + */ + +#include +#include +#include "mpi.h" +#include "test.h" +#ifdef HAVE_UNISTD_H +/* For sleep */ +#include +#endif + +#ifndef HAVE_SLEEP +void sleep( int secs ) +{ +#ifdef VX_WORKS + /* Also needs include ? */ + struct timespec rqtp = { 10, 0 }; + nanosleep(&rqtp, NULL); +#else + double t; + t = MPI_Wtime(); + while (MPI_Wtime() - t < (double)secs) ; +#endif +} +#endif + +/* Define VERBOSE to get printed output */ +int main( int argc, char **argv ) +{ + int rank, size, to, from, tag, count; + int src, dest, waiter; + int st_count; +#ifdef VERBOSE + int st_source, st_tag; +#endif + MPI_Status status; + char data[100]; + MPI_Request rq[2]; + MPI_Status statuses[2]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); +/* + src = size - 1; + dest = 0; + */ + src = 0; + dest = size - 1; + /* waiter = dest; */ /* Receiver delays, so msgs unexpected */ + /* waiter = src; */ /* Sender delays, so recvs posted */ + waiter = 10000; /* nobody waits */ + + if (rank == src) + { + if (waiter == src) + sleep(10); + to = dest; + tag = 2001; + sprintf(data,"First message, type 2001"); + count = strlen(data) + 1; + MPI_Isend( data, count, MPI_CHAR, to, tag, MPI_COMM_WORLD, &rq[0] ); +#ifdef VERBOSE + printf("%d sent :%s:\n", rank, data ); +#endif + tag = 2002; + sprintf(data,"Second message, type 2002"); + count = strlen(data) + 1; + MPI_Isend( data, count, MPI_CHAR, to, tag, MPI_COMM_WORLD, &rq[1] ); + MPI_Waitall( 2, rq, statuses ); +#ifdef VERBOSE + printf("%d sent :%s:\n", rank, data ); +#endif + } + else + if (rank == dest) + { + if (waiter == dest) + sleep(10); + from = MPI_ANY_SOURCE; + count = 100; + + tag = 2002; + MPI_Recv(data, count, MPI_CHAR, from, tag, MPI_COMM_WORLD, &status ); + + MPI_Get_count( &status, MPI_CHAR, &st_count ); + if (st_count != strlen("Second message, type 2002") + 1) { + printf( "Received wrong length!\n" ); + } +#ifdef VERBOSE + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG; + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + printf( "%d received :%s:\n", rank, data); +#endif + tag = 2001; + MPI_Recv(data, count, MPI_CHAR, from, tag, MPI_COMM_WORLD, &status ); + + MPI_Get_count( &status, MPI_CHAR, &st_count ); + if (st_count != strlen("First message, type 2001") + 1) { + printf( "Received wrong length!\n" ); + } +#ifdef VERBOSE + st_source = status.MPI_SOURCE; + st_tag = status.MPI_TAG;\ + printf( "Status info: source = %d, tag = %d, count = %d\n", + st_source, st_tag, st_count ); + printf( "%d received :%s:\n", rank, data); +#endif + } +#ifdef VERBOSE + printf( "Process %d exiting\n", rank ); +#endif + Test_Waitforall( ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/trunc.c b/teshsuite/smpi/mpich-test/pt2pt/trunc.c new file mode 100644 index 0000000000..d07993a13a --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/trunc.c @@ -0,0 +1,163 @@ +/* + * This file tests that message truncation errors are properly detected and + * handled (in particular, that data is NOT overwritten). + */ + +#include "mpi.h" +#include +#include +#include "test.h" +/* Prototypes for picky compilers */ +int SetupRecvBuf ( int * ); +int CheckRecvErr ( int, MPI_Status *, int *, const char * ); + +int main( int argc, char **argv ) +{ + int err = 0, toterr; + int world_rank; + MPI_Comm comm, dupcomm; + int rank, size; + int partner, merr, flag; + MPI_Status status; + MPI_Request request; + int i, sendbuf[10], recvbuf[10]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); + + comm = MPI_COMM_WORLD; + MPI_Comm_dup( comm, &dupcomm ); + MPI_Comm_rank( comm, &rank ); + MPI_Comm_size( comm, &size ); + +/* We'll RECEIVE into rank 0, just to simplify any debugging. The tests are + sender receiver + send( count = 10 ) recv(count = 1) + isend( count = 10 ) + sendrecv sendrecv + wait recv(count=1) (unexpected recv) + irecv( count = 1) + sendrecv sendrecv + send( count = 10) wait (expected/err trunc) + irecv( count = 1) + sendrecv sendrecv + send( count = 10) test (expected/err trunc) + */ + + if (size < 2) { + fprintf( stderr, "This test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + if (rank == 0) { + /* Only return on the RECEIVERS side */ + MPI_Errhandler_set( comm, MPI_ERRORS_RETURN ); + partner = size - 1; + SetupRecvBuf( recvbuf ); + merr = MPI_Recv( recvbuf, 1, MPI_INT, partner, 1, comm, &status ); + err += CheckRecvErr( merr, &status, recvbuf, "Recv" ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + + SetupRecvBuf( recvbuf ); + merr = MPI_Recv( recvbuf, 1, MPI_INT, partner, 2, comm, &status ); + err += CheckRecvErr( merr, &status, recvbuf, "Unexpected Recv" ); + + SetupRecvBuf( recvbuf ); + merr = MPI_Irecv( recvbuf, 1, MPI_INT, partner, 3, comm, &request ); + + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + merr = MPI_Wait( &request, &status ); + err += CheckRecvErr( merr, &status, recvbuf, "Irecv/Wait" ); + + SetupRecvBuf( recvbuf ); + merr = MPI_Irecv( recvbuf, 1, MPI_INT, partner, 4, comm, &request ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + do { + merr = MPI_Test( &request, &flag, &status ); + } while (merr == 0 && flag == 0); + err += CheckRecvErr( merr, &status, recvbuf, "Irecv/Test" ); + } + else if (rank == size - 1) { + partner = 0; + for (i=0; i<10; i++) + sendbuf[i] = 100 + i; + MPI_Send( sendbuf, 10, MPI_INT, partner, 1, comm ); + MPI_Isend( sendbuf, 10, MPI_INT, partner, 2, comm, &request ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + MPI_Wait( &request, &status ); + + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + MPI_Send( sendbuf, 10, MPI_INT, partner, 3, comm ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + MPI_Send( sendbuf, 10, MPI_INT, partner, 4, comm ); + } + MPI_Comm_free( &dupcomm ); + + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) + printf( " No Errors\n" ); + else + printf( "Found %d errors in Truncated Message test\n", toterr ); + } + MPI_Finalize( ); + return toterr; +} + +int SetupRecvBuf( recvbuf ) +int *recvbuf; +{ + int i; + for (i=0; i<10; i++) + recvbuf[i] = i+1; + return 0; +} + +int CheckRecvErr( merr, status, recvbuf, msg ) +int merr, *recvbuf; +MPI_Status *status; +const char *msg; +{ + int class; + int err = 0, rlen; + char buf[MPI_MAX_ERROR_STRING]; + +/* Get the MPI Error class from merr */ + MPI_Error_class( merr, &class ); + switch (class) { + case MPI_ERR_TRUNCATE: + /* Check that data buf is ok */ + if (recvbuf[1] != 2) { + err++; + fprintf( stderr, + "Receive buffer overwritten! Found %d in 2nd pos.\n", + recvbuf[1] ); + } + break; + + case MPI_ERR_IN_STATUS: + /* Check for correct message */ + /* ERR IN STATUS is correct ONLY for multiple completion routines */ +/* if (status->MPI_ERROR == MPI_ERR_TRUNCATE) + break; */ + /* Else, fall through into default... */ + default: + /* Wrong error; get message and print */ + MPI_Error_string( merr, buf, &rlen ); + fprintf( stderr, + "Got unexpected error message from %s: %s\n", msg, buf ); + err++; + } + return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/truncmult.c b/teshsuite/smpi/mpich-test/pt2pt/truncmult.c new file mode 100644 index 0000000000..7f1e68b075 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/truncmult.c @@ -0,0 +1,258 @@ +/* + * This file tests that message truncation errors are properly detected and + * handled (in particular, that data is NOT overwritten). + * + * This version checks the multiple completion routines + */ + +#include "mpi.h" +#include +#include +#include "test.h" +/* Prototypes for picky compilers */ +int SetupRecvBuf ( int * ); +int CheckRecvErr ( int, MPI_Status *, int *, const char * ); +int CheckRecvOk ( MPI_Status *, int *, int, const char * ); + +int main( int argc, char **argv ) +{ + int err = 0, toterr; + int world_rank; + MPI_Comm comm, dupcomm; + int rank, size; + int partner, merr; + MPI_Status statuses[4], status; + MPI_Request requests[4]; + int i, sendbuf[10], + recvbuf1[10], recvbuf2[10], recvbuf3[10], recvbuf4[10]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &world_rank ); + + comm = MPI_COMM_WORLD; + MPI_Comm_dup( comm, &dupcomm ); + MPI_Comm_rank( comm, &rank ); + MPI_Comm_size( comm, &size ); + +/* We'll RECEIVE into rank 0, just to simplify any debugging. Just in + case the MPI implementation tests for errors when the irecv is issued, + we make sure that the matching sends don't occur until the receives + are posted. + + sender receiver + irecv(tag=1,count=1) + irecv(tag=2,count=1) + sendrecv sendrecv + send(tag=1,count=1) + send(tag=2,count=10) + waitall() + error in status, err trunc + wait for tag = 1 if necessary + sendrecv sendrecv + Ditto, but with 2 truncated messages + Ditto, but with testall. (not done yet) + All of the above, but with waitsome/testsome (not done yet) + */ + + if (rank == 0) { + /* Only return on the RECEIVERS side */ + MPI_Errhandler_set( comm, MPI_ERRORS_RETURN ); + partner = size - 1; + + SetupRecvBuf( recvbuf1 ); + SetupRecvBuf( recvbuf2 ); + merr = MPI_Irecv( recvbuf1, 1, MPI_INT, partner, 1, comm, + &requests[0] ); /* this will succeed */ + merr = MPI_Irecv( recvbuf2, 1, MPI_INT, partner, 2, comm, + &requests[1] ); /* this will fail */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + merr = MPI_Waitall( 2, requests, statuses ); + if (merr != MPI_ERR_IN_STATUS) { + err++; + fprintf( stderr, "Did not return MPI_ERR_IN_STATUS\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + if (statuses[0].MPI_ERROR == MPI_ERR_PENDING) { + /* information - first send is not yet complete */ + if ((statuses[0].MPI_ERROR = MPI_Wait( &requests[0], &statuses[0] )) == MPI_SUCCESS) { + err++; + fprintf( stderr, "failed to complete legal request (1)\n" ); + } + } + if (statuses[0].MPI_ERROR != MPI_SUCCESS) { + err ++; + fprintf( stderr, "Could not complete legal send-receive\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + err += CheckRecvErr( merr, &statuses[1], recvbuf2, "Irecv" ); + + SetupRecvBuf( recvbuf1 ); + SetupRecvBuf( recvbuf2 ); + SetupRecvBuf( recvbuf3 ); + SetupRecvBuf( recvbuf4 ); + merr = MPI_Irecv( recvbuf1, 1, MPI_INT, partner, 1, comm, + &requests[0] ); /* this will succeed */ + merr = MPI_Irecv( recvbuf2, 1, MPI_INT, partner, 2, comm, + &requests[1] ); /* this will fail */ + merr = MPI_Irecv( recvbuf3, 1, MPI_INT, partner, 3, comm, + &requests[2] ); /* this will fail */ + merr = MPI_Irecv( recvbuf4, 1, MPI_INT, partner, 4, comm, + &requests[3] ); /* this will succeed */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + merr = MPI_Waitall( 4, requests, statuses ); + if (merr != MPI_ERR_IN_STATUS) { + err++; + fprintf( stderr, "Did not return MPI_ERR_IN_STATUS (4)\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + if (statuses[0].MPI_ERROR == MPI_ERR_PENDING) { + /* information - first send is not yet complete */ + if ((statuses[0].MPI_ERROR = MPI_Wait( &requests[0], &statuses[0] )) != MPI_SUCCESS) { + err++; + fprintf( stderr, "failed to complete legal request (1a)\n" ); + } + } + /* Check for correct completion */ + err += CheckRecvOk( &statuses[0], recvbuf1, 1, "4-1" ); + + if (statuses[3].MPI_ERROR == MPI_ERR_PENDING) { + /* information - first send is not yet complete */ + if ((statuses[3].MPI_ERROR = MPI_Wait( &requests[3], &statuses[3] )) != MPI_SUCCESS) { + err++; + fprintf( stderr, "failed to complete legal request (3a)\n" ); + } + } + /* Check for correct completion */ + err += CheckRecvOk( &statuses[3], recvbuf4, 4, "4-4" ); + + if (statuses[0].MPI_ERROR != MPI_SUCCESS) { + err ++; + fprintf( stderr, "Could not complete legal send-receive-0\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + if (statuses[3].MPI_ERROR != MPI_SUCCESS) { + err ++; + fprintf( stderr, "Could not complete legal send-receive-3\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + + if (statuses[1].MPI_ERROR == MPI_ERR_PENDING) { + statuses[1].MPI_ERROR = MPI_Wait( &requests[1], &statuses[1] ); + } + err += CheckRecvErr( merr, &statuses[1], recvbuf2, "Irecv-2" ); + if (statuses[2].MPI_ERROR == MPI_ERR_PENDING) { + statuses[2].MPI_ERROR = MPI_Wait( &requests[2], &statuses[2] ); + } + err += CheckRecvErr( merr, &statuses[2], recvbuf3, "Irecv-3" ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + } + else if (rank == size - 1) { + partner = 0; + for (i=0; i<10; i++) + sendbuf[i] = 100 + i; + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + MPI_Send( sendbuf, 1, MPI_INT, partner, 1, comm ); + MPI_Send( sendbuf, 10, MPI_INT, partner, 2, comm ); + + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + MPI_Send( sendbuf, 1, MPI_INT, partner, 1, comm ); + MPI_Send( sendbuf, 10, MPI_INT, partner, 2, comm ); + MPI_Send( sendbuf, 10, MPI_INT, partner, 3, comm ); + MPI_Send( sendbuf, 1, MPI_INT, partner, 4, comm ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INT, partner, 0, + MPI_BOTTOM, 0, MPI_INT, partner, 0, + dupcomm, &status ); + } + MPI_Comm_free( &dupcomm ); + + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (world_rank == 0) { + if (toterr == 0) + printf( " No Errors\n" ); + else + printf( "Found %d errors in Truncated Message Multiple Completion test\n", toterr ); + } + MPI_Finalize( ); + return toterr; +} + +int SetupRecvBuf( recvbuf ) +int *recvbuf; +{ + int i; + for (i=0; i<10; i++) + recvbuf[i] = i+1; + return 0; +} + +int CheckRecvOk( status, recvbuf, tag, msg ) +int *recvbuf, tag; +MPI_Status *status; +const char *msg; +{ + int err = 0, count; + + if (status->MPI_TAG != tag) { + err++; + fprintf( stderr, "Wrong tag; was %d should be %d (%s)\n", + status->MPI_TAG, tag, msg ); + } + MPI_Get_count( status, MPI_INT, &count ); + if (count != 1) { + err++; + fprintf( stderr, "Wrong count; was %d expected 1 (%s)\n", count, msg ); + } + return err; +} + +int CheckRecvErr( merr, status, recvbuf, msg ) +int merr, *recvbuf; +MPI_Status *status; +const char *msg; +{ + int class; + int err = 0, rlen; + char buf[MPI_MAX_ERROR_STRING]; + +/* Get the MPI Error class from merr */ + MPI_Error_class( merr, &class ); + switch (class) { + case MPI_ERR_TRUNCATE: + /* Check that data buf is ok */ + if (recvbuf[1] != 2) { + err++; + fprintf( stderr, + "Receive buffer overwritten! Found %d in 2nd pos.\n", + recvbuf[1] ); + } + break; + + case MPI_ERR_IN_STATUS: + /* Check for correct message */ + MPI_Error_class(status->MPI_ERROR, &class); + if (class != MPI_ERR_TRUNCATE) { + MPI_Error_string( status->MPI_ERROR, buf, &rlen ); + fprintf( stderr, + "Unexpected error message for err in status for %s: %s\n", + msg, buf ); + } + break; + default: + /* Wrong error; get message and print */ + MPI_Error_string( merr, buf, &rlen ); + fprintf( stderr, + "Got unexpected error message from %s: %s\n", msg, buf ); + err++; + } + return err; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/typebase.c b/teshsuite/smpi/mpich-test/pt2pt/typebase.c new file mode 100644 index 0000000000..bdd784a2a5 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/typebase.c @@ -0,0 +1,126 @@ +/* + */ +#include "mpi.h" +#include +#include "test.h" + +/* + * This program checks that the type inquiry routines work with the + * basic types + */ + +#define MAX_TYPES 14 +static int ntypes; +static MPI_Datatype BasicTypes[MAX_TYPES]; +static char *(BasicTypesName[MAX_TYPES]); +static int BasicSizes[MAX_TYPES]; + +/* Prototypes for picky compilers */ +void SetupBasicTypes (void); + +void +SetupBasicTypes() +{ + BasicTypes[0] = MPI_CHAR; + BasicTypes[1] = MPI_SHORT; + BasicTypes[2] = MPI_INT; + BasicTypes[3] = MPI_LONG; + BasicTypes[4] = MPI_UNSIGNED_CHAR; + BasicTypes[5] = MPI_UNSIGNED_SHORT; + BasicTypes[6] = MPI_UNSIGNED; + BasicTypes[7] = MPI_UNSIGNED_LONG; + BasicTypes[8] = MPI_FLOAT; + BasicTypes[9] = MPI_DOUBLE; + + BasicTypesName[0] = (char*)"MPI_CHAR"; + BasicTypesName[1] = (char*)"MPI_SHORT"; + BasicTypesName[2] = (char*)"MPI_INT"; + BasicTypesName[3] = (char*)"MPI_LONG"; + BasicTypesName[4] = (char*)"MPI_UNSIGNED_CHAR"; + BasicTypesName[5] = (char*)"MPI_UNSIGNED_SHORT"; + BasicTypesName[6] = (char*)"MPI_UNSIGNED"; + BasicTypesName[7] = (char*)"MPI_UNSIGNED_LONG"; + BasicTypesName[8] = (char*)"MPI_FLOAT"; + BasicTypesName[9] = (char*)"MPI_DOUBLE"; + + BasicSizes[0] = sizeof(char); + BasicSizes[1] = sizeof(short); + BasicSizes[2] = sizeof(int); + BasicSizes[3] = sizeof(long); + BasicSizes[4] = sizeof(unsigned char); + BasicSizes[5] = sizeof(unsigned short); + BasicSizes[6] = sizeof(unsigned); + BasicSizes[7] = sizeof(unsigned long); + BasicSizes[8] = sizeof(float); + BasicSizes[9] = sizeof(double); + + ntypes = 10; +#ifdef HAVE_LONG_DOUBLE + BasicTypes[ntypes] = MPI_LONG_DOUBLE; + BasicSizes[ntypes] = sizeof(long double); + BasicTypesName[ntypes] = (char*)"MPI_LONG_DOUBLE"; + ntypes++; +#endif + BasicTypes[ntypes] = MPI_BYTE; + BasicSizes[ntypes] = sizeof(unsigned char); + BasicTypesName[ntypes] = (char*)"MPI_BYTE"; + ntypes++; + +#ifdef HAVE_LONG_LONG_INT + BasicTypes[ntypes] = MPI_LONG_LONG_INT; + BasicSizes[ntypes] = sizeof(long long); + BasicTypesName[ntypes] = "MPI_LONG_LONG_INT"; + ntypes++; +#endif + } + +int main( int argc, char **argv ) +{ +int i, errs; +int size; +MPI_Aint extent, lb, ub; + +MPI_Init( &argc, &argv ); + +/* This should be run by a single process */ + +SetupBasicTypes(); + +errs = 0; +for (i=0; i +#include "mpi.h" +#include "test.h" +#include + +int main( int argc, char **argv ) +{ + int i, n, n_goal = 2048, rc, len; + MPI_Datatype *type_array; + char msg[MPI_MAX_ERROR_STRING]; + + MPI_Init( &argc, &argv ); + MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN ); + + n = n_goal; + + type_array = (MPI_Datatype *)malloc( n * sizeof(MPI_Datatype) ); + + for (i=0; i + +int +main( int argc, char **argv) +{ + int blockcnt[2], rank; + MPI_Aint offsets[2], lb, ub, extent; + MPI_Datatype tmp_type, newtype; + + MPI_Init(&argc, &argv); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + if (rank == 0) { + blockcnt[0] = 1; + offsets[0] = 3; + MPI_Type_hindexed(1, blockcnt, offsets, MPI_BYTE, &tmp_type); + blockcnt[0] = 1; + offsets[0] = 1; + MPI_Type_hindexed(1, blockcnt, offsets, tmp_type, &newtype); + MPI_Type_commit(&newtype); + + MPI_Type_lb(newtype, &lb); + MPI_Type_extent(newtype, &extent); + MPI_Type_ub(newtype, &ub); + + /* Check that the results are correct */ +#ifdef DEBUG + printf("lb=%ld, ub=%ld, extent=%ld\n", lb, ub, extent); + printf("Should be lb=4, ub=5, extent=1\n"); +#endif + if (lb != 4 || ub != 5 || extent != 1) { + printf ("lb = %ld (should be 4), ub = %ld (should be 5) extent = %ld should be 1\n", lb, ub, extent) ; + } + else { + printf( " No Errors\n" ); + } + + MPI_Type_free(&tmp_type); + MPI_Type_free(&newtype); + + } + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/typetest.c b/teshsuite/smpi/mpich-test/pt2pt/typetest.c new file mode 100644 index 0000000000..593728cad8 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/typetest.c @@ -0,0 +1,310 @@ +/* + * Patrick Bridges * bridges@mcs.anl.gov * patrick@CS.MsState.Edu + * + * Modified by William Gropp + */ + +#include +#include +#include "test.h" +#include "mpi.h" +#include +/* CM5 users need to comment out the next include (memory.h) because + of an error in the CM5 include file (memory.h is inconsistent with + string.h) */ +/* #include */ + +struct struct1 { + double d1; + char c1[8]; +}; + + +struct struct2 { + double d1; + double d2; + char c1[8]; + char c2[8]; + double d3; + char c3[8]; + double d4; + char c4[8]; +}; + +struct struct3 { + double d1[2]; + char c1[2][8]; + struct struct1 s1[2]; +}; + +/* Structure with probable gap */ +struct struct4 { + int a1; + char c1, c2; + int a2; +}; + +int main( int argc, char **argv ) +{ + int rank, size, ret; + MPI_Status Status; + MPI_Datatype struct1_t, struct2_t, struct3_t, struct4_t, struct4a_t, + astruct1_t, carray_t; + static int block1[2] = {1, 1}; + static int block2[6] = {2, 2, 1, 1, 1, 1}; + static int block3[3] = {2, 2, 1}; + static int block4[4] = {1, 1, 1, 1}; + static int block4a[3] = {1, 2, 1}; + MPI_Aint disp1[2], disp2[6], disp3[6], disp4[4], disp4a[3]; + MPI_Datatype type1[2], type2[6], type3[3]; + MPI_Datatype type4[4] = {MPI_INT, MPI_CHAR, MPI_CHAR, MPI_INT}; + MPI_Datatype type4a[3] = {MPI_INT, MPI_CHAR, MPI_INT}; + struct struct1 dummy1; + struct struct2 dummy2; + struct struct3 dummy3; + struct struct4 dummy4; + int i, master_rank = 0, slave_rank = 1; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + for (i=1; i +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +/* + * Trying to manipulate the extent of a datatype with succesive + * calls to MPI_Type_struct. Tests that a MPI_UB buried within + * a structure is found. From kalns@canidae.cps.msu.edu (modified to + * fit test structure). + */ +int main( int argc, char **argv ) +{ + int errs = 0, toterrs, rank; + MPI_Aint extent; + int blens[2]; + MPI_Aint displ[2]; + MPI_Datatype types[2]; + MPI_Datatype type1,type2,type3; + MPI_Aint extent1, extent2, extent3; + + MPI_Init( &argc, &argv ); + + /* 2 blocks of 1 int each, stride of 4 ; expect extent to be 20 + */ + MPI_Type_vector( 2, 1, 4, MPI_INT, &type1 ); + MPI_Type_commit( &type1 ); + MPI_Type_extent( type1, &extent ); + extent1 = 5 * sizeof(int); + if (extent != extent1) { + errs++; + printf("extent(type1)=%ld\n",(long)extent); + } + + blens[0]=1; + blens[1]=1; + displ[0]=0; + displ[1]=sizeof(int)*4; + types[0]=type1; + types[1]=MPI_UB; + extent2 = displ[1]; + + /* using MPI_UB and Type_struct, monkey with the extent, making it 16 + */ + MPI_Type_struct( 2, blens, displ, types, &type2 ); + MPI_Type_commit( &type2 ); + MPI_Type_extent( type2, &extent ); + if (extent != extent2) { + errs++; + printf("extent(type2)=%ld\n",(long)extent); + } + + /* monkey with the extent again, making it 4 + * ===> MPICH gives 4 + * ===> MPIF gives 16, the old extent + */ + displ[1]=sizeof(int); + types[0]=type2; + types[1]=MPI_UB; + extent3 = extent2; + + MPI_Type_struct( 2, blens, displ, types, &type3 ); + MPI_Type_commit( &type3 ); + + MPI_Type_extent( type3, &extent ); + if (extent != extent3 && extent != 4) { + errs++; + printf("extent(type3)=%ld\n",(long)extent); + } + + MPI_Type_free( &type1 ); + MPI_Type_free( &type2 ); + MPI_Type_free( &type3 ); + + MPI_Allreduce( &errs, &toterrs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + if (rank == 0) { + if (toterrs == 0) printf( " No Errors\n" ); + else printf( "Found %d errors\n", toterrs ); + } + + + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub2.c b/teshsuite/smpi/mpich-test/pt2pt/typeub2.c new file mode 100644 index 0000000000..68951f2b94 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/typeub2.c @@ -0,0 +1,75 @@ +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char *argv[] ) +{ + MPI_Datatype dt1, dt2, dt3; + MPI_Aint ex1, ex2, ex3; + int sz1, sz2, sz3; + MPI_Aint lb,ub; + MPI_Aint disp[3]; + MPI_Datatype types[3]; + int blocklen[3]; + + MPI_Init(&argc, &argv); + + blocklen[0] = 1; blocklen[1] = 1; blocklen[2] = 1; + disp[0] = -3; disp[1] = 0; disp[2] = 6; + types[0] = MPI_LB; types[1] = MPI_INT; types[2] = MPI_UB; + + MPI_Type_struct(3,blocklen,disp, types,&dt1); + MPI_Type_commit(&dt1); + + MPI_Type_lb(dt1, &lb); MPI_Type_ub(dt1, &ub); + MPI_Type_extent(dt1,&ex1); MPI_Type_size(dt1,&sz1); + + /* Values should be lb = -3, ub = 6 extent 9; + size depends on implementation */ + if (lb != -3 || ub != 6 || ex1 != 9) { + printf("Example 3.26 type1 lb %d ub %d extent %d size %d\n", + (int)lb, (int)ub, (int)ex1, sz1); + } + else + printf("Example 3.26 type1 correct\n" ); + + MPI_Type_contiguous(2,dt1,&dt2); + MPI_Type_lb(dt2, &lb); MPI_Type_ub(dt2, &ub); + MPI_Type_extent(dt2,&ex2); MPI_Type_size(dt2,&sz2); + /* Values should be lb = -3, ub = 15, extent = 18, size + depends on implementation */ + if (lb != -3 || ub != 15 || ex2 != 18) { + printf("Example 3.26 type2 lb %d ub %d extent %d size %d\n", + (int)lb, (int)ub, (int)ex2, sz2); + } + else + printf( "Example 3.26 type2 correct\n" ); + + types[0]=dt1; types[1]=dt1; + blocklen[0]=1; blocklen[1]=1; + disp[0]=0; disp[1]=ex1; + + MPI_Type_struct(2, blocklen, disp, types, &dt3); + MPI_Type_commit(&dt3); + + MPI_Type_lb(dt3, &lb); MPI_Type_ub(dt3, &ub); + MPI_Type_extent(dt3,&ex3); MPI_Type_size(dt3,&sz3); + /* Another way to express type2 */ + if (lb != -3 || ub != 15 || ex3 != 18) { + printf("type3 lb %d ub %d extent %d size %d\n", + (int)lb, (int)ub, (int)ex3, sz2); + } + else + printf( "type3 correct\n" ); + + MPI_Type_free( &dt1 ); + MPI_Type_free( &dt2 ); + MPI_Type_free( &dt3 ); + + MPI_Finalize(); + return 0; +} + diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub2.std b/teshsuite/smpi/mpich-test/pt2pt/typeub2.std new file mode 100644 index 0000000000..63ebaed6cc --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/typeub2.std @@ -0,0 +1,5 @@ +**** Checking the type routines: MPI_UB(2) **** +Example 3.26 type1 correct +Example 3.26 type2 correct +type3 correct +**** Checking the type routines: MPI_UB(2) **** diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub3.c b/teshsuite/smpi/mpich-test/pt2pt/typeub3.c new file mode 100644 index 0000000000..8cc3ea5907 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/typeub3.c @@ -0,0 +1,104 @@ +/* This test checks that all of the MPI Type routines correctly compute + the UB and LB of a datatype from the greatest/least instance */ + +#include "mpi.h" +#include + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +int main( int argc, char *argv[] ) +{ + MPI_Datatype dt1, dt2, dt3, dt4, dt5; + MPI_Aint ex; + int sz; + MPI_Aint lb,ub; + MPI_Aint disp[3]; + MPI_Datatype types[3]; + int blocklen[3]; + int idisp[3]; + + MPI_Init(&argc, &argv); + + /* Create a datatype with explicit LB and UB */ + blocklen[0] = 1; blocklen[1] = 1; blocklen[2] = 1; + disp[0] = -3; disp[1] = 0; disp[2] = 6; + types[0] = MPI_LB; types[1] = MPI_INT; types[2] = MPI_UB; + + /* Generate samples for contiguous, hindexed, hvector, indexed, + and vector (struct and contiguous tested in typeub2) */ + + MPI_Type_struct(3,blocklen,disp, types,&dt1); + MPI_Type_commit(&dt1); + + /* This type is the same as in typeub2, and is tested there */ + + types[0]=dt1; types[1]=dt1; + blocklen[0]=1; blocklen[1]=1; + disp[0]=-4; disp[1]=7; + idisp[0]=-4; idisp[1]=7; + + MPI_Type_hindexed( 2, blocklen, disp, dt1, &dt2 ); + MPI_Type_commit( &dt2 ); + + MPI_Type_lb( dt2, &lb ); MPI_Type_ub( dt2, &ub ); + MPI_Type_extent( dt2, &ex ); MPI_Type_size( dt2, &sz ); + + if (lb != -7 || ub != 13 || ex != 20) { + printf("hindexed lb %d ub %d extent %d size %d\n", + (int)lb, (int)ub, (int)ex, sz); + } + else + printf( "hindexed ok\n" ); + + MPI_Type_indexed( 2, blocklen, idisp, dt1, &dt3 ); + MPI_Type_commit( &dt3 ); + + MPI_Type_lb( dt3, &lb ); MPI_Type_ub( dt3, &ub ); + MPI_Type_extent( dt3, &ex ); MPI_Type_size( dt3, &sz ); + + if (lb != -39 || ub != 69 || ex != 108) { + printf("indexed lb %d ub %d extent %d size %d\n", + (int)lb, (int)ub, (int)ex, sz); + } + else + printf( "indexed ok\n" ); + + MPI_Type_hvector( 2, 1, 14, dt1, &dt4 ); + MPI_Type_commit( &dt4 ); + + MPI_Type_lb( dt4, &lb ); MPI_Type_ub( dt4, &ub ); + MPI_Type_extent( dt4, &ex ); MPI_Type_size( dt4, &sz ); + + if (lb != -3 || ub != 20 || ex != 23) { + printf("hvector lb %d ub %d extent %d size %d\n", + (int)lb, (int)ub, (int)ex, sz); + } + else + printf( "hvector ok\n" ); + + MPI_Type_vector( 2, 1, 14, dt1, &dt5 ); + MPI_Type_commit( &dt5 ); + + MPI_Type_lb( dt5, &lb ); MPI_Type_ub( dt5, &ub ); + MPI_Type_extent( dt5, &ex ); MPI_Type_size( dt5, &sz ); + + + if (lb != -3 || ub != 132 || ex != 135) { + printf("vector lb %d ub %d extent %d size %d\n", + (int)lb, (int)ub, (int)ex, sz); + } + else + printf( "vector ok\n" ); + + MPI_Type_free( &dt1 ); + MPI_Type_free( &dt2 ); + MPI_Type_free( &dt3 ); + MPI_Type_free( &dt4 ); + MPI_Type_free( &dt5 ); + + MPI_Finalize(); + return 0; +} + diff --git a/teshsuite/smpi/mpich-test/pt2pt/typeub3.std b/teshsuite/smpi/mpich-test/pt2pt/typeub3.std new file mode 100644 index 0000000000..363339f476 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/typeub3.std @@ -0,0 +1,6 @@ +**** Checking the type routines: MPI_UB(3) **** +hindexed ok +indexed ok +hvector ok +vector ok +**** Checking the type routines: MPI_UB(3) **** diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitall.c b/teshsuite/smpi/mpich-test/pt2pt/waitall.c new file mode 100644 index 0000000000..3fd97ed022 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/waitall.c @@ -0,0 +1,120 @@ +/* + * This code tests waitall; in particular, the that ordering requirement + * on nonblocking communication is observed. + */ + +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +#ifdef HAVE_UNISTD_H +/* For sleep */ +#include +#endif + +#define MAX_REQ 32 + +#ifndef HAVE_SLEEP +void sleep( int secs ) +{ +#ifdef VX_WORKS + /* Also needs include ? */ + struct timespec rqtp = { 10, 0 }; + nanosleep(&rqtp, NULL); +#else + double t; + t = MPI_Wtime(); + while (MPI_Wtime() - t < (double)secs) ; +#endif +} +#endif + +int main( int argc, char **argv ) +{ + int rank, size; + int i, j, count, err = 0, toterr; + MPI_Request r[MAX_REQ]; + MPI_Status s[MAX_REQ]; + int buf[MAX_REQ][MAX_REQ]; + + MPI_Init( &argc, &argv ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + if (size < 2) { + fprintf( stderr, "This test requires at least 2 processes\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } + /* First, cause the wait all to happen AFTER the Sends */ + if (rank == 0) { + for (i=0; i +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +void Pause( double ); + +void Pause( double sec ) +{ + /*double t1 =*/ MPI_Wtime(); + smpi_sleep(sec); +//while (MPI_Wtime() - t1 < sec) ; +} + +int main( int argc, char **argv ) +{ + int size, rank, flag, i; + int *buf1, *buf2, cnt; + double t0; + MPI_Status statuses[2]; + MPI_Request req[2]; + + MPI_Init( &argc, &argv ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + if (size < 2) { + printf( "This test requires at least 2 processors\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + return 1; + } + + /* Large enough that almost certainly a rendezvous algorithm will be used + by Issend. buflimit.c will give you a more reliable value */ + cnt = 35000; + + /* Test: + process 0 process 1 + Irecv1 + Irecv2 + Sendrecv Sendrecv + pause(2 sec) pause(2 sec) + Issend2 Waitall + test(2) for 5 secs + Ssend1 + Wait(2) if necessary + + If the test for Issend2 never succeeds, then the waitall appears to be + waiting for req1 first. By using Issend, we can keep the program from + hanging. + */ + buf1 = (int *)malloc( cnt * sizeof(int) ); + buf2 = (int *)malloc( cnt * sizeof(int) ); + if (!buf1 || !buf2) { + printf( "Could not allocate buffers of size %d\n", cnt ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + return 1; + } + + for (i=0; i MPI_Wtime() && !flag) + MPI_Test( &req[0], &flag, &statuses[0] ); + MPI_Send( buf1, cnt, MPI_INT, size-1, 1, MPI_COMM_WORLD ); + if (!flag) { + printf( + "*ERROR: MPI_Waitall appears to be waiting for requests in the order\n\ +they appear in the request list\n" ); + MPI_Wait( &req[0], &statuses[0] ); + } + else { + printf( "No errors\n" ) ; + } + } + else if (rank == size - 1) { + MPI_Irecv( buf1, cnt, MPI_INT, 0, 1, MPI_COMM_WORLD, &req[0] ); + MPI_Irecv( buf2, cnt, MPI_INT, 0, 2, MPI_COMM_WORLD, &req[1] ); + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 0, 3, + MPI_BOTTOM, 0, MPI_BYTE, 0, 3, MPI_COMM_WORLD, &statuses[0] ); + Pause( 2.0 ); + MPI_Waitall( 2, req, statuses ); + } + + free( buf1 ); + free( buf2 ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitall3.c b/teshsuite/smpi/mpich-test/pt2pt/waitall3.c new file mode 100644 index 0000000000..0b76a88b95 --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/waitall3.c @@ -0,0 +1,124 @@ +/* + Test of waitall. This makes sure that the requests in a wait can occur + in any order. + + Run with 4 processes. This checks for code that listens to a specified + process. This is similar to the test in waitall2, except the incoming + messages come from processes 1 and 2. (no message comes from process 3). + */ + +#include +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +void Pause( double ); + +void Pause( double sec ) +{ + /*double t1 =*/ MPI_Wtime(); +smpi_sleep(sec); +// while (MPI_Wtime() - t1 < sec) ; +} + +int main( int argc, char **argv ) +{ + int size, rank, flag, i; + int *buf1, *buf2, cnt; + double t0; + MPI_Status statuses[2]; + MPI_Request req[2]; + + MPI_Init( &argc, &argv ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + if (size < 3) { + printf( "This test requires at least 3 processors\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + return 1; + } + + /* Large enough that almost certainly a rendezvous algorithm will be used + by Issend. buflimit.c will give you a more reliable value */ + cnt = 35000; + + /* Test: + process 0 process 1 process 2 + Irecv1 + Irecv2 + Barrier Barrier Barrier + pause(2 sec) pause(2 sec) + issend2 Waitall + test(2) for 5 secs + sendrecv (process 2) sendrecv(process0) + ssend1 + wait(2) if necessary + + If the test for Issend2 never succeeds, then the waitall appears to be + waiting for req1 first. By using Issend, we can keep the program from + hanging. + */ + buf1 = (int *)malloc( cnt * sizeof(int) ); + buf2 = (int *)malloc( cnt * sizeof(int) ); + if (!buf1 || !buf2) { + printf( "Could not allocate buffers of size %d\n", cnt ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + return 1; + } + + for (i=0; i MPI_Wtime() && !flag) + MPI_Test( &req[0], &flag, &statuses[0] ); +/* Tell process 2 to go ahead */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 2, 3, + MPI_BOTTOM, 0, MPI_BYTE, 2, 3, MPI_COMM_WORLD, &statuses[0] ); + if (!flag) { + printf( + "*ERROR: MPI_Waitall appears to be waiting for requests in the order\n\ +they appear in the request list\n" ); + /* We can wait now since process 2 should have allowed the wait + to proceed */ + MPI_Wait( &req[0], &statuses[0] ); + } + else { + printf( " No Errors\n" ) ; + } + } + else if (rank == 1) { + MPI_Irecv( buf1, cnt, MPI_INT, 2, 1, MPI_COMM_WORLD, &req[0] ); + MPI_Irecv( buf2, cnt, MPI_INT, 0, 2, MPI_COMM_WORLD, &req[1] ); + MPI_Barrier( MPI_COMM_WORLD ); + Pause( 2.0 ); + MPI_Waitall( 2, req, statuses ); + } + else if (rank == 2) { + MPI_Barrier( MPI_COMM_WORLD ); + /* Wait for process 0 to tell us to go ahead */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 0, 3, + MPI_BOTTOM, 0, MPI_BYTE, 0, 3, MPI_COMM_WORLD, &statuses[0] ); + MPI_Send( buf1, cnt, MPI_INT, 1, 1, MPI_COMM_WORLD ); + } + else { + MPI_Barrier( MPI_COMM_WORLD ); + } + + free( buf1 ); + free( buf2 ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitall4.c b/teshsuite/smpi/mpich-test/pt2pt/waitall4.c new file mode 100644 index 0000000000..bb4dc1d05a --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/waitall4.c @@ -0,0 +1,127 @@ +/* + Test of waitall. This makes sure that the requests in a wait can occur + in any order. + + Run with 4 processes. This checks for code that listens to a specified + process. This is similar to the test in waitall3, except that the + wait is on sends instead of receives. Messages are sent by process 2 to + processes 0 and 1. Process 3 is uninvolved. + */ + +#include +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +void Pause( double ); + +void Pause( double sec ) +{ + /*double t1 =*/ MPI_Wtime(); + smpi_sleep(sec); +// while (MPI_Wtime() - t1 < sec) ; +} + +int main( int argc, char **argv ) +{ + int size, rank, flag, i; + int *buf1, *buf2, cnt; + double t0; + MPI_Status statuses[2]; + MPI_Request req[2]; + + MPI_Init( &argc, &argv ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + + if (size < 3) { + printf( "This test requires at least 3 processors\n" ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + return 1; + } + + /* Large enough that almost certainly a rendezvous algorithm will be used + by Issend. buflimit.c will give you a more reliable value */ + cnt = 35000; + + /* Test: + process 0 process 1 process 2 + Issend1 + Issend0 + Barrier Barrier Barrier + pause(2 sec) pause(2 sec) pause(1 sec) + irecv2 waitall + test(2) for 5 secs + sendrecv (process 1) sendrecv(process0) + recv2 + wait(2) if necessary + + If the test for Irecv2 never succeeds, then the waitall appears to be + waiting for req1 first. By using Issend, we can keep the program from + hanging. + */ + buf1 = (int *)malloc( cnt * sizeof(int) ); + buf2 = (int *)malloc( cnt * sizeof(int) ); + if (!buf1 || !buf2) { + printf( "Could not allocate buffers of size %d\n", cnt ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + return 1; + } + + for (i=0; i MPI_Wtime() && !flag) + MPI_Test( &req[0], &flag, &statuses[0] ); + /* printf( "Test succeeded at %f with flag %d\n", MPI_Wtime()-t0, flag ); */ + /* Tell process 2 to go ahead */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 1, 3, + MPI_BOTTOM, 0, MPI_BYTE, 1, 3, MPI_COMM_WORLD, &statuses[0] ); + if (!flag) { + printf( + "*ERROR: MPI_Waitall appears to be waiting for requests in the order\n\ +they appear in the request list\n" ); + /* We can wait now since process 2 should have allowed the wait + to proceed */ + MPI_Wait( &req[0], &statuses[0] ); + } + else { + printf( " No Errors\n" ) ; + } + } + else if (rank == 2) { + MPI_Isend( buf1, cnt, MPI_INT, 1, 1, MPI_COMM_WORLD, &req[0] ); + MPI_Isend( buf2, cnt, MPI_INT, 0, 2, MPI_COMM_WORLD, &req[1] ); + MPI_Barrier( MPI_COMM_WORLD ); + Pause( 1.0 ); + MPI_Waitall( 2, req, statuses ); + } + else if (rank == 1) { + MPI_Status status; + MPI_Barrier( MPI_COMM_WORLD ); + /* Wait for process 0 to tell us to go ahead */ + MPI_Sendrecv( MPI_BOTTOM, 0, MPI_BYTE, 0, 3, + MPI_BOTTOM, 0, MPI_BYTE, 0, 3, MPI_COMM_WORLD, &statuses[0] ); + MPI_Recv( buf1, cnt, MPI_INT, 2, 1, MPI_COMM_WORLD, &status ); + } + else { + MPI_Barrier( MPI_COMM_WORLD ); + } + + free( buf1 ); + free( buf2 ); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitany.c b/teshsuite/smpi/mpich-test/pt2pt/waitany.c new file mode 100644 index 0000000000..47adda64bd --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/waitany.c @@ -0,0 +1,104 @@ +/* + * This code tests waitany; in one version of MPICH, it uncovered some + * problems with the ADI Test calls. + */ +/* #define i_ntotin 256 */ /* ok */ +/* #define i_ntotin 257 */ /* fails */ +#define i_ntotin 25600 + +#include +#include "mpi.h" + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +#define DAR 32 /* ``Data: ARray'' */ + + +int main( int argc, char **argv ) + { + int locId ; + int data [i_ntotin] ; + + MPI_Init(&argc, &argv) ; + MPI_Comm_rank(MPI_COMM_WORLD, &locId) ; + + if(locId == 0) { + + /* The server... */ + + MPI_Status status[2] ; + MPI_Request events [2] ; + + int eventId ; + + int dstId = 1 ; + + int i ; + + for(i = 0 ; i < i_ntotin ; i++) + data [i] = i + 1 ; + + events [0] = MPI_REQUEST_NULL ; + events [1] = MPI_REQUEST_NULL ; + + MPI_Isend(data, i_ntotin, MPI_INT, dstId, DAR, + MPI_COMM_WORLD, events + 1) ; + /* enable send of data */ + + /*_begin_trace_code */ + /* printf("locId = %d: MPI_Isend(%x, %d, %x, %d, %d, %x, %x)\n", + locId, data, i_ntotin, MPI_INT, dstId, DAR, MPI_COMM_WORLD, events [1]); + */ + /*_end_trace_code */ + + /*_begin_trace_code */ + /* printf("locId = %d: MPI_Waitany(%d, [%x, %x], %x %x)...", + locId, 2, events [0], events [1], &eventId, &status) ; */ + /*_end_trace_code */ + + MPI_Waitany(2, events, &eventId, status) ; + + /*_begin_trace_code */ + printf("done. eventId = %d\n", eventId) ; + /*_end_trace_code */ + } + + if(locId == 1) { + + /* The Client... */ + + MPI_Status status ; + + int srcId = MPI_ANY_SOURCE ; + + /*_begin_trace_code */ + /* + printf("locId = %d: MPI_Recv(%x, %d, %x, %d, %d, %x, %x)...", + locId, data, i_ntotin, MPI_INT, srcId, DAR, MPI_COMM_WORLD, &status) ; + */ + /*_end_trace_code */ + + MPI_Recv(data, i_ntotin, MPI_INT, srcId, DAR, + MPI_COMM_WORLD, &status) ; + + /*_begin_trace_code */ + /*printf("done.\n") ;*/ + /*_end_trace_code */ + + /* + printf("locId = %d: data [0] = %d, data [%d] = %d\n", + locId, data [0], i_ntotin - 1, data [i_ntotin - 1]) ; + */ + } + + MPI_Barrier( MPI_COMM_WORLD ); + if (locId == 0) + printf( "Test complete\n" ); + MPI_Finalize() ; + return 0; +} + + + diff --git a/teshsuite/smpi/mpich-test/pt2pt/waitany.std b/teshsuite/smpi/mpich-test/pt2pt/waitany.std new file mode 100644 index 0000000000..d8092c19ac --- /dev/null +++ b/teshsuite/smpi/mpich-test/pt2pt/waitany.std @@ -0,0 +1,2 @@ +done. eventId = 1 +Test complete diff --git a/teshsuite/smpi/mpich-test/runbase b/teshsuite/smpi/mpich-test/runbase new file mode 100644 index 0000000000..ae91ba447d --- /dev/null +++ b/teshsuite/smpi/mpich-test/runbase @@ -0,0 +1,250 @@ +#! /bin/sh +# +# This file contains support shell routines and steps common to all +# runtests scripts. +# +# Find MPIRUN +# +# Some people don't include "." in their path (! in case an ls trojan horse, +# I guess - if someone does that to you, you have bigger problems). This +# code tests to see if you have a path to mpirun; if not, it tries ./mpirun. +# +# One particular problem is having multiple mpiruns in the path. An +# absolute path for mpirun will fix many problems +FindMPIRUN () { + if [ -z "$MPICH_USE_LIB_MPIRUN" -a ! -x "$mpirun" ] ; then + IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" + for dir in $PATH ; do + if [ -x $dir/mpirun ] ; then + if [ -n "${MPICH_VERSION}" ] ; then + # Test that we've found the correct mpirun + if strings $dir/mpirun | grep "MPIRUN for MPICH" > /dev/null ; then + : + else + # echo "$dir/mpirun isn't for MPICH" + continue + fi + fi + mpirun="mpirun" + break + fi + done + IFS="$saveifs" + fi + if [ -z "$mpirun" -a -x "./mpirun" ] ; then + mpirun=./mpirun + fi + # + if [ -z "$mpirun" ] ; then + echo "No mpirun in path. Testing can not proceed." + exit 1 + fi +} + +# MakeExe program-name +MakeExe() { + if [ -s $STOPFILE ] ; then + echo "Found stopfile $STOPFILE; exiting" + exit 0 + fi + if [ ! -x $1 ] ; then + $MAKE $1 + if [ ! -x $1 ] ; then + if [ "$MPITEST_CONTINUE" = "always" ] ; then + echo "Could not build executable $1; skipping this test" + else + echo "Could not build executable $1; aborting tests" + exit 1 + fi + fi + fi +} + +# CleanExe program-name +CleanExe() { + if [ $makeeach = 1 ] ; then + /bin/rm -f $1 $1.o + fi +} + +# Output marker +OutTime() { + if [ $quiet = 0 ] ; then + if [ -z "$hostname" ] ; then + hostname=`hostname` + fi + d=`date` + echo "$hostname : $d" + fi +} + +# Do an "on the fly" check for problems. +# Checkout testname difffile +# difffile may be empty, in which case stdout is used. +# If $writesummaryfile is yes, output the results to $summaryfile. +# Use XML-style output for the summary file: +# +# +# directory +# +# text from different +# +# +# +# We'd also like to support +# $np +# but we don't have that information when this routine is called +CheckOutput() { + bfile=$1 + difffile=$2 + fileok="no" + if [ ! -s ${bfile}.out ] ; then + echo "No output file ${bfile}.out!" + else + cmpfile="" + # Handle Fortran systems that generate stop statements + rm -f ${bfile}.tout + grep -v 'FORTRAN STOP' ${bfile}.out > ${bfile}.tout + for stdfile in $srcdir/${bfile}.std $srcdir/${bfile}.std2 \ + $srcdir/std/${bfile}.std ${bfile}.stdo ; do + if [ -z "$cmpfile" -a -s "$stdfile" ] ; then + cmpfile=$stdfile + fi + if test -s $stdfile && diff -b ${bfile}.tout $stdfile > /dev/null ; then + fileok=yes + break; + fi + done + if [ $fileok = "no" ] ; then + if [ -n "$difffile" ] ; then + if [ -n "$cmpfile" ] ; then + echo "Differences in ${bfile}.out" >> ${difffile} + diff -b ${bfile}.tout $cmpfile >> ${difffile} + else + echo "Cannot find a file to compare against for test ${bfile}.out" + fi + else + if [ -n "$cmpfile" ] ; then + echo "Differences in ${bfile}.out" + diff -b ${bfile}.tout $cmpfile + else + echo "Cannot find a file to compare against for test ${bfile}.out" + fi + fi + nodiff=0 + fi + if [ "$writesummaryfile" = "yes" ] ; then + if [ $fileok = "yes" ] ; then + passed=pass + else + passed=fail + fi + mydir=`pwd` + cat >>$summaryfile < +$bfile +$mydir +$passed +EOF + if [ -n "$np" ] ; then + echo "$np" >> $summaryfile + fi + if [ $fileok = "no" ] ; then + echo "" >> $summaryfile + if [ ! -s ${bfile}.out ] ; then + echo "No output file" >>$summaryfile + else + if [ -z "$cmpfile" ] ; then + cmpfile="/dev/null" + fi + diff -b ${bfile}.tout $cmpfile | \ + sed -e 's/&/-AMP-amp;/g' -e 's//-AMP-gt;/g' | \ + sed -e 's/-AMP-/\&/g' >> $summaryfile + fi + echo "" >> $summaryfile + fi + if [ -s "$bfile.tbk" ] ; then + echo "" >> $summaryfile + echo "$bfile.tbk" >>$summaryfile + echo "" >> $summaryfile + fi + echo "" >> $summaryfile + fi + rm -f ${bfile}.tout + fi +} + +# Runtest pgm-name np marker-test args outfiles +# filename.tbk is a traceback file. Use a tool like pardump $1 > $1.tbk +# to get such files +RunTest() { + OutTime + pgm=$1 + np=$2 + testfiles="$testfiles $pgm.out" + /bin/rm -f $pgm.out $pgm.tbk + MakeExe $1 + if [ ! -x $pgm ] ; then + # If no executable, put the make data into $1.out + $MAKE $pgm > $pgm.out 2>&1 + else + mname=$3 + if [ -z "$mname" ] ; then mname="*** $1 ***" ; fi + #echo "$mname" >> $pgm.out + echo "$mname" + mvarg="" + if [ -n "$5" ] ; then rm -f $5 ; + if [ -n "$MPIRUNMVBACK" ] ; then mvarg="$MPIRUNMVBACK \"$5\"" ; fi + fi + # The eval is necessary to ensure that the mvarg value is properly + # tokenized. The ./$1 ensures that the program will be found, + # even if . is not in the PATH. + + eval $mpirun $args -np $np $mvarg ./$pgm $4 > $pgm.out 2>&1 + if [ -n "$5" ] ; then + for file in $5 ; do + if [ -s $file ] ; then + cat $file >> $pgm.out ; rm -f $file + fi + done + fi + #echo "$mname" >> $pgm.out + if [ ! -s $srcdir/$pgm.std -a ! -s $pgm.stdo ] ; then + # We don't need a special file if the output is just "No Errors" + cat >>$pgm.stdo < +#include "test.h" + +#define NUM_DIMS 2 + +int main( int argc, char **argv ) +{ + int rank, size, i; + int errors=0; + int dims[NUM_DIMS]; + int periods[NUM_DIMS]; + int coords[NUM_DIMS]; + int new_coords[NUM_DIMS]; + int reorder = 1; + MPI_Comm comm_temp, comm_cart, new_comm; + int topo_status; + int ndims; + int new_rank; + int remain_dims[NUM_DIMS]; + int newnewrank; + + MPI_Init( &argc, &argv ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* Clear dims array and get dims for topology */ + for(i=0;i +#include "test.h" + +#define NUM_DIMS 2 + +int verbose = 0; + +int main( int argc, char **argv ) +{ + int rank, size, i; + int dims[NUM_DIMS]; + int periods[NUM_DIMS]; + int new_coords[NUM_DIMS]; + int new_new_coords[NUM_DIMS]; + int reorder = 1; + int left, right, top, bottom; + MPI_Comm comm_cart; + + MPI_Init( &argc, &argv ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* Clear dims array and get dims for topology */ + for(i=0;i +/* stdlib.h Needed for malloc declaration */ +#include +#include "test.h" + +#define NUM_DIMS 2 + +int main( int argc, char **argv ) +{ + int rank, size, i; + int errors=0; + int dims[NUM_DIMS]; + int periods[NUM_DIMS]; + int *rbuf, *sbuf; + int new_rank; + + MPI_Init( &argc, &argv ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* Clear dims array and get dims for topology */ + for(i=0;i +#include "test.h" + +/* This test makes sure that the ordering if reorder is FALSE is + as specified in 6.2, virtual topologies + + At the same time, it duplicates the tests in cart.c, but + with reorder = 0. +*/ + +#define NUM_DIMS 2 + +int main( int argc, char **argv ) +{ + int rank, size, i; + int errors=0; + int dims[NUM_DIMS]; + int periods[NUM_DIMS]; + int coords[NUM_DIMS]; + int new_coords[NUM_DIMS]; + int reorder = 0; + MPI_Comm comm_temp, comm_cart, new_comm; + int topo_status; + int ndims; + int new_rank; + int remain_dims[NUM_DIMS]; + int newnewrank; + + MPI_Init( &argc, &argv ); + + MPI_Comm_rank( MPI_COMM_WORLD, &rank ); + MPI_Comm_size( MPI_COMM_WORLD, &size ); + + /* Clear dims array and get dims for topology */ + for(i=0;i + +int main( int argc, char *argv[] ) +{ + int dims[10]; + int i, j, ndims, totnodes, err, errcnt = 0; + + MPI_Init( &argc, &argv ); + + MPI_Errhandler_set( MPI_COMM_WORLD, MPI_ERRORS_RETURN ); + + /* Try for error checks */ + dims[0] = 2; + dims[1] = 2; + dims[2] = 0; + err = MPI_Dims_create( 26, 3, dims ); + if (err == MPI_SUCCESS) { + printf( "The product of the specified dims does not divide the nnodes and MPI_Dims_create did not return an error\n" ); + for (i=0; i<3; i++) { + printf( "dims[%d] = %d\n", i, dims[i] ); + } + errcnt++; + } + + /* Check for a few reasonable decompositions */ + dims[0] = dims[1] = 0; + err = MPI_Dims_create( 16, 2, dims ); + if (err) { + char msg[MPI_MAX_ERROR_STRING]; + int result_len; + MPI_Error_string( err, msg, &result_len ); + printf( "Unexpected error return from dims_create (16,2) %s\n", msg ); + errcnt++; + } + else { + if (dims[0] * dims[1] != 16) { + printf( "Returned dimensions do not match request\n" ); + errcnt++; + } +#ifdef MPICH_NAME + if (dims[0] != 4) { + errcnt++; + printf( "Expected 4 x 4, got %d x %d\n", dims[0],dims[1] ); + } +#endif + } + + dims[0] = dims[1] = 0; + /* 60 = 2 * 2 * 3 * 5 */ + err = MPI_Dims_create( 60, 2, dims ); + if (err) { + char msg[MPI_MAX_ERROR_STRING]; + int result_len; + MPI_Error_string( err, msg, &result_len ); + printf( "Unexpected error return from dims_create (16,2) %s\n", msg ); + errcnt++; + } + else { + if (dims[0] * dims[1] != 60) { + printf( "Returned dimensions do not match request (%d)\n", + dims[0] * dims[1] ); + errcnt++; + } +#ifdef MPICH_NAME + if (dims[0] == 1 || dims[1] == 1) { + errcnt++; + printf( "Expected rectangular decomp, got %d x %d\n", + dims[0],dims[1] ); + } +#endif + } + + /* Test a range of values */ + for (ndims=1; ndims<=4; ndims++) { + for (i=2; i<64; i++) { + for (j=0; j 1) { + printf( "Dims = " ); + for (j=0; j +/* stdlib.h Needed for malloc declaration */ +#include +#include "test.h" + +void NumberEdges ( int **, int **, int, int, int ); +void PrintGraph ( int, int *, int * ); + +int main( int argc, char **argv ) +{ + MPI_Comm comm, new_comm; + int reorder; + int nbrarray[3], baseindex; + int size, i, j, nnodes, nedges, q_nnodes, q_nedges, q_nnbrs, newrank; + int *index, *edges, *q_index, *q_edges, *rankbuf; + int worldrank, err = 0, toterr; + + MPI_Init( &argc, &argv ); + + MPI_Comm_rank( MPI_COMM_WORLD, &worldrank ); + +/* Generate the graph for a binary tree. + + Note that EVERY process must have the SAME data + */ + comm = MPI_COMM_WORLD; + MPI_Comm_size( comm, &size ); + + index = (int *)malloc( (size + 1) * sizeof(int) ); + edges = (int *)malloc( (size + 1) * 3 * sizeof(int) ); + reorder = 0; + for (i=0; i < size; i++) { + index[i] = 0; + } + NumberEdges( &index, &edges, -1, 0, size - 1 ); + nedges= index[0]; + for (i=1; i 0) ? index[i-1] : 0; + for (j=0; j= size) { + err++; + printf( "Rank %d missing in graph_map\n", i ); + } + } + + MPI_Allreduce( &err, &toterr, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + if (worldrank == 0) { + if (toterr == 0) + printf( "No errors in MPI Graph routines\n" ); + else + printf( "Found %d errors in MPI Graph routines\n", toterr ); + } + + MPI_Comm_free( &new_comm ); + free( index ); + free( edges ); + free( q_index ); + free( q_edges ); + free( rankbuf ); + MPI_Finalize( ); + return 0; +} + +/* + * Routine to print out a graph for debugging + */ +void PrintGraph( nnodes, index, edges ) +int nnodes, *index, *edges; +{ + int i, lastidx, j; + lastidx=0; + printf( "rank\tindex\tedges\n" ); + for (i=0; i= 0) { +#ifdef DEBUG + printf( "Adding parent %d to %d\n", parent, first ); +#endif + *index = *index + 1; + *edges++ = parent; + } + if (first >= last) { + /* leaf */ + index++; + if (parent >= 0) { + *Index = index; + *Edges = edges; + } + return; + } + +/* Internal node. Always at least a left child */ +#ifdef DEBUG + printf( "Adding left child %d to %d\n", first + 1, first ); +#endif + *index = *index + 1; + *edges++ = first + 1; + +/* Try to add a right child */ + right = (last - first)/2; + right = first + right + 1; + if (right == first + 1) + right++; + if (right <= last) { + /* right child */ +#ifdef DEBUG + printf( "Adding rightchild %d to %d\n", right, first ); +#endif + *index = *index + 1; + *edges++ = right; + } + index++; + if (first + 1 <= last && right - 1 > first) { + NumberEdges( &index, &edges, first, first + 1, + (right <= last) ? right - 1: last ); + } + if (right <= last) { + NumberEdges( &index, &edges, first, right, last ); + } + if (parent >= 0) { + *Index = index; + *Edges = edges; + } +} diff --git a/teshsuite/smpi/mpich-test/topol/graphtest.std b/teshsuite/smpi/mpich-test/topol/graphtest.std new file mode 100644 index 0000000000..0182e23abe --- /dev/null +++ b/teshsuite/smpi/mpich-test/topol/graphtest.std @@ -0,0 +1,5 @@ +**** Testing MPI_Graph_create etc **** +Checking graph_get +Checking graph_map +No errors in MPI Graph routines +**** Testing MPI_Graph_create etc **** diff --git a/teshsuite/smpi/mpich-test/topol/test.c b/teshsuite/smpi/mpich-test/topol/test.c new file mode 100644 index 0000000000..9c7b2997bc --- /dev/null +++ b/teshsuite/smpi/mpich-test/topol/test.c @@ -0,0 +1,102 @@ +/* Procedures for recording and printing test results */ + +#include +#include +#include "test.h" +#include "mpi.h" + +static int tests_passed = 0; +static int tests_failed = 0; +static char failed_tests[255][81]; +static char suite_name[255]; +FILE *fileout = NULL; + +void Test_Init(suite, rank) +char *suite; +int rank; +{ + char filename[512]; + + sprintf(filename, "%s-%d.out", suite, rank); + strncpy(suite_name, suite, 255); + fileout = fopen(filename, "w"); + if (!fileout) { + fprintf( stderr, "Could not open %s on node %d\n", filename, rank ); + MPI_Abort( MPI_COMM_WORLD, 1 ); + } +} + +void Test_Message(mess) +char *mess; +{ + fprintf(fileout, "[%s]: %s\n", suite_name, mess); + fflush(fileout); +} + +void Test_Failed(test) +char *test; +{ + fprintf(fileout, "[%s]: *** Test '%s' Failed! ***\n", suite_name, test); + strncpy(failed_tests[tests_failed], test, 81); + fflush(fileout); + tests_failed++; +} + +void Test_Passed(test) +char *test; +{ +#ifdef VERBOSE + fprintf(fileout, "[%s]: Test '%s' Passed.\n", suite_name, test); + fflush(fileout); +#endif + tests_passed++; +} + +int Summarize_Test_Results() +{ +#ifdef VERBOSE + fprintf(fileout, "For test suite '%s':\n", suite_name); +#else + if (tests_failed > 0) +#endif + { + fprintf(fileout, "Of %d attempted tests, %d passed, %d failed.\n", + tests_passed + tests_failed, tests_passed, tests_failed); + } + if (tests_failed > 0) { + int i; + + fprintf(fileout, "*** Tests Failed:\n"); + for (i = 0; i < tests_failed; i++) + fprintf(fileout, "*** %s\n", failed_tests[i]); + } + return tests_failed; +} + +void Test_Finalize() +{ + fflush(fileout); + fclose(fileout); +} + +#include "mpi.h" +/* Wait for every process to pass through this point. This test is used + to make sure that all processes complete, and that a test "passes" because + it executed, not because it some process failed. + */ +void Test_Waitforall( ) +{ +int m, one, myrank, n; + +MPI_Comm_rank( MPI_COMM_WORLD, &myrank ); +MPI_Comm_size( MPI_COMM_WORLD, &n ); +one = 1; +MPI_Allreduce( &one, &m, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD ); + +if (m != n) { + printf( "[%d] Expected %d processes to wait at end, got %d\n", myrank, + n, m ); + } +if (myrank == 0) + printf( " No Errors\n" ); +} diff --git a/teshsuite/smpi/mpich-test/topol/test.h b/teshsuite/smpi/mpich-test/topol/test.h new file mode 100644 index 0000000000..b79cd2c6ac --- /dev/null +++ b/teshsuite/smpi/mpich-test/topol/test.h @@ -0,0 +1,24 @@ +/* Header for testing procedures */ + +#ifndef _INCLUDED_TEST_H_ +#define _INCLUDED_TEST_H_ + +#if defined(NEEDS_STDLIB_PROTOTYPES) +#include "protofix.h" +#endif + +void Test_Init (char *, int); +#ifdef USE_STDARG +void Test_Printf (char *, ...); +#else +/* No prototype */ +void Test_Printf(); +#endif +void Test_Message (char *); +void Test_Failed (char *); +void Test_Passed (char *); +int Summarize_Test_Results (void); +void Test_Finalize (void); +void Test_Waitforall (void); + +#endif diff --git a/teshsuite/smpi/mpich-test/topol/twod.f b/teshsuite/smpi/mpich-test/topol/twod.f new file mode 100644 index 0000000000..6d791b31d5 --- /dev/null +++ b/teshsuite/smpi/mpich-test/topol/twod.f @@ -0,0 +1,291 @@ +c********************************************************************** +c twod.f - a solution to the Poisson problem by using Jacobi +c interation on a 2-d decomposition +c +c .... the rest of this is from pi3.f to show the style ... +c +c Each node: +c 1) receives the number of rectangles used in the approximation. +c 2) calculates the areas of it's rectangles. +c 3) Synchronizes for a global summation. +c Node 0 prints the result. +c +c Variables: +c +c pi the calculated result +c n number of points of integration. +c x midpoint of each rectangle's interval +c f function to integrate +c sum,pi area of rectangles +c tmp temporary scratch space for global summation +c i do loop index +c +c This code is included (without the prints) because one version of +c MPICH SEGV'ed (probably because of errors in handling send/recv of +c MPI_PROC_NULL source/destination). +c +c**************************************************************************** + program main + include "mpif.h" + integer maxn + parameter (maxn = 128) + double precision a(maxn,maxn), b(maxn,maxn), f(maxn,maxn) + integer nx, ny + integer myid, numprocs, it, rc, comm2d, ierr, stride + integer nbrleft, nbrright, nbrtop, nbrbottom + integer sx, ex, sy, ey + integer dims(2) + logical periods(2) + double precision diff2d, diffnorm, dwork + double precision t1, t2 + external diff2d + data periods/2*.false./ + + call MPI_INIT( ierr ) + call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) + call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) +c print *, "Process ", myid, " of ", numprocs, " is alive" + if (myid .eq. 0) then +c +c Get the size of the problem +c +c print *, 'Enter nx' +c read *, nx + nx = 10 + endif +c print *, 'About to do bcast on ', myid + call MPI_BCAST(nx,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr) + ny = nx +c +c Get a new communicator for a decomposition of the domain. Let MPI +c find a "good" decomposition +c + dims(1) = 0 + dims(2) = 0 + call MPI_DIMS_CREATE( numprocs, 2, dims, ierr ) + call MPI_CART_CREATE( MPI_COMM_WORLD, 2, dims, periods, .true., + * comm2d, ierr ) +c +c Get my position in this communicator +c + call MPI_COMM_RANK( comm2d, myid, ierr ) +c print *, "Process ", myid, " of ", numprocs, " is alive" +c +c My neighbors are now +/- 1 with my rank. Handle the case of the +c boundaries by using MPI_PROCNULL. + call fnd2dnbrs( comm2d, nbrleft, nbrright, nbrtop, nbrbottom ) +c print *, "Process ", myid, ":", +c * nbrleft, nbrright, nbrtop, nbrbottom +c +c Compute the decomposition +c + call fnd2ddecomp( comm2d, nx, sx, ex, sy, ey ) +c print *, "Process ", myid, ":", sx, ex, sy, ey +c +c Create a new, "strided" datatype for the exchange in the "non-contiguous" +c direction +c + call mpi_Type_vector( ey-sy+1, 1, ex-sx+3, + $ MPI_DOUBLE_PRECISION, stride, ierr ) + call mpi_Type_commit( stride, ierr ) +c +c +c Initialize the right-hand-side (f) and the initial solution guess (a) +c + call twodinit( a, b, f, nx, sx, ex, sy, ey ) +c +c Actually do the computation. Note the use of a collective operation to +c check for convergence, and a do-loop to bound the number of iterations. +c + call MPI_BARRIER( MPI_COMM_WORLD, ierr ) + t1 = MPI_WTIME() + do 10 it=1, 100 + call exchng2( a, b, sx, ex, sy, ey, comm2d, stride, + $ nbrleft, nbrright, nbrtop, nbrbottom ) + call sweep2d( b, f, nx, sx, ex, sy, ey, a ) + call exchng2( b, a, sx, ex, sy, ey, comm2d, stride, + $ nbrleft, nbrright, nbrtop, nbrbottom ) + call sweep2d( a, f, nx, sx, ex, sy, ey, b ) + dwork = diff2d( a, b, nx, sx, ex, sy, ey ) + call MPI_Allreduce( dwork, diffnorm, 1, MPI_DOUBLE_PRECISION, + $ MPI_SUM, comm2d, ierr ) + if (diffnorm .lt. 1.0e-5) goto 20 +c if (myid .eq. 0) print *, 2*it, ' Difference is ', diffnorm +10 continue + if (myid .eq. 0) print *, 'Failed to converge' +20 continue + t2 = MPI_WTIME() +c if (myid .eq. 0) then +c print *, 'Converged after ', 2*it, ' Iterations in ', t2 - t1, +c $ ' secs ' +c endif +c +c + call MPI_Type_free( stride, ierr ) + call MPI_Comm_free( comm2d, ierr ) + if (myid .eq. 0) then + print *, ' No Errors' + endif + call MPI_FINALIZE(rc) + end +c +c Perform a Jacobi sweep for a 2-d decomposition +c + subroutine sweep2d( a, f, n, sx, ex, sy, ey, b ) + integer n, sx, ex, sy, ey + double precision a(sx-1:ex+1, sy-1:ey+1), f(sx-1:ex+1, sy-1:ey+1), + + b(sx-1:ex+1, sy-1:ey+1) +c + integer i, j + double precision h +c + h = 1.0d0 / dble(n+1) + do 10 i=sx, ex + do 10 j=sy, ey + b(i,j) = 0.25 * (a(i-1,j)+a(i,j+1)+a(i,j-1)+a(i+1,j)) - + + h * h * f(i,j) + 10 continue + return + end + + subroutine exchng2( a, b, sx, ex, sy, ey, + $ comm2d, stride, + $ nbrleft, nbrright, nbrtop, nbrbottom ) + include "mpif.h" + integer sx, ex, sy, ey, stride + double precision a(sx-1:ex+1, sy-1:ey+1), + $ b(sx-1:ex+1, sy-1:ey+1) + integer nbrleft, nbrright, nbrtop, nbrbottom, comm2d + integer status(MPI_STATUS_SIZE), ierr, nx +c + nx = ex - sx + 1 +c These are just like the 1-d versions, except for less data + call MPI_SENDRECV( b(ex,sy), nx, MPI_DOUBLE_PRECISION, + $ nbrtop, 0, + $ a(sx-1,sy), nx, MPI_DOUBLE_PRECISION, + $ nbrbottom, 0, comm2d, status, ierr ) + call MPI_SENDRECV( b(sx,sy), nx, MPI_DOUBLE_PRECISION, + $ nbrbottom, 1, + $ a(ex+1,sy), nx, MPI_DOUBLE_PRECISION, + $ nbrtop, 1, comm2d, status, ierr ) +c +c This uses the "strided" datatype + call MPI_SENDRECV( b(sx,ey), 1, stride, nbrright, 0, + $ a(sx,sy-1), 1, stride, nbrleft, 0, + $ comm2d, status, ierr ) + call MPI_SENDRECV( b(sx,sy), 1, stride, nbrleft, 1, + $ a(sx,ey+1), 1, stride, nbrright, 1, + $ comm2d, status, ierr ) + return + end + +c +c The rest of the 2-d program +c + double precision function diff2d( a, b, nx, sx, ex, sy, ey ) + integer nx, sx, ex, sy, ey + double precision a(sx-1:ex+1, sy-1:ey+1), b(sx-1:ex+1, sy-1:ey+1) +c + double precision sum + integer i, j +c + sum = 0.0d0 + do 10 j=sy,ey + do 10 i=sx,ex + sum = sum + (a(i,j) - b(i,j)) ** 2 + 10 continue +c + diff2d = sum + return + end + subroutine twodinit( a, b, f, nx, sx, ex, sy, ey ) + integer nx, sx, ex, sy, ey + double precision a(sx-1:ex+1, sy-1:ey+1), b(sx-1:ex+1, sy-1:ey+1), + & f(sx-1:ex+1, sy-1:ey+1) +c + integer i, j +c + do 10 j=sy-1,ey+1 + do 10 i=sx-1,ex+1 + a(i,j) = 0.0d0 + b(i,j) = 0.0d0 + f(i,j) = 0.0d0 + 10 continue +c +c Handle boundary conditions +c + if (sx .eq. 1) then + do 20 j=sy,ey + a(0,j) = 1.0d0 + b(0,j) = 1.0d0 + 20 continue + endif + if (ex .eq. nx) then + do 21 j=sy,ey + a(nx+1,j) = 0.0d0 + b(nx+1,j) = 0.0d0 + 21 continue + endif + if (sy .eq. 1) then + do 30 i=sx,ex + a(i,0) = 1.0d0 + b(i,0) = 1.0d0 + 30 continue + endif +c + return + end + +c +c This file contains a routine for producing a decomposition of a 1-d array +c when given a number of processors. It may be used in "direct" product +c decomposition. The values returned assume a "global" domain in [1:n] +c + subroutine MPE_DECOMP1D( n, numprocs, myid, s, e ) + integer n, numprocs, myid, s, e + integer nlocal + integer deficit +c + nlocal = n / numprocs + s = myid * nlocal + 1 + deficit = mod(n,numprocs) + s = s + min(myid,deficit) + if (myid .lt. deficit) then + nlocal = nlocal + 1 + endif + e = s + nlocal - 1 + if (e .gt. n .or. myid .eq. numprocs-1) e = n + return + end +c +c This routine show how to determine the neighbors in a 2-d decomposition of +c the domain. This assumes that MPI_Cart_create has already been called +c + subroutine fnd2dnbrs( comm2d, + $ nbrleft, nbrright, nbrtop, nbrbottom ) + integer comm2d, nbrleft, nbrright, nbrtop, nbrbottom +c + integer ierr +c + call MPI_Cart_shift( comm2d, 0, 1, nbrleft, nbrright, ierr ) + call MPI_Cart_shift( comm2d, 1, 1, nbrbottom, nbrtop, ierr ) +c + return + end +c +c Note: THIS IS A TEST PROGRAM. THE ACTUAL VALUES MOVED ARE NOT +c CORRECT FOR A POISSON SOLVER. +c + subroutine fnd2ddecomp( comm2d, n, sx, ex, sy, ey ) + integer comm2d + integer n, sx, ex, sy, ey + integer dims(2), coords(2), ierr + logical periods(2) +c + call MPI_Cart_get( comm2d, 2, dims, periods, coords, ierr ) + + call MPE_DECOMP1D( n, dims(1), coords(1), sx, ex ) + call MPE_DECOMP1D( n, dims(2), coords(2), sy, ey ) +c + return + end diff --git a/teshsuite/smpi/mpich-test/topol/twod2.f b/teshsuite/smpi/mpich-test/topol/twod2.f new file mode 100644 index 0000000000..eb5ea7565b --- /dev/null +++ b/teshsuite/smpi/mpich-test/topol/twod2.f @@ -0,0 +1,289 @@ +c********************************************************************** +c twod.f - a solution to the Poisson problem by using Jacobi +c interation on a 2-d decomposition +c +c .... the rest of this is from pi3.f to show the style ... +c +c Each node: +c 1) receives the number of rectangles used in the approximation. +c 2) calculates the areas of it's rectangles. +c 3) Synchronizes for a global summation. +c Node 0 prints the result. +c +c Variables: +c +c pi the calculated result +c n number of points of integration. +c x midpoint of each rectangle's interval +c f function to integrate +c sum,pi area of rectangles +c tmp temporary scratch space for global summation +c i do loop index +c +c This code is included (without the prints) because one version of +c MPICH SEGV'ed (probably because of errors in handling send/recv of +c MPI_PROC_NULL source/destination). +c +c**************************************************************************** + program main + include "mpif.h" + integer maxn + parameter (maxn = 128) + double precision a(maxn,maxn), b(maxn,maxn), f(maxn,maxn) + integer nx, ny + integer myid, numprocs, it, rc, comm2d, ierr, stride + integer nbrleft, nbrright, nbrtop, nbrbottom + integer sx, ex, sy, ey + integer dims(2) + logical periods(2) + double precision diff2d, diffnorm, dwork + double precision t1, t2 + external diff2d + data periods/2*.false./ + + call MPI_INIT( ierr ) + call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr ) + call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr ) +c print *, "Process ", myid, " of ", numprocs, " is alive" + if (myid .eq. 0) then +c +c Get the size of the problem +c +c print *, 'Enter nx' +c read *, nx + nx = 10 + endif +c print *, 'About to do bcast on ', myid + call MPI_BCAST(nx,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr) + ny = nx +c +c Get a new communicator for a decomposition of the domain. Let MPI +c find a "good" decomposition +c + dims(1) = 0 + dims(2) = 0 + call MPI_DIMS_CREATE( numprocs, 2, dims, ierr ) + call MPI_CART_CREATE( MPI_COMM_WORLD, 2, dims, periods, .true., + * comm2d, ierr ) +c +c Get my position in this communicator +c + call MPI_COMM_RANK( comm2d, myid, ierr ) +c print *, "Process ", myid, " of ", numprocs, " is alive" +c +c My neighbors are now +/- 1 with my rank. Handle the case of the +c boundaries by using MPI_PROCNULL. + call fnd2dnbrs( comm2d, nbrleft, nbrright, nbrtop, nbrbottom ) +c print *, "Process ", myid, ":", +c * nbrleft, nbrright, nbrtop, nbrbottom +c +c Compute the decomposition +c + call fnd2ddecomp( comm2d, nx, sx, ex, sy, ey ) +c print *, "Process ", myid, ":", sx, ex, sy, ey +c +c Create a new, "strided" datatype for the exchange in the "non-contiguous" +c direction +c + call mpi_Type_vector( ey-sy+1, 1, ex-sx+3, + $ MPI_DOUBLE_PRECISION, stride, ierr ) + call mpi_Type_commit( stride, ierr ) +c +c +c Initialize the right-hand-side (f) and the initial solution guess (a) +c + call twodinit( a, b, f, nx, sx, ex, sy, ey ) +c +c Actually do the computation. Note the use of a collective operation to +c check for convergence, and a do-loop to bound the number of iterations. +c + call MPI_BARRIER( MPI_COMM_WORLD, ierr ) + t1 = MPI_WTIME() + do 10 it=1, 100 + call exchng2( b, sx, ex, sy, ey, comm2d, stride, + $ nbrleft, nbrright, nbrtop, nbrbottom ) + call sweep2d( b, f, nx, sx, ex, sy, ey, a ) + call exchng2( a, sx, ex, sy, ey, comm2d, stride, + $ nbrleft, nbrright, nbrtop, nbrbottom ) + call sweep2d( a, f, nx, sx, ex, sy, ey, b ) + dwork = diff2d( a, b, nx, sx, ex, sy, ey ) + call MPI_Allreduce( dwork, diffnorm, 1, MPI_DOUBLE_PRECISION, + $ MPI_SUM, comm2d, ierr ) + if (diffnorm .lt. 1.0e-5) goto 20 + if (myid .eq. 0) print *, 2*it, ' Difference is ', diffnorm +10 continue + if (myid .eq. 0) print *, 'Failed to converge' +20 continue + t2 = MPI_WTIME() +c if (myid .eq. 0) then +c print *, 'Converged after ', 2*it, ' Iterations in ', t2 - t1, +c $ ' secs ' +c endif +c +c + call MPI_Type_free( stride, ierr ) + call MPI_Comm_free( comm2d, ierr ) + call MPI_FINALIZE(rc) + end +c +c Perform a Jacobi sweep for a 2-d decomposition +c + subroutine sweep2d( a, f, n, sx, ex, sy, ey, b ) + integer n, sx, ex, sy, ey + double precision a(sx-1:ex+1, sy-1:ey+1), f(sx-1:ex+1, sy-1:ey+1), + + b(sx-1:ex+1, sy-1:ey+1) +c + integer i, j + double precision h +c + h = 1.0d0 / dble(n+1) + do 10 j=sy, ey + do 10 i=sx, ex + b(i,j) = 0.25 * (a(i-1,j)+a(i,j+1)+a(i,j-1)+a(i+1,j)) - + + h * h * f(i,j) + 10 continue + return + end +c + subroutine exchng2( a, sx, ex, sy, ey, + $ comm2d, stride, + $ nbrleft, nbrright, nbrtop, nbrbottom ) + include "mpif.h" + integer sx, ex, sy, ey, stride + double precision a(sx-1:ex+1, sy-1:ey+1) + integer nbrleft, nbrright, nbrtop, nbrbottom, comm2d + integer status(MPI_STATUS_SIZE), ierr, nx +c + nx = ex - sx + 1 +c These are just like the 1-d versions, except for less data + call MPI_SENDRECV( a(sx,ey), nx, MPI_DOUBLE_PRECISION, + $ nbrtop, 0, + $ a(sx,sy-1), nx, MPI_DOUBLE_PRECISION, + $ nbrbottom, 0, comm2d, status, ierr ) + call MPI_SENDRECV( a(sx,sy), nx, MPI_DOUBLE_PRECISION, + $ nbrbottom, 1, + $ a(sx,ey+1), nx, MPI_DOUBLE_PRECISION, + $ nbrtop, 1, comm2d, status, ierr ) +c +c This uses the "strided" datatype + call MPI_SENDRECV( a(ex,sy), 1, stride, nbrright, 0, + $ a(sx-1,sy), 1, stride, nbrleft, 0, + $ comm2d, status, ierr ) + call MPI_SENDRECV( a(sx,sy), 1, stride, nbrleft, 1, + $ a(ex+1,sy), 1, stride, nbrright, 1, + $ comm2d, status, ierr ) + return + end + +c +c The rest of the 2-d program +c + double precision function diff2d( a, b, nx, sx, ex, sy, ey ) + integer nx, sx, ex, sy, ey + double precision a(sx-1:ex+1, sy-1:ey+1), b(sx-1:ex+1, sy-1:ey+1) +c + double precision sum + integer i, j +c + sum = 0.0d0 + do 10 j=sy,ey + do 10 i=sx,ex + sum = sum + (a(i,j) - b(i,j)) ** 2 + 10 continue +c + diff2d = sum + return + end + subroutine twodinit( a, b, f, nx, sx, ex, sy, ey ) + integer nx, sx, ex, sy, ey + double precision a(sx-1:ex+1, sy-1:ey+1), b(sx-1:ex+1, sy-1:ey+1), + & f(sx-1:ex+1, sy-1:ey+1) +c + integer i, j +c + do 10 j=sy-1,ey+1 + do 10 i=sx-1,ex+1 + a(i,j) = 0.0d0 + b(i,j) = 0.0d0 + f(i,j) = 0.0d0 + 10 continue +c +c Handle boundary conditions +c + if (sx .eq. 1) then + do 20 j=sy,ey + a(0,j) = 1.0d0 + b(0,j) = 1.0d0 + 20 continue + endif + if (ex .eq. nx) then + do 21 j=sy,ey + a(nx+1,j) = 0.0d0 + b(nx+1,j) = 0.0d0 + 21 continue + endif + if (sy .eq. 1) then + do 30 i=sx,ex + a(i,0) = 1.0d0 + b(i,0) = 1.0d0 + 30 continue + endif +c + return + end + +c +c This file contains a routine for producing a decomposition of a 1-d array +c when given a number of processors. It may be used in "direct" product +c decomposition. The values returned assume a "global" domain in [1:n] +c + subroutine MPE_DECOMP1D( n, numprocs, myid, s, e ) + integer n, numprocs, myid, s, e + integer nlocal + integer deficit +c + nlocal = n / numprocs + s = myid * nlocal + 1 + deficit = mod(n,numprocs) + s = s + min(myid,deficit) + if (myid .lt. deficit) then + nlocal = nlocal + 1 + endif + e = s + nlocal - 1 + if (e .gt. n .or. myid .eq. numprocs-1) e = n + return + end +c +c This routine show how to determine the neighbors in a 2-d decomposition of +c the domain. This assumes that MPI_Cart_create has already been called +c + subroutine fnd2dnbrs( comm2d, + $ nbrleft, nbrright, nbrtop, nbrbottom ) + integer comm2d, nbrleft, nbrright, nbrtop, nbrbottom +c + integer ierr +c + call MPI_Cart_shift( comm2d, 0, 1, nbrleft, nbrright, ierr ) + call MPI_Cart_shift( comm2d, 1, 1, nbrbottom, nbrtop, ierr ) +c + return + end +c +c Note: THIS IS A TEST PROGRAM. THE ACTUAL VALUES MOVED ARE NOT +c CORRECT FOR A POISSON SOLVER. +c + subroutine fnd2ddecomp( comm2d, n, sx, ex, sy, ey ) + integer comm2d + integer n, sx, ex, sy, ey + integer dims(2), coords(2), ierr + logical periods(2) +c + call MPI_Cart_get( comm2d, 2, dims, periods, coords, ierr ) + + call MPE_DECOMP1D( n, dims(1), coords(1), sx, ex ) + call MPE_DECOMP1D( n, dims(2), coords(2), sy, ey ) +c + return + end + + diff --git a/teshsuite/smpi/sendrecv.c b/teshsuite/smpi/sendrecv.c index ae9e297194..1e4962dfcd 100644 --- a/teshsuite/smpi/sendrecv.c +++ b/teshsuite/smpi/sendrecv.c @@ -4,8 +4,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "mpi.h" #include +#include "mpi.h" static int test(int myid, int numprocs) { diff --git a/teshsuite/smpi/ttest01.c b/teshsuite/smpi/ttest01.c index ada55b9ea0..981d2a26b6 100644 --- a/teshsuite/smpi/ttest01.c +++ b/teshsuite/smpi/ttest01.c @@ -4,8 +4,8 @@ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ -#include "mpi.h" #include +#include "mpi.h" #include "instr/instr.h" #define DATATOSENT 100000000 diff --git a/teshsuite/xbt/CMakeLists.txt b/teshsuite/xbt/CMakeLists.txt index 9c883591b7..4f45fb5e58 100644 --- a/teshsuite/xbt/CMakeLists.txt +++ b/teshsuite/xbt/CMakeLists.txt @@ -1,12 +1,13 @@ cmake_minimum_required(VERSION 2.6) set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}") - -add_executable(log_large_test log_large_test.c) -add_executable(parallel_log_crashtest parallel_log_crashtest.c) -if(HAVE_MMAP) - add_executable(mmalloc_test mmalloc_test.c) -endif(HAVE_MMAP) +if(NOT WIN32) + add_executable(log_large_test log_large_test.c) + add_executable(parallel_log_crashtest parallel_log_crashtest.c) + if(HAVE_MMAP) + add_executable(mmalloc_test mmalloc_test.c) + endif() +endif() ### Add definitions for compile if(NOT WIN32) @@ -14,14 +15,8 @@ if(NOT WIN32) target_link_libraries(parallel_log_crashtest gras m pthread ) if(HAVE_MMAP) target_link_libraries(mmalloc_test gras m pthread ) - endif(HAVE_MMAP) -else(NOT WIN32) - target_link_libraries(log_large_test gras) - target_link_libraries(parallel_log_crashtest gras) - if(HAVE_MMAP) - target_link_libraries(mmalloc_test gras) - endif(HAVE_MMAP) -endif(NOT WIN32) + endif() +endif() set(tesh_files ${tesh_files} diff --git a/testsuite/surf/CMakeLists.txt b/testsuite/surf/CMakeLists.txt index 49addbc7ec..f9eee1c2cf 100644 --- a/testsuite/surf/CMakeLists.txt +++ b/testsuite/surf/CMakeLists.txt @@ -15,14 +15,14 @@ if(NOT WIN32) target_link_libraries(surf_usage simgrid m ) target_link_libraries(surf_usage2 simgrid m ) target_link_libraries(trace_usage simgrid m ) -else(NOT WIN32) +else() target_link_libraries(lmm_usage simgrid ) target_link_libraries(maxmin_bench simgrid ) set_target_properties(maxmin_bench PROPERTIES COMPILE_FLAGS "-DDLL_STATIC") target_link_libraries(surf_usage simgrid ) target_link_libraries(surf_usage2 simgrid ) target_link_libraries(trace_usage simgrid ) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/testsuite/xbt/CMakeLists.txt b/testsuite/xbt/CMakeLists.txt index b0e8ffd1dd..9d3c6273c1 100644 --- a/testsuite/xbt/CMakeLists.txt +++ b/testsuite/xbt/CMakeLists.txt @@ -13,12 +13,12 @@ if(NOT WIN32) target_link_libraries(graphxml_usage simgrid m ) target_link_libraries(heap_bench gras m ) target_link_libraries(parmap_bench simgrid m ) -else(NOT WIN32) +else() target_link_libraries(log_usage gras ) target_link_libraries(graphxml_usage simgrid ) target_link_libraries(heap_bench gras ) target_link_libraries(parmap_bench simgrid ) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/tools/graphicator/CMakeLists.txt b/tools/graphicator/CMakeLists.txt index a17561fa95..b62d22ab40 100644 --- a/tools/graphicator/CMakeLists.txt +++ b/tools/graphicator/CMakeLists.txt @@ -7,9 +7,9 @@ add_executable(graphicator graphicator.c) ### Add definitions for compile if(NOT WIN32) target_link_libraries(graphicator simgrid m pthread ) -else(NOT WIN32) +else() target_link_libraries(graphicator simgrid ) -endif(NOT WIN32) +endif() ## Clean generated files get_directory_property(extra_clean_files ADDITIONAL_MAKE_CLEAN_FILES) diff --git a/tools/gras/CMakeLists.txt b/tools/gras/CMakeLists.txt index eb9301ccae..f95e278f2c 100644 --- a/tools/gras/CMakeLists.txt +++ b/tools/gras/CMakeLists.txt @@ -9,10 +9,10 @@ add_executable(struct_diff struct_diff.c) if(NOT WIN32) target_link_libraries(gras_stub_generator simgrid pthread m) target_link_libraries(struct_diff simgrid pthread m) -else(NOT WIN32) +else() target_link_libraries(gras_stub_generator simgrid) target_link_libraries(struct_diff simgrid) -endif(NOT WIN32) +endif() set(tesh_files ${tesh_files} diff --git a/tools/gras/stub_generator.c b/tools/gras/stub_generator.c index bdd5613d64..3d32883591 100644 --- a/tools/gras/stub_generator.c +++ b/tools/gras/stub_generator.c @@ -21,7 +21,7 @@ #include "gras_stub_generator.h" #include -extern char *xbt_binary_name; +XBT_PUBLIC(char*)xbt_binary_name; XBT_LOG_NEW_DEFAULT_SUBCATEGORY(stubgen, gras, "Stub generator"); diff --git a/tools/tesh/CMakeLists.txt b/tools/tesh/CMakeLists.txt index e542aede96..1a5ea38f24 100644 --- a/tools/tesh/CMakeLists.txt +++ b/tools/tesh/CMakeLists.txt @@ -6,14 +6,14 @@ if(WIN32) COMMENT "Install ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/tesh.pl" COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_HOME_DIRECTORY}/buildtools/Cmake/Scripts/tesh.pl ${CMAKE_BINARY_DIR}/bin/tesh ) -else(WIN32) +else() set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin") add_executable(tesh tesh.c run_context.c signal.c) ### Add definitions for compile target_link_libraries(tesh gras m pthread) -endif(WIN32) +endif() set(tesh_files ${tesh_files}