From: Martin Quinson Date: Sun, 21 May 2017 15:03:13 +0000 (+0200) Subject: Merge branch 'master' of github.com:simgrid/simgrid X-Git-Tag: v3.16~281 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/595e59c568ff5f8510de201bfd800951cdc2adcb?hp=4004b872b40b31de6b195722e37bf9f2d45a6860 Merge branch 'master' of github.com:simgrid/simgrid --- diff --git a/.gitignore b/.gitignore index 1eaa7cea3d..725236b2f1 100644 --- a/.gitignore +++ b/.gitignore @@ -200,6 +200,7 @@ examples/s4u/actor-suspend/s4u_actor-suspend examples/s4u/basic/s4u_basic examples/s4u/basic/s4u_basic_deployment examples/s4u/basic/s4u_basic_function +examples/s4u/dht-chord/s4u_dht-chord examples/s4u/io/s4u_io examples/s4u/mutex/s4u_mutex examples/simdag/daxload/sd_daxload @@ -1037,6 +1038,7 @@ teshsuite/smpi/mpich-test/pt2pt/waitall3 teshsuite/smpi/mpich-test/pt2pt/waitall4 teshsuite/smpi/mpich-test/pt2pt/waitany teshsuite/smpi/mpich-test/*/*.stdo +teshsuite/smpi/privatization/privatization teshsuite/smpi/pt2pt-dsend/pt2pt-dsend teshsuite/smpi/pt2pt-pingpong/pt2pt-pingpong teshsuite/smpi/coll-reduce/coll-reduce @@ -1057,7 +1059,6 @@ teshsuite/surf/lmm_usage/lmm_usage teshsuite/surf/maxmin_bench/maxmin_bench teshsuite/surf/surf_usage/surf_usage teshsuite/surf/surf_usage2/surf_usage2 -teshsuite/surf/trace_usage/trace_usage teshsuite/xbt/heap_bench/heap_bench teshsuite/xbt/log_large/log_large teshsuite/xbt/log_usage/log_usage @@ -1072,6 +1073,7 @@ testgraph.xml test_rl test_sg tools/tesh/tesh +unit_tmgr ######################################### ## touched files to track the dependencies of java examples examples/java/app/bittorrent/java_app_bittorrent_compiled diff --git a/.travis.yml b/.travis.yml index 99f0f5e7bc..5f89b91668 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,9 @@ addons: - gfortran - libboost-dev - libboost-all-dev + - libdw-dev + - libevent-dev + - libunwind8-dev coverity_scan: project: name: "simgrid/simgrid" @@ -44,9 +47,10 @@ addons: # - ls -lR $TRAVIS_BUILD_DIR/LuaInstall script: - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update ; fi - - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install python3; fi - - cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON . + - test "$TRAVIS_OS_NAME" == "osx" && brew update + - test "$TRAVIS_OS_NAME" == "osx" && brew install python3 + - test "$TRAVIS_OS_NAME" == "osx" && cmake -Denable_model-checking=OFF -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON . + - test "$TRAVIS_OS_NAME" == "linux" && cmake -Denable_model-checking=ON -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON . # run make in the sonar wrapper && run the tests before sonar to get coverage info - ./tools/internal/travis-sonarqube.sh make VERBOSE=1 # if sonar was not run (and if the build succeeded), run the tests manually diff --git a/CMakeLists.txt b/CMakeLists.txt index 703224dc19..d99da0de15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -206,15 +206,17 @@ include(CheckSymbolExists) set(HAVE_GRAPHVIZ 0) include(FindGraphviz) -set(HAVE_LUA 0) +set(SIMGRID_HAVE_LUA 0) if(enable_lua) include(FindLuaSimgrid) endif() -set(HAVE_NS3 0) +set(SIMGRID_HAVE_NS3 0) if(enable_ns3) include(FindNS3) - if (NOT HAVE_NS3) + if (SIMGRID_HAVE_NS3) + set(SIMGRID_HAVE_NS3 1) + else() message(FATAL_ERROR "Cannot find NS3. Please install it (apt-get install ns3 libns3-dev) or disable that cmake option") endif() endif() @@ -244,40 +246,29 @@ if(Boost_FOUND) include_directories(${Boost_INCLUDE_DIRS}) else() if(APPLE) - message(FATAL_ERROR "Boost libraries not found. Try to install them with 'sudo fink install boost1.53.nopython'") + message(FATAL_ERROR "Boost libraries not found. Try to install them with 'sudo fink install boost1.53.nopython' (check the exact name with 'fink list boost') or 'sudo brew install boost'") else() message(FATAL_ERROR "Boost libraries not found. Install libboost-dev (>= 1.48.0).") endif() endif() -#Boost context 1.61 will break compatibility with our implementation. -#Warn users about that -find_package(Boost 1.61 COMPONENTS context) - -if(Boost_FOUND AND Boost_CONTEXT_FOUND) - message(" WARNING : our implementation of Boost context factory is not compatible with Boost >=1.61 yet.") - - set(Boost_FOUND 1) - set(HAVE_BOOST_CONTEXTS 0) -else() -# Try again to see if we have libboost-context - find_package(Boost 1.42 COMPONENTS context) - set(Boost_FOUND 1) # We don't care of whether this component is missing - - if(Boost_FOUND AND Boost_CONTEXT_FOUND) - # We should use feature detection for this instead: - if (Boost_VERSION LESS 105600) - message("Found Boost.Context API v1") - set(HAVE_BOOST_CONTEXTS 1) - else() - message("Found Boost.Context API v2") - set(HAVE_BOOST_CONTEXTS 2) - endif() +find_package(Boost COMPONENTS context) +set(Boost_FOUND 1) # This component is optional +if(Boost_CONTEXT_FOUND) + if (Boost_VERSION LESS 105600) + message("Found Boost.Context API v1") + set(HAVE_BOOST_CONTEXTS 1) + elseif(Boost_VERSION LESS 106100) + message("Found Boost.Context API v2") + set(HAVE_BOOST_CONTEXTS 2) else() - message (" boost : found.") - message (" boost-context: missing. Install libboost-context-dev for this optional feature.") + message(" WARNING : our implementation of Boost context factory is not compatible with Boost >=1.61 yet.") set(HAVE_BOOST_CONTEXTS 0) endif() +else() + message (" boost : found.") + message (" boost-context: missing. Install libboost-context-dev for this optional feature.") + set(HAVE_BOOST_CONTEXTS 0) endif() # Checks for header libraries functions. @@ -365,15 +356,15 @@ else() endif() if(enable_jedule) - set(HAVE_JEDULE 1) + set(SIMGRID_HAVE_JEDULE 1) else() - set(HAVE_JEDULE 0) + set(SIMGRID_HAVE_JEDULE 0) endif() if(enable_mallocators) - SET(HAVE_MALLOCATOR 1) + SET(SIMGRID_HAVE_MALLOCATOR 1) else() - SET(HAVE_MALLOCATOR 0) + SET(SIMGRID_HAVE_MALLOCATOR 0) endif() include(FindLibunwind) @@ -406,13 +397,13 @@ if(enable_model-checking) find_package(Libevent REQUIRED) include_directories(${LIBDW_INCLUDE_DIR} ${LIBEVENT_INCLUDE_DIR}) set(SIMGRID_DEP "${SIMGRID_DEP} ${LIBEVENT_LIBRARIES} ${LIBDW_LIBRARIES}") - set(HAVE_MC 1) + set(SIMGRID_HAVE_MC 1) if("${CMAKE_SYSTEM}" MATCHES "FreeBSD" AND enable_java) message(WARNING "FreeBSD + Model-Checking + Java = too much for now. Disabling java") set(enable_java FALSE) endif() else() - SET(HAVE_MC 0) + SET(SIMGRID_HAVE_MC 0) set(HAVE_MMALLOC 0) endif() @@ -963,7 +954,7 @@ message(" LDFlags .....................: ${CMAKE_C_LINK_FLAGS}") message(" with LTO ....................: ${enable_lto}") message("") -if (HAVE_NS3) +if (SIMGRID_HAVE_NS3) message(" Compile NS-3 ................: yes (path: ${NS3_PATH})") else() message(" Compile NS-3 ................: NO (hint: ${NS3_HINT})") @@ -975,7 +966,7 @@ if (${Java_FOUND}) else() message(" Compile Java ................: NO") endif() -message(" Compile Lua .................: ${HAVE_LUA}") +message(" Compile Lua .................: ${SIMGRID_HAVE_LUA}") message(" Compile Smpi ................: ${HAVE_SMPI}") message(" Smpi fortran ..............: ${SMPI_FORTRAN}") message(" MPICH3 testsuite ..........: ${enable_smpi_MPICH3_testsuite}") @@ -985,8 +976,8 @@ message(" Compile Boost.Context support: ${HAVE_BOOST_CONTEXTS}") message("") message(" Maintainer mode .............: ${enable_maintainer_mode}") message(" Documentation................: ${enable_documentation}") -message(" Model checking ..............: ${HAVE_MC}") -message(" Jedule mode ................: ${HAVE_JEDULE}") +message(" Model checking ..............: ${SIMGRID_HAVE_MC}") +message(" Jedule mode ................: ${SIMGRID_HAVE_JEDULE}") message(" Graphviz mode ...............: ${HAVE_GRAPHVIZ}") message(" Mallocators .................: ${enable_mallocators}") message("") diff --git a/ChangeLog b/ChangeLog index 0fc46d7f3d..6ca3d3e3a8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,19 +1,38 @@ SimGrid (3.16) UNRELEASED -SimDag - - New and Backwards Compatibility break: - SD_simulate_with_update (double how_long, xbt_dynar_t changed_tasks_dynar) - When one wants to get the list of tasks whose states have changed during a - simulation round, s/he has to allocate and free a dynar and use it as argument - to this function. The former SD_simulate (double how_long) now returns void. + Portability status: + - FreeBSD: Disable SMPI mmap privatization, switch automatically to dlopen. + - Mac, BSD: dlopen+thread broken, switch automatically to raw contexts. + + XML platforms: Switch to platform v4.1 format. + * This is a backward compatible change: v4 are valid v4.1 files + - can be used as a synonym for the now deprecated + - an be used as a synonym for the now deprecated + - an be used as a synonym for the now deprecated + - can be used as a synonym for the now deprecated + - state_file and avail_file periodicity is now easier to express + (check the documentation) the old behavior should still work. + + SimDag + - New and Backwards Compatibility break: + SD_simulate_with_update (double how_long, xbt_dynar_t changed_tasks_dynar) + When one wants to get the list of tasks whose states have changed during a + simulation round, s/he has to allocate and free a dynar and use it as argument + to this function. The former SD_simulate (double how_long) now returns void. + + MSG + - The netzone are now available from the MSG API. + The old names still work, but are now deprecated. SMPI - New algorithm to privatize globals: dlopen, with dynamic loading tricks - New option: smpi/keep-temps to not cleanup temp files - XBT/Replay: - - New function xbt_replay_action_get(): + XBT + - Replay: New function xbt_replay_action_get(): Retrieve the function previously associated to an event type. + - DROPPED FUNCTION: xbt_str_varsubst() + - DROPPED MODULE: strbuff. We don't need it anymore. -- Release target: June 21 2017 -- Da SimGrid team diff --git a/circle.yml b/circle.yml new file mode 100644 index 0000000000..3faf1433f8 --- /dev/null +++ b/circle.yml @@ -0,0 +1,21 @@ +# This is the configuration file for the https://circleci.com/ continuous integration server +# +# Copyright (C) 2017. The SimGrid team. All rights reserved. +# +# 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. + +machine: + python: + version: 3.6.0 + +dependencies: + pre: + - sudo apt-get update; sudo apt-get install cmake valgrind default-jdk gfortran libboost-dev libboost-all-dev + +test: + pre: + - mkdir _build + - pushd _build ; cmake -Denable_documentation=OFF -Denable_coverage=ON -Denable_java=ON -Denable_model-checking=OFF -Denable_lua=OFF -Denable_compile_optimizations=ON -Denable_smpi=ON -Denable_smpi_MPICH3_testsuite=OFF -Denable_compile_warnings=ON .. + override: + - pushd _build ; make -j4 && ctest -j4 --output-on-failure diff --git a/doc/doxygen/deployment.doc b/doc/doxygen/deployment.doc index cd1ef5d030..b4d96cad94 100644 --- a/doc/doxygen/deployment.doc +++ b/doc/doxygen/deployment.doc @@ -34,13 +34,13 @@ in many of the provided example, just grep for them. @section deploy_xml Deployment with XML -Deploying processes from XML is easy. This section presents a complete +Deploying actors from XML is easy. This section presents a complete example and the reference guide of the involved tags. The deployment file looks just like a @ref platform "platform" file, with only 3 tags used: - - @c <process> starts a new actor on a given host; + - @c <actor> starts a new actor on a given host; - @c <argument> passes a given argument in the argv of an actor (the list of arguments is ordered); - @c <prop> adds a property to the actor. @@ -55,26 +55,26 @@ are named @c ***_d_xml. - + - + - + - + - + @endverbatim -@subsection deploy_xml_process The process tag +@subsection deploy_xml_actor The actor tag -<process> starts a new actor on a given host. It specifies which +<actor> starts a new actor on a given host. It specifies which function (from your application) gets executed on the host. Hence, the @c host and @c function attributes are mandatory, but this tag accepts some optional attributes too. @@ -85,11 +85,11 @@ some optional attributes too. | function | yes | String | Name of the function (from your own code) that will be executed. See @ref deploy_xml_functions. | | start_time | no | int | The simulated time when this actor will be started (Default: ASAP). | | kill_time | no | int | The simulated time when this actor will be forcefully stopped (Default: never). | -| on_failure | no | DIE\|RESTART | What should be done when the process fails (Default: die). | +| on_failure | no | DIE\|RESTART | What should be done when the actor fails (Default: die). | @subsection deploy_xml_argument The argument tag -This tag (which must be enclosed in a @c <process> tag) adds a +This tag (which must be enclosed in a @c <actor> tag) adds a new string to the parameter list received by your actor (either its @c argv array in MSG or its @c args vector in S4U). Naturally, the semantic of these parameters completely depend on your program. @@ -100,12 +100,11 @@ semantic of these parameters completely depend on your program. @subsection deploy_xml_prop The prop tag -This tag (which must be enclosed in a @c <process> tag) adds a -new property to your actor. - -(either its @c -argv array in MSG or its @c args vector in S4U). Naturally, the -semantic of these parameters completely depend on your program. +This tag (which must be enclosed in a @c <actor> tag) adds a new +property to your actor. You can retrieve these properties with +MSG_process_get_property_value() or simgrid::s4u::Actor::property(). +Naturally, the semantic of these parameters completely depend on your +program. | Attribute name | Mandatory | Values | Description | | --------------- | --------- | ---------------------- | ----------- | @@ -115,7 +114,7 @@ semantic of these parameters completely depend on your program. @subsection deploy_xml_functions Declaring startable functions You need to connect your code to the names that you use in the XML -deployment file. Depends on the interface you use, this is done with +deployment file. Depending on the interface you use, this is done with MSG_process_create() or simgrid::s4u::Engine::registerFunction(). There is nothing to do in your **Java code** since SimGrid uses the Java introspection abilities to retrieve the classes from their diff --git a/doc/doxygen/howtos.doc b/doc/doxygen/howtos.doc index 8da21aa458..a764b7af8f 100644 --- a/doc/doxygen/howtos.doc +++ b/doc/doxygen/howtos.doc @@ -18,6 +18,34 @@ Of course, you should also check the @ref examples page, that shows more detailed usage examples. As for the rest of the documentation (and of SimGrid, actually), any contribution is welcome. +@section howto_churn How to model churn + +One of the biggest challenges in P2P settings is to cope with the +churn, meaning that resources keep appearing and disappearing. In +SimGrid, you can always change the state of each host manually, with +eg simgrid::s4u::Host::on(). To reduce the burden when the churn is +high, you can also attach a **state profile** to the host directly. + +This is not possible from S4U yet (TODO), and you should use the \c +state_file attribute of @ref pf_tag_host or @ref pf_tag_cluster. + +Every lines (but the last) of such files describe timed events with +the form "date value". Example: + +~~~{.py} + 1 0 + 2 1 + LOOPAFTER 8 +~~~ + + - At time t=1, the host is turned off (value 0 means OFF) + - At time t=2, it is turned back on (other values means ON) + - At time t=10, the history is reset (because that's 8 seconds after + the last event). So the host will be turned off again at t=11. + +If your trace does not contain a LOOPAFTER line, then your profile is +only executed once and not repetitively. + @section howto_multicore How to model multicore machines Multicore machines are very complex, and there is many way to model diff --git a/doc/doxygen/inside_tests.doc b/doc/doxygen/inside_tests.doc index d7a732860f..c8195c2dd2 100644 --- a/doc/doxygen/inside_tests.doc +++ b/doc/doxygen/inside_tests.doc @@ -72,13 +72,12 @@ your changes should look like that: --- a/tools/cmake/UnitTesting.cmake +++ b/tools/cmake/UnitTesting.cmake @@ -11,6 +11,7 @@ set(FILES_CONTAINING_UNITTESTS - src/xbt/xbt_strbuff.c src/xbt/xbt_sha.c src/xbt/config.c + src/xbt/plouf.c ) - if(HAVE_MC) + if(SIMGRID_HAVE_MC) \endverbatim Then, you want to actually add your tests in the source file. All the diff --git a/doc/doxygen/module-xbt.doc b/doc/doxygen/module-xbt.doc index 3f53b3681d..395f744cd4 100644 --- a/doc/doxygen/module-xbt.doc +++ b/doc/doxygen/module-xbt.doc @@ -18,7 +18,6 @@ - \ref XBT_dict - \ref XBT_swag - \ref XBT_heap - - @ref xbt_strbuff - \ref XBT_misc - \ref XBT_graph diff --git a/doc/doxygen/ns3.doc b/doc/doxygen/ns3.doc index 8a9af01994..5022462a43 100644 --- a/doc/doxygen/ns3.doc +++ b/doc/doxygen/ns3.doc @@ -43,7 +43,7 @@ cmake . -Denable_ns3=ON -DNS3_HINT=/opt/ns3 # or change the path if needed By the end of the configuration, cmake reports whether ns-3 was found, and this information is also available in include/simgrid_config.h -If your local copy defines the variable \c HAVE_NS3 to 1, then NS3 +If your local copy defines the variable \c SIMGRID_HAVE_NS3 to 1, then NS3 was correctly detected. If it's defined to 0, then something went wrong. Explore CMakeFiles/CMakeOutput.log and CMakeFiles/CMakeError.log to diagnose the problem. diff --git a/doc/doxygen/outcomes_logs.doc b/doc/doxygen/outcomes_logs.doc index d369083d77..131fe3655f 100644 --- a/doc/doxygen/outcomes_logs.doc +++ b/doc/doxygen/outcomes_logs.doc @@ -306,12 +306,6 @@ Here are the existing format directives: - %%L: line number where the log event was raised (LOG4J compatible) - %%M: function name (LOG4J compatible -- called method name here of course). - - %%b: full backtrace (Called %%throwable in LOG4J). - Defined only under windows or when using the GNU libc because backtrace() is not defined - elsewhere, and we only have a fallback for windows boxes, not mac ones for example. - - %%B: short backtrace (only the first line of the %%b). - Called %%throwable{short} in LOG4J; defined where %%b is. - - %%d: date (UNIX-like epoch) - %%r: application age (time elapsed since the beginning of the application) diff --git a/doc/doxygen/platform.doc b/doc/doxygen/platform.doc index f9601f92d1..89ee5f6ae3 100644 --- a/doc/doxygen/platform.doc +++ b/doc/doxygen/platform.doc @@ -43,144 +43,100 @@ files. From time to time, this DTD evolves to introduce possibly backward-incompatible changes. That is why each platform desciption is enclosed within a @c platform tag, that have a @c version attribute. -The current version is 4. The @c simgrid_update_xml program can +The current version is 4.1. The @c simgrid_update_xml program can upgrade most of the past platform files to the recent formalism. -\section pf_netzones Defining a NetZone +\section pf_first_example First Platform Example -In SimGrid, any resource must be located within a given **NetZone**. -Each netzone is in charge of the routing between its resources. It -means that when an host wants to communicate with another host of the -same NetZone, it is the NetZone's duty to find the list of links that -are involved in the communication. If the hosts are not in the same -NetZone, @ref routing_basics "things are slightly more complex" to -determine the links involved in a time- and space-efficient manner. +Here is a very simple platform file, containing 3 resources (two hosts +and one link), and explicitly giving the route between the hosts. -But only one NetZone is really sufficient to begin with. The following -chunk describes a simplistic NetZone using the Full routing (we will -have to specify each and every routes manually). - -\verbatim - -\endverbatim - -There is also the ```` tag; this tag takes two attributes, -``src`` (source) and ``dst`` (destination). Both source and -destination must be valid identifiers for routers (these will be -introduced later). Contained by the ```` are network links; -these links must be used in order to communicate from the source to -the destination specified in the tag. Hence, a route merely describes -how to reach a router from another router. - -\remark - More information and (code-)examples can be found in Section \ref pf_rm. - -A netzone can also contain itself one or more netzone; this allows you to model -the hierarchy of your platform. - -### Within each AS, the following types of resources exist: - -%Resource | Documented in Section | Description ---------------- | --------------------- | ----------- -AS | | Every Autonomous System (AS) may contain one or more AS. -host | \ref pf_host | This entity carries out the actual computation. For this reason, it contains processors (with potentially multiple cores). -router | \ref pf_router | In SimGrid, routers are used to provide helpful information to routing algorithms. Routers may also act as gateways, connecting several autonomous systems with each other. -link | \ref pf_link | In SimGrid, (network)links define a connection between two or potentially even more resources. Every link has a bandwidth and a latency and may potentially experience congestion. -cluster | \ref pf_cluster | In SimGrid, clusters were introduced to model large and homogenous environments. They are not really a resource by themselves - technically, they are only a shortcut, as they will internally set up all the hosts, network and routing for you, i.e., using this resource, one can easily setup thousands of hosts and links in a few lines of code. Each cluster is itself an AS. - -As it is desirable to interconnect these resources, a routing has to -be defined. The AS is supposed to be Autonomous, hence this has to be -done at the AS level. The AS handles two different types of entities -(host/router and AS). However, the user is responsible -to define routes between those resources, otherwise entities will be -unconnected and therefore unreachable from other entities. Although -several routing algorithms are built into SimGrid (see \ref pf_rm), -you might encounter a case where you want to define routes manually -(for instance, due to specific requirements of your platform). - -There are three tags to use: -\li ASroute: to define routes between two AS -\li route: to define routes between two host/router -\li bypassRoute: to define routes between two AS that - will bypass default routing (as specified by the ``routing`` attribute - supplied to ````, see above). +\code{.xml} + + + + + + + + + + + + + + +\endcode +As we said, the englobing @ref pf_overview "<platform>" tag is +used to specify the dtd version used for this file. + +Then, every resource (specified with @ref pf_tag_host, @ref +pf_tag_link or others) must be located within a given **networking +zone**. Each zone is in charge of the routing between its +resources. It means that when an host wants to communicate with +another host of the same zone, it is the zone's duty to find the list +of links that are involved in the communication. Here, since the @ref +pf_tag_zone tag has **Full** as a **routing attribute**, all routes +must be explicitely given using the @ref pf_tag_route and @ref +pf_tag_linkctn tags (this @ref pf_rm "routing model" is both simple +and inefficient :) It is OK to not specify the route between two +hosts, as long as the processes located on them never try to +communicate together. + +A zone can contain several zones itself, leading to a hierarchical +decomposition of the platform. This can be more efficient (as the +inter-zone routing gets factorized with @ref pf_tag_zoneroute), and +allows to have more than one routing model in your platform. For +example, you could have a coordinate-based routing for the WAN parts +of your platforms, a full routing within each datacenter, and a highly +optimized routing within each cluster of the datacenter. In this +case, determining the route between two given hosts gets @ref +routing_basics "somewhat more complex" but SimGrid still computes +these routes for you in a time- and space-efficient manner. Here is an illustration of these concepts: -![An illustration of an AS hierarchy. Here, AS1 contains 5 other ASes who in turn may contain other ASes as well.](AS_hierarchy.png) - Circles represent processing units and squares represent network routers. Bold - lines represent communication links. AS2 models the core of a national - network interconnecting a small flat cluster (AS4) and a larger - hierarchical cluster (AS5), a subset of a LAN (AS6), and a set of peers - scattered around the world (AS7). - -\section pf_pftags Resource description - -\subsection pf_As Platform: The <AS> tag - -For historical reasons, the XML files use the expression AS for -NetZones. Netzones are very important because they group other resources (such -as routers/hosts) together (in fact, any such resource must be -contained in a NetZone). - -Available attributes : - -Attribute name | Mandatory | Values | Description ---------------- | --------- | ------ | ----------- -id | yes | String | The identifier of an AS; facilitates referring to this AS. ID must be unique. -routing | yes | Full\| Floyd\| Dijkstra\| DijkstraCache\| None\| Vivaldi\| Cluster | See Section \ref pf_rm for details. - - -Example: -\code - - - - - - -\endcode - -In this example, AS0 contains two hosts (host1 and host2). The route -between the hosts goes through link1. +![A hierarchy of networking zones.](AS_hierarchy.png) -\subsection pf_Cr Computing resources: hosts, clusters and peers. +Circles represent processing units and squares represent network +routers. Bold lines represent communication links. The zone "AS2" +models the core of a national network interconnecting a small flat +cluster (AS4) and a larger hierarchical cluster (AS5), a subset of a +LAN (AS6), and a set of peers scattered around the world (AS7). -\subsubsection pf_host <host> +\section pf_res Resource description -A host represents a computer/node card. Every host is able to execute -code and it can send and receive data to/from other hosts. Most importantly, -a host can contain more than 1 core. +\subsection pf_res_computing Computing Resources -### Attributes: ### +\subsubsection pf_tag_host <host> -Attribute name | Mandatory | Values | Description ---------------- | --------- | ------ | ----------- -id | yes | String | The identifier of the host. facilitates referring to this AS. -speed | yes | double (must be > 0.0) | Computational power of every core of this host in FLOPS. Must be larger than 0.0. -core | no | int (Default: 1) | The number of cores of this host. If more than one core is specified, the "speed" parameter refers to every core, i.e., the total computational power is no_of_cores*speed.
If 6 cores are specified, up to 6 tasks can be executed without sharing the computational power; if more than 6 tasks are executed, computational power will be shared among these tasks.
Warning: Although functional, this model was never scientifically assessed. -availability_file| no | string | (Relative or absolute) filename to use as input; must contain availability traces for this host. The syntax of this file is defined below.
Note: The filename must be specified with your system's format. -state_file | no | string | Same mechanism as availability_file.
Note: The filename must be specified with your system's format. -coordinates | no | string | Must be provided when choosing the Vivaldi, coordinate-based routing model for the AS the host belongs to. More details can be found in the Section \ref pf_P2P_tags. -pstate | no | double (Default: 0.0) | FIXME: Not yet documented. +An host is the computing resource on which an actor can execute. -### Possible children: ### +Attribute | Values | Description +----------------- | -------------------------------------- | ----------- +id | String (mandatory) | The identifier of the host. facilitates referring to this AS. +speed | double (mandatory) | Computational power of every core of this host in FLOPS (must be positive) +core | int (defaults to 1) | Number of cores (see @ref howto_multicore) +state | optionally "OFF" | If set to OFF, the host is initially turned off. +availability_file | File name (optional) | (Relative or absolute) filename to use as input; must contain availability traces for this host. The syntax of this file is defined below. +state_file | File name (optional) | File to use as a state profile (see @ref howto_churn) +coordinates | String (mandatory when using Vivaldi routing) | The coordinates of this host (see @ref pf_P2P_tags). +pstate | Double (Defaults to 0) | FIXME: Not yet documented. -Tag name | Description | Documentation ------------- | ----------- | ------------- -\ | Defines mounting points between some storage resource and the host. | \ref pf_storage_entity_mount -\ | The prop tag allows you to define additional information on this host following the attribute/value schema. You may want to use it to give information to the tool you use for rendering your simulation, for example. | N/A +#### Included tags #### -### Example ### + - @ref pf_tag_mount Specifies the storages mounted on that host + - @ref pf_tag_prop Specifies a user-defined property of that host, that you can retrieve with MSG_host_get_property_value() or simgrid::s4u::Host::property(). -\verbatim - - - - - -\endverbatim +#### Examples #### +\code{.xml} + + + + + +\endcode \anchor pf_host_dynamism ### Expressing dynamism ### @@ -219,53 +175,7 @@ will start delivering 80\% of its power. In this example, this amounts to 400 Mf Since the periodicity in line 1 was set to be 1.0, i.e., 1 timestep, this host will continue to provide 500 Mflop/s from time 21. From time 32 it will provide 250 MFlop/s and so on. -### Changing initial state ### - -It is also possible to specify whether the host is up or down by setting the -``state`` attribute to either ON (default value) or OFF. - -#### Example: Expliciting the default value "ON" #### - -\verbatim - - - -\endverbatim - -If you want this host to be unavailable, simply substitute ON with OFF. - -\anchor pf_host_churn -### Expressing churn ### - -To express the fact that a host can change state over time (as in P2P -systems, for instance), it is possible to use a file describing the time -at which the host is turned on or off. An example of the content -of such a file is presented below. - -#### Adding a state file #### - -\verbatim - - - -\endverbatim - -#### Example of "bob.fail" file #### - -~~~{.py} - PERIODICITY 10.0 - 1.0 0 - 2.0 1 -~~~ - -A zero value means down (i.e., OFF) while a positive one means up and - running (i.e., ON). From time 0.0 to time 1.0, the host is on as usual. At time 1.0, it is -turned off and at time 2.0, it is turned on again until time 12 (2 plus the -periodicity 10). It will be turned off again at time 13.0 until time 23.0, and -so on. - - -\subsubsection pf_cluster <cluster> +\subsubsection pf_tag_cluster <cluster> ```` represents a machine-cluster. It is most commonly used when one wants to define many hosts and a network quickly. Technically, @@ -319,7 +229,7 @@ suffix | yes | string | Each node of the cluster will be suffixed radical | yes | string | Regexp used to generate cluster nodes name. Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. The produced number is concatenated between prefix and suffix to form machine names. speed | yes | int | Same as the ``speed`` attribute of the ``\`` tag. core | no | int (default: 1) | Same as the ``core`` attribute of the ``\`` tag. -bw | yes | int | Bandwidth for the links between nodes and backbone (if any). See the \ref pf_link "link section" for syntax/details. +bw | yes | int | Bandwidth for the links between nodes and backbone (if any). See the \ref pf_tag_link "link section" for syntax/details. lat | yes | int | Latency for the links between nodes and backbone (if any). See link section for syntax/details. sharing_policy | no | string | Sharing policy for the links between nodes and backbone (if any). See link section for syntax/details. bb_bw | no | int | Bandwidth for backbone (if any). See link section for syntax/details. If bb_bw and bb_lat (see below) attributes are omitted, no backbone is created (alternative cluster architecture described before). @@ -369,7 +279,7 @@ c-99.me This tag is only available when the routing mode of the AS is set to ``Cluster``. -The ``<cabinet />`` tag is, like the \ref pf_cluster "<cluster>" tag, +The ``<cabinet />`` tag is, like the \ref pf_tag_cluster "<cluster>" tag, a meta-tag. This means that it is simply a shortcut for creating a set of (homogenous) hosts and links quickly; unsurprisingly, this tag was introduced to setup cabinets in data centers quickly. Unlike <cluster>, however, the <cabinet> assumes that you create the backbone @@ -383,9 +293,9 @@ id | yes | string | The identifier of the cabinet. Facilitate prefix | yes | string | Each node of the cabinet has to have a name. This name will be prefixed with this prefix. suffix | yes | string | Each node of the cabinet will be suffixed with this suffix radical | yes | string | Regexp used to generate cabinet nodes name. Syntax: "10-20" will give you 11 machines numbered from 10 to 20, "10-20;2" will give you 12 machines, one with the number 2, others numbered as before. The produced number is concatenated between prefix and suffix to form machine names. -speed | yes | int | Same as the ``speed`` attribute of the \ref pf_host "<host>" tag. -bw | yes | int | Bandwidth for the links between nodes and backbone (if any). See the \ref pf_link "link section" for syntax/details. -lat | yes | int | Latency for the links between nodes and backbone (if any). See the \ref pf_link "link section" for syntax/details. +speed | yes | int | Same as the ``speed`` attribute of the \ref pf_tag_host "<host>" tag. +bw | yes | int | Bandwidth for the links between nodes and backbone (if any). See the \ref pf_tag_link "link section" for syntax/details. +lat | yes | int | Latency for the links between nodes and backbone (if any). See the \ref pf_tag_link "link section" for syntax/details. \note Please note that as of now, it is impossible to change attributes such as, @@ -453,7 +363,7 @@ See the documentation of simgrid::kernel::routing::VivaldiZone for details on how the latency is computed from the coordinate, and on the the up and down bandwidth are used. -\subsection pf_ne Network equipments: links and routers +\subsection pf_ne Network equipments There are two tags at all times available to represent network entities and several other tags that are available only in certain contexts. @@ -497,7 +407,7 @@ coordinates | no | string | Must be provided when choosing the Vivald \endverbatim -\subsubsection pf_link <link/> +\subsubsection pf_tag_link <link> Network links can represent one-hop network connections. They are characterized by their id and their bandwidth; links can (but may not) be subject @@ -646,7 +556,6 @@ be adjusted to 0.01 (or 10ms) and one second later it will be set again to 1ms. value will not change until second 5, when the periodicity defined in line 1 kicks in. It then loops back, starting at 100µs (the initial value) for one second. - #### The ```` tag #### Similar to the ```` tag, a link may also contain the ```` tag; see the host @@ -697,7 +606,7 @@ Entity name | Description --------------- | ----------- \ref pf_storage_entity_storage_type "storage_type" | Defines a template for a particular kind of storage (such as a hard-drive) and specifies important features of the storage, such as capacity, performance (read/write), contents, ... Different models of hard-drives use different storage_types (because the difference between an SSD and an HDD does matter), as they differ in some specifications (e.g., different sizes or read/write performance). \ref pf_storage_entity_storage "storage" | Defines an actual instance of a storage type (disk, RAM, ...); uses a ``storage_type`` template (see line above) so that you don't need to re-specify the same details over and over again. -\ref pf_storage_entity_mount "mount" | Must be wrapped by a \ref pf_host tag; declares which storage(s) this host has mounted and where (i.e., the mountpoint). +\ref pf_tag_mount "mount" | Must be wrapped by a \ref pf_tag_host tag; declares which storage(s) this host has mounted and where (i.e., the mountpoint). \anchor pf_storage_content_file @@ -803,12 +712,9 @@ Here is a complete example for the ``storage_type`` tag: \endverbatim -\anchor pf_storage_entity_storage -#### <storage> #### - -``storage`` attributes: +@subsubsection pf_tag_storage <storage> -Attribute name | Mandatory | Values | Description +Attributes | Mandatory | Values | Description -------------- | --------- | ------ | ----------- id | yes | string | Identifier of this ``storage``; used when referring to it typeId | yes | string | Here you need to refer to an already existing \ref pf_storage_entity_storage_type "\"; the storage entity defined by this tag will then inherit the properties defined there. @@ -835,16 +741,14 @@ now specifies a new content file (so the contents will be different from Disk1) and the filesystem uses the windows style; finally, it is attached to a second host, called alice (which is again not defined here). -\anchor pf_storage_entity_mount -#### <mount> #### +\subsubsection pf_tag_mount <mount> -Attributes: -| Attribute name | Mandatory | Values | Description | -| ---------------- | ----------- | -------- | ------------- | -| id | yes | string | Refers to a \ref pf_storage_entity_storage "<storage>" entity that will be mounted on that computer | -| name | yes | string | Path/location to/of the logical reference (mount point) of this disk +| Attribute | Mandatory | Values | Description | +| ----------- | ----------- | -------- | ------------- | +| id | yes | string | Refers to a \ref pf_storage_entity_storage "<storage>" entity that will be mounted on that computer | +| name | yes | string | Path/location to/of the logical reference (mount point) of this disk -This tag must be enclosed by a \ref pf_host tag. It then specifies where the mountpoint of a given storage device (defined by the ``id`` attribute) +This tag must be enclosed by a \ref pf_tag_host tag. It then specifies where the mountpoint of a given storage device (defined by the ``id`` attribute) is; this location is specified by the ``name`` attribute. Here is a simple example, taken from the file ``examples/platform/storage.xml``: @@ -962,6 +866,31 @@ are all calculating shortest paths. They do require some time to converge, but eventually, when the routing tables have stabilized, your packets will follow the shortest paths. +\subsection pf_tag_zone <zone> + +Before SimGrid v3.16, networking zones used to be called Autonomous +Systems, but this was misleading as zones may include other zones in a +hierarchical manner. If you find any remaining reference to ASes, +please report this as a bug. + +Attribute | Value | Description +----------- | ------------------------------------------------- | ---------------------------------------------- +id | String (mandatory) | The identifier of this zone (must be unique) +routing | One of the existing routing algorithm (mandatory) | See Section \ref pf_rm for details. + +Example: +\code + + + + + + +\endcode + +In this example, AS0 contains two hosts (host1 and host2). The route +between the hosts goes through link1. + \subsection pf_rm Routing models For each AS, you must define explicitly which routing model will @@ -1138,7 +1067,7 @@ routing model (the path is given relative to SimGrid's source directory): | Name | Description | | ---------------------------------------- | ------------------------------------------------------------------------------ | -| \ref pf_routing_model_cluster "Cluster" | This is specific to the \ref pf_cluster "<cluster/>" tag and should not be used by the user, as several assumptions are made. | +| \ref pf_routing_model_cluster "Cluster" | This is specific to the \ref pf_tag_cluster "<cluster/>" tag and should not be used by the user, as several assumptions are made. | | \ref pf_routing_model_none "None" | No routing at all. Unless you know what you're doing, avoid using this mode in combination with a non-constant network model. | | \ref pf_routing_model_vivaldi "Vivaldi" | Perfect when you want to use coordinates. Also see the corresponding \ref pf_P2P_tags "P2P section" below. | @@ -1163,7 +1092,7 @@ available within this model and if you try to communicate within the AS that uses this model, SimGrid will fail unless you have explicitly activated the \ref options_model_select_network_constant "Constant Network Model" (this model charges the same for every single communication). It should -be noted, however, that you can still attach an \ref pf_routing_tag_asroute "ASroute", +be noted, however, that you can still attach an \ref pf_tag_asroute "ASroute", as is demonstrated in the example below: \verbinclude platforms/cluster_and_one_host.xml @@ -1201,10 +1130,10 @@ There are currently four different ways to define routes: | Name | Description | | ------------------------------------------------- | ----------------------------------------------------------------------------------- | -| \ref pf_routing_tag_route "route" | Used to define route between host/router | -| \ref pf_routing_tag_asroute "ASroute" | Used to define route between different AS | -| \ref pf_routing_tag_bypassroute "bypassRoute" | Used to supersede normal routes as calculated by the network model between host/router; e.g., can be used to use a route that is not the shortest path for any of the shortest-path routing models. | -| \ref pf_routing_tag_bypassasroute "bypassASroute" | Used in the same way as bypassRoute, but for AS | +| \ref pf_tag_route "route" | Used to define route between host/router | +| \ref pf_tag_zoneroute "zoneRoute" | Used to define route between different zones | +| \ref pf_tag_bypassroute "bypassRoute" | Used to supersede normal routes as calculated by the network model between host/router; e.g., can be used to use a route that is not the shortest path for any of the shortest-path routing models. | +| \ref pf_tag_bypassasroute "bypassZoneRoute" | Used in the same way as bypassRoute, but for zones | Basically all those tags will contain an (ordered) list of references to link that compose the route you want to define. @@ -1220,14 +1149,14 @@ Consider the example below: \endverbatim The route here from host Alice to Bob will be first link1, then link2, -and finally link3. What about the reverse route? \ref pf_routing_tag_route "Route" and -\ref pf_routing_tag_asroute "ASroute" have an optional attribute \c symmetrical, that can +and finally link3. What about the reverse route? \ref pf_tag_route "Route" and +\ref pf_tag_zoneroute "ASroute" have an optional attribute \c symmetrical, that can be either \c YES or \c NO. \c YES means that the reverse route is the same route in the inverse order, and is set to \c YES by default. Note that this is not the case for bypass*Route, as it is more probable that you want to bypass only one default route. -For an \ref pf_routing_tag_asroute "ASroute", things are just slightly more complicated, as you have +For an \ref pf_tag_zoneroute "ASroute", things are just slightly more complicated, as you have to give the id of the gateway which is inside the AS you want to access ... So it looks like this: @@ -1243,11 +1172,11 @@ it means that it must pass through router1 to get out of the AS, then pass through link1, and get into AS2 by being received by router2. router1 must belong to AS1 and router2 must belong to AS2. -\subsubsection pf_linkctn <link_ctn/> +\subsubsection pf_tag_linkctn <link_ctn> This entity has only one purpose: Refer to an already existing -\ref pf_link "<link/>" when defining a route, i.e., it -can only occur as a child of \ref pf_routing_tag_route "<route/>" +\ref pf_tag_link "<link/>" when defining a route, i.e., it +can only occur as a child of \ref pf_tag_route "<route/>" | Attribute name | Mandatory | Values | Description | | --------------- | --------- | ------ | ----------- | @@ -1261,7 +1190,7 @@ entity (the path is given relative to SimGrid's source directory): \verbinclude example_filelist_xmltag_linkctn -\subsubsection pf_routing_tag_asroute ASroute +\subsubsection pf_tag_zoneroute <zoneRoute> The purpose of this entity is to define a route between two ASes. This is mainly useful when you're in the \ref pf_routing_model_full "Full routing model". @@ -1272,7 +1201,7 @@ This is mainly useful when you're in the \ref pf_routing_model_full "Full routin | --------------- | --------- | ------ | ----------- | | src | yes | String | The identifier of the source AS | | dst | yes | String | See the \c src attribute | -| gw_src | yes | String | The gateway that will be used within the src AS; this can be any \ref pf_host "Host" or \ref pf_router "Router" defined within the src AS. | +| gw_src | yes | String | The gateway that will be used within the src AS; this can be any \ref pf_tag_host "Host" or \ref pf_router "Router" defined within the src AS. | | gw_dst | yes | String | Same as \c gw_src, but with the dst AS instead. | | symmetrical | no | YES\|NO (Default: YES) | If this route is symmetric, the opposite route (from dst to src) will also be declared implicitly. | @@ -1303,12 +1232,12 @@ This is mainly useful when you're in the \ref pf_routing_model_full "Full routin
\endverbatim -\subsubsection pf_routing_tag_route route +\subsubsection pf_tag_route <route> The principle is the same as for -\ref pf_routing_tag_asroute "ASroute": The route contains a list of links that +\ref pf_tag_zoneroute "ASroute": The route contains a list of links that provide a path from \c src to \c dst. Here, \c src and \c dst can both be either a -\ref pf_host "host" or \ref pf_router "router". This is mostly useful for the +\ref pf_tag_host "host" or \ref pf_router "router". This is mostly useful for the \ref pf_routing_model_full "Full routing model" as well as for the \ref pf_routing_model_shortest_path "shortest-paths" based models (as they require topological information). @@ -1342,7 +1271,7 @@ A route in the \ref pf_routing_model_shortest_path "Shortest-Path routing model" (network-)graph and the employed algorithms need to know which edge connects which pair of entities. -\subsubsection pf_routing_tag_bypassasroute bypassASroute +\subsubsection pf_tag_bypassasroute bypassASroute As said before, once you choose a model, it (most likely; the constant network model, for example, doesn't) calculates routes for you. But maybe you want to @@ -1379,7 +1308,7 @@ connects the router \c my_cluster_1_router in the source cluster to the router \c my_cluster_2_router in the destination router. Additionally, as the \c symmetrical attribute was not given, this route is presumed to be symmetrical. -\subsubsection pf_routing_tag_bypassroute bypassRoute +\subsubsection pf_tag_bypassroute bypassRoute As said before, once you choose a model, it (most likely; the constant network model, for example, doesn't) calculates routes for you. But maybe you want to @@ -1479,93 +1408,67 @@ information to SimGrid. Here is a file doing it all :
\endverbatim -\section pf_other_tags Tags not (directly) describing the platform +\section pf_other Other tags The following tags can be used inside a \ tag even if they are not directly describing the platform: -\li \ref pf_config "config": it allows you to pass some configuration stuff like, for - example, the network model and so on. It follows the -\li \ref pf_include "include": allows you to include another file into the current one. -\subsection pf_config config + - @ref pf_tag_config passes configuration options, e.g. to change the network model; + - @ref pf_tag_prop gives user-defined properties to various elements -The only purpose of this tag is to contain the \c prop tags, as described below. -These tags will then configure the options as described by Section \ref options. -(See the example) +\subsection pf_tag_config <config> -#### Attributes #### +Adding configuration flags into the platform file is particularly +useful when the described platform is best used with specific +flags. For example, you could finely tune SMPI in your platform file directly. -| Attribute name | Mandatory | Values | Description | -| --------------- | --------- | ---------------------- | ----------- | -| id | yes | String | The identifier of the config tag when referring to id; this is basically useless, though. | +| Attribute | Values | Description | +| ---------- | ------------------- | ---------------------------------------------- | +| id | String (optional) | This optional identifier is ignored by SimGrid | -#### Possible children #### +* **Included tags:** @ref pf_tag_prop to specify a given configuration item (see @ref options). -Tag name | Description | Documentation ------------- | ----------- | ------------- -\ | The prop tag allows you to define different configuration options following the attribute/value schema. See the \ref options page. | N/A +Any such configuration must be given at the very top of the platform file. -#### Example #### +* **Example** \verbatim - - - - - - - + + + + + ... \endverbatim -\subsection pf_include include +\subsection pf_tag_prop <prop> -Even if it can be used in other contexts, this tag was originally created -to be used with \ref pf_trace. The idea was to have a file describing the -platform, and another file attaching traces of a given period to the platform. +Defines a user-defined property, identified with a name and having a +value. You can specify such properties to most kind of resources: +@ref pf_tag_zone, @ref pf_tag_host, @ref pf_tag_storage, +@ref pf_tag_cluster and @ref pf_tag_link. These values can be retrieved +at runtime with MSG_zone_property() or simgrid::s4u::NetZone::property(), +or similar functions. -The drawback is that the file chuncks that will be included do not -constitute valid XML files. This may explain why this feature was never really -used in practice (as far as we know). Other mechanisms, such as the ability to load -several platform files one after the other, could be considered in the future. - -In the meanwhile, the \c include tag allows you to import other platforms into your -local file. This is done with the intention to help people -combine their different AS and provide new platforms. Those files -should contain XML that consists of -\ref pf_include "include", \ref pf_cluster "cluster", \ref pf_peer "peer", \ref pf_As "AS", \ref pf_trace "trace", \ref pf_trace "tags". - -Do not forget to close the tag to make it work, or you will end up with an invalid XML file. - -#### Attributes #### - -| Attribute name | Mandatory | Values | Description | -| --------------- | --------- | ---------------------- | ----------- | -| file | yes | String | Filename of the path you want to include with either relative or absolute path. | +| Attribute | Values | Description | +| --------- | ---------------------- | ----------------------------------------------------------------------------------------- | +| id | String (mandatory) | Identifier of this property. Must be unique for a given property holder, eg host or link. | +| value | String (mandatory) | Value of this property; The semantic is completely up to you. | +* **Included tags:** none. #### Example #### -The following example includes two files, clusterA.xml and clusterB.xml and -combines them two one platform file; all hosts, routers etc. defined in -each of them will then be usable. +\code{.xml} + +\endcode -\verbatim - - - - - - - - -\endverbatim \subsection pf_trace trace and trace_connect @@ -1602,7 +1505,7 @@ entity. | --------------- | --------- | ---------------------- | ----------- | | id | yes | String | Identifier of this trace; this is the name you pass on to \c trace_connect. | | file | no | String | Filename of the file that contains the information - the path must follow the style of your OS. You can omit this, but then you must specifiy the values inside of <trace> and </trace> - see the example below. | -| trace_periodicity | yes | String | This is the same as for \ref pf_host "hosts" (see there for details) | +| trace_periodicity | yes | String | This is the same as for \ref pf_tag_host "hosts" (see there for details) | Here is an example of trace when no file name is provided: @@ -1630,7 +1533,7 @@ are some best practices you should pay attention to in order to produce good platform and some choices you can make in order to have faster simulations. Here's some hints and tips, then. -@subsection Finding the platform example that you need +@subsection pf_hints_search Finding the platform example that you need Most platform files that we ship are in the @c examples/platforms folder. The good old @c grep tool can find the examples you need when diff --git a/doc/msg-tuto-src/deployment0.xml b/doc/msg-tuto-src/deployment0.xml index 4746b97a3e..a9fe0365de 100644 --- a/doc/msg-tuto-src/deployment0.xml +++ b/doc/msg-tuto-src/deployment0.xml @@ -1,8 +1,8 @@ - - - + + + @@ -11,11 +11,11 @@ - - - - - - - + + + + + + + diff --git a/doc/msg-tuto-src/deployment1.xml b/doc/msg-tuto-src/deployment1.xml index 04dd2ebfc2..2286d864b9 100644 --- a/doc/msg-tuto-src/deployment1.xml +++ b/doc/msg-tuto-src/deployment1.xml @@ -1,10 +1,10 @@ - - - + + + - + diff --git a/doc/msg-tuto-src/deployment2.xml b/doc/msg-tuto-src/deployment2.xml index de5170efeb..99a9fcad83 100644 --- a/doc/msg-tuto-src/deployment2.xml +++ b/doc/msg-tuto-src/deployment2.xml @@ -1,9 +1,9 @@ - - + + - + diff --git a/doc/msg-tuto-src/deployment3.xml b/doc/msg-tuto-src/deployment3.xml index 3c86f5bcbf..c602a27cf0 100644 --- a/doc/msg-tuto-src/deployment3.xml +++ b/doc/msg-tuto-src/deployment3.xml @@ -1,19 +1,19 @@ - - + + - - + + - - + + - + diff --git a/doc/msg-tuto-src/deployment_general.xml b/doc/msg-tuto-src/deployment_general.xml index 6afc3c89e6..adbb7cb3e5 100644 --- a/doc/msg-tuto-src/deployment_general.xml +++ b/doc/msg-tuto-src/deployment_general.xml @@ -1,9 +1,9 @@ - - + + - + diff --git a/examples/java/app/bittorrent/Peer.java b/examples/java/app/bittorrent/Peer.java index 0bdc770232..3a2e19eb85 100644 --- a/examples/java/app/bittorrent/Peer.java +++ b/examples/java/app/bittorrent/Peer.java @@ -624,10 +624,9 @@ public class Peer extends Process { } private String getStatus() { - String s = ""; - for (int i = 0; i < Common.FILE_PIECES; i++) { - s = s + bitfield[i]; - } - return s; + StringBuilder s = new StringBuilder(""); + for (int i = 0; i < Common.FILE_PIECES; i++) + s.append(bitfield[i]); + return s.toString(); } } diff --git a/examples/java/app/bittorrent/bittorrent.xml b/examples/java/app/bittorrent/bittorrent.xml index e65416f3f0..df70dfb429 100644 --- a/examples/java/app/bittorrent/bittorrent.xml +++ b/examples/java/app/bittorrent/bittorrent.xml @@ -1,39 +1,39 @@ - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/java/app/centralizedmutex/Node.java b/examples/java/app/centralizedmutex/Node.java index 78bfef96bb..43ed0cf0bd 100644 --- a/examples/java/app/centralizedmutex/Node.java +++ b/examples/java/app/centralizedmutex/Node.java @@ -16,13 +16,13 @@ public class Node extends Process { public Node(Host host, String name, String[]args) { super(host,name,args); } - public void request(double CStime) throws MsgException { + public void request(double csTime) throws MsgException { RequestTask req = new RequestTask(getName()); Msg.info("Send a request to the coordinator"); req.send("coordinator"); Msg.info("Wait for a grant from the coordinator"); GrantTask.receive(getName()); - Task compute = new Task("CS", CStime, 0); + Task compute = new Task("CS", csTime, 0); compute.execute(); ReleaseTask release = new ReleaseTask(); release.send("coordinator"); diff --git a/examples/java/app/centralizedmutex/centralizedmutex.xml b/examples/java/app/centralizedmutex/centralizedmutex.xml index 4d4bcb8e9d..da816b5059 100644 --- a/examples/java/app/centralizedmutex/centralizedmutex.xml +++ b/examples/java/app/centralizedmutex/centralizedmutex.xml @@ -1,15 +1,15 @@ - - + + - - + + - - + + - + diff --git a/examples/java/app/masterworker/masterworker.xml b/examples/java/app/masterworker/masterworker.xml index f632a5da13..0a96f6cd87 100644 --- a/examples/java/app/masterworker/masterworker.xml +++ b/examples/java/app/masterworker/masterworker.xml @@ -1,32 +1,32 @@ - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/java/app/pingpong/Receiver.java b/examples/java/app/pingpong/Receiver.java index 089ec45b13..b9955d47b7 100644 --- a/examples/java/app/pingpong/Receiver.java +++ b/examples/java/app/pingpong/Receiver.java @@ -17,7 +17,7 @@ public class Receiver extends Process { } public void main(String[] args) throws MsgException { - for (int i = 0 ; i - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/java/dht/kademlia/Answer.java b/examples/java/dht/kademlia/Answer.java index 1421529b86..a18bc2af9d 100644 --- a/examples/java/dht/kademlia/Answer.java +++ b/examples/java/dht/kademlia/Answer.java @@ -16,7 +16,7 @@ public class Answer { public Answer(int destinationId) { this.destinationId = destinationId; - nodes = new ArrayList(); + nodes = new ArrayList<>(); } int getDestinationId() { diff --git a/examples/java/dht/kademlia/Common.java b/examples/java/dht/kademlia/Common.java index 381cf386aa..8af5cc588e 100644 --- a/examples/java/dht/kademlia/Common.java +++ b/examples/java/dht/kademlia/Common.java @@ -13,7 +13,7 @@ public class Common { public static final int RANDOM_LOOKUP_INTERVAL = 100; - public static final int alpha = 3; + public static final int ALPHA = 3; public static final int IDENTIFIER_SIZE = 32; /* Maximum size of the buckets */ diff --git a/examples/java/dht/kademlia/Node.java b/examples/java/dht/kademlia/Node.java index 4e46ba08c2..841e9d1be8 100644 --- a/examples/java/dht/kademlia/Node.java +++ b/examples/java/dht/kademlia/Node.java @@ -57,16 +57,16 @@ public class Node extends Process { } public void mainLoop() { - double next_lookup_time = Msg.getClock() + Common.RANDOM_LOOKUP_INTERVAL; + double nextLookupTime = Msg.getClock() + Common.RANDOM_LOOKUP_INTERVAL; while (Msg.getClock() < this.deadline) { try { if (comm == null) { comm = Task.irecv(Integer.toString(id)); } if (!comm.test()) { - if (Msg.getClock() >= next_lookup_time) { + if (Msg.getClock() >= nextLookupTime) { randomLookup(); - next_lookup_time += Common.RANDOM_LOOKUP_INTERVAL; + nextLookupTime += Common.RANDOM_LOOKUP_INTERVAL; } else { waitFor(1); } @@ -275,7 +275,7 @@ public class Node extends Process { public int sendFindNodeToBest(Answer nodeList) { int destination = nodeList.getDestinationId(); int i; - for (i = 0; i < Common.alpha && i < nodeList.size(); i++) { + for (i = 0; i < Common.ALPHA && i < nodeList.size(); i++) { Contact node = nodeList.getNodes().get(i); if (node.getId() != this.id) { this.sendFindNode(node.getId(),destination); diff --git a/examples/java/dht/kademlia/RoutingTable.java b/examples/java/dht/kademlia/RoutingTable.java index 9dc08f8df1..c5f88b2438 100644 --- a/examples/java/dht/kademlia/RoutingTable.java +++ b/examples/java/dht/kademlia/RoutingTable.java @@ -18,7 +18,7 @@ public class RoutingTable { public RoutingTable(int id) { this.id = id; - buckets = new Vector(); + buckets = new Vector<>(); for (int i = 0; i < Common.IDENTIFIER_SIZE + 1; i++) { buckets.add(new Bucket(i)); } @@ -102,12 +102,12 @@ public class RoutingTable { @Override public String toString() { - String string = "RoutingTable [ id=" + id + " " ; + StringBuilder string = new StringBuilder("RoutingTable [ id=" + id + " "); for (int i = 0; i < buckets.size(); i++) { if (buckets.get(i).size() > 0) { - string += buckets.get(i) + " "; + string.append(buckets.get(i) + " "); } } - return string; + return string.toString(); } } diff --git a/examples/java/dht/kademlia/kademlia.xml b/examples/java/dht/kademlia/kademlia.xml index 2b113e8362..748558ffd6 100644 --- a/examples/java/dht/kademlia/kademlia.xml +++ b/examples/java/dht/kademlia/kademlia.xml @@ -1,27 +1,27 @@ - + - + - + - + - + - + - + - + - + diff --git a/examples/java/energy/consumption/Main.java b/examples/java/energy/consumption/Main.java index 3ac36da43b..e3180368ac 100644 --- a/examples/java/energy/consumption/Main.java +++ b/examples/java/energy/consumption/Main.java @@ -10,9 +10,6 @@ import org.simgrid.msg.Msg; import org.simgrid.msg.MsgException; public class Main { - public static final double task_comp_size = 10; - public static final double task_comm_size = 10; - public static final int hostNB = 2 ; private Main() { throw new IllegalAccessError("Utility class"); } diff --git a/examples/java/io/file/Node.java b/examples/java/io/file/Node.java index df9e2149d9..82ce689487 100644 --- a/examples/java/io/file/Node.java +++ b/examples/java/io/file/Node.java @@ -26,10 +26,10 @@ import org.simgrid.msg.HostNotFoundException; import org.simgrid.msg.MsgException; public class Node extends Process { - private static String FILENAME1 = "/doc/simgrid/examples/platforms/g5k.xml"; - private static String FILENAME2 = "\\Windows\\setupact.log"; - private static String FILENAME3 = "/doc/simgrid/examples/platforms/g5k_cabinets.xml"; - private static String FILENAME4 = "/doc/simgrid/examples/platforms/nancy.xml"; + private static String file1 = "/doc/simgrid/examples/platforms/g5k.xml"; + private static String file2 = "\\Windows\\setupact.log"; + private static String file3 = "/doc/simgrid/examples/platforms/g5k_cabinets.xml"; + private static String file4 = "/doc/simgrid/examples/platforms/nancy.xml"; protected int rank; @@ -40,42 +40,42 @@ public class Node extends Process { public void main(String[] args) throws MsgException { String mount; - String filename; + String fileName; switch (rank) { case 4: mount = "/home"; - filename = mount + FILENAME1; + fileName = mount + file1; break; case 0: mount = "c:"; - filename = mount + FILENAME2; + fileName = mount + file2; break; case 2: mount = "/home"; - filename = mount + FILENAME3; + fileName = mount + file3; break; case 1: mount = "/home"; - filename = mount + FILENAME4; + fileName = mount + file4; break; default: mount = "/home"; - filename = mount + FILENAME1; + fileName = mount + file1; } - Msg.info("Open file " + filename); - File file = new File(filename); + Msg.info("Open file " + fileName); + File file = new File(fileName); long read = file.read(10000,1); - Msg.info("Having read " + read + " on " + filename); + Msg.info("Having read " + read + " on " + fileName); long write = file.write(100000,1); - Msg.info("Having write " + write + " on " + filename); + Msg.info("Having write " + write + " on " + fileName); - Msg.info("Seek back to the beginning of " + filename); + Msg.info("Seek back to the beginning of " + fileName); file.seek(0,File.SEEK_SET); read = file.read(150000,1); - Msg.info("Having read " + read + " on " + filename); + Msg.info("Having read " + read + " on " + fileName); } } diff --git a/examples/java/process/kill/Killer.java b/examples/java/process/kill/Killer.java index 18b0645cdb..c82af1d3bd 100644 --- a/examples/java/process/kill/Killer.java +++ b/examples/java/process/kill/Killer.java @@ -35,6 +35,8 @@ public class Killer extends Process { poorVictim.kill(); Msg.info("Ok, goodbye now."); - exit(); // This would be more useful if not placed on the last line + // The actor can also commit a suicide with the following command + exit(); // This will forcefully stop the current actor + // Of course, it's not useful here at the end of the main function, but that's for the example (and to check that this still works in the automated tests) } } diff --git a/examples/java/process/startkilltime/startkilltime.xml b/examples/java/process/startkilltime/startkilltime.xml index 638968651d..dc3c969bf2 100644 --- a/examples/java/process/startkilltime/startkilltime.xml +++ b/examples/java/process/startkilltime/startkilltime.xml @@ -1,22 +1,22 @@ - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/java/task/priority/priority.xml b/examples/java/task/priority/priority.xml index 92a83dae5f..26b16414b7 100644 --- a/examples/java/task/priority/priority.xml +++ b/examples/java/task/priority/priority.xml @@ -1,12 +1,12 @@ - - + + - - + + - + diff --git a/examples/java/trace/pingpong/Sender.java b/examples/java/trace/pingpong/Sender.java index d3f107d2ab..6af47fac5a 100644 --- a/examples/java/trace/pingpong/Sender.java +++ b/examples/java/trace/pingpong/Sender.java @@ -14,8 +14,8 @@ import org.simgrid.msg.Task; import org.simgrid.trace.Trace; public class Sender extends Process { - private static final double commSizeLat = 1; - private static final double commSizeBw = 100000000; + private static final double COMM_SIZE_LAT = 1; + private static final double COMM_SIZE_BW = 100000000; private static final String PM_STATE = "PM_STATE"; public Sender(String hostname, String name, String[] args) throws HostNotFoundException { @@ -40,7 +40,7 @@ public class Sender extends Process { for (int pos = 0; pos < hostCount; pos++) { time = Msg.getClock(); Msg.info("sender time: " + time); - ping = new PingPongTask("no name",computeDuration,commSizeLat); + ping = new PingPongTask("no name",computeDuration,COMM_SIZE_LAT); ping.setTime(time); ping.send(mailboxes[pos]); @@ -57,7 +57,7 @@ public class Sender extends Process { communicationTime=timeGot - time; Msg.info("Communication time : " + communicationTime); - Msg.info(" --- bw "+ commSizeBw/communicationTime + " ----"); + Msg.info(" --- bw "+ COMM_SIZE_BW/communicationTime + " ----"); /* Pop the last state (going back to sending ping) */ Trace.hostPopState (getHost().getName(), PM_STATE); diff --git a/examples/msg/CMakeLists.txt b/examples/msg/CMakeLists.txt index 81da7fb3ba..15c5b87970 100644 --- a/examples/msg/CMakeLists.txt +++ b/examples/msg/CMakeLists.txt @@ -23,7 +23,7 @@ foreach(x maestro-set) set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/${x}/${x}.tesh) endforeach() -if(HAVE_NS3) +if(SIMGRID_HAVE_NS3) add_executable (network-ns3 network-ns3/network-ns3.c) target_link_libraries(network-ns3 simgrid) set_target_properties(network-ns3 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/network-ns3) @@ -128,6 +128,6 @@ ADD_TESH_FACTORIES(app-masterworker-vivaldi "thread;ucontext;raw;boost" --se ADD_TESH(msg-app-pmm --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/msg --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/platforms --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/app-pmm/app-pmm.tesh) -if(HAVE_NS3) +if(SIMGRID_HAVE_NS3) ADD_TESH_FACTORIES(msg-network-ns3 "thread;ucontext;raw;boost" --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_BINARY_DIR}/examples/msg ${CMAKE_HOME_DIRECTORY}/examples/msg/network-ns3/network-ns3.tesh) endif() diff --git a/examples/msg/actions-comm/actions-comm_d.xml b/examples/msg/actions-comm/actions-comm_d.xml index 8a5602edf7..dbecc0b978 100644 --- a/examples/msg/actions-comm/actions-comm_d.xml +++ b/examples/msg/actions-comm/actions-comm_d.xml @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/examples/msg/actions-comm/actions-comm_split_d.xml b/examples/msg/actions-comm/actions-comm_split_d.xml index 846270df05..831c9e0cac 100644 --- a/examples/msg/actions-comm/actions-comm_split_d.xml +++ b/examples/msg/actions-comm/actions-comm_split_d.xml @@ -1,14 +1,14 @@ - - - + - - + + - + diff --git a/examples/msg/actions-storage/actions-storage_d.xml b/examples/msg/actions-storage/actions-storage_d.xml index d2eb6821bc..3f52ae60c1 100644 --- a/examples/msg/actions-storage/actions-storage_d.xml +++ b/examples/msg/actions-storage/actions-storage_d.xml @@ -1,5 +1,5 @@ - - + + diff --git a/examples/msg/app-bittorrent/app-bittorrent_d.xml b/examples/msg/app-bittorrent/app-bittorrent_d.xml index 3836bde110..5460ab1a9d 100644 --- a/examples/msg/app-bittorrent/app-bittorrent_d.xml +++ b/examples/msg/app-bittorrent/app-bittorrent_d.xml @@ -1,39 +1,39 @@ - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/app-chainsend/app-chainsend_d.xml b/examples/msg/app-chainsend/app-chainsend_d.xml index dd83afe682..73ab26bbd2 100644 --- a/examples/msg/app-chainsend/app-chainsend_d.xml +++ b/examples/msg/app-chainsend/app-chainsend_d.xml @@ -1,36 +1,36 @@ - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/app-chainsend/broadcaster.c b/examples/msg/app-chainsend/broadcaster.c index f14a1be7fc..f17ed64827 100644 --- a/examples/msg/app-chainsend/broadcaster.c +++ b/examples/msg/app-chainsend/broadcaster.c @@ -11,9 +11,7 @@ XBT_LOG_NEW_DEFAULT_CATEGORY(msg_broadcaster, "Messages specific for the broadca xbt_dynar_t build_hostlist_from_hostcount(int hostcount) { xbt_dynar_t host_list = xbt_dynar_new(sizeof(char*), xbt_free_ref); - int i; - - for (i = 1; i <= hostcount; i++) { + for (int i = 1; i <= hostcount; i++) { char *hostname = bprintf("host%d", i); XBT_DEBUG("%s", hostname); xbt_dynar_push(host_list, &hostname); @@ -24,12 +22,12 @@ xbt_dynar_t build_hostlist_from_hostcount(int hostcount) int broadcaster_build_chain(broadcaster_t bc) { msg_task_t task = NULL; - char **cur = (char**)xbt_dynar_iterator_next(bc->it); - const char *me = "host0"; /* FIXME: hardcoded*/ /*MSG_host_get_name(MSG_host_self());*/ - const char *current_host = NULL; - const char *prev = NULL; - const char *next = NULL; - const char *last = NULL; + char** cur = (char**)xbt_dynar_iterator_next(bc->it); + const char* me = MSG_host_get_name(MSG_host_self()); + const char* current_host = NULL; + const char* prev = NULL; + const char* next = NULL; + const char* last = NULL; /* Build the chain if there's at least one peer */ if (cur != NULL) { @@ -62,8 +60,7 @@ int broadcaster_build_chain(broadcaster_t bc) int broadcaster_send_file(broadcaster_t bc) { - const char *me = "host0"; /* FIXME: hardcoded*/ /*MSG_host_get_name(MSG_host_self());*/ - //msg_comm_t comm = NULL; + const char* me = MSG_host_get_name(MSG_host_self()); msg_task_t task = NULL; bc->current_piece = 0; @@ -101,7 +98,7 @@ static void broadcaster_destroy(broadcaster_t bc) /* Destroy iterator and hostlist */ xbt_dynar_iterator_delete(bc->it); xbt_dynar_free(&bc->pending_sends); - xbt_dynar_free(&bc->host_list); /* FIXME: host names are not free'd */ + xbt_dynar_free(&bc->host_list); xbt_free(bc); } diff --git a/examples/msg/app-chainsend/iterator.c b/examples/msg/app-chainsend/iterator.c index 2d0eccc271..e36ab5dab1 100644 --- a/examples/msg/app-chainsend/iterator.c +++ b/examples/msg/app-chainsend/iterator.c @@ -17,7 +17,7 @@ xbt_dynar_iterator_t xbt_dynar_iterator_new(xbt_dynar_t list, xbt_dynar_t (*crit it->list = list; it->length = xbt_dynar_length(list); - it->indices_list = criteria_fn(it->length); //xbt_dynar_new(sizeof(int), NULL); + it->indices_list = criteria_fn(it->length); // Creates and fills a dynar of int it->criteria_fn = criteria_fn; it->current = 0; @@ -46,8 +46,7 @@ void xbt_dynar_iterator_delete(xbt_dynar_iterator_t it) xbt_dynar_t forward_indices_list(int size) { xbt_dynar_t indices_list = xbt_dynar_new(sizeof(int), NULL); - int i; - for (i = 0; i < size; i++) + for (int i = 0; i < size; i++) xbt_dynar_push_as(indices_list, int, i); return indices_list; } diff --git a/examples/msg/app-masterworker/app-masterworker-multicore_d.xml b/examples/msg/app-masterworker/app-masterworker-multicore_d.xml index e8ce4f9a26..cf8c0eb226 100644 --- a/examples/msg/app-masterworker/app-masterworker-multicore_d.xml +++ b/examples/msg/app-masterworker/app-masterworker-multicore_d.xml @@ -1,30 +1,30 @@ - - - + + + - + - + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/app-masterworker/app-masterworker-vivaldi_d.xml b/examples/msg/app-masterworker/app-masterworker-vivaldi_d.xml index 11d28ff11f..cd7a4f444a 100644 --- a/examples/msg/app-masterworker/app-masterworker-vivaldi_d.xml +++ b/examples/msg/app-masterworker/app-masterworker-vivaldi_d.xml @@ -1,57 +1,57 @@ - - - + + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/app-masterworker/app-masterworker_d.xml b/examples/msg/app-masterworker/app-masterworker_d.xml index 869db93152..feadead6cd 100644 --- a/examples/msg/app-masterworker/app-masterworker_d.xml +++ b/examples/msg/app-masterworker/app-masterworker_d.xml @@ -1,27 +1,27 @@ - - - + + + - + - + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/app-pingpong/app-pingpong_d.xml b/examples/msg/app-pingpong/app-pingpong_d.xml index af7b1e3274..c0fdc23b7d 100644 --- a/examples/msg/app-pingpong/app-pingpong_d.xml +++ b/examples/msg/app-pingpong/app-pingpong_d.xml @@ -1,11 +1,11 @@ - + - + - - + + - + diff --git a/examples/msg/async-wait/async-wait2_d.xml b/examples/msg/async-wait/async-wait2_d.xml index 6e731068cd..1e49112af9 100644 --- a/examples/msg/async-wait/async-wait2_d.xml +++ b/examples/msg/async-wait/async-wait2_d.xml @@ -1,19 +1,19 @@ - - - + + + - + - + - + diff --git a/examples/msg/async-wait/async-wait3_d.xml b/examples/msg/async-wait/async-wait3_d.xml index 27c1d209fb..f1ef12d94e 100644 --- a/examples/msg/async-wait/async-wait3_d.xml +++ b/examples/msg/async-wait/async-wait3_d.xml @@ -1,19 +1,19 @@ - - - + + + - + - + - + diff --git a/examples/msg/async-wait/async-wait4_d.xml b/examples/msg/async-wait/async-wait4_d.xml index 939d62e426..84ca7e6a15 100644 --- a/examples/msg/async-wait/async-wait4_d.xml +++ b/examples/msg/async-wait/async-wait4_d.xml @@ -1,20 +1,20 @@ - - - + + + - + - + - + diff --git a/examples/msg/async-wait/async-wait_d.xml b/examples/msg/async-wait/async-wait_d.xml index f72618e9ce..e385572019 100644 --- a/examples/msg/async-wait/async-wait_d.xml +++ b/examples/msg/async-wait/async-wait_d.xml @@ -1,19 +1,19 @@ - - - + + + - + - + - + diff --git a/examples/msg/async-waitall/async-waitall_d.xml b/examples/msg/async-waitall/async-waitall_d.xml index 51f03d1590..6f122c2988 100644 --- a/examples/msg/async-waitall/async-waitall_d.xml +++ b/examples/msg/async-waitall/async-waitall_d.xml @@ -1,15 +1,15 @@ - - - + + + - + - + - + diff --git a/examples/msg/async-waitany/async-waitany_d.xml b/examples/msg/async-waitany/async-waitany_d.xml index 1972e413cf..2e680c4c3f 100644 --- a/examples/msg/async-waitany/async-waitany_d.xml +++ b/examples/msg/async-waitany/async-waitany_d.xml @@ -1,21 +1,21 @@ - - - + + + - + - + - - + + - + diff --git a/examples/msg/async-yield/async-yield_d.xml b/examples/msg/async-yield/async-yield_d.xml index 0b1b17a4f4..b1ab776f57 100644 --- a/examples/msg/async-yield/async-yield_d.xml +++ b/examples/msg/async-yield/async-yield_d.xml @@ -1,10 +1,10 @@ - - + + - - + + - + diff --git a/examples/msg/dht-chord/dht-chord_d.xml b/examples/msg/dht-chord/dht-chord_d.xml index f31fb7bc46..b698648349 100644 --- a/examples/msg/dht-chord/dht-chord_d.xml +++ b/examples/msg/dht-chord/dht-chord_d.xml @@ -1,62 +1,62 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/dht-kademlia/dht-kademlia_d.xml b/examples/msg/dht-kademlia/dht-kademlia_d.xml index a63e6c9af6..e199776298 100644 --- a/examples/msg/dht-kademlia/dht-kademlia_d.xml +++ b/examples/msg/dht-kademlia/dht-kademlia_d.xml @@ -1,72 +1,72 @@ - + - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/energy-onoff/platform_onoff.xml b/examples/msg/energy-onoff/platform_onoff.xml index 58be9ca6fd..b0423a987a 100644 --- a/examples/msg/energy-onoff/platform_onoff.xml +++ b/examples/msg/energy-onoff/platform_onoff.xml @@ -1,7 +1,7 @@ - - + + @@ -40,5 +40,5 @@ - +
diff --git a/examples/msg/io-remote/io-remote_d.xml b/examples/msg/io-remote/io-remote_d.xml index 0bda8f8e30..838ab3d3ea 100644 --- a/examples/msg/io-remote/io-remote_d.xml +++ b/examples/msg/io-remote/io-remote_d.xml @@ -1,24 +1,24 @@ - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/mc/CMakeLists.txt b/examples/msg/mc/CMakeLists.txt index d6e288b686..2c16afb622 100644 --- a/examples/msg/mc/CMakeLists.txt +++ b/examples/msg/mc/CMakeLists.txt @@ -1,5 +1,5 @@ foreach (x bugged1 bugged2 bugged3 centralized_mutex electric_fence bugged1_liveness bugged2_liveness) - if(HAVE_MC) + if(SIMGRID_HAVE_MC) add_executable (${x} ${x}.c) target_link_libraries(${x} simgrid) endif() @@ -7,7 +7,7 @@ foreach (x bugged1 bugged2 bugged3 centralized_mutex electric_fence bugged1_live set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/deploy_${x}.xml) endforeach() -if(HAVE_MC) +if(SIMGRID_HAVE_MC) if(HAVE_C_STACK_CLEANER) add_executable (bugged1_liveness_cleaner_on bugged1_liveness.c) target_link_libraries(bugged1_liveness_cleaner_on simgrid) diff --git a/examples/msg/mc/deploy_bugged1.xml b/examples/msg/mc/deploy_bugged1.xml index 4333fd73a9..1f4b2a7c4b 100644 --- a/examples/msg/mc/deploy_bugged1.xml +++ b/examples/msg/mc/deploy_bugged1.xml @@ -1,16 +1,16 @@ - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/mc/deploy_bugged1_liveness.xml b/examples/msg/mc/deploy_bugged1_liveness.xml index 08b755e74e..3d6b31c5e4 100644 --- a/examples/msg/mc/deploy_bugged1_liveness.xml +++ b/examples/msg/mc/deploy_bugged1_liveness.xml @@ -1,11 +1,11 @@ - - - + + + - - + + - + diff --git a/examples/msg/mc/deploy_bugged1_liveness_visited.xml b/examples/msg/mc/deploy_bugged1_liveness_visited.xml index 911865f386..af31561c40 100644 --- a/examples/msg/mc/deploy_bugged1_liveness_visited.xml +++ b/examples/msg/mc/deploy_bugged1_liveness_visited.xml @@ -1,11 +1,11 @@ - - - + + + - - + + - + diff --git a/examples/msg/mc/deploy_bugged2.xml b/examples/msg/mc/deploy_bugged2.xml index c6dbe05b90..c95f94bcf7 100644 --- a/examples/msg/mc/deploy_bugged2.xml +++ b/examples/msg/mc/deploy_bugged2.xml @@ -1,13 +1,13 @@ - - + + - - + + - - + + - + diff --git a/examples/msg/mc/deploy_bugged2_liveness.xml b/examples/msg/mc/deploy_bugged2_liveness.xml index 51ea5bf320..e1b845cd39 100644 --- a/examples/msg/mc/deploy_bugged2_liveness.xml +++ b/examples/msg/mc/deploy_bugged2_liveness.xml @@ -1,11 +1,11 @@ - - - + + + - - + + - + diff --git a/examples/msg/mc/deploy_bugged3.xml b/examples/msg/mc/deploy_bugged3.xml index c6dbe05b90..c95f94bcf7 100644 --- a/examples/msg/mc/deploy_bugged3.xml +++ b/examples/msg/mc/deploy_bugged3.xml @@ -1,13 +1,13 @@ - - + + - - + + - - + + - + diff --git a/examples/msg/mc/deploy_centralized_mutex.xml b/examples/msg/mc/deploy_centralized_mutex.xml index a22bda15f1..89ba1a2de3 100644 --- a/examples/msg/mc/deploy_centralized_mutex.xml +++ b/examples/msg/mc/deploy_centralized_mutex.xml @@ -1,10 +1,10 @@ - - + + - - - - + + + + diff --git a/examples/msg/mc/deploy_electric_fence.xml b/examples/msg/mc/deploy_electric_fence.xml index cf7d227d49..1926770de7 100644 --- a/examples/msg/mc/deploy_electric_fence.xml +++ b/examples/msg/mc/deploy_electric_fence.xml @@ -1,13 +1,13 @@ - - + + - - + + - - + + - + diff --git a/examples/msg/mc/platform.xml b/examples/msg/mc/platform.xml index 3149f5c4bb..29d062c526 100644 --- a/examples/msg/mc/platform.xml +++ b/examples/msg/mc/platform.xml @@ -1,7 +1,7 @@ - - + + @@ -18,5 +18,5 @@ - + diff --git a/examples/msg/network-ns3/3hosts_2links_d.xml b/examples/msg/network-ns3/3hosts_2links_d.xml index a360912ef8..1d7171d069 100644 --- a/examples/msg/network-ns3/3hosts_2links_d.xml +++ b/examples/msg/network-ns3/3hosts_2links_d.xml @@ -1,12 +1,12 @@ - - + + - - + + - + diff --git a/examples/msg/network-ns3/3links-timer_d.xml b/examples/msg/network-ns3/3links-timer_d.xml index c9727c3a7b..cc0e18aa5f 100644 --- a/examples/msg/network-ns3/3links-timer_d.xml +++ b/examples/msg/network-ns3/3links-timer_d.xml @@ -1,44 +1,44 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/network-ns3/3links_d.xml b/examples/msg/network-ns3/3links_d.xml index 9ae01af3ea..2bb2b03c7d 100644 --- a/examples/msg/network-ns3/3links_d.xml +++ b/examples/msg/network-ns3/3links_d.xml @@ -1,28 +1,28 @@ - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/network-ns3/crosstraffic_d.xml b/examples/msg/network-ns3/crosstraffic_d.xml index 91ce4790b8..cc69bd78db 100644 --- a/examples/msg/network-ns3/crosstraffic_d.xml +++ b/examples/msg/network-ns3/crosstraffic_d.xml @@ -1,36 +1,36 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/network-ns3/dogbone_d.xml b/examples/msg/network-ns3/dogbone_d.xml index cf3068b693..150a99ac03 100644 --- a/examples/msg/network-ns3/dogbone_d.xml +++ b/examples/msg/network-ns3/dogbone_d.xml @@ -1,20 +1,20 @@ - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/network-ns3/one_cluster_d.xml b/examples/msg/network-ns3/one_cluster_d.xml index 9eab752e5f..4c0f7bc333 100644 --- a/examples/msg/network-ns3/one_cluster_d.xml +++ b/examples/msg/network-ns3/one_cluster_d.xml @@ -1,12 +1,12 @@ - - + + - - + + - + diff --git a/examples/msg/network-ns3/onelink_d.xml b/examples/msg/network-ns3/onelink_d.xml index 4bc51076f5..2a2d4b299d 100644 --- a/examples/msg/network-ns3/onelink_d.xml +++ b/examples/msg/network-ns3/onelink_d.xml @@ -1,12 +1,12 @@ - - + + - - + + - + diff --git a/examples/msg/network-ns3/two_clusters_d.xml b/examples/msg/network-ns3/two_clusters_d.xml index db540cbbf2..c104b21a4c 100644 --- a/examples/msg/network-ns3/two_clusters_d.xml +++ b/examples/msg/network-ns3/two_clusters_d.xml @@ -1,12 +1,12 @@ - - + + - - + + - + diff --git a/examples/msg/platform-properties/platform-properties.c b/examples/msg/platform-properties/platform-properties.c index 83acf804d2..9e1de6daae 100644 --- a/examples/msg/platform-properties/platform-properties.c +++ b/examples/msg/platform-properties/platform-properties.c @@ -65,11 +65,11 @@ static int david(int argc, char *argv[]) {/* Dump what we have on a remote host static int bob(int argc, char *argv[]) { /* this host also tests the properties of the AS*/ - msg_as_t root = MSG_environment_get_routing_root(); + msg_as_t root = MSG_zone_get_root(); XBT_INFO("== Print the properties of the AS"); - XBT_INFO(" Process property: filename -> %s", MSG_environment_as_get_property_value(root, "filename")); - XBT_INFO(" Process property: date -> %s", MSG_environment_as_get_property_value(root, "date")); - XBT_INFO(" Process property: author -> %s", MSG_environment_as_get_property_value(root, "author")); + XBT_INFO(" Process property: filename -> %s", MSG_zone_get_property_value(root, "filename")); + XBT_INFO(" Process property: date -> %s", MSG_zone_get_property_value(root, "date")); + XBT_INFO(" Process property: author -> %s", MSG_zone_get_property_value(root, "author")); /* Get the property list of current bob process */ xbt_dict_t props = MSG_process_get_properties(MSG_process_self()); diff --git a/examples/msg/platform-properties/platform-properties_d.xml b/examples/msg/platform-properties/platform-properties_d.xml index 98d35908b8..f4c76b92a1 100644 --- a/examples/msg/platform-properties/platform-properties_d.xml +++ b/examples/msg/platform-properties/platform-properties_d.xml @@ -1,10 +1,10 @@ - - - + + + - - - + + + diff --git a/examples/msg/process-startkilltime/baseline_d.xml b/examples/msg/process-startkilltime/baseline_d.xml index bc19db1195..e24ccedf13 100644 --- a/examples/msg/process-startkilltime/baseline_d.xml +++ b/examples/msg/process-startkilltime/baseline_d.xml @@ -1,8 +1,8 @@ - + - + - + diff --git a/examples/msg/process-startkilltime/kill_d.xml b/examples/msg/process-startkilltime/kill_d.xml index a85e3f67a0..6d7d312410 100644 --- a/examples/msg/process-startkilltime/kill_d.xml +++ b/examples/msg/process-startkilltime/kill_d.xml @@ -1,13 +1,13 @@ - - + + - - + + - - + + - + diff --git a/examples/msg/process-startkilltime/start_d.xml b/examples/msg/process-startkilltime/start_d.xml index 6819164ed6..3d6934b178 100644 --- a/examples/msg/process-startkilltime/start_d.xml +++ b/examples/msg/process-startkilltime/start_d.xml @@ -1,22 +1,22 @@ - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/process-startkilltime/start_kill_d.xml b/examples/msg/process-startkilltime/start_kill_d.xml index 318c5fe46a..7292ca2fbb 100644 --- a/examples/msg/process-startkilltime/start_kill_d.xml +++ b/examples/msg/process-startkilltime/start_kill_d.xml @@ -1,22 +1,22 @@ - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/examples/msg/task-priority/task-priority_d.xml b/examples/msg/task-priority/task-priority_d.xml index 3d8f51371b..5d15f2b87f 100644 --- a/examples/msg/task-priority/task-priority_d.xml +++ b/examples/msg/task-priority/task-priority_d.xml @@ -1,12 +1,12 @@ - - + + - - + + - + diff --git a/examples/platforms/bypassASroute.xml b/examples/platforms/bypassASroute.xml index 37b973acee..ea93cd3740 100644 --- a/examples/platforms/bypassASroute.xml +++ b/examples/platforms/bypassASroute.xml @@ -1,7 +1,7 @@ - - + + @@ -12,21 +12,21 @@ - + - - + + - - + + - + - + diff --git a/examples/platforms/bypassRoute.xml b/examples/platforms/bypassRoute.xml index 4b99bccaf7..072fe3a956 100644 --- a/examples/platforms/bypassRoute.xml +++ b/examples/platforms/bypassRoute.xml @@ -1,17 +1,17 @@ - - - + + + - + - + @@ -60,12 +60,12 @@ - + - + - - + + diff --git a/examples/platforms/cloud.xml b/examples/platforms/cloud.xml index fe0774bd8c..82672eaf46 100644 --- a/examples/platforms/cloud.xml +++ b/examples/platforms/cloud.xml @@ -1,8 +1,8 @@ - - - + + + @@ -18,7 +18,7 @@ - + @@ -39,51 +39,51 @@ - + - - - + - - + - - - + + + - - + - - + - - + - - + - - + - - + + - + @@ -108,7 +108,7 @@ - + @@ -130,137 +130,137 @@ - + - - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + - - + + - + @@ -278,7 +278,7 @@ - + @@ -299,73 +299,73 @@ - + - - - + - - + - - + - - + - - + - + - - + - - + - - + - - + - - + - - + - - + - - + - - - + + + diff --git a/examples/platforms/cluster.xml b/examples/platforms/cluster.xml index db66bf0d8f..628427b129 100644 --- a/examples/platforms/cluster.xml +++ b/examples/platforms/cluster.xml @@ -1,6 +1,6 @@ - + - + - + diff --git a/examples/platforms/cluster_no_backbone.xml b/examples/platforms/cluster_no_backbone.xml index 249f7ccb4e..c3acb30446 100644 --- a/examples/platforms/cluster_no_backbone.xml +++ b/examples/platforms/cluster_no_backbone.xml @@ -1,6 +1,6 @@ - + - + - + diff --git a/examples/platforms/cluster_torus.xml b/examples/platforms/cluster_torus.xml index 8fb7a06794..1f9c8c0960 100644 --- a/examples/platforms/cluster_torus.xml +++ b/examples/platforms/cluster_torus.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/examples/platforms/config.xml b/examples/platforms/config.xml index fe25716dfc..3bd41a531f 100644 --- a/examples/platforms/config.xml +++ b/examples/platforms/config.xml @@ -1,6 +1,6 @@ - + @@ -10,7 +10,7 @@ - + @@ -23,5 +23,5 @@ - + diff --git a/examples/platforms/config_tracing.xml b/examples/platforms/config_tracing.xml index 84fa6bc8ea..38b306b636 100644 --- a/examples/platforms/config_tracing.xml +++ b/examples/platforms/config_tracing.xml @@ -1,6 +1,6 @@ - + @@ -11,7 +11,7 @@ - + @@ -117,5 +117,5 @@ - + diff --git a/examples/platforms/crosstraffic.xml b/examples/platforms/crosstraffic.xml index 50c09d22dd..dedcff8ab0 100644 --- a/examples/platforms/crosstraffic.xml +++ b/examples/platforms/crosstraffic.xml @@ -1,11 +1,11 @@ - + - + @@ -17,5 +17,5 @@ - + diff --git a/examples/platforms/data_center.xml b/examples/platforms/data_center.xml index 807b0a0c8c..95e8167088 100644 --- a/examples/platforms/data_center.xml +++ b/examples/platforms/data_center.xml @@ -1,8 +1,8 @@ - - - + + + - + @@ -41,24 +41,24 @@ - + - - - + - - + - - - + + + diff --git a/examples/platforms/dogbone.xml b/examples/platforms/dogbone.xml index 26a1a9949b..65879331f0 100644 --- a/examples/platforms/dogbone.xml +++ b/examples/platforms/dogbone.xml @@ -1,7 +1,7 @@ - - + + @@ -50,5 +50,5 @@ - + diff --git a/examples/platforms/energy_cluster.xml b/examples/platforms/energy_cluster.xml index 0d15f719f2..680a30e28c 100644 --- a/examples/platforms/energy_cluster.xml +++ b/examples/platforms/energy_cluster.xml @@ -1,6 +1,6 @@ - + diff --git a/examples/platforms/energy_platform.xml b/examples/platforms/energy_platform.xml index d1ca0ff79f..0af3e71fc5 100644 --- a/examples/platforms/energy_platform.xml +++ b/examples/platforms/energy_platform.xml @@ -1,7 +1,7 @@ - - + + @@ -31,5 +31,5 @@ - + diff --git a/examples/platforms/faulty_host.xml b/examples/platforms/faulty_host.xml index bcb382caa9..60dc58aca0 100644 --- a/examples/platforms/faulty_host.xml +++ b/examples/platforms/faulty_host.xml @@ -1,9 +1,9 @@ - - + + - + diff --git a/examples/platforms/g5k.xml b/examples/platforms/g5k.xml index 9a8ae89758..234b305cfe 100644 --- a/examples/platforms/g5k.xml +++ b/examples/platforms/g5k.xml @@ -1,5 +1,6 @@ + - - - + + @@ -63,8 +63,8 @@ - - + + @@ -74,36 +74,36 @@ - + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + @@ -113,36 +113,36 @@ - + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + @@ -155,174 +155,174 @@ - + - + - + - - + + - - + + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - + - + - + - + - - + + - - + + - - + + - + - + - + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + - + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - + - + - + - - + + - - + + - - + + @@ -335,235 +335,235 @@ - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - + - + - + - - + + - - + + - + @@ -576,51 +576,51 @@ - + - + - + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - - + + - + @@ -630,86 +630,86 @@ - + - + - + - - + + - - + + - + - + - - + + - - + + - - + + - + - + - + - + - + - + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/examples/platforms/griffon.xml b/examples/platforms/griffon.xml index 69ac6e4dbc..8aeb17601c 100644 --- a/examples/platforms/griffon.xml +++ b/examples/platforms/griffon.xml @@ -1,7 +1,7 @@ - - + + @@ -14,20 +14,20 @@ - - - + - - + - - + + diff --git a/examples/platforms/meta_cluster.xml b/examples/platforms/meta_cluster.xml index 98d6c228d7..e30ce55d42 100644 --- a/examples/platforms/meta_cluster.xml +++ b/examples/platforms/meta_cluster.xml @@ -1,29 +1,29 @@ - - - + + + - + - + - + - + - - + + diff --git a/examples/platforms/multicore_machine.xml b/examples/platforms/multicore_machine.xml index 93134dc42b..68c0e2178f 100644 --- a/examples/platforms/multicore_machine.xml +++ b/examples/platforms/multicore_machine.xml @@ -1,7 +1,7 @@ - - + + - + diff --git a/examples/platforms/onelink.xml b/examples/platforms/onelink.xml index 2a86803c49..4682e74ce2 100644 --- a/examples/platforms/onelink.xml +++ b/examples/platforms/onelink.xml @@ -1,7 +1,7 @@ - - + + @@ -11,5 +11,5 @@ - + diff --git a/examples/platforms/prop.xml b/examples/platforms/prop.xml index eb22be66fd..fdf39cf84e 100644 --- a/examples/platforms/prop.xml +++ b/examples/platforms/prop.xml @@ -1,21 +1,21 @@ - + - + - - + + - - + + - - + + @@ -24,7 +24,7 @@ - + @@ -44,6 +44,6 @@ - - + + diff --git a/examples/platforms/routing_cluster.xml b/examples/platforms/routing_cluster.xml index a5e242e058..872b303993 100644 --- a/examples/platforms/routing_cluster.xml +++ b/examples/platforms/routing_cluster.xml @@ -1,6 +1,6 @@ - + - - + + @@ -29,9 +29,9 @@ l1_up / / l1_down | l3 l2_up\ \ l2_down l4_up / / l4_down | l6 l5_up\ \ - + - + @@ -48,12 +48,12 @@ l1_up / / l1_down | l3 l2_up\ \ l2_down l4_up / / l4_down | l6 l5_up\ \ - + - + - - + + diff --git a/examples/platforms/routing_none.xml b/examples/platforms/routing_none.xml index 01da662b46..5cd432cccf 100644 --- a/examples/platforms/routing_none.xml +++ b/examples/platforms/routing_none.xml @@ -1,8 +1,8 @@ - + - + @@ -13,5 +13,5 @@ - + diff --git a/examples/platforms/simulacrum_7_hosts.xml b/examples/platforms/simulacrum_7_hosts.xml index 9c4185069c..3887685f76 100644 --- a/examples/platforms/simulacrum_7_hosts.xml +++ b/examples/platforms/simulacrum_7_hosts.xml @@ -1,11 +1,11 @@ - + - + @@ -109,6 +109,6 @@ - + diff --git a/examples/platforms/small_platform.xml b/examples/platforms/small_platform.xml index 0f6c5f50f7..576fa7b8d1 100644 --- a/examples/platforms/small_platform.xml +++ b/examples/platforms/small_platform.xml @@ -1,7 +1,7 @@ - - + + @@ -190,5 +190,5 @@ - + diff --git a/examples/platforms/small_platform_fatpipe.xml b/examples/platforms/small_platform_fatpipe.xml index cf056b5223..6376744eb6 100644 --- a/examples/platforms/small_platform_fatpipe.xml +++ b/examples/platforms/small_platform_fatpipe.xml @@ -1,7 +1,7 @@ - - + + @@ -24,5 +24,5 @@ - + diff --git a/examples/platforms/small_platform_one_link_routes.xml b/examples/platforms/small_platform_one_link_routes.xml index 0be82e2e09..faaad678ee 100644 --- a/examples/platforms/small_platform_one_link_routes.xml +++ b/examples/platforms/small_platform_one_link_routes.xml @@ -1,7 +1,7 @@ - - + + @@ -70,5 +70,5 @@ - + diff --git a/examples/platforms/small_platform_with_failures.xml b/examples/platforms/small_platform_with_failures.xml index 6dc6f93444..a19986ca70 100644 --- a/examples/platforms/small_platform_with_failures.xml +++ b/examples/platforms/small_platform_with_failures.xml @@ -1,7 +1,7 @@ - - + + @@ -66,5 +66,5 @@ - + diff --git a/examples/platforms/small_platform_with_routers.xml b/examples/platforms/small_platform_with_routers.xml index 91f619c3c5..688d71c01b 100644 --- a/examples/platforms/small_platform_with_routers.xml +++ b/examples/platforms/small_platform_with_routers.xml @@ -1,7 +1,7 @@ - - + + @@ -144,5 +144,5 @@ - + diff --git a/examples/platforms/storage/remote_io.xml b/examples/platforms/storage/remote_io.xml index 3caa9db0e7..b654b9cd19 100644 --- a/examples/platforms/storage/remote_io.xml +++ b/examples/platforms/storage/remote_io.xml @@ -1,11 +1,11 @@ - + - + @@ -56,5 +56,5 @@ - + diff --git a/examples/platforms/storage/storage.xml b/examples/platforms/storage/storage.xml index 6372351c88..449438eb81 100644 --- a/examples/platforms/storage/storage.xml +++ b/examples/platforms/storage/storage.xml @@ -1,11 +1,11 @@ - + - + @@ -46,5 +46,5 @@ - + diff --git a/examples/platforms/three_multicore_hosts.xml b/examples/platforms/three_multicore_hosts.xml index cbc9f00ab1..0b237dafbf 100644 --- a/examples/platforms/three_multicore_hosts.xml +++ b/examples/platforms/three_multicore_hosts.xml @@ -1,7 +1,7 @@ - - + + @@ -17,5 +17,5 @@ - + diff --git a/examples/platforms/trace/jupiter_speed.trace b/examples/platforms/trace/jupiter_speed.trace index 8550f51b54..33719c8887 100644 --- a/examples/platforms/trace/jupiter_speed.trace +++ b/examples/platforms/trace/jupiter_speed.trace @@ -1,2 +1,2 @@ -0.0 0.5 -2.0 1.0 \ No newline at end of file +0 0.5 +2 1.0 \ No newline at end of file diff --git a/examples/platforms/trace/jupiter_state.trace b/examples/platforms/trace/jupiter_state.trace index ef3bd0f425..ce9743ca91 100644 --- a/examples/platforms/trace/jupiter_state.trace +++ b/examples/platforms/trace/jupiter_state.trace @@ -1,2 +1,2 @@ -1.0 0 +1 0 2 1 diff --git a/examples/platforms/trace/link1_avail.trace b/examples/platforms/trace/link1_avail.trace index 05142207cc..fd47a867c8 100644 --- a/examples/platforms/trace/link1_avail.trace +++ b/examples/platforms/trace/link1_avail.trace @@ -1,3 +1,3 @@ -PERIODICITY 6.0 -2.0 62500000 -4.0 31250000 +2 62500000 +4 31250000 +LOOPAFTER 6 diff --git a/examples/platforms/trace/linkBandwidth7.bw b/examples/platforms/trace/linkBandwidth7.bw index 34a24c324b..5320d5d753 100644 --- a/examples/platforms/trace/linkBandwidth7.bw +++ b/examples/platforms/trace/linkBandwidth7.bw @@ -1,5 +1,6 @@ -PERIODICITY 8.0 1.007044263744508 6.846527733924368E7 4.199387092709633 1.0335587797993976E8 5.319464737378834 1.0591433767387845E7 7.237437222882919 7.037797434537312E7 +LOOPAFTER 0.76256277712 +# Wait until t=8 diff --git a/examples/platforms/trace/trace_A.txt b/examples/platforms/trace/trace_A.txt index 73f8eb8767..78c04c4973 100644 --- a/examples/platforms/trace/trace_A.txt +++ b/examples/platforms/trace/trace_A.txt @@ -1,4 +1,4 @@ -PERIODICITY 1.0 -0.0 1.0 -11.0 0.5 -20.0 0.9 +0 1.0 +11 0.5 +20 0.9 +LOOPAFTER 1 diff --git a/examples/platforms/trace/trace_A_failure.txt b/examples/platforms/trace/trace_A_failure.txt index 0610bcf50d..417b7c651c 100644 --- a/examples/platforms/trace/trace_A_failure.txt +++ b/examples/platforms/trace/trace_A_failure.txt @@ -1,3 +1,3 @@ -PERIODICITY 10.0 -1.0 -1.0 -2.0 1.0 +1 -1.0 +2 1.0 +LOOPAFTER 8 diff --git a/examples/platforms/trace/trace_B.txt b/examples/platforms/trace/trace_B.txt index e94c2554a2..38da833473 100644 --- a/examples/platforms/trace/trace_B.txt +++ b/examples/platforms/trace/trace_B.txt @@ -1,4 +1,4 @@ -PERIODICITY 10.00 -0.0 1.0 -10.0 0.8 -20.0 0.4 +0 1.0 +10 0.8 +20 0.4 +LOOPAFTER 10 diff --git a/examples/platforms/two_clusters.xml b/examples/platforms/two_clusters.xml index bc8567845a..29ec619177 100644 --- a/examples/platforms/two_clusters.xml +++ b/examples/platforms/two_clusters.xml @@ -1,6 +1,6 @@ - + - + @@ -31,9 +31,9 @@ node-10.acme.org node-19.acme.org --> - - - + + diff --git a/examples/platforms/two_hosts.xml b/examples/platforms/two_hosts.xml index 2aebc985da..b6d03ba236 100644 --- a/examples/platforms/two_hosts.xml +++ b/examples/platforms/two_hosts.xml @@ -1,7 +1,7 @@ - - + + @@ -10,7 +10,7 @@ - + 1.0 0.5 diff --git a/examples/platforms/two_hosts_platform_shared.xml b/examples/platforms/two_hosts_platform_shared.xml index 23e1d82e9f..362f8a8b3e 100644 --- a/examples/platforms/two_hosts_platform_shared.xml +++ b/examples/platforms/two_hosts_platform_shared.xml @@ -1,7 +1,7 @@ - - + + @@ -16,5 +16,5 @@ - + diff --git a/examples/platforms/two_hosts_platform_with_availability.xml b/examples/platforms/two_hosts_platform_with_availability.xml index c9d6e49432..217b7a327f 100644 --- a/examples/platforms/two_hosts_platform_with_availability.xml +++ b/examples/platforms/two_hosts_platform_with_availability.xml @@ -1,12 +1,12 @@ - - + + - + diff --git a/examples/platforms/two_hosts_platform_with_availability_included.xml b/examples/platforms/two_hosts_platform_with_availability_included.xml index 3eb160fff2..b6fc4190f2 100644 --- a/examples/platforms/two_hosts_platform_with_availability_included.xml +++ b/examples/platforms/two_hosts_platform_with_availability_included.xml @@ -1,6 +1,6 @@ - + 0.0 1.0 11.0 0.5 @@ -16,14 +16,14 @@ 20.0 0.4 - + - + diff --git a/examples/platforms/two_peers.xml b/examples/platforms/two_peers.xml index 92ac5d5937..723632668a 100644 --- a/examples/platforms/two_peers.xml +++ b/examples/platforms/two_peers.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/examples/platforms/vivaldi.xml b/examples/platforms/vivaldi.xml index f93727d9e4..2bb79ed12f 100644 --- a/examples/platforms/vivaldi.xml +++ b/examples/platforms/vivaldi.xml @@ -1,7 +1,7 @@ - - + + @@ -42,5 +42,5 @@ - + diff --git a/examples/s4u/actions-comm/s4u_actions-comm_d.xml b/examples/s4u/actions-comm/s4u_actions-comm_d.xml index cce14e3924..4e597fc828 100644 --- a/examples/s4u/actions-comm/s4u_actions-comm_d.xml +++ b/examples/s4u/actions-comm/s4u_actions-comm_d.xml @@ -1,6 +1,6 @@ - - - + + + diff --git a/examples/s4u/actions-comm/s4u_actions-comm_split_d.xml b/examples/s4u/actions-comm/s4u_actions-comm_split_d.xml index a88cf278f0..71d521a212 100644 --- a/examples/s4u/actions-comm/s4u_actions-comm_split_d.xml +++ b/examples/s4u/actions-comm/s4u_actions-comm_split_d.xml @@ -1,14 +1,14 @@ - - - + - - + + - + diff --git a/examples/s4u/actions-storage/s4u_actions-storage_d.xml b/examples/s4u/actions-storage/s4u_actions-storage_d.xml index d2eb6821bc..3f52ae60c1 100644 --- a/examples/s4u/actions-storage/s4u_actions-storage_d.xml +++ b/examples/s4u/actions-storage/s4u_actions-storage_d.xml @@ -1,5 +1,5 @@ - - + + diff --git a/examples/s4u/actor-create/s4u_actor-create_d.xml b/examples/s4u/actor-create/s4u_actor-create_d.xml index 6cdc3da1da..11e719b75b 100644 --- a/examples/s4u/actor-create/s4u_actor-create_d.xml +++ b/examples/s4u/actor-create/s4u_actor-create_d.xml @@ -1,6 +1,6 @@ - + - + - + diff --git a/examples/s4u/app-masterworker/s4u_app-masterworker_d.xml b/examples/s4u/app-masterworker/s4u_app-masterworker_d.xml index 869db93152..feadead6cd 100644 --- a/examples/s4u/app-masterworker/s4u_app-masterworker_d.xml +++ b/examples/s4u/app-masterworker/s4u_app-masterworker_d.xml @@ -1,27 +1,27 @@ - - - + + + - + - + - - + + - - + + - - + + - - + + - + diff --git a/examples/s4u/dht-chord/s4u_dht-chord_d.xml b/examples/s4u/dht-chord/s4u_dht-chord_d.xml index 26e2b17397..d2af449509 100644 --- a/examples/s4u/dht-chord/s4u_dht-chord_d.xml +++ b/examples/s4u/dht-chord/s4u_dht-chord_d.xml @@ -1,44 +1,44 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - \ No newline at end of file + + diff --git a/examples/simdag/availability/sd_availability.tesh b/examples/simdag/availability/sd_availability.tesh index 279f364326..4d667c6dff 100644 --- a/examples/simdag/availability/sd_availability.tesh +++ b/examples/simdag/availability/sd_availability.tesh @@ -28,7 +28,7 @@ $ $SG_TEST_EXENV ${bindir:=.}/availability/sd_availability ${srcdir:=.}/../platf > [9.000400] [sd_avail/INFO] Jupiter: speed=25000000 > [9.000400] [sd_avail/INFO] Tremblay: speed=25000000 > [9.000400] [sd_avail/INFO] Task 'c3' start time: 8.000300, finish time: 9.000400 -> [10.000800] [sd_avail/INFO] link1: bw=62500000, lat=0.000100 -> [10.000800] [sd_avail/INFO] Jupiter: speed=25000000 -> [10.000800] [sd_avail/INFO] Tremblay: speed=12500000 -> [10.000800] [sd_avail/INFO] Task 't4' start time: 9.000400, finish time: 10.000800 +> [10.000400] [sd_avail/INFO] link1: bw=31250000, lat=0.000100 +> [10.000400] [sd_avail/INFO] Jupiter: speed=25000000 +> [10.000400] [sd_avail/INFO] Tremblay: speed=25000000 +> [10.000400] [sd_avail/INFO] Task 't4' start time: 9.000400, finish time: 10.000400 diff --git a/examples/simdag/scheduling/sd_scheduling.c b/examples/simdag/scheduling/sd_scheduling.c index 0dcf2877be..a949e7319c 100644 --- a/examples/simdag/scheduling/sd_scheduling.c +++ b/examples/simdag/scheduling/sd_scheduling.c @@ -8,7 +8,7 @@ #include #include "simgrid/simdag.h" -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE #include "simgrid/jedule/jedule_sd_binding.h" #endif @@ -231,7 +231,7 @@ int main(int argc, char **argv) XBT_INFO("Simulation Time: %f", SD_get_clock()); XBT_INFO("------------------- Produce the trace file---------------------------"); XBT_INFO("Producing a jedule output (if active) of the run into %s", tracefilename?tracefilename:"minmin_test.jed"); -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE jedule_sd_dump(tracefilename); #endif free(tracefilename); diff --git a/examples/smpi/CMakeLists.txt b/examples/smpi/CMakeLists.txt index 376a992668..ace4e78559 100644 --- a/examples/smpi/CMakeLists.txt +++ b/examples/smpi/CMakeLists.txt @@ -15,7 +15,7 @@ if(enable_smpi) foreach(x bugged1 bugged2 bugged1_liveness only_send_deterministic mutual_exclusion non_termination1 non_termination2 non_termination3 non_termination4) - if(HAVE_MC) + if(SIMGRID_HAVE_MC) add_executable (smpi_${x} ${CMAKE_CURRENT_SOURCE_DIR}/mc/${x}.c) target_link_libraries(smpi_${x} simgrid) set_target_properties(smpi_${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/mc) @@ -55,7 +55,7 @@ set(txt_files ${txt_files} ${CMAKE_CURRENT_SOURCE_DIR}/replay/actions0.t ${CMAKE_CURRENT_SOURCE_DIR}/replay/split_traces PARENT_SCOPE) if(enable_smpi) - if(HAVE_MC) + if(SIMGRID_HAVE_MC) ADD_TESH(smpi-mc-only-send-determinism --setenv srcdir=${CMAKE_HOME_DIRECTORY}/examples/smpi/mc --cd ${CMAKE_BINARY_DIR}/examples/smpi/mc ${CMAKE_HOME_DIRECTORY}/examples/smpi/mc/only_send_deterministic.tesh) endif() diff --git a/examples/smpi/replay_multiple/generate_multiple_deployment.sh b/examples/smpi/replay_multiple/generate_multiple_deployment.sh index 58e2a0ea9b..e454081f3f 100755 --- a/examples/smpi/replay_multiple/generate_multiple_deployment.sh +++ b/examples/smpi/replay_multiple/generate_multiple_deployment.sh @@ -114,7 +114,7 @@ APPLICATIONTMP=$(echo ${PROC_ARGS}|cut -d' ' -f2 -s) cat > ${APPLICATIONTMP} < - + APPLICATIONHEAD ##---- cache hostnames of hostfile--------------- @@ -168,7 +168,7 @@ if [ -n "${DESCRIPTIONFILE}" ] && [ -f "${DESCRIPTIONFILE}" ]; then ## hostfile has less than i lines. ##---------------------------------------------------------- -##---- generate tags------------------------------ +##---- generate tags------------------------------ do if [ -n "${HOSTFILE}" ]; then j=$(( ${NUMPROCS} % ${NUMHOSTS} +1)) @@ -180,13 +180,13 @@ if [ -n "${DESCRIPTIONFILE}" ] && [ -f "${DESCRIPTIONFILE}" ]; then host="${hostname}" fi - echo " " >> ${APPLICATIONTMP} + echo " " >> ${APPLICATIONTMP} echo " " >> ${APPLICATIONTMP} echo " " >> ${APPLICATIONTMP} echo " " >> ${APPLICATIONTMP} echo " " >> ${APPLICATIONTMP} - echo " " >> ${APPLICATIONTMP} + echo " " >> ${APPLICATIONTMP} NUMPROCS=$(( ${NUMPROCS} +1)) done # return IFS back to newline for "for" loop diff --git a/examples/smpi/smpi_msg_masterslave/deployment_masterslave_mailbox_smpi.xml b/examples/smpi/smpi_msg_masterslave/deployment_masterslave_mailbox_smpi.xml index e879f74557..75266f9df7 100644 --- a/examples/smpi/smpi_msg_masterslave/deployment_masterslave_mailbox_smpi.xml +++ b/examples/smpi/smpi_msg_masterslave/deployment_masterslave_mailbox_smpi.xml @@ -1,39 +1,39 @@ - - - + + + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - + diff --git a/include/simgrid/forward.h b/include/simgrid/forward.h index 6f81a81c91..628f1e5e7d 100644 --- a/include/simgrid/forward.h +++ b/include/simgrid/forward.h @@ -97,8 +97,8 @@ typedef enum { } e_surf_trace_connect_kind_t; typedef enum { - SURF_PROCESS_ON_FAILURE_DIE = 1, - SURF_PROCESS_ON_FAILURE_RESTART = 0 + SURF_ACTOR_ON_FAILURE_DIE = 1, + SURF_ACTOR_ON_FAILURE_RESTART = 0 } e_surf_process_on_failure_t; diff --git a/include/simgrid/jedule/jedule.hpp b/include/simgrid/jedule/jedule.hpp index 8d7fd7bee8..43387f2ebb 100644 --- a/include/simgrid/jedule/jedule.hpp +++ b/include/simgrid/jedule/jedule.hpp @@ -12,7 +12,7 @@ #include "jedule_events.hpp" #include "jedule_platform.hpp" -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE XBT_ATTRIB_UNUSED static std::unordered_map host2_simgrid_parent_container; XBT_ATTRIB_UNUSED static std::unordered_map container_name2container; diff --git a/include/simgrid/jedule/jedule_events.hpp b/include/simgrid/jedule/jedule_events.hpp index 0cf00dbfa9..aa1609959d 100644 --- a/include/simgrid/jedule/jedule_events.hpp +++ b/include/simgrid/jedule/jedule_events.hpp @@ -15,7 +15,7 @@ #include "jedule_platform.hpp" -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE namespace simgrid { namespace jedule{ diff --git a/include/simgrid/jedule/jedule_platform.hpp b/include/simgrid/jedule/jedule_platform.hpp index 195ca918ee..caaf67225b 100644 --- a/include/simgrid/jedule/jedule_platform.hpp +++ b/include/simgrid/jedule/jedule_platform.hpp @@ -13,7 +13,7 @@ #include #include #include -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE namespace simgrid { namespace jedule{ diff --git a/include/simgrid/jedule/jedule_sd_binding.h b/include/simgrid/jedule/jedule_sd_binding.h index 9a494b7ed7..909ad6caec 100644 --- a/include/simgrid/jedule/jedule_sd_binding.h +++ b/include/simgrid/jedule/jedule_sd_binding.h @@ -10,7 +10,7 @@ #include "simgrid_config.h" #include "simgrid/simdag.h" -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE SG_BEGIN_DECL() XBT_PUBLIC(void) jedule_log_sd_event(SD_task_t task); XBT_PUBLIC(void) jedule_sd_init(void); diff --git a/include/simgrid/modelchecker.h b/include/simgrid/modelchecker.h index a09795351b..0b920bb913 100644 --- a/include/simgrid/modelchecker.h +++ b/include/simgrid/modelchecker.h @@ -16,8 +16,9 @@ #define SIMGRID_MODELCHECKER_H #include +#include /* size_t */ -#include /* HAVE_MC ? */ +#include /* SIMGRID_HAVE_MC ? */ #include @@ -25,7 +26,7 @@ SG_BEGIN_DECL() XBT_PUBLIC(int) MC_random(int min, int max); -#if HAVE_MC +#if SIMGRID_HAVE_MC /* Internal variable used to check if we're running under the MC * diff --git a/include/simgrid/msg.h b/include/simgrid/msg.h index df2c744413..a96060d6c2 100644 --- a/include/simgrid/msg.h +++ b/include/simgrid/msg.h @@ -176,14 +176,48 @@ XBT_PUBLIC(void) MSG_set_function(const char *host_id, XBT_PUBLIC(double) MSG_get_clock(); XBT_PUBLIC(unsigned long int) MSG_get_sent_msg(); -/************************** Environment ***********************************/ -XBT_PUBLIC(msg_netzone_t) MSG_environment_get_routing_root(); -XBT_PUBLIC(const char*) MSG_environment_as_get_name(msg_netzone_t as); -XBT_PUBLIC(msg_netzone_t) MSG_environment_as_get_by_name(const char* name); -XBT_PUBLIC(xbt_dict_t) MSG_environment_as_get_routing_sons(msg_netzone_t as); -XBT_PUBLIC(const char*) MSG_environment_as_get_property_value(msg_netzone_t as, const char* name); -XBT_PUBLIC(void) MSG_environment_as_set_property_value(msg_netzone_t netzone, const char* name, char* value); -XBT_PUBLIC(xbt_dynar_t) MSG_environment_as_get_hosts(msg_netzone_t as); +/************************** Net Zones ***********************************/ +XBT_PUBLIC(msg_netzone_t) MSG_zone_get_root(); +XBT_PUBLIC(const char*) MSG_zone_get_name(msg_netzone_t zone); +XBT_PUBLIC(msg_netzone_t) MSG_zone_get_by_name(const char* name); +XBT_PUBLIC(void) MSG_zone_get_sons(msg_netzone_t zone, xbt_dict_t whereto); +XBT_PUBLIC(const char*) MSG_zone_get_property_value(msg_netzone_t as, const char* name); +XBT_PUBLIC(void) MSG_zone_set_property_value(msg_netzone_t netzone, const char* name, char* value); +XBT_PUBLIC(void) MSG_zone_get_hosts(msg_netzone_t zone, xbt_dynar_t whereto); + +/* Deprecated forms of the previous functions */ +static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_root since v3.16") + msg_netzone_t MSG_environment_get_routing_root() { + return MSG_zone_get_root(); +} +static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_name since v3.16") + const char* MSG_environment_as_get_name(msg_netzone_t zone) { + return MSG_zone_get_name(zone); +} +static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_by_name since v3.16") + msg_netzone_t MSG_environment_as_get_by_name(const char* name) { + return MSG_zone_get_by_name(name); +} +static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_sons since v3.16") + xbt_dict_t MSG_environment_as_get_routing_sons(msg_netzone_t zone) { + xbt_dict_t res = xbt_dict_new_homogeneous(NULL); + MSG_zone_get_sons(zone, res); + return res; +} +static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_property_value since v3.16") + const char* MSG_environment_as_get_property_value(msg_netzone_t zone, const char* name) { + return MSG_zone_get_property_value(zone, name); +} +static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_set_property_value since v3.16") + void MSG_environment_as_set_property_value(msg_netzone_t zone, const char* name, char* value) { + MSG_zone_set_property_value(zone, name, value); +} +static inline XBT_ATTRIB_DEPRECATED("Please use MSG_zone_get_hosts since v3.16") + xbt_dynar_t MSG_environment_as_get_hosts(msg_netzone_t zone) { + xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t), NULL); + MSG_zone_get_hosts(zone, res); + return res; +} /************************** File handling ***********************************/ XBT_PUBLIC(sg_size_t) MSG_file_read(msg_file_t fd, sg_size_t size); diff --git a/include/simgrid/s4u.hpp b/include/simgrid/s4u.hpp index b4a1a64859..fe0ec582ac 100644 --- a/include/simgrid/s4u.hpp +++ b/include/simgrid/s4u.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include diff --git a/include/simgrid/s4u/Actor.hpp b/include/simgrid/s4u/Actor.hpp index 24f7437d11..bef7072932 100644 --- a/include/simgrid/s4u/Actor.hpp +++ b/include/simgrid/s4u/Actor.hpp @@ -269,6 +269,10 @@ public: /** Returns the internal implementation of this actor */ simix::ActorImpl* getImpl(); + + /** Retrieve the property value (or nullptr if not set) */ + const char* property(const char* key); + void setProperty(const char* key, const char* value); }; /** @ingroup s4u_api diff --git a/include/simgrid/s4u/Comm.hpp b/include/simgrid/s4u/Comm.hpp index 2a49c55e15..e2db122157 100644 --- a/include/simgrid/s4u/Comm.hpp +++ b/include/simgrid/s4u/Comm.hpp @@ -23,7 +23,7 @@ XBT_PUBLIC_CLASS Comm : public Activity { Comm() : Activity() {} public: - ~Comm() override; + virtual ~Comm() = default; /*! take a range of s4u::Comm* (last excluded) and return when one of them is finished. The return value is an * iterator on the finished Comms. */ diff --git a/include/simgrid/s4u/NetZone.hpp b/include/simgrid/s4u/NetZone.hpp index b3b3c18293..b0accf1e76 100644 --- a/include/simgrid/s4u/NetZone.hpp +++ b/include/simgrid/s4u/NetZone.hpp @@ -40,7 +40,6 @@ protected: explicit NetZone(NetZone * father, const char* name); virtual ~NetZone(); - std::vector hosts_; public: /** @brief Seal your netzone once you're done adding content, and before routing stuff through it */ @@ -49,7 +48,7 @@ public: NetZone* father(); std::vector* children(); // Sub netzones - std::vector* hosts(); // my content as a vector of hosts + void hosts(std::vector * whereto); // retrieve my content as a vector of hosts /** Get the properties assigned to a host */ std::unordered_map* properties(); diff --git a/include/simgrid/simix.h b/include/simgrid/simix.h index e06f54f307..02fdab7357 100644 --- a/include/simgrid/simix.h +++ b/include/simgrid/simix.h @@ -1,5 +1,4 @@ -/* Copyright (c) 2007-2010, 2012-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -53,10 +52,6 @@ typedef struct s_smx_mailbox *smx_mailbox_t; #endif -/**************************** Scalar Values **********************************/ - -typedef union u_smx_scalar u_smx_scalar_t; - /* ******************************** Host ************************************ */ /** @brief Host datatype @ingroup simix_host_management @@ -102,7 +97,6 @@ typedef struct s_smx_file *smx_file_t; /********************************** Storage *************************************/ typedef xbt_dictelm_t smx_storage_t; -typedef struct s_smx_storage_priv *smx_storage_priv_t; /* ****************************** Process *********************************** */ @@ -369,8 +363,6 @@ XBT_PUBLIC(int) simcall_file_seek(smx_file_t fd, sg_offset_t offset, int origin) XBT_PUBLIC(int) simcall_file_move(smx_file_t fd, const char* fullpath); /***************************** Storage **********************************/ XBT_PUBLIC(xbt_dict_t) simcall_storage_get_properties(smx_storage_t storage); -XBT_PUBLIC(const char*) SIMIX_storage_get_name(smx_storage_t storage); - /************************** MC simcalls **********************************/ XBT_PUBLIC(int) simcall_mc_random(int min, int max); diff --git a/include/simgrid_config.h.in b/include/simgrid_config.h.in index f27c4ac75c..f2517b4f3a 100644 --- a/include/simgrid_config.h.in +++ b/include/simgrid_config.h.in @@ -33,14 +33,14 @@ SG_END_DECL() #define SIMGRID_VERSION_STRING "@SIMGRID_VERSION_STRING@" /* Was Jedule compiled in? */ -#cmakedefine01 HAVE_JEDULE +#cmakedefine01 SIMGRID_HAVE_JEDULE /* Was the Lua support compiled in? */ -#cmakedefine01 HAVE_LUA +#cmakedefine01 SIMGRID_HAVE_LUA /* Were mallocators (object pools) compiled in? */ -#cmakedefine01 HAVE_MALLOCATOR +#cmakedefine01 SIMGRID_HAVE_MALLOCATOR /* Was the model-checking compiled in? */ -#cmakedefine01 HAVE_MC +#cmakedefine01 SIMGRID_HAVE_MC /* Was the NS3 support compiled in? */ -#cmakedefine01 HAVE_NS3 +#cmakedefine01 SIMGRID_HAVE_NS3 #endif /* SIMGRID_PUBLIC_CONFIG_H */ diff --git a/include/smpi/mpi.h b/include/smpi/mpi.h index 5021574a10..671d22ec89 100644 --- a/include/smpi/mpi.h +++ b/include/smpi/mpi.h @@ -24,7 +24,7 @@ #define nanosleep(x, y) smpi_nanosleep(x, y) #define clock_gettime(x, y) smpi_clock_gettime(x, y) #endif -#if HAVE_MC +#if SIMGRID_HAVE_MC #undef assert #define assert(x) MC_assert(x) #endif diff --git a/include/smpi/smpi.h b/include/smpi/smpi.h index 47ac1b8642..2b54c71c4e 100644 --- a/include/smpi/smpi.h +++ b/include/smpi/smpi.h @@ -15,7 +15,6 @@ #include #include #include -#include #include #ifdef _WIN32 @@ -844,6 +843,7 @@ XBT_PUBLIC(void) smpi_process_set_user_data(void *); XBT_PUBLIC(void) smpi_execute_flops(double flops); XBT_PUBLIC(void) smpi_execute(double duration); +XBT_PUBLIC(void) smpi_execute_benched(double duration); XBT_PUBLIC(double) smpi_get_host_power_peak_at(int pstate_index); XBT_PUBLIC(double) smpi_get_host_current_power_peak(); diff --git a/include/surf/surf_routing.h b/include/surf/surf_routing.h index ce7ec7afd2..83fa79e6a6 100644 --- a/include/surf/surf_routing.h +++ b/include/surf/surf_routing.h @@ -13,13 +13,9 @@ SG_BEGIN_DECL() // FIXME: this header file should die -XBT_PUBLIC_DATA(int) SIMIX_STORAGE_LEVEL; //Simix storage level - XBT_PUBLIC_DATA(xbt_lib_t) storage_lib; XBT_PUBLIC_DATA(int) ROUTING_STORAGE_LEVEL; //Routing storage level XBT_PUBLIC_DATA(int) SURF_STORAGE_LEVEL; // Surf storage level -XBT_PUBLIC_DATA(xbt_lib_t) storage_type_lib; -XBT_PUBLIC_DATA(int) ROUTING_STORAGE_TYPE_LEVEL; //Routing storage_type level SG_END_DECL() diff --git a/include/xbt.h b/include/xbt.h index c30e68523c..9d5510ec9f 100644 --- a/include/xbt.h +++ b/include/xbt.h @@ -19,7 +19,6 @@ #include #include -#include #include #include diff --git a/include/xbt/base.h b/include/xbt/base.h index de8f8ce509..108003c381 100644 --- a/include/xbt/base.h +++ b/include/xbt/base.h @@ -45,9 +45,9 @@ __attribute__((__format__ (__scanf__, format_idx, arg_idx))) #endif -#define XBT_ATTRIB_NORETURN __attribute__((__noreturn__)) -#define XBT_ATTRIB_UNUSED __attribute__((__unused__)) -#define XBT_ATTRIB_DEPRECATED(m) __attribute__((__deprecated__(m))) +#define XBT_ATTRIB_NORETURN __attribute__((noreturn)) +#define XBT_ATTRIB_UNUSED __attribute__((unused)) +#define XBT_ATTRIB_DEPRECATED(m) __attribute__((deprecated(m))) /* Constructor priorities exist since gcc 4.3. Apparently, they are however not * supported on Macs. */ diff --git a/include/xbt/ex.hpp b/include/xbt/ex.hpp index cde2d3e278..efd8eee333 100644 --- a/include/xbt/ex.hpp +++ b/include/xbt/ex.hpp @@ -62,9 +62,8 @@ * @ingroup XBT_ex_c */ struct XBT_PUBLIC() xbt_ex : - public std::runtime_error, - public simgrid::xbt::WithContextException { -public: + std::runtime_error, + simgrid::xbt::WithContextException { xbt_ex() : std::runtime_error("") @@ -80,7 +79,7 @@ public: simgrid::xbt::WithContextException(throwpoint, simgrid::xbt::backtrace()) {} - ~xbt_ex() override; + ~xbt_ex() = default; /** Category (what went wrong) */ xbt_errcat_t category = unknown_error; diff --git a/include/xbt/functional.hpp b/include/xbt/functional.hpp index 7596ef6f1e..10c16bf98a 100644 --- a/include/xbt/functional.hpp +++ b/include/xbt/functional.hpp @@ -39,11 +39,12 @@ public: {} void operator()() const { + char noarg[] = {'\0'}; const int argc = args_->size(); std::vector args = *args_; std::unique_ptr argv(new char*[argc + 1]); for (int i = 0; i != argc; ++i) - argv[i] = args[i].empty() ? const_cast(""): &args[i].front(); + argv[i] = args[i].empty() ? noarg : &args[i].front(); argv[argc] = nullptr; code_(argc, argv.get()); } diff --git a/include/xbt/log.h b/include/xbt/log.h index 3ec9eb4569..a6be428cf5 100644 --- a/include/xbt/log.h +++ b/include/xbt/log.h @@ -321,6 +321,7 @@ XBT_PUBLIC(xbt_log_appender_t) xbt_log_appender2_file_new(char *arg,int roll); /* ********************************** */ /* Functions that you shouldn't call */ /* ********************************** */ +XBT_PUBLIC(void) xbt_log_init(int *argc, char **argv); XBT_PUBLIC(void) _xbt_log_event_log(xbt_log_event_t ev, const char *fmt, ...) XBT_ATTRIB_PRINTF(2, 3); XBT_PUBLIC(int) _xbt_log_cat_init(xbt_log_category_t category, e_xbt_log_priority_t priority); diff --git a/include/xbt/matrix.h b/include/xbt/matrix.h index f6ae73fa0b..6d0d3cbc8b 100644 --- a/include/xbt/matrix.h +++ b/include/xbt/matrix.h @@ -15,7 +15,8 @@ SG_BEGIN_DECL() typedef struct { - unsigned int lines, rows; + unsigned int lines; + unsigned int rows; unsigned long elmsize; char *data; diff --git a/include/xbt/memory.hpp b/include/xbt/memory.hpp deleted file mode 100644 index 3673943d4e..0000000000 --- a/include/xbt/memory.hpp +++ /dev/null @@ -1,18 +0,0 @@ -/* Copyright (c) 2016. The SimGrid Team. - * All rights reserved. */ - -/* 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. */ - -#ifndef SIMGRIX_XBT_MEMORY_HPP -#define SIMGRIX_XBT_MEMORY_HPP - -#include - -namespace simgrid { -namespace xbt { - -} -} - -#endif diff --git a/include/xbt/str.h b/include/xbt/str.h index 78d7b3ba81..0f10bef8d0 100644 --- a/include/xbt/str.h +++ b/include/xbt/str.h @@ -41,7 +41,6 @@ XBT_PUBLIC(char *) xbt_str_join(xbt_dynar_t dynar, const char *sep); XBT_PUBLIC(char *) xbt_str_join_array(const char *const *strs, const char *sep); XBT_PUBLIC(void) xbt_str_subst(char *str, char from, char to, int amount); -XBT_PUBLIC(char *) xbt_str_varsubst(const char *str, xbt_dict_t patterns); XBT_PUBLIC(long int) xbt_str_parse_int(const char* str, const char* error_msg); XBT_PUBLIC(double) xbt_str_parse_double(const char* str, const char* error_msg); diff --git a/include/xbt/strbuff.h b/include/xbt/strbuff.h deleted file mode 100644 index b81e4354df..0000000000 --- a/include/xbt/strbuff.h +++ /dev/null @@ -1,52 +0,0 @@ -/* strbuff -- string buffers */ - -/* Copyright (c) 2007-2011, 2013-2014. The SimGrid Team. - * All rights reserved. */ - -/* 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. */ - -#ifndef XBT_STRBUFF_H -#define XBT_STRBUFF_H - -#include "xbt/sysdep.h" -#include "xbt/function_types.h" -#include "xbt/log.h" -#include "xbt/str.h" -#include "xbt/dict.h" - -SG_BEGIN_DECL() - -/** @defgroup xbt_strbuff String buffers - * @ingroup XBT_adt - * - * This data container is very similar to the Java StringBuffer: - * that's a string to which you can add content with a lesser performance - * penalty than if you recreate a new string from scratch. Once done building - * your string, you must retrieve the content and free its container. - * - * @{ - */ - -/** @brief Buffer data container **/ -typedef struct xbt_strbuff { - char *data; - int used; - int size; -} s_xbt_strbuff_t; -typedef s_xbt_strbuff_t* xbt_strbuff_t; - -XBT_PUBLIC(void) xbt_strbuff_clear(xbt_strbuff_t b); -XBT_PUBLIC(xbt_strbuff_t) xbt_strbuff_new(void); -XBT_PUBLIC(xbt_strbuff_t) xbt_strbuff_new_from(const char *s); -XBT_PUBLIC(void) xbt_strbuff_free(xbt_strbuff_t b); -XBT_PUBLIC(void) xbt_strbuff_free_container(xbt_strbuff_t b); -XBT_PUBLIC(void) xbt_strbuff_append(xbt_strbuff_t b, const char *toadd); -XBT_PUBLIC(void) xbt_strbuff_printf(xbt_strbuff_t b, const char *fmt, ...); -XBT_PUBLIC(void) xbt_strbuff_chomp(xbt_strbuff_t b); -XBT_PUBLIC(void) xbt_strbuff_trim(xbt_strbuff_t b); -XBT_PUBLIC(void) xbt_strbuff_varsubst(xbt_strbuff_t b, xbt_dict_t patterns); - -/** @} */ -SG_END_DECL() -#endif diff --git a/include/xbt/string.hpp b/include/xbt/string.hpp index 0c9221a542..b1638673d9 100644 --- a/include/xbt/string.hpp +++ b/include/xbt/string.hpp @@ -13,7 +13,7 @@ #include #include -#if HAVE_MC +#if SIMGRID_HAVE_MC #include #include @@ -28,7 +28,7 @@ namespace simgrid { namespace xbt { -#if HAVE_MC +#if SIMGRID_HAVE_MC /** POD structure representation of a string */ diff --git a/include/xbt/utility.hpp b/include/xbt/utility.hpp index 09d8db40bf..095130f8a1 100644 --- a/include/xbt/utility.hpp +++ b/include/xbt/utility.hpp @@ -46,7 +46,7 @@ class integer_sequence { namespace bits { template struct make_integer_sequence : - public make_integer_sequence + make_integer_sequence {}; template struct make_integer_sequence { diff --git a/sonar-project.properties b/sonar-project.properties index 6eccae30c4..80b897e860 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -13,7 +13,7 @@ sonar.sources=src,examples,include,teshsuite # Disable some rules on some files -sonar.issue.ignore.multicriteria=j1,jni1,jni2,c1,c2a,c2b,c3,c4a,c4b +sonar.issue.ignore.multicriteria=j1,jni1,jni2,c1,c2a,c2b,c3,c4a,c4b,f1 # The Object.finalize() method should not be overriden # But we need to clean the native memory with JNI @@ -30,6 +30,7 @@ sonar.issue.ignore.multicriteria.jni1.resourceKey=src/bindings/java/*.cpp sonar.issue.ignore.multicriteria.jni2.ruleKey=cpp:S1172 sonar.issue.ignore.multicriteria.jni2.resourceKey=src/bindings/java/*.cpp + # Pointers should not be cast to integral types # But we need that for jMSG, smpi and other places sonar.issue.ignore.multicriteria.c1.ruleKey=cpp:S1767 @@ -55,6 +56,12 @@ sonar.issue.ignore.multicriteria.c4b.ruleKey=cpp:GlobalNamespaceMembers sonar.issue.ignore.multicriteria.c4b.resourceKey=examples/**/*.hpp +# "reinterpret_cast" should not be used +# But we need this to interface C and Fortran +sonar.issue.ignore.multicriteria.f1.ruleKey=cpp:S3630 +sonar.issue.ignore.multicriteria.f1.resourceKey=src/smpi/smpi_f77.cpp + + # Exclude some files from the analysis: # - our unit tests # - the tests that we borrowed elsewhere (MPICH and ISP) diff --git a/src/bindings/java/jmsg.cpp b/src/bindings/java/jmsg.cpp index 265fd61ca5..a677fdaed3 100644 --- a/src/bindings/java/jmsg.cpp +++ b/src/bindings/java/jmsg.cpp @@ -39,7 +39,6 @@ SG_BEGIN_DECL() int JAVA_HOST_LEVEL = -1; -int JAVA_STORAGE_LEVEL = -1; XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(java); @@ -89,13 +88,8 @@ static void __JAVA_host_priv_free(void *host) { } -static void __JAVA_storage_priv_free(void *storage) -{ -} - JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, jobjectArray jargs) { - char **argv = nullptr; int index; int argc = 0; jstring jval; @@ -118,7 +112,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, j argc = static_cast(env->GetArrayLength(jargs)); argc++; - argv = xbt_new(char *, argc + 1); + char** argv = new char*[argc + 1]; argv[0] = xbt_strdup("java"); for (index = 0; index < argc - 1; index++) { @@ -132,14 +126,13 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_init(JNIEnv * env, jclass cls, j MSG_init(&argc, argv); JAVA_HOST_LEVEL = simgrid::s4u::Host::extension_create(__JAVA_host_priv_free); - JAVA_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, __JAVA_storage_priv_free); for (index = 0; index < argc - 1; index++) { env->SetObjectArrayElement(jargs, index, (jstring)env->NewStringUTF(argv[index + 1])); free(argv[index]); } free(argv[argc]); - free(argv); + delete[] argv; } JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass cls) @@ -164,15 +157,8 @@ JNIEXPORT void JNICALL JNICALL Java_org_simgrid_msg_Msg_run(JNIEnv * env, jclass xbt_dynar_free(&hosts); /* Cleanup java storages */ - xbt_dynar_t storages = MSG_storages_as_dynar(); - if(!xbt_dynar_is_empty(storages)){ - for (unsigned long index = 0; index < xbt_dynar_length(storages) - 1; index++) { - jobject jstorage = (jobject) xbt_lib_get_level(xbt_dynar_get_as(storages,index,msg_storage_t), JAVA_STORAGE_LEVEL); - if (jstorage) - jstorage_unref(env, jstorage); - } - } - xbt_dynar_free(&storages); + for (auto elm : java_storage_map) + jstorage_unref(env, elm.second); } JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, jclass cls, jstring jplatformFile) @@ -186,7 +172,7 @@ JNIEXPORT void JNICALL Java_org_simgrid_msg_Msg_createEnvironment(JNIEnv * env, JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Msg_environmentGetRoutingRoot(JNIEnv * env, jclass cls) { - msg_netzone_t as = MSG_environment_get_routing_root(); + msg_netzone_t as = MSG_zone_get_root(); jobject jas = jnetzone_new_instance(env); if (!jas) { jxbt_throw_jni(env, "java As instantiation failed"); diff --git a/src/bindings/java/jmsg.h b/src/bindings/java/jmsg.h index de185402f8..34ba2a24a9 100644 --- a/src/bindings/java/jmsg.h +++ b/src/bindings/java/jmsg.h @@ -7,8 +7,9 @@ #ifndef MSG4JAVA_H #define MSG4JAVA_H -#include #include +#include +#include SG_BEGIN_DECL() @@ -22,7 +23,7 @@ SG_BEGIN_DECL() /* end of eclipse-mandated pimple */ extern int JAVA_HOST_LEVEL; -extern int JAVA_STORAGE_LEVEL; +static std::unordered_map java_storage_map; JavaVM *get_java_VM(); JNIEnv *get_current_thread_env(); diff --git a/src/bindings/java/jmsg_as.cpp b/src/bindings/java/jmsg_as.cpp index 9b4f7bf3ae..09d996d2e2 100644 --- a/src/bindings/java/jmsg_as.cpp +++ b/src/bindings/java/jmsg_as.cpp @@ -106,7 +106,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_As_getProperty(JNIEnv *env, jobje } const char *name = env->GetStringUTFChars(static_cast(jname), 0); - const char *property = MSG_environment_as_get_property_value(as, name); + const char* property = MSG_zone_get_property_value(as, name); if (!property) { return nullptr; } @@ -126,11 +126,13 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jo simgrid::s4u::NetZone* as = jnetzone_get_native(env, jas); jclass cls = jxbt_get_class(env, "org/simgrid/msg/Host"); - std::vector* table = as->hosts(); if (!cls) return nullptr; - jtable = env->NewObjectArray(static_cast(table->size()), cls, nullptr); + std::vector table; + as->hosts(&table); + + jtable = env->NewObjectArray(static_cast(table.size()), cls, nullptr); if (!jtable) { jxbt_throw_jni(env, "Hosts table allocation failed"); @@ -138,7 +140,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_As_getHosts(JNIEnv * env, jo } int index = 0; - for (auto host : *table) { + for (auto host : table) { jhost = static_cast(host->extension(JAVA_HOST_LEVEL)); if (!jhost) { jname = env->NewStringUTF(host->cname()); diff --git a/src/bindings/java/jmsg_host.cpp b/src/bindings/java/jmsg_host.cpp index 7b45e78355..1169dafa1f 100644 --- a/src/bindings/java/jmsg_host.cpp +++ b/src/bindings/java/jmsg_host.cpp @@ -282,7 +282,7 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Host_getAttachedStorage(JNIE jstorage_name = env->NewStringUTF(storage_name); env->SetObjectArrayElement(jtable, index, jstorage_name); } - + xbt_dynar_free_container(&dyn); return jtable; } diff --git a/src/bindings/java/jmsg_storage.cpp b/src/bindings/java/jmsg_storage.cpp index 48e73bc19b..15bd3fe4ed 100644 --- a/src/bindings/java/jmsg_storage.cpp +++ b/src/bindings/java/jmsg_storage.cpp @@ -53,7 +53,7 @@ void jstorage_unref(JNIEnv * env, jobject jstorage) { JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Storage_getByName(JNIEnv * env, jclass cls, jstring jname) { msg_storage_t storage; - jobject jstorage; + jobject jstorage = nullptr; /* get the C string from the java string */ if (jname == nullptr) { @@ -70,8 +70,7 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Storage_getByName(JNIEnv * env, j } env->ReleaseStringUTFChars(jname, name); - if (!xbt_lib_get_level(storage, JAVA_STORAGE_LEVEL)) { /* native host not associated yet with java host */ - + if (java_storage_map.find(storage->key) == java_storage_map.end()) { /* Instantiate a new java storage */ jstorage = jstorage_new_instance(env); @@ -95,11 +94,12 @@ JNIEXPORT jobject JNICALL Java_org_simgrid_msg_Storage_getByName(JNIEnv * env, j /* the native storage data field is set with the global reference to the * java storage returned by this function */ - xbt_lib_set(storage_lib, storage->key, JAVA_STORAGE_LEVEL, (void *) jstorage); - } + java_storage_map.insert({storage->key, jstorage}); + } else + jstorage = java_storage_map.at(storage->key); /* return the global reference to the java storage instance */ - return (jobject) xbt_lib_get_level(storage, JAVA_STORAGE_LEVEL); + return (jobject)jstorage; } JNIEXPORT jlong JNICALL Java_org_simgrid_msg_Storage_getSize(JNIEnv * env,jobject jstorage) { @@ -216,9 +216,9 @@ JNIEXPORT jobjectArray JNICALL Java_org_simgrid_msg_Storage_all(JNIEnv * env, jc for (index = 0; index < count; index++) { storage = xbt_dynar_get_as(table,index,msg_storage_t); - jstorage = (jobject) (xbt_lib_get_level(storage, JAVA_STORAGE_LEVEL)); - - if (!jstorage) { + if (java_storage_map.find(storage->key) != java_storage_map.end()) { + jstorage = java_storage_map.at(storage->key); + } else { jname = env->NewStringUTF(MSG_storage_get_name(storage)); jstorage = Java_org_simgrid_msg_Storage_getByName(env, cls_arg, jname); } diff --git a/src/include/mc/mc.h b/src/include/mc/mc.h index 8ca9c1a63d..3f5864ce2f 100644 --- a/src/include/mc/mc.h +++ b/src/include/mc/mc.h @@ -6,12 +6,8 @@ #ifndef MC_MC_H #define MC_MC_H -#include +#include /* our public interface (and definition of SIMGRID_HAVE_MC) */ #include -#include /* our public interface (and definition of HAVE_MC) */ -#if HAVE_UCONTEXT_H -#include /* context relative declarations */ -#endif /* Maximum size of the application heap. * @@ -66,15 +62,6 @@ XBT_PUBLIC(void) MC_process_clock_add(smx_actor_t, double); XBT_PUBLIC(double) MC_process_clock_get(smx_actor_t); XBT_PRIVATE void MC_automaton_load(const char *file); -/****************************** MC ignore **********************************/ -XBT_PUBLIC(void) MC_ignore_heap(void *address, size_t size); -XBT_PUBLIC(void) MC_remove_ignore_heap(void *address, size_t size); -XBT_PUBLIC(void) MC_ignore_local_variable(const char *var_name, const char *frame); -XBT_PUBLIC(void) MC_ignore_global_variable(const char *var_name); -#if HAVE_UCONTEXT_H -XBT_PUBLIC(void) MC_register_stack_area(void *stack, smx_actor_t process, ucontext_t* context, size_t size); -#endif - /********************************* Memory *************************************/ XBT_PUBLIC(void) MC_memory_init(); /* Initialize the memory subsystem */ XBT_PUBLIC(void) MC_memory_exit(); diff --git a/src/include/surf/surf.h b/src/include/surf/surf.h index 6cf5b49f67..09941a4c09 100644 --- a/src/include/surf/surf.h +++ b/src/include/surf/surf.h @@ -322,6 +322,7 @@ XBT_PUBLIC(xbt_dict_t) surf_storage_action_get_ls_dict(surf_action_t action); * may not exist. */ XBT_PUBLIC(const char * ) surf_storage_get_host(surf_resource_t resource); +XBT_PUBLIC(const char * ) surf_storage_get_name(surf_resource_t resource); /** @} */ diff --git a/src/instr/instr_smpi.h b/src/instr/instr_smpi.h index e0040f7bdb..974d10f272 100644 --- a/src/instr/instr_smpi.h +++ b/src/instr/instr_smpi.h @@ -4,12 +4,41 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #ifndef INSTR_SMPI_H_ -#define INSTR_SMPI_H_ +#define INSTR_SMPI_H_ + #ifdef __cplusplus #include -extern "C" { #endif +#include "smpi/smpi.h" +#include "src/instr/instr_private.h" + +SG_BEGIN_DECL() + +XBT_PRIVATE void TRACE_internal_smpi_set_category(const char* category); +XBT_PRIVATE const char* TRACE_internal_smpi_get_category(); +XBT_PRIVATE void TRACE_smpi_collective_in(int rank, int root, const char* operation, instr_extra_data extra); +XBT_PRIVATE void TRACE_smpi_collective_out(int rank, int root, const char* operation); +XBT_PRIVATE void TRACE_smpi_computing_init(int rank); +XBT_PRIVATE void TRACE_smpi_computing_out(int rank); +XBT_PRIVATE void TRACE_smpi_computing_in(int rank, instr_extra_data extra); +XBT_PRIVATE void TRACE_smpi_sleeping_init(int rank); +XBT_PRIVATE void TRACE_smpi_sleeping_out(int rank); +XBT_PRIVATE void TRACE_smpi_sleeping_in(int rank, instr_extra_data extra); +XBT_PRIVATE void TRACE_smpi_testing_out(int rank); +XBT_PRIVATE void TRACE_smpi_testing_in(int rank, instr_extra_data extra); +XBT_PRIVATE void TRACE_smpi_alloc(); +XBT_PRIVATE void TRACE_smpi_release(); +XBT_PRIVATE void TRACE_smpi_ptp_in(int rank, int src, int dst, const char* operation, instr_extra_data extra); +XBT_PRIVATE void TRACE_smpi_ptp_out(int rank, int src, int dst, const char* operation); +XBT_PRIVATE void TRACE_smpi_send(int rank, int src, int dst, int tag, int size); +XBT_PRIVATE void TRACE_smpi_recv(int rank, int src, int dst, int tag); +XBT_PRIVATE void TRACE_smpi_init(int rank); +XBT_PRIVATE void TRACE_smpi_finalize(int rank); +XBT_PRIVATE char* smpi_container(int rank, char* container, int n); + +XBT_PRIVATE const char* encode_datatype(MPI_Datatype datatype, int* known); + typedef struct smpi_trace_call_location { const char* filename; int linenumber; @@ -25,7 +54,6 @@ typedef struct smpi_trace_call_location { } smpi_trace_call_location_t; -#ifdef __cplusplus -} -#endif +SG_END_DECL() + #endif diff --git a/src/instr/jedule/jedule.cpp b/src/instr/jedule/jedule.cpp index ed3d6e51aa..86dbae5e65 100644 --- a/src/instr/jedule/jedule.cpp +++ b/src/instr/jedule/jedule.cpp @@ -7,7 +7,7 @@ #include "xbt/asserts.h" #include "simgrid/jedule/jedule.hpp" -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE namespace simgrid{ namespace jedule { diff --git a/src/instr/jedule/jedule_events.cpp b/src/instr/jedule/jedule_events.cpp index 1b43029c51..95a591b042 100644 --- a/src/instr/jedule/jedule_events.cpp +++ b/src/instr/jedule/jedule_events.cpp @@ -4,14 +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 "simgrid/jedule/jedule_events.hpp" - #include "simgrid/jedule/jedule.hpp" -#include "simgrid/jedule/jedule_platform.hpp" #include "simgrid/s4u/NetZone.hpp" #include "xbt/asserts.h" -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE namespace simgrid{ namespace jedule{ diff --git a/src/instr/jedule/jedule_platform.cpp b/src/instr/jedule/jedule_platform.cpp index acc3e9b2c2..1bc42afffe 100644 --- a/src/instr/jedule/jedule_platform.cpp +++ b/src/instr/jedule/jedule_platform.cpp @@ -1,17 +1,14 @@ -/* Copyright (c) 2010-2016. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ /* 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 "simgrid/jedule/jedule.hpp" -#include "simgrid/jedule/jedule_platform.hpp" #include "simgrid/s4u/NetZone.hpp" #include "xbt/asserts.h" -#include "xbt/dynar.h" #include -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE namespace simgrid { namespace jedule { @@ -65,7 +62,9 @@ void Container::createHierarchy(sg_netzone_t from_as) if (from_as->children()->empty()) { // I am no AS // add hosts to jedule platform - this->addResources(*from_as->hosts()); + std::vector table; + from_as->hosts(&table); + this->addResources(table); } else { for (auto nz : *from_as->children()) { jed_container_t child_container = new simgrid::jedule::Container(std::string(nz->name())); diff --git a/src/instr/jedule/jedule_sd_binding.cpp b/src/instr/jedule/jedule_sd_binding.cpp index 782bb6e0e8..e22d6a8e6e 100644 --- a/src/instr/jedule/jedule_sd_binding.cpp +++ b/src/instr/jedule/jedule_sd_binding.cpp @@ -3,15 +3,13 @@ /* 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 "simgrid/jedule/jedule_sd_binding.h" - #include "simgrid/jedule/jedule.hpp" #include "src/simdag/simdag_private.hpp" #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/NetZone.hpp" -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE XBT_LOG_NEW_CATEGORY(jedule, "Logging specific to Jedule"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(jed_sd, jedule, "Logging specific to Jedule SD binding"); diff --git a/src/kernel/activity/SynchroComm.hpp b/src/kernel/activity/SynchroComm.hpp index 7a56db936f..b114b2567a 100644 --- a/src/kernel/activity/SynchroComm.hpp +++ b/src/kernel/activity/SynchroComm.hpp @@ -34,7 +34,7 @@ namespace activity { e_smx_comm_type_t type; /* Type of the communication (SIMIX_COMM_SEND or SIMIX_COMM_RECEIVE) */ smx_mailbox_t mbox = nullptr; /* Rendez-vous where the comm is queued */ -#if HAVE_MC +#if SIMGRID_HAVE_MC smx_mailbox_t mbox_cpy = nullptr; /* Copy of the rendez-vous where the comm is queued, MC needs it for DPOR (comm.mbox set to nullptr when the communication is removed from the mailbox (used as garbage collector)) */ diff --git a/src/kernel/context/Context.cpp b/src/kernel/context/Context.cpp index 2288faa8d1..97b19857dc 100644 --- a/src/kernel/context/Context.cpp +++ b/src/kernel/context/Context.cpp @@ -1,21 +1,14 @@ -/* Copyright (c) 2007-2010, 2012-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */ /* 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 -#include - -#include - #include "mc/mc.h" #include "src/kernel/context/Context.hpp" #include "src/simix/smx_private.h" +#include "src/mc/mc_ignore.h" + /** * @brief creates a new context for a user level process @@ -47,7 +40,7 @@ Context* ContextFactory::self() void ContextFactory::declare_context(void* context, std::size_t size) { -#if HAVE_MC +#if SIMGRID_HAVE_MC /* Store the address of the stack in heap to compare it apart of heap comparison */ if(MC_is_active()) MC_ignore_heap(context, size); diff --git a/src/kernel/context/ContextBoost.cpp b/src/kernel/context/ContextBoost.cpp index 051dc6fcda..aa1ce97a55 100644 --- a/src/kernel/context/ContextBoost.cpp +++ b/src/kernel/context/ContextBoost.cpp @@ -86,8 +86,8 @@ BoostContextFactory::~BoostContextFactory() #endif } -smx_context_t BoostContextFactory::create_context(std::function code, - void_pfn_smxprocess_t cleanup_func, smx_actor_t process) +smx_context_t BoostContextFactory::create_context(std::function code, void_pfn_smxprocess_t cleanup_func, + smx_actor_t process) { BoostContext* context = nullptr; if (BoostContext::parallel_) @@ -140,12 +140,11 @@ BoostContext::BoostContext(std::function code, : Context(std::move(code), cleanup_func, process) { - /* if the user provided a function for the process then use it, - otherwise it is the context for maestro */ + /* if the user provided a function for the process then use it, otherwise it is the context for maestro */ if (has_code()) { this->stack_ = SIMIX_context_stack_new(); - // We need to pass the bottom of the stack to make_fcontext, - // depending on the stack direction it may be the lower or higher address: +// We need to pass the bottom of the stack to make_fcontext, depending on the stack direction it may be the lower +// or higher address: #if PTH_STACKGROWTH == -1 void* stack = static_cast(this->stack_) + smx_context_usable_stack_size - 1; #else @@ -191,15 +190,15 @@ void BoostSerialContext::suspend() { /* determine the next context */ BoostSerialContext* next_context = nullptr; - unsigned long int i = process_index_++; + unsigned long int i = process_index_; + process_index_++; if (i < xbt_dynar_length(simix_global->process_to_run)) { /* execute the next process */ XBT_DEBUG("Run next process"); - next_context = static_cast(xbt_dynar_get_as( - simix_global->process_to_run, i, smx_actor_t)->context); - } - else { + next_context = + static_cast(xbt_dynar_get_as(simix_global->process_to_run, i, smx_actor_t)->context); + } else { /* all processes were run, return to maestro */ XBT_DEBUG("No more process to run"); next_context = static_cast(maestro_context_); @@ -230,11 +229,9 @@ void BoostParallelContext::suspend() if (next_work != nullptr) { XBT_DEBUG("Run next process"); next_context = static_cast(next_work->context); - } - else { + } else { XBT_DEBUG("No more processes to run"); - uintptr_t worker_id = - (uintptr_t) xbt_os_thread_get_specific(worker_id_key_); + uintptr_t worker_id = (uintptr_t)xbt_os_thread_get_specific(worker_id_key_); next_context = static_cast(workers_context_[worker_id]); } diff --git a/src/kernel/context/ContextRaw.cpp b/src/kernel/context/ContextRaw.cpp index 8ad2f1116d..5afc40f350 100644 --- a/src/kernel/context/ContextRaw.cpp +++ b/src/kernel/context/ContextRaw.cpp @@ -1,22 +1,15 @@ -/* Copyright (c) 2009-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* 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 - #include "src/internal_config.h" -#include "xbt/log.h" #include "xbt/parmap.h" -#include "xbt/dynar.h" #include "src/simix/smx_private.h" #include "mc/mc.h" +#include "src/mc/mc_ignore.h" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(simix_context); diff --git a/src/kernel/context/ContextUnix.cpp b/src/kernel/context/ContextUnix.cpp index 8c51f67a96..ac2a4b5fbe 100644 --- a/src/kernel/context/ContextUnix.cpp +++ b/src/kernel/context/ContextUnix.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2015. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -7,10 +7,12 @@ #include /* context relative declarations */ -#include "mc/mc.h" #include "src/simix/ActorImpl.hpp" #include "src/simix/smx_private.h" #include "xbt/parmap.h" +#include "mc/mc.h" +#include "src/mc/mc_ignore.h" + /** Many integers are needed to store a pointer * @@ -218,7 +220,7 @@ UContext::UContext(std::function code, sysv_maestro_context = this; } -#if HAVE_MC +#if SIMGRID_HAVE_MC if (MC_is_active() && has_code()) { MC_register_stack_area(this->stack_, process, &(this->uc_), smx_context_usable_stack_size); diff --git a/src/kernel/routing/DijkstraZone.cpp b/src/kernel/routing/DijkstraZone.cpp index d0e07ee1fc..f987ae3820 100644 --- a/src/kernel/routing/DijkstraZone.cpp +++ b/src/kernel/routing/DijkstraZone.cpp @@ -236,11 +236,12 @@ void DijkstraZone::getLocalRoute(NetPoint* src, NetPoint* dst, sg_platf_route_cb } /* compose route path with links */ - NetPoint *gw_src = nullptr; - NetPoint *gw_dst; - NetPoint *prev_gw_src; - NetPoint *first_gw = nullptr; - NetPoint *gw_dst_net_elm = nullptr, *prev_gw_src_net_elm = nullptr; + NetPoint* gw_src = nullptr; + NetPoint* gw_dst; + NetPoint* prev_gw_src; + NetPoint* first_gw = nullptr; + NetPoint* gw_dst_net_elm = nullptr; + NetPoint* prev_gw_src_net_elm = nullptr; for (int v = dst_node_id; v != src_node_id; v = pred_arr[v]) { xbt_node_t node_pred_v = xbt_dynar_get_as(nodes, pred_arr[v], xbt_node_t); diff --git a/src/kernel/routing/DijkstraZone.hpp b/src/kernel/routing/DijkstraZone.hpp index b19cd34155..2e089ede3c 100644 --- a/src/kernel/routing/DijkstraZone.hpp +++ b/src/kernel/routing/DijkstraZone.hpp @@ -11,16 +11,19 @@ typedef struct graph_node_data { int id; int graph_id; /* used for caching internal graph id's */ -} s_graph_node_data_t, *graph_node_data_t; +} s_graph_node_data_t; +typedef s_graph_node_data_t* graph_node_data_t; typedef struct graph_node_map_element { xbt_node_t node; -} s_graph_node_map_element_t, *graph_node_map_element_t; +} s_graph_node_map_element_t; +typedef s_graph_node_map_element_t* graph_node_map_element_t; typedef struct route_cache_element { int* pred_arr; int size; -} s_route_cache_element_t, *route_cache_element_t; +} s_route_cache_element_t; +typedef s_route_cache_element_t* route_cache_element_t; namespace simgrid { namespace kernel { diff --git a/src/kernel/routing/NetZoneImpl.cpp b/src/kernel/routing/NetZoneImpl.cpp index 5a6483624c..4a2dd5479f 100644 --- a/src/kernel/routing/NetZoneImpl.cpp +++ b/src/kernel/routing/NetZoneImpl.cpp @@ -21,8 +21,8 @@ namespace routing { class BypassRoute { public: explicit BypassRoute(NetPoint* gwSrc, NetPoint* gwDst) : gw_src(gwSrc), gw_dst(gwDst) {} - const NetPoint* gw_src; - const NetPoint* gw_dst; + NetPoint* gw_src; + NetPoint* gw_dst; std::vector links; }; @@ -292,14 +292,14 @@ bool NetZoneImpl::getBypassRoute(routing::NetPoint* src, routing::NetPoint* dst, "calls to getRoute", src->cname(), dst->cname(), bypassedRoute->links.size()); if (src != key.first) - getGlobalRoute(src, const_cast(bypassedRoute->gw_src), links, latency); + getGlobalRoute(src, bypassedRoute->gw_src, links, latency); for (surf::LinkImpl* link : bypassedRoute->links) { links->push_back(link); if (latency) *latency += link->latency(); } if (dst != key.second) - getGlobalRoute(const_cast(bypassedRoute->gw_dst), dst, links, latency); + getGlobalRoute(bypassedRoute->gw_dst, dst, links, latency); return true; } XBT_DEBUG("No bypass route from '%s' to '%s'.", src->cname(), dst->cname()); diff --git a/src/mc/checker/CommunicationDeterminismChecker.cpp b/src/mc/checker/CommunicationDeterminismChecker.cpp index f066b6f0df..dde414e196 100644 --- a/src/mc/checker/CommunicationDeterminismChecker.cpp +++ b/src/mc/checker/CommunicationDeterminismChecker.cpp @@ -22,6 +22,8 @@ #include "src/mc/mc_state.h" #include "src/mc/remote/Client.hpp" +#include "src/smpi/smpi_request.hpp" + using simgrid::mc::remote; XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_comm_determinism, mc, diff --git a/src/mc/checker/LivenessChecker.hpp b/src/mc/checker/LivenessChecker.hpp index a428ac8bf1..9b095c1d10 100644 --- a/src/mc/checker/LivenessChecker.hpp +++ b/src/mc/checker/LivenessChecker.hpp @@ -17,7 +17,6 @@ #include #include #include -#include #include "src/mc/mc_state.h" #include "src/mc/checker/Checker.hpp" diff --git a/src/mc/mc_base.cpp b/src/mc/mc_base.cpp index edcf150249..681efc334e 100644 --- a/src/mc/mc_base.cpp +++ b/src/mc/mc_base.cpp @@ -3,47 +3,27 @@ /* 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 -#include -#include - -#include - #include "mc/mc.h" #include "src/mc/mc_base.h" #include "src/mc/mc_replay.h" -#include "src/mc/remote/mc_protocol.h" #include "src/simix/smx_private.h" -#include "src/kernel/activity/ActivityImpl.hpp" -#include "src/kernel/activity/SynchroIo.hpp" -#include "src/kernel/activity/SynchroComm.hpp" -#include "src/kernel/activity/SynchroRaw.hpp" -#include "src/kernel/activity/SynchroSleep.hpp" -#include "src/kernel/activity/SynchroExec.hpp" - -#if HAVE_MC -#include "src/mc/mc_request.h" -#include "src/mc/Process.hpp" +#if SIMGRID_HAVE_MC #include "src/mc/ModelChecker.hpp" -#include "src/mc/mc_smx.h" using simgrid::mc::remote; #endif -XBT_LOG_NEW_CATEGORY(mc, "All MC categories"); +XBT_LOG_NEW_DEFAULT_CATEGORY(mc, "All MC categories"); int MC_random(int min, int max) { -#if HAVE_MC +#if SIMGRID_HAVE_MC xbt_assert(mc_model_checker == nullptr); - /* TODO, if the MC is disabled we do not really need to make a simcall for - * this :) */ #endif + /* TODO, if the MC is disabled we do not really need to make a simcall for this :) */ return simcall_mc_random(min, max); } @@ -52,7 +32,7 @@ namespace mc { void wait_for_requests(void) { -#if HAVE_MC +#if SIMGRID_HAVE_MC xbt_assert(mc_model_checker == nullptr); #endif @@ -68,7 +48,7 @@ void wait_for_requests(void) SIMIX_simcall_handle(req, 0); } } -#if HAVE_MC +#if SIMGRID_HAVE_MC xbt_dynar_reset(simix_global->actors_vector); for (std::pair kv : simix_global->process_list) { xbt_dynar_push_as(simix_global->actors_vector, smx_actor_t, kv.second); @@ -96,18 +76,13 @@ bool request_is_enabled(smx_simcall_t req) case SIMCALL_NONE: return false; - case SIMCALL_SEM_ACQUIRE: - xbt_die("Don't use semaphores in model-checked code, it's not supported yet"); - case SIMCALL_COND_WAIT: - xbt_die("Don't use condition variables in model-checked code, it's not supported yet"); - case SIMCALL_COMM_WAIT: { /* FIXME: check also that src and dst processes are not suspended */ simgrid::kernel::activity::Comm *act = static_cast(simcall_comm_wait__get__comm(req)); -#if HAVE_MC +#if SIMGRID_HAVE_MC // Fetch from MCed memory: // HACK, type puning if (mc_model_checker != nullptr) { @@ -135,7 +110,7 @@ bool request_is_enabled(smx_simcall_t req) simgrid::kernel::activity::Comm *act = static_cast(simcall_comm_wait__get__comm(req)); -#if HAVE_MC +#if SIMGRID_HAVE_MC s_xbt_dynar_t comms_buffer; size_t buffer_size = 0; if (mc_model_checker != nullptr) { @@ -158,7 +133,7 @@ bool request_is_enabled(smx_simcall_t req) #endif for (index = 0; index < comms->used; ++index) { -#if HAVE_MC +#if SIMGRID_HAVE_MC // Fetch act from MCed memory: // HACK, type puning simgrid::mc::Remote temp_comm; @@ -178,7 +153,7 @@ bool request_is_enabled(smx_simcall_t req) case SIMCALL_MUTEX_LOCK: { smx_mutex_t mutex = simcall_mutex_lock__get__mutex(req); -#if HAVE_MC +#if SIMGRID_HAVE_MC simgrid::mc::Remote temp_mutex; if (mc_model_checker != nullptr) { mc_model_checker->process().read(temp_mutex.getBuffer(), remote(mutex)); @@ -188,7 +163,7 @@ bool request_is_enabled(smx_simcall_t req) if(mutex->owner == nullptr) return true; -#if HAVE_MC +#if SIMGRID_HAVE_MC else if (mc_model_checker != nullptr) { simgrid::mc::Process& modelchecked = mc_model_checker->process(); // TODO, *(mutex->owner) :/ @@ -200,9 +175,25 @@ bool request_is_enabled(smx_simcall_t req) return mutex->owner->pid == req->issuer->pid; } - default: - /* The rest of the requests are always enabled */ - return true; + case SIMCALL_SEM_ACQUIRE: { + static int warned = 0; + if (!warned) + XBT_INFO("Using semaphore in model-checked code is still experimental. Use at your own risk"); + warned = 1; + return true; + } + + case SIMCALL_COND_WAIT: { + static int warned = 0; + if (!warned) + XBT_INFO("Using condition variables in model-checked code is still experimental. Use at your own risk"); + warned = 1; + return true; + } + + default: + /* The rest of the requests are always enabled */ + return true; } } diff --git a/src/mc/mc_checkpoint.cpp b/src/mc/mc_checkpoint.cpp index 37169199f7..f1b4c2dcf2 100644 --- a/src/mc/mc_checkpoint.cpp +++ b/src/mc/mc_checkpoint.cpp @@ -17,10 +17,9 @@ #include "src/internal_config.h" #include "src/mc/mc_private.h" -#include "xbt/module.h" -#include -#include #include "src/smpi/private.h" +#include "xbt/mmalloc.h" +#include "xbt/module.h" #include "src/xbt/mmalloc/mmprivate.h" diff --git a/src/mc/mc_config.cpp b/src/mc/mc_config.cpp index 67bebd4e6b..621f502785 100644 --- a/src/mc/mc_config.cpp +++ b/src/mc/mc_config.cpp @@ -13,7 +13,7 @@ #include -#if HAVE_MC +#if SIMGRID_HAVE_MC #include "src/mc/mc_safety.h" #include "src/mc/mc_private.h" #endif @@ -23,7 +23,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_config, mc, "Configuration of MC"); -#if HAVE_MC +#if SIMGRID_HAVE_MC namespace simgrid { namespace mc { /* Configuration support */ @@ -32,7 +32,7 @@ simgrid::mc::ReductionMode reduction_mode = simgrid::mc::ReductionMode::unset; } #endif -#if !HAVE_MC +#if !SIMGRID_HAVE_MC #define _sg_do_model_check 0 #endif @@ -46,7 +46,7 @@ void _mc_cfg_cb_timeout(const char *name) _sg_mc_timeout = xbt_cfg_get_boolean(name); } -#if HAVE_MC +#if SIMGRID_HAVE_MC int _sg_do_model_check = 0; int _sg_do_model_check_record = 0; int _sg_mc_checkpoint = 0; diff --git a/src/mc/mc_global.cpp b/src/mc/mc_global.cpp index 1d4dd5f7c6..b3140e10d9 100644 --- a/src/mc/mc_global.cpp +++ b/src/mc/mc_global.cpp @@ -28,9 +28,10 @@ #include "src/simix/ActorImpl.hpp" -#if HAVE_MC +#if SIMGRID_HAVE_MC #include #include "src/mc/mc_comm_pattern.h" +#include "src/mc/mc_ignore.h" #include "src/mc/mc_request.h" #include "src/mc/mc_safety.h" #include "src/mc/mc_snapshot.h" @@ -55,7 +56,7 @@ std::vector processes_time; } } -#if HAVE_MC +#if SIMGRID_HAVE_MC /* Liveness */ diff --git a/src/mc/mc_ignore.h b/src/mc/mc_ignore.h index b62bfb14c6..cf42fd1114 100644 --- a/src/mc/mc_ignore.h +++ b/src/mc/mc_ignore.h @@ -6,12 +6,25 @@ #ifndef SIMGRID_MC_IGNORE_H #define SIMGRID_MC_IGNORE_H -#include /* SG_BEGIN_DECL */ -#include +#include "src/internal_config.h" +#include "xbt/dynar.h" + +#if HAVE_UCONTEXT_H +#include /* context relative declarations */ +#endif + SG_BEGIN_DECL(); -XBT_PRIVATE xbt_dynar_t MC_checkpoint_ignore_new(void); +XBT_PUBLIC(void) MC_ignore_heap(void *address, size_t size); +XBT_PUBLIC(void) MC_remove_ignore_heap(void *address, size_t size); +XBT_PUBLIC(void) MC_ignore_local_variable(const char *var_name, const char *frame); +XBT_PUBLIC(void) MC_ignore_global_variable(const char *var_name); + +#if HAVE_UCONTEXT_H +XBT_PUBLIC(void) MC_register_stack_area(void *stack, smx_actor_t process, ucontext_t* context, size_t size); +#endif + SG_END_DECL(); diff --git a/src/mc/mc_record.cpp b/src/mc/mc_record.cpp index d2c382c78b..2881f48c28 100644 --- a/src/mc/mc_record.cpp +++ b/src/mc/mc_record.cpp @@ -26,7 +26,7 @@ #include "src/mc/mc_base.h" #include "src/mc/Transition.hpp" -#if HAVE_MC +#if SIMGRID_HAVE_MC #include "src/mc/mc_request.h" #include "src/mc/mc_private.h" #include "src/mc/mc_state.h" @@ -103,7 +103,7 @@ RecordTrace parseRecordTrace(const char* data) return res; } -#if HAVE_MC +#if SIMGRID_HAVE_MC std::string traceToString(simgrid::mc::RecordTrace const& trace) { diff --git a/src/mc/remote/Client.cpp b/src/mc/remote/Client.cpp index 9759c215e6..b4a8aed8ee 100644 --- a/src/mc/remote/Client.cpp +++ b/src/mc/remote/Client.cpp @@ -242,7 +242,7 @@ void Client::declareStack(void* stack, size_t size, smx_actor_t process, ucontex message.type = MC_MESSAGE_STACK_REGION; message.stack_region = region; if (channel_.send(message)) - xbt_die("Coule not send STACK_REGION to model-checker"); + xbt_die("Could not send STACK_REGION to model-checker"); } } } diff --git a/src/mc/remote/Client.hpp b/src/mc/remote/Client.hpp index ead07fe129..79746017b1 100644 --- a/src/mc/remote/Client.hpp +++ b/src/mc/remote/Client.hpp @@ -58,7 +58,7 @@ public: SG_BEGIN_DECL() -#if HAVE_MC +#if SIMGRID_HAVE_MC void MC_ignore(void* addr, std::size_t size); #endif diff --git a/src/msg/instr_msg_task.cpp b/src/msg/instr_msg_task.cpp index 65b69cc8e3..c4236de55a 100644 --- a/src/msg/instr_msg_task.cpp +++ b/src/msg/instr_msg_task.cpp @@ -7,6 +7,7 @@ #include "mc/mc.h" #include "src/instr/instr_private.h" #include "src/msg/msg_private.h" +#include "src/mc/mc_ignore.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_msg, instr, "MSG instrumentation"); diff --git a/src/msg/msg_environment.cpp b/src/msg/msg_environment.cpp index e50abe085f..fc067f7130 100644 --- a/src/msg/msg_environment.cpp +++ b/src/msg/msg_environment.cpp @@ -7,7 +7,7 @@ #include "simgrid/s4u/NetZone.hpp" #include "src/msg/msg_private.h" -#if HAVE_LUA +#if SIMGRID_HAVE_LUA #include #include #include @@ -43,54 +43,49 @@ void MSG_post_create_environment() { /* Initialize MSG storages */ xbt_lib_foreach(storage_lib, cursor, name, data) { - if(data[SIMIX_STORAGE_LEVEL]) - __MSG_storage_create(xbt_dict_cursor_get_elm(cursor)); + __MSG_storage_create(xbt_dict_cursor_get_elm(cursor)); } } -msg_netzone_t MSG_environment_get_routing_root() +msg_netzone_t MSG_zone_get_root() { return simgrid::s4u::Engine::instance()->netRoot(); } -const char* MSG_environment_as_get_name(msg_netzone_t netzone) +const char* MSG_zone_get_name(msg_netzone_t netzone) { return netzone->name(); } -msg_netzone_t MSG_environment_as_get_by_name(const char* name) +msg_netzone_t MSG_zone_get_by_name(const char* name) { return simgrid::s4u::Engine::instance()->netzoneByNameOrNull(name); } -xbt_dict_t MSG_environment_as_get_routing_sons(msg_netzone_t netzone) +void MSG_zone_get_sons(msg_netzone_t netzone, xbt_dict_t whereto) { - xbt_dict_t res = xbt_dict_new_homogeneous(nullptr); for (auto elem : *netzone->children()) { - xbt_dict_set(res, elem->name(), static_cast(elem), nullptr); + xbt_dict_set(whereto, elem->name(), static_cast(elem), nullptr); } - return res; } -const char* MSG_environment_as_get_property_value(msg_netzone_t netzone, const char* name) +const char* MSG_zone_get_property_value(msg_netzone_t netzone, const char* name) { return netzone->property(name); } -void MSG_environment_as_set_property_value(msg_netzone_t netzone, const char* name, char* value) +void MSG_zone_set_property_value(msg_netzone_t netzone, const char* name, char* value) { netzone->setProperty(name, value); } -xbt_dynar_t MSG_environment_as_get_hosts(msg_netzone_t netzone) +void MSG_zone_get_hosts(msg_netzone_t netzone, xbt_dynar_t whereto) { - xbt_dynar_t res = xbt_dynar_new(sizeof(sg_host_t), nullptr); - - for (auto host : *netzone->hosts()) { - xbt_dynar_push(res, &host); - } - - return res; + /* converts vector to dynar */ + std::vector hosts; + netzone->hosts(&hosts); + for (auto host : hosts) + xbt_dynar_push(whereto, &host); } SG_END_DECL() diff --git a/src/msg/msg_global.cpp b/src/msg/msg_global.cpp index 1eefcc5577..a75e536279 100644 --- a/src/msg/msg_global.cpp +++ b/src/msg/msg_global.cpp @@ -9,6 +9,7 @@ #include "instr/instr_interface.h" #include "mc/mc.h" #include "src/msg/msg_private.h" +#include "src/mc/mc_ignore.h" XBT_LOG_NEW_CATEGORY(msg, "All MSG categories"); XBT_LOG_NEW_DEFAULT_SUBCATEGORY(msg_kernel, msg, "Logging specific to MSG (kernel)"); @@ -37,7 +38,7 @@ void MSG_init_nocheck(int *argc, char **argv) { xbt_getpid = &MSG_process_self_PID; if (!msg_global) { - msg_global = xbt_new0(s_MSG_Global_t, 1); + msg_global = new s_MSG_Global_t(); xbt_cfg_register_boolean("msg/debug-multiple-use", "no", _sg_cfg_cb_msg_debug_multiple_use, "Print backtraces of both processes when there is a conflict of multiple use of a task"); @@ -120,7 +121,7 @@ static void MSG_exit() { TRACE_surf_resource_utilization_release(); TRACE_end(); - free(msg_global); + delete msg_global; msg_global = nullptr; } diff --git a/src/msg/msg_io.cpp b/src/msg/msg_io.cpp index 282f46ace7..702e0abc92 100644 --- a/src/msg/msg_io.cpp +++ b/src/msg/msg_io.cpp @@ -118,19 +118,15 @@ sg_size_t MSG_file_read(msg_file_t fd, sg_size_t size) if (strcmp(storage_priv_src->hostname, MSG_host_self()->cname())) { /* the file is hosted on a remote host, initiate a communication between src and dest hosts for data transfer */ XBT_DEBUG("File is on %s remote host, initiate data transfer of %llu bytes.", storage_priv_src->hostname, read_size); - msg_host_t *m_host_list = nullptr; - m_host_list = xbt_new0(msg_host_t, 2); - - m_host_list[0] = MSG_host_self(); - m_host_list[1] = attached_host; - double flops_amount[] = { 0, 0}; - double bytes_amount[] = { 0, 0, static_cast(read_size), 0 }; + msg_host_t m_host_list[] = {MSG_host_self(), attached_host}; + double flops_amount[] = {0, 0}; + double bytes_amount[] = {0, 0, static_cast(read_size), 0}; msg_task_t task = MSG_parallel_task_create("file transfer for read", 2, m_host_list, flops_amount, bytes_amount, nullptr); msg_error_t transfer = MSG_parallel_task_execute(task); MSG_task_destroy(task); - xbt_free(m_host_list); + if(transfer != MSG_OK){ if (transfer == MSG_HOST_FAILURE) XBT_WARN("Transfer error, %s remote host just turned off!", attached_host->cname()); @@ -163,19 +159,15 @@ sg_size_t MSG_file_write(msg_file_t fd, sg_size_t size) if (strcmp(storage_priv_src->hostname, MSG_host_self()->cname())) { /* the file is hosted on a remote host, initiate a communication between src and dest hosts for data transfer */ XBT_DEBUG("File is on %s remote host, initiate data transfer of %llu bytes.", storage_priv_src->hostname, size); - msg_host_t *m_host_list = nullptr; - m_host_list = xbt_new0(msg_host_t, 2); - - m_host_list[0] = MSG_host_self(); - m_host_list[1] = attached_host; - double flops_amount[] = { 0, 0 }; - double bytes_amount[] = { 0, static_cast(size), 0, 0 }; + msg_host_t m_host_list[] = {MSG_host_self(), attached_host}; + double flops_amount[] = {0, 0}; + double bytes_amount[] = {0, static_cast(size), 0, 0}; msg_task_t task = MSG_parallel_task_create("file transfer for write", 2, m_host_list, flops_amount, bytes_amount, nullptr); msg_error_t transfer = MSG_parallel_task_execute(task); MSG_task_destroy(task); - free(m_host_list); + if(transfer != MSG_OK){ if (transfer == MSG_HOST_FAILURE) XBT_WARN("Transfer error, %s remote host just turned off!", attached_host->cname()); @@ -332,14 +324,14 @@ msg_error_t MSG_file_rcopy (msg_file_t file, msg_host_t host, const char* fullpa char *mount_name; char *storage_name; xbt_dict_foreach(storage_list,cursor,mount_name,storage_name){ - char* file_mount_name = static_cast(xbt_malloc ((strlen(mount_name)+1))); - strncpy(file_mount_name,fullpath,strlen(mount_name)+1); + char* file_mount_name = static_cast(xbt_malloc(strlen(mount_name) + 1)); + strncpy(file_mount_name, fullpath, strlen(mount_name) + 1); file_mount_name[strlen(mount_name)] = '\0'; - if(!strcmp(file_mount_name,mount_name) && strlen(mount_name)>longest_prefix_length){ + if (!strcmp(file_mount_name, mount_name) && strlen(mount_name) > longest_prefix_length) { /* The current mount name is found in the full path and is bigger than the previous*/ longest_prefix_length = strlen(mount_name); - storage_dest = (msg_storage_t) xbt_lib_get_elm_or_null(storage_lib, storage_name); + storage_dest = (msg_storage_t)xbt_lib_get_elm_or_null(storage_lib, storage_name); } xbt_free(file_mount_name); } @@ -358,19 +350,15 @@ msg_error_t MSG_file_rcopy (msg_file_t file, msg_host_t host, const char* fullpa XBT_DEBUG("Initiate data transfer of %llu bytes between %s and %s.", read_size, storage_priv_src->hostname, host_name_dest); - msg_host_t *m_host_list = nullptr; - m_host_list = xbt_new0(msg_host_t, 2); - - m_host_list[0] = attached_host; - m_host_list[1] = host_dest; - double flops_amount[] = { 0, 0 }; - double bytes_amount[] = { 0, static_cast(read_size), 0, 0 }; + msg_host_t m_host_list[] = {attached_host, host_dest}; + double flops_amount[] = {0, 0}; + double bytes_amount[] = {0, static_cast(read_size), 0, 0}; msg_task_t task = MSG_parallel_task_create("file transfer for write", 2, m_host_list, flops_amount, bytes_amount, nullptr); msg_error_t transfer = MSG_parallel_task_execute(task); MSG_task_destroy(task); - xbt_free(m_host_list); + if(transfer != MSG_OK){ if (transfer == MSG_HOST_FAILURE) XBT_WARN("Transfer error, %s remote host just turned off!", host_name_dest); @@ -421,7 +409,7 @@ msg_storage_t __MSG_storage_create(smx_storage_t storage) { msg_storage_priv_t storage_private = xbt_new0(s_msg_storage_priv_t, 1); - storage_private->name = SIMIX_storage_get_name(storage); + storage_private->name = surf_storage_get_name(storage); storage_private->hostname = surf_storage_get_host(storage); storage_private->size = surf_storage_get_size(storage); diff --git a/src/plugins/vm/VmHostExt.cpp b/src/plugins/vm/VmHostExt.cpp index 17d3e9ca4e..14d524b9a8 100644 --- a/src/plugins/vm/VmHostExt.cpp +++ b/src/plugins/vm/VmHostExt.cpp @@ -12,9 +12,6 @@ namespace simgrid { namespace vm { simgrid::xbt::Extension VmHostExt::EXTENSION_ID; -VmHostExt::~VmHostExt() -{ -} void VmHostExt::ensureVmExtInstalled() { if (!EXTENSION_ID.valid()) diff --git a/src/plugins/vm/VmHostExt.hpp b/src/plugins/vm/VmHostExt.hpp index 0a0bedbbf8..ee657b03c1 100644 --- a/src/plugins/vm/VmHostExt.hpp +++ b/src/plugins/vm/VmHostExt.hpp @@ -14,7 +14,7 @@ namespace vm { class VmHostExt { public: static simgrid::xbt::Extension EXTENSION_ID; - virtual ~VmHostExt(); + virtual ~VmHostExt() = default; sg_size_t ramsize = 0; /* available ramsize (0= not taken into account) */ bool overcommit = true; /* Whether the host allows overcommiting more VM than the avail ramsize allows */ diff --git a/src/s4u/s4u_actor.cpp b/src/s4u/s4u_actor.cpp index de5b546865..48412257b0 100644 --- a/src/s4u/s4u_actor.cpp +++ b/src/s4u/s4u_actor.cpp @@ -151,6 +151,18 @@ void Actor::killAll(int resetPid) simcall_process_killall(resetPid); } +/** Retrieve the property value (or nullptr if not set) */ +const char* Actor::property(const char* key) +{ + return (char*)xbt_dict_get_or_null(simcall_process_get_properties(pimpl_), key); +} +void Actor::setProperty(const char* key, const char* value) +{ + simgrid::simix::kernelImmediate([this, key, value] { + xbt_dict_set(simcall_process_get_properties(pimpl_), key, (char*)value, (void_f_pvoid_t) nullptr); + }); +} + // ***** this_actor ***** namespace this_actor { diff --git a/src/s4u/s4u_comm.cpp b/src/s4u/s4u_comm.cpp index 5fecc9563d..9ecedf2a27 100644 --- a/src/s4u/s4u_comm.cpp +++ b/src/s4u/s4u_comm.cpp @@ -14,12 +14,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(s4u_comm,s4u_activity,"S4U asynchronous communic namespace simgrid { namespace s4u { -Comm::~Comm() { - -} - - - s4u::Comm &Comm::send_init(s4u::MailboxPtr chan) { s4u::Comm *res = new s4u::Comm(); res->sender_ = SIMIX_process_self(); diff --git a/src/s4u/s4u_netzone.cpp b/src/s4u/s4u_netzone.cpp index 17035d2189..f539136108 100644 --- a/src/s4u/s4u_netzone.cpp +++ b/src/s4u/s4u_netzone.cpp @@ -71,15 +71,13 @@ NetZone* NetZone::father() return father_; } -std::vector* NetZone::hosts() +void NetZone::hosts(std::vector* whereto) { - if (hosts_.empty()) // Lazy initialization - for (auto card : vertices_) { - s4u::Host* host = simgrid::s4u::Host::by_name_or_null(card->name()); - if (host != nullptr) - hosts_.push_back(host); - } - return &hosts_; + for (auto card : vertices_) { + s4u::Host* host = simgrid::s4u::Host::by_name_or_null(card->name()); + if (host != nullptr) + whereto->push_back(host); + } } int NetZone::addComponent(kernel::routing::NetPoint* elm) diff --git a/src/simdag/sd_daxloader.cpp b/src/simdag/sd_daxloader.cpp index 4a83abd776..543cb63ce3 100644 --- a/src/simdag/sd_daxloader.cpp +++ b/src/simdag/sd_daxloader.cpp @@ -237,12 +237,14 @@ xbt_dynar_t SD_daxload(const char *filename) /* If some tasks do not take files as input, connect them to the root * if they don't produce files, connect them to the end node. */ - if ((file != root_task) && file->inputs->empty()) - SD_task_dependency_add(nullptr, nullptr, root_task, file); - if ((file != end_task) && file->outputs->empty()) - SD_task_dependency_add(nullptr, nullptr, file, end_task); + if ((file != root_task) && (file != end_task)) { + if (file->inputs->empty()) + SD_task_dependency_add(nullptr, nullptr, root_task, file); + if (file->outputs->empty()) + SD_task_dependency_add(nullptr, nullptr, file, end_task); + } } else { - THROW_IMPOSSIBLE; + THROW_IMPOSSIBLE; } } diff --git a/src/simdag/sd_global.cpp b/src/simdag/sd_global.cpp index 0248689e97..cb9f44a011 100644 --- a/src/simdag/sd_global.cpp +++ b/src/simdag/sd_global.cpp @@ -201,7 +201,7 @@ void SD_create_environment(const char *platform_file) simgrid::s4u::Engine::instance()->loadPlatform(platform_file); XBT_DEBUG("Host number: %zu, link number: %d", sg_host_count(), sg_link_count()); -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE jedule_sd_init(); #endif XBT_VERB("Starting simulation..."); @@ -247,7 +247,7 @@ double SD_get_clock() { void SD_exit() { TRACE_end(); -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE jedule_sd_exit(); #endif delete sd_global; diff --git a/src/simdag/sd_task.cpp b/src/simdag/sd_task.cpp index 3cf0a0e469..e6ee5cfe75 100644 --- a/src/simdag/sd_task.cpp +++ b/src/simdag/sd_task.cpp @@ -289,7 +289,7 @@ void SD_task_set_state(SD_task_t task, e_SD_task_state_t new_state) task->start_time = task->surf_action->getStartTime(); if (new_state == SD_DONE){ task->finish_time = task->surf_action->getFinishTime(); -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE jedule_log_sd_event(task); #endif } else diff --git a/src/simdag/simdag_private.hpp b/src/simdag/simdag_private.hpp index 9cd87ba8e5..58d88e7bd0 100644 --- a/src/simdag/simdag_private.hpp +++ b/src/simdag/simdag_private.hpp @@ -12,7 +12,7 @@ #ifndef SIMDAG_PRIVATE_HPP #define SIMDAG_PRIVATE_HPP -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE #include "simgrid/jedule/jedule_sd_binding.h" #endif diff --git a/src/simgrid/host.cpp b/src/simgrid/host.cpp index 308a135c9b..919fb94ae1 100644 --- a/src/simgrid/host.cpp +++ b/src/simgrid/host.cpp @@ -236,8 +236,6 @@ double sg_host_route_bandwidth(sg_host_t from, sg_host_t to) void sg_host_dump(sg_host_t host) { xbt_dict_t props; - xbt_dict_cursor_t cursor=nullptr; - char *key,*data; XBT_INFO("Displaying host %s", host->cname()); XBT_INFO(" - speed: %.0f", host->speed()); @@ -246,6 +244,9 @@ void sg_host_dump(sg_host_t host) if (!xbt_dict_is_empty(props)){ XBT_INFO(" - properties:"); + xbt_dict_cursor_t cursor = nullptr; + char* key; + char* data; xbt_dict_foreach(props,cursor,key,data) { XBT_INFO(" %s->%s",key,data); diff --git a/src/simgrid/sg_config.cpp b/src/simgrid/sg_config.cpp index 9b99689e4d..729f1ee11e 100644 --- a/src/simgrid/sg_config.cpp +++ b/src/simgrid/sg_config.cpp @@ -45,7 +45,8 @@ int _sg_cfg_exit_asap = 0; static void sg_config_cmd_line(int *argc, char **argv) { int shall_exit = 0; - int i, j; + int i; + int j; for (j = i = 1; i < *argc; i++) { if (!strncmp(argv[i], "--cfg=", strlen("--cfg="))) { @@ -208,7 +209,7 @@ static void _sg_cfg_cb_model_check_replay(const char *name) { MC_record_path = nullptr; } -#if HAVE_MC +#if SIMGRID_HAVE_MC extern int _sg_do_model_check_record; static void _sg_cfg_cb_model_check_record(const char *name) { _sg_do_model_check_record = xbt_cfg_get_boolean(name); @@ -375,7 +376,7 @@ void sg_config_init(int *argc, char **argv) xbt_cfg_register_string("model-check/replay", nullptr, _sg_cfg_cb_model_check_replay, "Model-check path to replay (as reported by SimGrid when a violation is reported)"); -#if HAVE_MC +#if SIMGRID_HAVE_MC /* do model-checking-record */ xbt_cfg_register_boolean("model-check/record", "no", _sg_cfg_cb_model_check_record, "Record the model-checking paths"); diff --git a/src/simix/ActorImpl.hpp b/src/simix/ActorImpl.hpp index e1ffbdac9f..9b7e47bad6 100644 --- a/src/simix/ActorImpl.hpp +++ b/src/simix/ActorImpl.hpp @@ -14,7 +14,8 @@ typedef struct s_smx_process_exit_fun { int_f_pvoid_pvoid_t fun; void *arg; -} s_smx_process_exit_fun_t, *smx_process_exit_fun_t; +} s_smx_process_exit_fun_t; +typedef s_smx_process_exit_fun_t* smx_process_exit_fun_t; namespace simgrid { namespace simix { diff --git a/src/simix/popping.cpp b/src/simix/popping.cpp index 1314c04c7e..c488326b8e 100644 --- a/src/simix/popping.cpp +++ b/src/simix/popping.cpp @@ -6,7 +6,7 @@ #include "smx_private.h" #include "xbt/xbt_os_thread.h" -#if HAVE_MC +#if SIMGRID_HAVE_MC #include "src/mc/mc_private.h" #endif diff --git a/src/simix/popping_generated.cpp b/src/simix/popping_generated.cpp index 9e477290ff..968e7bc158 100644 --- a/src/simix/popping_generated.cpp +++ b/src/simix/popping_generated.cpp @@ -15,7 +15,7 @@ #include #include "smx_private.h" -#if HAVE_MC +#if SIMGRID_HAVE_MC #include "src/mc/mc_forward.hpp" #endif diff --git a/src/simix/simcalls.py b/src/simix/simcalls.py index bc4a5c0e90..706dc92cd6 100755 --- a/src/simix/simcalls.py +++ b/src/simix/simcalls.py @@ -290,7 +290,7 @@ if __name__ == '__main__': fd.write('#include \n') fd.write('#include "smx_private.h"\n') - fd.write('#if HAVE_MC\n') + fd.write('#if SIMGRID_HAVE_MC\n') fd.write('#include "src/mc/mc_forward.hpp"\n') fd.write('#endif\n') fd.write('\n') diff --git a/src/simix/smx_context.cpp b/src/simix/smx_context.cpp index b3824614f8..712ab9cfaa 100644 --- a/src/simix/smx_context.cpp +++ b/src/simix/smx_context.cpp @@ -106,6 +106,20 @@ void SIMIX_context_mod_init() xbt_os_thread_key_create(&smx_current_context_key); #endif +#if defined(__APPLE__) || defined(__NetBSD__) + if (context_factory_name == std::string("thread") && + strcmp(xbt_cfg_get_string("smpi/privatization"), "dlopen") == 0) { + XBT_WARN("dlopen+thread broken on Apple and BSD. Switching to raw contexts."); + context_factory_name = "raw"; + } +#endif +#if defined(__FreeBSD__) + if (context_factory_name == std::string("thread") && strcmp(xbt_cfg_get_string("smpi/privatization"), "no") != 0) { + XBT_WARN("mmap broken on FreeBSD, but dlopen+thread broken too. Switching to dlopen+raw contexts."); + context_factory_name = "raw"; + } +#endif + /* select the context factory to use to create the contexts */ if (simgrid::kernel::context::factory_initializer) { // Give Java a chance to hijack the factory mechanism simix_global->context_factory = simgrid::kernel::context::factory_initializer(); @@ -168,8 +182,8 @@ void *SIMIX_context_stack_new() #endif size_t size = smx_context_stack_size + smx_context_guard_size; -#if HAVE_MC - /* Cannot use posix_memalign when HAVE_MC. Align stack by hand, and save the +#if SIMGRID_HAVE_MC + /* Cannot use posix_memalign when SIMGRID_HAVE_MC. Align stack by hand, and save the * pointer returned by xbt_malloc0. */ char *alloc = (char*)xbt_malloc0(size + xbt_pagesize); stack = alloc - ((uintptr_t)alloc & (xbt_pagesize - 1)) + xbt_pagesize; @@ -223,7 +237,7 @@ void SIMIX_context_stack_delete(void *stack) XBT_WARN("Failed to remove page protection: %s", strerror(errno)); /* try to pursue anyway */ } -#if HAVE_MC +#if SIMGRID_HAVE_MC /* Retrieve the saved pointer. See SIMIX_context_stack_new above. */ stack = *((void **)stack - 1); #endif diff --git a/src/simix/smx_deployment.cpp b/src/simix/smx_deployment.cpp index 569d96bfbb..daa1b11c00 100644 --- a/src/simix/smx_deployment.cpp +++ b/src/simix/smx_deployment.cpp @@ -147,7 +147,7 @@ void SIMIX_process_set_function(const char *process_host, process.host = process_host; process.kill_time = process_kill_time; process.start_time = process_start_time; - process.on_failure = SURF_PROCESS_ON_FAILURE_DIE; + process.on_failure = SURF_ACTOR_ON_FAILURE_DIE; sg_platf_new_process(&process); } diff --git a/src/simix/smx_global.cpp b/src/simix/smx_global.cpp index 09313d8aab..9292bf6ed0 100644 --- a/src/simix/smx_global.cpp +++ b/src/simix/smx_global.cpp @@ -24,13 +24,15 @@ #include "src/mc/mc_replay.h" #include "simgrid/sg_config.h" +#include "src/smpi/smpi_process.hpp" + #include "src/kernel/activity/SynchroExec.hpp" #include "src/kernel/activity/SynchroComm.hpp" #include "src/kernel/activity/SynchroSleep.hpp" #include "src/kernel/activity/SynchroIo.hpp" #include "src/kernel/activity/SynchroRaw.hpp" -#if HAVE_MC +#if SIMGRID_HAVE_MC #include "src/mc/mc_private.h" #include "src/mc/remote/Client.hpp" #include "src/mc/remote/mc_protocol.h" @@ -191,7 +193,7 @@ void SIMIX_set_maestro(void (*code)(void*), void* data) */ void SIMIX_global_init(int *argc, char **argv) { -#if HAVE_MC +#if SIMGRID_HAVE_MC // The communication initialization is done ASAP. // We need to communicate initialization of the different layers to the model-checker. simgrid::mc::Client::initialize(); @@ -236,11 +238,7 @@ void SIMIX_global_init(int *argc, char **argv) // TODO, create sg_storage_by_name sg_storage_t s = xbt_lib_get_elm_or_null(storage_lib, name); xbt_assert(s != nullptr, "Storage not found for name %s", name); - - SIMIX_storage_create(name, s, nullptr); }); - - SIMIX_STORAGE_LEVEL = xbt_lib_add_level(storage_lib, SIMIX_storage_destroy); } if (!simix_timers) simix_timers = xbt_heap_new(8, [](void* p) { @@ -302,7 +300,7 @@ void SIMIX_clean() xbt_os_mutex_destroy(simix_global->mutex); simix_global->mutex = nullptr; -#if HAVE_MC +#if SIMGRID_HAVE_MC xbt_dynar_free(&simix_global->actors_vector); #endif diff --git a/src/simix/smx_io.cpp b/src/simix/smx_io.cpp index 88892bf402..38659cae08 100644 --- a/src/simix/smx_io.cpp +++ b/src/simix/smx_io.cpp @@ -19,40 +19,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(simix_io, simix, "Logging specific to SIMIX (io)"); -/** - * \brief Internal function to create a SIMIX storage. - * \param name name of the storage to create - * \param storage the SURF storage to encapsulate - * \param data some user data (may be nullptr) - */ -smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data) -{ - smx_storage_priv_t smx_storage = xbt_new0(s_smx_storage_priv_t, 1); - - smx_storage->data = data; - - /* Update global variables */ - xbt_lib_set(storage_lib,name,SIMIX_STORAGE_LEVEL,smx_storage); - return xbt_lib_get_elm_or_null(storage_lib, name); -} - -/** - * \brief Internal function to destroy a SIMIX storage. - * - * \param s the host to destroy (a smx_storage_t) - */ -void SIMIX_storage_destroy(void *s) -{ - smx_storage_priv_t storage = static_cast(s); - - xbt_assert((storage != nullptr), "Invalid parameters"); - if (storage->data) - free(storage->data); - - /* Clean storage structure */ - free(storage); -} - //SIMIX FILE READ void simcall_HANDLER_file_read(smx_simcall_t simcall, smx_file_t fd, sg_size_t size, sg_host_t host) { @@ -214,10 +180,6 @@ xbt_dict_t SIMIX_storage_get_properties(smx_storage_t storage){ return surf_storage_get_properties(storage); } -const char* SIMIX_storage_get_name(smx_storage_t storage){ - return sg_storage_name(storage); -} - void SIMIX_io_destroy(smx_activity_t synchro) { simgrid::kernel::activity::Io *io = static_cast(synchro); diff --git a/src/simix/smx_io_private.h b/src/simix/smx_io_private.h index 114f9c01c6..0f9bfd328a 100644 --- a/src/simix/smx_io_private.h +++ b/src/simix/smx_io_private.h @@ -11,18 +11,6 @@ #include "simgrid/simix.h" #include "popping_private.h" -/** @brief Storage datatype */ -typedef struct s_smx_storage_priv { - void *data; /**< @brief user data */ -} s_smx_storage_priv_t; - - -static inline smx_storage_priv_t SIMIX_storage_priv(smx_storage_t storage){ - return (smx_storage_priv_t) xbt_lib_get_level(storage, SIMIX_STORAGE_LEVEL); -} - -XBT_PRIVATE smx_storage_t SIMIX_storage_create(const char *name, void *storage, void *data); -XBT_PRIVATE void SIMIX_storage_destroy(void *s); XBT_PRIVATE smx_activity_t SIMIX_file_read(smx_file_t fd, sg_size_t size, sg_host_t host); XBT_PRIVATE smx_activity_t SIMIX_file_write(smx_file_t fd, sg_size_t size, sg_host_t host); XBT_PRIVATE smx_activity_t SIMIX_file_open(const char* fullpath, sg_host_t host); diff --git a/src/simix/smx_network.cpp b/src/simix/smx_network.cpp index 852db10018..2da73fd6c7 100644 --- a/src/simix/smx_network.cpp +++ b/src/simix/smx_network.cpp @@ -59,7 +59,7 @@ _find_matching_comm(boost::circular_buffer_space_optimized* dequ if (remove_matching) deque->erase(it); comm->ref(); -#if HAVE_MC +#if SIMGRID_HAVE_MC comm->mbox_cpy = comm->mbox; #endif comm->mbox = nullptr; diff --git a/src/simix/smx_private.h b/src/simix/smx_private.h index 9ec2107dcc..f600d3544a 100644 --- a/src/simix/smx_private.h +++ b/src/simix/smx_private.h @@ -22,7 +22,7 @@ public: xbt_dynar_t process_to_run = nullptr; xbt_dynar_t process_that_ran = nullptr; std::map process_list; -#if HAVE_MC +#if SIMGRID_HAVE_MC /* MCer cannot read the std::map above in the remote process, so we copy the info it needs in a dynar. * FIXME: This is supposed to be a temporary hack. * A better solution would be to change the split between MCer and MCed, where the responsibility diff --git a/src/smpi/colls/allgather/allgather-rdb.cpp b/src/smpi/colls/allgather/allgather-rdb.cpp index 13ff6f0a47..44dc246a7d 100644 --- a/src/smpi/colls/allgather/allgather-rdb.cpp +++ b/src/smpi/colls/allgather/allgather-rdb.cpp @@ -1,15 +1,14 @@ -/* Copyright (c) 2013-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2013-2017. The SimGrid Team. All rights reserved. */ /* 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 "../colls_private.h" +#include "src/smpi/smpi_status.hpp" namespace simgrid{ namespace smpi{ - int Coll_allgather_rdb::allgather(void *sbuf, int send_count, MPI_Datatype send_type, void *rbuf, diff --git a/src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp b/src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp index 08b9cb4c13..fb374b9073 100644 --- a/src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp +++ b/src/smpi/colls/allgatherv/allgatherv-mpich-rdb.cpp @@ -1,12 +1,13 @@ -/* Copyright (c) 2013-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2013-2017. The SimGrid Team. All rights reserved. */ /* 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. */ - /* Short or medium size message and power-of-two no. of processes. Use - * recursive doubling algorithm */ +/* Short or medium size message and power-of-two no. of processes. Use + * recursive doubling algorithm */ + #include "../colls_private.h" +#include "src/smpi/smpi_status.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp b/src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp index 8500d14e72..f4f2357b79 100644 --- a/src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp +++ b/src/smpi/colls/allreduce/allreduce-ompi-ring-segmented.cpp @@ -154,6 +154,7 @@ } \ #include "../colls_private.h" + namespace simgrid{ namespace smpi{ int diff --git a/src/smpi/colls/alltoall/alltoall-pair.cpp b/src/smpi/colls/alltoall/alltoall-pair.cpp index 58a20df8d0..fae85c54f5 100644 --- a/src/smpi/colls/alltoall/alltoall-pair.cpp +++ b/src/smpi/colls/alltoall/alltoall-pair.cpp @@ -5,6 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "../colls_private.h" +#include "src/smpi/smpi_win.hpp" /***************************************************************************** diff --git a/src/smpi/colls/alltoall/alltoall-rdb.cpp b/src/smpi/colls/alltoall/alltoall-rdb.cpp index 5a6d18feac..0a16b23a38 100644 --- a/src/smpi/colls/alltoall/alltoall-rdb.cpp +++ b/src/smpi/colls/alltoall/alltoall-rdb.cpp @@ -5,6 +5,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "../colls_private.h" +#include "src/smpi/smpi_status.hpp" /***************************************************************************** diff --git a/src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp b/src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp index ca0112d7f7..66ac6bb0b2 100644 --- a/src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp +++ b/src/smpi/colls/bcast/bcast-scatter-LR-allgather.cpp @@ -1,10 +1,10 @@ -/* Copyright (c) 2013-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2013-2017. The SimGrid Team. All rights reserved. */ /* 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 "../colls_private.h" +#include "src/smpi/smpi_status.hpp" /***************************************************************************** diff --git a/src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp b/src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp index f4a7d4b3bd..1a1fe1a2f6 100644 --- a/src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp +++ b/src/smpi/colls/bcast/bcast-scatter-rdb-allgather.cpp @@ -1,4 +1,11 @@ +/* Copyright (c) 2011-2017. The SimGrid Team. All rights reserved. */ + +/* 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 "../colls_private.h" +#include "src/smpi/smpi_status.hpp" + namespace simgrid{ namespace smpi{ diff --git a/src/smpi/colls/colls_private.h b/src/smpi/colls/colls_private.h index 7ae80dc00b..c621957823 100644 --- a/src/smpi/colls/colls_private.h +++ b/src/smpi/colls/colls_private.h @@ -9,9 +9,11 @@ #include #include "smpi/mpi.h" #include "src/smpi/private.h" -#include "xbt/ex.h" -#include "xbt.h" -#include "../smpi_coll.hpp" +#include "src/smpi/smpi_coll.hpp" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_op.hpp" +#include "src/smpi/smpi_request.hpp" XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_colls); diff --git a/src/smpi/colls/smpi_automatic_selector.cpp b/src/smpi/colls/smpi_automatic_selector.cpp index aece1eb1a4..cac0ea237e 100644 --- a/src/smpi/colls/smpi_automatic_selector.cpp +++ b/src/smpi/colls/smpi_automatic_selector.cpp @@ -9,6 +9,8 @@ #include #include "colls_private.h" +#include "src/smpi/smpi_process.hpp" + //attempt to do a quick autotuning version of the collective, diff --git a/src/smpi/colls/smpi_default_selector.cpp b/src/smpi/colls/smpi_default_selector.cpp index d85e7c4056..546c2b7755 100644 --- a/src/smpi/colls/smpi_default_selector.cpp +++ b/src/smpi/colls/smpi_default_selector.cpp @@ -7,6 +7,7 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "colls_private.h" +#include "src/smpi/smpi_process.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/instr_smpi.cpp b/src/smpi/instr_smpi.cpp index 921bab89ab..b589dc75cf 100644 --- a/src/smpi/instr_smpi.cpp +++ b/src/smpi/instr_smpi.cpp @@ -61,20 +61,20 @@ static const char *smpi_colors[] ={ static char *str_tolower (const char *str) { - char *ret = xbt_strdup (str); - int i, n = strlen (ret); - for (i = 0; i < n; i++) + char* ret = xbt_strdup(str); + int n = strlen(ret); + for (int i = 0; i < n; i++) ret[i] = tolower (str[i]); return ret; } static const char *instr_find_color (const char *state) { - char *target = str_tolower (state); - const char *ret = nullptr; - unsigned int i = 0; - const char *current = smpi_colors[i]; - while ((current != nullptr)){ + char* target = str_tolower(state); + const char* ret = nullptr; + unsigned int i = 0; + const char* current = smpi_colors[i]; + while (current != nullptr) { if (strcmp (state, current) == 0 //exact match || strstr(target, current) != 0 ){//as substring ret = smpi_colors[i+1]; diff --git a/src/smpi/private.h b/src/smpi/private.h index a01bc88bce..fd8553ab2d 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -6,30 +6,10 @@ #ifndef SMPI_PRIVATE_H #define SMPI_PRIVATE_H -#include "simgrid/simix.h" #include "smpi/smpi.h" -#include "src/instr/instr_private.h" -#include "src/internal_config.h" -#include "xbt.h" -#include "xbt/base.h" -#include "xbt/synchro.h" -#include "xbt/xbt_os_time.h" -#include "src/smpi/smpi_process.hpp" -#include "src/smpi/smpi_f2c.hpp" -#include "src/smpi/smpi_keyvals.hpp" -#include "src/smpi/smpi_group.hpp" -#include "src/smpi/smpi_topo.hpp" -#include "src/smpi/smpi_coll.hpp" -#include "src/smpi/smpi_comm.hpp" -#include "src/smpi/smpi_info.hpp" -#include "src/smpi/smpi_op.hpp" -#include "src/smpi/smpi_datatype.hpp" -#include "src/smpi/smpi_datatype_derived.hpp" -#include "src/smpi/smpi_request.hpp" -#include "src/smpi/smpi_status.hpp" -#include "src/smpi/smpi_win.hpp" -SG_BEGIN_DECL() +#include "simgrid/msg.h" // msg_bar_t +SG_BEGIN_DECL() #define PERSISTENT 0x1 #define NON_PERSISTENT 0x2 @@ -386,38 +366,13 @@ void mpi_file_set_view_ ( int* fh, long long int* offset, int* etype, int* filet void mpi_file_read_ ( int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr); void mpi_file_write_ ( int* fh, void* buf, int* count, int* datatype, MPI_Status* status, int* ierr); -/********** Tracing **********/ -/* from instr_smpi.c */ -XBT_PRIVATE void TRACE_internal_smpi_set_category (const char *category); -XBT_PRIVATE const char *TRACE_internal_smpi_get_category (); -XBT_PRIVATE void TRACE_smpi_collective_in(int rank, int root, const char *operation, instr_extra_data extra); -XBT_PRIVATE void TRACE_smpi_collective_out(int rank, int root, const char *operation); -XBT_PRIVATE void TRACE_smpi_computing_init(int rank); -XBT_PRIVATE void TRACE_smpi_computing_out(int rank); -XBT_PRIVATE void TRACE_smpi_computing_in(int rank, instr_extra_data extra); -XBT_PRIVATE void TRACE_smpi_sleeping_init(int rank); -XBT_PRIVATE void TRACE_smpi_sleeping_out(int rank); -XBT_PRIVATE void TRACE_smpi_sleeping_in(int rank, instr_extra_data extra); -XBT_PRIVATE void TRACE_smpi_testing_out(int rank); -XBT_PRIVATE void TRACE_smpi_testing_in(int rank, instr_extra_data extra); -XBT_PRIVATE void TRACE_smpi_alloc(); -XBT_PRIVATE void TRACE_smpi_release(); -XBT_PRIVATE void TRACE_smpi_ptp_in(int rank, int src, int dst, const char *operation, instr_extra_data extra); -XBT_PRIVATE void TRACE_smpi_ptp_out(int rank, int src, int dst, const char *operation); -XBT_PRIVATE void TRACE_smpi_send(int rank, int src, int dst, int tag, int size); -XBT_PRIVATE void TRACE_smpi_recv(int rank, int src, int dst, int tag); -XBT_PRIVATE void TRACE_smpi_init(int rank); -XBT_PRIVATE void TRACE_smpi_finalize(int rank); -XBT_PRIVATE char *smpi_container(int rank, char *container, int n); - -XBT_PRIVATE const char* encode_datatype(MPI_Datatype datatype, int* known); - // TODO, make this static and expose it more cleanly typedef struct s_smpi_privatisation_region { void* address; int file_descriptor; -} s_smpi_privatisation_region_t, *smpi_privatisation_region_t; +} s_smpi_privatisation_region_t; +typedef s_smpi_privatisation_region_t* smpi_privatisation_region_t; extern XBT_PRIVATE smpi_privatisation_region_t smpi_privatisation_regions; extern XBT_PRIVATE int smpi_loaded_page; diff --git a/src/smpi/private.hpp b/src/smpi/private.hpp index a5c1aed3b9..42792da047 100644 --- a/src/smpi/private.hpp +++ b/src/smpi/private.hpp @@ -9,6 +9,7 @@ #include "src/instr/instr_smpi.h" #include #include +#include "src/internal_config.h" /** * Get the address of the beginning of the memory page where addr is located. diff --git a/src/smpi/smpi_bench.cpp b/src/smpi/smpi_bench.cpp index c27028aae7..52736c8e06 100644 --- a/src/smpi/smpi_bench.cpp +++ b/src/smpi/smpi_bench.cpp @@ -3,29 +3,18 @@ /* 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 - #include "src/internal_config.h" #include "private.h" #include "private.hpp" -#include -#include "xbt/dict.h" -#include "xbt/sysdep.h" -#include "xbt/ex.h" -#include "surf/surf.h" -#include "simgrid/sg_config.h" #include "simgrid/modelchecker.h" #include "src/mc/mc_replay.h" +#include "src/smpi/smpi_process.hpp" +#include "src/smpi/smpi_comm.hpp" -#include #ifndef WIN32 #include #endif #include // sqrt -#include #if HAVE_PAPI #include @@ -89,6 +78,13 @@ void smpi_execute(double duration) } } +void smpi_execute_benched(double duration) +{ + smpi_bench_end(); + smpi_execute(duration); + smpi_bench_begin(); +} + void smpi_bench_begin() { if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) { diff --git a/src/smpi/smpi_coll.cpp b/src/smpi/smpi_coll.cpp index 9bee615d83..326f46202e 100644 --- a/src/smpi/smpi_coll.cpp +++ b/src/smpi/smpi_coll.cpp @@ -6,12 +6,12 @@ /* 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 - -#include "private.h" -#include "simgrid/sg_config.h" +#include "src/smpi/private.h" +#include "src/smpi/smpi_coll.hpp" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_op.hpp" +#include "src/smpi/smpi_request.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi, "Logging specific to SMPI (coll)"); diff --git a/src/smpi/smpi_coll.hpp b/src/smpi/smpi_coll.hpp index 6f8672c9ce..8410ae7ab7 100644 --- a/src/smpi/smpi_coll.hpp +++ b/src/smpi/smpi_coll.hpp @@ -8,9 +8,7 @@ #ifndef SMPI_COLL_HPP #define SMPI_COLL_HPP -#include - -#include "private.h" +#include "xbt/base.h" /** \brief MPI collective description */ @@ -38,8 +36,8 @@ static ret cat (COLL_UNPAREN args); \ #define COLL_APPLY(action, sig, name) action(sig, name) #define COLL_COMMA , -#define COLL_NOsep -#define COLL_NOTHING(...) +#define COLL_NOsep +#define COLL_NOTHING(...) #define COLL_GATHER_SIG gather, int, \ (void *send_buff, int send_count, MPI_Datatype send_type, \ @@ -92,31 +90,30 @@ typedef struct mpi_coll_description s_mpi_coll_description_t; class Colls{ public: - static XBT_PUBLIC(void) coll_help(const char *category, s_mpi_coll_description_t * table); static XBT_PUBLIC(int) find_coll_description(s_mpi_coll_description_t * table, const char *name, const char *desc); static void set_collectives(); - // for each collective type, create the set_* prototype, the description array - // and the function pointer - COLL_APPLY(COLL_DEFS,COLL_GATHER_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_ALLGATHER_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_ALLGATHERV_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_REDUCE_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_ALLREDUCE_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_REDUCE_SCATTER_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_SCATTER_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_BARRIER_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_BCAST_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_ALLTOALL_SIG,""); - COLL_APPLY(COLL_DEFS,COLL_ALLTOALLV_SIG,""); - -//These fairly unused collectives only have one implementation in SMPI - - static int gatherv(void *sendbuf, int sendcount, MPI_Datatype sendtype, void *recvbuf, int *recvcounts, int *displs, MPI_Datatype recvtype, int root, MPI_Comm comm); - static int scatterv(void *sendbuf, int *sendcounts, int *displs, MPI_Datatype sendtype, void *recvbuf, int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); - static int scan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm); - static int exscan(void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm); + // for each collective type, create the set_* prototype, the description array and the function pointer + COLL_APPLY(COLL_DEFS, COLL_GATHER_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_ALLGATHER_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_ALLGATHERV_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_REDUCE_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_ALLREDUCE_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_REDUCE_SCATTER_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_SCATTER_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_BARRIER_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_BCAST_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_ALLTOALL_SIG, ""); + COLL_APPLY(COLL_DEFS, COLL_ALLTOALLV_SIG, ""); + + // These fairly unused collectives only have one implementation in SMPI + static int gatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int* recvcounts, int* displs, + MPI_Datatype recvtype, int root, MPI_Comm comm); + static int scatterv(void* sendbuf, int* sendcounts, int* displs, MPI_Datatype sendtype, void* recvbuf, + int recvcount, MPI_Datatype recvtype, int root, MPI_Comm comm); + static int scan(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm); + static int exscan(void* sendbuf, void* recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm); static void (*smpi_coll_cleanup_callback)(); }; @@ -241,7 +238,6 @@ COLL_ALLREDUCES(COLL_PROTO, COLL_NOsep) * ALLTOALL * ************/ - #define COLL_ALLTOALLS(action, COLL_sep) \ COLL_APPLY(action, COLL_ALLTOALL_SIG, default) COLL_sep \ COLL_APPLY(action, COLL_ALLTOALL_SIG, 2dmesh) COLL_sep \ @@ -324,7 +320,6 @@ COLL_APPLY(action, COLL_BCAST_SIG, automatic) COLL_BCASTS(COLL_PROTO, COLL_NOsep) - /********** * REDUCE * **********/ @@ -370,11 +365,8 @@ COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, mvapich2) COLL_sep \ COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, impi) COLL_sep \ COLL_APPLY(action, COLL_REDUCE_SCATTER_SIG, automatic) - - COLL_REDUCE_SCATTERS(COLL_PROTO, COLL_NOsep) - /************* * SCATTER * *************/ @@ -414,8 +406,6 @@ COLL_APPLY(action, COLL_BARRIER_SIG, automatic) COLL_BARRIERS(COLL_PROTO, COLL_NOsep) - } } - #endif diff --git a/src/smpi/smpi_comm.cpp b/src/smpi/smpi_comm.cpp index a3b9f5f0fe..213a822fe3 100644 --- a/src/smpi/smpi_comm.cpp +++ b/src/smpi/smpi_comm.cpp @@ -5,8 +5,15 @@ #include "simgrid/s4u/Host.hpp" -#include "private.h" #include "src/simix/smx_private.h" +#include "src/smpi/private.h" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_coll.hpp" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_process.hpp" +#include "src/smpi/smpi_request.hpp" +#include "src/smpi/smpi_status.hpp" +#include "src/smpi/smpi_win.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_comm, smpi, "Logging specific to SMPI (comm)"); diff --git a/src/smpi/smpi_comm.hpp b/src/smpi/smpi_comm.hpp index 9076cc05b0..992c9229e0 100644 --- a/src/smpi/smpi_comm.hpp +++ b/src/smpi/smpi_comm.hpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2010-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -7,8 +6,10 @@ #ifndef SMPI_COMM_HPP_INCLUDED #define SMPI_COMM_HPP_INCLUDED -#include "private.h" #include +#include "src/smpi/smpi_keyvals.hpp" +#include "src/smpi/smpi_group.hpp" +#include "src/smpi/smpi_topo.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/smpi_datatype.cpp b/src/smpi/smpi_datatype.cpp index 6dfe3bdf90..49cf5a88b1 100644 --- a/src/smpi/smpi_datatype.cpp +++ b/src/smpi/smpi_datatype.cpp @@ -1,20 +1,14 @@ -/* smpi_datatype.cpp -- MPI primitives to handle datatypes */ -/* Copyright (c) 2009-2017. The SimGrid Team. - * All rights reserved. */ +/* smpi_datatype.cpp -- MPI primitives to handle datatypes */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* 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 "mc/mc.h" -#include "private.h" #include "simgrid/modelchecker.h" -#include -#include -#include -#include -#include -#include -#include +#include "src/smpi/private.h" +#include "src/smpi/smpi_datatype_derived.hpp" +#include "src/smpi/smpi_op.hpp" +#include "src/smpi/smpi_process.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI (datatype)"); @@ -24,7 +18,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_datatype, smpi, "Logging specific to SMPI ( sizeof(type), /* size */ \ 0, /* lb */ \ sizeof(type), /* ub = lb + size */ \ - DT_FLAG_BASIC /* flags */ \ + DT_FLAG_BASIC /* flags */ \ ); \ const MPI_Datatype name = &mpi_##name; @@ -107,7 +101,7 @@ std::unordered_map Datatype::keyvals_; int Datatype::keyval_id_=0; Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(1){ -#if HAVE_MC +#if SIMGRID_HAVE_MC if(MC_is_active()) MC_ignore(&(refcount_), sizeof(refcount_)); #endif @@ -115,7 +109,7 @@ Datatype::Datatype(int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(nullptr //for predefined types, so in_use = 0. Datatype::Datatype(char* name, int size,MPI_Aint lb, MPI_Aint ub, int flags) : name_(name), size_(size), lb_(lb), ub_(ub), flags_(flags), refcount_(0){ -#if HAVE_MC +#if SIMGRID_HAVE_MC if(MC_is_active()) MC_ignore(&(refcount_), sizeof(refcount_)); #endif @@ -170,7 +164,7 @@ void Datatype::ref(){ refcount_++; -#if HAVE_MC +#if SIMGRID_HAVE_MC if(MC_is_active()) MC_ignore(&(refcount_), sizeof(refcount_)); #endif @@ -184,7 +178,7 @@ void Datatype::unref(MPI_Datatype datatype) if (datatype->refcount_ == 0 && !(datatype->flags_ & DT_FLAG_PREDEFINED)) delete datatype; -#if HAVE_MC +#if SIMGRID_HAVE_MC if(MC_is_active()) MC_ignore(&(datatype->refcount_), sizeof(datatype->refcount_)); #endif diff --git a/src/smpi/smpi_datatype.hpp b/src/smpi/smpi_datatype.hpp index f2263b0ddd..220a424ca5 100644 --- a/src/smpi/smpi_datatype.hpp +++ b/src/smpi/smpi_datatype.hpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2009-2010, 2012-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -7,10 +6,8 @@ #ifndef SMPI_DATATYPE_HPP #define SMPI_DATATYPE_HPP -#include - -#include "private.h" - +#include "src/smpi/smpi_f2c.hpp" +#include "src/smpi/smpi_keyvals.hpp" #define DT_FLAG_DESTROYED 0x0001 /**< user destroyed but some other layers still have a reference */ #define DT_FLAG_COMMITED 0x0002 /**< ready to be used for a send/recv operation */ diff --git a/src/smpi/smpi_datatype_derived.cpp b/src/smpi/smpi_datatype_derived.cpp index 326dee846b..cc008857ef 100644 --- a/src/smpi/smpi_datatype_derived.cpp +++ b/src/smpi/smpi_datatype_derived.cpp @@ -1,18 +1,11 @@ -/* smpi_datatype.cpp -- MPI primitives to handle datatypes */ -/* Copyright (c) 2009-2017. The SimGrid Team. - * All rights reserved. */ +/* smpi_datatype.cpp -- MPI primitives to handle datatypes */ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ /* 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 "mc/mc.h" -#include "private.h" - -#include -#include -#include -#include -#include +#include "src/smpi/smpi_datatype_derived.hpp" +#include "src/smpi/smpi_op.hpp" XBT_LOG_EXTERNAL_CATEGORY(smpi_datatype); diff --git a/src/smpi/smpi_datatype_derived.hpp b/src/smpi/smpi_datatype_derived.hpp index 12e1829fad..03ac75689c 100644 --- a/src/smpi/smpi_datatype_derived.hpp +++ b/src/smpi/smpi_datatype_derived.hpp @@ -7,14 +7,12 @@ #ifndef SMPI_DATATYPE_DERIVED_HPP #define SMPI_DATATYPE_DERIVED_HPP -#include - -#include "private.h" +#include "src/smpi/smpi_datatype.hpp" namespace simgrid{ namespace smpi{ -class Type_Contiguous: public Datatype{ +class Type_Contiguous: public Datatype { private: int block_count_; MPI_Datatype old_type_; diff --git a/src/smpi/smpi_deployment.cpp b/src/smpi/smpi_deployment.cpp index 2dcf26e51e..475688f49d 100644 --- a/src/smpi/smpi_deployment.cpp +++ b/src/smpi/smpi_deployment.cpp @@ -4,10 +4,10 @@ /* 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 "private.h" #include "simgrid/msg.h" /* barrier */ +#include "src/smpi/private.h" +#include "src/smpi/smpi_comm.hpp" #include "src/smpi/SmpiHost.hpp" -#include "xbt/log.h" namespace simgrid { namespace smpi { diff --git a/src/smpi/smpi_f2c.cpp b/src/smpi/smpi_f2c.cpp index 1126c873d0..978722d37d 100644 --- a/src/smpi/smpi_f2c.cpp +++ b/src/smpi/smpi_f2c.cpp @@ -1,12 +1,13 @@ -/* Copyright (c) 2007-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */ /* 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 "private.h" -#include +#include "src/smpi/private.h" +#include "src/smpi/smpi_f2c.hpp" +#include "src/smpi/smpi_process.hpp" +#include namespace simgrid{ namespace smpi{ @@ -31,12 +32,12 @@ int F2C::f2c_id(){ }; char* F2C::get_key(char* key, int id) { - snprintf(key, KEY_SIZE, "%x",id); + std::snprintf(key, KEY_SIZE, "%x",id); return key; } char* F2C::get_key_id(char* key, int id) { - snprintf(key, KEY_SIZE, "%x_%d",id, smpi_process()->index()); + std::snprintf(key, KEY_SIZE, "%x_%d",id, smpi_process()->index()); return key; } diff --git a/src/smpi/smpi_f2c.hpp b/src/smpi/smpi_f2c.hpp index 3f285355b9..bfe726b640 100644 --- a/src/smpi/smpi_f2c.hpp +++ b/src/smpi/smpi_f2c.hpp @@ -9,8 +9,7 @@ #ifndef SMPI_F2C_HPP_INCLUDED #define SMPI_F2C_HPP_INCLUDED -#include "private.h" - +#include "xbt/dict.h" #define KEY_SIZE (sizeof(int) * 2 + 1) diff --git a/src/smpi/smpi_f77.cpp b/src/smpi/smpi_f77.cpp index be97ecdc46..73d502c048 100644 --- a/src/smpi/smpi_f77.cpp +++ b/src/smpi/smpi_f77.cpp @@ -1,13 +1,15 @@ -/* Copyright (c) 2010-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ /* 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 "private.h" -#include "xbt.h" +#include "src/smpi/private.h" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_op.hpp" +#include "src/smpi/smpi_process.hpp" +#include "src/smpi/smpi_request.hpp" +#include "src/smpi/smpi_win.hpp" static int running_processes = 0; diff --git a/src/smpi/smpi_global.cpp b/src/smpi/smpi_global.cpp index 7f62db8e9e..ff2da6f47d 100644 --- a/src/smpi/smpi_global.cpp +++ b/src/smpi/smpi_global.cpp @@ -3,40 +3,27 @@ /* 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 -#include -#include -#include - #include "mc/mc.h" -#include "private.h" -#include "private.hpp" #include "simgrid/s4u/Mailbox.hpp" -#include "smpi/smpi_shared_malloc.hpp" -#include "simgrid/sg_config.h" -#include "src/kernel/activity/SynchroComm.hpp" -#include "src/mc/mc_record.h" -#include "src/mc/mc_replay.h" +#include "simgrid/s4u/Host.hpp" #include "src/msg/msg_private.h" #include "src/simix/smx_private.h" #include "src/surf/surf_interface.hpp" #include "src/smpi/SmpiHost.hpp" -#include "surf/surf.h" -#include "xbt/replay.hpp" -#include +#include "xbt/config.hpp" +#include "src/smpi/private.h" +#include "smpi/smpi_shared_malloc.hpp" +#include "src/smpi/smpi_coll.hpp" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_group.hpp" +#include "src/smpi/smpi_info.hpp" +#include "src/smpi/smpi_process.hpp" +#include +#include +#include #include /* DBL_MAX */ #include -#include -#include -#include -#include -#include -#include -#include -#include #if HAVE_SENDFILE #include @@ -54,9 +41,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_kernel, smpi, "Logging specific to SMPI (ke #define RTLD_DEEPBIND 0 #endif -/* Mac OSX does not have any header file providing that definition so we have to duplicate it here. Bummers. */ -extern char** environ; /* we use it in posix_spawnp below */ - #if HAVE_PAPI #include "papi.h" const char* papi_default_config_name = "default"; @@ -86,8 +70,6 @@ static simgrid::config::Flag smpi_init_sleep( void (*smpi_comm_copy_data_callback) (smx_activity_t, void*, size_t) = &smpi_comm_copy_buffer_callback; - - int smpi_process_count() { return process_count; @@ -119,6 +101,14 @@ int smpi_process_index(){ return smpi_process()->index(); } +void * smpi_process_get_user_data(){ + return smpi_process()->get_user_data(); +} + +void smpi_process_set_user_data(void *data){ + return smpi_process()->set_user_data(data); +} + int smpi_global_size() { @@ -190,7 +180,8 @@ void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t b XBT_DEBUG("Privatization : We are copying from a zone inside global memory... Saving data to temp buffer !"); smpi_switch_data_segment( - (static_cast((static_cast(comm->src_proc->data)->data))->index())); + static_cast((static_cast(comm->src_proc->data)->data)) + ->index()); tmpbuff = static_cast(xbt_malloc(buff_size)); memcpy_private(tmpbuff, buff, private_blocks); } @@ -199,7 +190,8 @@ void smpi_comm_copy_buffer_callback(smx_activity_t synchro, void *buff, size_t b && ((char*)comm->dst_buff < smpi_start_data_exe + smpi_size_data_exe )){ XBT_DEBUG("Privatization : We are copying to a zone inside global memory - Switch data segment"); smpi_switch_data_segment( - (static_cast((static_cast(comm->dst_proc->data)->data))->index())); + static_cast((static_cast(comm->dst_proc->data)->data)) + ->index()); } XBT_DEBUG("Copying %zu bytes from %p to %p", buff_size, tmpbuff,comm->dst_buff); memcpy_private(comm->dst_buff, tmpbuff, private_blocks); @@ -468,6 +460,13 @@ static void smpi_init_options(){ else xbt_die("Invalid value for smpi/privatization: '%s'", smpi_privatize_option); +#if defined(__FreeBSD__) + if (smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) { + XBT_INFO("Mixing mmap privatization is broken on FreeBSD, switching to dlopen privatization instead."); + smpi_privatize_global_variables = SMPI_PRIVATIZE_DLOPEN; + } +#endif + if (smpi_cpu_threshold < 0) smpi_cpu_threshold = DBL_MAX; @@ -490,10 +489,11 @@ typedef void (*smpi_fortran_entry_point_type)(); static int smpi_run_entry_point(smpi_entry_point_type entry_point, std::vector args) { + char noarg[] = {'\0'}; const int argc = args.size(); std::unique_ptr argv(new char*[argc + 1]); for (int i = 0; i != argc; ++i) - argv[i] = args[i].empty() ? const_cast(""): &args[i].front(); + argv[i] = args[i].empty() ? noarg : &args[i].front(); argv[argc] = nullptr; int res = entry_point(argc, argv.get()); @@ -667,8 +667,8 @@ int smpi_main(const char* executable, int argc, char *argv[]) } } int count = smpi_process_count(); - int i, ret=0; - for (i = 0; i < count; i++) { + int ret = 0; + for (int i = 0; i < count; i++) { if(process_data[i]->return_value()!=0){ ret=process_data[i]->return_value();//return first non 0 value break; diff --git a/src/smpi/smpi_group.cpp b/src/smpi/smpi_group.cpp index bf305775e1..590ba5e88b 100644 --- a/src/smpi/smpi_group.cpp +++ b/src/smpi/smpi_group.cpp @@ -1,10 +1,10 @@ -/* Copyright (c) 2010, 2013-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ /* 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 "private.h" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_group.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_group, smpi, "Logging specific to SMPI (group)"); diff --git a/src/smpi/smpi_group.hpp b/src/smpi/smpi_group.hpp index 461ea7fd73..aa01f3c318 100644 --- a/src/smpi/smpi_group.hpp +++ b/src/smpi/smpi_group.hpp @@ -7,7 +7,7 @@ #ifndef SMPI_GROUP_HPP_INCLUDED #define SMPI_GROUP_HPP_INCLUDED -#include "private.h" +#include "src/smpi/smpi_f2c.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/smpi_info.cpp b/src/smpi/smpi_info.cpp index 9690b78e32..5dac6d25c3 100644 --- a/src/smpi/smpi_info.cpp +++ b/src/smpi/smpi_info.cpp @@ -4,9 +4,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 "private.h" -#include -#include +#include "src/smpi/smpi_info.hpp" +#include "xbt/ex.hpp" +#include "xbt/sysdep.h" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/smpi_info.hpp b/src/smpi/smpi_info.hpp index 5555fe36a9..5eb096d34e 100644 --- a/src/smpi/smpi_info.hpp +++ b/src/smpi/smpi_info.hpp @@ -7,9 +7,9 @@ #ifndef SMPI_INFO_HPP #define SMPI_INFO_HPP -#include - -#include "private.h" +#include "src/smpi/smpi_f2c.hpp" +#include "smpi/smpi.h" +#include "xbt/dict.h" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/smpi_keyvals.cpp b/src/smpi/smpi_keyvals.cpp index 3808b65c73..53cf51f8ed 100644 --- a/src/smpi/smpi_keyvals.cpp +++ b/src/smpi/smpi_keyvals.cpp @@ -4,9 +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 "private.h" -#include -#include +//#include "private.h" +#include "src/smpi/smpi_keyvals.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/smpi_keyvals.hpp b/src/smpi/smpi_keyvals.hpp index c302a55667..92f3384df0 100644 --- a/src/smpi/smpi_keyvals.hpp +++ b/src/smpi/smpi_keyvals.hpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2010, 2013-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -7,9 +6,10 @@ #ifndef SMPI_KEYVALS_HPP_INCLUDED #define SMPI_KEYVALS_HPP_INCLUDED -#include "private.h" +#include "smpi/smpi.h" +#include "xbt/ex.hpp" + #include -#include typedef struct smpi_delete_fn{ MPI_Comm_delete_attr_function *comm_delete_fn; diff --git a/src/smpi/smpi_memory.cpp b/src/smpi/smpi_memory.cpp index 8091464761..d3716161d1 100644 --- a/src/smpi/smpi_memory.cpp +++ b/src/smpi/smpi_memory.cpp @@ -1,11 +1,11 @@ -/* Copyright (c) 2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2015-2017. The SimGrid Team. All rights reserved. */ /* 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 #include @@ -21,9 +21,9 @@ #include #include -#include "../xbt/memory_map.hpp" +#include "src/xbt/memory_map.hpp" -#include "private.h" +#include "src/smpi/private.h" #include "private.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_memory, smpi, "Memory layout support for SMPI"); diff --git a/src/smpi/smpi_op.cpp b/src/smpi/smpi_op.cpp index 805647bb61..599c0c2382 100644 --- a/src/smpi/smpi_op.cpp +++ b/src/smpi/smpi_op.cpp @@ -3,8 +3,10 @@ /* 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 "mc/mc.h" -#include "private.h" +#include "src/smpi/private.h" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_op.hpp" +#include "src/smpi/smpi_process.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_op, smpi, "Logging specific to SMPI (op)"); diff --git a/src/smpi/smpi_op.hpp b/src/smpi/smpi_op.hpp index a11d3c9636..167a346bac 100644 --- a/src/smpi/smpi_op.hpp +++ b/src/smpi/smpi_op.hpp @@ -7,9 +7,7 @@ #ifndef SMPI_OP_HPP #define SMPI_OP_HPP -#include - -#include "private.h" +#include "src/smpi/smpi_info.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/smpi_pmpi.cpp b/src/smpi/smpi_pmpi.cpp index 91e1456a71..1d9a5f3c9a 100644 --- a/src/smpi/smpi_pmpi.cpp +++ b/src/smpi/smpi_pmpi.cpp @@ -5,8 +5,15 @@ #include "simgrid/s4u/Engine.hpp" #include "simgrid/s4u/Host.hpp" - -#include "private.h" +#include "src/smpi/private.h" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_coll.hpp" +#include "src/smpi/smpi_datatype_derived.hpp" +#include "src/smpi/smpi_op.hpp" +#include "src/smpi/smpi_process.hpp" +#include "src/smpi/smpi_request.hpp" +#include "src/smpi/smpi_status.hpp" +#include "src/smpi/smpi_win.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_pmpi, smpi, "Logging specific to SMPI (pmpi)"); diff --git a/src/smpi/smpi_process.cpp b/src/smpi/smpi_process.cpp index 92cd1d3edd..27bc512448 100644 --- a/src/smpi/smpi_process.cpp +++ b/src/smpi/smpi_process.cpp @@ -1,13 +1,18 @@ +/* Copyright (c) 2009-2017. The SimGrid Team. All rights reserved. */ + +/* 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 "mc/mc.h" -#include "private.h" -#include "simgrid/s4u/Mailbox.hpp" -#include "src/kernel/activity/SynchroComm.hpp" -#include "src/mc/mc_record.h" +#include "src/mc/mc_ignore.h" #include "src/mc/mc_replay.h" #include "src/msg/msg_private.h" #include "src/simix/smx_private.h" -#include "surf/surf.h" -#include "xbt/replay.hpp" +#include "src/smpi/private.h" +#include "src/smpi/smpi_process.hpp" +#include "src/smpi/smpi_group.hpp" +#include "src/smpi/smpi_comm.hpp" + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_process, smpi, "Logging specific to SMPI (kernel)"); @@ -139,6 +144,16 @@ bool Process::replaying(){ return false; } +void Process::set_user_data(void *data) +{ + data_ = data; +} + +void *Process::get_user_data() +{ + return data_; +} + smx_actor_t Process::process(){ return process_; } diff --git a/src/smpi/smpi_process.hpp b/src/smpi/smpi_process.hpp index 9cc8a2af96..89602498b8 100644 --- a/src/smpi/smpi_process.hpp +++ b/src/smpi/smpi_process.hpp @@ -7,11 +7,9 @@ #ifndef SMPI_PROCESS_HPP #define SMPI_PROCESS_HPP - -#include #include "src/instr/instr_smpi.h" -#include "private.h" #include "simgrid/s4u/Mailbox.hpp" +#include "xbt/synchro.h" namespace simgrid{ namespace smpi{ @@ -28,6 +26,7 @@ class Process { MPI_Comm comm_self_ = MPI_COMM_NULL; MPI_Comm comm_intra_ = MPI_COMM_NULL; MPI_Comm* comm_world_ = nullptr; + void* data_ = nullptr; /* user data */ int index_ = MPI_UNDEFINED; char state_; int sampling_ = 0; /* inside an SMPI_SAMPLE_ block? */ @@ -51,6 +50,8 @@ class Process { void mark_as_initialized(); void set_replaying(bool value); bool replaying(); + void set_user_data(void *data); + void *get_user_data(); smpi_trace_call_location_t* call_location(); int index(); MPI_Comm comm_world(); diff --git a/src/smpi/smpi_replay.cpp b/src/smpi/smpi_replay.cpp index e226821ad7..059bd0c453 100644 --- a/src/smpi/smpi_replay.cpp +++ b/src/smpi/smpi_replay.cpp @@ -3,8 +3,15 @@ /* 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 "private.h" +#include "src/smpi/private.h" +#include "src/smpi/smpi_coll.hpp" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_group.hpp" +#include "src/smpi/smpi_process.hpp" +#include "src/smpi/smpi_request.hpp" #include "xbt/replay.hpp" + #include #include diff --git a/src/smpi/smpi_request.cpp b/src/smpi/smpi_request.cpp index 4bc218b2fb..1838d94d1a 100644 --- a/src/smpi/smpi_request.cpp +++ b/src/smpi/smpi_request.cpp @@ -3,11 +3,16 @@ /* 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 "private.h" #include "mc/mc.h" #include "src/mc/mc_replay.h" #include "src/smpi/SmpiHost.hpp" #include "src/kernel/activity/SynchroComm.hpp" +#include "src/smpi/private.h" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_op.hpp" +#include "src/smpi/smpi_process.hpp" +#include "src/smpi/smpi_request.hpp" #include diff --git a/src/smpi/smpi_request.hpp b/src/smpi/smpi_request.hpp index 06e28da71d..f9c8446c94 100644 --- a/src/smpi/smpi_request.hpp +++ b/src/smpi/smpi_request.hpp @@ -7,12 +7,12 @@ #ifndef SMPI_REQUEST_HPP_INCLUDED #define SMPI_REQUEST_HPP_INCLUDED -#include "private.h" +#include "src/smpi/smpi_f2c.hpp" namespace simgrid{ namespace smpi{ -class Request : public F2C{ +class Request : public F2C { private : void *buf_; /* in the case of non-contiguous memory the user address should be keep diff --git a/src/smpi/smpi_shared.cpp b/src/smpi/smpi_shared.cpp index 02f5194dfd..09d9030212 100644 --- a/src/smpi/smpi_shared.cpp +++ b/src/smpi/smpi_shared.cpp @@ -34,11 +34,13 @@ * ---- */ #include +#include #include "private.h" #include "private.hpp" #include "smpi/smpi_shared_malloc.hpp" #include "xbt/dict.h" +#include "xbt/ex.hpp" #include #include @@ -361,7 +363,8 @@ std::vector> shift_and_frame_private_blocks(const std: std::vector> merge_private_blocks(std::vector> src, std::vector> dst) { std::vector> result; - unsigned i_src=0, i_dst=0; + unsigned i_src = 0; + unsigned i_dst = 0; while(i_src < src.size() && i_dst < dst.size()) { std::pair block; if(src[i_src].second <= dst[i_dst].first) { diff --git a/src/smpi/smpi_static_variables.cpp b/src/smpi/smpi_static_variables.cpp index 4353c7f513..0a8b280aa7 100644 --- a/src/smpi/smpi_static_variables.cpp +++ b/src/smpi/smpi_static_variables.cpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2011-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2011-2017. The SimGrid Team. All rights reserved. */ /* 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. */ diff --git a/src/smpi/smpi_status.cpp b/src/smpi/smpi_status.cpp index eebea33a73..22c84bbf2f 100644 --- a/src/smpi/smpi_status.cpp +++ b/src/smpi/smpi_status.cpp @@ -1,11 +1,12 @@ -/* Copyright (c) 2007-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */ /* 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 "private.h" #include "src/simix/smx_private.h" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_status.hpp" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/smpi_status.hpp b/src/smpi/smpi_status.hpp index 7172194f33..8ac700b924 100644 --- a/src/smpi/smpi_status.hpp +++ b/src/smpi/smpi_status.hpp @@ -7,7 +7,7 @@ #ifndef SMPI_STATUS_HPP #define SMPI_STATUS_HPP -#include "private.h" +#include "smpi/smpi.h" namespace simgrid{ namespace smpi{ diff --git a/src/smpi/smpi_topo.cpp b/src/smpi/smpi_topo.cpp index 44a111bed2..e23a62332b 100644 --- a/src/smpi/smpi_topo.cpp +++ b/src/smpi/smpi_topo.cpp @@ -8,6 +8,8 @@ #include "private.h" #include #include +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_topo.hpp" /* static functions */ static int assignnodes(int ndim, int nfactor, int *pfacts,int **pdims); diff --git a/src/smpi/smpi_topo.hpp b/src/smpi/smpi_topo.hpp index f4ce792510..9e419cf1dc 100644 --- a/src/smpi/smpi_topo.hpp +++ b/src/smpi/smpi_topo.hpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2010-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -7,7 +6,8 @@ #ifndef SMPI_TOPO_HPP_INCLUDED #define SMPI_TOPO_HPP_INCLUDED -#include "private.h" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_status.hpp" typedef enum MPIR_Topo_type { MPI_GRAPH=1, diff --git a/src/smpi/smpi_utils.cpp b/src/smpi/smpi_utils.cpp index 7f43538aab..91e01ced43 100644 --- a/src/smpi/smpi_utils.cpp +++ b/src/smpi/smpi_utils.cpp @@ -38,15 +38,14 @@ std::vector parse_factor(const char *smpi_coef_string) xbt_die("Malformed radical for smpi factor: '%s'", smpi_coef_string); } unsigned int iteration = 0; - for (Tokenizer::iterator factor_iter = factor_values.begin(); - factor_iter != factor_values.end(); factor_iter++, iteration++) { + for (Tokenizer::iterator factor_iter = factor_values.begin(); factor_iter != factor_values.end(); factor_iter++) { + iteration++; char *errmsg; if (factor_iter == factor_values.begin()) { /* first element */ errmsg = bprintf("Invalid factor in chunk #%zu: %%s", smpi_factor.size()+1); fact.factor = xbt_str_parse_int(factor_iter->c_str(), errmsg); - } - else { + } else { errmsg = bprintf("Invalid factor value %d in chunk #%zu: %%s", iteration, smpi_factor.size()+1); fact.values.push_back(xbt_str_parse_double(factor_iter->c_str(), errmsg)); } diff --git a/src/smpi/smpi_win.cpp b/src/smpi/smpi_win.cpp index e2d6b5f3a8..0240e939d7 100644 --- a/src/smpi/smpi_win.cpp +++ b/src/smpi/smpi_win.cpp @@ -1,11 +1,17 @@ -/* Copyright (c) 2007-2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2007-2017. The SimGrid Team. All rights reserved. */ /* 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 "private.h" -#include +#include "src/smpi/private.h" +#include "src/smpi/smpi_coll.hpp" +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_datatype.hpp" +#include "src/smpi/smpi_info.hpp" +#include "src/smpi/smpi_keyvals.hpp" +#include "src/smpi/smpi_process.hpp" +#include "src/smpi/smpi_request.hpp" +#include "src/smpi/smpi_win.hpp" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_rma, smpi, "Logging specific to SMPI (RMA operations)"); diff --git a/src/smpi/smpi_win.hpp b/src/smpi/smpi_win.hpp index ddbdae45a9..dd837b6718 100644 --- a/src/smpi/smpi_win.hpp +++ b/src/smpi/smpi_win.hpp @@ -7,7 +7,9 @@ #ifndef SMPI_WIN_HPP_INCLUDED #define SMPI_WIN_HPP_INCLUDED -#include "private.h" +#include "src/smpi/smpi_keyvals.hpp" +#include "xbt/synchro.h" + #include #include diff --git a/src/smpi/smpicc.in b/src/smpi/smpicc.in index 579d646035..a9765ac07d 100755 --- a/src/smpi/smpicc.in +++ b/src/smpi/smpicc.in @@ -18,15 +18,18 @@ CMAKE_LINKARGS="-L@libdir@" list_set CFLAGS list_set LINKARGS -if [ "@WIN32@" != "1" ]; then - # list_add CFLAGS "-Dmain=smpi_simulated_main_" - list_add CFLAGS "-fpic" - list_add LINKARGS "-shared" "-lsimgrid" "-Wl,-z,defs" -else +if [ "x@WIN32@" = "x1" ]; then list_add CFLAGS "-include" "@includedir@/smpi/smpi_main.h" list_add LINKARGS "@libdir@\libsimgrid.dll" +elif [ "x@APPLE@" = "x1" ]; then + list_add CFLAGS "-fpic" + list_add LINKARGS "-shared" "-lsimgrid" "-Wl,-undefined,error" +else + list_add CFLAGS "-fpic" + list_add LINKARGS "-shared" "-lsimgrid" "-Wl,-z,defs" fi + list_set CMDARGS while [ $# -gt 0 ]; do ARG="$1" diff --git a/src/smpi/smpirun.in b/src/smpi/smpirun.in index 5d962e4e4a..a8c75e1290 100755 --- a/src/smpi/smpirun.in +++ b/src/smpi/smpirun.in @@ -33,7 +33,7 @@ usage () { Usage: $0 [OPTIONS] -platform -hostfile program [program-options] Options: -keep-temps # don't remove the generated files after execution - -wrapper # use command to run the program (e.g. "valgrind") + -wrapper # use command to run the program (e.g. "valgrind" or "gdb --args") -map # display the machine on which each process rank is mapped -np # use that amount of processes from the hostfile. # By default, all processes of the hostfile are used. @@ -323,7 +323,7 @@ if [ -z "${NUMPROCS}" ] ; then fi if [ ${NUMPROCS} -gt ${hostfile_procs} ] ; then - echo "You requested to use ${NUMPROCS} processes, but there is only ${hostfile_procs} processes in your hostfile..." >&2 + echo "You requested to use ${NUMPROCS} ranks, but there is only ${hostfile_procs} processes in your hostfile..." >&2 fi ##-------------------------------- DEFAULT or SPECIFIED PLATFORM -------------------------------------- @@ -333,8 +333,8 @@ if [ -z "${PLATFORM}" ]; then cat > ${PLATFORMTMP} < - - + + PLATFORMHEAD i=${NUMPROCS} @@ -360,7 +360,7 @@ PLATFORMHEAD done cat >> ${PLATFORMTMP} < + PLATFORMFOOT @@ -375,7 +375,7 @@ APPLICATIONTMP="$(mktemp smpitmp-appXXXXXX)" cat > ${APPLICATIONTMP} < - + APPLICATIONHEAD ##---- cache hostnames of hostfile--------------- @@ -415,7 +415,7 @@ fi set -- $hostnames -##---- generate tags------------------------------ +##---- generate tags------------------------------ #prepare arguments at once for ARG in $PROC_ARGS; do XML_ARGS="${XML_ARGS}"" @@ -427,12 +427,12 @@ do j=$(( $i % ${hostfile_procs} + 1 )) host=$(eval "echo \${$j}") - ##---- optional display of ranks to process mapping + ##---- optional display of ranks to actor mapping if [ ${MAPOPT} = 1 ]; then echo "[rank $i] -> $host" fi - echo " + echo " " >> ${APPLICATIONTMP} if [ ${REPLAY} = 1 ]; then @@ -444,7 +444,7 @@ do else echo ${XML_ARGS} >> ${APPLICATIONTMP} fi - echo " " >> ${APPLICATIONTMP} + echo " " >> ${APPLICATIONTMP} done cat >> ${APPLICATIONTMP} <maxDuration_ = duration; action->suspended_ = 2; - if (duration == NO_MAX_DURATION) { + if (duration < 0) { // NO_MAX_DURATION /* Move to the *end* of the corresponding action set. This convention is used to speed up update_resource_state */ action->getStateSet()->erase(action->getStateSet()->iterator_to(*action)); action->stateSet_ = static_cast(model())->p_cpuRunningActionSetThatDoesNotNeedBeingChecked; diff --git a/src/surf/cpu_cas01.hpp b/src/surf/cpu_cas01.hpp index f05453dcb5..0955ce2572 100644 --- a/src/surf/cpu_cas01.hpp +++ b/src/surf/cpu_cas01.hpp @@ -39,7 +39,7 @@ class CpuCas01 : public Cpu { public: CpuCas01(CpuCas01Model *model, simgrid::s4u::Host *host, std::vector *speedPerPstate, int core); ~CpuCas01() override; - void apply_event(tmgr_trace_iterator_t event, double value) override; + void apply_event(tmgr_trace_event_t event, double value) override; CpuAction *execution_start(double size) override; CpuAction *sleep(double duration) override; diff --git a/src/surf/cpu_interface.cpp b/src/surf/cpu_interface.cpp index 040472e35d..6443263e07 100644 --- a/src/surf/cpu_interface.cpp +++ b/src/surf/cpu_interface.cpp @@ -174,13 +174,13 @@ void Cpu::setStateTrace(tmgr_trace_t trace) { xbt_assert(stateEvent_ == nullptr, "Cannot set a second state trace to Host %s", host_->cname()); - stateEvent_ = future_evt_set->add_trace(trace, 0.0, this); + stateEvent_ = future_evt_set->add_trace(trace, this); } void Cpu::setSpeedTrace(tmgr_trace_t trace) { xbt_assert(speed_.event == nullptr, "Cannot set a second speed trace to Host %s", host_->cname()); - speed_.event = future_evt_set->add_trace(trace, 0.0, this); + speed_.event = future_evt_set->add_trace(trace, this); } diff --git a/src/surf/cpu_interface.hpp b/src/surf/cpu_interface.hpp index 11c8ca027a..c36600b68c 100644 --- a/src/surf/cpu_interface.hpp +++ b/src/surf/cpu_interface.hpp @@ -121,7 +121,7 @@ public: virtual void setStateTrace(tmgr_trace_t trace); /*< setup the trace file with states events (ON or OFF). Trace must contain boolean values (0 or 1). */ virtual void setSpeedTrace(tmgr_trace_t trace); /*< setup the trace file with availability events (peak speed changes due to external load). Trace must contain relative values (ratio between 0 and 1) */ - tmgr_trace_iterator_t stateEvent_ = nullptr; + tmgr_trace_event_t stateEvent_ = nullptr; s_surf_metric_t speed_ = {1.0, 0, nullptr}; }; diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index 7f0016036f..e3b612a688 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -37,8 +37,8 @@ CpuTiTrace::CpuTiTrace(tmgr_trace_t speedTrace) for (auto val : speedTrace->event_list) { timePoints_[i] = time; integral_[i] = integral; - integral += val.delta * val.value; - time += val.delta; + integral += val.date_ * val.value_; + time += val.date_; i++; } timePoints_[i] = time; @@ -237,8 +237,8 @@ double CpuTiTgmr::getPowerScale(double a) { double reduced_a = a - floor(a / lastTime_) * lastTime_; int point = trace_->binarySearch(trace_->timePoints_, reduced_a, 0, trace_->nbPoints_ - 1); - s_tmgr_event_t val = speedTrace_->event_list.at(point); - return val.value; + trace_mgr::DatedValue val = speedTrace_->event_list.at(point); + return val.value_; } /** @@ -264,9 +264,9 @@ CpuTiTgmr::CpuTiTgmr(tmgr_trace_t speedTrace, double value) : /* only one point available, fixed trace */ if (speedTrace->event_list.size() == 1) { - s_tmgr_event_t val = speedTrace->event_list.front(); + trace_mgr::DatedValue val = speedTrace->event_list.front(); type_ = TRACE_FIXED; - value_ = val.value; + value_ = val.value_; return; } @@ -274,7 +274,7 @@ CpuTiTgmr::CpuTiTgmr(tmgr_trace_t speedTrace, double value) : /* count the total time of trace file */ for (auto val : speedTrace->event_list) - total_time += val.delta; + total_time += val.date_; trace_ = new CpuTiTrace(speedTrace); lastTime_ = total_time; @@ -422,13 +422,13 @@ void CpuTi::setSpeedTrace(tmgr_trace_t trace) /* add a fake trace event if periodicity == 0 */ if (trace && trace->event_list.size() > 1) { - s_tmgr_event_t val = trace->event_list.back(); - if (val.delta < 1e-12) - speed_.event = future_evt_set->add_trace(tmgr_empty_trace_new(), 0.0, this); + trace_mgr::DatedValue val = trace->event_list.back(); + if (val.date_ < 1e-12) + speed_.event = future_evt_set->add_trace(new simgrid::trace_mgr::trace(), this); } } -void CpuTi::apply_event(tmgr_trace_iterator_t event, double value) +void CpuTi::apply_event(tmgr_trace_event_t event, double value) { if (event == speed_.event) { tmgr_trace_t speedTrace; @@ -441,12 +441,12 @@ void CpuTi::apply_event(tmgr_trace_iterator_t event, double value) modified(true); speedTrace = speedIntegratedTrace_->speedTrace_; - s_tmgr_event_t val = speedTrace->event_list.back(); + trace_mgr::DatedValue val = speedTrace->event_list.back(); delete speedIntegratedTrace_; - speed_.scale = val.value; + speed_.scale = val.value_; - trace = new CpuTiTgmr(TRACE_FIXED, val.value); - XBT_DEBUG("value %f", val.value); + trace = new CpuTiTgmr(TRACE_FIXED, val.value_); + XBT_DEBUG("value %f", val.value_); speedIntegratedTrace_ = trace; diff --git a/src/surf/cpu_ti.hpp b/src/surf/cpu_ti.hpp index 6eca45aaa8..4059783161 100644 --- a/src/surf/cpu_ti.hpp +++ b/src/surf/cpu_ti.hpp @@ -116,7 +116,7 @@ public: void setSpeedTrace(tmgr_trace_t trace) override; - void apply_event(tmgr_trace_iterator_t event, double value) override; + void apply_event(tmgr_trace_event_t event, double value) override; void updateActionsFinishTime(double now); void updateRemainingAmount(double now); diff --git a/src/surf/fair_bottleneck.cpp b/src/surf/fair_bottleneck.cpp index d6c424a8b3..270a399737 100644 --- a/src/surf/fair_bottleneck.cpp +++ b/src/surf/fair_bottleneck.cpp @@ -4,11 +4,12 @@ /* 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 "xbt/sysdep.h" -#include "xbt/log.h" #include "maxmin_private.hpp" -#include +#include "xbt/log.h" +#include "xbt/sysdep.h" +#include #include +#include XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_maxmin); #define SHOW_EXPR_G(expr) XBT_DEBUG(#expr " = %g",expr); @@ -113,10 +114,11 @@ void bottleneck_solve(lmm_system_t sys) xbt_swag_foreach_safe(_var, _var_next, var_list) { var = static_cast(_var); - double min_inc = var->cnsts[0].constraint->usage / var->cnsts[0].value; - for (int i = 1; i < var->cnsts_number; i++) { + double min_inc = DBL_MAX; + for (int i = 0; i < var->cnsts_number; i++) { lmm_element_t elm = &var->cnsts[i]; - min_inc = MIN(min_inc, elm->constraint->usage / elm->value); + if (elm->value > 0) + min_inc = MIN(min_inc, elm->constraint->usage / elm->value); } if (var->bound > 0) min_inc = MIN(min_inc, var->bound - var->value); diff --git a/src/surf/maxmin.cpp b/src/surf/maxmin.cpp index 0ab8b4d257..99fc2a16c2 100644 --- a/src/surf/maxmin.cpp +++ b/src/surf/maxmin.cpp @@ -8,7 +8,6 @@ #include "xbt/sysdep.h" #include "xbt/log.h" -#include "xbt/strbuff.h" #include "xbt/mallocator.h" #include "maxmin_private.hpp" #include diff --git a/src/surf/network_cm02.cpp b/src/surf/network_cm02.cpp index 22f0325d9d..75af96b496 100644 --- a/src/surf/network_cm02.cpp +++ b/src/surf/network_cm02.cpp @@ -88,7 +88,7 @@ void surf_network_model_init_Reno() if (surf_network_model) return; - surf_network_model = new simgrid::surf::NetworkCm02Model(lagrange_solve); + surf_network_model = new simgrid::surf::NetworkCm02Model(&lagrange_solve); all_existing_models->push_back(surf_network_model); lmm_set_default_protocol_function(func_reno_f, func_reno_fp, func_reno_fpi); @@ -104,7 +104,7 @@ void surf_network_model_init_Reno2() if (surf_network_model) return; - surf_network_model = new simgrid::surf::NetworkCm02Model(lagrange_solve); + surf_network_model = new simgrid::surf::NetworkCm02Model(&lagrange_solve); all_existing_models->push_back(surf_network_model); lmm_set_default_protocol_function(func_reno2_f, func_reno2_fp, func_reno2_fpi); @@ -119,7 +119,7 @@ void surf_network_model_init_Vegas() if (surf_network_model) return; - surf_network_model = new simgrid::surf::NetworkCm02Model(lagrange_solve); + surf_network_model = new simgrid::surf::NetworkCm02Model(&lagrange_solve); all_existing_models->push_back(surf_network_model); lmm_set_default_protocol_function(func_vegas_f, func_vegas_fp, func_vegas_fpi); @@ -234,7 +234,7 @@ void NetworkCm02Model::updateActionsStateFull(double now, double delta) double_update(&(deltap), action->latency_, sg_surf_precision); action->latency_ = 0.0; } - if (action->latency_ == 0.0 && !(action->isSuspended())) + if (action->latency_ <= 0.0 && !(action->isSuspended())) lmm_update_variable_weight(maxminSystem_, action->getVariable(), action->weight_); } if (TRACE_is_enabled()) { @@ -250,17 +250,16 @@ void NetworkCm02Model::updateActionsStateFull(double now, double delta) } } if (!lmm_get_number_of_cnst_from_var (maxminSystem_, action->getVariable())) { - /* There is actually no link used, hence an infinite bandwidth. - * This happens often when using models like vivaldi. - * In such case, just make sure that the action completes immediately. + /* There is actually no link used, hence an infinite bandwidth. This happens often when using models like + * vivaldi. In such case, just make sure that the action completes immediately. */ action->updateRemains(action->getRemains()); } action->updateRemains(lmm_variable_getvalue(action->getVariable()) * delta); - - if (action->getMaxDuration() != NO_MAX_DURATION) + + if (action->getMaxDuration() > NO_MAX_DURATION) action->updateMaxDuration(delta); - + if (((action->getRemains() <= 0) && (lmm_get_variable_weight(action->getVariable()) > 0)) || ((action->getMaxDuration() > NO_MAX_DURATION) && (action->getMaxDuration() <= 0))) { action->finish(); @@ -391,9 +390,8 @@ NetworkCm02Link::NetworkCm02Link(NetworkCm02Model* model, const char* name, doub simgrid::s4u::Link::onCreation(this->piface_); } -void NetworkCm02Link::apply_event(tmgr_trace_iterator_t triggered, double value) +void NetworkCm02Link::apply_event(tmgr_trace_event_t triggered, double value) { - /* Find out which of my iterators was triggered, and react accordingly */ if (triggered == bandwidth_.event) { setBandwidth(value); @@ -487,14 +485,10 @@ void NetworkCm02Link::setLatency(double value) } } -NetworkCm02Link::~NetworkCm02Link() {} - /********** * Action * **********/ -NetworkCm02Action::~NetworkCm02Action() {} - void NetworkCm02Action::updateRemainingLazy(double now) { if (suspended_ != 0) @@ -509,11 +503,11 @@ void NetworkCm02Action::updateRemainingLazy(double now) XBT_DEBUG("Updating action(%p): remains is now %f", this, remains_); } - if (maxDuration_ != NO_MAX_DURATION) + if (maxDuration_ > NO_MAX_DURATION) double_update(&maxDuration_, delta, sg_surf_precision); if ((remains_ <= 0 && (lmm_get_variable_weight(getVariable()) > 0)) || - (((maxDuration_ > NO_MAX_DURATION) && (maxDuration_ <= 0)))){ + ((maxDuration_ > NO_MAX_DURATION) && (maxDuration_ <= 0))) { finish(); setState(Action::State::done); heapRemove(getModel()->getActionHeap()); diff --git a/src/surf/network_cm02.hpp b/src/surf/network_cm02.hpp index 9f160e4722..08702719bb 100644 --- a/src/surf/network_cm02.hpp +++ b/src/surf/network_cm02.hpp @@ -59,8 +59,8 @@ namespace simgrid { public: NetworkCm02Link(NetworkCm02Model* model, const char* name, double bandwidth, double latency, e_surf_link_sharing_policy_t policy, lmm_system_t system); - ~NetworkCm02Link() override; - void apply_event(tmgr_trace_iterator_t event, double value) override; + virtual ~NetworkCm02Link() = default; + void apply_event(tmgr_trace_event_t event, double value) override; void setBandwidth(double value) override; void setLatency(double value) override; virtual void gapAppend(double size, const LinkImpl* link, NetworkAction* action); @@ -76,7 +76,7 @@ namespace simgrid { public: NetworkCm02Action(Model *model, double cost, bool failed) : NetworkAction(model, cost, failed) {}; - ~NetworkCm02Action() override; + virtual ~NetworkCm02Action() = default; void updateRemainingLazy(double now) override; protected: double senderGap_; diff --git a/src/surf/network_ib.hpp b/src/surf/network_ib.hpp index ac9b8a8da5..f132f83f84 100644 --- a/src/surf/network_ib.hpp +++ b/src/surf/network_ib.hpp @@ -24,7 +24,7 @@ namespace simgrid { NetworkAction *action; double init_rate; ActiveComm() : destination(nullptr),action(nullptr),init_rate(-1){}; - ~ActiveComm(){}; + virtual ~ActiveComm() = default; }; class IBNode{ @@ -37,7 +37,7 @@ namespace simgrid { //number of comms the node is receiving int nbActiveCommsDown; explicit IBNode(int id) : id(id),nbActiveCommsDown(0){}; - ~IBNode(){}; + virtual ~IBNode() = default; }; class XBT_PRIVATE NetworkIBModel : public NetworkSmpiModel { diff --git a/src/surf/network_interface.cpp b/src/surf/network_interface.cpp index 13c24e069c..8b4f978be4 100644 --- a/src/surf/network_interface.cpp +++ b/src/surf/network_interface.cpp @@ -35,9 +35,10 @@ namespace simgrid { LinkImpl** LinkImpl::linksList() { LinkImpl** res = xbt_new(LinkImpl*, (int)links->size()); - int i=0; + int i = 0; for (auto kv : *links) { - res[i++] = kv.second; + res[i] = kv.second; + i++; } return res; } @@ -168,17 +169,17 @@ namespace simgrid { void LinkImpl::setStateTrace(tmgr_trace_t trace) { xbt_assert(stateEvent_ == nullptr, "Cannot set a second state trace to Link %s", cname()); - stateEvent_ = future_evt_set->add_trace(trace, 0.0, this); + stateEvent_ = future_evt_set->add_trace(trace, this); } void LinkImpl::setBandwidthTrace(tmgr_trace_t trace) { xbt_assert(bandwidth_.event == nullptr, "Cannot set a second bandwidth trace to Link %s", cname()); - bandwidth_.event = future_evt_set->add_trace(trace, 0.0, this); + bandwidth_.event = future_evt_set->add_trace(trace, this); } void LinkImpl::setLatencyTrace(tmgr_trace_t trace) { xbt_assert(latency_.event == nullptr, "Cannot set a second latency trace to Link %s", cname()); - latency_.event = future_evt_set->add_trace(trace, 0.0, this); + latency_.event = future_evt_set->add_trace(trace, this); } diff --git a/src/surf/network_interface.hpp b/src/surf/network_interface.hpp index 2e6d67b55b..01a2372c99 100644 --- a/src/surf/network_interface.hpp +++ b/src/surf/network_interface.hpp @@ -157,7 +157,7 @@ public: tmgr_trace_t trace); /*< setup the trace file with latency events (peak latency changes due to external load). Trace must contain absolute values */ - tmgr_trace_iterator_t stateEvent_ = nullptr; + tmgr_trace_event_t stateEvent_ = nullptr; s_surf_metric_t latency_ = {1.0, 0, nullptr}; s_surf_metric_t bandwidth_ = {1.0, 0, nullptr}; diff --git a/src/surf/network_ns3.cpp b/src/surf/network_ns3.cpp index e27db353d1..adf7d54e97 100644 --- a/src/surf/network_ns3.cpp +++ b/src/surf/network_ns3.cpp @@ -271,7 +271,7 @@ LinkNS3::LinkNS3(NetworkNS3Model* model, const char* name, double bandwidth, dou LinkNS3::~LinkNS3() = default; -void LinkNS3::apply_event(tmgr_trace_iterator_t event, double value) +void LinkNS3::apply_event(tmgr_trace_event_t event, double value) { THROW_UNIMPLEMENTED; } diff --git a/src/surf/network_ns3.hpp b/src/surf/network_ns3.hpp index be32134077..ecdb950492 100644 --- a/src/surf/network_ns3.hpp +++ b/src/surf/network_ns3.hpp @@ -35,7 +35,7 @@ public: explicit LinkNS3(NetworkNS3Model* model, const char* name, double bandwidth, double latency); ~LinkNS3(); - void apply_event(tmgr_trace_iterator_t event, double value) override; + void apply_event(tmgr_trace_event_t event, double value) override; void setBandwidth(double value) override { THROW_UNIMPLEMENTED; } void setLatency(double value) override { THROW_UNIMPLEMENTED; } void setBandwidthTrace(tmgr_trace_t trace) override; diff --git a/src/surf/ptask_L07.cpp b/src/surf/ptask_L07.cpp index cc883f5fed..a963b8c788 100644 --- a/src/surf/ptask_L07.cpp +++ b/src/surf/ptask_L07.cpp @@ -326,7 +326,8 @@ bool LinkL07::isUsed(){ return lmm_constraint_used(model()->getMaxminSystem(), constraint()); } -void CpuL07::apply_event(tmgr_trace_iterator_t triggered, double value){ +void CpuL07::apply_event(tmgr_trace_event_t triggered, double value) +{ XBT_DEBUG("Updating cpu %s (%p) with value %g", cname(), this, value); if (triggered == speed_.event) { speed_.scale = value; @@ -345,7 +346,8 @@ void CpuL07::apply_event(tmgr_trace_iterator_t triggered, double value){ } } -void LinkL07::apply_event(tmgr_trace_iterator_t triggered, double value) { +void LinkL07::apply_event(tmgr_trace_event_t triggered, double value) +{ XBT_DEBUG("Updating link %s (%p) with value=%f", cname(), this, value); if (triggered == bandwidth_.event) { setBandwidth(value); diff --git a/src/surf/ptask_L07.hpp b/src/surf/ptask_L07.hpp index 4a2d68dc9a..5d25d4e48e 100644 --- a/src/surf/ptask_L07.hpp +++ b/src/surf/ptask_L07.hpp @@ -75,7 +75,7 @@ public: CpuL07(CpuL07Model *model, simgrid::s4u::Host *host, std::vector * speedPerPstate, int core); ~CpuL07() override; bool isUsed() override; - void apply_event(tmgr_trace_iterator_t event, double value) override; + void apply_event(tmgr_trace_event_t event, double value) override; Action *execution_start(double size) override; Action *sleep(double duration) override; protected: @@ -88,7 +88,7 @@ public: e_surf_link_sharing_policy_t policy); ~LinkL07() override; bool isUsed() override; - void apply_event(tmgr_trace_iterator_t event, double value) override; + void apply_event(tmgr_trace_event_t event, double value) override; void setBandwidth(double value) override; void setLatency(double value) override; }; diff --git a/src/surf/sg_platf.cpp b/src/surf/sg_platf.cpp index 283970c71d..6c0cbf4461 100644 --- a/src/surf/sg_platf.cpp +++ b/src/surf/sg_platf.cpp @@ -470,7 +470,7 @@ void sg_platf_new_process(sg_platf_process_cbarg_t process) double start_time = process->start_time; double kill_time = process->kill_time; - int auto_restart = process->on_failure == SURF_PROCESS_ON_FAILURE_DIE ? 0 : 1; + int auto_restart = process->on_failure == SURF_ACTOR_ON_FAILURE_DIE ? 0 : 1; std::vector args(process->argv, process->argv + process->argc); std::function code = factory(std::move(args)); diff --git a/src/surf/storage_interface.cpp b/src/surf/storage_interface.cpp index a2ef0ebc59..554c9a22ff 100644 --- a/src/surf/storage_interface.cpp +++ b/src/surf/storage_interface.cpp @@ -6,7 +6,6 @@ #include "storage_interface.hpp" #include "surf_private.h" -#include "xbt/file.h" /* xbt_getline */ #include #include #include @@ -15,7 +14,6 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_storage, surf, "Logging specific to the SURF storage module"); xbt_lib_t storage_lib; -int SIMIX_STORAGE_LEVEL = -1; // Simix storage level int MSG_STORAGE_LEVEL = -1; // Msg storage level int ROUTING_STORAGE_LEVEL = -1; // Routing for storage level int SURF_STORAGE_LEVEL = -1; @@ -117,7 +115,7 @@ bool Storage::isUsed() return false; } -void Storage::apply_event(tmgr_trace_iterator_t /*event*/, double /*value*/) +void Storage::apply_event(tmgr_trace_event_t /*event*/, double /*value*/) { THROW_UNIMPLEMENTED; } diff --git a/src/surf/storage_interface.hpp b/src/surf/storage_interface.hpp index eaeec0ce36..31c6dc8c72 100644 --- a/src/surf/storage_interface.hpp +++ b/src/surf/storage_interface.hpp @@ -89,7 +89,7 @@ public: /** @brief Check if the Storage is used (if an action currently uses its resources) */ bool isUsed() override; - void apply_event(tmgr_trace_iterator_t event, double value) override; + void apply_event(tmgr_trace_event_t event, double value) override; void turnOn() override; void turnOff() override; diff --git a/src/surf/surf_c_bindings.cpp b/src/surf/surf_c_bindings.cpp index e57d90b6a8..85582c57e4 100644 --- a/src/surf/surf_c_bindings.cpp +++ b/src/surf/surf_c_bindings.cpp @@ -18,7 +18,7 @@ extern double NOW; void surf_presolve() { double next_event_date = -1.0; - tmgr_trace_iterator_t event = nullptr; + tmgr_trace_event_t event = nullptr; double value = -1.0; simgrid::surf::Resource *resource = nullptr; @@ -28,9 +28,8 @@ void surf_presolve() break; while ((event = future_evt_set->pop_leq(next_event_date, &value, &resource))) { - if (value >= 0){ + if (value >= 0) resource->apply_event(event, value); - } } } @@ -46,7 +45,7 @@ double surf_solve(double max_date) double model_next_action_end = -1.0; double value = -1.0; simgrid::surf::Resource *resource = nullptr; - tmgr_trace_iterator_t event = nullptr; + tmgr_trace_event_t event = nullptr; if (max_date > 0.0) { xbt_assert(max_date > NOW,"You asked to simulate up to %f, but that's in the past already", max_date); @@ -227,6 +226,10 @@ const char* surf_storage_get_host(surf_resource_t resource){ return static_cast(surf_storage_resource_priv(resource))->attach_; } +const char* surf_storage_get_name(surf_resource_t resource){ + return static_cast(surf_storage_resource_priv(resource))->cname(); +} + void surf_cpu_action_set_bound(surf_action_t action, double bound) { static_cast(action)->setBound(bound); } diff --git a/src/surf/surf_interface.cpp b/src/surf/surf_interface.cpp index 2b1cfbbe5d..7ef46e5423 100644 --- a/src/surf/surf_interface.cpp +++ b/src/surf/surf_interface.cpp @@ -77,7 +77,7 @@ void surf_network_model_init_IB() { xbt_die("Please activate SMPI support in cmake to use the IB network model."); } #endif -#if !HAVE_NS3 +#if !SIMGRID_HAVE_NS3 void surf_network_model_init_NS3() { xbt_die("Please activate NS3 support in cmake and install the dependencies to use the NS3 network model."); } @@ -302,31 +302,31 @@ void sg_version() std::printf("This program was linked against %s (git: %s), found in %s.\n", SIMGRID_VERSION_STRING, SIMGRID_GIT_VERSION, SIMGRID_INSTALL_PREFIX); -#if HAVE_MC +#if SIMGRID_HAVE_MC std::printf(" Model-checking support compiled in.\n"); #else std::printf(" Model-checking support disabled at compilation.\n"); #endif -#if HAVE_NS3 +#if SIMGRID_HAVE_NS3 std::printf(" NS3 support compiled in.\n"); #else std::printf(" NS3 support disabled at compilation.\n"); #endif -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE std::printf(" Jedule support compiled in.\n"); #else std::printf(" Jedule support disabled at compilation.\n"); #endif -#if HAVE_LUA +#if SIMGRID_HAVE_LUA std::printf(" Lua support compiled in.\n"); #else std::printf(" Lua support disabled at compilation.\n"); #endif -#if HAVE_MALLOCATOR +#if SIMGRID_HAVE_MALLOCATOR std::printf(" Mallocator support compiled in.\n"); #else std::printf(" Mallocator support disabled at compilation.\n"); @@ -482,20 +482,19 @@ double Model::nextOccuringEventLazy(double now) } if ((action->getMaxDuration() > NO_MAX_DURATION) && - (min == -1 || action->getStartTime() + action->getMaxDuration() < min)) { + (min <= -1 || action->getStartTime() + action->getMaxDuration() < min)) { // when the task will complete anyway because of the deadline if any min = action->getStartTime() + action->getMaxDuration(); max_dur_flag = true; } - XBT_DEBUG("Action(%p) corresponds to variable %d", action, action->getVariable()->id_int); XBT_DEBUG("Action(%p) Start %f. May finish at %f (got a share of %f). Max_duration %f", action, action->getStartTime(), min, share, action->getMaxDuration()); - if (min != -1) { + if (min > -1) { action->heapUpdate(actionHeap_, min, max_dur_flag ? MAX_DURATION : NORMAL); XBT_DEBUG("Insert at heap action(%p) min %f now %f", action, min, now); } else diff --git a/src/surf/surf_interface.hpp b/src/surf/surf_interface.hpp index a5987f592d..ac226cd3b7 100644 --- a/src/surf/surf_interface.hpp +++ b/src/surf/surf_interface.hpp @@ -52,10 +52,6 @@ extern XBT_PRIVATE simgrid::xbt::signal surfExitCallbacks; int XBT_PRIVATE __surf_is_absolute_file_path(const char *file_path); -static inline char* sg_storage_name(sg_storage_t storage) { - return storage->key; -} - /*********** * Classes * ***********/ @@ -357,7 +353,7 @@ private: typedef struct { double peak; /**< The peak of the metric, ie its max value */ double scale; /**< Current availability of the metric according to the traces, in [0,1] */ - tmgr_trace_iterator_t event; /**< The associated trace event associated to the metric */ + tmgr_trace_event_t event; /**< The associated trace event associated to the metric */ } s_surf_metric_t; namespace simgrid { @@ -394,7 +390,7 @@ public: * @param event What happened * @param value [TODO] */ - virtual void apply_event(tmgr_trace_iterator_t event, double value)=0; + virtual void apply_event(tmgr_trace_event_t event, double value) = 0; /** @brief Check if the current Resource is used (if it currently serves an action) */ virtual bool isUsed()=0; diff --git a/src/surf/trace_mgr.cpp b/src/surf/trace_mgr.cpp index 4656258c5c..7fc1da17db 100644 --- a/src/surf/trace_mgr.cpp +++ b/src/surf/trace_mgr.cpp @@ -23,64 +23,81 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_trace, surf, "Surf trace management"); -static std::unordered_map trace_list; +namespace tmgr = simgrid::trace_mgr; -simgrid::trace_mgr::trace::trace()=default; -simgrid::trace_mgr::trace::~trace()=default; -simgrid::trace_mgr::future_evt_set::future_evt_set()=default; +static std::unordered_map trace_list; +static inline bool doubleEq(double d1, double d2) +{ + return fabs(d1 - d2) < 0.0001; +} +namespace simgrid { +namespace trace_mgr { + +bool DatedValue::operator==(DatedValue e2) +{ + return (doubleEq(date_, e2.date_)) && (doubleEq(value_, e2.value_)); +} +std::ostream& operator<<(std::ostream& out, const DatedValue& e) +{ + out << e.date_ << " " << e.value_; + return out; +} + +trace::trace() +{ + /* Add the first fake event storing the time at which the trace begins */ + tmgr::DatedValue val(0, -1); + event_list.push_back(val); +} +trace::~trace() = default; +future_evt_set::future_evt_set() = default; simgrid::trace_mgr::future_evt_set::~future_evt_set() { - xbt_heap_free(p_heap); + xbt_heap_free(heap_); +} +} } tmgr_trace_t tmgr_trace_new_from_string(const char* name, std::string input, double periodicity) { int linecount = 0; - tmgr_event_t last_event = nullptr; + tmgr_trace_t trace = new simgrid::trace_mgr::trace(); + tmgr::DatedValue* last_event = &(trace->event_list.back()); xbt_assert(trace_list.find(name) == trace_list.end(), "Refusing to define trace %s twice", name); - xbt_assert(periodicity >= 0, "Invalid periodicity %g (must be positive)", periodicity); - - tmgr_trace_t trace = new simgrid::trace_mgr::trace(); std::vector list; boost::split(list, input, boost::is_any_of("\n\r")); for (auto val : list) { - s_tmgr_event_t event; + tmgr::DatedValue event; linecount++; boost::trim(val); if (val[0] == '#' || val[0] == '\0' || val[0] == '%') // pass comments continue; - if (sscanf(val.c_str(), "PERIODICITY " "%lg" "\n", &periodicity) == 1) + if (sscanf(val.c_str(), "PERIODICITY %lg\n", &periodicity) == 1) + continue; + if (sscanf(val.c_str(), "LOOPAFTER %lg\n", &periodicity) == 1) continue; - xbt_assert(sscanf(val.c_str(), "%lg" - " " - "%lg" - "\n", - &event.delta, &event.value) == 2, - "%s:%d: Syntax error in trace\n%s", name, linecount, input.c_str()); + xbt_assert(sscanf(val.c_str(), "%lg %lg\n", &event.date_, &event.value_) == 2, "%s:%d: Syntax error in trace\n%s", + name, linecount, input.c_str()); - if (last_event) { - xbt_assert(last_event->delta <= event.delta, - "%s:%d: Invalid trace: Events must be sorted, but time %g > time %g.\n%s", name, linecount, - last_event->delta, event.delta, input.c_str()); + xbt_assert(last_event->date_ <= event.date_, + "%s:%d: Invalid trace: Events must be sorted, but time %g > time %g.\n%s", name, linecount, + last_event->date_, event.date_, input.c_str()); + last_event->date_ = event.date_ - last_event->date_; - last_event->delta = event.delta - last_event->delta; - } else { - if(event.delta > 0.0){ - s_tmgr_event_t first_event; - first_event.delta=event.delta; - first_event.value=-1.0; - trace->event_list.push_back(first_event); - } - } trace->event_list.push_back(event); last_event = &(trace->event_list.back()); } - if (last_event) - last_event->delta = periodicity; + if (last_event) { + if (periodicity > 0) { + last_event->date_ = periodicity + trace->event_list.at(0).date_; + } else { + last_event->date_ = -1; + } + } trace_list.insert({xbt_strdup(name), trace}); @@ -97,33 +114,15 @@ tmgr_trace_t tmgr_trace_new_from_file(const char *filename) std::stringstream buffer; buffer << f->rdbuf(); - tmgr_trace_t trace = tmgr_trace_new_from_string(filename, buffer.str(), 0.); - delete f; - return trace; -} - -tmgr_trace_t tmgr_empty_trace_new() -{ - tmgr_trace_t trace = new simgrid::trace_mgr::trace(); - s_tmgr_event_t event; - event.delta = 0.0; - event.value = 0.0; - trace->event_list.push_back(event); - - return trace; -} - -void tmgr_trace_free(tmgr_trace_t trace) -{ - delete trace; + return tmgr_trace_new_from_string(filename, buffer.str(), -1); } /** @brief Registers a new trace into the future event set, and get an iterator over the integrated trace */ -tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t trace, double start_time, surf::Resource *resource) +tmgr_trace_event_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t trace, surf::Resource* resource) { - tmgr_trace_iterator_t trace_iterator = nullptr; + tmgr_trace_event_t trace_iterator = nullptr; trace_iterator = xbt_new0(s_tmgr_trace_event_t, 1); trace_iterator->trace = trace; @@ -132,7 +131,7 @@ tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t xbt_assert((trace_iterator->idx < trace->event_list.size()), "Your trace should have at least one event!"); - xbt_heap_push(p_heap, trace_iterator, start_time); + xbt_heap_push(heap_, trace_iterator, 0. /*start_time*/); return trace_iterator; } @@ -140,38 +139,37 @@ tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::add_trace(tmgr_trace_t /** @brief returns the date of the next occurring event (pure function) */ double simgrid::trace_mgr::future_evt_set::next_date() const { - if (xbt_heap_size(p_heap)) - return (xbt_heap_maxkey(p_heap)); - else - return -1.0; + if (xbt_heap_size(heap_)) + return (xbt_heap_maxkey(heap_)); + return -1.0; } /** @brief Retrieves the next occurring event, or nullptr if none happens before #date */ -tmgr_trace_iterator_t simgrid::trace_mgr::future_evt_set::pop_leq( - double date, double *value, simgrid::surf::Resource **resource) +tmgr_trace_event_t simgrid::trace_mgr::future_evt_set::pop_leq(double date, double* value, + simgrid::surf::Resource** resource) { double event_date = next_date(); if (event_date > date) return nullptr; - tmgr_trace_iterator_t trace_iterator = (tmgr_trace_iterator_t)xbt_heap_pop(p_heap); + tmgr_trace_event_t trace_iterator = (tmgr_trace_event_t)xbt_heap_pop(heap_); if (trace_iterator == nullptr) return nullptr; tmgr_trace_t trace = trace_iterator->trace; *resource = trace_iterator->resource; - tmgr_event_t event = &(trace->event_list.at(trace_iterator->idx)); + tmgr::DatedValue dateVal = trace->event_list.at(trace_iterator->idx); - *value = event->value; + *value = dateVal.value_; if (trace_iterator->idx < trace->event_list.size() - 1) { - xbt_heap_push(p_heap, trace_iterator, event_date + event->delta); + xbt_heap_push(heap_, trace_iterator, event_date + dateVal.date_); trace_iterator->idx++; - } else if (event->delta > 0) { /* Last element, checking for periodicity */ - xbt_heap_push(p_heap, trace_iterator, event_date + event->delta); - trace_iterator->idx = 1; /* not 0 as the first event is a placeholder to handle when events really start */ - } else { /* We don't need this trace_event anymore */ + } else if (dateVal.date_ > 0) { /* Last element. Shall we loop? */ + xbt_heap_push(heap_, trace_iterator, event_date + dateVal.date_); + trace_iterator->idx = 1; /* idx=0 is a placeholder to store when events really start */ + } else { /* If we don't loop, we don't need this trace_event anymore */ trace_iterator->free_me = 1; } @@ -184,9 +182,10 @@ void tmgr_finalize() xbt_free((char*)kv.first); delete kv.second; } + trace_list.clear(); } -void tmgr_trace_event_unref(tmgr_trace_iterator_t *trace_event) +void tmgr_trace_event_unref(tmgr_trace_event_t* trace_event) { if ((*trace_event)->free_me) { xbt_free(*trace_event); diff --git a/src/surf/trace_mgr.hpp b/src/surf/trace_mgr.hpp index 3b4761a6e5..d33a53836c 100644 --- a/src/surf/trace_mgr.hpp +++ b/src/surf/trace_mgr.hpp @@ -6,29 +6,22 @@ #ifndef SURF_TMGR_H #define SURF_TMGR_H -#include "xbt/heap.h" #include "simgrid/forward.h" +#include "xbt/heap.h" +#include "xbt/sysdep.h" #include SG_BEGIN_DECL() -typedef struct tmgr_event { - double delta; - double value; -} s_tmgr_event_t, *tmgr_event_t; - /* Iterator within a trace */ -typedef struct tmgr_trace_iterator { +typedef struct tmgr_trace_event { tmgr_trace_t trace; unsigned int idx; sg_resource_t resource; int free_me; } s_tmgr_trace_event_t; -typedef struct tmgr_trace_iterator *tmgr_trace_iterator_t; +typedef struct tmgr_trace_event* tmgr_trace_event_t; -/* Creation functions */ -XBT_PUBLIC(tmgr_trace_t) tmgr_empty_trace_new(void); -XBT_PUBLIC(void) tmgr_trace_free(tmgr_trace_t trace); /** * \brief Free a trace event structure * @@ -36,7 +29,7 @@ XBT_PUBLIC(void) tmgr_trace_free(tmgr_trace_t trace); * This flag indicates whether the structure is still used somewhere or not. * When the structure is freed, the argument is set to nullptr */ -XBT_PUBLIC(void) tmgr_trace_event_unref(tmgr_trace_iterator_t *trace_event); +XBT_PUBLIC(void) tmgr_trace_event_unref(tmgr_trace_event_t* trace_event); XBT_PUBLIC(void) tmgr_finalize(void); @@ -47,17 +40,31 @@ SG_END_DECL() #ifdef __cplusplus namespace simgrid { -/** @brief Modeling of the resource variations, such as those due to an external load +/** @brief Modeling of the availability profile (due to an external load) or the churn * - * There is 3 main concepts in this module: - * - #trace: a set of dated values, ie a list of pair - * - #trace_iterator: links a given trace to a given simgrid resource. A Cpu for example has 2 iterators: state (ie, is it ON/OFF) and speed, while a link has 3 iterators: state, bandwidth and latency. + * There is 4 main concepts in this module: + * - #DatedValue: a pair (both are of type double) + * - #trace: a list of dated values + * - #trace_event: links a given trace to a given SimGrid resource. + * A Cpu for example has 2 kinds of events: state (ie, is it ON/OFF) and speed, + * while a link has 3 iterators: state, bandwidth and latency. * - #future_evt_set: makes it easy to find the next occuring event of all traces */ - namespace trace_mgr { +namespace trace_mgr { +XBT_PUBLIC_CLASS DatedValue +{ +public: + double date_ = 0; + double value_ = 0; + explicit DatedValue() = default; + explicit DatedValue(double d, double v) : date_(d), value_(v) {} + bool operator==(DatedValue e2); + bool operator!=(DatedValue e2) { return !(*this == e2); } +}; +std::ostream& operator<<(std::ostream& out, const DatedValue& e); /** @brief A trace_iterator links a trace to a resource */ -XBT_PUBLIC_CLASS trace_iterator { +XBT_PUBLIC_CLASS trace_event{ }; @@ -69,10 +76,10 @@ XBT_PUBLIC_CLASS trace_iterator { XBT_PUBLIC_CLASS trace { public: /** Creates an empty trace */ - trace(); + explicit trace(); virtual ~trace(); //private: - std::vector event_list; + std::vector event_list; }; /** @brief Future Event Set (collection of iterators over the traces) @@ -82,12 +89,12 @@ public: future_evt_set(); virtual ~future_evt_set(); double next_date() const; - tmgr_trace_iterator_t pop_leq(double date, double *value, simgrid::surf::Resource** resource); - tmgr_trace_iterator_t add_trace(tmgr_trace_t trace, double start_time, simgrid::surf::Resource *resource); + tmgr_trace_event_t pop_leq(double date, double* value, simgrid::surf::Resource** resource); + tmgr_trace_event_t add_trace(tmgr_trace_t trace, simgrid::surf::Resource * resource); private: // TODO: use a boost type for the heap (or a ladder queue) - xbt_heap_t p_heap = xbt_heap_new(8, xbt_free_f); /* Content: only trace_events (yep, 8 is an arbitrary value) */ + xbt_heap_t heap_ = xbt_heap_new(8, xbt_free_f); /* Content: only trace_events (yep, 8 is an arbitrary value) */ }; }} // namespace simgrid::trace_mgr diff --git a/src/surf/trace_mgr_test.cpp b/src/surf/trace_mgr_test.cpp new file mode 100644 index 0000000000..30b261ef57 --- /dev/null +++ b/src/surf/trace_mgr_test.cpp @@ -0,0 +1,162 @@ +/* Copyright (c) 2017. The SimGrid Team. All rights reserved. */ + +/* 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. */ + +#define BOOST_TEST_MODULE Trace Manager tests +bool init_unit_test(); // boost forget to give this prototype on NetBSD, which does not fit our paranoid flags +#define BOOST_TEST_DYN_LINK +#define BOOST_TEST_NO_MAIN +#include + +#include "src/surf/surf_interface.hpp" +#include "src/surf/trace_mgr.hpp" + +#include "xbt/log.h" +#include "xbt/misc.h" + +#include + +namespace utf = boost::unit_test; +namespace tmgr = simgrid::trace_mgr; + +XBT_LOG_NEW_DEFAULT_CATEGORY(unit, "Unit tests of the Trace Manager"); + +double thedate; +class MockedResource : public simgrid::surf::Resource { +public: + explicit MockedResource() : simgrid::surf::Resource(nullptr, "fake", nullptr) {} + void apply_event(tmgr_trace_event_t event, double value) + { + XBT_VERB("t=%.1f: Change value to %lg (idx: %d)", thedate, value, event->idx); + tmgr_trace_event_unref(&event); + } + bool isUsed() { return true; } +}; + +static void trace2vector(const char* str, std::vector* whereto) +{ + simgrid::trace_mgr::trace* trace = tmgr_trace_new_from_string("TheName", str, 0); + XBT_VERB("---------------------------------------------------------"); + XBT_VERB("data>>\n%s<event_list) + XBT_VERB("event: d:%lg v:%lg", evt.date_, evt.value_); + + MockedResource daResource; + simgrid::trace_mgr::future_evt_set fes; + tmgr_trace_event_t insertedIt = fes.add_trace(trace, &daResource); + + while (fes.next_date() <= 20.0 && fes.next_date() >= 0) { + thedate = fes.next_date(); + double value; + simgrid::surf::Resource* res; + tmgr_trace_event_t it = fes.pop_leq(thedate, &value, &res); + if (it == nullptr) + continue; + + BOOST_CHECK_EQUAL(it, insertedIt); // Check that we find what we've put + if (value >= 0) { + res->apply_event(it, value); + whereto->push_back(tmgr::DatedValue(thedate, value)); + } else { + XBT_DEBUG("%.1f: ignore an event (idx: %d)\n", thedate, it->idx); + } + } + tmgr_finalize(); +} + +/* Fails in a way that is difficult to test: xbt_assert should become throw +BOOST_AUTO_TEST_CASE(no_evt_noloop) { + std::vector got; + trace2vector("", &got); + std::vector want; + BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end()); +}*/ +BOOST_AUTO_TEST_CASE(one_evt_noloop) +{ + std::vector got; + trace2vector("9.0 3.0\n", &got); + + std::vector want; + want.push_back(tmgr::DatedValue(9, 3)); + BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end()); +} +BOOST_AUTO_TEST_CASE(two_evt_noloop) +{ + std::vector got; + trace2vector("3.0 1.0\n" + "9.0 3.0\n", + &got); + + std::vector want; + want.push_back(tmgr::DatedValue(3, 1)); + want.push_back(tmgr::DatedValue(9, 3)); + + BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end()); +} +BOOST_AUTO_TEST_CASE(three_evt_noloop) +{ + std::vector got; + trace2vector("3.0 1.0\n" + "5.0 2.0\n" + "9.0 3.0\n", + &got); + + std::vector want; + want.push_back(tmgr::DatedValue(3, 1)); + want.push_back(tmgr::DatedValue(5, 2)); + want.push_back(tmgr::DatedValue(9, 3)); + + BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end()); +} + +BOOST_AUTO_TEST_CASE(two_evt_loop) +{ + std::vector got; + trace2vector("1.0 1.0\n" + "3.0 3.0\n" + "LOOPAFTER 2\n", + &got); + + std::vector want; + want.push_back(tmgr::DatedValue(1, 1)); + want.push_back(tmgr::DatedValue(3, 3)); + want.push_back(tmgr::DatedValue(6, 1)); + want.push_back(tmgr::DatedValue(8, 3)); + want.push_back(tmgr::DatedValue(11, 1)); + want.push_back(tmgr::DatedValue(13, 3)); + want.push_back(tmgr::DatedValue(16, 1)); + want.push_back(tmgr::DatedValue(18, 3)); + + BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end()); +} +BOOST_AUTO_TEST_CASE(two_evt_start0_loop) +{ + std::vector got; + trace2vector("0.0 1\n" + "5.0 2\n" + "LOOPAFTER 5\n", + &got); + + std::vector want; + want.push_back(tmgr::DatedValue(0, 1)); + want.push_back(tmgr::DatedValue(5, 2)); + want.push_back(tmgr::DatedValue(10, 1)); + want.push_back(tmgr::DatedValue(15, 2)); + want.push_back(tmgr::DatedValue(20, 1)); + + BOOST_CHECK_EQUAL_COLLECTIONS(want.begin(), want.end(), got.begin(), got.end()); +} + +static bool init_function() +{ + // do your own initialization here (and return true on success) + // But, you CAN'T use testing tools here + return true; +} + +int main(int argc, char** argv) +{ + xbt_log_init(&argc, argv); + return ::boost::unit_test::unit_test_main(&init_function, argc, argv); +} diff --git a/src/surf/xml/platf_private.hpp b/src/surf/xml/platf_private.hpp index 9768c00699..ec62ccc01b 100644 --- a/src/surf/xml/platf_private.hpp +++ b/src/surf/xml/platf_private.hpp @@ -50,13 +50,15 @@ typedef struct { tmgr_trace_t state_trace; const char* coord; xbt_dict_t properties; -} s_sg_platf_host_cbarg_t, *sg_platf_host_cbarg_t; +} s_sg_platf_host_cbarg_t; +typedef s_sg_platf_host_cbarg_t* sg_platf_host_cbarg_t; typedef struct { const char* id; const char* link_up; const char* link_down; -} s_sg_platf_host_link_cbarg_t, *sg_platf_host_link_cbarg_t; +} s_sg_platf_host_link_cbarg_t; +typedef s_sg_platf_host_link_cbarg_t* sg_platf_host_link_cbarg_t; class LinkCreationArgs { public: @@ -114,7 +116,7 @@ typedef struct s_sg_platf_cluster_cbarg { e_surf_link_sharing_policy_t bb_sharing_policy; } s_sg_platf_cluster_cbarg_t; -typedef struct s_sg_platf_cabinet_cbarg *sg_platf_cabinet_cbarg_t; +typedef struct s_sg_platf_cabinet_cbarg* sg_platf_cabinet_cbarg_t; typedef struct s_sg_platf_cabinet_cbarg { const char* id; const char* prefix; @@ -125,16 +127,18 @@ typedef struct s_sg_platf_cabinet_cbarg { double lat; } s_sg_platf_cabinet_cbarg_t; -typedef struct { +typedef struct s_sg_platf_storage_cbarg* sg_platf_storage_cbarg_t; +typedef struct s_sg_platf_storage_cbarg { const char* id; const char* type_id; const char* content; const char* content_type; xbt_dict_t properties; const char* attach; -} s_sg_platf_storage_cbarg_t, *sg_platf_storage_cbarg_t; +} s_sg_platf_storage_cbarg_t; -typedef struct { +typedef struct s_sg_platf_storage_type_cbarg* sg_platf_storage_type_cbarg_t; +typedef struct s_sg_platf_storage_type_cbarg { const char* id; const char* model; const char* content; @@ -142,12 +146,13 @@ typedef struct { xbt_dict_t properties; std::map* model_properties; sg_size_t size; -} s_sg_platf_storage_type_cbarg_t, *sg_platf_storage_type_cbarg_t; +} s_sg_platf_storage_type_cbarg_t; -typedef struct { +typedef struct s_sg_platf_mount_cbarg* sg_platf_mount_cbarg_t; +typedef struct s_sg_platf_mount_cbarg { const char* storageId; const char* name; -} s_sg_platf_mount_cbarg_t, *sg_platf_mount_cbarg_t; +} s_sg_platf_mount_cbarg_t; typedef struct s_sg_platf_prop_cbarg *sg_platf_prop_cbarg_t; typedef struct s_sg_platf_prop_cbarg { diff --git a/src/surf/xml/simgrid.dtd b/src/surf/xml/simgrid.dtd index b48edf2003..1a6e627949 100644 --- a/src/surf/xml/simgrid.dtd +++ b/src/surf/xml/simgrid.dtd @@ -4,6 +4,12 @@ More info: http://simgrid.gforge.inria.fr/simgrid/latest/doc/platform.html To upgrade your files, use the tool simgrid_update_xml +* New in DTD version 4.1 (in SimGrid 3.16): backward compatible change (v4 files are valid v4.1 files) + - can be used as a synonym for the now deprecated + - an be used as a synonym for the now deprecated + - an be used as a synonym for the now deprecated + - can be used as a synonym for the now deprecated + * New in DTD version 4 (in SimGrid 3.13): - Rename (power->speed) the attributes describing the amount of flop that a , , or can deliver per second. @@ -60,10 +66,11 @@ To upgrade your files, use the tool simgrid_update_xml --> - + - + + @@ -86,10 +93,14 @@ To upgrade your files, use the tool simgrid_update_xml - + + + + + @@ -191,6 +202,13 @@ To upgrade your files, use the tool simgrid_update_xml + + + + + + + @@ -205,6 +223,12 @@ To upgrade your files, use the tool simgrid_update_xml + + + + + + @@ -212,6 +236,13 @@ To upgrade your files, use the tool simgrid_update_xml + + + + + + + diff --git a/src/surf/xml/simgrid_dtd.c b/src/surf/xml/simgrid_dtd.c index f95cef51c4..98336cbdfe 100644 --- a/src/surf/xml/simgrid_dtd.c +++ b/src/surf/xml/simgrid_dtd.c @@ -171,7 +171,7 @@ typedef struct yy_buffer_state *YY_BUFFER_STATE; typedef size_t yy_size_t; #endif -extern int surf_parse_leng; +extern unsigned int surf_parse_leng; extern FILE *surf_parse_in, *surf_parse_out; @@ -188,7 +188,7 @@ extern FILE *surf_parse_in, *surf_parse_out; */ #define YY_LESS_LINENO(n) \ do { \ - int yyl;\ + unsigned int yyl;\ for ( yyl = n; yyl < surf_parse_leng; ++yyl )\ if ( surf_parse_text[yyl] == '\n' )\ --surf_parse_lineno;\ @@ -305,7 +305,7 @@ static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */ /* yy_hold_char holds the character lost when surf_parse_text is formed. */ static char yy_hold_char; static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int surf_parse_leng; +unsigned int surf_parse_leng; /* Points to current character in buffer. */ static char *yy_c_buf_p = NULL; @@ -399,8 +399,8 @@ static void yynoreturn yy_fatal_error (yyconst char* msg ); *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 561 -#define YY_END_OF_BUFFER 562 +#define YY_NUM_RULES 651 +#define YY_END_OF_BUFFER 652 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -408,7 +408,7 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static yyconst flex_int16_t yy_accept[3334] = +static yyconst flex_int16_t yy_accept[3906] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -435,348 +435,411 @@ static yyconst flex_int16_t yy_accept[3334] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 562, 560, - 15, 10, 10, 15, 15, 540, 10, 540, 5, 6, - 5, 8, 9, 8, 556, 548, 549, 557, 554, 557, - 555, 559, 548, 549, 559, 42, 10, 42, 42, 42, - 40, 42, 42, 46, 10, 46, 46, 560, 46, 560, - 560, 46, 63, 10, 63, 63, 63, 61, 63, 63, - 63, 67, 10, 67, 560, 67, 74, 10, 74, 74, - - 74, 72, 74, 78, 10, 78, 89, 10, 89, 89, - 89, 87, 89, 89, 89, 93, 10, 93, 106, 10, - 106, 106, 106, 104, 106, 106, 106, 110, 10, 110, - 110, 119, 10, 119, 119, 119, 117, 119, 119, 123, - 10, 123, 123, 142, 10, 142, 142, 142, 140, 142, - 142, 142, 142, 142, 142, 146, 10, 146, 199, 10, - 199, 199, 199, 197, 199, 199, 199, 199, 199, 199, - 199, 199, 203, 10, 203, 203, 210, 10, 210, 210, - 210, 208, 210, 214, 10, 214, 214, 233, 10, 233, - 233, 233, 231, 233, 233, 233, 233, 233, 237, 10, - - 237, 560, 237, 248, 10, 248, 248, 248, 246, 248, - 248, 248, 252, 10, 252, 259, 10, 259, 259, 259, - 257, 259, 263, 10, 263, 560, 263, 286, 10, 286, - 286, 286, 284, 286, 286, 286, 286, 290, 10, 290, - 290, 303, 10, 303, 303, 303, 301, 303, 303, 307, - 10, 307, 316, 10, 316, 316, 316, 314, 316, 316, - 320, 10, 320, 329, 10, 329, 329, 329, 327, 329, - 329, 333, 10, 333, 354, 10, 354, 354, 354, 352, - 354, 354, 354, 354, 354, 354, 358, 10, 358, 560, - 365, 10, 365, 365, 365, 363, 365, 369, 10, 369, - - 369, 560, 369, 560, 369, 386, 10, 386, 386, 386, - 384, 386, 386, 386, 386, 386, 390, 10, 390, 560, - 390, 399, 10, 399, 399, 399, 397, 399, 399, 403, - 10, 403, 430, 10, 430, 430, 430, 428, 430, 430, - 430, 430, 430, 434, 10, 434, 447, 10, 447, 447, - 447, 445, 447, 447, 451, 10, 451, 451, 460, 10, - 460, 460, 460, 458, 460, 460, 464, 10, 464, 479, - 10, 479, 479, 479, 477, 479, 479, 479, 479, 483, - 10, 483, 483, 498, 10, 498, 498, 498, 496, 498, - 498, 498, 498, 502, 10, 502, 560, 502, 513, 10, - - 513, 513, 513, 511, 513, 513, 513, 557, 556, 535, - 10, 535, 535, 535, 533, 535, 535, 535, 539, 10, - 539, 10, 0, 2, 2, 0, 4, 7, 551, 550, - 0, 0, 0, 0, 0, 0, 41, 43, 43, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 62, 64, 64, 64, 64, 64, 0, 0, 73, 75, - 75, 0, 88, 90, 90, 90, 90, 0, 105, 107, - 107, 107, 107, 0, 118, 120, 120, 120, 0, 141, - - 143, 143, 143, 143, 143, 143, 143, 143, 0, 198, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 200, 200, 0, 209, 211, 211, 0, - 232, 234, 234, 234, 234, 234, 234, 234, 0, 0, - 247, 249, 249, 249, 249, 0, 258, 260, 260, 0, - 0, 285, 287, 287, 287, 287, 287, 287, 0, 302, - 304, 304, 304, 0, 315, 317, 317, 317, 0, 328, - 330, 330, 330, 0, 353, 355, 355, 355, 355, 355, - 355, 355, 355, 0, 0, 364, 366, 366, 0, 0, - 0, 0, 0, 0, 385, 387, 387, 387, 387, 387, - - 387, 0, 0, 398, 400, 400, 400, 0, 429, 431, - 431, 431, 431, 431, 431, 431, 431, 431, 0, 446, - 448, 448, 448, 448, 0, 459, 461, 461, 461, 0, - 478, 480, 480, 480, 480, 480, 0, 497, 499, 499, - 499, 499, 499, 0, 0, 512, 514, 514, 514, 514, - 0, 0, 0, 534, 536, 536, 536, 536, 0, 0, - 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 558, 0, 0, 43, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, - 0, 64, 64, 64, 64, 0, 0, 0, 75, 0, - 0, 90, 0, 0, 90, 0, 0, 107, 107, 107, - 0, 0, 120, 120, 0, 0, 0, 0, 0, 0, - 143, 143, 143, 143, 143, 0, 0, 200, 0, 0, - 200, 0, 0, 200, 200, 200, 200, 200, 200, 200, - 200, 200, 200, 0, 0, 0, 0, 0, 0, 234, - 234, 234, 0, 0, 234, 234, 234, 0, 0, 0, - 249, 0, 0, 0, 0, 0, 0, 260, 0, 0, - 17, 287, 0, 0, 287, 287, 287, 0, 0, 304, - - 0, 0, 0, 0, 0, 0, 317, 0, 0, 330, - 330, 0, 0, 355, 355, 355, 0, 0, 355, 355, - 355, 0, 0, 0, 366, 0, 0, 0, 0, 0, - 387, 387, 387, 387, 387, 0, 0, 0, 0, 0, - 400, 0, 0, 431, 0, 0, 431, 431, 431, 431, - 431, 431, 0, 0, 448, 448, 448, 0, 0, 461, - 0, 0, 0, 0, 480, 480, 0, 0, 480, 0, - 0, 499, 0, 0, 499, 499, 0, 0, 0, 514, - 0, 0, 514, 0, 0, 0, 553, 536, 536, 536, - 0, 0, 0, 14, 1, 0, 0, 546, 0, 0, - - 0, 543, 542, 0, 0, 19, 18, 43, 0, 0, - 45, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 64, 64, 0, 0, 64, 0, 0, 66, 0, 0, - 75, 0, 0, 77, 0, 90, 0, 84, 83, 90, - 0, 0, 92, 0, 0, 0, 107, 107, 0, 0, - 0, 0, 109, 0, 0, 0, 0, 0, 0, 0, - 122, 0, 0, 127, 126, 0, 129, 128, 0, 0, - - 143, 143, 143, 143, 0, 0, 145, 0, 200, 200, - 200, 0, 158, 157, 200, 0, 162, 161, 0, 0, - 200, 200, 200, 200, 200, 200, 200, 200, 200, 0, - 0, 202, 0, 0, 207, 206, 0, 0, 213, 0, - 234, 234, 234, 0, 224, 223, 234, 234, 234, 0, - 0, 236, 0, 0, 249, 0, 243, 242, 0, 245, - 244, 0, 0, 251, 0, 260, 0, 0, 262, 0, - 287, 0, 271, 270, 287, 287, 287, 0, 0, 289, - 0, 304, 0, 300, 299, 0, 0, 306, 0, 0, - 311, 310, 317, 0, 0, 319, 0, 330, 330, 0, - - 0, 332, 0, 355, 355, 355, 355, 0, 345, 344, - 0, 0, 355, 355, 0, 0, 357, 0, 0, 366, - 0, 0, 368, 0, 0, 0, 0, 387, 387, 387, - 387, 387, 0, 0, 389, 0, 0, 0, 394, 393, - 400, 0, 0, 402, 0, 431, 0, 415, 414, 0, - 0, 431, 0, 0, 431, 431, 431, 0, 0, 433, - 0, 0, 0, 0, 0, 448, 0, 0, 450, 0, - 461, 0, 457, 456, 0, 0, 463, 0, 480, 480, - 0, 474, 473, 480, 0, 0, 482, 0, 499, 0, - 491, 490, 499, 499, 0, 0, 501, 0, 0, 514, - - 0, 508, 507, 514, 0, 0, 0, 516, 0, 536, - 536, 536, 0, 0, 538, 0, 0, 0, 547, 541, - 0, 0, 43, 0, 44, 0, 0, 0, 0, 0, - 0, 0, 216, 0, 265, 0, 0, 335, 0, 0, - 392, 0, 0, 0, 0, 391, 0, 0, 0, 0, - 0, 215, 0, 264, 334, 0, 0, 0, 0, 0, - 0, 50, 49, 64, 64, 0, 56, 55, 64, 0, - 264, 75, 0, 90, 90, 0, 0, 97, 96, 107, - 107, 0, 103, 102, 0, 0, 114, 113, 0, 116, - 115, 0, 0, 131, 130, 143, 143, 143, 143, 0, - - 200, 200, 200, 0, 0, 0, 164, 163, 200, 200, - 200, 200, 200, 200, 200, 200, 200, 200, 0, 0, - 234, 234, 0, 0, 234, 234, 234, 0, 0, 0, - 0, 0, 0, 0, 0, 287, 287, 287, 287, 0, - 304, 0, 317, 0, 0, 0, 330, 0, 355, 355, - 355, 355, 0, 347, 346, 355, 355, 0, 0, 366, - 0, 0, 0, 0, 387, 0, 0, 387, 387, 387, - 0, 0, 400, 0, 431, 0, 417, 416, 0, 0, - 0, 421, 420, 431, 0, 0, 431, 0, 0, 438, - 437, 0, 440, 439, 448, 0, 461, 0, 480, 480, - - 480, 0, 499, 499, 0, 0, 0, 0, 0, 0, - 514, 0, 0, 536, 0, 0, 536, 0, 0, 0, - 0, 12, 0, 544, 545, 43, 0, 0, 0, 0, - 0, 0, 0, 216, 0, 0, 265, 0, 0, 321, - 335, 0, 0, 392, 0, 436, 0, 504, 391, 0, - 0, 0, 0, 0, 215, 0, 0, 264, 334, 435, - 0, 503, 436, 435, 64, 64, 64, 0, 0, 0, - 0, 0, 90, 90, 0, 107, 107, 0, 0, 143, - 143, 0, 0, 143, 0, 0, 0, 200, 200, 0, - 160, 159, 200, 200, 200, 200, 200, 200, 0, 0, - - 200, 200, 200, 0, 0, 234, 234, 0, 222, 221, - 234, 0, 0, 234, 0, 322, 0, 241, 240, 0, - 0, 256, 255, 0, 287, 287, 287, 287, 0, 304, - 0, 0, 0, 0, 0, 324, 323, 330, 0, 355, - 0, 0, 355, 355, 0, 0, 355, 0, 0, 366, - 0, 0, 0, 0, 387, 0, 375, 374, 387, 387, - 387, 0, 0, 0, 0, 0, 431, 0, 419, 418, - 431, 0, 425, 424, 431, 0, 448, 0, 461, 0, - 480, 480, 480, 0, 499, 0, 0, 0, 495, 494, - 0, 0, 0, 506, 505, 514, 0, 0, 536, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 11, 43, - 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, - 0, 321, 0, 0, 404, 436, 453, 0, 504, 0, - 0, 0, 0, 0, 0, 0, 0, 435, 452, 0, - 503, 0, 0, 0, 0, 0, 64, 0, 0, 0, - 71, 70, 0, 90, 90, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 143, 0, 137, 136, 0, 0, - 0, 0, 150, 149, 0, 0, 200, 200, 200, 0, - 0, 200, 200, 200, 0, 184, 183, 0, 0, 200, - 200, 0, 0, 234, 234, 0, 0, 0, 228, 227, - - 234, 0, 235, 322, 0, 0, 287, 287, 287, 287, - 0, 288, 304, 0, 0, 313, 312, 0, 330, 0, - 355, 0, 339, 338, 0, 0, 355, 0, 349, 348, - 355, 0, 356, 0, 366, 0, 205, 0, 405, 387, - 387, 387, 387, 0, 0, 0, 396, 395, 0, 401, - 431, 431, 431, 0, 448, 0, 461, 0, 0, 0, - 480, 0, 0, 0, 499, 0, 493, 492, 0, 0, - 514, 0, 0, 536, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 532, 531, 0, 0, 0, 0, 0, - 0, 48, 0, 0, 0, 0, 125, 148, 204, 0, - - 254, 0, 0, 0, 370, 404, 453, 466, 0, 47, - 0, 0, 0, 124, 147, 0, 253, 452, 465, 0, - 0, 52, 51, 0, 54, 53, 64, 0, 0, 0, - 90, 0, 0, 0, 0, 99, 98, 0, 101, 100, - 0, 0, 0, 133, 132, 0, 0, 0, 139, 138, - 0, 0, 152, 151, 200, 200, 200, 0, 172, 171, - 0, 0, 200, 200, 0, 186, 185, 200, 200, 0, - 0, 234, 234, 0, 226, 225, 234, 0, 0, 287, - 0, 0, 287, 287, 287, 304, 0, 0, 330, 0, - 331, 355, 0, 341, 340, 355, 355, 0, 0, 0, - - 0, 205, 371, 405, 387, 387, 387, 387, 0, 0, - 431, 0, 0, 431, 0, 448, 0, 449, 461, 0, - 0, 468, 467, 0, 0, 480, 0, 476, 475, 0, - 0, 0, 499, 0, 0, 514, 0, 0, 515, 0, + 652, 650, 15, 10, 10, 15, 15, 630, 10, 630, + + 5, 6, 5, 8, 9, 8, 646, 638, 639, 647, + 644, 647, 645, 649, 638, 639, 649, 42, 10, 42, + 42, 42, 40, 42, 42, 46, 10, 46, 46, 650, + 46, 650, 650, 46, 63, 10, 63, 63, 63, 61, + 63, 63, 63, 67, 10, 67, 650, 67, 84, 10, + 84, 84, 84, 82, 84, 84, 84, 84, 84, 88, + 10, 88, 650, 88, 95, 10, 95, 95, 95, 93, + 95, 99, 10, 99, 110, 10, 110, 110, 110, 108, + 110, 110, 110, 114, 10, 114, 127, 10, 127, 127, + 127, 125, 127, 127, 127, 131, 10, 131, 131, 140, + + 10, 140, 140, 140, 138, 140, 140, 144, 10, 144, + 144, 157, 10, 157, 157, 157, 155, 157, 157, 157, + 161, 10, 161, 161, 180, 10, 180, 180, 180, 178, + 180, 180, 180, 180, 180, 180, 184, 10, 184, 237, + 10, 237, 237, 237, 235, 237, 237, 237, 237, 237, + 237, 237, 237, 241, 10, 241, 241, 248, 10, 248, + 248, 248, 246, 248, 252, 10, 252, 252, 271, 10, + 271, 271, 271, 269, 271, 271, 271, 271, 271, 275, + 10, 275, 650, 275, 286, 10, 286, 286, 286, 284, + 286, 286, 286, 290, 10, 290, 297, 10, 297, 297, + + 297, 295, 297, 301, 10, 301, 650, 301, 324, 10, + 324, 324, 324, 322, 324, 324, 324, 324, 328, 10, + 328, 328, 341, 10, 341, 341, 341, 339, 341, 341, + 345, 10, 345, 354, 10, 354, 354, 354, 352, 354, + 354, 358, 10, 358, 367, 10, 367, 367, 367, 365, + 367, 367, 371, 10, 371, 392, 10, 392, 392, 392, + 390, 392, 392, 392, 392, 392, 392, 396, 10, 396, + 650, 403, 10, 403, 403, 403, 401, 403, 407, 10, + 407, 407, 650, 407, 650, 407, 424, 10, 424, 424, + 424, 422, 424, 424, 424, 424, 424, 428, 10, 428, + + 428, 437, 10, 437, 437, 437, 435, 437, 437, 441, + 10, 441, 468, 10, 468, 468, 468, 466, 468, 468, + 468, 468, 468, 472, 10, 472, 485, 10, 485, 485, + 485, 483, 485, 485, 489, 10, 489, 489, 498, 10, + 498, 498, 498, 496, 498, 498, 502, 10, 502, 517, + 10, 517, 517, 517, 515, 517, 517, 517, 517, 521, + 10, 521, 521, 536, 10, 536, 536, 536, 534, 536, + 536, 536, 536, 540, 10, 540, 650, 540, 551, 10, + 551, 551, 551, 549, 551, 551, 551, 647, 646, 573, + 10, 573, 573, 573, 571, 573, 573, 573, 577, 10, + + 577, 604, 10, 604, 604, 604, 602, 604, 604, 608, + 10, 608, 608, 608, 608, 625, 10, 625, 625, 625, + 623, 625, 625, 625, 629, 10, 629, 629, 10, 0, + 2, 2, 0, 4, 7, 641, 640, 0, 0, 0, + 0, 0, 0, 41, 43, 43, 43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 48, 68, - 80, 0, 0, 125, 148, 0, 254, 291, 0, 359, - 370, 466, 0, 0, 47, 79, 0, 0, 124, 147, - 0, 253, 465, 0, 0, 64, 0, 292, 0, 90, - 0, 86, 85, 0, 0, 0, 0, 135, 134, 0, - - 200, 200, 200, 0, 174, 173, 200, 200, 200, 0, - 0, 0, 0, 212, 234, 234, 234, 0, 0, 287, - 0, 273, 272, 287, 287, 287, 304, 0, 0, 330, - 355, 355, 355, 360, 0, 362, 361, 0, 371, 0, - 0, 387, 387, 387, 0, 69, 431, 0, 423, 422, - 431, 0, 432, 448, 461, 0, 462, 0, 470, 469, - 480, 0, 0, 487, 486, 499, 0, 0, 514, 552, - 0, 520, 519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 68, 80, 0, - - 0, 239, 291, 0, 359, 0, 0, 79, 0, 0, - 238, 0, 0, 64, 0, 65, 292, 0, 0, 0, - 0, 0, 0, 0, 144, 200, 200, 200, 200, 0, - 0, 200, 200, 0, 0, 0, 0, 201, 234, 234, - 234, 0, 0, 261, 0, 0, 287, 287, 287, 287, - 0, 0, 0, 0, 0, 0, 355, 355, 355, 360, - 0, 0, 373, 372, 0, 0, 387, 387, 0, 388, - 69, 0, 0, 431, 448, 461, 480, 0, 481, 499, - 0, 0, 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - + 62, 64, 64, 64, 64, 64, 0, 0, 83, 85, + 85, 85, 85, 85, 85, 0, 0, 94, 96, 96, + + 0, 109, 111, 111, 111, 111, 0, 126, 128, 128, + 128, 128, 0, 139, 141, 141, 141, 0, 156, 158, + 158, 158, 158, 0, 179, 181, 181, 181, 181, 181, + 181, 181, 181, 0, 236, 238, 238, 238, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 0, 247, 249, 249, 0, 270, 272, 272, 272, 272, + 272, 272, 272, 0, 0, 285, 287, 287, 287, 287, + 0, 296, 298, 298, 0, 0, 0, 323, 325, 325, + 325, 325, 325, 325, 0, 340, 342, 342, 342, 0, + 353, 355, 355, 355, 0, 366, 368, 368, 368, 0, + + 391, 393, 393, 393, 393, 393, 393, 393, 393, 0, + 0, 402, 404, 404, 0, 0, 0, 0, 0, 0, + 0, 423, 425, 425, 425, 425, 425, 425, 0, 436, + 438, 438, 438, 0, 467, 469, 469, 469, 469, 469, + 469, 469, 469, 469, 0, 484, 486, 486, 486, 486, + 0, 497, 499, 499, 499, 0, 516, 518, 518, 518, + 518, 518, 0, 535, 537, 537, 537, 537, 537, 0, + 0, 550, 552, 552, 552, 552, 0, 0, 0, 572, + 574, 574, 574, 574, 0, 603, 605, 605, 605, 0, + 624, 626, 626, 626, 626, 626, 0, 0, 0, 0, + + 0, 3, 0, 0, 0, 0, 0, 0, 0, 648, + 0, 0, 43, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 239, 308, 0, 0, 0, 0, 238, 0, 0, - 64, 0, 76, 0, 82, 81, 0, 91, 0, 0, - 200, 200, 200, 200, 0, 176, 175, 200, 200, 0, - 0, 0, 0, 0, 0, 234, 234, 0, 0, 0, - 0, 267, 266, 287, 287, 287, 0, 0, 0, 0, - 0, 0, 305, 0, 0, 326, 325, 355, 355, 0, - 0, 0, 367, 0, 377, 376, 0, 0, 0, 0, - 0, 0, 0, 431, 448, 461, 480, 499, 0, 309, - 514, 0, 0, 0, 0, 0, 0, 0, 0, 0, - + 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, + 0, 0, 0, 64, 64, 64, 64, 0, 0, 0, + 85, 85, 85, 85, 85, 0, 0, 0, 96, 0, + 0, 111, 0, 0, 111, 0, 0, 128, 128, 128, + 0, 0, 141, 141, 0, 0, 158, 158, 158, 0, + 0, 0, 0, 0, 0, 181, 181, 181, 181, 181, + + 0, 0, 238, 0, 0, 238, 0, 0, 238, 238, + 238, 238, 238, 238, 238, 238, 238, 238, 0, 0, + 0, 0, 0, 0, 272, 272, 272, 0, 0, 272, + 272, 272, 0, 0, 0, 287, 0, 0, 0, 0, + 0, 0, 298, 0, 0, 17, 0, 325, 0, 0, + 325, 325, 325, 0, 0, 342, 0, 0, 0, 0, + 0, 0, 355, 0, 0, 368, 368, 0, 0, 393, + 393, 393, 0, 0, 393, 393, 393, 0, 0, 0, + 404, 0, 0, 0, 0, 0, 0, 425, 425, 425, + 425, 425, 0, 0, 0, 0, 438, 0, 0, 469, + + 0, 0, 469, 469, 469, 469, 469, 469, 0, 0, + 486, 486, 486, 0, 0, 499, 0, 0, 0, 0, + 518, 518, 0, 0, 518, 0, 0, 537, 0, 0, + 537, 537, 0, 0, 0, 552, 0, 0, 552, 0, + 0, 0, 643, 574, 574, 574, 0, 0, 0, 0, + 605, 0, 0, 626, 626, 626, 626, 0, 0, 0, + 14, 1, 0, 0, 636, 0, 0, 0, 633, 632, + 0, 0, 19, 18, 43, 0, 0, 45, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 112, 308, - 0, 0, 0, 111, 0, 0, 0, 0, 0, 0, - 200, 200, 0, 0, 200, 200, 200, 0, 0, 0, - 0, 0, 0, 0, 0, 234, 0, 0, 0, 230, - 229, 0, 250, 287, 287, 287, 0, 283, 282, 0, - 0, 0, 0, 0, 0, 0, 355, 0, 0, 0, - 351, 350, 0, 0, 0, 0, 383, 382, 0, 0, - 0, 0, 0, 0, 431, 0, 0, 0, 0, 480, - 499, 0, 309, 0, 0, 0, 0, 0, 0, 524, - - 0, 0, 0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 112, 485, 0, 0, 111, 484, 0, 0, - 0, 0, 0, 0, 200, 0, 0, 0, 168, 167, - 0, 0, 200, 200, 0, 0, 0, 0, 0, 0, - 0, 0, 234, 0, 220, 219, 287, 0, 0, 287, - 0, 0, 0, 0, 0, 0, 0, 318, 355, 0, - 343, 342, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 431, 0, 0, 0, 0, 455, - 454, 0, 0, 0, 0, 0, 0, 510, 509, 0, + 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 21, 29, 0, 0, 0, - 0, 20, 28, 0, 95, 485, 518, 94, 484, 517, - 0, 0, 0, 0, 0, 0, 121, 200, 0, 166, - 165, 0, 170, 169, 200, 200, 0, 0, 0, 0, - 0, 0, 0, 0, 234, 287, 0, 275, 274, 287, - 0, 0, 294, 0, 0, 293, 355, 0, 0, 0, + 0, 64, 64, 0, 0, 64, 0, 0, 66, 0, + 0, 85, 85, 85, 85, 85, 0, 0, 87, 0, + 0, 96, 0, 0, 98, 0, 111, 0, 105, 104, + 111, 0, 0, 113, 0, 0, 0, 128, 128, 0, + 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, + 0, 143, 0, 0, 0, 158, 158, 0, 0, 0, + 0, 160, 0, 0, 165, 164, 0, 167, 166, 0, + 0, 181, 181, 181, 181, 0, 0, 183, 0, 238, + + 238, 238, 0, 196, 195, 238, 0, 200, 199, 0, + 0, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 0, 0, 240, 0, 0, 245, 244, 0, 0, 251, + 0, 272, 272, 272, 0, 262, 261, 272, 272, 272, + 0, 0, 274, 0, 0, 287, 0, 281, 280, 0, + 283, 282, 0, 0, 289, 0, 298, 0, 0, 300, + 0, 0, 325, 0, 309, 308, 325, 325, 325, 0, + 0, 327, 0, 342, 0, 338, 337, 0, 0, 344, + 0, 0, 349, 348, 355, 0, 0, 357, 0, 368, + 368, 0, 0, 370, 0, 393, 393, 393, 393, 0, + + 383, 382, 0, 0, 393, 393, 0, 0, 395, 0, + 0, 404, 0, 0, 406, 0, 0, 0, 0, 0, + 425, 425, 425, 425, 425, 0, 0, 427, 0, 0, + 432, 431, 438, 0, 0, 440, 0, 469, 0, 453, + 452, 0, 0, 469, 0, 0, 469, 469, 469, 0, + 0, 471, 0, 0, 0, 0, 0, 486, 0, 0, + 488, 0, 499, 0, 495, 494, 0, 0, 501, 0, + 518, 518, 0, 512, 511, 518, 0, 0, 520, 0, + 537, 0, 529, 528, 537, 537, 0, 0, 539, 0, + 0, 552, 0, 546, 545, 552, 0, 0, 0, 554, + + 0, 574, 574, 574, 0, 0, 576, 0, 0, 581, + 580, 605, 0, 0, 607, 0, 0, 0, 626, 626, + 0, 0, 626, 0, 0, 628, 0, 0, 0, 637, + 631, 0, 0, 43, 0, 44, 0, 0, 0, 0, + 0, 0, 0, 0, 254, 0, 303, 0, 0, 373, + 0, 0, 430, 0, 0, 0, 0, 579, 429, 0, + 0, 0, 0, 0, 253, 0, 302, 372, 0, 0, + 0, 578, 0, 578, 0, 0, 50, 49, 64, 64, + 0, 56, 55, 64, 0, 302, 85, 0, 0, 85, + 85, 85, 0, 0, 96, 0, 111, 111, 0, 0, + + 118, 117, 128, 128, 0, 124, 123, 0, 0, 135, + 134, 0, 137, 136, 0, 0, 148, 147, 158, 158, + 0, 154, 153, 0, 0, 169, 168, 181, 181, 181, + 181, 0, 238, 238, 238, 0, 0, 0, 202, 201, + 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, + 0, 0, 272, 272, 0, 0, 272, 272, 272, 0, + 0, 0, 0, 0, 0, 0, 0, 579, 325, 325, + 325, 325, 0, 342, 0, 355, 0, 0, 0, 368, + 0, 393, 393, 393, 393, 0, 385, 384, 393, 393, + 0, 0, 404, 0, 0, 0, 0, 0, 425, 0, + + 0, 425, 425, 425, 0, 438, 0, 469, 0, 455, + 454, 0, 0, 0, 459, 458, 469, 0, 0, 469, + 0, 0, 476, 475, 0, 478, 477, 486, 0, 499, + 0, 518, 518, 518, 0, 537, 537, 0, 0, 0, + 0, 0, 0, 552, 0, 0, 574, 0, 0, 574, + 0, 605, 0, 0, 612, 611, 626, 626, 0, 618, + 617, 626, 0, 0, 0, 0, 12, 0, 634, 635, + 43, 0, 68, 0, 0, 0, 0, 0, 0, 254, + 0, 0, 303, 0, 0, 359, 373, 0, 0, 430, + 0, 474, 0, 542, 579, 0, 429, 0, 0, 0, + + 0, 0, 253, 0, 0, 302, 372, 473, 0, 541, + 578, 0, 474, 473, 64, 64, 64, 0, 0, 85, + 0, 73, 72, 85, 85, 85, 0, 0, 0, 0, + 0, 111, 111, 0, 128, 128, 0, 0, 158, 158, + 0, 181, 181, 0, 0, 181, 0, 0, 0, 238, + 238, 0, 198, 197, 238, 238, 238, 238, 238, 238, + 0, 0, 238, 238, 238, 0, 0, 272, 272, 0, + 260, 259, 272, 0, 0, 272, 0, 360, 0, 279, + 278, 0, 0, 294, 293, 0, 325, 325, 325, 325, + 0, 342, 0, 0, 0, 0, 0, 362, 361, 368, + + 0, 393, 0, 0, 393, 393, 0, 0, 393, 0, + 0, 404, 0, 69, 0, 0, 0, 425, 0, 413, + 412, 425, 425, 425, 0, 0, 0, 0, 469, 0, + 457, 456, 469, 0, 463, 462, 469, 0, 486, 0, + 499, 0, 518, 518, 518, 0, 537, 0, 0, 0, + 533, 532, 0, 0, 0, 544, 543, 552, 0, 0, + 574, 0, 0, 0, 0, 0, 0, 605, 0, 626, + 626, 626, 0, 0, 0, 0, 11, 43, 0, 68, + 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, + 359, 0, 0, 442, 474, 491, 0, 542, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 473, 490, 0, + 541, 0, 0, 0, 0, 0, 0, 64, 0, 0, + 85, 85, 85, 85, 0, 0, 0, 92, 91, 0, + 111, 111, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 181, 0, 175, 174, + 0, 0, 0, 0, 188, 187, 0, 0, 238, 238, + 238, 0, 0, 238, 238, 238, 0, 222, 221, 0, + 0, 238, 238, 0, 0, 272, 272, 0, 0, 0, + 266, 265, 272, 0, 273, 360, 0, 0, 325, 325, + 325, 325, 0, 326, 342, 0, 0, 351, 350, 0, + + 368, 0, 393, 0, 377, 376, 0, 0, 393, 0, + 387, 386, 393, 0, 394, 0, 404, 0, 69, 243, + 0, 443, 425, 425, 425, 425, 0, 0, 434, 433, + 0, 439, 469, 469, 469, 0, 486, 0, 499, 0, + 0, 0, 518, 0, 0, 0, 537, 0, 531, 530, + 0, 0, 552, 0, 0, 574, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 570, 569, 0, 605, 0, + 606, 0, 0, 0, 0, 626, 0, 0, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 163, 186, + 242, 0, 292, 0, 0, 0, 408, 442, 491, 504, + + 0, 0, 47, 0, 0, 0, 0, 162, 185, 0, + 291, 490, 503, 0, 0, 0, 52, 51, 0, 54, + 53, 64, 0, 0, 85, 85, 85, 85, 0, 86, + 0, 0, 111, 0, 0, 0, 0, 120, 119, 0, + 122, 121, 0, 0, 0, 150, 149, 0, 152, 151, + 0, 0, 171, 170, 0, 0, 0, 177, 176, 0, + 0, 190, 189, 238, 238, 238, 0, 210, 209, 0, + 0, 238, 238, 0, 224, 223, 238, 238, 0, 0, + 272, 272, 0, 264, 263, 272, 0, 0, 325, 0, + 0, 325, 325, 325, 342, 0, 0, 368, 0, 369, + + 393, 0, 379, 378, 393, 393, 0, 0, 0, 0, + 243, 409, 443, 425, 425, 425, 425, 0, 469, 0, + 0, 469, 0, 486, 0, 487, 499, 0, 0, 506, + 505, 0, 0, 518, 0, 514, 513, 0, 0, 0, + 537, 0, 0, 552, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 472, 471, 0, 489, - 488, 0, 0, 0, 530, 0, 0, 0, 529, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, - 0, 0, 0, 22, 0, 95, 518, 94, 517, 0, - 0, 0, 0, 0, 200, 0, 0, 200, 0, 0, - 190, 0, 0, 0, 189, 0, 234, 0, 0, 0, - 0, 0, 0, 0, 0, 355, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 427, - 426, 0, 0, 0, 0, 0, 500, 0, 0, 0, + 0, 0, 0, 614, 613, 0, 616, 615, 626, 0, + 0, 0, 0, 0, 0, 0, 48, 89, 101, 0, + 0, 0, 163, 186, 0, 292, 329, 0, 397, 408, + 504, 0, 0, 0, 47, 100, 0, 0, 0, 162, + + 185, 0, 291, 503, 0, 0, 0, 64, 0, 330, + 0, 0, 85, 85, 85, 90, 0, 111, 0, 107, + 106, 0, 0, 0, 0, 0, 173, 172, 0, 238, + 238, 238, 0, 212, 211, 238, 238, 238, 0, 0, + 0, 0, 250, 272, 272, 272, 0, 0, 325, 0, + 311, 310, 325, 325, 325, 342, 0, 0, 368, 393, + 393, 393, 398, 0, 400, 399, 0, 409, 0, 0, + 425, 425, 425, 0, 469, 0, 461, 460, 469, 0, + 470, 486, 499, 0, 500, 0, 508, 507, 518, 0, + 0, 525, 524, 537, 0, 0, 552, 642, 0, 558, + + 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 60, 0, 59, 0, - 0, 108, 200, 0, 0, 0, 0, 0, 0, 0, - - 192, 0, 0, 191, 234, 0, 269, 268, 0, 0, - 0, 296, 298, 295, 297, 355, 379, 0, 378, 0, - 0, 413, 409, 0, 0, 412, 408, 0, 444, 0, - 443, 0, 528, 0, 0, 527, 0, 0, 0, 537, - 0, 0, 0, 12, 0, 12, 0, 33, 0, 0, - 0, 0, 31, 32, 0, 0, 0, 0, 30, 58, - 57, 200, 0, 0, 0, 0, 0, 188, 187, 0, - 0, 0, 0, 234, 0, 0, 0, 0, 355, 0, - 0, 0, 0, 0, 0, 442, 441, 522, 526, 521, - 525, 0, 0, 0, 0, 0, 0, 0, 0, 25, - - 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, + 89, 101, 0, 0, 0, 277, 329, 0, 397, 0, + 0, 610, 100, 0, 0, 0, 276, 0, 0, 609, + 64, 0, 65, 330, 0, 71, 70, 0, 0, 85, + 85, 90, 0, 0, 0, 0, 0, 0, 0, 0, + 182, 238, 238, 238, 238, 0, 0, 238, 238, 0, + 0, 0, 0, 239, 272, 272, 272, 0, 0, 299, + 0, 0, 325, 325, 325, 325, 0, 0, 0, 0, + + 0, 0, 393, 393, 393, 398, 0, 0, 411, 410, + 0, 0, 425, 425, 0, 426, 0, 0, 469, 486, + 499, 518, 0, 519, 537, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 277, + 346, 0, 0, 610, 0, 0, 0, 276, 0, 0, + 609, 64, 0, 75, 74, 0, 0, 0, 0, 0, + 97, 0, 103, 102, 0, 112, 0, 0, 0, 238, + + 238, 238, 238, 0, 214, 213, 238, 238, 0, 0, + 0, 0, 0, 0, 272, 272, 0, 0, 0, 0, + 305, 304, 325, 325, 325, 0, 0, 0, 0, 0, + 0, 343, 0, 0, 364, 363, 393, 393, 0, 0, + 0, 405, 0, 415, 414, 0, 0, 0, 0, 0, + 0, 0, 469, 486, 499, 518, 537, 0, 347, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 194, 0, 193, 0, 218, 217, - 0, 0, 0, 0, 0, 0, 0, 337, 336, 0, - 0, 407, 0, 406, 0, 0, 11, 0, 0, 0, + 0, 0, 0, 626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 196, 195, 0, 0, 0, - 0, 0, 0, 381, 380, 0, 0, 0, 0, 0, + 0, 133, 0, 346, 0, 0, 0, 132, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 81, 80, 0, + 0, 0, 238, 238, 0, 0, 238, 238, 238, 0, + 0, 0, 0, 0, 0, 0, 0, 272, 0, 0, + 0, 268, 267, 0, 288, 325, 325, 325, 0, 321, + 320, 0, 0, 0, 0, 0, 0, 0, 393, 0, + 0, 0, 389, 388, 0, 0, 0, 0, 421, 420, + 0, 0, 0, 0, 0, 0, 469, 0, 0, 0, + 0, 518, 537, 0, 347, 0, 0, 0, 0, 0, + 0, 562, 0, 0, 0, 0, 561, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 411, 410, 0, 0, 0, 35, 0, 0, - 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 133, 0, 523, 0, 0, 132, 0, 522, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 238, + 0, 0, 0, 206, 205, 0, 0, 238, 238, 0, + 0, 0, 0, 0, 0, 0, 0, 272, 0, 258, + 257, 325, 0, 0, 325, 0, 0, 0, 0, 0, + 0, 0, 356, 393, 0, 381, 380, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, + + 0, 0, 0, 0, 493, 492, 0, 0, 0, 0, + 0, 0, 548, 547, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27, 0, 0, 26, 0, 0, 0, 0, - 0, 0, 178, 0, 0, 177, 0, 0, 277, 0, - 0, 276, 0, 0, 37, 0, 36, 0, 0, 0, - 0, 182, 0, 181, 0, 279, 0, 278, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 21, 29, 0, 0, 0, + 0, 20, 28, 0, 116, 0, 523, 556, 115, 0, + 522, 555, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 142, 0, 238, 0, 204, 203, 0, 208, + 207, 238, 238, 0, 0, 0, 0, 0, 0, 0, + 0, 272, 325, 0, 313, 312, 325, 0, 0, 332, + 0, 0, 331, 393, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 510, 509, 0, 527, 526, 0, 0, + 0, 568, 0, 0, 0, 567, 0, 0, 0, 0, + 0, 583, 591, 0, 0, 0, 0, 582, 590, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 23, 0, 0, 0, 22, 0, 116, 0, + 556, 115, 0, 555, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 238, 0, 0, 238, 0, 0, + 228, 0, 0, 0, 227, 0, 272, 0, 0, 0, + + 0, 0, 0, 0, 0, 393, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, + 464, 0, 0, 0, 0, 0, 538, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 585, 0, 0, 0, + 584, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 146, 145, + 60, 0, 59, 0, 77, 0, 76, 0, 0, 129, + 0, 238, 0, 0, 0, 0, 0, 0, 0, 230, + 0, 0, 229, 272, 0, 307, 306, 0, 0, 0, + 334, 336, 333, 335, 393, 417, 0, 416, 0, 0, + + 451, 447, 0, 0, 450, 446, 0, 482, 0, 481, + 0, 566, 0, 0, 565, 0, 0, 0, 575, 0, + 0, 0, 0, 0, 0, 622, 0, 621, 0, 0, + 0, 0, 12, 0, 12, 0, 33, 0, 0, 0, + 0, 31, 32, 0, 0, 0, 0, 30, 146, 145, + 58, 57, 0, 0, 0, 238, 0, 0, 0, 0, + 0, 226, 225, 0, 0, 0, 0, 272, 0, 0, + 0, 0, 393, 0, 0, 0, 0, 0, 0, 480, + 479, 560, 564, 559, 563, 595, 0, 0, 0, 0, + 593, 594, 0, 0, 0, 0, 592, 620, 619, 0, + + 0, 0, 0, 0, 0, 0, 0, 25, 0, 0, + 0, 0, 24, 0, 0, 0, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 39, 38, 0, 154, 0, 153, 0, 0, 0, - 0, 0, 0, 156, 155, 180, 179, 281, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 587, + 0, 0, 0, 0, 586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 232, 0, + 231, 0, 256, 255, 0, 0, 0, 0, 0, 0, + 0, 375, 374, 0, 0, 445, 0, 444, 0, 0, + + 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 79, 78, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, + 233, 0, 0, 0, 0, 0, 0, 419, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 449, 448, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, + 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 597, 0, 0, 0, 596, 0, 0, 0, 0, + 27, 0, 0, 26, 0, 0, 0, 0, 0, 0, + 216, 0, 0, 215, 0, 0, 315, 0, 0, 314, + 0, 0, 589, 0, 0, 588, 0, 0, 37, 0, + 36, 0, 0, 0, 0, 220, 0, 219, 0, 317, + 0, 316, 0, 0, 599, 0, 598, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 39, 38, 0, 192, 0, 191, 0, 0, 0, + 0, 601, 600, 0, 0, 194, 193, 218, 217, 319, + 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 13, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + 0, 0, 0, 13, 0 } ; static yyconst YY_CHAR yy_ec[256] = @@ -789,12 +852,12 @@ static yyconst YY_CHAR yy_ec[256] = 13, 14, 13, 13, 13, 15, 13, 16, 17, 18, 19, 20, 21, 1, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 31, 38, 39, 40, 41, 42, 43, 44, 45, 31, - 46, 1, 47, 1, 48, 1, 49, 50, 51, 52, + 31, 38, 39, 40, 41, 42, 43, 44, 45, 46, + 47, 1, 48, 1, 49, 1, 50, 51, 52, 53, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 1, 1, 1, 1, 1, 1, 1, 1, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -811,3540 +874,4150 @@ static yyconst YY_CHAR yy_ec[256] = 1, 1, 1, 1, 1 } ; -static yyconst YY_CHAR yy_meta[75] = +static yyconst YY_CHAR yy_meta[76] = { 0, 1, 2, 2, 2, 1, 1, 1, 1, 1, 3, 3, 1, 4, 4, 4, 5, 6, 1, 7, 8, 1, 9, 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 1, 1, 5, 9, 9, - 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 1, 1, 5, 9, + 9, 9, 9, 9, 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5 + 5, 5, 5, 5, 5 } ; -static yyconst flex_uint16_t yy_base[3813] = +static yyconst flex_uint16_t yy_base[4472] = { 0, 0, 0, 0, 3, 6, 9, 12, 29, 16, 19, - 14, 17, 33, 36, 49, 55, 45, 61, 108, 174, - 66, 72, 75, 78, 83, 128, 131, 134, 138, 141, - 194, 197, 200, 204, 207, 224, 230, 233, 241, 250, - 268, 335, 288, 291, 294, 298, 301, 355, 358, 361, - 402, 472, 365, 368, 542, 602, 422, 425, 662, 729, - 428, 432, 435, 452, 492, 495, 498, 502, 796, 863, - 505, 522, 562, 565, 568, 572, 575, 622, 930, 997, - 625, 628, 1064, 0, 632, 635, 682, 685, 688, 692, - 695, 749, 1138, 1195, 752, 755, 759, 762, 816, 819, - - 822, 826, 1252, 1319, 829, 883, 886, 889, 893, 896, - 950, 953, 1386, 1455, 956, 960, 1524, 1578, 963, 1017, - 1020, 1023, 1027, 1030, 1158, 1161, 1632, 1699, 1164, 1168, - 1171, 1215, 1218, 1221, 1225, 1228, 1766, 1823, 1272, 1275, - 1880, 1950, 1278, 1282, 2020, 2087, 1339, 1342, 2154, 2221, - 1345, 1349, 1406, 1409, 2288, 2358, 1412, 1416, 1419, 1475, - 1478, 1481, 1485, 1488, 1544, 1547, 1550, 1554, 1557, 1598, - 1601, 1604, 1608, 1611, 1652, 1655, 2428, 2495, 1658, 1662, - 1665, 1719, 1722, 1725, 1729, 1732, 2562, 2632, 1786, 1789, - 2702, 2769, 1792, 1796, 2836, 2903, 1799, 1843, 1846, 1849, - - 1853, 1856, 1900, 1903, 2970, 3027, 1906, 1910, 3084, 3152, - 1913, 1930, 1970, 1973, 1976, 1980, 1983, 2000, 3220, 3287, - 2040, 2043, 2046, 2050, 2053, 2107, 2110, 2113, 3354, 3418, - 2132, 2134, 3482, 3550, 2174, 2180, 0, 0, 9063,11902, - 11902, 95, 100, 29, 41,11902, 103, 51,11902,11902, - 9052,11902,11902, 9039,11902, 9054, 9054, 164,11902,11902, - 11902,11902, 9048, 9048, 9003,11902, 158, 9027, 0, 142, - 11902, 8994, 8982,11902, 164, 3614, 8976, 3678, 2187, 1238, - 9027, 31,11902, 253, 9018, 0, 143,11902, 8968, 8963, - 84,11902, 258, 253, 9021, 8968,11902, 322, 9007, 0, - - 148,11902, 8977,11902, 325, 218,11902, 328, 9003, 0, - 242,11902, 8973, 8969, 8967,11902, 389, 373,11902, 393, - 8995, 0, 245,11902, 8947, 8940, 8944,11902, 396, 8997, - 11,11902, 455, 8984, 0, 313,11902, 8936, 8936,11902, - 458, 8987, 79,11902, 461, 8978, 0, 446,11902, 8926, - 8940, 8942, 8924, 8938, 19,11902, 525, 509,11902, 529, - 8966, 0, 447,11902, 101, 8922, 8928, 317, 8905, 258, - 531, 8907,11902, 532, 8957, 246,11902, 535, 8944, 0, - 576,11902, 8911,11902, 652, 8950, 287,11902, 716, 8937, - 0, 577,11902, 8886, 8892, 8898, 8882, 320,11902, 719, - - 112, 8887, 377,11902, 722, 8923, 0, 580,11902, 8879, - 8889, 8872,11902, 783, 639,11902, 786, 8915, 0, 636, - 11902, 8877,11902, 789, 2129, 8917, 681,11902, 847, 8908, - 0, 637,11902, 8878, 8870, 8872, 102,11902, 850, 8908, - 704,11902, 853, 8895, 0, 640,11902, 8857, 8861,11902, - 856, 900,11902, 914, 8888, 0, 706,11902, 8855, 8857, - 11902, 920, 908,11902, 923, 8881, 0, 707,11902, 8851, - 8831,11902, 980, 967,11902, 989, 8874, 0, 773,11902, - 8823, 8821, 8824, 8834, 8836, 447,11902, 1047, 1034, 774, - 11902, 1056, 8860, 0, 840,11902, 8826,11902, 1188, 1305, - - 748, 1183, 771, 8814, 815,11902, 1308, 8853, 0, 841, - 11902, 8803, 8808, 8809, 8803, 8796,11902, 1311, 454, 8810, - 882,11902, 1370, 8838, 0, 898,11902, 8805, 8803,11902, - 1375, 1423,11902, 1378, 8831, 0, 964,11902, 8797, 8793, - 1191, 8795, 137,11902, 1437, 1424,11902, 1444, 8823, 0, - 965,11902, 8771, 518,11902, 1447, 8825, 204,11902, 1450, - 8816, 0, 968,11902, 8768, 8778,11902, 1506, 1492,11902, - 1512, 8809, 0, 1031,11902, 8756, 8760, 8770, 8744,11902, - 1515, 8804, 949,11902, 1518, 8795, 0, 1032,11902, 8747, - 8757, 8745, 8746,11902, 1682, 272, 8741, 1171,11902, 1691, - - 8781, 0, 1035,11902, 8739, 8743, 8741, 1669, 8742,11902, - 1694, 8768, 0, 1172,11902, 8727, 8185, 8175,11902, 1749, - 1736, 1758, 408, 8167,11902, 8228, 8217,11902,11902,11902, - 1750, 153, 8168, 8167, 8165, 8213,11902, 0, 2120, 8162, - 8208, 8189, 8153, 328, 1234, 8154, 8147, 8151, 8143, 1128, - 259, 8132, 8132, 1185, 8155, 396, 1301, 8129, 8119, 8123, - 1445, 584, 8102, 8103, 8128, 398, 1755, 652, 439, 979, - 11902, 0, 8089, 8103, 8098, 8087, 8124, 8068,11902, 0, - 8057, 8067,11902, 0, 8052, 2187, 8041, 8058,11902, 0, - 8038, 8049, 8045, 8042,11902, 0, 8011, 8020, 8020,11902, - - 0, 2241, 2244, 8000, 8009, 8009, 8006, 7996, 7994,11902, - 0, 7985, 2254, 7966, 2308, 7957, 7963, 7959, 7968, 7967, - 7942, 7961, 7955, 7945, 7934, 7945,11902, 0, 2311, 7943, - 11902, 0, 7925, 175, 2314, 7905, 7918, 7917, 7908, 7900, - 11902, 0, 7890, 2317, 2320, 7891,11902, 0, 7868, 7869, - 7886,11902, 0, 7861, 2338, 7844, 7852, 7851, 7838,11902, - 0, 7827, 2378, 7832,11902, 0, 2381, 7829, 7826,11902, - 0, 7825, 7821, 7821,11902, 0, 7832, 7831, 7802, 2384, - 7796, 7809, 7808, 7790, 7788,11902, 0, 7780, 7773, 1506, - 1812, 1242, 1514, 1813,11902, 0, 7774, 7763, 7769, 7779, - - 7767, 7749, 7742,11902, 0, 2387, 7746, 7741,11902, 0, - 7741, 2390, 7723, 7745, 7702, 7710, 7705, 7701, 7679,11902, - 0, 7676, 7683, 7672, 7657,11902, 0, 7659, 2408, 7654, - 11902, 0, 7644, 7647, 2448, 7640, 7636,11902, 0, 7635, - 2451, 7640, 7607, 7613, 7615,11902, 0, 7609, 2454, 7601, - 512, 7594, 7641,11902, 0, 7606, 7588, 7593, 7572, 7608, - 7613, 1272, 7561,11902, 1925, 0, 7556, 7539, 7584, 7582, - 7534,11902, 2457, 2006, 7528, 2192, 2516, 2077, 7539, 7529, - 7515, 7527, 7507, 7497, 7491, 7505, 7493, 1266, 7500, 7499, - 7484, 7479, 7471, 7475, 7478, 7463, 2081, 7473, 7455, 7468, - - 7447, 7444, 7453, 7440, 7448, 7430, 7425, 7438, 2142, 7416, - 7415, 2460, 2526, 2519, 2529, 2262, 2582, 7420, 7412, 2523, - 2592, 7423, 2585, 2341, 7412, 2595, 2652, 2603, 2666, 2657, - 2660, 2663, 2671, 2722, 2725, 2735, 2728, 2411, 2748, 2614, - 2790, 2798, 2801, 2808, 2865, 2740, 2876, 1869, 2794, 2622, - 7405, 2862, 2689, 2868, 7400, 7391, 7390, 7385, 7373, 7369, - 7378, 7375, 7356, 2871, 2926, 2929, 2819, 2932, 2936, 7360, - 7349, 7357, 2939, 2891, 7360, 7354, 7334, 2990, 2993, 1306, - 7335, 2999, 2957, 3003, 3048, 3056, 3059, 7326, 3062, 3106, - 2213, 7326, 3109, 3066, 7323, 7309, 7305, 3112, 3117, 7319, - - 3121, 3140, 3173, 3185, 3176, 3188, 7286, 3180, 3248, 7301, - 7282, 3241, 3252, 7289, 3, 7279, 3244, 3204, 3255, 7290, - 7265, 3310, 3317, 7283, 7263, 3320, 3323, 7263, 7258, 7257, - 7267, 7248, 7251, 7252, 7238, 3374, 3377, 7248, 3383, 3276, - 7232, 3386, 3389, 7240, 3438, 3343, 3442, 7226, 3447, 7230, - 7233, 7232, 3450, 3456, 3504, 3507, 3511, 3514, 3517, 7213, - 3529, 3401, 3571, 3574, 7225, 7205, 3579, 3465, 7218, 3582, - 3585, 7193, 3597, 3536, 7207, 7201, 3604, 3608, 1333, 7195, - 3611, 3636, 7190, 7221, 3629, 3648,11902, 7179, 7187, 7182, - 3652, 3657, 7212,11902,11902, 882, 7170,11902, 7202, 7200, - - 7149,11902,11902, 7144, 3682,11902,11902, 7139, 3690, 3693, - 11902, 3699, 1941, 7126, 7119, 7127, 7136, 7126, 7109, 7114, - 7099, 7105, 7105, 7102, 7092, 7077, 7074, 718, 7085, 7068, - 7068, 7074, 1566, 2070, 7061, 7060, 7069, 7059, 7048, 7039, - 7046, 7042, 7034, 7026, 7023, 7035, 7007, 7001, 3702, 3745, - 6999, 6988, 3705, 3753, 7000, 3713, 3761,11902, 3764, 6988, - 6993, 3767, 3770,11902, 3773, 6973, 3776,11902,11902, 6974, - 3792, 3795,11902, 3798, 3801, 3804, 6968, 6964, 3819, 3823, - 3831, 3837,11902, 3840, 3843, 3850, 3861, 3864, 3872, 3875, - 11902, 3879, 3882,11902,11902, 3894,11902,11902, 3903, 3906, - - 6972, 6976, 6973, 6967, 3914, 3917,11902, 3921, 6951, 6971, - 6941, 3924,11902,11902, 3936, 3942,11902,11902, 3950, 3954, - 6922, 6937, 6917, 6922, 6912, 6907, 6909, 6898, 1247, 3962, - 3970,11902, 3973, 3977,11902,11902, 3985, 3992,11902, 3995, - 6892, 6893, 3998, 4004,11902,11902, 6853, 6868, 6864, 4016, - 4019,11902, 4023, 6837, 4026, 4029,11902,11902, 4044,11902, - 11902, 4052, 4056,11902, 4059, 4062, 4065, 4071,11902, 4080, - 6827, 4090,11902,11902, 6830, 6830, 6833, 4084, 4099,11902, - 4103, 6833, 4106,11902,11902, 4114, 4118,11902, 4125, 4133, - 11902,11902, 6823, 4144, 4147,11902, 4150, 4153, 4156, 4159, - - 4174,11902, 4178, 6815, 6811, 6803, 6814, 4182,11902,11902, - 4193, 4197, 6810, 6798, 4205, 4211,11902, 4214, 6780, 6789, - 4217, 4220,11902, 4224, 6788, 1567, 6784, 6767, 4239, 6785, - 6783, 6759, 4246, 4249,11902, 4252, 6757, 4259,11902,11902, - 6761, 4272, 4275,11902, 4278, 6740, 4281,11902,11902, 4297, - 4300, 4308, 4315, 4319, 6751, 4327, 6732, 4333, 4336,11902, - 4340, 4345, 4348, 4359, 4363, 6723, 4371, 4377,11902, 4380, - 6723, 4383,11902,11902, 4391, 4401,11902, 4404, 6715, 6706, - 4410,11902,11902, 6728, 4423, 4426,11902, 4430, 6703, 4433, - 11902,11902, 6675, 4449, 4452, 4455,11902, 4458, 6651, 4461, - - 4479,11902,11902, 4467, 6653, 4487, 4492,11902, 4495, 6615, - 4498, 6610, 4502, 4506,11902, 4516, 888, 4521,11902,11902, - 6551, 6541, 6494, 4525,11902, 6458, 6454, 6446, 6396, 6374, - 6313, 6307, 2073, 6294, 2281, 6301, 6291, 2116, 6304, 6286, - 2216, 6201, 6132, 6066, 6057, 2272, 6035, 6047, 6020, 5997, - 5974, 2350, 5870, 2420, 2486, 5855, 5807, 5798, 5722, 5719, - 4529,11902,11902, 5684, 38, 4544,11902,11902, 26, 4552, - 2829, 4555, 4558, 43, 195, 4564, 4567,11902,11902, 181, - 216, 4577,11902,11902, 4585, 4588,11902,11902, 4597,11902, - 11902, 4605, 4608,11902,11902, 239, 326, 4616, 370, 4626, - - 4629, 4634, 4637, 4640, 4658, 4666,11902,11902, 4647, 4674, - 4677, 4685, 4688, 4695, 4706, 4709, 4713, 4716, 4727, 4735, - 395, 460, 4739, 4742, 488, 4757, 525, 4760, 526, 4763, - 4766, 4781, 4784, 4789, 4802, 539, 567, 616, 654, 4805, - 636, 4809, 4812, 4816, 4831, 4835, 650, 4843, 658, 4851, - 703, 715, 4869,11902,11902, 4855, 726, 4863, 782, 776, - 4877, 784, 922, 932, 1005, 4882, 4885, 1086, 1112, 1130, - 4896, 1119, 4900, 4904, 1138, 4908,11902,11902, 4918, 4924, - 4932,11902,11902, 1162, 4940, 4946, 1173, 4954, 4958,11902, - 11902, 4967,11902,11902, 1169, 4975, 1211, 4978, 1231, 1227, - - 1302, 4981, 1293, 4984, 4988, 5006, 5014, 1299, 5017, 5020, - 1310, 1362, 5028, 1355, 5035, 5047, 5038, 5056, 1603, 1405, - 5061,11902, 1406,11902,11902, 1376, 1374, 1418, 1423, 1427, - 1442, 1447, 1468, 2490, 1480, 1512, 2557, 1516, 1525, 2684, - 2762, 1513, 1527, 2965, 1548, 3411, 1565, 3212, 3021, 1553, - 1564, 1561, 1610, 1618, 3215, 1612, 1623, 3314, 3476, 5064, - 1622, 3618, 5067, 5070, 5080, 5083, 5086, 5089, 1636, 5092, - 5113, 5121, 1636, 1618, 5124, 5135, 5143, 5146, 5153, 5157, - 5161, 5165, 5183, 5175, 5168, 5193, 5196, 5204, 5207, 5213, - 11902,11902, 5225, 5229, 5232, 5235, 5238, 5243, 5256, 5261, - - 5274, 5280, 5285, 5298, 5303, 1665, 1668, 5306,11902,11902, - 5317, 5322, 5328, 1684, 5341, 3644, 5344,11902,11902, 5352, - 5361,11902,11902, 5355, 1687, 1669, 1689, 1700, 5374, 1698, - 5377, 5380, 5383, 5399, 5402,11902,11902, 1705, 5410, 1732, - 5413, 5425, 5418, 1735, 5436, 5439, 1751, 5447, 1743, 1747, - 5450, 1756, 1749, 1758, 1757, 5454,11902,11902, 1782, 1794, - 1794, 5462, 1810, 5469, 5477, 5472, 1800, 5487,11902,11902, - 1816, 5496,11902,11902, 1807, 5504, 1830, 5507, 1849, 5510, - 5514, 5517, 5535, 5538, 1852, 5542, 5546, 5562,11902,11902, - 5570, 1874, 5573,11902,11902, 1866, 1885, 5589, 1862, 5592, - - 1966, 2511, 5601, 5604, 5612, 1929, 1997, 1961,11902, 5619, - 1882, 1879, 1884, 1968, 1879, 1926, 3728, 1936, 1947, 1943, - 1949, 5622, 1950, 1952, 5625, 5631, 5637, 1983, 5641, 2000, - 2007, 2000, 2048, 1995, 1999, 2012, 2025, 5644, 5647, 2050, - 5650, 2075, 5653, 5657, 5665, 5671, 2070, 5679, 2061, 5683, - 11902,11902, 5691, 2062, 5694, 5698, 5701, 5706, 5719, 5722, - 5730, 5733, 5737, 5756, 5764, 5767,11902,11902, 5775, 5778, - 5786, 5789,11902,11902, 5799, 5805, 2075, 2100, 2094, 5813, - 5817, 5825, 2113, 2137, 5831,11902,11902, 5839, 5843, 2121, - 2115, 5851, 5857, 2145, 2158, 5860, 5863, 5872,11902,11902, - - 2153, 5880,11902, 5883, 5886, 5889, 2145, 5892, 2201, 2193, - 5895,11902, 2189, 5899, 5914,11902,11902, 5922, 2224, 5925, - 2202, 5928,11902,11902, 5945, 5949, 2212, 5957,11902,11902, - 2205, 5965,11902, 2203, 5969, 5972, 5975, 2210, 5978, 2218, - 2225, 2218, 2247, 5987, 2263, 5991,11902,11902, 5999,11902, - 2263, 6002, 2271, 6006, 2274, 6009, 2283, 6012, 6020, 6034, - 6042, 6045, 6049, 6066, 6069, 6073,11902,11902, 6081, 2273, - 2287, 2324, 6089, 6092, 2326, 2313, 2377, 2314, 2333, 2320, - 2386, 2337, 6096,11902,11902, 6104, 2375, 2460, 2399, 6110, - 6116, 6124, 2328, 2349, 2379, 2358, 6128, 6131, 6135, 2363, - - 6138, 2364, 2378, 2405, 6141, 6144, 6147, 6151, 2406, 6154, - 2418, 2433, 2414, 6157, 6160, 2416, 6163, 6166, 6169, 2418, - 6172,11902,11902, 6180,11902,11902, 2432, 6188, 2423, 6191, - 2430, 6194, 6198, 6212, 6216,11902,11902, 6224,11902,11902, - 6232, 6235, 6240,11902,11902, 6256, 6259, 6274,11902,11902, - 6267, 6282,11902,11902, 2455, 2464, 2487, 6290,11902,11902, - 6298, 6301, 2485, 2475, 6309,11902,11902, 2497, 6317, 6320, - 6323, 2487, 2484, 6328,11902,11902, 2493, 6342, 6345, 2500, - 6348, 6351, 2503, 2527, 2532, 2538, 6367, 6370, 2549, 6373, - 11902, 2543, 6376,11902,11902, 2542, 2551, 2552, 6392, 6398, - - 6406, 6410, 6413, 6416, 6419, 6425, 6428, 6437, 6446, 2546, - 2561, 6449, 6455, 2580, 6467, 2579, 6471,11902, 2580, 6477, - 6480,11902,11902, 6497, 6500, 2589, 6508,11902,11902, 6516, - 6519, 6522, 2603, 6530, 2611, 2624, 2636, 6537,11902, 6540, - 6543, 2649, 2655, 2656, 2662, 2673, 2665, 2695, 2695, 2705, - 2720, 6551, 6558, 2736, 2809, 6561, 2984, 3943, 6570, 6573, - 6577, 2687, 2685, 6582, 6585, 2699, 6588, 6591, 2698, 6594, - 6597, 6601, 2694, 2723, 6604, 6607, 2725, 2726, 6610, 6613, - 2747, 6616, 6619, 2739, 2752, 2769, 6622, 6625, 6628, 6631, - 6634,11902,11902, 6642, 6649, 6652, 6655,11902,11902, 6663, - - 2764, 2777, 2839, 6671,11902,11902, 6682, 2796, 2799, 6687, - 6696, 6690, 6705,11902, 2805, 2810, 2832, 6709, 6714, 6717, - 6724,11902,11902, 6720, 6738, 6741, 6744, 6747, 6750, 6770, - 2829, 2837, 2839, 6776, 6779,11902,11902, 6788, 6793, 6796, - 6801, 6809, 6815, 6818, 6821, 6827, 6836, 6841,11902,11902, - 6850, 6854,11902, 2849, 2848, 6857,11902, 6861,11902,11902, - 2829, 6876, 6879,11902,11902, 2853, 6887, 2864, 2869,11902, - 6891,11902,11902, 2919, 2905, 2921, 2919, 2927, 2929, 2917, - 2936, 2932, 2939, 6899, 6902, 3029, 3023, 2938, 2943, 3058, - 2941, 2955, 2954, 2958, 3069, 2957, 2996, 6906, 6909, 2992, - - 2999, 6912, 6921, 3007, 6924, 3004, 3021, 6927, 3037, 3038, - 6930, 3034, 3055, 3074, 6934,11902, 6937, 6940, 6944, 6947, - 6955, 6965, 6968, 6974,11902, 3088, 3077, 3074, 3098, 6977, - 6980, 3088, 3097, 6989, 3784, 3862, 6997,11902, 3083, 3114, - 7000, 7003, 7006,11902, 7009, 7012, 3131, 3126, 3136, 7030, - 7036, 7039, 7048, 7054, 7057, 7061, 3134, 3137, 7069, 7075, - 7078, 7081,11902,11902, 7089, 7093, 7101, 7107, 7110,11902, - 7119, 7125, 7129, 7137, 3151, 3145, 3172, 7143,11902, 3185, - 7146, 3189, 3189, 3221, 3217, 3234, 3222, 3248, 3232, 3228, - 3248, 3236, 3261, 7149, 3290, 3492, 3319, 3234, 3251, 3265, - - 3269, 3269, 3262, 3266, 3278, 3278, 3282, 3289, 3283, 3315, - 3342, 7155, 7158, 3332, 3345, 3330, 3359, 7168, 3352, 3364, - 7171, 7175,11902, 7178,11902,11902, 7189,11902, 7195, 7198, - 3370, 3388, 7201, 3380, 7204,11902,11902, 3399, 3394, 3425, - 3503, 3437, 3443, 3557, 3462, 3431, 7219, 7222, 7225, 7233, - 7240,11902,11902, 3465, 3471, 3470, 7248, 7253, 7266, 3632, - 3999, 7261,11902, 7274, 7280,11902,11902, 3470, 7288, 7293, - 7296, 7306,11902, 7311,11902,11902, 7320, 7325, 7333, 7338, - 7347, 3687, 3715, 7355, 7358, 7361, 3491, 3493, 7364, 7367, - 7379, 3517, 3544, 3568, 3571, 3589, 3574, 3595, 3599, 3603, - - 3618, 7383, 3609, 3649, 3698, 3567, 3582, 3570, 3584, 3609, - 3630, 3620, 3630, 3617, 3638, 3667, 3677, 3668, 7386, 7389, - 3684, 3690, 3675, 7392, 3699, 3707, 7397, 7402, 7410, 7418, - 3698, 7421, 7424, 7430, 7444, 3732, 3733, 3766, 3749, 3769, - 3754, 3792, 3776, 3795, 3781, 3783, 7447, 7450, 7458,11902, - 11902, 7466,11902, 3776, 7470, 3786, 7474,11902,11902, 3812, - 3814, 3818, 3822, 3825, 3832, 7488, 3823, 7491, 7494, 7503, - 11902,11902, 7511, 3876, 3904, 7519,11902,11902, 3834, 3854, - 3914, 3855, 3858, 3969, 7527, 7530, 7533, 7541, 7548, 7559, - 7562, 7565, 7568, 7571, 7589, 3886, 3871, 3886, 3890,11902, - - 3910, 3905, 3905, 3917,11902, 7580, 3941, 3994, 7584, 3894, - 3917, 3940, 3997, 4005, 3956, 3969, 3974, 3992, 4042, 4043, - 4010, 4018, 7603, 7606, 4009, 4025, 7609, 7612, 4012, 7615, - 4079, 4095, 7623, 7628, 4029, 7632, 7635, 7643,11902,11902, - 7651, 7654, 4022, 4031, 4070, 4063, 4073, 4084, 4104, 4085, - 4101, 4102, 4090, 7662,11902,11902, 4113, 7670, 7673, 4095, - 4126, 4136, 4167, 4131, 4148, 4180, 7681,11902, 4136, 7684, - 11902,11902, 4162, 4167, 4174, 4184, 4189, 4194, 4195, 4204, - 4211, 4200, 4201, 4210, 7692, 7696, 4225, 4251, 7704,11902, - 11902, 7712, 7715, 7723, 7726, 7734, 7737,11902,11902, 4199, - - 4223, 4240, 4235, 4219, 4242, 4262, 4266, 7745, 4304, 7748, - 7753, 7757, 4236, 4223, 4287,11902,11902, 4242, 4244, 4237, - 4298,11902,11902, 4256, 7767, 7772, 7776, 7779, 7782, 7786, - 4277, 4288, 4284, 4300, 7789, 7795,11902, 4275, 7798,11902, - 11902, 7808,11902,11902, 7816, 4266, 4309, 4315, 4353, 4329, - 4334, 4331, 4367, 4338, 4331, 7819, 7822,11902,11902, 7830, - 4355, 4370,11902, 4363, 4373,11902, 4344, 4383, 4371, 4389, - 4378, 4383, 4394, 4397, 4384, 4396, 4412, 4415, 4402, 7837, - 7841, 4408, 4419, 4411, 4422, 7849,11902,11902, 7857,11902, - 11902, 7865, 4437, 4437,11902, 4444, 4447, 4447,11902, 4449, - - 7868, 4514, 7871, 7874, 7893, 7936, 7983, 4418, 4421,11902, - 4435, 4437, 4445,11902, 4456, 7901, 7904, 7907, 7912, 4508, - 4477, 4528, 4500, 7915, 4489, 7927, 7918, 7930, 4508, 4511, - 11902, 4545, 4517, 4525,11902, 4555, 4515, 7948, 7956, 7974, - 7966, 4576, 4579, 4584, 4586, 4536, 4592, 4562, 4595, 4573, - 4591, 4615, 4616, 4584, 4601, 4636, 4638, 4612, 8003,11902, - 11902, 4649, 4618, 4649, 4624, 7977,11902, 4659, 4638, 4640, - 4665, 4649, 4651, 8011, 4674, 8014, 4716, 4686, 8034, 8081, - 4926, 4636, 4695, 5241, 4654, 4696,11902, 4715,11902, 4715, - 8024,11902, 4653, 8054, 4751, 4803, 8045, 8063, 4700, 4707, - - 11902, 4723, 4726,11902, 4700, 8101,11902,11902, 8109, 4813, - 4821,11902,11902,11902,11902, 4703,11902, 4749,11902, 4751, - 4760,11902,11902, 4758, 4783,11902,11902, 4761,11902, 4794, - 11902, 4793,11902, 4804, 4811,11902, 4812, 4814, 8071,11902, - 4831, 4870, 4806, 4818, 4823, 4847, 8074,11902, 4795, 4828, - 4819, 4889,11902,11902, 4827, 4847, 4846, 4916,11902,11902, - 11902, 8117, 4924, 4886, 4953, 4889, 8120,11902,11902, 4890, - 4905, 4906, 4928, 8128, 4992, 4934, 5003, 4943, 8131, 4951, - 4955, 4981, 4971, 4984, 4974,11902,11902,11902,11902,11902, - 11902, 8135, 4996, 4983, 4996, 8138, 4962, 4945, 4961,11902, - - 4979, 4986, 4977, 4986,11902, 5006, 8141, 8150, 5021, 5029, - 5053, 5037, 5045, 5075, 5053, 5094, 5056, 5094, 8159, 8162, - 5064, 5073, 5086, 5070, 5079, 5091, 8170, 8173, 5078, 5080, - 5115, 5107, 5123, 5112, 8181, 5115, 5085, 5102, 5074, 5100, - 5098, 5135, 5112, 5132, 8184, 5164, 5216, 5153, 5160, 5163, - 5167, 5181, 5180, 5218,11902, 5216,11902, 8193,11902,11902, - 5212, 5219, 5215, 5219, 5228, 5231, 8201,11902,11902, 5265, - 5263,11902, 5240,11902, 5245, 5272,11902, 5222, 5224, 5227, - 5240, 5234, 5237, 5244, 5257, 5292, 5287, 5300, 5298, 5298, - 5308, 5309, 5308, 5314, 5316,11902,11902, 5319, 5326, 5326, - - 5332, 5343, 5343,11902,11902, 5365, 5364, 5354, 5326, 5337, - 5385, 5342, 5334, 5345, 5398, 5356, 5370, 5396, 5383, 5404, - 5396, 5394, 5411, 5407, 5405, 5422, 5424, 5421, 5443, 5432, - 5436, 5459,11902,11902, 5483, 5431, 5434,11902, 5488, 5441, - 5444,11902, 5492, 5485, 5487, 5489, 5490, 5503, 5494, 5526, - 5508, 5498, 5534, 5521, 5514, 5547, 5530, 5520, 5550, 5558, - 5502, 5563,11902, 5510, 5571,11902, 5551, 5557, 5556, 5562, - 5583, 5564,11902, 5590, 5567,11902, 5596, 5578,11902, 5603, - 5584,11902, 5642, 5545,11902, 5557,11902, 5594, 5611, 5600, - 5633,11902, 5638,11902, 5644,11902, 5645,11902, 5652, 8209, - - 5673, 5679, 5664, 5685, 5680, 5698, 5670, 5672, 5673, 5675, - 8212,11902,11902, 5721,11902, 5720,11902, 5724, 5733, 5737, - 5736, 5729, 5743,11902,11902,11902,11902,11902,11902, 5728, - 5737, 5744, 5754, 5766, 5784, 5735, 5894, 5734, 5893, 5923, - 5924, 5790, 5887, 5793, 5811, 5860, 5937, 5818, 5963, 5804, - 5918, 5942, 5976, 5913, 6005, 6030, 6045, 6007, 6008, 5902, - 5966, 5967, 5997, 6014, 6157, 6011, 6061, 6159, 6168, 6220, - 6236, 6167, 6209, 6183, 6186, 6185, 6262, 6252, 6259, 6054, - 6160, 6270, 6278, 6069, 6275, 6318, 6322, 6294, 6321, 6190, - 6230, 6346, 6348, 6247, 6336, 6369, 6405, 6371, 6422, 6386, - - 6435, 6413, 6425, 6434, 6473, 6470, 6515, 6509, 6619, 6447, - 6487, 6475, 6627, 6485, 6621, 6640, 6711, 6629, 6651, 6372, - 6659, 6712, 6717, 6694, 6718, 6735, 6741, 6456, 5816, 8220, - 8223,11902,11902, 8243, 8252, 8261, 8270, 8279, 8288, 8297, - 8306, 8315, 8324, 8333, 8342, 8351, 8360, 8369, 8378, 8387, - 8396, 8405, 8414, 8423, 8432, 8441, 8450, 8459, 8468, 8477, - 8486, 8495, 8504, 8513, 8522, 8531, 8540, 8549, 8558, 8567, - 8576, 8585, 8594, 8603, 8612, 8621, 8630, 8639, 8648, 8657, - 8666, 8675, 8684, 8693, 8702, 8711, 8720, 8729, 8738, 8747, - 8756, 8765, 8774, 8781, 8788, 8795, 8802, 8809, 8816, 8823, - - 8830, 8837, 8844, 8851, 8858, 8865, 8872, 8879, 8886, 8893, - 8900, 8907, 8914, 8921, 8928, 8935, 8942, 8949, 8956, 8963, - 8972, 8979, 8984, 8991, 8996, 9003, 9008, 9015, 9020, 9027, - 9032, 9039, 9044, 9051, 9056, 9063, 9068, 9075, 9080, 9087, - 9092, 9099, 9104, 9111, 9116, 9123, 9128, 9135, 9140, 9147, - 9152, 9159, 9164, 9171, 9176, 9183, 9188, 9195, 9200, 9207, - 9212, 9219, 9224, 9231, 9236, 9243, 9248, 9255, 9260, 9267, - 9272, 9279, 9284, 9291, 9296, 9305, 9311, 9318, 9326, 9334, - 9342, 9349, 9357, 9364, 9372, 9380, 9388, 9396, 9404, 9412, - 9420, 9427, 9435, 9443, 9450, 9458, 9465, 9473, 9480, 9488, - - 9495, 9503, 9510, 9518, 9525, 9533, 9540, 9548, 9555, 9563, - 9570, 9578, 9585, 9593, 9600, 9608, 9615, 9623, 9631, 9639, - 9646, 9654, 9661, 9669, 9676, 9684, 9691, 9699, 9706, 9714, - 9723, 9729, 9736, 9744, 9751, 9759, 9766, 9774, 9781, 9789, - 9796, 9804, 9812, 9819, 9827, 9834, 9842, 9850, 9857, 9865, - 9873, 9881, 9889, 9897, 9904, 9912, 9919, 9927, 9934, 9942, - 9950, 9958, 9965, 9973, 9980, 9988, 9995,10003,10010,10018, - 10025,10033,10040,10048,10055,10063,10070,10078,10085,10093, - 10101,10109,10116,10124,10133,10142,10149,10156,10164,10172, - 10180,10187,10195,10202,10210,10218,10225,10233,10241,10249, - - 10257,10264,10272,10280,10288,10295,10303,10310,10318,10326, - 10334,10341,10349,10356,10364,10371,10379,10386,10394,10402, - 10410,10417,10425,10432,10440,10447,10455,10462,10470,10477, - 10485,10492,10500,10507,10515,10524,10533,10540,10548,10556, - 10564,10571,10579,10587,10595,10603,10611,10619,10627,10635, - 10643,10650,10658,10666,10674,10681,10689,10696,10704,10712, - 10719,10727,10734,10742,10749,10757,10764,10772,10780,10787, - 10795,10802,10810,10817,10825,10833,10841,10848,10856,10863, - 10871,10878,10886,10895,10904,10912,10919,10927,10935,10942, - 10950,10958,10966,10974,10982,10989,10997,11005,11012,11020, - - 11028,11035,11042,11050,11058,11065,11073,11080,11088,11096, - 11103,11111,11118,11126,11133,11141,11148,11156,11164,11172, - 11180,11188,11195,11203,11211,11219,11228,11237,11244,11252, - 11260,11267,11275,11283,11291,11299,11306,11314,11322,11329, - 11337,11345,11352,11359,11367,11375,11382,11389,11397,11405, - 11413,11420,11428,11435,11442,11450,11457,11465,11472,11480, - 11487,11495,11504,11513,11520,11528,11536,11544,11552,11560, - 11568,11576,11583,11591,11598,11606,11614,11622,11630,11638, - 11646,11654,11661,11669,11677,11685,11693,11700,11707,11714, - 11722,11729,11737,11744,11752,11761,11770,11777,11785,11793, - - 11801,11809,11816,11823,11831,11838,11847,11856,11865,11874, - 11883,11892 + 14, 17, 33, 36, 49, 55, 45, 61, 109, 176, + 66, 72, 76, 79, 83, 129, 132, 135, 140, 157, + 196, 199, 202, 207, 224, 227, 233, 236, 244, 253, + 271, 339, 291, 294, 297, 302, 319, 359, 362, 365, + 407, 475, 370, 387, 427, 430, 433, 438, 455, 495, + 543, 614, 498, 501, 685, 746, 506, 523, 807, 875, + 563, 566, 569, 574, 591, 594, 634, 637, 943, 1011, + 640, 645, 662, 665, 705, 708, 711, 716, 1079, 1147, + 766, 769, 772, 777, 827, 830, 833, 838, 1215, 1283, + + 855, 895, 1351, 1420, 898, 901, 906, 923, 963, 966, + 969, 974, 1489, 1547, 991, 1031, 1034, 1037, 1042, 1059, + 1099, 1102, 1605, 1673, 1105, 1110, 1127, 1167, 1170, 1173, + 1178, 1195, 1741, 1811, 1235, 1238, 1881, 1936, 1241, 1246, + 1303, 1306, 1309, 1314, 1371, 1374, 1991, 2059, 1377, 1382, + 1440, 1443, 1446, 1451, 1509, 1512, 2127, 2185, 1515, 1520, + 2243, 2314, 1567, 1570, 2385, 2453, 1573, 1578, 2521, 2589, + 1625, 1628, 1631, 1636, 2657, 2728, 1693, 1696, 1699, 1704, + 1761, 1764, 1767, 1772, 1789, 1831, 1834, 1837, 1842, 1859, + 1901, 1904, 1907, 1912, 1956, 1959, 2799, 2867, 1962, 1967, + + 2011, 2014, 2017, 2022, 2079, 2082, 2935, 3006, 2085, 2090, + 3077, 3145, 2147, 2150, 3213, 3281, 2153, 2158, 2205, 2208, + 2211, 2216, 2263, 2266, 3349, 3407, 2269, 2274, 3465, 3534, + 2291, 2294, 2334, 2337, 2340, 2345, 2362, 2365, 3603, 3671, + 2405, 2408, 2411, 2416, 2433, 2473, 2476, 2479, 3739, 3804, + 204, 2495, 3869, 3938, 2484, 2502, 4007, 4074, 2542, 2545, + 2548, 2552, 2609, 2612, 2615, 2620, 2677, 2680, 2683, 2688, + 2705, 2708, 2748, 2751, 2754, 2759, 2776, 2779, 4141, 4209, + 2819, 2822, 2825, 2830, 2847, 2887, 2890, 2893, 0, 0, + 10406,13997,13997, 96, 100, 29, 41,13997, 103, 51, + + 13997,13997,10395,13997,13997,10380,13997,10395,10395, 674, + 13997,13997,13997,13997,10389,10389,10343,13997, 160,10366, + 0, 87,13997,10332,10320,13997, 166, 4273,10314, 4344, + 2906, 1200,10366, 31,13997, 169,10357, 0, 120,13997, + 10304,10299, 21,13997, 256, 154, 84, 153,13997, 261, + 10350, 0, 211,13997,10295,10300,10305,10295,10288,13997, + 264, 16,10306, 237,13997, 326,10331, 0, 248,13997, + 10300,13997, 329, 305,13997, 332,10329, 0, 282,13997, + 10294,10290,10292,13997, 394, 373,13997, 397,10317, 0, + 350,13997,10268,10263,10263,13997, 400, 453, 249,13997, + + 466,10309, 0, 418,13997,10260,10256,13997, 534, 521, + 381,13997, 597,10302, 0, 439,13997,10253,10244,10248, + 13997, 600, 595, 426,13997, 668,10294, 0, 442,13997, + 10237,10255,10257,10235,10251, 81,13997, 671, 716,13997, + 674,10280, 0, 445,13997, 141, 9610, 9620, 90, 9604, + 27, 450, 9606,13997, 796, 9657, 441,13997, 799, 9648, + 0, 507,13997, 9614,13997, 862, 9654, 509,13997, 865, + 9645, 0, 554,13997, 9592, 9598, 9607, 9584, 242,13997, + 868, 313, 9589, 594,13997, 930, 9621, 0, 584,13997, + 9576, 9585, 9568,13997, 933, 784,13997, 936, 9612, 0, + + 625,13997, 9568,13997, 995, 2911, 9612, 713,13997, 998, + 9603, 0, 696,13997, 9571, 9563, 9565, 164,13997, 1001, + 9597, 726,13997, 1004, 9588, 0, 818,13997, 9540, 9544, + 13997, 1063, 841,13997, 1066, 9575, 0, 886,13997, 9534, + 9536,13997, 1069, 909,13997, 1072, 9564, 0, 954,13997, + 9531, 9507,13997, 1134, 1113,13997, 1137, 9555, 0, 1022, + 13997, 9498, 9496, 9499, 9509, 9501, 514,13997, 1140, 1181, + 1187,13997, 1202, 9530, 0, 1090,13997, 9487,13997, 1207, + 1534, 664, 1203, 727, 677, 773,13997, 1275, 9512, 0, + 1158,13997, 9461, 9459, 9464, 9457, 9446,13997, 1333, 258, + + 917,13997, 1336, 9494, 0, 1226,13997, 9455, 9447,13997, + 1343, 1321,13997, 1402, 9476, 0, 1253,13997, 9430, 9427, + 1265, 9427, 920,13997, 1411, 1389,13997, 1471, 9455, 0, + 1362,13997, 9403, 583,13997, 1480, 1395, 1045,13997, 1537, + 9449, 0, 1431,13997, 9404, 9413,13997, 1540, 1458,13997, + 1600, 9429, 0, 1500,13997, 9379, 9373, 9380, 9357,13997, + 1656, 9418, 1189,13997, 1662, 9408, 0, 1524,13997, 9361, + 9370, 9355, 9348,13997, 1665, 449, 9343, 1195,13997, 1724, + 9383, 0, 1558,13997, 9340, 9344, 9341, 1775, 9332,13997, + 1730, 9345, 0, 1616,13997, 9302, 9304, 9292,13997, 1733, + + 1845,13997, 1798, 9338, 0, 1640,13997, 9303, 9287,13997, + 1801, 4415, 9285, 2977, 1234,13997, 1806, 9318, 0, 1651, + 13997, 9265, 9249, 776,13997, 1868, 1522, 1249, 1871, 1247, + 9240,13997, 9301, 9290,13997,13997,13997, 1973, 90, 9239, + 9228, 9216, 9265,13997, 0, 2555, 9213, 9256, 9238, 1276, + 332, 320, 9210, 9209, 9213, 9205, 1651, 467, 9198, 9199, + 9200, 1859, 9211, 712, 856, 9185, 9184, 9183, 1914, 797, + 9169, 9165, 9166, 9187, 732, 1969, 992, 9156, 868, 1069, + 13997, 0, 9145, 9164, 9159, 9138, 9177, 9139,13997, 0, + 9129, 9123, 9128, 9139, 9136, 9134, 1330,13997, 0, 9122, + + 9131,13997, 0, 9098, 2897, 9091, 9092,13997, 0, 9071, + 9090, 9085, 9085,13997, 0, 9065, 9070, 9070,13997, 0, + 9046, 9061, 9057, 9048,13997, 0, 2900, 2958, 9029, 9034, + 9034, 9031, 9022, 9022,13997, 0, 9020, 3028, 9001, 3031, + 8993, 8995, 8992, 9000, 8993, 8975, 8992, 8987, 8984, 8973, + 8984,13997, 0, 3036, 8975,13997, 0, 8975, 177, 3054, + 8951, 8965, 8967, 8952, 8944,13997, 0, 8934, 3057, 3097, + 8944,13997, 0, 8938, 8940, 8957, 8929,13997, 0, 8928, + 3100, 8905, 8923, 8921, 8909,13997, 0, 8901, 3103, 8884, + 13997, 0, 3107, 8883, 8880,13997, 0, 8878, 8871, 8872, + + 13997, 0, 8882, 8871, 8855, 3110, 8844, 8857, 8860, 8843, + 8829,13997, 0, 8822, 8814, 1341, 1401, 1980, 1416, 1528, + 1983,13997, 0, 8815, 8808, 8807, 8818, 8815, 8795,13997, + 0, 3165, 8798, 8792,13997, 0, 8789, 3168, 8772, 8793, + 8779, 8787, 8775, 8775, 8759,13997, 0, 8756, 8770, 8759, + 8752,13997, 0, 8742, 3171, 8731,13997, 0, 8727, 8722, + 3175, 8719, 8712,13997, 0, 8710, 3178, 8719, 8679, 8685, + 8687,13997, 0, 8689, 3233, 8681, 13, 8673, 8720,13997, + 0, 8681, 8671, 8682, 8655,13997, 0, 3236, 8653, 8643, + 13997, 0, 8648, 8656, 8644, 8633, 8618, 8672, 8665, 1693, + + 8612,13997, 1918, 0, 8607, 8603, 8649, 8647, 8599,13997, + 3239, 2109, 8588, 2964, 3301, 2052, 8586, 8598, 8597, 8583, + 8591, 8567, 8573, 8557, 8571, 8552, 1406, 8560, 8562, 8543, + 8543, 8534, 8529, 8540, 8522, 8520, 2175, 8526, 8508, 8521, + 8499, 8500, 8514, 8502, 8509, 8488, 8493, 8501, 8487, 2233, + 8478, 8474, 8465, 3243, 3312, 3246, 3316, 3304, 3307, 8471, + 8480, 8460, 8446, 8449, 8432, 3369, 3379, 8440, 8415, 3372, + 3382, 8431, 3431, 2301, 8425, 3436, 3440, 3443, 3497, 3485, + 3489, 3494, 3503, 3554, 3557, 3560, 3568, 3572, 3624, 3627, + 3633, 3691, 2372, 3694, 2436, 3697, 3718, 3762, 3772, 3776, + + 3642, 3780, 1866, 3766, 2505, 8424, 3825, 2574, 3830, 8410, + 8402, 8410, 8393, 8381, 8374, 8386, 8375, 8364, 3833, 3836, + 3839, 2640, 3843, 3890, 8369, 8355, 8367, 3896, 2711, 8364, + 8355, 8339, 3899, 3902, 1687, 8343, 3905, 2782, 3909, 2988, + 3958, 3967, 8351, 3961, 3970, 2584, 8337, 8335, 3980, 3063, + 8333, 8309, 8305, 3973, 4032, 8316, 4037, 3128, 4040, 4043, + 4047, 3196, 8288, 4094, 4100, 8301, 8283, 4103, 4106, 8291, + 385, 8277, 4109, 3265, 4114, 8289, 8268, 4163, 4171, 8286, + 8266, 4175, 4178, 8254, 8259, 8251, 8250, 8258, 8240, 8224, + 8229, 8215, 4182, 4229, 4232, 3335, 8207, 4238, 4241, 8222, + + 4244, 3522, 4250, 8211, 4264, 8211, 8214, 8217, 4268, 4271, + 4278, 4296, 4299, 4302, 4307, 8197, 4310, 3591, 4342, 4350, + 8213, 8192, 4353, 3654, 8206, 4356, 4365, 8189, 4371, 3700, + 8203, 8182, 4377, 4380, 1725, 8180, 4384, 3722, 8175, 8207, + 4413, 4419,13997, 8168, 8170, 8153, 4422, 4426, 4389, 3928, + 8129, 4441, 4448, 4451, 4455, 4460, 4485, 4493, 4496, 8176, + 13997,13997, 721, 8130,13997, 8173, 8171, 8090,13997,13997, + 8088, 4055,13997,13997, 8090, 4499, 4507,13997, 4518, 1876, + 8075, 8074, 8063, 8066, 8074, 8053, 8042, 8053, 8031, 8038, + 8037, 8042, 8026, 8020, 8017, 477, 8028, 8011, 8011, 8021, + + 8012, 1721, 2119, 7972, 7974, 7983, 7957, 7945, 7937, 7943, + 7932, 7919, 7916, 7916, 7930, 7926, 7908, 7922, 7905, 4522, + 4197, 7905, 7889, 4526, 4530, 7901, 4546, 4549,13997, 4552, + 7893, 7881, 4540, 7899, 7893, 7862, 4559, 4571,13997, 4574, + 7854, 7864, 4578, 4581,13997, 4584, 7839, 4593,13997,13997, + 7843, 4603, 4606,13997, 4609, 4612, 4618, 7832, 7831, 4630, + 4633, 4642, 4648,13997, 4651, 4654, 4661, 4672, 4675, 4683, + 4686,13997, 4690, 4693, 4696, 7827, 7820, 4705, 4711, 4719, + 4723,13997, 4726, 4729,13997,13997, 4738,13997,13997, 4746, + 4750, 7821, 7811, 7795, 7789, 4758, 4764,13997, 4767, 7773, + + 7772, 7762, 4770,13997,13997, 4778, 4786,13997,13997, 4796, + 4799, 7734, 7698, 7676, 7679, 7672, 7649, 7653, 7641, 1129, + 4807, 4810,13997, 4817, 4820,13997,13997, 4829, 4832,13997, + 4836, 7611, 7598, 4839, 4842,13997,13997, 7557, 7481, 7473, + 4851, 4857,13997, 4860, 7460, 4863, 4866,13997,13997, 4882, + 13997,13997, 4890, 4893,13997, 4898, 4901, 4904, 4912,13997, + 4919, 7452, 7365, 4927,13997,13997, 7351, 7354, 7317, 4923, + 4938,13997, 4942, 7309, 4945,13997,13997, 4953, 4957,13997, + 4961, 4966,13997,13997, 7220, 4976, 4980,13997, 4983, 4987, + 4990, 4995, 5008,13997, 5014, 7142, 7066, 7035, 6932, 5017, + + 13997,13997, 5027, 5035, 6892, 6885, 5045, 5048,13997, 5051, + 6810, 13, 5054, 5057,13997, 5060, 25, 119, 1732, 197, + 244, 5079, 267, 288, 307, 5083, 5086,13997, 5089, 5093, + 13997,13997, 325, 5109, 5112,13997, 5115, 385, 5118,13997, + 13997, 5135, 5138, 5146, 5153, 5157, 420, 5165, 421, 5171, + 5174,13997, 5178, 5183, 5186, 5197, 5201, 480, 5209, 5215, + 13997, 5218, 487, 5221,13997,13997, 5229, 5240,13997, 5243, + 528, 531, 5248,13997,13997, 558, 5262, 5265,13997, 5269, + 554, 5272,13997,13997, 549, 5288, 5291, 5294,13997, 5297, + 557, 5300, 5306,13997,13997, 5318, 588, 5321, 5324,13997, + + 5327, 591, 5332, 597, 5336, 5346,13997, 5350, 5356,13997, + 13997, 595, 5365, 5369,13997, 5372, 5376, 5384, 586, 612, + 5394, 5399, 628, 5407, 5412,13997, 5416, 1309, 5419,13997, + 13997, 667, 705, 681, 5422,13997, 713, 721, 782, 798, + 784, 811, 842, 854, 2179, 845, 2237, 918, 911, 2122, + 928, 931, 2515, 922, 934, 960, 993, 2650, 2858, 978, + 999, 983, 990, 985, 2999, 1008, 3139, 3206, 1061, 1066, + 1067, 3274, 1068, 3391, 1070, 5441,13997,13997, 1077, 1131, + 5449,13997,13997, 1115, 5426, 3402, 1129, 5457, 5460, 1120, + 1156, 1222, 5468, 1213, 5478, 5471, 1223, 1268, 5482, 5490, + + 13997,13997, 1253, 1273, 5501,13997,13997, 5509, 5512,13997, + 13997, 5521,13997,13997, 5531, 5534,13997,13997, 1318, 1336, + 5543,13997,13997, 5551, 5554,13997,13997, 1317, 1341, 5563, + 1323, 5566, 5570, 5573, 5576, 5581, 5600, 5608,13997,13997, + 5594, 5616, 5619, 5625, 5628, 5637, 5648, 5651, 5655, 5658, + 5661, 5676, 1361, 1359, 5669, 5680, 1403, 5695, 1428, 5699, + 1417, 5702, 5706, 5714, 5723, 5734, 5742, 3992, 1462, 1473, + 1463, 1479, 5745, 1462, 5749, 5752, 5756, 5770, 5775, 1476, + 5784, 1485, 5788, 1521, 1535, 5791,13997,13997, 5809, 1548, + 5812, 1543, 1536, 5815, 1569, 1583, 1588, 1580, 1589, 5818, + + 5821, 1579, 1592, 1602, 5836, 5839, 5842, 1612, 5846,13997, + 13997, 5857, 5861, 5869,13997,13997, 1621, 5878, 5883, 1635, + 5891, 5896,13997,13997, 5906,13997,13997, 1635, 5914, 1651, + 5917, 1653, 1652, 1663, 5920, 1656, 5923, 5926, 5929, 5944, + 1663, 5947, 5950, 1677, 1717, 5958, 1709, 5965, 5968, 5977, + 5986, 1714, 5989, 5995,13997,13997, 1712, 1731, 6010,13997, + 13997, 1729, 6019, 1822, 1786, 6022,13997, 1807,13997,13997, + 1787, 1778, 3516, 1794, 1787, 1785, 1800, 1802, 1809, 3586, + 1807, 1823, 3664, 1845, 1863, 3732, 3759, 1854, 1853, 3786, + 1861, 3799, 1868, 3999, 3923, 1888, 4002, 1898, 1908, 1905, + + 1922, 1924, 4065, 1918, 1929, 4068, 4127, 4503, 1933, 6025, + 4132, 1926, 6028, 6031, 6042, 6045, 6048, 6051, 1955, 1958, + 6054,13997,13997, 1969, 1967, 1962, 6066, 1979, 6075, 6078, + 6086, 1990, 1971, 6098, 6101, 6105, 6108, 6123, 6127, 6132, + 6135, 6138, 6150, 6156, 6159, 6168, 6175, 6178, 6190, 6181, + 6186, 6204,13997,13997, 6212, 6215, 6218, 6221, 6224, 6242, + 6245, 6248, 6256, 6266, 6274, 6284, 6287, 1997, 1988, 6293, + 13997,13997, 6306, 6309, 6315, 1998, 6329, 4135, 6332,13997, + 13997, 6340, 6348,13997,13997, 6344, 2004, 1984, 2019, 2035, + 6359, 2033, 6363, 6366, 6369, 6378, 6384,13997,13997, 2041, + + 6393, 2045, 6397, 6400, 6415, 2035, 6418, 6421, 2044, 6429, + 2037, 2039, 6438, 6441, 2048, 2037, 2047, 2050, 6444,13997, + 13997, 2058, 2082, 2089, 6452, 6457, 6461, 6471, 2090, 6475, + 13997,13997, 2102, 6483,13997,13997, 2093, 6492, 2099, 6495, + 2104, 6498, 6501, 6505, 6519, 6523, 2100, 6526, 6530, 6538, + 13997,13997, 6551, 2121, 6555,13997,13997, 2114, 2133, 6563, + 2115, 6566, 3303, 3609, 6574, 6578, 6586, 2145, 6592, 6595, + 6600, 6605, 6618, 2262, 2196, 2254,13997, 6623, 2163, 6626, + 2158, 2159, 2308, 2155, 2158, 6629, 2169, 2176, 2162, 2210, + 6632, 2212, 2212, 6641, 6644, 6647, 2229, 6650, 2233, 2218, + + 2235, 2239, 2379, 2237, 2244, 2255, 2291, 6655, 6658, 2296, + 6661, 2299, 2283, 6664, 6667, 6675, 6678, 2298, 6686, 2288, + 2296, 2298, 2300, 2313, 6689, 2310, 6693,13997,13997, 6708, + 2308, 6701, 6711, 6714, 6720, 6732, 6735, 6743, 6746, 6750, + 6755, 6768, 6774, 6782, 6786, 6789, 6797, 6804,13997,13997, + 6815, 6818, 6826, 6829,13997,13997, 6837, 6845, 2321, 2333, + 2324, 6840, 6858, 6866, 2358, 2372, 6869,13997,13997, 6879, + 6884, 2355, 2350, 6892, 6897, 2369, 2378, 6900, 6904, 6912, + 13997,13997, 2372, 6920,13997, 6923, 6927, 6930, 2362, 6933, + 2392, 2385, 6939,13997, 2380, 6952, 6958,13997,13997, 6966, + + 2416, 6971, 2389, 6975,13997,13997, 6990, 6993, 2399, 7004, + 13997,13997, 2392, 7014,13997, 2385, 7017, 7020, 7023, 7026, + 2401, 7029, 2421, 2423, 2419, 2432, 7035, 7039,13997,13997, + 7047,13997, 2428, 7050, 2435, 7054, 2437, 7057, 2446, 7060, + 7068, 7079, 7087, 7090, 7093, 7108, 7111, 7115,13997,13997, + 7129, 2445, 2460, 2493, 7135, 7138, 2515, 2517, 2545, 2524, + 2540, 2528, 2598, 2528, 7141,13997,13997, 7149, 7159, 7163, + 13997, 7168, 7171, 7186, 7190, 2523, 7198, 2605, 2669, 2565, + 7204, 7207, 7217, 2515, 2551, 2582, 2562, 2565, 7222, 7225, + 7228, 2571, 7231, 2572, 2578, 2586, 7234, 7237, 7240, 7243, + + 2591, 2587, 7246, 2619, 2654, 2630, 2632, 7249, 7252, 2634, + 7255, 7261, 7264, 2635, 2631, 7267,13997,13997, 7275,13997, + 13997, 2650, 7283, 2640, 7286, 7291, 7295, 7298, 7304,13997, + 2647, 7316, 2661, 7319, 7323, 7331, 7337,13997,13997, 7346, + 13997,13997, 7354, 7361, 7364,13997,13997, 7380,13997,13997, + 7388, 7394,13997,13997, 7402, 7407, 7416,13997,13997, 7424, + 7427,13997,13997, 2656, 2661, 2675, 7436,13997,13997, 7444, + 7447, 2672, 2662, 7455,13997,13997, 2694, 7463, 7466, 7469, + 2698, 2691, 7472,13997,13997, 2703, 7481, 7488, 2708, 7492, + 7496, 2712, 2703, 2709, 2708, 7510, 7515, 2720, 7518,13997, + + 2713, 7522,13997,13997, 2718, 2728, 2728, 7541, 7544, 7552, + 7555, 7559, 7562, 7565, 7571, 7574, 7583, 7579, 2725, 7592, + 7601, 2743, 7610, 2743, 7613,13997, 2727, 7618, 7625,13997, + 13997, 7633, 7640, 2729, 7651,13997,13997, 7659, 7662, 7665, + 2746, 7673, 2763, 2773, 2788, 7680,13997, 7683, 7686, 2801, + 2799, 2799, 2806, 2816, 2809, 2806, 2812, 2818, 2829, 7694, + 7701, 7706, 7715,13997,13997, 7726,13997,13997, 2805, 7734, + 7737, 2846, 2838, 7741, 5101, 7353, 7749, 7756, 7759, 2797, + 2813, 2835, 7762, 7765, 2847, 7768, 7771, 2845, 7774, 7777, + 7780, 2843, 2850, 2863, 7783, 7786, 2853, 2851, 2862, 7789, + + 7792, 2866, 7795, 7798, 2860, 2867, 2878, 2884, 7803, 7806, + 7809, 7812, 7822, 7827, 7830, 7833, 7836, 7840, 7848,13997, + 13997, 7858, 7862, 7865, 7868, 7871,13997,13997, 7887, 2895, + 2900, 2913, 7890,13997,13997, 7900, 2895, 2903, 7906, 7911, + 7919, 7924,13997, 2912, 2918, 2924, 7931, 7934, 7938, 7943, + 13997,13997, 7956, 7959, 7962, 7965, 7968, 7987, 7993, 2921, + 2931, 2933, 7996, 7999,13997,13997, 8007, 8015, 8018, 8026, + 8022, 8036, 8040, 8043, 8046, 8058,13997,13997, 8049, 8054, + 13997, 2938, 2941, 8068,13997, 8073,13997,13997, 2922, 8081, + 8089,13997,13997, 2924, 8100, 2936, 2935,13997, 8103,13997, + + 13997, 2980, 2982, 3003, 3004, 3011, 3016, 3003, 3019, 3017, + 3025, 8111, 8119, 8092, 8105, 3012, 8133, 8139, 3055, 3103, + 3002, 3010, 3057, 3006, 3013, 3013, 3035, 3115, 3051, 3059, + 8142, 8148, 3056, 3052, 3074, 8152, 8158, 3071, 8161, 3064, + 3077, 8164, 8167, 3119, 3117, 3135, 8170, 3117, 3132, 8174, + 3135, 8177,13997, 8180, 8183,13997,13997, 8191, 8197, 8205, + 8209, 8212, 8215, 8218, 8223, 8236, 8239, 8242, 8245, 8248, + 13997, 3155, 3143, 3139, 3179, 8251, 8269, 3183, 3197, 8277, + 3232, 3363, 8285,13997, 3184, 3186, 8288, 8291, 8294,13997, + 8297, 8315, 3201, 3202, 3203, 8323, 8326, 8329, 8300, 8337, + + 8344, 8350, 3201, 3205, 8358, 8362, 8365, 8369,13997,13997, + 8377, 8380, 8388, 8391, 8395,13997, 8400, 8414, 3217, 3218, + 3212, 3232, 8409,13997, 3248, 8422, 3252, 3248, 3280, 3276, + 3295, 3284, 3318, 3302, 3298, 3313, 3328, 3354, 8429, 3326, + 3333, 3362, 3334, 3342, 3369, 3378, 3387, 3373, 3383, 3391, + 8432, 3433, 3444, 3644, 3388, 3402, 3399, 3420, 3432, 3432, + 3438, 3451, 3447, 3460, 3464, 3458, 3460, 3478, 3495, 8435, + 8441, 3501, 3513, 8444, 3499, 3524, 3541, 8451, 3518, 3531, + 8454, 8457, 8460,13997,13997, 8468, 8471, 8479, 8491, 8486, + 13997, 8499,13997,13997, 8507,13997, 8510, 8513, 8516, 3531, + + 3538, 8519, 3530, 8522,13997,13997, 3543, 3533, 3581, 3619, + 3597, 3601, 3637, 3613, 3580, 8537, 8540, 8543, 8551, 8558, + 13997,13997, 3611, 3633, 3647, 8573, 8577, 8585, 4251, 4291, + 8593,13997, 8596, 8599,13997,13997, 3637, 8607, 8615, 8618, + 8626,13997, 8629,13997,13997, 8637, 8641, 8649, 8656, 8667, + 3692, 3829, 3648, 8675, 8678, 3660, 3661, 8681, 8684, 8687, + 3702, 3716, 3731, 3745, 3765, 3742, 3755, 3768, 3771, 3787, + 8696, 3728, 3740, 3784, 3789, 3792, 3786, 3790, 3802, 3801, + 3807, 3822, 3820, 8700, 8705, 3947, 3916, 3960, 3827, 3836, + 3840, 3857, 3866, 3871, 3865, 3875, 3894, 3927, 3935, 3941, + + 3931, 8708, 3965, 8711, 3978, 3985, 3969, 8718, 3989, 4008, + 4021, 8724, 8727, 8735, 4102, 4138, 8743,13997,13997, 8754, + 8758, 8761, 4035, 8764, 8767, 8773, 8785, 4048, 4061, 4097, + 4084, 4103, 4119, 4146, 4129, 4149, 4134, 4138, 8788, 8791, + 8799,13997,13997, 8807,13997, 4129, 8811, 4140, 8814,13997, + 13997, 4157, 4160, 4167, 4169, 4171, 4171, 8829, 4188, 8832, + 8835, 8844,13997,13997, 8852, 4282, 4312, 8860,13997,13997, + 4200, 4214, 4329, 4217, 4223, 4396, 4197, 8868, 8871, 8879, + 8882, 8890, 8893, 8897, 8900, 8903, 8912, 4239, 4237, 4239, + 4245,13997, 4264, 4248, 4248, 4275,13997, 8921, 4251, 4268, + + 4259, 4275, 4285, 4293, 4279, 4303, 4303, 4317, 4335, 4348, + 8924, 8927, 8935,13997, 4379, 4384, 8944, 4338, 4342, 4379, + 4429, 4432, 4380, 4378, 4388, 4407, 4460, 4462, 4414, 4424, + 8947, 4411, 8950, 4416, 4437, 8954, 4422, 8957, 4425, 8963, + 4522, 4523, 4484, 4489, 4487, 4492, 8974, 8977, 8980, 4470, + 8983, 8986, 9001,13997,13997, 9009, 9012, 4461, 4470, 4512, + 4497, 4524, 4524, 4543, 4540, 4550, 4551, 4538, 9020,13997, + 13997, 4546, 9028, 9031, 4529, 4574, 4583, 4619, 4585, 4595, + 4629, 9046,13997, 4586, 9049,13997,13997, 4617, 4622, 4629, + 4634, 4644, 4634, 4637, 4652, 4660, 4648, 4666, 4676, 9057, + + 9061, 4740, 4748, 9069,13997,13997, 9077, 9080, 9088, 9091, + 9099, 9102,13997,13997, 4671, 4696, 4713, 4712, 4696, 4715, + 4736, 4729, 9110, 4688, 4690, 4710, 4758, 4771, 4725, 4725, + 4728, 4751, 4797, 4798, 4755, 9114, 4812, 4838, 4854, 9122, + 9125, 9129, 4763, 4756, 4822,13997,13997, 4797, 4822, 4809, + 4870,13997,13997, 4828, 9144, 4820, 9148, 9152, 9155, 4821, + 9161, 9164, 4862, 4885, 4876, 4891, 4893, 4895, 4909, 4898, + 9167, 9170,13997, 9173, 4880, 9176,13997,13997, 9192,13997, + 13997, 9200, 4882, 4916, 4913, 4961, 4935, 4940, 4948, 4986, + 4962, 4944, 9203, 9206,13997,13997, 9214, 4969, 4981,13997, + + 4973, 4987,13997, 4956, 4996, 4986, 5001, 4993, 4998, 5009, + 5017, 5004, 5010, 5040, 5042, 5030, 9221, 9225, 5034, 5046, + 5037, 5049, 9233,13997,13997, 9242,13997,13997, 9250, 5047, + 5048,13997, 5049, 5065, 5070,13997, 5071, 9253, 5050, 5038, + 5102,13997,13997, 5070, 5076, 5062, 5124,13997,13997, 5081, + 5109, 5120, 5115, 5126, 5142, 9256, 9259, 9278, 9322, 9370, + 5091, 5097,13997, 5112, 5104, 5116,13997, 5135, 9286, 5142, + 9289, 9292, 5143, 9297, 5202, 5170, 5205, 5176, 5220, 5188, + 5225, 5196, 9300, 9312, 5185, 9333, 9303, 9342, 5204, 5202, + 13997, 5242, 5218, 5217,13997, 5247, 5197, 9345, 9351, 9364, + + 9390, 5253, 5255, 5253, 5261, 5216, 5273, 5240, 5274, 5244, + 5261, 5281, 5299, 5266, 5291, 5309, 5323, 5302, 9398,13997, + 13997, 5337, 5306, 5337, 5316, 9406,13997, 5351, 5330, 5331, + 5372, 5350, 5351, 9409, 5324, 5327,13997, 5341, 5337, 5339, + 13997, 5349, 5406, 5378, 5422, 5394, 5428, 9418, 5448, 5429, + 9438, 9486, 5609, 5384, 5431, 6367, 5391, 5447, 9315, 9382, + 13997, 5451,13997, 5456,13997, 5445,13997, 5455, 9412,13997, + 9458, 5404, 9461, 5462, 5481, 9432, 9470, 5456, 5461,13997, + 5471, 5474,13997, 5452, 9507,13997,13997, 9515, 5492, 5523, + 13997,13997,13997,13997, 5455,13997, 5495,13997, 5500, 5512, + + 13997,13997, 5490, 5525,13997,13997, 5506,13997, 5542,13997, + 5552,13997, 5558, 5581,13997, 5579, 5581, 9479,13997, 6510, + 5541, 5587, 6849, 5544, 5590,13997, 5599,13997, 5598, 5623, + 5670, 5625, 5602, 5719, 5607, 9523,13997, 5558, 5583, 5573, + 5663,13997,13997, 5601, 5641, 5629, 5726,13997, 9450, 9498, + 13997,13997, 5656, 5669, 9526, 9533, 5689, 5684, 5739, 5694, + 9536,13997,13997, 5699, 5707, 5708, 5731, 9545, 5741, 5735, + 5744, 5738, 9551, 5732, 5737, 5781, 5772, 5784, 5775,13997, + 13997,13997,13997,13997,13997,13997, 5735, 5756, 5744, 5827, + 13997,13997, 5759, 5779, 5767, 5844,13997,13997,13997, 9554, + + 5828, 5815, 5845, 9557, 5807, 5797, 5802,13997, 5824, 5827, + 5814, 5823,13997, 5841, 5856, 5861, 9563,13997, 9569, 9576, + 5863, 5871, 5884, 5873, 5881, 5914, 5894, 5935, 5898, 5946, + 9587, 9590, 5917, 5925, 5941, 5925, 5940, 5953, 9598, 9601, + 5936, 5942, 5979, 5972, 5986, 5978, 5952, 5934, 5938,13997, + 5957, 5958, 5946, 5950,13997, 5968, 9610, 6000, 5980, 5997, + 5970, 5989, 6003, 6022, 5995, 6014, 6066, 6066, 9616, 6058, + 6105, 6046, 6058, 6054, 6059, 6066, 6075, 6108,13997, 6107, + 13997, 9625,13997,13997, 6080, 6086, 6084, 6086, 6112, 6109, + 9633,13997,13997, 6144, 6147,13997, 6130,13997, 6132, 6111, + + 6133, 6104, 6134, 6142, 6161, 6132, 6152, 6210,13997, 6145, + 6145, 6161, 6175, 6169, 6168, 6168, 6182,13997,13997, 6219, + 6213, 6234, 6233, 6233, 6240, 6240, 6241, 6247, 6248,13997, + 13997, 6250, 6256, 6257, 6254, 6267, 6268,13997,13997, 6294, + 6292, 6239, 6238, 6238, 6257, 6251, 6253, 6254, 6266, 6317, + 6263, 6273, 6323, 6285, 6277, 6301, 6349, 6305, 6334, 6355, + 6344, 6369, 6368, 6367, 6385, 6374, 6374, 6401, 6391, 6388, + 6410, 6399, 6397, 6426,13997,13997, 6389, 6403, 6460, 6414, + 6406, 6417, 6471, 6428, 6470, 6428, 6434,13997, 6505, 6458, + 6460,13997, 6508, 6482, 6493, 6509, 6510, 6525, 6523, 6556, + + 6537, 6542, 6576, 6560, 6554, 6586, 6574, 6568, 6601, 6556, + 6559,13997, 6609, 6561, 6564,13997, 6614, 6681, 6576, 6633, + 13997, 6580, 6646,13997, 6644, 6649, 6655, 6660, 6692, 6667, + 13997, 6699, 6686,13997, 6715, 6692,13997, 6718, 6697,13997, + 6671, 6734,13997, 6681, 6734,13997, 6740, 6682,13997, 6691, + 13997, 6730, 6743, 6736, 6754,13997, 6755,13997, 6756,13997, + 6768,13997, 6770, 6723,13997, 6729,13997, 9641, 6798, 6800, + 6786, 6809, 6797, 6816, 6782, 6792, 6793, 6801, 6846, 6844, + 9644,13997,13997, 6849,13997, 6848,13997, 6857, 6856, 6860, + 6868,13997,13997, 6871, 6891,13997,13997,13997,13997,13997, + + 13997, 6889, 6918, 6929, 6931, 6900, 6924, 6960, 6985, 6872, + 6885, 6951, 6991, 6946, 7055, 7015, 7046, 7024, 7045, 7078, + 7100, 7058, 7059, 7088, 7128, 6937, 7048, 7148, 7171, 7102, + 7156, 6992, 7080, 7197, 7240, 7263, 7292, 7159, 7255, 7262, + 7333, 7184, 7382, 7164, 7289, 7134, 7252, 7308, 7334, 7311, + 7365, 7026, 7322, 7404, 7421, 7397, 7442, 7387, 7440, 7423, + 7467, 7276, 7435, 7457, 7512, 7489, 7490, 7460, 7484, 7521, + 7551, 7581, 7612, 7161, 7571, 7517, 7577, 7468, 7572, 7636, + 7653, 7586, 7588, 7603, 7660, 7658, 7681, 7797, 7800, 7638, + 7702, 7589, 7722, 7703, 7833, 7529, 7807, 7863, 7877, 7973, + + 7271, 9652, 9655,13997,13997, 9675, 9684, 9693, 9702, 9711, + 9720, 9729, 9738, 9747, 9756, 9765, 9774, 9783, 9792, 9801, + 9810, 9819, 9828, 9837, 9846, 9855, 9864, 9873, 9882, 9891, + 9900, 9909, 9918, 9927, 9936, 9945, 9954, 9963, 9972, 9981, + 9990, 9999,10008,10017,10026,10035,10044,10053,10062,10071, + 10080,10089,10098,10107,10116,10125,10134,10143,10152,10161, + 10170,10179,10188,10197,10206,10215,10224,10233,10242,10251, + 10260,10269,10278,10287,10294,10301,10308,10315,10322,10329, + 10336,10343,10350,10357,10364,10371,10378,10385,10392,10399, + 10406,10413,10420,10427,10434,10441,10448,10455,10462,10469, + + 10476,10483,10490,10497,10504,10513,10520,10525,10532,10537, + 10544,10549,10556,10561,10568,10573,10580,10585,10592,10597, + 10604,10609,10616,10621,10628,10633,10640,10645,10652,10657, + 10664,10669,10676,10681,10688,10693,10700,10705,10712,10717, + 10724,10729,10736,10741,10748,10753,10760,10765,10772,10777, + 10784,10789,10796,10801,10808,10813,10820,10825,10832,10837, + 10844,10849,10856,10861,10868,10873,10880,10885,10894,10900, + 10907,10915,10923,10931,10938,10946,10953,10961,10968,10976, + 10984,10992,11000,11008,11016,11024,11032,11040,11047,11055, + 11063,11070,11078,11085,11093,11100,11108,11115,11123,11130, + + 11138,11145,11153,11160,11168,11175,11183,11190,11198,11205, + 11213,11220,11228,11235,11243,11251,11259,11266,11274,11281, + 11289,11296,11304,11311,11319,11326,11334,11341,11349,11357, + 11365,11374,11380,11387,11395,11402,11410,11417,11425,11432, + 11440,11447,11455,11462,11470,11478,11485,11493,11500,11508, + 11515,11523,11531,11538,11546,11554,11562,11570,11578,11585, + 11593,11600,11608,11615,11623,11631,11639,11646,11654,11661, + 11669,11676,11684,11691,11699,11706,11714,11721,11729,11736, + 11744,11751,11759,11766,11774,11782,11790,11797,11805,11812, + 11820,11827,11835,11844,11853,11860,11867,11875,11882,11890, + + 11898,11906,11913,11921,11928,11936,11944,11951,11959,11966, + 11974,11982,11990,11998,12005,12013,12021,12029,12036,12044, + 12051,12059,12067,12075,12082,12090,12097,12105,12112,12120, + 12127,12135,12143,12151,12158,12166,12173,12181,12188,12196, + 12203,12211,12218,12226,12233,12241,12248,12256,12263,12271, + 12278,12286,12295,12304,12311,12319,12327,12334,12342,12350, + 12357,12365,12373,12381,12389,12397,12405,12413,12421,12429, + 12437,12445,12452,12460,12468,12476,12483,12491,12498,12506, + 12514,12521,12529,12536,12544,12551,12559,12566,12574,12582, + 12589,12597,12604,12612,12619,12627,12635,12643,12650,12658, + + 12665,12673,12680,12688,12695,12703,12711,12719,12728,12737, + 12745,12752,12760,12767,12775,12783,12790,12798,12806,12814, + 12822,12830,12838,12845,12853,12861,12868,12876,12884,12891, + 12898,12906,12914,12921,12929,12936,12944,12952,12959,12967, + 12974,12982,12989,12997,13004,13012,13020,13028,13036,13044, + 13051,13059,13067,13075,13083,13090,13098,13107,13116,13123, + 13131,13139,13147,13154,13162,13170,13178,13186,13194,13201, + 13209,13217,13224,13232,13240,13247,13254,13262,13270,13277, + 13284,13292,13300,13308,13315,13323,13330,13337,13345,13352, + 13360,13367,13375,13382,13390,13397,13405,13414,13423,13430, + + 13438,13446,13454,13462,13470,13478,13486,13494,13502,13509, + 13517,13524,13532,13540,13548,13556,13564,13572,13580,13587, + 13595,13603,13611,13619,13626,13633,13640,13648,13655,13663, + 13670,13678,13685,13693,13702,13711,13718,13726,13734,13742, + 13750,13758,13766,13773,13780,13788,13795,13803,13811,13818, + 13826,13834,13841,13848,13855,13862,13869,13877,13884,13892, + 13899,13907,13916,13925,13933,13942,13951,13960,13969,13978, + 13987 } ; -static yyconst flex_int16_t yy_def[3813] = +static yyconst flex_int16_t yy_def[4472] = { 0, - 3334, 3334, 3335, 3335, 3335, 3335, 3336, 3336, 3337, 3337, - 3338, 3338, 3339, 3339, 3339, 3339, 3340, 3340, 3341, 3341, - 3342, 3342, 3342, 3342, 3334, 3334, 3342, 3342, 3342, 3342, - 3334, 3334, 3342, 3342, 3334, 3334, 3342, 3342, 3342, 3342, - 3343, 3343, 3344, 3344, 3334, 3334, 3344, 3344, 3344, 3344, - 3345, 3345, 3346, 3346, 3347, 3347, 3348, 3348, 3349, 3349, - 3350, 3350, 3334, 3334, 3350, 3350, 3350, 3350, 3351, 3351, - 3352, 3352, 3334, 3334, 3352, 3352, 3352, 3352, 3353, 3353, - 3354, 3354, 3333, 83, 3355, 3355, 3334, 3334, 3355, 3355, - 3355, 3355, 3356, 3356, 3357, 3357, 3334, 3334, 3357, 3357, - - 3357, 3357, 3358, 3358, 3359, 3359, 3334, 3334, 3359, 3359, - 3359, 3359, 3360, 3360, 3361, 3361, 3362, 3362, 3363, 3363, - 3334, 3334, 3363, 3363, 3363, 3363, 3364, 3364, 3365, 3365, - 3334, 3334, 3365, 3365, 3365, 3365, 3366, 3366, 3367, 3367, - 3368, 3368, 3369, 3369, 3370, 3370, 3371, 3371, 3372, 3372, - 3373, 3373, 3334, 3334, 3374, 3374, 3375, 3375, 3375, 3375, - 3334, 3334, 3375, 3375, 3375, 3375, 3334, 3334, 3375, 3375, - 3334, 3334, 3375, 3375, 3375, 3375, 3376, 3376, 3377, 3377, - 3334, 3334, 3377, 3377, 3377, 3377, 3378, 3378, 3379, 3379, - 3380, 3380, 3381, 3381, 3382, 3382, 3383, 3383, 3334, 3334, - - 3383, 3383, 3383, 3383, 3384, 3384, 3385, 3385, 3386, 3386, - 3387, 3387, 3334, 3334, 3387, 3387, 3387, 3387, 3388, 3388, - 3389, 3389, 3334, 3334, 3389, 3389, 3389, 3389, 3390, 3390, - 3391, 3391, 3392, 3392, 3393, 3393, 3334, 3334, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3394, 3333, - 3333, 3394, 3394, 3333, 3333, 3333, 276, 3333, 278, 276, - 279, 278, 3333, 3333, 3333, 3395, 3333, 3333, 3395, 3395, - 3395, 3333, 3333, 278, 294, 294, 3333, 3333, 3333, 3396, - - 3333, 3333, 3396, 3333, 3333, 3333, 3333, 3333, 3333, 3397, - 3333, 3333, 3397, 3397, 3397, 3333, 3333, 3333, 3333, 3333, - 3333, 3398, 3333, 3333, 3398, 3398, 3398, 3333, 3333, 294, - 294, 3333, 3333, 3333, 3399, 3333, 3333, 3399, 3399, 3333, - 3333, 294, 294, 3333, 3333, 3333, 3400, 3333, 3333, 3400, - 3400, 3400, 3400, 3400, 3400, 3333, 3333, 3333, 3333, 3333, - 3333, 3401, 3333, 3333, 3401, 3401, 3401, 3401, 3401, 3401, - 3401, 3401, 3333, 3333, 278, 278, 3333, 3333, 3333, 3402, - 3333, 3333, 3402, 3333, 3333, 278, 278, 3333, 3333, 3333, - 3403, 3333, 3333, 3403, 3403, 3403, 3403, 3403, 3333, 3333, - - 278, 278, 278, 3333, 3333, 3333, 3404, 3333, 3333, 3404, - 3404, 3404, 3333, 3333, 3333, 3333, 3333, 3333, 3405, 3333, - 3333, 3405, 3333, 3333, 278, 425, 278, 3333, 3333, 3333, - 3406, 3333, 3333, 3406, 3406, 3406, 3406, 3333, 3333, 278, - 278, 3333, 3333, 3333, 3407, 3333, 3333, 3407, 3407, 3333, - 3333, 3333, 3333, 3333, 3333, 3408, 3333, 3333, 3408, 3408, - 3333, 3333, 3333, 3333, 3333, 3333, 3409, 3333, 3333, 3409, - 3409, 3333, 3333, 3333, 3333, 3333, 3333, 3410, 3333, 3333, - 3410, 3410, 3410, 3410, 3410, 3410, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3411, 3333, 3333, 3411, 3333, 3333, 425, - - 425, 278, 278, 278, 278, 3333, 3333, 3333, 3412, 3333, - 3333, 3412, 3412, 3412, 3412, 3412, 3333, 3333, 278, 278, - 278, 3333, 3333, 3333, 3413, 3333, 3333, 3413, 3413, 3333, - 3333, 3333, 3333, 3333, 3333, 3414, 3333, 3333, 3414, 3414, - 3414, 3414, 3414, 3333, 3333, 3333, 3333, 3333, 3333, 3415, - 3333, 3333, 3415, 3415, 3333, 3333, 294, 294, 3333, 3333, - 3333, 3416, 3333, 3333, 3416, 3416, 3333, 3333, 3333, 3333, - 3333, 3333, 3417, 3333, 3333, 3417, 3417, 3417, 3417, 3333, - 3333, 278, 278, 3333, 3333, 3333, 3418, 3333, 3333, 3418, - 3418, 3418, 3418, 3333, 3333, 278, 278, 278, 3333, 3333, - - 3333, 3419, 3333, 3333, 3419, 3419, 3419, 3333, 3333, 3333, - 3333, 3333, 3420, 3333, 3333, 3420, 3420, 3420, 3333, 3333, - 3333, 3333, 3421, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3422, 3422, 3422, - 3423, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3424, 3424, 3424, 3424, 3424, 3425, 3333, 3333, 3426, - 3426, 3427, 3333, 3428, 3428, 3428, 3428, 3429, 3333, 3430, - 3430, 3430, 3430, 3431, 3333, 3432, 3432, 3432, 3433, 3333, - - 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3435, 3333, - 3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436, 3436, - 3436, 3436, 3436, 3436, 3436, 3437, 3333, 3438, 3438, 3439, - 3333, 3440, 3440, 3440, 3440, 3440, 3440, 3440, 3441, 3333, - 3333, 3442, 3442, 3442, 3442, 3443, 3333, 3444, 3444, 3445, - 3333, 3333, 3446, 3446, 3446, 3446, 3446, 3446, 3447, 3333, - 3448, 3448, 3448, 3449, 3333, 3450, 3450, 3450, 3451, 3333, - 3452, 3452, 3452, 3453, 3333, 3454, 3454, 3454, 3454, 3454, - 3454, 3454, 3454, 3455, 3333, 3333, 3456, 3456, 3457, 3333, - 3333, 3333, 3333, 3333, 3333, 3458, 3458, 3458, 3458, 3458, - - 3458, 3459, 3333, 3333, 3460, 3460, 3460, 3461, 3333, 3462, - 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3462, 3463, 3333, - 3464, 3464, 3464, 3464, 3465, 3333, 3466, 3466, 3466, 3467, - 3333, 3468, 3468, 3468, 3468, 3468, 3469, 3333, 3470, 3470, - 3470, 3470, 3470, 3471, 3333, 3333, 3472, 3472, 3472, 3472, - 3333, 3473, 3333, 3333, 3474, 3474, 3474, 3474, 3475, 3476, - 3333, 3476, 3333, 3333, 3333, 3477, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3478, 3479, 3479, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3480, 3480, 3480, 3480, 3481, 3481, 3333, 3482, 3483, - 3483, 3484, 3333, 3333, 3484, 3485, 3485, 3486, 3486, 3486, - 3487, 3487, 3488, 3488, 3489, 3489, 3333, 3333, 3333, 3333, - 3490, 3490, 3490, 3490, 3490, 3491, 3491, 3492, 3333, 3333, - 3492, 3333, 3333, 3492, 3492, 3492, 3492, 3492, 3492, 3492, - 3492, 3492, 3492, 3493, 3493, 3333, 3333, 3494, 3494, 3495, - 3495, 3495, 3333, 3333, 3495, 3495, 3495, 3496, 3496, 3333, - 3497, 3333, 3333, 3333, 3333, 3498, 3498, 3499, 3500, 3500, - 3333, 3501, 3333, 3333, 3501, 3501, 3501, 3502, 3502, 3503, - - 3333, 3333, 3504, 3504, 3333, 3333, 3505, 3506, 3506, 3507, - 3507, 3508, 3508, 3509, 3509, 3509, 3333, 3333, 3509, 3509, - 3509, 3510, 3510, 3333, 3511, 3512, 3512, 3333, 3333, 3333, - 3513, 3513, 3513, 3513, 3513, 3514, 3514, 3333, 3333, 3333, - 3515, 3516, 3516, 3517, 3333, 3333, 3517, 3517, 3517, 3517, - 3517, 3517, 3518, 3518, 3519, 3519, 3519, 3520, 3520, 3521, - 3333, 3333, 3522, 3522, 3523, 3523, 3333, 3333, 3523, 3524, - 3524, 3525, 3333, 3333, 3525, 3525, 3526, 3526, 3333, 3527, - 3333, 3333, 3527, 3333, 3528, 3528, 3333, 3529, 3529, 3529, - 3530, 3530, 3531, 3333, 3333, 3531, 3333, 3333, 3532, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3533, 3333, 3534, - 3333, 3534, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3535, 3535, 3333, 3333, 3535, 3333, 3536, 3333, 3536, 3333, - 3537, 3333, 3538, 3333, 3538, 3539, 3333, 3333, 3333, 3539, - 3333, 3540, 3333, 3540, 3333, 3333, 3541, 3541, 3333, 3333, - 3333, 3542, 3333, 3542, 3333, 3333, 3333, 3333, 3333, 3543, - 3333, 3543, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3544, 3544, 3544, 3544, 3333, 3545, 3333, 3545, 3546, 3546, - 3546, 3333, 3333, 3333, 3546, 3333, 3333, 3333, 3333, 3333, - 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3546, 3333, - 3547, 3333, 3547, 3333, 3333, 3333, 3333, 3548, 3333, 3548, - 3549, 3549, 3549, 3333, 3333, 3333, 3549, 3549, 3549, 3333, - 3550, 3333, 3550, 3333, 3551, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3552, 3333, 3552, 3553, 3333, 3554, 3333, 3554, - 3555, 3333, 3333, 3333, 3555, 3555, 3555, 3333, 3556, 3333, - 3556, 3557, 3333, 3333, 3333, 3333, 3558, 3333, 3558, 3333, - 3333, 3333, 3559, 3333, 3560, 3333, 3560, 3561, 3561, 3333, - - 3562, 3333, 3562, 3563, 3563, 3563, 3563, 3333, 3333, 3333, - 3333, 3333, 3563, 3563, 3333, 3564, 3333, 3564, 3333, 3565, - 3333, 3566, 3333, 3566, 3333, 3333, 3333, 3567, 3567, 3567, - 3567, 3567, 3333, 3568, 3333, 3568, 3333, 3333, 3333, 3333, - 3569, 3333, 3570, 3333, 3570, 3571, 3333, 3333, 3333, 3333, - 3333, 3571, 3333, 3333, 3571, 3571, 3571, 3333, 3572, 3333, - 3572, 3333, 3333, 3333, 3333, 3573, 3333, 3574, 3333, 3574, - 3575, 3333, 3333, 3333, 3333, 3576, 3333, 3576, 3577, 3577, - 3333, 3333, 3333, 3577, 3333, 3578, 3333, 3578, 3579, 3333, - 3333, 3333, 3579, 3579, 3333, 3580, 3333, 3580, 3333, 3581, - - 3333, 3333, 3333, 3581, 3333, 3333, 3582, 3333, 3582, 3583, - 3583, 3583, 3333, 3584, 3333, 3584, 3585, 3586, 3333, 3333, - 3333, 3333, 3587, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3588, 3588, 3333, 3333, 3333, 3588, 3589, - 3333, 3590, 3591, 3592, 3592, 3593, 3333, 3333, 3333, 3594, - 3594, 3333, 3333, 3333, 3595, 3333, 3333, 3333, 3333, 3333, - 3333, 3596, 3333, 3333, 3333, 3597, 3597, 3597, 3597, 3598, - - 3599, 3599, 3599, 3333, 3333, 3333, 3333, 3333, 3599, 3599, - 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3599, 3600, 3601, - 3602, 3602, 3333, 3333, 3602, 3602, 3602, 3603, 3333, 3333, - 3333, 3604, 3333, 3333, 3605, 3606, 3606, 3606, 3606, 3607, - 3608, 3609, 3610, 3611, 3333, 3333, 3612, 3613, 3614, 3614, - 3614, 3614, 3333, 3333, 3333, 3614, 3614, 3615, 3333, 3616, - 3617, 3333, 3333, 3333, 3618, 3333, 3333, 3618, 3618, 3618, - 3619, 3333, 3620, 3621, 3622, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3622, 3333, 3333, 3622, 3623, 3333, 3333, - 3333, 3333, 3333, 3333, 3624, 3625, 3626, 3627, 3628, 3628, - - 3628, 3629, 3630, 3630, 3333, 3333, 3631, 3333, 3333, 3333, - 3632, 3333, 3633, 3634, 3333, 3333, 3634, 3635, 3636, 3637, - 3637, 3333, 3637, 3333, 3333, 3638, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3639, 3639, 3639, 3640, 3333, 3333, - 3333, 3641, 3642, 3642, 3643, 3644, 3644, 3645, 3646, 3647, - 3647, 3333, 3333, 3647, 3648, 3333, 3333, 3649, 3649, 3333, - 3333, 3333, 3649, 3649, 3649, 3649, 3649, 3649, 3333, 3333, - - 3649, 3649, 3649, 3650, 3651, 3652, 3652, 3333, 3333, 3333, - 3652, 3333, 3333, 3652, 3653, 3333, 3333, 3333, 3333, 3654, - 3333, 3333, 3333, 3655, 3656, 3656, 3656, 3656, 3657, 3658, - 3659, 3333, 3333, 3660, 3333, 3333, 3333, 3661, 3662, 3663, - 3333, 3333, 3663, 3663, 3333, 3333, 3663, 3664, 3333, 3665, - 3666, 3333, 3333, 3333, 3667, 3333, 3333, 3333, 3667, 3667, - 3667, 3668, 3333, 3333, 3333, 3669, 3670, 3333, 3333, 3333, - 3670, 3333, 3333, 3333, 3670, 3671, 3672, 3673, 3674, 3675, - 3676, 3676, 3676, 3677, 3678, 3333, 3333, 3333, 3333, 3333, - 3679, 3333, 3333, 3333, 3333, 3680, 3333, 3681, 3682, 3333, - - 3333, 3333, 3333, 3333, 3683, 3684, 3685, 3685, 3333, 3686, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3687, 3688, 3333, 3333, - 3333, 3333, 3689, 3690, 3690, 3691, 3333, 3333, 3333, 3333, - 3692, 3693, 3333, 3333, 3694, 3333, 3333, 3333, 3333, 3333, - 3695, 3333, 3333, 3333, 3333, 3333, 3696, 3696, 3696, 3333, - 3333, 3696, 3696, 3696, 3333, 3333, 3333, 3333, 3333, 3696, - 3696, 3697, 3698, 3699, 3699, 3333, 3333, 3333, 3333, 3333, - - 3699, 3333, 3333, 3333, 3700, 3701, 3702, 3702, 3702, 3702, - 3333, 3333, 3703, 3704, 3333, 3333, 3333, 3705, 3706, 3707, - 3708, 3333, 3333, 3333, 3333, 3333, 3708, 3333, 3333, 3333, - 3708, 3333, 3333, 3333, 3709, 3710, 3333, 3333, 3333, 3711, - 3711, 3711, 3711, 3712, 3333, 3333, 3333, 3333, 3333, 3333, - 3713, 3713, 3713, 3714, 3715, 3716, 3717, 3718, 3333, 3333, - 3719, 3333, 3333, 3720, 3721, 3333, 3333, 3333, 3722, 3333, - 3723, 3333, 3724, 3725, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3726, 3727, 3728, 3728, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3729, 3730, 3333, 3731, - 3732, 3333, 3333, 3733, 3333, 3333, 3333, 3333, 3333, 3333, - 3734, 3735, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3736, 3333, 3333, 3333, 3737, 3737, 3737, 3333, 3333, 3333, - 3333, 3333, 3737, 3737, 3333, 3333, 3333, 3737, 3737, 3738, - 3739, 3740, 3740, 3333, 3333, 3333, 3740, 3741, 3742, 3743, - 3333, 3333, 3743, 3743, 3743, 3744, 3745, 3746, 3747, 3333, - 3333, 3748, 3333, 3333, 3333, 3748, 3748, 3333, 3333, 3333, - - 3749, 3333, 3333, 3333, 3750, 3750, 3750, 3750, 3751, 3333, - 3752, 3333, 3333, 3752, 3753, 3754, 3333, 3333, 3755, 3756, - 3333, 3333, 3333, 3333, 3333, 3757, 3333, 3333, 3333, 3758, - 3333, 3333, 3759, 3760, 3333, 3761, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3762, 3763, 3764, 3764, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3765, 3766, 3333, 3767, 3768, - 3333, 3333, 3333, 3769, 3770, 3771, 3333, 3333, 3333, 3772, - - 3773, 3773, 3773, 3333, 3333, 3333, 3773, 3773, 3773, 3333, - 3333, 3774, 3333, 3333, 3775, 3775, 3775, 3776, 3777, 3778, - 3333, 3333, 3333, 3778, 3778, 3778, 3779, 3780, 3781, 3782, - 3783, 3783, 3783, 3333, 3333, 3333, 3333, 3784, 3333, 3333, - 3333, 3785, 3785, 3785, 3786, 3333, 3787, 3333, 3333, 3333, - 3787, 3333, 3333, 3788, 3789, 3333, 3333, 3333, 3333, 3333, - 3790, 3791, 3333, 3333, 3333, 3792, 3793, 3333, 3794, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3795, 3796, 3797, 3797, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3798, 3333, 3333, 3333, 3799, 3333, 3333, - 3800, 3801, 3802, 3333, 3333, 3803, 3803, 3803, 3803, 3333, - 3333, 3803, 3803, 3333, 3333, 3333, 3333, 3333, 3804, 3804, - 3804, 3805, 3333, 3333, 3333, 3333, 3806, 3806, 3806, 3806, - 3333, 3333, 3780, 3781, 3333, 3333, 3783, 3783, 3783, 3333, - 3784, 3333, 3333, 3333, 3333, 3333, 3785, 3785, 3333, 3333, - 3333, 3333, 3333, 3787, 3788, 3789, 3790, 3333, 3333, 3792, - 3793, 3333, 3794, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3795, 3796, 3797, 3797, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3798, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3801, 3802, - 3803, 3803, 3803, 3803, 3333, 3333, 3333, 3803, 3803, 3333, - 3333, 3333, 3333, 3333, 3333, 3804, 3804, 3333, 3333, 3805, - 3333, 3333, 3333, 3806, 3806, 3806, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3781, 3333, 3333, 3333, 3783, 3783, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3787, 3788, 3789, 3790, 3792, 3793, 3333, - 3794, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3795, 3796, 3797, 3797, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3801, 3802, - 3803, 3803, 3333, 3333, 3803, 3803, 3803, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3804, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3806, 3806, 3806, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3781, 3783, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3787, 3333, 3333, 3333, 3333, 3790, - 3792, 3793, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3795, 3796, 3797, 3797, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3801, 3802, 3803, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3803, 3803, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3804, 3333, 3333, 3333, 3806, 3333, 3333, 3806, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3783, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3787, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3793, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3795, 3796, 3797, - 3797, 3797, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3801, 3333, 3333, 3803, 3333, 3333, - 3333, 3333, 3333, 3333, 3803, 3803, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3804, 3806, 3333, 3333, 3333, 3806, - 3333, 3333, 3333, 3333, 3333, 3333, 3783, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3793, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3795, 3796, 3797, 3797, 3797, 3807, 3808, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3801, 3803, 3333, 3333, 3803, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3804, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3783, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3795, 3796, 3797, 3809, 3810, 3807, 3808, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3803, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3804, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3783, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3796, 3809, 3797, 3811, 3810, 3812, 3797, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3803, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3804, 3333, 3333, 3333, 3333, 3783, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3796, 3811, 3333, 3812, 3797, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3796, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3796, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3796, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3796, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3796, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3796, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3796, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3796, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3796, 3796, 3333, 3333, 3333, 3333, 3333, 3333, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3796, 3333, 0, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333 + 3906, 3906, 3907, 3907, 3907, 3907, 3908, 3908, 3909, 3909, + 3910, 3910, 3911, 3911, 3911, 3911, 3912, 3912, 3913, 3913, + 3914, 3914, 3914, 3914, 3906, 3906, 3914, 3914, 3914, 3914, + 3906, 3906, 3914, 3914, 3906, 3906, 3914, 3914, 3914, 3914, + 3915, 3915, 3916, 3916, 3906, 3906, 3916, 3916, 3916, 3916, + 3917, 3917, 3918, 3918, 3906, 3906, 3918, 3918, 3918, 3918, + 3919, 3919, 3920, 3920, 3921, 3921, 3922, 3922, 3923, 3923, + 3924, 3924, 3906, 3906, 3924, 3924, 3924, 3924, 3925, 3925, + 3926, 3926, 3906, 3906, 3926, 3926, 3926, 3926, 3927, 3927, + 3928, 3928, 3906, 3906, 3928, 3928, 3928, 3928, 3929, 3929, + + 3930, 3930, 3931, 3931, 3932, 3932, 3906, 3906, 3932, 3932, + 3932, 3932, 3933, 3933, 3934, 3934, 3906, 3906, 3934, 3934, + 3934, 3934, 3935, 3935, 3936, 3936, 3906, 3906, 3936, 3936, + 3936, 3936, 3937, 3937, 3938, 3938, 3939, 3939, 3940, 3940, + 3906, 3906, 3940, 3940, 3940, 3940, 3941, 3941, 3942, 3942, + 3906, 3906, 3942, 3942, 3942, 3942, 3943, 3943, 3944, 3944, + 3945, 3945, 3946, 3946, 3947, 3947, 3948, 3948, 3949, 3949, + 3950, 3950, 3906, 3906, 3951, 3951, 3952, 3952, 3952, 3952, + 3906, 3906, 3952, 3952, 3952, 3952, 3906, 3906, 3952, 3952, + 3906, 3906, 3952, 3952, 3952, 3952, 3953, 3953, 3954, 3954, + + 3906, 3906, 3954, 3954, 3954, 3954, 3955, 3955, 3956, 3956, + 3957, 3957, 3958, 3958, 3959, 3959, 3960, 3960, 3906, 3906, + 3960, 3960, 3960, 3960, 3961, 3961, 3962, 3962, 3963, 3963, + 3964, 3964, 3906, 3906, 3964, 3964, 3964, 3964, 3965, 3965, + 3966, 3966, 3906, 3906, 3966, 3966, 3966, 3966, 3967, 3967, + 3968, 3968, 3969, 3969, 3970, 3970, 3971, 3971, 3972, 3972, + 3972, 3972, 3906, 3906, 3972, 3972, 3972, 3972, 3906, 3906, + 3972, 3972, 3906, 3906, 3972, 3972, 3972, 3972, 3973, 3973, + 3974, 3974, 3906, 3906, 3974, 3974, 3974, 3974, 3906, 3906, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3975, 3905, 3905, 3975, 3975, 3905, 3905, 3905, 328, 3905, + 330, 328, 331, 330, 3905, 3905, 3905, 3976, 3905, 3905, + 3976, 3976, 3976, 3905, 3905, 330, 330, 330, 3905, 3905, + 3905, 3977, 3905, 3905, 3977, 3977, 3977, 3977, 3977, 3905, + 3905, 330, 330, 330, 3905, 3905, 3905, 3978, 3905, 3905, + 3978, 3905, 3905, 3905, 3905, 3905, 3905, 3979, 3905, 3905, + 3979, 3979, 3979, 3905, 3905, 3905, 3905, 3905, 3905, 3980, + 3905, 3905, 3980, 3980, 3980, 3905, 3905, 330, 330, 3905, + + 3905, 3905, 3981, 3905, 3905, 3981, 3981, 3905, 3905, 330, + 330, 3905, 3905, 3905, 3982, 3905, 3905, 3982, 3982, 3982, + 3905, 3905, 330, 330, 3905, 3905, 3905, 3983, 3905, 3905, + 3983, 3983, 3983, 3983, 3983, 3983, 3905, 3905, 3905, 3905, + 3905, 3905, 3984, 3905, 3905, 3984, 3984, 3984, 3984, 3984, + 3984, 3984, 3984, 3905, 3905, 330, 330, 3905, 3905, 3905, + 3985, 3905, 3905, 3985, 3905, 3905, 330, 330, 3905, 3905, + 3905, 3986, 3905, 3905, 3986, 3986, 3986, 3986, 3986, 3905, + 3905, 330, 330, 330, 3905, 3905, 3905, 3987, 3905, 3905, + 3987, 3987, 3987, 3905, 3905, 3905, 3905, 3905, 3905, 3988, + + 3905, 3905, 3988, 3905, 3905, 330, 506, 330, 3905, 3905, + 3905, 3989, 3905, 3905, 3989, 3989, 3989, 3989, 3905, 3905, + 330, 330, 3905, 3905, 3905, 3990, 3905, 3905, 3990, 3990, + 3905, 3905, 3905, 3905, 3905, 3905, 3991, 3905, 3905, 3991, + 3991, 3905, 3905, 3905, 3905, 3905, 3905, 3992, 3905, 3905, + 3992, 3992, 3905, 3905, 3905, 3905, 3905, 3905, 3993, 3905, + 3905, 3993, 3993, 3993, 3993, 3993, 3993, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3994, 3905, 3905, 3994, 3905, 3905, + 506, 581, 330, 330, 330, 330, 3905, 3905, 3905, 3995, + 3905, 3905, 3995, 3995, 3995, 3995, 3995, 3905, 3905, 330, + + 330, 3905, 3905, 3905, 3996, 3905, 3905, 3996, 3996, 3905, + 3905, 3905, 3905, 3905, 3905, 3997, 3905, 3905, 3997, 3997, + 3997, 3997, 3997, 3905, 3905, 3905, 3905, 3905, 3905, 3998, + 3905, 3905, 3998, 3998, 3905, 3905, 330, 330, 3905, 3905, + 3905, 3999, 3905, 3905, 3999, 3999, 3905, 3905, 3905, 3905, + 3905, 3905, 4000, 3905, 3905, 4000, 4000, 4000, 4000, 3905, + 3905, 330, 330, 3905, 3905, 3905, 4001, 3905, 3905, 4001, + 4001, 4001, 4001, 3905, 3905, 330, 330, 330, 3905, 3905, + 3905, 4002, 3905, 3905, 4002, 4002, 4002, 3905, 3905, 3905, + 3905, 3905, 4003, 3905, 3905, 4003, 4003, 4003, 3905, 3905, + + 3905, 3905, 3905, 3905, 4004, 3905, 3905, 4004, 4004, 3905, + 3905, 3905, 712, 330, 330, 3905, 3905, 3905, 4005, 3905, + 3905, 4005, 4005, 4005, 3905, 3905, 330, 330, 3905, 4006, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 4007, 4007, 4007, 4008, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 4009, 4009, 4009, 4009, 4009, 4010, 3905, 3905, 4011, + 4011, 4011, 4011, 4011, 4011, 4012, 3905, 3905, 4013, 4013, + + 4014, 3905, 4015, 4015, 4015, 4015, 4016, 3905, 4017, 4017, + 4017, 4017, 4018, 3905, 4019, 4019, 4019, 4020, 3905, 4021, + 4021, 4021, 4021, 4022, 3905, 4023, 4023, 4023, 4023, 4023, + 4023, 4023, 4023, 4024, 3905, 4025, 4025, 4025, 4025, 4025, + 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025, 4025, + 4026, 3905, 4027, 4027, 4028, 3905, 4029, 4029, 4029, 4029, + 4029, 4029, 4029, 4030, 3905, 3905, 4031, 4031, 4031, 4031, + 4032, 3905, 4033, 4033, 4034, 3905, 3905, 3905, 4035, 4035, + 4035, 4035, 4035, 4035, 4036, 3905, 4037, 4037, 4037, 4038, + 3905, 4039, 4039, 4039, 4040, 3905, 4041, 4041, 4041, 4042, + + 3905, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4043, 4044, + 3905, 3905, 4045, 4045, 4046, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 4047, 4047, 4047, 4047, 4047, 4047, 4048, 3905, + 4049, 4049, 4049, 4050, 3905, 4051, 4051, 4051, 4051, 4051, + 4051, 4051, 4051, 4051, 4052, 3905, 4053, 4053, 4053, 4053, + 4054, 3905, 4055, 4055, 4055, 4056, 3905, 4057, 4057, 4057, + 4057, 4057, 4058, 3905, 4059, 4059, 4059, 4059, 4059, 4060, + 3905, 3905, 4061, 4061, 4061, 4061, 3905, 4062, 3905, 3905, + 4063, 4063, 4063, 4063, 4064, 3905, 4065, 4065, 4065, 4066, + 3905, 4067, 4067, 4067, 4067, 4067, 4068, 4069, 3905, 4069, + + 3905, 3905, 3905, 4070, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 4071, 4072, 4072, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 4073, 4073, 4073, 4073, 4074, 4074, 3905, + 4075, 4075, 4075, 4075, 4075, 4076, 4076, 3905, 4077, 4078, + 4078, 4079, 3905, 3905, 4079, 4080, 4080, 4081, 4081, 4081, + 4082, 4082, 4083, 4083, 4084, 4084, 4085, 4085, 4085, 4086, + 4086, 3905, 3905, 3905, 3905, 4087, 4087, 4087, 4087, 4087, + + 4088, 4088, 4089, 3905, 3905, 4089, 3905, 3905, 4089, 4089, + 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4089, 4090, 4090, + 3905, 3905, 4091, 4091, 4092, 4092, 4092, 3905, 3905, 4092, + 4092, 4092, 4093, 4093, 3905, 4094, 3905, 3905, 3905, 3905, + 4095, 4095, 4096, 4097, 4097, 3905, 3905, 4098, 3905, 3905, + 4098, 4098, 4098, 4099, 4099, 4100, 3905, 3905, 4101, 4101, + 3905, 3905, 4102, 4103, 4103, 4104, 4104, 4105, 4105, 4106, + 4106, 4106, 3905, 3905, 4106, 4106, 4106, 4107, 4107, 3905, + 4108, 4109, 4109, 3905, 3905, 3905, 3905, 4110, 4110, 4110, + 4110, 4110, 4111, 4111, 3905, 3905, 4112, 4113, 4113, 4114, + + 3905, 3905, 4114, 4114, 4114, 4114, 4114, 4114, 4115, 4115, + 4116, 4116, 4116, 4117, 4117, 4118, 3905, 3905, 4119, 4119, + 4120, 4120, 3905, 3905, 4120, 4121, 4121, 4122, 3905, 3905, + 4122, 4122, 4123, 4123, 3905, 4124, 3905, 3905, 4124, 3905, + 4125, 4125, 3905, 4126, 4126, 4126, 4127, 4127, 3905, 3905, + 4128, 4129, 4129, 4130, 4130, 4130, 4130, 4131, 4131, 4132, + 3905, 3905, 4132, 3905, 3905, 4133, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 4134, 3905, 4135, 3905, 4135, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 4136, 4136, 3905, 3905, 4136, 3905, 4137, 3905, 4137, + 3905, 4138, 4138, 4138, 4138, 4138, 3905, 4139, 3905, 4139, + 3905, 4140, 3905, 4141, 3905, 4141, 4142, 3905, 3905, 3905, + 4142, 3905, 4143, 3905, 4143, 3905, 3905, 4144, 4144, 3905, + 3905, 3905, 4145, 3905, 4145, 3905, 3905, 3905, 3905, 3905, + 4146, 3905, 4146, 3905, 3905, 4147, 4147, 3905, 3905, 3905, + 4148, 3905, 4148, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 4149, 4149, 4149, 4149, 3905, 4150, 3905, 4150, 4151, + + 4151, 4151, 3905, 3905, 3905, 4151, 3905, 3905, 3905, 3905, + 3905, 4151, 4151, 4151, 4151, 4151, 4151, 4151, 4151, 4151, + 3905, 4152, 3905, 4152, 3905, 3905, 3905, 3905, 4153, 3905, + 4153, 4154, 4154, 4154, 3905, 3905, 3905, 4154, 4154, 4154, + 3905, 4155, 3905, 4155, 3905, 4156, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 4157, 3905, 4157, 4158, 3905, 4159, 3905, + 4159, 3905, 4160, 3905, 3905, 3905, 4160, 4160, 4160, 3905, + 4161, 3905, 4161, 4162, 3905, 3905, 3905, 3905, 4163, 3905, + 4163, 3905, 3905, 3905, 4164, 3905, 4165, 3905, 4165, 4166, + 4166, 3905, 4167, 3905, 4167, 4168, 4168, 4168, 4168, 3905, + + 3905, 3905, 3905, 3905, 4168, 4168, 3905, 4169, 3905, 4169, + 3905, 4170, 3905, 4171, 3905, 4171, 3905, 3905, 3905, 3905, + 4172, 4172, 4172, 4172, 4172, 3905, 4173, 3905, 4173, 3905, + 3905, 3905, 4174, 3905, 4175, 3905, 4175, 4176, 3905, 3905, + 3905, 3905, 3905, 4176, 3905, 3905, 4176, 4176, 4176, 3905, + 4177, 3905, 4177, 3905, 3905, 3905, 3905, 4178, 3905, 4179, + 3905, 4179, 4180, 3905, 3905, 3905, 3905, 4181, 3905, 4181, + 4182, 4182, 3905, 3905, 3905, 4182, 3905, 4183, 3905, 4183, + 4184, 3905, 3905, 3905, 4184, 4184, 3905, 4185, 3905, 4185, + 3905, 4186, 3905, 3905, 3905, 4186, 3905, 3905, 4187, 3905, + + 4187, 4188, 4188, 4188, 3905, 4189, 3905, 4189, 3905, 3905, + 3905, 4190, 3905, 4191, 3905, 4191, 3905, 3905, 4192, 4192, + 3905, 3905, 4192, 3905, 4193, 3905, 4193, 4194, 4195, 3905, + 3905, 3905, 3905, 4196, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4197, 4197, + 3905, 3905, 3905, 4197, 4198, 3905, 4199, 3905, 3905, 4199, + 4199, 4199, 4200, 3905, 4201, 4202, 4203, 4203, 4204, 3905, + + 3905, 3905, 4205, 4205, 3905, 3905, 3905, 4206, 3905, 3905, + 3905, 3905, 3905, 3905, 4207, 3905, 3905, 3905, 4208, 4208, + 3905, 3905, 3905, 4209, 3905, 3905, 3905, 4210, 4210, 4210, + 4210, 4211, 4212, 4212, 4212, 3905, 3905, 3905, 3905, 3905, + 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, 4212, + 4213, 4214, 4215, 4215, 3905, 3905, 4215, 4215, 4215, 4216, + 3905, 3905, 3905, 4217, 3905, 3905, 4218, 3905, 4219, 4219, + 4219, 4219, 4220, 4221, 4222, 4223, 4224, 3905, 3905, 4225, + 4226, 4227, 4227, 4227, 4227, 3905, 3905, 3905, 4227, 4227, + 4228, 3905, 4229, 4230, 3905, 3905, 3905, 3905, 4231, 3905, + + 3905, 4231, 4231, 4231, 4232, 4233, 4234, 4235, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 4235, 3905, 3905, 4235, + 4236, 3905, 3905, 3905, 3905, 3905, 3905, 4237, 4238, 4239, + 4240, 4241, 4241, 4241, 4242, 4243, 4243, 3905, 3905, 4244, + 3905, 3905, 3905, 4245, 3905, 4246, 4247, 3905, 3905, 4247, + 4248, 4249, 4250, 3905, 3905, 3905, 4251, 4251, 3905, 3905, + 3905, 4251, 4252, 4253, 4254, 4254, 3905, 4254, 3905, 3905, + 4255, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 4256, 4256, 4256, 4257, 3905, 4258, + 3905, 3905, 3905, 4258, 4258, 4258, 4259, 3905, 3905, 3905, + 4260, 4261, 4261, 4262, 4263, 4263, 4264, 4265, 4266, 4266, + 4267, 4268, 4268, 3905, 3905, 4268, 4269, 3905, 3905, 4270, + 4270, 3905, 3905, 3905, 4270, 4270, 4270, 4270, 4270, 4270, + 3905, 3905, 4270, 4270, 4270, 4271, 4272, 4273, 4273, 3905, + 3905, 3905, 4273, 3905, 3905, 4273, 4274, 3905, 3905, 3905, + 3905, 4275, 3905, 3905, 3905, 4276, 4277, 4277, 4277, 4277, + 4278, 4279, 4280, 3905, 3905, 4281, 3905, 3905, 3905, 4282, + + 4283, 4284, 3905, 3905, 4284, 4284, 3905, 3905, 4284, 4285, + 3905, 4286, 4287, 3905, 3905, 3905, 3905, 4288, 3905, 3905, + 3905, 4288, 4288, 4288, 4289, 3905, 3905, 4290, 4291, 3905, + 3905, 3905, 4291, 3905, 3905, 3905, 4291, 4292, 4293, 4294, + 4295, 4296, 4297, 4297, 4297, 4298, 4299, 3905, 3905, 3905, + 3905, 3905, 4300, 3905, 3905, 3905, 3905, 4301, 3905, 4302, + 4303, 3905, 3905, 3905, 3905, 3905, 4304, 4305, 4306, 4307, + 4307, 4307, 4308, 4309, 4310, 4310, 3905, 4311, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4312, 4313, 3905, + 4314, 4314, 4314, 4314, 4315, 3905, 3905, 3905, 3905, 4316, + 4317, 4317, 4318, 3905, 3905, 3905, 3905, 4319, 4320, 3905, + 3905, 3905, 3905, 4321, 3905, 3905, 4322, 3905, 3905, 3905, + 3905, 3905, 4323, 3905, 3905, 3905, 3905, 3905, 4324, 4324, + 4324, 3905, 3905, 4324, 4324, 4324, 3905, 3905, 3905, 3905, + 3905, 4324, 4324, 4325, 4326, 4327, 4327, 3905, 3905, 3905, + 3905, 3905, 4327, 3905, 3905, 3905, 4328, 4329, 4330, 4330, + 4330, 4330, 3905, 3905, 4331, 4332, 3905, 3905, 3905, 4333, + + 4334, 4335, 4336, 3905, 3905, 3905, 3905, 3905, 4336, 3905, + 3905, 3905, 4336, 3905, 3905, 3905, 4337, 4338, 3905, 3905, + 3905, 3905, 4339, 4339, 4339, 4339, 4340, 3905, 3905, 3905, + 3905, 3905, 4341, 4341, 4341, 4342, 4343, 4344, 4345, 4346, + 3905, 3905, 4347, 3905, 3905, 4348, 4349, 3905, 3905, 3905, + 4350, 3905, 4351, 3905, 4352, 4353, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4354, 4355, 3905, + 3905, 3905, 3905, 3905, 3905, 4356, 4357, 4358, 4359, 4359, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 4360, 4361, 3905, 4362, 4362, 4362, 4362, 3905, 3905, + 3905, 4363, 4364, 3905, 3905, 4365, 3905, 3905, 3905, 3905, + 3905, 3905, 4366, 4367, 3905, 3905, 3905, 3905, 3905, 3905, + 4368, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4369, + 3905, 3905, 3905, 4370, 4370, 4370, 3905, 3905, 3905, 3905, + 3905, 4370, 4370, 3905, 3905, 3905, 4370, 4370, 4371, 4372, + 4373, 4373, 3905, 3905, 3905, 4373, 4374, 4375, 4376, 3905, + 3905, 4376, 4376, 4376, 4377, 4378, 4379, 4380, 3905, 3905, + + 4381, 3905, 3905, 3905, 4381, 4381, 3905, 3905, 3905, 4382, + 3905, 3905, 3905, 4383, 4383, 4383, 4383, 4384, 4385, 3905, + 3905, 4385, 4386, 4387, 3905, 3905, 4388, 4389, 3905, 3905, + 3905, 3905, 3905, 4390, 3905, 3905, 3905, 4391, 3905, 3905, + 4392, 4393, 3905, 4394, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4395, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4396, 4397, + 4398, 4399, 4399, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4400, 4401, 3905, + 3905, 3905, 4402, 4402, 4402, 3905, 4403, 4404, 3905, 3905, + 3905, 4405, 4406, 4407, 4408, 3905, 3905, 3905, 4409, 4410, + 4410, 4410, 3905, 3905, 3905, 4410, 4410, 4410, 3905, 3905, + 4411, 3905, 3905, 4412, 4412, 4412, 4413, 4414, 4415, 3905, + 3905, 3905, 4415, 4415, 4415, 4416, 4417, 4418, 4419, 4420, + 4420, 4420, 3905, 3905, 3905, 3905, 4421, 3905, 3905, 3905, + 4422, 4422, 4422, 4423, 4424, 3905, 3905, 3905, 4424, 3905, + 3905, 4425, 4426, 3905, 3905, 3905, 3905, 3905, 4427, 4428, + 3905, 3905, 3905, 4429, 4430, 3905, 4431, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 4432, 3905, 3905, 3905, 4433, 4434, 4435, 4436, 4436, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 4437, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4438, + 4438, 3905, 4439, 3905, 3905, 4440, 4441, 4442, 4443, 3905, + 3905, 4444, 4444, 4444, 4444, 3905, 3905, 4444, 4444, 3905, + 3905, 3905, 3905, 3905, 4445, 4445, 4445, 4446, 3905, 3905, + 3905, 3905, 4447, 4447, 4447, 4447, 3905, 3905, 4448, 4449, + + 3905, 3905, 4450, 4450, 4450, 3905, 4451, 3905, 3905, 3905, + 3905, 3905, 4452, 4452, 3905, 3905, 3905, 3905, 4453, 4454, + 4455, 4456, 3905, 3905, 4457, 4458, 3905, 4459, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4460, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4461, + 4462, 4463, 4464, 4464, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 4465, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 4441, 4442, 4443, 4444, + + 4444, 4444, 4444, 3905, 3905, 3905, 4444, 4444, 3905, 3905, + 3905, 3905, 3905, 3905, 4445, 4445, 3905, 3905, 4446, 3905, + 3905, 3905, 4447, 4447, 4447, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 4449, 3905, 3905, 3905, 4450, 4450, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 4453, 4454, 4455, 4456, 4457, 4458, 3905, 4459, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 4460, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 4461, 4462, 4463, 4464, 4464, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4441, + 4442, 4443, 4444, 4444, 3905, 3905, 4444, 4444, 4444, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4445, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 4447, 4447, 4447, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4449, 4450, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 4453, 3905, 3905, 3905, + 3905, 4456, 4457, 4458, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4460, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 4463, 4464, 4464, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 4441, 4442, 4443, 4444, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4444, 4444, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4445, 3905, 3905, + 3905, 4447, 3905, 3905, 4447, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 4450, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4453, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 4458, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 4460, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, 4464, + 4464, 4464, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 4441, 3905, 3905, 4443, 4444, 3905, 3905, 3905, 3905, 3905, + 3905, 4444, 4444, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 4445, 4447, 3905, 3905, 3905, 4447, 3905, 3905, 3905, + + 3905, 3905, 3905, 4450, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4458, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4460, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 4463, 4464, 4464, 4464, 4466, 4467, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 4441, 4443, 4444, 3905, 3905, 4444, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 4445, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 4450, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 4460, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 4463, 4464, 4468, 4469, + 4466, 4467, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 4443, 4444, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 4445, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 4450, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, + 4468, 4464, 4470, 4469, 4471, 4464, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 4443, 4444, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4445, 3905, 3905, + 3905, 3905, 4450, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, + + 4470, 3905, 4471, 4464, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 4463, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 4463, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 4463, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 4463, 4463, 3905, 3905, 3905, 3905, 3905, + + 3905, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, 4463, + + 4463, 4463, 4463, 3905, 0, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905 } ; -static yyconst flex_uint16_t yy_nxt[11977] = +static yyconst flex_uint16_t yy_nxt[14073] = { 0, - 3333, 242, 243, 242, 242, 243, 242, 242, 243, 242, - 242, 243, 242, 247, 243, 247, 253, 244, 250, 253, - 244, 250, 694, 245, 3333, 251, 245, 3333, 251, 248, - 247, 243, 247, 623, 254, 256, 257, 254, 256, 257, - 258, 259, 641, 258, 259, 623, 248, 263, 264, 624, - 260, 256, 257, 260, 261, 626, 258, 256, 257, 1305, - 261, 625, 258, 263, 264, 1306, 260, 275, 243, 275, - 660, 625, 260, 275, 243, 275, 275, 243, 275, 275, - 243, 275, 707, 276, 243, 243, 243, 708, 1666, 276, - 699, 265, 277, 1667, 667, 277, 622, 622, 622, 1673, - - 278, 622, 622, 622, 622, 622, 622, 265, 266, 267, - 243, 267, 266, 266, 266, 266, 266, 266, 266, 268, - 266, 266, 266, 739, 266, 270, 266, 271, 266, 243, - 243, 243, 275, 243, 275, 275, 243, 275, 660, 275, - 243, 275, 275, 243, 275, 278, 626, 626, 276, 675, - 712, 276, 626, 266, 266, 279, 676, 757, 279, 622, - 622, 622, 625, 625, 272, 622, 622, 622, 625, 758, - 631, 713, 740, 273, 266, 267, 243, 267, 266, 266, - 266, 266, 266, 266, 266, 268, 266, 266, 266, 817, - 266, 270, 266, 271, 266, 243, 243, 243, 243, 243, - - 243, 275, 243, 275, 818, 275, 243, 275, 243, 243, - 243, 280, 632, 867, 280, 825, 868, 277, 633, 266, - 266, 277, 626, 634, 281, 243, 243, 243, 635, 682, - 272, 275, 243, 275, 275, 243, 275, 971, 625, 273, - 972, 281, 275, 243, 275, 1674, 626, 279, 1676, 626, - 279, 275, 243, 275, 622, 622, 622, 726, 282, 622, - 622, 622, 625, 660, 677, 625, 1677, 282, 283, 284, - 243, 284, 283, 283, 283, 283, 283, 283, 283, 285, - 283, 283, 283, 844, 283, 287, 283, 288, 283, 293, - 243, 293, 293, 243, 293, 243, 243, 243, 730, 243, - - 243, 243, 293, 243, 293, 294, 720, 892, 294, 667, - 1680, 295, 678, 283, 283, 295, 667, 626, 294, 289, - 721, 893, 290, 622, 622, 622, 622, 622, 622, 622, - 622, 622, 845, 625, 291, 283, 284, 243, 284, 283, - 283, 283, 283, 283, 283, 283, 285, 283, 283, 283, - 667, 283, 287, 283, 288, 283, 293, 243, 293, 293, - 243, 293, 293, 243, 293, 716, 305, 243, 305, 305, - 243, 305, 294, 717, 1681, 296, 880, 626, 296, 718, - 283, 283, 306, 737, 688, 306, 289, 738, 739, 290, - 622, 622, 622, 625, 622, 622, 622, 622, 622, 622, - - 881, 291, 297, 298, 243, 298, 297, 297, 297, 297, - 297, 297, 297, 299, 297, 297, 297, 861, 297, 301, - 297, 302, 297, 317, 243, 317, 317, 243, 317, 329, - 243, 329, 862, 329, 243, 329, 243, 243, 243, 318, - 667, 1684, 318, 1706, 898, 330, 898, 297, 297, 330, - 626, 626, 295, 243, 243, 243, 622, 622, 622, 622, - 622, 622, 622, 622, 622, 802, 625, 625, 899, 295, - 881, 303, 297, 298, 243, 298, 297, 297, 297, 297, - 297, 297, 297, 299, 297, 297, 297, 880, 297, 301, - 297, 302, 297, 329, 243, 329, 329, 243, 329, 329, - - 243, 329, 803, 329, 243, 329, 341, 243, 341, 330, - 782, 899, 330, 626, 783, 331, 1707, 297, 297, 331, - 709, 861, 342, 341, 243, 341, 622, 622, 622, 625, - 622, 622, 622, 622, 622, 622, 622, 622, 622, 342, - 1711, 303, 307, 308, 243, 308, 307, 307, 307, 307, - 307, 307, 307, 309, 307, 307, 307, 1084, 307, 311, - 307, 312, 307, 243, 243, 243, 243, 243, 243, 341, - 243, 341, 1714, 341, 243, 341, 341, 243, 341, 295, - 626, 626, 295, 823, 626, 342, 722, 307, 307, 342, - 824, 313, 343, 1716, 723, 1725, 625, 625, 314, 724, - - 625, 315, 307, 308, 243, 308, 307, 307, 307, 307, - 307, 307, 307, 309, 307, 307, 307, 1726, 307, 311, - 307, 312, 307, 341, 243, 341, 357, 243, 357, 357, - 243, 357, 892, 374, 243, 374, 374, 243, 374, 343, - 626, 626, 358, 626, 626, 358, 906, 307, 307, 375, - 746, 313, 375, 622, 622, 622, 625, 625, 314, 625, - 625, 315, 319, 320, 243, 320, 319, 319, 319, 319, - 319, 319, 319, 321, 319, 319, 319, 1727, 319, 323, - 319, 324, 319, 243, 243, 243, 243, 243, 243, 374, - 243, 374, 750, 374, 243, 374, 374, 243, 374, 278, - - 892, 1728, 278, 1730, 1738, 375, 1740, 319, 319, 375, - 626, 626, 376, 325, 910, 759, 326, 622, 622, 622, - 622, 622, 622, 622, 622, 622, 625, 625, 327, 319, - 320, 243, 320, 319, 319, 319, 319, 319, 319, 319, - 321, 319, 319, 319, 667, 319, 323, 319, 324, 319, - 374, 243, 374, 385, 243, 385, 385, 243, 385, 789, - 243, 243, 243, 243, 243, 243, 376, 667, 1440, 386, - 1743, 1744, 386, 1747, 319, 319, 278, 626, 626, 278, - 325, 1441, 789, 326, 622, 622, 622, 622, 622, 622, - 622, 622, 622, 625, 625, 327, 332, 333, 243, 333, - - 332, 332, 332, 332, 332, 332, 332, 334, 332, 332, - 332, 791, 332, 336, 332, 337, 332, 385, 243, 385, - 385, 243, 385, 385, 243, 385, 789, 385, 243, 385, - 400, 243, 400, 386, 794, 1749, 386, 785, 1750, 387, - 1752, 332, 332, 387, 626, 626, 401, 338, 622, 622, - 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, - 625, 625, 339, 332, 333, 243, 333, 332, 332, 332, - 332, 332, 332, 332, 334, 332, 332, 332, 667, 332, - 336, 332, 337, 332, 400, 243, 400, 243, 243, 243, - 243, 243, 243, 802, 400, 243, 400, 400, 243, 400, - - 401, 1094, 626, 402, 626, 1417, 402, 1094, 332, 332, - 401, 764, 626, 401, 338, 622, 622, 622, 625, 769, - 625, 622, 622, 622, 622, 622, 622, 1619, 625, 339, - 344, 345, 243, 345, 344, 344, 344, 344, 344, 344, - 344, 346, 344, 344, 344, 667, 344, 348, 344, 349, - 344, 400, 243, 400, 400, 243, 400, 414, 243, 414, - 837, 414, 243, 414, 424, 243, 424, 403, 626, 626, - 403, 626, 626, 415, 1753, 344, 344, 415, 774, 350, - 425, 622, 622, 622, 625, 625, 351, 625, 625, 352, - 622, 622, 622, 353, 1754, 354, 355, 344, 345, 243, - - 345, 344, 344, 344, 344, 344, 344, 344, 346, 344, - 344, 344, 667, 344, 348, 344, 349, 344, 424, 243, - 424, 243, 243, 243, 243, 243, 243, 892, 424, 243, - 424, 424, 243, 424, 425, 626, 626, 426, 626, 626, - 426, 911, 344, 344, 425, 784, 350, 425, 622, 622, - 622, 625, 625, 351, 625, 625, 352, 622, 622, 622, - 353, 1755, 354, 355, 359, 360, 243, 360, 359, 359, - 359, 359, 359, 359, 359, 361, 359, 359, 359, 362, - 359, 363, 359, 364, 359, 362, 362, 362, 362, 362, - 362, 362, 362, 362, 362, 362, 362, 362, 362, 362, - - 362, 362, 362, 362, 362, 362, 362, 362, 362, 359, - 359, 362, 362, 365, 366, 362, 362, 362, 362, 362, - 367, 362, 362, 368, 362, 362, 362, 369, 362, 370, - 371, 372, 362, 362, 362, 362, 362, 362, 377, 378, - 243, 378, 377, 377, 377, 377, 377, 377, 377, 379, - 377, 377, 377, 1759, 377, 381, 377, 382, 377, 424, - 243, 424, 424, 243, 424, 439, 243, 439, 1760, 439, - 243, 439, 243, 243, 243, 427, 626, 1761, 427, 1763, - 889, 440, 844, 377, 377, 440, 1767, 890, 278, 622, - 622, 622, 625, 891, 383, 377, 378, 243, 378, 377, - - 377, 377, 377, 377, 377, 377, 379, 377, 377, 377, - 1771, 377, 381, 377, 382, 377, 243, 243, 243, 439, - 243, 439, 439, 243, 439, 1775, 439, 243, 439, 439, - 243, 439, 278, 793, 667, 440, 1777, 889, 440, 813, - 377, 377, 441, 814, 890, 441, 667, 815, 792, 3333, - 896, 383, 388, 389, 243, 389, 388, 388, 388, 388, - 388, 388, 388, 390, 388, 388, 388, 1779, 388, 392, - 388, 393, 388, 451, 243, 451, 451, 243, 451, 462, - 243, 462, 882, 462, 243, 462, 1781, 669, 1782, 452, - 1030, 1094, 452, 883, 1517, 463, 884, 388, 388, 463, - - 394, 654, 395, 670, 906, 664, 1518, 1096, 396, 622, - 622, 622, 622, 622, 622, 397, 789, 1124, 398, 388, - 389, 243, 389, 388, 388, 388, 388, 388, 388, 388, - 390, 388, 388, 388, 1125, 388, 392, 388, 393, 388, - 473, 243, 473, 473, 243, 473, 488, 243, 488, 900, - 488, 243, 488, 1783, 1785, 790, 474, 1124, 1792, 474, - 901, 1796, 489, 884, 388, 388, 489, 394, 791, 395, - 792, 622, 622, 622, 1254, 396, 622, 622, 622, 622, - 622, 622, 397, 1797, 1399, 398, 404, 405, 243, 405, - 404, 404, 404, 404, 404, 404, 404, 406, 404, 404, - - 404, 1125, 404, 408, 404, 409, 404, 243, 243, 243, - 243, 243, 243, 499, 243, 499, 1799, 499, 243, 499, - 499, 243, 499, 490, 1622, 1809, 490, 626, 626, 500, - 1810, 404, 404, 500, 808, 819, 501, 410, 622, 622, - 622, 1811, 411, 625, 625, 622, 622, 622, 622, 622, - 622, 622, 622, 622, 412, 404, 405, 243, 405, 404, - 404, 404, 404, 404, 404, 404, 406, 404, 404, 404, - 1812, 404, 408, 404, 409, 404, 499, 243, 499, 243, - 243, 243, 243, 243, 243, 1813, 499, 243, 499, 499, - 243, 499, 501, 1814, 1815, 502, 626, 905, 502, 1816, - - 404, 404, 500, 830, 890, 500, 410, 622, 622, 622, - 891, 411, 625, 622, 622, 622, 622, 622, 622, 622, - 622, 622, 1817, 412, 416, 417, 243, 417, 416, 416, - 416, 416, 416, 416, 416, 418, 416, 416, 416, 1818, - 416, 420, 416, 421, 416, 499, 243, 499, 499, 243, - 499, 243, 243, 243, 882, 243, 243, 243, 499, 243, - 499, 503, 900, 1819, 503, 883, 1820, 426, 1028, 416, - 416, 426, 1821, 901, 501, 1823, 1028, 422, 416, 417, - 243, 417, 416, 416, 416, 416, 416, 416, 416, 418, - 416, 416, 416, 1824, 416, 420, 416, 421, 416, 499, - - 243, 499, 243, 243, 243, 243, 243, 243, 1825, 499, - 243, 499, 499, 243, 499, 501, 1440, 1563, 504, 1828, - 1831, 504, 1094, 416, 416, 503, 1832, 1833, 503, 1446, - 1446, 422, 428, 429, 243, 429, 428, 428, 428, 428, - 428, 428, 428, 430, 428, 428, 428, 1806, 428, 432, - 428, 433, 428, 499, 243, 499, 499, 243, 499, 518, - 243, 518, 1834, 518, 243, 518, 243, 243, 243, 505, - 1835, 1836, 505, 851, 1837, 519, 1840, 428, 428, 519, - 852, 434, 520, 622, 622, 622, 1849, 1854, 435, 625, - 1855, 436, 622, 622, 622, 622, 622, 622, 437, 428, - - 429, 243, 429, 428, 428, 428, 428, 428, 428, 428, - 430, 428, 428, 428, 1894, 428, 432, 428, 433, 428, - 243, 243, 243, 518, 243, 518, 518, 243, 518, 1895, - 518, 243, 518, 518, 243, 518, 520, 1901, 1907, 519, - 626, 1908, 519, 1909, 428, 428, 521, 859, 434, 521, - 622, 622, 622, 1910, 1913, 435, 625, 1919, 436, 622, - 622, 622, 865, 865, 865, 437, 442, 443, 243, 443, - 442, 442, 442, 442, 442, 442, 442, 444, 442, 442, - 442, 1921, 442, 446, 442, 447, 442, 531, 243, 531, - 531, 243, 531, 545, 243, 545, 1927, 545, 243, 545, - - 556, 243, 556, 532, 1931, 1934, 532, 905, 1935, 546, - 1937, 442, 442, 546, 890, 1938, 557, 448, 1939, 1940, - 896, 866, 449, 442, 443, 243, 443, 442, 442, 442, - 442, 442, 442, 442, 444, 442, 442, 442, 1941, 442, - 446, 442, 447, 442, 556, 243, 556, 243, 243, 243, - 243, 243, 243, 1942, 556, 243, 556, 556, 243, 556, - 557, 1943, 1945, 295, 889, 905, 295, 1951, 442, 442, - 557, 890, 890, 557, 448, 1952, 1953, 1029, 1029, 449, - 453, 454, 243, 454, 453, 453, 453, 453, 453, 453, - 453, 455, 453, 453, 453, 1955, 453, 457, 453, 458, - - 453, 556, 243, 556, 556, 243, 556, 568, 243, 568, - 1957, 568, 243, 568, 581, 243, 581, 558, 1209, 1965, - 558, 1970, 1971, 569, 1972, 453, 453, 569, 1210, 1974, - 582, 581, 243, 581, 1992, 1211, 459, 865, 865, 865, - 1993, 1098, 1113, 1113, 1113, 1994, 1997, 582, 1094, 460, - 453, 454, 243, 454, 453, 453, 453, 453, 453, 453, - 453, 455, 453, 453, 453, 1987, 453, 457, 453, 458, - 453, 243, 243, 243, 243, 243, 243, 581, 243, 581, - 1622, 581, 243, 581, 581, 243, 581, 278, 1975, 1995, - 278, 1998, 2000, 582, 1976, 453, 453, 582, 1977, 2001, - - 583, 581, 243, 581, 1978, 1996, 459, 1105, 1105, 1105, - 2002, 1106, 2003, 1989, 1107, 2004, 1622, 583, 2005, 460, - 464, 465, 243, 465, 464, 464, 464, 464, 464, 464, - 464, 466, 464, 464, 464, 2008, 464, 468, 464, 469, - 464, 595, 243, 595, 595, 243, 595, 243, 243, 243, - 2009, 243, 243, 243, 595, 243, 595, 596, 1988, 2010, - 596, 2011, 2014, 597, 2015, 464, 464, 597, 2016, 2012, - 596, 1134, 1134, 1134, 1634, 1634, 1634, 2017, 1113, 1113, - 1113, 470, 1134, 1134, 1134, 2013, 471, 464, 465, 243, - 465, 464, 464, 464, 464, 464, 464, 464, 466, 464, - - 464, 464, 2019, 464, 468, 464, 469, 464, 595, 243, - 595, 595, 243, 595, 595, 243, 595, 1641, 1641, 1641, - 1635, 873, 873, 873, 596, 2020, 2027, 598, 2029, 2031, - 598, 2055, 464, 464, 256, 257, 256, 257, 874, 258, - 750, 258, 1114, 1134, 1134, 1134, 1135, 2056, 470, 608, - 751, 608, 2057, 471, 475, 476, 243, 476, 475, 475, - 475, 475, 475, 475, 475, 477, 475, 475, 475, 2063, - 475, 479, 475, 480, 475, 620, 243, 620, 609, 645, - 609, 620, 243, 620, 2064, 647, 2068, 2069, 923, 923, - 923, 621, 654, 1109, 1109, 1109, 653, 621, 641, 475, - - 475, 2072, 481, 482, 483, 924, 2073, 1114, 665, 2077, - 484, 1111, 2080, 485, 1113, 1113, 1113, 1644, 1644, 1644, - 486, 475, 476, 243, 476, 475, 475, 475, 475, 475, - 475, 475, 477, 475, 475, 475, 666, 475, 479, 475, - 480, 475, 937, 937, 937, 939, 939, 939, 2084, 2085, - 667, 2086, 668, 2089, 653, 949, 949, 949, 2092, 938, - 2096, 2097, 940, 1156, 1156, 1156, 475, 475, 2098, 481, - 482, 483, 950, 1649, 1649, 1649, 2103, 484, 1135, 2105, - 485, 1158, 1637, 1637, 1637, 2106, 2107, 486, 491, 492, - 243, 492, 491, 491, 491, 491, 491, 491, 491, 493, - - 491, 491, 491, 2108, 491, 495, 491, 496, 491, 952, - 952, 952, 966, 966, 966, 973, 973, 973, 982, 982, - 982, 984, 984, 984, 2110, 2111, 953, 2114, 1638, 967, - 2116, 2119, 974, 491, 491, 983, 2135, 2136, 985, 993, - 993, 993, 1167, 1167, 1167, 2137, 1168, 2142, 2143, 1169, - 2146, 1655, 1655, 1655, 2147, 2148, 994, 497, 491, 492, - 243, 492, 491, 491, 491, 491, 491, 491, 491, 493, - 491, 491, 491, 2151, 491, 495, 491, 496, 491, 1001, - 1001, 1001, 1005, 1005, 1005, 1017, 1017, 1017, 1039, 1039, - 1039, 1045, 1045, 1045, 1094, 2160, 1002, 1656, 2144, 1006, - - 2153, 2161, 1018, 491, 491, 1040, 2145, 2149, 1046, 1061, - 1061, 1061, 1193, 1193, 1193, 2150, 1194, 2162, 1622, 1195, - 2163, 1658, 1658, 1658, 2166, 2168, 1062, 497, 506, 507, - 243, 507, 506, 506, 506, 506, 506, 506, 506, 508, - 506, 506, 506, 2169, 506, 510, 506, 511, 506, 1067, - 1067, 1067, 1073, 1073, 1073, 1081, 1081, 1081, 873, 873, - 873, 1149, 1149, 1149, 2155, 2170, 1068, 1638, 2174, 1074, - 2176, 2177, 1082, 506, 506, 874, 2178, 2181, 1150, 1622, - 2185, 512, 2186, 513, 2188, 2190, 514, 1659, 1659, 1659, - 515, 1634, 1634, 1634, 516, 506, 507, 243, 507, 506, - - 506, 506, 506, 506, 506, 506, 508, 506, 506, 506, - 2154, 506, 510, 506, 511, 506, 2201, 1109, 1109, 1109, - 1153, 1153, 1153, 2202, 1162, 1162, 1162, 3333, 3333, 3333, - 3333, 3333, 3333, 1979, 2203, 1111, 2207, 1154, 2208, 1980, - 506, 506, 1164, 1981, 3333, 2209, 2215, 3333, 512, 1982, - 513, 2216, 2217, 514, 1112, 2220, 2224, 515, 1637, 1637, - 1637, 516, 522, 523, 243, 523, 522, 522, 522, 522, - 522, 522, 522, 524, 522, 522, 522, 1151, 522, 526, - 522, 527, 522, 1156, 1156, 1156, 923, 923, 923, 1155, - 2225, 2226, 1152, 1162, 1162, 1162, 1171, 1171, 1171, 2227, - - 2230, 1158, 2231, 924, 1175, 1175, 1175, 522, 522, 2232, - 2233, 1164, 2234, 2246, 1173, 1196, 1196, 1196, 528, 1197, - 1159, 1176, 1198, 1212, 1212, 1212, 2247, 1213, 2251, 2254, - 1214, 529, 522, 523, 243, 523, 522, 522, 522, 522, - 522, 522, 522, 524, 522, 522, 522, 2255, 522, 526, - 522, 527, 522, 1171, 1171, 1171, 2261, 1165, 1179, 1179, - 1179, 1181, 1181, 1181, 1181, 1181, 1181, 3333, 3333, 3333, - 2266, 1173, 1185, 1185, 1185, 1180, 2268, 522, 522, 1183, - 2269, 2270, 1183, 2274, 3333, 1822, 1822, 1822, 528, 1186, - 1216, 1216, 1216, 2275, 1217, 2276, 2277, 1218, 2278, 2279, - - 1174, 529, 533, 534, 243, 534, 533, 533, 533, 533, - 533, 533, 533, 535, 533, 533, 533, 1177, 533, 537, - 533, 538, 533, 1187, 1187, 1187, 1189, 1189, 1189, 937, - 937, 937, 1178, 2280, 2281, 1184, 1189, 1189, 1189, 2282, - 1188, 1205, 1205, 1205, 1191, 2283, 938, 533, 533, 939, - 939, 939, 2300, 2301, 1191, 1622, 539, 2302, 540, 1207, - 2304, 2306, 541, 1641, 1641, 1641, 940, 542, 543, 533, - 534, 243, 534, 533, 533, 533, 533, 533, 533, 533, - 535, 533, 533, 533, 2307, 533, 537, 533, 538, 533, - 2309, 1199, 1199, 1199, 2310, 949, 949, 949, 2286, 3333, - - 3333, 3333, 3333, 3333, 3333, 2311, 2312, 1192, 1200, 3333, - 3333, 3333, 950, 2313, 533, 533, 3333, 2314, 2326, 3333, - 1234, 1234, 1234, 539, 1235, 540, 3333, 1236, 1622, 541, - 1658, 1658, 1658, 2327, 542, 543, 547, 548, 243, 548, - 547, 547, 547, 547, 547, 547, 547, 549, 547, 547, - 547, 1201, 547, 551, 547, 552, 547, 1202, 2332, 2333, - 1203, 2339, 2340, 952, 952, 952, 3333, 3333, 3333, 1219, - 1219, 1219, 1230, 1230, 1230, 2287, 1669, 1205, 1205, 1205, - 953, 547, 547, 3333, 2341, 2357, 1220, 553, 2328, 2358, - 1232, 2359, 1244, 1244, 1244, 1207, 1245, 2375, 2329, 1246, - - 2376, 2377, 554, 547, 548, 243, 548, 547, 547, 547, - 547, 547, 547, 547, 549, 547, 547, 547, 1204, 547, - 551, 547, 552, 547, 1208, 2380, 2382, 1230, 1230, 1230, - 966, 966, 966, 1237, 1237, 1237, 2383, 1237, 1237, 1237, - 973, 973, 973, 2384, 2385, 1232, 2386, 967, 547, 547, - 2387, 1239, 2388, 2389, 553, 1239, 2390, 974, 1256, 1256, - 1256, 2391, 1257, 2392, 2393, 1258, 1644, 1644, 1644, 554, - 559, 560, 243, 560, 559, 559, 559, 559, 559, 559, - 559, 561, 559, 559, 559, 1233, 559, 563, 559, 564, - 559, 1250, 1250, 1250, 1250, 1250, 1250, 2398, 1240, 2399, - - 982, 982, 982, 2402, 984, 984, 984, 2288, 2289, 1252, - 2290, 2403, 1252, 2404, 2405, 559, 559, 983, 2291, 2408, - 565, 985, 1649, 1649, 1649, 2292, 566, 559, 560, 243, - 560, 559, 559, 559, 559, 559, 559, 559, 561, 559, - 559, 559, 1622, 559, 563, 559, 564, 559, 1622, 1259, - 1259, 1259, 2409, 1260, 2410, 1253, 1261, 1262, 1262, 1262, - 1262, 1262, 1262, 1267, 1267, 1267, 2411, 1272, 1272, 1272, - 2413, 1273, 559, 559, 1274, 1264, 2414, 565, 1264, 2397, - 2396, 1269, 2415, 566, 570, 571, 243, 571, 570, 570, - 570, 570, 570, 570, 570, 572, 570, 570, 570, 2416, - - 570, 574, 570, 575, 570, 2417, 2419, 1267, 1267, 1267, - 993, 993, 993, 1278, 1278, 1278, 2420, 2400, 1278, 1278, - 1278, 1265, 1001, 1001, 1001, 1269, 2401, 994, 2406, 570, - 570, 1280, 576, 2421, 577, 2431, 1280, 2407, 2432, 1002, - 578, 1283, 1283, 1283, 2433, 1284, 2434, 2438, 1285, 2439, - 2446, 579, 570, 571, 243, 571, 570, 570, 570, 570, - 570, 570, 570, 572, 570, 570, 570, 1270, 570, 574, - 570, 575, 570, 1281, 1286, 1286, 1286, 1005, 1005, 1005, - 2447, 1294, 1294, 1294, 2454, 2455, 1286, 1286, 1286, 1290, - 1290, 1290, 1288, 1291, 1006, 2456, 1292, 570, 570, 1296, - - 576, 2468, 577, 2469, 1288, 1308, 1308, 1308, 578, 1309, - 2485, 2486, 1310, 1829, 1829, 1829, 1655, 1655, 1655, 579, - 584, 585, 243, 585, 584, 584, 584, 584, 584, 584, - 584, 586, 584, 584, 584, 2487, 584, 588, 584, 589, - 584, 1289, 1300, 1300, 1300, 1017, 1017, 1017, 2488, 1294, - 1294, 1294, 2490, 1300, 1300, 1300, 1311, 1311, 1311, 1830, - 1302, 2491, 1018, 2492, 2493, 584, 584, 1296, 2494, 2495, - 590, 1302, 2496, 1312, 2497, 2498, 591, 1338, 1338, 1338, - 592, 1339, 2499, 2500, 1340, 2501, 593, 584, 585, 243, - 585, 584, 584, 584, 584, 584, 584, 584, 586, 584, - - 584, 584, 2506, 584, 588, 584, 589, 584, 2507, 1094, - 1297, 1315, 1315, 1315, 1303, 1658, 1658, 1658, 1315, 1315, - 1315, 1321, 1321, 1321, 1321, 1321, 1321, 2508, 2509, 1317, - 2510, 2511, 584, 584, 2512, 2513, 1317, 590, 1622, 1323, - 2514, 2515, 1323, 591, 1347, 1347, 1347, 592, 1348, 2503, - 2516, 1349, 2517, 593, 599, 600, 243, 600, 599, 599, - 599, 599, 599, 599, 599, 601, 599, 599, 599, 1318, - 599, 603, 599, 604, 599, 1333, 1333, 1333, 1333, 1333, - 1333, 2505, 1324, 2518, 1039, 1039, 1039, 1342, 1342, 1342, - 1342, 1342, 1342, 1335, 2519, 2521, 1335, 2522, 2523, 599, - - 599, 1040, 1372, 1372, 1372, 1344, 1373, 605, 1344, 1374, - 606, 2524, 1826, 1826, 1826, 2525, 2526, 607, 599, 600, - 243, 600, 599, 599, 599, 599, 599, 599, 599, 601, - 599, 599, 599, 2531, 599, 603, 599, 604, 599, 1045, - 1045, 1045, 1336, 1350, 1350, 1350, 2532, 2535, 1353, 1353, - 1353, 1358, 1358, 1358, 1345, 2536, 1046, 1358, 1358, 1358, - 1351, 2537, 2538, 599, 599, 1354, 1381, 1381, 1381, 1360, - 1382, 605, 2541, 1383, 606, 1360, 1827, 1659, 1659, 1659, - 2542, 607, 610, 611, 243, 611, 610, 610, 610, 610, - 610, 610, 610, 612, 610, 610, 610, 2545, 610, 614, - - 610, 615, 610, 2546, 1361, 1362, 1362, 1362, 1364, 1364, - 1364, 1622, 3333, 3333, 3333, 1367, 1367, 1367, 1367, 1367, - 1367, 2554, 1363, 2555, 2539, 1365, 2556, 610, 610, 3333, - 1061, 1061, 1061, 1369, 616, 2540, 1369, 1390, 1390, 1390, - 617, 1391, 2567, 2590, 1392, 2591, 2596, 1062, 2504, 618, - 610, 611, 243, 611, 610, 610, 610, 610, 610, 610, - 610, 612, 610, 610, 610, 2597, 610, 614, 610, 615, - 610, 1366, 1375, 1375, 1375, 1375, 1375, 1375, 2543, 1370, - 1067, 1067, 1067, 1385, 1385, 1385, 1385, 1385, 1385, 2544, - 1377, 2598, 2599, 1377, 2600, 610, 610, 1068, 1073, 1073, - - 1073, 1387, 616, 2601, 1387, 1395, 1395, 1395, 617, 1395, - 1395, 1395, 1081, 1081, 1081, 1074, 2602, 618, 626, 1841, - 1841, 1841, 2603, 1397, 2604, 641, 2605, 1397, 1094, 1082, - 1406, 1406, 1406, 2610, 625, 642, 1378, 1401, 1401, 1401, - 2611, 1402, 2612, 2613, 1403, 1904, 1904, 1904, 1408, 1406, - 1406, 1406, 1388, 1413, 1413, 1413, 2560, 2607, 1413, 1413, - 1413, 2614, 643, 644, 645, 1842, 2561, 1408, 1622, 646, - 647, 1415, 2562, 648, 649, 1398, 1415, 650, 2615, 651, - 652, 653, 626, 1105, 1105, 1105, 2616, 1106, 2617, 2618, - 1107, 1109, 1109, 1109, 1109, 1109, 1109, 2619, 625, 655, - - 1424, 1424, 1424, 1149, 1149, 1149, 1153, 1153, 1153, 1111, - 2608, 2579, 1111, 1409, 1156, 1156, 1156, 1622, 1425, 2620, - 1150, 2580, 1416, 1154, 2581, 2621, 643, 656, 657, 1999, - 1999, 1999, 1158, 658, 659, 2622, 2624, 660, 649, 2582, - 2625, 661, 2626, 662, 663, 664, 1461, 1461, 1461, 2583, - 1462, 2628, 2584, 1463, 1466, 1466, 1466, 2629, 1467, 2609, - 2635, 1468, 1156, 1156, 1156, 1156, 1156, 1156, 1162, 1162, - 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1167, 1167, 1167, - 1158, 1168, 2643, 1158, 1169, 2644, 1164, 2645, 2646, 1164, - 2647, 2648, 1164, 1171, 1171, 1171, 1171, 1171, 1171, 1171, - - 1171, 1171, 1175, 1175, 1175, 1477, 1477, 1477, 2440, 1478, - 2441, 1173, 1479, 2649, 1173, 2650, 2651, 1173, 2652, 1176, - 1179, 1179, 1179, 2442, 1482, 1482, 1482, 1473, 1483, 1470, - 2653, 1484, 1181, 1181, 1181, 2657, 2660, 1180, 1181, 1181, - 1181, 1181, 1181, 1181, 1185, 1185, 1185, 2661, 1476, 2662, - 1183, 1486, 1486, 1486, 2663, 1487, 1183, 2664, 1488, 1183, - 2665, 1186, 1187, 1187, 1187, 1489, 1489, 1489, 2666, 1490, - 2669, 2677, 1491, 1189, 1189, 1189, 1189, 1189, 1189, 1188, - 1189, 1189, 1189, 1193, 1193, 1193, 2443, 1194, 2444, 2678, - 1195, 1191, 2681, 2682, 1191, 1196, 1196, 1196, 1191, 1197, - - 2673, 2445, 1198, 1485, 1199, 1199, 1199, 1493, 1493, 1493, - 2700, 1494, 2701, 2674, 1495, 1205, 1205, 1205, 1205, 1205, - 1205, 1200, 1205, 1205, 1205, 1212, 1212, 1212, 2675, 1213, - 2702, 2703, 1214, 1207, 2704, 2679, 1207, 1504, 1504, 1504, - 1207, 2676, 1492, 1216, 1216, 1216, 2705, 1217, 2680, 2706, - 1218, 1219, 1219, 1219, 1505, 1506, 1506, 1506, 2707, 1507, - 1094, 2713, 1508, 1230, 1230, 1230, 2293, 2294, 1220, 2295, - 1500, 1230, 1230, 1230, 1230, 1230, 1230, 2296, 1234, 1234, - 1234, 1232, 1235, 2714, 2297, 1236, 1237, 1237, 1237, 1232, - 2683, 2715, 1232, 1237, 1237, 1237, 1237, 1237, 1237, 1523, - - 1523, 1523, 2716, 2684, 1239, 1244, 1244, 1244, 2709, 1245, - 2717, 1239, 1246, 1622, 1239, 2718, 1524, 1250, 1250, 1250, - 1250, 1250, 1250, 2563, 1250, 1250, 1250, 1530, 1530, 1530, - 1256, 1256, 1256, 2564, 1257, 1252, 2719, 1258, 1252, 2565, - 2720, 1519, 1252, 2721, 1531, 1259, 1259, 1259, 2710, 1260, - 2722, 2723, 1261, 1262, 1262, 1262, 1520, 1262, 1262, 1262, - 1262, 1262, 1262, 1533, 1533, 1533, 1267, 1267, 1267, 2724, - 2725, 1264, 1267, 1267, 1267, 1264, 2727, 2728, 1264, 2730, - 1534, 1267, 1267, 1267, 1269, 1278, 1278, 1278, 2738, 1528, - 1269, 1272, 1272, 1272, 2745, 1273, 2746, 2747, 1274, 1269, - - 1278, 1278, 1278, 1280, 1278, 1278, 1278, 1283, 1283, 1283, - 2748, 1284, 2749, 2731, 1285, 1286, 1286, 1286, 1280, 1286, - 1286, 1286, 1280, 2732, 2750, 1532, 1286, 1286, 1286, 2733, - 1535, 2751, 2752, 1288, 1290, 1290, 1290, 1288, 1291, 2734, - 2753, 1292, 2754, 2755, 1288, 1294, 1294, 1294, 1294, 1294, - 1294, 1294, 1294, 1294, 1545, 1545, 1545, 3333, 3333, 3333, - 1300, 1300, 1300, 1296, 1540, 2756, 1296, 2760, 2761, 1296, - 2762, 1546, 2763, 2764, 3333, 1300, 1300, 1300, 1302, 1300, - 1300, 1300, 2765, 1308, 1308, 1308, 1542, 1309, 2766, 2767, - 1310, 2768, 2769, 1302, 1311, 1311, 1311, 1302, 1553, 1553, - - 1553, 1544, 1554, 2770, 1547, 1555, 1315, 1315, 1315, 2771, - 2772, 1312, 1315, 1315, 1315, 1315, 1315, 1315, 1321, 1321, - 1321, 1321, 1321, 1321, 1317, 1321, 1321, 1321, 2773, 2774, - 1317, 2775, 2776, 1317, 2777, 2778, 1323, 2779, 2793, 1323, - 1566, 1566, 1566, 1323, 2794, 2795, 1548, 1333, 1333, 1333, - 1333, 1333, 1333, 1333, 1333, 1333, 2796, 1567, 2797, 2782, - 1338, 1338, 1338, 2798, 1339, 1335, 1558, 1340, 1335, 2783, - 2799, 1335, 1561, 1342, 1342, 1342, 1342, 1342, 1342, 1342, - 1342, 1342, 1347, 1347, 1347, 2784, 1348, 2800, 2808, 1349, - 2809, 1344, 2810, 2811, 1344, 2785, 2812, 1344, 1350, 1350, - - 1350, 1576, 1576, 1576, 2813, 1577, 2814, 2815, 1578, 1579, - 1579, 1579, 2820, 2821, 1571, 1351, 1353, 1353, 1353, 2822, - 1581, 1581, 1581, 1094, 1582, 2823, 1580, 1583, 1585, 1585, - 1585, 2825, 2828, 1354, 1358, 1358, 1358, 1358, 1358, 1358, - 1574, 1358, 1358, 1358, 2829, 1586, 1362, 1362, 1362, 1589, - 1589, 1589, 1360, 1590, 2830, 1360, 1591, 2802, 2831, 1360, - 1364, 1364, 1364, 1363, 1592, 1592, 1592, 2832, 1593, 2833, - 2834, 1594, 1367, 1367, 1367, 2835, 2836, 1365, 1367, 1367, - 1367, 1367, 1367, 1367, 1372, 1372, 1372, 2837, 1373, 2842, - 1369, 1374, 1375, 1375, 1375, 2843, 1369, 2844, 2845, 1369, - - 2846, 1588, 1375, 1375, 1375, 1375, 1375, 1375, 2847, 2848, - 1377, 1381, 1381, 1381, 2849, 1382, 2850, 2851, 1383, 2852, - 1377, 2853, 2854, 1377, 1385, 1385, 1385, 1385, 1385, 1385, - 2855, 1385, 1385, 1385, 1390, 1390, 1390, 2856, 1391, 2857, - 2858, 1392, 1387, 2862, 2863, 1387, 2864, 2865, 1596, 1387, - 1605, 1605, 1605, 1395, 1395, 1395, 1395, 1395, 1395, 1395, - 1395, 1395, 1609, 1609, 1609, 2868, 2869, 1606, 3333, 3333, - 3333, 1397, 1598, 2870, 1397, 2871, 2872, 1397, 2873, 1610, - 1401, 1401, 1401, 2881, 1402, 3333, 2882, 1403, 1406, 1406, - 1406, 2883, 1602, 1406, 1406, 1406, 1406, 1406, 1406, 1615, - - 1615, 1615, 2884, 1413, 1413, 1413, 1408, 1413, 1413, 1413, - 2885, 1408, 2886, 2887, 1408, 2888, 1616, 1413, 1413, 1413, - 1607, 1415, 1621, 1621, 1621, 1415, 1424, 1424, 1424, 1611, - 1461, 1461, 1461, 1094, 1462, 1415, 2889, 1463, 2890, 2893, - 1622, 1623, 2899, 1613, 1425, 1466, 1466, 1466, 2900, 1467, - 2901, 2902, 1468, 1156, 1156, 1156, 1670, 1670, 1670, 1162, - 1162, 1162, 2903, 2904, 1618, 1171, 1171, 1171, 1477, 1477, - 1477, 1158, 1478, 1671, 2905, 1479, 2875, 1164, 1482, 1482, - 1482, 2912, 1483, 1173, 2913, 1484, 1181, 1181, 1181, 1486, - 1486, 1486, 2914, 1487, 2915, 2916, 1488, 2917, 1489, 1489, - - 1489, 2918, 1490, 2919, 1183, 1491, 1189, 1189, 1189, 1493, - 1493, 1493, 2920, 1494, 1668, 2921, 1495, 1682, 1682, 1682, - 2922, 2923, 1675, 2924, 1191, 2925, 1672, 1205, 1205, 1205, - 1686, 1686, 1686, 1678, 1683, 3333, 3333, 3333, 3333, 3333, - 3333, 1504, 1504, 1504, 2926, 1207, 2927, 1687, 3333, 3333, - 3333, 2928, 3333, 1679, 2929, 3333, 2930, 2931, 1505, 1690, - 1690, 1690, 2932, 1691, 2933, 3333, 1692, 1506, 1506, 1506, - 2934, 1507, 2935, 2936, 1508, 3333, 3333, 3333, 3333, 3333, - 3333, 2937, 1685, 2938, 2952, 1689, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 1094, 2943, 3333, 3333, 3333, 3333, 1693, - - 2953, 1688, 2958, 3333, 2959, 2946, 3333, 1699, 1699, 1699, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 2960, 2943, 1694, 2961, 1700, 2962, 2970, 3333, 1230, 1230, - 1230, 3333, 2971, 1696, 3333, 2944, 1237, 1237, 1237, 2941, - 1523, 1523, 1523, 1708, 1708, 1708, 1232, 1709, 1695, 2972, - 1710, 2973, 2974, 1697, 1239, 2979, 1698, 1524, 1712, 1712, - 1712, 1250, 1250, 1250, 1530, 1530, 1530, 1717, 1717, 1717, - 2980, 1718, 2981, 2982, 1719, 1713, 1702, 2963, 1703, 1252, - 1701, 1531, 1262, 1262, 1262, 1533, 1533, 1533, 1705, 2964, - 1721, 1721, 1721, 1704, 1722, 2983, 2984, 1723, 2985, 2986, - - 1264, 2987, 1534, 1267, 1267, 1267, 1278, 1278, 1278, 2988, - 1286, 1286, 1286, 1732, 1732, 1732, 2989, 1294, 1294, 1294, - 2990, 1269, 2991, 2994, 1280, 1622, 1623, 1715, 1288, 2965, - 1733, 2943, 1545, 1545, 1545, 1296, 1735, 1735, 1735, 2975, - 1736, 2966, 2946, 1737, 1300, 1300, 1300, 2977, 1720, 1546, - 1094, 2976, 1741, 1741, 1741, 2994, 1745, 1745, 1745, 2978, - 2997, 1724, 1302, 1729, 1315, 1315, 1315, 1731, 1734, 1742, - 1553, 1553, 1553, 1746, 1554, 2943, 2998, 1555, 1321, 1321, - 1321, 2999, 1317, 1566, 1566, 1566, 1756, 1756, 1756, 2944, - 1757, 2992, 3002, 1758, 3000, 3003, 1323, 1333, 1333, 1333, - - 1567, 1764, 1764, 1764, 1739, 1342, 1342, 1342, 3004, 1576, - 1576, 1576, 3001, 1577, 3011, 1335, 1578, 3014, 1765, 1579, - 1579, 1579, 3015, 1344, 3005, 1768, 1768, 1768, 1748, 1769, - 3016, 2948, 1770, 1581, 1581, 1581, 1580, 1582, 3017, 3006, - 1583, 1585, 1585, 1585, 1751, 3009, 1762, 1772, 1772, 1772, - 2949, 1773, 2950, 3018, 1774, 1358, 1358, 1358, 1586, 1589, - 1589, 1589, 3023, 1590, 3010, 2951, 1591, 1766, 1592, 1592, - 1592, 3026, 1593, 1360, 3012, 1594, 1367, 1367, 1367, 1375, - 1375, 1375, 1385, 1385, 1385, 1786, 1786, 1786, 3029, 1605, - 1605, 1605, 3030, 3013, 1369, 3031, 3032, 1377, 3033, 3034, - - 1387, 2994, 1787, 3036, 2994, 1776, 1606, 1788, 1788, 1788, - 3037, 1789, 3038, 3021, 1790, 1395, 1395, 1395, 1609, 1609, - 1609, 1793, 1793, 1793, 3024, 1794, 3039, 3040, 1795, 1406, - 1406, 1406, 3022, 1397, 3041, 1610, 1615, 1615, 1615, 1803, - 1803, 1803, 1778, 3025, 3042, 1780, 1784, 1408, 1800, 1800, - 1800, 3043, 1801, 1616, 3044, 1802, 1804, 1413, 1413, 1413, - 3048, 3049, 1621, 1621, 1621, 1838, 1838, 1838, 1826, 1826, - 1826, 1838, 1838, 1838, 3050, 1415, 3051, 3052, 1798, 1791, - 1622, 1843, 1843, 1843, 1845, 1845, 1845, 3333, 3333, 3333, - 1156, 1156, 1156, 1670, 1670, 1670, 3053, 3054, 1844, 3055, - - 3056, 1846, 3057, 3061, 3333, 3062, 1805, 3063, 1158, 3064, - 1671, 3065, 3066, 1807, 1850, 1850, 1850, 3070, 1851, 3071, - 3072, 1852, 1162, 1162, 1162, 1171, 1171, 1171, 3073, 1839, - 1808, 3074, 1839, 3075, 3077, 1827, 1857, 1857, 1857, 3078, - 1164, 3079, 3080, 1173, 1859, 1859, 1859, 1181, 1181, 1181, - 3081, 1847, 3082, 1858, 1189, 1189, 1189, 1848, 1863, 1863, - 1863, 1860, 3333, 3333, 3333, 1183, 1682, 1682, 1682, 1205, - 1205, 1205, 1191, 1856, 3083, 1864, 1869, 1869, 1869, 3333, - 3084, 1853, 3085, 1683, 1866, 1866, 1866, 1207, 1867, 3090, - 3086, 1868, 3091, 1870, 1686, 1686, 1686, 1872, 1872, 1872, - - 3092, 1873, 3087, 3093, 1874, 1875, 1875, 1875, 3333, 3333, - 3333, 1687, 1861, 3094, 1690, 1690, 1690, 3095, 1691, 1862, - 1865, 1692, 1876, 3096, 3097, 3333, 3333, 3333, 3333, 1871, - 3333, 3333, 3333, 1880, 1880, 1880, 3333, 3333, 3333, 3333, - 3333, 3333, 3088, 3333, 3333, 3333, 3333, 3333, 3098, 2954, - 1881, 3099, 3100, 3333, 3089, 3101, 3333, 1699, 1699, 1699, - 3102, 3333, 1885, 1885, 1885, 2955, 1886, 2956, 3103, 1887, - 3104, 3105, 1877, 3106, 1700, 1888, 1888, 1888, 3107, 1879, - 2957, 3333, 3333, 3333, 3109, 1883, 3333, 3333, 3333, 3110, - 1878, 1094, 1889, 3111, 1882, 3112, 3113, 1884, 3333, 1230, - - 1230, 1230, 3114, 3333, 1237, 1237, 1237, 1708, 1708, 1708, - 3115, 1709, 3116, 3117, 1710, 3118, 3108, 1232, 1896, 1896, - 1896, 3119, 1239, 1712, 1712, 1712, 3120, 3121, 1890, 1898, - 1898, 1898, 3122, 1899, 3123, 1897, 1900, 3124, 3125, 1891, - 1713, 3126, 1902, 1902, 1902, 1717, 1717, 1717, 3127, 1718, - 3128, 3129, 1719, 1262, 1262, 1262, 1267, 1267, 1267, 1893, - 1903, 3130, 1721, 1721, 1721, 1892, 1722, 3131, 3132, 1723, - 3133, 1264, 3134, 1094, 1269, 1911, 1911, 1911, 1286, 1286, - 1286, 1732, 1732, 1732, 1915, 1915, 1915, 3136, 1916, 3137, - 3138, 1917, 3135, 1912, 3139, 3140, 1288, 3141, 1733, 1905, - - 1294, 1294, 1294, 1735, 1735, 1735, 3142, 1736, 3143, 3144, - 1737, 1300, 1300, 1300, 1741, 1741, 1741, 3145, 1296, 1925, - 1925, 1925, 3146, 1906, 1914, 3147, 1922, 1922, 1922, 1302, - 1923, 1742, 3148, 1924, 3149, 3150, 1926, 1745, 1745, 1745, - 1928, 1928, 1928, 3151, 1929, 3152, 3153, 1930, 1932, 1932, - 1932, 1321, 1321, 1321, 1746, 1756, 1756, 1756, 1918, 1757, - 3154, 3155, 1758, 1333, 1333, 1333, 1933, 3156, 3157, 1323, - 1764, 1764, 1764, 1949, 1949, 1949, 3158, 1920, 1946, 1946, - 1946, 1335, 1947, 3159, 3161, 1948, 3162, 1765, 1768, 1768, - 1768, 1950, 1769, 3163, 3164, 1770, 3165, 1772, 1772, 1772, - - 3166, 1773, 1094, 1936, 1774, 1358, 1358, 1358, 1367, 1367, - 1367, 1375, 1375, 1375, 1944, 1959, 1959, 1959, 3333, 3333, - 3333, 3167, 3160, 1360, 3168, 3169, 1369, 3170, 3171, 1377, - 3172, 3173, 1960, 3174, 3175, 3333, 1962, 1962, 1962, 1385, - 1385, 1385, 3176, 1786, 1786, 1786, 3177, 1966, 1966, 1966, - 3178, 1967, 3179, 1963, 1968, 3180, 3181, 1387, 3182, 1956, - 1787, 3184, 1958, 1788, 1788, 1788, 1954, 1789, 3185, 3186, - 1790, 1395, 1395, 1395, 1793, 1793, 1793, 1094, 1794, 3187, - 3188, 1795, 3189, 3183, 1961, 3190, 1964, 3191, 3192, 1397, - 1406, 1406, 1406, 1800, 1800, 1800, 3193, 1801, 3194, 3195, - - 1802, 3196, 1803, 1803, 1803, 1983, 1983, 1983, 1408, 1984, - 3197, 3198, 1985, 1413, 1413, 1413, 3199, 3201, 1969, 1804, - 1990, 1990, 1990, 1822, 1822, 1822, 2006, 2006, 2006, 3202, - 3203, 1415, 1826, 1826, 1826, 3204, 3205, 1991, 2007, 2007, - 2007, 1973, 1829, 1829, 1829, 1838, 1838, 1838, 2018, 2018, - 2018, 1841, 1841, 1841, 1843, 1843, 1843, 3206, 2021, 2021, - 2021, 1094, 2022, 3207, 1986, 2023, 1845, 1845, 1845, 3208, - 3209, 1844, 2024, 2024, 2024, 3200, 2025, 3210, 3212, 2026, - 1156, 1156, 1156, 1846, 1850, 1850, 1850, 3213, 1851, 3214, - 3215, 1852, 1162, 1162, 1162, 2032, 2032, 2032, 1158, 1171, - - 1171, 1171, 1857, 1857, 1857, 3216, 3217, 2035, 2035, 2035, - 1164, 2036, 2033, 3218, 2037, 3219, 3220, 1173, 3221, 1858, - 1859, 1859, 1859, 2038, 2038, 2038, 3224, 2039, 3225, 3226, - 2040, 1181, 1181, 1181, 1189, 1189, 1189, 1860, 1863, 1863, - 1863, 3227, 3228, 2030, 3229, 3240, 2028, 1094, 1094, 1183, - 3238, 1665, 1191, 1094, 1094, 1864, 1094, 2043, 2043, 2043, - 2034, 2044, 1094, 1094, 2045, 2046, 2046, 2046, 1866, 1866, - 1866, 1664, 1867, 1094, 1663, 1868, 1869, 1869, 1869, 2048, - 2048, 2048, 2047, 2049, 3230, 1094, 2050, 1205, 1205, 1205, - 1872, 1872, 1872, 1870, 1873, 3232, 2041, 1874, 3231, 2042, - - 1875, 1875, 1875, 1094, 3233, 1207, 2052, 2052, 2052, 1094, - 2053, 3234, 1094, 2054, 1880, 1880, 1880, 1876, 2058, 2058, - 2058, 3235, 2059, 1094, 3330, 2060, 2061, 2061, 2061, 3236, - 1094, 1881, 1885, 1885, 1885, 1094, 1886, 1094, 2051, 1887, - 1888, 1888, 1888, 2062, 2065, 2065, 2065, 3237, 2066, 3246, - 1662, 2067, 1230, 1230, 1230, 1661, 3244, 1889, 1237, 1237, - 1237, 1896, 1896, 1896, 2074, 2074, 2074, 3247, 2075, 3252, - 1232, 2076, 3250, 1898, 1898, 1898, 1239, 1899, 1897, 1094, - 1900, 1902, 1902, 1902, 1904, 1904, 1904, 1262, 1262, 1262, - 1267, 1267, 1267, 2081, 2081, 2081, 1911, 1911, 1911, 1903, - - 1286, 1286, 1286, 2070, 3241, 1264, 1094, 1660, 1269, 3239, - 2082, 2071, 1094, 1094, 1912, 1915, 1915, 1915, 1288, 1916, - 3248, 1094, 1917, 1294, 1294, 1294, 2090, 2090, 2090, 1922, - 1922, 1922, 1094, 1923, 3242, 3243, 1924, 1094, 1657, 2083, - 2079, 1296, 1094, 1094, 2091, 2078, 1925, 1925, 1925, 2087, - 2093, 2093, 2093, 3245, 2094, 3262, 1094, 2095, 1928, 1928, - 1928, 1094, 1929, 1926, 3256, 1930, 1932, 1932, 1932, 2088, - 2099, 2099, 2099, 1321, 1321, 1321, 2102, 2102, 2102, 2104, - 2104, 2104, 1094, 3253, 1933, 1094, 1094, 2100, 1333, 1333, - 1333, 1323, 1946, 1946, 1946, 1094, 1947, 3249, 3254, 1948, - - 1949, 1949, 1949, 2112, 2112, 2112, 1335, 1358, 1358, 1358, - 2117, 2117, 2117, 1375, 1375, 1375, 1094, 3251, 1950, 3263, - 2113, 1959, 1959, 1959, 1094, 1360, 1094, 1094, 2118, 3264, - 1094, 1377, 3255, 1094, 2101, 2121, 2121, 2121, 1960, 2122, - 3258, 1654, 2123, 2124, 2124, 2124, 1962, 1962, 1962, 1094, - 2127, 2127, 2127, 2109, 2128, 3259, 3257, 2129, 1653, 3265, - 2125, 3260, 3261, 1963, 1094, 3268, 2115, 1385, 1385, 1385, - 2131, 2131, 2131, 1094, 1966, 1966, 1966, 2120, 1967, 3266, - 1094, 1968, 1395, 1395, 1395, 1387, 1652, 2132, 1094, 2126, - 2138, 2138, 2138, 2140, 2140, 2140, 1651, 1983, 1983, 1983, - - 1397, 1984, 3282, 1650, 1985, 1413, 1413, 1413, 2139, 1648, - 2141, 1990, 1990, 1990, 1647, 3269, 2133, 2156, 2156, 2156, - 2130, 2157, 3286, 1415, 2158, 2159, 2159, 2159, 1991, 2164, - 2164, 2164, 2165, 2165, 2165, 2134, 1999, 1999, 1999, 2167, - 2167, 2167, 2171, 2171, 2171, 2006, 2006, 2006, 2007, 2007, - 2007, 2152, 2172, 2172, 2172, 2175, 2175, 2175, 2179, 2179, - 2179, 2180, 2180, 2180, 2182, 2182, 2182, 2018, 2018, 2018, - 2183, 2183, 2183, 2021, 2021, 2021, 1094, 2022, 1094, 1094, - 2023, 2024, 2024, 2024, 1646, 2025, 1094, 1094, 2026, 1156, - 1156, 1156, 1162, 1162, 1162, 2032, 2032, 2032, 2173, 2191, - - 2191, 2191, 1094, 2192, 1094, 1094, 2193, 1158, 3283, 1094, - 1164, 3270, 2033, 1171, 1171, 1171, 2184, 2035, 2035, 2035, - 3271, 2036, 3267, 3274, 2037, 2038, 2038, 2038, 1094, 2039, - 3272, 1173, 2040, 1181, 1181, 1181, 1189, 1189, 1189, 1094, - 2187, 2043, 2043, 2043, 3276, 2044, 3273, 3277, 2045, 1094, - 3278, 1183, 2189, 2195, 1191, 1094, 3292, 2046, 2046, 2046, - 2197, 2197, 2197, 1645, 2198, 3275, 1094, 2199, 1205, 1205, - 1205, 1094, 2196, 2194, 2047, 2048, 2048, 2048, 1094, 2049, - 3284, 1094, 2050, 2052, 2052, 2052, 1207, 2053, 3285, 1094, - 2054, 2058, 2058, 2058, 1094, 2059, 3293, 1094, 2060, 2061, - - 2061, 2061, 2204, 2204, 2204, 3290, 2205, 3296, 3280, 2206, - 2065, 2065, 2065, 1094, 2066, 3281, 2062, 2067, 2210, 2210, - 2210, 1230, 1230, 1230, 2213, 2213, 2213, 3279, 3287, 2074, - 2074, 2074, 3291, 2075, 2200, 2211, 2076, 1094, 1643, 1232, - 1094, 1094, 2214, 1262, 1262, 1262, 1267, 1267, 1267, 2081, - 2081, 2081, 2221, 2221, 2221, 1094, 2222, 1642, 1640, 2223, - 1639, 1264, 1636, 1633, 1269, 1094, 2082, 1094, 1286, 1286, - 1286, 1294, 1294, 1294, 2090, 2090, 2090, 2093, 2093, 2093, - 1632, 2094, 3322, 3288, 2095, 2212, 1288, 3289, 1094, 1296, - 1094, 1094, 2091, 2099, 2099, 2099, 3297, 2219, 2218, 2235, - - 2235, 2235, 3294, 2236, 3295, 1094, 2237, 1321, 1321, 1321, - 2100, 2102, 2102, 2102, 2239, 2239, 2239, 2104, 2104, 2104, - 2240, 2240, 2240, 3298, 1094, 1323, 3333, 3333, 3333, 3333, - 3333, 3333, 1094, 2229, 2228, 1631, 3300, 2241, 3333, 3333, - 3333, 1094, 3302, 3333, 1094, 3306, 3333, 1333, 1333, 1333, - 2112, 2112, 2112, 1094, 1094, 3333, 2248, 2248, 2248, 3299, - 2249, 3330, 1630, 2250, 3304, 1335, 1094, 2113, 2252, 2252, - 2252, 2238, 2117, 2117, 2117, 1094, 3305, 2242, 2256, 2256, - 2256, 2121, 2121, 2121, 3307, 2122, 2253, 3301, 2123, 1094, - 2118, 3303, 1094, 2243, 1094, 1629, 2257, 2244, 2124, 2124, - - 2124, 2258, 2258, 2258, 1094, 2259, 1094, 3312, 2260, 2127, - 2127, 2127, 2245, 2128, 1628, 2125, 2129, 1385, 1385, 1385, - 2131, 2131, 2131, 2263, 2263, 2263, 1627, 2264, 1094, 3314, - 2265, 1395, 1395, 1395, 1094, 1387, 3308, 2132, 2138, 2138, - 2138, 2140, 2140, 2140, 2271, 2271, 2271, 3313, 2272, 1397, - 3316, 2273, 1413, 1413, 1413, 1626, 2139, 1625, 2141, 2285, - 2285, 2285, 2156, 2156, 2156, 3310, 2157, 1624, 2262, 2158, - 1415, 2159, 2159, 2159, 2298, 2298, 2298, 1094, 2299, 2299, - 2299, 3309, 2267, 2164, 2164, 2164, 2165, 2165, 2165, 2167, - 2167, 2167, 2303, 2303, 2303, 2305, 2305, 2305, 2171, 2171, - - 2171, 2284, 2172, 2172, 2172, 2175, 2175, 2175, 2308, 2308, - 2308, 2179, 2179, 2179, 2180, 2180, 2180, 2182, 2182, 2182, - 2183, 2183, 2183, 2315, 2315, 2315, 2317, 2317, 2317, 1162, - 1162, 1162, 2319, 2319, 2319, 2191, 2191, 2191, 1094, 2192, - 1094, 2316, 2193, 1171, 1171, 1171, 1094, 1164, 1094, 2320, - 1181, 1181, 1181, 1189, 1189, 1189, 2197, 2197, 2197, 1094, - 2198, 1173, 1617, 2199, 2324, 2324, 2324, 1614, 1183, 3323, - 1094, 1191, 2204, 2204, 2204, 3311, 2205, 1612, 1094, 2206, - 3320, 3315, 2325, 2330, 2330, 2330, 3317, 2322, 2210, 2210, - 2210, 2337, 2337, 2337, 2321, 2318, 3318, 2334, 2334, 2334, - - 2331, 2335, 3321, 1608, 2336, 2211, 2213, 2213, 2213, 2338, - 1262, 1262, 1262, 1094, 2323, 2343, 2343, 2343, 2345, 2345, - 2345, 3333, 3333, 3333, 2214, 2221, 2221, 2221, 1264, 2222, - 1094, 1094, 2223, 2344, 1604, 2346, 1094, 1094, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 2351, 2351, 2351, 1286, 1286, - 1286, 1294, 1294, 1294, 1094, 1603, 3333, 1601, 1600, 3333, - 1094, 3326, 2352, 3324, 2347, 1599, 1288, 3319, 3325, 1296, - 2342, 2355, 2355, 2355, 1597, 1595, 2348, 2360, 2360, 2360, - 2235, 2235, 2235, 1587, 2236, 3327, 3328, 2237, 2356, 1321, - 1321, 1321, 3329, 2350, 2239, 2239, 2239, 2240, 2240, 2240, - - 2349, 1584, 2362, 2362, 2362, 1575, 2363, 1323, 2353, 2364, - 2365, 2365, 2365, 1573, 2241, 2354, 3333, 3333, 3333, 3333, - 3333, 3333, 2369, 2369, 2369, 1572, 1570, 2366, 2371, 2371, - 2371, 1569, 1568, 3333, 1565, 1564, 3333, 2372, 2372, 2372, - 2370, 1562, 2248, 2248, 2248, 1560, 2249, 1559, 2361, 2250, - 1557, 3333, 3333, 3333, 2373, 2252, 2252, 2252, 2256, 2256, - 2256, 1556, 2258, 2258, 2258, 1552, 2259, 2367, 3333, 2260, - 2368, 1551, 1550, 2253, 1549, 1543, 2257, 2378, 2378, 2378, - 2263, 2263, 2263, 1541, 2264, 1539, 1538, 2265, 1395, 1395, - 1395, 1537, 2271, 2271, 2271, 2379, 2272, 1536, 1529, 2273, - - 1413, 1413, 1413, 2285, 2285, 2285, 1397, 2298, 2298, 2298, - 2299, 2299, 2299, 2412, 2412, 2412, 1527, 2374, 1415, 1526, - 1525, 1094, 2303, 2303, 2303, 2305, 2305, 2305, 2308, 2308, - 2308, 2418, 2418, 2418, 2381, 2315, 2315, 2315, 2317, 2317, - 2317, 2422, 2422, 2422, 1522, 2319, 2319, 2319, 2424, 2424, - 2424, 1521, 2425, 2316, 1516, 2426, 2427, 2427, 2427, 2423, - 1515, 2394, 2320, 1514, 1513, 2395, 1181, 1181, 1181, 1189, - 1189, 1189, 1512, 1511, 2428, 2324, 2324, 2324, 2330, 2330, - 2330, 2435, 2435, 2435, 1183, 2436, 1510, 1191, 2437, 1509, - 2334, 2334, 2334, 2325, 2335, 2331, 1503, 2336, 2337, 2337, - - 2337, 2448, 2448, 2448, 1262, 1262, 1262, 2343, 2343, 2343, - 2345, 2345, 2345, 2451, 2451, 2451, 2338, 2452, 2449, 1502, - 2453, 1501, 1264, 1499, 1498, 2344, 1497, 2346, 1496, 1481, - 2429, 2457, 2457, 2457, 1480, 1475, 2430, 2351, 2351, 2351, - 2459, 2459, 2459, 1474, 2460, 1472, 1471, 2461, 2458, 2462, - 2462, 2462, 1469, 1465, 2352, 1294, 1294, 1294, 2355, 2355, - 2355, 2450, 2465, 2465, 2465, 1464, 2466, 2463, 1460, 2467, - 2470, 2470, 2470, 1296, 1459, 2356, 2360, 2360, 2360, 2472, - 2472, 2472, 2362, 2362, 2362, 1458, 2363, 2471, 1457, 2364, - 2365, 2365, 2365, 1456, 2474, 2474, 2474, 2473, 2475, 1455, - - 1454, 2476, 2477, 2477, 2477, 1453, 1452, 2366, 2479, 2479, - 2479, 2369, 2369, 2369, 1451, 1450, 2464, 1449, 1448, 2478, - 2371, 2371, 2371, 1447, 1445, 2480, 2372, 2372, 2372, 2370, - 2481, 2481, 2481, 1444, 2482, 1443, 1442, 2483, 3333, 3333, - 3333, 1439, 1438, 2373, 2378, 2378, 2378, 1395, 1395, 1395, - 1413, 1413, 1413, 1437, 1436, 3333, 2412, 2412, 2412, 2520, - 2520, 2520, 2379, 1435, 1434, 1397, 1433, 1432, 1415, 2418, - 2418, 2418, 2527, 2527, 2527, 1431, 2422, 2422, 2422, 2424, - 2424, 2424, 1430, 2425, 1429, 1428, 2426, 1427, 1426, 2528, - 2427, 2427, 2427, 2484, 2423, 1423, 1181, 1181, 1181, 1189, - - 1189, 1189, 2533, 2533, 2533, 2435, 2435, 2435, 2428, 2436, - 2502, 1422, 2437, 2489, 1183, 1421, 1420, 1191, 1419, 2534, - 2547, 2547, 2547, 2448, 2448, 2448, 2549, 2549, 2549, 1418, - 2550, 1094, 1412, 2551, 2552, 2552, 2552, 2548, 1411, 1410, - 2449, 2451, 2451, 2451, 1405, 2452, 1404, 1400, 2453, 2457, - 2457, 2457, 2553, 1394, 2557, 2557, 2557, 2529, 2558, 1393, - 1389, 2559, 2462, 2462, 2462, 2530, 2458, 2459, 2459, 2459, - 1384, 2460, 1380, 1379, 2461, 1294, 1294, 1294, 1371, 1357, - 2463, 2465, 2465, 2465, 1356, 2466, 1355, 1352, 2467, 2568, - 2568, 2568, 1346, 1296, 2470, 2470, 2470, 2570, 2570, 2570, - - 1341, 2571, 1337, 1332, 2572, 1331, 2569, 2472, 2472, 2472, - 1330, 2471, 2474, 2474, 2474, 1329, 2475, 1328, 1327, 2476, - 1326, 2477, 2477, 2477, 1325, 2473, 2573, 2573, 2573, 1320, - 2574, 1319, 1314, 2575, 2479, 2479, 2479, 2566, 2478, 2576, - 2576, 2576, 1313, 2577, 1307, 1304, 2578, 1299, 2481, 2481, - 2481, 2480, 2482, 1298, 1293, 2483, 3333, 3333, 3333, 2586, - 2586, 2586, 2588, 2588, 2588, 1395, 1395, 1395, 2593, 2593, - 2593, 1282, 1277, 3333, 1276, 1275, 2587, 1271, 1266, 2589, - 2594, 2594, 2594, 1397, 1413, 1413, 1413, 2623, 2623, 2623, - 2520, 2520, 2520, 2627, 2627, 2627, 1255, 2595, 2527, 2527, - - 2527, 1249, 1415, 2630, 2630, 2630, 1248, 2631, 1247, 1243, - 2632, 1181, 1181, 1181, 1242, 2528, 1241, 2585, 1229, 1189, - 1189, 1189, 2636, 2636, 2636, 2533, 2533, 2533, 1228, 1183, - 1227, 2638, 2638, 2638, 1226, 2639, 2592, 1191, 2640, 2637, - 1225, 1224, 2534, 1223, 2606, 2641, 2641, 2641, 2547, 2547, - 2547, 2654, 2654, 2654, 1222, 2655, 1221, 1215, 2656, 2549, - 2549, 2549, 2642, 2550, 1170, 2548, 2551, 2552, 2552, 2552, - 2634, 2658, 2658, 2658, 1166, 2557, 2557, 2557, 2633, 2558, - 1161, 1160, 2559, 1148, 1147, 2553, 1146, 1145, 2659, 2667, - 2667, 2667, 2568, 2568, 2568, 2670, 2670, 2670, 1144, 2671, - - 1143, 1142, 2672, 1141, 2570, 2570, 2570, 2668, 2571, 2569, - 1140, 2572, 2573, 2573, 2573, 1139, 2574, 1138, 1137, 2575, - 2576, 2576, 2576, 1136, 2577, 1133, 1132, 2578, 3333, 3333, - 3333, 2586, 2586, 2586, 2686, 2686, 2686, 1131, 2687, 1130, - 1129, 2688, 2588, 2588, 2588, 3333, 1128, 1127, 2587, 2689, - 2689, 2689, 1126, 2690, 1123, 1122, 2691, 1121, 1120, 2589, - 2692, 2692, 2692, 2694, 2694, 2694, 1395, 1395, 1395, 2593, - 2593, 2593, 2594, 2594, 2594, 1119, 1118, 2693, 1117, 1116, - 2695, 1413, 1413, 1413, 1397, 2711, 2711, 2711, 2685, 2595, - 2697, 2697, 2697, 1115, 2698, 1108, 1104, 2699, 1103, 1415, - - 1102, 1101, 2712, 1622, 2623, 2623, 2623, 2726, 2726, 2726, - 2627, 2627, 2627, 2729, 2729, 2729, 2630, 2630, 2630, 1100, - 2631, 1097, 1095, 2632, 1181, 1181, 1181, 1094, 2696, 2736, - 2736, 2736, 2708, 2636, 2636, 2636, 2739, 2739, 2739, 1092, - 2740, 1090, 1183, 2741, 2638, 2638, 2638, 2737, 2639, 1089, - 2637, 2640, 2641, 2641, 2641, 2742, 2742, 2742, 1088, 2743, - 1087, 1086, 2744, 2654, 2654, 2654, 1083, 2655, 1080, 2642, - 2656, 2658, 2658, 2658, 2757, 2757, 2757, 1079, 2758, 1078, - 1076, 2759, 2667, 2667, 2667, 2670, 2670, 2670, 2659, 2671, - 2735, 1075, 2672, 2780, 2780, 2780, 1072, 2686, 2686, 2686, - - 2668, 2687, 1071, 1069, 2688, 2689, 2689, 2689, 1066, 2690, - 2781, 1065, 2691, 2692, 2692, 2692, 2786, 2786, 2786, 1064, - 2787, 1060, 1059, 2788, 2694, 2694, 2694, 2789, 2789, 2789, - 2693, 2790, 1057, 1056, 2791, 1395, 1395, 1395, 2697, 2697, - 2697, 2695, 2698, 1055, 1054, 2699, 1413, 1413, 1413, 2803, - 2803, 2803, 1052, 1397, 2711, 2711, 2711, 1051, 2805, 2805, - 2805, 1050, 2806, 1049, 1415, 2807, 2804, 1622, 2816, 2816, - 2816, 2712, 1622, 2726, 2726, 2726, 1622, 2817, 2817, 2817, - 2818, 2818, 2818, 2729, 2729, 2729, 2792, 2819, 2819, 2819, - 1181, 1181, 1181, 1048, 1047, 2801, 2736, 2736, 2736, 2739, - - 2739, 2739, 1044, 2740, 1043, 1041, 2741, 1038, 1183, 2742, - 2742, 2742, 1037, 2743, 2737, 1035, 2744, 2826, 2826, 2826, - 2838, 2838, 2838, 2757, 2757, 2757, 1034, 2758, 1033, 1032, - 2759, 2840, 2840, 2840, 2827, 1031, 1027, 2839, 2780, 2780, - 2780, 2824, 2859, 2859, 2859, 1025, 2860, 1024, 2841, 2861, - 2786, 2786, 2786, 1023, 2787, 2781, 1021, 2788, 2789, 2789, - 2789, 1020, 2790, 1019, 1016, 2791, 2866, 2866, 2866, 1413, - 1413, 1413, 2803, 2803, 2803, 2876, 2876, 2876, 1015, 2877, - 1014, 1013, 2878, 1011, 2867, 1010, 1009, 1415, 1007, 2804, - 1622, 1004, 1000, 1622, 2805, 2805, 2805, 999, 2806, 997, - - 996, 2807, 2816, 2816, 2816, 2817, 2817, 2817, 2818, 2818, - 2818, 995, 1622, 2819, 2819, 2819, 2891, 2891, 2891, 2894, - 2894, 2894, 992, 2895, 991, 990, 2896, 988, 2826, 2826, - 2826, 2897, 2897, 2897, 2892, 2874, 1620, 1620, 1620, 1620, - 1620, 1620, 1620, 1620, 1620, 2827, 987, 1620, 2898, 2838, - 2838, 2838, 1620, 1620, 1620, 1622, 1620, 2906, 2906, 2906, - 981, 2907, 980, 979, 2908, 977, 2839, 2909, 2909, 2909, - 976, 2910, 975, 970, 2911, 2840, 2840, 2840, 2866, 2866, - 2866, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 2841, 969, 1620, 965, 2867, 963, 962, 1620, - - 1620, 1620, 1622, 1620, 2859, 2859, 2859, 961, 2860, 960, - 959, 2861, 2939, 2939, 2939, 2876, 2876, 2876, 958, 2877, - 957, 956, 2878, 955, 954, 2891, 2891, 2891, 1620, 1620, - 2940, 951, 948, 1622, 1620, 1620, 1620, 1620, 1620, 2947, - 1620, 1620, 1620, 2892, 947, 1620, 2897, 2897, 2897, 945, - 1620, 1620, 1620, 1622, 1620, 2894, 2894, 2894, 944, 2895, - 943, 942, 2896, 2898, 2967, 2967, 2967, 941, 2968, 936, - 934, 2969, 2939, 2939, 2939, 2996, 2996, 2996, 933, 1620, - 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 2947, - 2940, 932, 1620, 1622, 1623, 930, 929, 1620, 1620, 1620, - - 1622, 1620, 2906, 2906, 2906, 928, 2907, 927, 925, 2908, - 2909, 2909, 2909, 922, 2910, 921, 919, 2911, 3007, 3007, - 3007, 2967, 2967, 2967, 918, 2968, 1620, 1620, 2969, 3019, - 3019, 3019, 3027, 3027, 3027, 3008, 3035, 3035, 3035, 2996, - 2996, 2996, 3007, 3007, 3007, 917, 3020, 915, 914, 3028, - 913, 3045, 3045, 3045, 1094, 3046, 912, 1622, 3047, 3008, - 3019, 3019, 3019, 3058, 3058, 3058, 909, 3059, 908, 907, - 3060, 3027, 3027, 3027, 3067, 3067, 3067, 3020, 3068, 904, - 903, 3069, 3035, 3035, 3035, 3045, 3045, 3045, 3028, 3046, - 1807, 902, 3047, 897, 3058, 3058, 3058, 895, 3059, 894, - - 1094, 3060, 3067, 3067, 3067, 888, 3068, 887, 886, 3069, - 3211, 3211, 3211, 3211, 3211, 3211, 885, 3222, 879, 3076, - 3223, 3331, 3331, 3331, 3331, 3331, 3331, 878, 1094, 877, - 875, 1094, 872, 871, 870, 869, 864, 861, 863, 3332, - 858, 857, 3332, 240, 240, 240, 240, 240, 240, 240, - 240, 240, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 249, 249, 249, 249, 249, 249, 249, 249, 249, 252, - 252, 252, 252, 252, 252, 252, 252, 252, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 262, 262, 262, - - 262, 262, 262, 262, 262, 262, 269, 269, 269, 269, - 269, 269, 269, 269, 269, 274, 274, 274, 274, 274, - 274, 274, 274, 274, 286, 286, 286, 286, 286, 286, - 286, 286, 286, 292, 292, 292, 292, 292, 292, 292, - 292, 292, 300, 300, 300, 300, 300, 300, 300, 300, - 300, 304, 304, 304, 304, 304, 304, 304, 304, 304, - 310, 310, 310, 310, 310, 310, 310, 310, 310, 316, - 316, 316, 316, 316, 316, 316, 316, 316, 322, 322, - 322, 322, 322, 322, 322, 322, 322, 328, 328, 328, - 328, 328, 328, 328, 328, 328, 335, 335, 335, 335, - - 335, 335, 335, 335, 335, 340, 340, 340, 340, 340, - 340, 340, 340, 340, 347, 347, 347, 347, 347, 347, - 347, 347, 347, 356, 356, 356, 356, 356, 356, 356, - 356, 356, 373, 373, 373, 373, 373, 373, 373, 373, - 373, 380, 380, 380, 380, 380, 380, 380, 380, 380, - 384, 384, 384, 384, 384, 384, 384, 384, 384, 391, - 391, 391, 391, 391, 391, 391, 391, 391, 399, 399, - 399, 399, 399, 399, 399, 399, 399, 407, 407, 407, - 407, 407, 407, 407, 407, 407, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 419, 419, 419, 419, 419, - - 419, 419, 419, 419, 423, 423, 423, 423, 423, 423, - 423, 423, 423, 431, 431, 431, 431, 431, 431, 431, - 431, 431, 438, 438, 438, 438, 438, 438, 438, 438, - 438, 445, 445, 445, 445, 445, 445, 445, 445, 445, - 450, 450, 450, 450, 450, 450, 450, 450, 450, 456, - 456, 456, 456, 456, 456, 456, 456, 456, 461, 461, - 461, 461, 461, 461, 461, 461, 461, 467, 467, 467, - 467, 467, 467, 467, 467, 467, 472, 472, 472, 472, - 472, 472, 472, 472, 472, 478, 478, 478, 478, 478, - 478, 478, 478, 478, 487, 487, 487, 487, 487, 487, - - 487, 487, 487, 494, 494, 494, 494, 494, 494, 494, - 494, 494, 498, 498, 498, 498, 498, 498, 498, 498, - 498, 509, 509, 509, 509, 509, 509, 509, 509, 509, - 517, 517, 517, 517, 517, 517, 517, 517, 517, 525, - 525, 525, 525, 525, 525, 525, 525, 525, 530, 530, - 530, 530, 530, 530, 530, 530, 530, 536, 536, 536, - 536, 536, 536, 536, 536, 536, 544, 544, 544, 544, - 544, 544, 544, 544, 544, 550, 550, 550, 550, 550, - 550, 550, 550, 550, 555, 555, 555, 555, 555, 555, - 555, 555, 555, 562, 562, 562, 562, 562, 562, 562, - - 562, 562, 567, 567, 567, 567, 567, 567, 567, 567, - 567, 573, 573, 573, 573, 573, 573, 573, 573, 573, - 580, 580, 580, 580, 580, 580, 580, 580, 580, 587, - 587, 587, 587, 587, 587, 587, 587, 587, 594, 594, - 594, 594, 594, 594, 594, 594, 594, 602, 602, 602, - 602, 602, 602, 602, 602, 602, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 613, 613, 613, 613, 613, - 613, 613, 613, 613, 619, 619, 619, 619, 619, 619, - 619, 619, 619, 638, 638, 638, 856, 854, 853, 638, - 672, 672, 672, 850, 849, 848, 672, 680, 680, 680, - - 846, 845, 843, 680, 684, 684, 684, 842, 841, 840, - 684, 690, 690, 690, 838, 837, 836, 690, 696, 696, - 696, 835, 834, 833, 696, 701, 701, 701, 831, 829, - 828, 701, 711, 711, 711, 826, 825, 822, 711, 728, - 728, 728, 820, 816, 812, 728, 732, 732, 732, 811, - 809, 807, 732, 742, 742, 742, 806, 804, 803, 742, - 748, 748, 748, 801, 800, 799, 748, 753, 753, 753, - 798, 797, 795, 753, 761, 761, 761, 794, 788, 786, - 761, 766, 766, 766, 781, 780, 779, 766, 771, 771, - 771, 778, 777, 775, 771, 776, 776, 776, 773, 772, - - 770, 776, 787, 787, 787, 768, 767, 765, 787, 796, - 796, 796, 763, 762, 760, 796, 805, 805, 805, 759, - 756, 755, 805, 810, 810, 810, 754, 752, 3333, 810, - 821, 821, 821, 749, 747, 745, 821, 827, 827, 827, - 744, 743, 741, 827, 832, 832, 832, 740, 736, 735, - 832, 839, 839, 839, 734, 733, 731, 839, 847, 847, - 847, 730, 729, 727, 847, 855, 855, 855, 726, 725, - 719, 855, 860, 860, 860, 860, 860, 860, 860, 715, - 860, 638, 638, 638, 714, 710, 706, 638, 876, 705, - 704, 703, 876, 672, 672, 672, 702, 700, 699, 672, - - 916, 698, 697, 695, 916, 680, 680, 680, 694, 693, - 692, 680, 920, 691, 689, 687, 920, 684, 684, 684, - 686, 685, 683, 684, 926, 681, 679, 660, 926, 690, - 690, 690, 3333, 674, 673, 690, 931, 671, 3333, 654, - 931, 696, 696, 696, 640, 639, 637, 696, 935, 636, - 630, 629, 935, 701, 701, 701, 630, 629, 628, 701, - 946, 627, 3333, 3333, 946, 711, 711, 711, 3333, 3333, - 3333, 711, 964, 3333, 3333, 3333, 964, 728, 728, 728, - 3333, 3333, 3333, 728, 968, 3333, 3333, 3333, 968, 732, - 732, 732, 3333, 3333, 3333, 732, 978, 3333, 3333, 3333, - - 978, 742, 742, 742, 3333, 3333, 3333, 742, 986, 3333, - 3333, 3333, 986, 748, 748, 748, 3333, 3333, 3333, 748, - 989, 3333, 3333, 3333, 989, 753, 753, 753, 3333, 3333, - 3333, 753, 998, 3333, 3333, 3333, 998, 761, 761, 761, - 3333, 3333, 3333, 761, 1003, 3333, 3333, 3333, 1003, 766, - 766, 766, 3333, 3333, 3333, 766, 1008, 3333, 3333, 3333, - 1008, 771, 771, 771, 3333, 3333, 3333, 771, 1012, 3333, - 3333, 3333, 1012, 776, 776, 776, 3333, 3333, 3333, 776, - 1022, 3333, 3333, 3333, 1022, 787, 787, 787, 3333, 3333, - 3333, 787, 1026, 3333, 3333, 3333, 1026, 796, 796, 796, - - 3333, 3333, 3333, 796, 1036, 3333, 3333, 3333, 1036, 805, - 805, 805, 3333, 3333, 3333, 805, 1042, 3333, 3333, 3333, - 1042, 810, 810, 810, 3333, 3333, 3333, 810, 1053, 3333, - 3333, 3333, 1053, 821, 821, 821, 3333, 3333, 3333, 821, - 1058, 3333, 3333, 3333, 1058, 827, 827, 827, 3333, 3333, - 3333, 827, 1063, 3333, 3333, 3333, 1063, 832, 832, 832, - 3333, 3333, 3333, 832, 1070, 3333, 3333, 3333, 1070, 839, - 839, 839, 3333, 3333, 3333, 839, 1077, 3333, 3333, 3333, - 1077, 847, 847, 847, 3333, 3333, 3333, 847, 1085, 3333, - 3333, 3333, 1085, 855, 855, 855, 3333, 3333, 3333, 855, - - 1091, 3333, 3333, 3333, 1091, 1093, 1093, 1093, 1093, 1093, - 1093, 1093, 1093, 1093, 1099, 3333, 3333, 3333, 3333, 1099, - 638, 638, 638, 3333, 3333, 3333, 638, 1110, 1110, 1110, - 1110, 3333, 3333, 1110, 1110, 672, 672, 672, 672, 3333, - 672, 3333, 672, 1157, 1157, 1157, 1157, 3333, 3333, 1157, - 1157, 680, 680, 680, 3333, 3333, 3333, 680, 1163, 1163, - 1163, 1163, 3333, 3333, 1163, 1163, 684, 684, 684, 3333, - 3333, 3333, 684, 1172, 1172, 1172, 1172, 3333, 3333, 1172, - 1172, 690, 690, 690, 690, 3333, 690, 3333, 690, 1182, - 1182, 1182, 1182, 3333, 3333, 1182, 1182, 696, 696, 696, - - 696, 3333, 696, 3333, 696, 1190, 1190, 1190, 1190, 3333, - 3333, 1190, 1190, 701, 701, 701, 701, 3333, 701, 3333, - 701, 1206, 1206, 1206, 1206, 3333, 3333, 1206, 1206, 711, - 711, 711, 3333, 3333, 3333, 711, 1231, 1231, 1231, 1231, - 3333, 3333, 1231, 1231, 1238, 1238, 1238, 1238, 3333, 3333, - 1238, 1238, 732, 732, 732, 3333, 3333, 3333, 732, 1251, - 1251, 1251, 1251, 3333, 3333, 1251, 1251, 742, 742, 742, - 3333, 3333, 3333, 742, 1263, 1263, 1263, 1263, 3333, 3333, - 1263, 1263, 748, 748, 748, 3333, 3333, 3333, 748, 1268, - 1268, 1268, 1268, 3333, 3333, 1268, 1268, 753, 753, 753, - - 3333, 3333, 3333, 753, 1279, 1279, 1279, 1279, 3333, 3333, - 1279, 1279, 761, 761, 761, 3333, 3333, 3333, 761, 1287, - 1287, 1287, 1287, 3333, 3333, 1287, 1287, 766, 766, 766, - 3333, 3333, 3333, 766, 1295, 1295, 1295, 1295, 3333, 3333, - 1295, 1295, 771, 771, 771, 3333, 3333, 3333, 771, 1301, - 1301, 1301, 1301, 3333, 3333, 1301, 1301, 776, 776, 776, - 3333, 3333, 3333, 776, 1316, 1316, 1316, 1316, 3333, 3333, - 1316, 1316, 787, 787, 787, 3333, 3333, 3333, 787, 1322, - 1322, 1322, 1322, 3333, 3333, 1322, 1322, 796, 796, 796, - 3333, 3333, 3333, 796, 1334, 1334, 1334, 1334, 3333, 3333, - - 1334, 1334, 805, 805, 805, 3333, 3333, 3333, 805, 1343, - 1343, 1343, 1343, 3333, 3333, 1343, 1343, 810, 810, 810, - 3333, 3333, 3333, 810, 1359, 1359, 1359, 1359, 3333, 3333, - 1359, 1359, 821, 821, 821, 821, 3333, 821, 3333, 821, - 1368, 1368, 1368, 1368, 3333, 3333, 1368, 1368, 827, 827, - 827, 3333, 3333, 3333, 827, 1376, 1376, 1376, 1376, 3333, - 3333, 1376, 1376, 832, 832, 832, 3333, 3333, 3333, 832, - 1386, 1386, 1386, 1386, 3333, 3333, 1386, 1386, 839, 839, - 839, 3333, 3333, 3333, 839, 1396, 1396, 1396, 1396, 3333, - 3333, 1396, 1396, 847, 847, 847, 3333, 3333, 3333, 847, - - 1407, 1407, 1407, 1407, 3333, 3333, 1407, 1407, 855, 855, - 855, 3333, 3333, 3333, 855, 1414, 1414, 1414, 1414, 3333, - 3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, 1093, 1093, - 1093, 1093, 1099, 3333, 1099, 3333, 3333, 1099, 638, 638, - 638, 3333, 3333, 3333, 638, 1110, 1110, 1110, 1110, 3333, - 3333, 1110, 1110, 672, 672, 672, 3333, 3333, 3333, 672, - 1157, 1157, 1157, 1157, 3333, 3333, 1157, 1157, 680, 680, - 680, 3333, 3333, 3333, 680, 1163, 1163, 1163, 1163, 3333, - 3333, 1163, 1163, 684, 684, 684, 3333, 3333, 3333, 684, - 1172, 1172, 1172, 1172, 3333, 3333, 1172, 1172, 690, 690, - - 690, 3333, 3333, 3333, 690, 1182, 1182, 1182, 1182, 3333, - 3333, 1182, 1182, 1190, 1190, 1190, 1190, 3333, 3333, 1190, - 1190, 701, 701, 701, 3333, 3333, 3333, 701, 1206, 1206, - 1206, 1206, 3333, 3333, 1206, 1206, 711, 711, 711, 3333, - 3333, 3333, 711, 1231, 1231, 1231, 1231, 3333, 3333, 1231, - 1231, 1238, 1238, 1238, 1238, 3333, 3333, 1238, 1238, 732, - 732, 732, 3333, 3333, 3333, 732, 1251, 1251, 1251, 1251, - 3333, 3333, 1251, 1251, 742, 742, 742, 742, 3333, 742, - 3333, 742, 1263, 1263, 1263, 1263, 3333, 3333, 1263, 1263, - 748, 748, 748, 748, 3333, 748, 3333, 748, 1268, 1268, - - 1268, 1268, 3333, 3333, 1268, 1268, 753, 753, 753, 3333, - 3333, 3333, 753, 1279, 1279, 1279, 1279, 3333, 3333, 1279, - 1279, 761, 761, 761, 3333, 3333, 3333, 761, 1287, 1287, - 1287, 1287, 3333, 3333, 1287, 1287, 766, 766, 766, 3333, - 3333, 3333, 766, 1295, 1295, 1295, 1295, 3333, 3333, 1295, - 1295, 771, 771, 771, 771, 3333, 771, 3333, 771, 1301, - 1301, 1301, 1301, 3333, 3333, 1301, 1301, 776, 776, 776, - 3333, 3333, 3333, 776, 1316, 1316, 1316, 1316, 3333, 3333, - 1316, 1316, 787, 787, 787, 3333, 3333, 3333, 787, 1322, - 1322, 1322, 1322, 3333, 3333, 1322, 1322, 796, 796, 796, - - 3333, 3333, 3333, 796, 1334, 1334, 1334, 1334, 3333, 3333, - 1334, 1334, 805, 805, 805, 3333, 3333, 3333, 805, 1343, - 1343, 1343, 1343, 3333, 3333, 1343, 1343, 810, 810, 810, - 3333, 3333, 3333, 810, 1359, 1359, 1359, 1359, 3333, 3333, - 1359, 1359, 821, 821, 821, 3333, 3333, 3333, 821, 1368, - 1368, 1368, 1368, 3333, 3333, 1368, 1368, 827, 827, 827, - 3333, 3333, 3333, 827, 1376, 1376, 1376, 1376, 3333, 3333, - 1376, 1376, 832, 832, 832, 3333, 3333, 3333, 832, 1386, - 1386, 1386, 1386, 3333, 3333, 1386, 1386, 839, 839, 839, - 3333, 3333, 3333, 839, 1396, 1396, 1396, 1396, 3333, 3333, - - 1396, 1396, 847, 847, 847, 847, 3333, 847, 3333, 847, - 1407, 1407, 1407, 1407, 3333, 3333, 1407, 1407, 855, 855, - 855, 3333, 3333, 3333, 855, 1414, 1414, 1414, 1414, 3333, - 3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, 1093, 1093, - 1093, 1093, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 638, 638, 638, 3333, 3333, 3333, 638, 672, 672, - 672, 3333, 3333, 3333, 672, 1157, 1157, 1157, 1157, 3333, - 3333, 1157, 1157, 680, 680, 680, 680, 3333, 680, 3333, - 680, 1163, 1163, 1163, 1163, 3333, 3333, 1163, 1163, 684, - 684, 684, 3333, 3333, 3333, 684, 1172, 1172, 1172, 1172, - - 3333, 3333, 1172, 1172, 690, 690, 690, 3333, 3333, 3333, - 690, 1182, 1182, 1182, 1182, 3333, 3333, 1182, 1182, 1190, - 1190, 1190, 1190, 3333, 3333, 1190, 1190, 701, 701, 701, - 3333, 3333, 3333, 701, 1206, 1206, 1206, 1206, 3333, 3333, - 1206, 1206, 711, 711, 711, 711, 3333, 711, 3333, 711, - 1231, 1231, 1231, 1231, 3333, 3333, 1231, 1231, 1238, 1238, - 1238, 1238, 3333, 3333, 1238, 1238, 732, 732, 732, 3333, - 3333, 3333, 732, 1251, 1251, 1251, 1251, 3333, 3333, 1251, - 1251, 1263, 1263, 1263, 1263, 3333, 3333, 1263, 1263, 1268, - 1268, 1268, 1268, 3333, 3333, 1268, 1268, 753, 753, 753, - - 3333, 3333, 3333, 753, 1279, 1279, 1279, 1279, 3333, 3333, - 1279, 1279, 761, 761, 761, 3333, 3333, 3333, 761, 1287, - 1287, 1287, 1287, 3333, 3333, 1287, 1287, 766, 766, 766, - 766, 3333, 766, 3333, 766, 1295, 1295, 1295, 1295, 3333, - 3333, 1295, 1295, 771, 771, 771, 3333, 3333, 3333, 771, - 1301, 1301, 1301, 1301, 3333, 3333, 1301, 1301, 776, 776, - 776, 3333, 3333, 3333, 776, 1316, 1316, 1316, 1316, 3333, - 3333, 1316, 1316, 787, 787, 787, 3333, 3333, 3333, 787, - 1322, 1322, 1322, 1322, 3333, 3333, 1322, 1322, 796, 796, - 796, 3333, 3333, 3333, 796, 1334, 1334, 1334, 1334, 3333, - - 3333, 1334, 1334, 805, 805, 805, 805, 3333, 805, 3333, - 805, 1343, 1343, 1343, 1343, 3333, 3333, 1343, 1343, 810, - 810, 810, 3333, 3333, 3333, 810, 1359, 1359, 1359, 1359, - 3333, 3333, 1359, 1359, 821, 821, 821, 3333, 3333, 3333, - 821, 1368, 1368, 1368, 1368, 3333, 3333, 1368, 1368, 827, - 827, 827, 3333, 3333, 3333, 827, 1376, 1376, 1376, 1376, - 3333, 3333, 1376, 1376, 832, 832, 832, 3333, 3333, 3333, - 832, 1386, 1386, 1386, 1386, 3333, 3333, 1386, 1386, 839, - 839, 839, 3333, 3333, 3333, 839, 1396, 1396, 1396, 1396, - 3333, 3333, 1396, 1396, 847, 847, 847, 3333, 3333, 3333, - - 847, 1407, 1407, 1407, 1407, 3333, 3333, 1407, 1407, 855, - 855, 855, 3333, 3333, 3333, 855, 1414, 1414, 1414, 1414, - 3333, 3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, 1093, - 1093, 1093, 1093, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 638, 638, 638, 3333, 3333, 3333, 638, 672, - 672, 672, 672, 3333, 672, 3333, 672, 1157, 1157, 1157, - 1157, 3333, 3333, 1157, 1157, 1163, 1163, 1163, 1163, 3333, - 3333, 1163, 1163, 684, 684, 684, 3333, 3333, 3333, 684, - 1172, 1172, 1172, 1172, 3333, 3333, 1172, 1172, 690, 690, - 690, 690, 3333, 690, 3333, 690, 1182, 1182, 1182, 1182, - - 3333, 3333, 1182, 1182, 1190, 1190, 1190, 1190, 3333, 3333, - 1190, 1190, 701, 701, 701, 701, 3333, 701, 3333, 701, - 1206, 1206, 1206, 1206, 3333, 3333, 1206, 1206, 711, 711, - 711, 711, 3333, 711, 3333, 711, 1231, 1231, 1231, 1231, - 3333, 3333, 1231, 1231, 1238, 1238, 1238, 1238, 3333, 3333, - 1238, 1238, 732, 732, 732, 3333, 3333, 3333, 732, 1251, - 1251, 1251, 1251, 3333, 3333, 1251, 1251, 1263, 1263, 1263, - 1263, 3333, 3333, 1263, 1263, 1268, 1268, 1268, 1268, 3333, - 3333, 1268, 1268, 753, 753, 753, 3333, 3333, 3333, 753, - 1279, 1279, 1279, 1279, 3333, 3333, 1279, 1279, 761, 761, - - 761, 3333, 3333, 3333, 761, 1287, 1287, 1287, 1287, 3333, - 3333, 1287, 1287, 1295, 1295, 1295, 1295, 3333, 3333, 1295, - 1295, 771, 771, 771, 3333, 3333, 3333, 771, 1301, 1301, - 1301, 1301, 3333, 3333, 1301, 1301, 776, 776, 776, 3333, - 3333, 3333, 776, 1316, 1316, 1316, 1316, 3333, 3333, 1316, - 1316, 787, 787, 787, 3333, 3333, 3333, 787, 1322, 1322, - 1322, 1322, 3333, 3333, 1322, 1322, 796, 796, 796, 3333, - 3333, 3333, 796, 1334, 1334, 1334, 1334, 3333, 3333, 1334, - 1334, 1343, 1343, 1343, 1343, 3333, 3333, 1343, 1343, 810, - 810, 810, 3333, 3333, 3333, 810, 1359, 1359, 1359, 1359, - - 3333, 3333, 1359, 1359, 821, 821, 821, 3333, 3333, 3333, - 821, 1368, 1368, 1368, 1368, 3333, 3333, 1368, 1368, 827, - 827, 827, 3333, 3333, 3333, 827, 1376, 1376, 1376, 1376, - 3333, 3333, 1376, 1376, 832, 832, 832, 832, 3333, 832, - 3333, 832, 1386, 1386, 1386, 1386, 3333, 3333, 1386, 1386, - 839, 839, 839, 3333, 3333, 3333, 839, 1396, 1396, 1396, - 1396, 3333, 3333, 1396, 1396, 847, 847, 847, 3333, 3333, - 3333, 847, 1407, 1407, 1407, 1407, 3333, 3333, 1407, 1407, - 855, 855, 855, 3333, 3333, 3333, 855, 1414, 1414, 1414, - 1414, 3333, 3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, - - 1093, 1093, 1093, 1093, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 1620, 638, 638, 638, 638, 3333, 638, 3333, - 638, 672, 672, 672, 3333, 3333, 3333, 672, 1157, 1157, - 1157, 1157, 3333, 3333, 1157, 1157, 1163, 1163, 1163, 1163, - 3333, 3333, 1163, 1163, 684, 684, 684, 3333, 3333, 3333, - 684, 1172, 1172, 1172, 1172, 3333, 3333, 1172, 1172, 1182, - 1182, 1182, 1182, 3333, 3333, 1182, 1182, 1190, 1190, 1190, - 1190, 3333, 3333, 1190, 1190, 701, 701, 701, 701, 3333, - 701, 3333, 701, 1206, 1206, 1206, 1206, 3333, 3333, 1206, - 1206, 711, 711, 711, 3333, 3333, 3333, 711, 1231, 1231, - - 1231, 1231, 3333, 3333, 1231, 1231, 1238, 1238, 1238, 1238, - 3333, 3333, 1238, 1238, 732, 732, 732, 3333, 3333, 3333, - 732, 1263, 1263, 1263, 1263, 3333, 3333, 1263, 1263, 1268, - 1268, 1268, 1268, 3333, 3333, 1268, 1268, 753, 753, 753, - 3333, 3333, 3333, 753, 761, 761, 761, 3333, 3333, 3333, - 761, 1287, 1287, 1287, 1287, 3333, 3333, 1287, 1287, 1295, - 1295, 1295, 1295, 3333, 3333, 1295, 1295, 771, 771, 771, - 3333, 3333, 3333, 771, 1301, 1301, 1301, 1301, 3333, 3333, - 1301, 1301, 776, 776, 776, 3333, 3333, 3333, 776, 787, - 787, 787, 787, 3333, 787, 3333, 787, 1322, 1322, 1322, - - 1322, 3333, 3333, 1322, 1322, 796, 796, 796, 3333, 3333, - 3333, 796, 1334, 1334, 1334, 1334, 3333, 3333, 1334, 1334, - 810, 810, 810, 3333, 3333, 3333, 810, 1359, 1359, 1359, - 1359, 3333, 3333, 1359, 1359, 821, 821, 821, 3333, 3333, - 3333, 821, 1368, 1368, 1368, 1368, 3333, 3333, 1368, 1368, - 827, 827, 827, 3333, 3333, 3333, 827, 1376, 1376, 1376, - 1376, 3333, 3333, 1376, 1376, 832, 832, 832, 832, 3333, - 832, 3333, 832, 1386, 1386, 1386, 1386, 3333, 3333, 1386, - 1386, 839, 839, 839, 839, 3333, 839, 3333, 839, 1396, - 1396, 1396, 1396, 3333, 3333, 1396, 1396, 847, 847, 847, - - 3333, 3333, 3333, 847, 1407, 1407, 1407, 1407, 3333, 3333, - 1407, 1407, 855, 855, 855, 855, 3333, 855, 3333, 855, - 1414, 1414, 1414, 1414, 3333, 3333, 1414, 1414, 1093, 1093, - 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1620, 1620, 1620, - 1620, 1620, 1620, 1620, 1620, 1620, 672, 672, 672, 3333, - 3333, 3333, 672, 1157, 1157, 1157, 1157, 3333, 3333, 1157, - 1157, 1163, 1163, 1163, 1163, 3333, 3333, 1163, 1163, 684, - 684, 684, 3333, 3333, 3333, 684, 1172, 1172, 1172, 1172, - 3333, 3333, 1172, 1172, 1182, 1182, 1182, 1182, 3333, 3333, - 1182, 1182, 1190, 1190, 1190, 1190, 3333, 3333, 1190, 1190, - - 1206, 1206, 1206, 1206, 3333, 3333, 1206, 1206, 711, 711, - 711, 3333, 3333, 3333, 711, 1231, 1231, 1231, 1231, 3333, - 3333, 1231, 1231, 1238, 1238, 1238, 1238, 3333, 3333, 1238, - 1238, 732, 732, 732, 3333, 3333, 3333, 732, 1263, 1263, - 1263, 1263, 3333, 3333, 1263, 1263, 1268, 1268, 1268, 1268, - 3333, 3333, 1268, 1268, 753, 753, 753, 3333, 3333, 3333, - 753, 761, 761, 761, 3333, 3333, 3333, 761, 1287, 1287, - 1287, 1287, 3333, 3333, 1287, 1287, 1295, 1295, 1295, 1295, - 3333, 3333, 1295, 1295, 771, 771, 771, 3333, 3333, 3333, - 771, 776, 776, 776, 3333, 3333, 3333, 776, 1322, 1322, - - 1322, 1322, 3333, 3333, 1322, 1322, 796, 796, 796, 796, - 3333, 796, 3333, 796, 1334, 1334, 1334, 1334, 3333, 3333, - 1334, 1334, 810, 810, 810, 3333, 3333, 3333, 810, 1359, - 1359, 1359, 1359, 3333, 3333, 1359, 1359, 821, 821, 821, - 3333, 3333, 3333, 821, 827, 827, 827, 3333, 3333, 3333, - 827, 1376, 1376, 1376, 1376, 3333, 3333, 1376, 1376, 832, - 832, 832, 3333, 3333, 3333, 832, 1386, 1386, 1386, 1386, - 3333, 3333, 1386, 1386, 839, 839, 839, 3333, 3333, 3333, - 839, 1396, 1396, 1396, 1396, 3333, 3333, 1396, 1396, 847, - 847, 847, 3333, 3333, 3333, 847, 1414, 1414, 1414, 1414, - - 3333, 3333, 1414, 1414, 1093, 1093, 1093, 1093, 1093, 1093, - 1093, 1093, 1093, 1620, 1620, 1620, 1620, 1620, 1620, 1620, - 1620, 1620, 672, 672, 672, 3333, 3333, 3333, 672, 1157, - 1157, 1157, 1157, 3333, 3333, 1157, 1157, 1163, 1163, 1163, - 1163, 3333, 3333, 1163, 1163, 684, 684, 684, 684, 3333, - 684, 3333, 684, 1172, 1172, 1172, 1172, 3333, 3333, 1172, - 1172, 1182, 1182, 1182, 1182, 3333, 3333, 1182, 1182, 1190, - 1190, 1190, 1190, 3333, 3333, 1190, 1190, 1206, 1206, 1206, - 1206, 3333, 3333, 1206, 1206, 711, 711, 711, 3333, 3333, - 3333, 711, 1231, 1231, 1231, 1231, 3333, 3333, 1231, 1231, - - 732, 732, 732, 3333, 3333, 3333, 732, 1263, 1263, 1263, - 1263, 3333, 3333, 1263, 1263, 1268, 1268, 1268, 1268, 3333, - 3333, 1268, 1268, 753, 753, 753, 753, 3333, 753, 3333, - 753, 761, 761, 761, 761, 3333, 761, 3333, 761, 1287, - 1287, 1287, 1287, 3333, 3333, 1287, 1287, 1295, 1295, 1295, - 1295, 3333, 3333, 1295, 1295, 771, 771, 771, 771, 3333, - 771, 3333, 771, 776, 776, 776, 3333, 3333, 3333, 776, - 1322, 1322, 1322, 1322, 3333, 3333, 1322, 1322, 796, 796, - 796, 796, 3333, 796, 3333, 796, 1334, 1334, 1334, 1334, - 3333, 3333, 1334, 1334, 810, 810, 810, 810, 3333, 810, - - 3333, 810, 821, 821, 821, 3333, 3333, 3333, 821, 827, - 827, 827, 3333, 3333, 3333, 827, 832, 832, 832, 3333, - 3333, 3333, 832, 1386, 1386, 1386, 1386, 3333, 3333, 1386, - 1386, 839, 839, 839, 3333, 3333, 3333, 839, 1396, 1396, - 1396, 1396, 3333, 3333, 1396, 1396, 847, 847, 847, 3333, - 3333, 3333, 847, 1414, 1414, 1414, 1414, 3333, 3333, 1414, - 1414, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, - 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 1620, 672, - 672, 672, 3333, 3333, 3333, 672, 1163, 1163, 1163, 1163, - 3333, 3333, 1163, 1163, 1172, 1172, 1172, 1172, 3333, 3333, - - 1172, 1172, 1182, 1182, 1182, 1182, 3333, 3333, 1182, 1182, - 1190, 1190, 1190, 1190, 3333, 3333, 1190, 1190, 711, 711, - 711, 3333, 3333, 3333, 711, 732, 732, 732, 3333, 3333, - 3333, 732, 1263, 1263, 1263, 1263, 3333, 3333, 1263, 1263, - 753, 753, 753, 3333, 3333, 3333, 753, 2879, 2879, 2879, - 2879, 2879, 2879, 2879, 2879, 2879, 2880, 2880, 2880, 2880, - 2880, 2880, 2880, 2880, 2880, 2942, 2942, 2942, 2942, 2942, - 2942, 2942, 2942, 2942, 2945, 2945, 2945, 2945, 2945, 2945, - 2945, 2945, 2945, 2993, 2993, 2993, 2993, 2993, 2993, 2993, - 2993, 2993, 2995, 2995, 2995, 2995, 2995, 2995, 2995, 2995, - - 2995, 239, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333 + 3905, 294, 295, 294, 294, 295, 294, 294, 295, 294, + 294, 295, 294, 299, 295, 299, 305, 296, 302, 305, + 296, 302, 999, 297, 3905, 303, 297, 796, 303, 300, + 299, 295, 299, 730, 306, 308, 309, 306, 308, 309, + 310, 311, 748, 310, 311, 730, 300, 315, 316, 731, + 312, 308, 309, 312, 313, 733, 310, 308, 309, 1240, + 313, 732, 310, 315, 316, 797, 312, 327, 295, 327, + 1793, 732, 312, 327, 295, 327, 845, 327, 295, 327, + 327, 295, 327, 328, 295, 295, 295, 785, 1795, 328, + 846, 733, 317, 329, 786, 776, 329, 729, 729, 729, + + 330, 729, 729, 729, 729, 729, 729, 732, 317, 318, + 319, 295, 319, 318, 318, 318, 318, 318, 318, 318, + 320, 318, 318, 318, 733, 318, 322, 318, 323, 318, + 295, 295, 295, 327, 295, 327, 327, 295, 327, 841, + 732, 327, 295, 327, 788, 832, 330, 842, 776, 328, + 833, 1005, 328, 843, 1006, 318, 318, 331, 327, 295, + 327, 729, 729, 729, 787, 787, 324, 729, 729, 729, + 729, 729, 729, 1796, 331, 325, 318, 319, 295, 319, + 318, 318, 318, 318, 318, 318, 318, 320, 318, 318, + 318, 837, 318, 322, 318, 323, 318, 295, 295, 295, + + 295, 295, 295, 327, 295, 327, 308, 309, 327, 295, + 327, 310, 838, 332, 788, 733, 332, 776, 776, 329, + 883, 688, 318, 318, 329, 295, 295, 295, 295, 295, + 295, 732, 884, 324, 327, 295, 327, 327, 295, 327, + 1126, 333, 325, 1127, 333, 327, 295, 327, 796, 1798, + 331, 689, 733, 331, 327, 295, 327, 729, 729, 729, + 813, 334, 729, 729, 729, 729, 729, 729, 732, 929, + 334, 335, 336, 295, 336, 335, 335, 335, 335, 335, + 335, 335, 337, 335, 335, 335, 733, 335, 339, 335, + 340, 335, 345, 295, 345, 345, 295, 345, 295, 295, + + 295, 776, 732, 295, 295, 295, 862, 797, 346, 733, + 863, 346, 1799, 776, 347, 1802, 801, 335, 335, 347, + 345, 295, 345, 341, 864, 732, 342, 729, 729, 729, + 729, 729, 729, 729, 729, 729, 346, 1803, 343, 335, + 336, 295, 336, 335, 335, 335, 335, 335, 335, 335, + 337, 335, 335, 335, 733, 335, 339, 335, 340, 335, + 345, 295, 345, 345, 295, 345, 345, 295, 345, 1021, + 732, 361, 295, 361, 865, 1804, 346, 733, 1806, 348, + 1022, 1019, 348, 1023, 807, 335, 335, 362, 361, 295, + 361, 341, 818, 732, 342, 729, 729, 729, 729, 729, + + 729, 729, 729, 729, 362, 1020, 343, 349, 350, 295, + 350, 349, 349, 349, 349, 349, 349, 349, 351, 349, + 349, 349, 733, 349, 353, 349, 354, 349, 295, 295, + 295, 295, 295, 295, 361, 295, 361, 824, 732, 361, + 295, 361, 1497, 733, 363, 776, 733, 363, 1498, 733, + 362, 1808, 851, 349, 349, 362, 361, 295, 361, 732, + 970, 355, 732, 356, 813, 732, 357, 729, 729, 729, + 358, 1817, 364, 1820, 359, 349, 350, 295, 350, 349, + 349, 349, 349, 349, 349, 349, 351, 349, 349, 349, + 776, 349, 353, 349, 354, 349, 361, 295, 361, 373, + + 295, 373, 373, 295, 373, 776, 847, 385, 295, 385, + 971, 733, 364, 788, 848, 374, 1031, 776, 374, 849, + 855, 349, 349, 386, 385, 295, 385, 732, 1652, 355, + 1032, 356, 818, 1828, 357, 729, 729, 729, 358, 1830, + 386, 1653, 359, 365, 366, 295, 366, 365, 365, 365, + 365, 365, 365, 365, 367, 365, 365, 365, 733, 365, + 369, 365, 370, 365, 397, 295, 397, 397, 295, 397, + 295, 295, 295, 776, 732, 295, 295, 295, 908, 1832, + 398, 788, 909, 398, 1833, 776, 347, 1834, 733, 365, + 365, 347, 397, 295, 397, 397, 295, 397, 729, 729, + + 729, 729, 729, 729, 732, 864, 824, 1836, 398, 1837, + 1841, 398, 1845, 371, 365, 366, 295, 366, 365, 365, + 365, 365, 365, 365, 365, 367, 365, 365, 365, 733, + 365, 369, 365, 370, 365, 397, 295, 397, 397, 295, + 397, 409, 295, 409, 1847, 732, 409, 295, 409, 949, + 1850, 399, 1852, 1857, 399, 788, 950, 410, 776, 776, + 365, 365, 410, 295, 295, 295, 295, 295, 295, 729, + 729, 729, 729, 729, 729, 729, 729, 729, 1858, 347, + 738, 1862, 347, 1869, 371, 375, 376, 295, 376, 375, + 375, 375, 375, 375, 375, 375, 377, 375, 375, 375, + + 733, 375, 379, 375, 380, 375, 409, 295, 409, 409, + 295, 409, 409, 295, 409, 752, 732, 409, 295, 409, + 733, 1870, 410, 739, 875, 410, 916, 834, 411, 740, + 770, 375, 375, 411, 741, 381, 732, 885, 915, 742, + 1261, 921, 382, 1871, 1628, 383, 375, 376, 295, 376, + 375, 375, 375, 375, 375, 375, 375, 377, 375, 375, + 375, 1038, 375, 379, 375, 380, 375, 422, 295, 422, + 422, 295, 422, 295, 295, 295, 916, 776, 295, 295, + 295, 1038, 1872, 423, 915, 1039, 423, 1873, 733, 347, + 776, 921, 375, 375, 347, 871, 381, 729, 729, 729, + + 729, 729, 729, 382, 732, 1020, 383, 387, 388, 295, + 388, 387, 387, 387, 387, 387, 387, 387, 389, 387, + 387, 387, 733, 387, 391, 387, 392, 387, 422, 295, + 422, 422, 295, 422, 422, 295, 422, 776, 732, 422, + 295, 422, 995, 1874, 423, 733, 1031, 423, 1875, 996, + 424, 1876, 890, 387, 387, 424, 438, 295, 438, 393, + 1046, 732, 394, 729, 729, 729, 729, 729, 729, 729, + 729, 729, 439, 1877, 395, 387, 388, 295, 388, 387, + 387, 387, 387, 387, 387, 387, 389, 387, 387, 387, + 733, 387, 391, 387, 392, 387, 438, 295, 438, 455, + + 295, 455, 455, 295, 455, 1040, 732, 295, 295, 295, + 1878, 1879, 439, 733, 1882, 456, 1041, 1019, 456, 1023, + 895, 387, 387, 330, 295, 295, 295, 393, 929, 732, + 394, 729, 729, 729, 729, 729, 729, 729, 729, 729, + 330, 1039, 395, 400, 401, 295, 401, 400, 400, 400, + 400, 400, 400, 400, 402, 400, 400, 400, 733, 400, + 404, 400, 405, 400, 455, 295, 455, 455, 295, 455, + 455, 295, 455, 943, 732, 455, 295, 455, 1885, 1886, + 456, 776, 1888, 456, 1889, 1891, 457, 1892, 944, 400, + 400, 457, 466, 295, 466, 406, 729, 729, 729, 729, + + 729, 729, 729, 729, 729, 729, 729, 729, 467, 1893, + 407, 400, 401, 295, 401, 400, 400, 400, 400, 400, + 400, 400, 402, 400, 400, 400, 733, 400, 404, 400, + 405, 400, 466, 295, 466, 295, 295, 295, 295, 295, + 295, 1031, 732, 466, 295, 466, 1894, 1898, 467, 1899, + 1900, 330, 1901, 1902, 330, 1051, 951, 400, 400, 467, + 466, 295, 466, 406, 729, 729, 729, 729, 729, 729, + 729, 729, 729, 729, 729, 729, 467, 1905, 407, 412, + 413, 295, 413, 412, 412, 412, 412, 412, 412, 412, + 414, 412, 412, 412, 733, 412, 416, 412, 417, 412, + + 466, 295, 466, 466, 295, 466, 481, 295, 481, 776, + 732, 481, 295, 481, 1908, 1909, 468, 733, 1031, 468, + 1910, 1913, 482, 1914, 900, 412, 412, 482, 295, 295, + 295, 418, 1053, 732, 419, 729, 729, 729, 729, 729, + 729, 729, 729, 729, 483, 1915, 420, 412, 413, 295, + 413, 412, 412, 412, 412, 412, 412, 412, 414, 412, + 412, 412, 733, 412, 416, 412, 417, 412, 295, 295, + 295, 481, 295, 481, 481, 295, 481, 1749, 732, 481, + 295, 481, 1916, 1917, 483, 733, 1920, 482, 1924, 1750, + 482, 733, 910, 412, 412, 484, 481, 295, 481, 418, + + 963, 732, 419, 729, 729, 729, 970, 732, 729, 729, + 729, 3905, 484, 1925, 420, 425, 426, 295, 426, 425, + 425, 425, 425, 425, 425, 425, 427, 425, 425, 425, + 733, 425, 429, 425, 430, 425, 495, 295, 495, 495, + 295, 495, 505, 295, 505, 990, 732, 505, 295, 505, + 779, 911, 496, 776, 920, 496, 999, 733, 506, 776, + 997, 425, 425, 506, 762, 431, 780, 776, 772, 919, + 1926, 1000, 432, 732, 1928, 433, 729, 729, 729, 434, + 1932, 435, 436, 425, 426, 295, 426, 425, 425, 425, + 425, 425, 425, 425, 427, 425, 425, 425, 776, 425, + + 429, 425, 430, 425, 295, 295, 295, 295, 295, 295, + 505, 295, 505, 776, 939, 505, 295, 505, 940, 1933, + 507, 1935, 941, 507, 1936, 733, 506, 1017, 1261, 425, + 425, 506, 934, 431, 729, 729, 729, 729, 729, 729, + 432, 732, 1018, 433, 729, 729, 729, 434, 1864, 435, + 436, 440, 441, 295, 441, 440, 440, 440, 440, 440, + 440, 440, 442, 440, 440, 440, 733, 440, 444, 440, + 445, 440, 505, 295, 505, 505, 295, 505, 520, 295, + 520, 1017, 732, 520, 295, 520, 1939, 1940, 508, 1942, + 1943, 508, 1184, 733, 521, 1946, 1068, 440, 440, 521, + + 945, 446, 447, 729, 729, 729, 951, 1018, 448, 732, + 1968, 449, 729, 729, 729, 450, 1969, 451, 452, 453, + 440, 441, 295, 441, 440, 440, 440, 440, 440, 440, + 440, 442, 440, 440, 440, 733, 440, 444, 440, 445, + 440, 295, 295, 295, 295, 295, 295, 520, 295, 520, + 1021, 732, 520, 295, 520, 788, 1973, 330, 1292, 776, + 330, 1022, 733, 521, 1185, 1187, 440, 440, 521, 956, + 446, 447, 729, 729, 729, 1293, 1976, 448, 732, 1046, + 449, 729, 729, 729, 450, 1978, 451, 452, 453, 458, + 459, 295, 459, 458, 458, 458, 458, 458, 458, 458, + + 460, 458, 458, 458, 733, 458, 462, 458, 463, 458, + 520, 295, 520, 520, 295, 520, 532, 295, 532, 1987, + 732, 532, 295, 532, 1988, 1989, 522, 1990, 733, 522, + 1992, 2000, 533, 997, 2002, 458, 458, 533, 729, 729, + 729, 729, 729, 729, 732, 915, 464, 458, 459, 295, + 459, 458, 458, 458, 458, 458, 458, 458, 460, 458, + 458, 458, 733, 458, 462, 458, 463, 458, 543, 295, + 543, 543, 295, 543, 554, 295, 554, 1040, 732, 554, + 295, 554, 788, 916, 544, 917, 776, 544, 1041, 2005, + 555, 1185, 2006, 458, 458, 555, 2009, 2011, 918, 2012, + + 919, 729, 729, 729, 464, 469, 470, 295, 470, 469, + 469, 469, 469, 469, 469, 469, 471, 469, 469, 469, + 733, 469, 473, 469, 474, 469, 569, 295, 569, 569, + 295, 569, 295, 295, 295, 2014, 732, 295, 295, 295, + 2015, 2016, 570, 2017, 733, 570, 2018, 2022, 571, 2023, + 2024, 469, 469, 571, 475, 733, 476, 729, 729, 729, + 732, 2029, 477, 729, 729, 729, 729, 729, 729, 478, + 2033, 732, 479, 469, 470, 295, 470, 469, 469, 469, + 469, 469, 469, 469, 471, 469, 469, 469, 2037, 469, + 473, 469, 474, 469, 580, 295, 580, 580, 295, 580, + + 580, 295, 580, 2039, 1028, 580, 295, 580, 2041, 2043, + 581, 1029, 1261, 581, 2044, 2045, 582, 1030, 2047, 469, + 469, 582, 475, 2054, 476, 729, 729, 729, 1263, 2058, + 477, 729, 729, 729, 729, 729, 729, 478, 2059, 1292, + 479, 485, 486, 295, 486, 485, 485, 485, 485, 485, + 485, 485, 487, 485, 485, 485, 1445, 485, 489, 485, + 490, 485, 295, 295, 295, 295, 295, 295, 580, 295, + 580, 2061, 1652, 580, 295, 580, 2068, 1591, 583, 977, + 2070, 583, 2071, 1797, 581, 1659, 978, 485, 485, 581, + 580, 295, 580, 491, 1293, 732, 1659, 2072, 492, 729, + + 729, 729, 729, 729, 729, 1867, 584, 729, 729, 729, + 493, 485, 486, 295, 486, 485, 485, 485, 485, 485, + 485, 485, 487, 485, 485, 485, 2077, 485, 489, 485, + 490, 485, 580, 295, 580, 295, 295, 295, 295, 295, + 295, 1261, 2078, 580, 295, 580, 2079, 2081, 584, 733, + 2082, 507, 2083, 2084, 507, 2085, 985, 485, 485, 582, + 580, 295, 580, 491, 2086, 732, 2074, 2087, 492, 729, + 729, 729, 729, 729, 729, 2088, 582, 1280, 1280, 1280, + 493, 497, 498, 295, 498, 497, 497, 497, 497, 497, + 497, 497, 499, 497, 497, 497, 2089, 497, 501, 497, + + 502, 497, 295, 295, 295, 295, 295, 295, 580, 295, + 580, 2090, 1028, 580, 295, 580, 1400, 2092, 585, 1029, + 2093, 585, 2094, 2097, 584, 1036, 1401, 497, 497, 584, + 1003, 1003, 1003, 1402, 1265, 503, 497, 498, 295, 498, + 497, 497, 497, 497, 497, 497, 497, 499, 497, 497, + 497, 2100, 497, 501, 497, 502, 497, 580, 295, 580, + 580, 295, 580, 599, 295, 599, 2101, 1045, 599, 295, + 599, 2102, 2103, 586, 1029, 2104, 586, 2105, 2106, 600, + 1030, 2107, 497, 497, 600, 1003, 1003, 1003, 2110, 2113, + 503, 509, 510, 295, 510, 509, 509, 509, 509, 509, + + 509, 509, 511, 509, 509, 509, 2120, 509, 513, 509, + 514, 509, 295, 295, 295, 295, 295, 295, 599, 295, + 599, 2121, 1045, 599, 295, 599, 2122, 2123, 363, 1029, + 2124, 363, 2126, 1028, 600, 1036, 1045, 509, 509, 600, + 1029, 515, 2131, 1029, 2132, 1004, 1186, 2176, 516, 1186, + 2177, 517, 2183, 1280, 1280, 1280, 2189, 2190, 518, 509, + 510, 295, 510, 509, 509, 509, 509, 509, 509, 509, + 511, 509, 509, 509, 2191, 509, 513, 509, 514, 509, + 599, 295, 599, 599, 295, 599, 611, 295, 611, 2192, + 2195, 611, 295, 611, 2201, 2203, 601, 2209, 2213, 601, + + 2216, 2217, 612, 2220, 2221, 509, 509, 612, 2222, 515, + 1272, 1272, 1272, 2223, 1273, 2224, 516, 1274, 1281, 517, + 1303, 1303, 1303, 1887, 1887, 1887, 518, 523, 524, 295, + 524, 523, 523, 523, 523, 523, 523, 523, 525, 523, + 523, 523, 2225, 523, 527, 523, 528, 523, 625, 295, + 625, 625, 295, 625, 636, 295, 636, 2226, 2233, 636, + 295, 636, 2234, 2235, 626, 2237, 2239, 626, 2247, 2252, + 637, 2253, 2254, 523, 523, 637, 1303, 1303, 1303, 529, + 1880, 1880, 1880, 2256, 530, 523, 524, 295, 524, 523, + 523, 523, 523, 523, 523, 523, 525, 523, 523, 523, + + 2269, 523, 527, 523, 528, 523, 295, 295, 295, 295, + 295, 295, 636, 295, 636, 1867, 2283, 636, 295, 636, + 2284, 2285, 347, 2289, 2290, 347, 2292, 1881, 637, 2293, + 2294, 523, 523, 637, 1303, 1303, 1303, 529, 1883, 1883, + 1883, 1304, 530, 534, 535, 295, 535, 534, 534, 534, + 534, 534, 534, 534, 536, 534, 534, 534, 2279, 534, + 538, 534, 539, 534, 636, 295, 636, 636, 295, 636, + 648, 295, 648, 1867, 2295, 648, 295, 648, 2296, 2297, + 638, 1261, 2300, 638, 2301, 1884, 649, 2302, 2303, 534, + 534, 649, 661, 295, 661, 661, 295, 661, 2278, 1281, + + 540, 2304, 1348, 1348, 1348, 2308, 1349, 2280, 662, 1350, + 2309, 662, 2310, 541, 534, 535, 295, 535, 534, 534, + 534, 534, 534, 534, 534, 536, 534, 534, 534, 2286, + 534, 538, 534, 539, 534, 295, 295, 295, 295, 295, + 295, 661, 295, 661, 2311, 2287, 661, 295, 661, 2313, + 2314, 330, 2315, 2288, 330, 2322, 2324, 662, 2325, 2326, + 534, 534, 662, 661, 295, 661, 661, 295, 661, 2327, + 2328, 540, 2331, 1384, 1384, 1384, 2333, 1385, 2364, 663, + 1386, 2365, 663, 2366, 541, 545, 546, 295, 546, 545, + 545, 545, 545, 545, 545, 545, 547, 545, 545, 545, + + 2305, 545, 549, 545, 550, 545, 675, 295, 675, 675, + 295, 675, 295, 295, 295, 2372, 2306, 295, 295, 295, + 2373, 2377, 676, 2378, 2307, 676, 2381, 2382, 677, 2386, + 2389, 545, 545, 677, 675, 295, 675, 1387, 1387, 1387, + 2393, 1388, 2394, 2395, 1389, 2398, 2401, 551, 2405, 2406, + 676, 2407, 552, 545, 546, 295, 546, 545, 545, 545, + 545, 545, 545, 545, 547, 545, 545, 545, 2412, 545, + 549, 545, 550, 545, 675, 295, 675, 675, 295, 675, + 675, 295, 675, 2414, 2415, 700, 295, 700, 2416, 2417, + 676, 2419, 2422, 678, 2424, 2427, 678, 308, 309, 545, + + 545, 701, 310, 700, 295, 700, 1403, 1403, 1403, 2443, + 1404, 2444, 688, 1405, 2445, 551, 1890, 1890, 1890, 701, + 552, 556, 557, 295, 557, 556, 556, 556, 556, 556, + 556, 556, 558, 556, 556, 556, 2450, 556, 560, 556, + 561, 556, 689, 711, 295, 711, 711, 295, 711, 711, + 295, 711, 2451, 711, 295, 711, 1011, 1011, 1011, 712, + 2454, 2455, 712, 2456, 2459, 713, 2452, 556, 556, 713, + 562, 563, 564, 1012, 2453, 1407, 1407, 1407, 565, 1408, + 2469, 566, 1409, 2478, 1867, 1280, 1280, 1280, 567, 556, + 557, 295, 557, 556, 556, 556, 556, 556, 556, 556, + + 558, 556, 556, 556, 2479, 556, 560, 556, 561, 556, + 295, 295, 295, 295, 295, 295, 711, 295, 711, 2457, + 2480, 711, 295, 711, 1261, 2481, 330, 2458, 2482, 330, + 2471, 2473, 712, 2485, 2487, 556, 556, 712, 562, 563, + 564, 1425, 1425, 1425, 2488, 1426, 565, 2489, 1427, 566, + 1304, 1895, 1895, 1895, 2493, 2494, 567, 572, 573, 295, + 573, 572, 572, 572, 572, 572, 572, 572, 574, 572, + 572, 572, 2496, 572, 576, 572, 577, 572, 711, 295, + 711, 711, 295, 711, 295, 295, 295, 1896, 1867, 295, + 295, 295, 2497, 2498, 714, 2499, 2502, 714, 2506, 2507, + + 332, 2508, 2510, 572, 572, 332, 711, 295, 711, 711, + 295, 711, 1435, 1435, 1435, 2516, 1436, 2518, 2530, 1437, + 2472, 2531, 713, 2532, 2536, 713, 2537, 578, 572, 573, + 295, 573, 572, 572, 572, 572, 572, 572, 572, 574, + 572, 572, 572, 2538, 572, 576, 572, 577, 572, 295, + 295, 295, 295, 295, 295, 711, 295, 711, 2544, 2545, + 711, 295, 711, 2546, 2549, 333, 2553, 2554, 333, 2555, + 2556, 714, 2559, 2560, 572, 572, 714, 711, 295, 711, + 711, 295, 711, 1447, 1447, 1447, 2561, 1448, 2562, 2563, + 1449, 2575, 2579, 715, 2582, 2583, 715, 2589, 578, 587, + + 588, 295, 588, 587, 587, 587, 587, 587, 587, 587, + 589, 587, 587, 587, 2594, 587, 591, 587, 592, 587, + 726, 295, 726, 726, 295, 726, 295, 295, 295, 2596, + 2597, 295, 295, 295, 2598, 2602, 727, 2603, 2604, 727, + 2605, 2606, 347, 2607, 2608, 587, 587, 347, 726, 295, + 726, 2609, 2610, 593, 2611, 594, 2616, 1867, 595, 1897, + 1897, 1897, 596, 2633, 727, 1867, 597, 587, 588, 295, + 588, 587, 587, 587, 587, 587, 587, 587, 589, 587, + 587, 587, 2634, 587, 591, 587, 592, 587, 726, 295, + 726, 726, 295, 726, 726, 295, 726, 2635, 1073, 1073, + + 1073, 1092, 1092, 1092, 727, 2620, 2636, 728, 2638, 2619, + 728, 2640, 2641, 587, 587, 1074, 2642, 748, 1093, 2644, + 2645, 593, 875, 594, 2646, 2647, 595, 774, 2648, 2649, + 596, 2650, 876, 2651, 597, 602, 603, 295, 603, 602, + 602, 602, 602, 602, 602, 602, 604, 602, 602, 602, + 2672, 602, 606, 602, 607, 602, 775, 2673, 2678, 1094, + 1094, 1094, 752, 2674, 2679, 1276, 1276, 1276, 754, 2685, + 776, 2686, 777, 2675, 760, 762, 1095, 2687, 2703, 760, + 778, 602, 602, 1278, 2704, 877, 2705, 2720, 990, 1450, + 1450, 1450, 608, 1451, 2721, 2722, 1452, 2725, 774, 2727, + + 1903, 1903, 1903, 2728, 2729, 609, 602, 603, 295, 603, + 602, 602, 602, 602, 602, 602, 602, 604, 602, 602, + 602, 2730, 602, 606, 602, 607, 602, 775, 2731, 1104, + 1104, 1104, 1107, 1107, 1107, 2732, 2733, 1121, 1121, 1121, + 2734, 776, 2735, 777, 2736, 760, 1105, 1904, 2737, 1108, + 2738, 778, 602, 602, 1122, 1128, 1128, 1128, 1137, 1137, + 1137, 2750, 2755, 608, 1464, 1464, 1464, 2756, 1465, 2759, + 2760, 1466, 1129, 2761, 1867, 1138, 609, 613, 614, 295, + 614, 613, 613, 613, 613, 613, 613, 613, 615, 613, + 613, 613, 2762, 613, 617, 613, 618, 613, 1139, 1139, + + 1139, 1149, 1149, 1149, 1157, 1157, 1157, 2753, 1161, 1161, + 1161, 1173, 1173, 1173, 2765, 1140, 2766, 2757, 1150, 2767, + 2768, 1158, 1867, 613, 613, 1162, 2758, 2769, 1174, 1475, + 1475, 1475, 619, 1476, 620, 2771, 1477, 2772, 621, 2773, + 1906, 1906, 1906, 622, 623, 613, 614, 295, 614, 613, + 613, 613, 613, 613, 613, 613, 615, 613, 613, 613, + 2754, 613, 617, 613, 618, 613, 1195, 1195, 1195, 1201, + 1201, 1201, 1217, 1217, 1217, 2763, 1223, 1223, 1223, 1229, + 1229, 1229, 2775, 1196, 2764, 2776, 1202, 1884, 2777, 1218, + 2779, 613, 613, 1224, 2780, 2782, 1230, 1482, 1482, 1482, + + 619, 1483, 620, 2800, 1484, 2801, 621, 1907, 1907, 1907, + 2802, 622, 623, 627, 628, 295, 628, 627, 627, 627, + 627, 627, 627, 627, 629, 627, 627, 627, 2803, 627, + 631, 627, 632, 627, 1237, 1237, 1237, 1249, 1249, 1249, + 1011, 1011, 1011, 2807, 1320, 1320, 1320, 1324, 1324, 1324, + 2808, 1238, 2815, 2816, 1250, 2823, 2809, 1012, 2810, 627, + 627, 1321, 2824, 2825, 1325, 633, 1500, 1500, 1500, 2837, + 1501, 2811, 2838, 1502, 2853, 1911, 1911, 1911, 2854, 2855, + 634, 627, 628, 295, 628, 627, 627, 627, 627, 627, + 627, 627, 629, 627, 627, 627, 2856, 627, 631, 627, + + 632, 627, 1276, 1276, 1276, 1327, 1327, 1327, 1327, 1327, + 1327, 1912, 2857, 3905, 3905, 3905, 2859, 3905, 3905, 3905, + 1278, 2860, 2861, 1329, 2862, 2257, 1329, 627, 627, 2863, + 3905, 2258, 2864, 633, 3905, 2259, 1530, 1530, 1530, 1279, + 1531, 2260, 2865, 1532, 2866, 1330, 2867, 2868, 634, 639, + 640, 295, 640, 639, 639, 639, 639, 639, 639, 639, + 641, 639, 639, 639, 1322, 639, 643, 639, 644, 639, + 1337, 1337, 1337, 1343, 1343, 1343, 2869, 1326, 2870, 1323, + 1337, 1337, 1337, 1343, 1343, 1343, 2872, 2812, 1339, 2813, + 2873, 1345, 1911, 1911, 1911, 639, 639, 2876, 1339, 2877, + + 645, 1345, 2814, 1906, 1906, 1906, 646, 639, 640, 295, + 640, 639, 639, 639, 639, 639, 639, 639, 641, 639, + 639, 639, 2874, 639, 643, 639, 644, 639, 1896, 2878, + 1340, 2875, 1073, 1073, 1073, 2879, 2882, 1352, 1352, 1352, + 2883, 1352, 1352, 1352, 1356, 1356, 1356, 2880, 1346, 1074, + 1919, 2884, 1261, 639, 639, 1354, 2881, 2889, 645, 1354, + 2890, 1357, 2891, 1867, 646, 650, 651, 295, 651, 650, + 650, 650, 650, 650, 650, 650, 652, 650, 650, 650, + 2892, 650, 654, 650, 655, 650, 1360, 1360, 1360, 1355, + 1362, 1362, 1362, 2886, 2893, 1362, 1362, 1362, 3905, 3905, + + 3905, 2887, 2894, 1361, 1366, 1366, 1366, 2895, 1364, 2896, + 2897, 650, 650, 1364, 656, 3905, 657, 2080, 2080, 2080, + 2898, 1367, 658, 1539, 1539, 1539, 2899, 1540, 2900, 2901, + 1541, 2902, 2903, 659, 650, 651, 295, 651, 650, 650, + 650, 650, 650, 650, 650, 652, 650, 650, 650, 1358, + 650, 654, 650, 655, 650, 1368, 1368, 1368, 1370, 1370, + 1370, 1370, 1370, 1370, 1359, 2905, 2906, 1365, 2907, 1374, + 1374, 1374, 1369, 3905, 3905, 3905, 1372, 2908, 2909, 1372, + 650, 650, 2910, 656, 2911, 657, 1375, 1880, 1880, 1880, + 3905, 658, 1564, 1564, 1564, 2923, 1565, 2924, 2927, 1566, + + 2928, 2929, 659, 664, 665, 295, 665, 664, 664, 664, + 664, 664, 664, 664, 666, 664, 664, 664, 2930, 664, + 668, 664, 669, 664, 1376, 1378, 1378, 1378, 1380, 1380, + 1380, 2261, 2933, 1373, 1380, 1380, 1380, 2262, 2934, 1377, + 2931, 2263, 1379, 1396, 1396, 1396, 1382, 2264, 2937, 664, + 664, 2932, 1382, 2938, 670, 1573, 1573, 1573, 2935, 1574, + 671, 1398, 1575, 1867, 672, 1883, 1883, 1883, 2946, 2936, + 673, 664, 665, 295, 665, 664, 664, 664, 664, 664, + 664, 664, 666, 664, 664, 664, 2947, 664, 668, 664, + 669, 664, 1092, 1092, 1092, 1094, 1094, 1094, 1390, 1390, + + 1390, 1582, 1582, 1582, 2948, 1583, 1383, 2888, 1584, 1093, + 2959, 2977, 1095, 2982, 2983, 1391, 2971, 664, 664, 3905, + 3905, 3905, 670, 1593, 1593, 1593, 2972, 1594, 671, 2973, + 1595, 2988, 672, 2091, 2091, 2091, 3905, 2989, 673, 679, + 680, 295, 680, 679, 679, 679, 679, 679, 679, 679, + 681, 679, 679, 679, 2990, 679, 683, 679, 684, 679, + 1887, 1887, 1887, 3905, 3905, 3905, 2991, 1104, 1104, 1104, + 2992, 2993, 1392, 3905, 3905, 3905, 2994, 3905, 3905, 3905, + 3905, 1396, 1396, 1396, 1105, 679, 679, 1890, 1890, 1890, + 3905, 2995, 2996, 685, 3905, 2997, 686, 2999, 3000, 1398, + + 2095, 2095, 2095, 687, 679, 680, 295, 680, 679, 679, + 679, 679, 679, 679, 679, 681, 679, 679, 679, 1393, + 679, 683, 679, 684, 679, 1394, 1107, 1107, 1107, 1399, + 1395, 1410, 1410, 1410, 1421, 1421, 1421, 1421, 1421, 1421, + 1121, 1121, 1121, 1108, 1428, 1428, 1428, 3001, 1411, 3002, + 679, 679, 1423, 2974, 3003, 1423, 3004, 1122, 685, 3005, + 3006, 686, 1430, 2975, 3007, 2096, 2976, 3008, 687, 690, + 691, 295, 691, 690, 690, 690, 690, 690, 690, 690, + 692, 690, 690, 690, 3009, 690, 694, 690, 695, 690, + 3010, 1428, 1428, 1428, 3018, 3019, 1424, 1128, 1128, 1128, + + 1441, 1441, 1441, 1441, 1441, 1441, 1137, 1137, 1137, 1430, + 1139, 1139, 1139, 3020, 1129, 690, 690, 3021, 1443, 3022, + 3023, 1443, 696, 1138, 1895, 1895, 1895, 1140, 697, 1609, + 1609, 1609, 3024, 1610, 3025, 1867, 1611, 698, 690, 691, + 295, 691, 690, 690, 690, 690, 690, 690, 690, 692, + 690, 690, 690, 1431, 690, 694, 690, 695, 690, 1453, + 1453, 1453, 1458, 1458, 1458, 1444, 1261, 3026, 1453, 1453, + 1453, 1458, 1458, 1458, 1470, 1470, 1470, 1455, 3016, 1867, + 1460, 1149, 1149, 1149, 690, 690, 1455, 3027, 3028, 1460, + 3029, 696, 1472, 1895, 1895, 1895, 3015, 697, 1150, 3030, + + 2098, 2098, 2098, 1897, 1897, 1897, 698, 702, 703, 295, + 703, 702, 702, 702, 702, 702, 702, 702, 704, 702, + 702, 702, 3017, 702, 706, 702, 707, 702, 3032, 1912, + 1456, 3033, 1461, 1470, 1470, 1470, 3034, 3035, 1157, 1157, + 1157, 1478, 1478, 1478, 1478, 1478, 1478, 2099, 1161, 1161, + 1161, 1472, 3037, 702, 702, 1158, 1272, 1272, 1272, 1480, + 1273, 3038, 1480, 1274, 708, 1162, 1903, 1903, 1903, 1906, + 1906, 1906, 3039, 709, 702, 703, 295, 703, 702, 702, + 702, 702, 702, 702, 702, 704, 702, 702, 702, 1473, + 702, 706, 702, 707, 702, 1486, 1486, 1486, 3050, 3058, + + 1481, 1486, 1486, 1486, 1492, 1492, 1492, 1492, 1492, 1492, + 1173, 1173, 1173, 1488, 3059, 1503, 1503, 1503, 3060, 1488, + 702, 702, 1494, 3061, 3062, 1494, 3043, 1174, 1907, 1907, + 1907, 708, 1504, 1911, 1911, 1911, 2186, 2186, 2186, 3044, + 709, 716, 717, 295, 717, 716, 716, 716, 716, 716, + 716, 716, 718, 716, 716, 716, 3063, 716, 720, 716, + 721, 716, 3045, 1489, 1507, 1507, 1507, 3064, 3065, 1495, + 3066, 3067, 1507, 1507, 1507, 3046, 1513, 1513, 1513, 1513, + 1513, 1513, 1509, 1526, 1526, 1526, 3068, 716, 716, 3072, + 1509, 3075, 3076, 722, 1515, 3077, 723, 1515, 1676, 1676, + + 1676, 1528, 1677, 3078, 3079, 1678, 3080, 3081, 724, 716, + 717, 295, 717, 716, 716, 716, 716, 716, 716, 716, + 718, 716, 716, 716, 1510, 716, 720, 716, 721, 716, + 1526, 1526, 1526, 1195, 1195, 1195, 3084, 3092, 1516, 1534, + 1534, 1534, 1534, 1534, 1534, 1201, 1201, 1201, 1528, 3093, + 1196, 1542, 1542, 1542, 3096, 716, 716, 1536, 3097, 3100, + 1536, 722, 1202, 3115, 723, 1545, 1545, 1545, 1543, 1550, + 1550, 1550, 1550, 1550, 1550, 2952, 724, 733, 3116, 1554, + 1554, 1554, 1546, 3117, 748, 2953, 3118, 1552, 3119, 3120, + 1552, 2954, 3121, 732, 749, 1529, 1555, 1556, 1556, 1556, + + 3905, 3905, 3905, 1559, 1559, 1559, 3088, 1537, 1559, 1559, + 1559, 1217, 1217, 1217, 1557, 2955, 3122, 3905, 3124, 3089, + 1553, 1561, 750, 751, 752, 2956, 1561, 3125, 1218, 753, + 754, 2957, 3126, 755, 756, 3127, 3090, 757, 3128, 758, + 759, 760, 3129, 1567, 1567, 1567, 3130, 761, 733, 3091, + 3094, 1567, 1567, 1567, 1223, 1223, 1223, 1577, 1577, 1577, + 1558, 1569, 3131, 3095, 732, 763, 1577, 1577, 1577, 1569, + 1562, 1224, 1229, 1229, 1229, 1579, 3132, 3133, 1587, 1587, + 1587, 1587, 1587, 1587, 1579, 1237, 1237, 1237, 3134, 1230, + 1249, 1249, 1249, 750, 764, 765, 1589, 3135, 1261, 1589, + + 766, 767, 1238, 1867, 768, 756, 3143, 1250, 769, 3144, + 770, 771, 772, 1570, 1598, 1598, 1598, 3098, 773, 733, + 1598, 1598, 1598, 1605, 1605, 1605, 990, 1605, 1605, 1605, + 3099, 3145, 1600, 1580, 3146, 732, 749, 3147, 1600, 3140, + 3148, 1607, 1613, 1613, 1613, 1607, 3149, 3139, 1590, 1613, + 1613, 1613, 1617, 1617, 1617, 3150, 3905, 3905, 3905, 3151, + 1615, 1621, 1621, 1621, 750, 751, 752, 1615, 3152, 1618, + 3153, 753, 754, 3905, 3154, 755, 756, 3155, 1622, 757, + 3156, 758, 759, 760, 3158, 1601, 3905, 3905, 3905, 761, + 3159, 3160, 1608, 3162, 1624, 1624, 1624, 1624, 1624, 1624, + + 1276, 1276, 1276, 3905, 2108, 2108, 2108, 1619, 1276, 1276, + 1276, 1616, 1626, 3167, 3168, 1626, 3169, 3170, 1278, 1635, + 1635, 1635, 1620, 1320, 1320, 1320, 1278, 1324, 1324, 1324, + 3175, 1681, 1681, 1681, 3182, 1682, 3183, 1636, 1683, 3184, + 1321, 1688, 1688, 1688, 1325, 3185, 1623, 1327, 1327, 1327, + 1327, 1327, 1327, 1327, 1327, 1327, 3163, 3165, 1689, 1627, + 1337, 1337, 1337, 3186, 3187, 1329, 3164, 3166, 1329, 2109, + 3188, 1329, 1337, 1337, 1337, 1337, 1337, 1337, 1339, 1343, + 1343, 1343, 1343, 1343, 1343, 1343, 1343, 1343, 3189, 3190, + 1339, 3191, 3192, 1339, 1348, 1348, 1348, 1345, 1349, 3193, + + 1345, 1350, 3197, 1345, 1352, 1352, 1352, 1352, 1352, 1352, + 1352, 1352, 1352, 1356, 1356, 1356, 3198, 3199, 1685, 1700, + 1700, 1700, 1354, 1701, 3200, 1354, 1702, 3201, 1354, 3202, + 1357, 1360, 1360, 1360, 1705, 1705, 1705, 3203, 1706, 1696, + 3204, 1707, 1693, 1362, 1362, 1362, 3205, 3206, 1361, 1362, + 1362, 1362, 1362, 1362, 1362, 1366, 1366, 1366, 3207, 3208, + 1699, 1364, 1709, 1709, 1709, 3209, 1710, 1364, 3210, 1711, + 1364, 3211, 1367, 1368, 1368, 1368, 1712, 1712, 1712, 3212, + 1713, 3213, 3214, 1714, 1370, 1370, 1370, 1370, 1370, 1370, + 1369, 1370, 1370, 1370, 1374, 1374, 1374, 1716, 1716, 1716, + + 3215, 1717, 1372, 3216, 1718, 1372, 1378, 1378, 1378, 1372, + 3230, 1375, 1721, 1721, 1721, 1708, 1722, 3231, 3232, 1723, + 1380, 1380, 1380, 1379, 1380, 1380, 1380, 1380, 1380, 1380, + 1384, 1384, 1384, 3233, 1385, 3234, 3235, 1386, 1382, 1387, + 1387, 1387, 1382, 1388, 3236, 1382, 1389, 1390, 1390, 1390, + 3237, 1725, 1725, 1725, 1715, 1726, 3239, 3240, 1727, 1396, + 1396, 1396, 3241, 3242, 1391, 1396, 1396, 1396, 1396, 1396, + 1396, 1403, 1403, 1403, 3219, 1404, 3243, 1398, 1405, 1736, + 1736, 1736, 3221, 1398, 3220, 3244, 1398, 1407, 1407, 1407, + 1724, 1408, 3222, 3245, 1409, 3246, 1737, 1410, 1410, 1410, + + 1738, 1738, 1738, 3247, 1739, 3248, 3249, 1740, 1421, 1421, + 1421, 1421, 1421, 1421, 1411, 3250, 3261, 1732, 1421, 1421, + 1421, 1425, 1425, 1425, 3262, 1426, 1423, 3263, 1427, 1423, + 1428, 1428, 1428, 1428, 1428, 1428, 1423, 1428, 1428, 1428, + 1755, 1755, 1755, 1435, 1435, 1435, 3251, 1436, 1430, 3264, + 1437, 1430, 1441, 1441, 1441, 1430, 3252, 1756, 1441, 1441, + 1441, 1441, 1441, 1441, 1762, 1762, 1762, 1447, 1447, 1447, + 1443, 1448, 3253, 1261, 1449, 3265, 1443, 3266, 3267, 1443, + 3268, 1763, 3254, 1450, 1450, 1450, 1751, 1451, 3270, 3273, + 1452, 1453, 1453, 1453, 1453, 1453, 1453, 3275, 1752, 1453, + + 1453, 1453, 1765, 1765, 1765, 1458, 1458, 1458, 3255, 1455, + 3276, 3277, 1455, 1458, 1458, 1458, 3278, 1455, 3279, 1766, + 1458, 1458, 1458, 1460, 1470, 1470, 1470, 1760, 1464, 1464, + 1464, 1460, 1465, 3280, 3281, 1466, 3282, 3285, 1460, 1470, + 1470, 1470, 1472, 1470, 1470, 1470, 1475, 1475, 1475, 3288, + 1476, 3289, 3290, 1477, 1478, 1478, 1478, 1472, 1478, 1478, + 1478, 1472, 1478, 1478, 1478, 1764, 3291, 1482, 1482, 1482, + 1767, 1483, 1480, 3292, 1484, 3293, 1480, 1486, 1486, 1486, + 1480, 1486, 1486, 1486, 1486, 1486, 1486, 3294, 1778, 1778, + 1778, 3905, 3905, 3905, 3295, 1488, 1492, 1492, 1492, 1488, + + 3296, 3297, 1488, 3302, 1773, 1779, 3303, 3304, 3905, 1492, + 1492, 1492, 3305, 3306, 1494, 1492, 1492, 1492, 1500, 1500, + 1500, 3307, 1501, 1775, 3308, 1502, 3309, 1494, 1503, 1503, + 1503, 3310, 3311, 1494, 3312, 1777, 1786, 1786, 1786, 1780, + 1787, 3313, 3314, 1788, 3315, 1504, 1507, 1507, 1507, 1507, + 1507, 1507, 1507, 1507, 1507, 1513, 1513, 1513, 1513, 1513, + 1513, 1513, 1513, 1513, 1509, 3316, 3317, 1509, 3318, 3322, + 1509, 3323, 3324, 1515, 3325, 3328, 1515, 3329, 3330, 1515, + 1800, 1800, 1800, 1781, 1526, 1526, 1526, 1526, 1526, 1526, + 1526, 1526, 1526, 3331, 1530, 1530, 1530, 1801, 1531, 3332, + + 3333, 1532, 1528, 3335, 1791, 1528, 3336, 3337, 1528, 1794, + 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1534, 1539, + 1539, 1539, 3338, 1540, 2621, 2622, 1541, 2623, 1536, 3339, + 3340, 1536, 3341, 3342, 1536, 2624, 1542, 1542, 1542, 1809, + 1809, 1809, 2625, 1810, 3343, 3344, 1811, 1812, 1812, 1812, + 3345, 3346, 1805, 1543, 1545, 1545, 1545, 3353, 1814, 1814, + 1814, 1261, 1815, 3354, 1813, 1816, 1818, 1818, 1818, 3355, + 3356, 1546, 1550, 1550, 1550, 1550, 1550, 1550, 1807, 1550, + 1550, 1550, 3357, 1819, 1554, 1554, 1554, 1822, 1822, 1822, + 1552, 1823, 3358, 1552, 1824, 3359, 3360, 1552, 1556, 1556, + + 1556, 1555, 1825, 1825, 1825, 3347, 1826, 3361, 3362, 1827, + 1559, 1559, 1559, 3363, 3364, 1557, 1559, 1559, 1559, 1559, + 1559, 1559, 1564, 1564, 1564, 3365, 1565, 3366, 1561, 1566, + 1567, 1567, 1567, 3367, 1561, 3368, 3372, 1561, 3378, 3379, + 1821, 1567, 1567, 1567, 1567, 1567, 1567, 3380, 1569, 1573, + 1573, 1573, 3381, 1574, 3382, 3383, 1575, 3384, 3391, 1569, + 3392, 3393, 1569, 1577, 1577, 1577, 1577, 1577, 1577, 3394, + 1577, 1577, 1577, 1582, 1582, 1582, 3395, 1583, 3396, 3397, + 1584, 1579, 3398, 3399, 1579, 3400, 3401, 1829, 1579, 1838, + 1838, 1838, 1587, 1587, 1587, 1587, 1587, 1587, 1587, 1587, + + 1587, 1842, 1842, 1842, 3402, 3403, 1839, 1593, 1593, 1593, + 1589, 1594, 1831, 1589, 1595, 3404, 1589, 3405, 1843, 3905, + 3905, 3905, 1598, 1598, 1598, 1598, 1598, 1598, 1598, 1598, + 1598, 3406, 1835, 1848, 1848, 1848, 3905, 1605, 1605, 1605, + 1600, 3407, 3408, 1600, 3409, 3410, 1600, 1605, 1605, 1605, + 1849, 1605, 1605, 1605, 3411, 1607, 3412, 1609, 1609, 1609, + 1840, 1610, 3413, 3414, 1611, 1607, 1613, 1613, 1613, 1607, + 1613, 1613, 1613, 1613, 1613, 1613, 1846, 1617, 1617, 1617, + 3415, 1844, 3416, 3417, 1615, 1854, 1854, 1854, 1615, 1855, + 3420, 1615, 1856, 3421, 1618, 1621, 1621, 1621, 3422, 1851, + + 1859, 1859, 1859, 3423, 1860, 3424, 3425, 1861, 1624, 1624, + 1624, 3426, 1622, 1624, 1624, 1624, 3427, 1624, 1624, 1624, + 1866, 1866, 1866, 1635, 1635, 1635, 1626, 1327, 1327, 1327, + 3428, 1626, 3429, 3441, 1853, 1626, 3442, 3432, 1867, 1868, + 3447, 1636, 1676, 1676, 1676, 1329, 1677, 1261, 3435, 1678, + 1681, 1681, 1681, 3432, 1682, 3448, 3451, 1683, 1688, 1688, + 1688, 1921, 1921, 1921, 3452, 1922, 3453, 3433, 1923, 1337, + 1337, 1337, 1343, 1343, 1343, 1689, 3454, 3456, 1863, 1929, + 1929, 1929, 3464, 1352, 1352, 1352, 3465, 1339, 3457, 1918, + 1345, 1700, 1700, 1700, 3430, 1701, 1930, 3466, 1702, 3467, + + 3458, 1354, 1705, 1705, 1705, 3468, 1706, 3459, 3473, 1707, + 1362, 1362, 1362, 1709, 1709, 1709, 3474, 1710, 3469, 3460, + 1711, 3475, 1712, 1712, 1712, 3476, 1713, 3477, 1364, 1714, + 3470, 1927, 1370, 1370, 1370, 1716, 1716, 1716, 3478, 1717, + 1931, 1934, 1718, 3479, 1721, 1721, 1721, 3480, 1722, 3471, + 1372, 1723, 1380, 1380, 1380, 1725, 1725, 1725, 1937, 1726, + 3481, 3472, 1727, 3482, 1944, 1944, 1944, 1396, 1396, 1396, + 1382, 1948, 1948, 1948, 3905, 3905, 3905, 3905, 3905, 3905, + 1938, 1945, 1736, 1736, 1736, 1398, 3483, 3484, 1949, 3485, + 3490, 3905, 3491, 3496, 3905, 3905, 3905, 3905, 3497, 1737, + + 1941, 1952, 1952, 1952, 3498, 1953, 3499, 3502, 1954, 1738, + 1738, 1738, 3905, 1739, 3437, 3502, 1740, 3905, 3905, 3905, + 3905, 3905, 3905, 1947, 3505, 1951, 3905, 3905, 3905, 3905, + 3905, 3905, 3506, 3438, 3905, 3439, 3507, 3905, 3905, 3905, + 3905, 1950, 1261, 3905, 1867, 1868, 3905, 1955, 3440, 1961, + 1961, 1961, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 1421, 1421, 1421, 1956, 1962, 3510, 3508, 3905, + 1755, 1755, 1755, 3905, 1958, 3432, 3905, 1428, 1428, 1428, + 1423, 1970, 1970, 1970, 3500, 1971, 3509, 1756, 1972, 3433, + 3511, 1957, 3512, 3515, 1959, 1430, 1974, 1974, 1974, 1960, + + 1441, 1441, 1441, 1762, 1762, 1762, 3516, 1979, 1979, 1979, + 3521, 1980, 3523, 1975, 1981, 1453, 1453, 1453, 1443, 1964, + 1763, 1965, 3526, 1963, 1765, 1765, 1765, 3432, 1966, 3522, + 1967, 3527, 3528, 1455, 3513, 1983, 1983, 1983, 3435, 1984, + 3529, 1766, 1985, 1458, 1458, 1458, 1470, 1470, 1470, 3514, + 1478, 1478, 1478, 1994, 1994, 1994, 3530, 1486, 1486, 1486, + 3524, 1460, 3533, 3535, 1472, 3536, 3538, 1977, 1480, 3541, + 1995, 1778, 1778, 1778, 3542, 1488, 1997, 1997, 1997, 3525, + 1998, 3534, 1982, 1999, 3537, 1492, 1492, 1492, 1779, 2003, + 2003, 2003, 1786, 1786, 1786, 3543, 1787, 3544, 3545, 1788, + + 3546, 3547, 1986, 1494, 1991, 3548, 2004, 3549, 1993, 1996, + 2007, 2007, 2007, 1507, 1507, 1507, 1513, 1513, 1513, 1800, + 1800, 1800, 2019, 2019, 2019, 3552, 2020, 2008, 3553, 2021, + 3554, 1509, 3550, 3502, 1515, 3558, 1801, 1526, 1526, 1526, + 2026, 2026, 2026, 1534, 1534, 1534, 2001, 1809, 1809, 1809, + 3551, 1810, 3555, 3502, 1811, 1528, 3559, 2027, 1812, 1812, + 1812, 1536, 2030, 2030, 2030, 3560, 2031, 3556, 3561, 2032, + 1814, 1814, 1814, 3562, 1815, 1813, 3563, 1816, 2010, 1818, + 1818, 1818, 3564, 2013, 2034, 2034, 2034, 2025, 2035, 3565, + 3566, 2036, 1550, 1550, 1550, 3567, 1819, 1822, 1822, 1822, + + 3568, 1823, 3572, 3573, 1824, 3574, 2028, 1825, 1825, 1825, + 1552, 1826, 3575, 3576, 1827, 1559, 1559, 1559, 1567, 1567, + 1567, 1577, 1577, 1577, 2048, 2048, 2048, 1838, 1838, 1838, + 2050, 2050, 2050, 1561, 2051, 3577, 1569, 2052, 3578, 1579, + 3579, 2049, 3580, 2038, 1839, 1587, 1587, 1587, 1842, 1842, + 1842, 2055, 2055, 2055, 3581, 2056, 3585, 3586, 2057, 1598, + 1598, 1598, 3587, 1589, 3588, 1843, 1848, 1848, 1848, 2062, + 2062, 2062, 3589, 2063, 3590, 3594, 2064, 1600, 2065, 2065, + 2065, 3595, 2040, 1849, 3596, 2042, 2046, 1605, 1605, 1605, + 1613, 1613, 1613, 3597, 3598, 2066, 1854, 1854, 1854, 3599, + + 1855, 3600, 3601, 1856, 3602, 1607, 3603, 3604, 1615, 2060, + 2053, 1859, 1859, 1859, 3605, 1860, 3606, 3607, 1861, 3609, + 1624, 1624, 1624, 1866, 1866, 1866, 2111, 2111, 2111, 2095, + 2095, 2095, 2108, 2108, 2108, 3610, 3611, 2067, 1626, 3612, + 3613, 1867, 2069, 2114, 2114, 2114, 2116, 2116, 2116, 3905, + 3905, 3905, 1327, 1327, 1327, 1921, 1921, 1921, 3614, 1922, + 2115, 3615, 1923, 2117, 3616, 3617, 3905, 1337, 1337, 1337, + 1329, 3618, 2073, 2112, 3619, 2075, 1929, 1929, 1929, 2127, + 2127, 2127, 3624, 2128, 3620, 1339, 2129, 1343, 1343, 1343, + 3625, 3626, 2076, 1930, 2109, 3627, 3621, 2096, 3628, 1352, + + 1352, 1352, 2134, 2134, 2134, 1345, 2136, 2136, 2136, 1362, + 1362, 1362, 3629, 3630, 2118, 3631, 3632, 1354, 3633, 2135, + 2119, 3634, 3635, 2137, 1370, 1370, 1370, 1364, 2140, 2140, + 2140, 3622, 2125, 2142, 2142, 2142, 1380, 1380, 1380, 2145, + 2145, 2145, 1372, 3623, 3636, 2141, 3637, 2130, 2133, 3638, + 2143, 3905, 3905, 3905, 1382, 3639, 2146, 1944, 1944, 1944, + 2148, 2148, 2148, 3640, 2149, 3641, 3642, 2150, 3905, 2151, + 2151, 2151, 3643, 3644, 1945, 2138, 1396, 1396, 1396, 1948, + 1948, 1948, 2157, 2157, 2157, 3645, 2152, 3905, 3905, 3905, + 2139, 2154, 2154, 2154, 1398, 2155, 1949, 3646, 2156, 2158, + + 3647, 3648, 2144, 3649, 3905, 1952, 1952, 1952, 3651, 1953, + 2147, 3652, 1954, 3905, 3905, 3905, 3905, 3905, 3905, 2162, + 2162, 2162, 3905, 3905, 3905, 3905, 3905, 3905, 3653, 1261, + 3905, 3654, 3655, 3905, 3656, 3657, 2163, 2153, 3658, 3905, + 3659, 3660, 3905, 3905, 3905, 3905, 1961, 1961, 1961, 2167, + 2167, 2167, 2159, 2168, 3650, 3661, 2169, 2170, 2170, 2170, + 3905, 3662, 3663, 1962, 3664, 3665, 2161, 3905, 3905, 3905, + 3666, 3667, 2165, 3668, 2171, 3905, 3905, 3905, 2160, 3669, + 3670, 2164, 3671, 3672, 3905, 1421, 1421, 1421, 1428, 1428, + 1428, 3673, 3905, 3674, 1970, 1970, 1970, 2166, 1971, 3675, + + 3676, 1972, 3677, 1423, 3678, 3679, 1430, 2178, 2178, 2178, + 1974, 1974, 1974, 3680, 3681, 2172, 2180, 2180, 2180, 3682, + 2181, 3683, 3684, 2182, 2179, 3686, 3687, 1975, 3688, 2173, + 2184, 2184, 2184, 1979, 1979, 1979, 1261, 1980, 3689, 3690, + 1981, 1453, 1453, 1453, 2175, 1458, 1458, 1458, 2185, 1983, + 1983, 1983, 2174, 1984, 3691, 3685, 1985, 3692, 3693, 1455, + 2193, 2193, 2193, 1460, 1478, 1478, 1478, 1994, 1994, 1994, + 2197, 2197, 2197, 3694, 2198, 3443, 3695, 2199, 2194, 1486, + 1486, 1486, 1480, 3696, 1995, 1997, 1997, 1997, 2187, 1998, + 3697, 3444, 1999, 3445, 1492, 1492, 1492, 1488, 2003, 2003, + + 2003, 2204, 2204, 2204, 3698, 2205, 3446, 3699, 2206, 3700, + 3701, 2196, 1494, 2188, 3702, 2004, 2207, 2207, 2207, 2007, + 2007, 2007, 2210, 2210, 2210, 3703, 2211, 3704, 3705, 2212, + 2214, 2214, 2214, 2208, 3706, 3707, 2008, 3708, 2200, 1513, + 1513, 1513, 2219, 2219, 2219, 2019, 2019, 2019, 2215, 2020, + 3709, 3710, 2021, 1526, 1526, 1526, 3711, 1515, 2026, 2026, + 2026, 2202, 2228, 2228, 2228, 3712, 2229, 3713, 3714, 2230, + 3715, 1528, 2231, 2231, 2231, 2027, 2030, 2030, 2030, 3716, + 2031, 3717, 3719, 2032, 2034, 2034, 2034, 3720, 2035, 1261, + 2232, 2036, 2218, 1550, 1550, 1550, 1559, 1559, 1559, 1567, + + 1567, 1567, 2241, 2241, 2241, 2227, 3905, 3905, 3905, 3718, + 3721, 1552, 3722, 3723, 1561, 3486, 3724, 1569, 3725, 2242, + 2244, 2244, 2244, 3905, 1577, 1577, 1577, 2048, 2048, 2048, + 3726, 2248, 2248, 2248, 3487, 2249, 3488, 2245, 2250, 2050, + 2050, 2050, 1579, 2051, 2049, 3727, 2052, 3728, 2238, 3489, + 3729, 2240, 1587, 1587, 1587, 2236, 2055, 2055, 2055, 3730, + 2056, 3731, 3732, 2057, 1598, 1598, 1598, 2062, 2062, 2062, + 1589, 2063, 2246, 2243, 2064, 2065, 2065, 2065, 3733, 2265, + 2265, 2265, 1600, 2266, 3734, 3735, 2267, 1605, 1605, 1605, + 3736, 3737, 2066, 2270, 2270, 2270, 2272, 2272, 2272, 3738, + + 2251, 2274, 2274, 2274, 3739, 1607, 3905, 3905, 3905, 3740, + 3741, 2271, 3742, 2273, 3743, 3744, 2255, 3745, 2275, 1624, + 1624, 1624, 3746, 3905, 2281, 2281, 2281, 2080, 2080, 2080, + 2291, 2291, 2291, 2091, 2091, 2091, 3748, 1626, 3749, 2268, + 3750, 2282, 2298, 2298, 2298, 2095, 2095, 2095, 2299, 2299, + 2299, 2098, 2098, 2098, 3751, 2277, 2108, 2108, 2108, 2312, + 2312, 2312, 2111, 2111, 2111, 2114, 2114, 2114, 2316, 2316, + 2316, 2276, 2317, 3752, 3753, 2318, 2116, 2116, 2116, 2319, + 2319, 2319, 2115, 2320, 3754, 3755, 2321, 1327, 1327, 1327, + 2329, 2329, 2329, 2117, 2127, 2127, 2127, 3756, 2128, 3757, + + 1261, 2129, 2334, 2334, 2334, 1329, 3747, 3758, 2330, 1343, + 1343, 1343, 1352, 1352, 1352, 2134, 2134, 2134, 3759, 2335, + 3760, 2337, 2337, 2337, 3761, 2338, 3762, 1345, 2339, 3763, + 1354, 3764, 2135, 2136, 2136, 2136, 2340, 2340, 2340, 3765, + 2341, 3766, 3767, 2342, 1362, 1362, 1362, 1370, 1370, 1370, + 2137, 2140, 2140, 2140, 2323, 3769, 2345, 2345, 2345, 1261, + 2346, 2332, 1364, 2347, 3770, 1372, 3771, 3772, 2141, 2142, + 2142, 2142, 3773, 3768, 2336, 2348, 2348, 2348, 3774, 2349, + 3775, 3776, 2350, 1380, 1380, 1380, 2143, 2145, 2145, 2145, + 2352, 2352, 2352, 3777, 2353, 3778, 3779, 2354, 2355, 2355, + + 2355, 1382, 3780, 3782, 2146, 2148, 2148, 2148, 3783, 2149, + 2343, 3784, 2150, 2344, 3785, 2356, 2151, 2151, 2151, 2357, + 2357, 2357, 3786, 2358, 3787, 3788, 2359, 1396, 1396, 1396, + 2154, 2154, 2154, 2152, 2155, 3789, 3790, 2156, 2157, 2157, + 2157, 2162, 2162, 2162, 3791, 1398, 2361, 2361, 2361, 2351, + 2362, 3792, 3793, 2363, 3796, 2158, 3797, 3492, 2163, 2367, + 2367, 2367, 3798, 2368, 3799, 3800, 2369, 2370, 2370, 2370, + 2167, 2167, 2167, 3493, 2168, 3494, 3801, 2169, 1792, 2360, + 2170, 2170, 2170, 3812, 2371, 2374, 2374, 2374, 3495, 2375, + 1261, 1261, 2376, 1421, 1421, 1421, 3813, 2171, 1428, 1428, + + 1428, 2178, 2178, 2178, 1261, 2383, 2383, 2383, 1261, 2384, + 1261, 1423, 2385, 2180, 2180, 2180, 1430, 2181, 2179, 1261, + 2182, 2184, 2184, 2184, 2186, 2186, 2186, 3802, 1453, 1453, + 1453, 1458, 1458, 1458, 2390, 2390, 2390, 1261, 1790, 2185, + 2193, 2193, 2193, 1261, 1789, 2379, 1455, 3803, 1261, 1460, + 1261, 2391, 2380, 1478, 1478, 1478, 1261, 3804, 2194, 2197, + 2197, 2197, 3814, 2198, 3808, 1261, 2199, 1486, 1486, 1486, + 1261, 1480, 2399, 2399, 2399, 3810, 2204, 2204, 2204, 1261, + 2205, 2392, 2388, 2206, 1785, 1488, 3805, 2387, 3809, 3828, + 2400, 2207, 2207, 2207, 2402, 2402, 2402, 3806, 2403, 3807, + + 3811, 2404, 3815, 2396, 1261, 2210, 2210, 2210, 2208, 2211, + 1261, 1261, 2212, 3816, 2397, 2214, 2214, 2214, 2408, 2408, + 2408, 1513, 1513, 1513, 2219, 2219, 2219, 2411, 2411, 2411, + 2413, 2413, 2413, 2215, 1261, 2409, 1526, 1526, 1526, 1515, + 2228, 2228, 2228, 1261, 2229, 1261, 3834, 2230, 2231, 2231, + 2231, 2420, 2420, 2420, 1528, 1550, 1550, 1550, 2425, 2425, + 2425, 1567, 1567, 1567, 1261, 1261, 2232, 1261, 2421, 2241, + 2241, 2241, 3818, 1552, 1261, 3854, 2426, 1261, 1261, 1569, + 2429, 2429, 2429, 2410, 2430, 3820, 2242, 2431, 2432, 2432, + 2432, 2244, 2244, 2244, 2435, 2435, 2435, 1261, 2436, 1261, + + 3829, 2437, 2418, 3819, 1784, 2433, 3821, 1261, 2245, 1577, + 1577, 1577, 2439, 2439, 2439, 2423, 2248, 2248, 2248, 1261, + 2249, 1261, 3817, 2250, 3824, 3825, 2428, 1579, 1783, 2440, + 1587, 1587, 1587, 3822, 3835, 2434, 2446, 2446, 2446, 2448, + 2448, 2448, 2265, 2265, 2265, 3826, 2266, 1261, 1589, 2267, + 1605, 1605, 1605, 1261, 2447, 3823, 2449, 3832, 3830, 2441, + 2461, 2461, 2461, 2438, 2270, 2270, 2270, 1261, 1607, 2272, + 2272, 2272, 2463, 2463, 2463, 1261, 2464, 2462, 1261, 2465, + 1261, 3831, 2271, 1261, 2442, 3827, 2273, 2274, 2274, 2274, + 1261, 2466, 2466, 2466, 3844, 2467, 3848, 2460, 2468, 1624, + + 1624, 1624, 1782, 1261, 2275, 2281, 2281, 2281, 2474, 2474, + 2474, 3833, 2475, 3876, 3840, 2476, 1261, 1626, 2477, 2477, + 2477, 3846, 2282, 2483, 2483, 2483, 2484, 2484, 2484, 2291, + 2291, 2291, 2486, 2486, 2486, 2490, 2490, 2490, 2298, 2298, + 2298, 2299, 2299, 2299, 2491, 2491, 2491, 2495, 2495, 2495, + 2500, 2500, 2500, 2501, 2501, 2501, 2503, 2503, 2503, 1261, + 3836, 2470, 2312, 2312, 2312, 2504, 2504, 2504, 2316, 2316, + 2316, 1261, 2317, 1776, 1261, 2318, 2319, 2319, 2319, 3902, + 2320, 1261, 1261, 2321, 1327, 1327, 1327, 2511, 2511, 2511, + 1261, 2492, 3905, 3905, 3905, 1261, 3905, 3905, 3905, 3905, + + 3905, 3905, 1329, 3837, 2512, 2329, 2329, 2329, 1261, 3905, + 3841, 1261, 2505, 3905, 3849, 3842, 3905, 1343, 1343, 1343, + 2334, 2334, 2334, 2330, 2519, 2519, 2519, 1261, 2520, 3838, + 1261, 2521, 1352, 1352, 1352, 1345, 2509, 2335, 2337, 2337, + 2337, 1261, 2338, 3864, 2513, 2339, 3847, 2340, 2340, 2340, + 1354, 2341, 1261, 1261, 2342, 1362, 1362, 1362, 3839, 2515, + 1774, 2514, 1370, 1370, 1370, 2345, 2345, 2345, 3852, 2346, + 1772, 3855, 2347, 1364, 3850, 2523, 2626, 2627, 2517, 2628, + 1372, 2348, 2348, 2348, 1261, 2349, 3843, 2629, 2350, 1380, + 1380, 1380, 3845, 2522, 2630, 2352, 2352, 2352, 2524, 2353, + + 3851, 1261, 2354, 2355, 2355, 2355, 1261, 1382, 2526, 2526, + 2526, 1771, 2527, 1770, 3856, 2528, 1261, 2357, 2357, 2357, + 2356, 2358, 3853, 1261, 2359, 1396, 1396, 1396, 2361, 2361, + 2361, 3857, 2362, 2525, 3862, 2363, 1769, 2367, 2367, 2367, + 1261, 2368, 1261, 1398, 2369, 2370, 2370, 2370, 2533, 2533, + 2533, 3858, 2534, 3860, 1261, 2535, 2374, 2374, 2374, 1261, + 2375, 1261, 2371, 2376, 2539, 2539, 2539, 1421, 1421, 1421, + 2542, 2542, 2542, 2383, 2383, 2383, 1261, 2384, 3863, 1261, + 2385, 2540, 1453, 1453, 1453, 1423, 1261, 1261, 2543, 1458, + 1458, 1458, 2529, 2390, 2390, 2390, 3859, 2550, 2550, 2550, + + 1455, 2551, 3865, 1261, 2552, 1768, 3861, 1460, 1261, 1261, + 2391, 1478, 1478, 1478, 3866, 3870, 1486, 1486, 1486, 2399, + 2399, 2399, 1761, 2402, 2402, 2402, 1759, 2403, 3878, 1480, + 2404, 1261, 2541, 1758, 1488, 3880, 1261, 2400, 2547, 3871, + 1261, 2548, 2408, 2408, 2408, 2564, 2564, 2564, 1261, 2565, + 3868, 3869, 2566, 1513, 1513, 1513, 2411, 2411, 2411, 2409, + 2568, 2568, 2568, 2413, 2413, 2413, 2569, 2569, 2569, 3867, + 1261, 1515, 3905, 3905, 3905, 3905, 3905, 3905, 2557, 2558, + 1526, 1526, 1526, 2570, 3905, 3905, 3905, 3872, 3879, 3905, + 1261, 1261, 3905, 2420, 2420, 2420, 1261, 3898, 1528, 3894, + + 1261, 3905, 2576, 2576, 2576, 1261, 2577, 1261, 1261, 2578, + 2421, 2580, 2580, 2580, 2425, 2425, 2425, 3873, 2567, 2584, + 2584, 2584, 1261, 3877, 2571, 1757, 2429, 2429, 2429, 2581, + 2430, 1261, 2426, 2431, 2432, 2432, 2432, 2585, 3874, 3881, + 2572, 2586, 2586, 2586, 2573, 2587, 2574, 3884, 2588, 3885, + 1754, 2433, 2435, 2435, 2435, 1261, 2436, 1261, 3886, 2437, + 1577, 1577, 1577, 2439, 2439, 2439, 2591, 2591, 2591, 3875, + 2592, 1753, 1261, 2593, 1587, 1587, 1587, 1261, 1579, 1261, + 2440, 2446, 2446, 2446, 2448, 2448, 2448, 2599, 2599, 2599, + 3892, 2600, 1589, 3882, 2601, 1605, 1605, 1605, 1748, 2447, + + 1261, 2449, 2461, 2461, 2461, 1747, 1746, 2613, 2613, 2613, + 3883, 2614, 2590, 1607, 2615, 3887, 2463, 2463, 2463, 2462, + 2464, 1261, 1261, 2465, 3888, 1745, 2595, 2466, 2466, 2466, + 1744, 2467, 3895, 1743, 2468, 1624, 1624, 1624, 2618, 2618, + 2618, 1261, 2474, 2474, 2474, 2612, 2475, 3889, 1742, 2476, + 2477, 2477, 2477, 1626, 3893, 3896, 1261, 2631, 2631, 2631, + 2632, 2632, 2632, 2483, 2483, 2483, 2484, 2484, 2484, 2486, + 2486, 2486, 2637, 2637, 2637, 2639, 2639, 2639, 2490, 2490, + 2490, 2491, 2491, 2491, 2495, 2495, 2495, 2643, 2643, 2643, + 2500, 2500, 2500, 2501, 2501, 2501, 2503, 2503, 2503, 2504, + + 2504, 2504, 1741, 2617, 2652, 2652, 2652, 2654, 2654, 2654, + 2511, 2511, 2511, 2655, 2655, 2655, 1261, 2656, 1735, 1261, + 2657, 1734, 2653, 2658, 2658, 2658, 1261, 2512, 3905, 3905, + 3905, 3905, 3905, 3905, 2662, 2662, 2662, 1343, 1343, 1343, + 2659, 2664, 2664, 2664, 1733, 3905, 1731, 1730, 3905, 2519, + 2519, 2519, 1261, 2520, 3890, 1345, 2521, 3891, 2665, 1352, + 1352, 1352, 1729, 1362, 1362, 1362, 1370, 1370, 1370, 1380, + 1380, 1380, 2526, 2526, 2526, 3899, 2527, 1354, 1728, 2528, + 2660, 1364, 1261, 2661, 1372, 3897, 1720, 1382, 2670, 2670, + 2670, 2533, 2533, 2533, 1719, 2534, 1261, 1704, 2535, 1703, + + 2667, 2676, 2676, 2676, 2663, 1698, 2671, 2539, 2539, 2539, + 1697, 2666, 2680, 2680, 2680, 3900, 2681, 1695, 2677, 2682, + 2683, 2683, 2683, 1694, 2540, 2542, 2542, 2542, 2668, 3901, + 1692, 2669, 1453, 1453, 1453, 2689, 2689, 2689, 2684, 2691, + 2691, 2691, 1691, 2543, 2550, 2550, 2550, 1690, 2551, 1687, + 1455, 2552, 1686, 2690, 1684, 1680, 2692, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 2697, 2697, 2697, 1478, + 1478, 1478, 1679, 1675, 3905, 1674, 1673, 3905, 3902, 1672, + 3905, 1671, 1670, 2698, 1669, 1668, 2693, 1480, 1486, 1486, + 1486, 1667, 1261, 2688, 2701, 2701, 2701, 2706, 2706, 2706, + + 2564, 2564, 2564, 1666, 2565, 1665, 1488, 2566, 1513, 1513, + 1513, 2702, 1664, 2694, 1663, 2696, 2568, 2568, 2568, 2569, + 2569, 2569, 2695, 2711, 2711, 2711, 1515, 2708, 2708, 2708, + 2699, 2709, 1662, 1661, 2710, 1660, 2570, 3905, 3905, 3905, + 2712, 3905, 3905, 3905, 2715, 2715, 2715, 2717, 2717, 2717, + 3905, 3905, 3905, 2700, 3905, 2580, 2580, 2580, 3905, 2576, + 2576, 2576, 2716, 2577, 2718, 1658, 2578, 3905, 2707, 2584, + 2584, 2584, 1657, 2581, 2586, 2586, 2586, 1656, 2587, 1655, + 1654, 2588, 2723, 2723, 2723, 1651, 1650, 2585, 1649, 2713, + 2591, 2591, 2591, 2714, 2592, 1648, 1647, 2593, 1646, 1645, + + 2724, 1587, 1587, 1587, 2599, 2599, 2599, 1644, 2600, 1643, + 1642, 2601, 1605, 1605, 1605, 2740, 2741, 2719, 2742, 1589, + 2613, 2613, 2613, 1641, 2614, 1640, 2743, 2615, 2745, 2746, + 1607, 2747, 1639, 2744, 1624, 1624, 1624, 1638, 1637, 2748, + 2618, 2618, 2618, 2631, 2631, 2631, 2749, 1634, 2726, 2632, + 2632, 2632, 1626, 2770, 2770, 2770, 1633, 1632, 1261, 2637, + 2637, 2637, 2639, 2639, 2639, 2774, 2774, 2774, 2643, 2643, + 2643, 2778, 2778, 2778, 2739, 2781, 2781, 2781, 2652, 2652, + 2652, 2654, 2654, 2654, 2655, 2655, 2655, 1631, 2656, 1630, + 1629, 2657, 2658, 2658, 2658, 1261, 2653, 1612, 2783, 2783, + + 2783, 2751, 2784, 2752, 1604, 2785, 2786, 2786, 2786, 2659, + 2788, 2788, 2788, 2662, 2662, 2662, 2790, 2790, 2790, 2664, + 2664, 2664, 1603, 2787, 2792, 2792, 2792, 2789, 2793, 1602, + 1597, 2794, 1596, 1592, 2791, 1586, 2665, 2795, 2795, 2795, + 1362, 1362, 1362, 1370, 1370, 1370, 1380, 1380, 1380, 2670, + 2670, 2670, 2676, 2676, 2676, 2796, 1585, 1581, 1364, 1576, + 1572, 1372, 1571, 1563, 1382, 1549, 1548, 2671, 1547, 2677, + 2804, 2804, 2804, 1544, 2805, 1538, 1533, 2806, 2680, 2680, + 2680, 1525, 2681, 1524, 1523, 2682, 2683, 2683, 2683, 2817, + 2817, 2817, 1453, 1453, 1453, 2689, 2689, 2689, 2691, 2691, + + 2691, 2831, 2831, 2831, 2684, 2797, 2818, 2799, 1522, 1521, + 1455, 2798, 1520, 2690, 1519, 2692, 2820, 2820, 2820, 2832, + 2821, 1518, 1517, 2822, 2826, 2826, 2826, 2697, 2697, 2697, + 2828, 2828, 2828, 1512, 2829, 1511, 1506, 2830, 1486, 1486, + 1486, 2827, 1505, 1499, 2698, 2701, 2701, 2701, 1496, 1491, + 2819, 2834, 2834, 2834, 1490, 2835, 1488, 1485, 2836, 2839, + 2839, 2839, 2702, 2706, 2706, 2706, 2841, 2841, 2841, 1474, + 2708, 2708, 2708, 1469, 2709, 1468, 2840, 2710, 2711, 2711, + 2711, 2843, 2843, 2843, 2842, 2844, 1467, 1463, 2845, 2846, + 2846, 2846, 2848, 2848, 2848, 2712, 2715, 2715, 2715, 1462, + + 2833, 2717, 2717, 2717, 1457, 1446, 2847, 1440, 1439, 2849, + 2723, 2723, 2723, 1438, 2716, 2850, 2850, 2850, 2718, 2851, + 1434, 1433, 2852, 1587, 1587, 1587, 1432, 1420, 2724, 1419, + 1605, 1605, 1605, 1624, 1624, 1624, 2770, 2770, 2770, 1418, + 1417, 1589, 2904, 2904, 2904, 2774, 2774, 2774, 1607, 1416, + 1415, 1626, 2778, 2778, 2778, 2781, 2781, 2781, 2912, 2912, + 2912, 2783, 2783, 2783, 1414, 2784, 1413, 1412, 2785, 2786, + 2786, 2786, 2914, 2914, 2914, 2913, 2915, 1406, 1351, 2916, + 2788, 2788, 2788, 1347, 1342, 2885, 2787, 2790, 2790, 2790, + 2858, 2871, 2917, 2917, 2917, 1341, 2918, 2789, 1336, 2919, + + 2792, 2792, 2792, 1335, 2793, 2791, 1334, 2794, 2795, 2795, + 2795, 1362, 1362, 1362, 1370, 1370, 1370, 1380, 1380, 1380, + 2925, 2925, 2925, 2804, 2804, 2804, 2796, 2805, 1333, 1364, + 2806, 1332, 1372, 1331, 1319, 1382, 1318, 2926, 2939, 2939, + 2939, 2817, 2817, 2817, 2941, 2941, 2941, 1317, 2942, 1316, + 1315, 2943, 2944, 2944, 2944, 2940, 1314, 1313, 2818, 2820, + 2820, 2820, 1312, 2821, 1311, 1310, 2822, 1309, 1308, 2922, + 2945, 1307, 1306, 2920, 2826, 2826, 2826, 1305, 2949, 2949, + 2949, 2921, 2950, 1302, 1301, 2951, 2828, 2828, 2828, 1300, + 2829, 2827, 1299, 2830, 2831, 2831, 2831, 1486, 1486, 1486, + + 2834, 2834, 2834, 1298, 2835, 1297, 1296, 2836, 2960, 2960, + 2960, 1295, 2832, 1294, 1291, 1488, 2839, 2839, 2839, 2962, + 2962, 2962, 1290, 2963, 1289, 2961, 2964, 2841, 2841, 2841, + 2843, 2843, 2843, 2840, 2844, 1288, 1287, 2845, 2846, 2846, + 2846, 1286, 2965, 2965, 2965, 2842, 2966, 1285, 1284, 2967, + 2848, 2848, 2848, 1283, 1282, 2847, 1275, 2968, 2968, 2968, + 2958, 2969, 1271, 1270, 2970, 1269, 1268, 2849, 2850, 2850, + 2850, 1267, 2851, 1264, 1262, 2852, 2978, 2978, 2978, 2980, + 2980, 2980, 1587, 1587, 1587, 2985, 2985, 2985, 2986, 2986, + 2986, 1261, 1259, 2979, 1257, 1256, 2981, 1605, 1605, 1605, + + 1589, 3011, 3011, 3011, 1255, 2987, 3013, 3013, 3013, 3031, + 3031, 3031, 2904, 2904, 2904, 1607, 1254, 1253, 3012, 3036, + 3036, 3036, 1251, 1248, 3014, 2912, 2912, 2912, 3040, 3040, + 3040, 1246, 3041, 1245, 1244, 3042, 2914, 2914, 2914, 1243, + 2915, 1242, 2913, 2916, 2917, 2917, 2917, 1239, 2918, 1236, + 1235, 2919, 1234, 1232, 2984, 1362, 1362, 1362, 2998, 1370, + 1370, 1370, 1380, 1380, 1380, 3051, 3051, 3051, 2925, 2925, + 2925, 1231, 1228, 1364, 3053, 3053, 3053, 1372, 3054, 1227, + 1382, 3055, 3052, 1225, 1222, 2926, 3056, 3056, 3056, 2939, + 2939, 2939, 3069, 3069, 3069, 1221, 3070, 1220, 3049, 3071, + + 2941, 2941, 2941, 3057, 2942, 1216, 2940, 2943, 2944, 2944, + 2944, 3048, 3073, 3073, 3073, 2949, 2949, 2949, 1215, 2950, + 1213, 1212, 2951, 3047, 1211, 1210, 2945, 1208, 1207, 3074, + 3082, 3082, 3082, 2960, 2960, 2960, 3085, 3085, 3085, 1206, + 3086, 1205, 1204, 3087, 1203, 2962, 2962, 2962, 3083, 2963, + 2961, 1200, 2964, 2965, 2965, 2965, 1199, 2966, 1197, 1194, + 2967, 2968, 2968, 2968, 1192, 2969, 1191, 1190, 2970, 2978, + 2978, 2978, 3101, 3101, 3101, 1189, 3102, 1188, 1183, 3103, + 2980, 2980, 2980, 3104, 3104, 3104, 2979, 3105, 1181, 1180, + 3106, 3107, 3107, 3107, 3109, 3109, 3109, 2981, 1587, 1587, + + 1587, 2985, 2985, 2985, 2986, 2986, 2986, 1179, 3108, 1177, + 1176, 3110, 1175, 3112, 3112, 3112, 1589, 3113, 1172, 1171, + 3114, 2987, 1605, 1605, 1605, 3011, 3011, 3011, 3136, 3136, + 3136, 1170, 3137, 1169, 1167, 3138, 3013, 3013, 3013, 1166, + 1607, 1165, 3012, 1163, 1160, 3141, 3141, 3141, 3031, 3031, + 3031, 3157, 3157, 3157, 3014, 3036, 3036, 3036, 3161, 3161, + 3161, 3111, 3142, 1867, 3040, 3040, 3040, 1156, 3041, 1155, + 1153, 3042, 1152, 1151, 3123, 1362, 1362, 1362, 3172, 3172, + 3172, 1380, 1380, 1380, 3051, 3051, 3051, 3176, 3176, 3176, + 1148, 3177, 1147, 1364, 3178, 1146, 3173, 1145, 1143, 1382, + + 1142, 3052, 3053, 3053, 3053, 1136, 3054, 1135, 1134, 3055, + 3056, 3056, 3056, 3179, 3179, 3179, 1132, 3180, 1131, 1130, + 3181, 3069, 3069, 3069, 1125, 3070, 1124, 3057, 3071, 3073, + 3073, 3073, 3194, 3194, 3194, 1120, 3195, 1118, 1117, 3196, + 1116, 1115, 3171, 3174, 1114, 1113, 3074, 3082, 3082, 3082, + 3085, 3085, 3085, 1112, 3086, 1111, 1110, 3087, 3217, 3217, + 3217, 1109, 3101, 3101, 3101, 3083, 3102, 1106, 1103, 3103, + 3104, 3104, 3104, 1102, 3105, 3218, 1100, 3106, 3107, 3107, + 3107, 3223, 3223, 3223, 1099, 3224, 1098, 1097, 3225, 3109, + 3109, 3109, 3226, 3226, 3226, 3108, 3227, 1096, 1091, 3228, + + 1587, 1587, 1587, 3112, 3112, 3112, 3110, 3113, 1089, 1088, + 3114, 1605, 1605, 1605, 1087, 3136, 3136, 3136, 1589, 3137, + 1086, 1084, 3138, 3256, 3256, 3256, 3141, 3141, 3141, 1607, + 3258, 3258, 3258, 1083, 3259, 1082, 1080, 3260, 1079, 1078, + 3257, 1867, 1077, 3142, 1867, 3269, 3269, 3269, 1867, 3157, + 3157, 3157, 3229, 3271, 3271, 3271, 3272, 3272, 3272, 1075, + 1072, 3238, 3161, 3161, 3161, 3274, 3274, 3274, 1362, 1362, + 1362, 3172, 3172, 3172, 1380, 1380, 1380, 3176, 3176, 3176, + 1071, 3177, 1069, 1067, 3178, 1065, 1364, 1064, 1063, 3173, + 1062, 1061, 1382, 3179, 3179, 3179, 1060, 3180, 1059, 1057, + + 3181, 3286, 3286, 3286, 3298, 3298, 3298, 3194, 3194, 3194, + 1056, 3195, 1055, 1054, 3196, 3300, 3300, 3300, 3287, 1052, + 3283, 3299, 3217, 3217, 3217, 1050, 3319, 3319, 3319, 1049, + 3320, 1048, 3301, 3321, 3223, 3223, 3223, 1047, 3224, 3218, + 1044, 3225, 3284, 3226, 3226, 3226, 1043, 3227, 1042, 1037, + 3228, 3326, 3326, 3326, 1605, 1605, 1605, 3256, 3256, 3256, + 3348, 3348, 3348, 1035, 3349, 1034, 1033, 3350, 1027, 3327, + 1026, 1025, 1607, 1024, 3257, 1867, 1016, 1015, 1867, 3258, + 3258, 3258, 1013, 3259, 1010, 1009, 3260, 3269, 3269, 3269, + 3271, 3271, 3271, 3272, 3272, 3272, 1008, 1867, 3274, 3274, + + 3274, 3369, 3369, 3369, 3373, 3373, 3373, 1007, 3374, 1002, + 999, 3375, 1001, 1380, 1380, 1380, 3449, 3449, 3449, 3370, + 994, 3334, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, + 1865, 1382, 993, 1865, 3286, 3286, 3286, 991, 1865, 1865, + 1865, 1867, 1865, 3376, 3376, 3376, 3298, 3298, 3298, 762, + 989, 3287, 3385, 3385, 3385, 988, 3386, 986, 984, 3387, + 3377, 983, 982, 3299, 980, 3300, 3300, 3300, 1865, 1865, + 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 979, + 3371, 1865, 3301, 3450, 3450, 3450, 1865, 1865, 1865, 1867, + 1865, 3388, 3388, 3388, 976, 3389, 975, 974, 3390, 3319, + + 3319, 3319, 972, 3320, 971, 969, 3321, 3326, 3326, 3326, + 3418, 3418, 3418, 3369, 3369, 3369, 1865, 1865, 968, 3348, + 3348, 3348, 967, 3349, 966, 3327, 3350, 964, 3419, 963, + 962, 3370, 961, 3376, 3376, 3376, 960, 1867, 1865, 1865, + 1865, 1865, 1865, 3436, 1865, 1865, 1865, 959, 957, 1865, + 3377, 3449, 3449, 3449, 1865, 1865, 1865, 1867, 1865, 1380, + 1380, 1380, 3373, 3373, 3373, 955, 3374, 954, 952, 3375, + 948, 3461, 3461, 3461, 946, 3462, 942, 1382, 3463, 938, + 3418, 3418, 3418, 937, 1865, 1865, 1865, 1865, 1865, 1865, + 1865, 1865, 1865, 1865, 3436, 935, 933, 1865, 3419, 3450, + + 3450, 3450, 1865, 1865, 1865, 1867, 1865, 932, 3385, 3385, + 3385, 3455, 3386, 930, 928, 3387, 3388, 3388, 3388, 927, + 3389, 926, 925, 3390, 3504, 3504, 3504, 3517, 3517, 3517, + 924, 922, 1865, 1865, 3519, 3519, 3519, 3461, 3461, 3461, + 914, 3462, 1867, 1868, 3463, 3518, 3531, 3531, 3531, 912, + 907, 3520, 3539, 3539, 3539, 3557, 3557, 3557, 3504, 3504, + 3504, 906, 905, 3532, 3517, 3517, 3517, 904, 903, 3540, + 3519, 3519, 3519, 1261, 901, 899, 1867, 3569, 3569, 3569, + 898, 3570, 3518, 896, 3571, 894, 893, 3520, 3531, 3531, + 3531, 3582, 3582, 3582, 891, 3583, 889, 888, 3584, 3539, + + 3539, 3539, 3591, 3591, 3591, 3532, 3592, 886, 885, 3593, + 2075, 3557, 3557, 3557, 882, 881, 3540, 3569, 3569, 3569, + 880, 3570, 878, 3905, 3571, 874, 3582, 3582, 3582, 1261, + 3583, 872, 870, 3584, 3591, 3591, 3591, 869, 3592, 868, + 866, 3593, 3781, 3781, 3781, 3781, 3781, 3781, 3608, 3794, + 865, 861, 3795, 3903, 3903, 3903, 3903, 3903, 3903, 860, + 1261, 859, 858, 1261, 856, 855, 854, 852, 851, 850, + 844, 3904, 840, 839, 3904, 292, 292, 292, 292, 292, + 292, 292, 292, 292, 293, 293, 293, 293, 293, 293, + 293, 293, 293, 298, 298, 298, 298, 298, 298, 298, + + 298, 298, 301, 301, 301, 301, 301, 301, 301, 301, + 301, 304, 304, 304, 304, 304, 304, 304, 304, 304, + 307, 307, 307, 307, 307, 307, 307, 307, 307, 314, + 314, 314, 314, 314, 314, 314, 314, 314, 321, 321, + 321, 321, 321, 321, 321, 321, 321, 326, 326, 326, + 326, 326, 326, 326, 326, 326, 338, 338, 338, 338, + 338, 338, 338, 338, 338, 344, 344, 344, 344, 344, + 344, 344, 344, 344, 352, 352, 352, 352, 352, 352, + 352, 352, 352, 360, 360, 360, 360, 360, 360, 360, + 360, 360, 368, 368, 368, 368, 368, 368, 368, 368, + + 368, 372, 372, 372, 372, 372, 372, 372, 372, 372, + 378, 378, 378, 378, 378, 378, 378, 378, 378, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 390, 390, + 390, 390, 390, 390, 390, 390, 390, 396, 396, 396, + 396, 396, 396, 396, 396, 396, 403, 403, 403, 403, + 403, 403, 403, 403, 403, 408, 408, 408, 408, 408, + 408, 408, 408, 408, 415, 415, 415, 415, 415, 415, + 415, 415, 415, 421, 421, 421, 421, 421, 421, 421, + 421, 421, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 437, 437, 437, 437, 437, 437, 437, 437, 437, + + 443, 443, 443, 443, 443, 443, 443, 443, 443, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 461, 461, + 461, 461, 461, 461, 461, 461, 461, 465, 465, 465, + 465, 465, 465, 465, 465, 465, 472, 472, 472, 472, + 472, 472, 472, 472, 472, 480, 480, 480, 480, 480, + 480, 480, 480, 480, 488, 488, 488, 488, 488, 488, + 488, 488, 488, 494, 494, 494, 494, 494, 494, 494, + 494, 494, 500, 500, 500, 500, 500, 500, 500, 500, + 500, 504, 504, 504, 504, 504, 504, 504, 504, 504, + 512, 512, 512, 512, 512, 512, 512, 512, 512, 519, + + 519, 519, 519, 519, 519, 519, 519, 519, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 531, 531, 531, + 531, 531, 531, 531, 531, 531, 537, 537, 537, 537, + 537, 537, 537, 537, 537, 542, 542, 542, 542, 542, + 542, 542, 542, 542, 548, 548, 548, 548, 548, 548, + 548, 548, 548, 553, 553, 553, 553, 553, 553, 553, + 553, 553, 559, 559, 559, 559, 559, 559, 559, 559, + 559, 568, 568, 568, 568, 568, 568, 568, 568, 568, + 575, 575, 575, 575, 575, 575, 575, 575, 575, 579, + 579, 579, 579, 579, 579, 579, 579, 579, 590, 590, + + 590, 590, 590, 590, 590, 590, 590, 598, 598, 598, + 598, 598, 598, 598, 598, 598, 605, 605, 605, 605, + 605, 605, 605, 605, 605, 610, 610, 610, 610, 610, + 610, 610, 610, 610, 616, 616, 616, 616, 616, 616, + 616, 616, 616, 624, 624, 624, 624, 624, 624, 624, + 624, 624, 630, 630, 630, 630, 630, 630, 630, 630, + 630, 635, 635, 635, 635, 635, 635, 635, 635, 635, + 642, 642, 642, 642, 642, 642, 642, 642, 642, 647, + 647, 647, 647, 647, 647, 647, 647, 647, 653, 653, + 653, 653, 653, 653, 653, 653, 653, 660, 660, 660, + + 660, 660, 660, 660, 660, 660, 667, 667, 667, 667, + 667, 667, 667, 667, 667, 674, 674, 674, 674, 674, + 674, 674, 674, 674, 682, 682, 682, 682, 682, 682, + 682, 682, 682, 307, 307, 307, 307, 307, 307, 307, + 307, 307, 693, 693, 693, 693, 693, 693, 693, 693, + 693, 699, 699, 699, 699, 699, 699, 699, 699, 699, + 705, 705, 705, 705, 705, 705, 705, 705, 705, 710, + 710, 710, 710, 710, 710, 710, 710, 710, 719, 719, + 719, 719, 719, 719, 719, 719, 719, 725, 725, 725, + 725, 725, 725, 725, 725, 725, 745, 745, 745, 835, + + 831, 830, 745, 782, 782, 782, 829, 828, 827, 782, + 790, 790, 790, 825, 823, 822, 790, 799, 799, 799, + 821, 819, 817, 799, 803, 803, 803, 816, 814, 812, + 803, 809, 809, 809, 811, 810, 808, 809, 815, 815, + 815, 806, 805, 804, 815, 820, 820, 820, 802, 800, + 798, 820, 826, 826, 826, 797, 795, 794, 826, 836, + 836, 836, 793, 792, 791, 836, 853, 853, 853, 789, + 784, 783, 853, 857, 857, 857, 781, 3905, 762, 857, + 867, 867, 867, 747, 746, 744, 867, 873, 873, 873, + 743, 737, 736, 873, 879, 879, 879, 737, 736, 735, + + 879, 887, 887, 887, 734, 3905, 3905, 887, 892, 892, + 892, 3905, 3905, 3905, 892, 897, 897, 897, 3905, 3905, + 3905, 897, 902, 902, 902, 3905, 3905, 3905, 902, 913, + 913, 913, 3905, 3905, 3905, 913, 923, 923, 923, 3905, + 3905, 3905, 923, 931, 931, 931, 3905, 3905, 3905, 931, + 936, 936, 936, 3905, 3905, 3905, 936, 947, 947, 947, + 3905, 3905, 3905, 947, 953, 953, 953, 3905, 3905, 3905, + 953, 958, 958, 958, 3905, 3905, 3905, 958, 965, 965, + 965, 3905, 3905, 3905, 965, 973, 973, 973, 3905, 3905, + 3905, 973, 981, 981, 981, 3905, 3905, 3905, 981, 987, + + 987, 987, 3905, 3905, 3905, 987, 992, 992, 992, 3905, + 3905, 3905, 992, 998, 998, 998, 998, 998, 998, 998, + 3905, 998, 745, 745, 745, 3905, 3905, 3905, 745, 1014, + 3905, 3905, 3905, 1014, 782, 782, 782, 3905, 3905, 3905, + 782, 1058, 3905, 3905, 3905, 1058, 790, 790, 790, 3905, + 3905, 3905, 790, 1066, 3905, 3905, 3905, 1066, 799, 799, + 799, 3905, 3905, 3905, 799, 1070, 3905, 3905, 3905, 1070, + 803, 803, 803, 3905, 3905, 3905, 803, 1076, 3905, 3905, + 3905, 1076, 809, 809, 809, 3905, 3905, 3905, 809, 1081, + 3905, 3905, 3905, 1081, 815, 815, 815, 3905, 3905, 3905, + + 815, 1085, 3905, 3905, 3905, 1085, 820, 820, 820, 3905, + 3905, 3905, 820, 1090, 3905, 3905, 3905, 1090, 826, 826, + 826, 3905, 3905, 3905, 826, 1101, 3905, 3905, 3905, 1101, + 836, 836, 836, 3905, 3905, 3905, 836, 1119, 3905, 3905, + 3905, 1119, 853, 853, 853, 3905, 3905, 3905, 853, 1123, + 3905, 3905, 3905, 1123, 857, 857, 857, 3905, 3905, 3905, + 857, 1133, 3905, 3905, 3905, 1133, 867, 867, 867, 3905, + 3905, 3905, 867, 1141, 3905, 3905, 3905, 1141, 873, 873, + 873, 3905, 3905, 3905, 873, 1144, 3905, 3905, 3905, 1144, + 879, 879, 879, 3905, 3905, 3905, 879, 1154, 3905, 3905, + + 3905, 1154, 887, 887, 887, 3905, 3905, 3905, 887, 1159, + 3905, 3905, 3905, 1159, 892, 892, 892, 3905, 3905, 3905, + 892, 1164, 3905, 3905, 3905, 1164, 897, 897, 897, 3905, + 3905, 3905, 897, 1168, 3905, 3905, 3905, 1168, 902, 902, + 902, 3905, 3905, 3905, 902, 1178, 3905, 3905, 3905, 1178, + 913, 913, 913, 3905, 3905, 3905, 913, 1182, 3905, 3905, + 3905, 1182, 923, 923, 923, 3905, 3905, 3905, 923, 1193, + 3905, 3905, 3905, 1193, 931, 931, 931, 3905, 3905, 3905, + 931, 1198, 3905, 3905, 3905, 1198, 936, 936, 936, 3905, + 3905, 3905, 936, 1209, 3905, 3905, 3905, 1209, 947, 947, + + 947, 3905, 3905, 3905, 947, 1214, 3905, 3905, 3905, 1214, + 953, 953, 953, 3905, 3905, 3905, 953, 1219, 3905, 3905, + 3905, 1219, 958, 958, 958, 3905, 3905, 3905, 958, 1226, + 3905, 3905, 3905, 1226, 965, 965, 965, 3905, 3905, 3905, + 965, 1233, 3905, 3905, 3905, 1233, 973, 973, 973, 3905, + 3905, 3905, 973, 1241, 3905, 3905, 3905, 1241, 981, 981, + 981, 3905, 3905, 3905, 981, 1247, 3905, 3905, 3905, 1247, + 987, 987, 987, 3905, 3905, 3905, 987, 1252, 3905, 3905, + 3905, 1252, 992, 992, 992, 3905, 3905, 3905, 992, 1258, + 3905, 3905, 3905, 1258, 1260, 1260, 1260, 1260, 1260, 1260, + + 1260, 1260, 1260, 1266, 3905, 3905, 3905, 3905, 1266, 745, + 745, 745, 3905, 3905, 3905, 745, 1277, 1277, 1277, 1277, + 3905, 3905, 1277, 1277, 782, 782, 782, 782, 3905, 782, + 3905, 782, 1328, 1328, 1328, 1328, 3905, 3905, 1328, 1328, + 790, 790, 790, 3905, 3905, 3905, 790, 1338, 1338, 1338, + 1338, 3905, 3905, 1338, 1338, 799, 799, 799, 3905, 3905, + 3905, 799, 1344, 1344, 1344, 1344, 3905, 3905, 1344, 1344, + 803, 803, 803, 3905, 3905, 3905, 803, 1353, 1353, 1353, + 1353, 3905, 3905, 1353, 1353, 809, 809, 809, 809, 3905, + 809, 3905, 809, 1363, 1363, 1363, 1363, 3905, 3905, 1363, + + 1363, 815, 815, 815, 815, 3905, 815, 3905, 815, 1371, + 1371, 1371, 1371, 3905, 3905, 1371, 1371, 820, 820, 820, + 820, 3905, 820, 3905, 820, 1381, 1381, 1381, 1381, 3905, + 3905, 1381, 1381, 826, 826, 826, 826, 3905, 826, 3905, + 826, 1397, 1397, 1397, 1397, 3905, 3905, 1397, 1397, 836, + 836, 836, 3905, 3905, 3905, 836, 1422, 1422, 1422, 1422, + 3905, 3905, 1422, 1422, 1429, 1429, 1429, 1429, 3905, 3905, + 1429, 1429, 857, 857, 857, 3905, 3905, 3905, 857, 1442, + 1442, 1442, 1442, 3905, 3905, 1442, 1442, 867, 867, 867, + 3905, 3905, 3905, 867, 1454, 1454, 1454, 1454, 3905, 3905, + + 1454, 1454, 873, 873, 873, 3905, 3905, 3905, 873, 1459, + 1459, 1459, 1459, 3905, 3905, 1459, 1459, 879, 879, 879, + 3905, 3905, 3905, 879, 1471, 1471, 1471, 1471, 3905, 3905, + 1471, 1471, 887, 887, 887, 3905, 3905, 3905, 887, 1479, + 1479, 1479, 1479, 3905, 3905, 1479, 1479, 892, 892, 892, + 3905, 3905, 3905, 892, 1487, 1487, 1487, 1487, 3905, 3905, + 1487, 1487, 897, 897, 897, 3905, 3905, 3905, 897, 1493, + 1493, 1493, 1493, 3905, 3905, 1493, 1493, 902, 902, 902, + 3905, 3905, 3905, 902, 1508, 1508, 1508, 1508, 3905, 3905, + 1508, 1508, 913, 913, 913, 3905, 3905, 3905, 913, 1514, + + 1514, 1514, 1514, 3905, 3905, 1514, 1514, 923, 923, 923, + 3905, 3905, 3905, 923, 1527, 1527, 1527, 1527, 3905, 3905, + 1527, 1527, 931, 931, 931, 3905, 3905, 3905, 931, 1535, + 1535, 1535, 1535, 3905, 3905, 1535, 1535, 936, 936, 936, + 3905, 3905, 3905, 936, 1551, 1551, 1551, 1551, 3905, 3905, + 1551, 1551, 947, 947, 947, 947, 3905, 947, 3905, 947, + 1560, 1560, 1560, 1560, 3905, 3905, 1560, 1560, 953, 953, + 953, 3905, 3905, 3905, 953, 1568, 1568, 1568, 1568, 3905, + 3905, 1568, 1568, 958, 958, 958, 3905, 3905, 3905, 958, + 1578, 1578, 1578, 1578, 3905, 3905, 1578, 1578, 965, 965, + + 965, 3905, 3905, 3905, 965, 1588, 1588, 1588, 1588, 3905, + 3905, 1588, 1588, 973, 973, 973, 3905, 3905, 3905, 973, + 1599, 1599, 1599, 1599, 3905, 3905, 1599, 1599, 981, 981, + 981, 3905, 3905, 3905, 981, 1606, 1606, 1606, 1606, 3905, + 3905, 1606, 1606, 987, 987, 987, 3905, 3905, 3905, 987, + 1614, 1614, 1614, 1614, 3905, 3905, 1614, 1614, 992, 992, + 992, 992, 3905, 992, 3905, 992, 1625, 1625, 1625, 1625, + 3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, 1260, 1260, + 1260, 1260, 1260, 1266, 3905, 1266, 3905, 3905, 1266, 745, + 745, 745, 3905, 3905, 3905, 745, 1277, 1277, 1277, 1277, + + 3905, 3905, 1277, 1277, 782, 782, 782, 3905, 3905, 3905, + 782, 1328, 1328, 1328, 1328, 3905, 3905, 1328, 1328, 790, + 790, 790, 3905, 3905, 3905, 790, 1338, 1338, 1338, 1338, + 3905, 3905, 1338, 1338, 799, 799, 799, 3905, 3905, 3905, + 799, 1344, 1344, 1344, 1344, 3905, 3905, 1344, 1344, 803, + 803, 803, 3905, 3905, 3905, 803, 1353, 1353, 1353, 1353, + 3905, 3905, 1353, 1353, 809, 809, 809, 3905, 3905, 3905, + 809, 1363, 1363, 1363, 1363, 3905, 3905, 1363, 1363, 1371, + 1371, 1371, 1371, 3905, 3905, 1371, 1371, 820, 820, 820, + 3905, 3905, 3905, 820, 1381, 1381, 1381, 1381, 3905, 3905, + + 1381, 1381, 826, 826, 826, 3905, 3905, 3905, 826, 1397, + 1397, 1397, 1397, 3905, 3905, 1397, 1397, 836, 836, 836, + 3905, 3905, 3905, 836, 1422, 1422, 1422, 1422, 3905, 3905, + 1422, 1422, 1429, 1429, 1429, 1429, 3905, 3905, 1429, 1429, + 857, 857, 857, 3905, 3905, 3905, 857, 1442, 1442, 1442, + 1442, 3905, 3905, 1442, 1442, 867, 867, 867, 867, 3905, + 867, 3905, 867, 1454, 1454, 1454, 1454, 3905, 3905, 1454, + 1454, 873, 873, 873, 873, 3905, 873, 3905, 873, 1459, + 1459, 1459, 1459, 3905, 3905, 1459, 1459, 879, 879, 879, + 3905, 3905, 3905, 879, 1471, 1471, 1471, 1471, 3905, 3905, + + 1471, 1471, 887, 887, 887, 3905, 3905, 3905, 887, 1479, + 1479, 1479, 1479, 3905, 3905, 1479, 1479, 892, 892, 892, + 3905, 3905, 3905, 892, 1487, 1487, 1487, 1487, 3905, 3905, + 1487, 1487, 897, 897, 897, 897, 3905, 897, 3905, 897, + 1493, 1493, 1493, 1493, 3905, 3905, 1493, 1493, 902, 902, + 902, 3905, 3905, 3905, 902, 1508, 1508, 1508, 1508, 3905, + 3905, 1508, 1508, 913, 913, 913, 3905, 3905, 3905, 913, + 1514, 1514, 1514, 1514, 3905, 3905, 1514, 1514, 923, 923, + 923, 3905, 3905, 3905, 923, 1527, 1527, 1527, 1527, 3905, + 3905, 1527, 1527, 931, 931, 931, 3905, 3905, 3905, 931, + + 1535, 1535, 1535, 1535, 3905, 3905, 1535, 1535, 936, 936, + 936, 3905, 3905, 3905, 936, 1551, 1551, 1551, 1551, 3905, + 3905, 1551, 1551, 947, 947, 947, 3905, 3905, 3905, 947, + 1560, 1560, 1560, 1560, 3905, 3905, 1560, 1560, 953, 953, + 953, 3905, 3905, 3905, 953, 1568, 1568, 1568, 1568, 3905, + 3905, 1568, 1568, 958, 958, 958, 3905, 3905, 3905, 958, + 1578, 1578, 1578, 1578, 3905, 3905, 1578, 1578, 965, 965, + 965, 3905, 3905, 3905, 965, 1588, 1588, 1588, 1588, 3905, + 3905, 1588, 1588, 973, 973, 973, 973, 3905, 973, 3905, + 973, 1599, 1599, 1599, 1599, 3905, 3905, 1599, 1599, 981, + + 981, 981, 3905, 3905, 3905, 981, 1606, 1606, 1606, 1606, + 3905, 3905, 1606, 1606, 987, 987, 987, 3905, 3905, 3905, + 987, 1614, 1614, 1614, 1614, 3905, 3905, 1614, 1614, 992, + 992, 992, 3905, 3905, 3905, 992, 1625, 1625, 1625, 1625, + 3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, 1260, 1260, + 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, 1865, 1865, + 1865, 1865, 745, 745, 745, 3905, 3905, 3905, 745, 782, + 782, 782, 3905, 3905, 3905, 782, 1328, 1328, 1328, 1328, + 3905, 3905, 1328, 1328, 790, 790, 790, 3905, 3905, 3905, + 790, 1338, 1338, 1338, 1338, 3905, 3905, 1338, 1338, 799, + + 799, 799, 799, 3905, 799, 3905, 799, 1344, 1344, 1344, + 1344, 3905, 3905, 1344, 1344, 803, 803, 803, 3905, 3905, + 3905, 803, 1353, 1353, 1353, 1353, 3905, 3905, 1353, 1353, + 809, 809, 809, 3905, 3905, 3905, 809, 1363, 1363, 1363, + 1363, 3905, 3905, 1363, 1363, 1371, 1371, 1371, 1371, 3905, + 3905, 1371, 1371, 820, 820, 820, 3905, 3905, 3905, 820, + 1381, 1381, 1381, 1381, 3905, 3905, 1381, 1381, 826, 826, + 826, 3905, 3905, 3905, 826, 1397, 1397, 1397, 1397, 3905, + 3905, 1397, 1397, 836, 836, 836, 836, 3905, 836, 3905, + 836, 1422, 1422, 1422, 1422, 3905, 3905, 1422, 1422, 1429, + + 1429, 1429, 1429, 3905, 3905, 1429, 1429, 857, 857, 857, + 3905, 3905, 3905, 857, 1442, 1442, 1442, 1442, 3905, 3905, + 1442, 1442, 1454, 1454, 1454, 1454, 3905, 3905, 1454, 1454, + 1459, 1459, 1459, 1459, 3905, 3905, 1459, 1459, 879, 879, + 879, 3905, 3905, 3905, 879, 1471, 1471, 1471, 1471, 3905, + 3905, 1471, 1471, 887, 887, 887, 3905, 3905, 3905, 887, + 1479, 1479, 1479, 1479, 3905, 3905, 1479, 1479, 892, 892, + 892, 892, 3905, 892, 3905, 892, 1487, 1487, 1487, 1487, + 3905, 3905, 1487, 1487, 897, 897, 897, 3905, 3905, 3905, + 897, 1493, 1493, 1493, 1493, 3905, 3905, 1493, 1493, 902, + + 902, 902, 3905, 3905, 3905, 902, 1508, 1508, 1508, 1508, + 3905, 3905, 1508, 1508, 913, 913, 913, 3905, 3905, 3905, + 913, 1514, 1514, 1514, 1514, 3905, 3905, 1514, 1514, 923, + 923, 923, 3905, 3905, 3905, 923, 1527, 1527, 1527, 1527, + 3905, 3905, 1527, 1527, 931, 931, 931, 931, 3905, 931, + 3905, 931, 1535, 1535, 1535, 1535, 3905, 3905, 1535, 1535, + 936, 936, 936, 3905, 3905, 3905, 936, 1551, 1551, 1551, + 1551, 3905, 3905, 1551, 1551, 947, 947, 947, 3905, 3905, + 3905, 947, 1560, 1560, 1560, 1560, 3905, 3905, 1560, 1560, + 953, 953, 953, 3905, 3905, 3905, 953, 1568, 1568, 1568, + + 1568, 3905, 3905, 1568, 1568, 958, 958, 958, 3905, 3905, + 3905, 958, 1578, 1578, 1578, 1578, 3905, 3905, 1578, 1578, + 965, 965, 965, 3905, 3905, 3905, 965, 1588, 1588, 1588, + 1588, 3905, 3905, 1588, 1588, 973, 973, 973, 3905, 3905, + 3905, 973, 1599, 1599, 1599, 1599, 3905, 3905, 1599, 1599, + 981, 981, 981, 3905, 3905, 3905, 981, 1606, 1606, 1606, + 1606, 3905, 3905, 1606, 1606, 987, 987, 987, 3905, 3905, + 3905, 987, 1614, 1614, 1614, 1614, 3905, 3905, 1614, 1614, + 992, 992, 992, 3905, 3905, 3905, 992, 1625, 1625, 1625, + 1625, 3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, 1260, + + 1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, 1865, + 1865, 1865, 1865, 745, 745, 745, 3905, 3905, 3905, 745, + 782, 782, 782, 782, 3905, 782, 3905, 782, 1328, 1328, + 1328, 1328, 3905, 3905, 1328, 1328, 790, 790, 790, 3905, + 3905, 3905, 790, 1338, 1338, 1338, 1338, 3905, 3905, 1338, + 1338, 1344, 1344, 1344, 1344, 3905, 3905, 1344, 1344, 803, + 803, 803, 3905, 3905, 3905, 803, 1353, 1353, 1353, 1353, + 3905, 3905, 1353, 1353, 809, 809, 809, 809, 3905, 809, + 3905, 809, 1363, 1363, 1363, 1363, 3905, 3905, 1363, 1363, + 1371, 1371, 1371, 1371, 3905, 3905, 1371, 1371, 820, 820, + + 820, 820, 3905, 820, 3905, 820, 1381, 1381, 1381, 1381, + 3905, 3905, 1381, 1381, 826, 826, 826, 826, 3905, 826, + 3905, 826, 1397, 1397, 1397, 1397, 3905, 3905, 1397, 1397, + 836, 836, 836, 836, 3905, 836, 3905, 836, 1422, 1422, + 1422, 1422, 3905, 3905, 1422, 1422, 1429, 1429, 1429, 1429, + 3905, 3905, 1429, 1429, 857, 857, 857, 3905, 3905, 3905, + 857, 1442, 1442, 1442, 1442, 3905, 3905, 1442, 1442, 1454, + 1454, 1454, 1454, 3905, 3905, 1454, 1454, 1459, 1459, 1459, + 1459, 3905, 3905, 1459, 1459, 879, 879, 879, 3905, 3905, + 3905, 879, 1471, 1471, 1471, 1471, 3905, 3905, 1471, 1471, + + 887, 887, 887, 3905, 3905, 3905, 887, 1479, 1479, 1479, + 1479, 3905, 3905, 1479, 1479, 1487, 1487, 1487, 1487, 3905, + 3905, 1487, 1487, 897, 897, 897, 3905, 3905, 3905, 897, + 1493, 1493, 1493, 1493, 3905, 3905, 1493, 1493, 902, 902, + 902, 3905, 3905, 3905, 902, 1508, 1508, 1508, 1508, 3905, + 3905, 1508, 1508, 913, 913, 913, 3905, 3905, 3905, 913, + 1514, 1514, 1514, 1514, 3905, 3905, 1514, 1514, 923, 923, + 923, 3905, 3905, 3905, 923, 1527, 1527, 1527, 1527, 3905, + 3905, 1527, 1527, 1535, 1535, 1535, 1535, 3905, 3905, 1535, + 1535, 936, 936, 936, 3905, 3905, 3905, 936, 1551, 1551, + + 1551, 1551, 3905, 3905, 1551, 1551, 947, 947, 947, 3905, + 3905, 3905, 947, 1560, 1560, 1560, 1560, 3905, 3905, 1560, + 1560, 953, 953, 953, 3905, 3905, 3905, 953, 1568, 1568, + 1568, 1568, 3905, 3905, 1568, 1568, 958, 958, 958, 958, + 3905, 958, 3905, 958, 1578, 1578, 1578, 1578, 3905, 3905, + 1578, 1578, 965, 965, 965, 3905, 3905, 3905, 965, 1588, + 1588, 1588, 1588, 3905, 3905, 1588, 1588, 973, 973, 973, + 3905, 3905, 3905, 973, 1599, 1599, 1599, 1599, 3905, 3905, + 1599, 1599, 981, 981, 981, 3905, 3905, 3905, 981, 1606, + 1606, 1606, 1606, 3905, 3905, 1606, 1606, 987, 987, 987, + + 3905, 3905, 3905, 987, 1614, 1614, 1614, 1614, 3905, 3905, + 1614, 1614, 992, 992, 992, 992, 3905, 992, 3905, 992, + 1625, 1625, 1625, 1625, 3905, 3905, 1625, 1625, 1260, 1260, + 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1865, 1865, 1865, + 1865, 1865, 1865, 1865, 1865, 1865, 745, 745, 745, 745, + 3905, 745, 3905, 745, 782, 782, 782, 3905, 3905, 3905, + 782, 1328, 1328, 1328, 1328, 3905, 3905, 1328, 1328, 790, + 790, 790, 3905, 3905, 3905, 790, 1338, 1338, 1338, 1338, + 3905, 3905, 1338, 1338, 1344, 1344, 1344, 1344, 3905, 3905, + 1344, 1344, 803, 803, 803, 3905, 3905, 3905, 803, 1353, + + 1353, 1353, 1353, 3905, 3905, 1353, 1353, 1363, 1363, 1363, + 1363, 3905, 3905, 1363, 1363, 1371, 1371, 1371, 1371, 3905, + 3905, 1371, 1371, 1381, 1381, 1381, 1381, 3905, 3905, 1381, + 1381, 826, 826, 826, 826, 3905, 826, 3905, 826, 1397, + 1397, 1397, 1397, 3905, 3905, 1397, 1397, 836, 836, 836, + 3905, 3905, 3905, 836, 1422, 1422, 1422, 1422, 3905, 3905, + 1422, 1422, 1429, 1429, 1429, 1429, 3905, 3905, 1429, 1429, + 857, 857, 857, 3905, 3905, 3905, 857, 1454, 1454, 1454, + 1454, 3905, 3905, 1454, 1454, 1459, 1459, 1459, 1459, 3905, + 3905, 1459, 1459, 879, 879, 879, 3905, 3905, 3905, 879, + + 887, 887, 887, 3905, 3905, 3905, 887, 1479, 1479, 1479, + 1479, 3905, 3905, 1479, 1479, 1487, 1487, 1487, 1487, 3905, + 3905, 1487, 1487, 897, 897, 897, 3905, 3905, 3905, 897, + 1493, 1493, 1493, 1493, 3905, 3905, 1493, 1493, 902, 902, + 902, 3905, 3905, 3905, 902, 913, 913, 913, 913, 3905, + 913, 3905, 913, 1514, 1514, 1514, 1514, 3905, 3905, 1514, + 1514, 923, 923, 923, 3905, 3905, 3905, 923, 1527, 1527, + 1527, 1527, 3905, 3905, 1527, 1527, 936, 936, 936, 3905, + 3905, 3905, 936, 1551, 1551, 1551, 1551, 3905, 3905, 1551, + 1551, 947, 947, 947, 3905, 3905, 3905, 947, 1560, 1560, + + 1560, 1560, 3905, 3905, 1560, 1560, 953, 953, 953, 3905, + 3905, 3905, 953, 1568, 1568, 1568, 1568, 3905, 3905, 1568, + 1568, 958, 958, 958, 958, 3905, 958, 3905, 958, 1578, + 1578, 1578, 1578, 3905, 3905, 1578, 1578, 965, 965, 965, + 965, 3905, 965, 3905, 965, 1588, 1588, 1588, 1588, 3905, + 3905, 1588, 1588, 973, 973, 973, 3905, 3905, 3905, 973, + 1599, 1599, 1599, 1599, 3905, 3905, 1599, 1599, 981, 981, + 981, 981, 3905, 981, 3905, 981, 1606, 1606, 1606, 1606, + 3905, 3905, 1606, 1606, 987, 987, 987, 987, 3905, 987, + 3905, 987, 992, 992, 992, 3905, 3905, 3905, 992, 1625, + + 1625, 1625, 1625, 3905, 3905, 1625, 1625, 1260, 1260, 1260, + 1260, 1260, 1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865, + 1865, 1865, 1865, 1865, 1865, 782, 782, 782, 3905, 3905, + 3905, 782, 1328, 1328, 1328, 1328, 3905, 3905, 1328, 1328, + 790, 790, 790, 790, 3905, 790, 3905, 790, 1344, 1344, + 1344, 1344, 3905, 3905, 1344, 1344, 803, 803, 803, 3905, + 3905, 3905, 803, 1353, 1353, 1353, 1353, 3905, 3905, 1353, + 1353, 1363, 1363, 1363, 1363, 3905, 3905, 1363, 1363, 1371, + 1371, 1371, 1371, 3905, 3905, 1371, 1371, 1381, 1381, 1381, + 1381, 3905, 3905, 1381, 1381, 1397, 1397, 1397, 1397, 3905, + + 3905, 1397, 1397, 836, 836, 836, 3905, 3905, 3905, 836, + 1422, 1422, 1422, 1422, 3905, 3905, 1422, 1422, 1429, 1429, + 1429, 1429, 3905, 3905, 1429, 1429, 857, 857, 857, 3905, + 3905, 3905, 857, 1454, 1454, 1454, 1454, 3905, 3905, 1454, + 1454, 1459, 1459, 1459, 1459, 3905, 3905, 1459, 1459, 879, + 879, 879, 3905, 3905, 3905, 879, 887, 887, 887, 3905, + 3905, 3905, 887, 1479, 1479, 1479, 1479, 3905, 3905, 1479, + 1479, 1487, 1487, 1487, 1487, 3905, 3905, 1487, 1487, 897, + 897, 897, 3905, 3905, 3905, 897, 902, 902, 902, 3905, + 3905, 3905, 902, 1514, 1514, 1514, 1514, 3905, 3905, 1514, + + 1514, 923, 923, 923, 923, 3905, 923, 3905, 923, 1527, + 1527, 1527, 1527, 3905, 3905, 1527, 1527, 936, 936, 936, + 3905, 3905, 3905, 936, 1551, 1551, 1551, 1551, 3905, 3905, + 1551, 1551, 947, 947, 947, 3905, 3905, 3905, 947, 953, + 953, 953, 3905, 3905, 3905, 953, 1568, 1568, 1568, 1568, + 3905, 3905, 1568, 1568, 958, 958, 958, 3905, 3905, 3905, + 958, 1578, 1578, 1578, 1578, 3905, 3905, 1578, 1578, 965, + 965, 965, 3905, 3905, 3905, 965, 1588, 1588, 1588, 1588, + 3905, 3905, 1588, 1588, 973, 973, 973, 3905, 3905, 3905, + 973, 1606, 1606, 1606, 1606, 3905, 3905, 1606, 1606, 992, + + 992, 992, 3905, 3905, 3905, 992, 1625, 1625, 1625, 1625, + 3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, 1260, 1260, + 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, 1865, 1865, + 1865, 1865, 782, 782, 782, 3905, 3905, 3905, 782, 1328, + 1328, 1328, 1328, 3905, 3905, 1328, 1328, 790, 790, 790, + 790, 3905, 790, 3905, 790, 1344, 1344, 1344, 1344, 3905, + 3905, 1344, 1344, 803, 803, 803, 803, 3905, 803, 3905, + 803, 1353, 1353, 1353, 1353, 3905, 3905, 1353, 1353, 1363, + 1363, 1363, 1363, 3905, 3905, 1363, 1363, 1371, 1371, 1371, + 1371, 3905, 3905, 1371, 1371, 1381, 1381, 1381, 1381, 3905, + + 3905, 1381, 1381, 1397, 1397, 1397, 1397, 3905, 3905, 1397, + 1397, 836, 836, 836, 3905, 3905, 3905, 836, 1422, 1422, + 1422, 1422, 3905, 3905, 1422, 1422, 857, 857, 857, 3905, + 3905, 3905, 857, 1454, 1454, 1454, 1454, 3905, 3905, 1454, + 1454, 1459, 1459, 1459, 1459, 3905, 3905, 1459, 1459, 879, + 879, 879, 879, 3905, 879, 3905, 879, 887, 887, 887, + 887, 3905, 887, 3905, 887, 1479, 1479, 1479, 1479, 3905, + 3905, 1479, 1479, 1487, 1487, 1487, 1487, 3905, 3905, 1487, + 1487, 897, 897, 897, 897, 3905, 897, 3905, 897, 902, + 902, 902, 3905, 3905, 3905, 902, 1514, 1514, 1514, 1514, + + 3905, 3905, 1514, 1514, 923, 923, 923, 923, 3905, 923, + 3905, 923, 1527, 1527, 1527, 1527, 3905, 3905, 1527, 1527, + 936, 936, 936, 936, 3905, 936, 3905, 936, 947, 947, + 947, 3905, 3905, 3905, 947, 953, 953, 953, 3905, 3905, + 3905, 953, 958, 958, 958, 3905, 3905, 3905, 958, 1578, + 1578, 1578, 1578, 3905, 3905, 1578, 1578, 965, 965, 965, + 3905, 3905, 3905, 965, 1588, 1588, 1588, 1588, 3905, 3905, + 1588, 1588, 973, 973, 973, 3905, 3905, 3905, 973, 1606, + 1606, 1606, 1606, 3905, 3905, 1606, 1606, 992, 992, 992, + 3905, 3905, 3905, 992, 1625, 1625, 1625, 1625, 3905, 3905, + + 1625, 1625, 1260, 1260, 1260, 1260, 1260, 1260, 1260, 1260, + 1260, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, 1865, + 782, 782, 782, 3905, 3905, 3905, 782, 790, 790, 790, + 790, 3905, 790, 3905, 790, 1344, 1344, 1344, 1344, 3905, + 3905, 1344, 1344, 1353, 1353, 1353, 1353, 3905, 3905, 1353, + 1353, 1363, 1363, 1363, 1363, 3905, 3905, 1363, 1363, 1371, + 1371, 1371, 1371, 3905, 3905, 1371, 1371, 1381, 1381, 1381, + 1381, 3905, 3905, 1381, 1381, 836, 836, 836, 3905, 3905, + 3905, 836, 857, 857, 857, 3905, 3905, 3905, 857, 1454, + 1454, 1454, 1454, 3905, 3905, 1454, 1454, 879, 879, 879, + + 3905, 3905, 3905, 879, 1479, 1479, 1479, 1479, 3905, 3905, + 1479, 1479, 1487, 1487, 1487, 1487, 3905, 3905, 1487, 1487, + 902, 902, 902, 3905, 3905, 3905, 902, 1514, 1514, 1514, + 1514, 3905, 3905, 1514, 1514, 923, 923, 923, 923, 3905, + 923, 3905, 923, 936, 936, 936, 3905, 3905, 3905, 936, + 947, 947, 947, 3905, 3905, 3905, 947, 953, 953, 953, + 3905, 3905, 3905, 953, 958, 958, 958, 3905, 3905, 3905, + 958, 965, 965, 965, 3905, 3905, 3905, 965, 1588, 1588, + 1588, 1588, 3905, 3905, 1588, 1588, 973, 973, 973, 3905, + 3905, 3905, 973, 1606, 1606, 1606, 1606, 3905, 3905, 1606, + + 1606, 992, 992, 992, 3905, 3905, 3905, 992, 1625, 1625, + 1625, 1625, 3905, 3905, 1625, 1625, 1260, 1260, 1260, 1260, + 1260, 1260, 1260, 1260, 1260, 1865, 1865, 1865, 1865, 1865, + 1865, 1865, 1865, 1865, 782, 782, 782, 782, 3905, 782, + 3905, 782, 3351, 3351, 3351, 3351, 3351, 3351, 3351, 3351, + 3351, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, 3352, + 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3431, 3434, + 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3434, 3501, 3501, + 3501, 3501, 3501, 3501, 3501, 3501, 3501, 3503, 3503, 3503, + 3503, 3503, 3503, 3503, 3503, 3503, 291, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905 } ; -static yyconst flex_int16_t yy_chk[11977] = +static yyconst flex_int16_t yy_chk[14073] = { 0, 0, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 11, 3, 9, 12, - 4, 10, 331, 5, 0, 9, 6, 0, 10, 7, - 8, 8, 8, 244, 11, 13, 13, 12, 14, 14, - 13, 13, 282, 14, 14, 245, 8, 17, 17, 244, - 13, 15, 15, 14, 15, 248, 15, 16, 16, 1015, - 16, 245, 16, 18, 18, 1015, 15, 21, 21, 21, - 331, 248, 16, 22, 22, 22, 23, 23, 23, 24, - 24, 24, 355, 21, 25, 25, 25, 355, 1465, 22, - 343, 17, 23, 1469, 282, 24, 242, 242, 242, 1474, - - 25, 243, 243, 243, 247, 247, 247, 18, 19, 19, + 4, 10, 977, 5, 0, 9, 6, 362, 10, 7, + 8, 8, 8, 296, 11, 13, 13, 12, 14, 14, + 13, 13, 334, 14, 14, 297, 8, 17, 17, 296, + 13, 15, 15, 14, 15, 300, 15, 16, 16, 977, + 16, 297, 16, 18, 18, 362, 15, 21, 21, 21, + 1512, 300, 16, 22, 22, 22, 451, 23, 23, 23, + 24, 24, 24, 21, 25, 25, 25, 343, 1517, 22, + 451, 322, 17, 23, 343, 334, 24, 294, 294, 294, + + 25, 295, 295, 295, 299, 299, 299, 322, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 401, 19, 19, 19, 19, 19, 26, - 26, 26, 27, 27, 27, 28, 28, 28, 343, 29, - 29, 29, 30, 30, 30, 26, 270, 287, 27, 291, - 365, 28, 301, 19, 19, 29, 291, 437, 30, 267, - 267, 267, 270, 287, 19, 275, 275, 275, 301, 437, - 258, 365, 401, 19, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 543, - 20, 20, 20, 20, 20, 31, 31, 31, 32, 32, - - 32, 33, 33, 33, 543, 34, 34, 34, 35, 35, - 35, 31, 258, 632, 32, 558, 632, 33, 258, 20, - 20, 34, 306, 258, 35, 36, 36, 36, 258, 306, - 20, 37, 37, 37, 38, 38, 38, 734, 306, 20, - 734, 36, 39, 39, 39, 1475, 311, 37, 1480, 323, - 38, 40, 40, 40, 284, 284, 284, 376, 39, 293, - 293, 293, 311, 558, 294, 323, 1481, 40, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 41, 41, 596, 41, 41, 41, 41, 41, 43, - 43, 43, 44, 44, 44, 45, 45, 45, 387, 46, - - 46, 46, 47, 47, 47, 43, 370, 651, 44, 376, - 1496, 45, 294, 41, 41, 46, 294, 336, 47, 41, - 370, 651, 41, 298, 298, 298, 305, 305, 305, 308, - 308, 308, 596, 336, 41, 42, 42, 42, 42, 42, + 19, 19, 19, 19, 339, 19, 19, 19, 19, 19, + 26, 26, 26, 27, 27, 27, 28, 28, 28, 449, + 339, 29, 29, 29, 347, 436, 26, 449, 347, 27, + 436, 739, 28, 449, 739, 19, 19, 29, 30, 30, + 30, 319, 319, 319, 348, 346, 19, 327, 327, 327, + 336, 336, 336, 1518, 30, 19, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 446, 20, 20, 20, 20, 20, 31, 31, 31, + + 32, 32, 32, 33, 33, 33, 251, 251, 34, 34, + 34, 251, 446, 31, 346, 353, 32, 348, 346, 33, + 518, 251, 20, 20, 34, 35, 35, 35, 36, 36, + 36, 353, 518, 20, 37, 37, 37, 38, 38, 38, + 859, 35, 20, 859, 36, 39, 39, 39, 364, 1520, + 37, 251, 369, 38, 40, 40, 40, 345, 345, 345, + 399, 39, 350, 350, 350, 361, 361, 361, 369, 600, + 40, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 379, 41, 41, 41, + 41, 41, 43, 43, 43, 44, 44, 44, 45, 45, + + 45, 364, 379, 46, 46, 46, 479, 600, 43, 374, + 479, 44, 1521, 399, 45, 1523, 374, 41, 41, 46, + 47, 47, 47, 41, 482, 374, 41, 366, 366, 366, + 373, 373, 373, 376, 376, 376, 47, 1524, 41, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 387, 42, 42, 42, 42, 42, 48, 48, 48, 49, - 49, 49, 50, 50, 50, 368, 53, 53, 53, 54, - 54, 54, 48, 368, 1497, 49, 644, 318, 50, 368, - 42, 42, 53, 398, 318, 54, 42, 398, 403, 42, - 317, 317, 317, 318, 320, 320, 320, 329, 329, 329, - - 644, 42, 51, 51, 51, 51, 51, 51, 51, 51, - 51, 51, 51, 51, 51, 51, 51, 623, 51, 51, - 51, 51, 51, 57, 57, 57, 58, 58, 58, 61, - 61, 61, 623, 62, 62, 62, 63, 63, 63, 57, - 403, 1499, 58, 1521, 656, 61, 666, 51, 51, 62, - 348, 363, 63, 64, 64, 64, 333, 333, 333, 341, - 341, 341, 345, 345, 345, 519, 348, 363, 656, 64, - 666, 51, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 669, 52, 52, - 52, 52, 52, 65, 65, 65, 66, 66, 66, 67, - - 67, 67, 519, 68, 68, 68, 71, 71, 71, 65, - 486, 669, 66, 358, 486, 67, 1522, 52, 52, 68, - 358, 851, 71, 72, 72, 72, 357, 357, 357, 358, - 360, 360, 360, 374, 374, 374, 378, 378, 378, 72, - 1525, 52, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 851, 55, 55, - 55, 55, 55, 73, 73, 73, 74, 74, 74, 75, - 75, 75, 1527, 76, 76, 76, 77, 77, 77, 73, - 381, 392, 74, 554, 408, 75, 371, 55, 55, 76, - 554, 55, 77, 1529, 371, 1536, 381, 392, 55, 371, - - 408, 55, 56, 56, 56, 56, 56, 56, 56, 56, - 56, 56, 56, 56, 56, 56, 56, 1537, 56, 56, - 56, 56, 56, 78, 78, 78, 81, 81, 81, 82, - 82, 82, 662, 85, 85, 85, 86, 86, 86, 78, - 420, 432, 81, 415, 446, 82, 662, 56, 56, 85, - 415, 56, 86, 385, 385, 385, 420, 432, 56, 415, - 446, 56, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 1538, 59, 59, - 59, 59, 59, 87, 87, 87, 88, 88, 88, 89, - 89, 89, 427, 90, 90, 90, 91, 91, 91, 87, - - 668, 1539, 88, 1541, 1547, 89, 1549, 59, 59, 90, - 457, 468, 91, 59, 668, 441, 59, 389, 389, 389, - 400, 400, 400, 405, 405, 405, 457, 468, 59, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 60, 427, 60, 60, 60, 60, 60, - 92, 92, 92, 95, 95, 95, 96, 96, 96, 501, - 97, 97, 97, 98, 98, 98, 92, 441, 1128, 95, - 1551, 1552, 96, 1557, 60, 60, 97, 479, 490, 98, - 60, 1128, 503, 60, 414, 414, 414, 417, 417, 417, - 424, 424, 424, 479, 490, 60, 69, 69, 69, 69, - + 42, 42, 42, 42, 391, 42, 42, 42, 42, 42, + 48, 48, 48, 49, 49, 49, 50, 50, 50, 752, + 391, 53, 53, 53, 482, 1525, 48, 386, 1533, 49, + 752, 751, 50, 752, 386, 42, 42, 53, 54, 54, + 54, 42, 411, 386, 42, 385, 385, 385, 388, 388, + + 388, 397, 397, 397, 54, 751, 42, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 404, 51, 51, 51, 51, 51, 55, 55, + 55, 56, 56, 56, 57, 57, 57, 424, 404, 58, + 58, 58, 1171, 416, 55, 411, 429, 56, 1171, 444, + 57, 1538, 457, 51, 51, 58, 59, 59, 59, 416, + 676, 51, 429, 51, 398, 444, 51, 401, 401, 401, + 51, 1547, 59, 1549, 51, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 424, 52, 52, 52, 52, 52, 60, 60, 60, 63, + + 63, 63, 64, 64, 64, 457, 452, 67, 67, 67, + 676, 462, 60, 398, 452, 63, 758, 398, 64, 452, + 468, 52, 52, 67, 68, 68, 68, 462, 1296, 52, + 758, 52, 410, 1558, 52, 409, 409, 409, 52, 1563, + 68, 1296, 52, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 473, 61, + 61, 61, 61, 61, 71, 71, 71, 72, 72, 72, + 73, 73, 73, 468, 473, 74, 74, 74, 567, 1571, + 71, 410, 567, 72, 1572, 410, 73, 1576, 489, 61, + 61, 74, 75, 75, 75, 76, 76, 76, 413, 413, + + 413, 422, 422, 422, 489, 484, 423, 1581, 75, 1585, + 1591, 76, 1597, 61, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 501, + 62, 62, 62, 62, 62, 77, 77, 77, 78, 78, + 78, 81, 81, 81, 1602, 501, 82, 82, 82, 634, + 1604, 77, 1612, 1619, 78, 423, 634, 81, 484, 423, + 62, 62, 82, 83, 83, 83, 84, 84, 84, 426, + 426, 426, 438, 438, 438, 441, 441, 441, 1620, 83, + 310, 1623, 84, 1632, 62, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + + 513, 65, 65, 65, 65, 65, 85, 85, 85, 86, + 86, 86, 87, 87, 87, 582, 513, 88, 88, 88, + 439, 1633, 85, 310, 508, 86, 585, 439, 87, 310, + 582, 65, 65, 88, 310, 65, 439, 522, 584, 310, + 1263, 585, 65, 1634, 1263, 65, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 764, 66, 66, 66, 66, 66, 91, 91, 91, + 92, 92, 92, 93, 93, 93, 584, 508, 94, 94, + 94, 775, 1637, 91, 586, 764, 92, 1638, 496, 93, + 522, 584, 66, 66, 94, 496, 66, 455, 455, 455, + + 459, 459, 459, 66, 496, 775, 66, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 501, 69, 69, 69, 69, 69, 99, 99, 99, - 100, 100, 100, 101, 101, 101, 505, 102, 102, 102, - 105, 105, 105, 99, 503, 1559, 100, 490, 1560, 101, - 1562, 69, 69, 102, 495, 510, 105, 69, 429, 429, - 429, 439, 439, 439, 443, 443, 443, 451, 451, 451, - 495, 510, 69, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 505, 70, - 70, 70, 70, 70, 106, 106, 106, 107, 107, 107, - 108, 108, 108, 521, 109, 109, 109, 110, 110, 110, - - 106, 1096, 526, 107, 452, 1096, 108, 1417, 70, 70, - 109, 452, 463, 110, 70, 454, 454, 454, 526, 463, - 452, 462, 462, 462, 465, 465, 465, 1417, 463, 70, - 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, - 79, 79, 79, 79, 79, 521, 79, 79, 79, 79, - 79, 111, 111, 111, 112, 112, 112, 115, 115, 115, - 583, 116, 116, 116, 119, 119, 119, 111, 537, 551, - 112, 474, 563, 115, 1563, 79, 79, 116, 474, 79, - 119, 473, 473, 473, 537, 551, 79, 474, 563, 79, - 476, 476, 476, 79, 1564, 79, 79, 80, 80, 80, - - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 583, 80, 80, 80, 80, 80, 120, 120, - 120, 121, 121, 121, 122, 122, 122, 670, 123, 123, - 123, 124, 124, 124, 120, 574, 588, 121, 489, 603, - 122, 670, 80, 80, 123, 489, 80, 124, 488, 488, - 488, 574, 588, 80, 489, 603, 80, 492, 492, 492, - 80, 1565, 80, 80, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 93, 1568, 93, 93, 93, 93, 93, 125, - 125, 125, 126, 126, 126, 129, 129, 129, 1569, 130, - 130, 130, 131, 131, 131, 125, 614, 1570, 126, 1572, - 650, 129, 598, 93, 93, 130, 1575, 650, 131, 499, - 499, 499, 614, 650, 93, 94, 94, 94, 94, 94, - - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 1584, 94, 94, 94, 94, 94, 132, 132, 132, 133, - 133, 133, 134, 134, 134, 1587, 135, 135, 135, 136, - 136, 136, 132, 502, 598, 133, 1595, 654, 134, 541, - 94, 94, 135, 541, 654, 136, 502, 541, 502, 280, - 654, 94, 103, 103, 103, 103, 103, 103, 103, 103, - 103, 103, 103, 103, 103, 103, 103, 1597, 103, 103, - 103, 103, 103, 139, 139, 139, 140, 140, 140, 143, - 143, 143, 645, 144, 144, 144, 1599, 280, 1600, 139, - 792, 862, 140, 645, 1229, 143, 645, 103, 103, 144, - - 103, 280, 103, 280, 792, 280, 1229, 862, 103, 507, - 507, 507, 518, 518, 518, 103, 500, 888, 103, 104, + 69, 69, 527, 69, 69, 69, 69, 69, 95, 95, + 95, 96, 96, 96, 97, 97, 97, 586, 527, 98, + 98, 98, 724, 1639, 95, 533, 770, 96, 1640, 724, + 97, 1641, 533, 69, 69, 98, 101, 101, 101, 69, + 770, 533, 69, 466, 466, 466, 470, 470, 470, 481, + 481, 481, 101, 1642, 69, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 538, 70, 70, 70, 70, 70, 102, 102, 102, 105, + + 105, 105, 106, 106, 106, 765, 538, 107, 107, 107, + 1643, 1644, 102, 544, 1646, 105, 765, 779, 106, 765, + 544, 70, 70, 107, 108, 108, 108, 70, 601, 544, + 70, 486, 486, 486, 495, 495, 495, 498, 498, 498, + 108, 779, 70, 79, 79, 79, 79, 79, 79, 79, + 79, 79, 79, 79, 79, 79, 79, 79, 549, 79, + 79, 79, 79, 79, 109, 109, 109, 110, 110, 110, + 111, 111, 111, 623, 549, 112, 112, 112, 1648, 1649, + 109, 601, 1651, 110, 1652, 1654, 111, 1655, 623, 79, + 79, 112, 115, 115, 115, 79, 505, 505, 505, 510, + + 510, 510, 520, 520, 520, 524, 524, 524, 115, 1656, + 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 560, 80, 80, 80, + 80, 80, 116, 116, 116, 117, 117, 117, 118, 118, + 118, 777, 560, 119, 119, 119, 1657, 1660, 116, 1661, + 1662, 117, 1663, 1664, 118, 777, 638, 80, 80, 119, + 120, 120, 120, 80, 532, 532, 532, 535, 535, 535, + 543, 543, 543, 546, 546, 546, 120, 1666, 80, 89, + 89, 89, 89, 89, 89, 89, 89, 89, 89, 89, + 89, 89, 89, 89, 576, 89, 89, 89, 89, 89, + + 121, 121, 121, 122, 122, 122, 125, 125, 125, 638, + 576, 126, 126, 126, 1669, 1670, 121, 555, 780, 122, + 1671, 1673, 125, 1675, 555, 89, 89, 126, 127, 127, + 127, 89, 780, 555, 89, 554, 554, 554, 557, 557, + 557, 569, 569, 569, 127, 1679, 89, 90, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 591, 90, 90, 90, 90, 90, 128, 128, + 128, 129, 129, 129, 130, 130, 130, 1420, 591, 131, + 131, 131, 1680, 1684, 128, 570, 1687, 129, 1690, 1420, + 130, 571, 570, 90, 90, 131, 132, 132, 132, 90, + + 663, 570, 90, 573, 573, 573, 678, 571, 580, 580, + 580, 332, 132, 1691, 90, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 606, 99, 99, 99, 99, 99, 135, 135, 135, 136, + 136, 136, 139, 139, 139, 715, 606, 140, 140, 140, + 332, 571, 135, 663, 583, 136, 730, 617, 139, 678, + 728, 99, 99, 140, 332, 99, 332, 583, 332, 583, + 1692, 730, 99, 617, 1694, 99, 588, 588, 588, 99, + 1697, 99, 99, 100, 100, 100, 100, 100, 100, 100, + 100, 100, 100, 100, 100, 100, 100, 100, 715, 100, + + 100, 100, 100, 100, 141, 141, 141, 142, 142, 142, + 143, 143, 143, 728, 621, 144, 144, 144, 621, 1698, + 141, 1703, 621, 142, 1704, 612, 143, 750, 1628, 100, + 100, 144, 612, 100, 599, 599, 599, 603, 603, 603, + 100, 612, 750, 100, 611, 611, 611, 100, 1628, 100, + 100, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 631, 103, 103, 103, + 103, 103, 145, 145, 145, 146, 146, 146, 149, 149, + 149, 797, 631, 150, 150, 150, 1719, 1720, 145, 1728, + 1729, 146, 916, 626, 149, 1731, 797, 103, 103, 150, + + 626, 103, 103, 614, 614, 614, 637, 916, 103, 626, + 1753, 103, 625, 625, 625, 103, 1754, 103, 103, 103, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, - 104, 104, 104, 104, 888, 104, 104, 104, 104, 104, - 147, 147, 147, 148, 148, 148, 151, 151, 151, 657, - 152, 152, 152, 1601, 1603, 500, 147, 980, 1608, 148, - 657, 1611, 151, 657, 104, 104, 152, 104, 500, 104, - 500, 523, 523, 523, 980, 104, 531, 531, 531, 534, - 534, 534, 104, 1612, 1079, 104, 113, 113, 113, 113, + 104, 104, 104, 104, 104, 643, 104, 104, 104, 104, + 104, 151, 151, 151, 152, 152, 152, 153, 153, 153, + 917, 643, 154, 154, 154, 637, 1757, 151, 1027, 637, + 152, 917, 649, 153, 917, 919, 104, 104, 154, 649, + 104, 104, 628, 628, 628, 1027, 1759, 104, 649, 919, + 104, 636, 636, 636, 104, 1761, 104, 104, 104, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, - 113, 1079, 113, 113, 113, 113, 113, 153, 153, 153, - 154, 154, 154, 157, 157, 157, 1614, 158, 158, 158, - 159, 159, 159, 153, 1620, 1623, 154, 532, 546, 157, - 1626, 113, 113, 158, 532, 546, 159, 113, 545, 545, - 545, 1627, 113, 532, 546, 548, 548, 548, 556, 556, - 556, 560, 560, 560, 113, 114, 114, 114, 114, 114, + 113, 113, 113, 113, 654, 113, 113, 113, 113, 113, + 155, 155, 155, 156, 156, 156, 159, 159, 159, 1769, + 654, 160, 160, 160, 1770, 1771, 155, 1772, 668, 156, + 1774, 1780, 159, 727, 1782, 113, 113, 160, 640, 640, + 640, 648, 648, 648, 668, 581, 113, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, 114, - 1628, 114, 114, 114, 114, 114, 160, 160, 160, 161, - 161, 161, 162, 162, 162, 1629, 163, 163, 163, 164, - 164, 164, 160, 1630, 1631, 161, 569, 661, 162, 1632, - - 114, 114, 163, 569, 661, 164, 114, 568, 568, 568, - 661, 114, 569, 571, 571, 571, 581, 581, 581, 585, - 585, 585, 1633, 114, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 117, 117, 117, 117, 1635, - 117, 117, 117, 117, 117, 165, 165, 165, 166, 166, - 166, 167, 167, 167, 790, 168, 168, 168, 169, 169, - 169, 165, 793, 1636, 166, 790, 1638, 167, 790, 117, - 117, 168, 1639, 793, 169, 1642, 793, 117, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 1643, 118, 118, 118, 118, 118, 170, - - 170, 170, 171, 171, 171, 172, 172, 172, 1645, 173, - 173, 173, 174, 174, 174, 170, 1133, 1326, 171, 1647, - 1650, 172, 1619, 118, 118, 173, 1651, 1652, 174, 1133, - 1326, 118, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 1619, 127, 127, - 127, 127, 127, 175, 175, 175, 176, 176, 176, 179, - 179, 179, 1653, 180, 180, 180, 181, 181, 181, 175, - 1654, 1656, 176, 608, 1657, 179, 1661, 127, 127, 180, - 608, 127, 181, 595, 595, 595, 1669, 1673, 127, 608, - 1674, 127, 600, 600, 600, 611, 611, 611, 127, 128, - - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 1706, 128, 128, 128, 128, 128, - 182, 182, 182, 183, 183, 183, 184, 184, 184, 1707, - 185, 185, 185, 186, 186, 186, 182, 1714, 1725, 183, - 621, 1726, 184, 1727, 128, 128, 185, 621, 128, 186, - 620, 620, 620, 1728, 1730, 128, 621, 1738, 128, 622, - 622, 622, 631, 631, 631, 128, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 1740, 137, 137, 137, 137, 137, 189, 189, 189, - 190, 190, 190, 193, 193, 193, 1744, 194, 194, 194, - - 197, 197, 197, 189, 1747, 1749, 190, 667, 1750, 193, - 1752, 137, 137, 194, 667, 1753, 197, 137, 1754, 1755, - 667, 631, 137, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 1759, 138, - 138, 138, 138, 138, 198, 198, 198, 199, 199, 199, - 200, 200, 200, 1760, 201, 201, 201, 202, 202, 202, - 198, 1761, 1763, 199, 791, 794, 200, 1767, 138, 138, - 201, 791, 794, 202, 138, 1771, 1775, 791, 794, 138, - 141, 141, 141, 141, 141, 141, 141, 141, 141, 141, - 141, 141, 141, 141, 141, 1777, 141, 141, 141, 141, - - 141, 203, 203, 203, 204, 204, 204, 207, 207, 207, - 1779, 208, 208, 208, 211, 211, 211, 203, 948, 1785, - 204, 1792, 1796, 207, 1797, 141, 141, 208, 948, 1799, - 211, 212, 212, 212, 1811, 948, 141, 865, 865, 865, - 1812, 865, 1113, 1113, 1113, 1813, 1815, 212, 1806, 141, - 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 1806, 142, 142, 142, 142, - 142, 213, 213, 213, 214, 214, 214, 215, 215, 215, - 1808, 216, 216, 216, 217, 217, 217, 213, 1801, 1814, - 214, 1816, 1818, 215, 1801, 142, 142, 216, 1801, 1819, - - 217, 218, 218, 218, 1801, 1814, 142, 874, 874, 874, - 1820, 874, 1821, 1808, 874, 1823, 1807, 218, 1824, 142, - 145, 145, 145, 145, 145, 145, 145, 145, 145, 145, - 145, 145, 145, 145, 145, 1828, 145, 145, 145, 145, - 145, 221, 221, 221, 222, 222, 222, 223, 223, 223, - 1830, 224, 224, 224, 225, 225, 225, 221, 1807, 1831, - 222, 1832, 1834, 223, 1835, 145, 145, 224, 1836, 1833, - 225, 1134, 1134, 1134, 1433, 1433, 1433, 1837, 878, 878, - 878, 145, 897, 897, 897, 1833, 145, 146, 146, 146, - 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - - 146, 146, 1840, 146, 146, 146, 146, 146, 226, 226, - 226, 227, 227, 227, 228, 228, 228, 1438, 1438, 1438, - 1433, 639, 639, 639, 226, 1842, 1847, 227, 1849, 1854, - 228, 1877, 146, 146, 231, 231, 232, 232, 639, 231, - 425, 232, 878, 909, 909, 909, 897, 1878, 146, 231, - 425, 232, 1879, 146, 149, 149, 149, 149, 149, 149, - 149, 149, 149, 149, 149, 149, 149, 149, 149, 1883, - 149, 149, 149, 149, 149, 235, 235, 235, 231, 425, - 232, 236, 236, 236, 1884, 425, 1890, 1891, 686, 686, - 686, 235, 425, 876, 876, 876, 425, 236, 279, 149, - - 149, 1894, 149, 149, 149, 686, 1895, 909, 279, 1901, - 149, 876, 1907, 149, 991, 991, 991, 1441, 1441, 1441, - 149, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 150, 150, 150, 279, 150, 150, 150, - 150, 150, 702, 702, 702, 703, 703, 703, 1909, 1910, - 279, 1913, 279, 1919, 279, 713, 713, 713, 1921, 702, - 1927, 1931, 703, 916, 916, 916, 150, 150, 1934, 150, - 150, 150, 713, 1446, 1446, 1446, 1938, 150, 991, 1940, - 150, 916, 1435, 1435, 1435, 1941, 1942, 150, 155, 155, - 155, 155, 155, 155, 155, 155, 155, 155, 155, 155, - - 155, 155, 155, 1943, 155, 155, 155, 155, 155, 715, - 715, 715, 729, 729, 729, 735, 735, 735, 744, 744, - 744, 745, 745, 745, 1945, 1951, 715, 1953, 1435, 729, - 1955, 1957, 735, 155, 155, 744, 1970, 1971, 745, 755, - 755, 755, 924, 924, 924, 1972, 924, 1975, 1976, 924, - 1978, 1452, 1452, 1452, 1979, 1980, 755, 155, 156, 156, - 156, 156, 156, 156, 156, 156, 156, 156, 156, 156, - 156, 156, 156, 1982, 156, 156, 156, 156, 156, 763, - 763, 763, 767, 767, 767, 780, 780, 780, 806, 806, - 806, 812, 812, 812, 1987, 1993, 763, 1452, 1977, 767, - - 1987, 1994, 780, 156, 156, 806, 1977, 1981, 812, 829, - 829, 829, 938, 938, 938, 1981, 938, 1995, 1989, 938, - 1996, 1454, 1454, 1454, 2000, 2002, 829, 156, 177, 177, - 177, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 2003, 177, 177, 177, 177, 177, 835, - 835, 835, 841, 841, 841, 849, 849, 849, 873, 873, - 873, 912, 912, 912, 1989, 2004, 835, 1454, 2009, 841, - 2011, 2012, 849, 177, 177, 873, 2013, 2016, 912, 1988, - 2020, 177, 2027, 177, 2029, 2031, 177, 1455, 1455, 1455, - 177, 1634, 1634, 1634, 177, 178, 178, 178, 178, 178, - - 178, 178, 178, 178, 178, 178, 178, 178, 178, 178, - 1988, 178, 178, 178, 178, 178, 2055, 877, 877, 877, - 914, 914, 914, 2056, 920, 920, 920, 913, 913, 913, - 915, 915, 915, 1802, 2057, 877, 2063, 914, 2064, 1802, - 178, 178, 920, 1802, 913, 2068, 2072, 915, 178, 1802, - 178, 2073, 2077, 178, 877, 2080, 2083, 178, 1637, 1637, - 1637, 178, 187, 187, 187, 187, 187, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 913, 187, 187, - 187, 187, 187, 917, 917, 917, 923, 923, 923, 915, - 2084, 2085, 913, 921, 921, 921, 926, 926, 926, 2086, - - 2089, 917, 2092, 923, 928, 928, 928, 187, 187, 2096, - 2097, 921, 2098, 2110, 926, 940, 940, 940, 187, 940, - 917, 928, 940, 950, 950, 950, 2111, 950, 2114, 2116, - 950, 187, 188, 188, 188, 188, 188, 188, 188, 188, - 188, 188, 188, 188, 188, 188, 188, 2119, 188, 188, - 188, 188, 188, 927, 927, 927, 2126, 921, 930, 930, - 930, 931, 931, 931, 932, 932, 932, 929, 929, 929, - 2133, 927, 933, 933, 933, 930, 2135, 188, 188, 931, - 2136, 2137, 932, 2142, 929, 1640, 1640, 1640, 188, 933, - 953, 953, 953, 2143, 953, 2144, 2145, 953, 2146, 2147, - - 927, 188, 191, 191, 191, 191, 191, 191, 191, 191, - 191, 191, 191, 191, 191, 191, 191, 929, 191, 191, - 191, 191, 191, 934, 934, 934, 935, 935, 935, 937, - 937, 937, 929, 2148, 2149, 932, 936, 936, 936, 2150, - 934, 946, 946, 946, 935, 2151, 937, 191, 191, 939, - 939, 939, 2162, 2163, 936, 2154, 191, 2166, 191, 946, - 2169, 2173, 191, 1641, 1641, 1641, 939, 191, 191, 192, - 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 192, 192, 2174, 192, 192, 192, 192, 192, - 2177, 941, 941, 941, 2178, 949, 949, 949, 2154, 942, - - 942, 942, 943, 943, 943, 2181, 2184, 936, 941, 944, - 944, 944, 949, 2185, 192, 192, 942, 2186, 2201, 943, - 967, 967, 967, 192, 967, 192, 944, 967, 2155, 192, - 1471, 1471, 1471, 2202, 192, 192, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, - 195, 942, 195, 195, 195, 195, 195, 943, 2208, 2209, - 944, 2215, 2216, 952, 952, 952, 945, 945, 945, 954, - 954, 954, 964, 964, 964, 2155, 1471, 947, 947, 947, - 952, 195, 195, 945, 2217, 2231, 954, 195, 2203, 2232, - 964, 2233, 974, 974, 974, 947, 974, 2254, 2203, 974, - - 2255, 2261, 195, 196, 196, 196, 196, 196, 196, 196, - 196, 196, 196, 196, 196, 196, 196, 196, 945, 196, - 196, 196, 196, 196, 947, 2266, 2268, 965, 965, 965, - 966, 966, 966, 968, 968, 968, 2269, 969, 969, 969, - 973, 973, 973, 2274, 2275, 965, 2276, 966, 196, 196, - 2277, 968, 2278, 2279, 196, 969, 2280, 973, 983, 983, - 983, 2281, 983, 2282, 2283, 983, 1644, 1644, 1644, 196, - 205, 205, 205, 205, 205, 205, 205, 205, 205, 205, - 205, 205, 205, 205, 205, 965, 205, 205, 205, 205, - 205, 978, 978, 978, 979, 979, 979, 2288, 969, 2289, - - 982, 982, 982, 2291, 984, 984, 984, 2157, 2157, 978, - 2157, 2292, 979, 2293, 2294, 205, 205, 982, 2157, 2296, - 205, 984, 1649, 1649, 1649, 2157, 205, 206, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 2287, 206, 206, 206, 206, 206, 2286, 985, - 985, 985, 2297, 985, 2300, 979, 985, 986, 986, 986, - 987, 987, 987, 989, 989, 989, 2301, 994, 994, 994, - 2304, 994, 206, 206, 994, 986, 2306, 206, 987, 2287, - 2286, 989, 2307, 206, 209, 209, 209, 209, 209, 209, - 209, 209, 209, 209, 209, 209, 209, 209, 209, 2309, - - 209, 209, 209, 209, 209, 2310, 2312, 990, 990, 990, - 993, 993, 993, 998, 998, 998, 2313, 2290, 999, 999, - 999, 987, 1001, 1001, 1001, 990, 2290, 993, 2295, 209, - 209, 998, 209, 2314, 209, 2326, 999, 2295, 2327, 1001, - 209, 1002, 1002, 1002, 2328, 1002, 2329, 2332, 1002, 2333, - 2339, 209, 210, 210, 210, 210, 210, 210, 210, 210, - 210, 210, 210, 210, 210, 210, 210, 990, 210, 210, - 210, 210, 210, 999, 1003, 1003, 1003, 1005, 1005, 1005, - 2340, 1008, 1008, 1008, 2347, 2348, 1004, 1004, 1004, 1006, - 1006, 1006, 1003, 1006, 1005, 2349, 1006, 210, 210, 1008, - - 210, 2357, 210, 2358, 1004, 1018, 1018, 1018, 210, 1018, - 2375, 2376, 1018, 1648, 1648, 1648, 1655, 1655, 1655, 210, - 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 219, 219, 2377, 219, 219, 219, 219, - 219, 1004, 1012, 1012, 1012, 1017, 1017, 1017, 2380, 1009, - 1009, 1009, 2382, 1013, 1013, 1013, 1019, 1019, 1019, 1648, - 1012, 2383, 1017, 2384, 2385, 219, 219, 1009, 2386, 2387, - 219, 1013, 2388, 1019, 2389, 2390, 219, 1040, 1040, 1040, - 219, 1040, 2391, 2392, 1040, 2393, 219, 220, 220, 220, - 220, 220, 220, 220, 220, 220, 220, 220, 220, 220, - - 220, 220, 2398, 220, 220, 220, 220, 220, 2399, 2395, - 1009, 1022, 1022, 1022, 1013, 1658, 1658, 1658, 1023, 1023, - 1023, 1026, 1026, 1026, 1027, 1027, 1027, 2400, 2401, 1022, - 2402, 2403, 220, 220, 2404, 2405, 1023, 220, 2397, 1026, - 2406, 2407, 1027, 220, 1046, 1046, 1046, 220, 1046, 2395, - 2408, 1046, 2409, 220, 229, 229, 229, 229, 229, 229, - 229, 229, 229, 229, 229, 229, 229, 229, 229, 1023, - 229, 229, 229, 229, 229, 1036, 1036, 1036, 1037, 1037, - 1037, 2397, 1027, 2410, 1039, 1039, 1039, 1042, 1042, 1042, - 1043, 1043, 1043, 1036, 2411, 2414, 1037, 2415, 2416, 229, - - 229, 1039, 1062, 1062, 1062, 1042, 1062, 229, 1043, 1062, - 229, 2417, 1646, 1646, 1646, 2419, 2420, 229, 230, 230, - 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, - 230, 230, 230, 2431, 230, 230, 230, 230, 230, 1045, - 1045, 1045, 1037, 1047, 1047, 1047, 2432, 2434, 1049, 1049, - 1049, 1053, 1053, 1053, 1043, 2438, 1045, 1054, 1054, 1054, - 1047, 2439, 2440, 230, 230, 1049, 1068, 1068, 1068, 1053, - 1068, 230, 2442, 1068, 230, 1054, 1646, 1659, 1659, 1659, - 2443, 230, 233, 233, 233, 233, 233, 233, 233, 233, - 233, 233, 233, 233, 233, 233, 233, 2445, 233, 233, - - 233, 233, 233, 2446, 1054, 1055, 1055, 1055, 1056, 1056, - 1056, 2396, 1057, 1057, 1057, 1058, 1058, 1058, 1059, 1059, - 1059, 2454, 1055, 2455, 2441, 1056, 2456, 233, 233, 1057, - 1061, 1061, 1061, 1058, 233, 2441, 1059, 1074, 1074, 1074, - 233, 1074, 2468, 2487, 1074, 2488, 2492, 1061, 2396, 233, - 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, - 234, 234, 234, 234, 234, 2493, 234, 234, 234, 234, - 234, 1057, 1063, 1063, 1063, 1064, 1064, 1064, 2444, 1059, - 1067, 1067, 1067, 1070, 1070, 1070, 1071, 1071, 1071, 2444, - 1063, 2494, 2495, 1064, 2496, 234, 234, 1067, 1073, 1073, - - 1073, 1070, 234, 2497, 1071, 1077, 1077, 1077, 234, 1078, - 1078, 1078, 1081, 1081, 1081, 1073, 2498, 234, 276, 1662, - 1662, 1662, 2499, 1077, 2500, 276, 2501, 1078, 2503, 1081, - 1085, 1085, 1085, 2506, 276, 276, 1064, 1082, 1082, 1082, - 2507, 1082, 2508, 2509, 1082, 1716, 1716, 1716, 1085, 1086, - 1086, 1086, 1071, 1091, 1091, 1091, 2460, 2503, 1092, 1092, - 1092, 2510, 276, 276, 276, 1662, 2460, 1086, 2504, 276, - 276, 1091, 2460, 276, 276, 1078, 1092, 276, 2511, 276, - 276, 276, 278, 1105, 1105, 1105, 2512, 1105, 2513, 2514, - 1105, 1109, 1109, 1109, 1110, 1110, 1110, 2515, 278, 278, - - 1112, 1112, 1112, 1149, 1149, 1149, 1153, 1153, 1153, 1109, - 2504, 2482, 1110, 1086, 1156, 1156, 1156, 2505, 1112, 2516, - 1149, 2482, 1092, 1153, 2482, 2517, 278, 278, 278, 1817, - 1817, 1817, 1156, 278, 278, 2518, 2521, 278, 278, 2483, - 2522, 278, 2523, 278, 278, 278, 1150, 1150, 1150, 2483, - 1150, 2525, 2483, 1150, 1154, 1154, 1154, 2526, 1154, 2505, - 2531, 1154, 1157, 1157, 1157, 1159, 1159, 1159, 1162, 1162, - 1162, 1163, 1163, 1163, 1165, 1165, 1165, 1167, 1167, 1167, - 1157, 1167, 2536, 1159, 1167, 2537, 1162, 2538, 2539, 1163, - 2540, 2541, 1165, 1171, 1171, 1171, 1172, 1172, 1172, 1174, - - 1174, 1174, 1175, 1175, 1175, 1176, 1176, 1176, 2335, 1176, - 2335, 1171, 1176, 2542, 1172, 2543, 2544, 1174, 2545, 1175, - 1179, 1179, 1179, 2335, 1180, 1180, 1180, 1165, 1180, 1159, - 2546, 1180, 1181, 1181, 1181, 2554, 2556, 1179, 1182, 1182, - 1182, 1184, 1184, 1184, 1185, 1185, 1185, 2560, 1174, 2561, - 1181, 1186, 1186, 1186, 2562, 1186, 1182, 2563, 1186, 1184, - 2564, 1185, 1187, 1187, 1187, 1188, 1188, 1188, 2565, 1188, - 2567, 2579, 1188, 1189, 1189, 1189, 1190, 1190, 1190, 1187, - 1192, 1192, 1192, 1193, 1193, 1193, 2336, 1193, 2336, 2580, - 1193, 1189, 2582, 2583, 1190, 1196, 1196, 1196, 1192, 1196, - - 2574, 2336, 1196, 1184, 1199, 1199, 1199, 1200, 1200, 1200, - 2596, 1200, 2597, 2574, 1200, 1205, 1205, 1205, 1206, 1206, - 1206, 1199, 1208, 1208, 1208, 1212, 1212, 1212, 2575, 1212, - 2598, 2599, 1212, 1205, 2601, 2581, 1206, 1215, 1215, 1215, - 1208, 2575, 1192, 1216, 1216, 1216, 2602, 1216, 2581, 2603, - 1216, 1219, 1219, 1219, 1215, 1220, 1220, 1220, 2604, 1220, - 2607, 2610, 1220, 1230, 1230, 1230, 2158, 2158, 1219, 2158, - 1208, 1231, 1231, 1231, 1233, 1233, 1233, 2158, 1234, 1234, - 1234, 1230, 1234, 2611, 2158, 1234, 1237, 1237, 1237, 1231, - 2584, 2612, 1233, 1238, 1238, 1238, 1240, 1240, 1240, 1243, - - 1243, 1243, 2613, 2584, 1237, 1244, 1244, 1244, 2607, 1244, - 2614, 1238, 1244, 2608, 1240, 2615, 1243, 1250, 1250, 1250, - 1251, 1251, 1251, 2461, 1253, 1253, 1253, 1255, 1255, 1255, - 1256, 1256, 1256, 2461, 1256, 1250, 2616, 1256, 1251, 2461, - 2617, 1233, 1253, 2618, 1255, 1259, 1259, 1259, 2608, 1259, - 2619, 2620, 1259, 1262, 1262, 1262, 1240, 1263, 1263, 1263, - 1265, 1265, 1265, 1266, 1266, 1266, 1267, 1267, 1267, 2621, - 2622, 1262, 1268, 1268, 1268, 1263, 2625, 2626, 1265, 2629, - 1266, 1270, 1270, 1270, 1267, 1278, 1278, 1278, 2635, 1253, - 1268, 1272, 1272, 1272, 2643, 1272, 2644, 2645, 1272, 1270, - - 1279, 1279, 1279, 1278, 1281, 1281, 1281, 1283, 1283, 1283, - 2646, 1283, 2647, 2631, 1283, 1286, 1286, 1286, 1279, 1287, - 1287, 1287, 1281, 2631, 2648, 1265, 1289, 1289, 1289, 2632, - 1270, 2649, 2650, 1286, 1290, 1290, 1290, 1287, 1290, 2632, - 2651, 1290, 2652, 2653, 1289, 1294, 1294, 1294, 1295, 1295, - 1295, 1297, 1297, 1297, 1298, 1298, 1298, 1299, 1299, 1299, - 1300, 1300, 1300, 1294, 1281, 2657, 1295, 2660, 2661, 1297, - 2662, 1298, 2663, 2664, 1299, 1301, 1301, 1301, 1300, 1303, - 1303, 1303, 2665, 1308, 1308, 1308, 1289, 1308, 2666, 2669, - 1308, 2673, 2674, 1301, 1311, 1311, 1311, 1303, 1312, 1312, - - 1312, 1297, 1312, 2675, 1299, 1312, 1315, 1315, 1315, 2676, - 2677, 1311, 1316, 1316, 1316, 1318, 1318, 1318, 1321, 1321, - 1321, 1322, 1322, 1322, 1315, 1324, 1324, 1324, 2678, 2679, - 1316, 2680, 2681, 1318, 2682, 2683, 1321, 2684, 2700, 1322, - 1329, 1329, 1329, 1324, 2701, 2702, 1303, 1333, 1333, 1333, - 1334, 1334, 1334, 1336, 1336, 1336, 2703, 1329, 2704, 2687, - 1338, 1338, 1338, 2705, 1338, 1333, 1318, 1338, 1334, 2687, - 2706, 1336, 1324, 1342, 1342, 1342, 1343, 1343, 1343, 1345, - 1345, 1345, 1347, 1347, 1347, 2688, 1347, 2707, 2713, 1347, - 2714, 1342, 2715, 2718, 1343, 2688, 2719, 1345, 1350, 1350, - - 1350, 1351, 1351, 1351, 2720, 1351, 2721, 2724, 1351, 1352, - 1352, 1352, 2731, 2732, 1336, 1350, 1353, 1353, 1353, 2733, - 1354, 1354, 1354, 2709, 1354, 2734, 1352, 1354, 1356, 1356, - 1356, 2738, 2746, 1353, 1358, 1358, 1358, 1359, 1359, 1359, - 1345, 1361, 1361, 1361, 2747, 1356, 1362, 1362, 1362, 1363, - 1363, 1363, 1358, 1363, 2748, 1359, 1363, 2709, 2749, 1361, - 1364, 1364, 1364, 1362, 1365, 1365, 1365, 2750, 1365, 2751, - 2752, 1365, 1367, 1367, 1367, 2753, 2754, 1364, 1368, 1368, - 1368, 1370, 1370, 1370, 1372, 1372, 1372, 2755, 1372, 2761, - 1367, 1372, 1375, 1375, 1375, 2762, 1368, 2764, 2765, 1370, - - 2767, 1361, 1376, 1376, 1376, 1378, 1378, 1378, 2768, 2769, - 1375, 1381, 1381, 1381, 2770, 1381, 2771, 2772, 1381, 2773, - 1376, 2774, 2775, 1378, 1385, 1385, 1385, 1386, 1386, 1386, - 2776, 1388, 1388, 1388, 1390, 1390, 1390, 2777, 1390, 2778, - 2779, 1390, 1385, 2782, 2783, 1386, 2784, 2785, 1370, 1388, - 1394, 1394, 1394, 1395, 1395, 1395, 1396, 1396, 1396, 1398, - 1398, 1398, 1400, 1400, 1400, 2793, 2794, 1394, 1404, 1404, - 1404, 1395, 1378, 2796, 1396, 2797, 2798, 1398, 2800, 1400, - 1401, 1401, 1401, 2808, 1401, 1404, 2809, 1401, 1406, 1406, - 1406, 2811, 1388, 1407, 1407, 1407, 1409, 1409, 1409, 1411, - - 1411, 1411, 2812, 1413, 1413, 1413, 1406, 1414, 1414, 1414, - 2813, 1407, 2815, 2820, 1409, 2821, 1411, 1416, 1416, 1416, - 1398, 1413, 1418, 1418, 1418, 1414, 1424, 1424, 1424, 1404, - 1461, 1461, 1461, 2802, 1461, 1416, 2822, 1461, 2823, 2825, - 1418, 1418, 2829, 1409, 1424, 1466, 1466, 1466, 2830, 1466, - 2832, 2833, 1466, 1470, 1470, 1470, 1472, 1472, 1472, 1473, - 1473, 1473, 2834, 2836, 1416, 1476, 1476, 1476, 1477, 1477, - 1477, 1470, 1477, 1472, 2837, 1477, 2802, 1473, 1482, 1482, - 1482, 2842, 1482, 1476, 2843, 1482, 1485, 1485, 1485, 1486, - 1486, 1486, 2844, 1486, 2845, 2846, 1486, 2847, 1489, 1489, - - 1489, 2848, 1489, 2849, 1485, 1489, 1492, 1492, 1492, 1493, - 1493, 1493, 2850, 1493, 1470, 2851, 1493, 1498, 1498, 1498, - 2852, 2853, 1476, 2854, 1492, 2855, 1473, 1500, 1500, 1500, - 1501, 1501, 1501, 1485, 1498, 1502, 1502, 1502, 1503, 1503, - 1503, 1504, 1504, 1504, 2856, 1500, 2857, 1501, 1509, 1509, - 1509, 2858, 1502, 1492, 2862, 1503, 2863, 2864, 1504, 1505, - 1505, 1505, 2865, 1505, 2868, 1509, 1505, 1506, 1506, 1506, - 2869, 1506, 2870, 2871, 1506, 1510, 1510, 1510, 1511, 1511, - 1511, 2872, 1500, 2873, 2882, 1503, 1512, 1512, 1512, 1513, - 1513, 1513, 1510, 2875, 2878, 1511, 1514, 1514, 1514, 1509, - - 2883, 1502, 2885, 1512, 2886, 2878, 1513, 1515, 1515, 1515, - 1516, 1516, 1516, 1514, 1517, 1517, 1517, 1518, 1518, 1518, - 2888, 2877, 1510, 2890, 1515, 2893, 2899, 1516, 1519, 1519, - 1519, 1517, 2900, 1512, 1518, 2877, 1520, 1520, 1520, 2875, - 1523, 1523, 1523, 1524, 1524, 1524, 1519, 1524, 1511, 2902, - 1524, 2903, 2905, 1513, 1520, 2916, 1514, 1523, 1526, 1526, - 1526, 1528, 1528, 1528, 1530, 1530, 1530, 1531, 1531, 1531, - 2918, 1531, 2920, 2921, 1531, 1526, 1517, 2895, 1518, 1528, - 1516, 1530, 1532, 1532, 1532, 1533, 1533, 1533, 1520, 2895, - 1534, 1534, 1534, 1519, 1534, 2924, 2925, 1534, 2928, 2930, - - 1532, 2932, 1533, 1535, 1535, 1535, 1540, 1540, 1540, 2934, - 1542, 1542, 1542, 1543, 1543, 1543, 2935, 1544, 1544, 1544, - 2937, 1535, 2938, 2944, 1540, 2943, 2943, 1528, 1542, 2896, - 1543, 2945, 1545, 1545, 1545, 1544, 1546, 1546, 1546, 2910, - 1546, 2896, 2945, 1546, 1548, 1548, 1548, 2911, 1532, 1545, - 2941, 2910, 1550, 1550, 1550, 2946, 1556, 1556, 1556, 2911, - 2949, 1535, 1548, 1540, 1558, 1558, 1558, 1542, 1544, 1550, - 1553, 1553, 1553, 1556, 1553, 2942, 2950, 1553, 1561, 1561, - 1561, 2951, 1558, 1566, 1566, 1566, 1567, 1567, 1567, 2942, - 1567, 2941, 2955, 1567, 2952, 2956, 1561, 1571, 1571, 1571, - - 1566, 1573, 1573, 1573, 1548, 1574, 1574, 1574, 2957, 1576, - 1576, 1576, 2952, 1576, 2964, 1571, 1576, 2966, 1573, 1579, - 1579, 1579, 2970, 1574, 2958, 1580, 1580, 1580, 1558, 1580, - 2971, 2881, 1580, 1581, 1581, 1581, 1579, 1581, 2972, 2958, - 1581, 1585, 1585, 1585, 1561, 2963, 1571, 1586, 1586, 1586, - 2881, 1586, 2881, 2973, 1586, 1588, 1588, 1588, 1585, 1589, - 1589, 1589, 2976, 1589, 2963, 2881, 1589, 1574, 1592, 1592, - 1592, 2978, 1592, 1588, 2965, 1592, 1596, 1596, 1596, 1598, - 1598, 1598, 1602, 1602, 1602, 1604, 1604, 1604, 2980, 1605, - 1605, 1605, 2981, 2965, 1596, 2982, 2983, 1598, 2984, 2985, - - 1602, 2993, 1604, 2994, 2995, 1588, 1605, 1606, 1606, 1606, - 2997, 1606, 2998, 2975, 1606, 1607, 1607, 1607, 1609, 1609, - 1609, 1610, 1610, 1610, 2977, 1610, 2999, 3001, 1610, 1613, - 1613, 1613, 2975, 1607, 3002, 1609, 1615, 1615, 1615, 1617, - 1617, 1617, 1596, 2977, 3003, 1598, 1602, 1613, 1616, 1616, - 1616, 3004, 1616, 1615, 3006, 1616, 1617, 1618, 1618, 1618, - 3009, 3010, 1621, 1621, 1621, 1660, 1660, 1660, 1663, 1663, - 1663, 1664, 1664, 1664, 3011, 1618, 3012, 3013, 1613, 1607, - 1621, 1665, 1665, 1665, 1666, 1666, 1666, 1667, 1667, 1667, - 1668, 1668, 1668, 1670, 1670, 1670, 3014, 3015, 1665, 3016, - - 3017, 1666, 3018, 3021, 1667, 3022, 1618, 3023, 1668, 3024, - 1670, 3025, 3026, 1621, 1671, 1671, 1671, 3029, 1671, 3030, - 3031, 1671, 1672, 1672, 1672, 1675, 1675, 1675, 3032, 1660, - 1621, 3033, 1663, 3034, 3036, 1664, 1676, 1676, 1676, 3037, - 1672, 3038, 3039, 1675, 1677, 1677, 1677, 1678, 1678, 1678, - 3040, 1667, 3041, 1676, 1679, 1679, 1679, 1668, 1680, 1680, - 1680, 1677, 1681, 1681, 1681, 1678, 1682, 1682, 1682, 1685, - 1685, 1685, 1679, 1675, 3042, 1680, 1684, 1684, 1684, 1681, - 3043, 1672, 3044, 1682, 1683, 1683, 1683, 1685, 1683, 3048, - 3046, 1683, 3049, 1684, 1686, 1686, 1686, 1687, 1687, 1687, - - 3050, 1687, 3046, 3051, 1687, 1688, 1688, 1688, 1689, 1689, - 1689, 1686, 1678, 3052, 1690, 1690, 1690, 3053, 1690, 1679, - 1681, 1690, 1688, 3054, 3056, 1689, 1693, 1693, 1693, 1685, - 1694, 1694, 1694, 1695, 1695, 1695, 1696, 1696, 1696, 1697, - 1697, 1697, 3047, 1693, 1698, 1698, 1698, 1694, 3061, 2884, - 1695, 3062, 3063, 1696, 3047, 3064, 1697, 1699, 1699, 1699, - 3065, 1698, 1700, 1700, 1700, 2884, 1700, 2884, 3066, 1700, - 3070, 3071, 1689, 3073, 1699, 1701, 1701, 1701, 3075, 1694, - 2884, 1702, 1702, 1702, 3078, 1697, 1703, 1703, 1703, 3079, - 1693, 3076, 1701, 3080, 1696, 3081, 3082, 1698, 1702, 1704, - - 1704, 1704, 3083, 1703, 1705, 1705, 1705, 1708, 1708, 1708, - 3084, 1708, 3085, 3086, 1708, 3087, 3076, 1704, 1711, 1711, - 1711, 3088, 1705, 1712, 1712, 1712, 3089, 3090, 1702, 1713, - 1713, 1713, 3091, 1713, 3092, 1711, 1713, 3093, 3094, 1703, - 1712, 3095, 1715, 1715, 1715, 1717, 1717, 1717, 3098, 1717, - 3099, 3100, 1717, 1720, 1720, 1720, 1724, 1724, 1724, 1705, - 1715, 3101, 1721, 1721, 1721, 1704, 1721, 3102, 3103, 1721, - 3106, 1720, 3107, 3108, 1724, 1729, 1729, 1729, 1731, 1731, - 1731, 1732, 1732, 1732, 1733, 1733, 1733, 3109, 1733, 3110, - 3111, 1733, 3108, 1729, 3112, 3113, 1731, 3114, 1732, 1720, - - 1734, 1734, 1734, 1735, 1735, 1735, 3115, 1735, 3116, 3117, - 1735, 1739, 1739, 1739, 1741, 1741, 1741, 3118, 1734, 1743, - 1743, 1743, 3119, 1724, 1731, 3120, 1742, 1742, 1742, 1739, - 1742, 1741, 3121, 1742, 3122, 3123, 1743, 1745, 1745, 1745, - 1746, 1746, 1746, 3124, 1746, 3125, 3126, 1746, 1748, 1748, - 1748, 1751, 1751, 1751, 1745, 1756, 1756, 1756, 1734, 1756, - 3127, 3128, 1756, 1762, 1762, 1762, 1748, 3129, 3130, 1751, - 1764, 1764, 1764, 1766, 1766, 1766, 3131, 1739, 1765, 1765, - 1765, 1762, 1765, 3132, 3136, 1765, 3137, 1764, 1768, 1768, - 1768, 1766, 1768, 3139, 3140, 1768, 3141, 1772, 1772, 1772, - - 3143, 1772, 3135, 1751, 1772, 1776, 1776, 1776, 1778, 1778, - 1778, 1780, 1780, 1780, 1762, 1781, 1781, 1781, 1782, 1782, - 1782, 3144, 3135, 1776, 3145, 3146, 1778, 3147, 3148, 1780, - 3149, 3150, 1781, 3151, 3152, 1782, 1783, 1783, 1783, 1784, - 1784, 1784, 3153, 1786, 1786, 1786, 3154, 1787, 1787, 1787, - 3155, 1787, 3156, 1783, 1787, 3157, 3158, 1784, 3159, 1778, - 1786, 3161, 1780, 1788, 1788, 1788, 1776, 1788, 3162, 3164, - 1788, 1791, 1791, 1791, 1793, 1793, 1793, 3160, 1793, 3165, - 3167, 1793, 3168, 3160, 1782, 3169, 1784, 3170, 3171, 1791, - 1798, 1798, 1798, 1800, 1800, 1800, 3172, 1800, 3174, 3175, - - 1800, 3177, 1803, 1803, 1803, 1804, 1804, 1804, 1798, 1804, - 3178, 3180, 1804, 1805, 1805, 1805, 3181, 3184, 1791, 1803, - 1810, 1810, 1810, 1822, 1822, 1822, 1825, 1825, 1825, 3186, - 3188, 1805, 1826, 1826, 1826, 3189, 3190, 1810, 1827, 1827, - 1827, 1798, 1829, 1829, 1829, 1838, 1838, 1838, 1839, 1839, - 1839, 1841, 1841, 1841, 1843, 1843, 1843, 3191, 1844, 1844, - 1844, 3183, 1844, 3193, 1805, 1844, 1845, 1845, 1845, 3195, - 3197, 1843, 1846, 1846, 1846, 3183, 1846, 3199, 3201, 1846, - 1848, 1848, 1848, 1845, 1850, 1850, 1850, 3202, 1850, 3203, - 3204, 1850, 1853, 1853, 1853, 1855, 1855, 1855, 1848, 1856, - - 1856, 1856, 1857, 1857, 1857, 3205, 3206, 1858, 1858, 1858, - 1853, 1858, 1855, 3207, 1858, 3208, 3209, 1856, 3210, 1857, - 1859, 1859, 1859, 1860, 1860, 1860, 3214, 1860, 3216, 3218, - 1860, 1861, 1861, 1861, 1862, 1862, 1862, 1859, 1863, 1863, - 1863, 3219, 3220, 1853, 3221, 3238, 1848, 3230, 3222, 1861, - 3236, 1464, 1862, 3238, 3236, 1863, 3231, 1864, 1864, 1864, - 1856, 1864, 3223, 3232, 1864, 1865, 1865, 1865, 1866, 1866, - 1866, 1460, 1866, 3233, 1459, 1866, 1869, 1869, 1869, 1870, - 1870, 1870, 1865, 1870, 3222, 3234, 1870, 1871, 1871, 1871, - 1872, 1872, 1872, 1869, 1872, 3230, 1861, 1872, 3223, 1862, - - 1875, 1875, 1875, 3235, 3231, 1871, 1876, 1876, 1876, 3242, - 1876, 3232, 3244, 1876, 1880, 1880, 1880, 1875, 1881, 1881, - 1881, 3233, 1881, 3250, 3329, 1881, 1882, 1882, 1882, 3234, - 3245, 1880, 1885, 1885, 1885, 3329, 1885, 3248, 1871, 1885, - 1888, 1888, 1888, 1882, 1889, 1889, 1889, 3235, 1889, 3244, - 1458, 1889, 1892, 1892, 1892, 1457, 3242, 1888, 1893, 1893, - 1893, 1896, 1896, 1896, 1897, 1897, 1897, 3245, 1897, 3250, - 1892, 1897, 3248, 1898, 1898, 1898, 1893, 1898, 1896, 3246, - 1898, 1902, 1902, 1902, 1904, 1904, 1904, 1905, 1905, 1905, - 1906, 1906, 1906, 1908, 1908, 1908, 1911, 1911, 1911, 1902, - - 1914, 1914, 1914, 1892, 3239, 1905, 3243, 1456, 1906, 3237, - 1908, 1893, 3239, 3237, 1911, 1915, 1915, 1915, 1914, 1915, - 3246, 3260, 1915, 1918, 1918, 1918, 1920, 1920, 1920, 1922, - 1922, 1922, 3254, 1922, 3240, 3241, 1922, 3251, 1453, 1908, - 1906, 1918, 3240, 3241, 1920, 1905, 1925, 1925, 1925, 1914, - 1926, 1926, 1926, 3243, 1926, 3260, 3247, 1926, 1928, 1928, - 1928, 3252, 1928, 1925, 3254, 1928, 1932, 1932, 1932, 1918, - 1935, 1935, 1935, 1936, 1936, 1936, 1937, 1937, 1937, 1939, - 1939, 1939, 3249, 3251, 1932, 3261, 3262, 1935, 1944, 1944, - 1944, 1936, 1946, 1946, 1946, 3253, 1946, 3247, 3252, 1946, - - 1949, 1949, 1949, 1952, 1952, 1952, 1944, 1954, 1954, 1954, - 1956, 1956, 1956, 1958, 1958, 1958, 3263, 3249, 1949, 3261, - 1952, 1959, 1959, 1959, 3255, 1954, 3258, 3259, 1956, 3262, - 3266, 1958, 3253, 3264, 1936, 1960, 1960, 1960, 1959, 1960, - 3256, 1451, 1960, 1961, 1961, 1961, 1962, 1962, 1962, 3256, - 1963, 1963, 1963, 1944, 1963, 3257, 3255, 1963, 1450, 3263, - 1961, 3258, 3259, 1962, 3257, 3266, 1954, 1964, 1964, 1964, - 1965, 1965, 1965, 3280, 1966, 1966, 1966, 1958, 1966, 3264, - 3267, 1966, 1969, 1969, 1969, 1964, 1449, 1965, 3284, 1961, - 1973, 1973, 1973, 1974, 1974, 1974, 1448, 1983, 1983, 1983, - - 1969, 1983, 3280, 1447, 1983, 1986, 1986, 1986, 1973, 1445, - 1974, 1990, 1990, 1990, 1444, 3267, 1965, 1991, 1991, 1991, - 1964, 1991, 3284, 1986, 1991, 1992, 1992, 1992, 1990, 1997, - 1997, 1997, 1998, 1998, 1998, 1969, 1999, 1999, 1999, 2001, - 2001, 2001, 2005, 2005, 2005, 2006, 2006, 2006, 2007, 2007, - 2007, 1986, 2008, 2008, 2008, 2010, 2010, 2010, 2014, 2014, - 2014, 2015, 2015, 2015, 2017, 2017, 2017, 2018, 2018, 2018, - 2019, 2019, 2019, 2021, 2021, 2021, 3265, 2021, 3268, 3281, - 2021, 2024, 2024, 2024, 1443, 2024, 3272, 3269, 2024, 2028, - 2028, 2028, 2030, 2030, 2030, 2032, 2032, 2032, 2008, 2033, - - 2033, 2033, 3274, 2033, 3276, 3275, 2033, 2028, 3281, 3290, - 2030, 3268, 2032, 2034, 2034, 2034, 2019, 2035, 2035, 2035, - 3269, 2035, 3265, 3272, 2035, 2038, 2038, 2038, 3273, 2038, - 3270, 2034, 2038, 2041, 2041, 2041, 2042, 2042, 2042, 3270, - 2028, 2043, 2043, 2043, 3274, 2043, 3271, 3275, 2043, 3291, - 3276, 2041, 2030, 2041, 2042, 3271, 3290, 2046, 2046, 2046, - 2047, 2047, 2047, 1442, 2047, 3273, 3294, 2047, 2051, 2051, - 2051, 3278, 2042, 2034, 2046, 2048, 2048, 2048, 3279, 2048, - 3282, 3277, 2048, 2052, 2052, 2052, 2051, 2052, 3283, 3282, - 2052, 2058, 2058, 2058, 3285, 2058, 3291, 3283, 2058, 2061, - - 2061, 2061, 2062, 2062, 2062, 3288, 2062, 3294, 3278, 2062, - 2065, 2065, 2065, 3288, 2065, 3279, 2061, 2065, 2069, 2069, - 2069, 2070, 2070, 2070, 2071, 2071, 2071, 3277, 3285, 2074, - 2074, 2074, 3289, 2074, 2051, 2069, 2074, 3286, 1440, 2070, - 3289, 3287, 2071, 2078, 2078, 2078, 2079, 2079, 2079, 2081, - 2081, 2081, 2082, 2082, 2082, 3295, 2082, 1439, 1437, 2082, - 1436, 2078, 1434, 1432, 2079, 3292, 2081, 3293, 2087, 2087, - 2087, 2088, 2088, 2088, 2090, 2090, 2090, 2093, 2093, 2093, - 1431, 2093, 3320, 3286, 2093, 2070, 2087, 3287, 3296, 2088, - 3298, 3320, 2090, 2099, 2099, 2099, 3295, 2079, 2078, 2100, - - 2100, 2100, 3292, 2100, 3293, 3300, 2100, 2101, 2101, 2101, - 2099, 2102, 2102, 2102, 2103, 2103, 2103, 2104, 2104, 2104, - 2105, 2105, 2105, 3296, 3297, 2101, 2106, 2106, 2106, 2107, - 2107, 2107, 3302, 2088, 2087, 1430, 3298, 2105, 2108, 2108, - 2108, 3299, 3300, 2106, 3303, 3304, 2107, 2109, 2109, 2109, - 2112, 2112, 2112, 3304, 3301, 2108, 2113, 2113, 2113, 3297, - 2113, 3328, 1429, 2113, 3302, 2109, 3310, 2112, 2115, 2115, - 2115, 2101, 2117, 2117, 2117, 3328, 3303, 2106, 2120, 2120, - 2120, 2121, 2121, 2121, 3305, 2121, 2115, 3299, 2121, 3306, - 2117, 3301, 3305, 2107, 3312, 1428, 2120, 2108, 2124, 2124, - - 2124, 2125, 2125, 2125, 3314, 2125, 3311, 3310, 2125, 2127, - 2127, 2127, 2109, 2127, 1427, 2124, 2127, 2130, 2130, 2130, - 2131, 2131, 2131, 2132, 2132, 2132, 1426, 2132, 3308, 3312, - 2132, 2134, 2134, 2134, 3307, 2130, 3306, 2131, 2138, 2138, - 2138, 2140, 2140, 2140, 2141, 2141, 2141, 3311, 2141, 2134, - 3314, 2141, 2152, 2152, 2152, 1423, 2138, 1422, 2140, 2153, - 2153, 2153, 2156, 2156, 2156, 3308, 2156, 1421, 2130, 2156, - 2152, 2159, 2159, 2159, 2160, 2160, 2160, 2153, 2161, 2161, - 2161, 3307, 2134, 2164, 2164, 2164, 2165, 2165, 2165, 2167, - 2167, 2167, 2168, 2168, 2168, 2170, 2170, 2170, 2171, 2171, - - 2171, 2152, 2172, 2172, 2172, 2175, 2175, 2175, 2176, 2176, - 2176, 2179, 2179, 2179, 2180, 2180, 2180, 2182, 2182, 2182, - 2183, 2183, 2183, 2187, 2187, 2187, 2188, 2188, 2188, 2189, - 2189, 2189, 2190, 2190, 2190, 2191, 2191, 2191, 3309, 2191, - 3315, 2187, 2191, 2194, 2194, 2194, 3313, 2189, 3318, 2190, - 2195, 2195, 2195, 2196, 2196, 2196, 2197, 2197, 2197, 3316, - 2197, 2194, 1412, 2197, 2200, 2200, 2200, 1410, 2195, 3321, - 3319, 2196, 2204, 2204, 2204, 3309, 2204, 1405, 3321, 2204, - 3318, 3313, 2200, 2207, 2207, 2207, 3315, 2195, 2210, 2210, - 2210, 2212, 2212, 2212, 2194, 2189, 3316, 2211, 2211, 2211, - - 2207, 2211, 3319, 1399, 2211, 2210, 2213, 2213, 2213, 2212, - 2218, 2218, 2218, 3324, 2196, 2219, 2219, 2219, 2220, 2220, - 2220, 2224, 2224, 2224, 2213, 2221, 2221, 2221, 2218, 2221, - 3317, 3322, 2221, 2219, 1393, 2220, 3323, 3325, 2224, 2225, - 2225, 2225, 2226, 2226, 2226, 2227, 2227, 2227, 2228, 2228, - 2228, 2229, 2229, 2229, 3326, 1389, 2225, 1384, 1380, 2226, - 3327, 3324, 2227, 3322, 2220, 1379, 2228, 3317, 3323, 2229, - 2218, 2230, 2230, 2230, 1371, 1366, 2224, 2234, 2234, 2234, - 2235, 2235, 2235, 1357, 2235, 3325, 3326, 2235, 2230, 2238, - 2238, 2238, 3327, 2226, 2239, 2239, 2239, 2240, 2240, 2240, - - 2225, 1355, 2241, 2241, 2241, 1346, 2241, 2238, 2228, 2241, - 2242, 2242, 2242, 1341, 2240, 2229, 2243, 2243, 2243, 2244, - 2244, 2244, 2245, 2245, 2245, 1337, 1332, 2242, 2246, 2246, - 2246, 1331, 1330, 2243, 1328, 1327, 2244, 2247, 2247, 2247, - 2245, 1325, 2248, 2248, 2248, 1320, 2248, 1319, 2238, 2248, - 1314, 2251, 2251, 2251, 2247, 2252, 2252, 2252, 2256, 2256, - 2256, 1313, 2258, 2258, 2258, 1307, 2258, 2243, 2251, 2258, - 2244, 1306, 1305, 2252, 1304, 1293, 2256, 2262, 2262, 2262, - 2263, 2263, 2263, 1282, 2263, 1277, 1276, 2263, 2267, 2267, - 2267, 1275, 2271, 2271, 2271, 2262, 2271, 1271, 1254, 2271, - - 2284, 2284, 2284, 2285, 2285, 2285, 2267, 2298, 2298, 2298, - 2299, 2299, 2299, 2302, 2302, 2302, 1249, 2251, 2284, 1248, - 1247, 2285, 2303, 2303, 2303, 2305, 2305, 2305, 2308, 2308, - 2308, 2311, 2311, 2311, 2267, 2315, 2315, 2315, 2317, 2317, - 2317, 2318, 2318, 2318, 1242, 2319, 2319, 2319, 2320, 2320, - 2320, 1241, 2320, 2315, 1228, 2320, 2321, 2321, 2321, 2318, - 1227, 2284, 2319, 1226, 1225, 2285, 2322, 2322, 2322, 2323, - 2323, 2323, 1224, 1223, 2321, 2324, 2324, 2324, 2330, 2330, - 2330, 2331, 2331, 2331, 2322, 2331, 1222, 2323, 2331, 1221, - 2334, 2334, 2334, 2324, 2334, 2330, 1211, 2334, 2337, 2337, - - 2337, 2341, 2341, 2341, 2342, 2342, 2342, 2343, 2343, 2343, - 2345, 2345, 2345, 2346, 2346, 2346, 2337, 2346, 2341, 1210, - 2346, 1209, 2342, 1204, 1203, 2343, 1202, 2345, 1201, 1178, - 2322, 2350, 2350, 2350, 1177, 1170, 2323, 2351, 2351, 2351, - 2352, 2352, 2352, 1166, 2352, 1161, 1160, 2352, 2350, 2353, - 2353, 2353, 1155, 1152, 2351, 2354, 2354, 2354, 2355, 2355, - 2355, 2342, 2356, 2356, 2356, 1151, 2356, 2353, 1148, 2356, - 2359, 2359, 2359, 2354, 1147, 2355, 2360, 2360, 2360, 2361, - 2361, 2361, 2362, 2362, 2362, 1146, 2362, 2359, 1145, 2362, - 2365, 2365, 2365, 1144, 2366, 2366, 2366, 2361, 2366, 1143, - - 1142, 2366, 2367, 2367, 2367, 1141, 1140, 2365, 2368, 2368, - 2368, 2369, 2369, 2369, 1139, 1138, 2354, 1137, 1136, 2367, - 2371, 2371, 2371, 1135, 1132, 2368, 2372, 2372, 2372, 2369, - 2373, 2373, 2373, 1131, 2373, 1130, 1129, 2373, 2374, 2374, - 2374, 1127, 1126, 2372, 2378, 2378, 2378, 2381, 2381, 2381, - 2394, 2394, 2394, 1125, 1124, 2374, 2412, 2412, 2412, 2413, - 2413, 2413, 2378, 1123, 1122, 2381, 1121, 1120, 2394, 2418, - 2418, 2418, 2421, 2421, 2421, 1119, 2422, 2422, 2422, 2424, - 2424, 2424, 1118, 2424, 1117, 1116, 2424, 1115, 1114, 2421, - 2427, 2427, 2427, 2374, 2422, 1108, 2429, 2429, 2429, 2430, - - 2430, 2430, 2433, 2433, 2433, 2435, 2435, 2435, 2427, 2435, - 2394, 1104, 2435, 2381, 2429, 1101, 1100, 2430, 1099, 2433, - 2447, 2447, 2447, 2448, 2448, 2448, 2449, 2449, 2449, 1097, - 2449, 1093, 1090, 2449, 2450, 2450, 2450, 2447, 1089, 1088, - 2448, 2451, 2451, 2451, 1084, 2451, 1083, 1080, 2451, 2457, - 2457, 2457, 2450, 1076, 2458, 2458, 2458, 2429, 2458, 1075, - 1072, 2458, 2462, 2462, 2462, 2430, 2457, 2459, 2459, 2459, - 1069, 2459, 1066, 1065, 2459, 2464, 2464, 2464, 1060, 1052, - 2462, 2465, 2465, 2465, 1051, 2465, 1050, 1048, 2465, 2469, - 2469, 2469, 1044, 2464, 2470, 2470, 2470, 2471, 2471, 2471, - - 1041, 2471, 1038, 1035, 2471, 1034, 2469, 2472, 2472, 2472, - 1033, 2470, 2474, 2474, 2474, 1032, 2474, 1031, 1030, 2474, - 1029, 2477, 2477, 2477, 1028, 2472, 2478, 2478, 2478, 1025, - 2478, 1024, 1021, 2478, 2479, 2479, 2479, 2464, 2477, 2480, - 2480, 2480, 1020, 2480, 1016, 1014, 2480, 1011, 2481, 2481, - 2481, 2479, 2481, 1010, 1007, 2481, 2484, 2484, 2484, 2485, - 2485, 2485, 2486, 2486, 2486, 2489, 2489, 2489, 2490, 2490, - 2490, 1000, 997, 2484, 996, 995, 2485, 992, 988, 2486, - 2491, 2491, 2491, 2489, 2502, 2502, 2502, 2519, 2519, 2519, - 2520, 2520, 2520, 2524, 2524, 2524, 981, 2491, 2527, 2527, - - 2527, 977, 2502, 2528, 2528, 2528, 976, 2528, 975, 972, - 2528, 2529, 2529, 2529, 971, 2527, 970, 2484, 963, 2530, - 2530, 2530, 2532, 2532, 2532, 2533, 2533, 2533, 962, 2529, - 961, 2534, 2534, 2534, 960, 2534, 2489, 2530, 2534, 2532, - 959, 958, 2533, 957, 2502, 2535, 2535, 2535, 2547, 2547, - 2547, 2548, 2548, 2548, 956, 2548, 955, 951, 2548, 2549, - 2549, 2549, 2535, 2549, 925, 2547, 2549, 2552, 2552, 2552, - 2530, 2555, 2555, 2555, 922, 2557, 2557, 2557, 2529, 2557, - 919, 918, 2557, 911, 910, 2552, 908, 907, 2555, 2566, - 2566, 2566, 2568, 2568, 2568, 2569, 2569, 2569, 906, 2569, - - 905, 904, 2569, 903, 2570, 2570, 2570, 2566, 2570, 2568, - 902, 2570, 2573, 2573, 2573, 901, 2573, 900, 899, 2573, - 2576, 2576, 2576, 898, 2576, 896, 895, 2576, 2585, 2585, - 2585, 2586, 2586, 2586, 2587, 2587, 2587, 894, 2587, 893, - 892, 2587, 2588, 2588, 2588, 2585, 891, 890, 2586, 2589, - 2589, 2589, 889, 2589, 887, 886, 2589, 885, 884, 2588, - 2590, 2590, 2590, 2591, 2591, 2591, 2592, 2592, 2592, 2593, - 2593, 2593, 2594, 2594, 2594, 883, 882, 2590, 881, 880, - 2591, 2606, 2606, 2606, 2592, 2609, 2609, 2609, 2585, 2594, - 2595, 2595, 2595, 879, 2595, 875, 871, 2595, 870, 2606, - - 869, 868, 2609, 2609, 2623, 2623, 2623, 2624, 2624, 2624, - 2627, 2627, 2627, 2628, 2628, 2628, 2630, 2630, 2630, 867, - 2630, 863, 861, 2630, 2633, 2633, 2633, 860, 2592, 2634, - 2634, 2634, 2606, 2636, 2636, 2636, 2637, 2637, 2637, 859, - 2637, 858, 2633, 2637, 2638, 2638, 2638, 2634, 2638, 857, - 2636, 2638, 2641, 2641, 2641, 2642, 2642, 2642, 856, 2642, - 853, 852, 2642, 2654, 2654, 2654, 850, 2654, 848, 2641, - 2654, 2658, 2658, 2658, 2659, 2659, 2659, 845, 2659, 844, - 843, 2659, 2667, 2667, 2667, 2670, 2670, 2670, 2658, 2670, - 2633, 842, 2670, 2685, 2685, 2685, 840, 2686, 2686, 2686, - - 2667, 2686, 837, 836, 2686, 2689, 2689, 2689, 834, 2689, - 2685, 833, 2689, 2692, 2692, 2692, 2693, 2693, 2693, 830, - 2693, 828, 825, 2693, 2694, 2694, 2694, 2695, 2695, 2695, - 2692, 2695, 824, 823, 2695, 2696, 2696, 2696, 2697, 2697, - 2697, 2694, 2697, 822, 819, 2697, 2708, 2708, 2708, 2710, - 2710, 2710, 818, 2696, 2711, 2711, 2711, 817, 2712, 2712, - 2712, 816, 2712, 815, 2708, 2712, 2710, 2710, 2725, 2725, - 2725, 2711, 2711, 2726, 2726, 2726, 2712, 2727, 2727, 2727, - 2728, 2728, 2728, 2729, 2729, 2729, 2696, 2730, 2730, 2730, - 2735, 2735, 2735, 814, 813, 2708, 2736, 2736, 2736, 2739, - - 2739, 2739, 811, 2739, 808, 807, 2739, 803, 2735, 2742, - 2742, 2742, 802, 2742, 2736, 801, 2742, 2745, 2745, 2745, - 2756, 2756, 2756, 2757, 2757, 2757, 800, 2757, 799, 798, - 2757, 2760, 2760, 2760, 2745, 797, 789, 2756, 2780, 2780, - 2780, 2735, 2781, 2781, 2781, 788, 2781, 785, 2760, 2781, - 2786, 2786, 2786, 784, 2786, 2780, 783, 2786, 2789, 2789, - 2789, 782, 2789, 781, 779, 2789, 2792, 2792, 2792, 2801, - 2801, 2801, 2803, 2803, 2803, 2804, 2804, 2804, 778, 2804, - 777, 774, 2804, 773, 2792, 772, 769, 2801, 768, 2803, - 2803, 764, 762, 2804, 2805, 2805, 2805, 759, 2805, 758, - - 757, 2805, 2816, 2816, 2816, 2817, 2817, 2817, 2818, 2818, - 2818, 756, 2805, 2819, 2819, 2819, 2824, 2824, 2824, 2827, - 2827, 2827, 754, 2827, 751, 750, 2827, 749, 2826, 2826, - 2826, 2828, 2828, 2828, 2824, 2801, 2806, 2806, 2806, 2806, - 2806, 2806, 2806, 2806, 2806, 2826, 746, 2806, 2828, 2838, - 2838, 2838, 2806, 2806, 2806, 2806, 2806, 2839, 2839, 2839, - 743, 2839, 740, 739, 2839, 738, 2838, 2841, 2841, 2841, - 737, 2841, 736, 733, 2841, 2840, 2840, 2840, 2866, 2866, - 2866, 2806, 2806, 2807, 2807, 2807, 2807, 2807, 2807, 2807, - 2807, 2807, 2840, 730, 2807, 726, 2866, 725, 724, 2807, - - 2807, 2807, 2807, 2807, 2859, 2859, 2859, 723, 2859, 722, - 721, 2859, 2874, 2874, 2874, 2876, 2876, 2876, 720, 2876, - 719, 718, 2876, 717, 716, 2891, 2891, 2891, 2807, 2807, - 2874, 714, 712, 2876, 2879, 2879, 2879, 2879, 2879, 2879, - 2879, 2879, 2879, 2891, 709, 2879, 2897, 2897, 2897, 708, - 2879, 2879, 2879, 2879, 2879, 2894, 2894, 2894, 707, 2894, - 706, 705, 2894, 2897, 2898, 2898, 2898, 704, 2898, 699, - 698, 2898, 2939, 2939, 2939, 2947, 2947, 2947, 697, 2879, - 2879, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, 2880, - 2939, 694, 2880, 2947, 2947, 693, 692, 2880, 2880, 2880, - - 2880, 2880, 2906, 2906, 2906, 691, 2906, 688, 687, 2906, - 2909, 2909, 2909, 685, 2909, 682, 681, 2909, 2962, 2962, - 2962, 2967, 2967, 2967, 678, 2967, 2880, 2880, 2967, 2974, - 2974, 2974, 2979, 2979, 2979, 2962, 2992, 2992, 2992, 2996, - 2996, 2996, 3007, 3007, 3007, 677, 2974, 676, 675, 2979, - 674, 3008, 3008, 3008, 2992, 3008, 673, 2996, 3008, 3007, - 3019, 3019, 3019, 3020, 3020, 3020, 665, 3020, 664, 663, - 3020, 3027, 3027, 3027, 3028, 3028, 3028, 3019, 3028, 660, - 659, 3028, 3035, 3035, 3035, 3045, 3045, 3045, 3027, 3045, - 2996, 658, 3045, 655, 3058, 3058, 3058, 653, 3058, 652, - - 3035, 3058, 3067, 3067, 3067, 649, 3067, 648, 647, 3067, - 3200, 3200, 3200, 3211, 3211, 3211, 646, 3211, 643, 3035, - 3211, 3330, 3330, 3330, 3331, 3331, 3331, 642, 3200, 641, - 640, 3211, 636, 635, 634, 633, 627, 626, 624, 3330, - 618, 617, 3331, 3334, 3334, 3334, 3334, 3334, 3334, 3334, - 3334, 3334, 3335, 3335, 3335, 3335, 3335, 3335, 3335, 3335, - 3335, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, 3336, - 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3337, 3338, - 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3338, 3339, 3339, - 3339, 3339, 3339, 3339, 3339, 3339, 3339, 3340, 3340, 3340, - - 3340, 3340, 3340, 3340, 3340, 3340, 3341, 3341, 3341, 3341, - 3341, 3341, 3341, 3341, 3341, 3342, 3342, 3342, 3342, 3342, - 3342, 3342, 3342, 3342, 3343, 3343, 3343, 3343, 3343, 3343, - 3343, 3343, 3343, 3344, 3344, 3344, 3344, 3344, 3344, 3344, - 3344, 3344, 3345, 3345, 3345, 3345, 3345, 3345, 3345, 3345, - 3345, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, 3346, - 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3347, 3348, - 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3348, 3349, 3349, - 3349, 3349, 3349, 3349, 3349, 3349, 3349, 3350, 3350, 3350, - 3350, 3350, 3350, 3350, 3350, 3350, 3351, 3351, 3351, 3351, - - 3351, 3351, 3351, 3351, 3351, 3352, 3352, 3352, 3352, 3352, - 3352, 3352, 3352, 3352, 3353, 3353, 3353, 3353, 3353, 3353, - 3353, 3353, 3353, 3354, 3354, 3354, 3354, 3354, 3354, 3354, - 3354, 3354, 3355, 3355, 3355, 3355, 3355, 3355, 3355, 3355, - 3355, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, 3356, - 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3357, 3358, - 3358, 3358, 3358, 3358, 3358, 3358, 3358, 3358, 3359, 3359, - 3359, 3359, 3359, 3359, 3359, 3359, 3359, 3360, 3360, 3360, - 3360, 3360, 3360, 3360, 3360, 3360, 3361, 3361, 3361, 3361, - 3361, 3361, 3361, 3361, 3361, 3362, 3362, 3362, 3362, 3362, - - 3362, 3362, 3362, 3362, 3363, 3363, 3363, 3363, 3363, 3363, - 3363, 3363, 3363, 3364, 3364, 3364, 3364, 3364, 3364, 3364, - 3364, 3364, 3365, 3365, 3365, 3365, 3365, 3365, 3365, 3365, - 3365, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, 3366, - 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3367, 3368, - 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3368, 3369, 3369, - 3369, 3369, 3369, 3369, 3369, 3369, 3369, 3370, 3370, 3370, - 3370, 3370, 3370, 3370, 3370, 3370, 3371, 3371, 3371, 3371, - 3371, 3371, 3371, 3371, 3371, 3372, 3372, 3372, 3372, 3372, - 3372, 3372, 3372, 3372, 3373, 3373, 3373, 3373, 3373, 3373, - - 3373, 3373, 3373, 3374, 3374, 3374, 3374, 3374, 3374, 3374, - 3374, 3374, 3375, 3375, 3375, 3375, 3375, 3375, 3375, 3375, - 3375, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, 3376, - 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3377, 3378, - 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3378, 3379, 3379, - 3379, 3379, 3379, 3379, 3379, 3379, 3379, 3380, 3380, 3380, - 3380, 3380, 3380, 3380, 3380, 3380, 3381, 3381, 3381, 3381, - 3381, 3381, 3381, 3381, 3381, 3382, 3382, 3382, 3382, 3382, - 3382, 3382, 3382, 3382, 3383, 3383, 3383, 3383, 3383, 3383, - 3383, 3383, 3383, 3384, 3384, 3384, 3384, 3384, 3384, 3384, - - 3384, 3384, 3385, 3385, 3385, 3385, 3385, 3385, 3385, 3385, - 3385, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, 3386, - 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3387, 3388, - 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3388, 3389, 3389, - 3389, 3389, 3389, 3389, 3389, 3389, 3389, 3390, 3390, 3390, - 3390, 3390, 3390, 3390, 3390, 3390, 3391, 3391, 3391, 3391, - 3391, 3391, 3391, 3391, 3391, 3392, 3392, 3392, 3392, 3392, - 3392, 3392, 3392, 3392, 3393, 3393, 3393, 3393, 3393, 3393, - 3393, 3393, 3393, 3394, 3394, 3394, 616, 612, 609, 3394, - 3395, 3395, 3395, 607, 606, 605, 3395, 3396, 3396, 3396, - - 601, 597, 593, 3396, 3397, 3397, 3397, 592, 591, 590, - 3397, 3398, 3398, 3398, 586, 582, 579, 3398, 3399, 3399, - 3399, 578, 577, 576, 3399, 3400, 3400, 3400, 572, 566, - 565, 3400, 3401, 3401, 3401, 561, 557, 553, 3401, 3402, - 3402, 3402, 549, 542, 540, 3402, 3403, 3403, 3403, 539, - 535, 529, 3403, 3404, 3404, 3404, 528, 524, 520, 3404, - 3405, 3405, 3405, 516, 515, 514, 3405, 3406, 3406, 3406, - 513, 512, 508, 3406, 3407, 3407, 3407, 504, 497, 493, - 3407, 3408, 3408, 3408, 485, 484, 483, 3408, 3409, 3409, - 3409, 482, 481, 477, 3409, 3410, 3410, 3410, 471, 470, - - 466, 3410, 3411, 3411, 3411, 460, 459, 455, 3411, 3412, - 3412, 3412, 449, 448, 444, 3412, 3413, 3413, 3413, 440, - 436, 435, 3413, 3414, 3414, 3414, 434, 430, 426, 3414, - 3415, 3415, 3415, 422, 418, 412, 3415, 3416, 3416, 3416, - 411, 410, 406, 3416, 3417, 3417, 3417, 402, 397, 396, - 3417, 3418, 3418, 3418, 395, 394, 390, 3418, 3419, 3419, - 3419, 386, 383, 379, 3419, 3420, 3420, 3420, 375, 372, - 369, 3420, 3421, 3421, 3421, 3421, 3421, 3421, 3421, 367, - 3421, 3422, 3422, 3422, 366, 361, 354, 3422, 3423, 353, - 352, 351, 3423, 3424, 3424, 3424, 350, 346, 342, 3424, - - 3425, 339, 338, 334, 3425, 3426, 3426, 3426, 330, 327, - 326, 3426, 3427, 325, 321, 315, 3427, 3428, 3428, 3428, - 314, 313, 309, 3428, 3429, 303, 299, 296, 3429, 3430, - 3430, 3430, 295, 290, 289, 3430, 3431, 285, 281, 277, - 3431, 3432, 3432, 3432, 273, 272, 268, 3432, 3433, 265, - 264, 263, 3433, 3434, 3434, 3434, 257, 256, 254, 3434, - 3435, 251, 239, 0, 3435, 3436, 3436, 3436, 0, 0, - 0, 3436, 3437, 0, 0, 0, 3437, 3438, 3438, 3438, - 0, 0, 0, 3438, 3439, 0, 0, 0, 3439, 3440, - 3440, 3440, 0, 0, 0, 3440, 3441, 0, 0, 0, - - 3441, 3442, 3442, 3442, 0, 0, 0, 3442, 3443, 0, - 0, 0, 3443, 3444, 3444, 3444, 0, 0, 0, 3444, - 3445, 0, 0, 0, 3445, 3446, 3446, 3446, 0, 0, - 0, 3446, 3447, 0, 0, 0, 3447, 3448, 3448, 3448, - 0, 0, 0, 3448, 3449, 0, 0, 0, 3449, 3450, - 3450, 3450, 0, 0, 0, 3450, 3451, 0, 0, 0, - 3451, 3452, 3452, 3452, 0, 0, 0, 3452, 3453, 0, - 0, 0, 3453, 3454, 3454, 3454, 0, 0, 0, 3454, - 3455, 0, 0, 0, 3455, 3456, 3456, 3456, 0, 0, - 0, 3456, 3457, 0, 0, 0, 3457, 3458, 3458, 3458, - - 0, 0, 0, 3458, 3459, 0, 0, 0, 3459, 3460, - 3460, 3460, 0, 0, 0, 3460, 3461, 0, 0, 0, - 3461, 3462, 3462, 3462, 0, 0, 0, 3462, 3463, 0, - 0, 0, 3463, 3464, 3464, 3464, 0, 0, 0, 3464, - 3465, 0, 0, 0, 3465, 3466, 3466, 3466, 0, 0, - 0, 3466, 3467, 0, 0, 0, 3467, 3468, 3468, 3468, - 0, 0, 0, 3468, 3469, 0, 0, 0, 3469, 3470, - 3470, 3470, 0, 0, 0, 3470, 3471, 0, 0, 0, - 3471, 3472, 3472, 3472, 0, 0, 0, 3472, 3473, 0, - 0, 0, 3473, 3474, 3474, 3474, 0, 0, 0, 3474, - - 3475, 0, 0, 0, 3475, 3476, 3476, 3476, 3476, 3476, - 3476, 3476, 3476, 3476, 3477, 0, 0, 0, 0, 3477, - 3478, 3478, 3478, 0, 0, 0, 3478, 3479, 3479, 3479, - 3479, 0, 0, 3479, 3479, 3480, 3480, 3480, 3480, 0, - 3480, 0, 3480, 3481, 3481, 3481, 3481, 0, 0, 3481, - 3481, 3482, 3482, 3482, 0, 0, 0, 3482, 3483, 3483, - 3483, 3483, 0, 0, 3483, 3483, 3484, 3484, 3484, 0, - 0, 0, 3484, 3485, 3485, 3485, 3485, 0, 0, 3485, - 3485, 3486, 3486, 3486, 3486, 0, 3486, 0, 3486, 3487, - 3487, 3487, 3487, 0, 0, 3487, 3487, 3488, 3488, 3488, - - 3488, 0, 3488, 0, 3488, 3489, 3489, 3489, 3489, 0, - 0, 3489, 3489, 3490, 3490, 3490, 3490, 0, 3490, 0, - 3490, 3491, 3491, 3491, 3491, 0, 0, 3491, 3491, 3492, - 3492, 3492, 0, 0, 0, 3492, 3493, 3493, 3493, 3493, - 0, 0, 3493, 3493, 3494, 3494, 3494, 3494, 0, 0, - 3494, 3494, 3495, 3495, 3495, 0, 0, 0, 3495, 3496, - 3496, 3496, 3496, 0, 0, 3496, 3496, 3497, 3497, 3497, - 0, 0, 0, 3497, 3498, 3498, 3498, 3498, 0, 0, - 3498, 3498, 3499, 3499, 3499, 0, 0, 0, 3499, 3500, - 3500, 3500, 3500, 0, 0, 3500, 3500, 3501, 3501, 3501, - - 0, 0, 0, 3501, 3502, 3502, 3502, 3502, 0, 0, - 3502, 3502, 3503, 3503, 3503, 0, 0, 0, 3503, 3504, - 3504, 3504, 3504, 0, 0, 3504, 3504, 3505, 3505, 3505, - 0, 0, 0, 3505, 3506, 3506, 3506, 3506, 0, 0, - 3506, 3506, 3507, 3507, 3507, 0, 0, 0, 3507, 3508, - 3508, 3508, 3508, 0, 0, 3508, 3508, 3509, 3509, 3509, - 0, 0, 0, 3509, 3510, 3510, 3510, 3510, 0, 0, - 3510, 3510, 3511, 3511, 3511, 0, 0, 0, 3511, 3512, - 3512, 3512, 3512, 0, 0, 3512, 3512, 3513, 3513, 3513, - 0, 0, 0, 3513, 3514, 3514, 3514, 3514, 0, 0, - - 3514, 3514, 3515, 3515, 3515, 0, 0, 0, 3515, 3516, - 3516, 3516, 3516, 0, 0, 3516, 3516, 3517, 3517, 3517, - 0, 0, 0, 3517, 3518, 3518, 3518, 3518, 0, 0, - 3518, 3518, 3519, 3519, 3519, 3519, 0, 3519, 0, 3519, - 3520, 3520, 3520, 3520, 0, 0, 3520, 3520, 3521, 3521, - 3521, 0, 0, 0, 3521, 3522, 3522, 3522, 3522, 0, - 0, 3522, 3522, 3523, 3523, 3523, 0, 0, 0, 3523, - 3524, 3524, 3524, 3524, 0, 0, 3524, 3524, 3525, 3525, - 3525, 0, 0, 0, 3525, 3526, 3526, 3526, 3526, 0, - 0, 3526, 3526, 3527, 3527, 3527, 0, 0, 0, 3527, - - 3528, 3528, 3528, 3528, 0, 0, 3528, 3528, 3529, 3529, - 3529, 0, 0, 0, 3529, 3530, 3530, 3530, 3530, 0, - 0, 3530, 3530, 3531, 3531, 3531, 3531, 3531, 3531, 3531, - 3531, 3531, 3532, 0, 3532, 0, 0, 3532, 3533, 3533, - 3533, 0, 0, 0, 3533, 3534, 3534, 3534, 3534, 0, - 0, 3534, 3534, 3535, 3535, 3535, 0, 0, 0, 3535, - 3536, 3536, 3536, 3536, 0, 0, 3536, 3536, 3537, 3537, - 3537, 0, 0, 0, 3537, 3538, 3538, 3538, 3538, 0, - 0, 3538, 3538, 3539, 3539, 3539, 0, 0, 0, 3539, - 3540, 3540, 3540, 3540, 0, 0, 3540, 3540, 3541, 3541, - - 3541, 0, 0, 0, 3541, 3542, 3542, 3542, 3542, 0, - 0, 3542, 3542, 3543, 3543, 3543, 3543, 0, 0, 3543, - 3543, 3544, 3544, 3544, 0, 0, 0, 3544, 3545, 3545, - 3545, 3545, 0, 0, 3545, 3545, 3546, 3546, 3546, 0, - 0, 0, 3546, 3547, 3547, 3547, 3547, 0, 0, 3547, - 3547, 3548, 3548, 3548, 3548, 0, 0, 3548, 3548, 3549, - 3549, 3549, 0, 0, 0, 3549, 3550, 3550, 3550, 3550, - 0, 0, 3550, 3550, 3551, 3551, 3551, 3551, 0, 3551, - 0, 3551, 3552, 3552, 3552, 3552, 0, 0, 3552, 3552, - 3553, 3553, 3553, 3553, 0, 3553, 0, 3553, 3554, 3554, - - 3554, 3554, 0, 0, 3554, 3554, 3555, 3555, 3555, 0, - 0, 0, 3555, 3556, 3556, 3556, 3556, 0, 0, 3556, - 3556, 3557, 3557, 3557, 0, 0, 0, 3557, 3558, 3558, - 3558, 3558, 0, 0, 3558, 3558, 3559, 3559, 3559, 0, - 0, 0, 3559, 3560, 3560, 3560, 3560, 0, 0, 3560, - 3560, 3561, 3561, 3561, 3561, 0, 3561, 0, 3561, 3562, - 3562, 3562, 3562, 0, 0, 3562, 3562, 3563, 3563, 3563, - 0, 0, 0, 3563, 3564, 3564, 3564, 3564, 0, 0, - 3564, 3564, 3565, 3565, 3565, 0, 0, 0, 3565, 3566, - 3566, 3566, 3566, 0, 0, 3566, 3566, 3567, 3567, 3567, - - 0, 0, 0, 3567, 3568, 3568, 3568, 3568, 0, 0, - 3568, 3568, 3569, 3569, 3569, 0, 0, 0, 3569, 3570, - 3570, 3570, 3570, 0, 0, 3570, 3570, 3571, 3571, 3571, - 0, 0, 0, 3571, 3572, 3572, 3572, 3572, 0, 0, - 3572, 3572, 3573, 3573, 3573, 0, 0, 0, 3573, 3574, - 3574, 3574, 3574, 0, 0, 3574, 3574, 3575, 3575, 3575, - 0, 0, 0, 3575, 3576, 3576, 3576, 3576, 0, 0, - 3576, 3576, 3577, 3577, 3577, 0, 0, 0, 3577, 3578, - 3578, 3578, 3578, 0, 0, 3578, 3578, 3579, 3579, 3579, - 0, 0, 0, 3579, 3580, 3580, 3580, 3580, 0, 0, - - 3580, 3580, 3581, 3581, 3581, 3581, 0, 3581, 0, 3581, - 3582, 3582, 3582, 3582, 0, 0, 3582, 3582, 3583, 3583, - 3583, 0, 0, 0, 3583, 3584, 3584, 3584, 3584, 0, - 0, 3584, 3584, 3585, 3585, 3585, 3585, 3585, 3585, 3585, - 3585, 3585, 3586, 3586, 3586, 3586, 3586, 3586, 3586, 3586, - 3586, 3587, 3587, 3587, 0, 0, 0, 3587, 3588, 3588, - 3588, 0, 0, 0, 3588, 3589, 3589, 3589, 3589, 0, - 0, 3589, 3589, 3590, 3590, 3590, 3590, 0, 3590, 0, - 3590, 3591, 3591, 3591, 3591, 0, 0, 3591, 3591, 3592, - 3592, 3592, 0, 0, 0, 3592, 3593, 3593, 3593, 3593, - - 0, 0, 3593, 3593, 3594, 3594, 3594, 0, 0, 0, - 3594, 3595, 3595, 3595, 3595, 0, 0, 3595, 3595, 3596, - 3596, 3596, 3596, 0, 0, 3596, 3596, 3597, 3597, 3597, - 0, 0, 0, 3597, 3598, 3598, 3598, 3598, 0, 0, - 3598, 3598, 3599, 3599, 3599, 3599, 0, 3599, 0, 3599, - 3600, 3600, 3600, 3600, 0, 0, 3600, 3600, 3601, 3601, - 3601, 3601, 0, 0, 3601, 3601, 3602, 3602, 3602, 0, - 0, 0, 3602, 3603, 3603, 3603, 3603, 0, 0, 3603, - 3603, 3604, 3604, 3604, 3604, 0, 0, 3604, 3604, 3605, - 3605, 3605, 3605, 0, 0, 3605, 3605, 3606, 3606, 3606, - - 0, 0, 0, 3606, 3607, 3607, 3607, 3607, 0, 0, - 3607, 3607, 3608, 3608, 3608, 0, 0, 0, 3608, 3609, - 3609, 3609, 3609, 0, 0, 3609, 3609, 3610, 3610, 3610, - 3610, 0, 3610, 0, 3610, 3611, 3611, 3611, 3611, 0, - 0, 3611, 3611, 3612, 3612, 3612, 0, 0, 0, 3612, - 3613, 3613, 3613, 3613, 0, 0, 3613, 3613, 3614, 3614, - 3614, 0, 0, 0, 3614, 3615, 3615, 3615, 3615, 0, - 0, 3615, 3615, 3616, 3616, 3616, 0, 0, 0, 3616, - 3617, 3617, 3617, 3617, 0, 0, 3617, 3617, 3618, 3618, - 3618, 0, 0, 0, 3618, 3619, 3619, 3619, 3619, 0, - - 0, 3619, 3619, 3620, 3620, 3620, 3620, 0, 3620, 0, - 3620, 3621, 3621, 3621, 3621, 0, 0, 3621, 3621, 3622, - 3622, 3622, 0, 0, 0, 3622, 3623, 3623, 3623, 3623, - 0, 0, 3623, 3623, 3624, 3624, 3624, 0, 0, 0, - 3624, 3625, 3625, 3625, 3625, 0, 0, 3625, 3625, 3626, - 3626, 3626, 0, 0, 0, 3626, 3627, 3627, 3627, 3627, - 0, 0, 3627, 3627, 3628, 3628, 3628, 0, 0, 0, - 3628, 3629, 3629, 3629, 3629, 0, 0, 3629, 3629, 3630, - 3630, 3630, 0, 0, 0, 3630, 3631, 3631, 3631, 3631, - 0, 0, 3631, 3631, 3632, 3632, 3632, 0, 0, 0, - - 3632, 3633, 3633, 3633, 3633, 0, 0, 3633, 3633, 3634, - 3634, 3634, 0, 0, 0, 3634, 3635, 3635, 3635, 3635, - 0, 0, 3635, 3635, 3636, 3636, 3636, 3636, 3636, 3636, - 3636, 3636, 3636, 3637, 3637, 3637, 3637, 3637, 3637, 3637, - 3637, 3637, 3638, 3638, 3638, 0, 0, 0, 3638, 3639, - 3639, 3639, 3639, 0, 3639, 0, 3639, 3640, 3640, 3640, - 3640, 0, 0, 3640, 3640, 3641, 3641, 3641, 3641, 0, - 0, 3641, 3641, 3642, 3642, 3642, 0, 0, 0, 3642, - 3643, 3643, 3643, 3643, 0, 0, 3643, 3643, 3644, 3644, - 3644, 3644, 0, 3644, 0, 3644, 3645, 3645, 3645, 3645, - - 0, 0, 3645, 3645, 3646, 3646, 3646, 3646, 0, 0, - 3646, 3646, 3647, 3647, 3647, 3647, 0, 3647, 0, 3647, - 3648, 3648, 3648, 3648, 0, 0, 3648, 3648, 3649, 3649, - 3649, 3649, 0, 3649, 0, 3649, 3650, 3650, 3650, 3650, - 0, 0, 3650, 3650, 3651, 3651, 3651, 3651, 0, 0, - 3651, 3651, 3652, 3652, 3652, 0, 0, 0, 3652, 3653, - 3653, 3653, 3653, 0, 0, 3653, 3653, 3654, 3654, 3654, - 3654, 0, 0, 3654, 3654, 3655, 3655, 3655, 3655, 0, - 0, 3655, 3655, 3656, 3656, 3656, 0, 0, 0, 3656, - 3657, 3657, 3657, 3657, 0, 0, 3657, 3657, 3658, 3658, - - 3658, 0, 0, 0, 3658, 3659, 3659, 3659, 3659, 0, - 0, 3659, 3659, 3660, 3660, 3660, 3660, 0, 0, 3660, - 3660, 3661, 3661, 3661, 0, 0, 0, 3661, 3662, 3662, - 3662, 3662, 0, 0, 3662, 3662, 3663, 3663, 3663, 0, - 0, 0, 3663, 3664, 3664, 3664, 3664, 0, 0, 3664, - 3664, 3665, 3665, 3665, 0, 0, 0, 3665, 3666, 3666, - 3666, 3666, 0, 0, 3666, 3666, 3667, 3667, 3667, 0, - 0, 0, 3667, 3668, 3668, 3668, 3668, 0, 0, 3668, - 3668, 3669, 3669, 3669, 3669, 0, 0, 3669, 3669, 3670, - 3670, 3670, 0, 0, 0, 3670, 3671, 3671, 3671, 3671, - - 0, 0, 3671, 3671, 3672, 3672, 3672, 0, 0, 0, - 3672, 3673, 3673, 3673, 3673, 0, 0, 3673, 3673, 3674, - 3674, 3674, 0, 0, 0, 3674, 3675, 3675, 3675, 3675, - 0, 0, 3675, 3675, 3676, 3676, 3676, 3676, 0, 3676, - 0, 3676, 3677, 3677, 3677, 3677, 0, 0, 3677, 3677, - 3678, 3678, 3678, 0, 0, 0, 3678, 3679, 3679, 3679, - 3679, 0, 0, 3679, 3679, 3680, 3680, 3680, 0, 0, - 0, 3680, 3681, 3681, 3681, 3681, 0, 0, 3681, 3681, - 3682, 3682, 3682, 0, 0, 0, 3682, 3683, 3683, 3683, - 3683, 0, 0, 3683, 3683, 3684, 3684, 3684, 3684, 3684, - - 3684, 3684, 3684, 3684, 3685, 3685, 3685, 3685, 3685, 3685, - 3685, 3685, 3685, 3686, 3686, 3686, 3686, 0, 3686, 0, - 3686, 3687, 3687, 3687, 0, 0, 0, 3687, 3688, 3688, - 3688, 3688, 0, 0, 3688, 3688, 3689, 3689, 3689, 3689, - 0, 0, 3689, 3689, 3690, 3690, 3690, 0, 0, 0, - 3690, 3691, 3691, 3691, 3691, 0, 0, 3691, 3691, 3692, - 3692, 3692, 3692, 0, 0, 3692, 3692, 3693, 3693, 3693, - 3693, 0, 0, 3693, 3693, 3694, 3694, 3694, 3694, 0, - 3694, 0, 3694, 3695, 3695, 3695, 3695, 0, 0, 3695, - 3695, 3696, 3696, 3696, 0, 0, 0, 3696, 3697, 3697, - - 3697, 3697, 0, 0, 3697, 3697, 3698, 3698, 3698, 3698, - 0, 0, 3698, 3698, 3699, 3699, 3699, 0, 0, 0, - 3699, 3700, 3700, 3700, 3700, 0, 0, 3700, 3700, 3701, - 3701, 3701, 3701, 0, 0, 3701, 3701, 3702, 3702, 3702, - 0, 0, 0, 3702, 3703, 3703, 3703, 0, 0, 0, - 3703, 3704, 3704, 3704, 3704, 0, 0, 3704, 3704, 3705, - 3705, 3705, 3705, 0, 0, 3705, 3705, 3706, 3706, 3706, - 0, 0, 0, 3706, 3707, 3707, 3707, 3707, 0, 0, - 3707, 3707, 3708, 3708, 3708, 0, 0, 0, 3708, 3709, - 3709, 3709, 3709, 0, 3709, 0, 3709, 3710, 3710, 3710, - - 3710, 0, 0, 3710, 3710, 3711, 3711, 3711, 0, 0, - 0, 3711, 3712, 3712, 3712, 3712, 0, 0, 3712, 3712, - 3713, 3713, 3713, 0, 0, 0, 3713, 3714, 3714, 3714, - 3714, 0, 0, 3714, 3714, 3715, 3715, 3715, 0, 0, - 0, 3715, 3716, 3716, 3716, 3716, 0, 0, 3716, 3716, - 3717, 3717, 3717, 0, 0, 0, 3717, 3718, 3718, 3718, - 3718, 0, 0, 3718, 3718, 3719, 3719, 3719, 3719, 0, - 3719, 0, 3719, 3720, 3720, 3720, 3720, 0, 0, 3720, - 3720, 3721, 3721, 3721, 3721, 0, 3721, 0, 3721, 3722, - 3722, 3722, 3722, 0, 0, 3722, 3722, 3723, 3723, 3723, - - 0, 0, 0, 3723, 3724, 3724, 3724, 3724, 0, 0, - 3724, 3724, 3725, 3725, 3725, 3725, 0, 3725, 0, 3725, - 3726, 3726, 3726, 3726, 0, 0, 3726, 3726, 3727, 3727, - 3727, 3727, 3727, 3727, 3727, 3727, 3727, 3728, 3728, 3728, - 3728, 3728, 3728, 3728, 3728, 3728, 3729, 3729, 3729, 0, - 0, 0, 3729, 3730, 3730, 3730, 3730, 0, 0, 3730, - 3730, 3731, 3731, 3731, 3731, 0, 0, 3731, 3731, 3732, - 3732, 3732, 0, 0, 0, 3732, 3733, 3733, 3733, 3733, - 0, 0, 3733, 3733, 3734, 3734, 3734, 3734, 0, 0, - 3734, 3734, 3735, 3735, 3735, 3735, 0, 0, 3735, 3735, - - 3736, 3736, 3736, 3736, 0, 0, 3736, 3736, 3737, 3737, - 3737, 0, 0, 0, 3737, 3738, 3738, 3738, 3738, 0, - 0, 3738, 3738, 3739, 3739, 3739, 3739, 0, 0, 3739, - 3739, 3740, 3740, 3740, 0, 0, 0, 3740, 3741, 3741, - 3741, 3741, 0, 0, 3741, 3741, 3742, 3742, 3742, 3742, - 0, 0, 3742, 3742, 3743, 3743, 3743, 0, 0, 0, - 3743, 3744, 3744, 3744, 0, 0, 0, 3744, 3745, 3745, - 3745, 3745, 0, 0, 3745, 3745, 3746, 3746, 3746, 3746, - 0, 0, 3746, 3746, 3747, 3747, 3747, 0, 0, 0, - 3747, 3748, 3748, 3748, 0, 0, 0, 3748, 3749, 3749, - - 3749, 3749, 0, 0, 3749, 3749, 3750, 3750, 3750, 3750, - 0, 3750, 0, 3750, 3751, 3751, 3751, 3751, 0, 0, - 3751, 3751, 3752, 3752, 3752, 0, 0, 0, 3752, 3753, - 3753, 3753, 3753, 0, 0, 3753, 3753, 3754, 3754, 3754, - 0, 0, 0, 3754, 3755, 3755, 3755, 0, 0, 0, - 3755, 3756, 3756, 3756, 3756, 0, 0, 3756, 3756, 3757, - 3757, 3757, 0, 0, 0, 3757, 3758, 3758, 3758, 3758, - 0, 0, 3758, 3758, 3759, 3759, 3759, 0, 0, 0, - 3759, 3760, 3760, 3760, 3760, 0, 0, 3760, 3760, 3761, - 3761, 3761, 0, 0, 0, 3761, 3762, 3762, 3762, 3762, - - 0, 0, 3762, 3762, 3763, 3763, 3763, 3763, 3763, 3763, - 3763, 3763, 3763, 3764, 3764, 3764, 3764, 3764, 3764, 3764, - 3764, 3764, 3765, 3765, 3765, 0, 0, 0, 3765, 3766, - 3766, 3766, 3766, 0, 0, 3766, 3766, 3767, 3767, 3767, - 3767, 0, 0, 3767, 3767, 3768, 3768, 3768, 3768, 0, - 3768, 0, 3768, 3769, 3769, 3769, 3769, 0, 0, 3769, - 3769, 3770, 3770, 3770, 3770, 0, 0, 3770, 3770, 3771, - 3771, 3771, 3771, 0, 0, 3771, 3771, 3772, 3772, 3772, - 3772, 0, 0, 3772, 3772, 3773, 3773, 3773, 0, 0, - 0, 3773, 3774, 3774, 3774, 3774, 0, 0, 3774, 3774, - - 3775, 3775, 3775, 0, 0, 0, 3775, 3776, 3776, 3776, - 3776, 0, 0, 3776, 3776, 3777, 3777, 3777, 3777, 0, - 0, 3777, 3777, 3778, 3778, 3778, 3778, 0, 3778, 0, - 3778, 3779, 3779, 3779, 3779, 0, 3779, 0, 3779, 3780, - 3780, 3780, 3780, 0, 0, 3780, 3780, 3781, 3781, 3781, - 3781, 0, 0, 3781, 3781, 3782, 3782, 3782, 3782, 0, - 3782, 0, 3782, 3783, 3783, 3783, 0, 0, 0, 3783, - 3784, 3784, 3784, 3784, 0, 0, 3784, 3784, 3785, 3785, - 3785, 3785, 0, 3785, 0, 3785, 3786, 3786, 3786, 3786, - 0, 0, 3786, 3786, 3787, 3787, 3787, 3787, 0, 3787, - - 0, 3787, 3788, 3788, 3788, 0, 0, 0, 3788, 3789, - 3789, 3789, 0, 0, 0, 3789, 3790, 3790, 3790, 0, - 0, 0, 3790, 3791, 3791, 3791, 3791, 0, 0, 3791, - 3791, 3792, 3792, 3792, 0, 0, 0, 3792, 3793, 3793, - 3793, 3793, 0, 0, 3793, 3793, 3794, 3794, 3794, 0, - 0, 0, 3794, 3795, 3795, 3795, 3795, 0, 0, 3795, - 3795, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, 3796, - 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3797, 3798, - 3798, 3798, 0, 0, 0, 3798, 3799, 3799, 3799, 3799, - 0, 0, 3799, 3799, 3800, 3800, 3800, 3800, 0, 0, - - 3800, 3800, 3801, 3801, 3801, 3801, 0, 0, 3801, 3801, - 3802, 3802, 3802, 3802, 0, 0, 3802, 3802, 3803, 3803, - 3803, 0, 0, 0, 3803, 3804, 3804, 3804, 0, 0, - 0, 3804, 3805, 3805, 3805, 3805, 0, 0, 3805, 3805, - 3806, 3806, 3806, 0, 0, 0, 3806, 3807, 3807, 3807, - 3807, 3807, 3807, 3807, 3807, 3807, 3808, 3808, 3808, 3808, - 3808, 3808, 3808, 3808, 3808, 3809, 3809, 3809, 3809, 3809, - 3809, 3809, 3809, 3809, 3810, 3810, 3810, 3810, 3810, 3810, - 3810, 3810, 3810, 3811, 3811, 3811, 3811, 3811, 3811, 3811, - 3811, 3811, 3812, 3812, 3812, 3812, 3812, 3812, 3812, 3812, - - 3812, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, 3333, - 3333, 3333, 3333, 3333, 3333, 3333 + 114, 114, 683, 114, 114, 114, 114, 114, 163, 163, + 163, 164, 164, 164, 167, 167, 167, 920, 683, 168, + 168, 168, 727, 581, 163, 581, 727, 164, 920, 1784, + 167, 920, 1785, 114, 114, 168, 1790, 1792, 581, 1793, + + 581, 651, 651, 651, 114, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 694, 123, 123, 123, 123, 123, 171, 171, 171, 172, + 172, 172, 173, 173, 173, 1795, 694, 174, 174, 174, + 1796, 1797, 171, 1798, 706, 172, 1799, 1802, 173, 1803, + 1804, 123, 123, 174, 123, 720, 123, 661, 661, 661, + 706, 1808, 123, 665, 665, 665, 675, 675, 675, 123, + 1817, 720, 123, 124, 124, 124, 124, 124, 124, 124, + 124, 124, 124, 124, 124, 124, 124, 124, 1820, 124, + 124, 124, 124, 124, 177, 177, 177, 178, 178, 178, + + 179, 179, 179, 1828, 757, 180, 180, 180, 1830, 1832, + 177, 757, 1000, 178, 1833, 1834, 179, 757, 1836, 124, + 124, 180, 124, 1841, 124, 680, 680, 680, 1000, 1844, + 124, 691, 691, 691, 700, 700, 700, 124, 1845, 1135, + 124, 133, 133, 133, 133, 133, 133, 133, 133, 133, + 133, 133, 133, 133, 133, 133, 1135, 133, 133, 133, + 133, 133, 181, 181, 181, 182, 182, 182, 183, 183, + 183, 1847, 1302, 184, 184, 184, 1852, 1235, 181, 688, + 1857, 182, 1858, 1519, 183, 1302, 688, 133, 133, 184, + 185, 185, 185, 133, 1235, 688, 1519, 1862, 133, 703, + + 703, 703, 711, 711, 711, 1865, 185, 717, 717, 717, + 133, 134, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 134, 1868, 134, 134, 134, + 134, 134, 186, 186, 186, 187, 187, 187, 188, 188, + 188, 1864, 1871, 189, 189, 189, 1872, 1874, 186, 701, + 1875, 187, 1876, 1877, 188, 1878, 701, 134, 134, 189, + 190, 190, 190, 134, 1879, 701, 1864, 1881, 134, 726, + 726, 726, 729, 729, 729, 1882, 190, 1280, 1280, 1280, + 134, 137, 137, 137, 137, 137, 137, 137, 137, 137, + 137, 137, 137, 137, 137, 137, 1884, 137, 137, 137, + + 137, 137, 191, 191, 191, 192, 192, 192, 193, 193, + 193, 1885, 762, 194, 194, 194, 1103, 1888, 191, 762, + 1889, 192, 1891, 1893, 193, 762, 1103, 137, 137, 194, + 1003, 1003, 1003, 1103, 1003, 137, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 1896, 138, 138, 138, 138, 138, 195, 195, 195, + 196, 196, 196, 199, 199, 199, 1898, 769, 200, 200, + 200, 1899, 1900, 195, 769, 1901, 196, 1902, 1904, 199, + 769, 1905, 138, 138, 200, 738, 738, 738, 1909, 1912, + 138, 147, 147, 147, 147, 147, 147, 147, 147, 147, + + 147, 147, 147, 147, 147, 147, 1919, 147, 147, 147, + 147, 147, 201, 201, 201, 202, 202, 202, 203, 203, + 203, 1920, 776, 204, 204, 204, 1924, 1925, 201, 776, + 1926, 202, 1928, 918, 203, 776, 921, 147, 147, 204, + 918, 147, 1932, 921, 1933, 738, 918, 1968, 147, 921, + 1969, 147, 1976, 1016, 1016, 1016, 1987, 1988, 147, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 1989, 148, 148, 148, 148, 148, + 205, 205, 205, 206, 206, 206, 209, 209, 209, 1990, + 1992, 210, 210, 210, 2000, 2002, 205, 2006, 2009, 206, + + 2011, 2012, 209, 2015, 2016, 148, 148, 210, 2017, 148, + 1012, 1012, 1012, 2018, 1012, 2022, 148, 1012, 1016, 148, + 1303, 1303, 1303, 1650, 1650, 1650, 148, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 2023, 157, 157, 157, 157, 157, 213, 213, + 213, 214, 214, 214, 217, 217, 217, 2024, 2029, 218, + 218, 218, 2033, 2037, 213, 2039, 2041, 214, 2047, 2054, + 217, 2058, 2059, 157, 157, 218, 1037, 1037, 1037, 157, + 1645, 1645, 1645, 2061, 157, 158, 158, 158, 158, 158, + 158, 158, 158, 158, 158, 158, 158, 158, 158, 158, + + 2068, 158, 158, 158, 158, 158, 219, 219, 219, 220, + 220, 220, 221, 221, 221, 2075, 2079, 222, 222, 222, + 2081, 2082, 219, 2084, 2085, 220, 2087, 1645, 221, 2088, + 2089, 158, 158, 222, 1050, 1050, 1050, 158, 1647, 1647, + 1647, 1037, 158, 161, 161, 161, 161, 161, 161, 161, + 161, 161, 161, 161, 161, 161, 161, 161, 2075, 161, + 161, 161, 161, 161, 223, 223, 223, 224, 224, 224, + 227, 227, 227, 2076, 2090, 228, 228, 228, 2092, 2093, + 223, 2074, 2097, 224, 2099, 1647, 227, 2100, 2101, 161, + 161, 228, 231, 231, 231, 232, 232, 232, 2074, 1050, + + 161, 2102, 1074, 1074, 1074, 2104, 1074, 2076, 231, 1074, + 2105, 232, 2106, 161, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 2083, + 162, 162, 162, 162, 162, 233, 233, 233, 234, 234, + 234, 235, 235, 235, 2107, 2083, 236, 236, 236, 2110, + 2112, 233, 2113, 2083, 234, 2118, 2120, 235, 2121, 2122, + 162, 162, 236, 237, 237, 237, 238, 238, 238, 2123, + 2124, 162, 2126, 1093, 1093, 1093, 2131, 1093, 2159, 237, + 1093, 2160, 238, 2161, 162, 165, 165, 165, 165, 165, + 165, 165, 165, 165, 165, 165, 165, 165, 165, 165, + + 2103, 165, 165, 165, 165, 165, 241, 241, 241, 242, + 242, 242, 243, 243, 243, 2165, 2103, 244, 244, 244, + 2166, 2172, 241, 2173, 2103, 242, 2176, 2177, 243, 2183, + 2189, 165, 165, 244, 245, 245, 245, 1095, 1095, 1095, + 2191, 1095, 2192, 2195, 1095, 2201, 2203, 165, 2209, 2213, + 245, 2216, 165, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 166, 166, 166, 166, 166, 166, 2221, 166, + 166, 166, 166, 166, 246, 246, 246, 247, 247, 247, + 248, 248, 248, 2223, 2224, 255, 255, 255, 2225, 2226, + 246, 2233, 2235, 247, 2237, 2239, 248, 252, 252, 166, + + 166, 255, 252, 256, 256, 256, 1105, 1105, 1105, 2252, + 1105, 2253, 252, 1105, 2254, 166, 1653, 1653, 1653, 256, + 166, 169, 169, 169, 169, 169, 169, 169, 169, 169, + 169, 169, 169, 169, 169, 169, 2257, 169, 169, 169, + 169, 169, 252, 259, 259, 259, 260, 260, 260, 261, + 261, 261, 2258, 262, 262, 262, 746, 746, 746, 259, + 2260, 2261, 260, 2262, 2264, 261, 2259, 169, 169, 262, + 169, 169, 169, 746, 2259, 1108, 1108, 1108, 169, 1108, + 2276, 169, 1108, 2284, 2280, 1146, 1146, 1146, 169, 170, + 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, + + 170, 170, 170, 170, 2285, 170, 170, 170, 170, 170, + 263, 263, 263, 264, 264, 264, 265, 265, 265, 2263, + 2286, 266, 266, 266, 2278, 2287, 263, 2263, 2288, 264, + 2278, 2280, 265, 2292, 2294, 170, 170, 266, 170, 170, + 170, 1122, 1122, 1122, 2295, 1122, 170, 2296, 1122, 170, + 1146, 1658, 1658, 1658, 2301, 2302, 170, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 2304, 175, 175, 175, 175, 175, 267, 267, + 267, 268, 268, 268, 269, 269, 269, 1658, 2279, 270, + 270, 270, 2305, 2306, 267, 2307, 2310, 268, 2314, 2315, + + 269, 2322, 2324, 175, 175, 270, 271, 271, 271, 272, + 272, 272, 1129, 1129, 1129, 2331, 1129, 2333, 2364, 1129, + 2279, 2365, 271, 2366, 2372, 272, 2373, 175, 176, 176, + 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 176, 176, 176, 2377, 176, 176, 176, 176, 176, 273, + 273, 273, 274, 274, 274, 275, 275, 275, 2381, 2382, + 276, 276, 276, 2386, 2389, 273, 2392, 2393, 274, 2394, + 2395, 275, 2398, 2401, 176, 176, 276, 277, 277, 277, + 278, 278, 278, 1138, 1138, 1138, 2405, 1138, 2406, 2407, + 1138, 2419, 2422, 277, 2424, 2427, 278, 2434, 176, 197, + + 197, 197, 197, 197, 197, 197, 197, 197, 197, 197, + 197, 197, 197, 197, 2441, 197, 197, 197, 197, 197, + 281, 281, 281, 282, 282, 282, 283, 283, 283, 2443, + 2444, 284, 284, 284, 2445, 2450, 281, 2451, 2452, 282, + 2453, 2454, 283, 2455, 2456, 197, 197, 284, 285, 285, + 285, 2457, 2458, 197, 2459, 197, 2469, 2473, 197, 1659, + 1659, 1659, 197, 2480, 285, 2472, 197, 198, 198, 198, + 198, 198, 198, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 2481, 198, 198, 198, 198, 198, 286, 286, + 286, 287, 287, 287, 288, 288, 288, 2482, 805, 805, + + 805, 827, 827, 827, 286, 2473, 2485, 287, 2488, 2472, + 288, 2492, 2493, 198, 198, 805, 2494, 331, 827, 2497, + 2498, 198, 506, 198, 2499, 2502, 198, 331, 2505, 2506, + 198, 2507, 506, 2508, 198, 207, 207, 207, 207, 207, + 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + 2530, 207, 207, 207, 207, 207, 331, 2531, 2537, 828, + 828, 828, 506, 2532, 2538, 1014, 1014, 1014, 506, 2544, + 331, 2545, 331, 2532, 331, 506, 828, 2546, 2560, 506, + 331, 207, 207, 1014, 2561, 506, 2562, 2582, 714, 1140, + 1140, 1140, 207, 1140, 2583, 2589, 1140, 2594, 714, 2596, + + 1665, 1665, 1665, 2597, 2602, 207, 208, 208, 208, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 208, + 208, 2603, 208, 208, 208, 208, 208, 714, 2604, 838, + 838, 838, 840, 840, 840, 2605, 2606, 854, 854, 854, + 2607, 714, 2608, 714, 2609, 714, 838, 1665, 2610, 840, + 2611, 714, 208, 208, 854, 860, 860, 860, 869, 869, + 869, 2616, 2621, 208, 1150, 1150, 1150, 2622, 1150, 2624, + 2625, 1150, 860, 2626, 2619, 869, 208, 211, 211, 211, + 211, 211, 211, 211, 211, 211, 211, 211, 211, 211, + 211, 211, 2627, 211, 211, 211, 211, 211, 870, 870, + + 870, 881, 881, 881, 889, 889, 889, 2619, 893, 893, + 893, 906, 906, 906, 2629, 870, 2630, 2623, 881, 2633, + 2634, 889, 2620, 211, 211, 893, 2623, 2635, 906, 1158, + 1158, 1158, 211, 1158, 211, 2638, 1158, 2640, 211, 2641, + 1667, 1667, 1667, 211, 211, 212, 212, 212, 212, 212, + 212, 212, 212, 212, 212, 212, 212, 212, 212, 212, + 2620, 212, 212, 212, 212, 212, 932, 932, 932, 938, + 938, 938, 955, 955, 955, 2628, 961, 961, 961, 967, + 967, 967, 2644, 932, 2628, 2645, 938, 1667, 2646, 955, + 2648, 212, 212, 961, 2649, 2651, 967, 1162, 1162, 1162, + + 212, 1162, 212, 2672, 1162, 2673, 212, 1668, 1668, 1668, + 2674, 212, 212, 215, 215, 215, 215, 215, 215, 215, + 215, 215, 215, 215, 215, 215, 215, 215, 2675, 215, + 215, 215, 215, 215, 975, 975, 975, 988, 988, 988, + 1011, 1011, 1011, 2678, 1054, 1054, 1054, 1056, 1056, 1056, + 2679, 975, 2685, 2686, 988, 2693, 2681, 1011, 2681, 215, + 215, 1054, 2694, 2695, 1056, 215, 1174, 1174, 1174, 2703, + 1174, 2681, 2704, 1174, 2719, 1672, 1672, 1672, 2720, 2721, + 215, 216, 216, 216, 216, 216, 216, 216, 216, 216, + 216, 216, 216, 216, 216, 216, 2722, 216, 216, 216, + + 216, 216, 1015, 1015, 1015, 1058, 1058, 1058, 1059, 1059, + 1059, 1672, 2725, 1055, 1055, 1055, 2727, 1057, 1057, 1057, + 1015, 2728, 2729, 1058, 2730, 2063, 1059, 216, 216, 2731, + 1055, 2063, 2732, 216, 1057, 2063, 1196, 1196, 1196, 1015, + 1196, 2063, 2733, 1196, 2734, 1059, 2735, 2736, 216, 225, + 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 225, 1055, 225, 225, 225, 225, 225, + 1066, 1066, 1066, 1070, 1070, 1070, 2737, 1057, 2738, 1055, + 1067, 1067, 1067, 1071, 1071, 1071, 2740, 2682, 1066, 2682, + 2741, 1070, 1674, 1674, 1674, 225, 225, 2743, 1067, 2744, + + 225, 1071, 2682, 1686, 1686, 1686, 225, 226, 226, 226, + 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + 226, 226, 2742, 226, 226, 226, 226, 226, 1674, 2745, + 1067, 2742, 1073, 1073, 1073, 2746, 2748, 1076, 1076, 1076, + 2749, 1077, 1077, 1077, 1078, 1078, 1078, 2747, 1071, 1073, + 1686, 2750, 2752, 226, 226, 1076, 2747, 2755, 226, 1077, + 2756, 1078, 2757, 2753, 226, 229, 229, 229, 229, 229, + 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + 2758, 229, 229, 229, 229, 229, 1080, 1080, 1080, 1077, + 1081, 1081, 1081, 2752, 2759, 1082, 1082, 1082, 1079, 1079, + + 1079, 2753, 2760, 1080, 1083, 1083, 1083, 2761, 1081, 2762, + 2763, 229, 229, 1082, 229, 1079, 229, 1873, 1873, 1873, + 2764, 1083, 229, 1202, 1202, 1202, 2765, 1202, 2766, 2767, + 1202, 2768, 2769, 229, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 230, 230, 230, 230, 1079, + 230, 230, 230, 230, 230, 1084, 1084, 1084, 1085, 1085, + 1085, 1086, 1086, 1086, 1079, 2772, 2773, 1082, 2775, 1087, + 1087, 1087, 1084, 1088, 1088, 1088, 1085, 2776, 2777, 1086, + 230, 230, 2779, 230, 2780, 230, 1087, 1880, 1880, 1880, + 1088, 230, 1218, 1218, 1218, 2800, 1218, 2801, 2803, 1218, + + 2807, 2808, 230, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 2809, 239, + 239, 239, 239, 239, 1088, 1089, 1089, 1089, 1090, 1090, + 1090, 2064, 2811, 1086, 1091, 1091, 1091, 2064, 2812, 1088, + 2810, 2064, 1089, 1101, 1101, 1101, 1090, 2064, 2814, 239, + 239, 2810, 1091, 2815, 239, 1224, 1224, 1224, 2813, 1224, + 239, 1101, 1224, 2754, 239, 1883, 1883, 1883, 2823, 2813, + 239, 240, 240, 240, 240, 240, 240, 240, 240, 240, + 240, 240, 240, 240, 240, 240, 2824, 240, 240, 240, + 240, 240, 1092, 1092, 1092, 1094, 1094, 1094, 1096, 1096, + + 1096, 1230, 1230, 1230, 2825, 1230, 1091, 2754, 1230, 1092, + 2837, 2853, 1094, 2856, 2857, 1096, 2851, 240, 240, 1097, + 1097, 1097, 240, 1238, 1238, 1238, 2851, 1238, 240, 2851, + 1238, 2861, 240, 1886, 1886, 1886, 1097, 2862, 240, 249, + 249, 249, 249, 249, 249, 249, 249, 249, 249, 249, + 249, 249, 249, 249, 2863, 249, 249, 249, 249, 249, + 1887, 1887, 1887, 1098, 1098, 1098, 2864, 1104, 1104, 1104, + 2865, 2866, 1097, 1099, 1099, 1099, 2867, 1100, 1100, 1100, + 1098, 1102, 1102, 1102, 1104, 249, 249, 1890, 1890, 1890, + 1099, 2868, 2869, 249, 1100, 2870, 249, 2872, 2873, 1102, + + 1892, 1892, 1892, 249, 250, 250, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 250, 250, 250, 1098, + 250, 250, 250, 250, 250, 1099, 1107, 1107, 1107, 1102, + 1100, 1109, 1109, 1109, 1119, 1119, 1119, 1120, 1120, 1120, + 1121, 1121, 1121, 1107, 1123, 1123, 1123, 2874, 1109, 2875, + 250, 250, 1119, 2852, 2876, 1120, 2877, 1121, 250, 2878, + 2879, 250, 1123, 2852, 2880, 1892, 2852, 2881, 250, 253, + 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 2882, 253, 253, 253, 253, 253, + 2883, 1124, 1124, 1124, 2889, 2890, 1120, 1128, 1128, 1128, + + 1133, 1133, 1133, 1134, 1134, 1134, 1137, 1137, 1137, 1124, + 1139, 1139, 1139, 2891, 1128, 253, 253, 2892, 1133, 2893, + 2894, 1134, 253, 1137, 1895, 1895, 1895, 1139, 253, 1250, + 1250, 1250, 2895, 1250, 2896, 2887, 1250, 253, 254, 254, + 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, + 254, 254, 254, 1124, 254, 254, 254, 254, 254, 1141, + 1141, 1141, 1144, 1144, 1144, 1134, 2886, 2897, 1142, 1142, + 1142, 1145, 1145, 1145, 1154, 1154, 1154, 1141, 2887, 2888, + 1144, 1149, 1149, 1149, 254, 254, 1142, 2898, 2899, 1145, + 2900, 254, 1154, 1768, 1768, 1768, 2886, 254, 1149, 2901, + + 1894, 1894, 1894, 1897, 1897, 1897, 254, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 2888, 257, 257, 257, 257, 257, 2903, 1768, + 1142, 2905, 1145, 1155, 1155, 1155, 2906, 2907, 1157, 1157, + 1157, 1159, 1159, 1159, 1160, 1160, 1160, 1894, 1161, 1161, + 1161, 1155, 2909, 257, 257, 1157, 1272, 1272, 1272, 1159, + 1272, 2910, 1160, 1272, 257, 1161, 1903, 1903, 1903, 1906, + 1906, 1906, 2911, 257, 258, 258, 258, 258, 258, 258, + 258, 258, 258, 258, 258, 258, 258, 258, 258, 1155, + 258, 258, 258, 258, 258, 1164, 1164, 1164, 2923, 2928, + + 1160, 1165, 1165, 1165, 1168, 1168, 1168, 1169, 1169, 1169, + 1173, 1173, 1173, 1164, 2929, 1175, 1175, 1175, 2930, 1165, + 258, 258, 1168, 2931, 2932, 1169, 2915, 1173, 1907, 1907, + 1907, 258, 1175, 1911, 1911, 1911, 1978, 1978, 1978, 2915, + 258, 279, 279, 279, 279, 279, 279, 279, 279, 279, + 279, 279, 279, 279, 279, 279, 2933, 279, 279, 279, + 279, 279, 2916, 1165, 1178, 1178, 1178, 2934, 2935, 1169, + 2936, 2937, 1179, 1179, 1179, 2916, 1182, 1182, 1182, 1183, + 1183, 1183, 1178, 1193, 1193, 1193, 2938, 279, 279, 2946, + 1179, 2948, 2952, 279, 1182, 2953, 279, 1183, 1321, 1321, + + 1321, 1193, 1321, 2954, 2955, 1321, 2956, 2957, 279, 280, + 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 280, 280, 280, 280, 1179, 280, 280, 280, 280, 280, + 1194, 1194, 1194, 1195, 1195, 1195, 2959, 2971, 1183, 1198, + 1198, 1198, 1199, 1199, 1199, 1201, 1201, 1201, 1194, 2972, + 1195, 1203, 1203, 1203, 2974, 280, 280, 1198, 2975, 2977, + 1199, 280, 1201, 2988, 280, 1205, 1205, 1205, 1203, 1209, + 1209, 1209, 1210, 1210, 1210, 2829, 280, 328, 2989, 1211, + 1211, 1211, 1205, 2990, 328, 2829, 2991, 1209, 2993, 2994, + 1210, 2829, 2995, 328, 328, 1194, 1211, 1212, 1212, 1212, + + 1213, 1213, 1213, 1214, 1214, 1214, 2966, 1199, 1215, 1215, + 1215, 1217, 1217, 1217, 1212, 2830, 2996, 1213, 2999, 2966, + 1210, 1214, 328, 328, 328, 2830, 1215, 3000, 1217, 328, + 328, 2830, 3001, 328, 328, 3002, 2967, 328, 3003, 328, + 328, 328, 3004, 1219, 1219, 1219, 3005, 328, 330, 2967, + 2973, 1220, 1220, 1220, 1223, 1223, 1223, 1226, 1226, 1226, + 1213, 1219, 3006, 2973, 330, 330, 1227, 1227, 1227, 1220, + 1215, 1223, 1229, 1229, 1229, 1226, 3007, 3008, 1233, 1233, + 1233, 1234, 1234, 1234, 1227, 1237, 1237, 1237, 3009, 1229, + 1249, 1249, 1249, 330, 330, 330, 1233, 3010, 3015, 1234, + + 330, 330, 1237, 3016, 330, 330, 3018, 1249, 330, 3019, + 330, 330, 330, 1220, 1241, 1241, 1241, 2976, 330, 712, + 1242, 1242, 1242, 1247, 1247, 1247, 712, 1248, 1248, 1248, + 2976, 3020, 1241, 1227, 3021, 712, 712, 3022, 1242, 3016, + 3023, 1247, 1252, 1252, 1252, 1248, 3024, 3015, 1234, 1253, + 1253, 1253, 1254, 1254, 1254, 3025, 1255, 1255, 1255, 3026, + 1252, 1256, 1256, 1256, 712, 712, 712, 1253, 3027, 1254, + 3028, 712, 712, 1255, 3029, 712, 712, 3030, 1256, 712, + 3032, 712, 712, 712, 3034, 1242, 1257, 1257, 1257, 712, + 3035, 3037, 1248, 3039, 1258, 1258, 1258, 1259, 1259, 1259, + + 1276, 1276, 1276, 1257, 1908, 1908, 1908, 1255, 1277, 1277, + 1277, 1253, 1258, 3043, 3044, 1259, 3045, 3046, 1276, 1279, + 1279, 1279, 1255, 1320, 1320, 1320, 1277, 1324, 1324, 1324, + 3050, 1325, 1325, 1325, 3058, 1325, 3059, 1279, 1325, 3060, + 1320, 1333, 1333, 1333, 1324, 3061, 1257, 1327, 1327, 1327, + 1328, 1328, 1328, 1330, 1330, 1330, 3041, 3042, 1333, 1259, + 1337, 1337, 1337, 3062, 3063, 1327, 3041, 3042, 1328, 1908, + 3064, 1330, 1338, 1338, 1338, 1340, 1340, 1340, 1337, 1343, + 1343, 1343, 1344, 1344, 1344, 1346, 1346, 1346, 3065, 3066, + 1338, 3067, 3068, 1340, 1348, 1348, 1348, 1343, 1348, 3072, + + 1344, 1348, 3075, 1346, 1352, 1352, 1352, 1353, 1353, 1353, + 1355, 1355, 1355, 1356, 1356, 1356, 3076, 3077, 1330, 1357, + 1357, 1357, 1352, 1357, 3078, 1353, 1357, 3079, 1355, 3080, + 1356, 1360, 1360, 1360, 1361, 1361, 1361, 3081, 1361, 1346, + 3084, 1361, 1340, 1362, 1362, 1362, 3088, 3089, 1360, 1363, + 1363, 1363, 1365, 1365, 1365, 1366, 1366, 1366, 3090, 3091, + 1355, 1362, 1367, 1367, 1367, 3092, 1367, 1363, 3093, 1367, + 1365, 3094, 1366, 1368, 1368, 1368, 1369, 1369, 1369, 3095, + 1369, 3096, 3097, 1369, 1370, 1370, 1370, 1371, 1371, 1371, + 1368, 1373, 1373, 1373, 1374, 1374, 1374, 1375, 1375, 1375, + + 3098, 1375, 1370, 3099, 1375, 1371, 1378, 1378, 1378, 1373, + 3115, 1374, 1379, 1379, 1379, 1365, 1379, 3116, 3117, 1379, + 1380, 1380, 1380, 1378, 1381, 1381, 1381, 1383, 1383, 1383, + 1384, 1384, 1384, 3118, 1384, 3119, 3120, 1384, 1380, 1387, + 1387, 1387, 1381, 1387, 3121, 1383, 1387, 1390, 1390, 1390, + 3122, 1391, 1391, 1391, 1373, 1391, 3124, 3125, 1391, 1396, + 1396, 1396, 3126, 3127, 1390, 1397, 1397, 1397, 1399, 1399, + 1399, 1403, 1403, 1403, 3102, 1403, 3128, 1396, 1403, 1406, + 1406, 1406, 3103, 1397, 3102, 3129, 1399, 1407, 1407, 1407, + 1383, 1407, 3103, 3130, 1407, 3131, 1406, 1410, 1410, 1410, + + 1411, 1411, 1411, 3132, 1411, 3133, 3134, 1411, 1421, 1421, + 1421, 1422, 1422, 1422, 1410, 3135, 3143, 1399, 1424, 1424, + 1424, 1425, 1425, 1425, 3144, 1425, 1421, 3145, 1425, 1422, + 1428, 1428, 1428, 1429, 1429, 1429, 1424, 1431, 1431, 1431, + 1434, 1434, 1434, 1435, 1435, 1435, 3137, 1435, 1428, 3148, + 1435, 1429, 1441, 1441, 1441, 1431, 3137, 1434, 1442, 1442, + 1442, 1444, 1444, 1444, 1446, 1446, 1446, 1447, 1447, 1447, + 1441, 1447, 3138, 3139, 1447, 3149, 1442, 3150, 3151, 1444, + 3154, 1446, 3138, 1450, 1450, 1450, 1424, 1450, 3156, 3160, + 1450, 1453, 1453, 1453, 1454, 1454, 1454, 3163, 1431, 1456, + + 1456, 1456, 1457, 1457, 1457, 1458, 1458, 1458, 3139, 1453, + 3164, 3165, 1454, 1459, 1459, 1459, 3166, 1456, 3167, 1457, + 1461, 1461, 1461, 1458, 1470, 1470, 1470, 1444, 1464, 1464, + 1464, 1459, 1464, 3168, 3169, 1464, 3170, 3175, 1461, 1471, + 1471, 1471, 1470, 1473, 1473, 1473, 1475, 1475, 1475, 3183, + 1475, 3184, 3185, 1475, 1478, 1478, 1478, 1471, 1479, 1479, + 1479, 1473, 1481, 1481, 1481, 1456, 3186, 1482, 1482, 1482, + 1461, 1482, 1478, 3187, 1482, 3188, 1479, 1486, 1486, 1486, + 1481, 1487, 1487, 1487, 1489, 1489, 1489, 3189, 1490, 1490, + 1490, 1491, 1491, 1491, 3190, 1486, 1492, 1492, 1492, 1487, + + 3191, 3192, 1489, 3198, 1473, 1490, 3199, 3201, 1491, 1493, + 1493, 1493, 3202, 3204, 1492, 1495, 1495, 1495, 1500, 1500, + 1500, 3205, 1500, 1481, 3206, 1500, 3207, 1493, 1503, 1503, + 1503, 3208, 3209, 1495, 3210, 1489, 1504, 1504, 1504, 1491, + 1504, 3211, 3212, 1504, 3213, 1503, 1507, 1507, 1507, 1508, + 1508, 1508, 1510, 1510, 1510, 1513, 1513, 1513, 1514, 1514, + 1514, 1516, 1516, 1516, 1507, 3214, 3215, 1508, 3216, 3219, + 1510, 3220, 3221, 1513, 3222, 3230, 1514, 3231, 3233, 1516, + 1522, 1522, 1522, 1495, 1526, 1526, 1526, 1527, 1527, 1527, + 1529, 1529, 1529, 3234, 1530, 1530, 1530, 1522, 1530, 3235, + + 3237, 1530, 1526, 3239, 1510, 1527, 3240, 3241, 1529, 1516, + 1534, 1534, 1534, 1535, 1535, 1535, 1537, 1537, 1537, 1539, + 1539, 1539, 3244, 1539, 2475, 2475, 1539, 2475, 1534, 3245, + 3246, 1535, 3247, 3250, 1537, 2475, 1542, 1542, 1542, 1543, + 1543, 1543, 2475, 1543, 3251, 3252, 1543, 1544, 1544, 1544, + 3253, 3254, 1529, 1542, 1545, 1545, 1545, 3261, 1546, 1546, + 1546, 3255, 1546, 3262, 1544, 1546, 1548, 1548, 1548, 3264, + 3265, 1545, 1550, 1550, 1550, 1551, 1551, 1551, 1537, 1553, + 1553, 1553, 3266, 1548, 1554, 1554, 1554, 1555, 1555, 1555, + 1550, 1555, 3268, 1551, 1555, 3270, 3273, 1553, 1556, 1556, + + 1556, 1554, 1557, 1557, 1557, 3255, 1557, 3275, 3276, 1557, + 1559, 1559, 1559, 3277, 3278, 1556, 1560, 1560, 1560, 1562, + 1562, 1562, 1564, 1564, 1564, 3279, 1564, 3280, 1559, 1564, + 1567, 1567, 1567, 3281, 1560, 3282, 3285, 1562, 3289, 3290, + 1553, 1568, 1568, 1568, 1570, 1570, 1570, 3292, 1567, 1573, + 1573, 1573, 3293, 1573, 3294, 3296, 1573, 3297, 3302, 1568, + 3303, 3304, 1570, 1577, 1577, 1577, 1578, 1578, 1578, 3305, + 1580, 1580, 1580, 1582, 1582, 1582, 3306, 1582, 3307, 3308, + 1582, 1577, 3309, 3310, 1578, 3311, 3312, 1562, 1580, 1586, + 1586, 1586, 1587, 1587, 1587, 1588, 1588, 1588, 1590, 1590, + + 1590, 1592, 1592, 1592, 3313, 3314, 1586, 1593, 1593, 1593, + 1587, 1593, 1570, 1588, 1593, 3315, 1590, 3316, 1592, 1596, + 1596, 1596, 1598, 1598, 1598, 1599, 1599, 1599, 1601, 1601, + 1601, 3317, 1580, 1603, 1603, 1603, 1596, 1605, 1605, 1605, + 1598, 3318, 3322, 1599, 3323, 3324, 1601, 1606, 1606, 1606, + 1603, 1608, 1608, 1608, 3325, 1605, 3328, 1609, 1609, 1609, + 1590, 1609, 3329, 3330, 1609, 1606, 1613, 1613, 1613, 1608, + 1614, 1614, 1614, 1616, 1616, 1616, 1601, 1617, 1617, 1617, + 3331, 1596, 3332, 3333, 1613, 1618, 1618, 1618, 1614, 1618, + 3335, 1616, 1618, 3336, 1617, 1621, 1621, 1621, 3338, 1608, + + 1622, 1622, 1622, 3339, 1622, 3340, 3342, 1622, 1624, 1624, + 1624, 3343, 1621, 1625, 1625, 1625, 3344, 1627, 1627, 1627, + 1629, 1629, 1629, 1635, 1635, 1635, 1624, 1685, 1685, 1685, + 3345, 1625, 3346, 3354, 1616, 1627, 3355, 3350, 1629, 1629, + 3357, 1635, 1676, 1676, 1676, 1685, 1676, 3347, 3350, 1676, + 1681, 1681, 1681, 3349, 1681, 3358, 3362, 1681, 1688, 1688, + 1688, 1689, 1689, 1689, 3364, 1689, 3366, 3349, 1689, 1693, + 1693, 1693, 1696, 1696, 1696, 1688, 3368, 3372, 1627, 1695, + 1695, 1695, 3378, 1699, 1699, 1699, 3379, 1693, 3374, 1685, + 1696, 1700, 1700, 1700, 3347, 1700, 1695, 3381, 1700, 3382, + + 3374, 1699, 1705, 1705, 1705, 3384, 1705, 3375, 3395, 1705, + 1708, 1708, 1708, 1709, 1709, 1709, 3397, 1709, 3389, 3375, + 1709, 3399, 1712, 1712, 1712, 3400, 1712, 3403, 1708, 1712, + 3389, 1693, 1715, 1715, 1715, 1716, 1716, 1716, 3404, 1716, + 1696, 1699, 1716, 3407, 1721, 1721, 1721, 3409, 1721, 3390, + 1715, 1721, 1724, 1724, 1724, 1725, 1725, 1725, 1708, 1725, + 3411, 3390, 1725, 3413, 1730, 1730, 1730, 1732, 1732, 1732, + 1724, 1733, 1733, 1733, 1734, 1734, 1734, 1735, 1735, 1735, + 1715, 1730, 1736, 1736, 1736, 1732, 3414, 3416, 1733, 3417, + 3421, 1734, 3422, 3424, 1735, 1741, 1741, 1741, 3425, 1736, + + 1724, 1737, 1737, 1737, 3427, 1737, 3429, 3433, 1737, 1738, + 1738, 1738, 1741, 1738, 3353, 3435, 1738, 1742, 1742, 1742, + 1743, 1743, 1743, 1732, 3438, 1735, 1744, 1744, 1744, 1745, + 1745, 1745, 3439, 3353, 1742, 3353, 3440, 1743, 1746, 1746, + 1746, 1734, 3430, 1744, 3432, 3432, 1745, 1741, 3353, 1747, + 1747, 1747, 1748, 1748, 1748, 1746, 1749, 1749, 1749, 1750, + 1750, 1750, 1751, 1751, 1751, 1742, 1747, 3444, 3441, 1748, + 1755, 1755, 1755, 1749, 1744, 3431, 1750, 1752, 1752, 1752, + 1751, 1756, 1756, 1756, 3430, 1756, 3441, 1755, 1756, 3431, + 3445, 1743, 3446, 3453, 1745, 1752, 1758, 1758, 1758, 1746, + + 1760, 1760, 1760, 1762, 1762, 1762, 3454, 1763, 1763, 1763, + 3457, 1763, 3458, 1758, 1763, 1764, 1764, 1764, 1760, 1749, + 1762, 1750, 3460, 1748, 1765, 1765, 1765, 3434, 1751, 3457, + 1752, 3464, 3465, 1764, 3447, 1766, 1766, 1766, 3434, 1766, + 3466, 1765, 1766, 1767, 1767, 1767, 1773, 1773, 1773, 3447, + 1775, 1775, 1775, 1776, 1776, 1776, 3467, 1777, 1777, 1777, + 3459, 1767, 3469, 3470, 1773, 3471, 3472, 1760, 1775, 3474, + 1776, 1778, 1778, 1778, 3475, 1777, 1779, 1779, 1779, 3459, + 1779, 3469, 1764, 1779, 3471, 1781, 1781, 1781, 1778, 1783, + 1783, 1783, 1786, 1786, 1786, 3476, 1786, 3477, 3478, 1786, + + 3479, 3487, 1767, 1781, 1773, 3488, 1783, 3489, 1775, 1777, + 1789, 1789, 1789, 1791, 1791, 1791, 1794, 1794, 1794, 1800, + 1800, 1800, 1801, 1801, 1801, 3493, 1801, 1789, 3494, 1801, + 3495, 1791, 3490, 3501, 1794, 3502, 1800, 1805, 1805, 1805, + 1806, 1806, 1806, 1807, 1807, 1807, 1781, 1809, 1809, 1809, + 3490, 1809, 3496, 3503, 1809, 1805, 3505, 1806, 1812, 1812, + 1812, 1807, 1813, 1813, 1813, 3506, 1813, 3496, 3507, 1813, + 1814, 1814, 1814, 3509, 1814, 1812, 3510, 1814, 1791, 1818, + 1818, 1818, 3511, 1794, 1819, 1819, 1819, 1805, 1819, 3512, + 3514, 1819, 1821, 1821, 1821, 3515, 1818, 1822, 1822, 1822, + + 3516, 1822, 3521, 3522, 1822, 3523, 1807, 1825, 1825, 1825, + 1821, 1825, 3524, 3525, 1825, 1829, 1829, 1829, 1831, 1831, + 1831, 1835, 1835, 1835, 1837, 1837, 1837, 1838, 1838, 1838, + 1839, 1839, 1839, 1829, 1839, 3526, 1831, 1839, 3527, 1835, + 3528, 1837, 3529, 1821, 1838, 1840, 1840, 1840, 1842, 1842, + 1842, 1843, 1843, 1843, 3530, 1843, 3533, 3534, 1843, 1846, + 1846, 1846, 3535, 1840, 3536, 1842, 1848, 1848, 1848, 1849, + 1849, 1849, 3537, 1849, 3538, 3541, 1849, 1846, 1850, 1850, + 1850, 3542, 1829, 1848, 3543, 1831, 1835, 1851, 1851, 1851, + 1853, 1853, 1853, 3544, 3545, 1850, 1854, 1854, 1854, 3546, + + 1854, 3547, 3548, 1854, 3549, 1851, 3551, 3552, 1853, 1846, + 1840, 1859, 1859, 1859, 3553, 1859, 3554, 3556, 1859, 3558, + 1863, 1863, 1863, 1866, 1866, 1866, 1910, 1910, 1910, 1913, + 1913, 1913, 1914, 1914, 1914, 3559, 3560, 1851, 1863, 3561, + 3562, 1866, 1853, 1915, 1915, 1915, 1916, 1916, 1916, 1917, + 1917, 1917, 1918, 1918, 1918, 1921, 1921, 1921, 3563, 1921, + 1915, 3564, 1921, 1916, 3565, 3566, 1917, 1927, 1927, 1927, + 1918, 3567, 1863, 1910, 3568, 1866, 1929, 1929, 1929, 1930, + 1930, 1930, 3572, 1930, 3570, 1927, 1930, 1931, 1931, 1931, + 3573, 3574, 1866, 1929, 1913, 3575, 3570, 1914, 3576, 1934, + + 1934, 1934, 1935, 1935, 1935, 1931, 1936, 1936, 1936, 1937, + 1937, 1937, 3577, 3578, 1917, 3580, 3585, 1934, 3586, 1935, + 1918, 3587, 3588, 1936, 1938, 1938, 1938, 1937, 1939, 1939, + 1939, 3571, 1927, 1940, 1940, 1940, 1941, 1941, 1941, 1942, + 1942, 1942, 1938, 3571, 3589, 1939, 3590, 1931, 1934, 3594, + 1940, 1943, 1943, 1943, 1941, 3595, 1942, 1944, 1944, 1944, + 1945, 1945, 1945, 3597, 1945, 3599, 3600, 1945, 1943, 1946, + 1946, 1946, 3601, 3602, 1944, 1937, 1947, 1947, 1947, 1948, + 1948, 1948, 1950, 1950, 1950, 3603, 1946, 1951, 1951, 1951, + 1938, 1949, 1949, 1949, 1947, 1949, 1948, 3604, 1949, 1950, + + 3605, 3606, 1941, 3607, 1951, 1952, 1952, 1952, 3610, 1952, + 1943, 3611, 1952, 1955, 1955, 1955, 1956, 1956, 1956, 1957, + 1957, 1957, 1958, 1958, 1958, 1959, 1959, 1959, 3612, 3608, + 1955, 3613, 3614, 1956, 3615, 3616, 1957, 1947, 3617, 1958, + 3620, 3621, 1959, 1960, 1960, 1960, 1961, 1961, 1961, 1962, + 1962, 1962, 1951, 1962, 3608, 3622, 1962, 1963, 1963, 1963, + 1960, 3623, 3624, 1961, 3625, 3626, 1956, 1964, 1964, 1964, + 3627, 3628, 1959, 3629, 1963, 1965, 1965, 1965, 1955, 3632, + 3633, 1958, 3634, 3635, 1964, 1966, 1966, 1966, 1967, 1967, + 1967, 3636, 1965, 3637, 1970, 1970, 1970, 1960, 1970, 3640, + + 3641, 1970, 3642, 1966, 3643, 3644, 1967, 1973, 1973, 1973, + 1974, 1974, 1974, 3645, 3646, 1964, 1975, 1975, 1975, 3647, + 1975, 3648, 3649, 1975, 1973, 3651, 3652, 1974, 3653, 1965, + 1977, 1977, 1977, 1979, 1979, 1979, 3650, 1979, 3654, 3655, + 1979, 1982, 1982, 1982, 1967, 1986, 1986, 1986, 1977, 1983, + 1983, 1983, 1966, 1983, 3656, 3650, 1983, 3657, 3658, 1982, + 1991, 1991, 1991, 1986, 1993, 1993, 1993, 1994, 1994, 1994, + 1995, 1995, 1995, 3659, 1995, 3356, 3660, 1995, 1991, 1996, + 1996, 1996, 1993, 3661, 1994, 1997, 1997, 1997, 1982, 1997, + 3662, 3356, 1997, 3356, 2001, 2001, 2001, 1996, 2003, 2003, + + 2003, 2004, 2004, 2004, 3663, 2004, 3356, 3664, 2004, 3665, + 3666, 1993, 2001, 1986, 3667, 2003, 2005, 2005, 2005, 2007, + 2007, 2007, 2008, 2008, 2008, 3668, 2008, 3669, 3670, 2008, + 2010, 2010, 2010, 2005, 3671, 3672, 2007, 3673, 1996, 2013, + 2013, 2013, 2014, 2014, 2014, 2019, 2019, 2019, 2010, 2019, + 3674, 3677, 2019, 2025, 2025, 2025, 3678, 2013, 2026, 2026, + 2026, 2001, 2027, 2027, 2027, 3679, 2027, 3680, 3681, 2027, + 3682, 2025, 2028, 2028, 2028, 2026, 2030, 2030, 2030, 3683, + 2030, 3684, 3686, 2030, 2034, 2034, 2034, 3687, 2034, 3685, + 2028, 2034, 2013, 2038, 2038, 2038, 2040, 2040, 2040, 2042, + + 2042, 2042, 2043, 2043, 2043, 2025, 2044, 2044, 2044, 3685, + 3689, 2038, 3690, 3691, 2040, 3420, 3693, 2042, 3694, 2043, + 2045, 2045, 2045, 2044, 2046, 2046, 2046, 2048, 2048, 2048, + 3695, 2049, 2049, 2049, 3420, 2049, 3420, 2045, 2049, 2050, + 2050, 2050, 2046, 2050, 2048, 3696, 2050, 3697, 2040, 3420, + 3698, 2042, 2053, 2053, 2053, 2038, 2055, 2055, 2055, 3699, + 2055, 3700, 3701, 2055, 2060, 2060, 2060, 2062, 2062, 2062, + 2053, 2062, 2046, 2044, 2062, 2065, 2065, 2065, 3702, 2066, + 2066, 2066, 2060, 2066, 3703, 3704, 2066, 2067, 2067, 2067, + 3705, 3706, 2065, 2069, 2069, 2069, 2070, 2070, 2070, 3707, + + 2053, 2071, 2071, 2071, 3708, 2067, 2072, 2072, 2072, 3709, + 3710, 2069, 3711, 2070, 3713, 3714, 2060, 3715, 2071, 2073, + 2073, 2073, 3717, 2072, 2078, 2078, 2078, 2080, 2080, 2080, + 2086, 2086, 2086, 2091, 2091, 2091, 3719, 2073, 3720, 2067, + 3722, 2078, 2094, 2094, 2094, 2095, 2095, 2095, 2096, 2096, + 2096, 2098, 2098, 2098, 3723, 2073, 2108, 2108, 2108, 2109, + 2109, 2109, 2111, 2111, 2111, 2114, 2114, 2114, 2115, 2115, + 2115, 2072, 2115, 3725, 3726, 2115, 2116, 2116, 2116, 2117, + 2117, 2117, 2114, 2117, 3727, 3728, 2117, 2119, 2119, 2119, + 2125, 2125, 2125, 2116, 2127, 2127, 2127, 3729, 2127, 3730, + + 3718, 2127, 2132, 2132, 2132, 2119, 3718, 3732, 2125, 2130, + 2130, 2130, 2133, 2133, 2133, 2134, 2134, 2134, 3733, 2132, + 3735, 2135, 2135, 2135, 3736, 2135, 3738, 2130, 2135, 3739, + 2133, 3741, 2134, 2136, 2136, 2136, 2137, 2137, 2137, 3742, + 2137, 3744, 3745, 2137, 2138, 2138, 2138, 2139, 2139, 2139, + 2136, 2140, 2140, 2140, 2119, 3748, 2141, 2141, 2141, 3747, + 2141, 2130, 2138, 2141, 3750, 2139, 3752, 3753, 2140, 2142, + 2142, 2142, 3754, 3747, 2133, 2143, 2143, 2143, 3755, 2143, + 3757, 3759, 2143, 2144, 2144, 2144, 2142, 2145, 2145, 2145, + 2146, 2146, 2146, 3761, 2146, 3763, 3764, 2146, 2147, 2147, + + 2147, 2144, 3766, 3769, 2145, 2148, 2148, 2148, 3770, 2148, + 2138, 3771, 2148, 2139, 3772, 2147, 2151, 2151, 2151, 2152, + 2152, 2152, 3773, 2152, 3774, 3775, 2152, 2153, 2153, 2153, + 2154, 2154, 2154, 2151, 2154, 3776, 3777, 2154, 2157, 2157, + 2157, 2162, 2162, 2162, 3778, 2153, 2158, 2158, 2158, 2144, + 2158, 3779, 3780, 2158, 3784, 2157, 3786, 3423, 2162, 2163, + 2163, 2163, 3788, 2163, 3789, 3790, 2163, 2164, 2164, 2164, + 2167, 2167, 2167, 3423, 2167, 3423, 3791, 2167, 1511, 2153, + 2170, 2170, 2170, 3810, 2164, 2171, 2171, 2171, 3423, 2171, + 3794, 3810, 2171, 2174, 2174, 2174, 3811, 2170, 2175, 2175, + + 2175, 2178, 2178, 2178, 3811, 2179, 2179, 2179, 3802, 2179, + 3795, 2174, 2179, 2180, 2180, 2180, 2175, 2180, 2178, 3806, + 2180, 2184, 2184, 2184, 2186, 2186, 2186, 3794, 2187, 2187, + 2187, 2188, 2188, 2188, 2190, 2190, 2190, 3803, 1506, 2184, + 2193, 2193, 2193, 3807, 1505, 2174, 2187, 3795, 3804, 2188, + 3805, 2190, 2175, 2196, 2196, 2196, 3826, 3802, 2193, 2197, + 2197, 2197, 3812, 2197, 3806, 3814, 2197, 2200, 2200, 2200, + 3812, 2196, 2202, 2202, 2202, 3808, 2204, 2204, 2204, 3808, + 2204, 2190, 2188, 2204, 1499, 2200, 3803, 2187, 3807, 3826, + 2202, 2207, 2207, 2207, 2208, 2208, 2208, 3804, 2208, 3805, + + 3809, 2208, 3813, 2196, 3809, 2210, 2210, 2210, 2207, 2210, + 3813, 3832, 2210, 3814, 2200, 2214, 2214, 2214, 2217, 2217, + 2217, 2218, 2218, 2218, 2219, 2219, 2219, 2220, 2220, 2220, + 2222, 2222, 2222, 2214, 3816, 2217, 2227, 2227, 2227, 2218, + 2228, 2228, 2228, 3818, 2228, 3852, 3832, 2228, 2231, 2231, + 2231, 2234, 2234, 2234, 2227, 2236, 2236, 2236, 2238, 2238, + 2238, 2240, 2240, 2240, 3819, 3817, 2231, 3827, 2234, 2241, + 2241, 2241, 3816, 2236, 3815, 3852, 2238, 3822, 3823, 2240, + 2242, 2242, 2242, 2218, 2242, 3818, 2241, 2242, 2243, 2243, + 2243, 2244, 2244, 2244, 2245, 2245, 2245, 3820, 2245, 3833, + + 3827, 2245, 2227, 3817, 1498, 2243, 3819, 3824, 2244, 2246, + 2246, 2246, 2247, 2247, 2247, 2236, 2248, 2248, 2248, 3821, + 2248, 3830, 3815, 2248, 3822, 3823, 2240, 2246, 1497, 2247, + 2251, 2251, 2251, 3820, 3833, 2243, 2255, 2255, 2255, 2256, + 2256, 2256, 2265, 2265, 2265, 3824, 2265, 3825, 2251, 2265, + 2268, 2268, 2268, 3846, 2255, 3821, 2256, 3830, 3828, 2247, + 2269, 2269, 2269, 2246, 2270, 2270, 2270, 3828, 2268, 2272, + 2272, 2272, 2273, 2273, 2273, 3831, 2273, 2269, 3838, 2273, + 3874, 3829, 2270, 3844, 2251, 3825, 2272, 2274, 2274, 2274, + 3829, 2275, 2275, 2275, 3842, 2275, 3846, 2268, 2275, 2277, + + 2277, 2277, 1496, 3842, 2274, 2281, 2281, 2281, 2282, 2282, + 2282, 3831, 2282, 3874, 3838, 2282, 3834, 2277, 2283, 2283, + 2283, 3844, 2281, 2289, 2289, 2289, 2290, 2290, 2290, 2291, + 2291, 2291, 2293, 2293, 2293, 2297, 2297, 2297, 2298, 2298, + 2298, 2299, 2299, 2299, 2300, 2300, 2300, 2303, 2303, 2303, + 2308, 2308, 2308, 2309, 2309, 2309, 2311, 2311, 2311, 3835, + 3834, 2277, 2312, 2312, 2312, 2313, 2313, 2313, 2316, 2316, + 2316, 3847, 2316, 1485, 3839, 2316, 2319, 2319, 2319, 3901, + 2319, 3840, 3836, 2319, 2323, 2323, 2323, 2325, 2325, 2325, + 3901, 2300, 2326, 2326, 2326, 3862, 2327, 2327, 2327, 2328, + + 2328, 2328, 2323, 3835, 2325, 2329, 2329, 2329, 3845, 2326, + 3839, 3837, 2313, 2327, 3847, 3840, 2328, 2332, 2332, 2332, + 2334, 2334, 2334, 2329, 2335, 2335, 2335, 3848, 2335, 3836, + 3850, 2335, 2336, 2336, 2336, 2332, 2323, 2334, 2337, 2337, + 2337, 3853, 2337, 3862, 2326, 2337, 3845, 2340, 2340, 2340, + 2336, 2340, 3841, 3849, 2340, 2343, 2343, 2343, 3837, 2328, + 1474, 2327, 2344, 2344, 2344, 2345, 2345, 2345, 3850, 2345, + 1469, 3853, 2345, 2343, 3848, 2343, 2476, 2476, 2332, 2476, + 2344, 2348, 2348, 2348, 3851, 2348, 3841, 2476, 2348, 2351, + 2351, 2351, 3843, 2336, 2476, 2352, 2352, 2352, 2344, 2352, + + 3849, 3843, 2352, 2355, 2355, 2355, 3858, 2351, 2356, 2356, + 2356, 1468, 2356, 1467, 3854, 2356, 3856, 2357, 2357, 2357, + 2355, 2357, 3851, 3854, 2357, 2360, 2360, 2360, 2361, 2361, + 2361, 3855, 2361, 2351, 3860, 2361, 1463, 2367, 2367, 2367, + 3855, 2367, 3860, 2360, 2367, 2370, 2370, 2370, 2371, 2371, + 2371, 3856, 2371, 3858, 3863, 2371, 2374, 2374, 2374, 3859, + 2374, 3857, 2370, 2374, 2378, 2378, 2378, 2379, 2379, 2379, + 2380, 2380, 2380, 2383, 2383, 2383, 3864, 2383, 3861, 3868, + 2383, 2378, 2387, 2387, 2387, 2379, 3861, 3878, 2380, 2388, + 2388, 2388, 2360, 2390, 2390, 2390, 3857, 2391, 2391, 2391, + + 2387, 2391, 3863, 3869, 2391, 1462, 3859, 2388, 3866, 3867, + 2390, 2396, 2396, 2396, 3864, 3868, 2397, 2397, 2397, 2399, + 2399, 2399, 1445, 2402, 2402, 2402, 1440, 2402, 3876, 2396, + 2402, 3865, 2379, 1439, 2397, 3878, 3876, 2399, 2387, 3869, + 3870, 2388, 2408, 2408, 2408, 2409, 2409, 2409, 3896, 2409, + 3866, 3867, 2409, 2410, 2410, 2410, 2411, 2411, 2411, 2408, + 2412, 2412, 2412, 2413, 2413, 2413, 2414, 2414, 2414, 3865, + 3871, 2410, 2415, 2415, 2415, 2416, 2416, 2416, 2396, 2397, + 2418, 2418, 2418, 2414, 2417, 2417, 2417, 3870, 3877, 2415, + 3875, 3879, 2416, 2420, 2420, 2420, 3877, 3896, 2418, 3892, + + 3872, 2417, 2421, 2421, 2421, 3882, 2421, 3883, 3892, 2421, + 2420, 2423, 2423, 2423, 2425, 2425, 2425, 3871, 2410, 2428, + 2428, 2428, 3884, 3875, 2415, 1438, 2429, 2429, 2429, 2423, + 2429, 3873, 2425, 2429, 2432, 2432, 2432, 2428, 3872, 3879, + 2416, 2433, 2433, 2433, 2417, 2433, 2418, 3882, 2433, 3883, + 1433, 2432, 2435, 2435, 2435, 3880, 2435, 3890, 3884, 2435, + 2438, 2438, 2438, 2439, 2439, 2439, 2440, 2440, 2440, 3873, + 2440, 1432, 3881, 2440, 2442, 2442, 2442, 3886, 2438, 3885, + 2439, 2446, 2446, 2446, 2448, 2448, 2448, 2449, 2449, 2449, + 3890, 2449, 2442, 3880, 2449, 2460, 2460, 2460, 1419, 2446, + + 3887, 2448, 2461, 2461, 2461, 1418, 1417, 2462, 2462, 2462, + 3881, 2462, 2438, 2460, 2462, 3885, 2463, 2463, 2463, 2461, + 2463, 3891, 3894, 2463, 3886, 1416, 2442, 2466, 2466, 2466, + 1415, 2466, 3893, 1414, 2466, 2470, 2470, 2470, 2471, 2471, + 2471, 3893, 2474, 2474, 2474, 2460, 2474, 3887, 1413, 2474, + 2477, 2477, 2477, 2470, 3891, 3894, 2471, 2478, 2478, 2478, + 2479, 2479, 2479, 2483, 2483, 2483, 2484, 2484, 2484, 2486, + 2486, 2486, 2487, 2487, 2487, 2489, 2489, 2489, 2490, 2490, + 2490, 2491, 2491, 2491, 2495, 2495, 2495, 2496, 2496, 2496, + 2500, 2500, 2500, 2501, 2501, 2501, 2503, 2503, 2503, 2504, + + 2504, 2504, 1412, 2470, 2509, 2509, 2509, 2510, 2510, 2510, + 2511, 2511, 2511, 2512, 2512, 2512, 3888, 2512, 1402, 3889, + 2512, 1401, 2509, 2513, 2513, 2513, 3897, 2511, 2514, 2514, + 2514, 2515, 2515, 2515, 2516, 2516, 2516, 2517, 2517, 2517, + 2513, 2518, 2518, 2518, 1400, 2514, 1395, 1394, 2515, 2519, + 2519, 2519, 3895, 2519, 3888, 2517, 2519, 3889, 2518, 2522, + 2522, 2522, 1393, 2523, 2523, 2523, 2524, 2524, 2524, 2525, + 2525, 2525, 2526, 2526, 2526, 3897, 2526, 2522, 1392, 2526, + 2514, 2523, 3898, 2515, 2524, 3895, 1377, 2525, 2529, 2529, + 2529, 2533, 2533, 2533, 1376, 2533, 3899, 1359, 2533, 1358, + + 2523, 2536, 2536, 2536, 2517, 1351, 2529, 2539, 2539, 2539, + 1347, 2522, 2540, 2540, 2540, 3898, 2540, 1342, 2536, 2540, + 2541, 2541, 2541, 1341, 2539, 2542, 2542, 2542, 2524, 3899, + 1336, 2525, 2547, 2547, 2547, 2548, 2548, 2548, 2541, 2549, + 2549, 2549, 1335, 2542, 2550, 2550, 2550, 1334, 2550, 1332, + 2547, 2550, 1331, 2548, 1326, 1323, 2549, 2553, 2553, 2553, + 2554, 2554, 2554, 2555, 2555, 2555, 2556, 2556, 2556, 2557, + 2557, 2557, 1322, 1319, 2553, 1318, 1317, 2554, 3900, 1316, + 2555, 1315, 1314, 2556, 1313, 1312, 2549, 2557, 2558, 2558, + 2558, 1311, 3900, 2547, 2559, 2559, 2559, 2563, 2563, 2563, + + 2564, 2564, 2564, 1310, 2564, 1309, 2558, 2564, 2567, 2567, + 2567, 2559, 1308, 2553, 1307, 2555, 2568, 2568, 2568, 2569, + 2569, 2569, 2554, 2571, 2571, 2571, 2567, 2570, 2570, 2570, + 2557, 2570, 1306, 1305, 2570, 1304, 2569, 2572, 2572, 2572, + 2571, 2573, 2573, 2573, 2574, 2574, 2574, 2575, 2575, 2575, + 2579, 2579, 2579, 2558, 2572, 2580, 2580, 2580, 2573, 2576, + 2576, 2576, 2574, 2576, 2575, 1301, 2576, 2579, 2567, 2584, + 2584, 2584, 1300, 2580, 2586, 2586, 2586, 1299, 2586, 1298, + 1297, 2586, 2590, 2590, 2590, 1295, 1294, 2584, 1293, 2572, + 2591, 2591, 2591, 2573, 2591, 1292, 1291, 2591, 1290, 1289, + + 2590, 2595, 2595, 2595, 2599, 2599, 2599, 1288, 2599, 1287, + 1286, 2599, 2612, 2612, 2612, 2614, 2614, 2579, 2614, 2595, + 2613, 2613, 2613, 1285, 2613, 1284, 2614, 2613, 2615, 2615, + 2612, 2615, 1283, 2614, 2617, 2617, 2617, 1282, 1281, 2615, + 2618, 2618, 2618, 2631, 2631, 2631, 2615, 1275, 2595, 2632, + 2632, 2632, 2617, 2636, 2636, 2636, 1271, 1268, 2618, 2637, + 2637, 2637, 2639, 2639, 2639, 2642, 2642, 2642, 2643, 2643, + 2643, 2647, 2647, 2647, 2612, 2650, 2650, 2650, 2652, 2652, + 2652, 2654, 2654, 2654, 2655, 2655, 2655, 1267, 2655, 1266, + 1264, 2655, 2658, 2658, 2658, 1260, 2652, 1251, 2659, 2659, + + 2659, 2617, 2659, 2618, 1246, 2659, 2660, 2660, 2660, 2658, + 2661, 2661, 2661, 2662, 2662, 2662, 2663, 2663, 2663, 2664, + 2664, 2664, 1245, 2660, 2665, 2665, 2665, 2661, 2665, 1244, + 1240, 2665, 1239, 1236, 2663, 1232, 2664, 2666, 2666, 2666, + 2667, 2667, 2667, 2668, 2668, 2668, 2669, 2669, 2669, 2670, + 2670, 2670, 2676, 2676, 2676, 2666, 1231, 1228, 2667, 1225, + 1222, 2668, 1221, 1216, 2669, 1208, 1207, 2670, 1206, 2676, + 2677, 2677, 2677, 1204, 2677, 1200, 1197, 2677, 2680, 2680, + 2680, 1192, 2680, 1191, 1190, 2680, 2683, 2683, 2683, 2687, + 2687, 2687, 2688, 2688, 2688, 2689, 2689, 2689, 2691, 2691, + + 2691, 2699, 2699, 2699, 2683, 2667, 2687, 2669, 1189, 1188, + 2688, 2668, 1187, 2689, 1186, 2691, 2692, 2692, 2692, 2699, + 2692, 1185, 1184, 2692, 2696, 2696, 2696, 2697, 2697, 2697, + 2698, 2698, 2698, 1181, 2698, 1180, 1177, 2698, 2700, 2700, + 2700, 2696, 1176, 1172, 2697, 2701, 2701, 2701, 1170, 1167, + 2688, 2702, 2702, 2702, 1166, 2702, 2700, 1163, 2702, 2705, + 2705, 2705, 2701, 2706, 2706, 2706, 2707, 2707, 2707, 1156, + 2708, 2708, 2708, 1153, 2708, 1152, 2705, 2708, 2711, 2711, + 2711, 2712, 2712, 2712, 2707, 2712, 1151, 1148, 2712, 2713, + 2713, 2713, 2714, 2714, 2714, 2711, 2715, 2715, 2715, 1147, + + 2700, 2717, 2717, 2717, 1143, 1136, 2713, 1132, 1131, 2714, + 2723, 2723, 2723, 1130, 2715, 2718, 2718, 2718, 2717, 2718, + 1127, 1126, 2718, 2726, 2726, 2726, 1125, 1118, 2723, 1117, + 2739, 2739, 2739, 2751, 2751, 2751, 2770, 2770, 2770, 1116, + 1115, 2726, 2771, 2771, 2771, 2774, 2774, 2774, 2739, 1114, + 1113, 2751, 2778, 2778, 2778, 2781, 2781, 2781, 2782, 2782, + 2782, 2783, 2783, 2783, 1112, 2783, 1111, 1110, 2783, 2786, + 2786, 2786, 2787, 2787, 2787, 2782, 2787, 1106, 1075, 2787, + 2788, 2788, 2788, 1072, 1069, 2751, 2786, 2790, 2790, 2790, + 2726, 2739, 2789, 2789, 2789, 1068, 2789, 2788, 1065, 2789, + + 2792, 2792, 2792, 1064, 2792, 2790, 1063, 2792, 2795, 2795, + 2795, 2797, 2797, 2797, 2798, 2798, 2798, 2799, 2799, 2799, + 2802, 2802, 2802, 2804, 2804, 2804, 2795, 2804, 1062, 2797, + 2804, 1061, 2798, 1060, 1053, 2799, 1052, 2802, 2816, 2816, + 2816, 2817, 2817, 2817, 2818, 2818, 2818, 1051, 2818, 1049, + 1048, 2818, 2819, 2819, 2819, 2816, 1047, 1046, 2817, 2820, + 2820, 2820, 1045, 2820, 1044, 1043, 2820, 1042, 1041, 2799, + 2819, 1040, 1039, 2797, 2826, 2826, 2826, 1038, 2827, 2827, + 2827, 2798, 2827, 1036, 1035, 2827, 2828, 2828, 2828, 1034, + 2828, 2826, 1033, 2828, 2831, 2831, 2831, 2833, 2833, 2833, + + 2834, 2834, 2834, 1032, 2834, 1031, 1030, 2834, 2838, 2838, + 2838, 1029, 2831, 1028, 1026, 2833, 2839, 2839, 2839, 2840, + 2840, 2840, 1025, 2840, 1024, 2838, 2840, 2841, 2841, 2841, + 2843, 2843, 2843, 2839, 2843, 1023, 1022, 2843, 2846, 2846, + 2846, 1021, 2847, 2847, 2847, 2841, 2847, 1020, 1019, 2847, + 2848, 2848, 2848, 1018, 1017, 2846, 1013, 2849, 2849, 2849, + 2833, 2849, 1009, 1008, 2849, 1007, 1006, 2848, 2850, 2850, + 2850, 1005, 2850, 1001, 999, 2850, 2854, 2854, 2854, 2855, + 2855, 2855, 2858, 2858, 2858, 2859, 2859, 2859, 2860, 2860, + 2860, 998, 997, 2854, 996, 995, 2855, 2871, 2871, 2871, + + 2858, 2884, 2884, 2884, 994, 2860, 2885, 2885, 2885, 2902, + 2902, 2902, 2904, 2904, 2904, 2871, 993, 990, 2884, 2908, + 2908, 2908, 989, 985, 2885, 2912, 2912, 2912, 2913, 2913, + 2913, 984, 2913, 983, 982, 2913, 2914, 2914, 2914, 979, + 2914, 978, 2912, 2914, 2917, 2917, 2917, 976, 2917, 974, + 971, 2917, 970, 969, 2858, 2920, 2920, 2920, 2871, 2921, + 2921, 2921, 2922, 2922, 2922, 2924, 2924, 2924, 2925, 2925, + 2925, 968, 966, 2920, 2926, 2926, 2926, 2921, 2926, 963, + 2922, 2926, 2924, 962, 960, 2925, 2927, 2927, 2927, 2939, + 2939, 2939, 2940, 2940, 2940, 959, 2940, 956, 2922, 2940, + + 2941, 2941, 2941, 2927, 2941, 954, 2939, 2941, 2944, 2944, + 2944, 2921, 2947, 2947, 2947, 2949, 2949, 2949, 951, 2949, + 950, 949, 2949, 2920, 948, 945, 2944, 944, 943, 2947, + 2958, 2958, 2958, 2960, 2960, 2960, 2961, 2961, 2961, 942, + 2961, 941, 940, 2961, 939, 2962, 2962, 2962, 2958, 2962, + 2960, 937, 2962, 2965, 2965, 2965, 934, 2965, 933, 929, + 2965, 2968, 2968, 2968, 928, 2968, 927, 926, 2968, 2978, + 2978, 2978, 2979, 2979, 2979, 925, 2979, 924, 915, 2979, + 2980, 2980, 2980, 2981, 2981, 2981, 2978, 2981, 914, 911, + 2981, 2982, 2982, 2982, 2983, 2983, 2983, 2980, 2984, 2984, + + 2984, 2985, 2985, 2985, 2986, 2986, 2986, 910, 2982, 909, + 908, 2983, 907, 2987, 2987, 2987, 2984, 2987, 905, 904, + 2987, 2986, 2998, 2998, 2998, 3011, 3011, 3011, 3012, 3012, + 3012, 903, 3012, 900, 899, 3012, 3013, 3013, 3013, 898, + 2998, 895, 3011, 894, 890, 3017, 3017, 3017, 3031, 3031, + 3031, 3033, 3033, 3033, 3013, 3036, 3036, 3036, 3038, 3038, + 3038, 2984, 3017, 3017, 3040, 3040, 3040, 888, 3040, 885, + 884, 3040, 883, 882, 2998, 3047, 3047, 3047, 3048, 3048, + 3048, 3049, 3049, 3049, 3051, 3051, 3051, 3052, 3052, 3052, + 880, 3052, 877, 3047, 3052, 876, 3048, 875, 874, 3049, + + 871, 3051, 3053, 3053, 3053, 868, 3053, 865, 864, 3053, + 3056, 3056, 3056, 3057, 3057, 3057, 863, 3057, 862, 861, + 3057, 3069, 3069, 3069, 858, 3069, 855, 3056, 3069, 3073, + 3073, 3073, 3074, 3074, 3074, 851, 3074, 850, 849, 3074, + 848, 847, 3047, 3049, 846, 845, 3073, 3082, 3082, 3082, + 3085, 3085, 3085, 844, 3085, 843, 842, 3085, 3100, 3100, + 3100, 841, 3101, 3101, 3101, 3082, 3101, 839, 837, 3101, + 3104, 3104, 3104, 834, 3104, 3100, 833, 3104, 3107, 3107, + 3107, 3108, 3108, 3108, 832, 3108, 831, 830, 3108, 3109, + 3109, 3109, 3110, 3110, 3110, 3107, 3110, 829, 824, 3110, + + 3111, 3111, 3111, 3112, 3112, 3112, 3109, 3112, 823, 822, + 3112, 3123, 3123, 3123, 821, 3136, 3136, 3136, 3111, 3136, + 818, 817, 3136, 3140, 3140, 3140, 3141, 3141, 3141, 3123, + 3142, 3142, 3142, 816, 3142, 813, 812, 3142, 811, 810, + 3140, 3140, 807, 3141, 3141, 3155, 3155, 3155, 3142, 3157, + 3157, 3157, 3111, 3158, 3158, 3158, 3159, 3159, 3159, 806, + 804, 3123, 3161, 3161, 3161, 3162, 3162, 3162, 3171, 3171, + 3171, 3172, 3172, 3172, 3174, 3174, 3174, 3176, 3176, 3176, + 801, 3176, 800, 796, 3176, 795, 3171, 794, 793, 3172, + 792, 791, 3174, 3179, 3179, 3179, 788, 3179, 787, 786, + + 3179, 3182, 3182, 3182, 3193, 3193, 3193, 3194, 3194, 3194, + 785, 3194, 784, 783, 3194, 3197, 3197, 3197, 3182, 778, + 3171, 3193, 3217, 3217, 3217, 774, 3218, 3218, 3218, 773, + 3218, 772, 3197, 3218, 3223, 3223, 3223, 771, 3223, 3217, + 768, 3223, 3174, 3226, 3226, 3226, 767, 3226, 766, 763, + 3226, 3229, 3229, 3229, 3238, 3238, 3238, 3256, 3256, 3256, + 3257, 3257, 3257, 761, 3257, 760, 759, 3257, 756, 3229, + 755, 754, 3238, 753, 3256, 3256, 749, 748, 3257, 3258, + 3258, 3258, 747, 3258, 743, 742, 3258, 3269, 3269, 3269, + 3271, 3271, 3271, 3272, 3272, 3272, 741, 3258, 3274, 3274, + + 3274, 3283, 3283, 3283, 3287, 3287, 3287, 740, 3287, 734, + 733, 3287, 731, 3284, 3284, 3284, 3359, 3359, 3359, 3283, + 723, 3238, 3259, 3259, 3259, 3259, 3259, 3259, 3259, 3259, + 3259, 3284, 722, 3259, 3286, 3286, 3286, 718, 3259, 3259, + 3259, 3259, 3259, 3288, 3288, 3288, 3298, 3298, 3298, 713, + 709, 3286, 3299, 3299, 3299, 708, 3299, 704, 698, 3299, + 3288, 697, 696, 3298, 692, 3300, 3300, 3300, 3259, 3259, + 3260, 3260, 3260, 3260, 3260, 3260, 3260, 3260, 3260, 689, + 3284, 3260, 3300, 3360, 3360, 3360, 3260, 3260, 3260, 3260, + 3260, 3301, 3301, 3301, 687, 3301, 686, 685, 3301, 3319, + + 3319, 3319, 681, 3319, 677, 673, 3319, 3326, 3326, 3326, + 3334, 3334, 3334, 3369, 3369, 3369, 3260, 3260, 672, 3348, + 3348, 3348, 671, 3348, 670, 3326, 3348, 666, 3334, 662, + 659, 3369, 658, 3376, 3376, 3376, 657, 3348, 3351, 3351, + 3351, 3351, 3351, 3351, 3351, 3351, 3351, 656, 652, 3351, + 3376, 3449, 3449, 3449, 3351, 3351, 3351, 3351, 3351, 3371, + 3371, 3371, 3373, 3373, 3373, 646, 3373, 645, 641, 3373, + 633, 3377, 3377, 3377, 629, 3377, 622, 3371, 3377, 620, + 3418, 3418, 3418, 619, 3351, 3351, 3352, 3352, 3352, 3352, + 3352, 3352, 3352, 3352, 3352, 615, 609, 3352, 3418, 3450, + + 3450, 3450, 3352, 3352, 3352, 3352, 3352, 608, 3385, 3385, + 3385, 3371, 3385, 604, 597, 3385, 3388, 3388, 3388, 596, + 3388, 595, 594, 3388, 3436, 3436, 3436, 3455, 3455, 3455, + 593, 589, 3352, 3352, 3456, 3456, 3456, 3461, 3461, 3461, + 578, 3461, 3436, 3436, 3461, 3455, 3468, 3468, 3468, 574, + 566, 3456, 3473, 3473, 3473, 3500, 3500, 3500, 3504, 3504, + 3504, 565, 564, 3468, 3517, 3517, 3517, 563, 562, 3473, + 3519, 3519, 3519, 3500, 558, 552, 3504, 3520, 3520, 3520, + 551, 3520, 3517, 547, 3520, 541, 540, 3519, 3531, 3531, + 3531, 3532, 3532, 3532, 536, 3532, 530, 529, 3532, 3539, + + 3539, 3539, 3540, 3540, 3540, 3531, 3540, 525, 521, 3540, + 3504, 3557, 3557, 3557, 517, 516, 3539, 3569, 3569, 3569, + 515, 3569, 511, 507, 3569, 503, 3582, 3582, 3582, 3557, + 3582, 499, 493, 3582, 3591, 3591, 3591, 492, 3591, 491, + 487, 3591, 3768, 3768, 3768, 3781, 3781, 3781, 3557, 3781, + 483, 478, 3781, 3902, 3902, 3902, 3903, 3903, 3903, 477, + 3768, 476, 475, 3781, 471, 467, 464, 460, 456, 453, + 450, 3902, 448, 447, 3903, 3906, 3906, 3906, 3906, 3906, + 3906, 3906, 3906, 3906, 3907, 3907, 3907, 3907, 3907, 3907, + 3907, 3907, 3907, 3908, 3908, 3908, 3908, 3908, 3908, 3908, + + 3908, 3908, 3909, 3909, 3909, 3909, 3909, 3909, 3909, 3909, + 3909, 3910, 3910, 3910, 3910, 3910, 3910, 3910, 3910, 3910, + 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3911, 3912, + 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3912, 3913, 3913, + 3913, 3913, 3913, 3913, 3913, 3913, 3913, 3914, 3914, 3914, + 3914, 3914, 3914, 3914, 3914, 3914, 3915, 3915, 3915, 3915, + 3915, 3915, 3915, 3915, 3915, 3916, 3916, 3916, 3916, 3916, + 3916, 3916, 3916, 3916, 3917, 3917, 3917, 3917, 3917, 3917, + 3917, 3917, 3917, 3918, 3918, 3918, 3918, 3918, 3918, 3918, + 3918, 3918, 3919, 3919, 3919, 3919, 3919, 3919, 3919, 3919, + + 3919, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, 3920, + 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3921, 3922, + 3922, 3922, 3922, 3922, 3922, 3922, 3922, 3922, 3923, 3923, + 3923, 3923, 3923, 3923, 3923, 3923, 3923, 3924, 3924, 3924, + 3924, 3924, 3924, 3924, 3924, 3924, 3925, 3925, 3925, 3925, + 3925, 3925, 3925, 3925, 3925, 3926, 3926, 3926, 3926, 3926, + 3926, 3926, 3926, 3926, 3927, 3927, 3927, 3927, 3927, 3927, + 3927, 3927, 3927, 3928, 3928, 3928, 3928, 3928, 3928, 3928, + 3928, 3928, 3929, 3929, 3929, 3929, 3929, 3929, 3929, 3929, + 3929, 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930, 3930, + + 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3931, 3932, + 3932, 3932, 3932, 3932, 3932, 3932, 3932, 3932, 3933, 3933, + 3933, 3933, 3933, 3933, 3933, 3933, 3933, 3934, 3934, 3934, + 3934, 3934, 3934, 3934, 3934, 3934, 3935, 3935, 3935, 3935, + 3935, 3935, 3935, 3935, 3935, 3936, 3936, 3936, 3936, 3936, + 3936, 3936, 3936, 3936, 3937, 3937, 3937, 3937, 3937, 3937, + 3937, 3937, 3937, 3938, 3938, 3938, 3938, 3938, 3938, 3938, + 3938, 3938, 3939, 3939, 3939, 3939, 3939, 3939, 3939, 3939, + 3939, 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, 3940, + 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3941, 3942, + + 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3942, 3943, 3943, + 3943, 3943, 3943, 3943, 3943, 3943, 3943, 3944, 3944, 3944, + 3944, 3944, 3944, 3944, 3944, 3944, 3945, 3945, 3945, 3945, + 3945, 3945, 3945, 3945, 3945, 3946, 3946, 3946, 3946, 3946, + 3946, 3946, 3946, 3946, 3947, 3947, 3947, 3947, 3947, 3947, + 3947, 3947, 3947, 3948, 3948, 3948, 3948, 3948, 3948, 3948, + 3948, 3948, 3949, 3949, 3949, 3949, 3949, 3949, 3949, 3949, + 3949, 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950, 3950, + 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3951, 3952, + 3952, 3952, 3952, 3952, 3952, 3952, 3952, 3952, 3953, 3953, + + 3953, 3953, 3953, 3953, 3953, 3953, 3953, 3954, 3954, 3954, + 3954, 3954, 3954, 3954, 3954, 3954, 3955, 3955, 3955, 3955, + 3955, 3955, 3955, 3955, 3955, 3956, 3956, 3956, 3956, 3956, + 3956, 3956, 3956, 3956, 3957, 3957, 3957, 3957, 3957, 3957, + 3957, 3957, 3957, 3958, 3958, 3958, 3958, 3958, 3958, 3958, + 3958, 3958, 3959, 3959, 3959, 3959, 3959, 3959, 3959, 3959, + 3959, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, 3960, + 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3961, 3962, + 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3962, 3963, 3963, + 3963, 3963, 3963, 3963, 3963, 3963, 3963, 3964, 3964, 3964, + + 3964, 3964, 3964, 3964, 3964, 3964, 3965, 3965, 3965, 3965, + 3965, 3965, 3965, 3965, 3965, 3966, 3966, 3966, 3966, 3966, + 3966, 3966, 3966, 3966, 3967, 3967, 3967, 3967, 3967, 3967, + 3967, 3967, 3967, 3968, 3968, 3968, 3968, 3968, 3968, 3968, + 3968, 3968, 3969, 3969, 3969, 3969, 3969, 3969, 3969, 3969, + 3969, 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, 3970, + 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3971, 3972, + 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3972, 3973, 3973, + 3973, 3973, 3973, 3973, 3973, 3973, 3973, 3974, 3974, 3974, + 3974, 3974, 3974, 3974, 3974, 3974, 3975, 3975, 3975, 442, + + 435, 434, 3975, 3976, 3976, 3976, 433, 432, 431, 3976, + 3977, 3977, 3977, 427, 420, 419, 3977, 3978, 3978, 3978, + 418, 414, 407, 3978, 3979, 3979, 3979, 406, 402, 395, + 3979, 3980, 3980, 3980, 394, 393, 389, 3980, 3981, 3981, + 3981, 383, 382, 381, 3981, 3982, 3982, 3982, 377, 371, + 367, 3982, 3983, 3983, 3983, 363, 359, 358, 3983, 3984, + 3984, 3984, 357, 356, 355, 3984, 3985, 3985, 3985, 351, + 342, 341, 3985, 3986, 3986, 3986, 337, 333, 329, 3986, + 3987, 3987, 3987, 325, 324, 320, 3987, 3988, 3988, 3988, + 317, 316, 315, 3988, 3989, 3989, 3989, 309, 308, 306, + + 3989, 3990, 3990, 3990, 303, 291, 0, 3990, 3991, 3991, + 3991, 0, 0, 0, 3991, 3992, 3992, 3992, 0, 0, + 0, 3992, 3993, 3993, 3993, 0, 0, 0, 3993, 3994, + 3994, 3994, 0, 0, 0, 3994, 3995, 3995, 3995, 0, + 0, 0, 3995, 3996, 3996, 3996, 0, 0, 0, 3996, + 3997, 3997, 3997, 0, 0, 0, 3997, 3998, 3998, 3998, + 0, 0, 0, 3998, 3999, 3999, 3999, 0, 0, 0, + 3999, 4000, 4000, 4000, 0, 0, 0, 4000, 4001, 4001, + 4001, 0, 0, 0, 4001, 4002, 4002, 4002, 0, 0, + 0, 4002, 4003, 4003, 4003, 0, 0, 0, 4003, 4004, + + 4004, 4004, 0, 0, 0, 4004, 4005, 4005, 4005, 0, + 0, 0, 4005, 4006, 4006, 4006, 4006, 4006, 4006, 4006, + 0, 4006, 4007, 4007, 4007, 0, 0, 0, 4007, 4008, + 0, 0, 0, 4008, 4009, 4009, 4009, 0, 0, 0, + 4009, 4010, 0, 0, 0, 4010, 4011, 4011, 4011, 0, + 0, 0, 4011, 4012, 0, 0, 0, 4012, 4013, 4013, + 4013, 0, 0, 0, 4013, 4014, 0, 0, 0, 4014, + 4015, 4015, 4015, 0, 0, 0, 4015, 4016, 0, 0, + 0, 4016, 4017, 4017, 4017, 0, 0, 0, 4017, 4018, + 0, 0, 0, 4018, 4019, 4019, 4019, 0, 0, 0, + + 4019, 4020, 0, 0, 0, 4020, 4021, 4021, 4021, 0, + 0, 0, 4021, 4022, 0, 0, 0, 4022, 4023, 4023, + 4023, 0, 0, 0, 4023, 4024, 0, 0, 0, 4024, + 4025, 4025, 4025, 0, 0, 0, 4025, 4026, 0, 0, + 0, 4026, 4027, 4027, 4027, 0, 0, 0, 4027, 4028, + 0, 0, 0, 4028, 4029, 4029, 4029, 0, 0, 0, + 4029, 4030, 0, 0, 0, 4030, 4031, 4031, 4031, 0, + 0, 0, 4031, 4032, 0, 0, 0, 4032, 4033, 4033, + 4033, 0, 0, 0, 4033, 4034, 0, 0, 0, 4034, + 4035, 4035, 4035, 0, 0, 0, 4035, 4036, 0, 0, + + 0, 4036, 4037, 4037, 4037, 0, 0, 0, 4037, 4038, + 0, 0, 0, 4038, 4039, 4039, 4039, 0, 0, 0, + 4039, 4040, 0, 0, 0, 4040, 4041, 4041, 4041, 0, + 0, 0, 4041, 4042, 0, 0, 0, 4042, 4043, 4043, + 4043, 0, 0, 0, 4043, 4044, 0, 0, 0, 4044, + 4045, 4045, 4045, 0, 0, 0, 4045, 4046, 0, 0, + 0, 4046, 4047, 4047, 4047, 0, 0, 0, 4047, 4048, + 0, 0, 0, 4048, 4049, 4049, 4049, 0, 0, 0, + 4049, 4050, 0, 0, 0, 4050, 4051, 4051, 4051, 0, + 0, 0, 4051, 4052, 0, 0, 0, 4052, 4053, 4053, + + 4053, 0, 0, 0, 4053, 4054, 0, 0, 0, 4054, + 4055, 4055, 4055, 0, 0, 0, 4055, 4056, 0, 0, + 0, 4056, 4057, 4057, 4057, 0, 0, 0, 4057, 4058, + 0, 0, 0, 4058, 4059, 4059, 4059, 0, 0, 0, + 4059, 4060, 0, 0, 0, 4060, 4061, 4061, 4061, 0, + 0, 0, 4061, 4062, 0, 0, 0, 4062, 4063, 4063, + 4063, 0, 0, 0, 4063, 4064, 0, 0, 0, 4064, + 4065, 4065, 4065, 0, 0, 0, 4065, 4066, 0, 0, + 0, 4066, 4067, 4067, 4067, 0, 0, 0, 4067, 4068, + 0, 0, 0, 4068, 4069, 4069, 4069, 4069, 4069, 4069, + + 4069, 4069, 4069, 4070, 0, 0, 0, 0, 4070, 4071, + 4071, 4071, 0, 0, 0, 4071, 4072, 4072, 4072, 4072, + 0, 0, 4072, 4072, 4073, 4073, 4073, 4073, 0, 4073, + 0, 4073, 4074, 4074, 4074, 4074, 0, 0, 4074, 4074, + 4075, 4075, 4075, 0, 0, 0, 4075, 4076, 4076, 4076, + 4076, 0, 0, 4076, 4076, 4077, 4077, 4077, 0, 0, + 0, 4077, 4078, 4078, 4078, 4078, 0, 0, 4078, 4078, + 4079, 4079, 4079, 0, 0, 0, 4079, 4080, 4080, 4080, + 4080, 0, 0, 4080, 4080, 4081, 4081, 4081, 4081, 0, + 4081, 0, 4081, 4082, 4082, 4082, 4082, 0, 0, 4082, + + 4082, 4083, 4083, 4083, 4083, 0, 4083, 0, 4083, 4084, + 4084, 4084, 4084, 0, 0, 4084, 4084, 4085, 4085, 4085, + 4085, 0, 4085, 0, 4085, 4086, 4086, 4086, 4086, 0, + 0, 4086, 4086, 4087, 4087, 4087, 4087, 0, 4087, 0, + 4087, 4088, 4088, 4088, 4088, 0, 0, 4088, 4088, 4089, + 4089, 4089, 0, 0, 0, 4089, 4090, 4090, 4090, 4090, + 0, 0, 4090, 4090, 4091, 4091, 4091, 4091, 0, 0, + 4091, 4091, 4092, 4092, 4092, 0, 0, 0, 4092, 4093, + 4093, 4093, 4093, 0, 0, 4093, 4093, 4094, 4094, 4094, + 0, 0, 0, 4094, 4095, 4095, 4095, 4095, 0, 0, + + 4095, 4095, 4096, 4096, 4096, 0, 0, 0, 4096, 4097, + 4097, 4097, 4097, 0, 0, 4097, 4097, 4098, 4098, 4098, + 0, 0, 0, 4098, 4099, 4099, 4099, 4099, 0, 0, + 4099, 4099, 4100, 4100, 4100, 0, 0, 0, 4100, 4101, + 4101, 4101, 4101, 0, 0, 4101, 4101, 4102, 4102, 4102, + 0, 0, 0, 4102, 4103, 4103, 4103, 4103, 0, 0, + 4103, 4103, 4104, 4104, 4104, 0, 0, 0, 4104, 4105, + 4105, 4105, 4105, 0, 0, 4105, 4105, 4106, 4106, 4106, + 0, 0, 0, 4106, 4107, 4107, 4107, 4107, 0, 0, + 4107, 4107, 4108, 4108, 4108, 0, 0, 0, 4108, 4109, + + 4109, 4109, 4109, 0, 0, 4109, 4109, 4110, 4110, 4110, + 0, 0, 0, 4110, 4111, 4111, 4111, 4111, 0, 0, + 4111, 4111, 4112, 4112, 4112, 0, 0, 0, 4112, 4113, + 4113, 4113, 4113, 0, 0, 4113, 4113, 4114, 4114, 4114, + 0, 0, 0, 4114, 4115, 4115, 4115, 4115, 0, 0, + 4115, 4115, 4116, 4116, 4116, 4116, 0, 4116, 0, 4116, + 4117, 4117, 4117, 4117, 0, 0, 4117, 4117, 4118, 4118, + 4118, 0, 0, 0, 4118, 4119, 4119, 4119, 4119, 0, + 0, 4119, 4119, 4120, 4120, 4120, 0, 0, 0, 4120, + 4121, 4121, 4121, 4121, 0, 0, 4121, 4121, 4122, 4122, + + 4122, 0, 0, 0, 4122, 4123, 4123, 4123, 4123, 0, + 0, 4123, 4123, 4124, 4124, 4124, 0, 0, 0, 4124, + 4125, 4125, 4125, 4125, 0, 0, 4125, 4125, 4126, 4126, + 4126, 0, 0, 0, 4126, 4127, 4127, 4127, 4127, 0, + 0, 4127, 4127, 4128, 4128, 4128, 0, 0, 0, 4128, + 4129, 4129, 4129, 4129, 0, 0, 4129, 4129, 4130, 4130, + 4130, 4130, 0, 4130, 0, 4130, 4131, 4131, 4131, 4131, + 0, 0, 4131, 4131, 4132, 4132, 4132, 4132, 4132, 4132, + 4132, 4132, 4132, 4133, 0, 4133, 0, 0, 4133, 4134, + 4134, 4134, 0, 0, 0, 4134, 4135, 4135, 4135, 4135, + + 0, 0, 4135, 4135, 4136, 4136, 4136, 0, 0, 0, + 4136, 4137, 4137, 4137, 4137, 0, 0, 4137, 4137, 4138, + 4138, 4138, 0, 0, 0, 4138, 4139, 4139, 4139, 4139, + 0, 0, 4139, 4139, 4140, 4140, 4140, 0, 0, 0, + 4140, 4141, 4141, 4141, 4141, 0, 0, 4141, 4141, 4142, + 4142, 4142, 0, 0, 0, 4142, 4143, 4143, 4143, 4143, + 0, 0, 4143, 4143, 4144, 4144, 4144, 0, 0, 0, + 4144, 4145, 4145, 4145, 4145, 0, 0, 4145, 4145, 4146, + 4146, 4146, 4146, 0, 0, 4146, 4146, 4147, 4147, 4147, + 0, 0, 0, 4147, 4148, 4148, 4148, 4148, 0, 0, + + 4148, 4148, 4149, 4149, 4149, 0, 0, 0, 4149, 4150, + 4150, 4150, 4150, 0, 0, 4150, 4150, 4151, 4151, 4151, + 0, 0, 0, 4151, 4152, 4152, 4152, 4152, 0, 0, + 4152, 4152, 4153, 4153, 4153, 4153, 0, 0, 4153, 4153, + 4154, 4154, 4154, 0, 0, 0, 4154, 4155, 4155, 4155, + 4155, 0, 0, 4155, 4155, 4156, 4156, 4156, 4156, 0, + 4156, 0, 4156, 4157, 4157, 4157, 4157, 0, 0, 4157, + 4157, 4158, 4158, 4158, 4158, 0, 4158, 0, 4158, 4159, + 4159, 4159, 4159, 0, 0, 4159, 4159, 4160, 4160, 4160, + 0, 0, 0, 4160, 4161, 4161, 4161, 4161, 0, 0, + + 4161, 4161, 4162, 4162, 4162, 0, 0, 0, 4162, 4163, + 4163, 4163, 4163, 0, 0, 4163, 4163, 4164, 4164, 4164, + 0, 0, 0, 4164, 4165, 4165, 4165, 4165, 0, 0, + 4165, 4165, 4166, 4166, 4166, 4166, 0, 4166, 0, 4166, + 4167, 4167, 4167, 4167, 0, 0, 4167, 4167, 4168, 4168, + 4168, 0, 0, 0, 4168, 4169, 4169, 4169, 4169, 0, + 0, 4169, 4169, 4170, 4170, 4170, 0, 0, 0, 4170, + 4171, 4171, 4171, 4171, 0, 0, 4171, 4171, 4172, 4172, + 4172, 0, 0, 0, 4172, 4173, 4173, 4173, 4173, 0, + 0, 4173, 4173, 4174, 4174, 4174, 0, 0, 0, 4174, + + 4175, 4175, 4175, 4175, 0, 0, 4175, 4175, 4176, 4176, + 4176, 0, 0, 0, 4176, 4177, 4177, 4177, 4177, 0, + 0, 4177, 4177, 4178, 4178, 4178, 0, 0, 0, 4178, + 4179, 4179, 4179, 4179, 0, 0, 4179, 4179, 4180, 4180, + 4180, 0, 0, 0, 4180, 4181, 4181, 4181, 4181, 0, + 0, 4181, 4181, 4182, 4182, 4182, 0, 0, 0, 4182, + 4183, 4183, 4183, 4183, 0, 0, 4183, 4183, 4184, 4184, + 4184, 0, 0, 0, 4184, 4185, 4185, 4185, 4185, 0, + 0, 4185, 4185, 4186, 4186, 4186, 4186, 0, 4186, 0, + 4186, 4187, 4187, 4187, 4187, 0, 0, 4187, 4187, 4188, + + 4188, 4188, 0, 0, 0, 4188, 4189, 4189, 4189, 4189, + 0, 0, 4189, 4189, 4190, 4190, 4190, 0, 0, 0, + 4190, 4191, 4191, 4191, 4191, 0, 0, 4191, 4191, 4192, + 4192, 4192, 0, 0, 0, 4192, 4193, 4193, 4193, 4193, + 0, 0, 4193, 4193, 4194, 4194, 4194, 4194, 4194, 4194, + 4194, 4194, 4194, 4195, 4195, 4195, 4195, 4195, 4195, 4195, + 4195, 4195, 4196, 4196, 4196, 0, 0, 0, 4196, 4197, + 4197, 4197, 0, 0, 0, 4197, 4198, 4198, 4198, 4198, + 0, 0, 4198, 4198, 4199, 4199, 4199, 0, 0, 0, + 4199, 4200, 4200, 4200, 4200, 0, 0, 4200, 4200, 4201, + + 4201, 4201, 4201, 0, 4201, 0, 4201, 4202, 4202, 4202, + 4202, 0, 0, 4202, 4202, 4203, 4203, 4203, 0, 0, + 0, 4203, 4204, 4204, 4204, 4204, 0, 0, 4204, 4204, + 4205, 4205, 4205, 0, 0, 0, 4205, 4206, 4206, 4206, + 4206, 0, 0, 4206, 4206, 4207, 4207, 4207, 4207, 0, + 0, 4207, 4207, 4208, 4208, 4208, 0, 0, 0, 4208, + 4209, 4209, 4209, 4209, 0, 0, 4209, 4209, 4210, 4210, + 4210, 0, 0, 0, 4210, 4211, 4211, 4211, 4211, 0, + 0, 4211, 4211, 4212, 4212, 4212, 4212, 0, 4212, 0, + 4212, 4213, 4213, 4213, 4213, 0, 0, 4213, 4213, 4214, + + 4214, 4214, 4214, 0, 0, 4214, 4214, 4215, 4215, 4215, + 0, 0, 0, 4215, 4216, 4216, 4216, 4216, 0, 0, + 4216, 4216, 4217, 4217, 4217, 4217, 0, 0, 4217, 4217, + 4218, 4218, 4218, 4218, 0, 0, 4218, 4218, 4219, 4219, + 4219, 0, 0, 0, 4219, 4220, 4220, 4220, 4220, 0, + 0, 4220, 4220, 4221, 4221, 4221, 0, 0, 0, 4221, + 4222, 4222, 4222, 4222, 0, 0, 4222, 4222, 4223, 4223, + 4223, 4223, 0, 4223, 0, 4223, 4224, 4224, 4224, 4224, + 0, 0, 4224, 4224, 4225, 4225, 4225, 0, 0, 0, + 4225, 4226, 4226, 4226, 4226, 0, 0, 4226, 4226, 4227, + + 4227, 4227, 0, 0, 0, 4227, 4228, 4228, 4228, 4228, + 0, 0, 4228, 4228, 4229, 4229, 4229, 0, 0, 0, + 4229, 4230, 4230, 4230, 4230, 0, 0, 4230, 4230, 4231, + 4231, 4231, 0, 0, 0, 4231, 4232, 4232, 4232, 4232, + 0, 0, 4232, 4232, 4233, 4233, 4233, 4233, 0, 4233, + 0, 4233, 4234, 4234, 4234, 4234, 0, 0, 4234, 4234, + 4235, 4235, 4235, 0, 0, 0, 4235, 4236, 4236, 4236, + 4236, 0, 0, 4236, 4236, 4237, 4237, 4237, 0, 0, + 0, 4237, 4238, 4238, 4238, 4238, 0, 0, 4238, 4238, + 4239, 4239, 4239, 0, 0, 0, 4239, 4240, 4240, 4240, + + 4240, 0, 0, 4240, 4240, 4241, 4241, 4241, 0, 0, + 0, 4241, 4242, 4242, 4242, 4242, 0, 0, 4242, 4242, + 4243, 4243, 4243, 0, 0, 0, 4243, 4244, 4244, 4244, + 4244, 0, 0, 4244, 4244, 4245, 4245, 4245, 0, 0, + 0, 4245, 4246, 4246, 4246, 4246, 0, 0, 4246, 4246, + 4247, 4247, 4247, 0, 0, 0, 4247, 4248, 4248, 4248, + 4248, 0, 0, 4248, 4248, 4249, 4249, 4249, 0, 0, + 0, 4249, 4250, 4250, 4250, 4250, 0, 0, 4250, 4250, + 4251, 4251, 4251, 0, 0, 0, 4251, 4252, 4252, 4252, + 4252, 0, 0, 4252, 4252, 4253, 4253, 4253, 4253, 4253, + + 4253, 4253, 4253, 4253, 4254, 4254, 4254, 4254, 4254, 4254, + 4254, 4254, 4254, 4255, 4255, 4255, 0, 0, 0, 4255, + 4256, 4256, 4256, 4256, 0, 4256, 0, 4256, 4257, 4257, + 4257, 4257, 0, 0, 4257, 4257, 4258, 4258, 4258, 0, + 0, 0, 4258, 4259, 4259, 4259, 4259, 0, 0, 4259, + 4259, 4260, 4260, 4260, 4260, 0, 0, 4260, 4260, 4261, + 4261, 4261, 0, 0, 0, 4261, 4262, 4262, 4262, 4262, + 0, 0, 4262, 4262, 4263, 4263, 4263, 4263, 0, 4263, + 0, 4263, 4264, 4264, 4264, 4264, 0, 0, 4264, 4264, + 4265, 4265, 4265, 4265, 0, 0, 4265, 4265, 4266, 4266, + + 4266, 4266, 0, 4266, 0, 4266, 4267, 4267, 4267, 4267, + 0, 0, 4267, 4267, 4268, 4268, 4268, 4268, 0, 4268, + 0, 4268, 4269, 4269, 4269, 4269, 0, 0, 4269, 4269, + 4270, 4270, 4270, 4270, 0, 4270, 0, 4270, 4271, 4271, + 4271, 4271, 0, 0, 4271, 4271, 4272, 4272, 4272, 4272, + 0, 0, 4272, 4272, 4273, 4273, 4273, 0, 0, 0, + 4273, 4274, 4274, 4274, 4274, 0, 0, 4274, 4274, 4275, + 4275, 4275, 4275, 0, 0, 4275, 4275, 4276, 4276, 4276, + 4276, 0, 0, 4276, 4276, 4277, 4277, 4277, 0, 0, + 0, 4277, 4278, 4278, 4278, 4278, 0, 0, 4278, 4278, + + 4279, 4279, 4279, 0, 0, 0, 4279, 4280, 4280, 4280, + 4280, 0, 0, 4280, 4280, 4281, 4281, 4281, 4281, 0, + 0, 4281, 4281, 4282, 4282, 4282, 0, 0, 0, 4282, + 4283, 4283, 4283, 4283, 0, 0, 4283, 4283, 4284, 4284, + 4284, 0, 0, 0, 4284, 4285, 4285, 4285, 4285, 0, + 0, 4285, 4285, 4286, 4286, 4286, 0, 0, 0, 4286, + 4287, 4287, 4287, 4287, 0, 0, 4287, 4287, 4288, 4288, + 4288, 0, 0, 0, 4288, 4289, 4289, 4289, 4289, 0, + 0, 4289, 4289, 4290, 4290, 4290, 4290, 0, 0, 4290, + 4290, 4291, 4291, 4291, 0, 0, 0, 4291, 4292, 4292, + + 4292, 4292, 0, 0, 4292, 4292, 4293, 4293, 4293, 0, + 0, 0, 4293, 4294, 4294, 4294, 4294, 0, 0, 4294, + 4294, 4295, 4295, 4295, 0, 0, 0, 4295, 4296, 4296, + 4296, 4296, 0, 0, 4296, 4296, 4297, 4297, 4297, 4297, + 0, 4297, 0, 4297, 4298, 4298, 4298, 4298, 0, 0, + 4298, 4298, 4299, 4299, 4299, 0, 0, 0, 4299, 4300, + 4300, 4300, 4300, 0, 0, 4300, 4300, 4301, 4301, 4301, + 0, 0, 0, 4301, 4302, 4302, 4302, 4302, 0, 0, + 4302, 4302, 4303, 4303, 4303, 0, 0, 0, 4303, 4304, + 4304, 4304, 4304, 0, 0, 4304, 4304, 4305, 4305, 4305, + + 0, 0, 0, 4305, 4306, 4306, 4306, 4306, 0, 0, + 4306, 4306, 4307, 4307, 4307, 4307, 0, 4307, 0, 4307, + 4308, 4308, 4308, 4308, 0, 0, 4308, 4308, 4309, 4309, + 4309, 4309, 4309, 4309, 4309, 4309, 4309, 4310, 4310, 4310, + 4310, 4310, 4310, 4310, 4310, 4310, 4311, 4311, 4311, 4311, + 0, 4311, 0, 4311, 4312, 4312, 4312, 0, 0, 0, + 4312, 4313, 4313, 4313, 4313, 0, 0, 4313, 4313, 4314, + 4314, 4314, 0, 0, 0, 4314, 4315, 4315, 4315, 4315, + 0, 0, 4315, 4315, 4316, 4316, 4316, 4316, 0, 0, + 4316, 4316, 4317, 4317, 4317, 0, 0, 0, 4317, 4318, + + 4318, 4318, 4318, 0, 0, 4318, 4318, 4319, 4319, 4319, + 4319, 0, 0, 4319, 4319, 4320, 4320, 4320, 4320, 0, + 0, 4320, 4320, 4321, 4321, 4321, 4321, 0, 0, 4321, + 4321, 4322, 4322, 4322, 4322, 0, 4322, 0, 4322, 4323, + 4323, 4323, 4323, 0, 0, 4323, 4323, 4324, 4324, 4324, + 0, 0, 0, 4324, 4325, 4325, 4325, 4325, 0, 0, + 4325, 4325, 4326, 4326, 4326, 4326, 0, 0, 4326, 4326, + 4327, 4327, 4327, 0, 0, 0, 4327, 4328, 4328, 4328, + 4328, 0, 0, 4328, 4328, 4329, 4329, 4329, 4329, 0, + 0, 4329, 4329, 4330, 4330, 4330, 0, 0, 0, 4330, + + 4331, 4331, 4331, 0, 0, 0, 4331, 4332, 4332, 4332, + 4332, 0, 0, 4332, 4332, 4333, 4333, 4333, 4333, 0, + 0, 4333, 4333, 4334, 4334, 4334, 0, 0, 0, 4334, + 4335, 4335, 4335, 4335, 0, 0, 4335, 4335, 4336, 4336, + 4336, 0, 0, 0, 4336, 4337, 4337, 4337, 4337, 0, + 4337, 0, 4337, 4338, 4338, 4338, 4338, 0, 0, 4338, + 4338, 4339, 4339, 4339, 0, 0, 0, 4339, 4340, 4340, + 4340, 4340, 0, 0, 4340, 4340, 4341, 4341, 4341, 0, + 0, 0, 4341, 4342, 4342, 4342, 4342, 0, 0, 4342, + 4342, 4343, 4343, 4343, 0, 0, 0, 4343, 4344, 4344, + + 4344, 4344, 0, 0, 4344, 4344, 4345, 4345, 4345, 0, + 0, 0, 4345, 4346, 4346, 4346, 4346, 0, 0, 4346, + 4346, 4347, 4347, 4347, 4347, 0, 4347, 0, 4347, 4348, + 4348, 4348, 4348, 0, 0, 4348, 4348, 4349, 4349, 4349, + 4349, 0, 4349, 0, 4349, 4350, 4350, 4350, 4350, 0, + 0, 4350, 4350, 4351, 4351, 4351, 0, 0, 0, 4351, + 4352, 4352, 4352, 4352, 0, 0, 4352, 4352, 4353, 4353, + 4353, 4353, 0, 4353, 0, 4353, 4354, 4354, 4354, 4354, + 0, 0, 4354, 4354, 4355, 4355, 4355, 4355, 0, 4355, + 0, 4355, 4356, 4356, 4356, 0, 0, 0, 4356, 4357, + + 4357, 4357, 4357, 0, 0, 4357, 4357, 4358, 4358, 4358, + 4358, 4358, 4358, 4358, 4358, 4358, 4359, 4359, 4359, 4359, + 4359, 4359, 4359, 4359, 4359, 4360, 4360, 4360, 0, 0, + 0, 4360, 4361, 4361, 4361, 4361, 0, 0, 4361, 4361, + 4362, 4362, 4362, 4362, 0, 4362, 0, 4362, 4363, 4363, + 4363, 4363, 0, 0, 4363, 4363, 4364, 4364, 4364, 0, + 0, 0, 4364, 4365, 4365, 4365, 4365, 0, 0, 4365, + 4365, 4366, 4366, 4366, 4366, 0, 0, 4366, 4366, 4367, + 4367, 4367, 4367, 0, 0, 4367, 4367, 4368, 4368, 4368, + 4368, 0, 0, 4368, 4368, 4369, 4369, 4369, 4369, 0, + + 0, 4369, 4369, 4370, 4370, 4370, 0, 0, 0, 4370, + 4371, 4371, 4371, 4371, 0, 0, 4371, 4371, 4372, 4372, + 4372, 4372, 0, 0, 4372, 4372, 4373, 4373, 4373, 0, + 0, 0, 4373, 4374, 4374, 4374, 4374, 0, 0, 4374, + 4374, 4375, 4375, 4375, 4375, 0, 0, 4375, 4375, 4376, + 4376, 4376, 0, 0, 0, 4376, 4377, 4377, 4377, 0, + 0, 0, 4377, 4378, 4378, 4378, 4378, 0, 0, 4378, + 4378, 4379, 4379, 4379, 4379, 0, 0, 4379, 4379, 4380, + 4380, 4380, 0, 0, 0, 4380, 4381, 4381, 4381, 0, + 0, 0, 4381, 4382, 4382, 4382, 4382, 0, 0, 4382, + + 4382, 4383, 4383, 4383, 4383, 0, 4383, 0, 4383, 4384, + 4384, 4384, 4384, 0, 0, 4384, 4384, 4385, 4385, 4385, + 0, 0, 0, 4385, 4386, 4386, 4386, 4386, 0, 0, + 4386, 4386, 4387, 4387, 4387, 0, 0, 0, 4387, 4388, + 4388, 4388, 0, 0, 0, 4388, 4389, 4389, 4389, 4389, + 0, 0, 4389, 4389, 4390, 4390, 4390, 0, 0, 0, + 4390, 4391, 4391, 4391, 4391, 0, 0, 4391, 4391, 4392, + 4392, 4392, 0, 0, 0, 4392, 4393, 4393, 4393, 4393, + 0, 0, 4393, 4393, 4394, 4394, 4394, 0, 0, 0, + 4394, 4395, 4395, 4395, 4395, 0, 0, 4395, 4395, 4396, + + 4396, 4396, 0, 0, 0, 4396, 4397, 4397, 4397, 4397, + 0, 0, 4397, 4397, 4398, 4398, 4398, 4398, 4398, 4398, + 4398, 4398, 4398, 4399, 4399, 4399, 4399, 4399, 4399, 4399, + 4399, 4399, 4400, 4400, 4400, 0, 0, 0, 4400, 4401, + 4401, 4401, 4401, 0, 0, 4401, 4401, 4402, 4402, 4402, + 4402, 0, 4402, 0, 4402, 4403, 4403, 4403, 4403, 0, + 0, 4403, 4403, 4404, 4404, 4404, 4404, 0, 4404, 0, + 4404, 4405, 4405, 4405, 4405, 0, 0, 4405, 4405, 4406, + 4406, 4406, 4406, 0, 0, 4406, 4406, 4407, 4407, 4407, + 4407, 0, 0, 4407, 4407, 4408, 4408, 4408, 4408, 0, + + 0, 4408, 4408, 4409, 4409, 4409, 4409, 0, 0, 4409, + 4409, 4410, 4410, 4410, 0, 0, 0, 4410, 4411, 4411, + 4411, 4411, 0, 0, 4411, 4411, 4412, 4412, 4412, 0, + 0, 0, 4412, 4413, 4413, 4413, 4413, 0, 0, 4413, + 4413, 4414, 4414, 4414, 4414, 0, 0, 4414, 4414, 4415, + 4415, 4415, 4415, 0, 4415, 0, 4415, 4416, 4416, 4416, + 4416, 0, 4416, 0, 4416, 4417, 4417, 4417, 4417, 0, + 0, 4417, 4417, 4418, 4418, 4418, 4418, 0, 0, 4418, + 4418, 4419, 4419, 4419, 4419, 0, 4419, 0, 4419, 4420, + 4420, 4420, 0, 0, 0, 4420, 4421, 4421, 4421, 4421, + + 0, 0, 4421, 4421, 4422, 4422, 4422, 4422, 0, 4422, + 0, 4422, 4423, 4423, 4423, 4423, 0, 0, 4423, 4423, + 4424, 4424, 4424, 4424, 0, 4424, 0, 4424, 4425, 4425, + 4425, 0, 0, 0, 4425, 4426, 4426, 4426, 0, 0, + 0, 4426, 4427, 4427, 4427, 0, 0, 0, 4427, 4428, + 4428, 4428, 4428, 0, 0, 4428, 4428, 4429, 4429, 4429, + 0, 0, 0, 4429, 4430, 4430, 4430, 4430, 0, 0, + 4430, 4430, 4431, 4431, 4431, 0, 0, 0, 4431, 4432, + 4432, 4432, 4432, 0, 0, 4432, 4432, 4433, 4433, 4433, + 0, 0, 0, 4433, 4434, 4434, 4434, 4434, 0, 0, + + 4434, 4434, 4435, 4435, 4435, 4435, 4435, 4435, 4435, 4435, + 4435, 4436, 4436, 4436, 4436, 4436, 4436, 4436, 4436, 4436, + 4437, 4437, 4437, 0, 0, 0, 4437, 4438, 4438, 4438, + 4438, 0, 4438, 0, 4438, 4439, 4439, 4439, 4439, 0, + 0, 4439, 4439, 4440, 4440, 4440, 4440, 0, 0, 4440, + 4440, 4441, 4441, 4441, 4441, 0, 0, 4441, 4441, 4442, + 4442, 4442, 4442, 0, 0, 4442, 4442, 4443, 4443, 4443, + 4443, 0, 0, 4443, 4443, 4444, 4444, 4444, 0, 0, + 0, 4444, 4445, 4445, 4445, 0, 0, 0, 4445, 4446, + 4446, 4446, 4446, 0, 0, 4446, 4446, 4447, 4447, 4447, + + 0, 0, 0, 4447, 4448, 4448, 4448, 4448, 0, 0, + 4448, 4448, 4449, 4449, 4449, 4449, 0, 0, 4449, 4449, + 4450, 4450, 4450, 0, 0, 0, 4450, 4451, 4451, 4451, + 4451, 0, 0, 4451, 4451, 4452, 4452, 4452, 4452, 0, + 4452, 0, 4452, 4453, 4453, 4453, 0, 0, 0, 4453, + 4454, 4454, 4454, 0, 0, 0, 4454, 4455, 4455, 4455, + 0, 0, 0, 4455, 4456, 4456, 4456, 0, 0, 0, + 4456, 4457, 4457, 4457, 0, 0, 0, 4457, 4458, 4458, + 4458, 4458, 0, 0, 4458, 4458, 4459, 4459, 4459, 0, + 0, 0, 4459, 4460, 4460, 4460, 4460, 0, 0, 4460, + + 4460, 4461, 4461, 4461, 0, 0, 0, 4461, 4462, 4462, + 4462, 4462, 0, 0, 4462, 4462, 4463, 4463, 4463, 4463, + 4463, 4463, 4463, 4463, 4463, 4464, 4464, 4464, 4464, 4464, + 4464, 4464, 4464, 4464, 4465, 4465, 4465, 4465, 0, 4465, + 0, 4465, 4466, 4466, 4466, 4466, 4466, 4466, 4466, 4466, + 4466, 4467, 4467, 4467, 4467, 4467, 4467, 4467, 4467, 4467, + 4468, 4468, 4468, 4468, 4468, 4468, 4468, 4468, 4468, 4469, + 4469, 4469, 4469, 4469, 4469, 4469, 4469, 4469, 4470, 4470, + 4470, 4470, 4470, 4470, 4470, 4470, 4470, 4471, 4471, 4471, + 4471, 4471, 4471, 4471, 4471, 4471, 3905, 3905, 3905, 3905, + + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, 3905, + 3905, 3905 } ; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[562] = +static yyconst flex_int32_t yy_rule_can_match_eol[652] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, - 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, - 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, - 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, - 1, 0, }; + 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, + 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, }; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; @@ -4463,6 +5136,21 @@ short int surfxml_ASroute_src_isset; AT_surfxml_ASroute_symmetrical AX_surfxml_ASroute_symmetrical; #define A_surfxml_ASroute_symmetrical AX_surfxml_ASroute_symmetrical short int surfxml_ASroute_symmetrical_isset; +AT_surfxml_actor_function AX_surfxml_actor_function; +#define A_surfxml_actor_function (surfxml_bufferstack + AX_surfxml_actor_function) +short int surfxml_actor_function_isset; +AT_surfxml_actor_host AX_surfxml_actor_host; +#define A_surfxml_actor_host (surfxml_bufferstack + AX_surfxml_actor_host) +short int surfxml_actor_host_isset; +AT_surfxml_actor_kill___time AX_surfxml_actor_kill___time; +#define A_surfxml_actor_kill___time (surfxml_bufferstack + AX_surfxml_actor_kill___time) +short int surfxml_actor_kill___time_isset; +AT_surfxml_actor_on___failure AX_surfxml_actor_on___failure; +#define A_surfxml_actor_on___failure AX_surfxml_actor_on___failure +short int surfxml_actor_on___failure_isset; +AT_surfxml_actor_start___time AX_surfxml_actor_start___time; +#define A_surfxml_actor_start___time (surfxml_bufferstack + AX_surfxml_actor_start___time) +short int surfxml_actor_start___time_isset; AT_surfxml_argument_value AX_surfxml_argument_value; #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value) short int surfxml_argument_value_isset; @@ -4493,6 +5181,18 @@ short int surfxml_bypassRoute_dst_isset; AT_surfxml_bypassRoute_src AX_surfxml_bypassRoute_src; #define A_surfxml_bypassRoute_src (surfxml_bufferstack + AX_surfxml_bypassRoute_src) short int surfxml_bypassRoute_src_isset; +AT_surfxml_bypassZoneRoute_dst AX_surfxml_bypassZoneRoute_dst; +#define A_surfxml_bypassZoneRoute_dst (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_dst) +short int surfxml_bypassZoneRoute_dst_isset; +AT_surfxml_bypassZoneRoute_gw___dst AX_surfxml_bypassZoneRoute_gw___dst; +#define A_surfxml_bypassZoneRoute_gw___dst (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_gw___dst) +short int surfxml_bypassZoneRoute_gw___dst_isset; +AT_surfxml_bypassZoneRoute_gw___src AX_surfxml_bypassZoneRoute_gw___src; +#define A_surfxml_bypassZoneRoute_gw___src (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_gw___src) +short int surfxml_bypassZoneRoute_gw___src_isset; +AT_surfxml_bypassZoneRoute_src AX_surfxml_bypassZoneRoute_src; +#define A_surfxml_bypassZoneRoute_src (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_src) +short int surfxml_bypassZoneRoute_src_isset; AT_surfxml_cabinet_bw AX_surfxml_cabinet_bw; #define A_surfxml_cabinet_bw (surfxml_bufferstack + AX_surfxml_cabinet_bw) short int surfxml_cabinet_bw_isset; @@ -4778,6 +5478,27 @@ short int surfxml_trace___connect_kind_isset; AT_surfxml_trace___connect_trace AX_surfxml_trace___connect_trace; #define A_surfxml_trace___connect_trace (surfxml_bufferstack + AX_surfxml_trace___connect_trace) short int surfxml_trace___connect_trace_isset; +AT_surfxml_zone_id AX_surfxml_zone_id; +#define A_surfxml_zone_id (surfxml_bufferstack + AX_surfxml_zone_id) +short int surfxml_zone_id_isset; +AT_surfxml_zone_routing AX_surfxml_zone_routing; +#define A_surfxml_zone_routing AX_surfxml_zone_routing +short int surfxml_zone_routing_isset; +AT_surfxml_zoneRoute_dst AX_surfxml_zoneRoute_dst; +#define A_surfxml_zoneRoute_dst (surfxml_bufferstack + AX_surfxml_zoneRoute_dst) +short int surfxml_zoneRoute_dst_isset; +AT_surfxml_zoneRoute_gw___dst AX_surfxml_zoneRoute_gw___dst; +#define A_surfxml_zoneRoute_gw___dst (surfxml_bufferstack + AX_surfxml_zoneRoute_gw___dst) +short int surfxml_zoneRoute_gw___dst_isset; +AT_surfxml_zoneRoute_gw___src AX_surfxml_zoneRoute_gw___src; +#define A_surfxml_zoneRoute_gw___src (surfxml_bufferstack + AX_surfxml_zoneRoute_gw___src) +short int surfxml_zoneRoute_gw___src_isset; +AT_surfxml_zoneRoute_src AX_surfxml_zoneRoute_src; +#define A_surfxml_zoneRoute_src (surfxml_bufferstack + AX_surfxml_zoneRoute_src) +short int surfxml_zoneRoute_src_isset; +AT_surfxml_zoneRoute_symmetrical AX_surfxml_zoneRoute_symmetrical; +#define A_surfxml_zoneRoute_symmetrical AX_surfxml_zoneRoute_symmetrical +short int surfxml_zoneRoute_symmetrical_isset; /* XML state. */ #ifdef FLEX_DEBUG @@ -4952,100 +5673,126 @@ const char* *surfxml_statenames=NULL; #define S_surfxml_ASroute_1 22 #define S_surfxml_ASroute_2 23 #define E_surfxml_ASroute 24 -#define AL_surfxml_argument 25 -#define E_surfxml_argument 26 -#define AL_surfxml_backbone 27 -#define E_surfxml_backbone 28 -#define AL_surfxml_bypassASroute 29 -#define S_surfxml_bypassASroute 30 -#define S_surfxml_bypassASroute_1 31 -#define S_surfxml_bypassASroute_2 32 -#define E_surfxml_bypassASroute 33 -#define AL_surfxml_bypassRoute 34 -#define S_surfxml_bypassRoute 35 -#define S_surfxml_bypassRoute_1 36 -#define S_surfxml_bypassRoute_2 37 -#define E_surfxml_bypassRoute 38 -#define AL_surfxml_cabinet 39 -#define E_surfxml_cabinet 40 -#define AL_surfxml_cluster 41 -#define S_surfxml_cluster 42 -#define S_surfxml_cluster_1 43 -#define S_surfxml_cluster_2 44 -#define E_surfxml_cluster 45 -#define AL_surfxml_config 46 -#define S_surfxml_config 47 -#define S_surfxml_config_1 48 -#define S_surfxml_config_2 49 -#define E_surfxml_config 50 -#define AL_surfxml_host 51 -#define S_surfxml_host 52 -#define S_surfxml_host_1 53 -#define S_surfxml_host_2 54 -#define E_surfxml_host 55 -#define AL_surfxml_host___link 56 -#define E_surfxml_host___link 57 -#define AL_surfxml_include 58 -#define S_surfxml_include 59 -#define S_surfxml_include_1 60 -#define S_surfxml_include_2 61 -#define E_surfxml_include 62 -#define AL_surfxml_link 63 -#define S_surfxml_link 64 -#define S_surfxml_link_1 65 -#define S_surfxml_link_2 66 -#define E_surfxml_link 67 -#define AL_surfxml_link___ctn 68 -#define E_surfxml_link___ctn 69 -#define AL_surfxml_model___prop 70 -#define E_surfxml_model___prop 71 -#define AL_surfxml_mount 72 -#define E_surfxml_mount 73 -#define AL_surfxml_peer 74 -#define E_surfxml_peer 75 -#define ROOT_surfxml_platform 76 -#define AL_surfxml_platform 77 -#define S_surfxml_platform 78 -#define S_surfxml_platform_1 79 -#define S_surfxml_platform_2 80 -#define S_surfxml_platform_3 81 -#define S_surfxml_platform_4 82 -#define S_surfxml_platform_5 83 -#define S_surfxml_platform_6 84 -#define S_surfxml_platform_7 85 -#define S_surfxml_platform_8 86 -#define E_surfxml_platform 87 -#define AL_surfxml_process 88 -#define S_surfxml_process 89 -#define S_surfxml_process_1 90 -#define S_surfxml_process_2 91 -#define E_surfxml_process 92 -#define AL_surfxml_prop 93 -#define E_surfxml_prop 94 -#define AL_surfxml_random 95 -#define E_surfxml_random 96 -#define AL_surfxml_route 97 -#define S_surfxml_route 98 -#define S_surfxml_route_1 99 -#define S_surfxml_route_2 100 -#define E_surfxml_route 101 -#define AL_surfxml_router 102 -#define E_surfxml_router 103 -#define AL_surfxml_storage 104 -#define S_surfxml_storage 105 -#define S_surfxml_storage_1 106 -#define S_surfxml_storage_2 107 -#define E_surfxml_storage 108 -#define AL_surfxml_storage___type 109 -#define S_surfxml_storage___type 110 -#define S_surfxml_storage___type_1 111 -#define S_surfxml_storage___type_2 112 -#define E_surfxml_storage___type 113 -#define AL_surfxml_trace 114 -#define IN_trace 115 -#define AL_surfxml_trace___connect 116 -#define E_surfxml_trace___connect 117 -#define IMPOSSIBLE 118 +#define AL_surfxml_actor 25 +#define S_surfxml_actor 26 +#define S_surfxml_actor_1 27 +#define S_surfxml_actor_2 28 +#define E_surfxml_actor 29 +#define AL_surfxml_argument 30 +#define E_surfxml_argument 31 +#define AL_surfxml_backbone 32 +#define E_surfxml_backbone 33 +#define AL_surfxml_bypassASroute 34 +#define S_surfxml_bypassASroute 35 +#define S_surfxml_bypassASroute_1 36 +#define S_surfxml_bypassASroute_2 37 +#define E_surfxml_bypassASroute 38 +#define AL_surfxml_bypassRoute 39 +#define S_surfxml_bypassRoute 40 +#define S_surfxml_bypassRoute_1 41 +#define S_surfxml_bypassRoute_2 42 +#define E_surfxml_bypassRoute 43 +#define AL_surfxml_bypassZoneRoute 44 +#define S_surfxml_bypassZoneRoute 45 +#define S_surfxml_bypassZoneRoute_1 46 +#define S_surfxml_bypassZoneRoute_2 47 +#define E_surfxml_bypassZoneRoute 48 +#define AL_surfxml_cabinet 49 +#define E_surfxml_cabinet 50 +#define AL_surfxml_cluster 51 +#define S_surfxml_cluster 52 +#define S_surfxml_cluster_1 53 +#define S_surfxml_cluster_2 54 +#define E_surfxml_cluster 55 +#define AL_surfxml_config 56 +#define S_surfxml_config 57 +#define S_surfxml_config_1 58 +#define S_surfxml_config_2 59 +#define E_surfxml_config 60 +#define AL_surfxml_host 61 +#define S_surfxml_host 62 +#define S_surfxml_host_1 63 +#define S_surfxml_host_2 64 +#define E_surfxml_host 65 +#define AL_surfxml_host___link 66 +#define E_surfxml_host___link 67 +#define AL_surfxml_include 68 +#define S_surfxml_include 69 +#define S_surfxml_include_1 70 +#define S_surfxml_include_2 71 +#define E_surfxml_include 72 +#define AL_surfxml_link 73 +#define S_surfxml_link 74 +#define S_surfxml_link_1 75 +#define S_surfxml_link_2 76 +#define E_surfxml_link 77 +#define AL_surfxml_link___ctn 78 +#define E_surfxml_link___ctn 79 +#define AL_surfxml_model___prop 80 +#define E_surfxml_model___prop 81 +#define AL_surfxml_mount 82 +#define E_surfxml_mount 83 +#define AL_surfxml_peer 84 +#define E_surfxml_peer 85 +#define ROOT_surfxml_platform 86 +#define AL_surfxml_platform 87 +#define S_surfxml_platform 88 +#define S_surfxml_platform_1 89 +#define S_surfxml_platform_2 90 +#define S_surfxml_platform_3 91 +#define S_surfxml_platform_4 92 +#define S_surfxml_platform_5 93 +#define S_surfxml_platform_6 94 +#define S_surfxml_platform_7 95 +#define S_surfxml_platform_8 96 +#define E_surfxml_platform 97 +#define AL_surfxml_process 98 +#define S_surfxml_process 99 +#define S_surfxml_process_1 100 +#define S_surfxml_process_2 101 +#define E_surfxml_process 102 +#define AL_surfxml_prop 103 +#define E_surfxml_prop 104 +#define AL_surfxml_random 105 +#define E_surfxml_random 106 +#define AL_surfxml_route 107 +#define S_surfxml_route 108 +#define S_surfxml_route_1 109 +#define S_surfxml_route_2 110 +#define E_surfxml_route 111 +#define AL_surfxml_router 112 +#define E_surfxml_router 113 +#define AL_surfxml_storage 114 +#define S_surfxml_storage 115 +#define S_surfxml_storage_1 116 +#define S_surfxml_storage_2 117 +#define E_surfxml_storage 118 +#define AL_surfxml_storage___type 119 +#define S_surfxml_storage___type 120 +#define S_surfxml_storage___type_1 121 +#define S_surfxml_storage___type_2 122 +#define E_surfxml_storage___type 123 +#define AL_surfxml_trace 124 +#define IN_trace 125 +#define AL_surfxml_trace___connect 126 +#define E_surfxml_trace___connect 127 +#define AL_surfxml_zone 128 +#define S_surfxml_zone 129 +#define S_surfxml_zone_1 130 +#define S_surfxml_zone_2 131 +#define S_surfxml_zone_3 132 +#define S_surfxml_zone_4 133 +#define S_surfxml_zone_5 134 +#define S_surfxml_zone_6 135 +#define S_surfxml_zone_7 136 +#define S_surfxml_zone_8 137 +#define E_surfxml_zone 138 +#define AL_surfxml_zoneRoute 139 +#define S_surfxml_zoneRoute 140 +#define S_surfxml_zoneRoute_1 141 +#define S_surfxml_zoneRoute_2 142 +#define E_surfxml_zoneRoute 143 +#define IMPOSSIBLE 144 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way @@ -5166,7 +5913,7 @@ static int input (void ); { \ int c = '*'; \ size_t n; \ - for ( n = 0; n < (size_t) max_size && \ + for ( n = 0; n < (size_t)max_size && \ (c = getc( surf_parse_in )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ @@ -5305,6 +6052,8 @@ YY_DECL surfxml_bufferliteral('\0', &bnext, "0s"); surfxml_bufferliteral('\0', &bnext, "-1.0"); surfxml_bufferliteral('\0', &bnext, "-1.0"); + surfxml_bufferliteral('\0', &bnext, "-1.0"); + surfxml_bufferliteral('\0', &bnext, "-1.0"); if(!surfxml_statenames) {surfxml_statenames= (const char **)calloc(IMPOSSIBLE,sizeof(char*)); surfxml_statenames[PROLOG] = NULL; surfxml_statenames[DOCTYPE] = NULL; @@ -5330,6 +6079,11 @@ YY_DECL surfxml_statenames[S_surfxml_ASroute_1] = "ASroute"; surfxml_statenames[S_surfxml_ASroute_2] = "ASroute"; surfxml_statenames[E_surfxml_ASroute] = "ASroute"; + surfxml_statenames[AL_surfxml_actor] = NULL; + surfxml_statenames[S_surfxml_actor] = "actor"; + surfxml_statenames[S_surfxml_actor_1] = "actor"; + surfxml_statenames[S_surfxml_actor_2] = "actor"; + surfxml_statenames[E_surfxml_actor] = "actor"; surfxml_statenames[AL_surfxml_argument] = NULL; surfxml_statenames[E_surfxml_argument] = "argument"; surfxml_statenames[AL_surfxml_backbone] = NULL; @@ -5344,6 +6098,11 @@ YY_DECL surfxml_statenames[S_surfxml_bypassRoute_1] = "bypassRoute"; surfxml_statenames[S_surfxml_bypassRoute_2] = "bypassRoute"; surfxml_statenames[E_surfxml_bypassRoute] = "bypassRoute"; + surfxml_statenames[AL_surfxml_bypassZoneRoute] = NULL; + surfxml_statenames[S_surfxml_bypassZoneRoute] = "bypassZoneRoute"; + surfxml_statenames[S_surfxml_bypassZoneRoute_1] = "bypassZoneRoute"; + surfxml_statenames[S_surfxml_bypassZoneRoute_2] = "bypassZoneRoute"; + surfxml_statenames[E_surfxml_bypassZoneRoute] = "bypassZoneRoute"; surfxml_statenames[AL_surfxml_cabinet] = NULL; surfxml_statenames[E_surfxml_cabinet] = "cabinet"; surfxml_statenames[AL_surfxml_cluster] = NULL; @@ -5423,6 +6182,22 @@ YY_DECL surfxml_statenames[IN_trace] = "trace"; surfxml_statenames[AL_surfxml_trace___connect] = NULL; surfxml_statenames[E_surfxml_trace___connect] = "trace_connect"; + surfxml_statenames[AL_surfxml_zone] = NULL; + surfxml_statenames[S_surfxml_zone] = "zone"; + surfxml_statenames[S_surfxml_zone_1] = "zone"; + surfxml_statenames[S_surfxml_zone_2] = "zone"; + surfxml_statenames[S_surfxml_zone_3] = "zone"; + surfxml_statenames[S_surfxml_zone_4] = "zone"; + surfxml_statenames[S_surfxml_zone_5] = "zone"; + surfxml_statenames[S_surfxml_zone_6] = "zone"; + surfxml_statenames[S_surfxml_zone_7] = "zone"; + surfxml_statenames[S_surfxml_zone_8] = "zone"; + surfxml_statenames[E_surfxml_zone] = "zone"; + surfxml_statenames[AL_surfxml_zoneRoute] = NULL; + surfxml_statenames[S_surfxml_zoneRoute] = "zoneRoute"; + surfxml_statenames[S_surfxml_zoneRoute_1] = "zoneRoute"; + surfxml_statenames[S_surfxml_zoneRoute_2] = "zoneRoute"; + surfxml_statenames[E_surfxml_zoneRoute] = "zoneRoute"; } /* COMMENTS and PIs: handled uniformly for efficiency. */ @@ -5452,13 +6227,13 @@ yy_match: while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3334 ) + if ( yy_current_state >= 3906 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 11902 ); + while ( yy_base[yy_current_state] != 13997 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -5473,7 +6248,7 @@ yy_find_action: if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) { - int yyl; + unsigned int yyl; for ( yyl = 0; yyl < surf_parse_leng; ++yyl ) if ( surf_parse_text[yyl] == '\n' ) @@ -5684,6 +6459,7 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK @@ -5710,6 +6486,7 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK @@ -5828,8 +6605,10 @@ YY_RULE_SETUP if (!AX_surfxml_ASroute_src) FAIL("Required attribute `src' not set for `ASroute' element."); LEAVE; STag_surfxml_ASroute(); surfxml_pcdata_ix = 0; ETag_surfxml_ASroute(); popbuffer(); /* attribute */ switch (YY_START) { - case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_AS: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS_1: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_5: SET(S_surfxml_zone_6); break; + case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK @@ -5853,8 +6632,10 @@ YY_RULE_SETUP ETag_surfxml_ASroute(); popbuffer(); /* attribute */ switch (YY_START) { - case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: SET(S_surfxml_AS_6); break; - case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_AS: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS_1: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_5: SET(S_surfxml_zone_6); break; + case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK @@ -5876,50 +6657,186 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); case 68: /* rule 68 can match eol */ YY_RULE_SETUP -FAIL("Starting tag is not allowed here."); +FAIL("Starting tag is not allowed here."); YY_BREAK case 69: /* rule 69 can match eol */ YY_RULE_SETUP { - AX_surfxml_argument_value = 0; - surfxml_argument_value_isset = 0; - ENTER(AL_surfxml_argument); pushbuffer(0); + AX_surfxml_actor_function = 0; + surfxml_actor_function_isset = 0; + AX_surfxml_actor_host = 0; + surfxml_actor_host_isset = 0; + AX_surfxml_actor_kill___time = 60; + surfxml_actor_kill___time_isset = 0; + AX_surfxml_actor_on___failure = A_surfxml_actor_on___failure_DIE; + surfxml_actor_on___failure_isset = 0; + AX_surfxml_actor_start___time = 55; + surfxml_actor_start___time_isset = 0; + ENTER(AL_surfxml_actor); pushbuffer(0); } YY_BREAK case 70: /* rule 70 can match eol */ YY_RULE_SETUP -if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value); +if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_actor_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_function); YY_BREAK case 71: /* rule 71 can match eol */ YY_RULE_SETUP -if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value); +if (surfxml_actor_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_actor_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_function); YY_BREAK case 72: +/* rule 72 can match eol */ +YY_RULE_SETUP +if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_actor_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_host); + YY_BREAK +case 73: +/* rule 73 can match eol */ +YY_RULE_SETUP +if (surfxml_actor_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_actor_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_host); + YY_BREAK +case 74: +/* rule 74 can match eol */ +YY_RULE_SETUP +if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_actor_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_kill___time); + YY_BREAK +case 75: +/* rule 75 can match eol */ +YY_RULE_SETUP +if (surfxml_actor_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_actor_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_kill___time); + YY_BREAK +case 76: +/* rule 76 can match eol */ +case 77: +/* rule 77 can match eol */ +YY_RULE_SETUP +A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_DIE; + YY_BREAK +case 78: +/* rule 78 can match eol */ +case 79: +/* rule 79 can match eol */ +YY_RULE_SETUP +A_surfxml_actor_on___failure = A_surfxml_actor_on___failure_RESTART; + YY_BREAK +case 80: +/* rule 80 can match eol */ +YY_RULE_SETUP +if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_actor_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_actor_start___time); + YY_BREAK +case 81: +/* rule 81 can match eol */ +YY_RULE_SETUP +if (surfxml_actor_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_actor_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_actor_start___time); + YY_BREAK +case 82: +YY_RULE_SETUP +{ + if (!AX_surfxml_actor_function) FAIL("Required attribute `function' not set for `actor' element."); + if (!AX_surfxml_actor_host) FAIL("Required attribute `host' not set for `actor' element."); + LEAVE; STag_surfxml_actor();surfxml_pcdata_ix = 0; ENTER(S_surfxml_actor); + } + YY_BREAK +case 83: +YY_RULE_SETUP +{ + if (!AX_surfxml_actor_function) FAIL("Required attribute `function' not set for `actor' element."); + if (!AX_surfxml_actor_host) FAIL("Required attribute `host' not set for `actor' element."); + LEAVE; STag_surfxml_actor(); surfxml_pcdata_ix = 0; ETag_surfxml_actor(); popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_4: case S_surfxml_platform_6: case S_surfxml_platform_7: case S_surfxml_platform_8: SET(S_surfxml_platform_8); break; + } + } + YY_BREAK +case 84: +YY_RULE_SETUP +FAIL("Unexpected character `%c' in attribute list of actor element.", surf_parse_text[0]); + YY_BREAK +case 85: +YY_RULE_SETUP +FAIL("Bad attribute `%s' in `actor' element start tag.",surf_parse_text); + YY_BREAK +case YY_STATE_EOF(AL_surfxml_actor): +FAIL("EOF in attribute list of `actor' element."); + YY_BREAK + +case 86: +/* rule 86 can match eol */ +YY_RULE_SETUP +{ + LEAVE; + ETag_surfxml_actor(); + popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_4: case S_surfxml_platform_6: case S_surfxml_platform_7: case S_surfxml_platform_8: SET(S_surfxml_platform_8); break; + } + } + YY_BREAK +case 87: +/* rule 87 can match eol */ +YY_RULE_SETUP +FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); + YY_BREAK +case 88: +YY_RULE_SETUP +FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); + YY_BREAK +case YY_STATE_EOF(E_surfxml_actor): +case YY_STATE_EOF(S_surfxml_actor): +case YY_STATE_EOF(S_surfxml_actor_2): +if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); + YY_BREAK + +case 89: +/* rule 89 can match eol */ +YY_RULE_SETUP +FAIL("Starting tag is not allowed here."); + YY_BREAK +case 90: +/* rule 90 can match eol */ +YY_RULE_SETUP +{ + AX_surfxml_argument_value = 0; + surfxml_argument_value_isset = 0; + ENTER(AL_surfxml_argument); pushbuffer(0); + } + YY_BREAK + +case 91: +/* rule 91 can match eol */ +YY_RULE_SETUP +if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_argument_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_argument_value); + YY_BREAK +case 92: +/* rule 92 can match eol */ +YY_RULE_SETUP +if (surfxml_argument_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_argument_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_argument_value); + YY_BREAK +case 93: YY_RULE_SETUP { if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element."); LEAVE; STag_surfxml_argument();surfxml_pcdata_ix = 0; ENTER(E_surfxml_argument); } YY_BREAK -case 73: +case 94: YY_RULE_SETUP { if (!AX_surfxml_argument_value) FAIL("Required attribute `value' not set for `argument' element."); LEAVE; STag_surfxml_argument(); surfxml_pcdata_ix = 0; ETag_surfxml_argument(); popbuffer(); /* attribute */ switch (YY_START) { + case S_surfxml_actor: case S_surfxml_actor_1: case S_surfxml_actor_2: SET(S_surfxml_actor_2); break; case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break; } } YY_BREAK -case 74: +case 95: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of argument element.", surf_parse_text[0]); YY_BREAK -case 75: +case 96: YY_RULE_SETUP FAIL("Bad attribute `%s' in `argument' element start tag.",surf_parse_text); YY_BREAK @@ -5927,24 +6844,25 @@ case YY_STATE_EOF(AL_surfxml_argument): FAIL("EOF in attribute list of `argument' element."); YY_BREAK -case 76: -/* rule 76 can match eol */ +case 97: +/* rule 97 can match eol */ YY_RULE_SETUP { LEAVE; ETag_surfxml_argument(); popbuffer(); /* attribute */ switch (YY_START) { + case S_surfxml_actor: case S_surfxml_actor_1: case S_surfxml_actor_2: SET(S_surfxml_actor_2); break; case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break; } } YY_BREAK -case 77: -/* rule 77 can match eol */ +case 98: +/* rule 98 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 78: +case 99: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -5952,13 +6870,13 @@ case YY_STATE_EOF(E_surfxml_argument): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 79: -/* rule 79 can match eol */ +case 100: +/* rule 100 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 80: -/* rule 80 can match eol */ +case 101: +/* rule 101 can match eol */ YY_RULE_SETUP { AX_surfxml_backbone_bandwidth = 0; @@ -5971,37 +6889,37 @@ YY_RULE_SETUP } YY_BREAK -case 81: -/* rule 81 can match eol */ +case 102: +/* rule 102 can match eol */ YY_RULE_SETUP if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_bandwidth); YY_BREAK -case 82: -/* rule 82 can match eol */ +case 103: +/* rule 103 can match eol */ YY_RULE_SETUP if (surfxml_backbone_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_backbone_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_bandwidth); YY_BREAK -case 83: -/* rule 83 can match eol */ +case 104: +/* rule 104 can match eol */ YY_RULE_SETUP if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_backbone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_id); YY_BREAK -case 84: -/* rule 84 can match eol */ +case 105: +/* rule 105 can match eol */ YY_RULE_SETUP if (surfxml_backbone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_backbone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_id); YY_BREAK -case 85: -/* rule 85 can match eol */ +case 106: +/* rule 106 can match eol */ YY_RULE_SETUP if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_backbone_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_backbone_latency); YY_BREAK -case 86: -/* rule 86 can match eol */ +case 107: +/* rule 107 can match eol */ YY_RULE_SETUP if (surfxml_backbone_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_backbone_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_backbone_latency); YY_BREAK -case 87: +case 108: YY_RULE_SETUP { if (!AX_surfxml_backbone_bandwidth) FAIL("Required attribute `bandwidth' not set for `backbone' element."); @@ -6010,7 +6928,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_backbone();surfxml_pcdata_ix = 0; ENTER(E_surfxml_backbone); } YY_BREAK -case 88: +case 109: YY_RULE_SETUP { if (!AX_surfxml_backbone_bandwidth) FAIL("Required attribute `bandwidth' not set for `backbone' element."); @@ -6019,14 +6937,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_backbone(); surfxml_pcdata_ix = 0; ETag_surfxml_backbone(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 89: +case 110: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of backbone element.", surf_parse_text[0]); YY_BREAK -case 90: +case 111: YY_RULE_SETUP FAIL("Bad attribute `%s' in `backbone' element start tag.",surf_parse_text); YY_BREAK @@ -6034,8 +6953,8 @@ case YY_STATE_EOF(AL_surfxml_backbone): FAIL("EOF in attribute list of `backbone' element."); YY_BREAK -case 91: -/* rule 91 can match eol */ +case 112: +/* rule 112 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6043,15 +6962,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 92: -/* rule 92 can match eol */ +case 113: +/* rule 113 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 93: +case 114: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6059,13 +6979,13 @@ case YY_STATE_EOF(E_surfxml_backbone): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 94: -/* rule 94 can match eol */ +case 115: +/* rule 115 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 95: -/* rule 95 can match eol */ +case 116: +/* rule 116 can match eol */ YY_RULE_SETUP { AX_surfxml_bypassASroute_dst = 0; @@ -6080,47 +7000,47 @@ YY_RULE_SETUP } YY_BREAK -case 96: -/* rule 96 can match eol */ +case 117: +/* rule 117 can match eol */ YY_RULE_SETUP if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_dst); YY_BREAK -case 97: -/* rule 97 can match eol */ +case 118: +/* rule 118 can match eol */ YY_RULE_SETUP if (surfxml_bypassASroute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassASroute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_dst); YY_BREAK -case 98: -/* rule 98 can match eol */ +case 119: +/* rule 119 can match eol */ YY_RULE_SETUP if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); YY_BREAK -case 99: -/* rule 99 can match eol */ +case 120: +/* rule 120 can match eol */ YY_RULE_SETUP if (surfxml_bypassASroute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassASroute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___dst); YY_BREAK -case 100: -/* rule 100 can match eol */ +case 121: +/* rule 121 can match eol */ YY_RULE_SETUP if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_gw___src); YY_BREAK -case 101: -/* rule 101 can match eol */ +case 122: +/* rule 122 can match eol */ YY_RULE_SETUP if (surfxml_bypassASroute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassASroute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_gw___src); YY_BREAK -case 102: -/* rule 102 can match eol */ +case 123: +/* rule 123 can match eol */ YY_RULE_SETUP if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassASroute_src); YY_BREAK -case 103: -/* rule 103 can match eol */ +case 124: +/* rule 124 can match eol */ YY_RULE_SETUP if (surfxml_bypassASroute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassASroute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassASroute_src); YY_BREAK -case 104: +case 125: YY_RULE_SETUP { if (!AX_surfxml_bypassASroute_dst) FAIL("Required attribute `dst' not set for `bypassASroute' element."); @@ -6130,7 +7050,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassASroute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassASroute); } YY_BREAK -case 105: +case 126: YY_RULE_SETUP { if (!AX_surfxml_bypassASroute_dst) FAIL("Required attribute `dst' not set for `bypassASroute' element."); @@ -6140,14 +7060,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassASroute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassASroute(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 106: +case 127: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassASroute element.", surf_parse_text[0]); YY_BREAK -case 107: +case 128: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassASroute' element start tag.",surf_parse_text); YY_BREAK @@ -6155,8 +7076,8 @@ case YY_STATE_EOF(AL_surfxml_bypassASroute): FAIL("EOF in attribute list of `bypassASroute' element."); YY_BREAK -case 108: -/* rule 108 can match eol */ +case 129: +/* rule 129 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6164,15 +7085,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 109: -/* rule 109 can match eol */ +case 130: +/* rule 130 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 110: +case 131: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6182,13 +7104,13 @@ case YY_STATE_EOF(S_surfxml_bypassASroute_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 111: -/* rule 111 can match eol */ +case 132: +/* rule 132 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 112: -/* rule 112 can match eol */ +case 133: +/* rule 133 can match eol */ YY_RULE_SETUP { AX_surfxml_bypassRoute_dst = 0; @@ -6199,27 +7121,27 @@ YY_RULE_SETUP } YY_BREAK -case 113: -/* rule 113 can match eol */ +case 134: +/* rule 134 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_dst); YY_BREAK -case 114: -/* rule 114 can match eol */ +case 135: +/* rule 135 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_dst); YY_BREAK -case 115: -/* rule 115 can match eol */ +case 136: +/* rule 136 can match eol */ YY_RULE_SETUP if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassRoute_src); YY_BREAK -case 116: -/* rule 116 can match eol */ -YY_RULE_SETUP +case 137: +/* rule 137 can match eol */ +YY_RULE_SETUP if (surfxml_bypassRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassRoute_src); YY_BREAK -case 117: +case 138: YY_RULE_SETUP { if (!AX_surfxml_bypassRoute_dst) FAIL("Required attribute `dst' not set for `bypassRoute' element."); @@ -6227,7 +7149,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassRoute); } YY_BREAK -case 118: +case 139: YY_RULE_SETUP { if (!AX_surfxml_bypassRoute_dst) FAIL("Required attribute `dst' not set for `bypassRoute' element."); @@ -6235,14 +7157,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_bypassRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassRoute(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 119: +case 140: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of bypassRoute element.", surf_parse_text[0]); YY_BREAK -case 120: +case 141: YY_RULE_SETUP FAIL("Bad attribute `%s' in `bypassRoute' element start tag.",surf_parse_text); YY_BREAK @@ -6250,8 +7173,8 @@ case YY_STATE_EOF(AL_surfxml_bypassRoute): FAIL("EOF in attribute list of `bypassRoute' element."); YY_BREAK -case 121: -/* rule 121 can match eol */ +case 142: +/* rule 142 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6259,15 +7182,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 122: -/* rule 122 can match eol */ +case 143: +/* rule 143 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 123: +case 144: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6277,13 +7201,138 @@ case YY_STATE_EOF(S_surfxml_bypassRoute_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 124: -/* rule 124 can match eol */ +case 145: +/* rule 145 can match eol */ +YY_RULE_SETUP +FAIL("Starting tag is not allowed here."); + YY_BREAK +case 146: +/* rule 146 can match eol */ +YY_RULE_SETUP +{ + AX_surfxml_bypassZoneRoute_dst = 0; + surfxml_bypassZoneRoute_dst_isset = 0; + AX_surfxml_bypassZoneRoute_gw___dst = 0; + surfxml_bypassZoneRoute_gw___dst_isset = 0; + AX_surfxml_bypassZoneRoute_gw___src = 0; + surfxml_bypassZoneRoute_gw___src_isset = 0; + AX_surfxml_bypassZoneRoute_src = 0; + surfxml_bypassZoneRoute_src_isset = 0; + ENTER(AL_surfxml_bypassZoneRoute); pushbuffer(0); + } + YY_BREAK + +case 147: +/* rule 147 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassZoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassZoneRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_dst); + YY_BREAK +case 148: +/* rule 148 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassZoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_bypassZoneRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_dst); + YY_BREAK +case 149: +/* rule 149 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassZoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassZoneRoute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___dst); + YY_BREAK +case 150: +/* rule 150 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassZoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_bypassZoneRoute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___dst); + YY_BREAK +case 151: +/* rule 151 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassZoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassZoneRoute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___src); + YY_BREAK +case 152: +/* rule 152 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassZoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_bypassZoneRoute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_gw___src); + YY_BREAK +case 153: +/* rule 153 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassZoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassZoneRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_bypassZoneRoute_src); + YY_BREAK +case 154: +/* rule 154 can match eol */ +YY_RULE_SETUP +if (surfxml_bypassZoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_bypassZoneRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_bypassZoneRoute_src); + YY_BREAK +case 155: +YY_RULE_SETUP +{ + if (!AX_surfxml_bypassZoneRoute_dst) FAIL("Required attribute `dst' not set for `bypassZoneRoute' element."); + if (!AX_surfxml_bypassZoneRoute_gw___dst) FAIL("Required attribute `gw_dst' not set for `bypassZoneRoute' element."); + if (!AX_surfxml_bypassZoneRoute_gw___src) FAIL("Required attribute `gw_src' not set for `bypassZoneRoute' element."); + if (!AX_surfxml_bypassZoneRoute_src) FAIL("Required attribute `src' not set for `bypassZoneRoute' element."); + LEAVE; STag_surfxml_bypassZoneRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_bypassZoneRoute); + } + YY_BREAK +case 156: +YY_RULE_SETUP +{ + if (!AX_surfxml_bypassZoneRoute_dst) FAIL("Required attribute `dst' not set for `bypassZoneRoute' element."); + if (!AX_surfxml_bypassZoneRoute_gw___dst) FAIL("Required attribute `gw_dst' not set for `bypassZoneRoute' element."); + if (!AX_surfxml_bypassZoneRoute_gw___src) FAIL("Required attribute `gw_src' not set for `bypassZoneRoute' element."); + if (!AX_surfxml_bypassZoneRoute_src) FAIL("Required attribute `src' not set for `bypassZoneRoute' element."); + LEAVE; STag_surfxml_bypassZoneRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_bypassZoneRoute(); popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; + } + } + YY_BREAK +case 157: +YY_RULE_SETUP +FAIL("Unexpected character `%c' in attribute list of bypassZoneRoute element.", surf_parse_text[0]); + YY_BREAK +case 158: +YY_RULE_SETUP +FAIL("Bad attribute `%s' in `bypassZoneRoute' element start tag.",surf_parse_text); + YY_BREAK +case YY_STATE_EOF(AL_surfxml_bypassZoneRoute): +FAIL("EOF in attribute list of `bypassZoneRoute' element."); + YY_BREAK + +case 159: +/* rule 159 can match eol */ +YY_RULE_SETUP +{ + LEAVE; + ETag_surfxml_bypassZoneRoute(); + popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; + } + } + YY_BREAK +case 160: +/* rule 160 can match eol */ +YY_RULE_SETUP +FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); + YY_BREAK +case 161: +YY_RULE_SETUP +FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); + YY_BREAK +case YY_STATE_EOF(E_surfxml_bypassZoneRoute): +case YY_STATE_EOF(S_surfxml_bypassZoneRoute): +case YY_STATE_EOF(S_surfxml_bypassZoneRoute_2): +if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); + YY_BREAK + +case 162: +/* rule 162 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 125: -/* rule 125 can match eol */ +case 163: +/* rule 163 can match eol */ YY_RULE_SETUP { AX_surfxml_cabinet_bw = 0; @@ -6304,77 +7353,77 @@ YY_RULE_SETUP } YY_BREAK -case 126: -/* rule 126 can match eol */ +case 164: +/* rule 164 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_bw); YY_BREAK -case 127: -/* rule 127 can match eol */ +case 165: +/* rule 165 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cabinet_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_bw); YY_BREAK -case 128: -/* rule 128 can match eol */ +case 166: +/* rule 166 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_id); YY_BREAK -case 129: -/* rule 129 can match eol */ +case 167: +/* rule 167 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cabinet_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_id); YY_BREAK -case 130: -/* rule 130 can match eol */ +case 168: +/* rule 168 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_lat); YY_BREAK -case 131: -/* rule 131 can match eol */ +case 169: +/* rule 169 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cabinet_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_lat); YY_BREAK -case 132: -/* rule 132 can match eol */ +case 170: +/* rule 170 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_prefix); YY_BREAK -case 133: -/* rule 133 can match eol */ +case 171: +/* rule 171 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cabinet_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_prefix); YY_BREAK -case 134: -/* rule 134 can match eol */ +case 172: +/* rule 172 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_radical); YY_BREAK -case 135: -/* rule 135 can match eol */ +case 173: +/* rule 173 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cabinet_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_radical); YY_BREAK -case 136: -/* rule 136 can match eol */ +case 174: +/* rule 174 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_cabinet_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_speed); YY_BREAK -case 137: -/* rule 137 can match eol */ +case 175: +/* rule 175 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_cabinet_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_speed); YY_BREAK -case 138: -/* rule 138 can match eol */ +case 176: +/* rule 176 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cabinet_suffix); YY_BREAK -case 139: -/* rule 139 can match eol */ +case 177: +/* rule 177 can match eol */ YY_RULE_SETUP if (surfxml_cabinet_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cabinet_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cabinet_suffix); YY_BREAK -case 140: +case 178: YY_RULE_SETUP { if (!AX_surfxml_cabinet_bw) FAIL("Required attribute `bw' not set for `cabinet' element."); @@ -6387,7 +7436,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_cabinet();surfxml_pcdata_ix = 0; ENTER(E_surfxml_cabinet); } YY_BREAK -case 141: +case 179: YY_RULE_SETUP { if (!AX_surfxml_cabinet_bw) FAIL("Required attribute `bw' not set for `cabinet' element."); @@ -6402,14 +7451,15 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 142: +case 180: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cabinet element.", surf_parse_text[0]); YY_BREAK -case 143: +case 181: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cabinet' element start tag.",surf_parse_text); YY_BREAK @@ -6417,8 +7467,8 @@ case YY_STATE_EOF(AL_surfxml_cabinet): FAIL("EOF in attribute list of `cabinet' element."); YY_BREAK -case 144: -/* rule 144 can match eol */ +case 182: +/* rule 182 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6428,15 +7478,16 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 145: -/* rule 145 can match eol */ +case 183: +/* rule 183 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 146: +case 184: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6444,13 +7495,13 @@ case YY_STATE_EOF(E_surfxml_cabinet): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 147: -/* rule 147 can match eol */ +case 185: +/* rule 185 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 148: -/* rule 148 can match eol */ +case 186: +/* rule 186 can match eol */ YY_RULE_SETUP { AX_surfxml_cluster_bb___bw = 0; @@ -6493,220 +7544,220 @@ YY_RULE_SETUP } YY_BREAK -case 149: -/* rule 149 can match eol */ +case 187: +/* rule 187 can match eol */ YY_RULE_SETUP if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___bw); YY_BREAK -case 150: -/* rule 150 can match eol */ +case 188: +/* rule 188 can match eol */ YY_RULE_SETUP if (surfxml_cluster_bb___bw_isset != 0) {FAIL("Multiple definition of attribute bb_bw in ");} surfxml_cluster_bb___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___bw); YY_BREAK -case 151: -/* rule 151 can match eol */ +case 189: +/* rule 189 can match eol */ YY_RULE_SETUP if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bb___lat); YY_BREAK -case 152: -/* rule 152 can match eol */ +case 190: +/* rule 190 can match eol */ YY_RULE_SETUP if (surfxml_cluster_bb___lat_isset != 0) {FAIL("Multiple definition of attribute bb_lat in ");} surfxml_cluster_bb___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bb___lat); YY_BREAK -case 153: -/* rule 153 can match eol */ -case 154: -/* rule 154 can match eol */ +case 191: +/* rule 191 can match eol */ +case 192: +/* rule 192 can match eol */ YY_RULE_SETUP A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_SHARED; YY_BREAK -case 155: -/* rule 155 can match eol */ -case 156: -/* rule 156 can match eol */ +case 193: +/* rule 193 can match eol */ +case 194: +/* rule 194 can match eol */ YY_RULE_SETUP A_surfxml_cluster_bb___sharing___policy = A_surfxml_cluster_bb___sharing___policy_FATPIPE; YY_BREAK -case 157: -/* rule 157 can match eol */ +case 195: +/* rule 195 can match eol */ YY_RULE_SETUP if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_bw); YY_BREAK -case 158: -/* rule 158 can match eol */ +case 196: +/* rule 196 can match eol */ YY_RULE_SETUP if (surfxml_cluster_bw_isset != 0) {FAIL("Multiple definition of attribute bw in ");} surfxml_cluster_bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_bw); YY_BREAK -case 159: -/* rule 159 can match eol */ +case 197: +/* rule 197 can match eol */ YY_RULE_SETUP if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_core); YY_BREAK -case 160: -/* rule 160 can match eol */ +case 198: +/* rule 198 can match eol */ YY_RULE_SETUP if (surfxml_cluster_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_cluster_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_core); YY_BREAK -case 161: -/* rule 161 can match eol */ +case 199: +/* rule 199 can match eol */ YY_RULE_SETUP if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_id); YY_BREAK -case 162: -/* rule 162 can match eol */ +case 200: +/* rule 200 can match eol */ YY_RULE_SETUP if (surfxml_cluster_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_cluster_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_id); YY_BREAK -case 163: -/* rule 163 can match eol */ +case 201: +/* rule 201 can match eol */ YY_RULE_SETUP if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_lat); YY_BREAK -case 164: -/* rule 164 can match eol */ +case 202: +/* rule 202 can match eol */ YY_RULE_SETUP if (surfxml_cluster_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_cluster_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_lat); YY_BREAK -case 165: -/* rule 165 can match eol */ +case 203: +/* rule 203 can match eol */ YY_RULE_SETUP if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_limiter___link); YY_BREAK -case 166: -/* rule 166 can match eol */ +case 204: +/* rule 204 can match eol */ YY_RULE_SETUP if (surfxml_cluster_limiter___link_isset != 0) {FAIL("Multiple definition of attribute limiter_link in ");} surfxml_cluster_limiter___link_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_limiter___link); YY_BREAK -case 167: -/* rule 167 can match eol */ +case 205: +/* rule 205 can match eol */ YY_RULE_SETUP if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___bw); YY_BREAK -case 168: -/* rule 168 can match eol */ +case 206: +/* rule 206 can match eol */ YY_RULE_SETUP if (surfxml_cluster_loopback___bw_isset != 0) {FAIL("Multiple definition of attribute loopback_bw in ");} surfxml_cluster_loopback___bw_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___bw); YY_BREAK -case 169: -/* rule 169 can match eol */ +case 207: +/* rule 207 can match eol */ YY_RULE_SETUP if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_loopback___lat); YY_BREAK -case 170: -/* rule 170 can match eol */ +case 208: +/* rule 208 can match eol */ YY_RULE_SETUP if (surfxml_cluster_loopback___lat_isset != 0) {FAIL("Multiple definition of attribute loopback_lat in ");} surfxml_cluster_loopback___lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_loopback___lat); YY_BREAK -case 171: -/* rule 171 can match eol */ +case 209: +/* rule 209 can match eol */ YY_RULE_SETUP if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_prefix); YY_BREAK -case 172: -/* rule 172 can match eol */ +case 210: +/* rule 210 can match eol */ YY_RULE_SETUP if (surfxml_cluster_prefix_isset != 0) {FAIL("Multiple definition of attribute prefix in ");} surfxml_cluster_prefix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_prefix); YY_BREAK -case 173: -/* rule 173 can match eol */ +case 211: +/* rule 211 can match eol */ YY_RULE_SETUP if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_radical); YY_BREAK -case 174: -/* rule 174 can match eol */ +case 212: +/* rule 212 can match eol */ YY_RULE_SETUP if (surfxml_cluster_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_cluster_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_radical); YY_BREAK -case 175: -/* rule 175 can match eol */ +case 213: +/* rule 213 can match eol */ YY_RULE_SETUP if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_router___id); YY_BREAK -case 176: -/* rule 176 can match eol */ +case 214: +/* rule 214 can match eol */ YY_RULE_SETUP if (surfxml_cluster_router___id_isset != 0) {FAIL("Multiple definition of attribute router_id in ");} surfxml_cluster_router___id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_router___id); YY_BREAK -case 177: -/* rule 177 can match eol */ -case 178: -/* rule 178 can match eol */ +case 215: +/* rule 215 can match eol */ +case 216: +/* rule 216 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_SHARED; YY_BREAK -case 179: -/* rule 179 can match eol */ -case 180: -/* rule 180 can match eol */ +case 217: +/* rule 217 can match eol */ +case 218: +/* rule 218 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FULLDUPLEX; YY_BREAK -case 181: -/* rule 181 can match eol */ -case 182: -/* rule 182 can match eol */ +case 219: +/* rule 219 can match eol */ +case 220: +/* rule 220 can match eol */ YY_RULE_SETUP A_surfxml_cluster_sharing___policy = A_surfxml_cluster_sharing___policy_FATPIPE; YY_BREAK -case 183: -/* rule 183 can match eol */ +case 221: +/* rule 221 can match eol */ YY_RULE_SETUP if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_cluster_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_speed); YY_BREAK -case 184: -/* rule 184 can match eol */ +case 222: +/* rule 222 can match eol */ YY_RULE_SETUP if (surfxml_cluster_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_cluster_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_speed); YY_BREAK -case 185: -/* rule 185 can match eol */ +case 223: +/* rule 223 can match eol */ YY_RULE_SETUP if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_suffix); YY_BREAK -case 186: -/* rule 186 can match eol */ +case 224: +/* rule 224 can match eol */ YY_RULE_SETUP if (surfxml_cluster_suffix_isset != 0) {FAIL("Multiple definition of attribute suffix in ");} surfxml_cluster_suffix_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_suffix); YY_BREAK -case 187: -/* rule 187 can match eol */ +case 225: +/* rule 225 can match eol */ YY_RULE_SETUP if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in ");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_cluster_topo___parameters); YY_BREAK -case 188: -/* rule 188 can match eol */ +case 226: +/* rule 226 can match eol */ YY_RULE_SETUP if (surfxml_cluster_topo___parameters_isset != 0) {FAIL("Multiple definition of attribute topo_parameters in ");} surfxml_cluster_topo___parameters_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_cluster_topo___parameters); YY_BREAK -case 189: -/* rule 189 can match eol */ -case 190: -/* rule 190 can match eol */ +case 227: +/* rule 227 can match eol */ +case 228: +/* rule 228 can match eol */ YY_RULE_SETUP A_surfxml_cluster_topology = A_surfxml_cluster_topology_FLAT; YY_BREAK -case 191: -/* rule 191 can match eol */ -case 192: -/* rule 192 can match eol */ +case 229: +/* rule 229 can match eol */ +case 230: +/* rule 230 can match eol */ YY_RULE_SETUP A_surfxml_cluster_topology = A_surfxml_cluster_topology_TORUS; YY_BREAK -case 193: -/* rule 193 can match eol */ -case 194: -/* rule 194 can match eol */ +case 231: +/* rule 231 can match eol */ +case 232: +/* rule 232 can match eol */ YY_RULE_SETUP A_surfxml_cluster_topology = A_surfxml_cluster_topology_FAT___TREE; YY_BREAK -case 195: -/* rule 195 can match eol */ -case 196: -/* rule 196 can match eol */ +case 233: +/* rule 233 can match eol */ +case 234: +/* rule 234 can match eol */ YY_RULE_SETUP A_surfxml_cluster_topology = A_surfxml_cluster_topology_DRAGONFLY; YY_BREAK -case 197: +case 235: YY_RULE_SETUP { if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element."); @@ -6719,7 +7770,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_cluster();surfxml_pcdata_ix = 0; ENTER(S_surfxml_cluster); } YY_BREAK -case 198: +case 236: YY_RULE_SETUP { if (!AX_surfxml_cluster_bw) FAIL("Required attribute `bw' not set for `cluster' element."); @@ -6734,14 +7785,15 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 199: +case 237: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of cluster element.", surf_parse_text[0]); YY_BREAK -case 200: +case 238: YY_RULE_SETUP FAIL("Bad attribute `%s' in `cluster' element start tag.",surf_parse_text); YY_BREAK @@ -6749,8 +7801,8 @@ case YY_STATE_EOF(AL_surfxml_cluster): FAIL("EOF in attribute list of `cluster' element."); YY_BREAK -case 201: -/* rule 201 can match eol */ +case 239: +/* rule 239 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6760,15 +7812,16 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 202: -/* rule 202 can match eol */ +case 240: +/* rule 240 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 203: +case 241: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6778,13 +7831,13 @@ case YY_STATE_EOF(S_surfxml_cluster_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 204: -/* rule 204 can match eol */ +case 242: +/* rule 242 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 205: -/* rule 205 can match eol */ +case 243: +/* rule 243 can match eol */ YY_RULE_SETUP { AX_surfxml_config_id = 0; @@ -6793,23 +7846,23 @@ YY_RULE_SETUP } YY_BREAK -case 206: -/* rule 206 can match eol */ +case 244: +/* rule 244 can match eol */ YY_RULE_SETUP if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_config_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_config_id); YY_BREAK -case 207: -/* rule 207 can match eol */ +case 245: +/* rule 245 can match eol */ YY_RULE_SETUP if (surfxml_config_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_config_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_config_id); YY_BREAK -case 208: +case 246: YY_RULE_SETUP { LEAVE; STag_surfxml_config();surfxml_pcdata_ix = 0; ENTER(S_surfxml_config); } YY_BREAK -case 209: +case 247: YY_RULE_SETUP { LEAVE; STag_surfxml_config(); surfxml_pcdata_ix = 0; ETag_surfxml_config(); popbuffer(); /* attribute */ @@ -6818,11 +7871,11 @@ YY_RULE_SETUP } } YY_BREAK -case 210: +case 248: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of config element.", surf_parse_text[0]); YY_BREAK -case 211: +case 249: YY_RULE_SETUP FAIL("Bad attribute `%s' in `config' element start tag.",surf_parse_text); YY_BREAK @@ -6830,8 +7883,8 @@ case YY_STATE_EOF(AL_surfxml_config): FAIL("EOF in attribute list of `config' element."); YY_BREAK -case 212: -/* rule 212 can match eol */ +case 250: +/* rule 250 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6842,12 +7895,12 @@ YY_RULE_SETUP } } YY_BREAK -case 213: -/* rule 213 can match eol */ +case 251: +/* rule 251 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 214: +case 252: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -6857,13 +7910,13 @@ case YY_STATE_EOF(S_surfxml_config_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 215: -/* rule 215 can match eol */ +case 253: +/* rule 253 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 216: -/* rule 216 can match eol */ +case 254: +/* rule 254 can match eol */ YY_RULE_SETUP { AX_surfxml_host_availability___file = 0; @@ -6884,77 +7937,77 @@ YY_RULE_SETUP } YY_BREAK -case 217: -/* rule 217 can match eol */ +case 255: +/* rule 255 can match eol */ YY_RULE_SETUP if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_host_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_availability___file); YY_BREAK -case 218: -/* rule 218 can match eol */ +case 256: +/* rule 256 can match eol */ YY_RULE_SETUP if (surfxml_host_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_host_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_availability___file); YY_BREAK -case 219: -/* rule 219 can match eol */ +case 257: +/* rule 257 can match eol */ YY_RULE_SETUP if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_host_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_coordinates); YY_BREAK -case 220: -/* rule 220 can match eol */ +case 258: +/* rule 258 can match eol */ YY_RULE_SETUP if (surfxml_host_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_host_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_coordinates); YY_BREAK -case 221: -/* rule 221 can match eol */ +case 259: +/* rule 259 can match eol */ YY_RULE_SETUP if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_host_core_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_core); YY_BREAK -case 222: -/* rule 222 can match eol */ +case 260: +/* rule 260 can match eol */ YY_RULE_SETUP if (surfxml_host_core_isset != 0) {FAIL("Multiple definition of attribute core in ");} surfxml_host_core_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_core); YY_BREAK -case 223: -/* rule 223 can match eol */ +case 261: +/* rule 261 can match eol */ YY_RULE_SETUP if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_id); YY_BREAK -case 224: -/* rule 224 can match eol */ +case 262: +/* rule 262 can match eol */ YY_RULE_SETUP if (surfxml_host_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_id); YY_BREAK -case 225: -/* rule 225 can match eol */ +case 263: +/* rule 263 can match eol */ YY_RULE_SETUP if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in ");} surfxml_host_pstate_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_pstate); YY_BREAK -case 226: -/* rule 226 can match eol */ +case 264: +/* rule 264 can match eol */ YY_RULE_SETUP if (surfxml_host_pstate_isset != 0) {FAIL("Multiple definition of attribute pstate in ");} surfxml_host_pstate_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_pstate); YY_BREAK -case 227: -/* rule 227 can match eol */ +case 265: +/* rule 265 can match eol */ YY_RULE_SETUP if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_host_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_speed); YY_BREAK -case 228: -/* rule 228 can match eol */ +case 266: +/* rule 266 can match eol */ YY_RULE_SETUP if (surfxml_host_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_host_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_speed); YY_BREAK -case 229: -/* rule 229 can match eol */ +case 267: +/* rule 267 can match eol */ YY_RULE_SETUP if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_host_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host_state___file); YY_BREAK -case 230: -/* rule 230 can match eol */ +case 268: +/* rule 268 can match eol */ YY_RULE_SETUP if (surfxml_host_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_host_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host_state___file); YY_BREAK -case 231: +case 269: YY_RULE_SETUP { if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); @@ -6962,7 +8015,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host();surfxml_pcdata_ix = 0; ENTER(S_surfxml_host); } YY_BREAK -case 232: +case 270: YY_RULE_SETUP { if (!AX_surfxml_host_id) FAIL("Required attribute `id' not set for `host' element."); @@ -6970,14 +8023,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host(); surfxml_pcdata_ix = 0; ETag_surfxml_host(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 233: +case 271: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host element.", surf_parse_text[0]); YY_BREAK -case 234: +case 272: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host' element start tag.",surf_parse_text); YY_BREAK @@ -6985,8 +8039,8 @@ case YY_STATE_EOF(AL_surfxml_host): FAIL("EOF in attribute list of `host' element."); YY_BREAK -case 235: -/* rule 235 can match eol */ +case 273: +/* rule 273 can match eol */ YY_RULE_SETUP { LEAVE; @@ -6994,15 +8048,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 236: -/* rule 236 can match eol */ +case 274: +/* rule 274 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 237: +case 275: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7012,13 +8067,13 @@ case YY_STATE_EOF(S_surfxml_host_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 238: -/* rule 238 can match eol */ +case 276: +/* rule 276 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 239: -/* rule 239 can match eol */ +case 277: +/* rule 277 can match eol */ YY_RULE_SETUP { AX_surfxml_host___link_down = 0; @@ -7031,37 +8086,37 @@ YY_RULE_SETUP } YY_BREAK -case 240: -/* rule 240 can match eol */ +case 278: +/* rule 278 can match eol */ YY_RULE_SETUP if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in ");} surfxml_host___link_down_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_down); YY_BREAK -case 241: -/* rule 241 can match eol */ +case 279: +/* rule 279 can match eol */ YY_RULE_SETUP if (surfxml_host___link_down_isset != 0) {FAIL("Multiple definition of attribute down in ");} surfxml_host___link_down_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_down); YY_BREAK -case 242: -/* rule 242 can match eol */ +case 280: +/* rule 280 can match eol */ YY_RULE_SETUP if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host___link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_id); YY_BREAK -case 243: -/* rule 243 can match eol */ +case 281: +/* rule 281 can match eol */ YY_RULE_SETUP if (surfxml_host___link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_host___link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_id); YY_BREAK -case 244: -/* rule 244 can match eol */ +case 282: +/* rule 282 can match eol */ YY_RULE_SETUP if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in ");} surfxml_host___link_up_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_host___link_up); YY_BREAK -case 245: -/* rule 245 can match eol */ +case 283: +/* rule 283 can match eol */ YY_RULE_SETUP if (surfxml_host___link_up_isset != 0) {FAIL("Multiple definition of attribute up in ");} surfxml_host___link_up_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_host___link_up); YY_BREAK -case 246: +case 284: YY_RULE_SETUP { if (!AX_surfxml_host___link_down) FAIL("Required attribute `down' not set for `host_link' element."); @@ -7070,7 +8125,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host___link();surfxml_pcdata_ix = 0; ENTER(E_surfxml_host___link); } YY_BREAK -case 247: +case 285: YY_RULE_SETUP { if (!AX_surfxml_host___link_down) FAIL("Required attribute `down' not set for `host_link' element."); @@ -7079,14 +8134,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_host___link(); surfxml_pcdata_ix = 0; ETag_surfxml_host___link(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 248: +case 286: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of host_link element.", surf_parse_text[0]); YY_BREAK -case 249: +case 287: YY_RULE_SETUP FAIL("Bad attribute `%s' in `host_link' element start tag.",surf_parse_text); YY_BREAK @@ -7094,8 +8150,8 @@ case YY_STATE_EOF(AL_surfxml_host___link): FAIL("EOF in attribute list of `host_link' element."); YY_BREAK -case 250: -/* rule 250 can match eol */ +case 288: +/* rule 288 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7103,15 +8159,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 251: -/* rule 251 can match eol */ +case 289: +/* rule 289 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 252: +case 290: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7119,13 +8176,13 @@ case YY_STATE_EOF(E_surfxml_host___link): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 253: -/* rule 253 can match eol */ +case 291: +/* rule 291 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 254: -/* rule 254 can match eol */ +case 292: +/* rule 292 can match eol */ YY_RULE_SETUP { AX_surfxml_include_file = 0; @@ -7134,24 +8191,24 @@ YY_RULE_SETUP } YY_BREAK -case 255: -/* rule 255 can match eol */ +case 293: +/* rule 293 can match eol */ YY_RULE_SETUP if (surfxml_include_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} surfxml_include_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_include_file); YY_BREAK -case 256: -/* rule 256 can match eol */ +case 294: +/* rule 294 can match eol */ YY_RULE_SETUP if (surfxml_include_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} surfxml_include_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_include_file); YY_BREAK -case 257: +case 295: YY_RULE_SETUP { if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element."); LEAVE; STag_surfxml_include();surfxml_pcdata_ix = 0; ENTER(S_surfxml_include); } YY_BREAK -case 258: +case 296: YY_RULE_SETUP { if (!AX_surfxml_include_file) FAIL("Required attribute `file' not set for `include' element."); @@ -7160,14 +8217,15 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 259: +case 297: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of include element.", surf_parse_text[0]); YY_BREAK -case 260: +case 298: YY_RULE_SETUP FAIL("Bad attribute `%s' in `include' element start tag.",surf_parse_text); YY_BREAK @@ -7175,8 +8233,8 @@ case YY_STATE_EOF(AL_surfxml_include): FAIL("EOF in attribute list of `include' element."); YY_BREAK -case 261: -/* rule 261 can match eol */ +case 299: +/* rule 299 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7186,15 +8244,16 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 262: -/* rule 262 can match eol */ +case 300: +/* rule 300 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 263: +case 301: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7204,13 +8263,13 @@ case YY_STATE_EOF(S_surfxml_include_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 264: -/* rule 264 can match eol */ +case 302: +/* rule 302 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 265: -/* rule 265 can match eol */ +case 303: +/* rule 303 can match eol */ YY_RULE_SETUP { AX_surfxml_link_bandwidth = 0; @@ -7231,88 +8290,88 @@ YY_RULE_SETUP } YY_BREAK -case 266: -/* rule 266 can match eol */ +case 304: +/* rule 304 can match eol */ YY_RULE_SETUP if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth); YY_BREAK -case 267: -/* rule 267 can match eol */ +case 305: +/* rule 305 can match eol */ YY_RULE_SETUP if (surfxml_link_bandwidth_isset != 0) {FAIL("Multiple definition of attribute bandwidth in ");} surfxml_link_bandwidth_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth); YY_BREAK -case 268: -/* rule 268 can match eol */ +case 306: +/* rule 306 can match eol */ YY_RULE_SETUP if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_bandwidth___file); YY_BREAK -case 269: -/* rule 269 can match eol */ +case 307: +/* rule 307 can match eol */ YY_RULE_SETUP if (surfxml_link_bandwidth___file_isset != 0) {FAIL("Multiple definition of attribute bandwidth_file in ");} surfxml_link_bandwidth___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_bandwidth___file); YY_BREAK -case 270: -/* rule 270 can match eol */ +case 308: +/* rule 308 can match eol */ YY_RULE_SETUP if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_id); YY_BREAK -case 271: -/* rule 271 can match eol */ +case 309: +/* rule 309 can match eol */ YY_RULE_SETUP if (surfxml_link_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_id); YY_BREAK -case 272: -/* rule 272 can match eol */ +case 310: +/* rule 310 can match eol */ YY_RULE_SETUP if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency); YY_BREAK -case 273: -/* rule 273 can match eol */ +case 311: +/* rule 311 can match eol */ YY_RULE_SETUP if (surfxml_link_latency_isset != 0) {FAIL("Multiple definition of attribute latency in ");} surfxml_link_latency_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency); YY_BREAK -case 274: -/* rule 274 can match eol */ +case 312: +/* rule 312 can match eol */ YY_RULE_SETUP if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_latency___file); YY_BREAK -case 275: -/* rule 275 can match eol */ +case 313: +/* rule 313 can match eol */ YY_RULE_SETUP if (surfxml_link_latency___file_isset != 0) {FAIL("Multiple definition of attribute latency_file in ");} surfxml_link_latency___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_latency___file); YY_BREAK -case 276: -/* rule 276 can match eol */ -case 277: -/* rule 277 can match eol */ +case 314: +/* rule 314 can match eol */ +case 315: +/* rule 315 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_SHARED; YY_BREAK -case 278: -/* rule 278 can match eol */ -case 279: -/* rule 279 can match eol */ +case 316: +/* rule 316 can match eol */ +case 317: +/* rule 317 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FATPIPE; YY_BREAK -case 280: -/* rule 280 can match eol */ -case 281: -/* rule 281 can match eol */ +case 318: +/* rule 318 can match eol */ +case 319: +/* rule 319 can match eol */ YY_RULE_SETUP A_surfxml_link_sharing___policy = A_surfxml_link_sharing___policy_FULLDUPLEX; YY_BREAK -case 282: -/* rule 282 can match eol */ +case 320: +/* rule 320 can match eol */ YY_RULE_SETUP if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link_state___file); YY_BREAK -case 283: -/* rule 283 can match eol */ +case 321: +/* rule 321 can match eol */ YY_RULE_SETUP if (surfxml_link_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_link_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link_state___file); YY_BREAK -case 284: +case 322: YY_RULE_SETUP { if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element."); @@ -7320,7 +8379,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_link();surfxml_pcdata_ix = 0; ENTER(S_surfxml_link); } YY_BREAK -case 285: +case 323: YY_RULE_SETUP { if (!AX_surfxml_link_bandwidth) FAIL("Required attribute `bandwidth' not set for `link' element."); @@ -7328,14 +8387,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_link(); surfxml_pcdata_ix = 0; ETag_surfxml_link(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 286: +case 324: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link element.", surf_parse_text[0]); YY_BREAK -case 287: +case 325: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link' element start tag.",surf_parse_text); YY_BREAK @@ -7343,8 +8403,8 @@ case YY_STATE_EOF(AL_surfxml_link): FAIL("EOF in attribute list of `link' element."); YY_BREAK -case 288: -/* rule 288 can match eol */ +case 326: +/* rule 326 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7352,15 +8412,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 289: -/* rule 289 can match eol */ +case 327: +/* rule 327 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 290: +case 328: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7370,13 +8431,13 @@ case YY_STATE_EOF(S_surfxml_link_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 291: -/* rule 291 can match eol */ +case 329: +/* rule 329 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 292: -/* rule 292 can match eol */ +case 330: +/* rule 330 can match eol */ YY_RULE_SETUP { AX_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE; @@ -7387,45 +8448,45 @@ YY_RULE_SETUP } YY_BREAK -case 293: -/* rule 293 can match eol */ -case 294: -/* rule 294 can match eol */ +case 331: +/* rule 331 can match eol */ +case 332: +/* rule 332 can match eol */ YY_RULE_SETUP A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_UP; YY_BREAK -case 295: -/* rule 295 can match eol */ -case 296: -/* rule 296 can match eol */ +case 333: +/* rule 333 can match eol */ +case 334: +/* rule 334 can match eol */ YY_RULE_SETUP A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_DOWN; YY_BREAK -case 297: -/* rule 297 can match eol */ -case 298: -/* rule 298 can match eol */ +case 335: +/* rule 335 can match eol */ +case 336: +/* rule 336 can match eol */ YY_RULE_SETUP A_surfxml_link___ctn_direction = A_surfxml_link___ctn_direction_NONE; YY_BREAK -case 299: -/* rule 299 can match eol */ +case 337: +/* rule 337 can match eol */ YY_RULE_SETUP if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_link___ctn_id); YY_BREAK -case 300: -/* rule 300 can match eol */ +case 338: +/* rule 338 can match eol */ YY_RULE_SETUP if (surfxml_link___ctn_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_link___ctn_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_link___ctn_id); YY_BREAK -case 301: +case 339: YY_RULE_SETUP { if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element."); LEAVE; STag_surfxml_link___ctn();surfxml_pcdata_ix = 0; ENTER(E_surfxml_link___ctn); } YY_BREAK -case 302: +case 340: YY_RULE_SETUP { if (!AX_surfxml_link___ctn_id) FAIL("Required attribute `id' not set for `link_ctn' element."); @@ -7434,15 +8495,17 @@ YY_RULE_SETUP case S_surfxml_ASroute: case S_surfxml_ASroute_1: case S_surfxml_ASroute_2: SET(S_surfxml_ASroute_2); break; case S_surfxml_bypassASroute: case S_surfxml_bypassASroute_1: case S_surfxml_bypassASroute_2: SET(S_surfxml_bypassASroute_2); break; case S_surfxml_bypassRoute: case S_surfxml_bypassRoute_1: case S_surfxml_bypassRoute_2: SET(S_surfxml_bypassRoute_2); break; + case S_surfxml_bypassZoneRoute: case S_surfxml_bypassZoneRoute_1: case S_surfxml_bypassZoneRoute_2: SET(S_surfxml_bypassZoneRoute_2); break; case S_surfxml_route: case S_surfxml_route_1: case S_surfxml_route_2: SET(S_surfxml_route_2); break; + case S_surfxml_zoneRoute: case S_surfxml_zoneRoute_1: case S_surfxml_zoneRoute_2: SET(S_surfxml_zoneRoute_2); break; } } YY_BREAK -case 303: +case 341: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of link_ctn element.", surf_parse_text[0]); YY_BREAK -case 304: +case 342: YY_RULE_SETUP FAIL("Bad attribute `%s' in `link_ctn' element start tag.",surf_parse_text); YY_BREAK @@ -7450,8 +8513,8 @@ case YY_STATE_EOF(AL_surfxml_link___ctn): FAIL("EOF in attribute list of `link_ctn' element."); YY_BREAK -case 305: -/* rule 305 can match eol */ +case 343: +/* rule 343 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7461,16 +8524,18 @@ YY_RULE_SETUP case S_surfxml_ASroute: case S_surfxml_ASroute_1: case S_surfxml_ASroute_2: SET(S_surfxml_ASroute_2); break; case S_surfxml_bypassASroute: case S_surfxml_bypassASroute_1: case S_surfxml_bypassASroute_2: SET(S_surfxml_bypassASroute_2); break; case S_surfxml_bypassRoute: case S_surfxml_bypassRoute_1: case S_surfxml_bypassRoute_2: SET(S_surfxml_bypassRoute_2); break; + case S_surfxml_bypassZoneRoute: case S_surfxml_bypassZoneRoute_1: case S_surfxml_bypassZoneRoute_2: SET(S_surfxml_bypassZoneRoute_2); break; case S_surfxml_route: case S_surfxml_route_1: case S_surfxml_route_2: SET(S_surfxml_route_2); break; + case S_surfxml_zoneRoute: case S_surfxml_zoneRoute_1: case S_surfxml_zoneRoute_2: SET(S_surfxml_zoneRoute_2); break; } } YY_BREAK -case 306: -/* rule 306 can match eol */ +case 344: +/* rule 344 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 307: +case 345: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7480,13 +8545,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected.") /* * */ -case 308: -/* rule 308 can match eol */ +case 346: +/* rule 346 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 309: -/* rule 309 can match eol */ +case 347: +/* rule 347 can match eol */ YY_RULE_SETUP { AX_surfxml_model___prop_id = 0; @@ -7497,27 +8562,27 @@ YY_RULE_SETUP } YY_BREAK -case 310: -/* rule 310 can match eol */ +case 348: +/* rule 348 can match eol */ YY_RULE_SETUP if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_model___prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_id); YY_BREAK -case 311: -/* rule 311 can match eol */ +case 349: +/* rule 349 can match eol */ YY_RULE_SETUP if (surfxml_model___prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_model___prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_id); YY_BREAK -case 312: -/* rule 312 can match eol */ +case 350: +/* rule 350 can match eol */ YY_RULE_SETUP if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_model___prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_model___prop_value); YY_BREAK -case 313: -/* rule 313 can match eol */ +case 351: +/* rule 351 can match eol */ YY_RULE_SETUP if (surfxml_model___prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_model___prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_model___prop_value); YY_BREAK -case 314: +case 352: YY_RULE_SETUP { if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element."); @@ -7525,7 +8590,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_model___prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_model___prop); } YY_BREAK -case 315: +case 353: YY_RULE_SETUP { if (!AX_surfxml_model___prop_id) FAIL("Required attribute `id' not set for `model_prop' element."); @@ -7536,11 +8601,11 @@ YY_RULE_SETUP } } YY_BREAK -case 316: +case 354: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of model_prop element.", surf_parse_text[0]); YY_BREAK -case 317: +case 355: YY_RULE_SETUP FAIL("Bad attribute `%s' in `model_prop' element start tag.",surf_parse_text); YY_BREAK @@ -7548,8 +8613,8 @@ case YY_STATE_EOF(AL_surfxml_model___prop): FAIL("EOF in attribute list of `model_prop' element."); YY_BREAK -case 318: -/* rule 318 can match eol */ +case 356: +/* rule 356 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7560,12 +8625,12 @@ YY_RULE_SETUP } } YY_BREAK -case 319: -/* rule 319 can match eol */ +case 357: +/* rule 357 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 320: +case 358: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7573,13 +8638,13 @@ case YY_STATE_EOF(E_surfxml_model___prop): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 321: -/* rule 321 can match eol */ +case 359: +/* rule 359 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 322: -/* rule 322 can match eol */ +case 360: +/* rule 360 can match eol */ YY_RULE_SETUP { AX_surfxml_mount_name = 0; @@ -7590,27 +8655,27 @@ YY_RULE_SETUP } YY_BREAK -case 323: -/* rule 323 can match eol */ +case 361: +/* rule 361 can match eol */ YY_RULE_SETUP if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mount_name_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_name); YY_BREAK -case 324: -/* rule 324 can match eol */ +case 362: +/* rule 362 can match eol */ YY_RULE_SETUP if (surfxml_mount_name_isset != 0) {FAIL("Multiple definition of attribute name in ");} surfxml_mount_name_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_name); YY_BREAK -case 325: -/* rule 325 can match eol */ +case 363: +/* rule 363 can match eol */ YY_RULE_SETUP if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in ");} surfxml_mount_storageId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_mount_storageId); YY_BREAK -case 326: -/* rule 326 can match eol */ +case 364: +/* rule 364 can match eol */ YY_RULE_SETUP if (surfxml_mount_storageId_isset != 0) {FAIL("Multiple definition of attribute storageId in ");} surfxml_mount_storageId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_mount_storageId); YY_BREAK -case 327: +case 365: YY_RULE_SETUP { if (!AX_surfxml_mount_name) FAIL("Required attribute `name' not set for `mount' element."); @@ -7618,7 +8683,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_mount();surfxml_pcdata_ix = 0; ENTER(E_surfxml_mount); } YY_BREAK -case 328: +case 366: YY_RULE_SETUP { if (!AX_surfxml_mount_name) FAIL("Required attribute `name' not set for `mount' element."); @@ -7629,11 +8694,11 @@ YY_RULE_SETUP } } YY_BREAK -case 329: +case 367: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of mount element.", surf_parse_text[0]); YY_BREAK -case 330: +case 368: YY_RULE_SETUP FAIL("Bad attribute `%s' in `mount' element start tag.",surf_parse_text); YY_BREAK @@ -7641,8 +8706,8 @@ case YY_STATE_EOF(AL_surfxml_mount): FAIL("EOF in attribute list of `mount' element."); YY_BREAK -case 331: -/* rule 331 can match eol */ +case 369: +/* rule 369 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7653,12 +8718,12 @@ YY_RULE_SETUP } } YY_BREAK -case 332: -/* rule 332 can match eol */ +case 370: +/* rule 370 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 333: +case 371: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7666,13 +8731,13 @@ case YY_STATE_EOF(E_surfxml_mount): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 334: -/* rule 334 can match eol */ +case 372: +/* rule 372 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 335: -/* rule 335 can match eol */ +case 373: +/* rule 373 can match eol */ YY_RULE_SETUP { AX_surfxml_peer_availability___file = 0; @@ -7695,87 +8760,87 @@ YY_RULE_SETUP } YY_BREAK -case 336: -/* rule 336 can match eol */ +case 374: +/* rule 374 can match eol */ YY_RULE_SETUP if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_availability___file); YY_BREAK -case 337: -/* rule 337 can match eol */ +case 375: +/* rule 375 can match eol */ YY_RULE_SETUP if (surfxml_peer_availability___file_isset != 0) {FAIL("Multiple definition of attribute availability_file in ");} surfxml_peer_availability___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_availability___file); YY_BREAK -case 338: -/* rule 338 can match eol */ +case 376: +/* rule 376 can match eol */ YY_RULE_SETUP if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___in); YY_BREAK -case 339: -/* rule 339 can match eol */ +case 377: +/* rule 377 can match eol */ YY_RULE_SETUP if (surfxml_peer_bw___in_isset != 0) {FAIL("Multiple definition of attribute bw_in in ");} surfxml_peer_bw___in_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___in); YY_BREAK -case 340: -/* rule 340 can match eol */ +case 378: +/* rule 378 can match eol */ YY_RULE_SETUP if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_bw___out); YY_BREAK -case 341: -/* rule 341 can match eol */ +case 379: +/* rule 379 can match eol */ YY_RULE_SETUP if (surfxml_peer_bw___out_isset != 0) {FAIL("Multiple definition of attribute bw_out in ");} surfxml_peer_bw___out_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_bw___out); YY_BREAK -case 342: -/* rule 342 can match eol */ +case 380: +/* rule 380 can match eol */ YY_RULE_SETUP if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_coordinates); YY_BREAK -case 343: -/* rule 343 can match eol */ +case 381: +/* rule 381 can match eol */ YY_RULE_SETUP if (surfxml_peer_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_peer_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_coordinates); YY_BREAK -case 344: -/* rule 344 can match eol */ +case 382: +/* rule 382 can match eol */ YY_RULE_SETUP if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_id); YY_BREAK -case 345: -/* rule 345 can match eol */ +case 383: +/* rule 383 can match eol */ YY_RULE_SETUP if (surfxml_peer_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_peer_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_id); YY_BREAK -case 346: -/* rule 346 can match eol */ +case 384: +/* rule 384 can match eol */ YY_RULE_SETUP if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_lat); YY_BREAK -case 347: -/* rule 347 can match eol */ +case 385: +/* rule 385 can match eol */ YY_RULE_SETUP if (surfxml_peer_lat_isset != 0) {FAIL("Multiple definition of attribute lat in ");} surfxml_peer_lat_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_lat); YY_BREAK -case 348: -/* rule 348 can match eol */ +case 386: +/* rule 386 can match eol */ YY_RULE_SETUP if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_peer_speed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_speed); YY_BREAK -case 349: -/* rule 349 can match eol */ +case 387: +/* rule 387 can match eol */ YY_RULE_SETUP if (surfxml_peer_speed_isset != 0) {FAIL("Multiple definition of attribute speed in ");} surfxml_peer_speed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_speed); YY_BREAK -case 350: -/* rule 350 can match eol */ +case 388: +/* rule 388 can match eol */ YY_RULE_SETUP if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_peer_state___file); YY_BREAK -case 351: -/* rule 351 can match eol */ +case 389: +/* rule 389 can match eol */ YY_RULE_SETUP if (surfxml_peer_state___file_isset != 0) {FAIL("Multiple definition of attribute state_file in ");} surfxml_peer_state___file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_peer_state___file); YY_BREAK -case 352: +case 390: YY_RULE_SETUP { if (!AX_surfxml_peer_bw___in) FAIL("Required attribute `bw_in' not set for `peer' element."); @@ -7785,7 +8850,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_peer();surfxml_pcdata_ix = 0; ENTER(E_surfxml_peer); } YY_BREAK -case 353: +case 391: YY_RULE_SETUP { if (!AX_surfxml_peer_bw___in) FAIL("Required attribute `bw_in' not set for `peer' element."); @@ -7797,14 +8862,15 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 354: +case 392: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of peer element.", surf_parse_text[0]); YY_BREAK -case 355: +case 393: YY_RULE_SETUP FAIL("Bad attribute `%s' in `peer' element start tag.",surf_parse_text); YY_BREAK @@ -7812,8 +8878,8 @@ case YY_STATE_EOF(AL_surfxml_peer): FAIL("EOF in attribute list of `peer' element."); YY_BREAK -case 356: -/* rule 356 can match eol */ +case 394: +/* rule 394 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7823,15 +8889,16 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 357: -/* rule 357 can match eol */ +case 395: +/* rule 395 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 358: +case 396: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7843,6 +8910,11 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); * DTD of SimGrid platform and deployment files. * More info: http://simgrid.gforge.inria.fr/simgrid/latest/doc/platform.html * To upgrade your files, use the tool simgrid_update_xml + * * New in DTD version 5 (in SimGrid 3.16): backward compatible change (v4 files are valid v5 files) + * - can be used as a synonym for the now deprecated + * - an be used as a synonym for the now deprecated + * - an be used as a synonym for the now deprecated + * - can be used as a synonym for the now deprecated * * New in DTD version 4 (in SimGrid 3.13): * - Rename (power->speed) the attributes describing the amount of flop * that a , , or can deliver per second. @@ -7888,13 +8960,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); * - Link bandwidth: from Mb/s to b/s * - CPU speed: from MFlop/s to Flop/s * --> */ -case 359: -/* rule 359 can match eol */ +case 397: +/* rule 397 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 360: -/* rule 360 can match eol */ +case 398: +/* rule 398 can match eol */ YY_RULE_SETUP { AX_surfxml_platform_version = 1; @@ -7903,23 +8975,23 @@ YY_RULE_SETUP } YY_BREAK -case 361: -/* rule 361 can match eol */ +case 399: +/* rule 399 can match eol */ YY_RULE_SETUP if (surfxml_platform_version_isset != 0) {FAIL("Multiple definition of attribute version in ");} surfxml_platform_version_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_platform_version); YY_BREAK -case 362: -/* rule 362 can match eol */ +case 400: +/* rule 400 can match eol */ YY_RULE_SETUP if (surfxml_platform_version_isset != 0) {FAIL("Multiple definition of attribute version in ");} surfxml_platform_version_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_platform_version); YY_BREAK -case 363: +case 401: YY_RULE_SETUP { LEAVE; STag_surfxml_platform();surfxml_pcdata_ix = 0; ENTER(S_surfxml_platform); } YY_BREAK -case 364: +case 402: YY_RULE_SETUP { LEAVE; STag_surfxml_platform(); surfxml_pcdata_ix = 0; ETag_surfxml_platform(); popbuffer(); /* attribute */ @@ -7928,11 +9000,11 @@ YY_RULE_SETUP } } YY_BREAK -case 365: +case 403: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of platform element.", surf_parse_text[0]); YY_BREAK -case 366: +case 404: YY_RULE_SETUP FAIL("Bad attribute `%s' in `platform' element start tag.",surf_parse_text); YY_BREAK @@ -7940,8 +9012,8 @@ case YY_STATE_EOF(AL_surfxml_platform): FAIL("EOF in attribute list of `platform' element."); YY_BREAK -case 367: -/* rule 367 can match eol */ +case 405: +/* rule 405 can match eol */ YY_RULE_SETUP { LEAVE; @@ -7952,12 +9024,12 @@ YY_RULE_SETUP } } YY_BREAK -case 368: -/* rule 368 can match eol */ +case 406: +/* rule 406 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 369: +case 407: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -7971,13 +9043,13 @@ case YY_STATE_EOF(S_surfxml_platform_8): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 370: -/* rule 370 can match eol */ +case 408: +/* rule 408 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 371: -/* rule 371 can match eol */ +case 409: +/* rule 409 can match eol */ YY_RULE_SETUP { AX_surfxml_process_function = 0; @@ -7994,61 +9066,61 @@ YY_RULE_SETUP } YY_BREAK -case 372: -/* rule 372 can match eol */ +case 410: +/* rule 410 can match eol */ YY_RULE_SETUP if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_function); YY_BREAK -case 373: -/* rule 373 can match eol */ +case 411: +/* rule 411 can match eol */ YY_RULE_SETUP if (surfxml_process_function_isset != 0) {FAIL("Multiple definition of attribute function in ");} surfxml_process_function_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_function); YY_BREAK -case 374: -/* rule 374 can match eol */ +case 412: +/* rule 412 can match eol */ YY_RULE_SETUP if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_host); YY_BREAK -case 375: -/* rule 375 can match eol */ +case 413: +/* rule 413 can match eol */ YY_RULE_SETUP if (surfxml_process_host_isset != 0) {FAIL("Multiple definition of attribute host in ");} surfxml_process_host_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_host); YY_BREAK -case 376: -/* rule 376 can match eol */ +case 414: +/* rule 414 can match eol */ YY_RULE_SETUP if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_kill___time); YY_BREAK -case 377: -/* rule 377 can match eol */ +case 415: +/* rule 415 can match eol */ YY_RULE_SETUP if (surfxml_process_kill___time_isset != 0) {FAIL("Multiple definition of attribute kill_time in ");} surfxml_process_kill___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_kill___time); YY_BREAK -case 378: -/* rule 378 can match eol */ -case 379: -/* rule 379 can match eol */ +case 416: +/* rule 416 can match eol */ +case 417: +/* rule 417 can match eol */ YY_RULE_SETUP A_surfxml_process_on___failure = A_surfxml_process_on___failure_DIE; YY_BREAK -case 380: -/* rule 380 can match eol */ -case 381: -/* rule 381 can match eol */ +case 418: +/* rule 418 can match eol */ +case 419: +/* rule 419 can match eol */ YY_RULE_SETUP A_surfxml_process_on___failure = A_surfxml_process_on___failure_RESTART; YY_BREAK -case 382: -/* rule 382 can match eol */ +case 420: +/* rule 420 can match eol */ YY_RULE_SETUP if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_process_start___time); YY_BREAK -case 383: -/* rule 383 can match eol */ +case 421: +/* rule 421 can match eol */ YY_RULE_SETUP if (surfxml_process_start___time_isset != 0) {FAIL("Multiple definition of attribute start_time in ");} surfxml_process_start___time_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_process_start___time); YY_BREAK -case 384: +case 422: YY_RULE_SETUP { if (!AX_surfxml_process_function) FAIL("Required attribute `function' not set for `process' element."); @@ -8056,7 +9128,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_process();surfxml_pcdata_ix = 0; ENTER(S_surfxml_process); } YY_BREAK -case 385: +case 423: YY_RULE_SETUP { if (!AX_surfxml_process_function) FAIL("Required attribute `function' not set for `process' element."); @@ -8067,11 +9139,11 @@ YY_RULE_SETUP } } YY_BREAK -case 386: +case 424: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of process element.", surf_parse_text[0]); YY_BREAK -case 387: +case 425: YY_RULE_SETUP FAIL("Bad attribute `%s' in `process' element start tag.",surf_parse_text); YY_BREAK @@ -8079,8 +9151,8 @@ case YY_STATE_EOF(AL_surfxml_process): FAIL("EOF in attribute list of `process' element."); YY_BREAK -case 388: -/* rule 388 can match eol */ +case 426: +/* rule 426 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8091,12 +9163,12 @@ YY_RULE_SETUP } } YY_BREAK -case 389: -/* rule 389 can match eol */ +case 427: +/* rule 427 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 390: +case 428: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8108,13 +9180,13 @@ if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); /* * */ -case 391: -/* rule 391 can match eol */ +case 429: +/* rule 429 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 392: -/* rule 392 can match eol */ +case 430: +/* rule 430 can match eol */ YY_RULE_SETUP { AX_surfxml_prop_id = 0; @@ -8125,27 +9197,27 @@ YY_RULE_SETUP } YY_BREAK -case 393: -/* rule 393 can match eol */ +case 431: +/* rule 431 can match eol */ YY_RULE_SETUP if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_prop_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_id); YY_BREAK -case 394: -/* rule 394 can match eol */ +case 432: +/* rule 432 can match eol */ YY_RULE_SETUP if (surfxml_prop_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_prop_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_id); YY_BREAK -case 395: -/* rule 395 can match eol */ +case 433: +/* rule 433 can match eol */ YY_RULE_SETUP if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_prop_value_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_prop_value); YY_BREAK -case 396: -/* rule 396 can match eol */ +case 434: +/* rule 434 can match eol */ YY_RULE_SETUP if (surfxml_prop_value_isset != 0) {FAIL("Multiple definition of attribute value in ");} surfxml_prop_value_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_prop_value); YY_BREAK -case 397: +case 435: YY_RULE_SETUP { if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); @@ -8153,7 +9225,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_prop();surfxml_pcdata_ix = 0; ENTER(E_surfxml_prop); } YY_BREAK -case 398: +case 436: YY_RULE_SETUP { if (!AX_surfxml_prop_id) FAIL("Required attribute `id' not set for `prop' element."); @@ -8161,6 +9233,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_prop(); surfxml_pcdata_ix = 0; ETag_surfxml_prop(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_2: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; + case S_surfxml_actor: case S_surfxml_actor_1: case S_surfxml_actor_2: SET(S_surfxml_actor_2); break; case S_surfxml_cluster: case S_surfxml_cluster_1: case S_surfxml_cluster_2: SET(S_surfxml_cluster_2); break; case S_surfxml_config: case S_surfxml_config_1: case S_surfxml_config_2: SET(S_surfxml_config_2); break; case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break; @@ -8168,14 +9241,15 @@ YY_RULE_SETUP case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break; case S_surfxml_storage: case S_surfxml_storage_1: case S_surfxml_storage_2: SET(S_surfxml_storage_2); break; case S_surfxml_storage___type: case S_surfxml_storage___type_1: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break; + case S_surfxml_zone: case S_surfxml_zone_2: case S_surfxml_zone_3: SET(S_surfxml_zone_3); break; } } YY_BREAK -case 399: +case 437: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of prop element.", surf_parse_text[0]); YY_BREAK -case 400: +case 438: YY_RULE_SETUP FAIL("Bad attribute `%s' in `prop' element start tag.",surf_parse_text); YY_BREAK @@ -8183,8 +9257,8 @@ case YY_STATE_EOF(AL_surfxml_prop): FAIL("EOF in attribute list of `prop' element."); YY_BREAK -case 401: -/* rule 401 can match eol */ +case 439: +/* rule 439 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8192,6 +9266,7 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_2: case S_surfxml_AS_3: SET(S_surfxml_AS_3); break; + case S_surfxml_actor: case S_surfxml_actor_1: case S_surfxml_actor_2: SET(S_surfxml_actor_2); break; case S_surfxml_cluster: case S_surfxml_cluster_1: case S_surfxml_cluster_2: SET(S_surfxml_cluster_2); break; case S_surfxml_config: case S_surfxml_config_1: case S_surfxml_config_2: SET(S_surfxml_config_2); break; case S_surfxml_host: case S_surfxml_host_1: case S_surfxml_host_2: SET(S_surfxml_host_2); break; @@ -8199,15 +9274,16 @@ YY_RULE_SETUP case S_surfxml_process: case S_surfxml_process_1: case S_surfxml_process_2: SET(S_surfxml_process_2); break; case S_surfxml_storage: case S_surfxml_storage_1: case S_surfxml_storage_2: SET(S_surfxml_storage_2); break; case S_surfxml_storage___type: case S_surfxml_storage___type_1: case S_surfxml_storage___type_2: SET(S_surfxml_storage___type_2); break; + case S_surfxml_zone: case S_surfxml_zone_2: case S_surfxml_zone_3: SET(S_surfxml_zone_3); break; } } YY_BREAK -case 402: -/* rule 402 can match eol */ +case 440: +/* rule 440 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 403: +case 441: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8215,13 +9291,13 @@ case YY_STATE_EOF(E_surfxml_prop): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 404: -/* rule 404 can match eol */ +case 442: +/* rule 442 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 405: -/* rule 405 can match eol */ +case 443: +/* rule 443 can match eol */ YY_RULE_SETUP { AX_surfxml_random_generator = A_surfxml_random_generator_DRAND48; @@ -8244,105 +9320,105 @@ YY_RULE_SETUP } YY_BREAK -case 406: -/* rule 406 can match eol */ -case 407: -/* rule 407 can match eol */ +case 444: +/* rule 444 can match eol */ +case 445: +/* rule 445 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_DRAND48; YY_BREAK -case 408: -/* rule 408 can match eol */ -case 409: -/* rule 409 can match eol */ +case 446: +/* rule 446 can match eol */ +case 447: +/* rule 447 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_RAND; YY_BREAK -case 410: -/* rule 410 can match eol */ -case 411: -/* rule 411 can match eol */ +case 448: +/* rule 448 can match eol */ +case 449: +/* rule 449 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_RNGSTREAM; - YY_BREAK -case 412: -/* rule 412 can match eol */ -case 413: -/* rule 413 can match eol */ + YY_BREAK +case 450: +/* rule 450 can match eol */ +case 451: +/* rule 451 can match eol */ YY_RULE_SETUP A_surfxml_random_generator = A_surfxml_random_generator_NONE; YY_BREAK -case 414: -/* rule 414 can match eol */ +case 452: +/* rule 452 can match eol */ YY_RULE_SETUP if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_random_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_id); YY_BREAK -case 415: -/* rule 415 can match eol */ +case 453: +/* rule 453 can match eol */ YY_RULE_SETUP if (surfxml_random_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_random_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_id); YY_BREAK -case 416: -/* rule 416 can match eol */ +case 454: +/* rule 454 can match eol */ YY_RULE_SETUP if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in ");} surfxml_random_max_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_max); YY_BREAK -case 417: -/* rule 417 can match eol */ +case 455: +/* rule 455 can match eol */ YY_RULE_SETUP if (surfxml_random_max_isset != 0) {FAIL("Multiple definition of attribute max in ");} surfxml_random_max_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_max); YY_BREAK -case 418: -/* rule 418 can match eol */ +case 456: +/* rule 456 can match eol */ YY_RULE_SETUP if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in ");} surfxml_random_mean_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_mean); YY_BREAK -case 419: -/* rule 419 can match eol */ +case 457: +/* rule 457 can match eol */ YY_RULE_SETUP if (surfxml_random_mean_isset != 0) {FAIL("Multiple definition of attribute mean in ");} surfxml_random_mean_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_mean); YY_BREAK -case 420: -/* rule 420 can match eol */ +case 458: +/* rule 458 can match eol */ YY_RULE_SETUP if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in ");} surfxml_random_min_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_min); YY_BREAK -case 421: -/* rule 421 can match eol */ +case 459: +/* rule 459 can match eol */ YY_RULE_SETUP if (surfxml_random_min_isset != 0) {FAIL("Multiple definition of attribute min in ");} surfxml_random_min_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_min); YY_BREAK -case 422: -/* rule 422 can match eol */ +case 460: +/* rule 460 can match eol */ YY_RULE_SETUP if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_random_radical_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_radical); YY_BREAK -case 423: -/* rule 423 can match eol */ +case 461: +/* rule 461 can match eol */ YY_RULE_SETUP if (surfxml_random_radical_isset != 0) {FAIL("Multiple definition of attribute radical in ");} surfxml_random_radical_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_radical); YY_BREAK -case 424: -/* rule 424 can match eol */ +case 462: +/* rule 462 can match eol */ YY_RULE_SETUP if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in ");} surfxml_random_seed_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_seed); YY_BREAK -case 425: -/* rule 425 can match eol */ +case 463: +/* rule 463 can match eol */ YY_RULE_SETUP if (surfxml_random_seed_isset != 0) {FAIL("Multiple definition of attribute seed in ");} surfxml_random_seed_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_seed); YY_BREAK -case 426: -/* rule 426 can match eol */ +case 464: +/* rule 464 can match eol */ YY_RULE_SETUP if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in ");} surfxml_random_std___deviation_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_random_std___deviation); YY_BREAK -case 427: -/* rule 427 can match eol */ +case 465: +/* rule 465 can match eol */ YY_RULE_SETUP if (surfxml_random_std___deviation_isset != 0) {FAIL("Multiple definition of attribute std_deviation in ");} surfxml_random_std___deviation_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_random_std___deviation); YY_BREAK -case 428: +case 466: YY_RULE_SETUP { if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element."); @@ -8353,7 +9429,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_random();surfxml_pcdata_ix = 0; ENTER(E_surfxml_random); } YY_BREAK -case 429: +case 467: YY_RULE_SETUP { if (!AX_surfxml_random_id) FAIL("Required attribute `id' not set for `random' element."); @@ -8367,11 +9443,11 @@ YY_RULE_SETUP } } YY_BREAK -case 430: +case 468: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of random element.", surf_parse_text[0]); YY_BREAK -case 431: +case 469: YY_RULE_SETUP FAIL("Bad attribute `%s' in `random' element start tag.",surf_parse_text); YY_BREAK @@ -8379,8 +9455,8 @@ case YY_STATE_EOF(AL_surfxml_random): FAIL("EOF in attribute list of `random' element."); YY_BREAK -case 432: -/* rule 432 can match eol */ +case 470: +/* rule 470 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8391,12 +9467,12 @@ YY_RULE_SETUP } } YY_BREAK -case 433: -/* rule 433 can match eol */ +case 471: +/* rule 471 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 434: +case 472: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8404,13 +9480,13 @@ case YY_STATE_EOF(E_surfxml_random): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 435: -/* rule 435 can match eol */ +case 473: +/* rule 473 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 436: -/* rule 436 can match eol */ +case 474: +/* rule 474 can match eol */ YY_RULE_SETUP { AX_surfxml_route_dst = 0; @@ -8423,41 +9499,41 @@ YY_RULE_SETUP } YY_BREAK -case 437: -/* rule 437 can match eol */ +case 475: +/* rule 475 can match eol */ YY_RULE_SETUP if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_dst); YY_BREAK -case 438: -/* rule 438 can match eol */ +case 476: +/* rule 476 can match eol */ YY_RULE_SETUP if (surfxml_route_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_route_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_dst); YY_BREAK -case 439: -/* rule 439 can match eol */ +case 477: +/* rule 477 can match eol */ YY_RULE_SETUP if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_route_src); YY_BREAK -case 440: -/* rule 440 can match eol */ +case 478: +/* rule 478 can match eol */ YY_RULE_SETUP if (surfxml_route_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_route_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_route_src); YY_BREAK -case 441: -/* rule 441 can match eol */ -case 442: -/* rule 442 can match eol */ +case 479: +/* rule 479 can match eol */ +case 480: +/* rule 480 can match eol */ YY_RULE_SETUP A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_YES; YY_BREAK -case 443: -/* rule 443 can match eol */ -case 444: -/* rule 444 can match eol */ +case 481: +/* rule 481 can match eol */ +case 482: +/* rule 482 can match eol */ YY_RULE_SETUP A_surfxml_route_symmetrical = A_surfxml_route_symmetrical_NO; YY_BREAK -case 445: +case 483: YY_RULE_SETUP { if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element."); @@ -8465,7 +9541,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_route();surfxml_pcdata_ix = 0; ENTER(S_surfxml_route); } YY_BREAK -case 446: +case 484: YY_RULE_SETUP { if (!AX_surfxml_route_dst) FAIL("Required attribute `dst' not set for `route' element."); @@ -8473,14 +9549,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_route(); surfxml_pcdata_ix = 0; ETag_surfxml_route(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 447: +case 485: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of route element.", surf_parse_text[0]); YY_BREAK -case 448: +case 486: YY_RULE_SETUP FAIL("Bad attribute `%s' in `route' element start tag.",surf_parse_text); YY_BREAK @@ -8488,8 +9565,8 @@ case YY_STATE_EOF(AL_surfxml_route): FAIL("EOF in attribute list of `route' element."); YY_BREAK -case 449: -/* rule 449 can match eol */ +case 487: +/* rule 487 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8497,15 +9574,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 450: -/* rule 450 can match eol */ +case 488: +/* rule 488 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 451: +case 489: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8515,13 +9593,13 @@ case YY_STATE_EOF(S_surfxml_route_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 452: -/* rule 452 can match eol */ +case 490: +/* rule 490 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 453: -/* rule 453 can match eol */ +case 491: +/* rule 491 can match eol */ YY_RULE_SETUP { AX_surfxml_router_coordinates = 0; @@ -8532,48 +9610,49 @@ YY_RULE_SETUP } YY_BREAK -case 454: -/* rule 454 can match eol */ +case 492: +/* rule 492 can match eol */ YY_RULE_SETUP if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_router_coordinates_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_coordinates); YY_BREAK -case 455: -/* rule 455 can match eol */ +case 493: +/* rule 493 can match eol */ YY_RULE_SETUP if (surfxml_router_coordinates_isset != 0) {FAIL("Multiple definition of attribute coordinates in ");} surfxml_router_coordinates_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_coordinates); YY_BREAK -case 456: -/* rule 456 can match eol */ +case 494: +/* rule 494 can match eol */ YY_RULE_SETUP if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_router_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_router_id); YY_BREAK -case 457: -/* rule 457 can match eol */ +case 495: +/* rule 495 can match eol */ YY_RULE_SETUP if (surfxml_router_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_router_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_router_id); YY_BREAK -case 458: +case 496: YY_RULE_SETUP { if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element."); LEAVE; STag_surfxml_router();surfxml_pcdata_ix = 0; ENTER(E_surfxml_router); } YY_BREAK -case 459: +case 497: YY_RULE_SETUP { if (!AX_surfxml_router_id) FAIL("Required attribute `id' not set for `router' element."); LEAVE; STag_surfxml_router(); surfxml_pcdata_ix = 0; ETag_surfxml_router(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 460: +case 498: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of router element.", surf_parse_text[0]); YY_BREAK -case 461: +case 499: YY_RULE_SETUP FAIL("Bad attribute `%s' in `router' element start tag.",surf_parse_text); YY_BREAK @@ -8581,8 +9660,8 @@ case YY_STATE_EOF(AL_surfxml_router): FAIL("EOF in attribute list of `router' element."); YY_BREAK -case 462: -/* rule 462 can match eol */ +case 500: +/* rule 500 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8590,15 +9669,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 463: -/* rule 463 can match eol */ +case 501: +/* rule 501 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 464: +case 502: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8606,13 +9686,13 @@ case YY_STATE_EOF(E_surfxml_router): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 465: -/* rule 465 can match eol */ +case 503: +/* rule 503 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 466: -/* rule 466 can match eol */ +case 504: +/* rule 504 can match eol */ YY_RULE_SETUP { AX_surfxml_storage_attach = 0; @@ -8629,57 +9709,57 @@ YY_RULE_SETUP } YY_BREAK -case 467: -/* rule 467 can match eol */ +case 505: +/* rule 505 can match eol */ YY_RULE_SETUP if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in ");} surfxml_storage_attach_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_attach); YY_BREAK -case 468: -/* rule 468 can match eol */ +case 506: +/* rule 506 can match eol */ YY_RULE_SETUP if (surfxml_storage_attach_isset != 0) {FAIL("Multiple definition of attribute attach in ");} surfxml_storage_attach_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_attach); YY_BREAK -case 469: -/* rule 469 can match eol */ +case 507: +/* rule 507 can match eol */ YY_RULE_SETUP if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content); YY_BREAK -case 470: -/* rule 470 can match eol */ +case 508: +/* rule 508 can match eol */ YY_RULE_SETUP if (surfxml_storage_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content); YY_BREAK -case 471: -/* rule 471 can match eol */ +case 509: +/* rule 509 can match eol */ YY_RULE_SETUP if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in ");} surfxml_storage_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_content___type); YY_BREAK -case 472: -/* rule 472 can match eol */ +case 510: +/* rule 510 can match eol */ YY_RULE_SETUP if (surfxml_storage_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in ");} surfxml_storage_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_content___type); YY_BREAK -case 473: -/* rule 473 can match eol */ +case 511: +/* rule 511 can match eol */ YY_RULE_SETUP if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_id); YY_BREAK -case 474: -/* rule 474 can match eol */ +case 512: +/* rule 512 can match eol */ YY_RULE_SETUP if (surfxml_storage_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_id); YY_BREAK -case 475: -/* rule 475 can match eol */ +case 513: +/* rule 513 can match eol */ YY_RULE_SETUP if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_storage_typeId_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage_typeId); YY_BREAK -case 476: -/* rule 476 can match eol */ +case 514: +/* rule 514 can match eol */ YY_RULE_SETUP if (surfxml_storage_typeId_isset != 0) {FAIL("Multiple definition of attribute typeId in ");} surfxml_storage_typeId_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage_typeId); YY_BREAK -case 477: +case 515: YY_RULE_SETUP { if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element."); @@ -8688,7 +9768,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_storage();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage); } YY_BREAK -case 478: +case 516: YY_RULE_SETUP { if (!AX_surfxml_storage_attach) FAIL("Required attribute `attach' not set for `storage' element."); @@ -8697,14 +9777,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_storage(); surfxml_pcdata_ix = 0; ETag_surfxml_storage(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 479: +case 517: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of storage element.", surf_parse_text[0]); YY_BREAK -case 480: +case 518: YY_RULE_SETUP FAIL("Bad attribute `%s' in `storage' element start tag.",surf_parse_text); YY_BREAK @@ -8712,8 +9793,8 @@ case YY_STATE_EOF(AL_surfxml_storage): FAIL("EOF in attribute list of `storage' element."); YY_BREAK -case 481: -/* rule 481 can match eol */ +case 519: +/* rule 519 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8721,15 +9802,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 482: -/* rule 482 can match eol */ +case 520: +/* rule 520 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 483: +case 521: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8739,13 +9821,13 @@ case YY_STATE_EOF(S_surfxml_storage_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 484: -/* rule 484 can match eol */ +case 522: +/* rule 522 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 485: -/* rule 485 can match eol */ +case 523: +/* rule 523 can match eol */ YY_RULE_SETUP { AX_surfxml_storage___type_content = 0; @@ -8762,57 +9844,57 @@ YY_RULE_SETUP } YY_BREAK -case 486: -/* rule 486 can match eol */ +case 524: +/* rule 524 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage___type_content_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content); YY_BREAK -case 487: -/* rule 487 can match eol */ +case 525: +/* rule 525 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_content_isset != 0) {FAIL("Multiple definition of attribute content in ");} surfxml_storage___type_content_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content); YY_BREAK -case 488: -/* rule 488 can match eol */ +case 526: +/* rule 526 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in ");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_content___type); YY_BREAK -case 489: -/* rule 489 can match eol */ +case 527: +/* rule 527 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_content___type_isset != 0) {FAIL("Multiple definition of attribute content_type in ");} surfxml_storage___type_content___type_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_content___type); YY_BREAK -case 490: -/* rule 490 can match eol */ +case 528: +/* rule 528 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage___type_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_id); YY_BREAK -case 491: -/* rule 491 can match eol */ +case 529: +/* rule 529 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_storage___type_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_id); YY_BREAK -case 492: -/* rule 492 can match eol */ +case 530: +/* rule 530 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in ");} surfxml_storage___type_model_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_model); YY_BREAK -case 493: -/* rule 493 can match eol */ +case 531: +/* rule 531 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_model_isset != 0) {FAIL("Multiple definition of attribute model in ");} surfxml_storage___type_model_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_model); - YY_BREAK -case 494: -/* rule 494 can match eol */ + YY_BREAK +case 532: +/* rule 532 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} surfxml_storage___type_size_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_storage___type_size); YY_BREAK -case 495: -/* rule 495 can match eol */ +case 533: +/* rule 533 can match eol */ YY_RULE_SETUP if (surfxml_storage___type_size_isset != 0) {FAIL("Multiple definition of attribute size in ");} surfxml_storage___type_size_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_storage___type_size); YY_BREAK -case 496: +case 534: YY_RULE_SETUP { if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element."); @@ -8821,7 +9903,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_storage___type();surfxml_pcdata_ix = 0; ENTER(S_surfxml_storage___type); } YY_BREAK -case 497: +case 535: YY_RULE_SETUP { if (!AX_surfxml_storage___type_id) FAIL("Required attribute `id' not set for `storage_type' element."); @@ -8830,14 +9912,15 @@ YY_RULE_SETUP LEAVE; STag_surfxml_storage___type(); surfxml_pcdata_ix = 0; ETag_surfxml_storage___type(); popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 498: +case 536: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of storage_type element.", surf_parse_text[0]); YY_BREAK -case 499: +case 537: YY_RULE_SETUP FAIL("Bad attribute `%s' in `storage_type' element start tag.",surf_parse_text); YY_BREAK @@ -8845,8 +9928,8 @@ case YY_STATE_EOF(AL_surfxml_storage___type): FAIL("EOF in attribute list of `storage_type' element."); YY_BREAK -case 500: -/* rule 500 can match eol */ +case 538: +/* rule 538 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8854,15 +9937,16 @@ YY_RULE_SETUP popbuffer(); /* attribute */ switch (YY_START) { case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; } } YY_BREAK -case 501: -/* rule 501 can match eol */ +case 539: +/* rule 539 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 502: +case 540: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -8872,13 +9956,13 @@ case YY_STATE_EOF(S_surfxml_storage___type_2): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 503: -/* rule 503 can match eol */ +case 541: +/* rule 541 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 504: -/* rule 504 can match eol */ +case 542: +/* rule 542 can match eol */ YY_RULE_SETUP { AX_surfxml_trace_file = 0; @@ -8891,37 +9975,37 @@ YY_RULE_SETUP } YY_BREAK -case 505: -/* rule 505 can match eol */ +case 543: +/* rule 543 can match eol */ YY_RULE_SETUP if (surfxml_trace_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} surfxml_trace_file_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_file); YY_BREAK -case 506: -/* rule 506 can match eol */ +case 544: +/* rule 544 can match eol */ YY_RULE_SETUP if (surfxml_trace_file_isset != 0) {FAIL("Multiple definition of attribute file in ");} surfxml_trace_file_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_file); YY_BREAK -case 507: -/* rule 507 can match eol */ +case 545: +/* rule 545 can match eol */ YY_RULE_SETUP if (surfxml_trace_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_trace_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_id); YY_BREAK -case 508: -/* rule 508 can match eol */ +case 546: +/* rule 546 can match eol */ YY_RULE_SETUP if (surfxml_trace_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_trace_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_id); YY_BREAK -case 509: -/* rule 509 can match eol */ +case 547: +/* rule 547 can match eol */ YY_RULE_SETUP if (surfxml_trace_periodicity_isset != 0) {FAIL("Multiple definition of attribute periodicity in ");} surfxml_trace_periodicity_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace_periodicity); YY_BREAK -case 510: -/* rule 510 can match eol */ +case 548: +/* rule 548 can match eol */ YY_RULE_SETUP if (surfxml_trace_periodicity_isset != 0) {FAIL("Multiple definition of attribute periodicity in ");} surfxml_trace_periodicity_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace_periodicity); YY_BREAK -case 511: +case 549: YY_RULE_SETUP { if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element."); @@ -8929,7 +10013,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_trace();pushbuffer(surfxml_pcdata_ix); BUFFERSET(surfxml_pcdata_ix);; ENTER(IN_trace); } YY_BREAK -case 512: +case 550: YY_RULE_SETUP { if (!AX_surfxml_trace_id) FAIL("Required attribute `id' not set for `trace' element."); @@ -8939,14 +10023,15 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 513: +case 551: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of trace element.", surf_parse_text[0]); YY_BREAK -case 514: +case 552: YY_RULE_SETUP FAIL("Bad attribute `%s' in `trace' element start tag.",surf_parse_text); YY_BREAK @@ -8954,8 +10039,8 @@ case YY_STATE_EOF(AL_surfxml_trace): FAIL("EOF in attribute list of `trace' element."); YY_BREAK -case 515: -/* rule 515 can match eol */ +case 553: +/* rule 553 can match eol */ YY_RULE_SETUP { LEAVE; @@ -8967,11 +10052,12 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 516: -/* rule 516 can match eol */ +case 554: +/* rule 554 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK @@ -8979,13 +10065,13 @@ case YY_STATE_EOF(IN_trace): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK -case 517: -/* rule 517 can match eol */ +case 555: +/* rule 555 can match eol */ YY_RULE_SETUP FAIL("Starting tag is not allowed here."); YY_BREAK -case 518: -/* rule 518 can match eol */ +case 556: +/* rule 556 can match eol */ YY_RULE_SETUP { AX_surfxml_trace___connect_element = 0; @@ -8998,62 +10084,62 @@ YY_RULE_SETUP } YY_BREAK -case 519: -/* rule 519 can match eol */ +case 557: +/* rule 557 can match eol */ YY_RULE_SETUP if (surfxml_trace___connect_element_isset != 0) {FAIL("Multiple definition of attribute element in ");} surfxml_trace___connect_element_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace___connect_element); YY_BREAK -case 520: -/* rule 520 can match eol */ +case 558: +/* rule 558 can match eol */ YY_RULE_SETUP if (surfxml_trace___connect_element_isset != 0) {FAIL("Multiple definition of attribute element in ");} surfxml_trace___connect_element_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace___connect_element); YY_BREAK -case 521: -/* rule 521 can match eol */ -case 522: -/* rule 522 can match eol */ +case 559: +/* rule 559 can match eol */ +case 560: +/* rule 560 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_HOST___AVAIL; YY_BREAK -case 523: -/* rule 523 can match eol */ -case 524: -/* rule 524 can match eol */ +case 561: +/* rule 561 can match eol */ +case 562: +/* rule 562 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_SPEED; YY_BREAK -case 525: -/* rule 525 can match eol */ -case 526: -/* rule 526 can match eol */ +case 563: +/* rule 563 can match eol */ +case 564: +/* rule 564 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_LINK___AVAIL; YY_BREAK -case 527: -/* rule 527 can match eol */ -case 528: -/* rule 528 can match eol */ +case 565: +/* rule 565 can match eol */ +case 566: +/* rule 566 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_BANDWIDTH; YY_BREAK -case 529: -/* rule 529 can match eol */ -case 530: -/* rule 530 can match eol */ +case 567: +/* rule 567 can match eol */ +case 568: +/* rule 568 can match eol */ YY_RULE_SETUP A_surfxml_trace___connect_kind = A_surfxml_trace___connect_kind_LATENCY; YY_BREAK -case 531: -/* rule 531 can match eol */ +case 569: +/* rule 569 can match eol */ YY_RULE_SETUP if (surfxml_trace___connect_trace_isset != 0) {FAIL("Multiple definition of attribute trace in ");} surfxml_trace___connect_trace_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_trace___connect_trace); YY_BREAK -case 532: -/* rule 532 can match eol */ +case 570: +/* rule 570 can match eol */ YY_RULE_SETUP if (surfxml_trace___connect_trace_isset != 0) {FAIL("Multiple definition of attribute trace in ");} surfxml_trace___connect_trace_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_trace___connect_trace); YY_BREAK -case 533: +case 571: YY_RULE_SETUP { if (!AX_surfxml_trace___connect_element) FAIL("Required attribute `element' not set for `trace_connect' element."); @@ -9061,7 +10147,7 @@ YY_RULE_SETUP LEAVE; STag_surfxml_trace___connect();surfxml_pcdata_ix = 0; ENTER(E_surfxml_trace___connect); } YY_BREAK -case 534: +case 572: YY_RULE_SETUP { if (!AX_surfxml_trace___connect_element) FAIL("Required attribute `element' not set for `trace_connect' element."); @@ -9071,14 +10157,15 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 535: +case 573: YY_RULE_SETUP FAIL("Unexpected character `%c' in attribute list of trace_connect element.", surf_parse_text[0]); YY_BREAK -case 536: +case 574: YY_RULE_SETUP FAIL("Bad attribute `%s' in `trace_connect' element start tag.",surf_parse_text); YY_BREAK @@ -9086,8 +10173,8 @@ case YY_STATE_EOF(AL_surfxml_trace___connect): FAIL("EOF in attribute list of `trace_connect' element."); YY_BREAK -case 537: -/* rule 537 can match eol */ +case 575: +/* rule 575 can match eol */ YY_RULE_SETUP { LEAVE; @@ -9097,15 +10184,16 @@ YY_RULE_SETUP case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_4: case S_surfxml_AS_6: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; } } YY_BREAK -case 538: -/* rule 538 can match eol */ +case 576: +/* rule 576 can match eol */ YY_RULE_SETUP FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); YY_BREAK -case 539: +case 577: YY_RULE_SETUP FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); YY_BREAK @@ -9113,9 +10201,319 @@ case YY_STATE_EOF(E_surfxml_trace___connect): if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); YY_BREAK +case 578: +/* rule 578 can match eol */ +YY_RULE_SETUP +FAIL("Starting tag is not allowed here."); + YY_BREAK +case 579: +/* rule 579 can match eol */ +YY_RULE_SETUP +{ + AX_surfxml_zone_id = 0; + surfxml_zone_id_isset = 0; + AX_surfxml_zone_routing = AU_surfxml_zone_routing; + surfxml_zone_routing_isset = 0; + ENTER(AL_surfxml_zone); pushbuffer(0); + } + YY_BREAK + +case 580: +/* rule 580 can match eol */ +YY_RULE_SETUP +if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_zone_id_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zone_id); + YY_BREAK +case 581: +/* rule 581 can match eol */ +YY_RULE_SETUP +if (surfxml_zone_id_isset != 0) {FAIL("Multiple definition of attribute id in ");} surfxml_zone_id_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zone_id); + YY_BREAK +case 582: +/* rule 582 can match eol */ +case 583: +/* rule 583 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_Full; + YY_BREAK +case 584: +/* rule 584 can match eol */ +case 585: +/* rule 585 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_Floyd; + YY_BREAK +case 586: +/* rule 586 can match eol */ +case 587: +/* rule 587 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_Dijkstra; + YY_BREAK +case 588: +/* rule 588 can match eol */ +case 589: +/* rule 589 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_DijkstraCache; + YY_BREAK +case 590: +/* rule 590 can match eol */ +case 591: +/* rule 591 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_None; + YY_BREAK +case 592: +/* rule 592 can match eol */ +case 593: +/* rule 593 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_Vivaldi; + YY_BREAK +case 594: +/* rule 594 can match eol */ +case 595: +/* rule 595 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_Cluster; + YY_BREAK +case 596: +/* rule 596 can match eol */ +case 597: +/* rule 597 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterTorus; + YY_BREAK +case 598: +/* rule 598 can match eol */ +case 599: +/* rule 599 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterFatTree; + YY_BREAK +case 600: +/* rule 600 can match eol */ +case 601: +/* rule 601 can match eol */ +YY_RULE_SETUP +A_surfxml_zone_routing = A_surfxml_zone_routing_ClusterDragonfly; + YY_BREAK +case 602: +YY_RULE_SETUP +{ + if (!AX_surfxml_zone_id) FAIL("Required attribute `id' not set for `zone' element."); + if (!AX_surfxml_zone_routing) FAIL("Required attribute `routing' not set for `zone' element."); + LEAVE; STag_surfxml_zone();surfxml_pcdata_ix = 0; ENTER(S_surfxml_zone); + } + YY_BREAK +case 603: +YY_RULE_SETUP +{ + if (!AX_surfxml_zone_id) FAIL("Required attribute `id' not set for `zone' element."); + if (!AX_surfxml_zone_routing) FAIL("Required attribute `routing' not set for `zone' element."); + LEAVE; STag_surfxml_zone(); surfxml_pcdata_ix = 0; ETag_surfxml_zone(); popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; + case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; + } + } + YY_BREAK +case 604: +YY_RULE_SETUP +FAIL("Unexpected character `%c' in attribute list of zone element.", surf_parse_text[0]); + YY_BREAK +case 605: +YY_RULE_SETUP +FAIL("Bad attribute `%s' in `zone' element start tag.",surf_parse_text); + YY_BREAK +case YY_STATE_EOF(AL_surfxml_zone): +FAIL("EOF in attribute list of `zone' element."); + YY_BREAK + +case 606: +/* rule 606 can match eol */ +YY_RULE_SETUP +{ + LEAVE; + ETag_surfxml_zone(); + popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS: case S_surfxml_AS_1: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_include: case S_surfxml_include_1: case S_surfxml_include_2: SET(S_surfxml_include_2); break; + case S_surfxml_platform: case S_surfxml_platform_1: case S_surfxml_platform_3: case S_surfxml_platform_5: case S_surfxml_platform_6: SET(S_surfxml_platform_6); break; + case S_surfxml_zone: case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_5: case S_surfxml_zone_6: SET(S_surfxml_zone_6); break; + } + } + YY_BREAK +case 607: +/* rule 607 can match eol */ +YY_RULE_SETUP +FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); + YY_BREAK +case 608: +YY_RULE_SETUP +FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); + YY_BREAK +case YY_STATE_EOF(E_surfxml_zone): +case YY_STATE_EOF(S_surfxml_zone): +case YY_STATE_EOF(S_surfxml_zone_1): +case YY_STATE_EOF(S_surfxml_zone_3): +case YY_STATE_EOF(S_surfxml_zone_4): +case YY_STATE_EOF(S_surfxml_zone_6): +case YY_STATE_EOF(S_surfxml_zone_8): +if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); + YY_BREAK + +case 609: +/* rule 609 can match eol */ +YY_RULE_SETUP +FAIL("Starting tag is not allowed here."); + YY_BREAK +case 610: +/* rule 610 can match eol */ +YY_RULE_SETUP +{ + AX_surfxml_zoneRoute_dst = 0; + surfxml_zoneRoute_dst_isset = 0; + AX_surfxml_zoneRoute_gw___dst = 0; + surfxml_zoneRoute_gw___dst_isset = 0; + AX_surfxml_zoneRoute_gw___src = 0; + surfxml_zoneRoute_gw___src_isset = 0; + AX_surfxml_zoneRoute_src = 0; + surfxml_zoneRoute_src_isset = 0; + AX_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_YES; + surfxml_zoneRoute_symmetrical_isset = 0; + ENTER(AL_surfxml_zoneRoute); pushbuffer(0); + } + YY_BREAK + +case 611: +/* rule 611 can match eol */ +YY_RULE_SETUP +if (surfxml_zoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_zoneRoute_dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_dst); + YY_BREAK +case 612: +/* rule 612 can match eol */ +YY_RULE_SETUP +if (surfxml_zoneRoute_dst_isset != 0) {FAIL("Multiple definition of attribute dst in ");} surfxml_zoneRoute_dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_dst); + YY_BREAK +case 613: +/* rule 613 can match eol */ +YY_RULE_SETUP +if (surfxml_zoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_zoneRoute_gw___dst_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_gw___dst); + YY_BREAK +case 614: +/* rule 614 can match eol */ +YY_RULE_SETUP +if (surfxml_zoneRoute_gw___dst_isset != 0) {FAIL("Multiple definition of attribute gw_dst in ");} surfxml_zoneRoute_gw___dst_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_gw___dst); + YY_BREAK +case 615: +/* rule 615 can match eol */ +YY_RULE_SETUP +if (surfxml_zoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_zoneRoute_gw___src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_gw___src); + YY_BREAK +case 616: +/* rule 616 can match eol */ +YY_RULE_SETUP +if (surfxml_zoneRoute_gw___src_isset != 0) {FAIL("Multiple definition of attribute gw_src in ");} surfxml_zoneRoute_gw___src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_gw___src); + YY_BREAK +case 617: +/* rule 617 can match eol */ +YY_RULE_SETUP +if (surfxml_zoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_zoneRoute_src_isset = 1; ENTER(VALUE1); BUFFERSET(AX_surfxml_zoneRoute_src); + YY_BREAK +case 618: +/* rule 618 can match eol */ +YY_RULE_SETUP +if (surfxml_zoneRoute_src_isset != 0) {FAIL("Multiple definition of attribute src in ");} surfxml_zoneRoute_src_isset = 1; ENTER(VALUE2); BUFFERSET(AX_surfxml_zoneRoute_src); + YY_BREAK +case 619: +/* rule 619 can match eol */ +case 620: +/* rule 620 can match eol */ +YY_RULE_SETUP +A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_YES; + YY_BREAK +case 621: +/* rule 621 can match eol */ +case 622: +/* rule 622 can match eol */ +YY_RULE_SETUP +A_surfxml_zoneRoute_symmetrical = A_surfxml_zoneRoute_symmetrical_NO; + YY_BREAK +case 623: +YY_RULE_SETUP +{ + if (!AX_surfxml_zoneRoute_dst) FAIL("Required attribute `dst' not set for `zoneRoute' element."); + if (!AX_surfxml_zoneRoute_gw___dst) FAIL("Required attribute `gw_dst' not set for `zoneRoute' element."); + if (!AX_surfxml_zoneRoute_gw___src) FAIL("Required attribute `gw_src' not set for `zoneRoute' element."); + if (!AX_surfxml_zoneRoute_src) FAIL("Required attribute `src' not set for `zoneRoute' element."); + LEAVE; STag_surfxml_zoneRoute();surfxml_pcdata_ix = 0; ENTER(S_surfxml_zoneRoute); + } + YY_BREAK +case 624: +YY_RULE_SETUP +{ + if (!AX_surfxml_zoneRoute_dst) FAIL("Required attribute `dst' not set for `zoneRoute' element."); + if (!AX_surfxml_zoneRoute_gw___dst) FAIL("Required attribute `gw_dst' not set for `zoneRoute' element."); + if (!AX_surfxml_zoneRoute_gw___src) FAIL("Required attribute `gw_src' not set for `zoneRoute' element."); + if (!AX_surfxml_zoneRoute_src) FAIL("Required attribute `src' not set for `zoneRoute' element."); + LEAVE; STag_surfxml_zoneRoute(); surfxml_pcdata_ix = 0; ETag_surfxml_zoneRoute(); popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS_1: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_5: SET(S_surfxml_zone_6); break; + case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; + } + } + YY_BREAK +case 625: +YY_RULE_SETUP +FAIL("Unexpected character `%c' in attribute list of zoneRoute element.", surf_parse_text[0]); + YY_BREAK +case 626: +YY_RULE_SETUP +FAIL("Bad attribute `%s' in `zoneRoute' element start tag.",surf_parse_text); + YY_BREAK +case YY_STATE_EOF(AL_surfxml_zoneRoute): +FAIL("EOF in attribute list of `zoneRoute' element."); + YY_BREAK + +case 627: +/* rule 627 can match eol */ +YY_RULE_SETUP +{ + LEAVE; + ETag_surfxml_zoneRoute(); + popbuffer(); /* attribute */ + switch (YY_START) { + case S_surfxml_AS: case S_surfxml_AS_3: case S_surfxml_AS_5: case S_surfxml_AS_6: SET(S_surfxml_AS_6); break; + case S_surfxml_AS_1: case S_surfxml_AS_4: case S_surfxml_AS_7: case S_surfxml_AS_8: SET(S_surfxml_AS_8); break; + case S_surfxml_zone: case S_surfxml_zone_5: SET(S_surfxml_zone_6); break; + case S_surfxml_zone_1: case S_surfxml_zone_3: case S_surfxml_zone_4: case S_surfxml_zone_6: case S_surfxml_zone_7: case S_surfxml_zone_8: SET(S_surfxml_zone_8); break; + } + } + YY_BREAK +case 628: +/* rule 628 can match eol */ +YY_RULE_SETUP +FAIL("Unexpected end-tag `%s': `' expected.",surf_parse_text); + YY_BREAK +case 629: +YY_RULE_SETUP +FAIL("Unexpected character `%c': `' expected.",surf_parse_text[0]); + YY_BREAK +case YY_STATE_EOF(E_surfxml_zoneRoute): +case YY_STATE_EOF(S_surfxml_zoneRoute): +case YY_STATE_EOF(S_surfxml_zoneRoute_2): +if(!ETag_surfxml_include_state()) FAIL("Premature EOF: `' expected."); + YY_BREAK + /* EPILOG: after the root element. */ -case 540: +case 630: YY_RULE_SETUP {SET(PROLOG); yyless(0); CLEANUP; return -1;} YY_BREAK @@ -9126,58 +10524,58 @@ SUCCEED; /* CHARACTER DATA. */ /* Non-defined standard entities... */ -case 541: +case 631: YY_RULE_SETUP BUFFERPUTC('&'); YY_BREAK -case 542: +case 632: YY_RULE_SETUP BUFFERPUTC('<'); YY_BREAK -case 543: +case 633: YY_RULE_SETUP BUFFERPUTC('>'); YY_BREAK -case 544: +case 634: YY_RULE_SETUP BUFFERPUTC('\''); YY_BREAK -case 545: +case 635: YY_RULE_SETUP BUFFERPUTC('"'); YY_BREAK /* Character entities. */ -case 546: +case 636: YY_RULE_SETUP BUFFERPUTC((unsigned char)atoi(surf_parse_text+2)); YY_BREAK -case 547: +case 637: YY_RULE_SETUP BUFFERPUTC((unsigned char)strtol(surf_parse_text+3,NULL,16)); YY_BREAK -case 548: -/* rule 548 can match eol */ -case 549: -/* rule 549 can match eol */ -case 550: -/* rule 550 can match eol */ -case 551: -/* rule 551 can match eol */ +case 638: +/* rule 638 can match eol */ +case 639: +/* rule 639 can match eol */ +case 640: +/* rule 640 can match eol */ +case 641: +/* rule 641 can match eol */ YY_RULE_SETUP BUFFERPUTC('\n'); YY_BREAK -case 552: +case 642: YY_RULE_SETUP ENTER(CDATA); YY_BREAK -case 553: +case 643: YY_RULE_SETUP FAIL("Unexpected `]""]>' in character data."); YY_BREAK -case 554: +case 644: YY_RULE_SETUP BUFFERDONE; LEAVE; YY_BREAK @@ -9185,7 +10583,7 @@ case YY_STATE_EOF(VALUE1): FAIL("EOF in literal (\"'\" expected)."); YY_BREAK -case 555: +case 645: YY_RULE_SETUP BUFFERDONE; LEAVE; YY_BREAK @@ -9193,22 +10591,22 @@ case YY_STATE_EOF(VALUE2): FAIL("EOF in literal (`\"' expected)."); YY_BREAK -case 556: -/* rule 556 can match eol */ +case 646: +/* rule 646 can match eol */ YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); YY_BREAK -case 557: +case 647: YY_RULE_SETUP FAIL("Spurious `%c' in character data.",surf_parse_text[0]); YY_BREAK -case 558: +case 648: YY_RULE_SETUP LEAVE; YY_BREAK /* "]""]" BUFFERPUTC(surf_parse_text[0]); BUFFERPUTC(surf_parse_text[1]); */ -case 559: +case 649: YY_RULE_SETUP BUFFERPUTC(surf_parse_text[0]); YY_BREAK @@ -9220,13 +10618,13 @@ FAIL("EOF in CDATA section."); /* Ideally, this should be replaced by code in flexml.pl that generates just the states not covered by other rules. */ -case 560: -/* rule 560 can match eol */ +case 650: +/* rule 650 can match eol */ YY_RULE_SETUP FAIL("Syntax error on character `%c'.", surf_parse_text[0]); YY_BREAK -case 561: +case 651: YY_RULE_SETUP ECHO; YY_BREAK @@ -9235,8 +10633,10 @@ case YY_STATE_EOF(S_surfxml_AS_2): case YY_STATE_EOF(S_surfxml_AS_5): case YY_STATE_EOF(S_surfxml_AS_7): case YY_STATE_EOF(S_surfxml_ASroute_1): +case YY_STATE_EOF(S_surfxml_actor_1): case YY_STATE_EOF(S_surfxml_bypassASroute_1): case YY_STATE_EOF(S_surfxml_bypassRoute_1): +case YY_STATE_EOF(S_surfxml_bypassZoneRoute_1): case YY_STATE_EOF(S_surfxml_cluster_1): case YY_STATE_EOF(S_surfxml_config_1): case YY_STATE_EOF(S_surfxml_host_1): @@ -9250,6 +10650,10 @@ case YY_STATE_EOF(S_surfxml_process_1): case YY_STATE_EOF(S_surfxml_route_1): case YY_STATE_EOF(S_surfxml_storage_1): case YY_STATE_EOF(S_surfxml_storage___type_1): +case YY_STATE_EOF(S_surfxml_zone_2): +case YY_STATE_EOF(S_surfxml_zone_5): +case YY_STATE_EOF(S_surfxml_zone_7): +case YY_STATE_EOF(S_surfxml_zoneRoute_1): case YY_STATE_EOF(IMPOSSIBLE): yyterminate(); @@ -9394,7 +10798,7 @@ static int yy_get_next_buffer (void) { char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; char *source = (yytext_ptr); - yy_size_t number_to_move, i; + int number_to_move, i; int ret_val; if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) @@ -9423,7 +10827,7 @@ static int yy_get_next_buffer (void) /* Try to read more data. */ /* First move last chars to start of buffer. */ - number_to_move = (yy_size_t) ((yy_c_buf_p) - (yytext_ptr)) - 1; + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1); for ( i = 0; i < number_to_move; ++i ) *(dest++) = *(source++); @@ -9505,7 +10909,7 @@ static int yy_get_next_buffer (void) else ret_val = EOB_ACT_CONTINUE_SCAN; - if ((int) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { /* Extend the array by 50%, plus the number we really need. */ int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) surf_parse_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); @@ -9542,7 +10946,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3334 ) + if ( yy_current_state >= 3906 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; @@ -9570,11 +10974,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 3334 ) + if ( yy_current_state >= 3906 ) yy_c = yy_meta[(unsigned int) yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + (flex_int16_t) yy_c]; - yy_is_jam = (yy_current_state == 3333); + yy_is_jam = (yy_current_state == 3905); return yy_is_jam ? 0 : yy_current_state; } @@ -9986,15 +11390,15 @@ YY_BUFFER_STATE surf_parse__scan_bytes (yyconst char * yybytes, int _yybytes_l YY_BUFFER_STATE b; char *buf; yy_size_t n; - yy_size_t i; + int i; /* Get memory for full buffer, including space for trailing EOB's. */ - n = (yy_size_t) _yybytes_len + 2; + n = (yy_size_t) (_yybytes_len + 2); buf = (char *) surf_parse_alloc(n ); if ( ! buf ) YY_FATAL_ERROR( "out of dynamic memory in surf_parse__scan_bytes()" ); - for ( i = 0; i < (yy_size_t) _yybytes_len; ++i ) + for ( i = 0; i < _yybytes_len; ++i ) buf[i] = yybytes[i]; buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; diff --git a/src/surf/xml/simgrid_dtd.h b/src/surf/xml/simgrid_dtd.h index 9cc998a6bc..722f96235b 100644 --- a/src/surf/xml/simgrid_dtd.h +++ b/src/surf/xml/simgrid_dtd.h @@ -52,6 +52,8 @@ XBT_PUBLIC(void) STag_surfxml_AS(void); XBT_PUBLIC(void) ETag_surfxml_AS(void); XBT_PUBLIC(void) STag_surfxml_ASroute(void); XBT_PUBLIC(void) ETag_surfxml_ASroute(void); +XBT_PUBLIC(void) STag_surfxml_actor(void); +XBT_PUBLIC(void) ETag_surfxml_actor(void); XBT_PUBLIC(void) STag_surfxml_argument(void); XBT_PUBLIC(void) ETag_surfxml_argument(void); XBT_PUBLIC(void) STag_surfxml_backbone(void); @@ -60,6 +62,8 @@ XBT_PUBLIC(void) STag_surfxml_bypassASroute(void); XBT_PUBLIC(void) ETag_surfxml_bypassASroute(void); XBT_PUBLIC(void) STag_surfxml_bypassRoute(void); XBT_PUBLIC(void) ETag_surfxml_bypassRoute(void); +XBT_PUBLIC(void) STag_surfxml_bypassZoneRoute(void); +XBT_PUBLIC(void) ETag_surfxml_bypassZoneRoute(void); XBT_PUBLIC(void) STag_surfxml_cabinet(void); XBT_PUBLIC(void) ETag_surfxml_cabinet(void); XBT_PUBLIC(void) STag_surfxml_cluster(void); @@ -102,6 +106,10 @@ XBT_PUBLIC(void) STag_surfxml_trace(void); XBT_PUBLIC(void) ETag_surfxml_trace(void); XBT_PUBLIC(void) STag_surfxml_trace___connect(void); XBT_PUBLIC(void) ETag_surfxml_trace___connect(void); +XBT_PUBLIC(void) STag_surfxml_zone(void); +XBT_PUBLIC(void) ETag_surfxml_zone(void); +XBT_PUBLIC(void) STag_surfxml_zoneRoute(void); +XBT_PUBLIC(void) ETag_surfxml_zoneRoute(void); /* XML application data. */ typedef int AT_surfxml_AS_id; @@ -116,6 +124,15 @@ typedef int AT_surfxml_ASroute_gw___src; typedef int AT_surfxml_ASroute_src; #define AU_surfxml_ASroute_src NULL typedef enum { AU_surfxml_ASroute_symmetrical, A_surfxml_ASroute_symmetrical_YES,A_surfxml_ASroute_symmetrical_NO } AT_surfxml_ASroute_symmetrical; +typedef int AT_surfxml_actor_function; +#define AU_surfxml_actor_function NULL +typedef int AT_surfxml_actor_host; +#define AU_surfxml_actor_host NULL +typedef int AT_surfxml_actor_kill___time; +#define AU_surfxml_actor_kill___time NULL +typedef enum { AU_surfxml_actor_on___failure, A_surfxml_actor_on___failure_DIE,A_surfxml_actor_on___failure_RESTART } AT_surfxml_actor_on___failure; +typedef int AT_surfxml_actor_start___time; +#define AU_surfxml_actor_start___time NULL typedef int AT_surfxml_argument_value; #define AU_surfxml_argument_value NULL typedef int AT_surfxml_backbone_bandwidth; @@ -136,6 +153,14 @@ typedef int AT_surfxml_bypassRoute_dst; #define AU_surfxml_bypassRoute_dst NULL typedef int AT_surfxml_bypassRoute_src; #define AU_surfxml_bypassRoute_src NULL +typedef int AT_surfxml_bypassZoneRoute_dst; +#define AU_surfxml_bypassZoneRoute_dst NULL +typedef int AT_surfxml_bypassZoneRoute_gw___dst; +#define AU_surfxml_bypassZoneRoute_gw___dst NULL +typedef int AT_surfxml_bypassZoneRoute_gw___src; +#define AU_surfxml_bypassZoneRoute_gw___src NULL +typedef int AT_surfxml_bypassZoneRoute_src; +#define AU_surfxml_bypassZoneRoute_src NULL typedef int AT_surfxml_cabinet_bw; #define AU_surfxml_cabinet_bw NULL typedef int AT_surfxml_cabinet_id; @@ -317,6 +342,18 @@ typedef int AT_surfxml_trace___connect_element; typedef enum { AU_surfxml_trace___connect_kind, A_surfxml_trace___connect_kind_HOST___AVAIL,A_surfxml_trace___connect_kind_SPEED,A_surfxml_trace___connect_kind_LINK___AVAIL,A_surfxml_trace___connect_kind_BANDWIDTH,A_surfxml_trace___connect_kind_LATENCY } AT_surfxml_trace___connect_kind; typedef int AT_surfxml_trace___connect_trace; #define AU_surfxml_trace___connect_trace NULL +typedef int AT_surfxml_zone_id; +#define AU_surfxml_zone_id NULL +typedef enum { AU_surfxml_zone_routing, A_surfxml_zone_routing_Full,A_surfxml_zone_routing_Floyd,A_surfxml_zone_routing_Dijkstra,A_surfxml_zone_routing_DijkstraCache,A_surfxml_zone_routing_None,A_surfxml_zone_routing_Vivaldi,A_surfxml_zone_routing_Cluster,A_surfxml_zone_routing_ClusterTorus,A_surfxml_zone_routing_ClusterFatTree,A_surfxml_zone_routing_ClusterDragonfly } AT_surfxml_zone_routing; +typedef int AT_surfxml_zoneRoute_dst; +#define AU_surfxml_zoneRoute_dst NULL +typedef int AT_surfxml_zoneRoute_gw___dst; +#define AU_surfxml_zoneRoute_gw___dst NULL +typedef int AT_surfxml_zoneRoute_gw___src; +#define AU_surfxml_zoneRoute_gw___src NULL +typedef int AT_surfxml_zoneRoute_src; +#define AU_surfxml_zoneRoute_src NULL +typedef enum { AU_surfxml_zoneRoute_symmetrical, A_surfxml_zoneRoute_symmetrical_YES,A_surfxml_zoneRoute_symmetrical_NO } AT_surfxml_zoneRoute_symmetrical; /* FleXML-provided data. */ XBT_PUBLIC_DATA(int) surfxml_pcdata_ix; @@ -343,6 +380,21 @@ XBT_PUBLIC_DATA(short int) surfxml_ASroute_src_isset; XBT_PUBLIC_DATA(AT_surfxml_ASroute_symmetrical) AX_surfxml_ASroute_symmetrical; #define A_surfxml_ASroute_symmetrical AX_surfxml_ASroute_symmetrical XBT_PUBLIC_DATA(short int) surfxml_ASroute_symmetrical_isset; +XBT_PUBLIC_DATA(AT_surfxml_actor_function) AX_surfxml_actor_function; +#define A_surfxml_actor_function (surfxml_bufferstack + AX_surfxml_actor_function) +XBT_PUBLIC_DATA(short int) surfxml_actor_function_isset; +XBT_PUBLIC_DATA(AT_surfxml_actor_host) AX_surfxml_actor_host; +#define A_surfxml_actor_host (surfxml_bufferstack + AX_surfxml_actor_host) +XBT_PUBLIC_DATA(short int) surfxml_actor_host_isset; +XBT_PUBLIC_DATA(AT_surfxml_actor_kill___time) AX_surfxml_actor_kill___time; +#define A_surfxml_actor_kill___time (surfxml_bufferstack + AX_surfxml_actor_kill___time) +XBT_PUBLIC_DATA(short int) surfxml_actor_kill___time_isset; +XBT_PUBLIC_DATA(AT_surfxml_actor_on___failure) AX_surfxml_actor_on___failure; +#define A_surfxml_actor_on___failure AX_surfxml_actor_on___failure +XBT_PUBLIC_DATA(short int) surfxml_actor_on___failure_isset; +XBT_PUBLIC_DATA(AT_surfxml_actor_start___time) AX_surfxml_actor_start___time; +#define A_surfxml_actor_start___time (surfxml_bufferstack + AX_surfxml_actor_start___time) +XBT_PUBLIC_DATA(short int) surfxml_actor_start___time_isset; XBT_PUBLIC_DATA(AT_surfxml_argument_value) AX_surfxml_argument_value; #define A_surfxml_argument_value (surfxml_bufferstack + AX_surfxml_argument_value) XBT_PUBLIC_DATA(short int) surfxml_argument_value_isset; @@ -373,6 +425,18 @@ XBT_PUBLIC_DATA(short int) surfxml_bypassRoute_dst_isset; XBT_PUBLIC_DATA(AT_surfxml_bypassRoute_src) AX_surfxml_bypassRoute_src; #define A_surfxml_bypassRoute_src (surfxml_bufferstack + AX_surfxml_bypassRoute_src) XBT_PUBLIC_DATA(short int) surfxml_bypassRoute_src_isset; +XBT_PUBLIC_DATA(AT_surfxml_bypassZoneRoute_dst) AX_surfxml_bypassZoneRoute_dst; +#define A_surfxml_bypassZoneRoute_dst (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_dst) +XBT_PUBLIC_DATA(short int) surfxml_bypassZoneRoute_dst_isset; +XBT_PUBLIC_DATA(AT_surfxml_bypassZoneRoute_gw___dst) AX_surfxml_bypassZoneRoute_gw___dst; +#define A_surfxml_bypassZoneRoute_gw___dst (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_gw___dst) +XBT_PUBLIC_DATA(short int) surfxml_bypassZoneRoute_gw___dst_isset; +XBT_PUBLIC_DATA(AT_surfxml_bypassZoneRoute_gw___src) AX_surfxml_bypassZoneRoute_gw___src; +#define A_surfxml_bypassZoneRoute_gw___src (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_gw___src) +XBT_PUBLIC_DATA(short int) surfxml_bypassZoneRoute_gw___src_isset; +XBT_PUBLIC_DATA(AT_surfxml_bypassZoneRoute_src) AX_surfxml_bypassZoneRoute_src; +#define A_surfxml_bypassZoneRoute_src (surfxml_bufferstack + AX_surfxml_bypassZoneRoute_src) +XBT_PUBLIC_DATA(short int) surfxml_bypassZoneRoute_src_isset; XBT_PUBLIC_DATA(AT_surfxml_cabinet_bw) AX_surfxml_cabinet_bw; #define A_surfxml_cabinet_bw (surfxml_bufferstack + AX_surfxml_cabinet_bw) XBT_PUBLIC_DATA(short int) surfxml_cabinet_bw_isset; @@ -658,6 +722,27 @@ XBT_PUBLIC_DATA(short int) surfxml_trace___connect_kind_isset; XBT_PUBLIC_DATA(AT_surfxml_trace___connect_trace) AX_surfxml_trace___connect_trace; #define A_surfxml_trace___connect_trace (surfxml_bufferstack + AX_surfxml_trace___connect_trace) XBT_PUBLIC_DATA(short int) surfxml_trace___connect_trace_isset; +XBT_PUBLIC_DATA(AT_surfxml_zone_id) AX_surfxml_zone_id; +#define A_surfxml_zone_id (surfxml_bufferstack + AX_surfxml_zone_id) +XBT_PUBLIC_DATA(short int) surfxml_zone_id_isset; +XBT_PUBLIC_DATA(AT_surfxml_zone_routing) AX_surfxml_zone_routing; +#define A_surfxml_zone_routing AX_surfxml_zone_routing +XBT_PUBLIC_DATA(short int) surfxml_zone_routing_isset; +XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_dst) AX_surfxml_zoneRoute_dst; +#define A_surfxml_zoneRoute_dst (surfxml_bufferstack + AX_surfxml_zoneRoute_dst) +XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_dst_isset; +XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_gw___dst) AX_surfxml_zoneRoute_gw___dst; +#define A_surfxml_zoneRoute_gw___dst (surfxml_bufferstack + AX_surfxml_zoneRoute_gw___dst) +XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_gw___dst_isset; +XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_gw___src) AX_surfxml_zoneRoute_gw___src; +#define A_surfxml_zoneRoute_gw___src (surfxml_bufferstack + AX_surfxml_zoneRoute_gw___src) +XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_gw___src_isset; +XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_src) AX_surfxml_zoneRoute_src; +#define A_surfxml_zoneRoute_src (surfxml_bufferstack + AX_surfxml_zoneRoute_src) +XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_src_isset; +XBT_PUBLIC_DATA(AT_surfxml_zoneRoute_symmetrical) AX_surfxml_zoneRoute_symmetrical; +#define A_surfxml_zoneRoute_symmetrical AX_surfxml_zoneRoute_symmetrical +XBT_PUBLIC_DATA(short int) surfxml_zoneRoute_symmetrical_isset; /* XML application utilities. */ XBT_PUBLIC(int) surfxml_element_context(int); diff --git a/src/surf/xml/surfxml_parseplatf.cpp b/src/surf/xml/surfxml_parseplatf.cpp index 5890b6e44a..ba3dab8eee 100644 --- a/src/surf/xml/surfxml_parseplatf.cpp +++ b/src/surf/xml/surfxml_parseplatf.cpp @@ -15,7 +15,7 @@ #include "src/surf/xml/platf_private.hpp" -#if HAVE_LUA +#if SIMGRID_HAVE_LUA extern "C" { #include "src/bindings/lua/simgrid_lua.h" @@ -131,14 +131,14 @@ void parse_after_config() { /* This function acts as a main in the parsing area. */ void parse_platform_file(const char *file) { -#if HAVE_LUA +#if SIMGRID_HAVE_LUA int len = (file == nullptr ? 0 : strlen(file)); int is_lua = (file != nullptr && len > 3 && file[len - 3] == 'l' && file[len - 2] == 'u' && file[len - 1] == 'a'); #endif sg_platf_init(); -#if HAVE_LUA +#if SIMGRID_HAVE_LUA /* Check if file extension is "lua". If so, we will use * the lua bindings to parse the platform file (since it is * written in lua). If not, we will use the (old?) XML parser @@ -180,7 +180,8 @@ void parse_platform_file(const char *file) /* connect all traces relative to hosts */ xbt_dict_cursor_t cursor = nullptr; - char *trace_name, *elm; + char* trace_name; + char* elm; xbt_dict_foreach(trace_connect_list_host_avail, cursor, trace_name, elm) { tmgr_trace_t trace = (tmgr_trace_t) xbt_dict_get_or_null(traces_set_list, trace_name); diff --git a/src/surf/xml/surfxml_sax_cb.cpp b/src/surf/xml/surfxml_sax_cb.cpp index f33d9108dd..03adf834bf 100644 --- a/src/surf/xml/surfxml_sax_cb.cpp +++ b/src/surf/xml/surfxml_sax_cb.cpp @@ -287,7 +287,7 @@ static std::vector surf_parse_get_all_speeds(char* speeds, const char* e /* The default current property receiver. Setup in the corresponding opening callbacks. */ xbt_dict_t current_property_set = nullptr; std::map* current_model_property_set = nullptr; -int AS_TAG = 0; // Whether we just opened an AS tag (to see what to do with the properties) +int ZONE_TAG = 0; // Whether we just opened a zone tag (to see what to do with the properties) /* dictionary of random generator data */ xbt_dict_t random_data_list = nullptr; @@ -300,7 +300,7 @@ FILE *surf_file_to_parse = nullptr; */ void STag_surfxml_storage() { - AS_TAG = 0; + ZONE_TAG = 0; XBT_DEBUG("STag_surfxml_storage"); xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)"); } @@ -321,7 +321,7 @@ void ETag_surfxml_storage() } void STag_surfxml_storage___type() { - AS_TAG = 0; + ZONE_TAG = 0; XBT_DEBUG("STag_surfxml_storage___type"); xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)"); xbt_assert(current_model_property_set == nullptr, "Someone forgot to reset the model property set to nullptr in its closing tag (or XML malformed)"); @@ -446,16 +446,30 @@ void STag_surfxml_platform() { "Use simgrid_update_xml to update your file automatically. " "This program is installed automatically with SimGrid, or " "available in the tools/ directory of the source archive."); - xbt_assert((version >= 4.0), "******* FILE %s IS TOO OLD (v:%.1f) *********\n " - "Changes introduced in SimGrid 3.13:\n" - " - 'power' attribute of hosts (and others) got renamed to 'speed'.\n" - " - In , attribute kind=\"POWER\" is now kind=\"SPEED\".\n" - " - DOCTYPE now point to the rignt URL: http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd\n" - " - speed, bandwidth and latency attributes now MUST have an explicit unit (f, Bps, s by default)" - "\n\n" - "Use simgrid_update_xml to update your file automatically. " - "This program is installed automatically with SimGrid, or " - "available in the tools/ directory of the source archive.",surf_parsed_filename, version); + xbt_assert((version >= 4.0), + "******* FILE %s IS TOO OLD (v:%.1f) *********\n " + "Changes introduced in SimGrid 3.13:\n" + " - 'power' attribute of hosts (and others) got renamed to 'speed'.\n" + " - In , attribute kind=\"POWER\" is now kind=\"SPEED\".\n" + " - DOCTYPE now point to the rignt URL: http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd\n" + " - speed, bandwidth and latency attributes now MUST have an explicit unit (f, Bps, s by default)" + "\n\n" + "Use simgrid_update_xml to update your file automatically. " + "This program is installed automatically with SimGrid, or " + "available in the tools/ directory of the source archive.", + surf_parsed_filename, version); + if (version < 4.1) { + XBT_INFO("You're using a v%.1f XML file (%s) while the current standard is v4.1 " + "That's fine, the new version is backward compatible. \n\n" + "Use simgrid_update_xml to update your file automatically. " + "This program is installed automatically with SimGrid, or " + "available in the tools/ directory of the source archive.", + version, surf_parsed_filename); + } + xbt_assert(version <= 4.1, "******* FILE %s COMES FROM THE FUTURE (v:%.1f) *********\n " + "The most recent formalism that this version of SimGrid understands is v4.1.\n" + "Please update your code, or use another, more adapted, file.", + surf_parsed_filename, version); sg_platf_begin(); } @@ -464,15 +478,15 @@ void ETag_surfxml_platform(){ } void STag_surfxml_host(){ - AS_TAG = 0; + ZONE_TAG = 0; xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)"); } void STag_surfxml_prop() { - if (AS_TAG) { // We need to retrieve the most recently opened AS - XBT_DEBUG("Set AS property %s -> %s", A_surfxml_prop_id, A_surfxml_prop_value); - simgrid::s4u::NetZone* netzone = simgrid::s4u::Engine::instance()->netzoneByNameOrNull(A_surfxml_AS_id); + if (ZONE_TAG) { // We need to retrieve the most recently opened zone + XBT_DEBUG("Set zone property %s -> %s", A_surfxml_prop_id, A_surfxml_prop_value); + simgrid::s4u::NetZone* netzone = simgrid::s4u::Engine::instance()->netzoneByNameOrNull(A_surfxml_zone_id); netzone->setProperty(A_surfxml_prop_id, A_surfxml_prop_value); } @@ -597,7 +611,7 @@ void ETag_surfxml_cluster(){ } void STag_surfxml_cluster(){ - AS_TAG = 0; + ZONE_TAG = 0; parse_after_config(); xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)"); } @@ -637,7 +651,7 @@ void STag_surfxml_peer(){ } void STag_surfxml_link(){ - AS_TAG = 0; + ZONE_TAG = 0; xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)"); } @@ -689,6 +703,9 @@ void STag_surfxml_link___ctn(){ link_name = bprintf("%s_DOWN", A_surfxml_link___ctn_id); link = simgrid::surf::LinkImpl::byName(link_name); break; + default: + surf_parse_error("Invalid direction for link %s", link_name); + break; } xbt_free(link_name); // no-op if it's already nullptr @@ -729,15 +746,26 @@ void STag_surfxml_route(){ void STag_surfxml_ASroute(){ surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_ASroute_src), "ASroute src='%s' does name a node.", - A_surfxml_route_src); + A_surfxml_ASroute_src); surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_ASroute_dst), "ASroute dst='%s' does name a node.", - A_surfxml_route_dst); + A_surfxml_ASroute_dst); surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_ASroute_gw___src), "ASroute gw_src='%s' does name a node.", A_surfxml_ASroute_gw___src); surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_ASroute_gw___dst), "ASroute gw_dst='%s' does name a node.", A_surfxml_ASroute_gw___dst); } +void STag_surfxml_zoneRoute(){ + surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_src), "zoneRoute src='%s' does name a node.", + A_surfxml_zoneRoute_src); + surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_dst), "zoneRoute dst='%s' does name a node.", + A_surfxml_zoneRoute_dst); + + surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___src), "zoneRoute gw_src='%s' does name a node.", + A_surfxml_zoneRoute_gw___src); + surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___dst), "zoneRoute gw_dst='%s' does name a node.", + A_surfxml_zoneRoute_gw___dst); +} void STag_surfxml_bypassRoute(){ surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassRoute_src), "bypassRoute src='%s' does name a node.", @@ -756,6 +784,16 @@ void STag_surfxml_bypassASroute(){ surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_gw___dst), "bypassASroute gw_dst='%s' does name a node.", A_surfxml_bypassASroute_gw___dst); } +void STag_surfxml_bypassZoneRoute(){ + surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_src), + "bypassASroute src='%s' does name a node.", A_surfxml_bypassZoneRoute_src); + surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_dst), + "bypassASroute dst='%s' does name a node.", A_surfxml_bypassZoneRoute_dst); + surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___src), + "bypassASroute gw_src='%s' does name a node.", A_surfxml_bypassZoneRoute_gw___src); + surf_parse_assert(sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___dst), + "bypassASroute gw_dst='%s' does name a node.", A_surfxml_bypassZoneRoute_gw___dst); +} void ETag_surfxml_route(){ s_sg_platf_route_cbarg_t route; @@ -776,15 +814,25 @@ void ETag_surfxml_route(){ delete route.link_list; } -void ETag_surfxml_ASroute(){ +void ETag_surfxml_ASroute() +{ + AX_surfxml_zoneRoute_src = AX_surfxml_ASroute_src; + AX_surfxml_zoneRoute_dst = AX_surfxml_ASroute_dst; + AX_surfxml_zoneRoute_gw___src = AX_surfxml_ASroute_gw___src; + AX_surfxml_zoneRoute_gw___dst = AX_surfxml_ASroute_gw___dst; + AX_surfxml_zoneRoute_symmetrical = (AT_surfxml_zoneRoute_symmetrical)AX_surfxml_ASroute_symmetrical; + ETag_surfxml_zoneRoute(); +} +void ETag_surfxml_zoneRoute() +{ s_sg_platf_route_cbarg_t ASroute; memset(&ASroute,0,sizeof(ASroute)); - ASroute.src = sg_netpoint_by_name_or_null(A_surfxml_ASroute_src); // tested to not be nullptr in start tag - ASroute.dst = sg_netpoint_by_name_or_null(A_surfxml_ASroute_dst); // tested to not be nullptr in start tag + ASroute.src = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_src); // tested to not be nullptr in start tag + ASroute.dst = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_dst); // tested to not be nullptr in start tag - ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_ASroute_gw___src); // tested to not be nullptr in start tag - ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_ASroute_gw___dst); // tested to not be nullptr in start tag + ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___src); // tested to not be nullptr in start tag + ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_zoneRoute_gw___dst); // tested to not be nullptr in start tag ASroute.link_list = new std::vector(); @@ -792,12 +840,12 @@ void ETag_surfxml_ASroute(){ ASroute.link_list->push_back(link); parsed_link_list.clear(); - switch (A_surfxml_ASroute_symmetrical) { - case AU_surfxml_ASroute_symmetrical: - case A_surfxml_ASroute_symmetrical_YES: + switch (A_surfxml_zoneRoute_symmetrical) { + case AU_surfxml_zoneRoute_symmetrical: + case A_surfxml_zoneRoute_symmetrical_YES: ASroute.symmetrical = true; break; - case A_surfxml_ASroute_symmetrical_NO: + case A_surfxml_zoneRoute_symmetrical_NO: ASroute.symmetrical = false; break; } @@ -825,12 +873,21 @@ void ETag_surfxml_bypassRoute(){ delete route.link_list; } -void ETag_surfxml_bypassASroute(){ +void ETag_surfxml_bypassASroute() +{ + AX_surfxml_bypassZoneRoute_src = AX_surfxml_bypassASroute_src; + AX_surfxml_bypassZoneRoute_dst = AX_surfxml_bypassASroute_dst; + AX_surfxml_bypassZoneRoute_gw___src = AX_surfxml_bypassASroute_gw___src; + AX_surfxml_bypassZoneRoute_gw___dst = AX_surfxml_bypassASroute_gw___dst; + ETag_surfxml_bypassZoneRoute(); +} +void ETag_surfxml_bypassZoneRoute() +{ s_sg_platf_route_cbarg_t ASroute; memset(&ASroute,0,sizeof(ASroute)); - ASroute.src = sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_src); - ASroute.dst = sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_dst); + ASroute.src = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_src); + ASroute.dst = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_dst); ASroute.link_list = new std::vector(); for (auto link: parsed_link_list) ASroute.link_list->push_back(link); @@ -838,8 +895,8 @@ void ETag_surfxml_bypassASroute(){ ASroute.symmetrical = false; - ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_gw___src); - ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_bypassASroute_gw___dst); + ASroute.gw_src = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___src); + ASroute.gw_dst = sg_netpoint_by_name_or_null(A_surfxml_bypassZoneRoute_gw___dst); sg_platf_new_bypassRoute(&ASroute); delete ASroute.link_list; @@ -857,7 +914,8 @@ void ETag_surfxml_trace(){ sg_platf_new_trace(&trace); } -void STag_surfxml_trace___connect(){ +void STag_surfxml_trace___connect() +{ parse_after_config(); s_sg_platf_trace_connect_cbarg_t trace_connect; memset(&trace_connect,0,sizeof(trace_connect)); @@ -882,38 +940,59 @@ void STag_surfxml_trace___connect(){ case A_surfxml_trace___connect_kind_LINK___AVAIL: trace_connect.kind = SURF_TRACE_CONNECT_KIND_LINK_AVAIL; break; + default: + surf_parse_error("Invalid trace kind"); + break; } sg_platf_trace_connect(&trace_connect); } -void STag_surfxml_AS(){ +void STag_surfxml_AS() +{ + AX_surfxml_zone_id = AX_surfxml_AS_id; + AX_surfxml_zone_routing = (AT_surfxml_zone_routing)AX_surfxml_AS_routing; + STag_surfxml_zone(); +} + +void ETag_surfxml_AS() +{ + ETag_surfxml_zone(); +} + +void STag_surfxml_zone() +{ parse_after_config(); - AS_TAG = 1; - s_sg_platf_AS_cbarg_t AS = { A_surfxml_AS_id, (int)A_surfxml_AS_routing}; + ZONE_TAG = 1; + s_sg_platf_AS_cbarg_t AS = {A_surfxml_zone_id, (int)A_surfxml_zone_routing}; sg_platf_new_AS_begin(&AS); } -void ETag_surfxml_AS(){ + +void ETag_surfxml_zone() +{ sg_platf_new_AS_seal(); } -void STag_surfxml_config(){ - AS_TAG = 0; +void STag_surfxml_config() +{ + ZONE_TAG = 0; xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)"); XBT_DEBUG("START configuration name = %s",A_surfxml_config_id); if (_sg_cfg_init_status == 2) { - surf_parse_error("All tags must be given before any platform elements (such as , , , , etc)."); + surf_parse_error("All tags must be given before any platform elements (such as , , , " + ", etc)."); } } -void ETag_surfxml_config(){ + +void ETag_surfxml_config() +{ xbt_dict_cursor_t cursor = nullptr; char *key; char *elem; xbt_dict_foreach(current_property_set, cursor, key, elem) { if (xbt_cfg_is_default_value(key)) { - char* cfg = bprintf("%s:%s", key, elem); - xbt_cfg_set_parse(cfg); - free(cfg); + std::string cfg = std::string(key) + ":" + elem; + xbt_cfg_set_parse(cfg.c_str()); } else XBT_INFO("The custom configuration '%s' is already defined by user!",key); } @@ -926,37 +1005,56 @@ void ETag_surfxml_config(){ static int argc; static char **argv; -void STag_surfxml_process(){ - AS_TAG = 0; +void STag_surfxml_process() +{ + AX_surfxml_actor_function = AX_surfxml_process_function; + STag_surfxml_actor(); +} +void STag_surfxml_actor() +{ + ZONE_TAG = 0; argc = 1; argv = xbt_new(char *, 1); - argv[0] = xbt_strdup(A_surfxml_process_function); + argv[0] = xbt_strdup(A_surfxml_actor_function); xbt_assert(current_property_set == nullptr, "Someone forgot to reset the property set to nullptr in its closing tag (or XML malformed)"); } -void ETag_surfxml_process(){ - s_sg_platf_process_cbarg_t process; - memset(&process,0,sizeof(process)); - - process.argc = argc; - process.argv = (const char **)argv; - process.properties = current_property_set; - process.host = A_surfxml_process_host; - process.function = A_surfxml_process_function; - process.start_time = surf_parse_get_double(A_surfxml_process_start___time); - process.kill_time = surf_parse_get_double(A_surfxml_process_kill___time); - - switch (A_surfxml_process_on___failure) { - case AU_surfxml_process_on___failure: - case A_surfxml_process_on___failure_DIE: - process.on_failure = SURF_PROCESS_ON_FAILURE_DIE; +void ETag_surfxml_process() +{ + AX_surfxml_actor_host = AX_surfxml_process_host; + AX_surfxml_actor_function = AX_surfxml_process_function; + AX_surfxml_actor_start___time = AX_surfxml_process_start___time; + AX_surfxml_actor_kill___time = AX_surfxml_process_kill___time; + AX_surfxml_actor_on___failure = (AT_surfxml_actor_on___failure)AX_surfxml_process_on___failure; + ETag_surfxml_actor(); +} +void ETag_surfxml_actor() +{ + s_sg_platf_process_cbarg_t actor; + memset(&actor,0,sizeof(actor)); + + actor.argc = argc; + actor.argv = (const char **)argv; + actor.properties = current_property_set; + actor.host = A_surfxml_actor_host; + actor.function = A_surfxml_actor_function; + actor.start_time = surf_parse_get_double(A_surfxml_actor_start___time); + actor.kill_time = surf_parse_get_double(A_surfxml_actor_kill___time); + + switch (A_surfxml_actor_on___failure) { + case AU_surfxml_actor_on___failure: + case A_surfxml_actor_on___failure_DIE: + actor.on_failure = SURF_ACTOR_ON_FAILURE_DIE; break; - case A_surfxml_process_on___failure_RESTART: - process.on_failure = SURF_PROCESS_ON_FAILURE_RESTART; + case A_surfxml_actor_on___failure_RESTART: + actor.on_failure = SURF_ACTOR_ON_FAILURE_RESTART; + break; + default: + surf_parse_error("Invalid on failure behavior"); break; } - sg_platf_new_process(&process); + sg_platf_new_process(&actor); for (int i = 0; i != argc; ++i) xbt_free(argv[i]); @@ -1032,6 +1130,6 @@ static int _surf_parse() { return surf_parse_lex(); } -int_f_void_t surf_parse = _surf_parse; +int_f_void_t surf_parse = &_surf_parse; SG_END_DECL() diff --git a/src/xbt/backtrace_linux.cpp b/src/xbt/backtrace_linux.cpp index cb8ef6d1cb..20891aeb5b 100644 --- a/src/xbt/backtrace_linux.cpp +++ b/src/xbt/backtrace_linux.cpp @@ -24,7 +24,7 @@ #include "xbt/str.h" #include "xbt/module.h" /* xbt_binary_name */ #include "src/xbt_modinter.h" /* backtrace initialization headers */ -#if HAVE_MC +#if SIMGRID_HAVE_MC #define UNW_LOCAL_ONLY #include #endif @@ -34,8 +34,9 @@ extern char **environ; /* the environment, as specified by the opengrou #include struct trace_arg { - void **array; - int cnt, size; + void** array; + int cnt; + int size; }; static _Unwind_Reason_Code @@ -190,7 +191,8 @@ std::vector resolveBacktrace( } /* To read the output of addr2line */ - char line_func[1024], line_pos[1024]; + char line_func[1024]; + char line_pos[1024]; for (std::size_t i = 0; i < count; i++) { XBT_DEBUG("Looking for symbol %zd, addr = '%s'", i, addrs[i].c_str()); if (fgets(line_func, 1024, pipe)) { @@ -217,7 +219,8 @@ std::vector resolveBacktrace( char maps_buff[512]; long int offset = 0; - char *p, *p2; + char* p; + char* p2; int found = 0; /* let's look for the offset of this library in our addressing space */ @@ -233,7 +236,8 @@ std::vector resolveBacktrace( addrs[i].c_str(), addr); while (!found) { - long int first, last; + long int first; + long int last; if (fgets(maps_buff, 512, maps) == nullptr) break; @@ -338,7 +342,7 @@ std::vector resolveBacktrace( } } -#if HAVE_MC +#if SIMGRID_HAVE_MC int xbt_libunwind_backtrace(void** bt, int size){ for (int i = 0; i < size; i++) bt[i] = nullptr; diff --git a/src/xbt/cunit.cpp b/src/xbt/cunit.cpp index bac25059f4..94e16a6638 100644 --- a/src/xbt/cunit.cpp +++ b/src/xbt/cunit.cpp @@ -88,7 +88,9 @@ struct s_xbt_test_unit { xbt_dynar_t tests; /* of xbt_test_test_t */ int nb_tests; - int test_failed, test_ignore, test_expect; + int test_failed; + int test_ignore; + int test_expect; }; static void xbt_test_unit_dump(xbt_test_unit_t unit) @@ -112,9 +114,14 @@ struct s_xbt_test_suite { char *title; xbt_dynar_t units; /* of xbt_test_unit_t */ - int nb_tests, nb_units; - int test_failed, test_ignore, test_expect; - int unit_failed, unit_ignore, unit_disabled; + int nb_tests; + int nb_units; + int test_failed; + int test_ignore; + int test_expect; + int unit_failed; + int unit_ignore; + int unit_disabled; }; /* destroy test suite */ @@ -245,7 +252,9 @@ static int xbt_test_suite_run(xbt_test_suite_t suite, int verbosity) const char *file; int line; char *cp; - unsigned int it_unit, it_test, it_log; + unsigned int it_unit; + unsigned int it_test; + unsigned int it_log; int first = 1; /* for result pretty printing */ @@ -253,25 +262,22 @@ static int xbt_test_suite_run(xbt_test_suite_t suite, int verbosity) return 0; /* suite title pretty-printing */ - { - char suite_title[81]; - int suite_len = strlen(suite->title); - int i; - - xbt_assert(suite_len < 68, "suite title \"%s\" too long (%d should be less than 68", suite->title, suite_len); - - suite_title[0] = ' '; - for (i = 1; i < 80; i++) - suite_title[i] = '='; - suite_title[i++] = '\n'; - suite_title[80] = '\0'; - - snprintf(suite_title + 40 - (suite_len + 4) / 2, 81-(40 - (suite_len + 4)/ 2), "[ %s ]", suite->title); - suite_title[40 + (suite_len + 5) / 2] = '='; - if (!suite->enabled) - snprintf(suite_title + 70, 11, " DISABLED "); - fprintf(stderr, "\n%s\n", suite_title); - } + char suite_title[81]; + int suite_len = strlen(suite->title); + + xbt_assert(suite_len < 68, "suite title \"%s\" too long (%d should be less than 68", suite->title, suite_len); + + suite_title[0] = ' '; + for (int i = 1; i < 79; i++) + suite_title[i] = '='; + suite_title[79] = '\n'; + suite_title[80] = '\0'; + + snprintf(suite_title + 40 - (suite_len + 4) / 2, 81 - (40 - (suite_len + 4) / 2), "[ %s ]", suite->title); + suite_title[40 + (suite_len + 5) / 2] = '='; + if (!suite->enabled) + snprintf(suite_title + 70, 11, " DISABLED "); + fprintf(stderr, "\n%s\n", suite_title); if (suite->enabled) { /* iterate through all tests */ diff --git a/src/xbt/dict.cpp b/src/xbt/dict.cpp index cc112b9f49..9d5dc32464 100644 --- a/src/xbt/dict.cpp +++ b/src/xbt/dict.cpp @@ -113,7 +113,8 @@ static void xbt_dict_rehash(xbt_dict_t dict) xbt_dictelm_t *currcell = (xbt_dictelm_t *) xbt_realloc((char *) dict->table, newsize * sizeof(xbt_dictelm_t)); memset(&currcell[oldsize], 0, oldsize * sizeof(xbt_dictelm_t)); /* zero second half */ - dict->table_size = --newsize; + newsize--; + dict->table_size = newsize; dict->table = currcell; XBT_DEBUG("REHASH (%d->%d)", oldsize, newsize); @@ -559,7 +560,10 @@ void xbt_dict_postexit() total_count += size; } } - printf("; %f elm per cell\n", avg / (double) total_count); + if (total_count > 0) + printf("; %f elm per cell\n", avg / (double)total_count); + else + printf("; 0 elm per cell\n"); } } diff --git a/src/xbt/dict_cursor.c b/src/xbt/dict_cursor.c index ab5872c158..d9f3b14664 100644 --- a/src/xbt/dict_cursor.c +++ b/src/xbt/dict_cursor.c @@ -108,7 +108,8 @@ inline void xbt_dict_cursor_step(xbt_dict_cursor_t cursor) XBT_CDEBUG(xbt_dict_cursor, "next element: %p", current); } - while (current == NULL && ++line <= cursor->dict->table_size) { + while (current == NULL && (line + 1) <= cursor->dict->table_size) { + line++; XBT_CDEBUG(xbt_dict_cursor, "current is NULL, take the next line"); current = cursor->dict->table[line]; XBT_CDEBUG(xbt_dict_cursor, "element in the next line: %p", current); diff --git a/src/xbt/ex.cpp b/src/xbt/ex.cpp index f6db218437..b0f5564aa7 100644 --- a/src/xbt/ex.cpp +++ b/src/xbt/ex.cpp @@ -59,11 +59,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ex, xbt, "Exception mechanism"); -xbt_ex::~xbt_ex() {} - -void _xbt_throw( - char* message, xbt_errcat_t errcat, int value, - const char* file, int line, const char* func) +void _xbt_throw(char* message, xbt_errcat_t errcat, int value, const char* file, int line, const char* func) { xbt_ex e(simgrid::xbt::ThrowPoint(file, line, func), message); free(message); @@ -110,6 +106,8 @@ const char *xbt_ex_catname(xbt_errcat_t cat) return "io error"; case vm_error: return "vm error"; + default: + return "INVALID ERROR"; } return "INVALID ERROR"; } diff --git a/src/xbt/log.c b/src/xbt/log.c index 84aef42e99..2fc6aea277 100644 --- a/src/xbt/log.c +++ b/src/xbt/log.c @@ -102,7 +102,6 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(log); XBT_LOG_CONNECT(module); XBT_LOG_CONNECT(replay); - XBT_LOG_CONNECT(strbuff); XBT_LOG_CONNECT(xbt_cfg); XBT_LOG_CONNECT(xbt_dict); XBT_LOG_CONNECT(xbt_dict_cursor); @@ -125,7 +124,7 @@ static void xbt_log_connect_categories(void) /* The following categories are only defined in libsimgrid */ /* bindings */ -#if HAVE_LUA +#if SIMGRID_HAVE_LUA XBT_LOG_CONNECT(lua); XBT_LOG_CONNECT(lua_host); XBT_LOG_CONNECT(lua_platf); @@ -148,13 +147,13 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(instr_surf); /* jedule */ -#if HAVE_JEDULE +#if SIMGRID_HAVE_JEDULE XBT_LOG_CONNECT(jedule); XBT_LOG_CONNECT(jed_sd); #endif /* mc */ -#if HAVE_MC +#if SIMGRID_HAVE_MC XBT_LOG_CONNECT(mc); XBT_LOG_CONNECT(mc_checkpoint); XBT_LOG_CONNECT(mc_comm_determinism); @@ -243,7 +242,7 @@ static void xbt_log_connect_categories(void) XBT_LOG_CONNECT(surf_lagrange_dichotomy); XBT_LOG_CONNECT(surf_maxmin); XBT_LOG_CONNECT(surf_network); -#if HAVE_NS3 +#if SIMGRID_HAVE_NS3 XBT_LOG_CONNECT(ns3); #endif XBT_LOG_CONNECT(surf_parse); diff --git a/src/xbt/mallocator.c b/src/xbt/mallocator.c index f898c39e80..408e115d7c 100644 --- a/src/xbt/mallocator.c +++ b/src/xbt/mallocator.c @@ -71,7 +71,7 @@ void xbt_mallocator_initialization_is_done(int protect) /** used by the module to know if it's time to activate the mallocators yet */ static inline int xbt_mallocator_is_active(void) { -#if HAVE_MALLOCATOR +#if SIMGRID_HAVE_MALLOCATOR return initialization_done && !MC_is_active(); #else return 0; diff --git a/src/xbt/memory_map.hpp b/src/xbt/memory_map.hpp index e4e138d6d1..3bf3d68869 100644 --- a/src/xbt/memory_map.hpp +++ b/src/xbt/memory_map.hpp @@ -19,7 +19,8 @@ namespace xbt { /** An virtual memory map entry from /proc/$pid/maps */ struct VmMap { - std::uint64_t start_addr, end_addr; + std::uint64_t start_addr; + std::uint64_t end_addr; int prot; /* Memory protection */ int flags; /* Additional memory flags */ std::uint64_t offset; /* Offset in the file/whatever */ diff --git a/src/xbt/mmalloc/mfree.c b/src/xbt/mmalloc/mfree.c index a08c7dde9a..5294c14e49 100644 --- a/src/xbt/mmalloc/mfree.c +++ b/src/xbt/mmalloc/mfree.c @@ -1,7 +1,6 @@ /* Free a block of memory allocated by `mmalloc'. */ -/* Copyright (c) 2010-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ /* 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. */ @@ -14,6 +13,7 @@ #include "mmprivate.h" #include "xbt/ex.h" #include "mc/mc.h" +#include "src/mc/mc_ignore.h" /* Return memory to the heap. Like `mfree' but don't call a mfree_hook if there is one. */ diff --git a/src/xbt/mmalloc/mm_legacy.c b/src/xbt/mmalloc/mm_legacy.c index dafcbbdda3..a8962f7f4d 100644 --- a/src/xbt/mmalloc/mm_legacy.c +++ b/src/xbt/mmalloc/mm_legacy.c @@ -51,7 +51,7 @@ xbt_mheap_t mmalloc_set_current_heap(xbt_mheap_t new_heap) } /* Override the malloc-like functions if MC is activated at compile time */ -#if HAVE_MC +#if SIMGRID_HAVE_MC /* ***** Temporary allocator * @@ -267,4 +267,4 @@ void free(void *p) mfree(mdp, p); UNLOCK(mdp); } -#endif /* HAVE_MC */ +#endif /* SIMGRID_HAVE_MC */ diff --git a/src/xbt/parmap.cpp b/src/xbt/parmap.cpp index 67ed936e31..2a1851bdf0 100644 --- a/src/xbt/parmap.cpp +++ b/src/xbt/parmap.cpp @@ -218,6 +218,8 @@ static void xbt_parmap_set_mode(xbt_parmap_t parmap, e_xbt_parmap_mode_t mode) case XBT_PARMAP_DEFAULT: THROW_IMPOSSIBLE; break; + default: + THROW_IMPOSSIBLE; } } diff --git a/src/xbt/string.cpp b/src/xbt/string.cpp index f23e4295ff..afc6445cee 100644 --- a/src/xbt/string.cpp +++ b/src/xbt/string.cpp @@ -15,7 +15,7 @@ namespace simgrid { namespace xbt { -#if HAVE_MC +#if SIMGRID_HAVE_MC const char string::NUL = '\0'; diff --git a/src/xbt/xbt_log_layout_format.c b/src/xbt/xbt_log_layout_format.c index 1de4e72e6e..50a82e2094 100644 --- a/src/xbt/xbt_log_layout_format.c +++ b/src/xbt/xbt_log_layout_format.c @@ -7,7 +7,6 @@ #include "src/internal_config.h" /* execinfo when available */ #include "xbt/sysdep.h" -#include "xbt/strbuff.h" #include "src/xbt/log_private.h" #include "simgrid/simix.h" /* SIMIX_host_self_get_name */ #include "surf/surf.h" @@ -90,6 +89,7 @@ static int xbt_log_layout_format_doit(xbt_log_layout_t l, xbt_log_event_t ev, co case '\0': fprintf(stderr, "Layout format (%s) ending with %%\n", (char *)l->data); xbt_abort(); + break; case '%': *p = '%'; check_overflow(1); @@ -152,34 +152,6 @@ static int xbt_log_layout_format_doit(xbt_log_layout_t l, xbt_log_event_t ev, co case 'M': /* method (ie, function) name; LOG4J compliant */ show_string(ev->functionName); break; - case 'b': /* backtrace; called %throwable in LOG4J */ - case 'B': /* short backtrace; called %throwable{short} in LOG4J */ -// TODO, backtrace -#if 0 && HAVE_BACKTRACE && HAVE_EXECINFO_H && HAVE_POPEN && defined(ADDR2LINE) - { - xbt_ex_t e(""); - - e.used = backtrace((void **) e.bt, XBT_BACKTRACE_SIZE); - e.bt_strings = NULL; - xbt_ex_setup_backtrace(&e); - if (*q == 'B') { - show_string(e.bt_strings[1] + 8); - } else { - xbt_strbuff_t buff = xbt_strbuff_new(); - int i; - xbt_strbuff_append(buff, e.bt_strings[1] + 8); - for (i = 2; i < e.used; i++) { - xbt_strbuff_append(buff, "\n"); - xbt_strbuff_append(buff, e.bt_strings[i] + 8); - } - show_string(buff->data); - xbt_strbuff_free(buff); - } - } -#else - show_string("(no backtrace on this arch)"); -#endif - break; case 'd': /* date; LOG4J compliant */ show_double(surf_get_clock()); break; diff --git a/src/xbt/xbt_log_layout_simple.c b/src/xbt/xbt_log_layout_simple.c index c709fca855..6ec8eeb074 100644 --- a/src/xbt/xbt_log_layout_simple.c +++ b/src/xbt/xbt_log_layout_simple.c @@ -7,7 +7,6 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include "xbt/sysdep.h" -#include "xbt/strbuff.h" /* For dynamic version when the static one fails */ #include "src/xbt/log_private.h" #include "simgrid/simix.h" /* SIMIX_host_self_get_name */ diff --git a/src/xbt/xbt_main.cpp b/src/xbt/xbt_main.cpp index f04241769a..ce2bc71196 100644 --- a/src/xbt/xbt_main.cpp +++ b/src/xbt/xbt_main.cpp @@ -96,7 +96,7 @@ static void xbt_preinit(void) { xbt_log_preinit(); xbt_os_thread_mod_preinit(); xbt_dict_preinit(); - + srand(seed); #ifndef _WIN32 srand48(seed); @@ -106,14 +106,15 @@ static void xbt_preinit(void) { static void xbt_postexit(void) { - if(!_sg_do_clean_atexit) return; + if (!_sg_do_clean_atexit) + return; xbt_initialized--; xbt_dict_postexit(); xbt_os_thread_mod_postexit(); xbt_dynar_free(&xbt_cmdline); xbt_log_postexit(); free(xbt_binary_name); -#if HAVE_MC +#if SIMGRID_HAVE_MC mmalloc_postexit(); #endif } @@ -123,14 +124,15 @@ void xbt_init(int *argc, char **argv) { simgrid::xbt::installExceptionHandler(); - if (xbt_initialized++) { - XBT_DEBUG("XBT was initialized %d times.", xbt_initialized); + if (xbt_initialized) { + xbt_initialized++; + XBT_DEBUG("XBT has been initialized %d times.", xbt_initialized); return; } xbt_binary_name = xbt_strdup(argv[0]); - xbt_cmdline = xbt_dynar_new(sizeof(char*),NULL); - for (int i=0;i<*argc;i++) + xbt_cmdline = xbt_dynar_new(sizeof(char*), NULL); + for (int i = 0; i < *argc; i++) xbt_dynar_push(xbt_cmdline,&(argv[i])); xbt_log_init(argc, argv); @@ -158,8 +160,7 @@ void xbt_abort(void) __gcov_flush(); #endif #ifdef _WIN32 - /* It was said *in silence*. We don't want to see the error message printed - * by the Microsoft's implementation of abort(). */ + /* We said *in silence*. We don't want to see the error message printed by Microsoft's implementation of abort(). */ raise(SIGABRT); signal(SIGABRT, SIG_DFL); raise(SIGABRT); diff --git a/src/xbt/xbt_os_file.c b/src/xbt/xbt_os_file.c index 46dd79a42e..789c14118e 100644 --- a/src/xbt/xbt_os_file.c +++ b/src/xbt/xbt_os_file.c @@ -36,10 +36,7 @@ */ ssize_t xbt_getline(char **buf, size_t *n, FILE *stream) { - ssize_t i; - int ch; - - ch = getc(stream); + int ch = getc(stream); if (ferror(stream) || feof(stream)) return -1; @@ -48,15 +45,20 @@ ssize_t xbt_getline(char **buf, size_t *n, FILE *stream) *buf = xbt_malloc(*n); } - i = 0; + ssize_t i = 0; do { - if (i == *n) - *buf = xbt_realloc(*buf, *n += 512); - (*buf)[i++] = ch; + if (i == *n) { + *n += 512; + *buf = xbt_realloc(*buf, *n); + } + (*buf)[i] = ch; + i++; } while (ch != '\n' && (ch = getc(stream)) != EOF); - if (i == *n) - *buf = xbt_realloc(*buf, *n += 1); + if (i == *n) { + *n += 1; + *buf = xbt_realloc(*buf, *n); + } (*buf)[i] = '\0'; return i; diff --git a/src/xbt/xbt_str.cpp b/src/xbt/xbt_str.cpp index 8496a21281..76ad09e208 100644 --- a/src/xbt/xbt_str.cpp +++ b/src/xbt/xbt_str.cpp @@ -11,7 +11,6 @@ #include "xbt/misc.h" #include "xbt/sysdep.h" #include "xbt/str.h" /* headers of these functions */ -#include "xbt/strbuff.h" /** @brief Strip whitespace (or other characters) from the end of a string. * @@ -141,31 +140,6 @@ void xbt_str_subst(char *str, char from, char to, int occurence) } } -/** @brief Replaces a set of variables by their values - * - * @param str The input of the replacement process - * @param patterns The changes to apply - * @return The string modified - * - * Both '$toto' and '${toto}' are valid (and the two writing are equivalent). - * - * If the variable name contains spaces, use the brace version (ie, ${toto tutu}) - * - * You can provide a default value to use if the variable is not set in the dict by using '${var:=default}' or - * '${var:-default}'. These two forms are equivalent, even if they shouldn't to respect the shell standard (:= form - * should set the value in the dict, but does not) (BUG). - */ -char *xbt_str_varsubst(const char *str, xbt_dict_t patterns) -{ - xbt_strbuff_t buff = xbt_strbuff_new_from(str); - char *res; - xbt_strbuff_varsubst(buff, patterns); - res = buff->data; - xbt_strbuff_free_container(buff); - return res; -} - - /** @brief Splits a string into a dynar of strings * * @param s: the string to split @@ -183,8 +157,6 @@ char *xbt_str_varsubst(const char *str, xbt_dict_t patterns) xbt_dynar_t xbt_str_split(const char *s, const char *sep) { xbt_dynar_t res = xbt_dynar_new(sizeof(char *), &xbt_free_ref); - const char *p, *q; - int done; const char *sep_dflt = " \t\n\r\x0B"; char is_sep[256] = { 1, 0 }; @@ -197,12 +169,12 @@ xbt_dynar_t xbt_str_split(const char *s, const char *sep) while (*sep) is_sep[(unsigned char) *sep++] = 1; } - is_sep[0] = 1; /* End of string is also separator */ + is_sep[0] = 1; /* End of string is also separator */ /* Do the job */ - p = s; - q = s; - done = 0; + const char* p = s; + const char* q = s; + int done = 0; if (s[0] == '\0') return res; @@ -233,12 +205,10 @@ xbt_dynar_t xbt_str_split(const char *s, const char *sep) xbt_dynar_t xbt_str_split_str(const char *s, const char *sep) { xbt_dynar_t res = xbt_dynar_new(sizeof(char *), &xbt_free_ref); - int done; - const char *p, *q; - p = s; - q = s; - done = 0; + const char* p = s; + const char* q = s; + int done = 0; if (s[0] == '\0') return res; @@ -287,10 +257,12 @@ xbt_dynar_t xbt_str_split_str(const char *s, const char *sep) */ xbt_dynar_t xbt_str_split_quoted_in_place(char *s) { xbt_dynar_t res = xbt_dynar_new(sizeof(char *), nullptr); - char *beg, *end; /* pointers around the parsed chunk */ - int in_simple_quote = 0, in_double_quote = 0; - int done = 0; - int ctn = 0; /* Got something in this block */ + char* beg; + char* end; /* pointers around the parsed chunk */ + int in_simple_quote = 0; + int in_double_quote = 0; + int done = 0; + int ctn = 0; /* Got something in this block */ if (s[0] == '\0') return res; @@ -403,8 +375,7 @@ char *xbt_str_join(xbt_dynar_t dyn, const char *sep) { int len = 1, dyn_len = xbt_dynar_length(dyn); unsigned int cpt; - char *cursor; - char *res, *p; + char* cursor; if (!dyn_len) return xbt_strdup(""); @@ -415,8 +386,8 @@ char *xbt_str_join(xbt_dynar_t dyn, const char *sep) } len += strlen(sep) * dyn_len; /* Do the job */ - res = (char*) xbt_malloc(len); - p = res; + char* res = (char*)xbt_malloc(len); + char* p = res; xbt_dynar_foreach(dyn, cpt, cursor) { if ((int) cpt < dyn_len - 1) p += snprintf(p,len, "%s%s", cursor, sep); @@ -433,26 +404,24 @@ char *xbt_str_join(xbt_dynar_t dyn, const char *sep) */ char *xbt_str_join_array(const char *const *strs, const char *sep) { - char *res,*q; int amount_strings=0; int len=0; - int i; if ((!strs) || (!strs[0])) return xbt_strdup(""); /* compute the length before malloc */ - for (i=0;strs[i];i++) { + for (int i = 0; strs[i]; i++) { len += strlen(strs[i]); amount_strings++; } len += strlen(sep) * amount_strings; /* Do the job */ - res = (char*) xbt_malloc(len); - q = res; - for (i=0;strs[i];i++) { - if (i!=0) { // not first loop + char* res = (char*)xbt_malloc(len); + char* q = res; + for (int i = 0; strs[i]; i++) { + if (i != 0) { // not first loop q += snprintf(q,len, "%s%s", sep, strs[i]); } else { q += snprintf(q,len, "%s",strs[i]); @@ -468,7 +437,7 @@ char *xbt_str_join_array(const char *const *strs, const char *sep) */ long int xbt_str_parse_int(const char* str, const char* error_msg) { - char *endptr; + char* endptr; if (str == nullptr || str[0] == '\0') THROWF(arg_error, 0, error_msg, str); diff --git a/src/xbt/xbt_strbuff.c b/src/xbt/xbt_strbuff.c deleted file mode 100644 index 4369aca483..0000000000 --- a/src/xbt/xbt_strbuff.c +++ /dev/null @@ -1,377 +0,0 @@ -/* strbuff -- string buffers */ - -/* Copyright (c) 2007-2015. The SimGrid Team. - * All rights reserved. */ - -/* 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 "xbt/strbuff.h" -#include - -#define minimal_increment 512 - -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(strbuff, xbt, "String buffers"); - -/** @brief Remove any content from the buffer */ -inline void xbt_strbuff_clear(xbt_strbuff_t b) -{ - b->used = 0; - b->data[0] = '\0'; -} - -/** @brief Constructor */ -xbt_strbuff_t xbt_strbuff_new(void) -{ - xbt_strbuff_t res = xbt_malloc(sizeof(s_xbt_strbuff_t)); - res->data = xbt_malloc(512); - res->size = 512; - xbt_strbuff_clear(res); - return res; -} - -/** @brief creates a new string buffer containing the provided string - * - * Beware, the ctn is copied, you want to free it afterward, anyhow - */ -inline xbt_strbuff_t xbt_strbuff_new_from(const char *ctn) -{ - xbt_strbuff_t res = xbt_malloc(sizeof(s_xbt_strbuff_t)); - res->data = xbt_strdup(ctn); - res->size = strlen(ctn); - res->used = res->size; - return res; -} - -/** @brief frees only the container without touching to the contained string */ -inline void xbt_strbuff_free_container(xbt_strbuff_t b) -{ - free(b); -} - -/** @brief frees the buffer and its content */ -inline void xbt_strbuff_free(xbt_strbuff_t b) -{ - if (b) { - free(b->data); - free(b); - } -} - -/** @brief Adds some content at the end of the buffer */ -void xbt_strbuff_append(xbt_strbuff_t b, const char *toadd) -{ - int addlen; - int needed_space; - - xbt_assert(b, "Asked to append stuff to NULL buffer"); - - addlen = strlen(toadd); - needed_space = b->used + addlen + 1; - - if (needed_space > b->size) { - b->size = MAX(minimal_increment + b->used, needed_space); - b->data = xbt_realloc(b->data, b->size); - } - strncpy(b->data + b->used, toadd, b->size-b->used); - b->used += addlen; -} - -/** @brief format some content and push it at the end of the buffer */ -void xbt_strbuff_printf(xbt_strbuff_t b, const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - char *data = bvprintf(fmt, ap); - xbt_strbuff_append(b, data); - xbt_free(data); - va_end(ap); -} - -/** @brief Replaces a set of variables by their values - * - * @param b buffer to modify - * @param patterns variables to substitute in the buffer - * - * Both '$toto' and '${toto}' are valid (and the two writing are equivalent). - * - * If the variable name contains spaces, use the brace version (ie, ${toto tutu}) - * - * You can provide a default value to use if the variable is not set in the dict by using '${var:=default}' or - * '${var:-default}'. These two forms are equivalent, even if they shouldn't to respect the shell standard (:= form - * should set the value in the dict, but does not) (BUG). - */ -void xbt_strbuff_varsubst(xbt_strbuff_t b, xbt_dict_t patterns) -{ - char *end; /* pointers around the parsed chunk */ - int in_simple_quote = 0; - int in_double_quote = 0; - int done = 0; - - if (b->data[0] == '\0') - return; - end = b->data; - - while (!done) { - switch (*end) { - case '\\': - /* Protected char; pass the protection */ - end++; - xbt_assert(*end != '\0', "String ends with \\"); - break; - case '\'': - if (!in_double_quote) { - /* simple quote not protected by double ones, note it */ - in_simple_quote = !in_simple_quote; - } - break; - case '"': - if (!in_simple_quote) { - /* double quote protected by simple ones, note it */ - in_double_quote = !in_double_quote; - } - break; - case '$': - if (!in_simple_quote) { - /* Go for the substitution. First search the variable name */ - char *beg_var; - char *end_var; /* variable name boundary */ - char *beg_subst = end; - char *end_subst = NULL; /* where value should be written to */ - char *value; - char *default_value = NULL; - int val_len; - - if (*(++end) == '{') { - /* the variable name is enclosed in braces. */ - beg_var = end + 1; - /* Search name's end */ - end_var = beg_var; - while (*end_var != '\0' && *end_var != '}') { - /* TODO: we do not respect the standard for ":=", we should set this value in the dict */ - if (*end_var == ':' - && ((*(end_var + 1) == '=') || (*(end_var + 1) == '-'))) { - /* damn, we have a default value */ - char *p = end_var + 1; - while (*p != '\0' && *p != '}') - p++; - xbt_assert (*p != '\0', "Variable default value not terminated ('}' missing)"); - - default_value = xbt_malloc(p - end_var - 1); - memcpy(default_value, end_var + 2, p - end_var - 2); - default_value[p - end_var - 2] = '\0'; - - end_subst = p + 1; /* eat '}' */ - break; - } - end_var++; - } - xbt_assert(*end_var != '\0', "Variable name not terminated ('}' missing)"); - - if (!end_subst) /* already set if there's a default value */ - end_subst = end_var + 1; /* also kill the } in the name */ - - xbt_assert(end_var != beg_var, "Variable name empty (${} is not valid)"); - } else { - /* name given directly */ - beg_var = end; - end_var = beg_var; - while (*end_var != '\0' && *end_var != ' ' && *end_var != '\t' && *end_var != '\n') - end_var++; - end_subst = end_var; - xbt_assert (end_var != beg_var, "Variable name empty ($ is not valid)"); - } - - /* ok, we now have the variable name. Search the dictionary for the substituted value */ - value = xbt_dict_get_or_null_ext(patterns, beg_var, end_var - beg_var); - - if (value) - value = xbt_strdup(value); - else if (default_value) - value = xbt_strdup(default_value); - else - value = xbt_strdup(""); - - /* En route for the actual substitution */ - val_len = strlen(value); - if (val_len <= end_subst - beg_subst) { - /* enough room to do the substitute in place */ - memmove(beg_subst, value, val_len); /* substitute */ - /* move the end of the string closer */ - memmove(beg_subst + val_len, end_subst, b->used - (end_subst - b->data) + 1); -// XBT_DEBUG("String is now: '%s'",b->data); - end = beg_subst + val_len; /* update the currently explored char in the overall loop */ -// XBT_DEBUG("end of substituted section is now '%s'",end); - b->used -= end_subst - beg_subst - val_len; /* update string buffer used size */ -// XBT_DEBUG("Used:%d end:%d ending char:%d",b->used,end-b->data,*end); - } else { - /* we have to extend the data area */ - int tooshort = val_len - (end_subst - beg_subst) + 1 /* don't forget \0 */ ; - int newused = b->used + tooshort; - end += tooshort; /* update the pointer of the overall loop */ -// XBT_DEBUG("Too short (by %d chars; %d chars left in area)",val_len-(end_subst-beg_subst),b->size - b->used); - if (newused > b->size) { - /* We have to realloc the data area before (because b->size is too small). - * We have to update our pointers, too */ - char *newdata = xbt_realloc(b->data, b->used + MAX(minimal_increment, tooshort)); - int offset = newdata - b->data; - b->data = newdata; - b->size = b->used + MAX(minimal_increment, tooshort); - end += offset; - beg_subst += offset; - end_subst += offset; - } - /* move the end of the string a bit further */ - memmove(beg_subst + val_len, end_subst, b->used - (end_subst - b->data) + 1); - memmove(beg_subst, value, val_len); /* substitute */ - b->used = newused; -// XBT_DEBUG("String is now: %s",b->data); - } - free(value); - free(default_value); - end--; /* compensate the next end++ */ - } - break; - case '\0': - done = 1; - break; - } - end++; - } -} - -#ifdef SIMGRID_TEST -#include "xbt/strbuff.h" - -/* buffstr have 512 chars by default. Adding 1000 chars like this will force a resize, allowing us to test that - * b->used and b->size are consistent */ -#define force_resize \ - "1.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "2.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "3.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "4.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "5.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "6.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "7.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "8.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "9.........1.........2.........3.........4.........5.........6.........7.........8.........9........." \ - "0.........1.........2.........3.........4.........5.........6.........7.........8.........9........." - -static void mytest(const char *input, const char *patterns, const char *expected) -{ - xbt_dynar_t dyn_patterns; /* splited string */ - xbt_dict_t p; /* patterns */ - unsigned int cpt; - char *str; /*foreach */ - xbt_strbuff_t sb; /* what we test */ - - p = xbt_dict_new_homogeneous(free); - dyn_patterns = xbt_str_split(patterns, " "); - xbt_dynar_foreach(dyn_patterns, cpt, str) { - xbt_dynar_t keyvals = xbt_str_split(str, "="); - char *key = xbt_dynar_get_as(keyvals, 0, char *); - char *val = xbt_dynar_get_as(keyvals, 1, char *); - xbt_str_subst(key, '_', ' ', 0); // to put space in names without breaking the enclosing dynar_foreach - xbt_dict_set(p, key, xbt_strdup(val), NULL); - xbt_dynar_free(&keyvals); - } - xbt_dynar_free(&dyn_patterns); - sb = xbt_strbuff_new(); - xbt_strbuff_append(sb, input); - xbt_strbuff_varsubst(sb, p); - xbt_dict_free(&p); - xbt_test_assert(!strcmp(sb->data, expected), "Input (%s) with patterns (%s) leads to (%s) instead of (%s)", - input, patterns, sb->data, expected); - xbt_strbuff_free(sb); -} - -XBT_TEST_SUITE("xbt_strbuff", "String Buffers"); -XBT_TEST_UNIT("xbt_strbuff_substitute", test_strbuff_substitute, "test the function xbt_strbuff_substitute") -{ - xbt_test_add("Empty"); - mytest("", "", ""); - - xbt_test_add("Value shorter, no braces, only variable"); - mytest("$tutu", "tutu=t", "t"); - xbt_test_add("Value shorter, braces, only variable"); - mytest("${tutu}", "tutu=t", "t"); - xbt_test_add("Value shorter, no braces, data after"); - mytest("$tutu toto", "tutu=t", "t toto"); - xbt_test_add("Value shorter, braces, data after"); - mytest("${tutu} toto", "tutu=t", "t toto"); - xbt_test_add("Value shorter, no braces, data before"); - mytest("toto $tutu", "tutu=t", "toto t"); - xbt_test_add("Value shorter, braces, data before"); - mytest("toto ${tutu}", "tutu=t", "toto t"); - xbt_test_add("Value shorter, no braces, data before and after"); - mytest("toto $tutu tata", "tutu=t", "toto t tata"); - xbt_test_add("Value shorter, braces, data before and after"); - mytest("toto ${tutu} tata", "tutu=t", "toto t tata"); - - xbt_test_add("Value as long, no braces, only variable"); - mytest("$tutu", "tutu=12345", "12345"); - xbt_test_add("Value as long, braces, only variable"); - mytest("${tutu}", "tutu=1234567", "1234567"); - xbt_test_add("Value as long, no braces, data after"); - mytest("$tutu toto", "tutu=12345", "12345 toto"); - xbt_test_add("Value as long, braces, data after"); - mytest("${tutu} toto", "tutu=1234567", "1234567 toto"); - xbt_test_add("Value as long, no braces, data before"); - mytest("toto $tutu", "tutu=12345", "toto 12345"); - xbt_test_add("Value as long, braces, data before"); - mytest("toto ${tutu}", "tutu=1234567", "toto 1234567"); - xbt_test_add("Value as long, no braces, data before and after"); - mytest("toto $tutu tata", "tutu=12345", "toto 12345 tata"); - xbt_test_add("Value as long, braces, data before and after"); - mytest("toto ${tutu} tata", "tutu=1234567", "toto 1234567 tata"); - - xbt_test_add("Value longer, no braces, only variable"); - mytest("$t", "t=tututu", "tututu"); - xbt_test_add("Value longer, braces, only variable"); - mytest("${t}", "t=tututu", "tututu"); - xbt_test_add("Value longer, no braces, data after"); - mytest("$t toto", "t=tututu", "tututu toto"); - xbt_test_add("Value longer, braces, data after"); - mytest("${t} toto", "t=tututu", "tututu toto"); - xbt_test_add("Value longer, no braces, data before"); - mytest("toto $t", "t=tututu", "toto tututu"); - xbt_test_add("Value longer, braces, data before"); - mytest("toto ${t}", "t=tututu", "toto tututu"); - xbt_test_add("Value longer, no braces, data before and after"); - mytest("toto $t tata", "t=tututu", "toto tututu tata"); - xbt_test_add("Value longer, braces, data before and after"); - mytest("toto ${t} tata", "t=tututu", "toto tututu tata"); - - xbt_test_add("Value much longer, no braces, only variable"); - mytest("$t", "t=" force_resize, force_resize); - xbt_test_add("Value much longer, no braces, data after"); - mytest("$t toto", "t=" force_resize, force_resize " toto"); - xbt_test_add("Value much longer, braces, data after"); - mytest("${t} toto", "t=" force_resize, force_resize " toto"); - xbt_test_add("Value much longer, no braces, data before"); - mytest("toto $t", "t=" force_resize, "toto " force_resize); - xbt_test_add("Value much longer, braces, data before"); - mytest("toto ${t}", "t=" force_resize, "toto " force_resize); - xbt_test_add("Value much longer, no braces, data before and after"); - mytest("toto $t tata", "t=" force_resize, "toto " force_resize " tata"); - xbt_test_add("Value much longer, braces, data before and after"); - mytest("toto ${t} tata", "t=" force_resize, "toto " force_resize " tata"); - - xbt_test_add("Escaped $"); - mytest("\\$tutu", "tutu=t", "\\$tutu"); - xbt_test_add("Space in var name (with braces)"); - mytest("${tu ti}", "tu_ti=t", "t"); - - xbt_test_add("Two variables"); - mytest("$toto $tutu", "toto=1 tutu=2", "1 2"); - - // Commented: I'm too lazy to do a memmove in var name to remove the backslash after use. - // Users should use braces. - // xbt_test_add("Escaped space in var name", "$tu\\ ti", "tu_ti=t", "t"); - - xbt_test_add("Default value"); - mytest("${t:-toto}", "", "toto"); - xbt_test_add("Useless default value (variable already defined)"); - mytest("${t:-toto}", "t=TRUC", "TRUC"); -} -#endif /* SIMGRID_TEST */ diff --git a/src/xbt_modinter.h b/src/xbt_modinter.h index e0240df869..f76b1a62f3 100644 --- a/src/xbt_modinter.h +++ b/src/xbt_modinter.h @@ -14,7 +14,6 @@ SG_BEGIN_DECL() /* Modules definitions */ void xbt_log_preinit(void); -void xbt_log_init(int *argc, char **argv); void xbt_log_postexit(void); void xbt_dict_preinit(void); diff --git a/teshsuite/mc/CMakeLists.txt b/teshsuite/mc/CMakeLists.txt index 1e4272083b..5d42234bf8 100644 --- a/teshsuite/mc/CMakeLists.txt +++ b/teshsuite/mc/CMakeLists.txt @@ -1,5 +1,5 @@ foreach(x dwarf dwarf-expression) - if (HAVE_MC) + if (SIMGRID_HAVE_MC) add_executable (${x} ${x}/${x}.cpp) target_link_libraries(${x} simgrid) set_target_properties(${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x}) @@ -28,7 +28,7 @@ set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/random-bug/rando ${CMAKE_CURRENT_SOURCE_DIR}/mutex-handling/without-mutex-handling.tesh PARENT_SCOPE) set(xml_files ${xml_files} ${CMAKE_CURRENT_SOURCE_DIR}/mutex-handling/mutex-handling_d.xml PARENT_SCOPE) -IF(HAVE_MC) +IF(SIMGRID_HAVE_MC) ADD_TESH(tesh-mc-dwarf --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/mc/dwarf --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/mc/dwarf dwarf.tesh) ADD_TESH(tesh-mc-dwarf-expression --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/mc/dwarf-expression --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/mc/dwarf-expression dwarf-expression.tesh) ADD_TESH(tesh-mc-mutex-handling --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/mc/mutex-handling --setenv srcdir=${CMAKE_HOME_DIRECTORY} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/mc/mutex-handling mutex-handling.tesh --cfg=model-check/reduction:none) diff --git a/teshsuite/mc/mutex-handling/mutex-handling_d.xml b/teshsuite/mc/mutex-handling/mutex-handling_d.xml index f1325de94b..d6eb805e60 100644 --- a/teshsuite/mc/mutex-handling/mutex-handling_d.xml +++ b/teshsuite/mc/mutex-handling/mutex-handling_d.xml @@ -1,11 +1,11 @@ - - - + + + - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1-c0s0-c0s1.xml b/teshsuite/msg/trace_integration/test-hbp1-c0s0-c0s1.xml index 68c4ccc583..b761bdbf59 100644 --- a/teshsuite/msg/trace_integration/test-hbp1-c0s0-c0s1.xml +++ b/teshsuite/msg/trace_integration/test-hbp1-c0s0-c0s1.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1-c0s0-c1s0.xml b/teshsuite/msg/trace_integration/test-hbp1-c0s0-c1s0.xml index d12fc7b598..aa093e31c0 100644 --- a/teshsuite/msg/trace_integration/test-hbp1-c0s0-c1s0.xml +++ b/teshsuite/msg/trace_integration/test-hbp1-c0s0-c1s0.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1-c0s1-c0s2.xml b/teshsuite/msg/trace_integration/test-hbp1-c0s1-c0s2.xml index 6ae2f4ed74..a919a7395f 100644 --- a/teshsuite/msg/trace_integration/test-hbp1-c0s1-c0s2.xml +++ b/teshsuite/msg/trace_integration/test-hbp1-c0s1-c0s2.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1-c0s1-c2s2.xml b/teshsuite/msg/trace_integration/test-hbp1-c0s1-c2s2.xml index 4c9a178f85..28c048a768 100644 --- a/teshsuite/msg/trace_integration/test-hbp1-c0s1-c2s2.xml +++ b/teshsuite/msg/trace_integration/test-hbp1-c0s1-c2s2.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s0.xml b/teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s0.xml index 33087be338..a6ee0c0d73 100644 --- a/teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s0.xml +++ b/teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s0.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s1.xml b/teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s1.xml index 028b9a1dd6..2bf91a18aa 100644 --- a/teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s1.xml +++ b/teshsuite/msg/trace_integration/test-hbp1-c0s2-c1s1.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1-c1s1-c1s2.xml b/teshsuite/msg/trace_integration/test-hbp1-c1s1-c1s2.xml index 8beb1c23f3..cd8c9c05ee 100644 --- a/teshsuite/msg/trace_integration/test-hbp1-c1s1-c1s2.xml +++ b/teshsuite/msg/trace_integration/test-hbp1-c1s1-c1s2.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1-c1s1-c3s2.xml b/teshsuite/msg/trace_integration/test-hbp1-c1s1-c3s2.xml index c412fe1028..4fd1842b55 100644 --- a/teshsuite/msg/trace_integration/test-hbp1-c1s1-c3s2.xml +++ b/teshsuite/msg/trace_integration/test-hbp1-c1s1-c3s2.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1.0-hbp1.0-hbp1.0.xml b/teshsuite/msg/trace_integration/test-hbp1.0-hbp1.0-hbp1.0.xml index b4a9f57a41..4d2d81a494 100644 --- a/teshsuite/msg/trace_integration/test-hbp1.0-hbp1.0-hbp1.0.xml +++ b/teshsuite/msg/trace_integration/test-hbp1.0-hbp1.0-hbp1.0.xml @@ -1,16 +1,16 @@ - - + + - - + + - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml b/teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml index 504497c286..7de0dc6231 100644 --- a/teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml +++ b/teshsuite/msg/trace_integration/test-hbp1.0-hbp3.0-hbp4.0.xml @@ -1,16 +1,16 @@ - - + + - - + + - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp1.5-hbp1.5.xml b/teshsuite/msg/trace_integration/test-hbp1.5-hbp1.5.xml index aaa2f6cf53..b31e3cab72 100644 --- a/teshsuite/msg/trace_integration/test-hbp1.5-hbp1.5.xml +++ b/teshsuite/msg/trace_integration/test-hbp1.5-hbp1.5.xml @@ -1,12 +1,12 @@ - - + + - - + + - + diff --git a/teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml b/teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml index 163924b2db..004873453d 100644 --- a/teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml +++ b/teshsuite/msg/trace_integration/test-hbp2.5-hbp1.5.xml @@ -1,12 +1,12 @@ - - + + - - + + - + diff --git a/teshsuite/simdag/availability/availability.tesh b/teshsuite/simdag/availability/availability.tesh index df3f8ca676..ec79ca17da 100644 --- a/teshsuite/simdag/availability/availability.tesh +++ b/teshsuite/simdag/availability/availability.tesh @@ -30,5 +30,5 @@ $ ${bindir:=.}/availability ../../../examples/platforms/simulacrum_7_hosts.xml > [0.000000] [test/INFO] Scheduling ID00024@mJPEG to node: Host 30 > [0.000000] [test/INFO] Scheduling end to node: Host 26 > [0.000000] [test/INFO] DAX scheduled -> [164.052870] [test/INFO] Simulation done. +> [164.054322] [test/INFO] Simulation done. diff --git a/teshsuite/simdag/flatifier/bogus_missing_gateway.tesh b/teshsuite/simdag/flatifier/bogus_missing_gateway.tesh index 6a28da60ad..b45ef48654 100644 --- a/teshsuite/simdag/flatifier/bogus_missing_gateway.tesh +++ b/teshsuite/simdag/flatifier/bogus_missing_gateway.tesh @@ -1,11 +1,11 @@ ! expect signal SIGABRT $ ${bindir:=.}/flatifier ../platforms/bogus_missing_src_gateway.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" > [ 0.000000] [0:maestro@] Switching to the L07 model to handle parallel tasks. -> [ 0.000000] [0:maestro@] Parse error at ../platforms/bogus_missing_src_gateway.xml:14: ASroute gw_src='nod-cluster_router.cluster.us' does name a node. +> [ 0.000000] [0:maestro@] Parse error at ../platforms/bogus_missing_src_gateway.xml:14: zoneRoute gw_src='nod-cluster_router.cluster.us' does name a node. > [ 0.000000] [0:maestro@] Exiting now ! expect signal SIGABRT $ ${bindir:=.}/flatifier ../platforms/bogus_missing_dst_gateway.xml "--log=root.fmt:[%10.6r]%e[%i:%P@%h]%e%m%n" > [ 0.000000] [0:maestro@] Switching to the L07 model to handle parallel tasks. -> [ 0.000000] [0:maestro@] Parse error at ../platforms/bogus_missing_dst_gateway.xml:14: ASroute gw_dst='neud-grappe_router.grappe.fr' does name a node. +> [ 0.000000] [0:maestro@] Parse error at ../platforms/bogus_missing_dst_gateway.xml:14: zoneRoute gw_dst='neud-grappe_router.grappe.fr' does name a node. > [ 0.000000] [0:maestro@] Exiting now diff --git a/teshsuite/simdag/flatifier/flatifier.cpp b/teshsuite/simdag/flatifier/flatifier.cpp index 5baf8683a3..d654328b4f 100644 --- a/teshsuite/simdag/flatifier/flatifier.cpp +++ b/teshsuite/simdag/flatifier/flatifier.cpp @@ -61,7 +61,8 @@ static void dump_platform() int version = 4; xbt_dict_t props = nullptr; xbt_dict_cursor_t cursor = nullptr; - char *key, *data; + char* key; + char* data; std::printf("\n"); std::printf("\n"); diff --git a/teshsuite/simdag/is-router/is-router.tesh b/teshsuite/simdag/is-router/is-router.tesh index 6039c371b3..80d0a67b51 100644 --- a/teshsuite/simdag/is-router/is-router.tesh +++ b/teshsuite/simdag/is-router/is-router.tesh @@ -14,7 +14,6 @@ $ ${bindir:=.}/is-router ${srcdir}/teshsuite/simdag/platforms/test_of_is_router. > - Seen: "host09". Type: host > - Seen: "host10". Type: host > NetCards count: 21 -> - Seen: "AS". Type: netzone > - Seen: "AS0". Type: netzone > - Seen: "AS1". Type: netzone > - Seen: "AS2". Type: netzone @@ -35,3 +34,4 @@ $ ${bindir:=.}/is-router ${srcdir}/teshsuite/simdag/platforms/test_of_is_router. > - Seen: "router3". Type: router > - Seen: "router4". Type: router > - Seen: "router5". Type: router +> - Seen: "zone". Type: netzone diff --git a/teshsuite/simdag/platforms/Dijkstra.xml b/teshsuite/simdag/platforms/Dijkstra.xml index d04c636bcf..cf18d7b06d 100644 --- a/teshsuite/simdag/platforms/Dijkstra.xml +++ b/teshsuite/simdag/platforms/Dijkstra.xml @@ -1,7 +1,7 @@ - - + + @@ -32,5 +32,5 @@ - + diff --git a/teshsuite/simdag/platforms/bob.trace b/teshsuite/simdag/platforms/bob.trace index 019c2c8a2c..af700d071f 100644 --- a/teshsuite/simdag/platforms/bob.trace +++ b/teshsuite/simdag/platforms/bob.trace @@ -1,4 +1,4 @@ -PERIODICITY 1.0 -0.0 1.0 -11.0 0.5 -20.0 0.8 + 0 1.0 +11 0.5 +20 0.8 +LOOPAFTER 1 diff --git a/teshsuite/simdag/platforms/bogus_disk_attachment.xml b/teshsuite/simdag/platforms/bogus_disk_attachment.xml index d038fc1a4f..d13d47015d 100644 --- a/teshsuite/simdag/platforms/bogus_disk_attachment.xml +++ b/teshsuite/simdag/platforms/bogus_disk_attachment.xml @@ -1,9 +1,9 @@ - + - + @@ -15,5 +15,5 @@ - + diff --git a/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml b/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml index d297f04c3f..c754f89d49 100644 --- a/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml +++ b/teshsuite/simdag/platforms/bogus_missing_dst_gateway.xml @@ -1,18 +1,18 @@ - - - + + + - - + + - + - + - - + + diff --git a/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml b/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml index b935300e5e..8de74a8782 100644 --- a/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml +++ b/teshsuite/simdag/platforms/bogus_missing_src_gateway.xml @@ -1,18 +1,18 @@ - - - + + + - - + + - + - + - - + + diff --git a/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.xml b/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.xml index ec5230632a..34eb3f27b6 100644 --- a/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.xml +++ b/teshsuite/simdag/platforms/bogus_two_hosts_asymetric.xml @@ -1,10 +1,10 @@ - + - + @@ -17,5 +17,5 @@ - + diff --git a/teshsuite/simdag/platforms/carol.fail b/teshsuite/simdag/platforms/carol.fail index 0610bcf50d..6d895868c8 100644 --- a/teshsuite/simdag/platforms/carol.fail +++ b/teshsuite/simdag/platforms/carol.fail @@ -1,3 +1,3 @@ -PERIODICITY 10.0 -1.0 -1.0 -2.0 1.0 +1 -1.0 +2 1.0 +LOOPAFTER 10 diff --git a/teshsuite/simdag/platforms/erin.avail b/teshsuite/simdag/platforms/erin.avail index 3f3d3a2c11..4c7378ecc6 100644 --- a/teshsuite/simdag/platforms/erin.avail +++ b/teshsuite/simdag/platforms/erin.avail @@ -1,4 +1,4 @@ -PERIODICITY 1.0 -0.0 1.0 -9.0 0.7 -15.0 0.4 + 0 1.0 + 9 0.7 +15 0.4 +LOOPAFTER 1 diff --git a/teshsuite/simdag/platforms/four_hosts_floyd.xml b/teshsuite/simdag/platforms/four_hosts_floyd.xml index 3e851a68a2..eaa710ad7a 100644 --- a/teshsuite/simdag/platforms/four_hosts_floyd.xml +++ b/teshsuite/simdag/platforms/four_hosts_floyd.xml @@ -1,7 +1,7 @@ - - + + @@ -24,5 +24,5 @@ - + diff --git a/teshsuite/simdag/platforms/host_attributes.xml b/teshsuite/simdag/platforms/host_attributes.xml index b0d28e0674..daedebb2df 100644 --- a/teshsuite/simdag/platforms/host_attributes.xml +++ b/teshsuite/simdag/platforms/host_attributes.xml @@ -1,7 +1,7 @@ - - + + @@ -11,7 +11,7 @@ - + 0.0 1.0 diff --git a/teshsuite/simdag/platforms/link.bw b/teshsuite/simdag/platforms/link.bw index ac0d5aa85e..c91df60250 100644 --- a/teshsuite/simdag/platforms/link.bw +++ b/teshsuite/simdag/platforms/link.bw @@ -1,3 +1,3 @@ -PERIODICITY 12.0 -4.0 40000000 -8.0 60000000 + 4 40000000 + 8 60000000 +LOOPAFTER 12 diff --git a/teshsuite/simdag/platforms/link.fail b/teshsuite/simdag/platforms/link.fail index 0610bcf50d..3bee23b85d 100644 --- a/teshsuite/simdag/platforms/link.fail +++ b/teshsuite/simdag/platforms/link.fail @@ -1,3 +1,3 @@ -PERIODICITY 10.0 -1.0 -1.0 -2.0 1.0 +1 -1.0 +2 1.0 +LOOPAFTER 10 diff --git a/teshsuite/simdag/platforms/link.lat b/teshsuite/simdag/platforms/link.lat index f4a4bb3392..d447a89dbf 100644 --- a/teshsuite/simdag/platforms/link.lat +++ b/teshsuite/simdag/platforms/link.lat @@ -1,4 +1,4 @@ -PERIODICITY 5.0 -1.0 0.001 -2.0 0.01 -3.0 0.001 +1 0.001 +2 0.01 +3 0.001 +LOOPAFTER 5 diff --git a/teshsuite/simdag/platforms/link_attributes.xml b/teshsuite/simdag/platforms/link_attributes.xml index 62bc33dcc8..9e037aec7e 100644 --- a/teshsuite/simdag/platforms/link_attributes.xml +++ b/teshsuite/simdag/platforms/link_attributes.xml @@ -1,12 +1,12 @@ - - + + - + diff --git a/teshsuite/simdag/platforms/one_cluster.xml b/teshsuite/simdag/platforms/one_cluster.xml index 29c7984a7b..fc8e1cdc42 100644 --- a/teshsuite/simdag/platforms/one_cluster.xml +++ b/teshsuite/simdag/platforms/one_cluster.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/simdag/platforms/one_cluster_fullduplex.xml b/teshsuite/simdag/platforms/one_cluster_fullduplex.xml index d998894386..c44fa11ea7 100644 --- a/teshsuite/simdag/platforms/one_cluster_fullduplex.xml +++ b/teshsuite/simdag/platforms/one_cluster_fullduplex.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/simdag/platforms/one_cluster_multicore.xml b/teshsuite/simdag/platforms/one_cluster_multicore.xml index 18de9474b3..7c1d08eea5 100644 --- a/teshsuite/simdag/platforms/one_cluster_multicore.xml +++ b/teshsuite/simdag/platforms/one_cluster_multicore.xml @@ -1,7 +1,7 @@ - - + + - + diff --git a/teshsuite/simdag/platforms/one_cluster_router_id.xml b/teshsuite/simdag/platforms/one_cluster_router_id.xml index 3682739d33..fa52d2bd3e 100644 --- a/teshsuite/simdag/platforms/one_cluster_router_id.xml +++ b/teshsuite/simdag/platforms/one_cluster_router_id.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/simdag/platforms/platform_2p_1bb.xml b/teshsuite/simdag/platforms/platform_2p_1bb.xml index d996cbcc84..fc9eae42c8 100644 --- a/teshsuite/simdag/platforms/platform_2p_1bb.xml +++ b/teshsuite/simdag/platforms/platform_2p_1bb.xml @@ -1,7 +1,7 @@ - - + + @@ -13,5 +13,5 @@ - + diff --git a/teshsuite/simdag/platforms/platform_2p_1fl.xml b/teshsuite/simdag/platforms/platform_2p_1fl.xml index 12d217454e..9f76670b84 100644 --- a/teshsuite/simdag/platforms/platform_2p_1fl.xml +++ b/teshsuite/simdag/platforms/platform_2p_1fl.xml @@ -1,7 +1,7 @@ - - + + @@ -10,5 +10,5 @@ - + diff --git a/teshsuite/simdag/platforms/platform_2p_1sl.xml b/teshsuite/simdag/platforms/platform_2p_1sl.xml index ed3396e407..bc4740ac2e 100644 --- a/teshsuite/simdag/platforms/platform_2p_1sl.xml +++ b/teshsuite/simdag/platforms/platform_2p_1sl.xml @@ -1,7 +1,7 @@ - - + + @@ -10,5 +10,5 @@ - + diff --git a/teshsuite/simdag/platforms/platform_2p_1sl_hetero.xml b/teshsuite/simdag/platforms/platform_2p_1sl_hetero.xml index c0d1e78340..db1e5b8da6 100644 --- a/teshsuite/simdag/platforms/platform_2p_1sl_hetero.xml +++ b/teshsuite/simdag/platforms/platform_2p_1sl_hetero.xml @@ -1,7 +1,7 @@ - - + + @@ -10,5 +10,5 @@ - + diff --git a/teshsuite/simdag/platforms/platform_2p_1switch.xml b/teshsuite/simdag/platforms/platform_2p_1switch.xml index 34286fc98d..2082b8ae9f 100644 --- a/teshsuite/simdag/platforms/platform_2p_1switch.xml +++ b/teshsuite/simdag/platforms/platform_2p_1switch.xml @@ -1,7 +1,7 @@ - - + + @@ -14,5 +14,5 @@ - + diff --git a/teshsuite/simdag/platforms/platform_4p_1switch.xml b/teshsuite/simdag/platforms/platform_4p_1switch.xml index e14dbf1e24..bc4167930b 100644 --- a/teshsuite/simdag/platforms/platform_4p_1switch.xml +++ b/teshsuite/simdag/platforms/platform_4p_1switch.xml @@ -1,7 +1,7 @@ - - + + @@ -43,5 +43,5 @@ - + diff --git a/teshsuite/simdag/platforms/platform_include.xml b/teshsuite/simdag/platforms/platform_include.xml index d73a133809..fa5cede5b9 100644 --- a/teshsuite/simdag/platforms/platform_include.xml +++ b/teshsuite/simdag/platforms/platform_include.xml @@ -1,8 +1,8 @@ - - + + - + diff --git a/teshsuite/simdag/platforms/properties.xml b/teshsuite/simdag/platforms/properties.xml index 28dfd08334..d1d276034b 100644 --- a/teshsuite/simdag/platforms/properties.xml +++ b/teshsuite/simdag/platforms/properties.xml @@ -1,6 +1,6 @@ - + @@ -8,7 +8,7 @@ - + - + diff --git a/teshsuite/simdag/platforms/test_of_is_router.xml b/teshsuite/simdag/platforms/test_of_is_router.xml index 70d10ce573..c20f45e6bd 100644 --- a/teshsuite/simdag/platforms/test_of_is_router.xml +++ b/teshsuite/simdag/platforms/test_of_is_router.xml @@ -1,31 +1,31 @@ - - - + + + - - + + - - + + - - + + - - + + - - + + diff --git a/teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml b/teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml index b37590cff3..e34b492997 100644 --- a/teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml +++ b/teshsuite/simdag/platforms/three_hosts_non_symmetric_route.xml @@ -1,7 +1,7 @@ - - + + @@ -23,5 +23,5 @@ - + diff --git a/teshsuite/simdag/platforms/two_clusters.xml b/teshsuite/simdag/platforms/two_clusters.xml index 962dbd7f86..afd0e81114 100644 --- a/teshsuite/simdag/platforms/two_clusters.xml +++ b/teshsuite/simdag/platforms/two_clusters.xml @@ -1,7 +1,7 @@ - - + + - - - + + diff --git a/teshsuite/simdag/platforms/two_clusters_one_name.xml b/teshsuite/simdag/platforms/two_clusters_one_name.xml index 0625fd317f..dc50aa110b 100644 --- a/teshsuite/simdag/platforms/two_clusters_one_name.xml +++ b/teshsuite/simdag/platforms/two_clusters_one_name.xml @@ -1,7 +1,7 @@ - - + + @@ -10,9 +10,9 @@ - - - + + diff --git a/teshsuite/simdag/platforms/two_clusters_router_id.xml b/teshsuite/simdag/platforms/two_clusters_router_id.xml index b6cd8620db..43d4e46243 100644 --- a/teshsuite/simdag/platforms/two_clusters_router_id.xml +++ b/teshsuite/simdag/platforms/two_clusters_router_id.xml @@ -1,7 +1,7 @@ - - + + - + - - + + - - + + diff --git a/teshsuite/simdag/platforms/two_hosts_multi_hop.xml b/teshsuite/simdag/platforms/two_hosts_multi_hop.xml index 15a3b024b3..bb440446fd 100644 --- a/teshsuite/simdag/platforms/two_hosts_multi_hop.xml +++ b/teshsuite/simdag/platforms/two_hosts_multi_hop.xml @@ -1,7 +1,7 @@ - - + + @@ -14,5 +14,5 @@ - + diff --git a/teshsuite/simdag/platforms/two_hosts_one_link.xml b/teshsuite/simdag/platforms/two_hosts_one_link.xml index 56e7e4b174..afef580b6e 100644 --- a/teshsuite/simdag/platforms/two_hosts_one_link.xml +++ b/teshsuite/simdag/platforms/two_hosts_one_link.xml @@ -1,7 +1,7 @@ - - + + @@ -10,5 +10,5 @@ - + diff --git a/teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml b/teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml index 515fd537bc..750ac91e12 100644 --- a/teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml +++ b/teshsuite/simdag/platforms/two_hosts_one_link_fullduplex.xml @@ -1,7 +1,7 @@ - - + + @@ -13,5 +13,5 @@ - + diff --git a/teshsuite/simix/stack_overflow/stack_overflow.c b/teshsuite/simix/stack_overflow/stack_overflow.c index bb8b899d87..5c7f74cf6d 100644 --- a/teshsuite/simix/stack_overflow/stack_overflow.c +++ b/teshsuite/simix/stack_overflow/stack_overflow.c @@ -30,7 +30,7 @@ static int master(int argc, char *argv[]) { XBT_INFO("Launching our nice bugged recursive function..."); unsigned i = 1; - while (i <= 0x80000000u) { + while (i <= 0x80000000U) { i *= 2; unsigned res = collatz(i, i); XBT_VERB("collatz(%u, %u) returned %u", i, i, res); diff --git a/teshsuite/smpi/CMakeLists.txt b/teshsuite/smpi/CMakeLists.txt index 8ebe1cbf20..ed2a264a43 100644 --- a/teshsuite/smpi/CMakeLists.txt +++ b/teshsuite/smpi/CMakeLists.txt @@ -8,7 +8,7 @@ if(enable_smpi) include_directories(BEFORE "${CMAKE_HOME_DIRECTORY}/include/smpi") foreach(x coll-allgather coll-allgatherv coll-allreduce coll-alltoall coll-alltoallv coll-barrier coll-bcast coll-gather coll-reduce coll-reduce-scatter coll-scatter macro-sample pt2pt-dsend pt2pt-pingpong - type-hvector type-indexed type-struct type-vector bug-17132 timers ) + type-hvector type-indexed type-struct type-vector bug-17132 timers privatization ) add_executable (${x} ${x}/${x}.c) target_link_libraries(${x} simgrid) set_target_properties(${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x}) @@ -34,7 +34,8 @@ set(tesh_files ${tesh_files} ${CMAKE_CURRENT_SOURCE_DIR}/coll-allreduce/c ${CMAKE_CURRENT_SOURCE_DIR}/coll-allreduce/coll-allreduce-automatic.tesh ${CMAKE_CURRENT_SOURCE_DIR}/coll-alltoall/clusters.tesh ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt-pingpong/broken_hostfiles.tesh - ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt-pingpong/TI_output.tesh PARENT_SCOPE) + ${CMAKE_CURRENT_SOURCE_DIR}/pt2pt-pingpong/TI_output.tesh + ${CMAKE_CURRENT_SOURCE_DIR}/privatization/privatization_dlopen.tesh PARENT_SCOPE) set(bin_files ${bin_files} ${CMAKE_CURRENT_SOURCE_DIR}/hostfile ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_cluster ${CMAKE_CURRENT_SOURCE_DIR}/hostfile_coll @@ -116,4 +117,12 @@ if(enable_smpi) # Extra pt2pt pingpong test: broken usage ti-tracing ADD_TESH_FACTORIES(tesh-smpi-broken "thread" --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/pt2pt-pingpong --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt-pingpong broken_hostfiles.tesh) ADD_TESH(tesh-smpi-replay-ti-tracing --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/pt2pt-pingpong --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/pt2pt-pingpong TI_output.tesh) + + # Simple privatization tests + if(HAVE_PRIVATIZATION) + ADD_TESH_FACTORIES(tesh-smpi-privatization-mmap "thread;ucontext;raw;boost" --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/privatization --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/privatization privatization.tesh) + endif() + + ADD_TESH_FACTORIES(tesh-smpi-privatization-dlopen "thread;ucontext;raw;boost" --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/smpi/privatization --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/smpi/privatization privatization_dlopen.tesh) + endif() diff --git a/teshsuite/smpi/bug-17132/bug-17132.tesh b/teshsuite/smpi/bug-17132/bug-17132.tesh index 728b8f3a43..597628b9b8 100644 --- a/teshsuite/smpi/bug-17132/bug-17132.tesh +++ b/teshsuite/smpi/bug-17132/bug-17132.tesh @@ -1,3 +1,3 @@ $ ${bindir:=.}/../../../smpi_script/bin/smpirun -np 16 -platform ../../../examples/platforms/small_platform.xml -hostfile ../hostfile ${bindir:=.}/bug-17132 --cfg=smpi/simulate-computation:no --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning -> You requested to use 16 processes, but there is only 5 processes in your hostfile... +> You requested to use 16 ranks, but there is only 5 processes in your hostfile... > Walltime = 0.468274 diff --git a/teshsuite/smpi/coll-alltoallv/coll-alltoallv.c b/teshsuite/smpi/coll-alltoallv/coll-alltoallv.c index 0c83cb7256..d6bf366320 100644 --- a/teshsuite/smpi/coll-alltoallv/coll-alltoallv.c +++ b/teshsuite/smpi/coll-alltoallv/coll-alltoallv.c @@ -62,7 +62,6 @@ int main(int argc, char **argv) int i; int rank; int size; - int *sendcounts, *recvcounts, *rdispls, *sdispls; MPI_Init(&argc, &argv); @@ -81,10 +80,10 @@ int main(int argc, char **argv) } /* Create and load the arguments to alltoallv */ - sendcounts = (int *) xbt_malloc(size * sizeof(int)); - recvcounts = (int *) xbt_malloc(size * sizeof(int)); - rdispls = (int *) xbt_malloc(size * sizeof(int)); - sdispls = (int *) xbt_malloc(size * sizeof(int)); + int* sendcounts = (int*)xbt_malloc(size * sizeof(int)); + int* recvcounts = (int*)xbt_malloc(size * sizeof(int)); + int* rdispls = (int*)xbt_malloc(size * sizeof(int)); + int* sdispls = (int*)xbt_malloc(size * sizeof(int)); for (i = 0; i < size; i++) { sendcounts[i] = i; recvcounts[i] = rank; diff --git a/teshsuite/smpi/macro-sample/macro-sample.c b/teshsuite/smpi/macro-sample/macro-sample.c index 4ae5dbad95..e1a4bf7edd 100644 --- a/teshsuite/smpi/macro-sample/macro-sample.c +++ b/teshsuite/smpi/macro-sample/macro-sample.c @@ -48,7 +48,8 @@ int main(int argc, char *argv[]) /* I want the standard error to go below 0.1 second. * Two tests at least will be run (count is not > 0) */ SMPI_SAMPLE_LOCAL(0, 0.1) { - if (verbose || n++ < 2) { + if (verbose || n < 2) { + n++; if (verbose) fprintf(stderr, "(%12.6f)", MPI_Wtime()); else diff --git a/teshsuite/smpi/privatization/privatization.c b/teshsuite/smpi/privatization/privatization.c new file mode 100644 index 0000000000..07c2b8fa95 --- /dev/null +++ b/teshsuite/smpi/privatization/privatization.c @@ -0,0 +1,27 @@ + +#include +#include +#include + + +static int myvalue = 0; + +int main(int argc, char **argv) +{ + int me; + + MPI_Init(&argc, &argv); + + MPI_Comm_rank(MPI_COMM_WORLD, &me); + + MPI_Barrier(MPI_COMM_WORLD); + + myvalue = me; + + MPI_Barrier(MPI_COMM_WORLD); + + if(myvalue!=me) + printf("Privatization error - %d != %d\n", myvalue, me); + MPI_Finalize(); + return 0; +} diff --git a/teshsuite/smpi/privatization/privatization.tesh b/teshsuite/smpi/privatization/privatization.tesh new file mode 100644 index 0000000000..42d8bf3ec7 --- /dev/null +++ b/teshsuite/smpi/privatization/privatization.tesh @@ -0,0 +1,5 @@ +p Test privatization +! setenv LD_LIBRARY_PATH=../../lib +! timeout 5 +$ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ../hostfile -platform ../../../examples/platforms/small_platform.xml -np 32 ${bindir:=.}/privatization --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/privatization:1 --log=simix_context.thres:error +> You requested to use 32 ranks, but there is only 5 processes in your hostfile... diff --git a/teshsuite/smpi/privatization/privatization_dlopen.tesh b/teshsuite/smpi/privatization/privatization_dlopen.tesh new file mode 100644 index 0000000000..ced2221bae --- /dev/null +++ b/teshsuite/smpi/privatization/privatization_dlopen.tesh @@ -0,0 +1,5 @@ +p Test privatization with dlopen +! setenv LD_LIBRARY_PATH=../../lib +! timeout 5 +$ ${bindir:=.}/../../../smpi_script/bin/smpirun -hostfile ../hostfile -platform ../../../examples/platforms/small_platform.xml -np 32 ${bindir:=.}/privatization --log=smpi_kernel.thres:warning --log=xbt_cfg.thres:warning --cfg=smpi/privatization:dlopen --log=simix_context.thres:error +> You requested to use 32 ranks, but there is only 5 processes in your hostfile... diff --git a/teshsuite/surf/CMakeLists.txt b/teshsuite/surf/CMakeLists.txt index e1b28cefd8..735efee7a3 100644 --- a/teshsuite/surf/CMakeLists.txt +++ b/teshsuite/surf/CMakeLists.txt @@ -1,4 +1,4 @@ -foreach(x lmm_usage surf_usage surf_usage2 trace_usage) +foreach(x lmm_usage surf_usage surf_usage2) add_executable (${x} ${x}/${x}.cpp) target_link_libraries(${x} simgrid) set_target_properties(${x} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${x}) @@ -18,7 +18,7 @@ endforeach() set(tesh_files ${tesh_files} PARENT_SCOPE) set(teshsuite_src ${teshsuite_src} ${CMAKE_CURRENT_SOURCE_DIR}/maxmin_bench/maxmin_bench.cpp PARENT_SCOPE) -foreach(x lmm_usage surf_usage surf_usage2 trace_usage) +foreach(x lmm_usage surf_usage surf_usage2) ADD_TESH(tesh-surf-${x} --setenv bindir=${CMAKE_BINARY_DIR}/teshsuite/surf/${x} --cd ${CMAKE_HOME_DIRECTORY}/teshsuite/surf/${x} ${x}.tesh) endforeach() diff --git a/teshsuite/surf/maxmin_bench/maxmin_bench.cpp b/teshsuite/surf/maxmin_bench/maxmin_bench.cpp index bc5bbe5f7d..7d4323c5cf 100644 --- a/teshsuite/surf/maxmin_bench/maxmin_bench.cpp +++ b/teshsuite/surf/maxmin_bench/maxmin_bench.cpp @@ -38,9 +38,9 @@ static unsigned int int_random(int max) static void test(int nb_cnst, int nb_var, int nb_elem, unsigned int pw_base_limit, unsigned int pw_max_limit, float rate_no_limit, int max_share, int mode) { - lmm_constraint_t *cnst = xbt_new0(lmm_constraint_t, nb_cnst); - lmm_variable_t *var = xbt_new0(lmm_variable_t, nb_var); - int *used = xbt_new0(int, nb_cnst); + lmm_constraint_t cnst[nb_cnst]; + lmm_variable_t var[nb_var]; + int used[nb_cnst]; int concurrency_share; lmm_system_t Sys = lmm_system_new(1); @@ -106,9 +106,6 @@ static void test(int nb_cnst, int nb_var, int nb_elem, unsigned int pw_base_limi for (int i = 0; i < nb_var; i++) lmm_variable_free(Sys, var[i]); lmm_system_free(Sys); - free(cnst); - free(var); - free(used); } unsigned int TestClasses [][4]= diff --git a/teshsuite/surf/surf_usage/surf_usage.tesh b/teshsuite/surf/surf_usage/surf_usage.tesh index 3fc8d8772e..4e60bff41c 100644 --- a/teshsuite/surf/surf_usage/surf_usage.tesh +++ b/teshsuite/surf/surf_usage/surf_usage.tesh @@ -26,7 +26,5 @@ $ $SG_TEST_EXENV ${bindir:=.}/surf_usage ${srcdir:=.}/../../../examples/platform > [110.000000] [surf_test/INFO] Next Event : 110 > [120.000000] [surf_test/INFO] Next Event : 120 > [130.000000] [surf_test/INFO] Next Event : 130 -> [140.000000] [surf_test/INFO] Next Event : 140 -> [150.000000] [surf_test/INFO] Next Event : 150 -> [157.500000] [surf_test/INFO] Next Event : 157.5 -> [157.500000] [surf_test/INFO] CPU Done action +> [132.500000] [surf_test/INFO] Next Event : 132.5 +> [132.500000] [surf_test/INFO] CPU Done action diff --git a/teshsuite/surf/surf_usage2/surf_usage2.tesh b/teshsuite/surf/surf_usage2/surf_usage2.tesh index 5e025d6703..12a74fbafe 100644 --- a/teshsuite/surf/surf_usage2/surf_usage2.tesh +++ b/teshsuite/surf/surf_usage2/surf_usage2.tesh @@ -23,8 +23,6 @@ $ $SG_TEST_EXENV ${bindir:=.}/surf_usage2 ${srcdir:=.}/../../../examples/platfo > [110.000000] [surf_test/INFO] Next Event : 110 > [120.000000] [surf_test/INFO] Next Event : 120 > [130.000000] [surf_test/INFO] Next Event : 130 -> [140.000000] [surf_test/INFO] Next Event : 140 -> [150.000000] [surf_test/INFO] Next Event : 150 -> [157.500000] [surf_test/INFO] Next Event : 157.5 -> [157.500000] [surf_test/INFO] * Done Action -> [157.500000] [surf_test/INFO] Simulation Terminated +> [132.500000] [surf_test/INFO] Next Event : 132.5 +> [132.500000] [surf_test/INFO] * Done Action +> [132.500000] [surf_test/INFO] Simulation Terminated diff --git a/teshsuite/surf/trace_usage/trace_usage.cpp b/teshsuite/surf/trace_usage/trace_usage.cpp deleted file mode 100644 index 3bcd610670..0000000000 --- a/teshsuite/surf/trace_usage/trace_usage.cpp +++ /dev/null @@ -1,56 +0,0 @@ -/* A few tests for the trace library */ - -/* Copyright (c) 2004-2006, 2009-2015. The SimGrid Team. - * All rights reserved. */ - -/* 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 "surf/surf.h" -#include "xbt/log.h" -#include "src/surf/network_interface.hpp" -#include "src/surf/trace_mgr.hpp" - -XBT_LOG_NEW_DEFAULT_CATEGORY(surf_test, "Messages specific for surf example"); - -class DummyTestResource - : public simgrid::surf::Resource { -public: - explicit DummyTestResource(const char* name) : Resource(nullptr, name, nullptr) {} - bool isUsed() override {return false;} - void apply_event(tmgr_trace_iterator_t it, double value) override {} -}; - -int main(int argc, char **argv) -{ - surf_init(&argc, argv); - - simgrid::trace_mgr::future_evt_set *fes = new simgrid::trace_mgr::future_evt_set(); - tmgr_trace_t trace_A = tmgr_trace_new_from_file("trace_A.txt"); - tmgr_trace_t trace_B = tmgr_trace_new_from_file("trace_B.txt"); - double value = -1.0; - simgrid::surf::Resource *resource = nullptr; - simgrid::surf::Resource *hostA = new DummyTestResource("Host A"); - simgrid::surf::Resource *hostB = new DummyTestResource("Host B"); - - fes->add_trace(trace_A, 1.0, hostA); - fes->add_trace(trace_B, 0.0, hostB); - - double next_event_date = fes->next_date(); - while (next_event_date > -1.0) { - XBT_INFO("%g:", next_event_date); - while (fes->pop_leq(next_event_date, &value, &resource)) { - XBT_INFO(" %s: %g", resource->cname(), value); - } - if (next_event_date > 100) - break; - next_event_date = fes->next_date(); - } - - delete fes; - delete hostA; - delete hostB; - - surf_exit(); - return 0; -} diff --git a/teshsuite/surf/trace_usage/trace_usage.tesh b/teshsuite/surf/trace_usage/trace_usage.tesh deleted file mode 100644 index 70d3e5737a..0000000000 --- a/teshsuite/surf/trace_usage/trace_usage.tesh +++ /dev/null @@ -1,63 +0,0 @@ -#! ./tesh - -$ $SG_TEST_EXENV ${bindir:=.}/trace_usage --cfg=path:../../../examples/platforms/trace/ -> [0.000000] [surf_test/INFO] 0: -> [0.000000] [surf_test/INFO] Host B: 1 -> [0.000000] [surf_test/INFO] 1: -> [0.000000] [surf_test/INFO] Host A: 1 -> [0.000000] [surf_test/INFO] 10: -> [0.000000] [surf_test/INFO] Host B: 0.8 -> [0.000000] [surf_test/INFO] 12: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 20: -> [0.000000] [surf_test/INFO] Host B: 0.4 -> [0.000000] [surf_test/INFO] 21: -> [0.000000] [surf_test/INFO] Host A: 0.9 -> [0.000000] [surf_test/INFO] 22: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 30: -> [0.000000] [surf_test/INFO] Host B: 0.8 -> [0.000000] [surf_test/INFO] 31: -> [0.000000] [surf_test/INFO] Host A: 0.9 -> [0.000000] [surf_test/INFO] 32: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 40: -> [0.000000] [surf_test/INFO] Host B: 0.4 -> [0.000000] [surf_test/INFO] 41: -> [0.000000] [surf_test/INFO] Host A: 0.9 -> [0.000000] [surf_test/INFO] 42: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 50: -> [0.000000] [surf_test/INFO] Host B: 0.8 -> [0.000000] [surf_test/INFO] 51: -> [0.000000] [surf_test/INFO] Host A: 0.9 -> [0.000000] [surf_test/INFO] 52: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 60: -> [0.000000] [surf_test/INFO] Host B: 0.4 -> [0.000000] [surf_test/INFO] 61: -> [0.000000] [surf_test/INFO] Host A: 0.9 -> [0.000000] [surf_test/INFO] 62: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 70: -> [0.000000] [surf_test/INFO] Host B: 0.8 -> [0.000000] [surf_test/INFO] 71: -> [0.000000] [surf_test/INFO] Host A: 0.9 -> [0.000000] [surf_test/INFO] 72: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 80: -> [0.000000] [surf_test/INFO] Host B: 0.4 -> [0.000000] [surf_test/INFO] 81: -> [0.000000] [surf_test/INFO] Host A: 0.9 -> [0.000000] [surf_test/INFO] 82: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 90: -> [0.000000] [surf_test/INFO] Host B: 0.8 -> [0.000000] [surf_test/INFO] 91: -> [0.000000] [surf_test/INFO] Host A: 0.9 -> [0.000000] [surf_test/INFO] 92: -> [0.000000] [surf_test/INFO] Host A: 0.5 -> [0.000000] [surf_test/INFO] 100: -> [0.000000] [surf_test/INFO] Host B: 0.4 -> [0.000000] [surf_test/INFO] 101: -> [0.000000] [surf_test/INFO] Host A: 0.9 diff --git a/teshsuite/xbt/parmap_bench/parmap_bench.c b/teshsuite/xbt/parmap_bench/parmap_bench.c index a3f1b0fd42..16505df21e 100644 --- a/teshsuite/xbt/parmap_bench/parmap_bench.c +++ b/teshsuite/xbt/parmap_bench/parmap_bench.c @@ -45,15 +45,13 @@ static const char *parmap_mode_name(e_xbt_parmap_mode_t mode) static int parmap_skip_mode(e_xbt_parmap_mode_t mode) { - switch (mode) { #if !HAVE_FUTEX_H - case XBT_PARMAP_FUTEX: + if (mode == XBT_PARMAP_FUTEX) { printf("not available\n"); return 1; + } else #endif - default: return 0; - } } static unsigned fibonacci(unsigned n) diff --git a/tools/cmake/CTestConfig.cmake b/tools/cmake/CTestConfig.cmake index 54a297c4bb..42b8753cea 100644 --- a/tools/cmake/CTestConfig.cmake +++ b/tools/cmake/CTestConfig.cmake @@ -20,7 +20,7 @@ if(enable_compile_warnings AND enable_compile_optimizations) SET(BUILDNAME "FULL_FLAGS" CACHE INTERNAL "Buildname" FORCE) endif() -if(HAVE_MC) +if(SIMGRID_HAVE_MC) SET(BUILDNAME "MODEL-CHECKING" CACHE INTERNAL "Buildname" FORCE) endif() diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index 9cc3fc3695..f9dc6e60ea 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -53,6 +53,7 @@ set(EXTRA_DIST src/surf/network_ib.hpp src/surf/ns3/ns3_interface.h src/surf/ns3/ns3_simulator.h + src/surf/trace_mgr_test.cpp src/surf/xml/simgrid.dtd src/surf/xml/simgrid_dtd.h src/surf/xml/simgrid_dtd.c @@ -287,7 +288,6 @@ set(XBT_SRC src/xbt/xbt_os_time.c src/xbt/xbt_replay.cpp src/xbt/xbt_str.cpp - src/xbt/xbt_strbuff.c src/xbt/xbt_virtu.c src/xbt_modinter.h ) @@ -724,7 +724,6 @@ set(headers_to_install include/xbt/log.hpp include/xbt/mallocator.h include/xbt/matrix.h - include/xbt/memory.hpp include/xbt/misc.h include/xbt/mmalloc.h include/xbt/module.h @@ -732,7 +731,6 @@ set(headers_to_install include/xbt/range.hpp include/xbt/replay.hpp include/xbt/str.h - include/xbt/strbuff.h include/xbt/swag.h include/xbt/synchro.h include/xbt/sysdep.h @@ -784,7 +782,7 @@ set(simgrid_sources ${XBT_SRC} ) -if(${HAVE_JEDULE}) +if(${SIMGRID_HAVE_JEDULE}) set(simgrid_sources ${simgrid_sources} ${JEDULE_SRC}) else() set(EXTRA_DIST ${EXTRA_DIST} ${JEDULE_SRC}) @@ -794,11 +792,11 @@ if(enable_smpi) set(simgrid_sources ${simgrid_sources} ${SMPI_SRC}) endif() -if(HAVE_MC) +if(SIMGRID_HAVE_MC) set(simgrid_sources ${simgrid_sources} ${MC_SRC}) endif() -if(HAVE_NS3) +if(SIMGRID_HAVE_NS3) set(simgrid_sources ${simgrid_sources} ${NS3_SRC}) endif() @@ -812,7 +810,7 @@ if(WIN32) ) endif() -if(HAVE_LUA) +if(SIMGRID_HAVE_LUA) set(simgrid_sources ${simgrid_sources} ${LUA_SRC}) else() set(EXTRA_DIST ${EXTRA_DIST} ${LUA_SRC}) diff --git a/tools/cmake/Distrib.cmake b/tools/cmake/Distrib.cmake index 43e867b648..6a536775a3 100644 --- a/tools/cmake/Distrib.cmake +++ b/tools/cmake/Distrib.cmake @@ -121,7 +121,7 @@ add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -E echo "uninstall man ok" WORKING_DIRECTORY "${CMAKE_INSTALL_PREFIX}") -if(HAVE_LUA) +if(SIMGRID_HAVE_LUA) add_custom_command(TARGET uninstall COMMAND ${CMAKE_COMMAND} -E echo "uninstall binding lua ok" COMMAND ${CMAKE_COMMAND} -E remove -f ${CMAKE_INSTALL_PREFIX}/lib/lua/5.1/simgrid.${LIB_EXE} @@ -318,7 +318,6 @@ add_custom_target(maintainer-clean COMMAND ${CMAKE_COMMAND} -E remove -f src/simgrid_units_main.c COMMAND ${CMAKE_COMMAND} -E remove -f src/swag_unit.c COMMAND ${CMAKE_COMMAND} -E remove -f src/xbt_str_unit.c - COMMAND ${CMAKE_COMMAND} -E remove -f src/xbt_strbuff_unit.c COMMAND ${CMAKE_COMMAND} -E remove -f src/xbt_synchro_unit.c WORKING_DIRECTORY "${CMAKE_HOME_DIRECTORY}") diff --git a/tools/cmake/GCCFlags.cmake b/tools/cmake/GCCFlags.cmake index 410bcb7fac..6615daadb2 100644 --- a/tools/cmake/GCCFlags.cmake +++ b/tools/cmake/GCCFlags.cmake @@ -124,7 +124,7 @@ if(enable_model-checking AND enable_compile_optimizations) src/xbt/xbt_log_layout_format.c src/xbt/xbt_log_layout_simple.c src/xbt/dict.cpp src/xbt/dict_elm.c src/xbt/dict_cursor.c src/xbt/dynar.cpp src/xbt/heap.c src/xbt/swag.c - src/xbt/str.c src/xbt/strbuff.c src/xbt/snprintf.c + src/xbt/str.c src src/xbt/snprintf.c src/xbt/queue.c src/xbt/xbt_os_time.c src/xbt/xbt_os_thread.c src/xbt/backtrace_linux.c diff --git a/tools/cmake/MakeLib.cmake b/tools/cmake/MakeLib.cmake index c56ab59d4c..1378bd485c 100644 --- a/tools/cmake/MakeLib.cmake +++ b/tools/cmake/MakeLib.cmake @@ -39,7 +39,7 @@ if(HAVE_PTHREAD AND ${HAVE_THREAD_CONTEXTS} AND NOT APPLE) SET(SIMGRID_DEP "${SIMGRID_DEP} -pthread") endif() -if(HAVE_LUA) +if(SIMGRID_HAVE_LUA) ADD_CUSTOM_TARGET(link_simgrid_lua ALL DEPENDS simgrid ${CMAKE_BINARY_DIR}/examples/lua/simgrid.${LIB_EXE} @@ -79,11 +79,11 @@ if(HAVE_GRAPHVIZ) endif() endif() -if(HAVE_MC AND HAVE_GNU_LD AND NOT ${DL_LIBRARY} STREQUAL "") +if(SIMGRID_HAVE_MC AND HAVE_GNU_LD AND NOT ${DL_LIBRARY} STREQUAL "") SET(SIMGRID_DEP "${SIMGRID_DEP} ${DL_LIBRARY}") endif() -if(HAVE_NS3) +if(SIMGRID_HAVE_NS3) SET(SIMGRID_DEP "${SIMGRID_DEP} -lns${NS3_VERSION}-core${NS3_SUFFIX} -lns${NS3_VERSION}-csma${NS3_SUFFIX} -lns${NS3_VERSION}-point-to-point${NS3_SUFFIX} -lns${NS3_VERSION}-internet${NS3_SUFFIX} -lns${NS3_VERSION}-applications${NS3_SUFFIX}") endif() diff --git a/tools/cmake/Modules/FindLuaSimgrid.cmake b/tools/cmake/Modules/FindLuaSimgrid.cmake index 2904b9847a..1ac9d00295 100644 --- a/tools/cmake/Modules/FindLuaSimgrid.cmake +++ b/tools/cmake/Modules/FindLuaSimgrid.cmake @@ -3,7 +3,7 @@ # Input variable: # LUA_HINT: path to Lua installation -- only needed for non-standard installs # Output variable: -# HAVE_LUA : if Lua was found +# SIMGRID_HAVE_LUA : if Lua was found # LUA_LIBRARY : the path to the dynamic library # LUA_INCLUDE_DIR : where to find lua.h # LUA_VERSION_MAJOR: First part of the version (often, 5) @@ -56,7 +56,7 @@ unset(lua_version_str) # Check that we have a sufficient version of Lua if(LUA_VERSION_MAJOR EQUAL 5 AND LUA_VERSION_MINOR EQUAL 3) - set(HAVE_LUA 1) + set(SIMGRID_HAVE_LUA 1) include_directories(${LUA_INCLUDE_DIR}) else() message(FATAL_ERROR "Error: Lua version 5.3 is required, but version ${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR} found instead.") diff --git a/tools/cmake/Modules/FindNS3.cmake b/tools/cmake/Modules/FindNS3.cmake index 750400e53f..3e612567e8 100644 --- a/tools/cmake/Modules/FindNS3.cmake +++ b/tools/cmake/Modules/FindNS3.cmake @@ -16,7 +16,7 @@ # - Add "ns3.${version}-core ns3.${version}-core-debug ns3.${version}-core-optimized" to the NAME line of the find_library below # - Add "include/ns3{version}" to the PATH_SUFFIXES line of the find_path below -set(HAVE_NS3 0) +set(SIMGRID_HAVE_NS3 0) set(NS3_HINT ${ns3_path} CACHE PATH "Path to search for NS3 lib and include") find_library(NS3_LIBRARIES @@ -50,7 +50,7 @@ mark_as_advanced(NS3_LIBRARIES) if(NS3_INCLUDE_DIR) if(NS3_LIBRARIES) - set(HAVE_NS3 1) + set(SIMGRID_HAVE_NS3 1) if(NS3_LIBRARIES MATCHES "-optimized") set (NS3_SUFFIX "-optimized") elseif(NS3_LIBRARIES MATCHES "-debug") @@ -78,7 +78,7 @@ if(NS3_INCLUDE_DIR) endif() mark_as_advanced(NS3_LIBRARY_PATH) -if(HAVE_NS3) +if(SIMGRID_HAVE_NS3) link_directories(${NS3_LIBRARY_PATH}) include_directories(${NS3_INCLUDE_DIR}) else() diff --git a/tools/cmake/Tests.cmake b/tools/cmake/Tests.cmake index f207bfc5f9..c432450a3e 100644 --- a/tools/cmake/Tests.cmake +++ b/tools/cmake/Tests.cmake @@ -57,7 +57,7 @@ IF(enable_java) ENDIF() ENDIF() -IF(HAVE_MC) +IF(SIMGRID_HAVE_MC) ADD_TESH_FACTORIES(mc-bugged1 "ucontext;raw" --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged1.tesh) ADD_TESH_FACTORIES(mc-bugged2 "ucontext;raw" --setenv bindir=${CMAKE_BINARY_DIR}/examples/msg/mc --cd ${CMAKE_HOME_DIRECTORY}/examples/msg/mc bugged2.tesh) IF(HAVE_UCONTEXT_CONTEXTS AND SIMGRID_PROCESSOR_x86_64) # liveness model-checking works only on 64bits (for now ...) @@ -79,7 +79,7 @@ IF(enable_smpi_MPICH3_testsuite AND SMPI_FORTRAN AND HAVE_THREAD_CONTEXTS) SET_TESTS_PROPERTIES(test-smpi-mpich3-thread-f90 PROPERTIES PASS_REGULAR_EXPRESSION "tests passed!") ENDIF() -IF(HAVE_LUA) +IF(SIMGRID_HAVE_LUA) # Tests testing simulation from C but using lua for platform files. Executed like this # ~$ ./masterslave platform.lua deploy.lua ADD_TESH(lua-platform-masterslave --setenv srcdir=${CMAKE_HOME_DIRECTORY}/teshsuite/lua --cd ${CMAKE_BINARY_DIR}/examples/lua ${CMAKE_HOME_DIRECTORY}/teshsuite/lua/lua_platforms.tesh) @@ -87,3 +87,15 @@ IF(HAVE_LUA) ENDIF() ADD_TEST(testall ${CMAKE_BINARY_DIR}/testall) + +# New tests should use the Boost Unit Test Framework + + +if(Boost_UNIT_TEST_FRAMEWORK_FOUND) + add_executable (unit_tmgr src/surf/trace_mgr_test.cpp) + target_link_libraries(unit_tmgr simgrid ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) + ADD_TEST(unit_tmgr ${CMAKE_BINARY_DIR}/unit_tmgr --build_info=yes) + +else() + set(EXTRA_DIST ${EXTRA_DIST} src/surf/trace_mgr_test.cpp) +endif() \ No newline at end of file diff --git a/tools/cmake/UnitTesting.cmake b/tools/cmake/UnitTesting.cmake index 41ed4544ec..16701f711a 100644 --- a/tools/cmake/UnitTesting.cmake +++ b/tools/cmake/UnitTesting.cmake @@ -11,11 +11,10 @@ set(FILES_CONTAINING_UNITTESTS src/xbt/dict.cpp src/xbt/swag.c src/xbt/xbt_str.cpp - src/xbt/xbt_strbuff.c src/xbt/config.cpp ) -if(HAVE_MC) +if(SIMGRID_HAVE_MC) set(FILES_CONTAINING_UNITTESTS ${FILES_CONTAINING_UNITTESTS} src/mc/PageStore.cpp src/mc/mc_snapshot.cpp diff --git a/tools/cmake/src/internal_config.h.in b/tools/cmake/src/internal_config.h.in index 4bc7710660..b98161a411 100644 --- a/tools/cmake/src/internal_config.h.in +++ b/tools/cmake/src/internal_config.h.in @@ -66,7 +66,7 @@ /* process_vm_readv: transfer data between process address spaces */ #cmakedefine01 HAVE_PROCESS_VM_READV /* Set to true if enable_model-checking is true and the dependencies available */ -#cmakedefine01 HAVE_MC +#cmakedefine01 SIMGRID_HAVE_MC /* SMPI variables */ /* SMPI enabled */ diff --git a/tools/internal/check_dist_archive.exclude b/tools/internal/check_dist_archive.exclude index bc1ee3f22d..a87445191f 100644 --- a/tools/internal/check_dist_archive.exclude +++ b/tools/internal/check_dist_archive.exclude @@ -10,6 +10,7 @@ - doc/html/.* + BuildSimGrid.sh ++ circle.yml + \.classpath + \.cproject + \.project diff --git a/tools/internal/spell_dict.txt b/tools/internal/spell_dict.txt index 4ba5bbbbee..48cc959b4f 100644 --- a/tools/internal/spell_dict.txt +++ b/tools/internal/spell_dict.txt @@ -91,7 +91,6 @@ smpi smx src std -strbuff strerror strlen struct diff --git a/tools/internal/travis-sonarqube.sh b/tools/internal/travis-sonarqube.sh index 96558bbb6e..d76f57fc44 100755 --- a/tools/internal/travis-sonarqube.sh +++ b/tools/internal/travis-sonarqube.sh @@ -55,8 +55,8 @@ ctest -D ExperimentalCoverage # See https://docs.travis-ci.com/user/sonarqube/ for more info on tokens # don't show the token in the logs set +x -sonar-scanner -Dsonar.host.url=https://sonarqube.com -Dsonar.login=$SONAR_TOKEN \ - | grep -v 'INFO: Parsing /home/travis/build/simgrid/simgrid/Testing/CoverageInfo' \ +sonar-scanner -Dsonar.host.url=https://sonarqube.com -Dsonar.login=$SONAR_TOKEN 2>&1 \ + | grep -v 'INFO: Parsing /home/travis/build/simgrid/simgrid/Testing/CoverageInfo' \ | grep -v 'WARN: File not analysed by Sonar, so ignoring coverage: /usr/include/' exit $outcome \ No newline at end of file diff --git a/tools/simgrid.supp b/tools/simgrid.supp index 82cd7a8293..e15cfce365 100644 --- a/tools/simgrid.supp +++ b/tools/simgrid.supp @@ -72,6 +72,29 @@ fun:smpi_simulated_main_ } +#SMPI leaks the dlopen handle used for loading the program +{ + dlopen handle leaks (1/2) + Memcheck:Leak + match-leak-kinds:reachable + fun:malloc + ... + fun:dlopen@@GLIBC_* + ... + fun:main +} + +{ + dlopen handle leaks (2/2) + Memcheck:Leak + match-leak-kinds:reachable + fun:calloc + ... + fun:dlopen@@GLIBC_* + ... + fun:main +} + # Memory leaks appearing to be in libcgraph. They can be seen with the # following simple program: # ,---- diff --git a/tools/simgrid_update_xml.pl b/tools/simgrid_update_xml.pl index a67fcab931..006c1d7758 100755 --- a/tools/simgrid_update_xml.pl +++ b/tools/simgrid_update_xml.pl @@ -87,7 +87,7 @@ Several tags were renamed (for sake of XML sanity): =back -=item B Introduced in SimGrid 3.13 (this is the current version) +=item B Introduced in SimGrid 3.13 =over 4 @@ -123,6 +123,21 @@ Units are now mandatory in attributes. USE THE SCRIPT sg_xml_unit_converter.py T =back +=item B Introduced in SimGrid 3.16 (this is the current version) + +=over 4 + +=item + +Rename a few tags, but in a backward-compatible manner: the old names are still accepted. + + AS -> zone + ASroute -> zoneRoute + bypassAsRoute -> bypassZoneRoute + process -> actor + +=back + =back =head1 AUTHORS @@ -142,7 +157,7 @@ under the terms of GNU LGPL (v2.1) license. use strict; my $fromversion=-1; -my $toversion=4; +my $toversion=4.1; my $filename = $ARGV[0] or die "Usage: simgrid_update_xml.pl file_to_convert.xml\nPlease provide an XML to convert as a parameter.\n"; open INPUT, "$filename" or die "Cannot open input file $filename: $!\n"; @@ -164,10 +179,10 @@ while (defined($line = )) { $fromversion = 0; print "$filename was using version 0\n"; next if !$line =~ /\S/; - } elsif ($line =~ s///) { + } elsif ($line =~ s///) { $fromversion = $1; if ($fromversion == $toversion) { - die "Input platform file $filename is already conformant to version $fromversion. This should be a no-op.\n"; + warn "Input platform file $filename is already conformant to version $fromversion. This should be a no-op.\n"; } if ($fromversion > $toversion) { die "Input platform file $filename is more recent than this script (file version: $fromversion; script version: $toversion)\n"; @@ -225,6 +240,12 @@ while (defined($line = )) { $line =~ s/\bpower\b/speed/g; $line =~ s/\bkind="POWER"/kind="SPEED"/g; } + if ($fromversion < 4.1) { + $line =~ s/\bAS\b/zone/g; + $line =~ s/\bASroute\b/zoneRoute/g; + $line =~ s/\bbypassAsRoute\b/bypassZoneRoute/g; + $line =~ s/\bprocess\b/actor/g; + } $output_string .= "$line\n"; } diff --git a/tools/tesh/tesh.py b/tools/tesh/tesh.py index 985cadc430..70947d3204 100755 --- a/tools/tesh/tesh.py +++ b/tools/tesh/tesh.py @@ -442,6 +442,8 @@ if __name__ == '__main__': re.compile("==WARNING: ASan is ignoring requested __asan_handle_no_return: stack top:"), re.compile("False positive error reports may follow"), re.compile("For details see http://code.google.com/p/address-sanitizer/issues/detail?id=189"), + + re.compile("Python runtime initialized with LC_CTYPE=C .*"), ] TeshState().jenkins = True # This is a Jenkins build