diff --git a/CMakeLists.txt b/CMakeLists.txt index a564afe..d0ca57f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,19 +1,22 @@ cmake_minimum_required(VERSION 3.13) project(Warthog - VERSION 0.5.0 + VERSION 0.6.0 LANGUAGES CXX C) set_property(GLOBAL PROPERTY WARTHOG_warthog-core ON) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) +option(WARTHOG_POSTHOC "Compile trace support generation for posthoc" OFF) option(WARTHOG_INT128 "Enable support for __int128 on gcc and clang" OFF) option(WARTHOG_BMI "Enable support cpu BMI for WARTHOG_INTRIN_HAS(BMI)" OFF) option(WARTHOG_BMI2 "Enable support cpu BMI2 for WARTHOG_INTRIN_HAS(BMI2), use for Zen 3+" OFF) option(WARTHOG_INTRIN_ALL "Enable march=native and support x86 intrinsics if able (based on system), supersedes all manual instruction sets" OFF) +find_package(Threads REQUIRED) + include(cmake/warthog.cmake) add_library(warthog_compile INTERFACE) @@ -30,7 +33,7 @@ target_include_directories(warthog_core PUBLIC $ $ ) -target_link_libraries(warthog_core PUBLIC warthog::compile) +target_link_libraries(warthog_core PUBLIC warthog::compile Threads::Threads) include(cmake/headers.cmake) add_executable(warthog_app) @@ -47,7 +50,7 @@ add_subdirectory(apps) # warthog_top_level() -if(_is_top) +if(${_warthog_is_top}) option(BUILD_TESTING "Building testing suite" OFF) include(CTest) include(FetchContent) diff --git a/CONTRIB.md b/CONTRIB.md new file mode 100644 index 0000000..a708e1f --- /dev/null +++ b/CONTRIB.md @@ -0,0 +1,18 @@ +Contributors to the Warthog Pathfinding Library +=============================================== + +Maintainers +----------- + +Daniel Harabor @dharabor +Ryan Hechenberger @heavenfall + +Contributors +------------ + +Arthur Maheo +Shizhe Zhao +Saman Ahmadi +Mark Carlson +Thomas Nobes +Massimo Bono diff --git a/README.md b/README.md index 0179bcc..0396d95 100644 --- a/README.md +++ b/README.md @@ -8,22 +8,134 @@ Github houses the newer version, the legacy version is available at: https://bit Warthog is split in several repos, all official repos will be located within [Shortest Path Lab](https://github.com/ShortestPathLab). -### Core - Repo [warthog-core](https://github.com/ShortestPathLab/warthog-core) houses the core library of the project. -Any warthog library will require this dependency. -It contains domain, search, heuristic, scenario loaders and other core utilities. +Any project which employs warthog features will require this dependency. See `/apps` for pre-setup application that can run standard scenarios. -### JPS +Current downstream SPL projects which rely on warthog-core: + - [warthog-jps](https://github.com/ShortestPathLab/warthog-jps) + +# The Warthog Application + +## Compile + +Invoke CMake build to compile. + +Example release build commands, from project root: + +``` +cmake -B build -S . -DCMAKE_BUILD_TYPE=Release +cmake --build build -j +``` + +To enable posthoc trace generation, it must be enabled through CMake (adds small overhead). +Example setting (and then rebuild): + +``` +cmake build -DWARTHOG_POSTHOC=On +cmake --build build -j +``` + +Many parameters are configurable (most in built library not application). +They all prefixed `WARTHOTG_`. + +## Run + +Run application `build/warthog` from build commands. +See overview of commands with `build/warthog --help`. + +## Examples + + cmake -B build -S . -DCMAKE_BUILD_TYPE=Release -DWARTHOG_POSTHOC=On && cmake --build build -j + ./build/warthog --alg dijkstra --scen examples/arena2.map.scen --checkopt + ./build/warthog --alg astar --scen examples/NovaStation_Berlin.scen --checkopt + ./build/warthog --alg astar4c --scen examples/NovaStation_Berlin.scen --cost 4c --checkopt + ./build/warthog --alg astar --scen examples/NovaStation_Berlin.scen --filter=201 --dump-map=test.map --trace=test.trace.yaml + ./build/warthog --alg astar --scen examples/NovaStation_Berlin.scen --snapshot=40 --filter=1 + ./build/warthog --alg astar_wgm --scen examples/arena2.map.scen --grid-weight examples/grid.weight --cost=- + +### Command line options overview -Repo [warthog-jps](https://github.com/ShortestPathLab/warthog-jps) houses jps implementation. -Requires `warthog-core` as a dependency. +`--help` +Set this parameter to print all available program options. -# Using warthog +`--alg [name]` +Used to specify a named search algorithm. +Current supported: astar, astar_wgm, astar4c, dijkstra + +`--scen [file]` +Used to specify a scenario file for experiments. +Support for v1 & v2 scenario format, see benchmark in resources. + +`--map [file]` +Overrides map filename used in scenario. + +`--cost [type]` +Scenario v2 files holds several costs for instances, specify these costs here. +If given `-`, then remove all costs (works for both v1 and v2). +Otherwise requires v2 scenario and cost to exist or error. +If `--cost` is not supplied, uses the first cost (if present) for v2. + +`--grid-weight [file]` +For use with weighted terrain algorithm (e.g. astar_wgm). +Provide grid weights, provided `examples/grid.weight` for scenario grid +weights and `examples/terrain.weight` for MovingAI terrain maps, as +used in the jpsw paper. + +`--checkopt` +Set this parameter to compare the length of each computed path against an +optimal length value specified by the scenario file at hand. + +`--verbose` +Set this parameter to print debugging information (must be in debug config). + +`--snapshot [id]` +Default value `-1`, results in running all snapshots. +Otherwise, only run instances from snapshot `id`. +If snapshot does not exist, the program will error. +Specifying a specific snapshot will make the scenario be considered as static. +A static scenario is always static iff there is only a single snapshot, +important as offline algorithms will not run on a dynamic scenario. + +`--filter [num]` +Default value `-1`, run all instances. +Otherwise run instance `num` from scenario, as the kth instances (zero-indexed). +If used with `--snapshot`, then run instance number `num` in specified snapshot. +e.g. `--snapshot=10 --filter=0` will run the first instance on snapshot 10. +If instance does not exist, then program errors. +If specific instance is specified, then scenario will be considered as static. + +`--trace [.trace.yaml file]` +Requires `WARTHOG_POSTHOC=On`. +Generate a trace file output for use with posthoc (see resources). +The trace is only for first instance, use with `--filter` to choose instance. + +`--dump-map [file]` +Dump the gridmap at the beginning of search to `file`. +Use with `--filter` or `--snapshot` to choose the map to dump. +Useful in dynamic scenario to see current state of grid, especially if used with `--trace`. + +### Advanced Compile Features + +Library includes support for x86 intrinsics instruction support, which may +improve performance of some algorithms. +To enable, compiler must have these instructions enabled, and they must be +enabled in CMake, either `WARTHOG_INTRIN_ALL` for all or a specific +supported instruction set, more to be added when required. + +Even if BMI2 may be supported by a CPU, the instructions may be implemented +by microcode which may reduce performance instead; e.g. Zen 3 arch has some +microcoded instructions, while Zen 4 supports full BMI2. +User must determine manually if enabling is applicable. +Example below (works with gcc or clang, other systems may differ or not support): + + cmake build -DWARTHOG_INTRIN_ALL=On -DCMAKE_CXX_FLAGS="-march=native" + cmake --build build -j + +# The Warthog Library It is recommended to use warthog not as a fork, but included in an external repo. -This setup support FetchContent, git submodule and git subtree. +This setup support either FetchContent, git submodule or git subtree. ## CMake @@ -32,7 +144,7 @@ Setup a basic project using the following the commands: git init git remote add warthog-core https://github.com/ShortestPathLab/warthog-core.git git fetch warthog-core - git checkout warthog-core/main cmake/warthog.cmake + git checkout warthog-core/main -- cmake/warthog.cmake Example `CMakeLists.txt`: @@ -43,7 +155,7 @@ project(App VERSION 0.0.1 LANGUAGES CXX C) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED TRUE) # warthog modules @@ -56,6 +168,8 @@ add_executable(app main.cpp) target_link_libraries(app PUBLIC warthog::core) ``` +By default, this will fallback to FetchContent if modules are not present in `extern/`. + ## Submodule Commands for adding a module as a submodules for each repo are found below: @@ -72,16 +186,21 @@ To update the version of warthog, for warthog module `$module`: git add $module This will update the submodule to the checkout commit. -Initialise or update the submodule on other clones with -the following commands: +Initialise or update the submodule on other clones with the following commands: git submodule init # after clone git submodule update # after pull +Commit/tag should be added to the `warthog_module_declare` that match the +submodule otherwise users who do not checkout the submodules will have +a different version of that module. + ## Subtree Subtree will make the module a part of your repo, allowing -for local editing without forking. +for local editing of modules. +Modules setup with way will never have FetchContent called, so +`warthog_module_declare` is not required. The setup for each module: @@ -101,7 +220,7 @@ Calling `warthog_submodule(warthog-core)` will then add `warthog-core` to your C 2. `FetchContent_Declare` then `FetchContent_MakeAvailable(warthog-core)` otherwise 3. Error if cannot find `warthog-core` content -The `warthog_module` call only adds a module once, the following calls will be ignored. +The `warthog_module` call only adds a module once, following calls will be ignored. The submodule/subtree version only works if called in the top level project by default; if this method is preferred, then it should be added to the top level `/extern/`, can be overridden with code `warthog_module(warthog-core ON)`. @@ -116,7 +235,8 @@ FetchContent_Declare(warthog-core GIT_REPOSITORY https://github.com/ShortestPathLab/warthog-core.git GIT_TAG [main|branch|tag|commit]) ``` -This will declare what warthog-core version to fetched. + +This will declare the warthog-core version to fetched. The `warthog_module_declare` version makes it simple, although it only supports known warthog libraries. The optional second parameter sets the version to pull, by default is `main` branch. This system only support warthog 0.5 or greater. @@ -126,3 +246,4 @@ This system only support warthog 0.5 or greater. - [Moving AI Lab](https://movingai.com/): pathfinding benchmark and tools - [Posthoc](https://posthoc-app.pathfinding.ai/): visualiser and debugger for pathfinding - [Pathfinding Benchmarks](https://benchmarks.pathfinding.ai/): git repo for benchmarks +- [Dynamic Benchmarks](https://github.com/gppc-dev/benchmarks/): git repo for v2 scenarios diff --git a/apps/cfg.cpp b/apps/cfg.cpp index 12ff66b..a9d9f52 100644 --- a/apps/cfg.cpp +++ b/apps/cfg.cpp @@ -39,7 +39,7 @@ warthog::util::cfg::parse_args( std::string warthog::util::cfg::get_param_value(std::string param_name) { - std::string ret(""); + std::string ret; std::map>::iterator it = params_.find(param_name); if(it != params_.end()) diff --git a/apps/cfg.h b/apps/cfg.h index 3f804d9..8a1e8c0 100644 --- a/apps/cfg.h +++ b/apps/cfg.h @@ -1,7 +1,7 @@ #ifndef WARTHOG_APP_CFG_H #define WARTHOG_APP_CFG_H -#include "getopt.h" +#include #include #include diff --git a/apps/warthog.cpp b/apps/warthog.cpp index a5d4ef1..f4b47de 100644 --- a/apps/warthog.cpp +++ b/apps/warthog.cpp @@ -7,35 +7,41 @@ // @created: 2016-11-23 // +#include + #include #include #include #include #include #include +#include +#include +#include #include #include #include #include #include -#include +#include #include +#ifdef WARTHOG_POSTHOC +#include +#endif #include "cfg.h" #include -#include #include #include #include #include #include +#include #include #include #include -// #include "time_constraints.h" - namespace { // check computed solutions are optimal @@ -44,11 +50,24 @@ int checkopt = 0; int verbose = 0; // display program help on startup int print_help = 0; +// run only this snapshot, or -1 for all +int snapshot_id = -1; +// run only this inst, or -1 for all +int filter_id = -1; +std::string dump_map; +#ifdef WARTHOG_POSTHOC +// write trace to file, empty string to disable +std::string trace_file; +using listener_grid = ::warthog::io::grid_trace; +using listener_type = std::tuple; +#else +using listener_type = std::tuple<>; +#endif void help(std::ostream& out) { - out << "warthog version " << WARTHOG_VERSION << "\n"; + out << "warthog version " WARTHOG_VERSION "\n"; out << "==> manual <==\n" << "This program solves/generates grid-based pathfinding " "problems using the\n" @@ -60,12 +79,27 @@ help(std::ostream& out) << "\t--scen [scen file] (required) \n" << "\t--map [map file] (optional; specify this to override map " "values in scen file) \n" - << "\t--costs [costs file] (required if using a weighted " + << "\t--grid-weight [file] (required if using a weighted " "terrain algorithm)\n" + << "\t--cost [type] (default first cost from scenario if exists;\n" + "\t\tuse cost type for solution from scenario or error if not " + "exists\n" + << "\t\tpass '-' to discard all provided solution costs)\n" << "\t--checkopt (optional; compare solution costs against " "values in the scen file)\n" << "\t--verbose (optional; prints debugging info when compiled " "with debug symbols)\n" + << "\t--snapshot [id] (default -1; select all instances (-1) or only " + "instances on snapshot id)\n" + << "\t--filter [num] (default -1; run all instances (-1) or run " + "instance num;\n" + << "\t\tif used with --snapshot, is instance num in snapshot id)\n" + << "\t--dump-map [file] (optional; dump gridmap at first instance to " + "[file], use with --snapshot or --filter)\n" +#ifdef WARTHOG_POSTHOC + << "\t--trace [.trace.yaml file] (optional; write posthoc trace for " + "first instance to [file])\n" +#endif << "Invoking the program this way solves all instances in [scen " "file] with algorithm [alg]\n" << "Currently recognised values for [alg]:\n" @@ -74,28 +108,25 @@ help(std::ostream& out) bool check_optimality( - warthog::search::solution& sol, warthog::util::experiment* exp) + const warthog::search::solution& sol, + const warthog::scenario::experiment* exp) { - uint32_t precision = 2; - double epsilon = (1.0 / (int)pow(10, precision)) / 2; - double delta = fabs(sol.sum_of_edge_costs_ - exp->distance()); - - if(fabs(delta - epsilon) > epsilon) + if(!exp->distance()) { - std::stringstream strpathlen; - strpathlen << std::fixed << std::setprecision(exp->precision()); - strpathlen << sol.sum_of_edge_costs_; - - std::stringstream stroptlen; - stroptlen << std::fixed << std::setprecision(exp->precision()); - stroptlen << exp->distance(); + // unknown solution + return true; + } + constexpr int32_t precision = 2; + double epsilon = std::pow(10.0, -precision) * 0.5; + double delta = std::fabs(sol.sum_of_edge_costs_ - *exp->distance()); - std::cerr << std::setprecision(exp->precision()); + if(delta > epsilon) + { std::cerr << "optimality check failed!" << std::endl; std::cerr << std::endl; - std::cerr << "optimal path length: " << stroptlen.str() + std::cerr << "optimal path length: " << sol.sum_of_edge_costs_ << " computed length: "; - std::cerr << strpathlen.str() << std::endl; + std::cerr << *exp->distance() << std::endl; std::cerr << "precision: " << precision << " epsilon: " << epsilon << std::endl; std::cerr << "delta: " << delta << std::endl; @@ -104,22 +135,195 @@ check_optimality( return true; } +#ifdef WARTHOG_POSTHOC +#define WARTHOG_POSTHOC_DO(f) f +#else +#define WARTHOG_POSTHOC_DO(f) +#endif + +/// @brief general wrapper around scenario runner and gridmap management +/// +/// Gets given a scenario manager and handles program management of running +/// with user-provided parameters and algorithm support. +/// +/// Owns and update the gridmap over a dynamic scenario for algorithms that +/// support dynamic scenarios. +struct gridmap_scenario +{ + bool scenario_v1 = true; ///< scenario is v1 + bool grid_managed = false; ///< grid is managed by this class + bool static_scenario = false; ///< scenario is static + const warthog::scenario::scenario_manager* mgr; + warthog::scenario::scenario_runner run; + warthog::domain::gridmap grid; + warthog::scenario::grid_patch_set patches; + + gridmap_scenario(const warthog::scenario::scenario_manager& scen) + : mgr(&scen), run(&scen) + { + scenario_v1 + = mgr->get_version() == warthog::io::scenario_version::VERSION_1; + static_scenario = mgr->is_static_scenario(); + } + + /// @brief loads the map to current state + /// @param file map filename (single or patches) + /// @return true on success, false otherwise + bool + load_map(const std::filesystem::path file) + { + grid_managed = true; + if(!patches.load(file)) { return false; } + if(!run.gridmap_init(grid, patches)) { return false; } + return true; + } + + /// @brief will update to runner based on user-provided parameters + /// @param snapshot_id set map to match snapshot + /// @param filter_id if snapshot_id==-1, set map to match at instance id + /// @return true on success, false otherwise + bool + setup_runner(int snapshot_id, int filter_id) + { + if(snapshot_id != -1) + { + // goto snapshot_id + static_scenario = true; + while(run.get_snapshot_at() != snapshot_id) + { + // ran out of snapshots + if(run.complete()) + { + WARTHOG_GWARN_FMT( + "scenario complete before reaching snapshot {}", + snapshot_id); + return false; + } + // apply snapshot + run.snapshot_next(true); + run.snapshot_patches(false); + if(!apply_patches()) { return false; } + } + } + + if(filter_id != -1) + { + // skip next filter_id instances + static_scenario = true; + auto [exp, patches] = run.experiment_next(filter_id + 1, false); + if(run.complete() || exp == nullptr) + { + WARTHOG_GWARN_FMT( + "scenario complete before reaching filter {}", filter_id); + return false; + } + if(snapshot_id != -1 && run.get_snapshot_at() != snapshot_id) + { + WARTHOG_GWARN_FMT( + "scenario filter {} exceeded snapshot {} instances", + filter_id, snapshot_id); + return false; + } + } + + // update gridmap to match patch + if(!apply_patches()) { return false; } + + return true; + } + + /// @brief apply patches from runner to owned grid (if managed) + /// @return true on success, false otherwise + bool + apply_patches() + { + if(!grid_managed) return true; + if(int c = run.gridmap_apply_patches(grid, patches); c < 0) + { + c = -c - 1; + auto p = run.get_patches()[c]; + WARTHOG_GWARN_FMT( + "failed to apply patch {} at ({},{})", p.patch_id, p.topleft_x, + p.topleft_y); + return false; + } + return true; + } + + /// @brief will update the grid for dynamic scenarios + /// @return true on success, false otherwise + bool + dynamic_grid_update() + { + if(!grid_managed) return true; + return apply_patches(); + } +}; + template int run_experiments( - Search& algo, std::string alg_name, - warthog::util::scenario_manager& scenmgr, bool verbose, bool checkopt, - std::ostream& out) + Search& algo, std::string alg_name, gridmap_scenario& scen, bool verbose, + bool checkopt, std::ostream& out) { + WARTHOG_GINFO_FMT("start search with algorithm {}", alg_name); warthog::search::search_parameters par; warthog::search::solution sol; auto* expander = algo.get_expander(); - if(expander == nullptr) return 1; - out << "id\talg\texpanded\tgenerated\treopen\tsurplus\theapops" + if(expander == nullptr) return (int)std::errc::invalid_argument; + + out << "id\tsnapshot\talg\texpanded\tgenerated\treopen\tsurplus\theapops" << "\tnanos\tplen\tpcost\tscost\tmap\n"; - for(unsigned int i = 0; i < scenmgr.num_experiments(); i++) + + for(uint32_t i = 0;; ++i) { - warthog::util::experiment* exp = scenmgr.get_experiment(i); +#ifdef WARTHOG_POSTHOC + std::optional + trace_stream; // open and pass to trace if used + +#endif + auto [exp, patch_count] = scen.run.experiment_next(); + if(exp == nullptr) { break; } + // check if only run one instance + if(filter_id >= 0 && i != 0) { break; } + // check if instance is on snapshot + if(snapshot_id >= 0 && scen.run.get_snapshot_at() != snapshot_id) + { + break; + } + + if(patch_count != 0) + { + if(!scen.dynamic_grid_update()) + { + // failed to apply patches, exit + WARTHOG_GCRIT("dynamic patch error: failed to apply patches"); + return (int)std::errc::io_error; + } + } + + // special actions on first scenario + if(i == 0) + { + // print map + if(!dump_map.empty()) { scen.grid.save(dump_map, false); } + // trace +#ifdef WARTHOG_POSTHOC + if constexpr(std::same_as< + listener_type, + std::remove_cvref_t< + decltype(algo.get_listeners())>>) + { + if(!trace_file.empty()) + { + listener_grid& l + = std::get(algo.get_listeners()); + trace_stream.emplace(trace_file); + l.open(*trace_stream); + } + } +#endif + } warthog::pack_id startid = expander->get_pack(exp->startx(), exp->starty()); @@ -129,100 +333,180 @@ run_experiments( sol.reset(); algo.get_path(&pi, &par, &sol); + // check for no solution + if(sol.sum_of_edge_costs_ >= warthog::COST_MAX) + { + sol.sum_of_edge_costs_ = -1; + } + +#ifdef WARTHOG_POSTHOC + if constexpr(std::same_as< + listener_type, + std::remove_cvref_t>) + { + if(trace_stream.has_value()) + { + // close + std::get(algo.get_listeners()).close(); + } + } +#endif - out << i << "\t" << alg_name << "\t" << sol.met_.nodes_expanded_ - << "\t" << sol.met_.nodes_generated_ << "\t" - << sol.met_.nodes_reopen_ << "\t" << sol.met_.nodes_surplus_ - << "\t" << sol.met_.heap_ops_ << "\t" + out << scen.run.get_experiment_at() << "\t" + << scen.run.get_snapshot_at() << "\t" << alg_name << "\t" + << sol.met_.nodes_expanded_ << "\t" << sol.met_.nodes_generated_ + << "\t" << sol.met_.nodes_reopen_ << "\t" + << sol.met_.nodes_surplus_ << "\t" << sol.met_.heap_ops_ << "\t" << sol.met_.time_elapsed_nano_.count() << "\t" - << (sol.path_.size() - 1) << "\t" << sol.sum_of_edge_costs_ << "\t" - << exp->distance() << "\t" << scenmgr.last_file_loaded() - << std::endl; + << (!sol.path_.empty() ? sol.path_.size() - 1 : 0) << "\t" + << sol.sum_of_edge_costs_ << "\t"; + if(exp->distance()) + out << *exp->distance(); + else + out << '-'; + out << "\t" << scen.mgr->last_file_loaded() << std::endl; if(checkopt) { - if(!check_optimality(sol, exp)) return 4; + if(!check_optimality(sol, exp)) + { + WARTHOG_GCRIT("search error: failed suboptimal 4"); + return (int)std::errc::result_out_of_range; + } } } + WARTHOG_GINFO_FMT( + "search complete; total memory: {}", algo.mem() + scen.mgr->mem()); return 0; } int run_astar( - warthog::util::scenario_manager& scenmgr, std::string mapname, + warthog::scenario::scenario_manager& scenmgr, std::string mapname, std::string alg_name) { - warthog::domain::gridmap map(mapname.c_str()); - warthog::search::gridmap_expansion_policy expander(&map); - warthog::heuristic::octile_heuristic heuristic(map.width(), map.height()); + gridmap_scenario scen(scenmgr); + // load the base map/patch set + if(!scen.load_map(std::filesystem::path(mapname))) + { + WARTHOG_GCRIT("failed to load map"); + return (int)std::errc::io_error; + } + // init runner to start at correct instance and update the map + if(!scen.setup_runner(snapshot_id, filter_id)) + { + WARTHOG_GCRIT("failed to setup scenario"); + return (int)std::errc::io_error; + } + warthog::search::gridmap_expansion_policy expander(&scen.grid); + warthog::heuristic::octile_heuristic heuristic( + scen.grid.width(), scen.grid.height()); warthog::util::pqueue_min open; - warthog::search::unidirectional_search astar(&heuristic, &expander, &open); + warthog::search::unidirectional_search astar( + &heuristic, &expander, &open, + listener_type(WARTHOG_POSTHOC_DO(&scen.grid))); - int ret = run_experiments( - astar, alg_name, scenmgr, verbose, checkopt, std::cout); - if(ret != 0) - { - std::cerr << "run_experiments error code " << ret << std::endl; - return ret; - } - std::cerr << "done. total memory: " << astar.mem() + scenmgr.mem() << "\n"; - return 0; + int ret + = run_experiments(astar, alg_name, scen, verbose, checkopt, std::cout); + return ret; } int run_astar4c( - warthog::util::scenario_manager& scenmgr, std::string mapname, + warthog::scenario::scenario_manager& scenmgr, std::string mapname, std::string alg_name) { - warthog::domain::gridmap map(mapname.c_str()); - warthog::search::gridmap_expansion_policy expander(&map, true); + gridmap_scenario scen(scenmgr); + // load the base map/patch set + if(!scen.load_map(std::filesystem::path(mapname))) + { + WARTHOG_GCRIT("failed to load map"); + return (int)std::errc::io_error; + } + // init runner to start at correct instance and update the map + if(!scen.setup_runner(snapshot_id, filter_id)) + { + WARTHOG_GCRIT("failed to setup scenario"); + return (int)std::errc::io_error; + } + warthog::search::gridmap_expansion_policy expander(&scen.grid, true); warthog::heuristic::manhattan_heuristic heuristic( - map.width(), map.height()); + scen.grid.width(), scen.grid.height()); warthog::util::pqueue_min open; - warthog::search::unidirectional_search astar(&heuristic, &expander, &open); + warthog::search::unidirectional_search astar( + &heuristic, &expander, &open, + listener_type(WARTHOG_POSTHOC_DO(&scen.grid))); - int ret = run_experiments( - astar, alg_name, scenmgr, verbose, checkopt, std::cout); - if(ret != 0) - { - std::cerr << "run_experiments error code " << ret << std::endl; - return ret; - } - std::cerr << "done. total memory: " << astar.mem() + scenmgr.mem() << "\n"; - return 0; + int ret + = run_experiments(astar, alg_name, scen, verbose, checkopt, std::cout); + return ret; } int run_dijkstra( - warthog::util::scenario_manager& scenmgr, std::string mapname, + warthog::scenario::scenario_manager& scenmgr, std::string mapname, std::string alg_name) { - warthog::domain::gridmap map(mapname.c_str()); - warthog::search::gridmap_expansion_policy expander(&map); + gridmap_scenario scen(scenmgr); + // load the base map/patch set + if(!scen.load_map(std::filesystem::path(mapname))) + { + WARTHOG_GCRIT("failed to load map"); + return (int)std::errc::io_error; + } + // init runner to start at correct instance and update the map + if(!scen.setup_runner(snapshot_id, filter_id)) + { + WARTHOG_GCRIT("failed to setup scenario"); + return (int)std::errc::io_error; + } + warthog::search::gridmap_expansion_policy expander(&scen.grid); warthog::heuristic::zero_heuristic heuristic; warthog::util::pqueue_min open; - warthog::search::unidirectional_search astar(&heuristic, &expander, &open); + struct dijkstra_traits + { + using observer = listener_type; + static consteval auto + ac() + { + return warthog::search::admissibility_criteria::optimal; + } + }; + warthog::search::unidirectional_search< + decltype(heuristic), decltype(expander), decltype(open), + dijkstra_traits> + dijkstra( + &heuristic, &expander, &open, + listener_type(WARTHOG_POSTHOC_DO(&scen.grid))); int ret = run_experiments( - astar, alg_name, scenmgr, verbose, checkopt, std::cout); - if(ret != 0) - { - std::cerr << "run_experiments error code " << ret << std::endl; - return ret; - } - std::cerr << "done. total memory: " << astar.mem() + scenmgr.mem() << "\n"; - return 0; + dijkstra, alg_name, scen, verbose, checkopt, std::cout); + return ret; } int run_wgm_astar( - warthog::util::scenario_manager& scenmgr, std::string mapname, + warthog::scenario::scenario_manager& scenmgr, std::string mapname, std::string alg_name, std::string costfile) { + gridmap_scenario scen(scenmgr); + // do not load map here + if(!scen.scenario_v1) + { + WARTHOG_GCRIT_FMT( + "algorithm {} requires scenario file to be version 1", alg_name); + return (int)std::errc::invalid_argument; + } + // init runner to start at correct instance and update the map + if(!scen.setup_runner(snapshot_id, filter_id)) + { + WARTHOG_GCRIT("failed to setup scenario"); + return (int)std::errc::io_error; + } warthog::util::cost_table costs(costfile.c_str()); warthog::domain::vl_gridmap map(mapname.c_str()); warthog::search::vl_gridmap_expansion_policy expander(&map, costs); @@ -232,23 +516,17 @@ run_wgm_astar( double lowest_cost = costs.lowest_cost(map); if(std::isnan(lowest_cost)) { - std::cerr << "err; costs file does not specify cost of some terrains" - << std::endl; - exit(1); + WARTHOG_GCRIT( + "grid weights file does not specify cost of some terrains"); + return (int)std::errc::io_error; } heuristic.set_hscale(lowest_cost); warthog::search::unidirectional_search astar(&heuristic, &expander, &open); - int ret = run_experiments( - astar, alg_name, scenmgr, verbose, checkopt, std::cout); - if(ret != 0) - { - std::cerr << "run_experiments error code " << ret << std::endl; - return ret; - } - std::cerr << "done. total memory: " << astar.mem() + scenmgr.mem() << "\n"; - return 0; + int ret + = run_experiments(astar, alg_name, scen, verbose, checkopt, std::cout); + return ret; } } // namespace @@ -258,14 +536,21 @@ main(int argc, char** argv) { // parse arguments warthog::util::param valid_args[] - = {{"alg", required_argument, 0, 1}, + = {{"alg", required_argument, 0, 0}, {"scen", required_argument, 0, 0}, - {"map", required_argument, 0, 1}, + {"map", required_argument, 0, 0}, + {"grid-weight", required_argument, 0, 0}, // {"gen", required_argument, 0, 3}, {"help", no_argument, &print_help, 1}, {"checkopt", no_argument, &checkopt, 1}, + {"cost", required_argument, 0, 0}, {"verbose", no_argument, &verbose, 1}, - {"costs", required_argument, 0, 1}, + {"snapshot", required_argument, &snapshot_id, 1}, + {"filter", required_argument, &filter_id, 1}, + {"dump-map", required_argument, 0, 0}, +#ifdef WARTHOG_POSTHOC + {"trace", required_argument, 0, 0}, +#endif {0, 0, 0, 0}}; warthog::util::cfg cfg; @@ -280,17 +565,33 @@ main(int argc, char** argv) std::string sfile = cfg.get_param_value("scen"); std::string alg = cfg.get_param_value("alg"); // std::string gen = cfg.get_param_value("gen"); - std::string mapfile = cfg.get_param_value("map"); - std::string costfile = cfg.get_param_value("costs"); - - // if(gen != "") - // { - // warthog::util::scenario_manager sm; - // warthog::domain::gridmap gm(gen.c_str()); - // sm.generate_experiments(&gm, 1000) ; - // sm.write_scenario(std::cout); - // exit(0); - // } + std::string mapfile = cfg.get_param_value("map"); + std::string costtype = cfg.get_param_value("cost"); + std::string weightsfile = cfg.get_param_value("grid-weight"); + dump_map = cfg.get_param_value("dump-map"); + + if(snapshot_id == 1) + { + if(warthog::util::parse_token( + cfg.get_param_value("snapshot"), snapshot_id) + != std::errc{}) + { + WARTHOG_GERROR_FMT("invalid --snapshot argument {}", snapshot_id); + return (int)std::errc::invalid_argument; + } + } + if(filter_id == 1) + { + if(warthog::util::parse_token(cfg.get_param_value("filter"), filter_id) + != std::errc{}) + { + WARTHOG_GERROR_FMT("invalid --filter argument {}", filter_id); + return (int)std::errc::invalid_argument; + } + } +#ifdef WARTHOG_POSTHOC + trace_file = cfg.get_param_value("trace"); +#endif // running experiments if(alg == "" || sfile == "") @@ -300,36 +601,44 @@ main(int argc, char** argv) } // load up the instances - warthog::util::scenario_manager scenmgr; - scenmgr.load_scenario(sfile.c_str()); + warthog::scenario::scenario_manager scenmgr; + scenmgr.set_cost_type(costtype); + try + { + scenmgr.load_scenario(sfile.c_str()); + } + catch(const std::runtime_error& e) + { + return (int)std::errc::io_error; + } if(scenmgr.num_experiments() == 0) { - std::cerr << "err; scenario file does not contain any instances\n"; - return 1; + WARTHOG_GCRIT("scenario file does not contain any instances"); + return (int)std::errc::invalid_argument; } // the map filename can be given or (default) taken from the scenario file if(mapfile == "") { // first, try to load the map from the scenario file - mapfile = warthog::util::find_map_filename(scenmgr, sfile); + mapfile = warthog::scenario::find_map_filename(scenmgr, sfile); if(mapfile.empty()) { std::cerr << "could not locate a corresponding map file\n"; help(std::cout); return 0; } + WARTHOG_GINFO_FMT("deduced mapfile: ", mapfile); } - std::cerr << "mapfile=" << mapfile << std::endl; if(alg == "dijkstra") { return run_dijkstra(scenmgr, mapfile, alg); } else if(alg == "astar") { return run_astar(scenmgr, mapfile, alg); } else if(alg == "astar4c") { return run_astar4c(scenmgr, mapfile, alg); } else if(alg == "astar_wgm") { - return run_wgm_astar(scenmgr, mapfile, alg, costfile); + return run_wgm_astar(scenmgr, mapfile, alg, weightsfile); } - std::cerr << "err; invalid search algorithm: " << alg << "\n"; - return 1; + WARTHOG_GCRIT_FMT("invalid search algorithm: ", alg); + return (int)std::errc::invalid_argument; } diff --git a/cmake/config.h.in b/cmake/config.h.in index b2c1f33..85e3736 100644 --- a/cmake/config.h.in +++ b/cmake/config.h.in @@ -5,6 +5,7 @@ #define WARTHOG_VERSION_MINOR @CMAKE_PROJECT_VERSION_MINOR@ #define WARTHOG_VERSION_REVISON @CMAKE_PROJECT_VERSION_PATCH@ +#cmakedefine WARTHOG_POSTHOC #cmakedefine WARTHOG_INT128 #cmakedefine WARTHOG_INTRIN_ALL #cmakedefine WARTHOG_BMI diff --git a/cmake/headers.cmake b/cmake/headers.cmake index b7d60c5..2aae87c 100644 --- a/cmake/headers.cmake +++ b/cmake/headers.cmake @@ -26,15 +26,26 @@ include/warthog/heuristic/manhattan_heuristic.h include/warthog/heuristic/octile_heuristic.h include/warthog/heuristic/zero_heuristic.h -include/warthog/io/grid.h +include/warthog/io/bittable_serialize.h +include/warthog/io/fwd.h +include/warthog/io/grid_trace.h +include/warthog/io/log.h +include/warthog/io/observer.h +include/warthog/io/posthoc_trace.h +include/warthog/io/scenario_serialize.h +include/warthog/io/serialize_base.h +include/warthog/io/stream_observer.h include/warthog/memory/arraylist.h include/warthog/memory/bittable.h include/warthog/memory/cpool.h include/warthog/memory/node_pool.h -include/warthog/search/dummy_filter.h -include/warthog/search/dummy_listener.h +include/warthog/scenario/experiment.h +include/warthog/scenario/grid_patch_set.h +include/warthog/scenario/scenario_manager.h +include/warthog/scenario/scenario_runner.h + include/warthog/search/expansion_policy.h include/warthog/search/gridmap_expansion_policy.h include/warthog/search/noop_search.h @@ -51,16 +62,10 @@ include/warthog/search/vl_gridmap_expansion_policy.h include/warthog/util/cast.h include/warthog/util/cost_table.h include/warthog/util/dimacs_parser.h -include/warthog/util/experiment.h -include/warthog/util/file_utils.h -include/warthog/util/gm_parser.h include/warthog/util/helpers.h include/warthog/util/intrin.h -include/warthog/util/log.h -include/warthog/util/macros.h include/warthog/util/pqueue.h -include/warthog/util/scenario_manager.h +include/warthog/util/string.h include/warthog/util/template.h include/warthog/util/timer.h -include/warthog/util/vec_io.h ) diff --git a/examples/NovaStation_Berlin.patch b/examples/NovaStation_Berlin.patch new file mode 100644 index 0000000..b912898 --- /dev/null +++ b/examples/NovaStation_Berlin.patch @@ -0,0 +1,27625 @@ +type patch +patches 2068 +patch 0 +height 512 +width 512 +map +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........@@@@@@@...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................@@@@@@@...@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................................................@@@@@@@@...@@@@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........@@@@@@@@...................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................................................@@@@@@@@@..@@@@@.........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........@@@@@@@@.....................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................................@@@@@@@.@@@@@@@.........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............@@@@@@@@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................................@@@@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................................................................@@@@@@@..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................................................@@@@@@.................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@..............................................................................................................................@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@..............................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@...............................................................................................................................@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................................................................................@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@.................................................................................................................................@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................................................................................................@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@...................................................................................................................................@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................................................................................@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@.............................................................................................................................@......@@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................................................................................@@@@@@@@@@@@@@@ +@@@@@@@@@@@@..............................................................................................................................@@...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................................................................................................................@@@@@@@@@@@@@ +@@@@@@@@@@..............................................................................................................................@@@@.....................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................................................................................................@@@@@@@@@@@ +@@@@@@@@................................................................................................................................@@@@@.......................@...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@...........................................................................................................................................@@@@@@@@@ +@@@@@@..................................................................................................................................@@@@@...................@@@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@@.............................................................................................................................................@@@@@@@ +@@@@...................................................................................................................................@@@@@@...................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@@@@..............................................................................................................................................@@@@@ +@@..............................................................................................................................................................@@@@@@..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@@@@@@...............................................................................................................................................@@@ +.........................................................................................................................................@.....................@@@@@.......@...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........@@@@@@.................................................................................................................................................. +.....................................................................................................................................@@@@@.@.............................@@@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........@@@@@@@........@......................................................................................................................................... +...................................................................................................................................@@@@@@@@@..@.........................@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................@@@@........................................................................................................................................ +..................................................................................................................................@@@@@@@@@@@@@@........................@@@@............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................@@@@........................................................................................................................................ +.............@..................................................................................................................@@@@@@@@...@@@@@..@....................@@@@............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................@@@@........................................................................................................................................ +.........@@@@@................................................................................................................@@@@@@@.....@@@@@@@@@.@....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................@@@@@........................................................................................................................................ +........@@@@@@@.............................................................................................................@@@@@@@@..........@@@@@@@@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................@@@@@@........................................................................................................................................ +........@@@@@@@...........................................................................................................@@@@@.................@@@@@@.@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................................................................................ +........@@@@@@@.........................................................................................................@@@@@..................@@@.@@@@@@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@....................................................................................................................................... +........@@@@@@@.......................................................................................................@@@@@.......................@@@@@@@.@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................................@@@..@.................................................................................................................................... +........@@@@@@@......................................................................................................@@@@..........................@@@@@@@@.@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@.@.................................................................................................................................. +.......@@@@@@@@....................................................................................................@@@@@...............................@@@@@@..@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@.@................................................................................................................................ +........@@@@@...................................................................................................@@@@@@@.................................@@@@@@@@@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@...@@@@@@..@...................................................................................................................@......... +.............................................................................................................@@@@@@@@.....................................@@@@@@@..@....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@@@@.......@@@@@@@.@..............................................................................................................@@@@......... +..........................................................................................................@@@@@@@@@.........................................@@@@@@@@.@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@@@@@...........@@@@@@@@...........................................................................................................@@@@@@......... +.........................................................................................................@@@@@@.................................................@@@@@@.@.................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@.................@@@@@@.@........................................................................................................@@@@@@@......... +........................................................................................................@@@@@@@..@................................................@@@@@@.@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@................@@@.@@@@@@.......................................................................................................@@@@@@@......... +........................................................................................................@@@@@@@@@@.@................................................@@@@@@.@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................................@@@@@.......................@@@@@@@..@....................................................................................................@@@@@@@......... +........................................................................................................@@@@@@@@@@@@.@................................................@@@@@@..@..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................@@@@@..........................@@@@@@@@@.@..................................................................................................@@@@@@@......... +........................................................................................................@@@@@@@@@@@@@@.@...............................................@@@@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@@................................@@@@@@.@................................................................................................@@@@@@@......... +.......................................................................................................@@@@@@@@@@@@@@@@@@..................................................@@@@@.@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@.....................................@@@@@@..@............................................................................................@@@@@@@.......... +........................................................................................................@@@@@@@@@@@@@@@@@.................................................@@@@@@@@.@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@@.......................................@@@@@@@..@.......................................................................................................... +.........................................................................................................@@@@@@@@@@@@@@@@.....................................................@@@@@@..@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................@@@@@@.............................................@@@@@@@@@......................................................................................................... +...........................................................................................................@@@@@@@@@@@@@.......................................................@@@@@@@@@.................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................@@@@@@.................................................@@@@@@@........................................................................................................ +.............................................................................................................@@@@@@@@@@............................................................@@@@@@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@.................................................@@@@@@@........................................................................................................ +................................................................................................................@@@@@@............................................................@@@@@@@.@.....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................................@@@@@@@.................................................@@@@@@@@@@........................................................................................................ +................................................................................................................@@@@@@................................................................@@@@@.@..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................................@@@@@@@@................................................@@@@@@@@@@@@........................................................................................................ +...............................................................................................................@@@@....................................................................@@@@@@..@.................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@...................................................@@@@@@@@@@@@@@........................................................................................................ +..............................................................................................................@@@@......................@...@...........................................@@@@@@@@.@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@...................................................@@@@@@@@@@@@@@@@........................................................................................................ +.............................................................................................................@@@@...................@@@@@..@@@............................................@@@@@@@@.@....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................................@@@@@....................................................@@@@@@@@@@@@@@@@......................................................................................................... +...........................................................................................................@@@@@@..................@@@@@@@@@@@.@............................................@@@@@@@@..@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................................@@@@@.....................................................@@@@@@@@@@@@@@@@.......................................................................................................... +.........................................................................................................@@@@@@...................@@@@@@@@@@@@@@...............................................@@@@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@@.......................................................@@@@@@@@@@@@@............................................................................................................ +..........................................................................................................@@@@...................@@@@@@@@@@@@@@@@...@........................@.....................@@@@@..@.....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@...........................................................@@@@@@@@@@.............................................................................................................. +................................................................................................................................@@@@@@@@@@@@@@@@@..@@@....................@@@@@...................@@@@@@@@@.@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@@.............................................................@@@@@@................................................................................................................ +...............................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@.@.................@@@@@@.......................@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................@@@@@@................................................................@@@@@@@@............................................................................................................... +..............................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@................@@@@@@@.........................@@@@@@.@.................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@....................................................................@@@@@@.............................................................................................................. +.............................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...............@@@@@.........................@@@.@@@@@..@....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@...................................................@.................@@@@@@............................................................................................................. +............................................................................................................................@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@..@.............................................@@@@@@@@@..@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................@@@@@@@@@@.................................................@@@@@@@..................@@@@.@........................................................................................................... +..........................................................................................................................@@@@@@@@@@@....@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@.....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@................................................@@@@@@@@@@................@@@@@@@@.......................................................................................................... +..........................................................................................................................@@@@@@@@@@.......@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@..................................@@@@@@@...................................................@@@@@@@@@@@@@.................@@@@@@.......................................................................................................... +....@................................................................................................@...................@@@@@@@@@@...........@@@@@@@@@@@@@@@@@@.@...............................................@@@@@@@........................................@@@@@@@@@@@@@@@@........................................@@@@@@@.................................................@@@@@@@@@@@@@@@@.................@@@@........................................................................................................... +@@@@@.........................................................................................@@@@@@@@.....................................@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@.......................................@@@@@@@@@@@@@@@@@.....................................@@@@@@....................................................@@@@@@@@@@@@@@@@@@............................................................................................................................... +@@@@@.@.....................................................................................@@@@@@@@@@@....................................@@@@@@@@@@@@@@@@@@@@@@@@..@......................................@@@@@@@@@@@@..........................................@@@@@@@@@@@@......................................@@@@@....................................................@@@@@@@@@@@@@@@@@@@@@.............................................................................................................................. +@@@@@@@@.................................................................................@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..................................@@@@@@@@@@@@@@.........................................@@@@@@...........................................@@@@@....................................................@@@@@@@@@@@@@@@@@@@@@@@@............................................................................................................................. +@@@@@@@@.@..............................................................................@@@@@@@@@@@@@@@@.@..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................@@@@@@@@@@@@@@@@.........................................................................................@@@@@@..@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@.................................................................................. +@@@@@@@@@@.@..........................................................................@@@@@@@@@@@@@@@@@@@@.@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@........................@@@@@@@@@@@@@@@@@@@........................................................................................@@@@@@@@@@..@..........................................@@@@@@@@@@@@@@@@..@@@@@@@@@@@.@.............................@@@@@@@@@@@.................................................................................. +@@@@@@@@@@@@.@.......................................................................@@@@@@@@@@@@@@@@@@@@@@@.@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..@..................@@@@@@@@@@@@@@@@@@@@@.........................................................................................@@@@@@@@@@@@@.@......................................@@@@@@@@@@@@@@@@.....@@@@@@@@@@@@.............................@@@@@@@@@@@@................................................................................. +@@@@@@@@@@@@@@.@..................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................@@@@@@@@@@@@@@@@@@@@...........................................................................................@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@........@@@@@@@@@@@...........................@@@@@@@@@@@@@@@................................................................................ +@@@@@@@@@@@@@@@@....@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............@@@@@@@@@@@@@@@@@@@@@...........................................................................................@@@@@@@@@@@@@@@@.@..............................@@@@@@@@@@@@@@@@@...@.......@@@@@@@@@@..........................@@@@@@@@@@@@@@@@.@.............................................................................. +@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..........@@@@@@@@@@@@@@@@@@................................................................................................@@@@@@@@@@@@@@@@@@@@...........................@@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@@@@@@@@@@@@@@@@@@.@......................................................................@@@@@@ +@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.....@@@@@@@@@@@@@@@@@@@...................................................................................................@@@@@@@@@@@@@@@@@@@..@......................@@@@@@@@@@@@@@@@@@@@@@@@@.@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@.@....................................................................@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..@@@@@@@@@@@@@@@@@@.......................................................................................................@@@@@@@@@@@@@@@@@@@@.@..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@@@@@@@..........................................................................................................@@@@@@@@@@@@@@@@@@@@@.@..............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................................@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................................................................@@@@@@@@@@@@@@@@@@@..@..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................................................................@@@@@@@@@@@@@@@@@@@@.@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................................................................................................@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................................@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@.........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...............................................................@...........................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@...................................................@@@@@@@@@@......................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................@@@@@@@@@@.@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@.....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..........................................@@@@@@@@@@@@@@@@@@@@@@@@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.....................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@......................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..........................@...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@....................@@@@@@.................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..................@@@@@@...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................@@@@@@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............@@@@@............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@@@@@@@@@@@ +................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@..........................................@@@@@@@@@@@@@@@@ +...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@ +...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@@@@@@@@@@ +.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@.@@@@@@@@ +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@ +..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@@@ +..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@ +.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................ +................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................. +..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................ +..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.......................................... +.........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@........................................ +........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@................................... +..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@................................ +............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................. +...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................. +..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.......................... +.................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................... +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................... +.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................... +.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................ +................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................. +....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +@@@@@.@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................. +@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +@@@@@@@@@@@@.@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +@@@@@@@@@@@@@@.@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................... +@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................ +@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@ +@@@@@@@@@@@@@@@@@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@ +@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@ +................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@ +..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@ +..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@@@@@@@@@@@@ +.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@@@ +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................@@@@@@@@@ +......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................@@@@@@@ +....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@ +..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................ +................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@........................................... +..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................... +..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@......................................... +.........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@.................................. +...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................. +...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................. +.................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@........................... +..............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................... +............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@......................... +..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................ +..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@................... +.........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@................ +...........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................ +............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................ +................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................. +................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................... +...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................... +........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................... +.......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................ +.........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................ +............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................ +................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +.................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................. +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................... +................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................... +....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................@............................... +@@@@@..@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............@@@.........................@@@@@@ +@@@@@@@@.....................................@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................@@@@........................@@@@@@ +@@@@@@@@.................................@@@@@@.........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................@@@@@@@......................@@@@@@@ +@@@@@@@.................................@@@@@@@.........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................@@@@@@@.....................@@@@@@@@ +@@@@@...................................@@@@@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......................@@@@@@@...................@@@@@@@@@@ +@@@.....................................@@@@@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................@@@@@@@@..................@@@@@@@@@@@ +@......................................@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................@@@@@@...............@@@@@@@@@@@@@@ +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@.......................@@@@.................@@@@@@@@@@@@@@@ +..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@ +..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@ +.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@ +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@..........................................@@@@@@@@ +......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@@@@ +....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@ +.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@. +................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................. +..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................ +..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.......................................... +.........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@........................................ +........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@.................................. +......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................. +.....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................. +..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +..................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................. +.................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................ +...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.......................... +....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@........................ +........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...................... +.......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.................... +..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.................. +.........................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................. +................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................. +...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................... +..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................... +.................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................... +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................ +........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................... +.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................. +................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................ +@@@@@@.@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +@@@@@@@@@@@@@.@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................ +@@@@@@@@@@@@@@@@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................ +@@@@@@@@@@@@@@@@....@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................ +@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@ +@@@@@@@@@@@@@@@@@@@@@.@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@@@@@@...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................................................................................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................................................................................................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................................................................................................................@@@@@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................................................................................................................................................@@@@@@@@@.......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........@@@@@@..........................................................................................................................................................................@@@@@@..........@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........@..............................................................................................................................................................................................@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@.@.........................................................................................................................................................................................@@@@.@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................................................................................................................................................@@@@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@.@...................................................................................................................................................................................@@@@@@@@@@@@@.@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@.@..............................................................................................................................................................................@@@@@@@....@@@@@....@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......@@@@@@@@.@..........................................................................................................................................................................@@@@@@@.....@@@@@@@@@@@..@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........@@@@@@@@@..@.....................................................................................................................................................................@@@@@@@...........@@@@@@@@@@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............@@@@@@@@@..................................................................................................................................................................@@@@@.................@@@@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................@@@@@@...............................................................................................................................................................@@@@@....................@@@@@@@.@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................@@@@@@@.@...........................................................................................................................................................@@@@@........................@@@@@@@.@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................@@@@@.@.......................................................................................................................................................@@@@@.............................@@@@@@..@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................@@@@@@..@.................................................................................................................................................@@@@@@@...............................@@@@@@@@@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@..@.............................................................................................................................................@@@@@......................................@@@@@@.......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................@@@@@@@@@.@.........................................................................................................................................@@@@@@@.....................................@@@@@@@..@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................@@@@@@@@@@......................................................................................................................................@@@@@.............................................@@@@@@.@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@.@.................................................................................................................................@@@@@@@................................................@@@@@@.@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@.@@@@@..@.............................................................................................................................@@@@@.....................................................@@@@@@....@...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................................@@@@@@@@@..@.......................................................................................................................@@@@@@@@........................@..............................@@@@@@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@..........................................@.............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@...................................................................................................................@@@@@@@.........................@@@@@...............................@@@@@@@@@@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@...............................................@@@@@............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@.................................................................................................................@@@@@@..........................@@@@@@.................................@@@@@@@@.@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................@@@@@@.@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@.............................................@@@@@@@............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@................................................................................................................@@@@@@@.@...@...................@@@@@@@@.................................@@@@@@@@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................................................@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@............................................@@@@@@@@.......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................................@@@@@@@@@................................................................................................................@@@@@@@@@..@@@..................@@@@@@@@...................................@@@@@@.@......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.......................................................@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@..........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@@@@................................................................................................................@@@@@@@@@@@@@@.@...............@@@@@@@@@......................................@@@@@.@.......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................................@@@@@@@@@@@@@@@ +@@@@@@@@...............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................@@@@@@@@@@@@@................................................................................................................@@@@@@@@@@@@@@@@................@@@@@@@........................................@@@@@@..@........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@ +@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................................................@...@@@@@@@@@@@@@@@@....................................................@..........@...............................................@@@@@@@@@@@@@@@@@.@...............@@@@@..........................................@@@@@@@@..@.....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................@@@@@@@@ +@@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................................................@@..@@@@@@@@@@@@@@@@@.................................................@@@@@......@@@@................................................@@@@@@@@@@@@@@@@@@@...............................................................@@@@@@@@@.@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................@@@@@@@@@ +@@@@@@@@................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................................................@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@......@@@@.................................................@@@@@@@@@@@@@@@@@@..@..............................................................@@@@@@@@@@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................@@@@@@ +.........................................................................@@@@@@@@@@@@@@@@@@@@@@@........@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@.....@@@@@...................................................@@@@@@@@@@@@@@@@@@@.@................................................................@@@@@@.@.@@@@@@.@@@@@@@@@@@@@@@@@@@@@@...................................................................@@@@@@. +................................................................................@@@@@@@@@@@@@@@@........@@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@....@............................................................@@@@@@@@@@@@@@@@@@.@.............................................................@@@.@@@@@..@.....@@@@@@@@@@@@@@@@................................................................................ +................................................................................@@@@@@@@@@@@@@@@.....@@@@@@....................................................................@@@@@@@@@@@@@@@@@@@@@@@.....................................................@@@@@@@.@.......................................................@@@@@@@@@@@@@@@@@@@@@@@@...............................................................@@@@@@@@@..@.@@@@@@@@@@@@@@@.................................................................................. +...............................................................................@@@@@@@@@@@@@@@@@...@@@@@@....................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@@@@@@@.@..................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.............................................................@@@@@@@@@@@@..@@@@@@@@@@..................................................................................... +.................................................................................@@@@@@.@@@@@@...@@@@@@.................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@@@@@@@@@.@................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.................................................................@@@@@@@................................................................................................ +...........@....................................................................................@@@@@@@..@..............................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@....@...........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...............................................................@@@@@@@................................................................................................ +.........@@@....................................................................................@@@@@@@@@@.@...........................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.........................................................@@@@@@@@@@................................................................................................ +........@@@@....................................................................................@@@@@@@@@@@@.@.......................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.....................................................@@@@@@@@@@@@................................................................................................ +........@@@@....................................................................................@@@@@@@@@@@@@@.@...................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................@@@@@@@@@@@@@@................................................................................................ +.......@@@@.....................................................................................@@@@@@@@@@@@@@@@@...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................................@@@@@@@@@@@@@@@@................................................................................................ +...............................................................................................@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................................@@@@@@@@@@@@@@@@................................................................................................. +................................................................................................@@@@@@@@@@@@@@@@@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@........................................@@@@@@@@@@@@@@@@.................................................................................................. +..................................................................................................@@@@@@@@@@@@@@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.......................................@@@@@@@@@@@@@.................................................................................................... +...................................................................................................@@@@@@@@@@@@.........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...@...................................@@@@@@@@@@...................................................................................................... +........................................................................................................@@@@@@........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@@@....................................@@@@@@........................................................................................................ +........................................................................................................@@@@@@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.................................@@@@@@@@....................................................................................................... +.......................................................................................................@@@@.......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................@@@@@@...................................................................................................... +......................................................................................................@@@@......................@...@...........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.................@.................@@@@@@..................................................................................................... +.....................................................................................................@@@@...................@@@@@..@@@.......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@..........@@@@@@..................@@@@.@................................................................................................... +...................................................................................................@@@@@@..................@@@@@@@@@@@.@..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@......@@@@@@@@@................@@@@@@@@.................................................................................................. +.................................................................................................@@@@@@...................@@@@@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@@@@@@@@@@@@.................@@@@@@.................................................................................................. +..................................................................................................@@@@...................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................@@@@................................................................................................... +........................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....................................................................................................................... +.......................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...................................................................................................................... +......................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..................................................................................................................... +.....................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................................................................................... +....................................................................................................................@@@@@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@@@@@@@@@@@.@.................................................................................................................. +..................................................................................................................@@@@@@@@@@@....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....@@@@@@@@@@@@.................................................................................................................. +..................................................................................................................@@@@@@@@@@.......@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................@@@@@@.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........@@@@@@@@@@@.................................................................................................................. +.................................................................................................................@@@@@@@@@@..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...........@@@@@@@@@@.................................................................................................................. +..........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................................................................................................... +...........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................@@@@@@@@@@@@@@@@@@@@@@@@@............................................................................................................................................. +..............................................................................................................................................@@@@@@@@@@@@@@@@@@..................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................@@@@@@.@@@@@@@@@@@@@@@@@............................................................................................................................................... +................................................................................................................................................@@@@@@@@@@@@@@@@................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..............................@@@@@@@@@@@@@@@@................................................................................................................................................ +................................................................................................................................................@@@@@@@@@@@@@@@@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................@@@@@@@@@@@@@@@@@................................................................................................................................................ +...............................................................................................................................................@@@@@@@@@@@@@@@.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...........................@@@@@@@@@@@@@.................................................................................................................................................. +.......................................................................................................................................................@@@@@@@...........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...............................@@@@@@@.................................................................................................................................................. +........................................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@................................................................................................................................................................................... +......................................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@................................................................................................................................................................................ +....................................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................................................................................ +.................................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................................................................................ +................................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................................................................................................................................. +..............................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..........................................................................................................................................................................@@ +............................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@......................................................................................................................................................................@@@@ +..........................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..................................................................................................................................................................@@@@@@ +........................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@....................@...........................................................................................................................................@@@@@@ +......................................................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................@@@..........................................................................................................................................@@@@@@@ +......................................................................................................................................@.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............@@@@@@...........................................................................................................................................@@@@@ +.....................................................................................................................................@@...@......................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..........@@@@@@............................................................................................................................................@@@@ +.....................................................................................................................................@@@@@@@....................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.......@@@@@@@................................................................................................................................................ +..................................................................................................................................@@@@@@@@@@.@.............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@....@@@@@@@@................................................................................................................................................ +..................................................................................................................................@@@@@@@@@@@@..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..@@@@@@@@................................................................................................................................................ +.................................................................................................................................@@@@@@@@@@@@@..........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@@@@@@@@................................................................................................................................................ +..@................................................................................................................................@@@@@@@@@............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................................................................................. +@@@.@...............................................................................................................................@@@@@@.........@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.................................................................................................................................................@@@ +@@@@@.@.........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................................................................................................................@@@@@ +@@@@@@@@........................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.........................................................................................................................................@@@@@@@ +@@@@@@@@..@.....................................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@.........................................................@.........................................................................@@@@@@@@ +@@@@@@@@@@@.@.............................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.................................................@@@@@@......................................................................@@@@@@@@@@@ +@@@@@@@@@@@@@.@...........................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................................@@@@@@....................................................................@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@.........................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@...................................................................@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@..@.....................................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@........@..........................................................@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@.@..............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@......................................................@@@@@......................................................@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@.@.........................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...................................................@@@@@@....................................................@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@........................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@................................................@@@@@@...................................................@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@..@................................................@.........@..........................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@............................................@@@@........@..........................................@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@.@.............................................@@.@......@@@....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.....................................................@@@@@......................................@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..........................................@@@@@....@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@..................................................@@@@@@....................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................@@@@@@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@..@.....................................@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@....@............................................@@@@...................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@......................................@@@@@@@@@@@.............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@...................................@@@@@@@@@@@@@............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.@............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@..........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.........................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.................................@@@@@@@@@@@@@@.........................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +patch 1 +height 11 +width 10 +map +.......... +.......... +.......... +.......... +@......... +@......... +@@........ +@@........ +@@........ +@@........ +@......... +patch 2 +height 7 +width 9 +map +......@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 3 +height 19 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +patch 4 +height 17 +width 17 +map +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +patch 5 +height 17 +width 17 +map +@@@@@@@@@@@@..... +@@@@@@@.......... +@@............... +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +...............@@ +......@@@..@@@@@@ +patch 6 +height 14 +width 7 +map +@@@@@@. +@@@@@.. +@@@@... +@@@.... +@@..... +@...... +....... +....... +....... +....... +....... +....... +....... +....... +patch 7 +height 3 +width 13 +map +............. +........@@@@@ +...@@@@@@@@@@ +patch 8 +height 2 +width 7 +map +@@@@... +....... +patch 9 +height 11 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +@@@.... +@@@@... +@@@@@.. +@@@@@@. +patch 10 +height 8 +width 9 +map +@@@@@@@.. +@@@@@@... +@@@@@.... +@@@@..... +@@@...... +@@....... +@........ +......... +patch 11 +height 18 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +........@ +.......@@ +......@@@ +.....@@@@ +....@@@@@ +...@@@@@@ +..@@@@@@@ +patch 12 +height 7 +width 12 +map +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +patch 13 +height 5 +width 1 +map +@ +@ +@ +@ +@ +patch 14 +height 9 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........... +patch 15 +height 7 +width 12 +map +............ +...........@ +..........@@ +.........@@@ +........@@@@ +.......@@@@@ +......@@@@@@ +patch 16 +height 9 +width 13 +map +@@@@@@@....@@ +@@@@@@.....@@ +@@@@@.......@ +@@@@........@ +@@@.........@ +@@..........@ +@............ +............. +............. +patch 17 +height 9 +width 4 +map +...@ +.... +.... +.... +.... +.... +...@ +..@@ +.@@@ +patch 18 +height 11 +width 13 +map +@@@@@@@@@@@.. +@@@@@@@@@@@.. +@@@@@@@@@@@.@ +@@@@@@@@@@@.. +@@@@@@@@@@@.. +@@@@@@@@@@@.. +@@@@@@@@@@@.. +@@@@@@@@@@@@. +.@@@@@@@@@@@. +.@@@@@@@@@@@. +.@@@@@@@@@@@@ +patch 19 +height 15 +width 8 +map +@@@@@@@. +@@@@@@.. +@@@@@... +@@@@.... +@@@..... +@@...... +@....... +........ +........ +@....... +@....... +@....... +@....... +@....... +@@...... +patch 20 +height 7 +width 22 +map +...................... +...................... +.....................@ +....................@@ +@..................@@@ +@.................@@@@ +@................@@@@@ +patch 21 +height 8 +width 15 +map +............... +..............@ +@............@@ +@...........@@@ +@..........@@@@ +@.........@@@@@ +@........@@@@@@ +@@......@@@@@@@ +patch 22 +height 9 +width 10 +map +.......... +.......... +.......... +........@@ +.....@@@@@ +.....@@@@@ +.....@@@@@ +......@@@@ +......@@@@ +patch 23 +height 9 +width 13 +map +......@@@.... +............. +............. +............. +............. +............. +............. +............. +@............ +patch 24 +height 15 +width 15 +map +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +patch 25 +height 13 +width 6 +map +@@@@@. +@@@@@. +@@.... +...... +@..... +@..... +@..... +...... +...... +...... +...... +...... +...... +patch 26 +height 5 +width 6 +map +...... +...... +...... +...... +...... +patch 27 +height 19 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................@@@ +...........@@@@@@@@ +patch 28 +height 10 +width 4 +map +...@ +..@@ +.@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@. +@@@. +patch 29 +height 7 +width 4 +map +.... +.... +.... +@... +@... +@... +@... +patch 30 +height 7 +width 8 +map +........ +.......@ +......@@ +.....@@@ +....@@@@ +...@@@@@ +..@@@@@@ +patch 31 +height 10 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +patch 32 +height 6 +width 11 +map +........... +........... +........... +........... +......@@@@@ +..@@@@@@@@@ +patch 33 +height 7 +width 11 +map +........... +@.......... +@@......... +@@@........ +@@@@....... +@@@@@...... +@@@@@@..... +patch 34 +height 11 +width 7 +map +.@@@@@@ +..@@@@@ +...@@@@ +....@@@ +.....@@ +......@ +....... +....... +....... +....... +....... +patch 35 +height 12 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +patch 36 +height 6 +width 10 +map +@@@@@..... +@@@@...... +@@@....... +@@........ +@......... +.......... +patch 37 +height 10 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 38 +height 10 +width 6 +map +...... +...... +...... +...... +...... +.....@ +....@@ +...@@@ +..@@@@ +.@@@@@ +patch 39 +height 6 +width 11 +map +........... +@.......... +@@......... +@@@........ +@@@@....... +@@@@@...... +patch 40 +height 6 +width 5 +map +..... +..... +..... +..... +..... +..... +patch 41 +height 22 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 42 +height 5 +width 9 +map +@@@@..... +@@@...... +@@....... +@........ +......... +patch 43 +height 5 +width 5 +map +..... +..... +..... +..... +..... +patch 44 +height 19 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +....@ +...@@ +..@@@ +.@@@@ +patch 45 +height 21 +width 5 +map +@@@@. +@@@.. +@@... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +....@ +....@ +....@ +..... +..... +....@ +patch 46 +height 19 +width 19 +map +@@@@@@.........@@@@ +@@@@@..........@@@@ +@@@@...........@@@@ +@@@.............@@@ +@@..............@@@ +@...............@@@ +.................@@ +.................@@ +..................@ +..................@ +..................@ +..................@ +................... +..................@ +.................@@ +................@@@ +...............@@@@ +..............@@@@@ +.............@@@@@@ +patch 47 +height 21 +width 7 +map +@@@@... +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +@...... +@...@@@ +@...@@@ +....@@@ +patch 48 +height 12 +width 7 +map +@@@@@@. +@@@@@.. +@@@@... +@@@.... +@@..... +@...... +....... +....... +....... +....... +....... +....... +patch 49 +height 7 +width 19 +map +................... +..................@ +.................@@ +................@@@ +...............@@@@ +..............@@@@@ +.............@@@@@@ +patch 50 +height 7 +width 10 +map +@@@@@@.... +@@@@@..... +@@@@...... +@@@....... +@@........ +@......... +.......... +patch 51 +height 10 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +patch 52 +height 11 +width 7 +map +....... +....... +....... +....... +....... +......@ +.....@@ +....@@@ +...@@@@ +..@@@@@ +.@@@@@@ +patch 53 +height 12 +width 7 +map +@@@@@@. +@@@@@.. +@@@@... +@@@.... +@@..... +@...... +....... +....... +....... +....... +....... +...@@@@ +patch 54 +height 8 +width 13 +map +@@@@@......@@ +@@..........@ +@@..........@ +@@..........@ +@@..........@ +@@..........@ +............@ +............. +patch 55 +height 11 +width 7 +map +@@@@@@. +@@@@@.. +@@@@... +@@@.... +@@..... +@...... +....... +....... +....... +....... +....... +patch 56 +height 12 +width 4 +map +.@@@ +..@@ +..@@ +..@@ +..@@ +..@@ +...@ +...@ +...@ +...@ +...@ +.... +patch 57 +height 3 +width 4 +map +.... +.... +.... +patch 58 +height 3 +width 23 +map +.....................@@ +....................... +@...................... +patch 59 +height 6 +width 21 +map +....................@ +@...................@ +@@..................@ +@@@.................@ +@@@@................@ +@@@@@................ +patch 60 +height 8 +width 19 +map +................... +................... +..................@ +.................@@ +................@@@ +...............@@@@ +..............@@@@@ +.............@@@@@@ +patch 61 +height 6 +width 5 +map +@@@@. +@@@@. +@@@.. +@@... +@.... +...@@ +patch 62 +height 14 +width 26 +map +@@@@@@@@@@...............@ +@@@@@@@..................@ +@@@......................@ +.........................@ +.......................... +.......................... +.......................... +.........................@ +........................@@ +.......................@@@ +......................@@@@ +.....................@@@@@ +....................@@@@@@ +...................@@@@@@@ +patch 63 +height 12 +width 3 +map +@@. +@.. +... +... +... +@.. +@.. +@.. +@.. +@.. +@.. +@@. +patch 64 +height 5 +width 16 +map +...............@ +@..............@ +@@.............@ +@@@............@ +@@@@............ +patch 65 +height 5 +width 12 +map +...........@ +...........@ +...........@ +@..........@ +@@.......... +patch 66 +height 8 +width 13 +map +............. +............@ +...........@@ +..........@@@ +@........@@@@ +@.......@@@@@ +@......@@@@@@ +@.....@@@@@@@ +patch 67 +height 8 +width 13 +map +@@@@@@@...... +@@@@@@....... +@@@@@........ +@@@@......... +@@@.......... +@@........... +@............ +............. +patch 68 +height 19 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +....@@ +...@@@ +..@@@@ +patch 69 +height 12 +width 7 +map +....... +....... +....... +....... +....... +....... +......@ +.....@@ +....@@@ +...@@@@ +..@@@@@ +.@@@@@@ +patch 70 +height 18 +width 8 +map +@@@@@@.. +@@@@@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +.@@@@@@@ +..@@@@@@ +.......@ +patch 71 +height 9 +width 9 +map +.......@@ +........@ +......... +......... +......... +......... +......... +......... +......... +patch 72 +height 8 +width 2 +map +@. +@. +@. +@. +@. +@@ +@@ +.@ +patch 73 +height 12 +width 9 +map +....@@@@@ +.....@@@@ +......@@@ +.......@@ +........@ +......... +......... +......... +......... +......... +......... +......... +patch 74 +height 8 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +patch 75 +height 8 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +..... +..... +..... +patch 76 +height 11 +width 3 +map +... +... +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@.. +patch 77 +height 6 +width 20 +map +.................... +.................... +@..................@ +@.................@@ +@................@@@ +@...............@@@@ +patch 78 +height 6 +width 13 +map +............. +............@ +...........@@ +..........@@@ +.........@@@@ +@.......@@@@@ +patch 79 +height 6 +width 6 +map +...... +...... +...... +...... +.....@ +....@@ +patch 80 +height 19 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +......@ +.....@@ +....@@@ +...@@@@ +..@@@@@ +.@@@@@@ +patch 81 +height 12 +width 18 +map +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +patch 82 +height 1 +width 3 +map +@@@ +patch 83 +height 7 +width 7 +map +@@@@@@@ +..@@@@@ +....@@@ +...@@@@ +..@@@@@ +...@@@@ +.....@. +patch 84 +height 7 +width 6 +map +@@@@.. +...... +...... +...... +...... +@..... +@@.... +patch 85 +height 13 +width 7 +map +.....@@ +......@ +....... +....... +@...... +@...... +....... +....... +....... +....... +....... +....... +....... +patch 86 +height 3 +width 9 +map +......... +......... +......... +patch 87 +height 5 +width 6 +map +...@@@ +....@@ +.....@ +...... +...... +patch 88 +height 6 +width 13 +map +............. +............. +............. +............. +@............ +@@........... +patch 89 +height 5 +width 7 +map +....... +....... +....... +....... +....... +patch 90 +height 7 +width 7 +map +...@... +...@..@ +....@@@ +.....@@ +......@ +....... +....... +patch 91 +height 25 +width 14 +map +.............. +.............. +.............. +.............. +.............. +@............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +........@@@@@@ +...@@@@@@@@@@@ +patch 92 +height 28 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@@@ +@@@ +@@@ +patch 93 +height 7 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +patch 94 +height 4 +width 4 +map +..@@ +@@@@ +@@@. +@@.. +patch 95 +height 4 +width 8 +map +........ +........ +........ +........ +patch 96 +height 1 +width 1 +map +@ +patch 97 +height 8 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +patch 98 +height 14 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +....@ +patch 99 +height 18 +width 5 +map +.@@@@ +.@@@@ +..@@@ +..@@@ +..@@@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@.@.. +..@@. +patch 100 +height 16 +width 6 +map +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +patch 101 +height 23 +width 12 +map +@@....@@@@@@ +@@.....@@@@@ +@@......@@@@ +@@.......@@@ +@@@.......@@ +@@@........@ +@........... +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +patch 102 +height 14 +width 4 +map +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 103 +height 8 +width 15 +map +.............@@ +..............@ +............... +............... +............... +............... +............... +............... +patch 104 +height 24 +width 6 +map +...@@. +...@.. +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +....@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 105 +height 6 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 106 +height 6 +width 12 +map +@@@@@@@@@@@@ +@@@@@@@@@@@. +@@@@@@@@@@.. +@@@@@@@@@... +@@@@@@@@.... +@@@@@@@..... +patch 107 +height 19 +width 9 +map +........@ +........@ +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +@........ +@@....... +patch 108 +height 9 +width 22 +map +..............@@@@@@@@ +...............@@@@@@@ +................@@@@@@ +.................@@@@@ +..................@@@@ +...................@@@ +....................@@ +.....................@ +...................... +patch 109 +height 9 +width 10 +map +.......... +.......... +.......... +.......... +@@........ +@@@....... +@@@@...... +@@@@@..... +@@@@@@.... +patch 110 +height 13 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 111 +height 13 +width 5 +map +.@@@@ +..@@@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 112 +height 20 +width 6 +map +@@@... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +....@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 113 +height 22 +width 3 +map +@@. +@.. +... +... +... +... +... +... +... +... +... +... +... +... +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +patch 114 +height 4 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +patch 115 +height 4 +width 14 +map +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@. +@@@@@@@@@@@@.. +@@@@@@@....... +patch 116 +height 13 +width 18 +map +................@@ +................@@ +................@@ +................@@ +.................@ +.................@ +.................@ +.................@ +.................. +.................. +.................. +.................. +.................. +patch 117 +height 8 +width 5 +map +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 118 +height 13 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 119 +height 13 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +patch 120 +height 11 +width 5 +map +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 121 +height 12 +width 5 +map +.@@@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 122 +height 11 +width 11 +map +@@@@@@@@@@. +@@@@@...... +@.......... +........... +........... +........... +........... +........... +........... +........... +........... +patch 123 +height 5 +width 11 +map +........... +..........@ +......@@@@@ +.@@@@@@@@@@ +@@@@@@@@@@@ +patch 124 +height 3 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +patch 125 +height 3 +width 26 +map +@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@.... +@@@@@@@@@@@@@@@@@......... +patch 126 +height 13 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +patch 127 +height 10 +width 13 +map +.....@@@@@@@@ +......@@@@@@@ +.......@@@@@@ +........@@@@@ +.........@@@@ +..........@@@ +...........@@ +............@ +............. +............. +patch 128 +height 13 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 129 +height 14 +width 9 +map +....@@@@@ +.....@@@@ +......@@@ +........@ +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 130 +height 10 +width 10 +map +@@@@@@.... +@......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 131 +height 4 +width 10 +map +.......... +.......... +......@@@@ +..@@@@@@@@ +patch 132 +height 5 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +patch 133 +height 2 +width 11 +map +@@@@@@@@@@@ +@@@@@@@.... +patch 134 +height 22 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +@@@@.. +@@@@@. +patch 135 +height 25 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@@. +patch 136 +height 9 +width 3 +map +... +... +... +... +... +... +... +... +... +patch 137 +height 9 +width 13 +map +.....@@@@@@@@ +......@@@@@@@ +.......@@@@@@ +........@@@@@ +.........@@@@ +..........@@@ +...........@@ +............@ +............. +patch 138 +height 21 +width 11 +map +@@@@@...... +@.......... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........@@@ +........@@@ +........@@@ +.........@@ +.........@@ +.........@@ +.........@@ +..........@ +..........@ +patch 139 +height 2 +width 11 +map +@@@@@@@@@@@ +@@@@@@..... +patch 140 +height 13 +width 9 +map +....@@@@@ +.....@@@@ +......@@@ +.......@@ +........@ +......... +......... +......... +......... +......... +......... +......... +......... +patch 141 +height 23 +width 5 +map +@@@@. +@@@.. +@@... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 142 +height 12 +width 4 +map +@@.. +@... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 143 +height 12 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 144 +height 2 +width 11 +map +........@@@ +........... +patch 145 +height 9 +width 9 +map +......@@@ +.......@@ +......... +......... +......... +......... +......... +......... +......... +patch 146 +height 23 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +@...... +@@..... +@@@.... +@@@@... +@@@@@.. +@@@@@@. +patch 147 +height 29 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +@...... +@@..... +@@@.... +@@@@... +@@@@@.. +patch 148 +height 6 +width 8 +map +...@@@@@ +....@@@@ +.....@@@ +......@@ +.......@ +........ +patch 149 +height 7 +width 15 +map +.........@@@@@@ +..........@@@@@ +...........@@@@ +............@@@ +.............@@ +..............@ +............... +patch 150 +height 13 +width 13 +map +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +patch 151 +height 14 +width 3 +map +@@. +@.. +... +... +... +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +@@. +patch 152 +height 5 +width 8 +map +@@@@@... +@@@@@@.. +@@@@@@.. +@@@@@@.. +@@@@@@.. +patch 153 +height 5 +width 1 +map +. +. +. +. +. +patch 154 +height 5 +width 17 +map +@@............... +@................ +................. +................. +................. +patch 155 +height 22 +width 8 +map +....@@@@ +....@@@@ +....@@@@ +....@@@@ +....@@@@ +.....@@@ +.....@@@ +.....@@@ +.....@@@ +.....@@@ +......@@ +......@@ +......@@ +......@@ +......@@ +.......@ +.......@ +.......@ +.......@ +.......@ +........ +........ +patch 156 +height 13 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 157 +height 2 +width 13 +map +@............ +............. +patch 158 +height 7 +width 13 +map +............. +............. +............. +............. +............. +............. +............. +patch 159 +height 21 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 160 +height 5 +width 11 +map +.......@@@@ +........@@@ +.........@@ +..........@ +........... +patch 161 +height 2 +width 15 +map +............... +............... +patch 162 +height 23 +width 3 +map +..@ +..@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@@. +patch 163 +height 20 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@@. +patch 164 +height 22 +width 7 +map +@@@@@.. +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....@@@ +patch 165 +height 23 +width 13 +map +@@@@@@@@..@@@ +@@@........@@ +............@ +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +.........@@@@ +...@@@@@@@@@@ +patch 166 +height 13 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 167 +height 14 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 168 +height 5 +width 8 +map +....@@@@ +.....@@@ +......@@ +.......@ +........ +patch 169 +height 6 +width 14 +map +.........@@@@@ +..........@@@@ +...........@@@ +............@@ +.............@ +.............. +patch 170 +height 13 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +@......... +@......... +@......... +@......... +@@........ +@@........ +patch 171 +height 13 +width 8 +map +........ +........ +@....... +@....... +@....... +@....... +@....... +@@...... +@@...... +@@...... +@@...... +@@@..... +@@@@@@@. +patch 172 +height 28 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +@. +patch 173 +height 8 +width 3 +map +... +... +.@@ +.@@ +.@@ +..@ +..@ +..@ +patch 174 +height 2 +width 6 +map +...... +.@@@.. +patch 175 +height 6 +width 12 +map +............ +..@@........ +@@@......... +@@.......... +@........... +............ +patch 176 +height 5 +width 3 +map +... +... +... +... +... +patch 177 +height 3 +width 5 +map +..... +..... +..... +patch 178 +height 6 +width 26 +map +.....................@@@@@ +......................@@@@ +.......................@@@ +........................@@ +.........................@ +.......................... +patch 179 +height 6 +width 32 +map +...........................@@@@@ +............................@@@@ +.............................@@@ +..............................@@ +...............................@ +................................ +patch 180 +height 6 +width 12 +map +............ +............ +............ +............ +............ +.........@@@ +patch 181 +height 2 +width 10 +map +.......... +.......... +patch 182 +height 3 +width 4 +map +.... +.@@@ +.@@@ +patch 183 +height 20 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +@@@@.. +@@@@@. +patch 184 +height 23 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@@. +patch 185 +height 25 +width 2 +map +.@ +.@ +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +@. +patch 186 +height 3 +width 2 +map +.. +.. +.. +patch 187 +height 5 +width 14 +map +@@@@@@....@@@@ +@..........@@@ +............@@ +.............@ +.............. +patch 188 +height 4 +width 9 +map +@@@...... +@@....... +@........ +......... +patch 189 +height 7 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +patch 190 +height 12 +width 14 +map +.......@@@@..@ +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +patch 191 +height 12 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +@........ +@@....... +@@@...... +patch 192 +height 4 +width 15 +map +.@@@@@@@....@@@ +.@@@.........@@ +..............@ +............... +patch 193 +height 18 +width 4 +map +.... +.... +.... +.... +.... +@... +@... +@... +@... +@... +@@.. +@@.. +@@.. +@@.. +@@@. +@@@. +@@@. +@@@. +patch 194 +height 24 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@@.. +@@@. +patch 195 +height 8 +width 9 +map +........@ +........@ +........@ +......... +......... +......... +......... +......... +patch 196 +height 5 +width 5 +map +..... +@.... +@@... +@@@.. +@@@@. +patch 197 +height 5 +width 23 +map +@@@@................... +@@@.................... +@@..................... +@...................... +....................... +patch 198 +height 4 +width 11 +map +@@@........ +@@......... +@.......... +........... +patch 199 +height 6 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +patch 200 +height 5 +width 12 +map +@@@@@@@@@@.. +@@@@........ +@@.......... +@........... +............ +patch 201 +height 8 +width 15 +map +.............@@ +..............@ +..............@ +..............@ +..............@ +..............@ +............... +............... +patch 202 +height 8 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +patch 203 +height 8 +width 18 +map +...........@@@@@@@ +............@@@@@@ +@............@@@@@ +@.............@@@@ +@..............@@@ +@...............@@ +@................@ +@@................ +patch 204 +height 12 +width 8 +map +........ +........ +........ +........ +........ +@....... +@@...... +@@@..... +@@@@.... +@@@@@... +@@@@@@.. +@@@@@@@. +patch 205 +height 3 +width 26 +map +@@........................ +@......................... +.......................... +patch 206 +height 3 +width 8 +map +........ +........ +........ +patch 207 +height 11 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +.......@ +......@@ +.....@@@ +patch 208 +height 8 +width 9 +map +@@@...... +.@....... +......... +......... +......... +......... +......... +......... +patch 209 +height 5 +width 9 +map +......... +......... +......... +......... +......... +patch 210 +height 7 +width 20 +map +...................@ +...................@ +...................@ +.................... +.................... +.................... +.................... +patch 211 +height 8 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +patch 212 +height 7 +width 12 +map +...........@ +...........@ +...........@ +...........@ +@..........@ +@........... +@........... +patch 213 +height 12 +width 7 +map +....... +....... +....... +....... +....... +....... +@...... +@@..... +@@@.... +@@@@... +@@@@@.. +@@@@@@. +patch 214 +height 13 +width 8 +map +........ +........ +........ +........ +........ +........ +.......@ +......@@ +.....@@@ +....@@@@ +...@@@@@ +..@@@@@@ +.@@@@@@@ +patch 215 +height 7 +width 21 +map +@@@@................. +@@@.................. +@@................... +@.................... +..................... +..................... +..................... +patch 216 +height 8 +width 12 +map +...........@ +...........@ +...........@ +............ +@........... +@........... +@........... +@........... +patch 217 +height 14 +width 12 +map +............ +............ +............ +............ +@........... +@........... +@........... +@........... +@........... +@@.......... +@@.......... +@@.......... +@@.......... +@@.......... +patch 218 +height 15 +width 5 +map +..... +..... +..... +..... +@.... +@.... +@.... +@.... +@.... +@@... +@@... +@@... +@@... +@@@.. +@@@@. +patch 219 +height 9 +width 15 +map +........@@@@@@@ +.........@@@@@@ +..........@@@@@ +...........@@@@ +............@@@ +.............@@ +..............@ +............... +............... +patch 220 +height 6 +width 24 +map +@@@@@...........@@@@@@@@ +@@@@............@@@..... +@@@..................... +@@...................... +@....................... +........................ +patch 221 +height 3 +width 27 +map +@@......................... +@.......................... +........................... +patch 222 +height 4 +width 9 +map +......... +......... +......... +......... +patch 223 +height 14 +width 9 +map +......... +......... +......... +......... +......... +......... +........@ +.......@@ +......@@@ +.....@@@@ +....@@@@@ +...@@@@@@ +..@@@@@@@ +.@@@@@@@@ +patch 224 +height 5 +width 12 +map +............ +............ +............ +............ +............ +patch 225 +height 11 +width 21 +map +.................@@@@ +..................@@@ +...................@@ +...................@@ +...................@@ +...................@@ +....................@ +....................@ +.......@@...........@ +...@@@@@@...........@ +@@@@@@@@@............ +patch 226 +height 6 +width 15 +map +............@@@ +.............@@ +..............@ +@.............@ +@.............@ +@.............. +patch 227 +height 7 +width 21 +map +...............@@@@@@ +................@@@@@ +@................@@@@ +@.................@@@ +@..................@@ +@...................@ +@.................... +patch 228 +height 11 +width 10 +map +@..@@@@@@@ +....@@@@@@ +....@@@@@@ +....@@..@@ +........@@ +.........@ +.........@ +.........@ +.........@ +.........@ +.......... +patch 229 +height 18 +width 2 +map +@. +.. +.. +.. +.. +.. +.. +.. +.@ +.@ +.@ +.@ +.@ +.@ +.@ +.@ +.@ +.@ +patch 230 +height 12 +width 8 +map +@@@@@@.. +@@@@@@.. +@@@@@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 231 +height 6 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +.@@@@@@@@ +..@@@@@@@ +...@@@@@@ +patch 232 +height 7 +width 7 +map +@@@@@@. +.@@@@@. +..@@@@. +...@@@. +....@@. +.....@@ +......@ +patch 233 +height 2 +width 3 +map +..@ +... +patch 234 +height 11 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +@........ +@@....... +@@@...... +@@@@..... +patch 235 +height 5 +width 22 +map +...................@@@ +....................@@ +.....................@ +...................... +...................... +patch 236 +height 3 +width 14 +map +.............. +.............. +.............. +patch 237 +height 3 +width 6 +map +...... +...... +...... +patch 238 +height 1 +width 4 +map +.... +patch 239 +height 5 +width 8 +map +........ +........ +@....... +@@...... +@@@..... +patch 240 +height 18 +width 19 +map +@@@@@@@@@@@@@...... +@@@@@@@@@@......... +@@@@@.............. +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +..................@ +.................@@ +................@@@ +patch 241 +height 9 +width 5 +map +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 242 +height 14 +width 19 +map +@@@@@@@@@@@@@@..... +@@@@@@@@@.......... +@@@@............... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +patch 243 +height 4 +width 10 +map +.......@@@ +........@@ +.........@ +.......... +patch 244 +height 4 +width 22 +map +...................@@@ +....................@@ +.....................@ +...................... +patch 245 +height 8 +width 18 +map +.................. +.................. +.................. +.................. +.................. +.................. +.................. +@................. +patch 246 +height 6 +width 18 +map +.............@@@@@ +..............@@@@ +...............@@@ +................@@ +.................@ +.................. +patch 247 +height 8 +width 16 +map +................ +@............... +@@.............. +@@@............. +@@@@............ +@@@@@........... +@@@@@@.......... +@@@@@@@......... +patch 248 +height 3 +width 8 +map +........ +@....... +@@...... +patch 249 +height 1 +width 1 +map +. +patch 250 +height 10 +width 2 +map +@. +@. +@. +@. +@. +@@ +@@ +@@ +@@ +@@ +patch 251 +height 10 +width 2 +map +.. +.. +.. +.. +.. +@. +@. +@. +@. +@. +patch 252 +height 23 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@..... +@..... +@..... +@..... +@@.... +patch 253 +height 7 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +patch 254 +height 7 +width 16 +map +................ +................ +................ +................ +................ +................ +................ +patch 255 +height 3 +width 8 +map +......@@ +.......@ +........ +patch 256 +height 3 +width 5 +map +...@@ +....@ +..... +patch 257 +height 2 +width 9 +map +......@@@ +@@@@@@@@@ +patch 258 +height 4 +width 12 +map +@@@@@@@@@@@. +.@@@@@@@@@@@ +..@@@@@@@@@@ +...@@@@@@@@@ +patch 259 +height 5 +width 9 +map +@@@@@@@@. +.@@@@@@@@ +..@@@@@@@ +...@@@@@@ +....@@... +patch 260 +height 2 +width 2 +map +.. +@. +patch 261 +height 7 +width 15 +map +.............@@ +@.............@ +@.............@ +@.............@ +@@............@ +@@@.@@......... +@@@@@@......... +patch 262 +height 3 +width 17 +map +@@@@@@@@@@@@@@@@. +@@@@@@..@@@...... +................. +patch 263 +height 4 +width 28 +map +............................ +............................ +............................ +............................ +patch 264 +height 4 +width 22 +map +...................... +...................... +...................... +...................... +patch 265 +height 1 +width 3 +map +... +patch 266 +height 2 +width 3 +map +... +@.. +patch 267 +height 2 +width 1 +map +. +. +patch 268 +height 8 +width 7 +map +....... +....... +@...... +@@..... +@@@.... +@@@@... +@@@@@.. +@@@@@@. +patch 269 +height 7 +width 13 +map +..@@@@@@@@@@@ +.@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@.......@@ +patch 270 +height 19 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 271 +height 4 +width 13 +map +............. +............. +............@ +............. +patch 272 +height 2 +width 7 +map +......@ +....... +patch 273 +height 25 +width 14 +map +@@@@@@........ +@@@@@......... +@@@@.......... +@@@........... +@@............ +@............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +patch 274 +height 21 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 275 +height 15 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +......@ +.....@@ +....@@@ +...@@@@ +..@@@@@ +.@@@@@@ +patch 276 +height 19 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 277 +height 19 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 278 +height 21 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +@@@@.. +@@@@@. +patch 279 +height 20 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 280 +height 17 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +patch 281 +height 8 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +patch 282 +height 4 +width 11 +map +........... +........... +........... +........... +patch 283 +height 8 +width 21 +map +..@@@@@@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@ +patch 284 +height 4 +width 25 +map +...@@@@@@@@@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@..@@@@ +.@@@@@@@@@@@@........@@@@ +@@@@@@@@..............@@@ +patch 285 +height 4 +width 3 +map +@@@ +@@@ +@@@ +@@@ +patch 286 +height 5 +width 2 +map +.. +.. +.. +.. +.@ +patch 287 +height 8 +width 2 +map +@@ +@@ +@@ +@@ +@@ +.@ +.@ +.@ +patch 288 +height 15 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 289 +height 10 +width 17 +map +...............@@ +................@ +................@ +................@ +................@ +................@ +................. +................. +................. +................. +patch 290 +height 11 +width 21 +map +..................@@@ +..................@@@ +..................@@@ +..................@@@ +..................@@@ +...................@@ +...................@@ +...................@@ +..................... +..................... +..................... +patch 291 +height 1 +width 9 +map +......... +patch 292 +height 19 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +patch 293 +height 21 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +@...... +@@..... +@@@.... +@@@@... +@@@@@.. +patch 294 +height 8 +width 26 +map +.....................@@@@@ +......................@@@@ +.......................@@@ +@@@.....................@@ +@@@......................@ +@@@....................... +@@@@...................... +@@@@...................... +patch 295 +height 4 +width 23 +map +....................... +@...................... +@...................... +@...................... +patch 296 +height 4 +width 7 +map +....... +....... +....... +@...... +patch 297 +height 16 +width 6 +map +...... +...... +...... +@..... +@..... +@..... +@..... +@..... +@..... +@@.... +@@.... +@@.... +@@.... +@@@... +@@@@.. +@@@@@. +patch 298 +height 5 +width 22 +map +...................... +...................... +...................... +...................... +...................... +patch 299 +height 3 +width 6 +map +@..... +@..... +...... +patch 300 +height 13 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +..@ +.@@ +patch 301 +height 7 +width 4 +map +.... +.... +.... +.... +...@ +..@@ +.@@@ +patch 302 +height 18 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@@.. +@@@. +patch 303 +height 19 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@@.. +@@@. +patch 304 +height 18 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@@.. +patch 305 +height 26 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +.......@ +@......@ +@@.....@ +@@@....@ +@@@@.... +@@@@@... +@@@@@@.@ +patch 306 +height 20 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......@@@ +..@@@@@@@ +patch 307 +height 7 +width 10 +map +....@@@@@@ +.....@@@@@ +......@@@@ +.......@@@ +........@@ +.........@ +.......... +patch 308 +height 8 +width 17 +map +...........@@@@@@ +...........@@@@@@ +............@@@@@ +.............@@@@ +..............@@@ +...............@@ +................@ +................. +patch 309 +height 20 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +@@@@.. +patch 310 +height 8 +width 16 +map +@@@@@@@@@@@@@@.. +@@@@@@@@@@@@@@.. +.@@@@@@@@@@@@@@. +.@@@@@@@@@@@@@@. +.@@@@@@@@@@@@@@. +.@@@@@@@@@@@@@@. +.@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@ +patch 311 +height 3 +width 11 +map +@@@@@@@@@@@ +@@@@@@@.... +@@@........ +patch 312 +height 10 +width 7 +map +....... +....... +....... +....... +@...... +@@..... +@@@.... +@@@@... +@@@@@.. +@@@@@@. +patch 313 +height 9 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +@... +@@.. +patch 314 +height 15 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@... +@@.. +@@.. +@@@. +patch 315 +height 9 +width 17 +map +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@..... +@@@@@@@.......... +@................ +patch 316 +height 2 +width 6 +map +...... +...... +patch 317 +height 7 +width 3 +map +... +... +... +... +... +... +... +patch 318 +height 24 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 319 +height 24 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 320 +height 27 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +..........@ +.........@@ +........@@@ +.......@@@@ +......@@@@@ +.....@@@@@@ +patch 321 +height 2 +width 2 +map +.. +.. +patch 322 +height 9 +width 3 +map +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +.@@ +.@@ +.@@ +patch 323 +height 8 +width 7 +map +.....@@ +.....@@ +.....@@ +......@ +......@ +......@ +......@ +....... +patch 324 +height 9 +width 17 +map +................. +................. +................. +................. +................. +......@@@@....... +..@@@@@@@@....... +@.@@@@@@@@....... +@@@@@@@@@@@...... +patch 325 +height 4 +width 17 +map +................. +................@ +...............@@ +..............@@@ +patch 326 +height 5 +width 19 +map +................... +..................@ +.................@@ +................@@@ +@..............@@@@ +patch 327 +height 2 +width 7 +map +@@@@@@. +.@@.... +patch 328 +height 5 +width 6 +map +...... +.....@ +....@@ +...@@@ +@.@@@@ +patch 329 +height 1 +width 8 +map +........ +patch 330 +height 19 +width 8 +map +....@@@@ +.....@@@ +......@@ +.......@ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 331 +height 17 +width 4 +map +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 332 +height 18 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 333 +height 15 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 334 +height 9 +width 5 +map +.@@@@ +..@@@ +...@@ +..... +..... +..... +..... +..... +..... +patch 335 +height 11 +width 13 +map +@@@@@@@@@@@@. +@@@@@@@@@@@@@ +.@@@@@@@@@@@@ +.@@@@@@@@@@@@ +.@@@@@@@@@@@. +.@@@@@@@@@@@. +.@@@@@@@@@@@. +..@@@@@@@@@@. +..@@@@@@@@@@. +..@@@@@@@@@@@ +..@@@@@@@@@@@ +patch 336 +height 3 +width 5 +map +..... +....@ +...@@ +patch 337 +height 4 +width 11 +map +........... +..........@ +.........@. +........... +patch 338 +height 7 +width 12 +map +............ +............ +............ +..........@. +.........@@@ +.......@@@@@ +......@@@@@@ +patch 339 +height 9 +width 7 +map +.....@@ +.....@@ +......@ +......@ +......@ +......@ +......@ +....... +....... +patch 340 +height 3 +width 19 +map +.................@@ +..................@ +................... +patch 341 +height 4 +width 18 +map +...............@@@ +................@@ +.................@ +.................. +patch 342 +height 7 +width 18 +map +............@@@@@@ +.............@@@@@ +..............@@@@ +...............@@@ +................@@ +.................@ +.................. +patch 343 +height 21 +width 13 +map +....@@@...... +...@@@@...... +..@@@@....... +.@@@@........ +@@@@......... +@@@.......... +@@........... +@............ +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +patch 344 +height 22 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +......@ +.....@@ +....@@@ +...@@@@ +..@@@@@ +.@@@@@@ +patch 345 +height 19 +width 3 +map +..@ +..@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +... +... +..@ +.@@ +patch 346 +height 2 +width 4 +map +@@@@ +@@@@ +patch 347 +height 7 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.. +.@ +patch 348 +height 12 +width 4 +map +.@.. +@@.. +@@@. +@@@. +@@@. +@@@. +@@@. +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +patch 349 +height 7 +width 8 +map +........ +......@@ +..@@@@.@ +@@@@@... +@@@@.... +@@@..... +.@...... +patch 350 +height 2 +width 23 +map +.................@@@@@@ +....................... +patch 351 +height 3 +width 31 +map +.............................@@ +..............................@ +............................... +patch 352 +height 5 +width 29 +map +..........................@@@ +...........................@@ +............................@ +............................. +............................. +patch 353 +height 10 +width 4 +map +@@@. +@@.. +@... +.... +.... +.... +.... +@... +@... +@... +patch 354 +height 2 +width 3 +map +... +... +patch 355 +height 3 +width 14 +map +.............. +.............@ +............@@ +patch 356 +height 6 +width 11 +map +........... +@.........@ +@........@@ +@.......@@@ +@......@@@@ +@.....@@@@@ +patch 357 +height 1 +width 6 +map +...... +patch 358 +height 17 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +@........ +@@....... +@@@...... +@@@@..... +patch 359 +height 20 +width 9 +map +.....@@@@ +.....@@@@ +.....@@@@ +.....@@@@ +......@@@ +......@@@ +......@@@ +......@@@ +......@@@ +.......@@ +.......@@ +.......@@ +.......@@ +........@ +........@ +........@ +........@ +........@ +......... +......... +patch 360 +height 8 +width 1 +map +@ +@ +@ +@ +@ +@ +@ +@ +patch 361 +height 8 +width 11 +map +@@@@@...... +@@@@@...... +@@@@@@..... +@@@@@@..... +@@@@@@..... +@@@@@@..... +@@@@@@..... +@@@@@@@.... +patch 362 +height 8 +width 27 +map +....................@@@@@@@ +.....................@@@@@@ +......................@@@@@ +.......................@@@@ +........................@@@ +.........................@@ +..........................@ +........................... +patch 363 +height 9 +width 24 +map +...................@@@@@ +....................@@@@ +.....................@@@ +......................@@ +.......................@ +........................ +........................ +@....................... +@@...................... +patch 364 +height 9 +width 21 +map +..................... +@.................... +@@................... +@@@.................. +@@@@................. +@@@@@................ +@@@@@@............... +@@@@@@@.............. +@@@@@@@@............. +patch 365 +height 9 +width 12 +map +............ +@........... +@@.......... +@@@......... +@@@@........ +@@@@@....... +@@@@@@...... +@@@@@@@..... +@@@@@@@@.... +patch 366 +height 23 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 367 +height 20 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 368 +height 4 +width 28 +map +................@@@@@@@@@@@@ +..........................@@ +...........................@ +............................ +patch 369 +height 5 +width 11 +map +........... +........... +........... +........... +........... +patch 370 +height 12 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 371 +height 13 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 372 +height 14 +width 2 +map +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 373 +height 15 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 374 +height 12 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 375 +height 5 +width 18 +map +..............@@@@ +...............@@@ +................@@ +.................@ +.................. +patch 376 +height 4 +width 4 +map +.... +.... +.... +.... +patch 377 +height 20 +width 4 +map +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 378 +height 21 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 379 +height 17 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 380 +height 9 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.. +.. +.. +.. +patch 381 +height 15 +width 20 +map +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +.................... +patch 382 +height 13 +width 11 +map +@@@@@@@@... +@@@@@@@@@.. +@@@@@@@@@.. +@@@@@@@@@.. +@@@@@@@@@.. +@@@@@@@@@.. +@@@@@@@@@@. +@@@@@@@@@@. +@@@@@@@@@@. +@@@@@@@@@@. +@@@@@@@@@@. +@@@@@@@@@@. +@@@@@@@@@@@ +patch 383 +height 11 +width 10 +map +.......@@@ +........@@ +.........@ +@......... +@......... +@......... +@......... +@......... +@@........ +@@........ +@@........ +patch 384 +height 6 +width 6 +map +...... +...... +...... +...... +...... +...... +patch 385 +height 11 +width 6 +map +.....@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 386 +height 12 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +patch 387 +height 9 +width 12 +map +@@@@@@@@@@@. +@@@@@....... +............ +............ +............ +............ +............ +............ +............ +patch 388 +height 12 +width 12 +map +@@@@@@@@@... +@@@@........ +@@.......... +............ +............ +............ +............ +............ +............ +............ +............ +............ +patch 389 +height 5 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +patch 390 +height 5 +width 16 +map +................ +................ +................ +................ +................ +patch 391 +height 3 +width 14 +map +.............. +.............. +@............. +patch 392 +height 3 +width 3 +map +... +... +... +patch 393 +height 3 +width 25 +map +......................... +......................... +......................... +patch 394 +height 12 +width 13 +map +@@@@@@@@@@@.@ +@@..@@@@@@@.. +....@@@@@@@@. +.....@@@@@@@. +.....@@@@.... +............. +............. +............. +............. +............. +@............ +@@........... +patch 395 +height 27 +width 13 +map +@@@@@@....... +@@@@@........ +@@@@......... +@@@.......... +@@........... +@............ +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +@............ +@............ +@............ +patch 396 +height 27 +width 3 +map +... +... +@@@ +@@@ +@@@ +@@@ +.@@ +.@@ +.@@ +.@@ +..@ +... +..@ +..@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +patch 397 +height 2 +width 4 +map +.... +.@@@ +patch 398 +height 7 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.. +.. +patch 399 +height 7 +width 2 +map +.. +.. +@. +@. +@. +@. +@. +patch 400 +height 5 +width 10 +map +.......... +.......... +.......... +.......... +.......... +patch 401 +height 3 +width 20 +map +.................... +.................... +.................... +patch 402 +height 8 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +patch 403 +height 3 +width 7 +map +.....@@ +......@ +....... +patch 404 +height 3 +width 15 +map +..............@ +............... +..............@ +patch 405 +height 7 +width 24 +map +......................@@ +......................@@ +.......................@ +.......................@ +.......................@ +.......................@ +........................ +patch 406 +height 7 +width 25 +map +........................@ +........................@ +@.......................@ +@@....................... +@@@..................@@@@ +@@@@.............@@@@@@@@ +@@@@@............@@@@@@@@ +patch 407 +height 3 +width 12 +map +...........@ +@........... +@@@@@....... +patch 408 +height 4 +width 8 +map +.......@ +@......@ +@....... +@....... +patch 409 +height 2 +width 3 +map +@@@ +@@@ +patch 410 +height 6 +width 7 +map +...@@@@ +@@@@@@@ +@@@@@@@ +.@@@@@@ +.@@@@@@ +..@@@@@ +patch 411 +height 10 +width 8 +map +.......@ +.......@ +.......@ +.@@@...@ +@@@@.... +@@@@.... +@@@@@... +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 412 +height 7 +width 2 +map +.. +.. +.. +.. +@. +@. +@. +patch 413 +height 3 +width 7 +map +@@@.... +....... +....... +patch 414 +height 4 +width 12 +map +@@@......... +@@.......... +@........... +............ +patch 415 +height 5 +width 13 +map +@@@@......... +@@@.......... +@@........... +@............ +............. +patch 416 +height 5 +width 12 +map +@@@......... +@@.......... +@........... +............ +............ +patch 417 +height 6 +width 3 +map +@@@ +@@@ +@@@ +@@@ +..@ +... +patch 418 +height 4 +width 1 +map +. +. +. +. +patch 419 +height 8 +width 3 +map +... +... +@.. +@.. +@.. +@@. +@@. +@@. +patch 420 +height 18 +width 7 +map +@@..... +@@..... +@@..... +@@@...@ +@@@...@ +@@@...@ +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +..@@@@@ +patch 421 +height 3 +width 6 +map +...... +...... +...@@@ +patch 422 +height 7 +width 6 +map +.@@@@@ +.@@@@. +...... +...... +...... +...... +.@@@@@ +patch 423 +height 26 +width 3 +map +..@ +... +@@. +@@. +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +..@ +..@ +... +... +.@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@. +... +... +@.. +@.. +patch 424 +height 8 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +@... +@.@@ +patch 425 +height 5 +width 4 +map +.... +.... +.... +.... +.... +patch 426 +height 8 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@. +@@@@...... +patch 427 +height 10 +width 11 +map +@@@@.....@@ +@.........@ +@@......... +@@......... +@@......... +........... +........... +........... +........... +........... +patch 428 +height 4 +width 26 +map +.......................... +....................@@@@@@ +................@@@@@@@@@@ +................@@@@@@@@@@ +patch 429 +height 5 +width 17 +map +................@ +................. +................. +................. +................. +patch 430 +height 4 +width 18 +map +.................@ +.................@ +.................. +.................. +patch 431 +height 5 +width 22 +map +.................@@@.@ +@....................@ +@@.................... +@@@................... +@@@@.................. +patch 432 +height 9 +width 6 +map +....@. +@@@@@. +@@@@@. +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 433 +height 6 +width 8 +map +........ +........ +........ +........ +........ +........ +patch 434 +height 12 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +@@@@@... +patch 435 +height 21 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +@@@..... +@@@..... +@@@..... +patch 436 +height 11 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +..@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@. +.@@@...... +patch 437 +height 1 +width 17 +map +................. +patch 438 +height 12 +width 19 +map +.................@@ +.................@@ +..................@ +@.................@ +@.................@ +@.................@ +@@................@ +@@@................ +@@@@............... +@@@@@.............. +@@@@@@............. +@@@@@@@............ +patch 439 +height 7 +width 13 +map +@@@@@@....... +@@@@@........ +@@@@......... +@@@.......... +@@........... +@............ +............. +patch 440 +height 18 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 441 +height 19 +width 11 +map +@.......... +@.......... +@@......... +@@......... +@@......... +@@......... +@@......... +@@@........ +@@@........ +@@@........ +........... +........... +........... +........... +........... +........... +........... +@.......... +@@......... +patch 442 +height 32 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 443 +height 26 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 444 +height 10 +width 15 +map +........@@@@@@@ +.........@@@@@@ +..........@@@@@ +...........@@@@ +............@@@ +@.............. +@.............. +@.............. +@.............. +@.............. +patch 445 +height 19 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@. +@@@@.. +@@@@.. +@@@... +@@.... +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 446 +height 8 +width 8 +map +........ +@....... +@@...... +@@@..... +@@@@.... +@@@@@... +@@@@@@.. +@@@@@@@. +patch 447 +height 15 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +@........ +@@....... +@@@...... +@@@@..... +@@@@@.... +@@@@@@... +patch 448 +height 17 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 449 +height 18 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +.......@@ +patch 450 +height 28 +width 9 +map +.@@@@@@@@ +..@@@@@@@ +...@@@@@@ +....@@@@@ +.....@@@@ +......@@@ +.......@@ +........@ +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......@@@ +patch 451 +height 10 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +.@@@ +patch 452 +height 15 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +@... +@... +@... +@... +@... +@@.. +@@.. +patch 453 +height 9 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +..@@@@@ +patch 454 +height 5 +width 9 +map +......... +......... +......... +.......@@ +..@@@@@@@ +patch 455 +height 8 +width 14 +map +...........@@@ +.@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@......... +patch 456 +height 15 +width 18 +map +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +patch 457 +height 4 +width 8 +map +@@@@@@@. +@@@@@@.. +@@@@@... +........ +patch 458 +height 8 +width 9 +map +@@@@@.... +@@@...... +@........ +......... +......... +......... +......... +......... +patch 459 +height 1 +width 23 +map +....................... +patch 460 +height 1 +width 11 +map +........... +patch 461 +height 4 +width 12 +map +@@.......... +@........... +............ +............ +patch 462 +height 4 +width 55 +map +@@@@@@@@@@@@........................................... +@@@@@@@................................................ +@@..................................................... +....................................................... +patch 463 +height 10 +width 8 +map +@@@@@@@. +@@@@@@.. +@@@@@... +@@@@.... +@@...... +........ +........ +........ +........ +........ +patch 464 +height 10 +width 8 +map +@@@@@@@. +@@@@@... +@@@@.... +@@...... +........ +........ +........ +........ +........ +........ +patch 465 +height 9 +width 17 +map +@@@@.@@@@@@@@@@@@ +@@....@@@@@@@@@@@ +.......@.@@@@@@@@ +.........@@@@@@@@ +..........@@@@@@@ +...........@@@@@@ +............@@@@@ +............@@@@@ +.............@@@. +patch 466 +height 8 +width 8 +map +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +.@@@@@@@ +.@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 467 +height 7 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +patch 468 +height 8 +width 15 +map +............... +............... +............... +............... +............... +............... +............... +............... +patch 469 +height 6 +width 18 +map +.................. +.................. +.................. +@................. +@@................ +@@@.....@@@....... +patch 470 +height 4 +width 6 +map +...... +...... +...... +...... +patch 471 +height 4 +width 3 +map +... +... +... +... +patch 472 +height 22 +width 4 +map +.@@@ +.@@@ +..@@ +..@@ +..@@ +..@@ +...@ +...@ +...@ +...@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 473 +height 5 +width 22 +map +..................@@@@ +...................@@@ +....................@@ +.....................@ +...................... +patch 474 +height 20 +width 23 +map +....................... +....................... +....................... +....................... +....................... +....................... +....................... +....................... +....................... +@...................... +@...................... +@...................... +@...................... +@...................... +@...................... +@@..................... +@@..................... +@@..................... +@@..................... +...................@@@@ +patch 475 +height 3 +width 14 +map +.@@@@@@....... +@@@@@@@@@..... +@@@@@@@@@@@... +patch 476 +height 8 +width 5 +map +....@ +....@ +....@ +..... +..... +..... +..... +.@@@@ +patch 477 +height 4 +width 15 +map +............... +............... +............... +............... +patch 478 +height 10 +width 6 +map +...@@@ +...@@@ +...@@@ +.....@ +.....@ +.....@ +.....@ +...... +...... +...... +patch 479 +height 5 +width 27 +map +.................@@@....... +........................... +........................... +........................... +........................... +patch 480 +height 6 +width 7 +map +....... +....... +....... +....... +....... +@...... +patch 481 +height 11 +width 8 +map +......@@ +......@@ +......@@ +......@@ +......@@ +.......@ +.......@ +.......@ +.......@ +.......@ +........ +patch 482 +height 4 +width 23 +map +....................@@@ +.....................@@ +......................@ +@...................... +patch 483 +height 5 +width 5 +map +@@@@. +@@@.. +@@... +@.... +...@@ +patch 484 +height 7 +width 12 +map +@@@@@@@@@@@@ +@@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +patch 485 +height 6 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@. +.@@@...... +patch 486 +height 5 +width 12 +map +........@@@@ +..@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +patch 487 +height 2 +width 1 +map +@ +@ +patch 488 +height 9 +width 7 +map +@@@@@@@ +@@@@@@@ +@@@@@@@ +.@@@@@. +.@@@@.. +.@@@... +.@@.... +.@..... +.@..... +patch 489 +height 16 +width 16 +map +.............@@@ +..............@@ +...............@ +................ +................ +................ +................ +................ +............@@@@ +.........@@@@@@@ +.........@@@@@@@ +.........@@@@@@@ +..........@@@@@@ +@.........@@@@@@ +..........@@@@@@ +..........@@@@@@ +patch 490 +height 9 +width 14 +map +.............@ +.............@ +.............@ +.............. +@............. +@............. +@............. +@............. +@............. +patch 491 +height 22 +width 22 +map +@@@@@@@@@............. +@@@@@@@@.............. +@@@@@@@............... +@@@@@@................ +@@@@@................. +@@@@.................. +@@@................... +@@.................... +@..................... +...................... +...................... +...................... +...................... +.....................@ +....................@@ +...................@@@ +..................@@@@ +.................@@@@@ +................@@@@@@ +...............@@@@@@@ +..............@@@@@@@@ +.............@@@@@@@@@ +patch 492 +height 10 +width 15 +map +.............@@ +.............@@ +.............@@ +..............@ +@.............@ +@.............@ +@.............@ +@.............@ +@.............. +@@............. +patch 493 +height 14 +width 5 +map +@@@@. +@@@.. +@@... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..@@@ +patch 494 +height 18 +width 6 +map +@@@@.. +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +...@@@ +patch 495 +height 4 +width 11 +map +........... +........@@@ +......@@@@@ +..@@@@@@@@@ +patch 496 +height 5 +width 4 +map +...@ +.... +.... +.... +.... +patch 497 +height 22 +width 22 +map +..............@....... +..............@.@..... +...............@@.@... +................@@@.@. +.................@@@@. +..................@@@@ +...................@@@ +....................@@ +.....................@ +...................... +...................... +@..................... +@..................... +@..................... +@@.................... +@@@................... +@@@@.................. +@@@@@................. +@@@@@@................ +@@@@@@@............... +@@@@@@@@.............. +@@@@@@@@@............. +patch 498 +height 13 +width 16 +map +............@@@@ +.............@@@ +@.............@@ +@.............@@ +@.............@@ +@.............@@ +@..............@ +@@.............@ +@@.............@ +@@.............@ +@@.............@ +@@.............. +@@@............. +patch 499 +height 10 +width 7 +map +....... +....... +....... +....... +@...... +@...... +....... +....... +@...... +@..@@@@ +patch 500 +height 13 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +@.. +@@. +patch 501 +height 13 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@@.. +@@@. +patch 502 +height 17 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@@. +patch 503 +height 16 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@@.. +patch 504 +height 16 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +..@@@@... +@@@@@@... +@@@@@@... +patch 505 +height 6 +width 9 +map +......... +......... +......... +......... +......... +......... +patch 506 +height 5 +width 8 +map +.@@@@@@@ +....@@@@ +......@@ +........ +........ +patch 507 +height 6 +width 9 +map +..@@@@@@@ +....@@@@@ +......@@@ +........@ +......... +......... +patch 508 +height 7 +width 11 +map +......@@@@@ +..@@@@@@@@@ +@@@@@@@@@@@ +..@@@@@@@@@ +....@@@@@@@ +......@@@@@ +.@......@@@ +patch 509 +height 10 +width 12 +map +.........@@@ +....@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@. +patch 510 +height 13 +width 21 +map +@@@@@@@@@@@@@@..@@@.. +@@@@@@@@@............ +@@@@................. +@.................... +..................... +..................... +..................... +..................... +..................... +....................@ +...................@@ +..................@@@ +.................@@@@ +patch 511 +height 12 +width 6 +map +.....@ +.....@ +.....@ +.....@ +.....@ +...... +...... +...... +...... +...... +...... +@..... +patch 512 +height 2 +width 6 +map +.@@@@@ +.@@@@@ +patch 513 +height 11 +width 11 +map +..........@ +..........@ +........... +........... +........... +........... +........... +........... +........... +........... +........... +patch 514 +height 4 +width 6 +map +@@@@.. +...... +...... +...... +patch 515 +height 8 +width 7 +map +@...... +@...... +@...... +....... +....... +....... +....... +....@@. +patch 516 +height 4 +width 8 +map +....@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@@ +patch 517 +height 2 +width 5 +map +..... +..... +patch 518 +height 4 +width 23 +map +@@@@@@@@............... +@@@@@@@@............... +@@@@@@@@............... +@@@@@@@@............... +patch 519 +height 9 +width 28 +map +@@@@@@@@@................... +@@@@@@@@@................... +@@@@@@@@@................... +@@@@@@@@@................... +@@@@@@@@@................... +@@@@@@@@@..................@ +@@@@@@@@@@................@@ +@@@@@@@@@@...............@@@ +@@@@@@@@@@..............@@@@ +patch 520 +height 9 +width 17 +map +...........@@@@@@ +............@@@@@ +.............@@@@ +..............@@@ +...............@@ +................@ +................. +................. +................. +patch 521 +height 4 +width 17 +map +................. +................. +@................ +@@............... +patch 522 +height 5 +width 7 +map +....... +@...... +@@..... +@@@.... +@@@@... +patch 523 +height 6 +width 6 +map +...... +@..... +@@.... +@@@... +@@@@.. +@@@@@. +patch 524 +height 12 +width 7 +map +.....@@ +.....@@ +.....@@ +.....@@ +.....@@ +......@ +......@ +......@ +......@ +....... +....... +@...... +patch 525 +height 5 +width 3 +map +.@@ +..@ +... +... +... +patch 526 +height 11 +width 8 +map +........ +........ +........ +........ +........ +@....... +@@...... +@@@..... +@@@@.... +@@@@@... +@@@@@@.. +patch 527 +height 15 +width 9 +map +.....@@@@ +......@@@ +.......@@ +........@ +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 528 +height 7 +width 13 +map +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@..... +@@@.......... +patch 529 +height 5 +width 14 +map +@@@@@.....@@@@ +...........@@@ +............@@ +.............@ +.............. +patch 530 +height 7 +width 7 +map +.@@@@@@ +..@@@@@ +...@@@@ +....@@@ +.....@@ +......@ +....... +patch 531 +height 3 +width 5 +map +..... +@.... +@@... +patch 532 +height 9 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 533 +height 5 +width 13 +map +.........@@@@ +..........@@@ +...........@@ +............@ +............. +patch 534 +height 5 +width 8 +map +........ +........ +........ +........ +........ +patch 535 +height 2 +width 7 +map +@@@@@@@ +@@@.... +patch 536 +height 5 +width 13 +map +............. +............. +............. +............. +............. +patch 537 +height 15 +width 5 +map +....@ +....@ +....@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 538 +height 4 +width 5 +map +..@@@ +@..@@ +@...@ +@.... +patch 539 +height 4 +width 23 +map +@@@@@@@@@@@@........@@@ +@@@@@@@..............@@ +@@@...................@ +....................... +patch 540 +height 9 +width 30 +map +........................@@@@@@ +.........................@@@@@ +..........................@@@@ +...........................@@@ +............................@@ +.............................@ +.............................. +.............................. +.............................. +patch 541 +height 4 +width 29 +map +............................. +............................. +............................. +............................. +patch 542 +height 4 +width 16 +map +......@@@....... +..@@@@@@@.....@@ +@@@@@@@@@.@@@@@@ +@@@@@@@@@@@@@@@@ +patch 543 +height 10 +width 10 +map +@@@@...... +@@@....... +@@........ +@......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 544 +height 12 +width 6 +map +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 545 +height 7 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@....... +patch 546 +height 2 +width 7 +map +....... +....... +patch 547 +height 2 +width 23 +map +....................... +...................@@@@ +patch 548 +height 8 +width 15 +map +...........@@@. +.....@@@@@@@@@. +@@@@@@@@@@@@@@. +@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@. +@@@@@@@@@@@@@.. +patch 549 +height 1 +width 5 +map +.@@.. +patch 550 +height 3 +width 6 +map +@@@.@@ +@@@..@ +...... +patch 551 +height 3 +width 30 +map +@@@@@@@@@@@@@@@@@@@........... +@@@@@@@@@@..@@@............... +...@@@........................ +patch 552 +height 3 +width 2 +map +.@ +@@ +.@ +patch 553 +height 5 +width 18 +map +.................@ +.................@ +.................@ +.................. +.................. +patch 554 +height 6 +width 23 +map +....................... +....................... +.@..................... +.@@.................... +@@@@................... +....................... +patch 555 +height 7 +width 14 +map +.............. +.............. +.............. +.............. +.............. +.............. +.............. +patch 556 +height 16 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 557 +height 3 +width 4 +map +...@ +...@ +.... +patch 558 +height 11 +width 7 +map +@@@@@.. +@@@@@.. +@@@@@.. +@@@@@.. +@@@@@.. +@@@@@@. +@@@@@@. +@@@@@@. +@@@@@@. +@@@@@@. +@@@@@@@ +patch 559 +height 4 +width 12 +map +............ +............ +............ +............ +patch 560 +height 8 +width 15 +map +............... +............... +............... +............... +@.............. +@@............. +@@@............ +@@@@........... +patch 561 +height 5 +width 6 +map +..@@@@ +...@@@ +....@@ +.....@ +...... +patch 562 +height 6 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +.....@ +...... +patch 563 +height 5 +width 13 +map +............. +@............ +.@........... +..@.......... +...@......... +patch 564 +height 3 +width 9 +map +......... +......... +@@@@@.... +patch 565 +height 6 +width 7 +map +......@ +.@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +patch 566 +height 3 +width 16 +map +@@@@@@@@@@...... +@@@............. +................ +patch 567 +height 2 +width 8 +map +@@@@@@.. +@....... +patch 568 +height 3 +width 1 +map +@ +@ +@ +patch 569 +height 4 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@.. +@@....... +patch 570 +height 1 +width 4 +map +@@@@ +patch 571 +height 3 +width 11 +map +@@@@@...... +@.......... +........... +patch 572 +height 2 +width 47 +map +............................................... +............................................... +patch 573 +height 4 +width 40 +map +........................................ +........................................ +........................................ +..@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@........ +patch 574 +height 30 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 575 +height 36 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 576 +height 2 +width 8 +map +@@@@@@@@ +.@@@@@@@ +patch 577 +height 9 +width 8 +map +.....@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 578 +height 3 +width 15 +map +.............@@ +..............@ +............... +patch 579 +height 2 +width 2 +map +@@ +.@ +patch 580 +height 5 +width 9 +map +.....@@@. +......@@@ +.......@@ +......... +......... +patch 581 +height 3 +width 10 +map +........@@ +.........@ +.......... +patch 582 +height 4 +width 19 +map +................@@@ +.................@@ +..................@ +................... +patch 583 +height 3 +width 27 +map +.........................@@ +@.........................@ +@@......................... +patch 584 +height 3 +width 3 +map +... +@.. +@@. +patch 585 +height 21 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +@@@@........ +@@@@........ +@@@@........ +@@@@@....... +@@@@@....... +@@@@@@...... +@@@@@@@..... +@@@@@@@@.... +patch 586 +height 12 +width 6 +map +.@@@.. +..@@@. +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +patch 587 +height 6 +width 6 +map +.@@@.. +..@@@. +...@@@ +....@@ +.....@ +...... +patch 588 +height 23 +width 4 +map +...@ +..@@ +.@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@. +@@@. +@@.. +@... +@... +patch 589 +height 19 +width 4 +map +.@.. +@@@. +@@@. +@@@. +@@@. +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@. +@@.. +@@.. +@... +@... +patch 590 +height 9 +width 8 +map +@@@@.... +@@@..... +@@...... +@....... +........ +........ +........ +........ +........ +patch 591 +height 13 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 592 +height 17 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 593 +height 11 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 594 +height 5 +width 6 +map +...... +...... +@..... +@..... +@..... +patch 595 +height 4 +width 8 +map +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@..... +patch 596 +height 4 +width 3 +map +@@. +@@@ +@@@ +@@@ +patch 597 +height 9 +width 4 +map +...@ +..@@ +.@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@. +patch 598 +height 13 +width 5 +map +....@ +...@@ +..@@@ +.@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@.. +patch 599 +height 17 +width 4 +map +...@ +..@@ +.@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@.. +patch 600 +height 21 +width 5 +map +....@ +...@@ +..@@@ +.@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@... +patch 601 +height 4 +width 9 +map +@@@...... +@@@...... +@@@...... +@@@...... +patch 602 +height 5 +width 14 +map +.............. +.............. +.............. +@............. +@@............ +patch 603 +height 4 +width 16 +map +................ +@............... +@@.............. +@@@............. +patch 604 +height 5 +width 9 +map +......... +@........ +@@....... +@@@...... +@@@@..... +patch 605 +height 6 +width 7 +map +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@... +patch 606 +height 4 +width 4 +map +.... +@... +@@.. +@@@. +patch 607 +height 6 +width 15 +map +............... +@.............. +@@............. +@@@............ +@@@@........... +@@@@@.......... +patch 608 +height 5 +width 8 +map +...@...@ +@@@@@... +@@@@@@.. +@@@@@@@. +.@@@@@@@ +patch 609 +height 6 +width 11 +map +@@@@@@@@... +@@@@@@@@@.. +@@@@@@@@@@. +.@@@@@@@@@@ +.@@@@@@@@@. +.@@@....... +patch 610 +height 6 +width 5 +map +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 611 +height 13 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +patch 612 +height 16 +width 10 +map +@@@....@@@ +@@......@@ +@.......@@ +........@@ +........@@ +........@@ +.........@ +.........@ +.........@ +.........@ +.........@ +.......... +.......... +.......... +.......... +.......... +patch 613 +height 6 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@... +patch 614 +height 3 +width 11 +map +........... +........... +........... +patch 615 +height 6 +width 1 +map +. +. +. +. +. +. +patch 616 +height 3 +width 1 +map +. +. +. +patch 617 +height 9 +width 28 +map +............................ +...........................@ +..........................@@ +.........................@@@ +........................@@@@ +.......................@@@@@ +......................@@@@@@ +.....................@@@@@@@ +.....................@@@@@@@ +patch 618 +height 12 +width 23 +map +@@@@@@@@@@@@........... +....................... +....................... +....................... +....................... +....................... +....................... +....................... +....................... +....................... +....................... +......................@ +patch 619 +height 2 +width 8 +map +........ +........ +patch 620 +height 23 +width 23 +map +................@...... +................@.@.... +.................@@.@.. +..................@@@.@ +...................@@@@ +....................@@@ +.....................@@ +......................@ +....................... +....................... +....................... +....................... +....................... +....................... +....................... +@...................... +@@..................... +@@@.................... +@@@@................... +@@@@@.................. +@@@@@@................. +@@@@@@@................ +@@@@@@@@............... +patch 621 +height 8 +width 21 +map +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +patch 622 +height 11 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 623 +height 6 +width 7 +map +....... +....... +....... +...@@@. +@@@@@@. +@@@@@@. +patch 624 +height 8 +width 8 +map +......@@ +.......@ +.......@ +.......@ +........ +........ +........ +........ +patch 625 +height 25 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +@@@@.. +@@@@@. +patch 626 +height 4 +width 5 +map +..... +..... +..... +..... +patch 627 +height 11 +width 11 +map +........@@@ +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +patch 628 +height 11 +width 21 +map +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +....................@ +................@@@@@ +patch 629 +height 6 +width 2 +map +.. +.. +.. +.. +.. +.. +patch 630 +height 5 +width 9 +map +......... +......... +......... +@........ +@........ +patch 631 +height 5 +width 13 +map +............. +............. +............. +@............ +@............ +patch 632 +height 11 +width 9 +map +@@....... +......... +......... +@........ +@@....... +@@@...... +@@@@..... +@@@@@.... +@@@@@@... +@@@@@@@.. +@@@@@@@@. +patch 633 +height 18 +width 17 +map +................. +................. +................. +@................ +@................ +@................ +@................ +@................ +@@............... +@@............... +@@............... +@@............... +@@............... +@@@.............. +@@@.............. +@@@.............. +@@@.............. +@@@.............. +patch 634 +height 1 +width 2 +map +.. +patch 635 +height 5 +width 6 +map +...... +...... +...... +@..... +@..... +patch 636 +height 11 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +patch 637 +height 9 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 638 +height 2 +width 12 +map +............ +....@@@@@@@@ +patch 639 +height 4 +width 10 +map +@@@@@@@... +@@@....... +.......... +.......... +patch 640 +height 8 +width 6 +map +...@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +.@@@@@ +.@@@@@ +patch 641 +height 18 +width 14 +map +.............. +.............. +.@@@.......... +@@@@.......... +@@@@.......... +@@@@.......... +@@@@@......... +@@@@@......... +@@@@@......... +@@@@@......... +@@@@@......... +@@@@@......... +@@@@@@........ +@@@@@@........ +@@@@@@........ +.@@@@@........ +..@........... +.............. +patch 642 +height 18 +width 3 +map +.@@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 643 +height 19 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 644 +height 15 +width 3 +map +.@@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 645 +height 16 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 646 +height 14 +width 15 +map +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +patch 647 +height 8 +width 8 +map +...@@@@. +@@@@@@@. +@@@@@@@. +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@...... +patch 648 +height 15 +width 8 +map +@@@.@@@@ +.....@@@ +......@@ +.......@ +........ +........ +........ +........ +........ +.......@ +.......@ +.......@ +........ +........ +........ +patch 649 +height 18 +width 15 +map +............... +............... +............... +............... +............... +............... +............... +............... +............... +.............@@ +.............@@ +.............@@ +..............@ +..............@ +..............@ +..............@ +..............@ +............... +patch 650 +height 6 +width 23 +map +@@@.................... +@@..................... +@...................... +....................... +....................... +....................... +patch 651 +height 6 +width 20 +map +.................... +.................... +.................... +.................... +...................@ +..................@@ +patch 652 +height 6 +width 11 +map +........... +..........@ +.........@@ +........@@@ +.......@@@@ +......@@@@@ +patch 653 +height 8 +width 9 +map +@@@@@@@.. +@@@@@@@.. +@@@@@@@@. +@@@@@@@@. +.@@@@@@@. +.@@@@@@@. +.@@@@@@@. +.@@@@@@@. +patch 654 +height 20 +width 15 +map +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +patch 655 +height 8 +width 11 +map +@@@.......@ +@@@........ +@@@........ +@@@........ +@@@........ +@@......... +@.......... +........... +patch 656 +height 8 +width 10 +map +@@@@@..... +@@@@...... +@@@....... +@@........ +@@........ +.......... +.......... +.......... +patch 657 +height 4 +width 10 +map +.......... +.......... +.......... +.......... +patch 658 +height 4 +width 12 +map +...........@ +............ +...........@ +..........@@ +patch 659 +height 9 +width 9 +map +......... +........@ +.......@@ +......@@@ +.....@@@@ +....@@@@@ +...@@@@@@ +..@@@@@@@ +.@@@@@@@@ +patch 660 +height 5 +width 21 +map +....@@@@@@@@@@@@@@@@@ +...@@@@@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@.@@@@ +@@@@@@@@@@@@@@...@@@. +patch 661 +height 3 +width 15 +map +..@@@@@.@@@@@@@ +.@@......@@.... +@@............. +patch 662 +height 3 +width 6 +map +..@@@@ +.@@@@@ +@@.... +patch 663 +height 6 +width 7 +map +....... +....... +....... +....... +....... +....... +patch 664 +height 4 +width 15 +map +.@@@@@@@@@@@@@@ +..@@@@@@@@@@@@. +..@@@@@@@@..... +..@@@.......... +patch 665 +height 18 +width 9 +map +......@@@ +......@@@ +......@@@ +.......@@ +.......@@ +.......@@ +.......@@ +.......@@ +........@ +........@ +........@ +........@ +........@ +......... +......... +......... +......... +......... +patch 666 +height 7 +width 8 +map +........ +........ +........ +........ +........ +........ +@....... +patch 667 +height 11 +width 12 +map +@@@@@....... +@@@@........ +@@@......... +@@.......... +@........... +............ +............ +............ +............ +............ +............ +patch 668 +height 11 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 669 +height 10 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 670 +height 4 +width 2 +map +.. +.. +@. +@. +patch 671 +height 7 +width 8 +map +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 672 +height 3 +width 12 +map +............ +...........@ +..........@@ +patch 673 +height 4 +width 18 +map +.................. +.................@ +.............@@@@@ +..........@@@@@@@@ +patch 674 +height 6 +width 24 +map +.......................@ +.......................@ +........................ +........................ +.......................@ +......................@@ +patch 675 +height 3 +width 25 +map +@........................ +@.......................@ +@............@@@.......@@ +patch 676 +height 3 +width 3 +map +... +@.. +@.. +patch 677 +height 4 +width 6 +map +...... +.....@ +....@@ +...@@@ +patch 678 +height 9 +width 11 +map +@@@@@@@@... +@@@@@@@.... +@@@@@@..... +@@@@@...... +@@@@....... +@@@........ +@@......... +@.......... +........... +patch 679 +height 10 +width 9 +map +......... +......... +......... +......... +......... +......... +........@ +.......@@ +......@@@ +.....@@@@ +patch 680 +height 3 +width 3 +map +@@. +@.. +... +patch 681 +height 8 +width 8 +map +........ +........ +@....... +@....... +@....... +@....... +@....... +@@...... +patch 682 +height 11 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +....@ +...@@ +..@@@ +.@@@@ +patch 683 +height 6 +width 11 +map +......@@@.. +.......@@@. +........@@@ +.........@@ +..........@ +........... +patch 684 +height 6 +width 15 +map +....@@@@@@@@... +@@@@@@@@@@@@@.. +@@@@@@@@@@@@@@. +@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@ +@@@@@@......... +patch 685 +height 4 +width 9 +map +......@@@ +.......@@ +........@ +......... +patch 686 +height 5 +width 10 +map +......@@@. +.......@@@ +........@@ +.........@ +.......... +patch 687 +height 9 +width 7 +map +....... +....... +....... +....... +....... +@...... +@@..... +@@@.... +@@@@... +patch 688 +height 16 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 689 +height 14 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 690 +height 10 +width 18 +map +@@@@@@@@@@@@@@@@@. +@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@.. +@@@@@@@@@@@....... +@@@@@............. +patch 691 +height 5 +width 15 +map +...........@@@@ +............@@@ +.............@@ +..............@ +............... +patch 692 +height 6 +width 21 +map +................@@@@@ +.................@@@@ +..................@@@ +...................@@ +....................@ +..................... +patch 693 +height 7 +width 15 +map +@.............. +@@............. +@.............. +@.............. +............... +............... +@@............. +patch 694 +height 8 +width 23 +map +@@@@@@@@@@@............ +@@@@@@@@@@@............ +@@@@@@@@@@@............ +@@@@@@@@@@@@........... +@@@@@@@@@@@@........... +@@@@@@@@@@@@........... +@@@@@@@@@@@@........... +@@@@@@@@@@@@@.......... +patch 695 +height 6 +width 11 +map +........... +........... +........... +........... +@.......... +@@......... +patch 696 +height 16 +width 12 +map +.......@@@@@ +........@@@@ +.........@@@ +..........@@ +...........@ +...........@ +...........@ +...........@ +............ +............ +............ +............ +............ +............ +............ +............ +patch 697 +height 3 +width 13 +map +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +patch 698 +height 9 +width 19 +map +@@@@@@............. +@@@@@.............. +@@@@............... +@@@................ +@@...........@..... +@............@@@... +............@@@@@@. +............@@@@@@@ +...........@@@@@@@@ +patch 699 +height 10 +width 5 +map +..... +..... +..@.. +..@@@ +.@@@@ +.@@@@ +@@@@@ +@@@@@ +..@@@ +..... +patch 700 +height 5 +width 6 +map +...... +.....@ +.....@ +....@@ +@@..@@ +patch 701 +height 6 +width 5 +map +...@@ +...@@ +....@ +....@ +....@ +....@ +patch 702 +height 13 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +.@@@@@ +.@@@@@ +patch 703 +height 6 +width 18 +map +@@@@@............. +@@@@.............. +@@@............... +@@................ +@................. +.................. +patch 704 +height 7 +width 23 +map +@@@@................... +@@@.................... +@@..................... +@...................... +....................... +....................... +....................... +patch 705 +height 6 +width 25 +map +......................... +........................@ +.......................@@ +......................@@@ +.....................@@@@ +....................@@@@@ +patch 706 +height 6 +width 26 +map +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +patch 707 +height 22 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +...... +@..... +@..... +@..... +@..... +@@.... +@@.... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 708 +height 28 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 709 +height 18 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +...@ +..@@ +.@@@ +patch 710 +height 7 +width 25 +map +@@@@@@................... +@@@@@.................... +@@@@..................... +@@@...................... +@@....................... +@........................ +......................... +patch 711 +height 1 +width 12 +map +............ +patch 712 +height 13 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +....@@ +...@@@ +..@@@@ +.@@@@@ +patch 713 +height 7 +width 7 +map +....... +......@ +.....@@ +....@@@ +...@@@@ +..@@@@@ +.@@@@@@ +patch 714 +height 22 +width 12 +map +@@@@@..@@@@@ +@@@@...@@... +@@@......... +@@.......... +@........... +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +..........@@ +....@@..@@@@ +.@@@@@@@@@@@ +patch 715 +height 18 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +..@ +patch 716 +height 10 +width 7 +map +....... +....... +....... +....... +....... +......@ +.....@@ +....@@@ +...@@@@ +..@@@@@ +patch 717 +height 2 +width 6 +map +@..... +...... +patch 718 +height 2 +width 10 +map +@......... +.......... +patch 719 +height 6 +width 6 +map +...... +.....@ +....@@ +...@@@ +..@@@@ +.@@@@@ +patch 720 +height 3 +width 13 +map +...@@@....... +............. +............. +patch 721 +height 4 +width 7 +map +....... +....... +....... +....... +patch 722 +height 5 +width 3 +map +... +... +... +..@ +.@@ +patch 723 +height 2 +width 33 +map +................................. +................................. +patch 724 +height 3 +width 16 +map +................ +..............@@ +...........@@@@@ +patch 725 +height 3 +width 11 +map +@@......... +@.......... +........... +patch 726 +height 4 +width 16 +map +@@@............. +@@.............. +@............... +...............@ +patch 727 +height 8 +width 21 +map +@@@................@@ +@@.................@@ +@...................@ +....................@ +....................@ +....................@ +....................@ +..................... +patch 728 +height 8 +width 18 +map +.................@ +.................@ +.................@ +.................@ +.................. +.................. +.................. +.................. +patch 729 +height 8 +width 11 +map +..........@ +........... +........... +........... +........... +........... +..........@ +.........@@ +patch 730 +height 2 +width 7 +map +......@ +......@ +patch 731 +height 2 +width 5 +map +..... +....@ +patch 732 +height 5 +width 5 +map +....@ +....@ +..... +..... +..... +patch 733 +height 6 +width 17 +map +................. +................. +................. +................. +................. +................. +patch 734 +height 3 +width 20 +map +.................... +.............@@@@@@@ +...........@@@@@@@@@ +patch 735 +height 3 +width 12 +map +............ +..........@@ +........@@@@ +patch 736 +height 19 +width 9 +map +....@@... +...@@@... +..@@@@... +.@@@@@... +@@@@@@... +@@@@@@@.. +@@@@@@@.. +@@@@@@@.. +@@@@@@@.. +@@@@@@@.. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 737 +height 11 +width 3 +map +@@@ +.@@ +.@@ +.@@ +.@@ +.@@ +..@ +..@ +..@ +..@ +..@ +patch 738 +height 7 +width 20 +map +@.....@@@@@@....@@@@ +..................@@ +.................... +...................@ +...................@ +..................@@ +.................@@@ +patch 739 +height 4 +width 17 +map +................. +..............@@@ +@............@@@@ +@@...........@@@@ +patch 740 +height 4 +width 9 +map +......... +@.......@ +@@....... +@@@.....@ +patch 741 +height 3 +width 9 +map +......... +@.....@@@ +@@....@@@ +patch 742 +height 5 +width 5 +map +..... +..... +..... +..... +..@@@ +patch 743 +height 13 +width 7 +map +....... +....... +....... +@...... +@...... +@...... +@...... +@@..... +@@..... +@@..... +@@@.... +@@@@... +@@@@@.. +patch 744 +height 6 +width 15 +map +............... +............... +............... +............... +............... +............... +patch 745 +height 3 +width 20 +map +.................... +.................... +@@@................. +patch 746 +height 7 +width 19 +map +................... +................... +................... +................... +................... +................... +..............@@@@@ +patch 747 +height 5 +width 19 +map +................@@@ +...........@@@@@@@@ +......@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@ +patch 748 +height 7 +width 17 +map +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@.. +@@@@@@@@@@@@@@... +@@@@@@@@@@@@@@@.. +patch 749 +height 4 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@... +@@@@@@@... +patch 750 +height 4 +width 3 +map +@@@ +... +... +@.. +patch 751 +height 9 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 752 +height 3 +width 13 +map +............. +............. +............. +patch 753 +height 5 +width 7 +map +......@ +......@ +.....@@ +..@..@@ +.@@@@@@ +patch 754 +height 13 +width 7 +map +.....@@ +.@@@.@@ +.@@@@@@ +@@@@@@@ +@@@@@@@ +.@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +patch 755 +height 7 +width 7 +map +@...... +@...... +@...... +@@..... +@@..... +....... +......@ +patch 756 +height 11 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +...... +patch 757 +height 19 +width 15 +map +@@@@........... +@@@............ +@@............. +@.............. +............... +............... +............... +............... +............... +............... +............... +..............@ +.............@@ +............@@@ +...........@@@@ +..........@@@@@ +.........@@@@@@ +........@@@@@@@ +.......@@@@@@@@ +patch 758 +height 7 +width 14 +map +........@@@@@@ +..@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@.. +patch 759 +height 2 +width 7 +map +@@@@@@@ +@@@@@@@ +patch 760 +height 7 +width 7 +map +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@. +@@..... +patch 761 +height 10 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 762 +height 7 +width 19 +map +................... +................... +................... +@.................. +@.................. +@.................. +@.................. +patch 763 +height 7 +width 24 +map +........................ +@....................... +@......................@ +@......................@ +@......................@ +@....................... +@@...................... +patch 764 +height 7 +width 23 +map +......................@ +......................@ +@.....................@ +@@....................@ +@@@.................... +@@@@................... +@@@@@.................. +patch 765 +height 7 +width 19 +map +..................@ +@.................@ +@@................. +@@@................ +@@@@............... +@@@@@.............. +@@@@@@............. +patch 766 +height 3 +width 9 +map +@@.@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 767 +height 8 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@..... +patch 768 +height 9 +width 17 +map +.............@@@@ +........@@@@@@@@@ +...@@@@@@@@@@@@@. +@@@@@@@@@@@@@@@.. +@@@@@@@@@@@@@@... +@@@@@@@@@@@@@.... +.@@@@@@@@@@@..... +.@@@@@@@@@@.....@ +.@@@@@@@@.....@@@ +patch 769 +height 3 +width 12 +map +............ +............ +............ +patch 770 +height 4 +width 23 +map +....................... +....................... +....................... +....................... +patch 771 +height 15 +width 12 +map +............ +............ +............ +............ +............ +............ +.......@@@.. +..@@@@@@@@.. +@@@@@@@@@@.. +..@@@@@@@@@. +...@@@@@@@@. +.....@@@@@@. +.......@@@@. +..........@@ +...........@ +patch 772 +height 7 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +patch 773 +height 11 +width 7 +map +.....@@ +.....@@ +.....@@ +......@ +......@ +......@ +......@ +......@ +....... +....... +....... +patch 774 +height 20 +width 7 +map +@@@@@.. +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +.@@@@@@ +.@@@@@@ +patch 775 +height 11 +width 13 +map +@@@@@@@@@@@.. +@@@@@@@@@@@@. +@@@@@@@@@@@@. +@@@@@@@@@@@@. +@@@@@@@@@@@@. +@@@@@@@@@@@@. +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@.... +@@@@@@@@@@... +patch 776 +height 7 +width 14 +map +.............. +@............. +@............. +@............. +@............. +@............. +@@............ +patch 777 +height 15 +width 14 +map +...........@@@ +...........@@@ +...........@@@ +...........@@@ +............@@ +............@@ +............@@ +............@@ +............@@ +.............@ +.............@ +.............@ +.............@ +.............@ +.............. +patch 778 +height 18 +width 22 +map +@@@@@@@@@@@@@@@@@@@@.. +@@@@@@@@@@@@@@........ +@@@@@@@@@@............ +@@@@@................. +@..................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +.....................@ +....................@@ +...................... +...................... +.................@.... +patch 779 +height 11 +width 2 +map +@. +@. +@. +@. +@@ +@@ +@@ +@@ +@@ +@@ +@@ +patch 780 +height 4 +width 2 +map +@@ +@@ +@@ +@@ +patch 781 +height 5 +width 8 +map +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +.@@@@@@@ +.@@@@@@@ +patch 782 +height 9 +width 24 +map +............@@@@@@@@@@@@ +.........@@@@@@@@@@@@@@@ +.........@@@@@@@@@@@@@@@ +.........@@@@@@@@@@@@@@@ +.........@@@@@@@@@@@@@@. +..........@@@@@@@@@@@@.. +..........@@@@@@@@@@@... +..........@@@@@@@@@@.... +..........@@@@@@@@@..... +patch 783 +height 15 +width 16 +map +...............@ +...............@ +...............@ +...............@ +...............@ +................ +................ +................ +................ +................ +................ +................ +...............@ +..........@@@@@@ +@@@..@@@@@@@@@@@ +patch 784 +height 8 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@. +.@@@.. +patch 785 +height 3 +width 6 +map +@@@@@@ +@@@@@@ +@@@... +patch 786 +height 5 +width 6 +map +@@@@@. +@@@... +...... +...... +...... +patch 787 +height 9 +width 7 +map +@@@..@@ +@@..... +....... +....... +....... +....... +....... +....... +....... +patch 788 +height 10 +width 4 +map +@... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 789 +height 2 +width 2 +map +.. +.@ +patch 790 +height 3 +width 12 +map +............ +...........@ +........@@@@ +patch 791 +height 2 +width 13 +map +....@@@@@@@@@ +@@@@@@@@@@@@@ +patch 792 +height 3 +width 22 +map +.....@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@. +.@@@@@@@@@@@@@@@@@@@.. +patch 793 +height 14 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@.... +patch 794 +height 9 +width 6 +map +@@@@@. +@@@@@. +@@@@@. +@@@@@. +@@@@@. +@@@@@@ +@@@@@@ +@@@@@@ +@@@@.. +patch 795 +height 8 +width 17 +map +................. +................. +................. +................. +................. +................. +................. +................. +patch 796 +height 9 +width 13 +map +............. +............. +............. +............. +............. +............. +............. +............. +............. +patch 797 +height 3 +width 3 +map +@@@ +@@. +@.. +patch 798 +height 7 +width 7 +map +....... +....... +....... +....... +....... +....... +.....@@ +patch 799 +height 7 +width 4 +map +.... +.... +.... +.... +.... +.... +..@@ +patch 800 +height 15 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +@... +@... +@... +@@.. +@@.. +@@.. +@@.. +patch 801 +height 8 +width 8 +map +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@... +patch 802 +height 5 +width 12 +map +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +patch 803 +height 5 +width 17 +map +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@.. +@@@@@@@@@@....... +@@@@@............ +patch 804 +height 6 +width 12 +map +.........@@@ +....@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +.@@@@@@@@@@@ +@@@@@@@@@@@@ +patch 805 +height 6 +width 2 +map +@@ +@@ +@@ +@@ +@@ +@@ +patch 806 +height 3 +width 7 +map +@@.@@@. +@...... +....... +patch 807 +height 9 +width 15 +map +............... +............... +............... +............... +............... +....@.......... +...@@@@........ +..@@@@@@@...... +.@@@@@@@@@@..@@ +patch 808 +height 7 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +patch 809 +height 7 +width 13 +map +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@..... +@@..........@ +patch 810 +height 2 +width 2 +map +@@ +@@ +patch 811 +height 7 +width 7 +map +......@ +....... +....... +....... +....... +....... +....... +patch 812 +height 12 +width 7 +map +.@@@@@@ +...@@@@ +.....@@ +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 813 +height 10 +width 7 +map +..@@@@@ +....@@@ +......@ +....... +....... +....... +....... +....... +....... +....... +patch 814 +height 11 +width 7 +map +.@@@@@@ +...@@@@ +.....@@ +....... +....... +....... +....... +....... +....... +....... +....... +patch 815 +height 22 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +patch 816 +height 22 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 817 +height 9 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 818 +height 28 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 819 +height 19 +width 11 +map +......@@@@@ +......@@@@@ +........@@@ +........@@@ +.........@@ +.........@@ +.........@@ +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +patch 820 +height 5 +width 11 +map +@...@@....@ +........... +........... +........... +........... +patch 821 +height 10 +width 8 +map +.@@@@@@@ +....@@@@ +......@@ +........ +.......@ +.......@ +......@@ +.....@@@ +.....@@@ +....@@@@ +patch 822 +height 10 +width 10 +map +.@@@@@@@@@ +.@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@. +@@@@@@@@@. +@@@@@@@@.. +patch 823 +height 31 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@.. +@@. +@@. +@@. +@@. +@@@ +@@@ +@@@ +patch 824 +height 19 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 825 +height 15 +width 7 +map +....@@@ +.....@@ +......@ +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 826 +height 9 +width 8 +map +...@@@.. +@@@@@@.. +.@@@@@.. +..@@@@@. +...@@@@. +....@@@. +.....@@. +......@. +.......@ +patch 827 +height 11 +width 5 +map +@.... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 828 +height 18 +width 6 +map +@@@@@. +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +@@@@.. +patch 829 +height 21 +width 11 +map +@@.@@@@@@@@ +@@..@@@@@@@ +@@...@@@@@@ +......@@@@@ +.......@@@@ +........@@@ +.........@@ +..........@ +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +........... +patch 830 +height 9 +width 14 +map +.............@ +.............@ +.............@ +.............@ +.............. +.............. +.............. +.............. +.............. +patch 831 +height 6 +width 14 +map +@@@.@@@....... +@@@@@@@....... +@@@@@@@....... +@@@@@@@@...... +@@@@@@@@...... +@@@@@@@@...... +patch 832 +height 6 +width 9 +map +@@@@@@@@. +@@@@@@@@. +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 833 +height 6 +width 7 +map +....... +@...... +@@..... +@@@.... +@@@@... +@@@@@.. +patch 834 +height 5 +width 3 +map +@.. +.@. +.@@ +... +... +patch 835 +height 14 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 836 +height 28 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@@.. +@@@. +patch 837 +height 26 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +patch 838 +height 8 +width 5 +map +.@@@@ +....@ +....@ +....@ +..... +..... +..... +..... +patch 839 +height 7 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +......@@@@ +patch 840 +height 3 +width 6 +map +@@@@.@ +@..... +...... +patch 841 +height 6 +width 9 +map +........@ +........@ +........@ +......... +......... +......... +patch 842 +height 7 +width 6 +map +@@@@.. +@@@@.. +@@@@@. +@@@@@. +@@@@@. +@@@@@. +@@@@@. +patch 843 +height 18 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@..... +...... +...... +...... +patch 844 +height 21 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +.....@ +.....@ +...... +...... +...... +...... +...... +...... +patch 845 +height 13 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +..@@@@ +patch 846 +height 11 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 847 +height 17 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 848 +height 24 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 849 +height 6 +width 8 +map +........ +........ +........ +........ +.......@ +......@@ +patch 850 +height 9 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +....@@@@@@ +patch 851 +height 11 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +............ +............ +...........@ +......@@@@@@ +patch 852 +height 9 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +.......@@@@@ +...@@@@@@@@@ +patch 853 +height 24 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 854 +height 15 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +.......@ +......@@ +patch 855 +height 2 +width 4 +map +.... +...@ +patch 856 +height 4 +width 3 +map +... +... +... +..@ +patch 857 +height 4 +width 8 +map +@@@@.... +@....... +........ +@....... +patch 858 +height 6 +width 12 +map +............ +............ +............ +............ +............ +............ +patch 859 +height 6 +width 20 +map +.................... +.................... +.................... +.................... +.................... +...................@ +patch 860 +height 10 +width 22 +map +..................@@@@ +...................@@@ +...................@@@ +....................@@ +.....................@ +...................... +.....................@ +...................... +...................... +...................... +patch 861 +height 10 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 862 +height 15 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +.@@@@ +patch 863 +height 18 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@@@@. +patch 864 +height 2 +width 25 +map +......................... +........................@ +patch 865 +height 4 +width 27 +map +........................... +..........................@ +.........................@@ +........................@@@ +patch 866 +height 8 +width 26 +map +.......................... +.........................@ +........................@@ +.......................@@@ +......................@@@@ +.....................@@@@@ +....................@@@@@@ +...................@@@@@@@ +patch 867 +height 10 +width 13 +map +............@ +............@ +............. +............. +............. +............. +............. +@............ +@...........@ +@....@@@@@@@@ +patch 868 +height 4 +width 14 +map +@@@........... +@@............ +@............. +.............. +patch 869 +height 5 +width 32 +map +................................ +................................ +................................ +................................ +................................ +patch 870 +height 9 +width 32 +map +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +................................ +patch 871 +height 11 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 872 +height 5 +width 12 +map +............ +...........@ +..........@@ +.........@@@ +........@@@@ +patch 873 +height 5 +width 7 +map +....... +......@ +.....@@ +....@@@ +...@@@@ +patch 874 +height 14 +width 37 +map +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +..................................... +patch 875 +height 11 +width 16 +map +......@@@@@@@@@@ +..@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@ +patch 876 +height 17 +width 8 +map +...@@@@@ +...@@@@@ +....@@@@ +....@@@@ +....@@@@ +....@@@@ +.....@@@ +.....@@@ +........ +........ +......@@ +......@@ +......@@ +......@@ +.......@ +.......@ +.......@ +patch 877 +height 11 +width 9 +map +@@@@@@.@@ +@@@@@@... +@@@@@@@.. +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@... +......... +......... +...@@@@@@ +@@@@@@@@@ +patch 878 +height 8 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +@@@@. +patch 879 +height 13 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +@@@@@. +@@@@@. +@@@@@. +@@@@@. +@@@@@. +@@@@@. +patch 880 +height 6 +width 7 +map +....... +....... +....... +....... +....... +..@@@@@ +patch 881 +height 10 +width 18 +map +...............@@@ +...............@@@ +...............@@@ +................@@ +................@@ +.................@ +.................@ +.................@ +.................@ +.................. +patch 882 +height 11 +width 21 +map +..................@@@ +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +patch 883 +height 5 +width 6 +map +@@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +.@@@.. +patch 884 +height 12 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +...@@@ +....@@ +.....@ +...... +.....@ +patch 885 +height 3 +width 19 +map +....@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@.@@@@@@@ +patch 886 +height 6 +width 8 +map +...@@@@@ +...@@@@@ +...@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 887 +height 14 +width 13 +map +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +patch 888 +height 10 +width 9 +map +@@@@@.... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 889 +height 2 +width 9 +map +......... +......... +patch 890 +height 3 +width 29 +map +............................. +@............................ +@@........................... +patch 891 +height 6 +width 26 +map +.......................... +@......................... +@@........................ +@@@....................... +@@@@...................... +@@@@@.................@@@@ +patch 892 +height 10 +width 7 +map +@@@@@@. +@@@@@@. +@@@@@.. +@@@@... +@@@@... +@@@.... +@@..... +@@..... +@...... +....... +patch 893 +height 20 +width 7 +map +@@@@@@. +@@@@@.. +@@@@@.. +@@@@... +@@@.... +@@@.... +@@..... +@...... +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 894 +height 24 +width 22 +map +...................@@@ +....................@@ +.....................@ +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +...................... +@..................... +@@.................... +@@@................... +@@@................... +@@@................... +patch 895 +height 4 +width 14 +map +...@@@@@@@@@@@ +..@@@@@@@@@@@@ +.@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +patch 896 +height 7 +width 5 +map +..@@@ +@@@@@ +@@@@@ +@@@@. +@@@.. +@@... +@.... +patch 897 +height 5 +width 12 +map +............ +@........... +@@@@........ +@@@@........ +@@@@........ +patch 898 +height 5 +width 2 +map +.@ +.@ +.@ +.. +.. +patch 899 +height 19 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..@@@ +patch 900 +height 26 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +@. +@. +@. +@@ +@@ +@@ +patch 901 +height 8 +width 2 +map +.. +.. +.@ +@@ +@@ +@@ +@@ +@@ +patch 902 +height 8 +width 7 +map +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +.@@@@@@ +patch 903 +height 4 +width 10 +map +........@@ +...@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +patch 904 +height 5 +width 16 +map +........@@@@@@@@ +...@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +patch 905 +height 1 +width 15 +map +@..........@@@@ +patch 906 +height 4 +width 16 +map +........@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +patch 907 +height 5 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@........ +patch 908 +height 3 +width 15 +map +.........@@@@@@ +@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@. +patch 909 +height 29 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 910 +height 12 +width 10 +map +.........@ +.........@ +.......... +.......... +@......... +@......... +@......... +@......... +@......... +@@........ +@@........ +@@........ +patch 911 +height 7 +width 10 +map +@@@@@@@... +@@@....... +.......... +.......... +.......... +.......... +.......... +patch 912 +height 6 +width 7 +map +@@@@@@. +@@@.... +....... +....... +....... +....... +patch 913 +height 10 +width 12 +map +.......@@@@@ +..@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +patch 914 +height 6 +width 13 +map +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +patch 915 +height 14 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +..@@@@ +..@@@@ +..@@@@ +..@@@@ +..@@@@ +...@@@ +patch 916 +height 15 +width 4 +map +.@@@ +.@@@ +.@@@ +..@@ +..@@ +..@@ +..@@ +..@@ +...@ +...@ +...@ +...@ +.... +.... +@@@@ +patch 917 +height 18 +width 3 +map +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +patch 918 +height 14 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +..@ +..@ +patch 919 +height 14 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +...@ +...@ +..@@ +..@@ +.@@@ +.@@@ +patch 920 +height 29 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +...@ +...@ +..@@ +..@@ +.@@@ +.@@@ +patch 921 +height 21 +width 2 +map +.@ +.@ +.@ +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.@ +.@ +patch 922 +height 9 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +.........@@@ +....@@@@@@@@ +patch 923 +height 7 +width 12 +map +............ +............ +............ +............ +............ +.......@@@@@ +..@@@@@@@@@@ +patch 924 +height 4 +width 4 +map +@@@. +@@.. +@... +.... +patch 925 +height 2 +width 20 +map +@@@@................ +.................... +patch 926 +height 2 +width 7 +map +....... +..@@@@@ +patch 927 +height 3 +width 13 +map +@@@@@@@@@@..@ +@@@@@.......@ +............. +patch 928 +height 5 +width 4 +map +@@@. +@@@. +...@ +..@@ +.@@@ +patch 929 +height 7 +width 6 +map +.@@@@@ +@.@@@@ +@..@@@ +....@@ +.....@ +...... +...... +patch 930 +height 3 +width 3 +map +..@ +... +... +patch 931 +height 5 +width 15 +map +............... +.............@. +.............@. +..............@ +............... +patch 932 +height 6 +width 21 +map +................@@@@. +.................@@@. +..................@@@ +...................@@ +....................@ +..................... +patch 933 +height 3 +width 23 +map +.....................@@ +@.....................@ +....................... +patch 934 +height 3 +width 18 +map +................@@ +.................@ +.................. +patch 935 +height 3 +width 17 +map +...............@@ +................@ +................. +patch 936 +height 3 +width 5 +map +..... +..... +@.... +patch 937 +height 3 +width 9 +map +......... +@........ +@@....... +patch 938 +height 4 +width 19 +map +................... +@.................. +@@................. +@@@................ +patch 939 +height 9 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +......@@ +patch 940 +height 9 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +@.......... +patch 941 +height 9 +width 2 +map +.@ +.. +.. +.. +.. +.. +.. +.. +.. +patch 942 +height 10 +width 5 +map +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +@@@@. +patch 943 +height 10 +width 8 +map +@@@@.... +@....... +........ +........ +@....... +@....... +@....... +@....... +@....... +@@...... +patch 944 +height 18 +width 7 +map +......@ +......@ +......@ +......@ +......@ +......@ +......@ +......@ +......@ +......@ +......@ +......@ +......@ +......@ +....... +....... +....... +.@@@@@@ +patch 945 +height 25 +width 3 +map +.@@ +.@@ +.@@ +.@@ +.@@ +..@ +..@ +..@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 946 +height 11 +width 3 +map +.@@ +.@@ +.@@ +.@@ +.@@ +..@ +..@ +..@ +..@ +..@ +... +patch 947 +height 14 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +@...... +@...... +@....@@ +patch 948 +height 16 +width 4 +map +.... +.... +@... +@... +@... +@... +@... +@@.. +@@.. +@@.. +@@.. +@@.. +@@@. +@@@. +@@@. +@@@. +patch 949 +height 26 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +@. +@. +@. +@. +@. +patch 950 +height 41 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +@@. +patch 951 +height 5 +width 3 +map +... +... +... +@.. +.@. +patch 952 +height 2 +width 4 +map +.... +.... +patch 953 +height 8 +width 7 +map +......@ +......@ +......@ +......@ +....... +....... +@...... +@..@@@@ +patch 954 +height 3 +width 5 +map +@.... +..... +@..@@ +patch 955 +height 4 +width 13 +map +@@@..@@@..@@@ +..........@@. +........@@@@@ +...@@@@@@@@@@ +patch 956 +height 3 +width 15 +map +............... +.........@@@@@@ +...@@@@@@@@@@@@ +patch 957 +height 4 +width 13 +map +@............ +............. +............. +............. +patch 958 +height 11 +width 3 +map +@.. +... +... +... +... +... +... +... +... +... +..@ +patch 959 +height 9 +width 4 +map +.... +.... +.... +.... +.... +.... +@... +@@.. +@@@. +patch 960 +height 30 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 961 +height 19 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +@........ +@@....... +patch 962 +height 3 +width 19 +map +@@................. +@.................. +................... +patch 963 +height 4 +width 20 +map +@@@................. +@@.................. +@................... +.................... +patch 964 +height 3 +width 17 +map +................. +................. +................. +patch 965 +height 7 +width 7 +map +@@@@@@. +@@@@@.. +@@@@... +@@@.... +@@..... +@...... +....... +patch 966 +height 4 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@..@ +@........@ +patch 967 +height 27 +width 5 +map +@@@.. +@@@.. +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +.@@@@ +.@@@@ +.@@@@ +.@@@. +.@@.. +.@... +patch 968 +height 22 +width 5 +map +.@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@. +@@@.. +@@... +@.... +patch 969 +height 4 +width 4 +map +@@.. +@... +@... +.... +patch 970 +height 6 +width 18 +map +.................. +.................. +.................. +.................@ +................@@ +...............@@@ +patch 971 +height 3 +width 18 +map +.................. +.................@ +................@@ +patch 972 +height 4 +width 19 +map +................... +..................@ +..................@ +................... +patch 973 +height 15 +width 3 +map +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +@@. +@@. +@@. +@@. +@@@ +@@@ +patch 974 +height 14 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 975 +height 19 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +..@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 976 +height 12 +width 10 +map +@@@@@@@@.. +@@@....... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 977 +height 11 +width 5 +map +@@... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 978 +height 9 +width 6 +map +@@@@@. +...... +...... +...... +...... +...... +...... +...... +...... +patch 979 +height 8 +width 12 +map +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +...@@@@@@@@@ +..@@@@@@@@@@ +.@@@@@@@@@@@ +@@@@@@@@@... +@@@......... +patch 980 +height 7 +width 3 +map +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +patch 981 +height 16 +width 3 +map +@@. +@.. +@.. +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +@@. +@@@ +@@@ +@@@ +patch 982 +height 12 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +patch 983 +height 10 +width 13 +map +.........@@@@ +....@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +patch 984 +height 5 +width 13 +map +..........@@@ +......@@@@@@@ +.@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +patch 985 +height 3 +width 18 +map +.................. +.................. +.................. +patch 986 +height 6 +width 3 +map +... +... +... +... +... +... +patch 987 +height 5 +width 2 +map +@@ +@@ +@@ +@@ +@@ +patch 988 +height 3 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@.. +patch 989 +height 7 +width 6 +map +@@@@@. +@@@@.. +...... +...... +...... +...... +...... +patch 990 +height 13 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +patch 991 +height 6 +width 12 +map +...@@......@ +@@@@@..@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +patch 992 +height 15 +width 5 +map +@@@.. +@@... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 993 +height 7 +width 5 +map +...@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@. +patch 994 +height 19 +width 1 +map +. +. +. +. +. +. +. +. +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +patch 995 +height 3 +width 2 +map +@@ +@@ +@@ +patch 996 +height 10 +width 6 +map +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +@@@@.. +@@@@@. +patch 997 +height 21 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +patch 998 +height 21 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 999 +height 21 +width 14 +map +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............@ +........@@@@@@ +....@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@....... +@@............ +patch 1000 +height 6 +width 4 +map +@@@. +@@.. +@... +.... +.... +.... +patch 1001 +height 5 +width 5 +map +@@... +@.... +..... +..... +..... +patch 1002 +height 11 +width 18 +map +.................. +@................. +@................. +@................. +@................. +@@................ +@@................ +@@................ +@@................ +@@................ +@@@............... +patch 1003 +height 11 +width 15 +map +............... +............... +............... +............... +@.............. +@.............. +@.............. +@.............. +@.............. +@@............. +@@............. +patch 1004 +height 11 +width 13 +map +............. +............. +............. +@............ +@............ +@............ +@............ +@............ +@@........... +@@........... +@@........... +patch 1005 +height 11 +width 5 +map +..... +..... +@.... +@.... +@.... +..... +..... +..... +..... +..... +..... +patch 1006 +height 23 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +@.................. +@.................. +@.................. +@.................. +patch 1007 +height 3 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1008 +height 3 +width 19 +map +@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@. +@@@@@@@@@@@@@@@@@.. +patch 1009 +height 10 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1010 +height 17 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1011 +height 15 +width 6 +map +...... +...... +...... +...... +....@@ +....@@ +....@@ +.....@ +.....@ +.....@ +.....@ +.....@ +.....@ +...... +...... +patch 1012 +height 12 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.@@@@@ +patch 1013 +height 16 +width 5 +map +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1014 +height 18 +width 5 +map +.@@@@ +..@@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1015 +height 16 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1016 +height 11 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +...... +...... +...... +...... +...... +...... +...... +...... +patch 1017 +height 20 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +patch 1018 +height 9 +width 5 +map +....@ +....@ +....@ +....@ +..... +..... +..... +..... +..... +patch 1019 +height 9 +width 7 +map +....@@@ +....@@@ +....@@@ +......@ +......@ +......@ +....... +....... +.....@@ +patch 1020 +height 7 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +patch 1021 +height 1 +width 14 +map +.............. +patch 1022 +height 9 +width 23 +map +....................... +....................... +....................... +....................... +....................... +....................... +....................... +....................... +....................... +patch 1023 +height 10 +width 29 +map +............................. +............................. +............................. +............................. +............................. +............................. +............................. +............................. +............................. +............................. +patch 1024 +height 14 +width 9 +map +....@@@@@ +.....@@@@ +......@@@ +.......@@ +........@ +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 1025 +height 9 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +................... +................... +patch 1026 +height 6 +width 14 +map +.............. +.............. +.............. +.............. +.............. +.............. +patch 1027 +height 7 +width 1 +map +. +. +. +. +. +. +. +patch 1028 +height 13 +width 1 +map +. +. +. +. +. +. +. +. +. +. +. +. +. +patch 1029 +height 25 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +..@ +.@@ +patch 1030 +height 34 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +...@ +..@@ +.@@@ +patch 1031 +height 30 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +.@@ +.@@ +.@@ +.@@ +.@@ +.@@ +.@@ +.@@ +patch 1032 +height 21 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1033 +height 9 +width 12 +map +.......@@@@. +............ +............ +............ +............ +............ +............ +............ +............ +patch 1034 +height 3 +width 9 +map +@@@@..@@@ +......@@@ +......... +patch 1035 +height 12 +width 10 +map +@......@@@ +@......@@@ +@.......@@ +@@......@@ +@@......@@ +@@........ +@@........ +@@@....... +@@@....... +@@@....... +.......... +.......... +patch 1036 +height 16 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 1037 +height 17 +width 26 +map +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +@......................... +@@........................ +@@@....................... +@@@@...................... +@@@@@..................... +patch 1038 +height 8 +width 15 +map +..........@@@@. +....@@@@@@@@@@. +@@@@@@@@@@@@@@. +@@@@@@@@@@@@@@. +.@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@ +...@@@@@@@@@@@@ +....@@@@@@@@@@@ +patch 1039 +height 9 +width 18 +map +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +patch 1040 +height 7 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +patch 1041 +height 8 +width 50 +map +.................................................. +.................................................. +.................................................. +.................................................. +.................................................. +.................................................. +.................................................. +.................................................. +patch 1042 +height 8 +width 18 +map +............@@@@@@ +.............@@@@@ +..............@@@@ +...............@@@ +................@@ +.................@ +.................. +.................. +patch 1043 +height 9 +width 15 +map +............... +............... +............... +............... +............... +............... +............... +..@............ +..@@........... +patch 1044 +height 7 +width 21 +map +..................... +..................... +..................... +..................... +..................... +..................... +..................... +patch 1045 +height 5 +width 11 +map +.........@@ +..........@ +........... +........... +........... +patch 1046 +height 5 +width 21 +map +....................@ +..................... +..................... +..................... +..................... +patch 1047 +height 11 +width 23 +map +......................@ +....................... +....................... +....................... +....................... +@...................... +@@..................... +@@@.................... +@@@@................... +@@@@@.................. +@@@@@@................. +patch 1048 +height 7 +width 5 +map +.@@@@ +..@@@ +...@@ +....@ +..... +..... +..... +patch 1049 +height 4 +width 4 +map +@@@. +.@@@ +..@@ +...@ +patch 1050 +height 17 +width 7 +map +@...... +@@..... +@@@.... +@@@@... +@@@@@.. +@@@@@@. +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +..@@@@@ +..@@@@@ +patch 1051 +height 12 +width 8 +map +@@@..... +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 1052 +height 19 +width 5 +map +@@@.. +@@@.. +@@@.. +@@@.. +@@@.. +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1053 +height 2 +width 3 +map +@@@ +@@. +patch 1054 +height 7 +width 22 +map +............@@@@@@@@@@ +............@@@@@@@@@. +............@@@@@@@@@. +.............@@@@@@@@. +.............@@@@@@@@. +.............@@@@@@@@. +.............@@@...... +patch 1055 +height 10 +width 13 +map +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@... +@@@@......... +patch 1056 +height 4 +width 3 +map +... +... +@.. +@@. +patch 1057 +height 12 +width 7 +map +@@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +..@@@@@ +..@@@@@ +..@@@@@ +..@@@@@ +..@@@@@ +..@@@@@ +patch 1058 +height 11 +width 8 +map +@@@@@... +@@@@.... +@@@..... +@@...... +@....... +........ +........ +........ +........ +........ +........ +patch 1059 +height 11 +width 9 +map +......... +......... +......... +......... +@........ +@........ +@........ +@........ +@........ +......... +......... +patch 1060 +height 11 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +..@@@@ +.@@@@@ +patch 1061 +height 26 +width 13 +map +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............@ +...........@@ +..........@@@ +.........@@@@ +........@@@@@ +patch 1062 +height 4 +width 8 +map +.......@ +.......@ +.......@ +.......@ +patch 1063 +height 8 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +patch 1064 +height 15 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +patch 1065 +height 7 +width 7 +map +@@....@ +.....@@ +....@@@ +...@@@. +..@@@@. +.@@@@@. +@@@.... +patch 1066 +height 9 +width 9 +map +@@@@@@@@. +@@@@@@@.. +@@@@@@... +@@@@@.... +@@@@..... +@@@...... +@@....... +@........ +......... +patch 1067 +height 3 +width 3 +map +@@. +@@. +@@. +patch 1068 +height 4 +width 5 +map +@@@.. +@@... +@.... +..... +patch 1069 +height 11 +width 12 +map +............ +............ +............ +............ +............ +............ +@........... +@........... +@........... +@........... +@........... +patch 1070 +height 12 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........... +......@@@@. +...@@@@@@@. +.@@@@@@@@@. +patch 1071 +height 15 +width 10 +map +........@@ +.........@ +.......... +.......... +.......... +.......... +.......... +.........@ +.........@ +.........@ +.......... +.......... +.......... +.......... +.......... +patch 1072 +height 16 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1073 +height 5 +width 13 +map +............. +............@ +............. +.......@@@@.@ +.@@@@@@@@@@.@ +patch 1074 +height 19 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 1075 +height 19 +width 4 +map +..@@ +..@@ +..@@ +..@@ +...@ +...@ +...@ +...@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1076 +height 8 +width 5 +map +.@@@@ +.@@@@ +.@@@. +..... +..... +..... +..... +..... +patch 1077 +height 10 +width 5 +map +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1078 +height 10 +width 8 +map +@@...... +@....... +........ +........ +........ +........ +........ +........ +@....... +@....... +patch 1079 +height 4 +width 12 +map +............ +@........... +@@.......... +.@@......... +patch 1080 +height 4 +width 12 +map +............ +@........... +@@.......... +............ +patch 1081 +height 4 +width 7 +map +....@@@ +.....@@ +......@ +....... +patch 1082 +height 9 +width 8 +map +...@@@@@ +....@@@@ +.....@@@ +......@@ +........ +........ +........ +........ +........ +patch 1083 +height 7 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +patch 1084 +height 3 +width 7 +map +....... +......@ +......@ +patch 1085 +height 11 +width 5 +map +..... +..... +@.... +@.... +@.... +@.... +@@... +@@... +@@... +@@... +@@... +patch 1086 +height 16 +width 5 +map +...@@ +....@ +....@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1087 +height 6 +width 3 +map +.@@ +..@ +... +... +... +... +patch 1088 +height 4 +width 11 +map +@@@@@@@.... +@@@@@@@.... +@@@@@@@@@@. +.@@@@@@@@@@ +patch 1089 +height 6 +width 2 +map +.@ +.. +@. +@. +@. +@. +patch 1090 +height 5 +width 11 +map +..........@ +........... +........... +........... +........... +patch 1091 +height 16 +width 3 +map +.@@ +..@ +... +... +... +... +... +... +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +patch 1092 +height 3 +width 2 +map +.@ +@. +@. +patch 1093 +height 10 +width 10 +map +.@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@@ +.@@@@..... +.......... +.......... +.......... +.......... +.......... +.......... +patch 1094 +height 13 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +@....... +@@...... +@@@..... +@@@@.... +patch 1095 +height 17 +width 9 +map +.....@@@@ +......@@@ +.......@@ +........@ +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 1096 +height 5 +width 6 +map +@@.... +@@.... +@..... +@..... +...... +patch 1097 +height 5 +width 11 +map +@@......@@@ +@.......@@@ +@........@@ +..........@ +........... +patch 1098 +height 10 +width 14 +map +@@............ +@@............ +@............. +@............. +.............. +.............. +.............. +@............. +@@............ +@@@........... +patch 1099 +height 6 +width 27 +map +@@@@@@..................... +@@@@@...................... +@.......................... +........................... +........................... +........................... +patch 1100 +height 3 +width 23 +map +....................... +....................... +....................... +patch 1101 +height 4 +width 24 +map +........................ +........................ +........................ +........................ +patch 1102 +height 2 +width 16 +map +................ +................ +patch 1103 +height 2 +width 7 +map +....@@@ +@@@@@@@ +patch 1104 +height 7 +width 20 +map +........@@@@@@@@@@@. +....@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@. +@@@@@@@@@@@@@@@..... +@@@@@@@@@@@@@@...... +@@@@@@@@@@@@@....... +patch 1105 +height 3 +width 12 +map +............ +............ +@........... +patch 1106 +height 23 +width 3 +map +..@ +..@ +... +... +... +... +... +... +... +... +... +... +... +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +... +..@ +patch 1107 +height 15 +width 3 +map +.@@ +.@@ +.@@ +... +... +... +... +... +... +... +... +... +... +... +..@ +patch 1108 +height 14 +width 5 +map +..... +@@... +@.... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1109 +height 8 +width 22 +map +...........@@@@@@@..@@ +........@@@@@@@@@@..@@ +........@@@@@@@@@@@..@ +........@@@@@@@@@@@..@ +@........@@@@@@@@@@..@ +@........@@@@@.......@ +@....................@ +@..................... +patch 1110 +height 5 +width 16 +map +@@@@@@@......... +@@@@@@.......... +@@@@............ +@@.............. +................ +patch 1111 +height 2 +width 13 +map +............. +............. +patch 1112 +height 1 +width 10 +map +.......... +patch 1113 +height 9 +width 19 +map +................... +................... +@.................. +@.................. +@.................. +@.................. +@@................. +@@................. +@@................. +patch 1114 +height 4 +width 32 +map +@@@...........@@@@@@@@@@........ +@@............@@@@.............. +@............................... +................................ +patch 1115 +height 3 +width 16 +map +................ +................ +................ +patch 1116 +height 11 +width 11 +map +.......@@@. +...@@@@@@@. +@@@@@@@@@@. +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +.@@@@@@@@@@ +.@@@@@@@@@@ +.@@@@@@@@@@ +.@@@@@@@@@@ +.@@@@@@@@@@ +patch 1117 +height 2 +width 3 +map +@.. +@.@ +patch 1118 +height 5 +width 8 +map +........ +........ +........ +........ +@....... +patch 1119 +height 23 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1120 +height 7 +width 6 +map +....@. +...@@. +..@@@@ +.@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 1121 +height 8 +width 28 +map +..........@@@@@@@@@@@@@..... +..........@@@@@@@@@@@@@@.... +..........@@@@@@@@@@@@@@.... +..........@@@@@@@@@@@@@@.... +...........@@@@@@@@@@....... +...........@@@@............. +............................ +............................ +patch 1122 +height 10 +width 14 +map +.....@@@@@@@@@ +......@@@@@@@@ +....@@@@@@@@@@ +....@@@@@@@@@@ +....@@@@@@@@@@ +.....@@@@@@@@@ +.....@@@@@@@@@ +.....@@@@@@@@@ +.....@@@@@@@@@ +......@@@@@@@@ +patch 1123 +height 12 +width 4 +map +@... +.... +.... +.... +.... +@... +@... +@... +@@.. +@@.. +@@@. +@@@. +patch 1124 +height 2 +width 22 +map +...................... +...................... +patch 1125 +height 3 +width 7 +map +......@ +....... +....@@@ +patch 1126 +height 4 +width 9 +map +......... +......... +......... +....@@@@@ +patch 1127 +height 2 +width 18 +map +@................. +............@@@@@@ +patch 1128 +height 3 +width 14 +map +.............. +..........@@@@ +.....@@@@@@@@@ +patch 1129 +height 5 +width 7 +map +....... +@.....@ +@....@@ +@...@@@ +@@.@@@@ +patch 1130 +height 7 +width 7 +map +@@@@@@. +....... +....... +..@.... +@@..... +@...... +....... +patch 1131 +height 8 +width 7 +map +@@@.... +@@..... +@...... +....... +....... +....... +....... +....... +patch 1132 +height 11 +width 14 +map +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +.............. +patch 1133 +height 20 +width 1 +map +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +patch 1134 +height 8 +width 8 +map +@@@@@.@@ +@@@@.... +........ +........ +........ +........ +........ +........ +patch 1135 +height 5 +width 8 +map +@@@@@@@. +@....... +........ +........ +........ +patch 1136 +height 6 +width 2 +map +.. +.. +@. +@. +@. +@. +patch 1137 +height 5 +width 2 +map +.@ +.. +.. +.. +.. +patch 1138 +height 27 +width 3 +map +.@@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +..@ +... +... +... +... +patch 1139 +height 6 +width 28 +map +@@@@@@@..................... +@@@@@....................... +@@@......................... +@@.......................... +@........................... +............................ +patch 1140 +height 3 +width 43 +map +@@@@@@@@@@@@@@@@@@......................... +@.......................................... +........................................... +patch 1141 +height 4 +width 39 +map +@@@.................................... +@@..................................... +@...................................... +....................................... +patch 1142 +height 7 +width 16 +map +@@@@@@.......... +@@@@@........... +@@@@............ +@@@............. +@@.............. +@............... +................ +patch 1143 +height 7 +width 18 +map +@@@@.............. +@@@............... +@@................ +@................. +.................. +.................. +.................. +patch 1144 +height 8 +width 2 +map +.@ +.@ +.@ +.. +.. +.. +.@ +.@ +patch 1145 +height 32 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 1146 +height 5 +width 27 +map +@@@@....................... +@@@........................ +@@......................... +@.......................... +........................... +patch 1147 +height 4 +width 21 +map +...............@@@@@@ +................@@@@@ +................@@@@@ +................@@@@@ +patch 1148 +height 5 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +.@@@@ +.@@@@ +patch 1149 +height 2 +width 4 +map +@@@@ +@@@. +patch 1150 +height 38 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 1151 +height 51 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +.@@ +.@@ +.@@ +..@ +..@ +..@ +..@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 1152 +height 12 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +....@ +.@@@@ +.@@@@ +..@@@ +patch 1153 +height 17 +width 3 +map +.@@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 1154 +height 14 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1155 +height 6 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.. +patch 1156 +height 4 +width 4 +map +.@@@ +..@@ +...@ +.... +patch 1157 +height 8 +width 25 +map +......................... +......................... +......................... +@@@@..................... +@@@...................... +@@....................... +@........................ +......................... +patch 1158 +height 8 +width 11 +map +........... +........... +........... +........... +........... +..........@ +.........@@ +....@@@@@@@ +patch 1159 +height 5 +width 2 +map +.@ +.@ +.. +.@ +.@ +patch 1160 +height 7 +width 13 +map +@@@....@@@@@@ +@@@.....@@@@@ +@@.......@@@@ +@@........@@@ +@..........@@ +@...........@ +............. +patch 1161 +height 7 +width 21 +map +@@@...............@@@ +@@@................@@ +@@..................@ +@@................... +@.................... +@.................... +..................... +patch 1162 +height 15 +width 26 +map +@@@@@..................... +@@@@...................... +@@........................ +@@........................ +@......................... +@......................... +.......................... +.......................... +@......................... +@@........................ +@@@....................... +@@@@.....................@ +@@@@@...................@@ +@@@@@@..................@@ +@@@@@@@................@@@ +patch 1163 +height 5 +width 12 +map +@@@@@@@@@... +@@@@........ +@@@......... +@........... +............ +patch 1164 +height 5 +width 17 +map +@@@.............. +@@............... +@................ +................. +................. +patch 1165 +height 2 +width 14 +map +.............. +.............. +patch 1166 +height 3 +width 42 +map +@...................@@@@@@@@@@@........... +....................@@@@@@@@.............. +....................@@@................... +patch 1167 +height 5 +width 23 +map +....................... +....................... +....................... +....................... +....................... +patch 1168 +height 8 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +................... +patch 1169 +height 6 +width 8 +map +........ +.......@ +.......@ +......@@ +......@@ +.....@@@ +patch 1170 +height 2 +width 10 +map +@@@@@..... +.......... +patch 1171 +height 5 +width 11 +map +@@@@@@@@@@. +@@@@@...... +........... +........... +........... +patch 1172 +height 3 +width 33 +map +................................. +..............................@@@ +........................@@@@@@@@@ +patch 1173 +height 2 +width 20 +map +.................... +................@@@@ +patch 1174 +height 2 +width 8 +map +........ +...@@@@@ +patch 1175 +height 19 +width 18 +map +.................. +@................. +@................. +@................. +@................. +@................. +@@................ +@@................ +@@................ +@@................ +@@@............... +@@@............... +@@@............... +@@@............... +@@@............... +@@@@.............. +@@@@.............. +@@@@.............. +@@@@.............. +patch 1176 +height 11 +width 21 +map +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +patch 1177 +height 4 +width 5 +map +@@... +@@... +@@... +..... +patch 1178 +height 7 +width 6 +map +@..... +...... +...... +...... +...... +...... +...... +patch 1179 +height 7 +width 2 +map +@. +@. +@. +@. +@. +@@ +@@ +patch 1180 +height 7 +width 6 +map +...... +...... +...... +...... +...... +...... +.....@ +patch 1181 +height 10 +width 15 +map +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +patch 1182 +height 3 +width 4 +map +.... +.... +.@@@ +patch 1183 +height 4 +width 12 +map +.@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@.... +.@@@........ +patch 1184 +height 3 +width 21 +map +@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@.@@@@@@@@@@... +@@@@@@@...@@@........ +patch 1185 +height 8 +width 8 +map +@@@@@@@. +@@@@@@@. +@@@@@@.. +@@@@@@.. +@@@@@... +@@@@@... +@@@@.... +@....... +patch 1186 +height 3 +width 18 +map +.................. +.................. +........@@@@@@@@@@ +patch 1187 +height 9 +width 9 +map +......... +@........ +@........ +@........ +@........ +@........ +......... +..@...... +.@@@..... +patch 1188 +height 15 +width 2 +map +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1189 +height 2 +width 2 +map +.@ +.. +patch 1190 +height 1 +width 16 +map +................ +patch 1191 +height 6 +width 13 +map +..........@@@ +...........@@ +............@ +............. +............. +............. +patch 1192 +height 3 +width 13 +map +............. +............@ +.......@@@@@@ +patch 1193 +height 3 +width 10 +map +.......... +.......... +.......... +patch 1194 +height 3 +width 10 +map +.....@@@@. +@.@@@@@@@. +@@@@@@@@@. +patch 1195 +height 12 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +@......... +@......... +@......... +@......... +patch 1196 +height 3 +width 13 +map +............. +............@ +...........@. +patch 1197 +height 12 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +....@@ +patch 1198 +height 12 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +....@@ +..@@@@ +patch 1199 +height 19 +width 4 +map +.@@@ +..@@ +..@@ +...@ +...@ +...@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1200 +height 7 +width 5 +map +....@ +....@ +....@ +....@ +....@ +..... +..... +patch 1201 +height 9 +width 10 +map +.........@ +......@@@@ +..@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@. +patch 1202 +height 14 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +@.... +@.... +@.@@. +@@@@. +@@@.. +@@... +@.... +patch 1203 +height 11 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +..@@@@ +patch 1204 +height 13 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +....@@ +patch 1205 +height 15 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +............ +.......@.... +....@@@@@... +...@@@@@@@.. +.@@@@@@@@@@. +patch 1206 +height 12 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1207 +height 6 +width 12 +map +............ +@........... +@@.......... +@@@......... +@@@@........ +@@@@@....... +patch 1208 +height 6 +width 7 +map +@...... +@@..... +@@@.... +@@..... +@...... +....... +patch 1209 +height 4 +width 9 +map +......... +......... +@........ +@@....... +patch 1210 +height 40 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1211 +height 12 +width 8 +map +@@@@.... +........ +........ +........ +....@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@.....@ +patch 1212 +height 10 +width 7 +map +.....@@ +.....@@ +......@ +......@ +......@ +......@ +....... +....... +....... +....... +patch 1213 +height 11 +width 10 +map +.......@@@ +........@@ +........@@ +........@@ +........@@ +........@@ +.........@ +.........@ +.........@ +.........@ +.......... +patch 1214 +height 14 +width 6 +map +...@.. +..@@.. +.@@@@. +@@@@@. +@@@@@. +@@@@@. +@@@@@. +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 1215 +height 3 +width 12 +map +............ +.......@@@@@ +..@@@@@@@@@@ +patch 1216 +height 15 +width 8 +map +.....@@@ +.....@@@ +.....@@@ +.....@@@ +......@@ +......@@ +......@@ +......@@ +......@@ +.......@ +.......@ +.......@ +.......@ +.......@ +........ +patch 1217 +height 6 +width 18 +map +.................. +.................. +.................. +.................. +.................. +.................. +patch 1218 +height 21 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 1219 +height 19 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +....@ +....@ +....@ +....@ +..... +..... +....@ +patch 1220 +height 12 +width 6 +map +...... +...... +...... +...... +.....@ +...@@@ +...@@@ +...@@@ +...@@@ +....@@ +....@@ +..@@@@ +patch 1221 +height 21 +width 21 +map +@@@@@@............... +@@@@@................ +@@@@@................ +@@@@................. +@@@.................. +@@@.................. +@@................... +@@................... +@.................... +@.................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +..................... +patch 1222 +height 6 +width 14 +map +.............@ +.............@ +.............@ +.............@ +@............. +@............. +patch 1223 +height 6 +width 20 +map +.............@@..@@@ +.................... +.................... +@................... +@................... +@................... +patch 1224 +height 26 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1225 +height 26 +width 3 +map +@@. +@.. +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 1226 +height 9 +width 4 +map +@@@. +@@@. +@@.. +@@.. +@... +@... +.... +@... +.... +patch 1227 +height 4 +width 26 +map +@@........................ +@........................@ +@.......................@@ +.......................@@@ +patch 1228 +height 5 +width 24 +map +@@...................... +@......................@ +@.....................@@ +........................ +........................ +patch 1229 +height 9 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +...... +...... +@..... +patch 1230 +height 16 +width 7 +map +@@@@@@. +@@@@@.. +@@@@... +@@@.... +@@..... +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1231 +height 8 +width 15 +map +............... +............... +............... +............... +@.............. +@.............. +@.............. +@.............. +patch 1232 +height 8 +width 10 +map +.......... +@......... +@......... +@......... +@......... +@......... +@@........ +@@........ +patch 1233 +height 8 +width 5 +map +@@@@. +@@@@. +@@@.. +@@... +@.... +....@ +..... +..... +patch 1234 +height 22 +width 5 +map +@@@@. +@@@.. +@@..@ +@..@@ +...@@ +..@@@ +..@@@ +.@@@@ +.@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +..@@@ +....@ +..... +..... +..... +..... +..... +..... +@.... +patch 1235 +height 17 +width 1 +map +. +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +. +patch 1236 +height 9 +width 11 +map +...@....... +........... +........... +........... +........... +........... +........... +........... +........... +patch 1237 +height 9 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1238 +height 4 +width 11 +map +........... +........... +..........@ +.........@@ +patch 1239 +height 11 +width 17 +map +@@@@@@@.......... +@@@@@............ +@@@@............. +@@@@............. +................. +................. +................. +................. +................. +................. +................. +patch 1240 +height 11 +width 19 +map +...............@@@@ +................... +................... +................... +................... +................... +................... +................... +................... +@.................. +@@................. +patch 1241 +height 4 +width 11 +map +@@@@@@@@@.. +@@@........ +........... +........... +patch 1242 +height 8 +width 5 +map +..... +@.... +@.... +@.... +..... +..... +..... +..... +patch 1243 +height 14 +width 10 +map +........@@ +........@@ +.........@ +.........@ +.........@ +.........@ +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 1244 +height 8 +width 12 +map +............ +............ +............ +............ +............ +@........... +@........... +@........... +patch 1245 +height 4 +width 22 +map +...................... +...................... +...................... +.....................@ +patch 1246 +height 5 +width 4 +map +@@.. +@..@ +...@ +..@@ +..@@ +patch 1247 +height 9 +width 7 +map +....... +....... +....... +......@ +......@ +.....@@ +.....@@ +....... +....... +patch 1248 +height 4 +width 2 +map +.. +.. +.. +.. +patch 1249 +height 9 +width 2 +map +@@ +@@ +@@ +.@ +.@ +.@ +@@ +@@ +@@ +patch 1250 +height 4 +width 14 +map +........@@@@@@ +@....@@@@@@@@@ +@....@@@@@@@@@ +@....@@@@@@@@@ +patch 1251 +height 4 +width 14 +map +.............. +..........@@@. +........@@@@@. +........@@@@@@ +patch 1252 +height 4 +width 8 +map +........ +.......@ +.....@@@ +.....@@@ +patch 1253 +height 8 +width 5 +map +....@ +..... +..... +..... +..... +@.... +@.... +@.... +patch 1254 +height 5 +width 3 +map +... +... +... +@.. +@@. +patch 1255 +height 11 +width 14 +map +.........@@@@@ +..........@@@@ +...........@@@ +............@@ +.............@ +.............. +.............. +.............. +.............. +.............. +.............. +patch 1256 +height 2 +width 27 +map +........................... +@.....................@@@.. +patch 1257 +height 3 +width 15 +map +............... +@...........@@@ +@@..........@@@ +patch 1258 +height 6 +width 10 +map +.........@ +@........@ +@@........ +@@@....... +@@@@...... +@@@@@..... +patch 1259 +height 11 +width 10 +map +........@@ +........@@ +........@@ +........@@ +........@@ +.........@ +.........@ +.........@ +.........@ +@........@ +@@........ +patch 1260 +height 9 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1261 +height 11 +width 6 +map +.@@@@@ +..@@@@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1262 +height 11 +width 6 +map +..@@@@ +...@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +patch 1263 +height 10 +width 7 +map +.....@@ +......@ +....... +....... +....... +....... +....... +....... +....... +....... +patch 1264 +height 3 +width 4 +map +..@@ +...@ +.... +patch 1265 +height 11 +width 12 +map +@@@@@@@@@@.. +@@@@@@@@@@@. +@@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +patch 1266 +height 12 +width 8 +map +@@@@@@@@ +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +..@@@@@@ +..@@@@@@ +..@@@@@@ +..@@@@@@ +...@@@@@ +...@@@@@ +patch 1267 +height 18 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1268 +height 3 +width 8 +map +.@@@.... +........ +........ +patch 1269 +height 7 +width 10 +map +.....@@@@. +@@@@@@@@@. +@@@@@@@@@. +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@..... +patch 1270 +height 19 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@.... +@........ +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 1271 +height 13 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +...@ +..@@ +patch 1272 +height 12 +width 5 +map +@@@@. +..... +..... +..... +..... +..... +..... +..... +....@ +...@@ +..@@@ +.@@@@ +patch 1273 +height 21 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +.@@@ +..@@ +..@@ +..@@ +..@@ +...@ +...@ +...@ +...@ +...@ +.... +.... +.... +patch 1274 +height 12 +width 2 +map +@. +@. +@@ +@@ +@@ +.. +.. +.. +.. +.. +.. +.@ +patch 1275 +height 7 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1276 +height 8 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 1277 +height 2 +width 4 +map +.@@@ +@... +patch 1278 +height 12 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +.@@@@@@@@@@ +.@@@@@@@@@@ +.@@@@@@@@@@ +.@@@@@@@@@@ +..@@@@@@@@@ +..@@@@@@@@@ +..@@@@@@@@@ +..@@@@@@@@@ +..@@@@@@@@@ +patch 1279 +height 6 +width 6 +map +...... +...... +...... +...... +...... +.....@ +patch 1280 +height 2 +width 6 +map +.@@@.. +@@@@@@ +patch 1281 +height 6 +width 23 +map +.@@@@@@@@@........@@@@@ +@@@@@@@@@@@..@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@ +.@@@@@@@@@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@@@@@ +...@@@@@@@@@@@@@@@@@@@@ +patch 1282 +height 6 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +.@@@@@@@@@ +patch 1283 +height 2 +width 3 +map +@@@ +.@. +patch 1284 +height 2 +width 2 +map +@@ +@. +patch 1285 +height 3 +width 8 +map +@@@@@@@@ +@@@@@@@@ +@....... +patch 1286 +height 4 +width 9 +map +......... +......... +.....@@.. +.@@@@@@.. +patch 1287 +height 4 +width 6 +map +...... +...... +...... +.....@ +patch 1288 +height 6 +width 4 +map +@@@@ +.@@@ +.@@@ +.@@@ +.@@@ +.@@@ +patch 1289 +height 12 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +........@ +patch 1290 +height 2 +width 15 +map +............... +.........@@@@.@ +patch 1291 +height 3 +width 5 +map +..... +@@@@@ +@@@@@ +patch 1292 +height 6 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@.. +@@@@@@... +@@@@@.... +@@@@..... +patch 1293 +height 6 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +@@.@@@@@@@@ +...@@@@@@@@ +....@@@@@@@ +patch 1294 +height 7 +width 20 +map +...............@@@@@ +.................... +.................... +.................... +.................... +.................... +@................... +patch 1295 +height 9 +width 12 +map +............ +@@.......... +@........... +@........... +@........... +@@.......... +@@.......... +............ +............ +patch 1296 +height 4 +width 23 +map +....................... +...@@.................@ +@@@@@................@@ +@@@@@...............@@@ +patch 1297 +height 5 +width 13 +map +............. +............@ +...........@@ +..........@@@ +@........@@@@ +patch 1298 +height 28 +width 19 +map +@@@.............@@@ +@@..............@@@ +@...............@@@ +.................@@ +.................@@ +.................@@ +..................@ +..................@ +................... +..................@ +..................@ +..................@ +................... +................... +................... +................... +................... +................... +..................@ +.................@@ +.................@@ +.................@@ +.................@@ +.................@@ +.................@@ +.................@@ +.................@@ +.................@@ +patch 1299 +height 15 +width 7 +map +.....@@ +.....@@ +.....@@ +.....@@ +......@ +......@ +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1300 +height 11 +width 8 +map +@@@@@@.. +@@...... +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 1301 +height 6 +width 3 +map +.@@ +..@ +..@ +..@ +... +... +patch 1302 +height 8 +width 15 +map +............... +............... +............... +............... +............... +..........@@@@. +.......@@@@@@@. +.......@@@@@@@@ +patch 1303 +height 7 +width 2 +map +@@ +@@ +@@ +@@ +@@ +@@ +@@ +patch 1304 +height 9 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +............ +............ +patch 1305 +height 6 +width 6 +map +.....@ +.....@ +...... +...... +...... +...... +patch 1306 +height 6 +width 12 +map +@@@@@......@ +@@@@........ +@@@......... +@@.......... +@........... +............ +patch 1307 +height 5 +width 14 +map +.............. +@............. +@@............ +@@@........... +@@@@.......... +patch 1308 +height 11 +width 14 +map +............@@ +..........@@@@ +...........@@@ +............@@ +.............@ +.............. +.............. +...........@@@ +...........@@@ +...........@@@ +............@@ +patch 1309 +height 6 +width 22 +map +.....................@ +@....................@ +@@...................@ +@@@..................@ +@@@@.................. +@@@@@................. +patch 1310 +height 12 +width 6 +map +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@.... +@@.... +@@.... +@@.... +patch 1311 +height 4 +width 8 +map +.....@@@ +......@@ +.......@ +........ +patch 1312 +height 5 +width 12 +map +........@@@@ +.........@@@ +..........@@ +...........@ +............ +patch 1313 +height 8 +width 4 +map +.... +.... +.... +.... +.... +@... +@@.. +@@@. +patch 1314 +height 12 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 1315 +height 10 +width 11 +map +@@....@@@@@ +.......@@@@ +........@@@ +@........@@ +@.........@ +@.......... +@.......... +@.......... +@@......... +@@......... +patch 1316 +height 10 +width 3 +map +... +... +... +@.. +@.. +@.. +@.. +@.. +@.. +@@. +patch 1317 +height 5 +width 7 +map +...@@@@ +....@@@ +.....@@ +......@ +....... +patch 1318 +height 7 +width 5 +map +..... +..... +..... +@.... +@@... +@@@.. +@@@@. +patch 1319 +height 12 +width 12 +map +............ +..........@@ +..........@@ +..........@@ +...........@ +...........@ +...........@ +...........@ +............ +............ +............ +@........... +patch 1320 +height 10 +width 13 +map +.....@@@@@@@. +.@@@@@@@@@@@. +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@.... +patch 1321 +height 17 +width 17 +map +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@ +@@@@@@..@@@@@@@.. +@........@@@..... +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +................. +patch 1322 +height 8 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +patch 1323 +height 6 +width 4 +map +.... +.... +.... +.... +.... +.... +patch 1324 +height 16 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 1325 +height 10 +width 5 +map +..@@@ +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +patch 1326 +height 9 +width 8 +map +@@@@@@@@ +@@@@@@@@ +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +..@@@@@@ +..@@@@@@ +..@@@... +patch 1327 +height 6 +width 9 +map +@@@...... +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@. +@........ +patch 1328 +height 5 +width 26 +map +.......................... +.......................... +@......................... +@@@@@..................... +@@@@@@.................... +patch 1329 +height 3 +width 4 +map +@@@@ +@@.. +@@.. +patch 1330 +height 11 +width 6 +map +.....@ +....@@ +...@@@ +..@@@@ +.@@@@@ +@@@... +...... +...... +...... +...... +...... +patch 1331 +height 3 +width 9 +map +......... +......... +.......@@ +patch 1332 +height 6 +width 14 +map +.............. +.............@ +............@@ +...........@@@ +........@@@@@@ +...@@@@@@@@@@@ +patch 1333 +height 5 +width 10 +map +@@@@.....@ +@@@......@ +@@........ +@......... +.......... +patch 1334 +height 6 +width 15 +map +@@@...........@ +@@............. +@.............. +............... +............... +............... +patch 1335 +height 12 +width 17 +map +...............@@ +................@ +................@ +................@ +................@ +................@ +................@ +................. +................. +................. +................@ +...............@@ +patch 1336 +height 4 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +patch 1337 +height 10 +width 9 +map +@@@@@@@.. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1338 +height 3 +width 2 +map +.. +.. +@. +patch 1339 +height 3 +width 5 +map +@@@.. +@@@@. +@@@@@ +patch 1340 +height 11 +width 5 +map +..... +..... +..... +..... +..... +..... +@.... +@.... +@.... +@.... +@.... +patch 1341 +height 13 +width 8 +map +@@@@@@.. +@....... +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +patch 1342 +height 6 +width 9 +map +@@@...... +......... +......... +......... +......... +......... +patch 1343 +height 6 +width 8 +map +........ +........ +........ +.......@ +.......@ +........ +patch 1344 +height 12 +width 14 +map +@@@@@......... +@@@@@@........ +@@@@@@@@...... +.@@@@@@@@..... +.@@@@@@@@@@@.. +.@@@@@@@@@@@@@ +.@@@@@@@@@@@@@ +.@@@@@@@@@@@@@ +..@@@@@@@@@@@@ +..@@@@@@@@@@@@ +..@@@@@@@@@@@@ +...@@@@@@@@@@@ +patch 1345 +height 6 +width 18 +map +........@@@@@@@@@@ +..........@@@@@@@@ +........@@@@@@@@@@ +.....@@@@@@@@@@@@@ +....@@@@@@@@@@@@@@ +....@@@@@@@@@@@@@@ +patch 1346 +height 6 +width 8 +map +.@@@@@@@ +.@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +.@@@@@@@ +patch 1347 +height 4 +width 13 +map +@@@@@@@@@@@.. +@@@@@@....... +@............ +............. +patch 1348 +height 10 +width 5 +map +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1349 +height 4 +width 6 +map +...... +@..... +@@.... +@@@... +patch 1350 +height 3 +width 3 +map +... +... +@.. +patch 1351 +height 12 +width 7 +map +....... +....... +@...... +@@..... +@@..... +@@..... +@@..... +@@..... +@@..... +@@..... +@@..... +@@..... +patch 1352 +height 8 +width 3 +map +@@. +@.. +... +... +@.. +@.. +@.. +@.. +patch 1353 +height 2 +width 13 +map +............. +............@ +patch 1354 +height 9 +width 9 +map +......... +......... +......... +@........ +@........ +@........ +@........ +@........ +@........ +patch 1355 +height 15 +width 9 +map +@@@@@@... +@@@@@.... +@@@@..... +@@@...... +@@....... +@........ +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 1356 +height 5 +width 13 +map +@@@@@@....... +@@@@@@....... +@@@@@@@...... +@@@@@@@...... +@@@@@@@...... +patch 1357 +height 6 +width 1 +map +@ +@ +@ +@ +@ +@ +patch 1358 +height 5 +width 31 +map +............................... +..............................@ +....................@@.......@@ +................@@@@@@......@@@ +............@@@@@@@@@@.....@@@@ +patch 1359 +height 5 +width 9 +map +......... +....@@@@@ +...@@@@@@ +..@@@@@@@ +.@@@@@@@@ +patch 1360 +height 8 +width 6 +map +.....@ +.....@ +.....@ +...... +...... +...... +...... +...... +patch 1361 +height 6 +width 6 +map +...@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 1362 +height 8 +width 10 +map +.@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@@ +.@@@@@@@@@ +..@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +patch 1363 +height 11 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +@@@.. +@@@.. +@@@@. +@@@@. +patch 1364 +height 4 +width 5 +map +..... +..... +..... +@.@@@ +patch 1365 +height 13 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.........@ +.......@@@ +patch 1366 +height 9 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +patch 1367 +height 9 +width 4 +map +.@@@ +..@@ +...@ +...@ +...@ +...@ +...@ +.... +.... +patch 1368 +height 11 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1369 +height 8 +width 5 +map +@@@.. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@@ +@@@@@ +patch 1370 +height 12 +width 7 +map +.....@@ +......@ +......@ +......@ +......@ +......@ +....... +....... +....... +....... +....... +....... +patch 1371 +height 8 +width 14 +map +...@@@@@@@@@@@ +..@@@@@@@@@@@@ +.@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@.. +@@@@@@@@...... +@@@........... +patch 1372 +height 5 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@.. +patch 1373 +height 10 +width 7 +map +......@ +..@@@@@ +..@@@@@ +..@@@@@ +...@@@@ +...@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@. +@@@@... +patch 1374 +height 12 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +.@@@@@@@@ +.@@@@@@@@ +patch 1375 +height 4 +width 6 +map +@..... +@..... +@..... +@@.... +patch 1376 +height 6 +width 7 +map +....... +....... +....... +....... +....... +....@@@ +patch 1377 +height 15 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +@....... +@@...... +@@@..... +@@@@.... +patch 1378 +height 10 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........@@@ +..@@@@@@@@@ +patch 1379 +height 8 +width 12 +map +@@@@..@@@@@@ +@@@....@@@@@ +@@@.....@@@@ +@@.......@@@ +@@........@@ +@..........@ +@........... +............ +patch 1380 +height 9 +width 16 +map +@@@@............ +@@@............. +@@@............. +.@.............. +@............... +@@.............. +@@@............. +@@@@...........@ +@@@@@.....@@@@@@ +patch 1381 +height 11 +width 7 +map +@@@@@@@ +@@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +..@@@@@ +..@@@@@ +..@@@@@ +...@@@@ +...@@@@ +...@@@. +patch 1382 +height 6 +width 23 +map +....................... +....................... +....................... +@...................... +@@..................... +@@@.................... +patch 1383 +height 21 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +patch 1384 +height 3 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +.@@@@@@@@ +patch 1385 +height 12 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1386 +height 2 +width 5 +map +....@ +..... +patch 1387 +height 8 +width 8 +map +.......@ +....@@@@ +....@@@@ +.....@@@ +......@@ +.......@ +........ +........ +patch 1388 +height 8 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.@ +.. +.. +patch 1389 +height 2 +width 6 +map +...... +....@@ +patch 1390 +height 6 +width 7 +map +....... +....... +....... +....... +@...... +@...... +patch 1391 +height 14 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 1392 +height 7 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 1393 +height 4 +width 16 +map +................ +................ +................ +...............@ +patch 1394 +height 5 +width 11 +map +........... +......@@@@@ +.@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@.. +patch 1395 +height 4 +width 8 +map +........ +........ +........ +...@@@@. +patch 1396 +height 2 +width 5 +map +..... +@@..@ +patch 1397 +height 5 +width 16 +map +........@@@@@@@@ +........@@@@@@@@ +.......@@@@@@@@@ +....@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +patch 1398 +height 5 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +patch 1399 +height 14 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..@@@ +..@@@ +..@@@ +...@@ +...@@ +...@@ +patch 1400 +height 7 +width 6 +map +...@@@ +....@@ +.....@ +...... +...... +...... +...... +patch 1401 +height 20 +width 5 +map +@@... +@@... +@@... +@@@.. +@@@.. +@@@.. +@@@.. +@@@.. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1402 +height 5 +width 5 +map +@.... +@.... +@.... +@.... +@.... +patch 1403 +height 10 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...@@. +..@@@@ +patch 1404 +height 5 +width 7 +map +....@@@ +...@@@@ +..@@@@@ +.@@@@@@ +@@@@@@@ +patch 1405 +height 9 +width 14 +map +............@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@. +patch 1406 +height 3 +width 14 +map +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@.......... +patch 1407 +height 4 +width 5 +map +@@@@@ +@@@@. +@..@@ +@.@@@ +patch 1408 +height 6 +width 16 +map +.......@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@ +@@@@@@.......... +patch 1409 +height 1 +width 2 +map +@@ +patch 1410 +height 2 +width 2 +map +@. +.. +patch 1411 +height 7 +width 7 +map +....... +....... +....... +....@.. +...@@.. +..@@@.. +.@@@@.. +patch 1412 +height 9 +width 4 +map +.... +.... +.... +.... +.... +.... +...@ +..@@ +.@@@ +patch 1413 +height 11 +width 10 +map +......@@@@ +.@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +patch 1414 +height 3 +width 3 +map +.@. +... +... +patch 1415 +height 11 +width 13 +map +............. +............. +............. +............. +............. +.....@@@..... +..@@@@@@..... +..@@@@@@..... +..@@@@@@@.... +...@@@@@@..@@ +...@@@@@@@@@@ +patch 1416 +height 3 +width 14 +map +@@............ +.@............ +.............. +patch 1417 +height 18 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1418 +height 18 +width 3 +map +... +... +... +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +patch 1419 +height 3 +width 3 +map +.@@ +@@@ +@@@ +patch 1420 +height 6 +width 26 +map +@@@....................... +@......................... +.......................... +.......................... +.......................... +.......................... +patch 1421 +height 7 +width 7 +map +....... +....@@@ +.@@@@@@ +.@@@@@@ +..@@@@@ +..@@@@@ +..@@@@@ +patch 1422 +height 3 +width 2 +map +.. +.. +.@ +patch 1423 +height 8 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 1424 +height 8 +width 4 +map +...@ +...@ +.... +.... +.... +...@ +..@@ +.@@@ +patch 1425 +height 16 +width 10 +map +.........@ +.........@ +.........@ +.......... +.......... +.......... +.......... +.......... +.........@ +........@@ +.......@@@ +.......@@@ +.......@@@ +.......@@@ +.......@@@ +.......@@@ +patch 1426 +height 12 +width 8 +map +........ +........ +........ +........ +.......@ +.......@ +.......@ +........ +........ +........ +........ +@....... +patch 1427 +height 5 +width 17 +map +@@@@............. +@@@.............. +@@............... +@................ +................. +patch 1428 +height 12 +width 7 +map +@...... +@...... +@...... +@...... +@...... +@...... +@...... +....... +....... +....... +....... +....... +patch 1429 +height 7 +width 12 +map +@@@@@@...... +@@@@@....... +@@@@........ +@@@......... +@@.......... +@........... +............ +patch 1430 +height 7 +width 19 +map +@@@@@.............. +@@@@............... +@@@................ +@@................. +@.................. +................@@@ +................@@@ +patch 1431 +height 4 +width 6 +map +@@@@@@ +@@@@@. +@@@@@. +@..... +patch 1432 +height 6 +width 8 +map +........ +........ +@....... +@@...... +@@@..... +@@@@.@@@ +patch 1433 +height 13 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +@....... +@....... +@....... +@@...... +@@@..... +patch 1434 +height 21 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +.......@ +.......@ +.......@ +..@@@.@@ +patch 1435 +height 14 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +......@@ +....@@@@ +...@@@@@ +.@@@@@@@ +patch 1436 +height 15 +width 2 +map +.. +.. +.. +.. +.@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +.@ +.@ +patch 1437 +height 20 +width 5 +map +...@@ +....@ +....@ +..@@@ +..@@@ +..@@@ +...@@ +...@@ +...@@ +...@@ +...@@ +....@ +....@ +....@ +....@ +....@ +..... +..... +..... +..... +patch 1438 +height 41 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1439 +height 4 +width 6 +map +@@@@@@ +@@@... +@@.... +@..... +patch 1440 +height 3 +width 3 +map +... +..@ +.@@ +patch 1441 +height 8 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +patch 1442 +height 3 +width 9 +map +@@@@@@@@@ +@@@@..... +@........ +patch 1443 +height 3 +width 9 +map +..@@@@@@@ +.@@@@@@@@ +@@@...... +patch 1444 +height 5 +width 7 +map +@@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +.@@@@@@ +patch 1445 +height 6 +width 3 +map +..@ +... +... +... +... +... +patch 1446 +height 5 +width 11 +map +........... +@.......... +@@......... +@@@........ +@@@@....... +patch 1447 +height 17 +width 8 +map +@@@@@... +@@@@@... +@@@@.... +@@@..... +@@...... +@....... +........ +........ +........ +........ +........ +....@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 1448 +height 16 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@. +patch 1449 +height 8 +width 5 +map +...@@ +...@@ +..@@@ +@@@@@ +@@@@. +@@@.. +@@... +@.... +patch 1450 +height 24 +width 7 +map +@@@@@.. +@@@@... +@@@.... +@@..... +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +@...... +@...... +patch 1451 +height 18 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1452 +height 18 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.@ +.@ +.@ +.. +.. +.. +.. +.. +patch 1453 +height 10 +width 3 +map +.@@ +.@@ +.@@ +.@@ +..@ +..@ +..@ +..@ +... +.@@ +patch 1454 +height 5 +width 3 +map +@@@ +@@@ +@@@ +@@@ +@@@ +patch 1455 +height 15 +width 6 +map +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1456 +height 17 +width 8 +map +.....@@@ +.....@@@ +.....@@@ +.....@@@ +......@@ +......@@ +......@@ +......@@ +......@@ +.......@ +.......@ +.......@ +.......@ +.......@ +........ +........ +........ +patch 1457 +height 15 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 1458 +height 15 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1459 +height 6 +width 2 +map +.@ +.@ +.@ +.@ +.. +.. +patch 1460 +height 3 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +patch 1461 +height 3 +width 8 +map +@@@@@@@@ +@@@@@@.. +@....... +patch 1462 +height 3 +width 19 +map +@@@@@@@..@@@@@@@@@. +@@........@@@...... +................... +patch 1463 +height 6 +width 11 +map +@@@@@...... +@@@@....... +@@@........ +@@......... +@.......... +........... +patch 1464 +height 7 +width 20 +map +@@@@@@.............. +@@@@@............... +@@@@................ +@@@................. +@@.................. +@................... +.................... +patch 1465 +height 4 +width 7 +map +@@@@@@@ +@@@@@@. +@@@@@.. +@@@@@.. +patch 1466 +height 5 +width 10 +map +....@@@@@@ +.....@@@@@ +...@@@@@@@ +...@@@@@@@ +...@@@@@@@ +patch 1467 +height 2 +width 8 +map +@....... +........ +patch 1468 +height 15 +width 9 +map +......@@@ +......@@@ +......@@@ +......@@@ +.......@@ +@......@@ +@......@@ +@......@@ +@.......@ +@.......@ +@@......@ +@@......@ +@@......@ +@@....... +@@@...... +patch 1469 +height 4 +width 7 +map +@@@@... +....... +....... +....... +patch 1470 +height 2 +width 18 +map +.................. +.................. +patch 1471 +height 4 +width 10 +map +.......... +.......... +@......... +@......... +patch 1472 +height 7 +width 10 +map +@@@.....@. +@@@....... +@@@....... +.......... +.......... +.......... +.......... +patch 1473 +height 12 +width 5 +map +@@@@. +@@@.. +@@... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1474 +height 13 +width 6 +map +.....@ +.....@ +.....@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1475 +height 8 +width 4 +map +.... +.... +.... +.... +.... +...@ +..@@ +.@@@ +patch 1476 +height 5 +width 5 +map +..... +....@ +...@@ +..@@@ +.@@@@ +patch 1477 +height 5 +width 5 +map +.@@.. +..@@. +...@@ +....@ +..... +patch 1478 +height 7 +width 4 +map +@@@. +.... +.... +.... +.... +.... +.... +patch 1479 +height 17 +width 5 +map +..... +..... +..... +@.... +@.... +@.... +@.... +@.... +@@... +@@... +@@... +@@... +..... +..... +..... +..... +..... +patch 1480 +height 28 +width 5 +map +@@@@. +@@@.. +@@... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +...@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1481 +height 34 +width 6 +map +@@@.@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@.... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +..@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 1482 +height 17 +width 5 +map +.@... +@@... +@@... +@@... +@@@.. +@@@.. +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1483 +height 6 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@. +@@@@@@@@.. +@@@@@@@@@@ +patch 1484 +height 51 +width 1 +map +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +. +patch 1485 +height 4 +width 4 +map +@@.. +.... +.... +.... +patch 1486 +height 10 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@. +@@@@@@@@... +@@@@@@@@... +@@@@@@@@@.. +@@@@@@@@@.. +.@@@@@@@@.. +..@@@@@.... +..@........ +patch 1487 +height 6 +width 6 +map +.@@@.. +..@@.. +...@.. +...... +...... +...... +patch 1488 +height 1 +width 12 +map +@@@@@@@@@@@@ +patch 1489 +height 12 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +.@@@ +patch 1490 +height 12 +width 4 +map +@... +@... +@... +@... +@@.. +@@.. +@@.. +@@.. +@@.. +@@@. +@@@. +@@@. +patch 1491 +height 7 +width 13 +map +@@........... +............. +............. +............. +............. +............. +@............ +patch 1492 +height 8 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +patch 1493 +height 12 +width 7 +map +@@..... +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1494 +height 6 +width 6 +map +@@.... +@@.... +@@.... +@@.... +@..... +...... +patch 1495 +height 7 +width 15 +map +@@............. +@.............. +............... +............... +............... +............... +............... +patch 1496 +height 9 +width 16 +map +@............... +................ +................ +@............... +@............... +@............... +@............... +@............... +@@.............. +patch 1497 +height 6 +width 6 +map +...... +...... +...... +...... +...... +....@@ +patch 1498 +height 10 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +..@@@@ +patch 1499 +height 9 +width 12 +map +.......@@@@@ +.......@@@@@ +.......@@@@@ +.......@@@.@ +...........@ +...........@ +...........@ +............ +............ +patch 1500 +height 4 +width 17 +map +................. +................. +................. +................. +patch 1501 +height 19 +width 5 +map +@@@@. +@@@@. +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +.@@@@ +.@@@@ +.@@@@ +.@@@@ +.@@@@ +..@@@ +..@@@ +@..@@ +@...@ +patch 1502 +height 11 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +.@@@@@@@@ +.@@@@@@@@ +.@@@@@@@@ +.@@@@@@@@ +.@@@@@@@@ +.@@@@@@@@ +patch 1503 +height 3 +width 5 +map +@@... +@@... +@@... +patch 1504 +height 6 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@..... +patch 1505 +height 6 +width 2 +map +@. +.. +.. +.. +.. +.. +patch 1506 +height 7 +width 5 +map +..... +..... +....@ +....@ +...@@ +...@@ +..@@@ +patch 1507 +height 17 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +....@ +....@ +...@@ +...@@ +..@@@ +..@@@ +.@@@@ +.@@@@ +patch 1508 +height 7 +width 5 +map +..... +....@ +...@@ +...@@ +..@@@ +..@@@ +.@@@@ +patch 1509 +height 3 +width 3 +map +@@@ +@@@ +@@@ +patch 1510 +height 13 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........... +@.......... +@.......... +@.......... +@......@@@@ +patch 1511 +height 16 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +....@ +...@@ +.@@@@ +patch 1512 +height 16 +width 6 +map +@@@@@@ +@@@@@. +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +....@@ +...@@@ +..@@@@ +.@@@@@ +patch 1513 +height 12 +width 13 +map +@@........... +@............ +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +patch 1514 +height 9 +width 5 +map +@@@@@ +.@@@@ +.@@@@ +.@@@@ +.@@@@ +.@@@@ +..@@@ +..@@@ +..@@@ +patch 1515 +height 8 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +.@@@@@ +.@@@@@ +..@@@@ +patch 1516 +height 6 +width 5 +map +..... +..... +..... +..... +..... +...@@ +patch 1517 +height 3 +width 24 +map +......................@@ +.......................@ +@....................... +patch 1518 +height 6 +width 29 +map +........................@@@@@ +.........................@@@@ +@.........................@@@ +@@.........................@@ +@@@.........................@ +@@@@......................... +patch 1519 +height 6 +width 24 +map +........................ +@....................... +@@...................... +@@@..................... +@@@@.................... +@@@@@................... +patch 1520 +height 6 +width 18 +map +.................. +@................. +@@................ +@@@............... +@@@@.............. +@@@@@............. +patch 1521 +height 6 +width 4 +map +@@@. +@@.. +@@.. +@... +.... +.... +patch 1522 +height 6 +width 19 +map +@@................. +@.................. +@.................. +..................@ +.................@@ +................@@@ +patch 1523 +height 6 +width 8 +map +@@@@@@@. +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 1524 +height 2 +width 11 +map +........... +........... +patch 1525 +height 9 +width 7 +map +.@@@... +.@@.... +....... +....... +....... +....... +....... +....... +....... +patch 1526 +height 7 +width 9 +map +@@@@@@@.. +@@....... +......... +......... +......... +@........ +@........ +patch 1527 +height 11 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +......@ +patch 1528 +height 4 +width 7 +map +....... +....... +....... +.....@@ +patch 1529 +height 9 +width 7 +map +@@..... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1530 +height 11 +width 9 +map +@@@@@.... +......... +......... +......... +......... +......... +......... +......... +......... +......... +........@ +patch 1531 +height 9 +width 10 +map +@......... +@......... +@......... +@......... +@......... +@......... +.......... +.......... +@......... +patch 1532 +height 5 +width 5 +map +@@@@. +@@@@@ +@@@@. +@@@@. +@@@.. +patch 1533 +height 5 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@. +@@@@@@@@@. +@@@@@@@@.. +@@@@@@@... +patch 1534 +height 6 +width 16 +map +................ +................ +................ +................ +................ +................ +patch 1535 +height 6 +width 12 +map +@@@@@@@..... +@@@@@@...... +@@@@@@...... +@@@@@....... +@@@@@....... +@@@@........ +patch 1536 +height 12 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +@@@@.. +@@@@@. +patch 1537 +height 8 +width 9 +map +@@@...... +......... +@........ +@@....... +@@@...... +@@@@..... +@@@@@.... +@@@@@@... +patch 1538 +height 22 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +........ +@@...... +@@...... +@@...... +@@...... +@@...... +@@@..... +@@@@.... +@@@@@... +@@@@@@.. +@@@@@@@. +patch 1539 +height 10 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 1540 +height 6 +width 3 +map +@@. +@.. +... +... +... +... +patch 1541 +height 21 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +..@ +patch 1542 +height 21 +width 6 +map +@@.... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +patch 1543 +height 6 +width 13 +map +............. +............@ +...........@@ +..........@@@ +.........@@@@ +........@@@@@ +patch 1544 +height 6 +width 7 +map +....... +......@ +.....@@ +....@@@ +...@@@@ +.@@@@@@ +patch 1545 +height 10 +width 4 +map +@@@. +@@@. +@@@. +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +patch 1546 +height 9 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +patch 1547 +height 9 +width 7 +map +@@@.@@. +....... +....... +....... +....... +....... +....... +....... +....... +patch 1548 +height 14 +width 7 +map +@@..@@@ +....@@@ +....@@@ +....@@@ +....@@@ +....@@@ +....@@@ +....@@@ +.....@@ +......@ +......@ +......@ +....... +....... +patch 1549 +height 22 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +.@@@@ +.@@@@ +.@@@@ +.@@@@ +.@@@@ +.@@@@ +..@@@ +..@@@ +..@@@ +..@@@ +..@@@ +...@@ +...@@ +@@@@@ +patch 1550 +height 9 +width 5 +map +@@@@. +@@@.. +@@... +@.... +..... +..... +..... +..... +..... +patch 1551 +height 13 +width 3 +map +@@. +@.. +... +... +... +... +... +... +... +... +... +... +... +patch 1552 +height 11 +width 3 +map +@@. +@.. +... +... +... +... +... +... +... +... +... +patch 1553 +height 7 +width 12 +map +............ +............ +............ +............ +............ +........@@@@ +...@@@@@@@@@ +patch 1554 +height 7 +width 4 +map +.... +.... +.... +.... +.... +.... +...@ +patch 1555 +height 16 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +@@.. +@@.. +@@.. +@@@. +@@@. +@@@. +@@@. +patch 1556 +height 8 +width 4 +map +@@.. +@@.. +@@@. +@@@. +@@@. +@@@. +@@@@ +@@@@ +patch 1557 +height 9 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +.@@@ +patch 1558 +height 2 +width 5 +map +@@@@@ +@@@@. +patch 1559 +height 6 +width 6 +map +...... +...... +@..... +@..... +@..... +@..... +patch 1560 +height 6 +width 9 +map +......... +@........ +@........ +@........ +@........ +@........ +patch 1561 +height 10 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +..........@ +.....@@@@@@ +patch 1562 +height 3 +width 4 +map +@@@@ +@@@@ +@@@@ +patch 1563 +height 11 +width 7 +map +@@@@@.. +@@@@@.. +@@@@@.. +@@@@@@. +@@@@@@. +.@@@@@. +..@@@@. +...@@@. +@@.@@@. +@@@@@@. +@@@@@@. +patch 1564 +height 13 +width 5 +map +@@@@. +@@@.. +@@... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1565 +height 20 +width 6 +map +@@@@@. +@@@@@. +@@@@.. +@@@... +@@@... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1566 +height 20 +width 6 +map +....@@ +....@@ +....@@ +....@@ +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +.....@ +.....@ +.....@ +.....@ +.....@ +patch 1567 +height 1 +width 7 +map +....... +patch 1568 +height 12 +width 4 +map +..@@ +..@@ +..@@ +..@@ +..@@ +...@ +...@ +...@ +...@ +...@ +...@ +.... +patch 1569 +height 6 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +.@@@@@@@@ +.@@@@@@@@ +patch 1570 +height 7 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1571 +height 5 +width 6 +map +@@.... +...... +...... +...... +...... +patch 1572 +height 6 +width 5 +map +....@ +....@ +....@ +..... +..... +..... +patch 1573 +height 7 +width 4 +map +...@ +...@ +.... +.... +...@ +...@ +...@ +patch 1574 +height 8 +width 4 +map +.... +.... +.@.. +@@.. +@@.. +@@.. +@... +.... +patch 1575 +height 13 +width 3 +map +.@@ +.@@ +.@@ +.@@ +.@@ +..@ +..@ +..@ +..@ +..@ +... +..@ +.@@ +patch 1576 +height 8 +width 6 +map +...... +...... +...... +...... +...... +...... +...@@@ +..@@@@ +patch 1577 +height 3 +width 9 +map +..@@@@@@@ +.@@@@@@@. +@@@@@@@@. +patch 1578 +height 2 +width 23 +map +....................... +......................@ +patch 1579 +height 8 +width 9 +map +@@@@..... +@@@@.@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1580 +height 17 +width 8 +map +@@@@@... +@@@@@@.. +@@@@@@.. +@@@@@@.. +@@@@@@.. +@@@@@@@. +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +..@@@@@@ +..@@@@@@ +..@@@@.. +patch 1581 +height 5 +width 10 +map +@@@@@@@@@@ +@@@@@@@.@@ +@@@@.....@ +.......... +.......... +patch 1582 +height 3 +width 3 +map +.@@ +..@ +... +patch 1583 +height 5 +width 5 +map +@@... +@@@.. +@@@@. +@@@@@ +@@@@@ +patch 1584 +height 6 +width 4 +map +@@.. +@@.. +@@.. +@@.. +@@.. +@@@. +patch 1585 +height 6 +width 6 +map +...... +...... +...... +...... +@..... +@..... +patch 1586 +height 2 +width 6 +map +@@@@@@ +@@@@@@ +patch 1587 +height 3 +width 3 +map +... +... +..@ +patch 1588 +height 11 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1589 +height 11 +width 7 +map +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1590 +height 11 +width 3 +map +@.. +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +@@. +patch 1591 +height 11 +width 7 +map +@...... +@...... +....... +....... +....... +@@..... +@@..... +@@..... +@@@.... +@@@.... +@@@...@ +patch 1592 +height 16 +width 6 +map +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 1593 +height 16 +width 7 +map +@@@@@.. +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1594 +height 4 +width 7 +map +@...... +....... +....... +....... +patch 1595 +height 5 +width 8 +map +........ +........ +.......@ +@......@ +@...@@@@ +patch 1596 +height 10 +width 9 +map +........@ +......... +......... +......... +......... +......... +......... +........@ +.......@@ +...@@@@@@ +patch 1597 +height 4 +width 16 +map +@@@............. +@@.............. +@............... +................ +patch 1598 +height 4 +width 17 +map +@@............... +@................ +................. +................. +patch 1599 +height 12 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +patch 1600 +height 10 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +patch 1601 +height 5 +width 11 +map +........... +........... +....@@@.... +@@@@@@@.... +@@@@@@@@... +patch 1602 +height 8 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +.....@ +patch 1603 +height 11 +width 6 +map +.....@ +.....@ +.....@ +.....@ +.....@ +...... +...... +...... +...... +...... +...... +patch 1604 +height 6 +width 7 +map +....... +......@ +@....@@ +@...@@@ +@..@@@@ +@.@@@@@ +patch 1605 +height 17 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +...@. +patch 1606 +height 26 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +.@... +..@.. +...@. +patch 1607 +height 27 +width 10 +map +.......@@. +........@. +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +........@@ +........@@ +........@@ +........@@ +.........@ +.........@ +.........@ +.........@ +.........@ +.........@ +.......... +.......... +.......... +.......... +patch 1608 +height 2 +width 8 +map +......@@ +........ +patch 1609 +height 7 +width 18 +map +.................. +.................. +.................. +.................. +.................. +.................. +.................. +patch 1610 +height 7 +width 5 +map +...@@ +....@ +..... +..... +..... +..... +..... +patch 1611 +height 16 +width 2 +map +.@ +.@ +.@ +.@ +.. +.@ +@@ +@@ +.@ +.@ +.@ +.@ +.. +.. +.. +.. +patch 1612 +height 15 +width 15 +map +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +............... +@.............. +patch 1613 +height 10 +width 2 +map +.. +.. +.. +.@ +@@ +@@ +@@ +.@ +.@ +.@ +patch 1614 +height 6 +width 5 +map +..@@@ +...@@ +..... +..... +..... +..... +patch 1615 +height 6 +width 6 +map +..@@@. +...... +...... +...... +...... +...... +patch 1616 +height 1 +width 9 +map +@@@@@@@@@ +patch 1617 +height 5 +width 14 +map +.............. +.............. +.............. +.............. +.............. +patch 1618 +height 5 +width 13 +map +@@@@@@@@@@... +..@@@@@@@@@.. +@@.@@@@@@@@.. +@@..@@@@@@@.. +@@....@@@.... +patch 1619 +height 3 +width 22 +map +...................... +...................... +...................... +patch 1620 +height 22 +width 9 +map +.....@... +....@@... +...@@@@.. +..@@@@@.. +.@@@@@@.. +@@@@@@@.. +@@@@@@@@. +@@@@@@@@. +@@@@@@@.. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@. +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1621 +height 5 +width 6 +map +@....@ +@.@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 1622 +height 4 +width 3 +map +..@ +@@@ +@@@ +@@@ +patch 1623 +height 5 +width 9 +map +..@@@@@@. +..@@@@@@. +.@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1624 +height 11 +width 1 +map +. +. +. +. +. +. +. +. +. +. +. +patch 1625 +height 10 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@. +@@@. +@@@. +@@@. +@@@@ +@@@@ +@@@@ +patch 1626 +height 6 +width 12 +map +...........@ +............ +............ +............ +............ +...@@@...... +patch 1627 +height 6 +width 8 +map +.......@ +@......@ +@......@ +@......@ +@......@ +@....... +patch 1628 +height 10 +width 3 +map +... +... +... +... +@.. +@.. +@.. +@.. +@.. +@@. +patch 1629 +height 8 +width 5 +map +.@@@@ +..... +..... +..... +..... +..... +..... +..... +patch 1630 +height 10 +width 11 +map +......@@@@@ +.......@@@@ +........@@@ +.........@@ +..........@ +........... +........... +........... +........... +........... +patch 1631 +height 12 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +............ +....@....... +...@@....... +..@@@....... +@@@@@....... +patch 1632 +height 8 +width 9 +map +@@@...... +@@@...... +@@@...... +@@@...... +@@@...... +......... +@........ +@@....... +patch 1633 +height 11 +width 6 +map +.....@ +....@@ +....@@ +....@@ +.....@ +.....@ +.....@ +.....@ +.....@ +...... +...... +patch 1634 +height 16 +width 8 +map +....@@@@ +...@@@@@ +...@@@@@ +..@@@@@@ +..@@@@@@ +.@@@@@@@ +.@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@.. +patch 1635 +height 7 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +patch 1636 +height 20 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1637 +height 10 +width 3 +map +.@@ +.@@ +.@@ +.@@ +.@@ +..@ +..@ +..@ +..@ +... +patch 1638 +height 10 +width 8 +map +....@@@@ +.....@@@ +......@@ +.......@ +.......@ +.......@ +.......@ +........ +........ +........ +patch 1639 +height 8 +width 7 +map +......@ +......@ +......@ +......@ +....... +....... +....... +....... +patch 1640 +height 4 +width 13 +map +............@ +............@ +............. +............. +patch 1641 +height 5 +width 15 +map +........@@@@@.. +............... +............... +............... +............... +patch 1642 +height 6 +width 8 +map +.....@@@ +.@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 1643 +height 3 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@@@ +@@@@@@@@@@@ +patch 1644 +height 2 +width 13 +map +@@@@@@@@@@@@@ +@@@@@........ +patch 1645 +height 2 +width 28 +map +@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +patch 1646 +height 7 +width 12 +map +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@. +@@@@@@...... +@@.......... +patch 1647 +height 9 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...@@@ +patch 1648 +height 12 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +.....@ +..@@@@ +patch 1649 +height 4 +width 5 +map +..... +..... +..... +....@ +patch 1650 +height 14 +width 13 +map +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +............. +.........@@@@ +....@@@@@@@@@ +patch 1651 +height 4 +width 6 +map +.....@ +...... +...... +...... +patch 1652 +height 6 +width 9 +map +......... +......... +......... +......... +@........ +@@@@..... +patch 1653 +height 6 +width 8 +map +........ +........ +@....... +@@...... +@@@..... +@@@@.... +patch 1654 +height 2 +width 6 +map +...... +@@@@@@ +patch 1655 +height 13 +width 5 +map +@@@.. +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1656 +height 12 +width 6 +map +...... +...... +...... +...... +...... +@..... +@..... +@..... +...... +...... +...... +...... +patch 1657 +height 11 +width 12 +map +.........@@@ +..........@@ +...........@ +............ +............ +............ +............ +............ +............ +............ +............ +patch 1658 +height 13 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +........... +........... +.@......... +.@@........ +.@@@....... +.@@@@.....@ +patch 1659 +height 4 +width 12 +map +...........@ +...........@ +...........@ +............ +patch 1660 +height 2 +width 7 +map +....@@@ +....@@@ +patch 1661 +height 3 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +.@@@@@@@@@ +patch 1662 +height 5 +width 28 +map +........................@@@@ +.........................@@@ +..........................@@ +...........................@ +............................ +patch 1663 +height 5 +width 16 +map +............@@@@ +.............@@@ +..............@@ +...............@ +................ +patch 1664 +height 15 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +...@@ +...@@ +patch 1665 +height 8 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..@@@ +patch 1666 +height 6 +width 6 +map +.....@ +@....@ +@....@ +@..... +@..... +@@.... +patch 1667 +height 7 +width 6 +map +....@@ +.....@ +.....@ +.....@ +.....@ +...... +...... +patch 1668 +height 3 +width 17 +map +@@@@@@@@@@@@@.... +................. +................. +patch 1669 +height 7 +width 4 +map +.@@@ +.@@@ +..@@ +@@@@ +@@@@ +@@@@ +@@@@ +patch 1670 +height 3 +width 7 +map +@@@@@@@ +@@@@@@. +@...... +patch 1671 +height 3 +width 9 +map +@@@...... +......... +......... +patch 1672 +height 4 +width 22 +map +...................... +@..................... +@@.................... +@@@................... +patch 1673 +height 3 +width 3 +map +..@ +.@@ +@@. +patch 1674 +height 4 +width 1 +map +@ +@ +@ +@ +patch 1675 +height 4 +width 13 +map +@@@.......... +@@........... +@............ +............. +patch 1676 +height 7 +width 13 +map +@@........... +............. +............. +............. +............. +............. +............. +patch 1677 +height 8 +width 6 +map +....@@ +....@@ +....@@ +.....@ +@....@ +@....@ +@....@ +@..... +patch 1678 +height 3 +width 2 +map +.. +@. +@. +patch 1679 +height 8 +width 8 +map +........ +........ +........ +........ +........ +........ +........ +......@@ +patch 1680 +height 5 +width 24 +map +@@@@.................... +@@@..................... +@@...................... +@....................... +........................ +patch 1681 +height 3 +width 22 +map +@@.................... +@..................... +...................... +patch 1682 +height 5 +width 2 +map +.@ +.@ +.@ +.@ +.. +patch 1683 +height 8 +width 12 +map +............ +............ +............ +............ +............ +............ +............ +............ +patch 1684 +height 12 +width 7 +map +@@@@@@. +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1685 +height 6 +width 13 +map +............. +............@ +...........@@ +..........@@@ +.........@@@@ +..@@@@@.@@@@@ +patch 1686 +height 7 +width 5 +map +@.... +@@... +@@@.. +@@@@. +@@@@@ +@@@@@ +@...@ +patch 1687 +height 4 +width 20 +map +.......@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@ +patch 1688 +height 2 +width 30 +map +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@.... +patch 1689 +height 3 +width 13 +map +@@@@@@@@@@@@@ +@@@@@@@@..... +@@@@@@@...... +patch 1690 +height 8 +width 3 +map +... +@.. +@.. +@.. +@.. +@.. +@@. +@@. +patch 1691 +height 8 +width 5 +map +@@@@. +@@@.. +@@... +@.... +..... +@.... +@@... +@@... +patch 1692 +height 18 +width 6 +map +@@.... +@..... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@..... +...... +...... +...... +patch 1693 +height 4 +width 4 +map +.... +@... +@... +@... +patch 1694 +height 5 +width 8 +map +........ +@....... +@....... +@....... +@....... +patch 1695 +height 6 +width 2 +map +.@ +@@ +@@ +@@ +@@ +@. +patch 1696 +height 21 +width 10 +map +........@@ +.........@ +.......... +.......... +.......@@@ +.......@@@ +......@@@@ +.......@@@ +@......@@@ +@.......@@ +@.......@@ +@........@ +@@.......@ +@@........ +@@........ +@@@....... +@@@....... +.......... +@......... +@@........ +@@@....... +patch 1697 +height 3 +width 5 +map +@.... +@.... +..... +patch 1698 +height 6 +width 7 +map +....... +......@ +......@ +.....@@ +.....@@ +....@@@ +patch 1699 +height 6 +width 21 +map +..................... +....................@ +....................@ +...................@@ +...................@@ +..................@@@ +patch 1700 +height 6 +width 17 +map +@................ +@................ +@................ +@................ +@...............@ +................@ +patch 1701 +height 6 +width 12 +map +...........@ +.......@@@@@ +..@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +patch 1702 +height 9 +width 11 +map +.........@@ +.........@@ +..........@ +..........@ +..........@ +..........@ +........... +........... +........... +patch 1703 +height 2 +width 6 +map +@@@... +...... +patch 1704 +height 9 +width 2 +map +.. +.. +.. +.. +@. +@. +@. +@. +@. +patch 1705 +height 17 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +@. +@. +@. +@. +@. +patch 1706 +height 25 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +@. +@. +@. +@. +@. +patch 1707 +height 31 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@... +patch 1708 +height 4 +width 4 +map +..@@ +...@ +@... +@..@ +patch 1709 +height 12 +width 3 +map +... +... +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +@@. +patch 1710 +height 19 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@.. +@@. +@@. +@@. +patch 1711 +height 20 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +patch 1712 +height 5 +width 27 +map +........................... +........................... +........................... +........................... +........................... +patch 1713 +height 1 +width 5 +map +@@@@@ +patch 1714 +height 3 +width 10 +map +.......... +.........@ +.......... +patch 1715 +height 6 +width 14 +map +...........@@@ +............@@ +.............@ +.............@ +.............. +.............. +patch 1716 +height 18 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1717 +height 10 +width 3 +map +... +... +... +... +... +... +... +... +... +... +patch 1718 +height 11 +width 6 +map +...... +...... +...... +.....@ +.....@ +.....@ +.....@ +...... +...... +...... +...... +patch 1719 +height 4 +width 11 +map +..........@ +........... +........@@@ +..@@@@@@@@@ +patch 1720 +height 6 +width 9 +map +.....@@@@ +....@@@@@ +...@@@@@@ +..@@@@@@@ +.@@@@@@@@ +@@@@@@@@@ +patch 1721 +height 2 +width 6 +map +@@@@@@ +@..... +patch 1722 +height 6 +width 8 +map +@@...... +@@..@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 1723 +height 5 +width 13 +map +@@@@@@@@@@@@@ +@@@@@@@@@@... +@@@@@........ +............. +............. +patch 1724 +height 5 +width 5 +map +....@ +....@ +....@ +..... +..... +patch 1725 +height 10 +width 14 +map +..........@@@@ +......@@@@@@@@ +..@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +.@@@@@@@..@@@@ +.@@@.......@@@ +...........@@@ +...........@@@ +patch 1726 +height 8 +width 6 +map +.....@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@.... +patch 1727 +height 11 +width 1 +map +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +@ +patch 1728 +height 6 +width 2 +map +@@ +@@ +@@ +.@ +.@ +.@ +patch 1729 +height 3 +width 3 +map +@@. +..@ +.@@ +patch 1730 +height 8 +width 22 +map +...................... +...................... +...................... +@..................... +@..................... +@...................@@ +@..........@@@@..@@@@@ +@@...@@@@@@@@@@@@@@@@@ +patch 1731 +height 6 +width 7 +map +....... +....... +....... +....... +@...... +@..@@@@ +patch 1732 +height 8 +width 5 +map +..... +.@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1733 +height 4 +width 7 +map +....... +....... +....... +....@@@ +patch 1734 +height 8 +width 3 +map +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +patch 1735 +height 2 +width 8 +map +........ +.....@@@ +patch 1736 +height 18 +width 12 +map +..........@@ +...........@ +...........@ +...........@ +...........@ +...........@ +...........@ +...........@ +...........@ +...........@ +...........@ +...........@ +@........... +@........... +@........... +@........... +@........... +@@.......... +patch 1737 +height 6 +width 11 +map +........... +........... +........... +........... +........... +........... +patch 1738 +height 10 +width 3 +map +@.. +@.. +@@. +@@. +@@. +@@. +@@@ +@@@ +@@@ +@@@ +patch 1739 +height 5 +width 6 +map +.....@ +...... +...... +...... +...... +patch 1740 +height 10 +width 5 +map +@@@.. +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1741 +height 6 +width 6 +map +@@@... +...... +...... +...... +...... +...... +patch 1742 +height 24 +width 16 +map +.............@@@ +.............@@@ +.............@@@ +.............@@@ +.............@@@ +..............@@ +..............@@ +..............@@ +..............@@ +..............@@ +..............@@ +...............@ +...............@ +...............@ +...............@ +...............@ +...............@ +................ +................ +................ +................ +................ +................ +................ +patch 1743 +height 8 +width 9 +map +@@@@@@@.. +@@@...... +......... +......... +......... +......... +......... +......... +patch 1744 +height 15 +width 2 +map +@. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1745 +height 3 +width 7 +map +@@@@@@. +@@@@... +....... +patch 1746 +height 4 +width 11 +map +@@@@@...... +........... +........... +........... +patch 1747 +height 8 +width 3 +map +... +... +... +... +... +... +... +... +patch 1748 +height 4 +width 14 +map +.............. +@............. +@@............ +@@@........... +patch 1749 +height 4 +width 20 +map +.................... +@................... +@@.................. +@@@................. +patch 1750 +height 7 +width 17 +map +......@@@@@@@@@@@ +.....@@@@@@@@@@@@ +....@@@@@@@@@@@@@ +...@@@@@@@@@@@@@@ +..@@@@@@@@@@@@@@@ +.@@@@@@@@@@@..... +@@@@@@@.......... +patch 1751 +height 5 +width 6 +map +..@@@@ +...... +...... +...... +...... +patch 1752 +height 7 +width 13 +map +...........@@ +............@ +@............ +@............ +@............ +@............ +@............ +patch 1753 +height 8 +width 13 +map +............@ +............@ +............@ +............@ +............@ +@............ +@............ +@............ +patch 1754 +height 4 +width 12 +map +............ +............ +............ +.....@@@@..@ +patch 1755 +height 5 +width 6 +map +@..... +...... +...... +...... +...... +patch 1756 +height 11 +width 12 +map +@@@@........ +@@.......... +@........... +............ +............ +............ +............ +............ +............ +............ +............ +patch 1757 +height 15 +width 3 +map +... +... +... +... +... +... +... +... +... +... +..@ +..@ +..@ +@.. +@@. +patch 1758 +height 3 +width 3 +map +@.. +@@. +@@@ +patch 1759 +height 6 +width 8 +map +.@@@@@@@ +.@@@.... +........ +........ +........ +........ +patch 1760 +height 26 +width 4 +map +@@@. +@@.. +@... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@... +@... +@... +@... +@@.. +@@.. +@@.. +patch 1761 +height 4 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1762 +height 10 +width 8 +map +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 1763 +height 5 +width 12 +map +....@@@@@@@@ +....@@@@@@@@ +....@@@@@@@@ +....@@@@@@@@ +.....@@@@@@@ +patch 1764 +height 6 +width 21 +map +..............@@@@@@@ +..............@@@@@@@ +..............@@@@@@@ +..............@@@@@@@ +...............@@@@@@ +...............@@@@@@ +patch 1765 +height 7 +width 17 +map +................. +@................ +@@............... +@@@.............. +@@@@............. +@@@@@............ +@@@@@@........... +patch 1766 +height 7 +width 13 +map +............. +@............ +@............ +@...@........ +@@.@@@@...... +@@@@@@@@..... +@@@@@@@@@@... +patch 1767 +height 4 +width 5 +map +..@@@ +...@@ +....@ +..... +patch 1768 +height 10 +width 4 +map +..@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +patch 1769 +height 6 +width 2 +map +@. +@. +@. +@@ +@@ +@@ +patch 1770 +height 11 +width 4 +map +@@@@ +.@@@ +.@@@ +.@@@ +.@@@ +..@@ +..@@ +..@@ +..@@ +...@ +...@ +patch 1771 +height 2 +width 4 +map +.... +..@@ +patch 1772 +height 4 +width 5 +map +..... +..... +..... +.@@@@ +patch 1773 +height 18 +width 6 +map +@@@... +@@@@.. +@@@@.. +@@@@.. +@@@@.. +@@@@.. +@@@@.. +@@@@@. +@@@@@. +@@@@@. +@@.... +...... +...... +...... +...... +.....@ +...@@@ +.@@@@@ +patch 1774 +height 5 +width 2 +map +.. +.. +.. +.. +.. +patch 1775 +height 4 +width 5 +map +..... +..... +..... +@@@.. +patch 1776 +height 15 +width 18 +map +@@@@@@@@@@@....... +@@@@@............. +@@................ +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +.................. +patch 1777 +height 10 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +@@@........ +@@@........ +@@@........ +patch 1778 +height 14 +width 3 +map +.@@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +patch 1779 +height 8 +width 7 +map +....... +....... +....... +....... +@@..... +@@..... +@@...@@ +@@@.@@@ +patch 1780 +height 7 +width 9 +map +.......@@ +.......@@ +.......@@ +........@ +........@ +........@ +......... +patch 1781 +height 21 +width 3 +map +..@ +..@ +..@ +..@ +..@ +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 1782 +height 6 +width 6 +map +@@.... +...... +...... +...... +...... +...... +patch 1783 +height 7 +width 7 +map +@@@.... +@@@.... +@@@.... +@@..... +@@..... +@@..... +....... +patch 1784 +height 9 +width 6 +map +@@@@@@ +@@@@@. +@@@@.. +@@@... +@@...@ +@@..@@ +@@.@@@ +@@@@@. +@@@@@@ +patch 1785 +height 7 +width 6 +map +@..... +@@.... +@@@... +@@@@.. +@@@@@. +@@@@@@ +@@@@@@ +patch 1786 +height 23 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@... +@... +@... +@... +@... +@... +@... +@@.. +@@.. +@@.. +patch 1787 +height 12 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@... +@........ +patch 1788 +height 3 +width 9 +map +@@@...... +@@@@@@@@. +@@@@@@@@@ +patch 1789 +height 3 +width 8 +map +..@@@@@@ +.@@@@@@@ +@@@@@@@@ +patch 1790 +height 12 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1791 +height 13 +width 26 +map +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +.......................... +........@@@............... +..@@@@@@@@@@.............. +@@@@@@@@@@@@.............. +@@@@@@@@@@@@@............. +patch 1792 +height 6 +width 6 +map +@@@@@. +@@@@.. +@@@... +@@.... +@..... +...... +patch 1793 +height 9 +width 7 +map +@@@@@@. +@@@@@.. +@@@@... +@@@.... +@@..... +@...... +....... +....... +....... +patch 1794 +height 16 +width 4 +map +@... +@... +@@.. +@@.. +@@.. +@@.. +@@.. +@@@. +@@@. +@@@. +@@@. +@@@. +@@@@ +@@@@ +@@@@ +@@@@ +patch 1795 +height 2 +width 3 +map +..@ +@@@ +patch 1796 +height 12 +width 19 +map +................... +................... +................... +................... +................... +................... +................... +................... +................... +.@@................ +@@@................ +@@@................ +patch 1797 +height 12 +width 4 +map +.... +.... +.... +.... +.... +@... +@... +@... +@@@. +@@@. +@@@. +@@@. +patch 1798 +height 4 +width 9 +map +......... +......... +......... +........@ +patch 1799 +height 5 +width 11 +map +.........@@ +.........@@ +.........@@ +........... +........... +patch 1800 +height 3 +width 5 +map +@@@@. +@@... +..... +patch 1801 +height 2 +width 30 +map +..................@@@@........ +...................@.......... +patch 1802 +height 3 +width 4 +map +@... +.... +.... +patch 1803 +height 12 +width 12 +map +@@@@@@@@.... +@@@@@....... +@@@@........ +............ +............ +............ +............ +............ +............ +............ +............ +............ +patch 1804 +height 8 +width 17 +map +@@@@@@@@@@@@@@@@. +@@@@@@@@@@@@..... +@@@@@@@@@@@@..... +@@@@@@@@@@@@..... +@@@@@@@@@@@@..... +..@@@@@@@@@@..... +..@@@@........... +................. +patch 1805 +height 14 +width 6 +map +@@.... +@@.... +@@@... +@@@... +@@@... +@@@... +@@@... +@@@... +@@@... +@@@... +@@@... +@@@... +@@@@.. +@@@@.. +patch 1806 +height 3 +width 6 +map +.....@ +.....@ +...... +patch 1807 +height 6 +width 5 +map +..... +..... +..... +@.... +@.... +@.... +patch 1808 +height 12 +width 3 +map +@.. +@.. +@.. +@.. +@.. +@@. +@@. +@@. +@@. +@@. +@@@ +@@@ +patch 1809 +height 3 +width 3 +map +@@@ +.@@ +..@ +patch 1810 +height 9 +width 13 +map +.......@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +@@@@@@@@..... +............. +............. +patch 1811 +height 5 +width 25 +map +...............@@@@@@@@@@ +...............@@@.@@@@@@ +....................@@@@@ +...................@@@@@@ +...................@@@@@@ +patch 1812 +height 5 +width 3 +map +... +@.. +@@. +@@. +@@. +patch 1813 +height 6 +width 21 +map +..................... +..................... +..................... +..................... +..................... +..................... +patch 1814 +height 7 +width 17 +map +................. +................. +................. +................. +................. +................. +................. +patch 1815 +height 7 +width 8 +map +........ +........ +........ +.......@ +.......@ +......@@ +..@@@.@@ +patch 1816 +height 4 +width 9 +map +......... +......... +......... +@....@@@@ +patch 1817 +height 3 +width 5 +map +..... +..... +.@@@@ +patch 1818 +height 16 +width 5 +map +...@@ +....@ +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +.@@@@ +patch 1819 +height 14 +width 11 +map +@@@@@@@@@@. +@@@@@...... +........... +........@@@ +........@@@ +........@@@ +.........@@ +.........@@ +.........@@ +.........@@ +.........@@ +..........@ +..........@ +..........@ +patch 1820 +height 12 +width 6 +map +...... +...... +...... +...... +@..... +@..... +@..... +@..... +@..... +@@.... +@@.... +@@.... +patch 1821 +height 6 +width 19 +map +@.................. +................... +@@@@............... +@@@@............... +@@@@............... +@@@@@.............. +patch 1822 +height 6 +width 23 +map +....................@@@ +....................@@@ +....................@@. +....................@@@ +....................@@@ +.....................@@ +patch 1823 +height 4 +width 5 +map +....@ +....@ +....@ +..... +patch 1824 +height 7 +width 6 +map +...... +...... +...... +...... +...... +...... +@..@@@ +patch 1825 +height 5 +width 7 +map +@@@@@@@ +@@@@@@@ +@@@@@@@ +.@@@@@@ +.@@@@@@ +patch 1826 +height 12 +width 7 +map +@@...@@ +......@ +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1827 +height 14 +width 4 +map +.@@@ +..@@ +...@ +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1828 +height 5 +width 5 +map +....@ +....@ +....@ +....@ +..... +patch 1829 +height 4 +width 3 +map +@.. +... +... +... +patch 1830 +height 5 +width 16 +map +................ +................ +................ +@............... +@............... +patch 1831 +height 18 +width 5 +map +@@... +@@... +@@@.. +@@@.. +@@@.. +@@@.. +@@@.. +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@@... +@@@.. +patch 1832 +height 11 +width 12 +map +@@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +patch 1833 +height 12 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +.@@@@@ +..@@@@ +..@@@@ +..@@@@ +patch 1834 +height 3 +width 4 +map +@@@@ +.@@@ +.@@@ +patch 1835 +height 3 +width 14 +map +@@@@@@@@@@@@@@ +....@@@@@@@@@@ +....@@@@@@@@@@ +patch 1836 +height 6 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +patch 1837 +height 8 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1838 +height 15 +width 8 +map +.....@@@ +.....@@@ +@....@@@ +@....@@@ +@.....@@ +@.....@@ +@....... +@@...... +@@...... +@@...... +@@...... +@@...... +@@@..... +@@@..... +@@@..... +patch 1839 +height 18 +width 7 +map +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +..@@@.. +patch 1840 +height 8 +width 13 +map +@@@@@@@@@@@@. +@@@@@@@@@@@@@ +@@@@@@@@@@@@@ +.@@@@@@@@@@@@ +.@@@@@@@@@@@@ +.@@@@@@@@@@@@ +..@@@@@@@@@.. +..@@@@@@..... +patch 1841 +height 17 +width 4 +map +@@@@ +@@@@ +@@@@ +.@@@ +.@@@ +.@@@ +.@@@ +.@@@ +.@@@ +..@@ +..@@ +..@@ +..@@ +..@@ +..@@ +...@ +...@ +patch 1842 +height 5 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@. +patch 1843 +height 6 +width 12 +map +.........@@@ +....@@@@@@@@ +.@@@@@@@@@@@ +.@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +patch 1844 +height 5 +width 2 +map +.@ +@@ +@@ +@@ +@@ +patch 1845 +height 4 +width 13 +map +@@@@@@@@@@@@. +.@@@@@@@@@@@@ +.@@@@@@@@@@@@ +.@@@@@@@@@@@@ +patch 1846 +height 7 +width 4 +map +@@@. +@@.. +@... +.... +.... +.... +.... +patch 1847 +height 23 +width 7 +map +@@@.... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +......@ +.....@@ +@@.@@@@ +patch 1848 +height 21 +width 7 +map +@@@@@@. +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +....... +......@ +.....@@ +....@@@ +...@@@@ +..@@@@@ +.@@@@@@ +patch 1849 +height 15 +width 4 +map +@@@. +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +...@ +..@@ +.@@@ +patch 1850 +height 13 +width 4 +map +@... +@... +.... +.... +.... +.... +.... +.... +.... +.... +...@ +..@@ +.@@@ +patch 1851 +height 4 +width 7 +map +@@@@... +@@@@@.. +@@@@@@. +@@@@@@@ +patch 1852 +height 6 +width 6 +map +...@@@ +....@@ +.....@ +...... +...... +...... +patch 1853 +height 8 +width 5 +map +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@@ +@@@@@ +@@@@@ +patch 1854 +height 7 +width 25 +map +..................@@@@@@@ +...................@@@@@@ +....................@@@@@ +.....................@@@@ +.......................@@ +........................@ +......................... +patch 1855 +height 8 +width 16 +map +..............@. +...............@ +................ +................ +................ +...............@ +...............@ +...............@ +patch 1856 +height 8 +width 7 +map +....... +..@@@@. +@@@@@@. +@@@@@@. +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +patch 1857 +height 6 +width 12 +map +............ +............ +............ +............ +............ +...........@ +patch 1858 +height 6 +width 16 +map +................ +...............@ +..............@@ +.............@@@ +............@@@@ +...........@@@@@ +patch 1859 +height 16 +width 3 +map +... +... +... +... +... +... +@.. +@.. +@.. +@.. +@@. +@@@ +@@@ +@@@ +@@. +@@. +patch 1860 +height 23 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +@. +@. +.. +.. +.. +.. +.. +.. +.. +@. +@. +@. +@. +@. +patch 1861 +height 32 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +@. +@. +@. +@. +@. +@. +patch 1862 +height 33 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1863 +height 3 +width 3 +map +@.. +... +... +patch 1864 +height 3 +width 13 +map +...@@@@@@@@@@ +...@@@@@@@@@@ +....@@@@@@@@@ +patch 1865 +height 4 +width 8 +map +@....... +........ +........ +........ +patch 1866 +height 6 +width 6 +map +..@@@@ +..@@@@ +@..@@@ +@..@@@ +@..@@. +@..... +patch 1867 +height 7 +width 13 +map +@@@@@........ +............. +............. +............. +............. +............@ +...........@@ +patch 1868 +height 3 +width 3 +map +.@@ +@@. +@.. +patch 1869 +height 3 +width 8 +map +@@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 1870 +height 3 +width 4 +map +..@@ +...@ +...@ +patch 1871 +height 3 +width 19 +map +.....@@@@@......... +................... +................... +patch 1872 +height 12 +width 4 +map +@... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +patch 1873 +height 8 +width 7 +map +.....@. +....@@. +...@@@. +..@@@@. +.@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@... +patch 1874 +height 4 +width 3 +map +... +@.. +@.. +@.. +patch 1875 +height 7 +width 6 +map +.....@ +.....@ +...... +...... +...... +...... +...... +patch 1876 +height 8 +width 3 +map +..@ +..@ +..@ +..@ +..@ +... +... +... +patch 1877 +height 8 +width 18 +map +................@@ +.................. +.................. +.................. +.................. +.................. +.................. +........@@@...@@@@ +patch 1878 +height 10 +width 8 +map +.@@@@@@@ +.@@@@@@@ +.@@@@@@@ +..@@@@@@ +..@@@@@@ +..@@@@@@ +.@@@@@@@ +.@@@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 1879 +height 11 +width 12 +map +...@@@@@@@@@ +..@@@@@@@@@@ +..@@@@@@@@@@ +.@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +patch 1880 +height 9 +width 6 +map +.@@@@. +.@@... +...... +...... +...... +...... +...... +...... +...... +patch 1881 +height 13 +width 7 +map +@@..... +@...... +@...... +@...... +....... +....... +....... +....... +....... +....... +....... +....... +....... +patch 1882 +height 6 +width 6 +map +...... +...... +...... +...... +...... +...@@@ +patch 1883 +height 2 +width 7 +map +....... +.@@@@@@ +patch 1884 +height 5 +width 3 +map +.@@ +@@@ +@@@ +@@@ +@@@ +patch 1885 +height 5 +width 3 +map +..@ +..@ +@.. +@.. +@.@ +patch 1886 +height 19 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@. +@@@. +@@.. +@@.. +@... +@... +.... +.... +.... +patch 1887 +height 28 +width 5 +map +@@@@@ +@@@@. +@@@@. +@@@.. +@@@.. +@@... +@.... +@.... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +patch 1888 +height 18 +width 10 +map +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +.......... +patch 1889 +height 6 +width 10 +map +...@@@@@@. +...@@@@@@@ +.@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +patch 1890 +height 13 +width 9 +map +......@@@ +.@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1891 +height 11 +width 3 +map +@.. +@.. +@.. +@@. +@@@ +@@@ +@@@ +@@@ +@@@ +@@. +@@. +patch 1892 +height 9 +width 6 +map +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 1893 +height 9 +width 2 +map +.@ +.@ +.@ +.. +@. +@. +@. +@. +@. +patch 1894 +height 7 +width 7 +map +......@ +......@ +......@ +....... +....... +....... +....... +patch 1895 +height 8 +width 11 +map +.......@@@@ +........@@@ +........@@@ +........@@@ +........... +........... +........... +........... +patch 1896 +height 8 +width 20 +map +...............@@@@@ +...............@@@@@ +...............@@@@@ +................@@@@ +................@@@@ +................@@@@ +@...............@@@@ +.@..............@@@@ +patch 1897 +height 4 +width 15 +map +............... +@.............. +@@............. +@@@............ +patch 1898 +height 5 +width 16 +map +................ +@............... +@@.............. +@@@............. +@@@@............ +patch 1899 +height 3 +width 6 +map +@@@@.. +@@@... +...... +patch 1900 +height 3 +width 20 +map +@@@..@@@............ +.................... +.................... +patch 1901 +height 6 +width 12 +map +............ +............ +............ +............ +............ +........@@@@ +patch 1902 +height 3 +width 6 +map +..@@@@ +.@@@@@ +@@@@@@ +patch 1903 +height 10 +width 5 +map +..... +..... +..... +..... +@.... +@.... +@.... +@.... +@.... +@@... +patch 1904 +height 10 +width 4 +map +...@ +@..@ +@..@ +@... +@... +@@.. +@@.. +@@.. +@@.. +@@.. +patch 1905 +height 24 +width 5 +map +@@@.. +@@@.. +@@@.. +@@@.. +@@@.. +@@@.. +@@@.. +@@@.. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@. +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1906 +height 5 +width 6 +map +.....@ +@@@@@@ +.@@@@@ +..@@@@ +...@@@ +patch 1907 +height 16 +width 3 +map +... +... +... +... +... +... +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +... +@.. +@@. +patch 1908 +height 26 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +@... +@... +@@.. +@@.. +@@.. +@@.. +.... +.... +.... +.... +@... +@@.. +@@@. +patch 1909 +height 25 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +patch 1910 +height 4 +width 2 +map +.. +@. +@. +@. +patch 1911 +height 11 +width 3 +map +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +patch 1912 +height 7 +width 7 +map +...@@@@ +...@@@@ +...@@@@ +....@@@ +.....@@ +......@ +....... +patch 1913 +height 8 +width 9 +map +......@@@ +.......@@ +........@ +......... +......... +......... +......... +......... +patch 1914 +height 6 +width 11 +map +@@@@@@@@@.. +@@@@....... +........... +........... +........... +........... +patch 1915 +height 7 +width 8 +map +.......@ +@@@@...@ +@@@....@ +@@.....@ +@......@ +........ +........ +patch 1916 +height 4 +width 4 +map +.... +...@ +..@@ +.@@@ +patch 1917 +height 32 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@.... +@.... +@.... +@.... +@@... +@@... +@@... +@@... +@@... +@@@.. +@@@.. +@@@.. +@@@.. +@@@@. +@@@@. +patch 1918 +height 24 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +@... +patch 1919 +height 21 +width 2 +map +.@ +.@ +.@ +.@ +.@ +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1920 +height 4 +width 3 +map +@@@ +.@@ +.@@ +.@@ +patch 1921 +height 19 +width 2 +map +@. +@. +@. +@. +@. +@@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +@@ +patch 1922 +height 4 +width 13 +map +............. +............. +............. +............. +patch 1923 +height 11 +width 5 +map +...@@ +...@@ +...@@ +...@@ +...@@ +...@@ +...@@ +...@@ +...@@ +....@ +..... +patch 1924 +height 5 +width 9 +map +........@ +........@ +........@ +........@ +......... +patch 1925 +height 6 +width 7 +map +......@ +......@ +......@ +......@ +....... +....... +patch 1926 +height 13 +width 16 +map +@@.............. +................ +................ +................ +...............@ +...............@ +..............@@ +..............@@ +.............@@@ +............@@@@ +............@@@@ +...........@@@@@ +...........@@@@@ +patch 1927 +height 5 +width 16 +map +@@@@@@@@@@@@@@.. +@@@@@@@@@@...... +@@.............. +................ +................ +patch 1928 +height 10 +width 3 +map +@@@ +@@@ +.@@ +.@. +.@. +.@@ +.@@ +.@@ +.@@ +@@. +patch 1929 +height 2 +width 12 +map +@@@@@@@@@@@@ +@@@@@.....@@ +patch 1930 +height 8 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1931 +height 9 +width 5 +map +.@@@@ +@@@@@ +@@@@@ +@@@@@ +.@@@@ +..@@@ +...@@ +....@ +....@ +patch 1932 +height 6 +width 15 +map +@@@@@@@@@@@@@@. +@@@@@@@@....... +@@@............ +@@............. +@.............. +............... +patch 1933 +height 7 +width 19 +map +@.................. +................... +................... +................... +................... +................... +................... +patch 1934 +height 4 +width 5 +map +...@@ +...@@ +....@ +..... +patch 1935 +height 6 +width 5 +map +...@@ +..@@@ +.@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1936 +height 11 +width 9 +map +......... +......... +......... +......... +......... +......... +......... +......... +.....@@@@ +@@@@@@@@@ +@@@@@@@@@ +patch 1937 +height 10 +width 8 +map +@@@@@... +@....... +........ +........ +........ +........ +........ +........ +........ +........ +patch 1938 +height 11 +width 8 +map +........ +........ +.......@ +.......@ +......@@ +......@@ +.....@@@ +.....@@@ +....@@@@ +....@@@@ +...@@@@@ +patch 1939 +height 16 +width 1 +map +. +. +. +. +. +. +. +@ +@ +@ +@ +@ +@ +@ +@ +@ +patch 1940 +height 4 +width 10 +map +@......... +.......... +.......... +.......... +patch 1941 +height 15 +width 19 +map +@@@@@@............. +@@@@@.............. +@@@@............... +@@................. +@.................. +................... +................... +................... +................... +................... +................... +................... +................... +................... +................... +patch 1942 +height 15 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.@@@ +patch 1943 +height 25 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +@.... +@.... +@.... +@.... +@.... +@@... +@@@.. +@@@@. +patch 1944 +height 23 +width 4 +map +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +.... +...@ +@.@@ +patch 1945 +height 17 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..... +..@@@ +patch 1946 +height 2 +width 9 +map +......... +....@@@@@ +patch 1947 +height 7 +width 9 +map +@@@@@@..@ +@.......@ +......... +......... +........@ +....@@@@@ +.@@@@@@@@ +patch 1948 +height 2 +width 19 +map +@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@........ +patch 1949 +height 5 +width 23 +map +.................@@@@@@ +@@@@....@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@. +@@@@@@@@@@@@@@@@@@@@@.. +patch 1950 +height 13 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@. +@@.. +@@.. +@@@. +@@@. +@@@. +@@@. +@@@. +@@@@ +patch 1951 +height 13 +width 3 +map +@@@ +@@@ +@@@ +.@@ +.@@ +.@@ +.@@ +.@@ +..@ +.@@ +@@@ +@@@ +@@@ +patch 1952 +height 17 +width 3 +map +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +patch 1953 +height 5 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@@@@@@ +@@@@@..... +@......... +patch 1954 +height 9 +width 5 +map +..... +..... +..... +..... +@.... +@.... +@.... +..... +..... +patch 1955 +height 8 +width 6 +map +....@@ +...... +...... +...... +...... +...... +...... +...... +patch 1956 +height 9 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1957 +height 9 +width 7 +map +@@@.... +@@@.... +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@@@@ +@@@@... +patch 1958 +height 3 +width 18 +map +@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@ +patch 1959 +height 3 +width 3 +map +@@. +... +... +patch 1960 +height 10 +width 14 +map +.........@@@@@ +.........@@@@@ +..........@@@@ +..........@@@@ +..........@@@@ +..........@@@@ +..........@@@@ +........@@@@@. +...@@@@@@@@@.. +@@@@@@@@@@@... +patch 1961 +height 2 +width 2 +map +.@ +@@ +patch 1962 +height 2 +width 6 +map +@@.... +...... +patch 1963 +height 5 +width 8 +map +.....@@@ +.....@@@ +.....@@@ +.....@@@ +.....@@. +patch 1964 +height 18 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@... +@........ +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +......... +..@@@@@@@ +patch 1965 +height 9 +width 8 +map +........ +@....... +@@...... +@@...... +@@@..... +@@@..... +@@@@.... +@@@@.... +@@@@@... +patch 1966 +height 20 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +... +@.. +@.. +@.. +@.. +patch 1967 +height 12 +width 19 +map +.............@@@... +..............@@@@@ +...............@@@@ +................@@@ +.................@@ +@.................@ +@.................. +@.................. +@.................. +@.................. +@@................. +@@................. +patch 1968 +height 10 +width 2 +map +.. +.. +.. +.. +.. +.. +.. +.. +.. +.. +patch 1969 +height 4 +width 8 +map +........ +........ +@......@ +@..@@@@@ +patch 1970 +height 6 +width 5 +map +@@@@. +@@@@. +@@@@. +@@@@@ +@@@@@ +@@@@@ +patch 1971 +height 8 +width 8 +map +........ +........ +........ +........ +.......@ +......@@ +.....@@@ +.@@@@@@@ +patch 1972 +height 19 +width 5 +map +..@@@ +..@@@ +..@@@ +...@@ +...@@ +...@@ +...@@ +...@@ +....@ +....@ +....@ +...@@ +...@@ +...@@ +....@ +....@ +....@ +....@ +..... +patch 1973 +height 3 +width 7 +map +....... +....... +....... +patch 1974 +height 8 +width 8 +map +.......@ +.......@ +.......@ +........ +........ +........ +........ +........ +patch 1975 +height 2 +width 9 +map +@@@@@@@@@ +@@@@@.... +patch 1976 +height 2 +width 5 +map +@@@.. +..... +patch 1977 +height 6 +width 8 +map +@@@@@@@. +@@@@@@.. +@@@@.... +@@@..... +@@...... +........ +patch 1978 +height 13 +width 6 +map +.@@@@@ +.@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@. +@@@@.. +@@@@.. +@@@... +@@.... +@@.... +@..... +...... +patch 1979 +height 9 +width 14 +map +.............. +.............. +.............. +.............. +.............@ +.............@ +....@@@@@@@@@@ +....@@@@@@@@@@ +....@@@@@@@@@@ +patch 1980 +height 6 +width 14 +map +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@... +patch 1981 +height 6 +width 11 +map +@@@@@@@@@@@ +@@@@@@@@@.. +@@@@....... +........... +........... +........... +patch 1982 +height 10 +width 6 +map +@@.@@@ +....@@ +.....@ +...... +...... +...... +...... +...... +...... +...... +patch 1983 +height 12 +width 6 +map +.@@@@@ +..@@@@ +...@@@ +....@@ +....@@ +....@@ +.....@ +.....@ +.....@ +.....@ +.....@ +...... +patch 1984 +height 9 +width 5 +map +..... +..... +@.... +@.... +@.... +@.... +@.... +@@... +@@... +patch 1985 +height 9 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 1986 +height 6 +width 5 +map +@.... +@.... +@.... +@.... +@@... +@@... +patch 1987 +height 3 +width 3 +map +@@. +@@@ +@@@ +patch 1988 +height 4 +width 17 +map +................@ +................@ +................@ +................. +patch 1989 +height 5 +width 2 +map +.@ +@@ +@@ +@@ +@. +patch 1990 +height 7 +width 7 +map +....... +....... +......@ +....@@@ +...@@@@ +...@@@@ +..@@@@@ +patch 1991 +height 8 +width 10 +map +.......... +.......... +.........@ +.........@ +........@@ +.......@@@ +.......@@@ +......@@@@ +patch 1992 +height 2 +width 2 +map +@. +@@ +patch 1993 +height 10 +width 5 +map +@@@@@ +@@@@@ +...@@ +...@@ +....@ +....@ +....@ +....@ +..... +..... +patch 1994 +height 12 +width 4 +map +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +patch 1995 +height 3 +width 4 +map +@@@@ +@@@. +@@.. +patch 1996 +height 5 +width 19 +map +................@@@ +.................@@ +.................@@ +.................@@ +.................@@ +patch 1997 +height 8 +width 9 +map +........@ +........@ +........@ +........@ +......... +......... +......... +......... +patch 1998 +height 11 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +....@@@@... +@@@@@@@@... +@@@@@@@@... +@@@@@@@@@.. +patch 1999 +height 8 +width 7 +map +.....@@ +......@ +......@ +......@ +......@ +......@ +....... +....... +patch 2000 +height 7 +width 6 +map +...... +...... +...... +...... +@..... +@..... +@..@@@ +patch 2001 +height 14 +width 10 +map +.......... +.......... +.......... +.......... +.......... +@......... +@......... +@......... +@......... +@......... +@......... +@@........ +@@........ +@@........ +patch 2002 +height 2 +width 7 +map +@@@.... +....... +patch 2003 +height 6 +width 8 +map +@@@@@@.. +@....... +........ +........ +........ +........ +patch 2004 +height 2 +width 14 +map +.........@@@@@ +@@@@@@@@@@@@@@ +patch 2005 +height 8 +width 34 +map +...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@...... +@@@@@@@@@@@@@@@@@@@@.............. +@@@@...@@@@@@@@@@@@@.............. +.......@@@@@@@@@@@@@@.@@@@@@@@@@@@ +patch 2006 +height 2 +width 9 +map +@@@@@@@@@ +@@@@@@@@@ +patch 2007 +height 16 +width 12 +map +.........@@@ +..........@@ +..........@@ +..........@@ +..........@@ +..........@@ +...........@ +...........@ +...........@ +...........@ +...........@ +............ +@........... +@@.........@ +@@@......@@@ +@@@@.....@@@ +patch 2008 +height 5 +width 4 +map +@..@ +@@.@ +@@@@ +@@@@ +@@@@ +patch 2009 +height 2 +width 3 +map +@.. +... +patch 2010 +height 8 +width 4 +map +@... +@... +@... +@... +@@.. +@@.. +@@.. +.... +patch 2011 +height 5 +width 3 +map +..@ +..@ +..@ +..@ +... +patch 2012 +height 15 +width 4 +map +@... +.... +.... +.... +.... +.... +.... +.... +@... +@... +@... +@... +@... +@@.. +@@.. +patch 2013 +height 11 +width 5 +map +..... +..... +..... +..... +..... +..... +..... +..... +..... +....@ +...@@ +patch 2014 +height 5 +width 17 +map +@................ +................. +................. +................. +................. +patch 2015 +height 5 +width 11 +map +........... +..........@ +.........@@ +........... +........... +patch 2016 +height 5 +width 14 +map +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@.@@@@@@@.. +@@...@@@...... +patch 2017 +height 7 +width 12 +map +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@@@@ +@@@@@@@@@... +@@@@@@@..... +@@@@........ +patch 2018 +height 9 +width 5 +map +..... +..... +..... +@.... +@.... +@.... +@.... +@.... +@.... +patch 2019 +height 7 +width 6 +map +@....@ +@@...@ +@@@..@ +@@@@.. +@@@@@. +.@@@@@ +.@@@@@ +patch 2020 +height 12 +width 5 +map +..@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@.. +@@@.. +@@@@. +@@@@. +@@@@@ +@@@@@ +patch 2021 +height 4 +width 4 +map +.@@@ +@@@@ +@@@@ +@@@@ +patch 2022 +height 2 +width 10 +map +@@@@@@@@@@ +@@@@@@@@@. +patch 2023 +height 7 +width 3 +map +... +... +... +... +... +@.. +@@. +patch 2024 +height 7 +width 12 +map +@@@@@@@@@@@@ +@@@@@@@@@@@@ +......@@@@@@ +......@@@@@@ +......@@@@@@ +......@@@@@@ +........@@@@ +patch 2025 +height 10 +width 1 +map +@ +. +. +. +. +. +. +. +@ +@ +patch 2026 +height 9 +width 19 +map +................... +................... +................... +................... +................... +@.................. +@.................. +@.................. +@.................. +patch 2027 +height 9 +width 8 +map +........ +........ +........ +@....... +@....... +@....... +@....... +@@...... +@@.@@@.. +patch 2028 +height 11 +width 3 +map +@.. +... +... +... +... +... +... +... +... +... +... +patch 2029 +height 5 +width 16 +map +................ +................ +.....@@........@ +.@@@@@@.......@@ +.@@@@@@@......@@ +patch 2030 +height 3 +width 19 +map +................... +................... +................... +patch 2031 +height 4 +width 5 +map +@@@@@ +@@.@@ +@@@@@ +@@@@@ +patch 2032 +height 8 +width 3 +map +..@ +..@ +..@ +..@ +... +... +... +... +patch 2033 +height 6 +width 10 +map +.......... +.......... +.........@ +....@@@@@@ +@@@@@@@@@@ +..@@@@@@@@ +patch 2034 +height 31 +width 6 +map +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +@..... +@@.... +@@@... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +...... +patch 2035 +height 16 +width 7 +map +...@@@@ +....@@@ +....@@@ +....@@@ +....@@@ +....@@@ +.....@@ +.....@@ +.....@@ +....... +....... +....... +....... +....... +....... +....... +patch 2036 +height 10 +width 4 +map +@@@. +@@@. +@@@. +@@@@ +@@@@ +@@@@ +@@.. +.... +@... +@... +patch 2037 +height 3 +width 8 +map +...@@@@@ +@@@@@@@@ +@@@@@@@@ +patch 2038 +height 6 +width 6 +map +.....@ +.....@ +.....@ +.....@ +...... +...... +patch 2039 +height 5 +width 2 +map +@. +.. +.. +.. +.@ +patch 2040 +height 1 +width 5 +map +..... +patch 2041 +height 10 +width 14 +map +...........@@@ +......@@@@@@@@ +.@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@ +patch 2042 +height 9 +width 13 +map +..........@@@ +...........@@ +............@ +............. +............. +............. +............. +............. +............@ +patch 2043 +height 6 +width 3 +map +... +... +@@@ +@@@ +@@@ +.@@ +patch 2044 +height 1 +width 9 +map +.@@@@@@@. +patch 2045 +height 8 +width 11 +map +........... +........... +........... +........... +........... +........... +........... +.......@@@@ +patch 2046 +height 9 +width 6 +map +@@.... +...... +...... +...... +...... +...... +...... +...... +...... +patch 2047 +height 4 +width 8 +map +........ +........ +.......@ +..@@@@@@ +patch 2048 +height 7 +width 6 +map +...... +...... +...... +@..... +@..... +@@@... +@@@@.. +patch 2049 +height 9 +width 4 +map +.... +.... +.... +.... +@... +@... +@... +@... +@... +patch 2050 +height 9 +width 4 +map +.... +.... +.... +@... +@... +@... +@@.. +@@.. +@@.. +patch 2051 +height 1 +width 34 +map +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +patch 2052 +height 12 +width 3 +map +@@. +@@. +@@. +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +@@@ +patch 2053 +height 5 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +@@@@@ +@@@@@ +patch 2054 +height 1 +width 8 +map +@@@@@@@@ +patch 2055 +height 3 +width 48 +map +....@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@..@@@@@@@@@@@@@@@@@@@@@@...@@@@@@@@@ +patch 2056 +height 3 +width 21 +map +@@@@@@@@@@@@@@@@...@@ +@@@@@@@@@@@@@@@.....@ +@@@@@@@@@@@@@@@.....@ +patch 2057 +height 5 +width 2 +map +.@ +@@ +@. +@. +@. +patch 2058 +height 12 +width 9 +map +......... +......... +......... +......... +......... +@........ +@........ +@........ +@........ +@........ +@@....... +@@....... +patch 2059 +height 10 +width 9 +map +@........ +......... +....@@@.. +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@@@@ +@@@@@@... +@@....... +patch 2060 +height 8 +width 4 +map +..@@ +...@ +@@@@ +@@@@ +@@@@ +@@@@ +@@@@ +@@.. +patch 2061 +height 3 +width 5 +map +@@@@@ +@@@@@ +@@@@@ +patch 2062 +height 5 +width 19 +map +........@@@...@@@@@ +...@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@. +patch 2063 +height 13 +width 3 +map +... +... +... +... +... +... +... +... +... +... +... +... +... +patch 2064 +height 7 +width 10 +map +.........@ +.........@ +.........@ +.......... +.......... +.....@@@@@ +.@@@@@@@@@ +patch 2065 +height 10 +width 6 +map +@@.... +@@.... +@@.... +@@@... +@@@... +@@@... +@@@@@@ +@@@@@@ +@@@@@@ +@@@@@@ +patch 2066 +height 6 +width 15 +map +@.......@@@@@@@ +@.......@@@@@@@ +@.......@@@@@@@ +@.......@@@@@@@ +@........@@@@@@ +@........@@@@@@ +patch 2067 +height 2 +width 8 +map +@@@@@@@@ +@@@..... diff --git a/examples/NovaStation_Berlin.scen b/examples/NovaStation_Berlin.scen new file mode 100644 index 0000000..3f2b6ff --- /dev/null +++ b/examples/NovaStation_Berlin.scen @@ -0,0 +1,3840 @@ +version 2 +height 512 +width 512 +cost 3 8c-ncc 4c aa-ncc-tl +patch NovaStation_Berlin.patch +commands +P 0 0 0 0 +Q 0 473 219 81 93 669.979797472 834 625.1934830991013996 +Q 0 281 109 236 393 975.05295732959999999 1241 923.3765579311905185 +Q 0 339 435 26 167 820.57777721920000003 1001 771.67901715930906903 +Q 0 349 379 91 7 879.76154340399999998 1076 824.20839471387364483 +Q 0 333 45 344 422 754.73210615280000002 958 716.4110211560720245 +P 1 1 1 372 +P 1 2 80 482 +P 1 3 89 470 +P 1 4 251 323 +P 1 5 416 194 +Q 1 47 321 447 169 903.88643508640000002 1130 846.79163271863319551 +Q 1 123 49 398 368 855.17575696639999999 1052 802.21221702536934117 +Q 1 153 440 7 34 702.2468247784 902 665.58420224866563331 +Q 1 10 253 429 95 704.87929240879999998 873 657.816814796289691 +Q 1 91 136 399 131 592.89653635040000001 737 553.24119793402587675 +P 2 6 244 324 +P 2 7 409 189 +P 2 8 409 197 +P 2 9 409 199 +P 2 10 1 364 +P 2 11 10 364 +P 2 12 86 463 +P 2 13 79 483 +P 2 14 244 338 +P 2 15 255 340 +Q 2 264 326 400 77 -1 -1 -1 +Q 2 11 224 506 306 957.95750289840000002 1187 898.87860884453209565 +Q 2 75 59 420 415 909.91587233759999997 1129 854.19360025718037832 +Q 2 115 438 498 38 982.38390977040000002 1229 932.44532563498182753 +Q 2 468 215 33 318 947.14126908319999998 1192 897.43863693454113672 +P 3 16 9 356 +P 3 17 19 365 +P 3 18 85 452 +P 3 4 221 232 +P 3 19 236 331 +P 3 20 238 346 +P 3 21 239 353 +P 3 22 399 189 +P 3 23 399 198 +Q 3 44 80 447 506 986.2417741464 1227 923.69504080793342382 +Q 3 243 400 442 95 737.07525190320000003 938 701.17163022335148526 +Q 3 126 42 404 357 852.8620484672 1045 798.49561467197781894 +Q 3 356 58 294 413 795.69047559200000003 989 754.86494072308653358 +Q 3 476 285 132 113 794.69047559200000003 988 741.53860642116978852 +P 4 24 246 479 +P 4 25 278 103 +P 4 26 284 111 +P 4 27 336 141 +Q 4 154 43 328 423 1079.0823945808 1338 1010.3586531356990008 +Q 4 478 440 449 12 614.10973978639999998 767 581.21646307213973159 +Q 4 243 358 64 403 -1 -1 -1 +Q 4 175 422 337 59 1078.969696208 1325 1017.7973584983024011 +Q 4 120 434 393 36 966.82756058399999999 1207 906.47085568824411439 +P 5 28 274 104 +P 5 29 278 116 +P 5 30 282 116 +P 5 31 330 142 +P 5 26 330 152 +P 5 32 330 157 +P 5 33 222 249 +P 5 34 238 233 +P 5 35 233 244 +P 5 36 247 473 +P 5 37 257 473 +P 5 38 261 483 +Q 5 489 311 198 52 589.47012947840000002 716 555.02565064754151081 +Q 5 229 92 303 400 965.92806564720000001 1202 914.41239033200429276 +Q 5 69 321 476 180 943.92806564720000001 1180 895.07908576521629129 +Q 5 133 357 405 139 950.37171646079999998 1180 886.79926269223449253 +Q 5 204 89 267 434 959.969696208 1206 900.40265151067819716 +P 6 39 229 256 +P 6 40 240 256 +P 6 41 245 240 +P 6 42 253 468 +P 6 43 262 468 +P 6 44 267 468 +P 6 45 325 148 +P 6 46 360 191 +Q 6 4 52 290 451 858.05800796159999999 1083 806.57290202870058238 +Q 6 496 311 72 479 640.8670990992 792 601.06025732058583344 +Q 6 410 66 43 433 954.61435714800000002 1186 892.71926321392436421 +Q 6 16 179 392 11 560.68333291439999999 696 520.89626685466498657 +Q 6 347 54 436 401 587.51176003920000002 724 553.95057037884237161 +P 7 47 318 152 +P 7 48 353 198 +P 7 33 235 262 +P 7 34 251 246 +P 7 35 246 257 +P 7 49 353 210 +P 7 50 258 461 +P 7 51 268 461 +P 7 52 272 471 +Q 7 506 46 118 499 962.52604539439999998 1215 909.56482060392033873 +Q 7 379 436 179 46 889.05800796159999999 1114 841.48360435138181401 +Q 7 453 161 9 457 863.82041790640000001 1046 819.72989568901050461 +Q 7 409 58 135 494 909.44278427279999999 1142 857.83172852996654001 +Q 7 375 45 107 472 967.1290757736 1195 917.28667926422849632 +P 8 53 311 155 +P 8 54 311 172 +P 8 55 346 205 +P 8 56 258 253 +P 8 57 258 265 +P 8 58 242 268 +P 8 59 244 271 +P 8 60 346 216 +P 8 50 265 454 +P 8 51 275 454 +P 8 52 279 464 +Q 8 378 122 80 415 919.91587233759999997 1139 866.91877043206409326 +Q 8 250 276 433 337 -1 -1 -1 +Q 8 283 419 395 115 651.29350597119999999 820 620.44537418949801122 +Q 8 392 107 36 459 931.56053327759999999 1136 879.02796242904889823 +Q 8 268 96 38 485 826.78593002319999999 1057 777.66408924452434803 +P 9 61 306 162 +P 9 62 299 179 +P 9 63 343 212 +P 9 64 250 277 +P 9 65 255 282 +P 9 66 345 224 +P 9 67 272 446 +P 9 68 285 449 +P 9 69 291 451 +Q 9 368 436 119 65 989.58491989680000001 1228 929.2949774560587457 +Q 9 446 15 56 475 1000.1707063344 1238 938.020098702113728 +Q 9 28 29 453 465 1008.1585130248 1229 955.40310280032394985 +Q 9 259 282 18 434 -1 -1 -1 +Q 9 37 39 500 492 1049.7686860816 1304 995.61168791228124064 +P 10 70 69 317 +P 10 71 77 317 +P 10 72 77 329 +P 10 73 86 319 +P 10 74 95 325 +P 10 75 99 329 +P 10 76 296 181 +P 10 77 297 192 +P 10 78 299 198 +P 10 79 305 440 +P 10 80 311 424 +P 10 81 420 71 +P 10 82 441 43 +P 10 83 453 43 +Q 10 171 417 486 33 1031.8813844544 1299 977.00534158639811722 +Q 10 173 371 410 144 987.68542496000000003 1222 928.47605221576145595 +Q 10 336 426 57 14 1051.6976182696 1303 987.04167428867845047 +Q 10 417 464 130 9 908.37171646079999998 1138 856.37245368871549545 +Q 10 318 181 452 52 -1 -1 -1 +P 11 84 188 176 +P 11 85 194 170 +P 11 86 357 26 +P 11 87 370 29 +P 11 88 360 38 +P 11 89 373 35 +P 11 90 380 38 +P 11 91 403 75 +P 11 92 417 72 +P 11 93 420 83 +P 11 94 420 96 +P 11 95 424 83 +P 11 96 424 96 +P 11 97 309 442 +P 11 98 313 437 +Q 11 56 488 454 27 1005.3717164608 1235 948.44218132078958661 +Q 11 335 145 325 75 -1 -1 -1 +Q 11 330 75 113 445 967.45497758240000002 1189 908.74681483688732442 +Q 11 153 442 224 103 838.67323165039999999 1056 787.22483099492455949 +Q 11 449 334 52 71 755.2518754104 914 711.0763497908512818 +P 12 99 230 366 +P 12 100 235 370 +P 12 101 241 363 +P 12 102 317 439 +P 12 103 351 20 +P 12 104 397 82 +P 12 105 403 100 +P 12 106 409 100 +Q 12 84 323 464 177 939.58491989680000001 1178 883.54226428151991968 +Q 12 42 498 466 82 983.20014358560000001 1214 927.13375152657897615 +Q 12 434 404 26 40 920.48946546559999998 1122 867.03923039369340131 +Q 12 249 379 319 106 952.22453020480000002 1217 900.40693371454460703 +Q 12 73 66 383 487 901.1290757736 1129 846.00969565341165435 +P 13 107 221 361 +P 13 108 341 11 +P 13 109 341 20 +P 13 110 321 442 +P 13 111 325 446 +P 13 112 388 90 +P 13 113 394 88 +P 13 114 397 106 +P 13 115 401 106 +Q 13 370 396 210 52 693.43564159520000001 868 656.61882359119010744 +Q 13 297 183 437 463 -1 -1 -1 +Q 13 95 326 431 55 808.82041790640000001 991 754.72059772940178846 +Q 13 375 50 113 480 932.8569978352 1166 882.79961463882511907 +Q 13 295 457 424 44 703.39401103440000002 868 670.23492155112910496 +P 14 116 211 351 +P 14 117 211 364 +P 14 118 216 364 +P 14 119 330 11 +P 14 120 330 448 +P 14 121 335 451 +P 14 122 377 91 +P 14 123 377 102 +P 14 124 382 107 +P 14 125 377 110 +Q 14 56 50 476 492 990.07020127120000003 1232 932.79096666466080023 +Q 14 347 141 161 466 -1 -1 -1 +Q 14 8 56 463 456 999.17070633439999999 1237 943.61126956293048806 +Q 14 114 475 395 21 947.57272658720000003 1169 893.97002858448536244 +Q 14 373 434 124 60 990.14126908319999998 1235 932.92410759452286584 +P 15 126 201 341 +P 15 117 201 354 +P 15 118 206 354 +P 15 127 213 341 +P 15 128 320 11 +P 15 129 340 453 +P 15 130 367 94 +P 15 131 367 104 +P 15 132 374 110 +P 15 133 378 113 +Q 15 118 45 278 411 829.25901808799999998 1046 778.98125008891906873 +Q 15 45 454 437 78 962.33008589999999999 1182 908.7223279062804977 +Q 15 259 83 49 487 809.84480452560000002 1026 760.79439256943419423 +Q 15 265 466 208 51 945.78593002319999999 1176 894.53049302994793379 +Q 15 215 359 443 26 852.88643508640000002 1079 809.52853743054367897 +P 16 134 192 332 +P 16 135 198 332 +P 16 136 201 332 +P 16 137 204 332 +P 16 128 310 11 +P 16 138 358 96 +P 16 139 369 115 +P 16 140 349 457 +Q 16 21 237 427 398 774.477272156 959 725.91659767329247188 +Q 16 348 153 368 381 -1 -1 -1 +Q 16 121 72 466 433 928.95750289840000002 1158 871.90692803484409978 +Q 16 179 421 348 23 989.94025895679999999 1243 927.77551915271817506 +Q 16 15 266 497 286 922.07020127120000003 1164 870.77745171431001836 +P 17 134 183 323 +P 17 135 189 323 +P 17 136 192 323 +P 17 137 195 323 +P 17 128 300 11 +P 17 141 349 101 +P 17 142 354 98 +P 17 143 354 110 +P 17 144 360 117 +P 17 145 358 462 +Q 17 435 2 65 421 943.8569978352 1177 883.13846647004072565 +Q 17 61 65 408 498 936.65598770880000001 1178 881.3973157282127886 +Q 17 313 159 251 474 -1 -1 -1 +Q 17 379 62 441 448 558.8670990992 710 532.45031880016563264 +Q 17 322 104 100 462 864.95750289840000002 1094 810.77554014054021536 +P 18 146 170 310 +P 18 147 177 310 +P 18 148 184 310 +P 18 149 184 316 +P 18 150 287 11 +P 18 151 346 106 +P 18 152 344 124 +P 18 153 339 129 +P 18 89 351 129 +P 18 154 362 459 +P 18 26 367 464 +Q 18 331 428 109 69 1014.9280656472 1251 952.64845637485348107 +Q 18 142 125 452 412 945.67323165039999999 1163 887.7875104179202026 +Q 18 497 53 127 483 929.20014358560000001 1160 879.84284287024149762 +Q 18 160 60 375 448 1019.8569978352 1253 957.79321131566530312 +Q 18 301 70 216 410 901.37171646079999998 1131 853.83704840632583455 +P 19 155 0 91 +P 19 146 157 297 +P 19 147 164 297 +P 19 148 171 297 +P 19 149 171 303 +P 19 156 282 11 +P 19 157 365 457 +P 19 158 378 457 +Q 19 81 341 504 38 857.87929240879999998 1026 808.91381509727705179 +Q 19 207 331 162 47 918.34227920960000002 1155 862.30497556083901145 +Q 19 289 400 472 18 777.04581465200000001 985 739.16613916424159925 +Q 19 494 298 43 421 678.32294322240000001 840 639.28263034545352639 +Q 19 180 405 205 77 932.38390977040000002 1179 877.97556328305779516 +P 20 159 152 292 +P 20 43 157 292 +P 20 160 162 292 +P 20 161 249 431 +P 20 162 321 267 +P 20 163 324 273 +P 20 164 327 271 +P 20 165 334 269 +P 20 93 391 457 +Q 20 173 56 442 499 1023.6437943992 1248 968.31244241284184682 +Q 20 168 61 368 381 901.07525190320000003 1102 844.42661560298972745 +Q 20 345 68 207 453 846.07525190320000003 1047 801.62843734945579399 +Q 20 157 378 422 161 940.6316010896 1148 885.58095386063939713 +Q 20 346 423 55 44 992.898628396 1236 935.36585585228772288 +P 21 134 141 281 +P 21 166 147 281 +P 21 167 147 294 +P 21 168 154 281 +P 21 169 154 286 +P 21 170 309 259 +P 21 171 311 272 +P 21 172 319 259 +P 21 173 321 259 +P 21 174 324 259 +P 21 175 381 451 +P 21 176 395 459 +P 21 177 401 449 +Q 21 427 413 0 470 521.30360723519999999 608 490.06721821056589761 +Q 21 325 156 11 263 -1 -1 -1 +Q 21 122 57 364 423 972.5138520848 1208 913.20588265126411898 +Q 21 244 65 124 476 798.84480452560000002 1015 750.51945661997331172 +Q 21 498 277 20 492 706.31074991280000003 851 669.72938490663739231 +P 22 178 297 247 +P 22 179 297 253 +P 22 180 297 259 +P 22 181 130 270 +P 22 182 297 265 +P 22 183 130 272 +P 22 184 136 272 +P 22 185 139 272 +P 22 186 141 278 +P 22 187 143 276 +P 22 188 271 385 +P 22 189 406 449 +Q 22 300 190 444 50 -1 -1 -1 +Q 22 103 6 409 459 909.27121139760000001 1143 859.69536236926523998 +Q 22 47 79 289 446 799.14631971519999998 1003 751.54832189127785114 +Q 22 174 429 348 21 983.6265504576 1232 922.07454837168586437 +Q 22 238 86 396 500 797.0163774008 1012 754.58246162949933478 +P 23 190 288 238 +P 23 191 288 250 +P 23 192 302 243 +P 23 193 122 262 +P 23 194 126 262 +P 23 195 130 262 +P 23 196 292 262 +P 23 197 279 376 +P 23 198 275 381 +P 23 199 292 381 +P 23 200 403 444 +Q 23 141 355 300 91 712.87929240879999998 881 665.64629618603544259 +Q 23 28 195 498 213 793.84480452560000002 1010 742.42848237611929108 +Q 23 130 271 304 56 1041.7636354496 1337 991.51350942805379418 +Q 23 363 98 181 417 783.95036022079999999 955 740.52388557738549935 +Q 23 150 300 494 33 947.82250995199999999 1229 906.8310523110098984 +P 24 201 280 230 +P 24 202 280 238 +P 24 203 120 254 +P 24 204 280 246 +P 24 197 287 368 +P 24 205 284 373 +P 24 206 302 376 +P 24 207 302 379 +P 24 208 415 433 +P 24 209 424 433 +Q 24 99 399 446 78 910.91587233759999997 1130 853.61553402452966566 +Q 24 385 392 42 176 870.76154340399999998 1067 815.98718768746994101 +Q 24 428 112 235 432 703.32294322240000001 865 665.01085715856265779 +Q 24 108 35 117 434 643.23463146880000002 826 607.71012784338438451 +Q 24 369 118 37 425 935.6316010896 1143 880.14156107409712604 +P 25 210 273 223 +P 25 211 273 230 +P 25 212 119 247 +P 25 213 273 238 +P 25 67 292 360 +P 25 150 305 360 +P 25 214 310 373 +P 25 215 419 428 +Q 25 273 73 284 415 844.64379439919999998 1069 799.40682106280689823 +Q 25 452 7 93 490 964.18795027600000003 1178 906.46286874746760986 +Q 25 331 281 68 13 -1 -1 -1 +Q 25 226 87 209 400 933.34227920960000002 1170 877.85622648586274863 +Q 25 213 91 376 461 800.21738752719999999 1007 756.16917247413221048 +P 26 216 117 239 +P 26 217 265 214 +P 26 218 268 228 +P 26 219 277 214 +P 26 220 303 351 +P 26 221 300 357 +P 26 222 318 360 +P 26 223 318 364 +P 26 224 425 423 +Q 26 160 289 328 54 966.467170892 1233 912.95967189241400774 +Q 26 413 34 81 497 940.07525190320000003 1141 882.04371241966032358 +Q 26 275 214 21 221 -1 -1 -1 +Q 26 36 313 478 184 891.472221524 1117 835.39772783396256273 +Q 26 285 90 200 455 920.95750289840000002 1150 867.5039337727999964 +P 27 225 107 228 +P 27 226 262 201 +P 27 227 263 207 +P 27 228 309 340 +P 27 229 327 351 +P 27 24 301 459 +P 27 230 399 386 +P 27 231 399 398 +P 27 232 403 404 +P 27 233 415 389 +P 27 234 416 419 +Q 27 293 242 455 448 -1 -1 -1 +Q 27 404 80 24 456 958.10468915439999998 1152 900.39871782549573709 +Q 27 140 376 351 132 927.02857071039999998 1159 867.68612525959736104 +Q 27 118 74 302 366 857.58491989680000001 1096 809.85743876994854418 +Q 27 296 62 287 420 804.07525190320000003 1005 757.62617693172796862 +P 28 235 170 394 +P 28 236 170 399 +P 28 237 170 402 +P 28 238 170 405 +P 28 239 171 412 +P 28 240 240 156 +P 28 202 296 456 +P 28 241 296 464 +Q 28 396 12 63 436 909.5138520848 1145 854.90930437013162191 +Q 28 388 134 365 462 509.84271248000000001 627 480.13361913549044857 +Q 28 133 282 111 2 991.40829638959999998 1272 940.10294394100219506 +Q 28 67 158 267 417 636.49451609759999998 797 598.6198366178574588 +Q 28 53 171 412 505 786.1341264056 973 735.69547611232292184 +P 29 242 221 160 +P 29 243 168 380 +P 29 244 160 384 +P 29 245 152 388 +P 29 246 170 388 +P 29 247 154 396 +P 29 248 162 404 +P 29 249 169 411 +P 29 186 277 445 +P 29 241 291 459 +Q 29 368 100 90 155 544.3696244152 675 507.96447163178544315 +Q 29 180 305 21 40 729.66103834080000001 930 691.329536073918689 +Q 29 222 94 129 276 926.28340470719999999 1177 875.317164780563985 +Q 29 489 269 318 415 392.203102172 483 368.29688809470525257 +Q 29 431 73 380 464 558.92597360159999997 696 526.84064315014745716 +P 30 250 47 82 +P 30 251 50 92 +P 30 252 52 91 +P 30 253 110 361 +P 30 254 110 368 +P 30 255 145 356 +P 30 256 151 359 +P 30 257 135 373 +P 30 249 159 365 +P 30 258 133 375 +P 30 259 137 379 +P 30 260 150 392 +P 30 261 186 159 +P 30 262 204 163 +P 30 263 193 166 +P 30 264 199 170 +P 30 265 247 393 +P 30 266 261 433 +P 30 267 268 439 +P 30 268 270 441 +Q 30 471 13 112 471 931.2468247784 1131 875.44742401795315345 +Q 30 354 423 16 21 856.1290757736 1084 809.99679826756062084 +Q 30 29 467 431 83 944.2468247784 1140 885.07263177256663766 +Q 30 414 45 74 496 933.10468915439999998 1127 874.45306921354028873 +Q 30 264 281 414 70 -1 -1 -1 +P 31 269 38 487 +P 31 270 101 356 +P 31 271 231 384 +P 31 272 239 388 +P 31 249 248 392 +P 31 273 354 391 +P 31 274 368 395 +P 31 275 375 398 +Q 31 393 92 205 332 679.5950211608 836 645.05284874862093147 +Q 31 89 504 403 494 369.50461736160000001 448 341.23461130035127553 +Q 31 489 200 13 458 664.2569260424 782 633.07892414302671114 +Q 31 469 276 346 25 367.5290039808 480 350.85779537684163643 +Q 31 462 33 433 450 576.38181772479999998 724 543.50769176935216365 +P 32 276 98 356 +P 32 277 190 348 +P 32 278 195 352 +P 32 279 201 358 +P 32 278 206 363 +P 32 280 212 369 +P 32 281 217 374 +P 32 282 223 380 +P 32 283 371 373 +P 32 284 367 381 +P 32 82 366 385 +P 32 285 389 385 +P 32 286 382 401 +P 32 287 390 389 +Q 32 321 87 192 317 861.87424177679999998 1071 811.54613226025912809 +Q 32 406 70 59 318 737.70771953360000001 907 687.60213525389178812 +Q 32 488 282 41 86 718.19300090800000003 891 672.94320674182154107 +Q 32 238 235 490 292 -1 -1 -1 +Q 32 185 44 371 392 734.60721447039999998 908 689.94130502397024429 +P 33 288 189 347 +P 33 289 256 134 +P 33 290 256 144 +P 33 291 255 393 +P 33 292 354 487 +Q 33 357 388 496 65 523.0264786648 656 493.27092444933254001 +Q 33 128 137 31 438 495.47012947839999999 622 464.88469475944498299 +Q 33 119 78 443 334 762.0214280328 936 714.9719194772942501 +Q 33 303 256 463 83 -1 -1 -1 +Q 33 474 173 143 393 547.67619023680000001 625 521.57814584708057737 +P 34 183 177 335 +P 34 293 183 340 +P 34 294 244 122 +P 34 295 248 130 +P 34 296 249 134 +P 34 297 250 138 +P 34 298 246 389 +P 34 299 355 484 +P 34 211 361 479 +P 34 300 373 492 +P 34 301 376 495 +Q 34 428 112 60 418 765.61226510239999998 898 724.09699096948634178 +Q 34 274 208 149 42 -1 -1 -1 +Q 34 164 56 389 462 826.23463146880000002 1009 773.47721597468864729 +Q 34 168 43 64 454 652.82041790640000001 835 616.22451837264418373 +Q 34 44 315 428 28 736.83766184799999999 895 688.82408298424331861 +P 35 302 162 320 +P 35 303 166 323 +P 35 303 170 327 +P 35 304 174 331 +P 35 305 230 108 +P 35 306 238 107 +P 35 307 247 107 +P 35 308 247 114 +Q 35 53 92 415 485 777.99199078159999998 959 725.49725204493847741 +Q 35 215 90 409 445 786.96255353040000002 975 740.50938590628391012 +Q 35 412 116 447 492 562.06810922559999999 699 528.7457796875294207 +Q 35 295 73 57 476 815.97474684 1021 769.67004857864458245 +Q 35 503 41 295 450 642.29350597119999999 811 606.44567066550655454 +P 36 277 140 298 +P 36 278 145 302 +P 36 278 151 308 +P 36 309 157 314 +P 36 310 221 92 +P 36 311 223 100 +P 36 249 215 108 +P 36 255 242 104 +P 36 312 215 109 +P 36 313 222 113 +P 36 314 226 112 +P 36 315 389 440 +Q 36 362 22 302 434 626.80822459679999997 792 592.38486024134897434 +Q 36 228 56 104 412 658.46507884640000002 826 617.34440602397410203 +Q 36 436 5 55 442 885.00923472320000002 1042 839.50310578134917705 +Q 36 153 426 392 22 881.10468915439999998 1075 825.40817886609374909 +Q 36 393 7 108 405 823.38181772479999998 971 778.55558254157199372 +P 37 302 133 291 +P 37 304 137 294 +P 37 316 200 389 +P 37 317 255 172 +P 37 318 258 155 +P 37 319 261 155 +P 37 320 271 152 +P 37 96 385 440 +P 37 321 383 452 +P 37 322 386 440 +Q 37 59 13 470 52 455.90663761440000001 518 425.90822979026518169 +Q 37 484 183 108 395 569.36248173760000002 642 543.93743452981561859 +Q 37 466 230 173 379 477.1614716112 558 454.61518910167825425 +Q 37 125 109 427 357 735.79603128719999999 884 695.99822721464090591 +Q 37 178 335 428 9 757.5950211608 914 719.52254320227496009 +P 38 323 131 253 +P 38 304 130 287 +P 38 324 241 174 +P 38 325 258 179 +P 38 326 252 183 +P 38 327 241 191 +P 38 265 253 188 +P 38 328 260 188 +P 38 329 167 369 +P 38 330 175 369 +P 38 331 183 375 +P 38 332 187 378 +P 38 333 191 382 +P 38 334 195 386 +P 38 335 383 429 +P 38 296 376 453 +Q 38 432 97 67 324 785.37676709279999998 952 734.24915460762065322 +Q 38 223 164 336 469 884.53109602639999998 1088 828.63622752315393427 +Q 38 108 94 454 325 785.40620434399999999 945 735.9019452972676163 +Q 38 128 447 320 19 897.21738752719999999 1104 844.17601768730094136 +Q 38 121 33 112 454 625.92092296959999997 804 591.52220609068410795 +P 39 336 118 34 +P 39 337 109 37 +P 39 338 103 41 +P 39 339 129 244 +P 39 340 148 355 +P 39 341 153 358 +P 39 342 160 362 +P 39 343 285 117 +P 39 344 298 115 +P 39 345 305 111 +P 39 346 308 111 +P 39 347 308 120 +Q 39 370 97 124 382 717.6417023536 843 678.70480757917493975 +Q 39 297 255 333 55 -1 -1 -1 +Q 39 199 55 356 408 733.29350597119999999 902 689.48132987413998762 +Q 39 351 19 215 446 726.33513653199999999 905 687.39268985536114087 +Q 39 318 104 501 446 797.83261121599999999 997 745.95562546227745315 +P 40 348 78 56 +P 40 349 100 48 +P 40 350 127 346 +P 40 351 129 348 +P 40 352 135 351 +P 40 353 281 126 +P 40 354 282 136 +P 40 355 283 138 +P 40 356 283 141 +P 40 357 400 346 +P 40 117 412 363 +P 40 358 417 359 +P 40 359 426 356 +Q 40 273 226 309 67 -1 -1 -1 +Q 40 474 170 359 65 220.5929291152 278 205.41790591940269906 +Q 40 511 446 47 72 876.26406871999999998 1052 825.1282211048684303 +Q 40 370 426 460 65 529.19805154000000003 661 501.60836805555902629 +Q 40 265 202 222 403 -1 -1 -1 +P 41 360 77 58 +P 41 361 77 66 +P 41 246 210 199 +P 41 362 116 338 +P 41 363 210 205 +P 41 364 213 214 +P 41 253 388 346 +Q 41 307 114 114 485 880.99913345920000002 1120 827.85347663943866792 +Q 41 181 432 310 110 943.07020127120000003 1185 883.55451347932944373 +Q 41 363 130 94 443 756.38181772479999998 904 707.01497125878404404 +Q 41 221 114 391 495 819.00418409120000002 1017 768.50689586027124278 +Q 41 187 50 260 472 797.14631971519999998 1001 745.76613954664367157 +P 42 365 222 223 +P 42 366 234 211 +P 42 367 240 217 +P 42 368 104 334 +P 42 369 105 338 +P 42 202 161 351 +P 42 370 169 351 +P 42 371 173 355 +P 42 372 246 223 +P 42 373 373 346 +P 42 374 380 346 +Q 42 128 74 445 443 863.92092296959999997 1042 813.6872568875445495 +Q 42 509 47 24 487 928.17575696639999999 1125 873.7706643171467249 +Q 42 73 13 448 483 863.89148571840000002 1049 810.48198616724107524 +Q 42 298 85 119 360 697.979797472 862 652.18954797085723385 +Q 42 478 62 97 338 810.92092296959999997 989 766.73734402655600206 +P 43 375 100 329 +P 43 370 178 360 +P 43 371 182 364 +P 43 371 187 369 +P 43 371 192 374 +P 43 376 243 237 +P 43 377 247 225 +P 43 378 251 228 +P 43 379 255 234 +P 43 380 257 244 +P 43 381 353 346 +Q 43 270 208 63 484 -1 -1 -1 +Q 43 256 75 125 495 828.401153712 1051 779.45502322010406715 +Q 43 289 84 82 499 846.6316010896 1054 797.26061337466876466 +Q 43 270 236 487 234 -1 -1 -1 +Q 43 242 175 471 484 903.58491989680000001 1142 849.81107317690100444 +P 44 382 70 333 +P 44 383 234 327 +P 44 222 303 338 +P 44 384 250 352 +P 44 385 256 347 +P 44 386 303 342 +P 44 387 329 349 +P 44 388 341 346 +P 44 389 197 379 +P 44 390 197 384 +P 44 391 248 358 +P 44 392 243 386 +P 44 393 328 358 +Q 44 105 101 307 462 1024.3422792096 1261 958.47043731557209867 +Q 44 67 88 80 447 1218.538238704 1460 1142.1731905277097212 +Q 44 505 195 149 276 556.47012947840000002 683 528.00533704922474953 +Q 44 81 143 448 338 866.38896040240000002 1072 815.40242246216394051 +Q 44 266 202 95 133 -1 -1 -1 +P 45 394 90 161 +P 45 395 182 198 +P 45 396 195 198 +P 45 397 198 198 +P 45 398 198 218 +P 45 399 207 200 +P 45 400 246 384 +P 45 401 292 337 +P 45 282 292 340 +P 45 402 292 344 +Q 45 41 307 40 474 1560.3027406944 1886 1468.6690093718907519 +Q 45 164 57 71 442 1184.7148622112 1412 1113.4149680865111804 +Q 45 18 193 172 432 1419.101730568 1753 1332.3431657938374428 +Q 45 241 161 97 348 1026.3595231512 1239 964.36501908542834371 +Q 45 291 223 435 58 -1 -1 -1 +P 46 403 134 134 +P 46 404 128 137 +P 46 405 120 140 +P 46 406 120 147 +P 46 407 126 154 +P 46 408 131 157 +P 46 409 265 74 +P 46 410 265 93 +P 46 411 272 89 +P 46 412 290 337 +P 46 267 291 344 +P 46 413 285 349 +P 46 414 276 371 +P 46 415 271 375 +P 46 369 256 384 +P 46 416 267 380 +P 46 89 267 385 +Q 46 128 436 88 63 1168.7098115792 1437 1097.7126187014014249 +Q 46 30 424 352 21 891.0214280328 1065 847.19949352353535232 +Q 46 17 193 149 447 1390.888527132 1716 1306.6464508582860162 +Q 46 71 463 40 39 1224.6681810184 1445 1152.5518936560333714 +Q 46 258 173 34 446 1093.0874452127999999 1311 1029.8935758618263208 +P 47 417 40 230 +P 47 418 40 247 +P 47 419 43 237 +P 47 420 46 230 +P 47 421 53 230 +P 47 422 53 240 +P 47 423 59 230 +P 47 424 62 232 +P 47 425 62 251 +P 47 426 120 96 +P 47 427 130 97 +P 47 428 187 0 +P 47 429 187 4 +P 47 430 187 9 +P 47 431 188 13 +P 47 414 280 367 +Q 47 111 146 82 452 1284.0651506392 1551 1206.2355673796241717 +Q 47 237 77 358 477 771.7493500944 951 727.06595957846991496 +Q 47 122 142 97 339 1241.182899644 1496 1165.7628606472999309 +Q 47 298 62 507 443 763.82041790640000001 946 715.88648259702677024 +Q 47 183 426 153 42 1220.8813844544 1488 1144.5597613756233386 +P 48 432 41 221 +P 48 433 48 224 +P 48 434 56 221 +P 48 435 64 221 +P 48 436 110 95 +P 48 267 218 8 +P 48 437 193 18 +P 48 438 193 19 +P 48 439 292 352 +P 48 414 288 359 +P 48 414 284 363 +Q 48 96 38 65 416 1135.8742417768 1345 1069.0501699898334209 +Q 48 255 74 398 380 697.22243815919999999 863 654.02888546941562709 +Q 48 141 311 309 52 832.37676709279999998 1021 785.60119528207519579 +Q 48 143 291 429 20 772.39401103440000002 937 735.66657051376239451 +Q 48 322 277 70 431 -1 -1 -1 +P 49 440 72 222 +P 49 441 66 240 +P 49 442 77 227 +P 49 443 83 233 +P 49 444 233 320 +P 49 445 480 184 +Q 49 138 114 187 429 1337.4499269504 1628 1252.7853336439336545 +Q 49 137 104 142 431 1288.1362184512 1574 1211.206679628296115 +Q 49 149 116 179 308 1190.0113267688000001 1446 1117.8682098262008822 +Q 49 160 44 431 472 985.87424177679999998 1195 920.6043844308004509 +Q 49 22 256 82 443 1468.6164491935999999 1767 1377.4822438561825493 +P 50 446 69 259 +P 50 447 77 259 +P 50 448 89 239 +P 50 449 86 256 +P 50 450 95 245 +P 50 451 405 430 +P 50 267 412 422 +P 50 114 409 433 +P 50 452 413 422 +P 50 93 417 427 +P 50 453 488 220 +Q 50 64 474 29 22 1244.6265504576000001 1463 1175.1214899251147017 +Q 50 117 138 439 420 1049.0996385224 1284 979.37700903418260623 +Q 50 61 155 117 436 1323.035713388 1613 1240.5672654398040322 +Q 50 14 204 172 420 1443.17279838 1780 1354.0862002710334764 +Q 50 16 273 134 429 1482.101730568 1816 1389.8981653642156289 +P 51 454 82 273 +P 51 455 106 479 +P 51 456 253 369 +P 51 457 407 334 +P 51 458 415 330 +P 51 459 370 341 +P 51 460 393 341 +P 51 461 404 338 +P 51 462 353 342 +P 51 463 424 325 +P 51 464 432 320 +P 51 465 440 318 +P 51 466 487 229 +Q 51 25 297 171 422 1546.8002153784 1893 1452.3834677466043104 +Q 51 31 263 186 425 1531.3860018160000001 1877 1436.4843678852571429 +Q 51 92 252 184 427 1530.3981951256 1893 1438.7591661116050545 +Q 51 47 241 104 438 1441.1311678192 1768 1354.9118042222826261 +Q 51 62 213 184 429 1483.4154390672 1822 1390.9499238153607621 +P 52 467 63 256 +P 52 468 63 263 +P 52 292 157 263 +Q 52 323 254 35 215 -1 -1 -1 +Q 52 290 240 278 372 -1 -1 -1 +Q 52 24 189 182 427 1431.1311678192 1758 1343.9938345372518143 +Q 52 16 225 175 426 1463.8590898808 1796 1375.2145070813755865 +Q 52 23 315 182 427 1569.9717882536 1915 1473.3759969584089049 +P 53 469 64 269 +P 53 95 159 282 +P 53 470 167 282 +P 53 471 173 282 +P 53 472 176 264 +P 53 473 248 364 +P 53 474 489 412 +Q 53 133 111 182 432 1327.2072862632 1616 1244.1510400736694919 +Q 53 18 262 136 452 1460.2022356312 1790 1370.7893697945057738 +Q 53 52 245 142 443 1452.9301576928 1788 1364.3476874478276386 +Q 53 63 157 97 434 1335.177849012 1615 1253.5914183655988836 +Q 53 167 419 179 75 1255.0651506392 1538 1177.259664631498481 +P 54 475 68 275 +P 54 476 104 264 +P 54 477 163 286 +P 54 478 178 280 +P 54 249 193 289 +P 54 479 167 290 +P 54 298 172 295 +P 54 480 232 314 +P 54 481 239 314 +P 54 482 242 360 +P 54 483 484 413 +P 54 484 477 420 +P 54 485 479 427 +P 54 486 481 437 +P 54 487 493 440 +P 54 488 500 433 +Q 54 23 276 160 422 1511.0428560656 1859 1419.9679089148089588 +Q 54 126 131 169 421 1321.319984636 1623 1242.4153348524705507 +Q 54 114 144 176 433 1331.3788591384 1619 1248.7285795090906504 +Q 54 142 426 26 29 1238.8691911448 1489 1171.1995393869267446 +Q 54 105 112 172 426 1294.5504320136 1581 1214.383757385771105 +P 55 489 30 151 +P 55 490 230 305 +P 55 491 340 310 +P 55 265 392 140 +Q 55 175 419 103 93 1285.893577764 1570 1205.8290796222561312 +Q 55 131 138 162 434 1318.0062761368000001 1615 1238.3867068188199028 +Q 55 72 257 170 427 1507.8418459391999999 1864 1417.8219818894240234 +Q 55 272 241 107 147 -1 -1 -1 +Q 55 22 172 169 417 1417.2316728823999999 1740 1330.9357783055806976 +P 56 492 228 295 +P 56 493 330 325 +P 56 494 335 320 +P 56 495 341 332 +P 56 496 400 130 +P 56 89 391 139 +P 56 497 379 151 +Q 56 37 156 169 421 1391.3616151968 1703 1305.6627995807316438 +Q 56 101 258 168 424 1522.8834765 1889 1432.5942212704835583 +Q 56 41 171 190 426 1410.8468965711999999 1726 1323.4219295569812402 +Q 56 325 281 381 466 -1 -1 -1 +Q 56 24 180 172 427 1413.1606050704 1733 1325.7785131200575961 +P 57 498 225 282 +P 57 499 323 330 +P 57 500 358 132 +P 57 501 361 136 +P 57 502 365 135 +P 57 503 368 139 +P 57 504 372 141 +P 57 505 381 145 +P 57 506 404 132 +P 57 507 412 136 +P 57 508 398 148 +P 57 509 409 145 +Q 57 270 207 210 385 -1 -1 -1 +Q 57 63 237 186 427 1494.6997103152 1845 1404.7202210382977228 +Q 57 84 261 166 414 1512.7829714368 1883 1426.1328893418315147 +Q 57 144 121 166 421 1323.248916824 1622 1242.7283135363807105 +Q 57 107 138 172 419 1321.3494218872 1616 1240.4980580090139028 +P 58 510 100 283 +P 58 511 177 82 +P 58 409 186 87 +P 58 512 183 92 +P 58 513 191 231 +P 58 514 345 137 +P 58 515 351 134 +P 58 516 394 364 +P 58 517 408 366 +P 58 518 394 368 +P 58 519 394 372 +Q 58 43 202 170 423 1442.9301576928 1778 1354.3068273374942692 +Q 58 105 127 171 431 1306.3788591384 1594 1225.2952736512024785 +Q 58 273 207 4 454 -1 -1 -1 +Q 58 49 328 172 436 1574.599205252 1929 1480.3438942484126528 +Q 58 1 267 176 429 1506.4154390672 1845 1414.0764420877328575 +P 59 520 174 441 +P 59 521 174 450 +P 59 522 177 454 +P 59 523 192 242 +P 59 524 198 238 +P 59 525 191 448 +P 59 526 191 464 +P 59 527 199 460 +P 59 528 421 147 +P 59 529 438 149 +P 59 26 447 154 +P 59 530 453 155 +P 59 531 441 175 +P 59 532 495 39 +Q 59 46 177 167 427 1401.9474016344 1713 1316.8214822192092015 +Q 59 5 294 180 430 1553.5453813816 1881 1459.0342033246199662 +Q 59 16 257 171 437 1506.7169542568 1833 1413.616942969636284 +Q 59 110 135 168 432 1325.9230150152 1603 1243.3116996157934864 +Q 59 293 262 133 17 -1 -1 -1 +P 60 533 185 441 +P 60 534 190 446 +P 60 535 408 155 +P 60 536 408 159 +P 60 537 433 384 +P 60 538 452 384 +P 60 539 438 388 +P 60 540 438 392 +P 60 541 439 401 +P 60 390 452 405 +P 60 177 463 410 +P 60 542 447 415 +Q 60 77 249 182 430 1525.457069628 1874 1433.9762270311480279 +Q 60 340 290 238 284 -1 -1 -1 +Q 60 20 306 166 429 1555.6875170056 1889 1459.6788301405881612 +Q 60 71 257 186 430 1534.9717882536 1880 1442.1690227739661623 +Q 60 19 173 170 435 1426.9768388856 1731 1337.101718089002361 +P 61 543 196 439 +P 61 544 271 367 +P 61 384 277 367 +P 61 545 398 151 +P 61 222 399 158 +P 61 546 401 162 +P 61 547 401 164 +P 61 548 438 91 +P 61 549 374 328 +P 61 550 398 335 +P 61 551 375 338 +P 61 552 392 365 +P 61 553 418 376 +P 61 554 407 381 +P 61 555 416 387 +P 61 556 430 381 +P 61 557 433 381 +P 61 249 452 383 +Q 61 175 424 159 119 1371.6214998256000001 1661 1286.4718671573614301 +Q 61 302 259 97 332 -1 -1 -1 +Q 61 70 163 169 428 1381.9768388856 1686 1299.0810047700524592 +Q 61 39 201 175 429 1467.4743135696 1792 1375.9396815565573888 +Q 61 79 263 192 426 1560.1849916896 1914 1465.608959045828442 +P 62 558 229 66 +P 62 265 325 60 +P 62 177 358 42 +P 62 559 349 45 +P 62 95 336 52 +P 62 209 344 49 +P 62 369 328 56 +P 62 560 372 63 +P 62 561 390 57 +P 62 562 396 62 +P 62 563 377 71 +P 62 186 400 81 +P 62 564 391 84 +P 62 321 402 80 +P 62 565 421 95 +P 62 566 40 407 +P 62 86 39 410 +P 62 567 56 405 +P 62 568 72 398 +P 62 569 64 401 +P 62 222 39 413 +P 62 570 54 428 +P 62 571 279 360 +P 62 572 328 361 +P 62 414 275 363 +P 62 573 328 363 +Q 62 94 247 168 430 1514.030662756 1845 1421.0109262460218815 +Q 62 250 228 170 369 -1 -1 -1 +Q 62 34 309 177 429 1564.81745932 1887 1468.2566880659826438 +Q 62 24 179 177 432 1420.8641405128 1712 1331.5817249246763367 +Q 62 40 221 170 423 1461.1900423216 1774 1370.2942564878508165 +P 63 574 246 35 +P 63 575 252 35 +P 63 576 420 101 +P 63 577 428 94 +P 63 578 151 409 +P 63 249 375 361 +P 63 376 151 412 +P 63 579 152 422 +P 63 580 162 412 +P 63 581 178 431 +P 63 582 173 434 +P 63 583 168 438 +P 63 584 171 441 +P 63 233 194 441 +P 63 376 204 460 +Q 63 139 17 262 474 934.2468247784 1134 882.42194471954269375 +Q 63 45 309 83 458 1526.4499269504 1817 1430.885163191282345 +Q 63 79 476 483 52 882.40620434399999999 1046 829.49239632199862626 +Q 63 313 275 61 457 -1 -1 -1 +Q 63 243 162 184 337 935.15137034719999998 1098 882.20070516024657081 +P 64 585 139 397 +P 64 586 151 397 +P 64 587 157 403 +P 64 369 248 100 +P 64 588 478 20 +P 64 589 482 18 +P 64 590 487 10 +P 64 568 486 27 +P 64 591 495 10 +P 64 592 503 10 +Q 64 128 54 237 301 1002.6072144704 1176 941.37445941054932064 +Q 64 179 53 306 356 926.96760416240000002 1074 871.72022462575148438 +Q 64 1 277 62 462 1493.5504320136 1770 1403.7937113444106672 +Q 64 327 282 228 77 -1 -1 -1 +Q 64 74 83 171 424 1111.3595231512 1304 1042.5484564467978998 +P 65 43 249 105 +P 65 593 254 105 +P 65 594 252 151 +P 65 595 443 99 +P 65 354 448 106 +P 65 596 451 97 +P 65 505 451 102 +P 65 597 460 39 +P 65 97 460 100 +P 65 598 464 34 +P 65 599 469 29 +P 65 600 473 24 +P 65 601 78 346 +P 65 602 82 350 +P 65 603 85 355 +P 65 604 89 359 +P 65 605 457 320 +P 65 606 94 364 +P 65 607 105 375 +P 65 608 126 375 +P 65 609 127 380 +P 65 610 131 400 +P 65 611 136 396 +P 65 581 141 394 +Q 65 74 164 316 457 1100.6437943992 1325 1036.8968283889398663 +Q 65 28 58 101 465 1205.6021638384 1420 1133.2314992637318483 +Q 65 280 220 192 468 -1 -1 -1 +Q 65 30 491 122 25 1182.4305909632 1392 1113.7186313619483826 +Q 65 26 51 170 292 1139.4478349048 1331 1076.2080821638171528 +P 66 612 204 281 +P 66 613 437 98 +P 66 614 440 108 +P 66 615 464 99 +P 66 616 464 105 +P 66 236 451 108 +P 66 617 437 111 +P 66 618 481 112 +Q 66 162 37 239 290 937.69552622400000003 1090 883.99182078639330484 +Q 66 288 126 131 435 917.49451609759999998 1078 863.23232587233258073 +Q 66 67 438 425 24 872.54119729039999998 1002 822.84685173409877734 +Q 66 131 109 82 482 1287.04076402 1524 1208.1451324432962338 +Q 66 65 264 52 455 1496.2783540752 1788 1409.1538596604359554 +P 67 619 75 315 +P 67 620 331 480 +P 67 621 437 120 +P 67 622 473 113 +Q 67 193 65 148 379 1117.6072144704 1291 1050.985595838741574 +Q 67 41 47 313 424 965.50670940720000002 1143 908.33688242636731047 +Q 67 84 64 131 293 1114.8742417768 1324 1054.8685542272387465 +Q 67 283 226 138 351 -1 -1 -1 +Q 67 26 207 192 356 1246.543289336 1475 1174.3312806369945065 +P 68 623 68 307 +P 68 487 68 318 +P 68 624 75 307 +P 68 183 319 468 +P 68 625 325 469 +P 68 626 331 471 +P 68 536 331 475 +P 68 627 462 113 +P 68 628 437 128 +Q 68 22 263 92 439 1456.964645576 1744 1369.8426499875824902 +Q 68 86 269 129 485 1438.5748186328 1759 1352.6162654423183085 +Q 68 91 5 176 435 1055.832611216 1255 991.54700600301157465 +Q 68 316 270 393 82 -1 -1 -1 +Q 68 0 258 320 467 1248.4255403312 1499 1174.6406966198617283 +P 69 161 113 227 +P 69 392 125 229 +P 69 629 126 232 +P 69 630 218 250 +P 69 631 219 255 +P 69 632 121 282 +P 69 633 220 260 +P 69 196 311 474 +P 69 502 316 465 +P 69 354 319 466 +P 69 634 340 103 +P 69 635 345 103 +P 69 400 416 119 +P 69 636 426 113 +P 69 637 458 115 +P 69 638 437 139 +P 69 639 448 147 +Q 69 60 8 339 363 886.96760416240000002 1034 834.91845489664456181 +Q 69 102 46 72 435 1148.9625535304 1337 1079.0624155612294999 +Q 69 375 18 203 427 748.16861428880000001 887 701.91155906073845472 +Q 69 170 302 391 96 702.81327522880000003 827 668.22594351432542226 +Q 69 409 64 312 452 617.54119729039999998 747 583.75619349462226637 +P 70 249 7 23 +P 70 89 8 31 +P 70 640 27 28 +P 70 641 28 184 +P 70 642 42 184 +P 70 643 45 187 +P 70 644 49 191 +P 70 645 52 194 +P 70 646 113 213 +P 70 593 157 330 +P 70 384 162 335 +Q 70 22 283 116 332 1425.9230150152 1703 1339.7002632210469528 +Q 70 192 60 33 468 1263.4305909632 1479 1188.265913588614012 +Q 70 65 215 65 462 1421.2367235143999999 1693 1334.2826449344406683 +Q 70 146 60 332 454 959.03362134239999998 1136 899.90931684129998303 +Q 70 176 61 74 473 1222.4305909632 1436 1143.8346956677380604 +P 71 647 33 27 +P 71 376 40 181 +P 71 425 44 184 +P 71 648 48 182 +P 71 649 113 195 +P 71 209 194 295 +P 71 650 180 300 +P 71 651 183 306 +P 71 652 189 312 +Q 71 87 239 43 470 1478.9352083248 1763 1387.620530064548575 +Q 71 132 55 59 470 1182.0874452127999999 1390 1110.3053527232093529 +Q 71 54 110 76 469 1258.3006486488 1485 1178.3178833089409636 +Q 71 7 237 112 384 1358.0702012712 1600 1283.2106929982921883 +Q 71 36 484 312 93 1001.690475592 1185 943.31613275798031282 +P 72 653 42 172 +P 72 654 113 175 +P 72 655 200 276 +P 72 656 194 284 +P 72 657 194 292 +P 72 658 203 296 +P 72 659 203 300 +P 72 660 297 86 +P 72 661 294 91 +P 72 662 291 94 +P 72 663 285 116 +Q 72 141 131 148 428 1203.9869401496 1426 1131.5183704897758616 +Q 72 2 255 78 441 1454.7220048888 1726 1364.5679431290543562 +Q 72 130 118 88 481 1296.182899644 1533 1216.4508558785082641 +Q 72 10 286 182 299 1379.5971132064 1635 1298.6430317944079889 +Q 72 56 32 122 184 1229.4600282144 1438 1170.073244536664788 +P 73 418 113 167 +P 73 664 113 171 +P 73 665 201 259 +P 73 666 280 122 +P 73 667 140 337 +P 73 668 152 337 +P 73 669 158 341 +P 73 670 201 277 +P 73 671 130 375 +P 73 652 112 406 +P 73 672 105 412 +P 73 673 96 415 +P 73 674 83 419 +P 73 675 79 425 +P 73 676 80 428 +P 73 677 95 428 +Q 73 54 472 41 20 1238.2173875272 1435 1167.4015616898950611 +Q 73 64 459 14 24 1248.1757569664 1435 1179.4298075020672059 +Q 73 32 478 225 57 1062.7493500944 1242 1000.3093210435542915 +Q 73 96 251 81 476 1476.3788591384 1764 1384.8218170851380364 +Q 73 48 314 186 432 1416.035713388 1706 1327.4673200128456756 +P 74 678 146 328 +P 74 679 164 341 +P 74 680 180 300 +P 74 681 194 279 +P 74 93 195 314 +P 74 682 199 309 +P 74 683 188 369 +P 74 684 31 465 +P 74 685 194 375 +P 74 686 198 379 +P 74 687 240 440 +P 74 688 247 433 +P 74 689 254 435 +P 74 690 459 481 +Q 74 71 272 100 374 1412.827560584 1653 1329.4226293600190729 +Q 74 9 187 86 469 1401.8813844544 1669 1314.710861132537957 +Q 74 111 93 78 473 1259.8153672744 1483 1179.7445161300984182 +Q 74 292 106 28 485 1023.9331162792 1211 965.05598023837876553 +Q 74 177 75 103 295 1185.0580079616 1410 1116.3118203281117076 +P 75 691 143 4 +P 75 692 143 9 +P 75 693 479 0 +P 75 694 471 7 +P 75 695 147 15 +P 75 696 158 15 +P 75 697 471 15 +P 75 177 194 369 +P 75 470 197 372 +P 75 470 201 376 +P 75 626 205 380 +P 75 698 389 303 +P 75 699 389 312 +P 75 700 394 312 +Q 75 72 481 59 11 1209.8153672744 1421 1138.7080766965104885 +Q 75 80 438 99 50 1158.9453095888 1355 1089.1750899379180737 +Q 75 81 238 133 467 1383.6214998256000001 1673 1298.6115119316634718 +Q 75 70 96 94 440 1216.187950276 1430 1141.8111269495457236 +Q 75 254 117 163 434 906.16356365680000001 1070 851.95181942704982703 +P 76 701 167 26 +P 76 702 172 26 +P 76 249 210 383 +P 76 703 213 462 +P 76 704 208 468 +P 76 705 205 475 +P 76 49 205 481 +P 76 706 465 124 +Q 76 60 92 85 476 1241.9158723376 1461 1164.0501435137089175 +Q 76 30 209 78 444 1395.8813844544 1655 1309.3877403449814665 +Q 76 87 257 72 472 1475.4499269504 1760 1382.8305656543020632 +Q 76 88 150 83 472 1312.4844148336 1555 1232.6237279317520006 +Q 76 151 45 88 481 1195.5727265872 1399 1120.7075073538569541 +P 77 707 101 179 +P 77 708 107 173 +P 77 709 128 172 +P 77 703 227 448 +P 77 710 220 454 +P 77 711 219 461 +P 77 712 231 461 +P 77 713 237 461 +P 77 663 458 124 +Q 77 15 298 110 192 1529.9057710736 1831 1444.8209956724499534 +Q 77 68 455 376 31 888.42344828559999997 1036 834.80186062357245191 +Q 77 28 312 310 421 1268.9108217056 1529 1190.285983665708045 +Q 77 38 231 214 354 1242.5016587752 1461 1173.5763225439684447 +Q 77 232 227 255 45 -1 -1 -1 +P 78 714 88 192 +P 78 715 100 193 +P 78 136 103 201 +P 78 716 106 201 +P 78 717 235 444 +P 78 300 259 433 +P 78 718 233 446 +P 78 682 245 449 +P 78 719 250 449 +P 78 720 265 363 +P 78 721 268 366 +P 78 722 262 438 +P 78 541 408 124 +P 78 723 404 128 +P 78 724 403 130 +Q 78 235 274 80 491 -1 -1 -1 +Q 78 54 226 97 436 1410.4671708919999999 1677 1322.4417447244441064 +Q 78 34 192 51 474 1410.8519472031999999 1675 1323.7583000736422036 +Q 78 19 181 78 471 1393.0529573296 1659 1306.2582636875820299 +Q 78 119 73 43 458 1201.4894654656 1403 1130.9994366567896122 +P 79 725 238 195 +P 79 249 260 196 +P 79 726 234 198 +P 79 727 230 202 +P 79 728 234 210 +P 79 729 242 218 +P 79 730 391 150 +P 79 731 408 133 +P 79 732 393 152 +P 79 706 401 165 +P 79 238 275 362 +P 79 616 286 354 +P 79 733 325 366 +P 79 734 322 372 +P 79 735 319 375 +Q 79 86 101 38 478 1280.2001435856 1501 1200.0745797793310885 +Q 79 130 141 61 482 1315.8103166424 1566 1236.0203420688862934 +Q 79 231 233 133 447 -1 -1 -1 +Q 79 150 113 22 480 1353.6559877088 1595 1273.2536592355738776 +Q 79 2 199 78 478 1420.1067812 1701 1333.7444285870669773 +P 80 736 35 46 +P 80 737 62 35 +P 80 738 480 142 +P 80 739 480 149 +P 80 740 483 153 +P 80 741 415 171 +P 80 742 427 168 +P 80 743 433 171 +P 80 744 440 176 +P 80 745 440 182 +P 80 603 449 185 +P 80 746 342 366 +P 80 747 361 368 +Q 80 69 469 290 121 995.99199078159999998 1167 937.49399656499531375 +Q 80 48 478 197 94 1079.1046891544 1263 1014.9673124417162171 +Q 80 99 106 74 440 1243.8742417768 1453 1166.7562929386392625 +Q 80 71 246 143 437 1364.1240251416 1623 1278.7666792046484261 +Q 80 23 228 50 461 1446.9818895176 1710 1356.87761969667622 +P 81 748 282 88 +P 81 749 282 95 +P 81 750 282 99 +P 81 751 296 131 +P 81 752 453 187 +P 81 753 466 185 +P 81 754 473 177 +P 81 755 313 284 +P 81 756 322 246 +P 81 757 328 241 +P 81 758 380 366 +P 81 759 457 318 +P 81 760 464 318 +Q 81 299 133 54 462 1033.1341264056 1210 970.69604462815141233 +Q 81 54 75 75 472 1229.6437943992 1454 1155.2846850818145867 +Q 81 179 68 61 480 1237.5849198968 1458 1160.9126389437208218 +Q 81 130 141 98 434 1289.898628396 1533 1213.3018350534837282 +Q 81 75 449 257 108 992.82041790640000001 1171 935.86710047140547886 +P 82 43 263 187 +P 82 761 268 182 +P 82 762 274 257 +P 82 763 275 264 +P 82 764 277 271 +P 82 765 283 278 +P 82 766 462 315 +P 82 767 471 315 +P 82 249 475 332 +P 82 768 484 74 +Q 82 85 480 11 47 1269.9158723376 1469 1192.0220174560736268 +Q 82 31 157 101 435 1364.7981233328 1612 1279.4221061496393759 +Q 82 134 160 96 436 1312.4133470216 1552 1230.9260226224785129 +Q 82 49 89 82 458 1231.1585130248 1452 1155.067671177207103 +Q 82 284 232 118 355 -1 -1 -1 +P 83 579 73 30 +P 83 626 122 32 +P 83 384 135 20 +P 83 354 146 19 +P 83 769 131 27 +P 83 770 127 30 +P 83 771 142 34 +P 83 772 154 36 +P 83 772 161 40 +P 83 773 168 39 +P 83 774 175 33 +P 83 775 225 81 +P 83 776 272 250 +P 83 777 259 302 +Q 83 284 113 425 378 611.5290039808 724 576.81674956266920162 +Q 83 338 159 149 417 696.73001410719999998 801 654.86158491074615995 +Q 83 224 109 145 390 923.06810922559999999 1066 870.87791020138013209 +Q 83 496 36 340 423 604.16861428880000001 743 574.99592582054231116 +Q 83 317 280 37 75 -1 -1 -1 +P 84 778 50 292 +P 84 779 182 35 +P 84 780 182 46 +P 84 781 176 53 +P 84 782 339 373 +P 84 783 473 337 +Q 84 170 33 246 178 1536.4671708919999999 1803 1445.6845651144992644 +Q 84 189 69 225 173 1567.8519472031999999 1842 1474.4991465705479641 +Q 84 195 162 162 47 1566.2955980168 1834 1474.4595514762752373 +Q 84 183 71 220 163 1563.538238704 1833 1470.8254904461807655 +Q 84 208 169 120 69 1509.2245302048 1774 1419.0797536858601688 +P 85 784 21 295 +P 85 785 27 298 +P 85 786 33 298 +P 85 787 39 297 +P 85 788 46 297 +P 85 789 70 305 +P 85 392 47 307 +P 85 249 67 309 +P 85 790 55 310 +P 85 791 49 314 +P 85 792 39 316 +P 85 793 144 44 +P 85 794 149 47 +P 85 795 301 150 +P 85 796 301 158 +P 85 797 363 373 +P 85 798 434 349 +P 85 799 441 348 +P 85 800 445 346 +P 85 759 473 313 +P 85 89 473 332 +P 85 801 480 313 +P 85 532 480 328 +Q 85 281 172 155 46 1527.5676759552 1790 1435.6088853010621733 +Q 85 164 33 254 176 1529.9402589568 1783 1441.7794138778342585 +Q 85 333 282 63 42 -1 -1 -1 +Q 85 151 58 261 157 1518.5260453944 1771 1430.0982400784637321 +Q 85 167 60 214 167 1567.2245302048 1832 1475.2490163044390101 +P 86 802 63 428 +P 86 803 63 433 +P 86 804 281 83 +P 86 805 280 89 +P 86 806 338 138 +P 86 663 355 141 +P 86 222 318 150 +P 86 807 355 147 +P 86 614 317 377 +P 86 808 328 373 +P 86 809 360 373 +P 86 810 392 372 +P 86 471 431 353 +P 86 811 450 151 +P 86 812 457 152 +P 86 813 464 156 +P 86 814 471 159 +Q 86 173 67 294 119 1487.7392488304 1749 1398.3384188442119012 +Q 86 341 250 173 367 -1 -1 -1 +Q 86 245 161 157 22 1518.5676759552 1781 1428.7749171568545989 +Q 86 188 72 295 108 1491.0529573296 1757 1403.6542413734864567 +Q 86 272 146 123 61 1456.4549775824 1706 1370.5025915888932104 +P 87 815 192 257 +P 87 761 182 355 +P 87 43 187 360 +P 87 816 195 257 +P 87 316 201 257 +P 87 817 198 317 +P 87 818 203 304 +P 87 819 227 186 +P 87 820 238 192 +P 87 821 478 163 +P 87 822 479 174 +Q 87 37 43 393 349 761.21024484960000001 910 720.20594501987193325 +Q 87 34 451 203 328 220.53405461279999999 292 209.48851280619066983 +Q 87 28 279 166 62 411.7594513584 509 383.61758596704748925 +Q 87 449 174 470 13 234.6934341784 288 219.52919449447026068 +Q 87 369 124 505 47 169.6518036176 213 161.68314884646883911 +P 88 823 0 7 +P 88 824 3 7 +P 88 825 7 7 +P 88 265 7 22 +P 88 316 8 36 +P 88 826 83 97 +P 88 827 150 97 +P 88 828 155 95 +P 88 829 161 92 +P 88 830 192 248 +Q 88 279 116 408 140 274.7645019904 331 255.70833761078435487 +Q 88 47 66 40 435 564.23968210080000002 706 531.19376066099664513 +Q 88 50 476 315 450 294.68124086880000001 331 276.70856359515101985 +Q 88 273 79 495 112 259.50966799360000001 297 242.14222891739944998 +Q 88 113 477 498 489 421.45079349120000001 473 395.90426536410052449 +P 89 831 0 38 +P 89 832 0 44 +P 89 833 103 118 +P 89 834 159 113 +P 89 209 153 122 +P 89 835 162 113 +P 89 836 172 101 +P 89 837 176 105 +P 89 371 181 110 +P 89 838 186 115 +P 89 839 181 123 +P 89 840 185 134 +P 89 841 192 225 +P 89 43 192 243 +Q 89 49 38 510 466 906.477272156 1091 851.21270611292300146 +Q 89 461 91 457 397 -1 -1 -1 +Q 89 21 49 460 396 844.66608897280000001 1004 800.57664552253402235 +Q 89 360 42 2 308 -1 -1 -1 +Q 89 138 69 495 236 992.42344828559999997 1150 932.42411628173920235 +P 90 842 95 152 +P 90 843 101 150 +P 90 844 107 147 +P 90 845 113 146 +P 90 846 190 116 +P 90 376 232 278 +P 90 847 236 271 +P 90 848 240 271 +P 90 619 337 405 +P 90 505 345 405 +P 90 614 340 411 +P 90 86 334 414 +P 90 721 330 417 +P 90 849 343 424 +Q 90 85 152 219 448 361.705627488 432 336.35461798712765358 +Q 90 406 71 366 137 91.0121933096 108 85.195907518169562422 +Q 90 209 171 70 71 -1 -1 -1 +Q 90 113 203 100 493 330.17871555280000001 387 311.45060567105736027 +Q 90 184 311 297 407 160.3797256792 209 151.14092280223388798 +P 91 850 117 149 +P 91 851 197 116 +P 91 852 209 116 +P 91 374 241 295 +P 91 143 243 307 +P 91 853 318 421 +P 91 43 325 418 +P 91 26 325 428 +P 91 854 325 433 +P 91 69 333 433 +P 91 855 344 430 +Q 91 271 240 98 4 -1 -1 -1 +Q 91 430 152 320 480 888.1290757736 1116 843.52293105367743919 +Q 91 286 105 510 438 776.69552622400000003 929 736.12153440284464523 +Q 91 159 425 448 414 311.69848481039999999 324 298.34215089864750325 +Q 91 474 117 274 460 805.40620434399999999 987 758.22569301493365401 +P 92 856 221 119 +P 92 857 224 126 +P 92 317 246 319 +P 92 858 285 464 +P 92 859 284 470 +P 92 860 423 310 +P 92 861 423 320 +P 92 534 431 320 +P 92 128 448 342 +P 92 862 458 340 +P 92 863 463 336 +Q 92 365 112 486 194 1059.1046891544 1253 1005.994280821907978 +Q 92 329 155 462 228 1104.6732316504 1322 1045.5016924133869907 +Q 92 460 231 391 143 1086.3595231512 1299 1028.7251646473278015 +Q 92 315 252 431 66 -1 -1 -1 +Q 92 339 277 81 161 -1 -1 -1 +P 93 392 281 471 +P 93 517 279 474 +P 93 864 277 476 +P 93 865 273 478 +P 93 865 269 482 +P 93 865 265 486 +P 93 865 261 490 +P 93 866 258 494 +P 93 867 447 355 +Q 93 448 149 463 229 1156.4011537120000001 1379 1093.9159893552471203 +Q 93 424 153 463 218 1135.8864350864 1362 1076.9229936892984369 +Q 93 370 141 469 233 1065.832611216 1265 1008.7992607813293944 +Q 93 290 275 42 500 -1 -1 -1 +Q 93 306 184 462 225 1142.0996385224 1377 1083.7069940520364071 +P 94 868 244 494 +P 94 869 232 498 +P 94 870 232 503 +P 94 238 278 151 +P 94 111 282 150 +P 94 871 287 152 +P 94 872 264 502 +P 94 873 264 507 +Q 94 303 186 455 219 1155.4133470216 1395 1096.4644646840204132 +Q 94 474 166 442 223 1205.4722215239999999 1431 1140.8721974461650461 +Q 94 455 274 459 111 1032.1757569664 1229 973.27166045407273032 +Q 94 442 176 504 194 1178.2712113976 1412 1113.6000965152884419 +Q 94 511 195 461 74 1080.61940778 1271 1027.2100023359314491 +P 95 559 184 365 +P 95 874 195 498 +P 95 593 296 152 +P 95 875 441 419 +Q 95 299 73 495 449 782.80822459679999997 948 742.0499578932035547 +Q 95 303 11 253 116 190.279220616 243 179.34208464734479094 +Q 95 407 98 242 212 788.45288553679999999 925 756.78972454418044435 +Q 95 480 198 339 150 930.93816691120000001 1085 891.36780160218063429 +Q 95 296 64 222 506 671.43564159520000001 846 635.89651531887500369 +P 96 593 95 366 +P 96 316 100 375 +P 96 392 179 360 +P 96 876 16 493 +P 96 877 24 493 +P 96 878 184 498 +P 96 879 189 499 +P 96 880 355 152 +P 96 881 366 218 +P 96 882 366 228 +P 96 883 442 430 +P 96 884 448 430 +Q 96 320 284 23 501 -1 -1 -1 +Q 96 87 250 475 271 741.05591591600000001 867 695.57686087271088127 +Q 96 456 183 390 475 851.96255353040000002 1040 816.3186165207458771 +Q 96 148 283 484 1 611.48737342 714 574.17682349114227236 +Q 96 1 229 457 182 541.81832586080000003 625 514.03200993325094714 +P 97 885 19 491 +P 97 886 33 502 +P 97 887 249 311 +P 97 888 387 227 +P 97 889 387 237 +P 97 890 367 239 +P 97 891 370 242 +P 97 892 498 157 +P 97 893 505 147 +Q 97 504 208 465 95 1074.690475592 1268 1020.6789563344523231 +Q 97 508 249 281 152 819.45288553679999999 970 780.84905621548762156 +Q 97 356 46 364 355 694.31074991280000003 839 659.86456875526687327 +Q 97 354 111 122 374 551.27416998399999998 645 524.2367448445198761 +Q 97 207 95 458 398 658.05591591600000001 784 630.61716654605231724 +P 98 894 26 132 +P 98 895 26 487 +P 98 896 41 501 +P 98 400 249 306 +P 98 897 376 248 +P 98 898 388 248 +P 98 899 396 228 +Q 98 266 209 212 296 -1 -1 -1 +Q 98 457 229 254 177 872.65389566319999998 1015 830.67497203164805342 +Q 98 425 32 205 345 592.71277016560000001 721 559.86828147232233732 +Q 98 420 124 246 218 778.29855660319999999 906 751.39340116531514013 +Q 98 437 74 501 478 950.00418409120000002 1148 896.69650455040789438 +P 99 900 29 156 +P 99 901 46 156 +P 99 902 41 164 +P 99 96 29 200 +P 99 903 35 221 +P 99 904 25 225 +P 99 905 30 486 +P 99 906 45 485 +P 99 907 51 489 +P 99 908 46 500 +P 99 909 249 277 +P 99 274 255 285 +P 99 910 381 253 +P 99 911 391 258 +Q 99 424 38 511 263 974.40620434399999999 1156 921.57939445118370259 +Q 99 347 62 334 407 658.62445841200000002 808 622.84041146916229081 +Q 99 191 178 449 443 769.8670990992 921 733.52653429869951651 +Q 99 482 191 486 75 1101.335136532 1280 1048.8510432205321194 +Q 99 496 21 495 453 1012.5605332776 1217 959.56695326341503005 +P 100 912 15 215 +P 100 913 15 227 +P 100 914 27 230 +P 100 846 175 348 +P 100 166 209 63 +P 100 772 209 107 +P 100 915 219 63 +P 100 916 221 77 +P 100 917 225 63 +P 100 384 262 317 +P 100 918 261 344 +P 100 919 264 340 +P 100 920 268 317 +P 100 921 272 317 +P 100 347 274 326 +Q 100 39 25 342 423 558.65389566319999998 701 531.01257097940310814 +Q 100 282 15 497 216 1019.4183976536 1218 969.14730310494121568 +Q 100 235 256 303 150 615.42849891759999997 732 593.8955310343195606 +Q 100 391 139 122 447 635.61731573439999998 727 606.88984345747371663 +Q 100 475 284 407 49 944.1341264056 1125 889.57845402946873037 +P 101 922 153 127 +P 101 923 165 127 +P 101 924 205 108 +P 101 717 203 112 +P 101 925 198 114 +P 101 926 191 127 +P 101 927 194 133 +P 101 928 220 128 +P 101 517 129 242 +P 101 929 151 273 +P 101 930 177 300 +P 101 931 335 439 +P 101 932 335 444 +P 101 933 336 450 +P 101 934 344 453 +P 101 935 348 456 +P 101 86 355 459 +P 101 936 386 499 +P 101 937 388 502 +P 101 937 391 505 +P 101 938 394 508 +Q 101 301 255 418 505 -1 -1 -1 +Q 101 468 212 509 24 1124.4600282144 1333 1064.8346700677357148 +Q 101 455 222 288 117 885.2518754104 1044 838.3328346155175268 +Q 101 497 211 321 11 987.07525190320000003 1188 935.18441064068122159 +Q 101 448 274 384 150 925.5950211608 1082 885.1669874527246975 +P 102 26 114 144 +P 102 939 139 130 +P 102 940 102 168 +P 102 376 104 177 +P 102 941 132 177 +P 102 942 108 206 +P 102 943 105 216 +P 102 944 128 186 +P 102 945 128 217 +P 102 946 131 231 +P 102 947 147 127 +P 102 948 183 225 +P 102 949 187 225 +P 102 950 189 225 +P 102 951 332 444 +P 102 952 340 437 +Q 102 395 389 49 64 565.15642097919999998 687 544.31713796095925773 +Q 102 432 20 221 502 824.41839765359999997 1023 772.48017314494870789 +Q 102 284 143 489 304 797.7544007264 936 754.77860135171329148 +Q 102 319 16 368 354 731.32294322240000001 893 691.996589951961937 +Q 102 500 28 136 403 720.57063454159999999 843 672.24893301071631413 +P 103 316 107 226 +P 103 953 149 139 +P 103 954 166 140 +P 103 955 171 138 +P 103 616 181 214 +P 103 956 185 136 +P 103 957 222 129 +P 103 958 104 228 +P 103 959 117 292 +P 103 960 121 285 +P 103 960 126 290 +P 103 159 131 304 +P 103 961 136 309 +P 103 761 145 318 +P 103 43 150 323 +Q 103 409 31 451 501 887.15851302480000001 1108 831.84757484980411846 +Q 103 166 44 205 383 478.51681067119999999 568 447.06719559082335991 +Q 103 14 184 31 321 155.639610308 182 144.70168050602822518 +Q 103 137 261 446 28 502.61731573440000001 594 466.39223313184447761 +Q 103 309 84 446 69 167.59797974719999999 184 160.03223743281020575 +P 104 536 97 377 +P 104 89 97 382 +P 104 962 135 328 +P 104 963 131 331 +P 104 964 130 335 +P 104 95 136 338 +P 104 965 106 443 +P 104 966 133 421 +P 104 13 142 425 +P 104 967 143 421 +P 104 968 148 422 +P 104 969 103 450 +P 104 249 120 456 +P 104 970 121 451 +P 104 971 117 457 +P 104 972 113 460 +P 104 973 99 464 +Q 104 19 501 492 454 504.89444430480000001 550 483.08277663596140883 +Q 104 339 242 47 429 -1 -1 -1 +Q 104 378 72 244 351 607.68333291439999999 743 574.0261469670427914 +Q 104 85 19 130 202 209.0954544312 246 197.54079100881887143 +Q 104 104 503 135 277 256.33809511840000001 295 245.48277076544951569 +P 105 974 0 165 +P 105 975 6 165 +P 105 976 18 412 +P 105 977 28 411 +P 105 978 33 409 +P 105 979 73 395 +P 105 980 85 394 +P 105 981 88 384 +P 105 982 91 378 +P 105 983 50 427 +P 105 984 66 423 +P 105 237 156 113 +P 105 985 185 113 +P 105 986 259 113 +P 105 222 261 192 +P 105 614 324 380 +P 105 987 436 94 +P 105 568 436 99 +P 105 988 426 102 +Q 105 246 48 17 487 604.2569260424 722 565.79689891449447714 +Q 105 406 75 102 467 704.2152954816 812 660.44903156321117876 +Q 105 461 154 241 410 688.74220741680000002 810 656.72947102623595583 +Q 105 43 157 267 492 476.5290039808 589 451.11475588118042879 +Q 105 439 35 253 354 674.21024484960000001 823 636.07299151795371017 +P 106 711 0 164 +P 106 989 12 162 +P 106 990 18 156 +P 106 657 12 169 +P 106 991 12 177 +P 106 992 24 152 +P 106 993 24 176 +P 106 994 48 150 +P 106 249 39 409 +P 106 995 73 398 +P 106 996 252 449 +P 106 997 258 442 +P 106 998 264 440 +P 106 143 270 443 +P 106 789 335 380 +Q 106 485 223 382 116 960.3645737832 1132 914.13263091833721319 +Q 106 291 104 441 325 699.0975464768 835 659.5033947308822917 +Q 106 496 32 94 389 704.22748879119999998 829 660.27979575809285961 +Q 106 235 207 328 47 705.23968210080000002 847 671.36977473281172024 +Q 106 404 19 163 391 605.11479041839999998 717 561.969177615270155 +P 107 999 48 148 +P 107 96 75 398 +P 107 1000 88 380 +P 107 1001 92 377 +P 107 1002 145 234 +P 107 1003 148 245 +P 107 1004 150 256 +P 107 1005 152 267 +P 107 96 138 381 +P 107 669 169 346 +P 107 238 178 359 +Q 107 345 153 381 356 682.08535316720000002 801 654.47513277518203267 +Q 107 481 202 282 80 871.66608897280000001 1031 824.51858839375381649 +Q 107 471 216 499 15 1117.045814652 1325 1055.6363106765488737 +Q 107 264 305 189 95 493.2569260424 611 466.12744156959723796 +Q 107 266 136 498 272 769.51176003920000002 906 728.14752984036556427 +P 108 1006 144 211 +P 108 810 62 314 +P 108 789 66 310 +P 108 1007 59 316 +P 108 1008 48 319 +P 108 433 71 301 +P 108 1009 79 301 +P 108 1010 83 302 +P 108 1011 262 348 +P 108 1012 268 340 +Q 108 459 172 255 296 739.12698372800000002 868 706.83245448169179781 +Q 108 415 109 386 347 778.21024484960000001 927 739.85295277508544132 +Q 108 429 153 227 186 817.88434304079999998 945 785.71407128194505276 +Q 108 464 220 492 3 1127.97474684 1333 1065.8713477496419273 +Q 108 494 215 344 78 939.40620434399999999 1121 886.55720821260558751 +P 109 1013 88 306 +P 109 1014 93 309 +P 109 1015 98 313 +P 109 1016 103 318 +P 109 1017 144 191 +P 109 1018 272 332 +P 109 1019 274 341 +Q 109 129 16 415 412 649.16861428880000001 788 620.18816192344536375 +Q 109 500 78 302 344 789.00923472320000002 938 745.966824005507533 +Q 109 360 32 255 482 690.6366517216 857 643.25555756122651019 +Q 109 303 183 247 207 708.88434304079999998 836 680.09037395607424514 +Q 109 486 226 370 44 948.50670940720000002 1126 895.25852128818428355 +P 110 622 109 321 +P 110 1020 144 184 +P 110 751 296 474 +P 110 769 293 483 +P 110 1021 286 492 +P 110 1022 277 493 +P 110 1023 271 502 +Q 110 308 102 422 372 684.2569260424 802 653.0764049996414542 +Q 110 291 12 492 216 1009.0041840912 1207 953.20406905502545669 +Q 110 482 228 69 274 801.45793616879999999 911 753.23872076514771834 +Q 110 473 212 12 195 760.45793616879999999 870 714.58259028469558416 +Q 110 500 242 427 10 1001.1046891544 1195 942.05774719587452637 +P 111 1024 117 321 +P 111 1025 144 175 +P 111 1026 287 486 +P 111 1027 300 492 +P 111 1028 300 499 +P 111 1029 301 486 +P 111 1030 304 474 +P 111 1031 308 474 +P 111 1032 311 475 +Q 111 401 70 485 271 930.77878734560000001 1103 877.05761149291981837 +Q 111 313 277 106 288 -1 -1 -1 +Q 111 270 72 410 387 656.41125497599999999 791 622.26336266058353885 +Q 111 395 119 469 435 857.77878734560000001 1020 814.96264449639477334 +Q 111 474 223 490 13 1107.0752519032 1308 1046.4560321755368477 +P 112 1033 126 326 +P 112 1034 144 172 +P 112 1035 153 163 +P 112 1036 315 479 +P 112 202 323 487 +P 112 1037 307 495 +Q 112 198 88 216 429 456.9310242336 553 423.72588848597189326 +Q 112 471 115 419 390 874.55339060000000001 1021 831.66277693930851456 +Q 112 13 457 503 481 522.16652224319999998 562 497.95353057005632991 +Q 112 486 240 410 126 968.56558390959999999 1132 920.10975584398181581 +Q 112 186 34 451 347 694.88434304079999998 822 664.84543444644941701 +P 113 1038 56 21 +P 113 1039 337 396 +P 113 26 331 447 +P 113 43 347 427 +P 113 425 348 440 +P 113 281 352 443 +P 113 1040 333 497 +P 113 517 338 502 +P 113 460 343 503 +P 113 189 375 497 +P 113 1041 333 504 +Q 113 429 59 260 263 754.79603128719999999 903 713.41162608477407048 +Q 113 505 202 199 182 931.2518754104 1090 880.19753257471541019 +Q 113 506 189 397 72 1019.1341264056 1206 961.51598583175848489 +Q 113 134 66 411 366 627.80108191919999999 735 602.69125639380922621 +Q 113 480 217 426 110 1014.9209229696 1193 963.1147093991037309 +P 114 1042 9 0 +P 114 1043 12 8 +P 114 1044 337 389 +P 114 1045 497 490 +P 114 1046 488 495 +P 114 1047 487 500 +Q 114 509 47 485 277 1040.6488450312 1224 981.34526555970910522 +Q 114 304 23 472 287 930.54833996800000001 1118 878.5363354472027595 +Q 114 286 243 158 47 -1 -1 -1 +Q 114 487 1 482 199 1138.5189027168 1333 1077.4319102602369185 +Q 114 311 186 248 242 671.05591591600000001 797 641.5844693058941175 +P 115 265 17 17 +P 115 1048 27 7 +P 115 1049 38 34 +P 115 1050 65 41 +P 115 24 165 73 +P 115 384 237 265 +P 115 321 337 380 +P 115 1051 344 268 +P 115 156 352 267 +P 115 1052 357 261 +P 115 1053 358 380 +P 115 182 363 330 +P 115 1054 337 382 +P 115 1055 477 478 +P 115 1056 484 500 +Q 115 488 9 492 216 1114.761543404 1311 1053.0565587855760441 +Q 115 511 21 475 280 1056.3178925904 1259 995.87803702680980678 +Q 115 472 264 466 75 1010.2346314688 1193 955.02817304193877135 +Q 115 370 105 504 245 939.6366517216 1106 890.30504330463259066 +Q 115 342 282 381 402 -1 -1 -1 +P 116 238 169 72 +P 116 1057 179 70 +P 116 1058 296 43 +P 116 202 304 43 +P 116 982 345 302 +P 116 211 351 302 +P 116 249 357 327 +P 116 1059 359 257 +P 116 1060 362 268 +P 116 1061 358 302 +Q 116 476 213 395 152 972.18080759839999999 1128 929.40292514301916071 +Q 116 325 259 351 18 -1 -1 -1 +Q 116 449 83 510 439 960.477272156 1145 907.97488642959081062 +Q 116 298 121 421 438 714.1391770376 860 671.60584645887888655 +Q 116 468 49 500 236 1038.5777772192 1219 980.39791322268661133 +P 117 202 121 311 +P 117 1062 171 62 +P 117 1063 179 62 +P 117 1064 183 62 +P 117 301 259 99 +P 117 96 266 98 +P 117 1065 270 68 +P 117 1066 287 49 +P 117 1067 277 65 +P 117 1068 283 58 +P 117 249 311 336 +P 117 1069 321 319 +P 117 982 333 314 +P 117 982 339 308 +P 117 1070 348 245 +P 117 1071 359 245 +P 117 1072 368 260 +P 117 1073 352 328 +Q 117 487 205 199 178 916.79603128719999999 1065 867.97349579930380514 +Q 117 460 219 370 142 956.6366517216 1123 910.84628389410966065 +Q 117 470 227 193 161 905.28131266160000001 1057 858.33662224384295314 +Q 117 417 54 233 244 762.96760416240000002 910 724.51335886334641145 +Q 117 353 271 288 492 -1 -1 -1 +P 118 1074 30 113 +P 118 1075 38 113 +P 118 1076 42 126 +P 118 1077 90 363 +P 118 1078 87 373 +P 118 1079 121 319 +P 118 1080 125 323 +P 118 1081 308 385 +P 118 375 307 389 +P 118 534 319 394 +P 118 1082 327 394 +P 118 1083 335 398 +P 118 249 363 416 +P 118 657 410 171 +P 118 1084 478 162 +P 118 1085 450 374 +P 118 1086 455 374 +P 118 1087 468 408 +P 118 1088 457 419 +Q 118 498 260 56 102 712.6417023536 838 676.17683050835353242 +Q 118 332 272 436 483 -1 -1 -1 +Q 118 451 113 370 346 796.96760416240000002 944 756.52603351304526313 +Q 118 395 28 300 379 672.8670990992 824 633.56299927223358281 +Q 118 285 18 490 204 1023.690475592 1217 969.397900093817384 +P 119 150 2 354 +P 119 177 15 354 +P 119 1089 27 355 +P 119 392 2 367 +P 119 626 19 371 +P 119 1090 14 375 +P 119 1091 29 357 +P 119 1092 55 122 +P 119 1093 47 134 +P 119 1094 229 469 +P 119 1095 237 465 +P 119 1096 408 317 +P 119 1097 406 322 +P 119 1098 403 327 +Q 119 482 128 503 237 1039.7371567848 1202 989.67641753077089106 +Q 119 498 213 305 190 932.60721447039999998 1106 884.60611779760972695 +Q 119 128 55 505 26 429.94826817520000001 502 403.16201242708234531 +Q 119 361 67 406 493 781.73210615280000002 985 736.99165414419917397 +Q 119 452 154 301 354 713.6417023536 839 684.02097418136543183 +P 120 1099 57 134 +P 120 1100 57 140 +P 120 1101 48 143 +P 120 1102 48 147 +P 120 1103 74 151 +P 120 1104 62 153 +P 120 1105 12 380 +P 120 186 24 380 +P 120 1106 31 360 +P 120 1107 34 367 +P 120 1108 411 311 +P 120 1109 13 383 +P 120 281 224 448 +P 120 384 230 444 +Q 120 315 22 274 476 711.60721447039999998 885 666.07958971809614468 +Q 120 283 16 472 228 1009.5899705288 1207 955.4683366230970023 +Q 120 474 270 476 71 1011.7493500944 1191 958.39313581742362658 +Q 120 495 12 464 278 1064.6610383408 1265 1002.0591821349761403 +Q 120 332 279 444 340 -1 -1 -1 +P 121 1110 89 116 +P 121 536 141 103 +P 121 1111 143 108 +P 121 206 151 110 +P 121 43 175 103 +P 121 1112 68 129 +P 121 1113 90 121 +P 121 1114 64 130 +P 121 425 84 134 +P 121 1115 221 132 +P 121 1116 465 83 +P 121 1117 476 92 +P 121 249 482 88 +P 121 82 485 83 +P 121 1118 261 196 +P 121 637 269 192 +P 121 1119 273 178 +P 121 634 125 325 +Q 121 479 239 292 12 990.69047559200000003 1184 935.32448576917443006 +Q 121 474 221 284 262 958.15137034719999998 1121 906.63993550700911328 +Q 121 502 206 189 178 929.66608897280000001 1089 879.60953092046963775 +Q 121 464 212 298 261 976.0924958448 1153 923.34972712467288147 +Q 121 463 225 321 279 997.477272156 1182 941.971579026389918 +P 122 1120 197 96 +P 122 1121 180 103 +P 122 1122 259 65 +P 122 285 273 67 +P 122 1123 276 56 +P 122 433 280 56 +P 122 1124 183 111 +P 122 1111 194 136 +P 122 1125 150 146 +P 122 1126 167 141 +P 122 1127 184 138 +P 122 1128 176 140 +P 122 1129 132 161 +P 122 1130 99 433 +P 122 1131 106 429 +P 122 1132 98 440 +P 122 1133 120 301 +P 122 1134 113 426 +P 122 43 121 320 +P 122 1135 121 425 +Q 122 355 252 487 212 1046.8914857184 1232 990.58757218618177376 +Q 122 478 218 316 289 999.7493500944 1179 943.93396656082779828 +Q 122 484 231 329 291 991.64884503119999998 1175 937.08953914073367741 +Q 122 344 330 505 308 -1 -1 -1 +Q 122 483 240 300 281 964.56558390959999999 1128 909.91393142550361972 +P 123 1136 102 176 +P 123 1137 132 173 +P 123 1138 134 175 +P 123 1139 312 29 +P 123 1140 293 35 +P 123 1141 289 38 +P 123 1142 282 42 +P 123 1143 277 49 +P 123 264 298 42 +P 123 376 369 247 +P 123 1144 370 264 +Q 123 477 238 347 271 997.7493500944 1177 943.29823427548046766 +Q 123 469 214 292 284 992.53614665839999998 1163 938.56324245210373647 +Q 123 359 248 500 213 1052.4478349048 1244 996.35057056342543547 +Q 123 495 206 339 288 1021.2762620296 1214 966.50503764257496186 +Q 123 492 181 319 289 1037.1635636568 1217 980.09833398970135931 +P 124 354 179 300 +P 124 321 274 201 +P 124 1145 276 176 +P 124 1146 320 24 +P 124 89 340 29 +P 124 1147 358 14 +P 124 470 362 18 +P 124 1148 374 18 +P 124 1149 375 23 +P 124 471 373 28 +P 124 1150 279 173 +P 124 1151 282 163 +P 124 1152 285 163 +P 124 1153 285 200 +P 124 1154 288 205 +P 124 1155 290 215 +P 124 1156 314 243 +P 124 1156 318 247 +Q 124 362 319 151 232 -1 -1 -1 +Q 124 455 274 324 287 962.89148571840000002 1148 905.91251738719734021 +Q 124 500 184 329 252 1017.5067094072 1195 959.63411604066561722 +Q 124 503 215 341 250 1002.6782822824 1179 946.57220534550094726 +Q 124 503 212 489 4 1129.903679028 1332 1067.5364871653509908 +P 125 1157 284 144 +P 125 1158 290 163 +P 125 1159 430 251 +P 125 1160 442 251 +P 125 1161 438 258 +P 125 1162 433 265 +Q 125 502 214 283 273 979.15137034719999998 1142 925.81832248765124405 +Q 125 498 185 283 265 996.73715678480000002 1159 942.02985664697462198 +Q 125 469 219 195 160 909.18080759839999999 1065 863.58959806420602945 +Q 125 481 204 345 287 1027.2051942176 1217 971.26572020286073439 +Q 125 480 223 336 255 983.43564159520000001 1158 927.93559013533820234 +P 126 1163 328 130 +P 126 1164 324 135 +P 126 1165 324 140 +P 126 1166 293 142 +P 126 1167 309 145 +P 126 1168 418 130 +P 126 1169 435 304 +P 126 1170 478 111 +P 126 1171 488 108 +P 126 719 491 124 +P 126 1172 458 130 +P 126 1173 458 133 +P 126 1174 458 135 +Q 126 450 268 310 252 931.33513653199999999 1110 877.09124767089929264 +Q 126 480 196 498 13 1134.903679028 1337 1071.9325666767588245 +Q 126 449 257 353 269 995.5189027168 1190 939.14355642099644683 +Q 126 465 223 284 271 972.979797472 1137 920.35624570799450339 +Q 126 469 267 317 273 937.23463146880000002 1120 884.10186701010172783 +P 127 1175 226 30 +P 127 1176 205 174 +P 127 1177 283 147 +P 127 1178 151 395 +P 127 1179 153 424 +P 127 1180 157 400 +P 127 1181 329 79 +P 127 1182 362 154 +P 127 1183 428 43 +P 127 1184 400 48 +P 127 1185 400 51 +P 127 470 412 131 +P 127 316 412 135 +P 127 1186 416 137 +Q 127 469 232 318 277 985.33513653199999999 1164 929.3885395475315363 +Q 127 491 206 336 274 1010.8204179064 1193 955.87267125076584762 +Q 127 511 207 360 273 1044.61940778 1235 989.18429044040067311 +Q 127 452 221 302 262 985.26406871999999998 1161 929.14374513381778797 +Q 127 488 203 459 92 1067.9625535304 1254 1008.3440919361549959 +P 128 1187 230 49 +P 128 1188 244 31 +P 128 1189 246 33 +P 128 373 239 46 +P 128 1190 206 185 +P 128 1191 226 174 +P 128 1192 226 180 +P 128 1193 222 183 +P 128 1194 207 186 +P 128 1195 217 186 +P 128 731 322 61 +P 128 1196 312 63 +P 128 1197 344 77 +P 128 1198 350 74 +Q 128 177 72 54 480 572.06096654800000001 657 535.92681699922388816 +Q 128 506 236 102 268 801.81327522880000003 926 751.34203242163482628 +Q 128 479 223 103 260 815.39906166640000001 939 764.41788874510814367 +Q 128 363 142 69 465 572.11984105039999998 643 542.11606038932643514 +Q 128 450 224 80 233 805.70057685600000003 917 752.95551608456241865 +P 129 546 239 61 +P 129 1199 259 46 +P 129 847 259 103 +P 129 95 219 198 +P 129 1040 236 174 +P 129 376 226 202 +P 129 1200 250 224 +P 129 1201 293 77 +P 129 1202 303 70 +P 129 1203 308 66 +P 129 177 314 66 +P 129 249 314 73 +P 129 1204 356 71 +P 129 1205 362 66 +P 129 1206 374 69 +P 129 1207 374 81 +P 129 1208 379 87 +P 129 817 386 83 +P 129 470 391 86 +P 129 1209 401 171 +Q 129 409 362 417 494 135.3137084992 140 132.44238290072931363 +Q 129 484 198 100 264 836.984848104 960 787.39246934065488404 +Q 129 199 17 199 18 1 1 1 +Q 129 258 397 41 499 259.24978336479999999 319 245.72515831918238405 +Q 129 85 43 327 394 501.45793616879999999 611 475.31067398195233409 +P 130 1210 26 92 +P 130 267 26 151 +P 130 1211 20 183 +P 130 1212 30 92 +P 130 1213 30 102 +P 130 1214 74 46 +P 130 1215 403 175 +P 130 238 432 181 +P 130 1216 262 287 +P 130 858 358 446 +P 130 1217 359 452 +P 130 636 497 364 +Q 130 394 8 131 479 635.22748879119999998 760 604.22319982580211217 +Q 130 217 342 441 89 499.492424052 561 469.58492822923767562 +Q 130 288 364 486 70 523.40411229840000001 606 486.64193231170344234 +Q 130 311 92 494 449 595.1442276696 700 554.51527653378911964 +Q 130 366 311 448 121 -1 -1 -1 +P 131 1218 361 172 +P 131 1219 371 172 +P 131 1220 376 172 +P 131 1221 425 276 +P 131 1222 448 362 +P 131 1223 449 368 +Q 131 345 330 126 203 -1 -1 -1 +Q 131 356 331 79 439 -1 -1 -1 +Q 131 471 281 481 116 769.17366492080000001 867 719.05493839706969084 +Q 131 410 352 331 139 462.69343417839999999 516 435.62650637364873774 +Q 131 485 222 91 246 796.11479041839999998 908 745.83908330453959934 +P 132 1224 352 176 +P 132 1225 358 173 +P 132 392 361 193 +P 132 1226 421 288 +P 132 1227 419 297 +P 132 1228 417 301 +P 132 871 488 364 +Q 132 427 289 270 202 469.80613255119999999 536 439.93535590357669207 +Q 132 400 10 338 422 564.984848104 688 532.1319269303882038 +Q 132 511 207 91 258 810.21024484960000001 959 756.67731822557766463 +Q 132 431 171 95 403 574.93607486559999997 630 544.1495382542346988 +Q 132 311 72 247 441 423.994949368 465 407.03286922178148188 +P 133 1229 339 189 +P 133 1230 345 182 +P 133 1231 340 198 +P 133 1232 341 206 +P 133 1233 403 295 +P 133 1234 408 289 +P 133 1235 413 288 +P 133 1236 413 305 +P 133 1237 416 314 +P 133 1238 424 306 +P 133 1239 471 364 +Q 133 21 465 360 345 392.01933598719999999 459 367.64288943336771354 +Q 133 243 74 97 379 417.73506473920000001 481 391.11291575564177947 +Q 133 455 220 82 264 800.79603128719999999 949 746.91609669611648314 +Q 133 470 331 209 90 535.2619766744 612 507.11786876082828712 +Q 133 502 78 196 120 331.53910524479999999 362 317.11970765302771724 +P 134 889 8 162 +P 134 1240 235 0 +P 134 1241 335 236 +P 134 1242 346 232 +P 134 974 351 226 +P 134 1243 209 310 +P 134 1244 286 352 +P 134 1245 335 240 +P 134 1246 391 322 +P 134 40 402 333 +P 134 1247 416 323 +P 134 1248 469 369 +P 134 995 392 374 +P 134 1111 458 373 +P 134 1249 451 472 +Q 134 235 217 53 60 326.7645019904 383 311.6035122029297213 +Q 134 205 101 435 419 508.8183258608 592 475.70612785648927456 +Q 134 365 324 383 357 -1 -1 -1 +Q 134 169 371 366 41 494.42135623999999999 553 473.35017777760128865 +Q 134 376 98 478 441 629.55844123200000001 735 586.50957193055376138 +P 135 82 62 160 +P 135 532 56 204 +P 135 96 77 157 +P 135 1250 81 153 +P 135 1251 87 179 +P 135 1252 88 183 +P 135 1253 89 187 +P 135 1254 209 324 +P 135 1021 238 11 +P 135 1255 252 1 +P 135 1256 239 12 +P 135 1257 241 14 +P 135 1258 244 17 +P 135 1259 212 321 +P 135 1260 312 380 +P 135 1261 318 381 +P 135 1262 324 383 +P 135 1263 330 388 +P 135 1264 364 416 +Q 135 313 82 424 133 196.0243866192 230 182.36773991040652731 +Q 135 391 11 322 442 561.91378029199999999 682 528.57267698047007798 +Q 135 480 194 98 260 811.45288553679999999 962 759.87076237315716298 +Q 135 371 190 448 482 647.38181772479999998 795 605.64756810264759679 +Q 135 250 279 109 64 371.50461736160000001 450 348.41748895865379154 +P 136 1265 25 40 +P 136 1266 27 51 +P 136 1267 60 161 +P 136 1268 56 201 +P 136 568 43 441 +P 136 1269 43 449 +P 136 1270 64 160 +P 136 1271 64 200 +P 136 1272 68 198 +P 136 1273 73 158 +P 136 1274 73 193 +P 136 1275 77 157 +P 136 153 102 178 +P 136 222 318 380 +P 136 1276 327 382 +P 136 1277 382 22 +Q 136 270 410 351 33 458.67619023680000001 536 433.20699782667890076 +Q 136 438 90 432 493 671.58282785120000002 811 628.56553705660689957 +Q 136 338 316 311 190 -1 -1 -1 +Q 136 33 161 291 415 423.8721497312 534 403.67961154099782561 +Q 136 215 119 72 501 518.989898736 601 485.08682215255430492 +P 137 13 37 43 +P 137 1278 30 63 +P 137 1279 118 36 +P 137 1280 124 40 +P 137 1281 121 42 +P 137 89 168 59 +P 137 57 166 410 +P 137 1282 177 56 +P 137 376 226 228 +P 137 470 226 278 +P 137 616 263 102 +P 137 1283 266 99 +P 137 1284 280 95 +P 137 1053 293 86 +P 137 1285 305 80 +P 137 1286 313 72 +P 137 1287 381 37 +P 137 202 495 216 +P 137 1288 508 199 +P 137 1289 503 212 +P 137 1290 495 224 +P 137 1291 495 226 +P 137 1292 495 230 +P 137 392 476 239 +P 137 1293 487 236 +P 137 1294 476 242 +Q 137 175 86 489 241 864.0924958448 1041 816.9015659930549873 +Q 137 446 88 81 449 660.61731573439999998 752 623.73648614361536602 +Q 137 480 208 161 54 863.60721447039999998 1037 816.74105296837819878 +Q 137 393 262 55 1 -1 -1 -1 +Q 137 497 212 168 63 873.57777721920000003 1054 826.0819916585263627 +P 138 1295 2 382 +P 138 1296 2 391 +P 138 1297 8 395 +P 138 517 19 424 +P 138 425 162 406 +P 138 626 168 413 +P 138 1298 287 285 +Q 138 495 226 168 59 858.84985515760000002 1034 811.72454572503249892 +Q 138 452 224 172 77 897.30569928079999997 1083 847.39091091533521194 +Q 138 506 194 159 58 886.57777721920000003 1067 837.47888070227418211 +Q 138 472 22 434 449 716.35238047360000002 871 675.20748389247467003 +Q 138 446 6 356 409 614.71277016560000001 743 574.75720526720920134 +P 139 1299 174 173 +P 139 1300 181 177 +P 139 1301 285 196 +P 139 384 393 197 +P 139 126 500 119 +P 139 176 287 283 +P 139 249 302 284 +P 139 369 393 203 +P 139 1302 12 346 +P 139 1303 153 431 +P 139 751 246 470 +P 139 1304 234 482 +P 139 1305 304 325 +P 139 1306 299 331 +Q 139 153 62 499 238 833.39401103440000002 998 788.61931197439434982 +Q 139 480 224 95 270 786.69552622400000003 939 735.87398550939929009 +Q 139 324 336 117 490 -1 -1 -1 +Q 139 471 228 105 266 793.5950211608 950 742.94702964800103473 +Q 139 485 194 159 55 875.70771953360000001 1045 829.93746037309870189 +P 140 1307 175 188 +P 140 1308 189 182 +P 140 1309 180 193 +P 140 249 186 199 +P 140 153 209 200 +P 140 1310 212 454 +P 140 669 218 452 +P 140 1311 241 461 +P 140 1312 242 465 +P 140 1313 225 477 +P 140 1314 229 478 +P 140 1315 388 187 +P 140 1316 390 197 +P 140 898 468 108 +P 140 1317 499 108 +P 140 148 504 113 +P 140 1318 495 124 +Q 140 482 193 156 53 874.70771953360000001 1044 828.20885064443132251 +Q 140 429 386 326 19 571.20310217200000003 662 547.90118989034306196 +Q 140 344 320 337 157 -1 -1 -1 +Q 140 178 87 500 184 930.96255353040000002 1119 878.91665147535616143 +Q 140 459 59 105 490 678.8721497312 789 637.31747786700998404 +P 141 1319 65 99 +P 141 1320 77 98 +P 141 1321 130 53 +P 141 186 150 393 +P 141 433 173 416 +P 141 1322 181 418 +P 141 1323 186 429 +P 141 1324 190 422 +P 141 721 193 438 +P 141 249 211 458 +P 141 374 307 24 +P 141 467 315 24 +P 141 517 366 77 +P 141 517 401 66 +P 141 1325 464 103 +Q 141 178 88 481 234 873.93311627920000001 1061 822.85361014079671804 +Q 141 470 235 82 265 775.89653635040000001 920 723.45747173290760657 +Q 141 259 256 1 198 443.11984105040000001 514 413.55282424594003032 +Q 141 295 352 75 35 474.1442276696 579 451.37786955915061071 +Q 141 470 77 18 456 684.45288553679999999 835 653.06045359545203155 +P 142 1326 101 57 +P 142 1327 109 59 +P 142 390 90 67 +P 142 1328 90 72 +P 142 1329 118 60 +P 142 1330 124 54 +P 142 86 121 65 +P 142 1331 123 74 +P 142 1332 132 70 +P 142 1333 321 210 +P 142 1334 317 215 +P 142 1335 317 221 +P 142 1336 395 436 +Q 142 464 215 165 79 888.07525190320000003 1081 839.32214370729127495 +Q 142 480 200 86 262 798.96760416240000002 946 747.0798344230378234 +Q 142 178 69 508 208 892.76154340399999998 1081 842.93667780261796452 +Q 142 498 218 99 268 796.5950211608 953 746.32089967621209325 +Q 142 492 184 90 275 829.62445841200000002 979 775.63603005146603664 +P 143 1337 69 37 +P 143 451 72 47 +P 143 1338 88 70 +P 143 1339 101 54 +P 143 1340 85 365 +P 143 346 137 382 +P 143 321 148 393 +P 143 24 226 13 +P 143 1341 337 302 +P 143 249 336 381 +P 143 1342 345 301 +P 143 26 366 416 +P 143 40 385 40 +P 143 1343 372 417 +P 143 256 378 423 +P 143 82 383 428 +P 143 1344 394 30 +P 143 1345 390 42 +P 143 1346 392 48 +P 143 1347 484 360 +Q 143 300 146 474 473 532.97265479440000002 639 498.59054495618721603 +Q 143 503 201 97 257 807.93816691120000001 962 754.49345307240878356 +Q 143 167 56 502 203 906.54833996800000001 1094 857.96611184218693325 +Q 143 110 41 500 429 756.82546853840000001 898 715.90011877868005286 +Q 143 176 77 493 222 909.1341264056 1096 856.80561609143194346 +P 144 43 80 229 +P 144 1348 85 229 +P 144 1349 129 402 +P 144 1349 133 406 +P 144 265 137 410 +P 144 1350 144 415 +P 144 1351 167 439 +P 144 143 169 451 +P 144 281 175 453 +P 144 1352 223 13 +P 144 418 225 21 +P 144 249 225 25 +P 144 1353 226 28 +P 144 384 211 334 +P 144 1354 319 310 +P 144 1355 328 304 +P 144 1356 398 381 +P 144 1357 398 386 +P 144 238 480 363 +P 144 1358 459 375 +P 144 1359 460 380 +P 144 265 482 380 +P 144 1360 471 410 +Q 144 473 332 343 19 628.48737342 731 597.90926610803853691 +Q 144 509 188 123 68 886.5899705288 1084 836.30798942470778456 +Q 144 171 64 500 236 872.92092296959999997 1051 826.42444596804853063 +Q 144 508 204 161 18 898.37676709279999998 1087 848.97282535239151002 +Q 144 511 187 168 30 918.64884503119999998 1102 870.36558338269082924 +P 145 616 14 36 +P 145 249 13 221 +P 145 1361 9 229 +P 145 1362 27 34 +P 145 1363 97 173 +P 145 1364 414 209 +P 145 1365 433 195 +P 145 1366 217 335 +P 145 1367 221 339 +P 145 1368 401 403 +P 145 1369 406 408 +P 145 1370 468 398 +P 145 1371 24 440 +P 145 1372 38 440 +P 145 82 49 440 +P 145 1373 36 450 +P 145 1374 84 440 +P 145 158 234 491 +P 145 1375 410 416 +Q 145 176 59 492 223 892.06305859359999999 1076 844.43844300905300315 +Q 145 168 58 483 224 882.57777721920000003 1063 835.59334926317364989 +Q 145 501 190 96 256 819.62445841200000002 969 766.37478793335833416 +Q 145 180 86 478 223 918.61940778000000002 1109 865.36393069889186336 +Q 145 462 213 164 47 891.96255353040000002 1080 845.70692057851636037 +P 146 1376 184 468 +P 146 376 191 469 +P 146 57 195 473 +P 146 238 199 475 +P 146 974 208 458 +P 146 213 219 481 +P 146 1377 226 483 +P 146 1378 347 280 +P 146 1379 460 294 +P 146 1380 456 302 +P 146 1381 452 481 +P 146 536 475 501 +P 146 1382 465 506 +Q 146 338 305 380 73 -1 -1 -1 +Q 146 167 78 480 200 929.89148571840000002 1115 876.41687520089385544 +Q 146 178 76 461 229 917.03362134239999998 1108 865.11813807209205152 +Q 146 474 211 132 70 868.8620484672 1061 819.73373718668892707 +Q 146 486 215 170 43 884.3645737832 1056 838.28601720040671808 +P 147 998 3 489 +P 147 1383 9 491 +P 147 1384 18 489 +P 147 615 15 494 +P 147 1385 15 500 +P 147 1386 19 510 +P 147 534 111 3 +P 147 1387 119 3 +P 147 1388 285 189 +P 147 1389 300 167 +P 147 211 321 288 +P 147 1390 338 188 +P 147 1391 358 216 +P 147 1392 367 211 +P 147 1393 421 138 +P 147 1394 421 142 +P 147 1395 491 127 +P 147 772 505 111 +P 147 1396 503 132 +Q 147 177 92 491 216 929.1341264056 1116 875.08703707948620831 +Q 147 480 242 94 267 772.89653635040000001 917 724.34676740066458933 +Q 147 156 63 485 216 886.7493500944 1062 836.05946392088799257 +Q 147 491 185 158 27 903.60721447039999998 1077 856.38837858606848386 +Q 147 476 236 130 69 844.1341264056 1031 796.97063192274617904 +P 148 1397 113 44 +P 148 1398 118 49 +P 148 1399 163 188 +P 148 1400 168 188 +P 148 1401 184 34 +P 148 392 191 34 +P 148 1402 189 53 +P 148 721 194 34 +P 148 87 199 38 +P 148 517 194 56 +P 148 1403 199 174 +P 148 1404 24 484 +P 148 1405 60 483 +P 148 1406 44 503 +P 148 1407 42 506 +P 148 1408 58 499 +P 148 1409 127 478 +P 148 626 131 460 +P 148 1410 333 239 +P 148 209 318 246 +P 148 1411 343 244 +P 148 1412 357 225 +P 148 1413 453 470 +Q 148 457 230 81 249 778.65389566319999998 921 728.44108646917334227 +Q 148 178 66 503 255 867.0924958448 1044 821.25399705765801173 +Q 148 507 191 162 38 906.99199078159999998 1088 858.86237965824159346 +Q 148 444 223 89 265 812.69552622400000003 965 760.20144340922979609 +Q 148 162 58 465 267 809.49451609759999998 970 766.1653305267785754 +P 149 1414 205 42 +P 149 1415 375 0 +P 149 1416 189 58 +P 149 626 198 61 +P 149 1206 196 70 +P 149 1417 203 60 +P 149 487 217 55 +P 149 1418 196 82 +P 149 1419 199 95 +P 149 1420 333 97 +P 149 1421 333 103 +P 149 1409 419 102 +P 149 1422 508 225 +P 149 207 133 453 +P 149 1423 144 443 +P 149 1424 141 452 +P 149 209 302 506 +P 149 1425 460 381 +P 149 1426 482 376 +Q 149 486 188 103 264 825.72496347519999998 971 776.31751600778648026 +Q 149 479 247 146 64 852.16356365680000001 1032 806.11796718220602997 +Q 149 481 222 90 264 783.1391770376 929 733.66569810661542306 +Q 149 351 314 174 110 -1 -1 -1 +Q 149 501 198 84 274 818.79603128719999999 967 764.65078645959692949 +P 150 1427 313 6 +P 150 1428 300 24 +P 150 1429 363 0 +P 150 1430 357 7 +P 150 1431 379 11 +P 150 1432 427 182 +P 150 1433 435 182 +P 150 1434 443 185 +P 150 1435 451 188 +Q 150 511 213 167 30 897.50670940720000002 1075 849.83756829883611772 +Q 150 361 311 163 340 -1 -1 -1 +Q 150 173 66 482 242 878.57777721920000003 1059 831.36384131839588463 +Q 150 179 75 499 287 863.35238047360000002 1018 817.24551975416227378 +Q 150 495 198 91 256 804.1391770376 950 752.94075299398809875 +P 151 96 48 171 +P 151 562 51 180 +P 151 1436 56 186 +P 151 384 163 182 +P 151 1437 163 202 +P 151 1438 163 222 +P 151 433 200 182 +P 151 1439 267 99 +P 151 1440 263 104 +P 151 924 296 32 +P 151 105 477 18 +P 151 1441 494 2 +P 151 26 323 61 +P 151 1053 295 86 +P 151 1442 303 82 +P 151 810 280 96 +P 151 1443 421 104 +P 151 265 434 112 +P 151 1444 466 94 +P 151 1445 465 99 +P 151 1446 485 249 +P 151 471 497 274 +P 151 1447 483 295 +P 151 1448 491 296 +P 151 1449 495 302 +Q 151 176 66 470 227 888.71991284319999999 1075 842.40443158438040427 +Q 151 328 329 82 48 -1 -1 -1 +Q 151 492 217 164 26 870.87929240879999998 1039 824.22401089934760421 +Q 151 174 55 479 209 894.67828228239999999 1071 846.56744578436553184 +Q 151 166 84 475 225 905.82041790640000001 1088 854.19944854773700627 +P 152 1450 61 111 +P 152 1451 68 111 +P 152 1452 75 111 +P 152 1453 77 111 +P 152 1454 86 107 +P 152 143 163 170 +P 152 1455 114 298 +P 152 1456 169 247 +P 152 1457 263 108 +P 152 1458 266 110 +P 152 1459 268 121 +P 152 1460 416 103 +P 152 1461 413 106 +P 152 238 394 173 +P 152 1462 394 185 +Q 152 174 71 390 313 784.62445841200000002 934 741.02135906124158282 +Q 152 134 73 474 312 799.03867197439999998 949 754.73349937628927364 +Q 152 492 187 118 63 868.40620434399999999 1050 820.52334711803439404 +Q 152 171 45 499 236 860.53614665839999998 1031 814.2536650208944593 +Q 152 467 230 158 47 860.50670940720000002 1038 815.86554056523493728 +P 153 1463 369 82 +P 153 1464 362 88 +P 153 1465 268 99 +P 153 1466 263 103 +P 153 1467 360 95 +P 153 1468 151 148 +P 153 1469 305 136 +P 153 1470 294 140 +P 153 321 292 142 +P 153 1471 322 131 +P 153 376 323 135 +P 153 1472 314 239 +P 153 1473 324 234 +P 153 1474 329 231 +P 153 321 372 209 +P 153 1475 357 231 +P 153 1476 361 230 +P 153 1477 209 329 +P 153 1478 481 411 +P 153 1479 485 399 +P 153 128 490 399 +Q 153 498 401 117 29 792.69552622400000003 945 752.34801424691170268 +Q 153 487 287 148 32 804.18080759839999999 950 761.88405766775815664 +Q 153 320 318 190 187 -1 -1 -1 +Q 153 499 297 143 35 796.34018716399999999 934 756.6509419937506209 +Q 153 166 73 477 228 892.7493500944 1072 842.39044903216358762 +P 154 1480 0 213 +P 154 1481 5 207 +P 154 1482 11 205 +P 154 384 16 211 +P 154 1483 11 235 +P 154 1484 143 174 +P 154 1485 163 166 +P 154 95 248 454 +P 154 477 245 458 +P 154 477 247 462 +P 154 95 251 466 +P 154 249 347 481 +P 154 1486 457 422 +P 154 1487 477 413 +P 154 1488 481 442 +Q 154 464 217 95 267 835.20519421760000001 1025 787.91030575932722968 +Q 154 467 234 159 58 870.26406871999999998 1046 823.35471265348360248 +Q 154 160 67 463 220 891.41839765359999997 1074 841.14663340443451034 +Q 154 170 72 499 208 909.99199078159999998 1091 858.58510590492790016 +Q 154 167 77 488 212 907.67828228239999999 1084 857.25867092080397924 +P 155 1489 188 64 +P 155 1490 192 67 +P 155 1491 316 233 +P 155 1492 357 235 +P 155 1493 110 296 +P 155 1494 108 308 +P 155 357 114 313 +P 155 1495 105 314 +P 155 1496 288 328 +P 155 1497 114 410 +P 155 1498 120 405 +P 155 810 150 446 +P 155 1499 138 457 +P 155 189 348 481 +P 155 267 383 498 +P 155 89 424 491 +P 155 89 432 495 +P 155 634 438 508 +P 155 89 440 499 +P 155 437 440 508 +P 155 329 457 508 +P 155 392 488 506 +Q 155 163 63 487 258 840.05086528400000001 1007 793.57650260268587772 +Q 155 450 225 128 60 861.10468915439999998 1055 812.82390868954485086 +Q 155 363 302 78 150 -1 -1 -1 +Q 155 170 69 494 289 854.5239533488 1008 806.72808369757206037 +Q 155 348 319 262 70 -1 -1 -1 +P 156 1500 37 0 +P 156 209 37 4 +P 156 1501 191 79 +P 156 95 142 466 +P 156 1502 150 469 +P 156 376 267 508 +P 156 1409 312 82 +P 156 460 301 511 +P 156 1503 323 77 +P 156 267 362 331 +P 156 1504 358 381 +P 156 1505 358 387 +P 156 321 381 406 +P 156 1248 421 326 +P 156 321 433 308 +P 156 321 439 302 +P 156 1506 441 297 +P 156 1507 446 280 +P 156 1508 451 280 +P 156 1509 459 277 +P 156 1510 477 88 +P 156 1511 488 84 +P 156 1512 493 80 +P 156 1513 496 167 +Q 156 171 58 481 226 870.40620434399999999 1052 827.58876957972279342 +Q 156 505 168 154 43 912.7493500944 1092 866.12534557932792723 +Q 156 476 230 70 254 789.19300090800000003 962 746.12745403217593321 +Q 156 482 213 163 50 871.67828228239999999 1048 828.72995899827299127 +Q 156 179 78 475 210 912.20519421760000001 1102 864.30649075163546513 +P 157 1514 56 25 +P 157 1515 61 29 +P 157 1323 368 241 +P 157 1516 372 245 +P 157 1189 401 263 +P 157 1517 382 265 +P 157 1518 383 268 +P 157 1519 388 274 +P 157 1520 394 280 +P 157 1521 492 171 +P 157 1522 489 177 +Q 157 134 65 478 247 856.20519421760000001 1046 810.35097792729993671 +Q 157 165 33 501 206 905.30569928079999997 1091 857.42660253291933259 +Q 157 171 73 477 207 933.17575696639999999 1130 880.38780060053272791 +Q 157 168 34 489 192 917.7493500944 1097 870.65838240259427039 +Q 157 459 230 125 56 878.14631971519999998 1082 830.56560036893381493 +P 158 1276 202 38 +P 158 1523 228 75 +P 158 1524 350 243 +P 158 43 343 247 +P 158 1525 361 237 +P 158 1526 370 165 +P 158 1527 379 165 +P 158 1528 386 171 +P 158 1529 409 223 +P 158 1530 416 221 +P 158 1531 479 249 +P 158 1532 478 258 +P 158 1533 471 263 +P 158 400 214 487 +P 158 1534 214 492 +P 158 1535 471 268 +Q 158 464 235 131 61 871.44783490479999999 1063 822.93974184736225652 +Q 158 488 182 169 32 926.77878734560000001 1099 881.51826902057621282 +Q 158 489 204 64 262 821.22243815919999999 987 778.11113693693414461 +Q 158 159 54 487 232 880.16356365680000001 1060 831.8560547416591362 +Q 158 505 221 164 17 893.12193309600000002 1063 848.78317910730447693 +P 159 487 195 98 +P 159 1536 157 443 +P 159 183 163 441 +P 159 354 181 472 +P 159 616 196 476 +P 159 1537 188 479 +P 159 1538 197 475 +P 159 1539 205 488 +P 159 1540 398 226 +P 159 1541 401 225 +P 159 1542 404 224 +P 159 1543 410 232 +P 159 1544 410 238 +Q 159 171 87 490 221 930.37676709279999998 1119 879.59842681294310296 +Q 159 364 308 38 307 -1 -1 -1 +Q 159 479 210 94 266 826.67828228239999999 1003 784.44072036382601709 +Q 159 342 333 243 252 -1 -1 -1 +Q 159 505 157 93 272 892.71991284319999999 1079 844.21536910438499035 +P 160 1545 65 34 +P 160 1546 67 56 +P 160 1547 72 292 +P 160 1548 79 290 +P 160 1549 65 319 +P 160 1550 99 309 +P 160 1551 104 306 +P 160 1552 107 303 +P 160 1553 336 252 +P 160 1554 358 280 +P 160 1555 362 277 +P 160 1074 366 274 +P 160 1556 39 431 +P 160 568 47 430 +P 160 1557 48 430 +P 160 1558 52 437 +P 160 1559 82 353 +P 160 1560 83 359 +P 160 1561 126 403 +P 160 1562 141 418 +P 160 1563 150 438 +Q 160 119 55 493 226 872.37676709279999998 1061 824.94277440960843251 +Q 160 145 68 464 229 885.8620484672 1078 839.59115168373830329 +Q 160 358 306 127 191 -1 -1 -1 +Q 160 172 43 488 212 904.33513653199999999 1083 856.77764271447904321 +Q 160 498 174 83 274 870.67828228239999999 1047 823.34680437002964482 +P 161 1564 157 499 +P 161 1565 162 492 +P 161 1566 168 492 +P 161 669 174 496 +P 161 1567 202 37 +P 161 265 209 37 +P 161 1568 212 37 +P 161 1569 216 49 +P 161 1570 218 55 +P 161 1571 365 167 +P 161 1572 374 205 +P 161 1573 377 211 +P 161 1574 362 231 +P 161 176 370 269 +P 161 1575 374 279 +P 161 143 383 500 +P 161 1576 389 504 +P 161 1577 414 45 +P 161 1578 413 508 +Q 161 467 230 90 274 817.99199078159999998 999 773.74440202194773519 +Q 161 502 178 126 61 917.93311627920000001 1113 868.05988221786230952 +Q 161 505 191 121 57 906.5899705288 1104 857.61348832568933176 +Q 161 455 219 83 275 832.64884503119999998 1016 787.90659365547492143 +Q 161 448 225 116 57 890.5899705288 1088 841.00571957556280722 +P 162 1579 67 29 +P 162 1580 69 61 +P 162 1581 77 74 +P 162 1582 87 78 +P 162 1583 103 52 +P 162 460 97 77 +P 162 1584 89 106 +P 162 1585 92 112 +P 162 392 94 173 +P 162 1275 74 483 +P 162 1586 79 488 +P 162 96 108 56 +P 162 437 108 77 +P 162 1587 143 71 +P 162 1385 146 61 +P 162 1588 150 61 +P 162 1589 165 484 +P 162 89 172 484 +P 162 1590 231 55 +P 162 1591 314 287 +P 162 1592 341 172 +P 162 1593 347 170 +P 162 1594 399 62 +Q 162 170 48 500 201 920.96255353040000002 1109 871.25089450645646139 +Q 162 122 76 482 207 880.1341264056 1067 835.53679032232855661 +Q 162 166 63 486 202 922.23463146880000002 1105 874.42884002442133351 +Q 162 504 179 105 265 868.8620484672 1061 824.65040757477163424 +Q 162 351 307 256 415 -1 -1 -1 +P 163 1595 9 400 +P 163 1596 17 392 +P 163 392 94 176 +P 163 384 98 247 +P 163 868 98 296 +P 163 1597 94 300 +P 163 1598 91 304 +P 163 369 93 308 +P 163 82 318 89 +P 163 1599 327 87 +P 163 1600 336 87 +P 163 1601 310 107 +P 163 1602 321 104 +P 163 669 327 100 +P 163 1603 305 126 +P 163 1604 318 112 +Q 163 483 223 145 39 863.19300090800000003 1036 819.38280035284117275 +Q 163 500 166 94 254 864.06305859359999999 1048 820.61164248030638646 +Q 163 467 211 155 32 888.92092296959999997 1067 842.56432667356796173 +Q 163 338 335 268 506 -1 -1 -1 +Q 163 344 311 110 325 -1 -1 -1 +P 164 1605 69 205 +P 164 1606 74 201 +P 164 1607 79 201 +P 164 1237 229 4 +P 164 392 236 10 +P 164 321 241 15 +P 164 772 241 17 +P 164 1608 248 22 +P 164 1609 238 24 +P 164 37 355 87 +Q 164 155 58 503 217 908.23463146880000002 1091 859.06688362137674631 +Q 164 136 72 481 221 878.89148571840000002 1064 833.64988011633909082 +Q 164 497 222 161 15 883.12193309600000002 1053 839.90587950295389419 +Q 164 172 65 482 244 883.89148571840000002 1069 837.47439917135955056 +Q 164 169 56 503 189 936.5189027168 1131 887.1090343389314512 +P 165 222 245 31 +P 165 1610 254 28 +P 165 1611 259 31 +P 165 267 263 53 +P 165 1612 273 20 +P 165 96 393 54 +P 165 1613 263 55 +P 165 1614 391 55 +P 165 1615 396 58 +P 165 89 87 77 +P 165 1616 307 83 +P 165 471 326 80 +P 165 1617 360 79 +P 165 1488 304 84 +P 165 1618 316 84 +P 165 1619 350 84 +P 165 376 365 87 +P 165 1620 16 450 +P 165 96 33 439 +P 165 1621 25 467 +P 165 1622 36 431 +P 165 1623 34 435 +P 165 96 42 458 +P 165 570 49 439 +P 165 606 222 278 +Q 165 130 65 472 218 877.54833996800000001 1065 831.52706012547218961 +Q 165 166 62 508 218 921.37676709279999998 1110 870.46582962506795411 +Q 165 370 320 201 418 -1 -1 -1 +Q 165 360 310 109 139 -1 -1 -1 +Q 165 162 60 481 229 890.16356365680000001 1070 842.85275413756608032 +P 166 1624 25 139 +P 166 637 58 95 +P 166 249 58 189 +P 166 317 62 97 +P 166 1625 73 57 +P 166 1626 66 179 +P 166 1627 72 185 +P 166 376 65 210 +P 166 1628 85 169 +P 166 1629 95 287 +P 166 1630 167 166 +P 166 593 169 176 +P 166 1068 277 16 +P 166 1624 288 24 +P 166 1631 289 24 +P 166 1632 363 293 +P 166 1633 372 290 +P 166 1634 459 267 +Q 166 327 327 86 4 -1 -1 -1 +Q 166 152 64 500 241 911.32294322240000001 1059 858.45927242813388602 +Q 166 483 205 123 69 924.08030253520000002 1070 866.62017239017734482 +Q 166 167 39 510 243 908.2518754104 1053 851.84155182025347131 +Q 166 150 63 501 253 898.15137034719999998 1047 844.5417648792770251 +P 167 57 109 45 +P 167 1635 169 187 +P 167 1636 169 227 +P 167 1637 171 237 +P 167 1638 209 300 +P 167 772 209 327 +P 167 1639 216 332 +P 167 1640 366 301 +P 167 1641 371 305 +P 167 986 485 293 +P 167 1642 500 300 +P 167 1643 497 306 +P 167 759 476 309 +P 167 1644 495 309 +P 167 1645 472 311 +P 167 1007 464 313 +P 167 1646 488 313 +P 167 1647 488 324 +P 167 1648 494 320 +P 167 1649 468 333 +P 167 1650 499 333 +P 167 376 156 449 +P 167 1651 467 394 +Q 167 128 69 492 298 854.49451609759999998 1001 800.47827278251986627 +Q 167 172 63 504 200 989.30569928079999997 1161 926.2101620084406477 +Q 167 488 279 98 61 832.46507884640000002 986 781.19739741161447455 +Q 167 475 214 123 69 931.7493500944 1097 871.51220880836592642 +Q 167 178 74 446 261 852.67828228239999999 1015 796.83508954487638221 +P 168 1652 157 453 +P 168 1653 161 459 +P 168 1654 175 473 +P 168 321 364 300 +P 168 555 371 310 +P 168 1655 385 304 +P 168 1656 390 296 +P 168 808 396 296 +P 168 255 500 319 +P 168 224 488 330 +P 168 1657 500 322 +P 168 517 468 336 +P 168 1658 488 335 +Q 168 505 214 90 64 823.95036022079999999 993 773.25069356251765385 +Q 168 96 72 491 245 790.56558390959999999 952 742.65865520709689918 +Q 168 457 215 114 64 843.96255353040000002 1030 794.24100886486633044 +Q 168 499 201 115 46 835.0214280328 1007 784.30374917007725344 +Q 168 508 167 149 9 900.53614665839999998 1069 847.68692589871761811 +P 169 1659 97 86 +P 169 1660 105 90 +P 169 1661 109 92 +P 169 1662 138 0 +P 169 43 138 5 +P 169 1663 155 5 +P 169 43 160 10 +P 169 669 165 10 +P 169 1492 51 176 +P 169 1664 56 174 +P 169 1665 61 179 +P 169 400 62 216 +P 169 1666 170 158 +P 169 1667 172 164 +P 169 249 175 189 +P 169 1668 322 128 +P 169 209 503 181 +P 169 1669 508 192 +P 169 1670 56 437 +P 169 1671 355 299 +P 169 249 391 511 +P 169 952 412 420 +P 169 1672 437 508 +Q 169 144 63 478 243 837.67828228239999999 1012 789.1251294432593113 +Q 169 161 42 511 190 896.50670940720000002 1072 841.62906811537891372 +Q 169 128 62 476 241 824.92092296959999997 1001 776.0741372306130188 +Q 169 486 197 151 13 861.76659403599999998 1015 815.74977293086578811 +Q 169 160 1 497 209 868.29350597119999999 1035 817.32834540321448458 +P 170 1673 18 300 +P 170 95 15 314 +P 170 1674 76 60 +P 170 680 92 292 +P 170 1675 88 295 +P 170 1676 85 299 +P 170 249 137 9 +P 170 1677 169 150 +P 170 1678 179 150 +P 170 1679 186 480 +P 170 43 261 1 +P 170 1680 299 0 +P 170 221 296 5 +P 170 1681 293 8 +P 170 1682 256 24 +P 170 1683 282 32 +P 170 1684 425 219 +P 170 1543 419 231 +P 170 1685 413 237 +P 170 1686 454 435 +Q 170 480 217 126 27 819.2518754104 976 771.72464796334418224 +Q 170 104 73 490 204 839.60721447039999998 1011 789.67076093375123946 +Q 170 171 61 493 187 910.50670940720000002 1086 857.28095947596796123 +Q 170 170 68 506 245 853.70771953360000001 1021 802.27359657582428554 +Q 170 487 217 115 47 814.46507884640000002 980 766.3336518824318091 +P 171 1687 28 318 +P 171 1688 30 322 +P 171 1689 38 324 +P 171 1690 179 206 +P 171 1691 271 38 +P 171 1692 276 35 +P 171 1693 270 241 +P 171 1694 271 245 +P 171 1193 285 8 +P 171 202 282 40 +P 171 1695 383 271 +P 171 86 380 317 +P 171 249 393 173 +P 171 1696 420 236 +P 171 1697 431 273 +P 171 321 395 282 +P 171 1698 412 278 +P 171 1699 395 284 +P 171 1700 394 290 +P 171 1701 500 71 +Q 171 461 228 129 25 820.6366517216 985 774.13574544438961311 +Q 171 466 213 159 23 860.39401103440000002 1023 813.42085716665292239 +Q 171 102 70 508 238 798.46507884640000002 964 750.60201216840994221 +Q 171 499 198 115 37 834.29350597119999999 1001 783.36386206391421183 +Q 171 496 197 131 30 847.15137034719999998 1008 797.26440635674794066 +P 172 1702 188 150 +P 172 1703 213 197 +P 172 418 209 205 +P 172 1704 211 213 +P 172 1705 213 215 +P 172 1706 215 217 +P 172 1707 217 219 +P 172 817 221 223 +P 172 249 221 249 +P 172 1708 305 229 +P 172 186 362 235 +P 172 1709 383 270 +P 172 1710 386 273 +P 172 1711 389 276 +P 172 249 412 277 +P 172 1712 456 151 +P 172 733 466 156 +Q 172 511 164 145 21 897.22243815919999999 1061 846.75559413074472559 +Q 172 157 42 511 215 873.3645737832 1043 819.70500087379662091 +Q 172 158 55 510 157 936.16356365680000001 1114 878.27483243195365503 +Q 172 133 70 506 219 862.50670940720000002 1038 809.90213420932843746 +Q 172 178 73 503 197 919.54833996800000001 1105 864.32393880295910549 +P 173 321 88 72 +P 173 1713 219 62 +P 173 769 84 74 +P 173 1714 94 77 +P 173 1715 94 80 +P 173 1716 186 141 +P 173 1717 188 140 +P 173 1718 191 139 +P 173 1719 197 138 +P 173 570 10 185 +P 173 1720 5 190 +P 173 1721 4 196 +P 173 1722 4 202 +P 173 1723 0 241 +P 173 1724 9 246 +P 173 1725 0 261 +P 173 1726 14 188 +P 173 1727 14 260 +P 173 1728 27 195 +P 173 1248 184 198 +P 173 1729 335 173 +P 173 1730 392 207 +P 173 1731 424 183 +P 173 517 433 193 +P 173 249 442 206 +Q 173 493 363 114 349 405.2670273064 441 388.46658275858243314 +Q 173 338 485 360 60 493.53405461279999999 565 465.29441610342570357 +Q 173 454 110 299 482 490.18585823039999999 605 455.6864138417798813 +Q 173 331 222 217 226 202.7939392416 252 188.67741535358968008 +Q 173 16 276 24 429 263.95331880720000001 295 248.19505506262672156 +P 174 1732 105 48 +P 174 1733 103 78 +P 174 1734 110 52 +P 174 1735 110 78 +P 174 96 119 94 +P 174 1736 320 111 +P 174 1737 14 250 +P 174 1738 15 260 +P 174 568 24 263 +P 174 1739 320 186 +P 174 1740 354 169 +P 174 1741 359 168 +P 174 1742 314 191 +P 174 622 0 310 +P 174 354 345 479 +P 174 249 389 295 +P 174 517 392 510 +P 174 1524 413 510 +Q 174 81 29 494 434 669.45288553679999999 818 630.11520380748186199 +Q 174 480 203 177 87 766.21024484960000001 913 719.43998917304952556 +Q 174 410 293 30 453 480.77669530000000001 554 445.96551122349330853 +Q 174 375 392 271 76 439.07821048959999999 500 412.06151681497829031 +Q 174 11 355 230 281 -1 -1 -1 +P 175 237 88 176 +P 175 1743 81 195 +P 175 392 317 215 +P 175 249 317 233 +P 175 1744 339 173 +P 175 1745 456 212 +P 175 1746 445 215 +P 175 1747 445 219 +P 175 937 445 227 +P 175 1748 448 230 +P 175 938 452 234 +P 175 1749 456 238 +P 175 1750 3 298 +P 175 1751 0 305 +P 175 517 8 311 +P 175 713 8 313 +P 175 1752 285 314 +P 175 1753 287 321 +P 175 986 375 411 +P 175 86 459 509 +Q 175 118 396 350 47 474.8721497312 581 450.08189521840932912 +Q 175 123 426 329 139 528.58787848320000002 603 501.85437721228441887 +Q 175 120 294 411 89 426.29141392560000001 496 395.25709088145231362 +Q 175 508 66 328 450 522.49956672959999998 642 487.63683733669972753 +Q 175 454 190 96 436 653.83766184799999999 770 613.6479120045662512 +P 176 418 14 314 +P 176 1754 14 318 +P 176 1755 88 171 +P 176 1756 83 289 +P 176 1757 102 229 +P 176 1758 113 57 +P 176 1759 142 97 +P 176 1552 136 191 +P 176 1760 139 187 +P 176 1761 317 85 +P 176 1762 391 389 +P 176 1763 388 399 +P 176 1764 379 404 +P 176 1765 460 242 +P 176 1766 467 249 +P 176 546 476 274 +P 176 1156 500 275 +P 176 1767 503 279 +P 176 1768 508 299 +P 176 249 436 508 +Q 176 117 303 60 17 321.1665222432 361 301.08731905694679654 +Q 176 160 17 338 249 436.8183258608 518 412.66708869473785626 +Q 176 162 299 376 8 424.06096654800000001 505 399.14515399787381966 +Q 176 356 225 250 322 322.279220616 375 303.70855392253139371 +Q 176 351 372 239 198 264.91168824640000001 286 251.93435247343020933 +P 177 1769 18 271 +P 177 1770 25 269 +P 177 1771 18 289 +P 177 1772 24 284 +P 177 1773 29 269 +P 177 1774 39 271 +P 177 1775 36 279 +P 177 1776 1 415 +P 177 1777 155 64 +P 177 1778 136 179 +P 177 74 139 182 +P 177 399 141 213 +P 177 1779 175 190 +P 177 1780 100 423 +P 177 249 126 413 +P 177 1781 150 488 +P 177 1588 153 498 +P 177 615 164 486 +P 177 1782 157 497 +P 177 1783 271 35 +P 177 1784 273 99 +P 177 1643 361 379 +P 177 1785 392 382 +P 177 40 507 175 +Q 177 101 311 360 122 381.80613255119999999 448 356.00687566357805736 +Q 177 279 248 107 386 375.50461736160000001 450 360.47195786219725733 +Q 177 281 224 245 455 358.8822509952 387 346.54032418482660205 +Q 177 477 216 243 333 -1 -1 -1 +Q 177 494 74 455 388 414.83051917040000001 515 389.07698919438291796 +P 178 1132 23 0 +P 178 1786 58 104 +P 178 1588 62 104 +P 178 1787 0 295 +P 178 619 1 320 +P 178 1788 9 295 +P 178 1040 9 315 +P 178 96 120 78 +P 178 354 147 59 +P 178 1027 154 65 +P 178 1682 171 14 +P 178 321 362 233 +P 178 1789 408 45 +P 178 1790 444 217 +P 178 1791 428 229 +P 178 43 454 237 +P 178 249 463 212 +P 178 1792 467 205 +P 178 1793 473 198 +Q 178 22 475 271 86 530.6417023536 644 507.69047980381350271 +Q 178 71 255 323 189 330.85281374400000001 366 310.26825617418899128 +Q 178 380 153 438 332 208.5807358056 249 197.43075334373256169 +Q 178 46 139 240 466 431.3746750472 521 399.88311004543254512 +Q 178 264 462 398 20 538.90158698240000001 642 516.79110397169199587 +P 179 1794 43 65 +P 179 1795 141 51 +P 179 1796 266 7 +P 179 1797 269 19 +P 179 238 273 19 +P 179 1798 327 110 +P 179 1409 430 146 +P 179 635 134 166 +P 179 1799 132 171 +P 179 1237 136 176 +P 179 1800 419 184 +P 179 1801 395 187 +P 179 392 396 189 +P 179 1802 396 226 +P 179 1803 432 217 +P 179 1804 70 504 +P 179 1805 159 461 +P 179 1806 183 495 +P 179 1807 199 492 +P 179 1027 183 498 +Q 179 11 285 364 448 -1 -1 -1 +Q 179 22 258 97 45 -1 -1 -1 +Q 179 424 115 211 490 517.21024484960000001 614 491.17300261492408708 +Q 179 311 185 34 427 478.83051917040000001 575 458.70562638998535476 +Q 179 500 281 12 21 641.22748879119999998 750 610.15330219292195579 +P 180 1808 11 62 +P 180 1809 44 81 +P 180 467 99 430 +P 180 619 114 1 +P 180 202 122 1 +P 180 1774 140 98 +P 180 1810 120 478 +P 180 1811 170 98 +P 180 1812 183 480 +P 180 249 204 497 +P 180 987 280 98 +P 180 1813 346 0 +P 180 1814 346 6 +P 180 1124 458 149 +P 180 249 483 154 +P 180 1815 483 155 +P 180 177 497 361 +P 180 1816 493 375 +P 180 177 502 361 +P 180 1817 502 375 +P 180 1818 507 361 +Q 180 225 269 19 511 411.01933598719999999 486 387.31086517121553925 +Q 180 216 77 423 413 458.6467529856 543 431.62511026570945205 +Q 180 392 232 251 444 316.30360723519999999 403 297.13018988601425008 +Q 180 138 12 239 406 468.73001410720000001 573 436.96643509275031647 +Q 180 76 119 266 150 223.9116882464 245 214.23984765755034232 +P 181 1819 52 360 +P 181 1820 159 74 +P 181 1821 158 86 +P 181 1822 164 92 +P 181 1823 135 162 +P 181 1824 178 196 +P 181 517 135 482 +P 181 1825 151 480 +P 181 249 367 1 +P 181 288 315 219 +P 181 1826 401 257 +P 181 110 408 260 +P 181 1827 412 264 +P 181 615 378 410 +P 181 487 404 430 +P 181 418 468 349 +P 181 1828 467 389 +P 181 1829 478 412 +P 181 392 490 375 +P 181 1830 484 394 +Q 181 24 53 120 329 382.35028842800000001 438 358.40168030864077764 +Q 181 94 62 413 501 601.5950211608 758 562.19697859149709984 +Q 181 293 291 65 178 364.7228714296 411 344.02301312061007366 +Q 181 8 259 73 411 -1 -1 -1 +Q 181 255 95 435 445 459.11984105040000001 530 431.2122233957107369 +P 182 1831 21 137 +P 182 1832 7 446 +P 182 1833 10 457 +P 182 1834 12 469 +P 182 1835 13 472 +P 182 1836 17 475 +P 182 40 0 487 +P 182 1837 18 481 +P 182 1838 82 157 +P 182 847 310 197 +P 182 1839 310 214 +P 182 1840 482 444 +P 182 1841 508 460 +Q 182 363 116 299 470 437.44574285920000001 530 406.48724454420550956 +Q 182 218 170 34 480 400.17366492080000001 494 384.22657313163961135 +Q 182 488 148 283 481 508.80108191919999999 616 473.0405460403375173 +Q 182 326 99 245 486 450.30865786719999999 496 433.12255056218913296 +Q 182 505 156 82 260 581.07315985759999999 683 544.47229814423508287 +P 183 1842 13 273 +P 183 96 31 268 +P 183 1843 6 436 +P 183 1844 32 432 +P 183 1845 6 442 +P 183 1674 19 448 +P 183 987 34 432 +P 183 1846 37 259 +P 183 1847 41 261 +P 183 1848 48 259 +P 183 1849 55 258 +P 183 1850 59 256 +P 183 189 191 27 +P 183 202 199 30 +P 183 1851 186 94 +P 183 1852 207 31 +P 183 1853 224 59 +P 183 360 228 67 +P 183 663 323 0 +P 183 846 330 0 +Q 183 489 253 263 357 370.9360748656 426 344.47353317341929824 +Q 183 67 455 29 129 415.80613255119999999 482 391.07319110734840706 +Q 183 4 488 489 74 751.8670990992 899 710.9887520870672688 +Q 183 14 369 287 243 -1 -1 -1 +Q 183 158 510 419 200 683.6417023536 805 645.5705227368650867 +P 184 1854 13 243 +P 184 1855 25 250 +P 184 376 72 221 +P 184 376 76 225 +P 184 291 80 228 +P 184 177 179 202 +P 184 1856 25 261 +P 184 534 32 258 +P 184 392 60 266 +P 184 96 18 270 +P 184 1857 54 269 +P 184 1858 48 275 +P 184 1859 278 274 +P 184 1860 281 277 +P 184 1861 283 279 +P 184 1862 285 281 +P 184 634 287 313 +P 184 238 289 313 +P 184 1409 54 439 +P 184 1863 80 434 +P 184 1864 80 437 +P 184 752 488 509 +Q 184 324 314 39 184 463.23253942320000001 547 439.49079714085581827 +Q 184 96 54 439 456 616.12698372800000002 745 572.28831781517953914 +Q 184 437 457 240 58 505.78888860960000001 596 476.7473963178101144 +Q 184 121 8 428 306 496.0437226064 605 466.5478802541905452 +Q 184 116 499 433 71 648.57063454159999999 767 613.28187453033058318 +P 185 1865 0 430 +P 185 546 3 510 +P 185 1866 24 328 +P 185 1867 17 334 +P 185 1868 18 435 +P 185 1869 168 475 +P 185 1870 166 478 +P 185 1871 164 481 +P 185 321 164 484 +P 185 376 179 484 +P 185 1872 148 500 +P 185 177 152 509 +P 185 156 225 0 +P 185 626 230 0 +P 185 1409 315 85 +P 185 1873 379 16 +P 185 267 277 273 +P 185 1874 279 284 +P 185 1875 293 313 +P 185 177 375 317 +P 185 1876 298 320 +P 185 1877 375 320 +P 185 1878 399 14 +P 185 1879 395 24 +P 185 1524 424 510 +P 185 26 506 488 +Q 185 452 90 315 164 176.92388155600000001 211 163.85682687151253845 +Q 185 218 213 398 359 304.36753236959999999 336 289.16127411049518514 +Q 185 21 61 400 457 678.6366517216 845 631.14802647410897407 +Q 185 402 231 60 137 408.00714267760000001 466 389.00681920790640334 +Q 185 168 93 427 478 527.42849891759999997 644 494.19231012343078646 +P 186 1880 90 234 +P 186 1881 96 230 +P 186 1322 337 3 +P 186 1882 491 93 +P 186 1883 6 322 +P 186 1884 18 295 +P 186 1885 23 322 +P 186 321 83 290 +P 186 1238 94 243 +P 186 321 353 300 +P 186 1886 464 277 +P 186 1887 468 277 +P 186 1888 473 287 +P 186 1889 463 467 +P 186 1890 478 465 +P 186 1891 487 467 +P 186 1317 505 478 +Q 186 446 73 156 403 526.45793616879999999 620 494.62779376758226135 +Q 186 24 394 108 303 -1 -1 -1 +Q 186 213 216 10 472 448.34523779600000001 531 427.87919912948882484 +Q 186 450 363 84 63 538.54119729039999998 666 510.13575368560765355 +Q 186 98 126 430 460 535.95541085279999999 666 498.91899188752802274 +P 187 619 1 5 +P 187 425 14 15 +P 187 1892 41 82 +P 187 1893 79 191 +P 187 241 46 363 +P 187 1624 51 362 +P 187 584 53 374 +P 187 1894 56 374 +P 187 1895 56 381 +P 187 1896 379 410 +P 187 1897 448 242 +P 187 1898 452 246 +P 187 1899 506 388 +P 187 1900 492 391 +P 187 858 500 394 +P 187 1901 500 400 +P 187 433 500 406 +Q 187 507 423 6 306 556.09040379920000002 634 528.9232393122083522 +Q 187 53 184 363 110 366.30865786719999999 412 342.15513454607201993 +Q 187 452 235 246 357 312.12489168240000001 342 295.00997864297715978 +Q 187 86 14 501 65 491.3208511768 554 465.70093668620387461 +Q 187 484 251 259 98 345.4386001816 380 326.37794663949568985 +P 188 1902 29 437 +P 188 1903 54 114 +P 188 96 53 439 +P 188 1904 77 191 +P 188 1905 93 438 +P 188 392 98 437 +P 188 26 98 451 +P 188 1567 123 0 +P 188 532 130 0 +P 188 260 157 87 +P 188 1906 124 493 +P 188 1907 130 487 +P 188 1908 133 481 +P 188 1909 137 484 +P 188 274 143 488 +P 188 57 166 70 +P 188 1910 184 153 +P 188 1911 189 85 +P 188 285 192 94 +P 188 1912 298 313 +P 188 1913 300 320 +P 188 1914 413 183 +P 188 1915 484 387 +P 188 1916 508 405 +Q 188 494 174 300 367 343.79393924160000001 393 324.94716169543386286 +Q 188 463 62 463 496 516.51681067120000002 612 484.04539333661762157 +Q 188 179 101 429 320 387.57568517359999999 469 361.19324862369063567 +Q 188 15 434 449 107 632.0264786648 761 599.29631097016317653 +Q 188 40 77 366 261 534.11479041839999998 644 502.32189077394014021 +P 189 1917 21 95 +P 189 321 24 326 +P 189 604 18 341 +P 189 1918 27 334 +P 189 1919 31 339 +P 189 946 33 349 +P 189 57 95 431 +P 189 1920 141 48 +P 189 1921 187 58 +P 189 1922 273 4 +P 189 1923 304 302 +P 189 1924 301 313 +P 189 1925 304 318 +P 189 1926 414 254 +P 189 1927 458 144 +P 189 1318 468 338 +P 189 425 489 344 +P 189 354 435 509 +P 189 1928 457 429 +P 189 1929 482 442 +P 189 1930 502 436 +P 189 1931 473 467 +Q 189 279 201 312 468 280.6690475592 300 269.03159665734432338 +Q 189 466 134 446 407 373.1492783016 437 346.58206799431491163 +Q 189 376 230 181 336 317.69343417839999999 371 299.2631016787861995 +Q 189 219 252 203 492 267.33809511840000001 306 249.33944520556815405 +Q 189 94 507 313 455 257.81118318319999999 283 243.10073188931400523 +P 190 1932 2 335 +P 190 1933 0 341 +P 190 253 0 348 +P 190 1083 0 355 +P 190 392 19 343 +P 190 1934 33 360 +P 190 249 41 253 +P 190 924 75 197 +P 190 1124 278 3 +P 190 769 286 5 +P 190 1935 379 15 +P 190 97 378 416 +P 190 1009 382 418 +P 190 1936 386 418 +P 190 1937 406 255 +P 190 1938 416 267 +P 190 1939 395 418 +P 190 470 474 145 +P 190 1940 502 107 +Q 190 197 270 415 397 328.19595949439999999 361 311.8967714005946732 +Q 190 325 152 412 486 393.23253942320000001 437 373.65507692327855693 +Q 190 314 151 449 57 183.89444430480000001 229 170.11602886250284428 +Q 190 477 444 83 321 449.0904037992 527 419.9920097655502218 +Q 190 270 169 239 347 212.6984848104 225 204.78365872972699435 +P 191 1410 24 135 +P 191 188 12 145 +P 191 1941 5 149 +P 191 1942 39 366 +P 191 1943 43 366 +P 191 1944 48 370 +P 191 1945 52 374 +P 191 1946 57 389 +P 191 1947 66 383 +P 191 1948 75 489 +P 191 1949 75 497 +P 191 238 192 26 +P 191 559 266 3 +Q 191 10 398 480 293 722.8721497312 819 671.0522258137642666 +Q 191 378 311 79 263 418.00209204560000001 517 392.99379690248571251 +Q 191 122 355 455 59 524.62950904400000002 629 494.69399881530750918 +Q 191 434 58 342 248 250.53405461279999999 312 234.59184301634186909 +Q 191 26 105 266 159 290.06601718000000001 328 272.06861326347012664 +P 192 1950 37 34 +P 192 1951 38 75 +P 192 1952 41 65 +P 192 1953 50 167 +P 192 1954 74 191 +P 192 249 3 383 +P 192 1955 34 364 +P 192 1956 37 372 +P 192 717 40 364 +P 192 1357 98 464 +P 192 1957 99 479 +P 192 1958 297 85 +P 192 199 300 201 +P 192 1959 331 304 +P 192 425 371 317 +P 192 1713 368 378 +P 192 1960 388 0 +P 192 1674 403 429 +P 192 1961 475 24 +P 192 1962 474 143 +P 192 1963 496 5 +P 192 619 504 8 +P 192 1964 497 77 +P 192 1965 441 242 +P 192 1588 449 244 +P 192 1717 453 248 +P 192 114 454 434 +Q 192 511 388 301 141 380.06096654800000001 465 355.68012623283971152 +Q 192 125 279 437 181 419.7228714296 466 393.28392543026785688 +Q 192 50 87 444 470 612.979797472 777 573.43232157181751063 +Q 192 69 456 339 78 552.1391770376 694 527.66318466200539206 +Q 192 341 58 173 498 518.07315985759999999 620 500.87541995221977231 +P 193 425 5 0 +P 193 321 21 0 +P 193 1966 188 14 +P 193 1009 191 17 +P 193 626 19 75 +P 193 810 189 59 +P 193 980 228 55 +P 193 1967 16 83 +P 193 1709 18 95 +P 193 1968 0 362 +P 193 1969 46 281 +P 193 487 33 480 +P 193 1970 42 464 +P 193 1733 54 279 +P 193 1971 61 274 +P 193 1972 103 245 +P 193 1973 337 0 +P 193 1974 331 121 +P 193 1975 439 42 +P 193 1976 432 218 +P 193 1977 463 206 +P 193 1978 474 190 +P 193 722 509 167 +P 193 1979 456 251 +P 193 1980 463 471 +P 193 1713 487 443 +Q 193 86 49 317 162 283.07821048959999999 344 269.90959985656877507 +Q 193 136 392 96 29 382.1543289336 405 369.07185444276865383 +Q 193 228 232 69 417 338.50966799360000001 376 319.45165469741118613 +Q 193 204 18 233 423 446.69343417839999999 500 427.28829247040687278 +Q 193 239 243 15 421 378.6101730568 412 360.99538157822655648 +P 194 1981 19 237 +P 194 1982 30 237 +P 194 1983 36 241 +P 194 1984 183 19 +P 194 1985 179 29 +P 194 1986 184 28 +P 194 1987 189 61 +P 194 285 228 62 +P 194 1988 221 135 +P 194 1989 300 207 +P 194 1990 459 190 +P 194 1991 458 257 +P 194 1992 498 240 +P 194 1040 25 391 +P 194 1993 87 502 +P 194 1423 92 500 +P 194 1985 158 475 +P 194 418 307 307 +P 194 731 459 265 +P 194 1994 467 265 +P 194 1995 471 274 +P 194 126 500 268 +P 194 1771 490 378 +P 194 626 483 388 +P 194 1567 501 511 +Q 194 304 120 59 426 440.77164466800000001 551 424.14479163805185635 +Q 194 14 355 511 157 686.85490578960000002 821 639.89899054733507455 +Q 194 259 34 385 237 299.208152804 333 282.10528178138940802 +Q 194 466 294 108 187 472.07821048959999999 533 451.94777805045714558 +Q 194 446 122 63 419 568.6000717928 680 540.40768903126217992 +P 195 1996 17 79 +P 195 43 30 84 +P 195 1997 0 113 +P 195 1998 176 0 +P 195 267 309 230 +P 195 1999 331 113 +P 195 2000 43 387 +P 195 2001 317 296 +P 195 1441 483 292 +P 195 2002 497 359 +P 195 2003 504 357 +P 195 1028 0 418 +P 195 2004 111 494 +P 195 317 183 481 +P 195 2005 98 496 +P 195 2006 106 504 +P 195 176 508 507 +Q 195 495 373 408 56 411.203102172 502 388.03611914686803175 +Q 195 425 321 273 13 375.9310242336 472 355.76859981809161582 +Q 195 229 293 385 169 289.74011537120000001 312 275.76880635427551169 +Q 195 505 61 326 484 549.8721497312 660 518.07201589225542193 +Q 195 29 394 263 283 425.492424052 487 394.56197155238618279 +P 196 2007 0 121 +P 196 2008 36 80 +P 196 1488 129 48 +P 196 2009 139 96 +P 196 265 179 205 +P 196 2010 184 11 +P 196 930 210 31 +P 196 2011 213 298 +P 196 1674 227 55 +P 196 985 285 0 +P 196 1509 277 99 +P 196 593 305 220 +P 196 2012 336 173 +P 196 186 344 0 +P 196 249 367 0 +P 196 1961 408 45 +P 196 517 435 510 +P 196 96 459 42 +P 196 2013 468 341 +P 196 2014 495 0 +P 196 2015 501 5 +P 196 2016 498 237 +P 196 2017 500 310 +P 196 211 505 317 +Q 196 322 112 83 305 373.80613255119999999 436 345.31930362340625607 +Q 196 26 125 452 455 603.35238047360000002 756 570.87044488920207641 +Q 196 446 169 351 369 317.9360748656 373 297.41095834928944441 +Q 196 115 146 268 364 316.2619766744 371 293.96941278457831004 +Q 196 319 353 211 80 320.6639969272 381 298.04980822836375864 +P 197 980 8 66 +P 197 2018 14 74 +P 197 2019 33 75 +P 197 2020 0 192 +P 197 1509 7 184 +P 197 2021 5 191 +P 197 2022 10 183 +P 197 2023 0 493 +P 197 2024 48 505 +P 197 2025 74 490 +P 197 2026 119 503 +P 197 1193 138 509 +P 197 267 157 457 +P 197 2027 178 144 +P 197 2028 180 495 +P 197 384 219 0 +P 197 2029 222 139 +P 197 2030 266 0 +P 197 2031 275 102 +P 197 2032 327 296 +P 197 409 470 190 +P 197 249 483 300 +P 197 2033 473 305 +P 197 82 502 444 +P 197 176 508 407 +Q 197 141 470 310 152 462.00209204560000001 545 439.22074090243586397 +Q 197 106 287 477 172 474.79393924160000001 524 446.21072451208283383 +Q 197 264 166 487 496 454.00209204560000001 553 425.7899431320831809 +Q 197 64 464 360 79 575.1391770376 717 546.06609212790897345 +Q 197 356 448 64 4 593.06810922559999999 736 550.40649988242887503 +P 198 1040 0 0 +P 198 2034 0 133 +P 198 2035 6 137 +P 198 249 13 146 +P 198 2036 22 127 +P 198 1410 3 337 +P 198 2037 11 291 +P 198 2038 34 238 +P 198 2039 0 389 +P 198 2040 30 391 +P 198 2041 18 433 +P 198 2042 162 0 +P 198 2043 172 144 +P 198 418 175 4 +P 198 1674 178 29 +P 198 96 183 38 +P 198 805 187 57 +P 198 614 175 142 +P 198 2044 222 144 +P 198 249 368 0 +P 198 114 379 14 +P 198 2045 364 322 +P 198 780 456 430 +P 198 810 473 190 +P 198 2046 506 79 +P 198 357 506 88 +P 198 2047 497 94 +P 198 2048 506 132 +P 198 176 509 170 +P 198 517 507 281 +P 198 570 508 309 +P 198 615 511 406 +Q 198 459 438 202 362 299.9360748656 355 280.78997253396812539 +Q 198 0 495 170 342 263.83556980240000001 323 247.76291923293379682 +Q 198 331 226 410 471 303.19595949439999999 336 289.15126337812733937 +Q 198 44 202 374 479 457.8670990992 607 440.40538697187520256 +Q 198 483 369 467 12 461.07315985759999999 563 438.10447411041502619 +P 199 265 120 0 +P 199 376 172 0 +P 199 2049 217 0 +P 199 2050 221 6 +P 199 2051 426 39 +P 199 321 510 6 +P 199 2052 8 54 +P 199 2053 34 75 +P 199 2054 116 59 +P 199 2055 412 40 +P 199 2056 408 43 +P 199 392 0 144 +P 199 995 48 169 +P 199 2057 167 145 +P 199 2058 301 207 +P 199 2059 0 271 +P 199 2060 9 271 +P 199 2061 13 270 +P 199 2062 0 291 +P 199 2063 0 498 +P 199 2064 26 392 +P 199 2065 27 472 +P 199 2066 98 506 +P 199 285 150 443 +P 199 986 327 304 +P 199 789 471 350 +P 199 995 454 431 +P 199 2067 463 477 +P 199 810 475 480 +P 199 496 508 477 +Q 199 252 76 168 416 390.75230868079999999 430 374.05685369756025693 +Q 199 81 135 486 416 568.49956672959999998 688 536.71540742035949734 +Q 199 462 305 142 148 483.39191898880000001 549 459.52686200370106917 +Q 199 490 304 148 139 461.1492783016 525 439.98292686551565112 +Q 199 124 139 422 382 464.50461736160000001 543 441.33660163092673656 diff --git a/examples/arena2.map b/examples/arena2.map new file mode 100644 index 0000000..686c35f --- /dev/null +++ b/examples/arena2.map @@ -0,0 +1,213 @@ +type octile +height 209 +width 281 +map +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT............TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT.....TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT.....TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTT............................TT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTT............................TT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............................T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................................T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT...........TTTTT...........TTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............................................TT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............................................TT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT............TTTT............TTTT............TTTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................................T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTT.............TTT.............TTT.............TTTT...........TTTTT...........TTTTT...........TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT...........TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTT............TTTTTTTTTTTTTTTTTT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT..TTTTTTTT.TTTTT...........TTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@TT@@@@@@@@@@@@@@@@TT............TT@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT......TTTTT...........TTTTT...........TTTT............TTTTT...........TTTTT...........TTTTT...........TTTT............TTTTT...........TTTTT......TTT@@@@@@@@@@@@@@@@@@@T@@@@@@@@@@@@@@@@TT.............T@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTT........TTT.............TTT.............TT.............TTTTT...........TTTTT...........TTTTT............................TTT.............TTT........TTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTT.........................................TT..............TTT.............TTT.............TTT.........................................................TTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTT..........................................TT...........................................................................................................TTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTT..........................................TT...........................................................................................................TTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTT...........................................TT............................................................................................................TTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTT...............................................TT................................................................................................................TTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTT................................................TT.................................................................................................................TTTT@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT..................................................TT...................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT..................................................TT....................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT...................................................TT....................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT...................................................TT....................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT....................................................TT.....................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT....................................TTT.............TTT.............................................................TTT.............TTT....................................TTT@@@@@@T@@@@@@@@@@@@@@@@TT.............T@@@@@@@@@@@@@@@@ +.................@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTT..................................TT@@@@@@@@@@@@@@@@TTT...........................................................TTTTT...........TTTTT..................................TTTTTTTTTTTTTTTTTTTTTTTTTTTTT............TT@@@@@@@@@@@@@@@@ +........................TTTTTTTTTTTTTTTTTTTTTTTTTTTTT..................................TTTTT...........TTTTT..........................................................TTTTTTTTTTTTTTTTTTTTTT..................................TTTTTTTTTTTTTTTTTTTTTTTTTTTTT............TT@@@@@@@@@@@@@@@@ +.................TTTTTTTTTTTTTTTT......TTTT......TTTT..................................TTTT............TTTT............................................................TTTT............TTTT...................................TTTT......TTT.............TTT.............T@@@@@@@@@@@@@@@@ +.........TTTTT...TTTTTTTTT.........TT...TTT.......T......................................................................................................................TT..............T...............................................TT..............................@@@@@@@@@@@@@@@@ +.........TTTTTTTTTTTTTTTTT...........T...................................................................................................................................TT..............................................................TT..............................@@@@@@@@@@@@@@@@ +...............TTTTTTTTTTT...........TT..................................................................................................................................TT..............................................................TT..............................@@@@@@@@@@@@@@@@ +.....................TTTTT...........TT..................................................................................................................................TT..............................................................TT..............................@@@@@@@@@@@@@@@@ +.....................................TT..................................................................................................................................TT..............................................................................................@@@@@@@@@@@@@@@@ +......................................T..................................................................................................................................TT..............................................................................................@@@@@@@@@@@@@@@@ +.....................................TT..................................................................................................................................TT..............................................................................................@@@@@@@@@@@@@@@@ +.....................................TT..................................................................................................................................TT..............................................................................................@@@@@@@@@@@@@@@@ +.....................TTTTT..........TTT..................................................................................................................................TT..............................................................................................@@@@@@@@@@@@@@@@ +....................TTTTTT.TTTTTTTTTTTT..................................................................................................................................TT..............................................................TT..............................@@@@@@@@@@@@@@@@ +..............TTTTTTTTTTTTTTTTTTTTTTTT...................................................................................................................................TT..............................................................TT..............................@@@@@@@@@@@@@@@@ +.........TTTTTTTTTTTTTTTTTTTTTTTTTTTT...TTT..............................................................................................................................TT..............................................................TT..............................@@@@@@@@@@@@@@@@ +.........TT......TTTTTTTTTTTTTTTTTTT...TTTT......TTTT...................................TTT.............TTT.............................................................TTT.............TTT...................................TTTT......TTT.............TTT.............T@@@@@@@@@@@@@@@@ +.................@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTT..................................TTTTT...........TTTTT...........................................................TTTTTTTTTTTTTTTTTTTTT..................................TTTTTTTTTTTTTTTTTTTTTTTTTTTTT............TT@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTT..................................TTTTTTTTTTTTTTTTTTTTTT..........................................................TTTTT..TTTTTTTT.TTTTT..................................TTTTTTTTTTT@@@@@@@@@@@@@@@@TT............TT@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...................................TTTT............TTTT............................................................TTTT............TTTT....................................TTT@@@@@@T@@@@@@@@@@@@@@@@TT.............T@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT....................................................TT.....................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT...................................................TT....................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT...................................................TT....................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT...................................................TT...................................................................................................................TTT@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT..................................................TT...................................................................................................................TT@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT.................................................TT..................................................................................................................TTT@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTT...............................................TT................................................................................................................TTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTT.T............................................TT............................................................................................................TTTTTT@T@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTT...........................................TT...........................................................................................................TTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTT..........................................TT...........................................................................................................TTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTT..........................................TT..............TTT.............TTT.............TTT..........................................................TTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTT........................................TT.............TTTTT...........TTTTT...........TTTTT.......................................................TTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT......TTTTT...........TTTTT...........TTTT............TTTTT...........TTTTT...........TTTTT............TTT............TTTTT...........TTTTT......TTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............T@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............TTTTTTTTTTTTTTTTTT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT...........TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............TTTTTTTTTTTTTTTTTT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTT............TTTT............TTTT............TTTTT...........TTTTT...........TTTTT...........TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TT...............................................TT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T..............................TT...............................................TT..............................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT............................TT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT...........TTTTT...........TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT............................TT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............................T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................TTT.............TTT.............T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............................TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTT...........TTTTT...........TTTTT...........TTTTT...........TTTTT...........TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............................TT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................................................................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T...............................@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............TTT.............TTT.............T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................T@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............................TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............................TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................TTT.............TTT.............T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............................................T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTT............................................TT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT............................................TT +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............................................T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@T............................................... +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TT.............TTT.............TTT.............T +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT diff --git a/examples/arena2.map.scen b/examples/arena2.map.scen new file mode 100644 index 0000000..ec335fd --- /dev/null +++ b/examples/arena2.map.scen @@ -0,0 +1,911 @@ +version 1 +0 arena2.map 281 209 99 159 101 162 3.82842712 +0 arena2.map 281 209 112 130 109 131 3.41421356 +0 arena2.map 281 209 101 94 103 93 2.41421356 +0 arena2.map 281 209 111 58 110 60 2.41421356 +0 arena2.map 281 209 93 83 95 80 3.82842712 +0 arena2.map 281 209 256 124 258 125 2.41421356 +0 arena2.map 281 209 262 48 259 46 3.82842712 +0 arena2.map 281 209 270 39 268 40 2.41421356 +0 arena2.map 281 209 237 101 237 102 1.00000000 +0 arena2.map 281 209 274 178 273 178 1.00000000 +1 arena2.map 281 209 102 99 98 104 6.65685425 +1 arena2.map 281 209 69 113 69 117 4.00000000 +1 arena2.map 281 209 256 138 256 131 7.00000000 +1 arena2.map 281 209 118 123 112 126 7.24264069 +1 arena2.map 281 209 141 128 147 129 6.41421356 +1 arena2.map 281 209 140 40 137 44 5.24264069 +1 arena2.map 281 209 239 53 245 50 7.24264069 +1 arena2.map 281 209 164 143 160 143 4.00000000 +1 arena2.map 281 209 170 73 174 69 5.65685425 +1 arena2.map 281 209 264 123 258 122 6.41421356 +2 arena2.map 281 209 82 91 81 101 10.41421356 +2 arena2.map 281 209 108 98 116 106 11.31370850 +2 arena2.map 281 209 194 139 185 132 11.89949493 +2 arena2.map 281 209 196 90 189 98 10.89949493 +2 arena2.map 281 209 268 144 277 141 10.24264069 +2 arena2.map 281 209 263 91 263 100 9.82842712 +2 arena2.map 281 209 122 87 123 97 10.41421356 +2 arena2.map 281 209 168 136 178 136 10.00000000 +2 arena2.map 281 209 150 43 144 51 10.48528137 +2 arena2.map 281 209 130 39 133 31 10.41421356 +3 arena2.map 281 209 192 113 180 106 14.89949493 +3 arena2.map 281 209 221 166 227 153 15.48528137 +3 arena2.map 281 209 161 49 147 45 15.65685425 +3 arena2.map 281 209 270 74 274 60 15.65685425 +3 arena2.map 281 209 126 157 121 170 15.07106781 +3 arena2.map 281 209 202 95 206 82 14.65685425 +3 arena2.map 281 209 183 132 196 128 14.65685425 +3 arena2.map 281 209 121 167 133 169 12.82842712 +3 arena2.map 281 209 90 164 105 165 15.41421356 +3 arena2.map 281 209 256 189 266 196 12.89949493 +4 arena2.map 281 209 129 49 138 36 16.72792206 +4 arena2.map 281 209 254 154 256 136 18.82842712 +4 arena2.map 281 209 95 50 107 38 16.97056274 +4 arena2.map 281 209 161 72 175 78 16.48528137 +4 arena2.map 281 209 117 92 136 94 19.82842712 +4 arena2.map 281 209 264 67 251 81 19.38477631 +4 arena2.map 281 209 128 18 114 13 16.07106781 +4 arena2.map 281 209 167 135 184 139 18.65685425 +4 arena2.map 281 209 82 95 99 102 19.89949493 +4 arena2.map 281 209 128 67 116 77 16.14213562 +5 arena2.map 281 209 169 149 183 131 23.79898987 +5 arena2.map 281 209 172 75 194 79 23.65685425 +5 arena2.map 281 209 167 154 156 137 21.55634918 +5 arena2.map 281 209 200 122 179 117 23.07106781 +5 arena2.map 281 209 105 150 83 153 23.24264069 +5 arena2.map 281 209 179 124 161 114 22.14213562 +5 arena2.map 281 209 156 159 139 151 20.31370850 +5 arena2.map 281 209 84 105 77 85 22.89949493 +5 arena2.map 281 209 95 41 105 58 21.14213562 +5 arena2.map 281 209 238 65 258 74 23.72792206 +6 arena2.map 281 209 172 88 153 104 25.62741699 +6 arena2.map 281 209 257 207 267 186 25.14213562 +6 arena2.map 281 209 190 96 181 119 27.89949493 +6 arena2.map 281 209 95 140 95 164 24.00000000 +6 arena2.map 281 209 70 94 92 87 24.89949493 +6 arena2.map 281 209 96 121 69 122 27.41421356 +6 arena2.map 281 209 62 104 75 126 27.38477631 +6 arena2.map 281 209 262 82 238 79 26.07106781 +6 arena2.map 281 209 202 88 178 96 27.31370850 +6 arena2.map 281 209 96 147 117 163 27.62741699 +7 arena2.map 281 209 135 70 107 68 28.82842712 +7 arena2.map 281 209 245 101 219 95 31.31370850 +7 arena2.map 281 209 265 138 254 114 28.55634918 +7 arena2.map 281 209 123 73 123 102 29.82842712 +7 arena2.map 281 209 135 38 105 35 31.24264069 +7 arena2.map 281 209 177 100 182 81 31.31370850 +7 arena2.map 281 209 192 102 199 75 29.89949493 +7 arena2.map 281 209 141 105 158 126 28.04163055 +7 arena2.map 281 209 226 100 201 110 29.14213562 +7 arena2.map 281 209 191 129 199 104 28.31370850 +8 arena2.map 281 209 103 103 136 102 33.41421356 +8 arena2.map 281 209 276 179 242 175 35.65685425 +8 arena2.map 281 209 151 114 136 88 32.21320343 +8 arena2.map 281 209 85 115 56 104 33.55634918 +8 arena2.map 281 209 171 60 145 36 35.94112549 +8 arena2.map 281 209 192 116 207 87 35.21320343 +8 arena2.map 281 209 184 102 198 130 33.79898987 +8 arena2.map 281 209 197 82 172 62 33.28427124 +8 arena2.map 281 209 99 82 113 56 34.14213562 +8 arena2.map 281 209 277 70 253 45 34.94112549 +9 arena2.map 281 209 146 53 112 61 37.31370850 +9 arena2.map 281 209 183 123 144 123 39.00000000 +9 arena2.map 281 209 165 136 142 166 39.52691193 +9 arena2.map 281 209 66 104 101 100 36.65685425 +9 arena2.map 281 209 106 120 84 100 39.21320343 +9 arena2.map 281 209 65 120 70 85 37.07106781 +9 arena2.map 281 209 93 107 129 108 36.41421356 +9 arena2.map 281 209 148 41 110 37 39.65685425 +9 arena2.map 281 209 92 170 120 150 36.28427124 +9 arena2.map 281 209 128 73 160 88 38.21320343 +10 arena2.map 281 209 101 77 124 49 42.79898987 +10 arena2.map 281 209 162 124 126 109 42.21320343 +10 arena2.map 281 209 119 99 150 129 43.42640686 +10 arena2.map 281 209 94 13 128 25 42.48528137 +10 arena2.map 281 209 178 64 199 99 43.69848480 +10 arena2.map 281 209 139 135 143 93 43.65685425 +10 arena2.map 281 209 234 167 266 194 43.18376617 +10 arena2.map 281 209 101 105 94 79 40.79898987 +10 arena2.map 281 209 118 150 158 144 42.48528137 +10 arena2.map 281 209 140 95 147 134 41.89949493 +11 arena2.map 281 209 97 97 56 106 44.72792206 +11 arena2.map 281 209 163 79 182 95 44.89949493 +11 arena2.map 281 209 151 61 114 44 44.04163055 +11 arena2.map 281 209 149 119 118 86 45.84062042 +11 arena2.map 281 209 91 75 99 112 45.28427124 +11 arena2.map 281 209 115 151 155 162 45.97056274 +11 arena2.map 281 209 118 110 82 93 44.21320343 +11 arena2.map 281 209 155 90 119 116 46.76955261 +11 arena2.map 281 209 166 103 143 67 45.52691193 +11 arena2.map 281 209 134 159 95 175 45.62741699 +12 arena2.map 281 209 60 121 97 88 50.66904755 +12 arena2.map 281 209 145 122 152 73 51.89949493 +12 arena2.map 281 209 184 76 201 118 50.21320343 +12 arena2.map 281 209 251 136 260 88 51.72792206 +12 arena2.map 281 209 125 146 174 152 51.48528137 +12 arena2.map 281 209 102 43 85 84 48.04163055 +12 arena2.map 281 209 78 57 67 101 48.55634918 +12 arena2.map 281 209 78 147 66 102 49.97056274 +12 arena2.map 281 209 130 17 109 60 51.69848480 +12 arena2.map 281 209 103 107 137 71 50.08326111 +13 arena2.map 281 209 114 109 66 121 52.97056274 +13 arena2.map 281 209 161 119 191 90 53.14213562 +13 arena2.map 281 209 150 131 143 78 55.89949493 +13 arena2.map 281 209 126 112 93 120 54.31370850 +13 arena2.map 281 209 97 98 125 139 52.59797974 +13 arena2.map 281 209 167 159 112 157 55.82842712 +13 arena2.map 281 209 102 118 100 84 55.79898987 +13 arena2.map 281 209 128 74 178 84 54.97056274 +13 arena2.map 281 209 119 55 82 88 54.18376617 +13 arena2.map 281 209 166 101 129 138 54.08326111 +14 arena2.map 281 209 137 163 93 135 56.76955261 +14 arena2.map 281 209 95 93 113 42 58.45584412 +14 arena2.map 281 209 60 116 106 148 59.25483398 +14 arena2.map 281 209 159 92 195 122 57.79898987 +14 arena2.map 281 209 102 146 64 105 57.32590179 +14 arena2.map 281 209 198 109 171 154 56.18376617 +14 arena2.map 281 209 198 71 152 94 56.69848480 +14 arena2.map 281 209 112 132 127 80 58.21320343 +14 arena2.map 281 209 89 62 103 103 58.07106781 +14 arena2.map 281 209 107 117 66 93 56.69848480 +15 arena2.map 281 209 150 137 183 111 63.97056274 +15 arena2.map 281 209 243 67 227 102 61.38477631 +15 arena2.map 281 209 92 115 100 65 61.79898987 +15 arena2.map 281 209 260 117 278 65 60.62741699 +15 arena2.map 281 209 208 103 168 140 60.01219330 +15 arena2.map 281 209 143 82 134 140 61.72792206 +15 arena2.map 281 209 184 70 179 125 60.38477631 +15 arena2.map 281 209 105 59 93 110 61.76955261 +15 arena2.map 281 209 96 84 111 127 63.35533905 +15 arena2.map 281 209 154 52 176 84 62.18376617 +16 arena2.map 281 209 145 89 171 77 67.89949493 +16 arena2.map 281 209 139 116 188 78 67.66904755 +16 arena2.map 281 209 269 61 250 121 67.87005768 +16 arena2.map 281 209 119 115 101 78 66.84062042 +16 arena2.map 281 209 77 97 104 44 64.18376617 +16 arena2.map 281 209 98 109 99 159 66.21320343 +16 arena2.map 281 209 187 136 133 168 67.25483398 +16 arena2.map 281 209 72 85 17 106 65.35533905 +16 arena2.map 281 209 95 34 69 90 66.76955261 +16 arena2.map 281 209 74 75 30 104 66.35533905 +17 arena2.map 281 209 138 100 194 73 69.52691193 +17 arena2.map 281 209 105 62 54 105 68.81118317 +17 arena2.map 281 209 86 105 141 73 68.25483398 +17 arena2.map 281 209 165 158 196 99 71.84062042 +17 arena2.map 281 209 205 110 258 84 68.45584412 +17 arena2.map 281 209 133 42 96 89 68.18376617 +17 arena2.map 281 209 263 131 212 102 68.28427124 +17 arena2.map 281 209 159 139 95 146 70.07106781 +17 arena2.map 281 209 181 54 195 117 68.79898987 +17 arena2.map 281 209 152 120 162 132 69.89949493 +18 arena2.map 281 209 179 69 152 69 72.79898987 +18 arena2.map 281 209 199 116 131 128 72.97056274 +18 arena2.map 281 209 260 132 272 61 75.97056274 +18 arena2.map 281 209 206 86 137 78 72.31370850 +18 arena2.map 281 209 161 133 150 121 72.89949493 +18 arena2.map 281 209 132 118 176 111 73.48528137 +18 arena2.map 281 209 149 138 199 101 73.52691193 +18 arena2.map 281 209 131 70 193 77 72.11269836 +18 arena2.map 281 209 253 128 204 87 75.35533905 +18 arena2.map 281 209 77 80 106 69 74.97056274 +19 arena2.map 281 209 96 10 127 63 79.31370850 +19 arena2.map 281 209 131 102 59 117 78.21320343 +19 arena2.map 281 209 78 143 145 168 77.35533905 +19 arena2.map 281 209 171 86 100 106 79.28427124 +19 arena2.map 281 209 163 108 157 78 77.21320343 +19 arena2.map 281 209 147 127 161 136 77.14213562 +19 arena2.map 281 209 99 130 128 86 76.74011536 +19 arena2.map 281 209 266 181 275 134 79.59797974 +19 arena2.map 281 209 253 115 250 40 76.24264069 +19 arena2.map 281 209 254 81 249 155 76.07106781 +20 arena2.map 281 209 86 130 139 91 80.28427124 +20 arena2.map 281 209 131 45 200 74 81.01219330 +20 arena2.map 281 209 51 105 96 168 83.98275604 +20 arena2.map 281 209 175 79 128 83 80.07106781 +20 arena2.map 281 209 110 81 80 146 82.69848480 +20 arena2.map 281 209 228 190 258 121 81.42640686 +20 arena2.map 281 209 131 104 90 67 80.72792206 +20 arena2.map 281 209 156 49 85 73 81.52691193 +20 arena2.map 281 209 130 71 84 129 83.49747467 +20 arena2.map 281 209 220 90 150 122 83.25483398 +21 arena2.map 281 209 190 142 126 113 84.21320343 +21 arena2.map 281 209 146 66 177 61 85.45584412 +21 arena2.map 281 209 90 78 129 67 87.11269836 +21 arena2.map 281 209 237 184 251 104 85.79898987 +21 arena2.map 281 209 86 85 154 87 86.97056274 +21 arena2.map 281 209 168 152 142 113 85.66904755 +21 arena2.map 281 209 135 10 79 56 84.42640686 +21 arena2.map 281 209 171 90 163 142 84.62741699 +21 arena2.map 281 209 134 45 82 101 85.74011536 +21 arena2.map 281 209 256 75 201 123 86.01219330 +22 arena2.map 281 209 187 92 166 171 88.52691193 +22 arena2.map 281 209 182 104 134 148 90.52691193 +22 arena2.map 281 209 209 94 266 62 90.59797974 +22 arena2.map 281 209 249 53 263 136 88.79898987 +22 arena2.map 281 209 257 63 210 84 91.35533905 +22 arena2.map 281 209 165 110 78 118 90.31370850 +22 arena2.map 281 209 131 136 188 77 89.63961029 +22 arena2.map 281 209 97 174 49 110 90.32590179 +22 arena2.map 281 209 97 165 112 119 91.04163055 +22 arena2.map 281 209 63 112 133 160 89.88225098 +23 arena2.map 281 209 119 67 78 67 93.28427124 +23 arena2.map 281 209 185 70 138 138 95.81118317 +23 arena2.map 281 209 196 103 141 167 93.22539673 +23 arena2.map 281 209 222 99 155 38 93.43860016 +23 arena2.map 281 209 74 123 145 175 92.53910522 +23 arena2.map 281 209 212 92 277 59 95.98275604 +23 arena2.map 281 209 181 96 255 126 95.11269836 +23 arena2.map 281 209 158 119 87 84 95.69848480 +23 arena2.map 281 209 165 108 92 123 94.72792206 +23 arena2.map 281 209 129 59 92 116 93.69848480 +24 arena2.map 281 209 72 101 143 45 99.46803741 +24 arena2.map 281 209 137 51 59 97 97.05382385 +24 arena2.map 281 209 147 62 228 98 96.74011536 +24 arena2.map 281 209 174 115 262 122 98.11269836 +24 arena2.map 281 209 252 139 193 131 98.59797974 +24 arena2.map 281 209 176 65 163 136 98.04163055 +24 arena2.map 281 209 175 130 87 155 98.35533905 +24 arena2.map 281 209 78 124 167 109 98.14213562 +24 arena2.map 281 209 98 170 82 79 97.62741699 +24 arena2.map 281 209 136 123 171 62 97.19595947 +25 arena2.map 281 209 261 85 178 121 100.25483398 +25 arena2.map 281 209 159 51 238 108 102.61017303 +25 arena2.map 281 209 78 55 13 104 102.18376617 +25 arena2.map 281 209 192 132 153 52 101.42640686 +25 arena2.map 281 209 78 106 175 96 102.79898987 +25 arena2.map 281 209 75 159 133 113 101.21320343 +25 arena2.map 281 209 144 94 240 109 102.21320343 +25 arena2.map 281 209 251 107 267 194 100.69848480 +25 arena2.map 281 209 205 122 240 152 103.52691193 +25 arena2.map 281 209 101 124 162 99 103.69848480 +26 arena2.map 281 209 263 78 179 96 104.18376617 +26 arena2.map 281 209 111 133 110 55 104.15432892 +26 arena2.map 281 209 100 151 128 75 105.63961029 +26 arena2.map 281 209 139 157 208 94 105.05382385 +26 arena2.map 281 209 95 156 128 134 104.01219330 +26 arena2.map 281 209 155 153 166 81 107.08326111 +26 arena2.map 281 209 147 131 159 74 106.49747467 +26 arena2.map 281 209 60 96 159 116 107.28427124 +26 arena2.map 281 209 94 111 133 30 104.36753235 +26 arena2.map 281 209 134 157 107 114 106.42640686 +27 arena2.map 281 209 267 45 208 113 109.42640686 +27 arena2.map 281 209 178 96 139 168 111.56854248 +27 arena2.map 281 209 257 121 173 146 108.88225098 +27 arena2.map 281 209 106 115 205 92 108.52691193 +27 arena2.map 281 209 199 86 242 154 110.84062042 +27 arena2.map 281 209 115 53 169 90 110.25483398 +27 arena2.map 281 209 206 111 228 151 109.55634918 +27 arena2.map 281 209 97 108 149 167 109.56854248 +27 arena2.map 281 209 231 100 249 191 109.62741699 +27 arena2.map 281 209 138 135 166 172 110.49747467 +28 arena2.map 281 209 166 110 257 85 113.11269836 +28 arena2.map 281 209 128 164 95 77 112.81118317 +28 arena2.map 281 209 170 93 109 63 113.18376617 +28 arena2.map 281 209 179 109 119 162 113.08326111 +28 arena2.map 281 209 119 52 206 106 115.22539673 +28 arena2.map 281 209 84 109 166 135 114.42640686 +28 arena2.map 281 209 162 44 132 99 112.39696960 +28 arena2.map 281 209 144 150 141 139 113.84062042 +28 arena2.map 281 209 134 81 158 143 114.36753235 +28 arena2.map 281 209 160 82 56 93 113.52691193 +29 arena2.map 281 209 150 148 51 100 118.88225098 +29 arena2.map 281 209 174 59 66 83 118.76955261 +29 arena2.map 281 209 136 169 226 99 118.99494934 +29 arena2.map 281 209 124 23 64 115 119.33809509 +29 arena2.map 281 209 114 77 121 164 118.95331879 +29 arena2.map 281 209 156 67 123 110 117.74011536 +29 arena2.map 281 209 138 120 140 162 118.32590179 +29 arena2.map 281 209 262 96 268 191 116.01219330 +29 arena2.map 281 209 240 57 190 78 119.56854248 +29 arena2.map 281 209 155 104 99 150 116.28427124 +30 arena2.map 281 209 125 83 158 39 121.08326111 +30 arena2.map 281 209 145 168 132 126 120.98275604 +30 arena2.map 281 209 208 102 115 155 120.22539673 +30 arena2.map 281 209 114 126 130 46 122.12489166 +30 arena2.map 281 209 276 130 178 91 120.25483398 +30 arena2.map 281 209 149 45 147 126 123.50966797 +30 arena2.map 281 209 173 91 94 71 121.62741699 +30 arena2.map 281 209 127 137 167 57 120.99494934 +30 arena2.map 281 209 154 113 92 55 120.28427124 +30 arena2.map 281 209 171 84 267 131 120.74011536 +31 arena2.map 281 209 146 95 135 165 126.92388153 +31 arena2.map 281 209 118 172 127 129 124.12489166 +31 arena2.map 281 209 75 117 132 13 127.61017303 +31 arena2.map 281 209 186 76 94 9 126.78174591 +31 arena2.map 281 209 174 88 250 149 125.52691193 +31 arena2.map 281 209 147 114 94 170 125.38477631 +31 arena2.map 281 209 118 42 205 112 125.95331879 +31 arena2.map 281 209 248 101 146 67 125.35533905 +31 arena2.map 281 209 152 58 115 78 126.01219330 +31 arena2.map 281 209 268 47 191 119 127.32590179 +32 arena2.map 281 209 173 130 265 142 128.22539673 +32 arena2.map 281 209 95 100 109 3 131.61017303 +32 arena2.map 281 209 260 125 163 159 129.50966797 +32 arena2.map 281 209 186 135 268 155 129.88225098 +32 arena2.map 281 209 138 158 120 132 131.98275604 +32 arena2.map 281 209 262 66 252 186 129.11269836 +32 arena2.map 281 209 189 123 130 27 128.05382385 +32 arena2.map 281 209 261 90 145 109 128.84062042 +32 arena2.map 281 209 132 67 101 166 130.71067810 +32 arena2.map 281 209 133 137 118 169 131.61017303 +33 arena2.map 281 209 116 117 247 109 135.97056274 +33 arena2.map 281 209 179 89 278 55 134.63961029 +33 arena2.map 281 209 177 134 74 105 133.39696960 +33 arena2.map 281 209 93 91 198 81 132.11269836 +33 arena2.map 281 209 158 122 240 79 134.94112549 +33 arena2.map 281 209 114 119 151 171 134.29646454 +33 arena2.map 281 209 159 58 110 114 132.49747467 +33 arena2.map 281 209 247 178 194 98 133.04163055 +33 arena2.map 281 209 79 86 197 110 135.59797974 +33 arena2.map 281 209 279 39 193 99 132.91168823 +34 arena2.map 281 209 124 44 133 65 138.85281372 +34 arena2.map 281 209 136 75 13 108 138.32590179 +34 arena2.map 281 209 261 104 132 124 137.28427124 +34 arena2.map 281 209 194 128 223 163 138.56854248 +34 arena2.map 281 209 115 124 168 46 137.50966797 +34 arena2.map 281 209 69 118 136 7 138.75230865 +34 arena2.map 281 209 117 118 151 175 137.36753235 +34 arena2.map 281 209 78 121 167 71 137.08326111 +34 arena2.map 281 209 83 131 165 61 139.69848480 +34 arena2.map 281 209 114 69 165 37 136.98275604 +35 arena2.map 281 209 132 172 101 57 142.61017303 +35 arena2.map 281 209 258 65 154 85 143.01219330 +35 arena2.map 281 209 168 172 111 104 142.05382385 +35 arena2.map 281 209 172 103 96 53 140.42640686 +35 arena2.map 281 209 206 106 73 96 141.28427124 +35 arena2.map 281 209 123 78 253 105 141.18376617 +35 arena2.map 281 209 253 137 161 159 140.61017303 +35 arena2.map 281 209 182 79 272 49 140.71067810 +35 arena2.map 281 209 158 166 252 78 142.16652222 +35 arena2.map 281 209 227 155 196 142 143.25483398 +36 arena2.map 281 209 1 110 112 67 146.28427124 +36 arena2.map 281 209 230 175 180 108 146.35533905 +36 arena2.map 281 209 206 108 93 84 145.76955261 +36 arena2.map 281 209 111 72 156 152 145.06601715 +36 arena2.map 281 209 260 199 207 102 144.18376617 +36 arena2.map 281 209 122 10 158 98 144.16652222 +36 arena2.map 281 209 95 174 115 43 146.74011536 +36 arena2.map 281 209 260 100 127 74 146.25483398 +36 arena2.map 281 209 276 46 223 159 144.32590179 +36 arena2.map 281 209 86 74 168 151 146.69848480 +37 arena2.map 281 209 238 56 159 124 150.74011536 +37 arena2.map 281 209 116 69 251 101 149.91168823 +37 arena2.map 281 209 167 141 39 99 150.95331879 +37 arena2.map 281 209 134 2 193 116 148.53910522 +37 arena2.map 281 209 251 86 124 108 149.52691193 +37 arena2.map 281 209 218 108 127 3 150.30865784 +37 arena2.map 281 209 76 151 127 23 149.12489166 +37 arena2.map 281 209 242 202 236 62 149.94112549 +37 arena2.map 281 209 106 14 64 118 148.75230865 +37 arena2.map 281 209 133 60 150 143 149.05382385 +38 arena2.map 281 209 255 89 134 46 153.92388153 +38 arena2.map 281 209 235 175 181 82 153.22539673 +38 arena2.map 281 209 256 41 242 191 155.79898987 +38 arena2.map 281 209 111 65 163 169 155.62236633 +38 arena2.map 281 209 183 51 280 150 155.23759003 +38 arena2.map 281 209 267 137 151 60 154.33809509 +38 arena2.map 281 209 164 46 276 135 155.89444427 +38 arena2.map 281 209 213 90 75 76 155.39696960 +38 arena2.map 281 209 176 61 233 159 155.26702728 +38 arena2.map 281 209 129 51 174 157 154.98275604 +39 arena2.map 281 209 259 205 270 62 158.32590179 +39 arena2.map 281 209 125 102 115 4 157.19595947 +39 arena2.map 281 209 246 201 194 87 159.59797974 +39 arena2.map 281 209 139 138 12 98 157.46803741 +39 arena2.map 281 209 93 129 225 109 159.88225098 +39 arena2.map 281 209 188 129 125 4 158.71067810 +39 arena2.map 281 209 116 100 254 86 157.11269836 +39 arena2.map 281 209 265 131 135 74 158.88225098 +39 arena2.map 281 209 129 170 183 50 159.05382385 +39 arena2.map 281 209 212 85 278 185 157.25483398 +40 arena2.map 281 209 106 169 242 108 162.09545441 +40 arena2.map 281 209 131 8 235 108 161.23759003 +40 arena2.map 281 209 238 106 98 139 162.05382385 +40 arena2.map 281 209 144 167 145 58 163.19595947 +40 arena2.map 281 209 86 65 173 136 163.59797974 +40 arena2.map 281 209 270 59 149 79 163.81118317 +40 arena2.map 281 209 127 89 241 75 163.69848480 +40 arena2.map 281 209 147 148 273 142 163.33809509 +40 arena2.map 281 209 148 175 167 40 161.09545441 +40 arena2.map 281 209 250 154 138 115 161.97056274 +41 arena2.map 281 209 200 132 83 63 164.91168823 +41 arena2.map 281 209 245 203 269 47 165.94112549 +41 arena2.map 281 209 195 127 108 13 165.85281372 +41 arena2.map 281 209 80 150 227 103 166.46803741 +41 arena2.map 281 209 166 34 236 66 166.16652222 +41 arena2.map 281 209 127 132 244 75 166.91168823 +41 arena2.map 281 209 105 6 125 103 165.61017303 +41 arena2.map 281 209 245 158 161 53 164.09545441 +41 arena2.map 281 209 77 71 177 159 165.74011536 +41 arena2.map 281 209 141 119 124 14 165.03657989 +42 arena2.map 281 209 165 39 280 67 168.13708496 +42 arena2.map 281 209 154 165 128 54 171.02438660 +42 arena2.map 281 209 173 103 258 191 168.94112549 +42 arena2.map 281 209 275 51 148 99 168.39696960 +42 arena2.map 281 209 57 112 218 99 170.52691193 +42 arena2.map 281 209 177 64 244 186 171.95331879 +42 arena2.map 281 209 109 134 111 2 170.99494934 +42 arena2.map 281 209 265 68 139 155 171.99494934 +42 arena2.map 281 209 160 53 115 147 170.98275604 +42 arena2.map 281 209 268 142 140 70 168.95331879 +43 arena2.map 281 209 94 74 241 110 173.61017303 +43 arena2.map 281 209 242 77 122 138 175.56854248 +43 arena2.map 281 209 116 164 146 35 175.65180359 +43 arena2.map 281 209 261 71 129 146 174.43860016 +43 arena2.map 281 209 231 165 159 65 175.09545441 +43 arena2.map 281 209 175 150 218 163 172.26702728 +43 arena2.map 281 209 139 162 236 79 174.50966797 +43 arena2.map 281 209 146 170 275 72 174.86500702 +43 arena2.map 281 209 146 68 242 58 172.91168823 +43 arena2.map 281 209 144 173 245 66 173.13708496 +44 arena2.map 281 209 151 73 280 55 177.95331879 +44 arena2.map 281 209 136 78 103 13 179.68124084 +44 arena2.map 281 209 135 125 265 158 179.08326111 +44 arena2.map 281 209 253 204 188 138 177.22539673 +44 arena2.map 281 209 247 157 127 121 179.69848480 +44 arena2.map 281 209 265 35 246 207 179.87005768 +44 arena2.map 281 209 88 126 240 103 177.28427124 +44 arena2.map 281 209 266 69 121 105 176.15432892 +44 arena2.map 281 209 148 146 259 47 178.61017303 +44 arena2.map 281 209 178 158 93 57 179.49747467 +45 arena2.map 281 209 257 142 109 116 181.45584412 +45 arena2.map 281 209 233 158 142 75 183.63961029 +45 arena2.map 281 209 257 95 97 148 181.95331879 +45 arena2.map 281 209 127 30 253 133 180.96551208 +45 arena2.map 281 209 261 39 280 189 183.76955261 +45 arena2.map 281 209 112 76 94 3 183.26702728 +45 arena2.map 281 209 144 131 265 44 181.05382385 +45 arena2.map 281 209 128 86 275 151 183.88225098 +45 arena2.map 281 209 277 137 140 44 180.79393921 +45 arena2.map 281 209 184 53 100 164 182.98275604 +46 arena2.map 281 209 139 147 274 156 185.33809509 +46 arena2.map 281 209 265 141 110 88 186.91168823 +46 arena2.map 281 209 125 20 264 120 185.10764770 +46 arena2.map 281 209 239 148 136 156 185.95331879 +46 arena2.map 281 209 131 150 245 152 184.12489166 +46 arena2.map 281 209 280 68 125 79 184.71067810 +46 arena2.map 281 209 264 182 164 91 184.59797974 +46 arena2.map 281 209 277 186 273 39 184.49747467 +46 arena2.map 281 209 182 157 98 44 185.56854248 +46 arena2.map 281 209 104 158 262 89 186.58073578 +47 arena2.map 281 209 146 163 229 153 190.92388153 +47 arena2.map 281 209 116 94 250 51 188.79898987 +47 arena2.map 281 209 123 75 263 151 188.46803741 +47 arena2.map 281 209 140 105 225 161 188.49747467 +47 arena2.map 281 209 171 159 258 185 191.26702728 +47 arena2.map 281 209 114 48 264 131 189.65180359 +47 arena2.map 281 209 55 109 235 99 191.45584412 +47 arena2.map 281 209 114 142 270 73 189.85281372 +47 arena2.map 281 209 255 50 128 138 189.81118317 +47 arena2.map 281 209 111 11 111 160 188.23759003 +48 arena2.map 281 209 275 188 166 95 195.25483398 +48 arena2.map 281 209 279 67 112 89 192.98275604 +48 arena2.map 281 209 220 182 161 153 195.13708496 +48 arena2.map 281 209 160 38 234 174 195.96551208 +48 arena2.map 281 209 120 59 255 59 192.53910522 +48 arena2.map 281 209 115 87 264 55 193.66904755 +48 arena2.map 281 209 82 78 253 106 195.85281372 +48 arena2.map 281 209 251 180 149 78 194.08326111 +48 arena2.map 281 209 11 111 163 76 192.43860016 +48 arena2.map 281 209 255 53 120 71 193.56854248 +49 arena2.map 281 209 263 107 100 82 199.88225098 +49 arena2.map 281 209 116 37 260 140 198.96551208 +49 arena2.map 281 209 115 97 234 150 199.11269836 +49 arena2.map 281 209 165 127 92 8 196.40916290 +49 arena2.map 281 209 232 149 128 151 199.29646454 +49 arena2.map 281 209 268 151 125 55 196.82337646 +49 arena2.map 281 209 261 195 162 76 196.36753235 +49 arena2.map 281 209 258 134 104 163 198.33809509 +49 arena2.map 281 209 260 48 135 44 196.82337646 +49 arena2.map 281 209 239 197 165 60 198.68124084 +50 arena2.map 281 209 182 55 254 207 201.19595947 +50 arena2.map 281 209 156 140 221 190 202.33809509 +50 arena2.map 281 209 109 12 133 147 203.50966797 +50 arena2.map 281 209 264 149 123 35 203.45079346 +50 arena2.map 281 209 237 167 131 65 201.43860016 +50 arena2.map 281 209 85 94 248 78 201.87005768 +50 arena2.map 281 209 264 40 126 78 201.39696960 +50 arena2.map 281 209 119 153 99 9 203.23759003 +50 arena2.map 281 209 154 87 264 195 201.63961029 +50 arena2.map 281 209 89 118 261 128 202.42640686 +51 arena2.map 281 209 134 68 227 170 204.92388153 +51 arena2.map 281 209 269 201 161 132 204.19595947 +51 arena2.map 281 209 226 151 117 107 205.52691193 +51 arena2.map 281 209 183 159 7 97 207.58073578 +51 arena2.map 281 209 133 112 226 181 205.15432892 +51 arena2.map 281 209 131 32 237 153 206.96551208 +51 arena2.map 281 209 99 146 256 143 205.29646454 +51 arena2.map 281 209 99 119 264 100 205.35533905 +51 arena2.map 281 209 222 170 129 107 205.39696960 +51 arena2.map 281 209 252 123 107 13 204.62236633 +52 arena2.map 281 209 264 146 125 19 210.35028839 +52 arena2.map 281 209 250 182 141 66 209.22539673 +52 arena2.map 281 209 118 55 234 147 209.78174591 +52 arena2.map 281 209 263 43 129 43 209.48023071 +52 arena2.map 281 209 240 191 138 102 208.49747467 +52 arena2.map 281 209 117 91 265 35 210.42640686 +52 arena2.map 281 209 250 40 113 73 211.49747467 +52 arena2.map 281 209 259 180 132 112 208.69848480 +52 arena2.map 281 209 256 72 94 74 211.43860016 +52 arena2.map 281 209 243 161 125 41 208.89444427 +53 arena2.map 281 209 125 77 242 180 213.39696960 +53 arena2.map 281 209 124 175 260 47 214.20815277 +53 arena2.map 281 209 143 166 115 11 215.79393921 +53 arena2.map 281 209 247 54 108 154 212.43860016 +53 arena2.map 281 209 125 105 243 187 215.01219330 +53 arena2.map 281 209 135 166 111 10 212.20815277 +53 arena2.map 281 209 143 106 259 200 213.74011536 +53 arena2.map 281 209 91 5 118 158 213.96551208 +53 arena2.map 281 209 61 95 262 117 214.25483398 +53 arena2.map 281 209 152 156 110 10 212.55129852 +54 arena2.map 281 209 257 153 101 143 216.12489166 +54 arena2.map 281 209 91 10 169 157 219.06601715 +54 arena2.map 281 209 250 191 125 89 219.42640686 +54 arena2.map 281 209 118 51 242 166 217.16652222 +54 arena2.map 281 209 259 199 140 126 216.56854248 +54 arena2.map 281 209 273 139 96 54 217.48023071 +54 arena2.map 281 209 212 114 4 105 218.35533905 +54 arena2.map 281 209 124 2 252 141 217.79393921 +54 arena2.map 281 209 238 60 133 13 216.45079346 +54 arena2.map 281 209 239 60 129 12 217.03657989 +55 arena2.map 281 209 110 110 222 172 223.98275604 +55 arena2.map 281 209 159 175 219 190 220.52186127 +55 arena2.map 281 209 222 146 104 109 220.45584412 +55 arena2.map 281 209 77 54 253 72 223.78174591 +55 arena2.map 281 209 125 153 271 34 221.65180359 +55 arena2.map 281 209 268 68 78 113 220.98275604 +55 arena2.map 281 209 129 47 237 179 222.89444427 +55 arena2.map 281 209 256 144 93 172 222.23759003 +55 arena2.map 281 209 128 90 231 191 220.56854248 +55 arena2.map 281 209 254 104 40 106 222.28427124 +56 arena2.map 281 209 100 170 280 142 225.86500702 +56 arena2.map 281 209 262 186 118 115 226.94112549 +56 arena2.map 281 209 218 157 129 37 226.37972565 +56 arena2.map 281 209 274 55 132 12 226.17871551 +56 arena2.map 281 209 253 50 85 102 224.52691193 +56 arena2.map 281 209 73 114 236 74 226.01219330 +56 arena2.map 281 209 239 79 102 114 227.94112549 +56 arena2.map 281 209 138 168 245 194 225.99494934 +56 arena2.map 281 209 0 105 214 107 225.59797974 +56 arena2.map 281 209 99 111 228 160 224.42640686 +57 arena2.map 281 209 246 61 70 94 230.59797974 +57 arena2.map 281 209 250 135 55 102 231.35533905 +57 arena2.map 281 209 235 72 82 125 229.25483398 +57 arena2.map 281 209 262 134 59 103 230.08326111 +57 arena2.map 281 209 246 172 110 166 230.75230865 +57 arena2.map 281 209 81 102 235 55 229.32590179 +57 arena2.map 281 209 148 144 267 197 228.46803741 +57 arena2.map 281 209 111 10 275 65 231.14927826 +57 arena2.map 281 209 67 111 240 66 230.66904755 +57 arena2.map 281 209 148 141 270 202 230.53910522 +58 arena2.map 281 209 235 64 112 2 232.90663757 +58 arena2.map 281 209 263 57 100 131 232.09545441 +58 arena2.map 281 209 100 169 274 157 234.45079346 +58 arena2.map 281 209 235 156 101 174 235.72287140 +58 arena2.map 281 209 268 41 113 174 234.10764770 +58 arena2.map 281 209 229 181 125 175 235.52186127 +58 arena2.map 281 209 68 87 251 59 235.42640686 +58 arena2.map 281 209 92 137 269 55 234.48023071 +58 arena2.map 281 209 76 51 254 64 234.43860016 +58 arena2.map 281 209 280 73 117 2 233.07821045 +59 arena2.map 281 209 74 62 276 69 238.33809509 +59 arena2.map 281 209 245 170 100 68 237.61017303 +59 arena2.map 281 209 132 136 280 186 239.63961029 +59 arena2.map 281 209 62 90 235 78 237.18376617 +59 arena2.map 281 209 246 206 138 167 237.16652222 +59 arena2.map 281 209 261 54 84 83 238.42640686 +59 arena2.map 281 209 274 195 136 149 238.75230865 +59 arena2.map 281 209 97 88 263 58 236.32590179 +59 arena2.map 281 209 244 170 99 51 239.33809509 +59 arena2.map 281 209 142 157 273 205 239.20815277 +60 arena2.map 281 209 107 13 260 159 243.93607483 +60 arena2.map 281 209 270 53 83 66 242.16652222 +60 arena2.map 281 209 109 144 258 178 241.46803741 +60 arena2.map 281 209 99 163 251 35 242.50966797 +60 arena2.map 281 209 108 9 280 59 242.63455963 +60 arena2.map 281 209 127 75 273 189 240.12489166 +60 arena2.map 281 209 98 85 270 56 242.58073578 +60 arena2.map 281 209 127 92 277 205 243.71067810 +60 arena2.map 281 209 251 54 103 3 243.10764770 +60 arena2.map 281 209 75 151 273 146 240.58073578 +61 arena2.map 281 209 260 45 94 119 245.49747467 +61 arena2.map 281 209 84 120 231 167 247.15432892 +61 arena2.map 281 209 103 154 224 176 245.89444427 +61 arena2.map 281 209 70 122 278 153 246.78174591 +61 arena2.map 281 209 111 171 277 34 245.59292908 +61 arena2.map 281 209 250 57 55 104 247.94112549 +61 arena2.map 281 209 274 155 76 125 244.71067810 +61 arena2.map 281 209 101 152 220 171 247.82337646 +61 arena2.map 281 209 243 167 93 46 244.82337646 +61 arena2.map 281 209 275 198 135 156 244.89444427 +62 arena2.map 281 209 220 153 79 109 249.52691193 +62 arena2.map 281 209 103 40 230 175 250.69343414 +62 arena2.map 281 209 104 4 264 53 248.07821045 +62 arena2.map 281 209 101 103 257 194 250.15432892 +62 arena2.map 281 209 98 161 249 179 250.09545441 +62 arena2.map 281 209 113 70 254 202 251.95331879 +62 arena2.map 281 209 244 197 127 28 249.03657989 +62 arena2.map 281 209 249 186 102 143 249.53910522 +62 arena2.map 281 209 240 183 105 164 248.40916290 +62 arena2.map 281 209 230 160 95 130 249.50966797 +63 arena2.map 281 209 58 122 240 150 254.42640686 +63 arena2.map 281 209 75 118 269 40 254.46803741 +63 arena2.map 281 209 269 38 75 116 255.63961029 +63 arena2.map 281 209 109 81 238 206 255.39696960 +63 arena2.map 281 209 277 182 120 151 253.19595947 +63 arena2.map 281 209 250 37 69 100 252.28427124 +63 arena2.map 281 209 112 146 257 200 253.85281372 +63 arena2.map 281 209 265 38 93 40 252.55129852 +63 arena2.map 281 209 275 38 95 161 252.62236633 +63 arena2.map 281 209 227 169 93 95 255.63961029 +64 arena2.map 281 209 232 166 77 129 257.63961029 +64 arena2.map 281 209 120 164 272 192 257.72287140 +64 arena2.map 281 209 84 129 267 41 257.56854248 +64 arena2.map 281 209 67 121 237 169 259.98275604 +64 arena2.map 281 209 251 127 23 106 258.25483398 +64 arena2.map 281 209 83 122 224 168 256.98275604 +64 arena2.map 281 209 76 130 257 41 257.74011536 +64 arena2.map 281 209 91 4 240 57 256.24978332 +64 arena2.map 281 209 242 182 101 35 256.79393921 +64 arena2.map 281 209 224 163 101 79 256.33809509 +65 arena2.map 281 209 221 184 102 137 262.65180359 +65 arena2.map 281 209 274 39 83 77 262.37972565 +65 arena2.map 281 209 94 4 252 45 261.10764770 +65 arena2.map 281 209 66 95 262 35 262.66904755 +65 arena2.map 281 209 276 206 130 172 260.83556976 +65 arena2.map 281 209 93 60 259 183 263.85281372 +65 arena2.map 281 209 44 110 248 52 263.94112549 +65 arena2.map 281 209 76 89 245 183 263.32590179 +65 arena2.map 281 209 98 99 245 207 261.18376617 +65 arena2.map 281 209 127 12 256 191 262.35028839 +66 arena2.map 281 209 90 51 226 179 264.79393921 +66 arena2.map 281 209 258 206 118 36 266.69343414 +66 arena2.map 281 209 227 190 103 46 264.45079346 +66 arena2.map 281 209 111 9 238 181 265.24978332 +66 arena2.map 281 209 279 201 126 168 264.10764770 +66 arena2.map 281 209 219 161 114 2 265.32085113 +66 arena2.map 281 209 236 200 107 162 264.23759003 +66 arena2.map 281 209 229 152 92 13 267.27922058 +66 arena2.map 281 209 227 171 80 68 264.30865784 +66 arena2.map 281 209 106 61 268 197 265.23759003 +67 arena2.map 281 209 235 199 96 144 269.68124084 +67 arena2.map 281 209 254 195 95 138 268.50966797 +67 arena2.map 281 209 110 165 258 206 269.30865784 +67 arena2.map 281 209 81 100 264 180 268.01219330 +67 arena2.map 281 209 108 10 240 183 269.00714264 +67 arena2.map 281 209 100 44 252 198 270.89444427 +67 arena2.map 281 209 260 99 3 110 270.66904755 +67 arena2.map 281 209 90 172 248 186 268.06601715 +67 arena2.map 281 209 264 190 82 98 271.15432892 +67 arena2.map 281 209 118 6 239 191 270.83556976 +68 arena2.map 281 209 91 172 245 193 273.65180359 +68 arena2.map 281 209 227 185 100 116 275.39696960 +68 arena2.map 281 209 95 40 259 193 275.45079346 +68 arena2.map 281 209 62 95 280 36 273.12489166 +68 arena2.map 281 209 79 105 237 196 272.49747467 +68 arena2.map 281 209 86 86 230 187 272.39696960 +68 arena2.map 281 209 93 101 275 200 275.71067810 +68 arena2.map 281 209 93 151 241 202 273.61017303 +68 arena2.map 281 209 74 76 239 179 275.63961029 +68 arena2.map 281 209 261 182 95 93 274.25483398 +69 arena2.map 281 209 245 176 47 108 279.94112549 +69 arena2.map 281 209 90 70 249 201 278.50966797 +69 arena2.map 281 209 108 174 271 200 276.17871551 +69 arena2.map 281 209 89 68 250 201 279.09545441 +69 arena2.map 281 209 67 101 244 191 277.42640686 +69 arena2.map 281 209 98 168 272 187 279.30865784 +69 arena2.map 281 209 279 204 116 36 279.49242401 +69 arena2.map 281 209 269 194 134 8 278.42135620 +69 arena2.map 281 209 94 132 268 181 277.85281372 +69 arena2.map 281 209 88 147 253 203 278.78174591 +70 arena2.map 281 209 123 20 280 203 283.22034607 +70 arena2.map 281 209 222 191 73 94 281.78174591 +70 arena2.map 281 209 274 36 48 101 283.81118317 +70 arena2.map 281 209 18 104 260 142 281.15432892 +70 arena2.map 281 209 240 54 27 100 283.08326111 +70 arena2.map 281 209 79 133 263 181 283.92388153 +70 arena2.map 281 209 93 162 235 203 281.65180359 +70 arena2.map 281 209 241 190 66 89 281.98275604 +70 arena2.map 281 209 71 115 242 200 282.42640686 +70 arena2.map 281 209 16 98 257 86 281.08326111 +71 arena2.map 281 209 271 199 93 55 284.55129852 +71 arena2.map 281 209 276 186 91 68 285.75230865 +71 arena2.map 281 209 33 107 258 157 286.25483398 +71 arena2.map 281 209 25 104 263 56 285.15432892 +71 arena2.map 281 209 48 107 243 182 286.18376617 +71 arena2.map 281 209 280 206 109 173 286.24978332 +71 arena2.map 281 209 16 111 261 84 286.81118317 +71 arena2.map 281 209 263 90 21 97 286.74011536 +71 arena2.map 281 209 99 70 271 207 286.96551208 +71 arena2.map 281 209 40 109 224 154 284.94112549 +72 arena2.map 281 209 260 179 94 11 289.52186127 +72 arena2.map 281 209 72 114 278 178 290.18376617 +72 arena2.map 281 209 71 106 262 205 291.98275604 +72 arena2.map 281 209 12 101 265 144 291.63961029 +72 arena2.map 281 209 20 102 269 61 288.22539673 +72 arena2.map 281 209 276 201 99 44 288.93607483 +72 arena2.map 281 209 246 79 13 111 291.08326111 +72 arena2.map 281 209 249 60 12 103 289.59797974 +72 arena2.map 281 209 265 199 80 129 291.46803741 +72 arena2.map 281 209 20 105 251 52 289.59797974 +73 arena2.map 281 209 63 124 254 198 293.81118317 +73 arena2.map 281 209 31 102 227 152 295.25483398 +73 arena2.map 281 209 81 143 276 193 295.75230865 +73 arena2.map 281 209 267 199 76 65 295.89444427 +73 arena2.map 281 209 55 92 233 187 292.05382385 +73 arena2.map 281 209 269 186 76 60 292.09545441 +73 arena2.map 281 209 252 197 100 6 292.66399689 +73 arena2.map 281 209 279 194 90 157 292.65180359 +73 arena2.map 281 209 77 103 275 203 292.95331879 +73 arena2.map 281 209 235 65 12 106 293.39696960 +74 arena2.map 281 209 276 40 36 100 299.05382385 +74 arena2.map 281 209 276 181 79 50 298.16652222 +74 arena2.map 281 209 276 62 14 108 297.19595947 +74 arena2.map 281 209 62 99 266 199 297.05382385 +74 arena2.map 281 209 277 207 89 89 298.02438660 +74 arena2.map 281 209 6 112 238 71 296.98275604 +74 arena2.map 281 209 83 71 277 190 297.65180359 +74 arena2.map 281 209 220 170 37 111 299.39696960 +74 arena2.map 281 209 50 102 228 188 298.46803741 +74 arena2.map 281 209 18 108 242 50 298.56854248 +75 arena2.map 281 209 7 101 245 149 300.66904755 +75 arena2.map 281 209 256 64 0 112 302.56854248 +75 arena2.map 281 209 254 204 99 3 302.73506470 +75 arena2.map 281 209 46 108 224 187 300.63961029 +75 arena2.map 281 209 98 12 263 204 303.73506470 +75 arena2.map 281 209 49 107 269 180 303.76955261 +75 arena2.map 281 209 35 102 225 164 301.39696960 +75 arena2.map 281 209 104 12 276 195 301.73506470 +75 arena2.map 281 209 274 150 12 107 302.19595947 +75 arena2.map 281 209 265 149 6 104 302.22539673 +76 arena2.map 281 209 85 77 279 201 304.69343414 +76 arena2.map 281 209 39 108 229 188 306.56854248 +76 arena2.map 281 209 265 144 14 111 306.71067810 +76 arena2.map 281 209 268 205 62 117 304.71067810 +76 arena2.map 281 209 226 153 24 105 304.32590179 +76 arena2.map 281 209 272 40 23 104 306.88225098 +76 arena2.map 281 209 272 205 79 74 304.69343414 +76 arena2.map 281 209 279 178 61 120 304.66904755 +76 arena2.map 281 209 43 106 244 195 304.18376617 +76 arena2.map 281 209 280 199 106 8 307.04877319 +77 arena2.map 281 209 263 153 1 102 310.39696960 +77 arena2.map 281 209 12 108 252 43 308.25483398 +77 arena2.map 281 209 26 100 241 180 309.91168823 +77 arena2.map 281 209 7 110 237 53 309.46803741 +77 arena2.map 281 209 256 185 34 99 310.91168823 +77 arena2.map 281 209 23 97 246 66 308.08326111 +77 arena2.map 281 209 15 108 245 169 311.56854248 +77 arena2.map 281 209 279 198 61 95 311.71067810 +77 arena2.map 281 209 278 200 64 121 309.36753235 +77 arena2.map 281 209 10 105 278 52 310.78174591 +78 arena2.map 281 209 29 106 220 164 312.05382385 +78 arena2.map 281 209 253 46 4 106 312.84062042 +78 arena2.map 281 209 26 99 228 180 314.88225098 +78 arena2.map 281 209 240 147 11 111 312.49747467 +78 arena2.map 281 209 257 50 2 98 313.32590179 +78 arena2.map 281 209 229 163 16 108 314.71067810 +78 arena2.map 281 209 35 101 256 183 312.49747467 +78 arena2.map 281 209 41 109 249 203 313.35533905 +78 arena2.map 281 209 22 97 262 63 312.56854248 +78 arena2.map 281 209 40 106 261 196 313.56854248 +79 arena2.map 281 209 245 187 25 104 317.91168823 +79 arena2.map 281 209 279 58 0 99 316.02438660 +79 arena2.map 281 209 97 4 279 206 319.60512237 +79 arena2.map 281 209 59 104 280 206 316.78174591 +79 arena2.map 281 209 276 203 57 88 317.68124084 +79 arena2.map 281 209 27 107 248 185 316.74011536 +79 arena2.map 281 209 8 108 229 146 316.49747467 +79 arena2.map 281 209 256 152 22 97 317.32590179 +79 arena2.map 281 209 33 98 265 181 318.25483398 +79 arena2.map 281 209 32 107 235 186 319.39696960 +80 arena2.map 281 209 21 105 226 180 323.19595947 +80 arena2.map 281 209 46 101 280 183 320.66904755 +80 arena2.map 281 209 4 104 258 40 320.08326111 +80 arena2.map 281 209 41 101 252 206 320.08326111 +80 arena2.map 281 209 19 104 251 182 321.15432892 +80 arena2.map 281 209 7 102 236 168 320.63961029 +80 arena2.map 281 209 245 205 36 111 320.35533905 +80 arena2.map 281 209 233 187 28 106 321.88225098 +80 arena2.map 281 209 219 147 11 109 323.49747467 +80 arena2.map 281 209 92 5 278 201 321.11984100 +81 arena2.map 281 209 255 195 36 106 326.56854248 +81 arena2.map 281 209 11 108 238 176 325.46803741 +81 arena2.map 281 209 272 39 5 109 327.95331879 +81 arena2.map 281 209 26 107 220 184 326.09545441 +81 arena2.map 281 209 20 97 252 42 327.42640686 +81 arena2.map 281 209 224 148 8 112 324.91168823 +81 arena2.map 281 209 275 158 15 111 325.85281372 +81 arena2.map 281 209 8 109 265 36 325.05382385 +81 arena2.map 281 209 6 97 245 173 326.15432892 +81 arena2.map 281 209 264 194 32 101 325.46803741 +82 arena2.map 281 209 37 98 271 201 328.53910522 +82 arena2.map 281 209 270 204 36 98 330.95331879 +82 arena2.map 281 209 15 105 243 186 328.15432892 +82 arena2.map 281 209 237 191 19 102 331.22539673 +82 arena2.map 281 209 14 105 256 180 330.74011536 +82 arena2.map 281 209 13 103 241 184 328.15432892 +82 arena2.map 281 209 228 186 21 106 328.78174591 +82 arena2.map 281 209 263 196 32 104 328.88225098 +82 arena2.map 281 209 218 182 20 102 329.68124084 +82 arena2.map 281 209 40 101 278 196 330.05382385 +83 arena2.map 281 209 28 102 269 189 332.22539673 +83 arena2.map 281 209 30 107 270 182 333.32590179 +83 arena2.map 281 209 275 49 23 97 332.95331879 +83 arena2.map 281 209 278 206 40 107 332.53910522 +83 arena2.map 281 209 14 104 223 182 333.02438660 +83 arena2.map 281 209 15 103 260 182 333.74011536 +83 arena2.map 281 209 240 197 20 105 335.39696960 +83 arena2.map 281 209 228 172 4 111 333.85281372 +83 arena2.map 281 209 9 108 219 169 334.19595947 +83 arena2.map 281 209 224 157 12 111 333.05382385 +84 arena2.map 281 209 1 101 220 162 337.05382385 +84 arena2.map 281 209 8 105 249 188 337.15432892 +84 arena2.map 281 209 16 106 222 187 337.26702728 +84 arena2.map 281 209 15 98 232 173 336.71067810 +84 arena2.map 281 209 8 106 256 186 339.63961029 +84 arena2.map 281 209 220 156 13 112 337.22539673 +84 arena2.map 281 209 14 111 238 177 339.29646454 +84 arena2.map 281 209 234 171 18 97 337.29646454 +84 arena2.map 281 209 31 104 264 206 339.71067810 +84 arena2.map 281 209 237 199 20 106 339.05382385 +85 arena2.map 281 209 247 184 15 99 342.74011536 +85 arena2.map 281 209 220 167 0 111 342.61017303 +85 arena2.map 281 209 17 102 268 187 342.22539673 +85 arena2.map 281 209 23 106 272 191 342.71067810 +85 arena2.map 281 209 18 103 254 200 340.39696960 +85 arena2.map 281 209 22 105 271 193 343.12489166 +85 arena2.map 281 209 241 198 16 106 340.39696960 +85 arena2.map 281 209 13 105 229 191 340.95331879 +85 arena2.map 281 209 21 104 235 202 341.05382385 +85 arena2.map 281 209 16 96 225 171 340.61017303 +86 arena2.map 281 209 11 105 266 186 346.22539673 +86 arena2.map 281 209 227 189 10 109 344.43860016 +86 arena2.map 281 209 18 107 270 189 345.29646454 +86 arena2.map 281 209 12 104 264 194 346.12489166 +86 arena2.map 281 209 243 203 13 107 347.98275604 +86 arena2.map 281 209 274 190 22 106 345.29646454 +86 arena2.map 281 209 274 203 30 105 344.02438660 +86 arena2.map 281 209 8 111 260 180 344.39696960 +86 arena2.map 281 209 272 182 17 107 345.39696960 +86 arena2.map 281 209 18 102 263 201 345.53910522 +87 arena2.map 281 209 33 105 280 204 349.19595947 +87 arena2.map 281 209 6 107 220 188 349.50966797 +87 arena2.map 281 209 220 184 0 103 349.85281372 +87 arena2.map 281 209 20 107 261 205 348.53910522 +87 arena2.map 281 209 264 196 10 107 350.19595947 +87 arena2.map 281 209 9 103 267 190 350.05382385 +87 arena2.map 281 209 3 101 248 198 351.74011536 +87 arena2.map 281 209 18 106 274 188 348.46803741 +87 arena2.map 281 209 12 109 270 188 351.71067810 +87 arena2.map 281 209 260 188 6 112 349.53910522 +88 arena2.map 281 209 0 111 224 186 353.50966797 +88 arena2.map 281 209 16 107 272 197 352.61017303 +88 arena2.map 281 209 247 204 5 101 355.32590179 +88 arena2.map 281 209 265 200 8 103 354.95331879 +88 arena2.map 281 209 268 191 8 110 355.95331879 +88 arena2.map 281 209 13 107 275 183 352.81118317 +88 arena2.map 281 209 1 100 245 198 353.74011536 +88 arena2.map 281 209 272 185 9 102 353.39696960 +88 arena2.map 281 209 241 197 7 112 352.05382385 +88 arena2.map 281 209 12 103 259 206 354.46803741 +89 arena2.map 281 209 222 189 14 96 356.68124084 +89 arena2.map 281 209 10 109 276 184 358.05382385 +89 arena2.map 281 209 19 97 240 192 356.81118317 +89 arena2.map 281 209 256 190 19 97 356.46803741 +89 arena2.map 281 209 7 105 260 202 356.71067810 +89 arena2.map 281 209 21 97 224 183 356.43860016 +89 arena2.map 281 209 242 206 8 109 357.22539673 +89 arena2.map 281 209 251 207 8 99 358.98275604 +89 arena2.map 281 209 5 99 267 191 356.12489166 +89 arena2.map 281 209 273 197 10 104 358.36753235 +90 arena2.map 281 209 258 203 6 97 360.71067810 +90 arena2.map 281 209 268 190 1 112 362.78174591 +90 arena2.map 281 209 10 96 272 184 360.22539673 +90 arena2.map 281 209 279 196 13 106 361.78174591 +90 arena2.map 281 209 10 108 280 187 362.88225098 +90 arena2.map 281 209 270 197 6 111 362.26702728 +90 arena2.map 281 209 267 178 16 112 360.98275604 +90 arena2.map 281 209 11 107 273 207 363.92388153 +90 arena2.map 281 209 268 198 4 101 360.19595947 +90 arena2.map 281 209 5 112 275 181 362.05382385 diff --git a/examples/grid.weight b/examples/grid.weight new file mode 100644 index 0000000..41cb4cd --- /dev/null +++ b/examples/grid.weight @@ -0,0 +1,7 @@ +. 1 +@ 10 +\ 2 +1 1 +T 1.5 +S 2 +W 4 diff --git a/include/warthog/defines.h b/include/warthog/defines.h index 318ee2c..524f6a4 100644 --- a/include/warthog/defines.h +++ b/include/warthog/defines.h @@ -12,4 +12,13 @@ #endif // +// add missing config + +#ifndef WARTHOG_VERSION +#define WARTHOG_VERSION "0.0.0" +#define WARTHOG_VERSION_MAJOR 0 +#define WARTHOG_VERSION_MINOR 0 +#define WARTHOG_VERSION_REVISON 0 +#endif + #endif // WARTHOG_DEFINES_H diff --git a/include/warthog/domain/grid.h b/include/warthog/domain/grid.h index 558b670..faea379 100644 --- a/include/warthog/domain/grid.h +++ b/include/warthog/domain/grid.h @@ -1,13 +1,18 @@ #ifndef WARTHOG_DOMAIN_GRID_H #define WARTHOG_DOMAIN_GRID_H -// domains/grid.h -// -// A place for grid-related curios -// -// @author: dharabor -// @created: 2018-11-03 -// +/// @file domains/grid.h +/// +/// A place for grid-related features. +/// Includes the grid identifier (id), direction (and direction_id), +/// point (coordinate) and utilities. +/// +/// These utilities include conversion between direction/direction_id, +/// rotation, direction to point and inverse, helpers for grid traversal, etc. +/// +/// @author: dharabor & Ryan Hechenberger +/// @created: 2018-11-03 +/// #include #include @@ -20,8 +25,6 @@ namespace warthog::grid { -// TODO: document - using grid_id = pad32_id; typedef enum : uint8_t @@ -71,25 +74,25 @@ template concept SecInterCardinalID = static_cast(D) >= 8; /// @return is NORTH_ID/SOUTH_ID/EAST_ID/WEST_ID -constexpr inline bool +constexpr bool is_cardinal_id(direction_id d) noexcept { return static_cast(d) < 4; } /// @return is NORTHEAST_ID/NORTHWEST_ID/SOUTHEAST_ID/SOUTHWEST_ID -constexpr inline bool +constexpr bool is_intercardinal_id(direction_id d) noexcept { return static_cast(d - 4) < 4; } /// @return is a intercardinal+cardinal combined direction -constexpr inline bool +constexpr bool is_secic_id(direction_id d) noexcept { return static_cast(d) >= 8; } /// @return get the cardinal id from a combined direction -constexpr inline direction_id +constexpr direction_id secic_cardinal(direction_id d) noexcept { direction_id c @@ -98,7 +101,7 @@ secic_cardinal(direction_id d) noexcept return c; } /// @return get the intercardinal id from a combined direction -constexpr inline direction_id +constexpr direction_id secic_intercardinal(direction_id d) noexcept { direction_id c = static_cast(static_cast(d) >> 3); @@ -243,8 +246,9 @@ dir_cw90(direction d) noexcept | ((uint64_t)(SOUTHEAST) << (NORTHEAST_ID << 3)) | ((uint64_t)(SOUTHWEST) << (SOUTHEAST_ID << 3)) | ((uint64_t)(NORTHWEST) << (SOUTHWEST_ID << 3)); - int index = std::countr_zero(static_cast( - d | 256u)); // |256u to ensure no branch in compiler + int index = std::countr_zero( + static_cast( + d | 256u)); // |256u to ensure no branch in compiler return static_cast(sel >> index * 8); } @@ -276,8 +280,9 @@ dir_cw45(direction d) noexcept | ((uint64_t)(SOUTHEAST) << (EAST_ID << 3)) | ((uint64_t)(SOUTHWEST) << (SOUTH_ID << 3)) | ((uint64_t)(NORTHWEST) << (WEST_ID << 3)); - int index = std::countr_zero(static_cast( - d | 256u)); // |256u to ensure no branch in compiler + int index = std::countr_zero( + static_cast( + d | 256u)); // |256u to ensure no branch in compiler return static_cast(sel >> index * 8); } @@ -309,8 +314,9 @@ dir_ccw90(direction d) noexcept | ((uint64_t)(SOUTHEAST) << (SOUTHWEST_ID << 3)) | ((uint64_t)(SOUTHWEST) << (NORTHWEST_ID << 3)) | ((uint64_t)(NORTHWEST) << (NORTHEAST_ID << 3)); - int index = std::countr_zero(static_cast( - d | 256u)); // |256u to ensure no branch in compiler + int index = std::countr_zero( + static_cast( + d | 256u)); // |256u to ensure no branch in compiler return static_cast(sel >> index * 8); } @@ -342,8 +348,9 @@ dir_ccw45(direction d) noexcept | ((uint64_t)(SOUTHEAST) << (SOUTH_ID << 3)) | ((uint64_t)(SOUTHWEST) << (WEST_ID << 3)) | ((uint64_t)(NORTHWEST) << (NORTH_ID << 3)); - int index = std::countr_zero(static_cast( - d | 256u)); // |256u to ensure no branch in compiler + int index = std::countr_zero( + static_cast( + d | 256u)); // |256u to ensure no branch in compiler return static_cast(sel >> index * 8); } @@ -375,8 +382,9 @@ dir_flip(direction d) noexcept | ((uint64_t)(SOUTHEAST) << (NORTHWEST_ID << 3)) | ((uint64_t)(SOUTHWEST) << (NORTHEAST_ID << 3)) | ((uint64_t)(NORTHWEST) << (SOUTHEAST_ID << 3)); - int index = std::countr_zero(static_cast( - d | 256u)); // |256u to ensure no branch in compiler + int index = std::countr_zero( + static_cast( + d | 256u)); // |256u to ensure no branch in compiler return static_cast(sel >> index * 8); } @@ -519,7 +527,7 @@ operator==(spoint a, spoint b) return std::bit_cast(a) == std::bit_cast(b); } -constexpr inline std::pair +constexpr std::pair point_signed_diff(point a, point b) noexcept { return { @@ -529,20 +537,20 @@ point_signed_diff(point a, point b) noexcept static_cast(b.y) - static_cast(a.y))}; } -constexpr inline point +constexpr point operator+(point a, spoint b) noexcept { return point{ static_cast(a.x + static_cast(b.x)), static_cast(a.y + static_cast(b.y))}; } -constexpr inline spoint +constexpr spoint operator+(spoint a, spoint b) noexcept { return spoint{ static_cast(a.x + b.x), static_cast(a.y + b.y)}; } -constexpr inline spoint +constexpr spoint operator*(int16_t a, spoint b) noexcept { return spoint{ @@ -552,7 +560,7 @@ operator*(int16_t a, spoint b) noexcept /// @brief gets a unit signed-point in direction /// @param d the direction for the unit-distance /// @return the unit spoint -constexpr inline spoint +constexpr spoint dir_unit_point(direction_id d) noexcept { assert(static_cast(d) < 8); @@ -569,10 +577,18 @@ dir_unit_point(direction_id d) noexcept | (0b0000 << NORTHWEST_ID * 4) | (0b1010 << SOUTHEAST_ID * 4) | (0b1000 << SOUTHWEST_ID * 4); #if WARTHOG_INTRIN_HAS(BMI2) - res.v = _pdep_u32(packed_reldir >> d * 4, 0xC000'C000u); -#else - res.p.x = (packed_reldir >> d * 4) & 0b11; - res.p.y = (packed_reldir >> (d * 4 + 2)) & 0b11; + if !consteval + { + // _pdep_u32 may not be constexpr + res.v = _pdep_u32(packed_reldir >> d * 4, 0xC000'C000u); + } + else + { +#endif + res.p.x = (packed_reldir >> d * 4) & 0b11; + res.p.y = (packed_reldir >> (d * 4 + 2)) & 0b11; +#if WARTHOG_INTRIN_HAS(BMI2) + } // end if !consteval #endif res.p.x -= 1; res.p.y -= 1; @@ -582,7 +598,7 @@ dir_unit_point(direction_id d) noexcept /// @param d the direction for unit-point, if a secic will use the /// intercardinal component /// @return the unit spoint -constexpr inline spoint +constexpr spoint dir_unit_point_secic(direction_id d) noexcept { assert(static_cast(d) < 8); @@ -602,10 +618,18 @@ dir_unit_point_secic(direction_id d) noexcept // for second-intercardinal, return the intercardinal d = d < 8 ? d : secic_intercardinal(d); #if WARTHOG_INTRIN_HAS(BMI2) - res.v = _pdep_u32(packed_reldir >> d * 4, 0xC000'C000u); -#else - res.p.x = (packed_reldir >> d * 4) & 0b11; - res.p.y = (packed_reldir >> (d * 4 + 2)) & 0b11; + if !consteval + { + // _pdep_u32 may not be constexpr + res.v = _pdep_u32(packed_reldir >> d * 4, 0xC000'C000u); + } + else + { +#endif + res.p.x = (packed_reldir >> d * 4) & 0b11; + res.p.y = (packed_reldir >> (d * 4 + 2)) & 0b11; +#if WARTHOG_INTRIN_HAS(BMI2) + } // end if !consteval #endif res.p.x -= 1; res.p.y -= 1; @@ -614,7 +638,7 @@ dir_unit_point_secic(direction_id d) noexcept /// @return the direction from p1 to p2. If diff x or diff y is zero, will be /// cardinal, otherwise is intercardinal direction. -constexpr inline direction_id +constexpr direction_id point_to_direction_id(point p1, point p2) noexcept { union diff --git a/include/warthog/domain/gridmap.h b/include/warthog/domain/gridmap.h index efeea4b..9c1e766 100644 --- a/include/warthog/domain/gridmap.h +++ b/include/warthog/domain/gridmap.h @@ -14,15 +14,15 @@ // in a one dimensional array and also to avoid range checks when trying to // identify invalid neighbours of tiles on the edge of the map. // -// @author: dharabor +// @author: dharabor & Ryan Hechenberger // @created: 08/08/2012 // #include "grid.h" #include +#include #include #include -#include #include #include @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include namespace warthog::domain @@ -44,7 +46,12 @@ class gridmap : public memory::bittable public: using bittable = gridmap::bittable; // inform of type existing using bitarray = gridmap::bitarray; // inform of type existing + gridmap(); gridmap(uint32_t height, uint32_t width); + gridmap(std::istream& input); + gridmap(io::bittable_serialize& parser); + gridmap(std::filesystem::path&& filename); + gridmap(const std::filesystem::path& filename); gridmap(const char* filename); gridmap(const gridmap&) = delete; ~gridmap(); @@ -56,8 +63,28 @@ class gridmap : public memory::bittable operator=(const gridmap&) = delete; - // here we convert from the coordinate space of - // the original grid to the coordinate space of db_. + void + setup(uint32_t height, uint32_t width); + + bool + load(std::istream& input); + bool + load(io::bittable_serialize& parser); + bool + load(std::filesystem::path filename); + bool + load(const char* filename); + + bool + save(std::ostream& input, bool padding = false); + bool + save(io::bittable_serialize& parser, bool padding = false); + bool + save(const std::filesystem::path& filename, bool padding = false); + bool + save(const char* filename, bool padding = false); + + /// @brief convert unpadded id to padded id pad_id to_padded_id(pack_id node_id) const noexcept { @@ -70,19 +97,20 @@ class gridmap : public memory::bittable (uint32_t{node_id} / header_.width_) * padding_per_row_}; } - // here we convert from the coordinate space of - // the original grid to the coordinate space of db_. + /// @brief convert unpadded (x,y) to a padded id pad_id to_padded_id_from_unpadded(uint32_t x, uint32_t y) const noexcept { return pad_id{(y + PADDED_ROWS) * width() + x}; } + /// @brief convert padded (x,y) to a padded id pad_id to_padded_id_from_padded(uint32_t x, uint32_t y) const noexcept { return pad_id{y * width() + x}; } + /// @brief convert unpadded id to unpadded (x,y) void to_unpadded_xy(pack_id grid_id, uint32_t& x, uint32_t& y) const noexcept { @@ -91,6 +119,7 @@ class gridmap : public memory::bittable assert(x < header_.width_ && y < header_.height_); } + /// @brief convert padded id to unpadded (x,y) void to_unpadded_xy(pad_id grid_id, uint32_t& x, uint32_t& y) const noexcept { @@ -99,6 +128,18 @@ class gridmap : public memory::bittable assert(x < header_.width_ && y < header_.height_); } + /// @brief convert padded (x,y) to unpadded (x,y) + void + to_unpadded_xy_from_padded( + uint32_t padded_x, uint32_t padded_y, uint32_t& x, + uint32_t& y) const noexcept + { + y = padded_y - PADDED_ROWS; + x = padded_x; + assert(x < header_.width_ && y < header_.height_); + } + + /// @brief convert padded id to padded (x,y) void to_padded_xy(pad_id grid_id, uint32_t& x, uint32_t& y) const noexcept { @@ -107,6 +148,18 @@ class gridmap : public memory::bittable assert(x < width() && y < height()); } + /// @brief convert unpadded (x,y) to padded (x,y) + void + to_padded_xy_from_unpadded( + uint32_t unpadded_x, uint32_t unpadded_y, uint32_t& x, + uint32_t& y) const noexcept + { + y = unpadded_y + PADDED_ROWS; + x = unpadded_x; + assert(x < width() && y < height()); + } + + /// @brief convert padded id to unpadded id pack_id to_unpadded_id(pad_id grid_id) const noexcept { @@ -119,6 +172,7 @@ class gridmap : public memory::bittable // as the padded width is already removed PADDED_ROWS * header_.width_}; } + /// @brief convert unpadded (x,y) to unpadded id pack_id to_unpadded_id_from_unpadded(uint32_t x, uint32_t y) const noexcept { @@ -150,12 +204,12 @@ class gridmap : public memory::bittable // read from the byte just before node_id and shift down until the // nei adjacent to node_id is in the lowest position - tiles[0] - = (uint8_t)(*((uint32_t*)(db_ + (pos1 - 1))) >> (bit_offset + 7)); - tiles[1] - = (uint8_t)(*((uint32_t*)(db_ + (pos2 - 1))) >> (bit_offset + 7)); - tiles[2] - = (uint8_t)(*((uint32_t*)(db_ + (pos3 - 1))) >> (bit_offset + 7)); + tiles[0] = (uint8_t)(*((uint32_t*)(db_.get() + (pos1 - 1))) + >> (bit_offset + 7)); + tiles[1] = (uint8_t)(*((uint32_t*)(db_.get() + (pos2 - 1))) + >> (bit_offset + 7)); + tiles[2] = (uint8_t)(*((uint32_t*)(db_.get() + (pos3 - 1))) + >> (bit_offset + 7)); } // takes the tiles from get_neighbours and tightly packs them into 8-bits @@ -207,9 +261,12 @@ class gridmap : public memory::bittable // read 32bits of memory; grid_id_p is in the // lowest bit position of tiles[1] - tiles[0] = (uint32_t)(*((uint64_t*)(db_ + pos1)) >> (bit_offset)); - tiles[1] = (uint32_t)(*((uint64_t*)(db_ + pos2)) >> (bit_offset)); - tiles[2] = (uint32_t)(*((uint64_t*)(db_ + pos3)) >> (bit_offset)); + tiles[0] + = (uint32_t)(*((uint64_t*)(db_.get() + pos1)) >> (bit_offset)); + tiles[1] + = (uint32_t)(*((uint64_t*)(db_.get() + pos2)) >> (bit_offset)); + tiles[2] + = (uint32_t)(*((uint64_t*)(db_.get() + pos3)) >> (bit_offset)); } // similar to get_neighbours_32bit but grid_id_p is placed into the @@ -238,9 +295,12 @@ class gridmap : public memory::bittable // read 32bits of memory; grid_id_p is in the // highest bit position of tiles[1] - tiles[0] = (uint32_t)(*((uint64_t*)(db_ + pos1)) >> (bit_offset + 1)); - tiles[1] = (uint32_t)(*((uint64_t*)(db_ + pos2)) >> (bit_offset + 1)); - tiles[2] = (uint64_t)(*((uint64_t*)(db_ + pos3)) >> (bit_offset + 1)); + tiles[0] + = (uint32_t)(*((uint64_t*)(db_.get() + pos1)) >> (bit_offset + 1)); + tiles[1] + = (uint32_t)(*((uint64_t*)(db_.get() + pos2)) >> (bit_offset + 1)); + tiles[2] + = (uint64_t)(*((uint64_t*)(db_.get() + pos3)) >> (bit_offset + 1)); } // fetches a contiguous set of tiles from three adjacent rows. @@ -259,9 +319,9 @@ class gridmap : public memory::bittable uint32_t pos3 = dbindex + dbwidth64_; // read 64bits of tile data from each of the three rows - tiles[0] = *((uint64_t*)(db_) + pos1); - tiles[1] = *((uint64_t*)(db_) + pos2); - tiles[2] = *((uint64_t*)(db_) + pos3); + tiles[0] = *((uint64_t*)(db_.get()) + pos1); + tiles[1] = *((uint64_t*)(db_.get()) + pos2); + tiles[2] = *((uint64_t*)(db_.get()) + pos3); } // fetches a contiguous set of tiles from three adjacent rows. @@ -327,7 +387,7 @@ class gridmap : public memory::bittable const char* filename() const noexcept { - return this->filename_; + return this->filename_.c_str(); } uint32_t @@ -348,21 +408,30 @@ class gridmap : public memory::bittable return sizeof(*this) + sizeof(warthog::dbword) * db_size_; } -private: - using bittable::setup; - - warthog::util::gm_header header_; - warthog::dbword* db_; - char filename_[256]; - - uint32_t dbwidth_; - uint32_t dbwidth64_; - uint32_t dbheight_; - uint32_t db_size_; - uint32_t padding_per_row_; - uint32_t padding_column_above_; - uint32_t max_id_; - uint32_t num_traversable_; + operator bool() const noexcept { return static_cast(db_); } + +protected: + bool + setup_stream_(std::istream& in); + bool + setup_ser_(io::bittable_serialize& parser); + + struct + { + uint32_t height_; + uint32_t width_; + } header_ = {}; + std::unique_ptr db_; + std::filesystem::path filename_; + + uint32_t dbwidth_ = 0; + uint32_t dbwidth64_ = 0; + uint32_t dbheight_ = 0; + uint32_t db_size_ = 0; + uint32_t padding_per_row_ = 0; + uint32_t padding_column_above_ = 0; + uint32_t max_id_ = 0; + uint32_t num_traversable_ = 0; void init_db(); diff --git a/include/warthog/domain/labelled_gridmap.h b/include/warthog/domain/labelled_gridmap.h index c689997..a2b22ae 100644 --- a/include/warthog/domain/labelled_gridmap.h +++ b/include/warthog/domain/labelled_gridmap.h @@ -12,18 +12,21 @@ // - a line of terminator characters are added before the first row. // - a line of terminator characters are added after the last row. // -// @author: dharabor +// @author: dharabor & Ryan Hechenberger // @created: 2018-11-08 // +#include "grid.h" #include -#include +#include +#include #include #include #include +#include #include -#include +#include namespace warthog::domain { @@ -32,35 +35,108 @@ template class labelled_gridmap { public: - labelled_gridmap(unsigned int h, unsigned int w) : header_(h, w, "octile") + labelled_gridmap() = default; + labelled_gridmap(uint32_t h, uint32_t w) : header_{h, w} { this->init_db(); } - - labelled_gridmap(const char* filename) + labelled_gridmap(std::istream& input) { setup_stream_(input); } + labelled_gridmap(io::bittable_serialize& parser) { setup_ser_(parser); } + labelled_gridmap(std::filesystem::path&& filename) { - util::gm_parser parser(filename); - header_ = parser.get_header(); - strcpy(filename_, filename); - init_db(); - - for(unsigned int i = 0; i < parser.get_num_tiles(); i++) - { - CELL cell = parser.get_tile_at(i); - ; - set_label(uint32_t{to_padded_id(pack_id{i})}, cell); - assert(get_label(uint32_t{to_padded_id(pack_id{i})}) == cell); - } + filename_ = std::move(filename); + std::ifstream in(filename_); + setup_stream_(in); } + labelled_gridmap(const std::filesystem::path& filename) + : labelled_gridmap(std::filesystem::path(filename)) + { } + labelled_gridmap(const char* filename) + : labelled_gridmap(std::filesystem::path(filename)) + { } labelled_gridmap(const labelled_gridmap&) = delete; + ~labelled_gridmap() = default; + + /// The number of padded rows before and after + static constexpr uint32_t PADDED_ROWS = 3; + labelled_gridmap& operator=(const labelled_gridmap&) = delete; - ~labelled_gridmap() { delete[] db_; } + void + setup(uint32_t h, uint32_t w) + { + header_.height_ = h; + header_.width_ = w; + this->init_db(); + } - // here we convert from the coordinate space of - // the original grid to the coordinate space of db_. + bool + load(std::istream& input) + { + return setup_stream_(input); + } + bool + load(io::bittable_serialize& parser) + { + return setup_ser_(parser); + } + bool + load(std::filesystem::path filename) + { + filename_ = std::move(filename); + std::ifstream in(filename_); + return setup_stream_(in); + } + bool + load(const char* filename) + { + return load(std::filesystem::path(filename)); + } + + bool + save(std::ostream& input, bool padding = false) + { + io::bittable_serialize parser; + if(!parser.open_write(&input)) + { + WARTHOG_GERROR("gridmap save failed with input stream"); + return false; + } + return save(parser, padding); + } + bool + save(io::bittable_serialize& parser, bool padding = false); + bool + save(const std::filesystem::path& filename, bool padding = false) + { + io::bittable_serialize parser; + parser.set_filename(std::filesystem::path(filename)); + if(!parser.open_write()) + { + WARTHOG_GERROR_FMT( + "gridmap save failed to write to file \"{}\"", + filename.string()); + return false; + } + return save(parser, padding); + } + bool + save(const char* filename, bool padding = false) + { + io::bittable_serialize parser; + parser.set_filename(filename); + if(!parser.open_write()) + { + WARTHOG_GERROR_FMT( + "gridmap save failed to write to file \"{}\"", filename); + return false; + } + return save(parser, padding); + } + + /// @brief convert unpadded id to padded id pad_id to_padded_id(pack_id node_id) const noexcept { @@ -68,54 +144,87 @@ class labelled_gridmap return pad_id{ uint32_t{node_id} + // padded rows before the actual map data starts - padded_rows_before_first_row_ * padded_width_ + + PADDED_ROWS * width() + // padding from each row of data before this one - (node_id.id / header_.width_) * padding_per_row_}; + (uint32_t{node_id} / header_.width_) * padding_per_row_}; } - // here we convert from the coordinate space of - // the original grid to the coordinate space of db_. + /// @brief convert unpadded (x,y) to a padded id pad_id to_padded_id_from_unpadded(uint32_t x, uint32_t y) const noexcept { - return pad_id{(y + padded_rows_before_first_row_) * padded_width_ + x}; + return pad_id{(y + PADDED_ROWS) * width() + x}; } + /// @brief convert padded (x,y) to a padded id pad_id to_padded_id_from_padded(uint32_t x, uint32_t y) const noexcept { - return pad_id{y * padded_width_ + x}; + return pad_id{y * width() + x}; } + /// @brief convert unpadded id to unpadded (x,y) void to_unpadded_xy(pack_id grid_id, uint32_t& x, uint32_t& y) const noexcept { y = uint32_t{grid_id} / header_.width_; x = uint32_t{grid_id} % header_.width_; + assert(x < header_.width_ && y < header_.height_); } + /// @brief convert padded id to unpadded (x,y) void to_unpadded_xy(pad_id grid_id, uint32_t& x, uint32_t& y) const noexcept { to_padded_xy(grid_id, x, y); - y -= padded_rows_before_first_row_; + y -= PADDED_ROWS; assert(x < header_.width_ && y < header_.height_); } + /// @brief convert padded (x,y) to unpadded (x,y) + void + to_unpadded_xy_from_padded( + uint32_t padded_x, uint32_t padded_y, uint32_t& x, + uint32_t& y) const noexcept + { + y = padded_y - PADDED_ROWS; + x = padded_x; + assert(x < header_.width_ && y < header_.height_); + } + + /// @brief convert padded id to padded (x,y) void to_padded_xy(pad_id grid_id, uint32_t& x, uint32_t& y) const noexcept { - y = uint32_t{grid_id} / padded_width_; - x = uint32_t{grid_id} % padded_width_; - assert(x < padded_width_ && y < padded_height_); + y = uint32_t{grid_id} / width(); + x = uint32_t{grid_id} % width(); + assert(x < width() && y < height()); + } + + /// @brief convert unpadded (x,y) to padded (x,y) + void + to_padded_xy_from_unpadded( + uint32_t unpadded_x, uint32_t unpadded_y, uint32_t& x, + uint32_t& y) const noexcept + { + y = unpadded_y + PADDED_ROWS; + x = unpadded_x; + assert(x < width() && y < height()); } + /// @brief convert padded id to unpadded id pack_id to_unpadded_id(pad_id grid_id) const noexcept { - uint32_t x, y; - to_unpadded_xy(grid_id, x, y); - return pack_id{y * header_.width_ + x}; + assert(width() != 0); + return pack_id{ + uint32_t{grid_id} - + // padding from each row of data + (uint32_t{grid_id} / width()) * padding_per_row_ - + // padded rows before the actual map data starts, use header_width + // as the padded width is already removed + PADDED_ROWS * header_.width_}; } + /// @brief convert unpadded (x,y) to unpadded id pack_id to_unpadded_id_from_unpadded(uint32_t x, uint32_t y) const noexcept { @@ -165,7 +274,7 @@ class labelled_gridmap return this->header_.width_; } - const char* + const std::filesystem::path filename() const noexcept { return this->filename_; @@ -177,44 +286,175 @@ class labelled_gridmap return sizeof(*this) + sizeof(CELL) * db_size_; } -private: - char filename_[256]; - util::gm_header header_; - CELL* db_; + operator bool() const noexcept { return static_cast(db_); } + +protected: + bool + setup_stream_(std::istream& in); + bool + setup_ser_(io::bittable_serialize& parser); - uint32_t db_size_; - uint32_t padding_per_row_; - uint32_t padded_rows_before_first_row_; - uint32_t padded_rows_after_last_row_; - uint32_t padded_width_; - uint32_t padded_height_; + struct + { + uint32_t height_; + uint32_t width_; + } header_ = {}; + std::unique_ptr db_; + std::filesystem::path filename_; + + uint32_t db_size_ = 0; + uint32_t padding_per_row_ = 0; + uint32_t padded_rows_before_first_row_ = 0; + uint32_t padded_rows_after_last_row_ = 0; + uint32_t padded_width_ = 0; + uint32_t padded_height_ = 0; void - init_db() + init_db(); +}; + +template +inline bool +labelled_gridmap::save(io::bittable_serialize& parser, bool padding) +{ + if(!*this) + { + WARTHOG_GERROR("gridmap save failed due to empty gridmap"); + return false; + } + const uint32_t lwidth = padding ? width() : header_width(); + const uint32_t lheight = padding ? height() : header_height(); + if(!parser.set_type(warthog::io::bittable_type::OCTILE)) + { + WARTHOG_GERROR("gridmap save failed to set type"); + return false; + } + if(!parser.set_dim(lwidth, lheight)) { - // when storing the grid we pad the edges of the map. - // this eliminates the need for bounds checking when - // fetching the neighbours of a node. - this->padded_rows_before_first_row_ = 3; - this->padded_rows_after_last_row_ = 3; - this->padding_per_row_ = 1; + WARTHOG_GERROR_FMT( + "gridmap save invalid dimensions {}x{}", lwidth, lheight); + return false; + } + + // write gridmap data + if(auto r = parser.write_header(); !r) + { + WARTHOG_GERROR_FMT( + "gridmap save failed header write errc={}", (int)r.error()); + return false; + } - this->padded_width_ = this->header_.width_ + this->padding_per_row_; - this->padded_height_ = this->header_.height_ - + this->padded_rows_after_last_row_ - + this->padded_rows_before_first_row_; + // setup and write raw grid data + std::unique_ptr buffer_v + = std::make_unique(lwidth * lheight); + std::span buffer(buffer_v.get(), lwidth * lheight); + pad_id row_id = pad_id::zero(); + pad_id buffer_id = pad_id::zero(); + pad_id row_id_end(lwidth * lheight); + if(padding) + { + // convert 0 to '@' + std::ranges::fill(buffer, '@'); + // output had buffer, only write in unbuffered area + buffer_id = to_padded_id(static_cast(buffer_id)); + } + else + { + // update pad_id to only cover unpadded area of grid + row_id = to_padded_id(static_cast(row_id)); + row_id_end = to_padded_id(static_cast(row_id_end)); + } + // copy unpadded grid to (un)padded output grid + const uint32_t pwidth = width(); + const uint32_t hwidth = header_width(); + std::span grid(this->db_.get(), this->db_size_); + for(; row_id.id < row_id_end.id; + row_id.id += pwidth, buffer_id.id += lwidth) + { + std::ranges::copy( + grid.subspan(row_id.id, hwidth), + buffer.subspan(buffer_id.id, hwidth)); + } + if(auto r = parser.write_grid_raw(buffer); !r) + { + WARTHOG_GERROR_FMT( + "gridmap save failed grid write errc={}", (int)r.error()); + return false; + } + if(auto r = parser.write_end(); !r) + { + WARTHOG_GERROR_FMT( + "gridmap save failed finalize errc={}", (int)r.error()); + return false; + } - this->db_size_ = this->padded_height_ * padded_width_; + return true; +} - // create a one dimensional dbword array to store the grid - this->db_ = new CELL[db_size_]; +template +inline bool +labelled_gridmap::setup_stream_(std::istream& in) +{ + io::bittable_serialize parser; + if(!parser.open_read(&in)) return false; + if(!parser.read_header()) return false; + return setup_ser_(parser); +} + +template +inline bool +labelled_gridmap::setup_ser_(io::bittable_serialize& parser) +{ + if(!parser.read_grid_header()) return false; + const uint32_t lwidth = parser.get_dim().width; + const uint64_t lsize = (uint64_t)lwidth * parser.get_dim().height; + this->header_.width_ = lwidth; + this->header_.height_ = parser.get_dim().height; + + init_db(); + // read raw data to buffer + std::unique_ptr buffer_v = std::make_unique(lsize); + std::span buffer(buffer_v.get(), lsize); + if(!parser.read_grid_raw(buffer)) return false; + // copy buffet to db, add padding + for(pack_id row_id(0); row_id.id < lsize; row_id.id += lwidth) + { + std::ranges::copy( + buffer.subspan(row_id.id, lwidth), + this->db_.get() + to_padded_id(row_id).id); + } + return true; +} - for(uint32_t i = 0; i < this->db_size_; i++) - { - this->db_[i] = 0; - } +template +inline void +labelled_gridmap::init_db() +{ + // when storing the grid we pad the edges of the map with + // zeroes. this eliminates the need for bounds checking when + // fetching the neighbours of a node. + uint32_t store_width, store_height; + store_height = this->header_.height_ + 2 * PADDED_ROWS; + + // calculate # of extra/redundant padding bits required, + // per row, to align map width with dbword size + store_width = this->header_.width_ + 1; + if((store_width % 8) != 0) + { + store_width = (this->header_.width_ / 8 + 1) * 8; } -}; + this->padded_width_ = store_width; + this->padded_height_ = store_height; + this->padded_rows_before_first_row_ = PADDED_ROWS; + this->padded_rows_after_last_row_ = PADDED_ROWS; + this->padding_per_row_ = store_width - this->header_.width_; + + this->db_size_ = store_width * store_height; + + // create a one dimensional dbword array to store the grid + this->db_ = std::make_unique(db_size_); + std::memset(this->db_.get(), 0, this->db_size_); +} // vertex-labelled gridmap using vl_gridmap = labelled_gridmap; diff --git a/include/warthog/geometry/geom.h b/include/warthog/geometry/geom.h index 5e0730a..1e670f4 100644 --- a/include/warthog/geometry/geom.h +++ b/include/warthog/geometry/geom.h @@ -166,9 +166,23 @@ struct rectangle } // namespace warthog::geometry std::ostream& -operator<<(std::ostream& out, warthog::geometry::rectangle& rect); +operator<<(std::ostream& out, warthog::geometry::rectangle& rect) +{ + out.write((char*)(&rect.x1), sizeof(rect.x1)); + out.write((char*)(&rect.x2), sizeof(rect.x2)); + out.write((char*)(&rect.y1), sizeof(rect.y1)); + out.write((char*)(&rect.y2), sizeof(rect.y2)); + return out; +} std::istream& -operator>>(std::istream& in, warthog::geometry::rectangle& rect); +operator>>(std::istream& in, warthog::geometry::rectangle& rect) +{ + in.read((char*)(&rect.x1), sizeof(rect.x1)); + in.read((char*)(&rect.x2), sizeof(rect.x2)); + in.read((char*)(&rect.y1), sizeof(rect.y1)); + in.read((char*)(&rect.y2), sizeof(rect.y2)); + return in; +} #endif // WARTHOG_GEOMETRY_GEOM_H diff --git a/include/warthog/io/bittable_serialize.h b/include/warthog/io/bittable_serialize.h new file mode 100644 index 0000000..22619da --- /dev/null +++ b/include/warthog/io/bittable_serialize.h @@ -0,0 +1,385 @@ +#ifndef WARTHOG_IO_GRID_H +#define WARTHOG_IO_GRID_H + +/// @file grid.h +/// +/// Read utility for gridmap. +/// +/// Supported MovingAI map format. Read format spec: +/// https://movingai.com/benchmarks/formats.html +/// +/// @author: Ryan Hechenberger +/// @created: 2025-06-01 + +#include "serialize_base.h" + +#include +#include + +#include +#include +#include + +namespace warthog::io +{ + +/// @brief Standard traversable terrain type from gridmap_cell +/// @param c +/// @return ".G" return true, false otherwise +constexpr bool +gridmap_cell_traversable(gridmap_cell c) noexcept +{ + switch(c) + { + case gridmap_cell::TERRAIN: + case gridmap_cell::TERRAIN_2: + return true; + default: + return false; + } +} +/// @return char c is traversable, as gridmap_cell_traversable((gridmap_cell)c) +constexpr bool +gridmap_cell_traversable(char c) noexcept +{ + return gridmap_cell_traversable(static_cast(c)); +} + +/// @brief max grid size +inline constexpr uint32_t GRID_MAX_SIZE = 15'000; + +/// @brief limit on max number of patches +inline constexpr uint32_t PATCH_COUNT_LIMIT = 10'000'000; + +/// @brief the bittable serialize class, flexable read/write of +/// bittable/gridmap or similiar datatypes, see serialize_base for +/// how files are read. +class bittable_serialize : public serialize_base +{ +public: + bittable_serialize(); + + static constexpr uint32_t patch_auto + = std::numeric_limits::max(); + + /// @return the grid dimension, either as last read grid from file or set + /// by user for writing + memory::bittable_dimension + get_dim() const noexcept + { + return m_dim; + } + /// @brief sets the grid dimension, throws if out of range + bool + set_dim(uint32_t width, uint32_t height) + { + if(bool bad_width = width <= 0 || width > GRID_DIMENSION_MAX, + bad_height = height <= 0 || height > GRID_DIMENSION_MAX; + bad_width || bad_height) + { + return false; + } + m_dim.width = width; + m_dim.height = height; + return true; + } + + /// @return the type/version of the file, default OCTILE + bittable_type + get_type() const noexcept + { + return m_type; + } + /// @brief sets the type/version to write to the file header, supported is + /// octile/patch. + /// @return true for success, false failure + bool + set_type(bittable_type type) + { + if(type != bittable_type::OCTILE && type != bittable_type::PATCH) + { + return false; + } + m_type = type; + return true; + } + + /// @brief get the number of patches in file + uint32_t + get_patch_amount() const noexcept + { + return m_patch_amount; + } + /// @brief set the number of patches (for writing) + /// @return true for success, false failure + bool + set_patch_amount(uint32_t count) + { + if(count > PATCH_COUNT_LIMIT) { return false; } + m_patch_amount = count; + return true; + } + + /// @brief number of patches for writing is dynamic (requires seekable + /// file) + /// @return true for success, false failure + bool + set_patch_auto() + { + m_patch_amount = patch_auto; + return true; + } + + /// @brief gets the number of patches that have been read/write + uint32_t + get_patch_count() const noexcept + { + return m_patch_count; + } + + /// @brief override the patch id to write + /// @return true for success, false failure + bool + set_patch_id(uint32_t id) noexcept + { + m_patch_id = id; + return true; + } + /// @brief gets the id of last patch (usually get_patch_count()) + uint32_t + get_patch_id() const noexcept + { + return m_patch_id; + } + + /// @brief reads the map/patch file header, getting the type + /// @param in alternative file stream to read from + /// @return error code on failure + /// + /// Reads the header line, `type octile` for bittable_type::OCTILE or + /// `type patch` for bittable_type::PATCH, retrievable by get_type(). + /// For PATCH type, also reads following line for number of patches in + /// file. + std::expected + read_header(std::istream* in = nullptr); + + /// @brief Reads the grids' header, getting width/height up to the map + /// data. + /// @param in alternative filestream to read from + /// @return error code on failure + /// @pre get_type() matches the format of file. + std::expected + read_grid_header(std::istream* in = nullptr); + + /// @brief Reads the grids data and stores it into a bittable, expects size + /// from get_dim() + /// @param table bittable derived type to store, must be init + /// @param offset_x offset of top-left in table to copy grid to + /// @param offset_y offset of top-left in table to copy grid to + /// @param in alternative filestream to read from + /// @return error code on failure + /// @pre table must be init and large enough to store whole grid (including + /// from offset) + template + std::expected + read_grid_data( + BitTable& table, uint32_t offset_x = 0, uint32_t offset_y = 0, + std::istream* in = nullptr); + + /// @brief Reads the raw rows (char) from map into a 1D array, expects size + /// from get_dim() + /// @param buffer the buffer + /// @param in alternative filestream to read from + /// @return error code on failure + /// @pre buffer must be large enough to store width x height characters + /// from get_dim() + /// + /// Reads row by row from the top left, writing into buffer. + /// Data is tightly packed, with no delimited between rows of size width. + /// Characters are as defined by the MovingAI spec, use + /// gridmap_cell_traversable(c) to determine traversability if applicable. + std::expected + read_grid_raw(std::span buffer, std::istream* in = nullptr); + + /// @brief Writes out file header + /// @param out alternative filestream to write to + /// @return error code on failure + /// @pre get_type()==bittable_type::OCTILE || + /// get_type()==bittable_type::PATCH + /// + /// Writes out the header for either map (OCTILE) or patch (PATCH) file. + /// For PATCH, set_patch_amount is needed in advanced, alternatively + /// set_patch_auto() does not require knowing in advanced, but file stream + /// must be seekable for this option and write_end() must be called at the + /// end. + std::expected + write_header(std::ostream* out = nullptr); + + /// @brief Writes out a bittable (cropped) as a grid + /// @param table table to write + /// @param offset_x top-left x to crop to + /// @param offset_y top-left y to crop to + /// @param blocker char to represent a blocker (=0) + /// @param traversable char to represent a non-blocker (!=0) + /// @param out alternative filestream to write to + /// @return error code on failure + /// @pre get_dim() != {} + /// + /// Writes out a bittable to file, cropped to region (offset_x,offset_y) -- + /// (offset_x+get_dim().width,offset_y+get_dim().height). + /// User must use set_dim(width,height) before calling this function to set + /// the output grid width/height. + template + std::expected + write_grid_data( + BitTable& table, uint32_t offset_x = 0, uint32_t offset_y = 0, + gridmap_cell blocker = gridmap_cell::OUT_OF_BOUNDS, + gridmap_cell traversable = gridmap_cell::TERRAIN, + std::ostream* out = nullptr); + + /// @brief Writes out a grid from user-given buffer + /// @param buffer grid to write (top-left start at buffer[0]) + /// @param out alternative filestream to write to + /// @return error code on failure + /// @pre get_dim() != {} + /// + /// Similar to write_grid_data, except user provides the map data. + /// User must use set_dim(width,height) before calling this function to set + /// the output grid width/height. + std::expected + write_grid_raw(std::span buffer, std::ostream* out = nullptr); + + /// @brief Perform end of file work, only required for set_patch_auto() + /// @param out alternative filestream to write to + /// @return error code on failure + std::expected + write_end(std::ostream* out = nullptr); + +protected: + memory::bittable_dimension m_dim = {}; + bittable_type m_type = bittable_type::NONE; + uint32_t m_patch_amount = 0; + uint32_t m_patch_count = 0; + uint32_t m_patch_id = 0; + std::streampos m_patch_auto_pos = 0; +}; + +template +std::expected +bittable_serialize::read_grid_data( + BitTable& table, uint32_t offset_x, uint32_t offset_y, std::istream* in) +{ + // check table + const memory::bittable_dimension dim = table.dim(); + const memory::bittable_dimension read_dim = m_dim; + // detect for overflow + if(offset_x >= dim.width || read_dim.width + offset_x > dim.width) + return std::unexpected(std::errc::argument_out_of_domain); + if(offset_y >= dim.height || read_dim.height + offset_y > dim.height) + return std::unexpected(std::errc::argument_out_of_domain); + + uint32_t bit_id + = static_cast(table.xy_to_id(offset_x, offset_y)); + const uint32_t bit_row_offset = dim.width - read_dim.width; + + if(auto r = get_istream(in); r) + in = *r; + else + return std::unexpected(r.error()); + + std::string_view line; + std::string_view token; + for(uint32_t y = 0; y < read_dim.height; ++y, bit_id += bit_row_offset) + { + // read row + if(auto r = readline(in); r) + line = *r; + else + return std::unexpected(r.error()); + parser par(line); + if(!par.next(token).eof()) { return std::unexpected(par.error()); } + if(token.size() != read_dim.width) + return std::unexpected(std::errc::argument_out_of_domain); + // copy row to table + for(uint32_t x = 0; x < read_dim.width; ++x, ++bit_id) + { + table.set( + static_cast(bit_id), + gridmap_cell_traversable(token[x]) ? 1 : 0); + } + } + + return {}; +} + +template +std::expected +bittable_serialize::write_grid_data( + BitTable& table, uint32_t offset_x, uint32_t offset_y, + gridmap_cell blocker, gridmap_cell traversable, std::ostream* out) +{ + // check table + const memory::bittable_dimension dim = table.dim(); + const memory::bittable_dimension write_dim = m_dim; + // detect for overflow + if(offset_x >= dim.width || write_dim.width == 0 + || write_dim.width + offset_x > dim.width) + return std::unexpected(std::errc::argument_out_of_domain); + if(offset_y >= dim.height || write_dim.height == 0 + || write_dim.height + offset_y > dim.height) + return std::unexpected(std::errc::argument_out_of_domain); + + uint32_t bit_id + = static_cast(table.xy_to_id(offset_x, offset_y)); + const uint32_t bit_row_offset = dim.width - write_dim.width; + + if(auto r = get_ostream(out); r) + out = *r; + else + return std::unexpected(r.error()); + + if(m_type == bittable_type::PATCH) + { + if(!(*out << "patch " << m_patch_id++ << '\n')) + return std::unexpected(std::errc::io_error); + } + if(!(*out << "height " << write_dim.height << "\nwidth " << write_dim.width + << "\nmap\n")) + return std::unexpected(std::errc::io_error); + + std::array buffer; + std::unique_ptr buffer_dyn; + std::span line_buffer; + if(write_dim.width < 2048) + { + // use stack buffer + line_buffer = std::span(buffer.data(), write_dim.width + 1); + } + else + { + // too large, use dynamic buffer + buffer_dyn = std::make_unique(write_dim.width + 1); + line_buffer = std::span(buffer_dyn.get(), write_dim.width + 1); + } + // set end to newline + line_buffer[write_dim.width] = '\n'; + + for(uint32_t y = 0; y < write_dim.height; ++y, bit_id += bit_row_offset) + { + // copy row to buffer + for(uint32_t x = 0; x < write_dim.width; ++x, ++bit_id) + { + line_buffer[x] = table.get(static_cast(bit_id)) + ? (char)traversable + : (char)blocker; + } + // write row + if(!(*out << std::string_view(line_buffer.data(), line_buffer.size()))) + return std::unexpected(std::errc::io_error); + } + return {}; +} + +} // namespace warthog::memory + +#endif // WARTHOG_IO_GRID_H diff --git a/include/warthog/io/fwd.h b/include/warthog/io/fwd.h new file mode 100644 index 0000000..3c5f705 --- /dev/null +++ b/include/warthog/io/fwd.h @@ -0,0 +1,67 @@ +#ifndef WARTHOG_IO_FWD_H +#define WARTHOG_IO_FWD_H + +/// @file fwd.h +/// +/// Forward class definitions and store global enums. +/// +/// @author: Ryan Hechenberger +/// @created: 2026-05-01 + +#include + +namespace warthog::io +{ + +// serializers +class serialize_base; +class bittable_serialize; +class scenario_serialize; + +// observers +class stream_observer; +class posthoc_trace; + +/// @brief scenario supported version enum +enum class scenario_version : uint8_t +{ + UNKNOWN, + VERSION_1, + VERSION_2, +}; + +/// @brief named scenario v2 cost +enum class cost_type : uint8_t +{ + G_8C_NCC, + G_8C_CC, + G_4C, + AA_NCC, + AA_CC, + OTHER, +}; + +/// @brief the type of bittable to (de)serialize +enum class bittable_type : uint8_t +{ + OCTILE, ///< original MovingAI format + PATCH, ///< patch format, grouping multiple octiles + OTHER, ///< unknown format + NONE, ///< no format specified +}; + +/// @brief the cell character, as specified by MovingAI +enum class gridmap_cell : char +{ + TERRAIN = '.', + TERRAIN_2 = 'G', + OUT_OF_BOUNDS = '@', + OUT_OF_BOUNDS_2 = 'O', + TREES = 'T', + SWAMP = 'S', + WATER = 'W', +}; + +} // namespace warthog::io + +#endif // WARTHOG_IO_FWD_H diff --git a/include/warthog/io/grid.h b/include/warthog/io/grid.h deleted file mode 100644 index 401688a..0000000 --- a/include/warthog/io/grid.h +++ /dev/null @@ -1,150 +0,0 @@ -#ifndef WARTHOG_IO_GRID_H -#define WARTHOG_IO_GRID_H - -#include -#include -#include -#include - -namespace warthog::io -{ - -enum class bittable_type : uint8_t -{ - AUTO, - OCTILE, - PATCH, - OTHER, - NONE, -}; - -enum class bittable_cell : uint8_t -{ - BLOCKER, - TRAVERSABLE, - UNKNOWN -}; - -class bittable_serialize -{ -public: - memory::bittable_dimension - get_dim() const noexcept - { - return m_dim; - } - bittable_type - get_type() const noexcept - { - return m_type; - } - - static constexpr bool - is_traversable(char c) noexcept - { - switch(c) - { - case '.': - case 'G': - return true; - default: - return false; - } - } - static constexpr bittable_cell - cell_type(char c) noexcept - { - switch(c) - { - case '.': - case 'G': - return bittable_cell::TRAVERSABLE; - case '@': - case 'O': - case 'S': - case 'T': - case 'W': - return bittable_cell::BLOCKER; - default: - return bittable_cell::UNKNOWN; - } - } - - void - set_dim(uint32_t width, uint32_t height) - { - if(bool bad_width = width <= 0 || width > GRID_DIMENSION_MAX, - bad_height = height <= 0 || height > GRID_DIMENSION_MAX; - bad_width || bad_height) - { - throw std::out_of_range(bad_width ? "width" : "height"); - } - m_dim.width = width; - m_dim.height = height; - } - void - set_type(bittable_type type) - { - if(static_cast(type) - > static_cast(bittable_type::NONE)) - { - throw std::out_of_range("type"); - } - m_type = type; - } - - bool - read_header(std::istream& in); - - template - bool - read_map( - std::istream& in, BitTable& table, uint32_t offset_x = 0, - uint32_t offset_y = 0); - -protected: - memory::bittable_dimension m_dim = {}; - bittable_type m_type = bittable_type::AUTO; - uint32_t m_patch_count = 0; -}; - -template -bool -bittable_serialize::read_map( - std::istream& in, BitTable& table, uint32_t offset_x, uint32_t offset_y) -{ - const memory::bittable_dimension dim = table.dim(); - const memory::bittable_dimension read_dim = m_dim; - table.fill(0); // set whole table to 0 (blocker) - // detect for overflow - if(offset_x >= dim.width || read_dim.width + offset_x > dim.width) - return false; - if(offset_y >= dim.height || read_dim.height + offset_y > dim.height) - return false; - assert(read_dim.width <= GRID_DIMENSION_MAX); - if(read_dim.width > GRID_DIMENSION_MAX) - return false; // shound never happen - uint32_t bit_id - = static_cast(table.xy_to_id(offset_x, offset_y)); - const uint32_t bit_row_offset = dim.width - read_dim.width; - char buffer[(GRID_DIMENSION_MAX + 16) & ~7ull]; - static_assert(sizeof(buffer) / sizeof(char) >= GRID_DIMENSION_MAX); - for(uint32_t y = 0; y < read_dim.height; ++y, bit_id += bit_row_offset) - { - in >> std::ws; - in.read(buffer, read_dim.width); - for(uint32_t x = 0; x < read_dim.width; ++x, ++bit_id) - { - auto cell = cell_type(buffer[x]); - if(cell == bittable_cell::UNKNOWN) - return false; - else if(cell == bittable_cell::TRAVERSABLE) - table.bit_or(static_cast(bit_id), 1); - } - } - return true; -} - -} // namespace warthog::memory - -#endif // WARTHOG_IO_GRID_H diff --git a/include/warthog/io/grid_trace.h b/include/warthog/io/grid_trace.h new file mode 100644 index 0000000..d1ba7be --- /dev/null +++ b/include/warthog/io/grid_trace.h @@ -0,0 +1,63 @@ +#ifndef WARTHOG_IO_GRID_TRACE_H +#define WARTHOG_IO_GRID_TRACE_H + +/// @file grid_trace.h +/// +/// Basic posthoc_trace for use with gridmap. +/// +/// @author: Ryan Hechenberger +/// @created: 2025-08-07 + +#include "posthoc_trace.h" + +#include +#include +#include +#include + +namespace warthog::io +{ + +/// @brief class that produces a posthoc trace for the gridmap domain, grid +/// must be set. +class grid_trace : public posthoc_trace +{ +public: + using node = search::search_node; + + grid_trace() = default; + grid_trace(domain::gridmap* grid) : grid_(grid) { } + + void + set_grid(domain::gridmap* grid) noexcept + { + grid_ = grid; + } + + void + print_posthoc_header() override; + + void + begin_search(int id, const search::search_problem_instance& pi); + + void + expand_node(const node& current) const; + + void + relax_node(const node& current) const; + + void + generate_node( + const node* parent, const node& child, cost_t edge_cost, + uint32_t edge_id) const; + + void + close_node(const node& current) const; + +protected: + domain::gridmap* grid_; +}; + +} // namespace warthog::io + +#endif // WARTHOG_IO_GRID_TRACE_H diff --git a/include/warthog/io/log.h b/include/warthog/io/log.h new file mode 100644 index 0000000..1d36142 --- /dev/null +++ b/include/warthog/io/log.h @@ -0,0 +1,480 @@ +#ifndef WARTHOG_IO_LOG_H +#define WARTHOG_IO_LOG_H + +/// @file log.h +/// +/// Logging utility framework, where a user can provide at a high-level +/// data structure with function pointers to log messages as a single string +/// with a specific log level. +/// This will call a user-defined function (if able) that will output this +/// message as the user desires. +/// Default functions (output to stderr or file) are defined here. +/// +/// The log_sink is a non-owning copyable struct that points to the data and +/// logging function calls. All logging is performed through log_sink. All +/// classes here are thread safe, follow comments for outlying cases. +/// +/// Special classes inherit log_sink to provide default functionality. +/// log_sink_std should be used to write to std::cout and std::cerr. +/// log_sink_stream pipe to a stream or open a file stream. +/// +/// The logs are made to be logged to a certain log_level. +/// The WARTHOG_TRACE and others in this header provide interfaces to log to a +/// special logger<> class. This logger<> class knows at compile time the +/// minimum level to log, and with the use of a macro will be compiled out if +/// that level was not set at compile time when used with the logging macros. +/// +/// The global logger can be acquired with the glog() (logger<>) or glogs() +/// (log_sink), and set with set_glog(log_sink). The log level of the global +/// logger is set though the WARTHOG_LOG definition, with a default of 1(debug) +/// for debug builds, and 2(information) for release (NDEBUG defined). Macros +/// like WARTHOG_GTRACE will automatically write to the global logger. +/// +/// The _IF will only log if a runtime if true. +/// The _FMT uses the std::format from C++20 to format the output messages. +/// The logging utilities uses dynamic memory std::strings to produce the final +/// log message strings, thus is better to be disabled for release builds +/// through the log level. +/// +/// Log messages produce a messaged as "[TIME LEVEL] msg". +/// The time is formatted in ISO with space (yyyy-mm-dd hh:mm:ss), but can be +/// overridden with define cstring WARTHOG_LOG_TIME. Clock is in local system +/// time, but can be set to UTC by defining WARTHOG_LOG_CLOCK_UTC. +/// +/// @author: Ryan Hechenberger +/// @created: 2025-09-09 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// define utility for help with log messages +#define WARTHOG_STRING_(x) #x +#define WARTHOG_STRING(x) WARTHOG_STRING_(x) +#define WARTHOG_STRING2(x) WARTHOG_STRING(x) +#define WARTHOG_STRING3(x) WARTHOG_STRING(x) +#define WARTHOG_STRING4(x) WARTHOG_STRING(x) + +#define WARTHOG_LINE WARTHOG_STRING2(__LINE__) +#define WARTHOG_FILENAME_LINE __FILE__ "@" WARTHOG_LINE + +// default log levels, also for global logger +#ifdef WARTHOG_LOG +#define WARTHOG_DEFAULT_LOG_LEVEL WARTHOG_LOG +#elif !defined(NDEBUG) +#define WARTHOG_DEFAULT_LOG_LEVEL 1 +#else +#define WARTHOG_DEFAULT_LOG_LEVEL 2 +#endif + +// specify the log time format +#ifdef WARTHOG_LOG_TIME +#define WARTHOG_LOG_TIME_FORMAT WARTHOG_LOG_TIME +#else +#define WARTHOG_LOG_TIME_FORMAT "%F %T" +#endif + +// set to use utc time instead of local +#ifdef WARTHOG_LOG_CLOCK_UTC +#define WARTHOG_LOG_NOW (std::chrono::utc_clock::now()) +#else +#define WARTHOG_LOG_NOW \ + (std::chrono::current_zone()->to_local(std::chrono::system_clock::now())) +#endif + +namespace warthog::io +{ + +enum class log_level +{ + TRACE = 0, + DEBUG = 1, + INFORMATION = 2, + WARNING = 3, + ERROR = 4, + CRITICAL = 5, + NONE = 6 +}; + +/// @brief the log class used to write out to a log. +/// +/// Takes a pointer for data (must not be null to write). +/// The array call is the logger for each level. +/// log will write if able (data != null && call[level] != null). +struct log_sink +{ + using call_type = void(void*, std::string_view msg); + void* data = nullptr; + std::array(log_level::NONE)> call = {}; + + constexpr void + log(log_level level, std::string_view msg) const + { + if(can_log(level)) { (*call[static_cast(level)])(data, msg); } + } + constexpr bool + can_log(log_level level) const noexcept + { + return static_cast(level) < call.size() && data != nullptr + && call[static_cast(level)] != nullptr; + } + + constexpr const log_sink& + sink() const noexcept + { + return *this; + } +}; + +/// @brief concept that check if class is shaped with a log_sink. +template +concept LogSink = requires(Sink S, log_level level, std::string_view msg) { + S.log(level, msg); + { S.can_log(level) } -> std::same_as; + { std::as_const(S).sink() } -> std::convertible_to; +}; + +/// @brief sink to cout|cerr +/// +/// Is thread safe as long as std::ios_base::sync_with_stdio(false) has not +/// been called. Can copy go log_sink and then be destructed without issue. +struct log_sink_std : log_sink +{ + // cerr = true will sink to cerr, false to cout + log_sink_std(); + log_sink_std(bool cerr); + static void + write_trace(void*, std::string_view msg); + static void + write_debug(void*, std::string_view msg); + static void + write_information(void*, std::string_view msg); + static void + write_warning(void*, std::string_view msg); + static void + write_error(void*, std::string_view msg); + static void + write_critical(void*, std::string_view msg); +}; + +/// @brief sink to a passed stream, or open and own a filestream. +/// +/// This class is thread-safe through use of a mutex. +/// Must be kept in scope at all times while its log_sink is in use. +class log_sink_stream : public log_sink +{ +public: + log_sink_stream(); + log_sink_stream( + const std::filesystem::path& filename, + std::ios_base::openmode mode + = std::ios_base::out | std::ios_base::app); + log_sink_stream(std::ostream* stream); + ~log_sink_stream() = default; + + void + open( + const std::filesystem::path& filename, + std::ios_base::openmode mode + = std::ios_base::out | std::ios_base::app); + void + open(std::ostream& stream); + + static void + write_trace(void*, std::string_view msg); + static void + write_debug(void*, std::string_view msg); + static void + write_information(void*, std::string_view msg); + static void + write_warning(void*, std::string_view msg); + static void + write_error(void*, std::string_view msg); + static void + write_critical(void*, std::string_view msg); + +protected: + std::ostream* log_stream_ = nullptr; + std::unique_ptr owned_file_; + std::mutex lock_; +}; +static_assert(LogSink, "log_stream_sink must be a log_sink."); + +/// @brief the logger class that manipulates a log_sink. +/// @tparam MinLevel the minimum logging level, derived at compile time. +/// Defaults to the programs default log level. +/// +/// A wrapper class for a log_sink that allows to control the log_level. +/// If just using a log_sink, it will always log at every level. +/// This class is handled specially by the logging macros to only log if +/// log_level is a min_level. When setting a long_sink, will clear all pointers +/// below MinLevel. +template< + log_level MinLevel = static_cast(WARTHOG_DEFAULT_LOG_LEVEL)> +struct logger : log_sink +{ + constexpr logger() noexcept = default; + constexpr logger(log_sink sink) : log_sink(sink) + { + for(auto& c : call | std::views::take(static_cast(MinLevel))) + { + c = nullptr; + } + } + + constexpr logger& + operator=(const logger&) noexcept + = default; + constexpr logger& + operator=(log_sink sink) noexcept + { + for(auto& c : call | std::views::take(static_cast(MinLevel))) + { + c = nullptr; + } + return *this; + } + + /// @brief Overrides MinLevel to level. Can only raise, not lower it. + /// @param level + constexpr void + set_min_level(log_level level) noexcept + { + assert( + static_cast(level) + <= static_cast(log_level::NONE)); + for(auto& c : call | std::views::take(static_cast(level))) + { + c = nullptr; + } + } + + constexpr static log_level min_level = MinLevel; + template + constexpr static bool supports_level = MinLevel != log_level::NONE + && static_cast(L) >= static_cast(MinLevel); +}; + +namespace details +{ +template +struct is_logger : std::false_type +{ }; +template +struct is_logger> : std::true_type +{ }; +}; + +template +concept Logger = details::is_logger::value; +template +concept LoggerLevel + = Logger && requires { requires Log::template supports_level; }; + +#define WARTHOG_LOG_LEVEL_(cond, lg, level, msg) \ + { \ + if constexpr(::warthog::io::Logger) \ + { \ + if constexpr(::warthog::io::LoggerLevel) \ + { \ + if(cond) (lg).log(level, msg); \ + } \ + } \ + else \ + { \ + if(cond) (lg).log(level, msg); \ + } \ + } + +#define WARTHOG_LOG(lg, level, msg) (lg).log(level, msg) +#define WARTHOG_LOG_IF(cond, lg, level, msg) \ + { \ + if(cond) (lg).log(level, msg); \ + } + +// Write msg (string_view) to log lg. +#define WARTHOG_TRACE(lg, msg) \ + WARTHOG_LOG_LEVEL_(true, lg, ::warthog::io::log_level::TRACE, msg) +#define WARTHOG_DEBUG(lg, msg) \ + WARTHOG_LOG_LEVEL_(true, lg, ::warthog::io::log_level::DEBUG, msg) +#define WARTHOG_INFO(lg, msg) \ + WARTHOG_LOG_LEVEL_(true, lg, ::warthog::io::log_level::INFORMATION, msg) +#define WARTHOG_WARN(lg, msg) \ + WARTHOG_LOG_LEVEL_(true, lg, ::warthog::io::log_level::WARNING, msg) +#define WARTHOG_ERROR(lg, msg) \ + WARTHOG_LOG_LEVEL_(true, lg, ::warthog::io::log_level::ERROR, msg) +#define WARTHOG_CRIT(lg, msg) \ + WARTHOG_LOG_LEVEL_(true, lg, ::warthog::io::log_level::CRITICAL, msg) + +// Write msg (string_view) to log lg if runtime cond is true. +#define WARTHOG_TRACE_IF(cond, lg, msg) \ + WARTHOG_LOG_LEVEL_(cond, lg, ::warthog::io::log_level::TRACE, msg) +#define WARTHOG_DEBUG_IF(cond, lg, msg) \ + WARTHOG_LOG_LEVEL_(cond, lg, ::warthog::io::log_level::DEBUG, msg) +#define WARTHOG_INFO_IF(cond, lg, msg) \ + WARTHOG_LOG_LEVEL_(cond, lg, ::warthog::io::log_level::INFORMATION, msg) +#define WARTHOG_WARN_IF(cond, lg, msg) \ + WARTHOG_LOG_LEVEL_(cond, lg, ::warthog::io::log_level::WARNING, msg) +#define WARTHOG_ERROR_IF(cond, lg, msg) \ + WARTHOG_LOG_LEVEL_(cond, lg, ::warthog::io::log_level::ERROR, msg) +#define WARTHOG_CRIT_IF(cond, lg, msg) \ + WARTHOG_LOG_LEVEL_(cond, lg, ::warthog::io::log_level::CRITICAL, msg) + +#define WARTHOG_LOG_LEVEL_FMT_(cond, lg, level, ...) \ + { \ + if constexpr(::warthog::io::Logger) \ + { \ + if constexpr(::warthog::io::LoggerLevel) \ + { \ + if(cond) (lg).log(level, std::format(__VA_ARGS__)); \ + } \ + } \ + else \ + { \ + if(cond) (lg).log(level, std::format(__VA_ARGS__)); \ + } \ + } + +#define WARTHOG_LOG_FMT(lg, level, ...) \ + (lg).log(level, std::format(__VA_ARGS__)) +#define WARTHOG_LOG_FMT_IF(cond, lg, level, ...) \ + { \ + if(cond) (lg).log(level, std::format(__VA_ARGS__)); \ + } + +// Write formatted message to log, pass as format,args... +#define WARTHOG_TRACE_FMT(lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + true, lg, ::warthog::io::log_level::TRACE, __VA_ARGS__) +#define WARTHOG_DEBUG_FMT(lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + true, lg, ::warthog::io::log_level::DEBUG, __VA_ARGS__) +#define WARTHOG_INFO_FMT(lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + true, lg, ::warthog::io::log_level::INFORMATION, __VA_ARGS__) +#define WARTHOG_WARN_FMT(lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + true, lg, ::warthog::io::log_level::WARNING, __VA_ARGS__) +#define WARTHOG_ERROR_FMT(lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + true, lg, ::warthog::io::log_level::ERROR, __VA_ARGS__) +#define WARTHOG_CRIT_FMT(lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + true, lg, ::warthog::io::log_level::CRITICAL, __VA_ARGS__) + +// Write formatted message to log if cond is true, pass as format,args... +#define WARTHOG_TRACE_FMT_IF(cond, lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + cond, lg, ::warthog::io::log_level::TRACE, __VA_ARGS__) +#define WARTHOG_DEBUG_FMT_IF(cond, lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + cond, lg, ::warthog::io::log_level::DEBUG, __VA_ARGS__) +#define WARTHOG_INFO_FMT_IF(cond, lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + cond, lg, ::warthog::io::log_level::INFORMATION, __VA_ARGS__) +#define WARTHOG_WARN_FMT_IF(cond, lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + cond, lg, ::warthog::io::log_level::WARNING, __VA_ARGS__) +#define WARTHOG_ERROR_FMT_IF(cond, lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + cond, lg, ::warthog::io::log_level::ERROR, __VA_ARGS__) +#define WARTHOG_CRIT_FMT_IF(cond, lg, ...) \ + WARTHOG_LOG_LEVEL_FMT_( \ + cond, lg, ::warthog::io::log_level::CRITICAL, __VA_ARGS__) + +// global logger + +using global_logger_type = logger<>; +/// @brief get the global logger, default is set to std::cerr through +/// log_sink_std +global_logger_type& +glog(); +/// @brief get the global log_sink +const log_sink& +glogs(); +/// @brief sets the global log_sink +void +set_glog(log_sink log); + +/// @brief A logger that sets itself to glog() +/// @tparam MinLevel +template +struct global_logger : logger +{ + using logger = typename global_logger::logger; + constexpr global_logger() : logger(glog().sink()) { } + + constexpr global_logger& + operator=(const global_logger&) noexcept + = default; + + /// @brief Updates the sink to the new glog sink. Must be called if + /// set_glog was used. + void + resync_global() + { + static_cast(*this) = glog().sink(); + } +}; + +// the global version of the marcos, omits the passing of a logger. +#define WARTHOG_GLOG(level, msg) WARTHOG_LOG(::warthog::io::glog(), level, msg) +#define WARTHOG_GTRACE(msg) WARTHOG_TRACE(::warthog::io::glog(), msg) +#define WARTHOG_GDEBUG(msg) WARTHOG_DEBUG(::warthog::io::glog(), msg) +#define WARTHOG_GINFO(msg) WARTHOG_INFO(::warthog::io::glog(), msg) +#define WARTHOG_GWARN(msg) WARTHOG_WARN(::warthog::io::glog(), msg) +#define WARTHOG_GERROR(msg) WARTHOG_ERROR(::warthog::io::glog(), msg) +#define WARTHOG_GCRIT(msg) WARTHOG_CRIT(::warthog::io::glog(), msg) +#define WARTHOG_GLOG_IF(cond, level, msg) \ + WARTHOG_LOG_IF(cond, ::warthog::io::glog(), level, msg) +#define WARTHOG_GTRACE_IF(cond, msg) \ + WARTHOG_TRACE_IF(cond, ::warthog::io::glog(), msg) +#define WARTHOG_GDEBUG_IF(cond, msg) \ + WARTHOG_DEBUG_IF(cond, ::warthog::io::glog(), msg) +#define WARTHOG_GINFO_IF(cond, msg) \ + WARTHOG_INFO_IF(cond, ::warthog::io::glog(), msg) +#define WARTHOG_GWARN_IF(cond, msg) \ + WARTHOG_WARN_IF(cond, ::warthog::io::glog(), msg) +#define WARTHOG_GERROR_IF(cond, msg) \ + WARTHOG_ERROR_IF(cond, ::warthog::io::glog(), msg) +#define WARTHOG_GCRIT_IF(cond, msg) \ + WARTHOG_CRIT_IF(cond, ::warthog::io::glog(), msg) +#define WARTHOG_GLOG_FMT(level, ...) \ + WARTHOG_LOG_FMT(::warthog::io::glog(), level, __VA_ARGS__) +#define WARTHOG_GTRACE_FMT(...) \ + WARTHOG_TRACE_FMT(::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GDEBUG_FMT(...) \ + WARTHOG_DEBUG_FMT(::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GINFO_FMT(...) \ + WARTHOG_INFO_FMT(::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GWARN_FMT(...) \ + WARTHOG_WARN_FMT(::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GERROR_FMT(...) \ + WARTHOG_ERROR_FMT(::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GCRIT_FMT(...) \ + WARTHOG_CRIT_FMT(::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GLOG_FMT_IF(cond, level, ...) \ + WARTHOG_LOG_FMT_IF(cond, ::warthog::io::glog(), level, __VA_ARGS__) +#define WARTHOG_GTRACE_FMT_IF(cond, ...) \ + WARTHOG_TRACE_FMT_IF(cond, ::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GDEBUG_FMT_IF(cond, ...) \ + WARTHOG_DEBUG_FMT_IF(cond, ::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GINFO_FMT_IF(cond, ...) \ + WARTHOG_INFO_FMT_IF(cond, ::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GWARN_FMT_IF(cond, ...) \ + WARTHOG_WARN_FMT_IF(cond, ::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GERROR_FMT_IF(cond, ...) \ + WARTHOG_ERROR_FMT_IF(cond, ::warthog::io::glog(), __VA_ARGS__) +#define WARTHOG_GCRIT_FMT_IF(cond, ...) \ + WARTHOG_CRIT_FMT_IF(cond, ::warthog::io::glog(), __VA_ARGS__) + +} // namespace warthog::io + +#endif // WARTHOG_IO_LOG_H diff --git a/include/warthog/io/observer.h b/include/warthog/io/observer.h new file mode 100644 index 0000000..b5d5b72 --- /dev/null +++ b/include/warthog/io/observer.h @@ -0,0 +1,121 @@ +#ifndef WARTHOG_IO_OBSERVER_H +#define WARTHOG_IO_OBSERVER_H + +/// @file observer.h +/// +/// Defines use of an observer pattern, in which observer object is registered +/// to an observable, and the observable will trigger events to all relevant +/// observers. +/// The observer is` passed to an observable as a list of tuples, +/// and when triggering an event will notify all observers by function call of +/// the event name that is callable to the observer. +/// Observer are either stored as value in the tuple or pointer to an observer. +/// +/// These function names must be registered before use, common ones registered +/// here. +/// +/// To register a new function name, use WARTHOG_OBSERVER_DEFINE([function]). +/// Invoke event with observer_[function](listeners, args...) where listeners +/// are tuple of observers. This will run through each element in tuple (i) and +/// call i.[function](args...) if able. If i.event([function],args...) is a +/// valid callable, calls this function first, also tries i.event([function]). +/// +/// @author: Ryan Hechenberger +/// @created: 2025-08-06 + +#include + +/// @brief Creates a concept observer_has_[func_name] that checks of function +/// Listener.func_name(args...) is callable. +#define WARTHOG_OBSERVER_DEFINE_HAS(func_name) \ + template \ + concept observer_has_##func_name = requires(Listener L, Args&&... args) { \ + { L.func_name(std::forward(args)...) }; \ + }; +/// @brief Creates function observer_[func_name] that triggers an event to the +/// observer. +/// +/// Creates function observer_[func_name], which will trigger relevant observer +/// function to all observers in tuple. Requires +/// WARTHOG_OBSERVER_DEFINE_HAS([func_name]). Operates as +/// observer_[func_name](observers, args...), where observers is a tuple of +/// observers. If an observer is a value, is owned by the owner of the tuple. +/// If an observer is a pointer, is not owned by the tuple, and will only +/// trigger events to an observer that is not null. +/// +/// Events are triggered for observers in order of the tuple, and events +/// triggered in order if exists in observer: +/// - event([func_name], args...) if exists otherwise event([func_name]) if +/// exists +/// - [func_name](args...) if exists +#define WARTHOG_OBSERVER_DEFINE_CALL(func_name) \ + template \ + void observer_##func_name(Listeners& L, Args&&... args) \ + { \ + if constexpr(I < std::tuple_size_v) \ + { \ + using T = std::tuple_element_t; \ + using Tb = std::remove_pointer_t; \ + constexpr bool has_func = observer_has_##func_name; \ + if constexpr(::warthog::io::observer_has_event< \ + Tb, const char*, Args...>) \ + { \ + if constexpr(std::is_pointer_v) \ + { \ + if(auto* p = std::get(L); p != nullptr) \ + p->event(#func_name, std::forward(args)...); \ + } \ + else \ + { \ + std::get(L).event( \ + #func_name, std::forward(args)...); \ + } \ + } \ + else if constexpr(::warthog::io::observer_has_event< \ + Tb, const char*>) \ + { \ + if constexpr(std::is_pointer_v) \ + { \ + if(auto* p = std::get(L); p != nullptr) \ + p->event(#func_name); \ + } \ + else { std::get(L).event(#func_name); } \ + } \ + if constexpr(has_func) \ + { \ + if constexpr(std::is_pointer_v) \ + { \ + if(auto* p = std::get(L); p != nullptr) \ + p->func_name(std::forward(args)...); \ + } \ + else \ + { \ + std::get(L).func_name(std::forward(args)...); \ + } \ + } \ + observer_##func_name(L, std::forward(args)...); \ + } \ + } + +/// @brief Defines a observer_[func_name] function and observer_has_[func_name] +/// concept. +#define WARTHOG_OBSERVER_DEFINE(func_name) \ + WARTHOG_OBSERVER_DEFINE_HAS(func_name) \ + WARTHOG_OBSERVER_DEFINE_CALL(func_name) + +namespace warthog::io +{ + +// functions used by WARTHOG_LISTENER_FN +WARTHOG_OBSERVER_DEFINE_HAS(event) + +WARTHOG_OBSERVER_DEFINE(begin_search) +WARTHOG_OBSERVER_DEFINE(end_search) +WARTHOG_OBSERVER_DEFINE(generate_node) +WARTHOG_OBSERVER_DEFINE(expand_node) +WARTHOG_OBSERVER_DEFINE(relax_node) +WARTHOG_OBSERVER_DEFINE(close_node) + +} // namespace warthog::io + +#endif // WARTHOG_IO_OBSERVER_H diff --git a/include/warthog/io/posthoc_trace.h b/include/warthog/io/posthoc_trace.h new file mode 100644 index 0000000..926329f --- /dev/null +++ b/include/warthog/io/posthoc_trace.h @@ -0,0 +1,59 @@ +#ifndef WARTHOG_IO_POSTHOC_TRACE_H +#define WARTHOG_IO_POSTHOC_TRACE_H + +/// @file posthoc_trace.h +/// +/// stream_observer that outputs a trace for use with posthoc visuliser. +/// See https:///posthoc-app.pathfinding.ai/ +/// +/// @author: Ryan Hechenberger +/// @created: 2025-08-07 + +#include "stream_observer.h" + +namespace warthog::io +{ + +/// @brief base posthoc observer class. +/// +/// Set the search_id to set which search the trace is printed for, by default +/// will not trace. event begin_search and end_search will setup the trace to +/// print only a specified. Inherit to create new trace format by overriding +/// print_posthoc_header for custom header. Add own events to print posthoc +/// event to stream() if (*this) holds true, +/// (*this) holds true iff id == search_id for event begin_search once, and +/// ends at end_search. +class posthoc_trace : public stream_observer +{ +public: + // DO NOT INHERIT steam_observer constructors, must be set through stream() + + /// @brief override print the header if not already printed + virtual void + print_posthoc_header() + { + if(*this) + { + stream() << R"posthoc(version: 1.4.0 + events: + )posthoc"; + } + } + + /// @brief override stream setting (not virtual) to print header + /// @param stream + void + open(std::ostream& stream) noexcept + { + stream_observer::open(stream); + if(static_cast(*this)) + { + // print posthoc header on setting the stream + print_posthoc_header(); + } + } +}; + +} // namespace warthog::io + +#endif // WARTHOG_IO_POSTHOC_TRACE_H diff --git a/include/warthog/io/scenario_serialize.h b/include/warthog/io/scenario_serialize.h new file mode 100644 index 0000000..aeb4847 --- /dev/null +++ b/include/warthog/io/scenario_serialize.h @@ -0,0 +1,370 @@ +#ifndef WARTHOG_IO_SCENARIO_H +#define WARTHOG_IO_SCENARIO_H + +/// @file scenario.h +/// +/// Read/write utilities for scenario files. +/// +/// Supported formats for read: +/// - GPPC 1.0 format (as at 2012 Grid-based Path Planning Competition) +/// (fields: bucket,map,mapwidth,mapheight,sx,sy,gx,gy,distance) +/// - DIMACS format (as at the 9th DIMACS Implementation Challenge) +/// (fields: q [source-id] [target-id]) +/// - Dynamic format (tbd link) +/// +/// Supported formats for generate/write: +/// - GPPC 1.0 format (as at 2012 Grid-based Path Planning Competition) +/// - Dynamic format (tbd link) +/// +/// @author: dharabor & Ryan Hechenberger +/// @created: 2025-12-04 + +#include "serialize_base.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace warthog::io +{ + +/// @brief scenario instance struct, reusable with fields set by +/// scenario_serialize +struct scenario_instance +{ + int64_t bucket; + std::string_view map; + int32_t width; + int32_t height; + double start_x; + double start_y; + double goal_x; + double goal_y; + std::span cost; + void* extra_data; ///< holds extra data that a user may require (not used + ///< by default) + + void + reset() + { + (*this) = {}; + } +}; + +struct scenario_patch +{ + int64_t bucket; + uint32_t patch_id; + uint16_t loc_x; + uint16_t loc_y; +}; + +class scenario_serialize : public serialize_base +{ +public: + enum class serialize_state : uint8_t + { + INIT, + VERSION, + COMMAND, + END, + ERROR, + }; + enum command_res : uint8_t + { + INVALID, + VALID, + FINAL, + CMD_INST, + CMD_PATCH, + CMD_UNKNOWN, + }; + scenario_serialize(); + ~scenario_serialize() override; + + static constexpr std::string_view + get_cost_str(cost_type a) noexcept; + static constexpr cost_type + get_cost_type(std::string_view a) noexcept; + + /// @brief Resets class, including memory. Must use between seperate + /// read/writes, needed for memory managment. + void + reset(); + + /// @return the current state of scenario read/write + serialize_state + state() const noexcept + { + return m_state; + } + + void + set_scenario_filename(std::filesystem::path&& filename) + { + set_filename(std::move(filename)); + } + const std::filesystem::path& + get_scenario_filename() const noexcept + { + return get_filename(); + } + + void + set_map_filename(std::filesystem::path&& filename) + { + m_map_filename = std::move(filename); + } + const std::filesystem::path& + get_map_filename() const noexcept + { + return m_map_filename; + } + + void + set_relative_map_filename(const std::filesystem::path& filename); + + void + set_version(scenario_version version) noexcept + { + m_version = version; + } + scenario_version + get_version() const noexcept + { + return m_version; + } + + /// @brief the types of dist used, only relivent for version2 + std::span + get_cost_strings() const noexcept + { + return m_cost_strings; + } + std::span + get_cost_type() const noexcept + { + return m_cost_type; + } + std::span + get_cost_value() const noexcept + { + return m_cost_value; + } + int + find_cost_index(cost_type c) const noexcept + { + auto it = std::find(m_cost_type.begin(), m_cost_type.end(), c); + return it != m_cost_type.end() + ? static_cast(it - m_cost_type.begin()) + : -1; + } + int + find_cost_index(std::string_view c) const noexcept + { + auto it = std::find(m_cost_strings.begin(), m_cost_strings.end(), c); + return it != m_cost_strings.end() + ? static_cast(it - m_cost_strings.begin()) + : -1; + } + + uint32_t + get_map_width() const noexcept + { + return m_map_width; + } + int32_t + get_map_height() const noexcept + { + return m_map_height; + } + + void + set_force_int(bool v) noexcept + { + m_force_int = v; + } + bool + get_force_int() noexcept + { + return m_force_int; + } + + void + close() override; + + virtual int + last_command_type() const; + + /// @brief reads in file version information, and sets version (accessible + /// via get_version()) + /// @param in optional stream to use, otherwise uses internal-set stream + /// @return success std::errc{}, else failure + /// @pre state() == serialize_state::INIT (returns errc otherwise) + virtual std::expected + read_version(std::istream* in = nullptr); + /// @brief read header (without version) information. + /// @param in optional stream to use, otherwise uses internal-set stream + /// @return success std::errc{}, else failure + /// @pre state() == serialize_state::VERSION (returns errc otherwise) + /// + /// With VERSION1: peeks first instance to gain map name + /// With VERSION2: gets map width/height, available costs and patch + /// filename + virtual std::expected + read_header(std::istream* in = nullptr); + + /// @brief read header as VERSION_1, does not consider the state or + /// version. use read_header for checks instead. + std::expected + read_header_v1(std::istream* in = nullptr); + /// @brief read header as VERSION_2, does not consider the state or + /// version. use read_header for checks instead. + std::expected + read_header_v2(std::istream* in = nullptr); + + /// @brief gets the next command type + /// @param in optional stream to use, otherwise uses internal-set stream + /// @return a pair with a value from command_res and std::errc for success + /// (else error) + /// @pre state() == serialize_state::COMMAND (returns error otherwise) + /// + /// With VERSION_1: + /// Returns CMD_INST or FINAL if no more commands are present + /// With VERSION_2: + /// Returns command based on last_command_type(), or FINAL if not + /// present. Default expects CMD_INST or CMD_PATCH. + std::expected + next_command_type(std::istream* in = nullptr); + /// @brief skips the next count number of commands + /// @param count number of commands to skip + /// @param in optional stream to use, otherwise uses internal-set stream + /// @return success std::errc{}, else failure + /// @pre state() == serialize_state::COMMAND (returns errc otherwise) + std::expected + skip_commands(int count = 1, std::istream* in = nullptr); + + /// @brief reads an instance line and stores results in scenario_instance + /// @param inst where to store the instance data read in + /// @param in optional stream to use, otherwise uses internal-set stream + /// @return a pair with a value from command_res and std::errc for success + /// (else error) + /// @pre state() == serialize_state::COMMAND (returns error otherwise) + /// + /// if next_command_type().first == CMD_INST, then reads the instance, + /// otherwise returns CMD_? dependent on the type of command, or FINAL. + /// With get_version() == VERSION_1: + /// Returns VALID for success, FINAL for no more commands, and INVALID + /// for invalid instance. + /// With get_version() == VERSION_2: + /// Returns VALID for success, FINAL for no more commands, and INVALID + /// for invalid instance, or last_command_type() (only CMD_PATCH for + /// standard v2 scenario) of type of command. + /// + /// INVALID return without error code means success in reading command, but + /// command has invalid parameters. Main checks are non-finite floats + /// (start/goal/cost), mismatch width/height, or out of bounds start/goal. + /// If get_force_int() == true, also checks start/goal are integers within + /// the grid, otherwise allows float also within the grid (allows x == + /// width() or y == height()). + virtual std::expected + read_instance_line(scenario_instance& inst, std::istream* in = nullptr); + + /// @brief as VERSION_1 with read_instance_line, does not check + /// pre-conditions + std::expected + read_instance_line_v1(scenario_instance& inst, std::istream* in = nullptr); + /// @brief as VERSION_2 with read_instance_line, does not check + /// pre-conditions + std::expected + read_instance_line_v2(scenario_instance& inst, std::istream* in = nullptr); + + /// @brief reads a patch line and stores results in scenario_patch + /// @param patch where to store the patch data read in (not grid) + /// @param in optional stream to use, otherwise uses internal-set stream + /// @return a pair with a value from command_res and std::errc for success + /// (else error) + /// @pre state() == serialize_state::COMMAND (returns error otherwise) + /// + /// if next_command_type().first == CMD_PATCH, then reads the instance, + /// otherwise returns CMD_? dependent on the type of command, or FINAL. + /// With get_version() == VERSION_2: + /// Returns VALID for success, FINAL for no more commands, INVALID if + /// location is out of grid bounds, or last_command_type() (only CMD_INST + /// for standard v2 scenario) of type of command. + virtual std::expected + read_patch_line(scenario_patch& patch, std::istream* in = nullptr); + + /// @brief as VERSION_2 with read_patch_line, does not check pre-conditions + std::expected + read_patch_line_v2(scenario_patch& patch, std::istream* in = nullptr); + +protected: + /// @return a owned version of str + std::string_view + copy_string(std::string_view str); + +protected: + serialize_state m_state = serialize_state::INIT; + scenario_version m_version = scenario_version::UNKNOWN; + bool m_force_int = false; + std::filesystem::path m_map_filename; + uint32_t m_map_width = 0; + uint32_t m_map_height = 0; + int32_t m_inst_at = 0; + + // dynamic data + std::pmr::monotonic_buffer_resource m_dyn_res; + std::pmr::monotonic_buffer_resource m_string_res; + // distance types + std::pmr::vector m_cost_strings; ///< names read in + std::pmr::vector + m_cost_type; ///< cost_type of index (corrisponding dist_strings and + ///< dist_value) + std::pmr::vector m_cost_value; ///< distance value stored, will be + ///< placed in dynamic_scenario + + std::string m_command_type; ///< last cost type +}; + +constexpr std::string_view +scenario_serialize::get_cost_str(cost_type a) noexcept +{ + switch(a) + { + case cost_type::G_8C_NCC: + return "8c-ncc"; + case cost_type::G_8C_CC: + return "8c-cc"; + case cost_type::G_4C: + return "4c"; + case cost_type::AA_NCC: + return "aa-ncc"; + case cost_type::AA_CC: + return "aa-cc"; + default: + return std::string_view(); + } +} +constexpr cost_type +scenario_serialize::get_cost_type(std::string_view a) noexcept +{ + if(a == "8c-ncc") return cost_type::G_8C_NCC; + if(a == "8c-cc") return cost_type::G_8C_CC; + if(a == "4c") return cost_type::G_4C; + if(a == "aa-ncc") return cost_type::AA_NCC; + if(a == "aa-cc") return cost_type::AA_CC; + return cost_type::OTHER; +} + +} // namespace warthog::io + +#endif // WARTHOG_IO_SCENARIO_H diff --git a/include/warthog/io/serialize_base.h b/include/warthog/io/serialize_base.h new file mode 100644 index 0000000..d75dab7 --- /dev/null +++ b/include/warthog/io/serialize_base.h @@ -0,0 +1,210 @@ +#ifndef WARTHOG_IO_SERIALIZE_BASE_H +#define WARTHOG_IO_SERIALIZE_BASE_H + +/// @file serialize_base.h +/// +/// Read/write base class for serialize classes. +/// Adds a uniform low-level interface for reading from a file, one-line at a +/// time. Support for both file or just from a istream/ostream object. Tracking +/// of line number for user-level error reporting and debugging. +/// +/// Ideal for use with serialize_base::parser (util::string_parser), +/// which supports fast reading of tokens through string_view and error +/// checking. +/// +/// @author: Ryan Hechenberger +/// @created: 2026-04-10 + +#include "fwd.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +namespace warthog::io +{ + +/// @brief serialize base class to support line-by-line reading with strict +/// error checking, line-number tracking and other features. +/// +/// The base class for serialize, low-level with strict error checking. +/// The ideal use case is to ensure data is read correctly, and error on +/// ill-formed without raising exceptions. +/// +/// To support low-level, each read/write takes istream|ostream pointer to +/// override the class default-defined, use get_istream|get_ostream to handle +/// the selection manually. Most functions return std::errc of non-value init +/// to state that procedure has failed. +/// +/// Use readline() to raed next line (or next blank line with true), limits +/// length to max_line_length (1k def) and strips \r?\n from end. Use +/// unreadline() to put a line back to be read by next readline (can be +/// changed). +class serialize_base +{ +public: + using parser = util::string_parser; + + static constexpr size_t max_line_length = 1 + << 10; ///< 1kB default maximum line length + serialize_base(); + virtual ~serialize_base(); + + void + set_filename(std::filesystem::path&& filename) + { + m_filename = std::move(filename); + } + const std::filesystem::path& + get_filename() const noexcept + { + return m_filename; + } + + int32_t + get_line_num() const noexcept + { + return m_line_num; + } + std::string_view + get_last_line() const noexcept + { + return m_line; + } + + /// @brief opens scenario file get_scenario_filename() for reading + /// @param scenario use a user provided instead of get_scenario_filename() + /// @return errc on error + virtual std::expected + open_read(std::istream* scenario = nullptr); + /// @brief opens scenario file get_scenario_filename() for writing + /// @param scenario use a user provided instead of get_scenario_filename() + /// @return errc on error + virtual std::expected + open_write(std::ostream* scenario = nullptr); + + virtual void + close(); + + /// @return if scenario is open for reading + bool + can_read(std::istream* in = nullptr) + { + if(in == nullptr) in = m_stream_in; + return in != nullptr; + } + /// @return if scenario is open for writing + bool + can_write(std::ostream* out = nullptr) + { + if(out == nullptr) out = m_stream_out; + return out != nullptr; + } + + /// @return the maximum line length (null terminator included), 0 means + /// unallocated and will default to max_line_length on readline() call + uint32_t + get_max_line_length() noexcept + { + return m_max_line_length; + } + +protected: + /// @return the internal istream or provided, or error + std::expected + get_istream(std::istream* in = nullptr) noexcept + { + if(in == nullptr) in = m_stream_in; + if(in == nullptr || !*in) return std::unexpected(std::errc::io_error); + return in; + } + /// @return the internal istream or provided, or error + std::expected + get_ostream(std::ostream* out = nullptr) noexcept + { + if(out == nullptr) out = m_stream_out; + if(out == nullptr || !out->good()) + return std::unexpected(std::errc::io_error); + return out; + } + + /// @return true if istream is at eof, false if not or in error + bool + istream_eof(std::istream* in = nullptr); + + /// @brief reads lines and return 1 line, checking for errors + /// @param in optional stream to use, otherwise uses internal-set stream + /// @param skip_blanks if true, the first line where is_line_blank(line) is + /// false is returned + /// @return the first valid line (can be blank), or error, the final empty + /// line is returned empty and eof is set + /// + /// Reads lines into a buffer (max size get_max_line_length()), removing + /// the line ends \r\n. If unreadline was called before, returns that line, + /// otherwise reads from istream. Change the max buffer size with + /// set_max_line_length, although it clears the buffer and current line. + /// + /// If line does not fit, return an error. + /// If an empty line is discovered, it will return the same result as the + /// eof condition, use istream_eof to distinguish. The file can end of a + /// a blank line seamlessly. + /// + /// get_line_num() will return the 1-index line number, reading from an + /// unreadline does not change the line number. + std::expected + readline(std::istream* in, bool skip_blanks = false); + + /// @brief unreads a line, keeps only a single line + /// @param line the line to return and read later, does not have to match a + /// line read from readline. + void + unreadline(std::string_view line); + + /// @brief check if while line is either blank or empty, as per + /// std::isspace + bool + is_line_blank(std::string_view line); + + /// @brief sets the max line length, clears current line buffer and line + void + set_max_line_length(uint32_t len) + { + m_max_line_length = len; + m_line_data = nullptr; + m_line = std::string_view(); + } + +protected: + std::filesystem::path m_filename; + std::unique_ptr m_stream; + std::istream* m_stream_in = nullptr; + std::ostream* m_stream_out = nullptr; + int32_t m_line_num = 0; + uint32_t m_max_line_length = 0; + std::unique_ptr m_line_data; + std::string_view m_line; + std::string m_unget_line; +}; + +/// @brief a serialize_base used solely for reading line-by-line +class line_serialize final : public serialize_base +{ +public: + using serialize_base::serialize_base; + + using serialize_base::is_line_blank; + using serialize_base::istream_eof; + using serialize_base::readline; + using serialize_base::set_max_line_length; + using serialize_base::unreadline; +}; + +} // namespace warthog::io + +#endif // WARTHOG_IO_SERIALIZE_BASE_H diff --git a/include/warthog/io/stream_observer.h b/include/warthog/io/stream_observer.h new file mode 100644 index 0000000..9ebe9c5 --- /dev/null +++ b/include/warthog/io/stream_observer.h @@ -0,0 +1,143 @@ +#ifndef WARTHOG_IO_STEAM_OBSERVER_H +#define WARTHOG_IO_STEAM_OBSERVER_H + +/// @file stream_observer.h +/// +/// The stream observer is a base class for observers that can open and own a +/// filestream, or pass another filestream. +/// This is designed as a many-to-one observers to stream. +/// No inbuilt support for multi-threading, use locks in the observer function. +/// +/// Is designed to be used with observer tuples. +/// Inherited class will call stream() to get the current stream for output. +/// Using the observer methodology, event functions will be given that will +/// write to output in certain ways. +/// +/// @author: Ryan Hechenberger +/// @created: 2025-08-01 + +#include "fwd.h" + +#include "log.h" +#include +#include + +#include +#include +#include + +namespace warthog::io +{ + +/// @brief A base-stream observer. +/// +/// Inherit and give event functions for observers to call. +/// shared_stream_t is a shared_ptr to an std::ostream, and can be passed +/// around to other stream_observer. +class stream_observer +{ +public: + /// @brief observer with no open stream + stream_observer() noexcept = default; + /// @brief copies other stream_observer stream + stream_observer(const stream_observer& stream) noexcept = default; + /// @brief ovserver with ostream, can pass std::cout, std::cerr or user + /// supplied std::ostream + stream_observer(std::ostream& stream) noexcept : stream_(&stream) { } + + /// @brief set stream + void + open(std::ostream& stream) noexcept + { + stream_ = &stream; + } + /// @brief unsets the stream + void + close() noexcept + { + stream_ = nullptr; + } + /// @brief undefined behaviour if no stream is open (asserts on debug) + std::ostream& + stream() const noexcept + { + assert(stream_ != nullptr); + return *stream_; + } + + operator bool() const noexcept { return stream_ != nullptr; } + +protected: + std::ostream* stream_ = nullptr; +}; + +/// @brief observer holds support for printing lines, send to a std::ostream or +/// connect to a log_sink. +class line_observer +{ +public: + /// @brief observer with no open stream + line_observer() noexcept = default; + /// @brief copies other line_observer + line_observer(const line_observer& stream) noexcept = default; + /// @brief ovserver with ostream, can pass std::cout, std::cerr or user + /// supplied std::ostream + line_observer(std::ostream& stream) noexcept : sink_(&stream) { } + /// @brief copies other stream_observer stream + line_observer(log_sink& logger, log_level level) noexcept + { + log(logger, level); + } + + /// @brief pass a stream object + void + open(std::ostream& stream) noexcept + { + sink_.stream = &stream; + } + /// @brief unsets the stream + void + close() noexcept + { + sink_.stream = nullptr; + } + /// @brief pass a log to write line instead of a stream + void + log(log_sink& logger, log_level level) noexcept + { + sink_.log = &logger; + type_ = (int)level; + if((uint32_t)level >= (uint32_t)log_level::NONE) + { + WARTHOG_GWARN("line_observer::log level is out of range"); + close(); + } + } + + operator bool() const noexcept { return sink_.stream != nullptr; } + + /// @brief writes line out (no newline needed), send to std::ostream if set + /// to stream, to log at + /// level if set to log_sink, otherwise do nothing + void + writeln(std::string_view msg) + { + if(sink_.stream != nullptr) + { + if(type_ < 0) { (*sink_.stream) << msg << '\n'; } + else { WARTHOG_LOG(*sink_.log, (log_level)type_, msg); } + } + } + +protected: + union + { + std::ostream* stream = nullptr; + log_sink* log; + } sink_; + int type_ = -1; ///< if <0: sink is type stream, otherwise is type log +}; + +} // namespace warthog::io + +#endif // WARTHOG_IO_STEAM_OBSERVER_H diff --git a/include/warthog/memory/bittable.h b/include/warthog/memory/bittable.h index b361898..23e1cc3 100644 --- a/include/warthog/memory/bittable.h +++ b/include/warthog/memory/bittable.h @@ -1,12 +1,13 @@ #ifndef WARTHOG_MEMORY_BITTABLE_H #define WARTHOG_MEMORY_BITTABLE_H +#include + #include #include #include #include #include -#include namespace warthog::memory { @@ -53,8 +54,7 @@ struct bittable_span_type /** * IdType: should be Identity, although integer is allowed. - * ValueBits: size of bits stored for each value. Must be power of 2 and - * smaller than BaseType. + * ValueBits: size of bits stored for each value. Must be power of 2 and <=8 * * bittable does not own its own data. * copy results in sharing underlying table data. @@ -65,8 +65,7 @@ struct bitarray { public: static_assert( - ValueBits <= sizeof(BaseType) * CHAR_BIT - && std::popcount(ValueBits) == 1, + ValueBits <= CHAR_BIT && std::popcount(ValueBits) == 1, "ValueBits must be to power of 2 and fit inside BaseType bits."); constexpr static size_t value_bits = ValueBits; using id_type = IdType; @@ -191,8 +190,8 @@ struct bitarray // return id position split // `m_data[first] >> second` will return the value as position id - constexpr std::pair - id_split(id_type id) const noexcept + constexpr static std::pair + id_split(id_type id) noexcept { id_value_type idval = id_value_type{id} << value_bit_width; return { @@ -238,6 +237,32 @@ struct bitarray } } + void + copy_p( + void* dest, uint8_t dest_bit, size_t count, id_type pos = id_type(0)) + { + // TODO: faster copy + assert(dest_bit < CHAR_BIT && (dest_bit & (ValueBits - 1)) == 0); + // primative implemtation + bitarray dest_t( + static_cast(dest)); + id_value_type p(pos); + id_value_type d = dest_bit; + while(count-- > 0) + { + auto v = get(id_type(p++)); + dest_t.set(typename decltype(dest_t)::id_type(d++), v); + } + } + void + copy( + bitarray dest, id_type dest_pos, size_t count, + id_type pos = id_type(0)) + { + auto [byte, bit] = id_split(dest_pos); + copy_p(dest.data() + byte, bit, count, pos); + } + /// /// struct data /// @@ -258,6 +283,7 @@ struct bittable : bitarray { public: using typename bittable::bitarray::id_type; + using typename bittable::bitarray::id_value_type; using typename bittable::bitarray::value_type; static constexpr size_t @@ -307,8 +333,7 @@ struct bittable : bitarray id_to_xy(id_type id) const noexcept { assert(m_dim.width != 0); - const auto value - = static_cast(id); + const auto value = static_cast(id); return { static_cast(value % m_dim.width), static_cast(value / m_dim.width)}; @@ -332,7 +357,7 @@ struct bittable : bitarray { return m_dim.width; } - /// @return width in bytes, rounded down + /// @return width in bytes constexpr uint32_t width_bytes() const noexcept { @@ -350,6 +375,11 @@ struct bittable : bitarray { return static_cast(m_dim.width) * m_dim.height; } + constexpr size_t + size_bytes() const noexcept + { + return sizeof(value_type) * data_elements(); + } constexpr bittable_dimension dim() const noexcept { @@ -420,6 +450,26 @@ struct bittable : bitarray return bittable::bitarray::id_split(id); } + void + copy( + bittable dest, id_type dest_pos, id_type pos, uint32_t width, + uint32_t height) + { + // TODO: faster copy + if(width == 0 || height == 0) return; + + id_value_type d(dest_pos); + id_value_type dd = dest.m_dim.width; + id_value_type p(pos); + id_value_type pd = m_dim.width; + do + { + bittable::bitarray::copy(dest, id_type(d), width, id_type(p)); + d += dd; + p += pd; + } while(--height != 0); + } + /// /// struct data /// diff --git a/include/warthog/util/experiment.h b/include/warthog/scenario/experiment.h similarity index 53% rename from include/warthog/util/experiment.h rename to include/warthog/scenario/experiment.h index bfa76e6..d7eb053 100644 --- a/include/warthog/util/experiment.h +++ b/include/warthog/scenario/experiment.h @@ -1,5 +1,5 @@ -#ifndef WARTHOG_UTIL_EXPERIMENT_H -#define WARTHOG_UTIL_EXPERIMENT_H +#ifndef WARTHOG_SCENARIO_EXPERIMENT_H +#define WARTHOG_SCENARIO_EXPERIMENT_H // experiment.h // @@ -23,20 +23,24 @@ #include #include -#include +#include -namespace warthog::util +namespace warthog::scenario { -class experiment +struct experiment { -public: experiment( uint32_t sx, uint32_t sy, uint32_t gx, uint32_t gy, uint32_t mapwidth, - uint32_t mapheight, double d, std::string m) + uint32_t mapheight, std::optional d, std::string_view m) : startx_(sx), starty_(sy), goalx_(gx), goaly_(gy), - mapwidth_(mapwidth), mapheight_(mapheight), distance_(d), map_(m), - precision_(4) + mapwidth_(mapwidth), mapheight_(mapheight), distance_(d), map_(m) + { } + experiment( + double sx, double sy, double gx, double gy, uint32_t mapwidth, + uint32_t mapheight, std::optional d, std::string_view m) + : startx_(sx), starty_(sy), goalx_(gx), goaly_(gy), + mapwidth_(mapwidth), mapheight_(mapheight), distance_(d), map_(m) { } // no copy @@ -49,35 +53,55 @@ class experiment uint32_t startx() const noexcept + { + return static_cast(startx_); + } + double + startx_f() const noexcept { return startx_; } uint32_t starty() const noexcept + { + return static_cast(starty_); + } + double + starty_f() const noexcept { return starty_; } uint32_t goalx() const noexcept + { + return static_cast(goalx_); + } + double + goalx_f() const noexcept { return goalx_; } uint32_t goaly() const noexcept + { + return static_cast(goaly_); + } + double + goaly_f() const noexcept { return goaly_; } - double + std::optional distance() const noexcept { return distance_; } - const std::string& + std::string_view map() const noexcept { return map_; @@ -95,18 +119,6 @@ class experiment return mapheight_; } - int32_t - precision() const noexcept - { - return precision_; - } - - void - set_precision(int32_t prec) noexcept - { - precision_ = prec; - } - void print(std::ostream& out); @@ -114,18 +126,33 @@ class experiment get_instance() const noexcept { return search::problem_instance( - pack_id{starty_ * mapwidth_ + startx_}, - pack_id{goaly_ * mapwidth_ + goalx_}); + pack_id{starty() * mapwidth_ + startx()}, + pack_id{goaly() * mapwidth_ + goalx()}); } -private: - uint32_t startx_, starty_, goalx_, goaly_; + double startx_, starty_, goalx_, goaly_; uint32_t mapwidth_, mapheight_; - double distance_; - std::string map_; - int32_t precision_; + std::optional + distance_; ///< -1 = no solution, non-init = unknown solution + std::string_view map_; }; -} // namespace warthog::util - -#endif // WARTHOG_UTIL_EXPERIMENT_H +inline void +experiment::print(std::ostream& out) +{ + out << this->map() << "\t"; + out << this->mapwidth() << "\t"; + out << this->mapheight() << "\t"; + out << this->startx() << "\t"; + out << this->starty() << "\t"; + out << this->goalx() << "\t"; + out << this->goaly() << "\t"; + if(this->distance()) + out << std::setprecision(10) << *this->distance(); + else + out << '-'; +} + +} // namespace warthog::scenario + +#endif // WARTHOG_SCENARIO_EXPERIMENT_H diff --git a/include/warthog/scenario/grid_patch_set.h b/include/warthog/scenario/grid_patch_set.h new file mode 100644 index 0000000..d6a0eb5 --- /dev/null +++ b/include/warthog/scenario/grid_patch_set.h @@ -0,0 +1,146 @@ +#ifndef WARTHOG_SCENARIO_GRID_PATCH_SET_H +#define WARTHOG_SCENARIO_GRID_PATCH_SET_H + +/// @file grid_patch_set.h +/// +/// Utility to store grid map/patches. +/// Can read with some flexibility and be used with scenario_runner to update a +/// gridmap. +/// +/// @author: Ryan Hechenberger +/// @created: 2026-04-10 +/// + +#include +#include +#include + +#include +#include +#include + +namespace warthog::scenario +{ + +/// @brief a class for managing a set of patches +/// +/// Stores a list of patches in a vector. +/// Supports loading of patches from a file/stream with flags to control this. +/// User can also add their own patches. +class grid_patch_set +{ +public: + enum flags : uint32_t + { + DEFAULT = 0u, ///< default options + SKIP_HEADER = 1u << 0, ///< will not read header + FORCE_HEADER = 1u << 1, ///< must read header + IGNORE_INDEX = 1u << 2, ///< ignores patch read index + }; + using bittable = domain::gridmap::bittable; + static constexpr uint16_t npos = (uint16_t)-1u; + + grid_patch_set(std::pmr::memory_resource* upstream = nullptr) + : grid_res_( + upstream != nullptr ? upstream + : std::pmr::get_default_resource()) + { } + + /// @brief read istream as whole patch set + /// @param file open text istream + /// @param max_grids maximum number of grids to read + /// @return true if success, false otherwise + bool + load(std::istream& file, int max_grids = -1); + + /// @brief opens file and read as whole patch set + /// @param maps the filename to open + /// @param max_grids maximum number of grids to read + /// @return true if success, false otherwise + bool + load(const std::filesystem::path& maps, int max_grids = -1); + + /// @brief reads from a serialize, checking for errors. Can read both type + /// octile and patch files. + /// @param S the bittable_serialize, must be open + /// @param max_grids the max grids to read, or -1 for no limit + /// @param flags flags that control how to read, check enum flags + /// @return the number of grids read successfully, or <0 for negative index + /// of patch that failed to be read successfully + /// + /// This function will load from an established bittable_serialize, reading + /// all grids and appending to existing patches. If type octile, only one + /// grid is read as the first patch, otherwise up to max_grids (default + /// all) are read. + /// + /// By DEFAULT, it will read the header if not already read and append all + /// remaining grids to existing patches, but will error if the index in the + /// file does not match the index in this class. SKIP_HEADER requires that + /// S have already read the header else errors. FORCE_HEADER requires that + /// S have not read the header else errors. IGNORE_INDEX will not error if + /// index in patch file does not match. + int + load( + io::bittable_serialize& S, int max_grids = -1, + uint32_t flags = DEFAULT); + + bool + save(std::ostream& file, int grid_id = -1); + + bool + save(const std::filesystem::path& maps, int grid_id = -1); + + int + save( + io::bittable_serialize& S, int grid_id = -1, uint32_t flags = DEFAULT); + + /// @brief copies a user-provided bittable, subregion from offset with + /// width/height + /// @param table the base table to push + /// @return true on success, false otherwise + /// @pre (offset_x == 0 && offset_y == 0 && width == npos && height == + /// npos) || (width != npos && height != npos) + /// + /// Will copy from (offset_x,offset_y) table of width by height. + /// Subtable must fully fit within table or fail. + /// Defaults will copy whole bittable, if any arguments are changed then + /// width/height must be specified (i.e. cannot be npos). + bool + push_copy( + bittable table, uint16_t offset_x = 0, uint16_t offset_y = 0, + uint16_t width = npos, uint16_t height = npos); + + /// @brief pushes a bittable to set, not copying contents, does not own + /// table memory + /// @param patch the patch to push + /// @return true on success, false otherwise + bool + push_ref(bittable patch); + + void + reset(); + + size_t + size() const noexcept + { + return patches_.size(); + } + bittable + get_patch(size_t i) const + { + return patches_.at(i); + } + std::span + get_patches() const noexcept + { + return patches_; + } + +protected: + std::pmr::monotonic_buffer_resource grid_res_; + std::vector patches_; +}; + +} // namespace warthog::scenario + +#endif // WARTHOG_SCENARIO_GRID_PATCH_SET_H diff --git a/include/warthog/scenario/scenario_manager.h b/include/warthog/scenario/scenario_manager.h new file mode 100644 index 0000000..f4fba87 --- /dev/null +++ b/include/warthog/scenario/scenario_manager.h @@ -0,0 +1,295 @@ +#ifndef WARTHOG_SCENARIO_SCENARIO_MANAGER_H +#define WARTHOG_SCENARIO_SCENARIO_MANAGER_H + +// scenario_manager.h +// +// Read and generate/write scenario files +// +// Supported formats for read: +// - GPPC 1.0 format (as at 2012 Grid-based Path Planning Competition) +// (fields: bucket,map,mapwidth,mapheight,sx,sy,gx,gy,distance) +// - DIMACS format (as at the 9th DIMACS Implementation Challenge) +// (fields: q [source-id] [target-id]) +// - Dynamic format (tbd) +// +// @author: dharabor & Ryan Hechenberger +// @created: 21/08/2012 +// + +#include "experiment.h" +#include + +#include +#include +#include +#include +#include +#include + +namespace warthog::scenario +{ + +struct scenario_command +{ + enum type_ : uint8_t + { + SNAPSHOT, + PATCH, + INST + }; + + int type; ///< command type + int32_t bucket; ///< bucket id number (meta), snapshot id for dynamic + uint32_t + id; ///< SNAPSHOT: snapshot num, PATCH: patch to apply, INST: inst id + + union cmd_ + { + struct snapshot_ + { + } snapshot; + struct patch_ + { + uint16_t topleft_x; + uint16_t topleft_y; + } patch; + struct inst_ + { + uint32_t experiment_id; ///< experiment number + } inst; + } cmd; ///< command union based on type + + static constexpr scenario_command + make_snapshot(int32_t bucket_id, uint32_t snapshot_id) noexcept + { + return scenario_command{ + SNAPSHOT, bucket_id, snapshot_id, {.snapshot = {}}}; + } + + static constexpr scenario_command + make_patch( + int32_t bucket_id, uint32_t patch_id, uint16_t x, uint16_t y) noexcept + { + return scenario_command{PATCH, bucket_id, patch_id, {.patch = {x, y}}}; + } + + static constexpr scenario_command + make_inst( + int32_t bucket_id, uint32_t inst_id, uint32_t experiment_id) noexcept + { + return scenario_command{ + INST, bucket_id, inst_id, {.inst = {experiment_id}}}; + } +}; + +class scenario_manager +{ +public: + scenario_manager(); + ~scenario_manager(); + + experiment* + get_experiment(uint32_t which) + { + if(which >= experiments_.size()) + { + WARTHOG_GWARN_FMT( + "scenario has max {} experiments, cannot retrive {}", + experiments_.size(), which); + return nullptr; + } + return experiments_[which]; + } + const experiment* + get_experiment(uint32_t which) const + { + if(which >= experiments_.size()) + { + WARTHOG_GWARN_FMT( + "scenario has max {} experiments, cannot retrive {}", + experiments_.size(), which); + return nullptr; + } + return experiments_[which]; + } + + std::span + get_experiments() noexcept + { + return experiments_; + } + std::span + get_experiments() const noexcept + { + return experiments_; + } + + std::span + get_commands() noexcept + { + return commands_; + } + std::span + get_commands() const noexcept + { + return commands_; + } + + void + add_experiment(experiment* newexp) + { + experiments_.push_back(newexp); + } + + uint32_t + num_experiments() const noexcept + { + return (uint32_t)experiments_.size(); + } + + size_t + mem() const noexcept + { + return sizeof(*this) + sizeof(experiment) * experiments_.size(); + } + + std::string + last_file_loaded() const noexcept + { + return sfile_.string(); + } + const std::filesystem::path& + scenario_filename() const noexcept + { + return sfile_; + } + const std::filesystem::path& + map_filename() const noexcept + { + return mfile_; + } + void + clear(); + + void + load_scenario(const std::filesystem::path& filelocation); + void + load_scenario( + std::istream& file, std::filesystem::path&& mapfile_override = {}); + + std::string_view + get_cost_type() const noexcept + { + return cost_type_; + } + void + set_cost_type(std::string_view v) noexcept + { + cost_type_ = v; + } + void + set_cost_type(io::cost_type c) noexcept; + + bool + is_static_scenario() const noexcept + { + return static_scenario_start_ >= 0; + } + int32_t + get_static_scenario_start() const noexcept + { + return static_scenario_start_; + } + + uint32_t + get_scenario_width() const noexcept + { + return scenario_width_; + } + void + set_scenario_width(uint32_t width) noexcept + { + scenario_width_ = width; + } + + uint32_t + get_scenario_height() const noexcept + { + return scenario_height_; + } + void + set_scenario_height(uint32_t height) noexcept + { + scenario_height_ = height; + } + + io::scenario_version + get_version() const noexcept + { + return version_; + } + + /// @return number of instances, should be equiv to num_experiments() + uint32_t + get_inst_count() const noexcept + { + return inst_count_; + } + + /// @return number of patches, v1 will always be 1 + uint32_t + get_patch_count() const noexcept + { + return patch_count_; + } + + /// @return number of patches, static scenarios will be 1 + uint32_t + get_snapshot_count() const noexcept + { + return snapshot_count_; + } + +protected: + std::expected + load_gppc_scenario(std::istream& scenfile); + + std::expected + load_gppc_scenario_body_v1(io::scenario_serialize& si); + std::expected + load_gppc_scenario_body_v2(io::scenario_serialize& si); + + std::string_view + copy_string(std::string_view str); + + std::pmr::monotonic_buffer_resource experiments_res_; + std::vector experiments_; + std::vector commands_; + std::vector patches_; + std::filesystem::path sfile_; + std::filesystem::path mfile_; + std::string cost_type_; + io::scenario_version version_ = io::scenario_version::UNKNOWN; + uint32_t scenario_width_ = 0; + uint32_t scenario_height_ = 0; + uint32_t inst_count_ = 0; + uint32_t patch_count_ = 0; + uint32_t snapshot_count_ = 0; + int32_t static_scenario_start_ + = -1; ///< >=0: is static scenario where inst commands start at pos, + ///< else is dynamic scenario +}; + +std::filesystem::path +find_map_filename( + const scenario_manager& scenmgr, + const std::filesystem::path& sfilename = {}); + +std::filesystem::path +find_map_filename( + const std::filesystem::path& scenmgr, + const std::filesystem::path& sfilename = {}); + +} // namespace warthog::scenario + +#endif // WARTHOG_SCENARIO_SCENARIO_MANAGER_H diff --git a/include/warthog/scenario/scenario_runner.h b/include/warthog/scenario/scenario_runner.h new file mode 100644 index 0000000..d13fea3 --- /dev/null +++ b/include/warthog/scenario/scenario_runner.h @@ -0,0 +1,191 @@ +#ifndef WARTHOG_SCENARIO_SCENARIO_RUNNER_H +#define WARTHOG_SCENARIO_SCENARIO_RUNNER_H + +/// @file scenario_runner.h +/// +/// Take a scenario_manager object and be able to progress through a dynamic +/// scenario. +/// +/// @author: Ryan Hechenberger +/// @created: 2026-04-09 +/// + +#include "grid_patch_set.h" +#include "scenario_manager.h" +#include + +namespace warthog::scenario +{ + +struct patch_loc +{ + uint32_t patch_id; + uint16_t topleft_x; + uint16_t topleft_y; +}; + +class scenario_runner +{ +public: + scenario_runner(); + scenario_runner(const scenario_manager* scen); + ~scenario_runner(); + + /// @brief clear scenario and reset the class + void + clear(); + + /// @brief reset scenario to first command + void + restart(); + + /// @brief get the current scenario + const scenario_manager* + get_scenario() const noexcept + { + return scenario_; + } + + /// @brief clear() and set the current scenario + void + set_scenario(const scenario_manager* scen) noexcept + { + clear(); + scenario_ = scen; + } + + /// @brief progress from current to count experiment away and return it + /// @param count get number of experiments away + /// @param progress progress past last count experiment if true + /// @return pair of the reached inst and number of patches encounted + /// + /// Will progress through commands until count queries are encounted, + /// returning the final inst. When count == 1, is exactly the next inst. + /// All patches required + std::pair + experiment_next(uint32_t count = 1, bool progress = true); + + /// @brief goto the start of the next snapshot (SNAPSHOT command) + /// @param clear_patch clears get_patches() + /// @return snapshot id reached, or -1 if at end of commands (no more + /// snapshots) + /// + /// If current command is SNAPSHOT, if id != current_snapshot() then + /// already at next snapshot, otherwise progress until next SNAPSHOT + /// command is reached (or end of commands). Clears all patches from + /// get_patches() and replaces with any PATCH command to next snapshot. + int + snapshot_next(bool clear_patch = true); + + /// @brief starting at SNAPSHOT or current PATCH, apply all patches until + /// reaching SNAPSHOT or INST + /// @param clear_patch clears get_patches() + /// @return the number of patches, patch id are retrivable from + /// get_patches() + /// + /// Requires to be on SNAPSHOT or PATCH, otherwise returns 0 and does + /// nothing. If @clear_patch is set, clears get_patches(). Appends all + /// processed PATCH commands to get_patches(). + int + snapshot_patches(bool clear_patch = true); + + /// @brief returns the current inst experiment if at inst and progress to + /// next command (if progress) + /// @param progress progress to next command if true, false stay on inst + /// @return the current inst experiment if command is inst, otherwise + /// nullptr + /// + /// Requires to be on INST, otherwise return nullptr and do nothing. + /// If INST, returns corrisponding experiment and goto next command. + /// Does not affect get_patches(). + const experiment* + snapshot_inst(bool progress = true); + + /// @brief progress from current to count experiment away and return it + /// @param clear_patch clears get_patches() + /// @return pair of the reached inst and snapshot id. + /// + /// Will progress through commands until count queries are encounted, + /// returning the final inst. When count == 1, is exactly the next inst. + /// All patches required + std::span + snapshot_inst_all(); + + uint32_t + get_command_at() const noexcept + { + return command_at_; + } + + int32_t + get_experiment_at() const noexcept + { + return experiment_at_; + } + + int32_t + get_snapshot_at() const noexcept + { + return snapshot_at_; + } + + bool + complete() const noexcept + { + return command_at_ >= scenario_->get_commands().size(); + } + + std::span + get_patches() const noexcept + { + return patches_; + } + + size_t + mem() const noexcept + { + return 0; + } + + /// @brief setup grid and contain snapshot 0 + /// @param grid the gridmap to setup + /// @param patch_set the patch set to + /// @param setup_grid re-create the grid to match scenario size + /// @return true if operation is successful + bool + gridmap_init( + domain::gridmap& grid, const grid_patch_set& patch_set, + bool setup_grid = true); + + /// @brief apply patches from patch_set in order by get_patches() + /// @param grid grid to apply to + /// @param patch_set patch_set to pull patch data from + /// @return >=0 successful patches applied, <0 failed to apply negative id + /// (from 1) + int + gridmap_apply_patches( + domain::gridmap& grid, const grid_patch_set& patch_set); + + /// @brief apply a single patch to a gridmap + /// @param grid grid to apply to + /// @param patch patch bittable to copy + /// @param padded_x the padded topleft on grid + /// @param padded_y the padded topleft on grid + /// @return true if apply is successful, false otherwise + bool + girdmap_apply_patch( + domain::gridmap& grid, domain::gridmap::bittable patch, + uint32_t padded_x, uint32_t padded_y); + +protected: + const scenario_manager* scenario_ = nullptr; + std::vector patches_; + std::vector experiments_; + uint32_t command_at_ = 0; ///< command at, used for dynamic scenario + int32_t experiment_at_ = -1; + int32_t snapshot_at_ = -1; +}; + +} // namespace warthog::scenario + +#endif // WARTHOG_SCENARIO_SCENARIO_RUNNER_H diff --git a/include/warthog/search/dummy_filter.h b/include/warthog/search/dummy_filter.h deleted file mode 100644 index 0b6d47c..0000000 --- a/include/warthog/search/dummy_filter.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef WARTHOG_SEARCH_DUMMY_FILTER_H -#define WARTHOG_SEARCH_DUMMY_FILTER_H - -// search/dummy_filter.h -// -// A node filter that doesn't filter anything. -// -// @author: dharabor -// @created: 2016-07-19 -// - -#include - -namespace warthog::search -{ - -class dummy_filter -{ -public: - dummy_filter() { } - ~dummy_filter() { } - - inline bool - filter(uint32_t node_id, uint32_t edge_idx) - { - return false; - } - - inline void - set_target(uint32_t target_id) - { } -}; - -} // namespace warthog::search - -#endif // WARTHOG_SEARCH_DUMMY_FILTER_H diff --git a/include/warthog/search/dummy_listener.h b/include/warthog/search/dummy_listener.h deleted file mode 100644 index 1108b07..0000000 --- a/include/warthog/search/dummy_listener.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef WARTHOG_SEARCH_DUMMY_LISTENER_H -#define WARTHOG_SEARCH_DUMMY_LISTENER_H - -// search/dummy_listener.h -// -// A search listener is a callback class that executes specialised -// code for partiular search events, such as when: -// - a node is generated -// - a node is expanded -// - a node is relaxed -// -// This class implements dummy listener with empty event handlers. -// -// @author: dharabor -// @created: 2020-03-09 -// - -#include "search_node.h" -#include -#include - -namespace warthog::search -{ - -class dummy_listener -{ -public: - inline void - generate_node( - search_node* parent, search_node* child, cost_t edge_cost, - uint32_t edge_id) - { } - - inline void - expand_node(search_node* current) - { } - - inline void - relax_node(search_node* current) - { } -}; - -} // namespace warthog::search - -#endif // WARTHOG_SEARCH_DUMMY_LISTENER_H diff --git a/include/warthog/search/problem_instance.h b/include/warthog/search/problem_instance.h index 9a7a271..9f66875 100644 --- a/include/warthog/search/problem_instance.h +++ b/include/warthog/search/problem_instance.h @@ -85,12 +85,34 @@ convert_problem_instance_to_search(const problem_instance& pi, Domain& d) start, target, pi.instance_id_, pi.verbose_, pi.extra_params_}; } -} // namespace warthog::search - std::ostream& -operator<<(std::ostream& str, const warthog::search::problem_instance& pi); +operator<<(std::ostream& str, const problem_instance& pi); std::ostream& -operator<<( - std::ostream& str, const warthog::search::search_problem_instance& pi); +operator<<(std::ostream& str, const search_problem_instance& pi); + +} // namespace warthog::search + +template<::warthog::Identity STATE> +struct std::formatter<::warthog::search::problem_instance_base, char> +{ + template + constexpr auto + parse(ParseContext& ctx) const + { + return ctx.begin(); + } + + template + FmtContext::iterator + format( + const ::warthog::search::problem_instance_base& pi, + FmtContext& ctx) const + { + return std::format_to( + ctx.out(), "problem instance[{}]; start:{} target:{} search_id:{}", + typeid(typename STATE::tag).name(), pi.start_.id, pi.target_.id, + pi.instance_id_); + } +}; #endif // WARTHOG_SEARCH_PROBLEM_INSTANCE_H diff --git a/include/warthog/search/search_metrics.h b/include/warthog/search/search_metrics.h index d54108b..76b8a43 100644 --- a/include/warthog/search/search_metrics.h +++ b/include/warthog/search/search_metrics.h @@ -62,9 +62,9 @@ struct search_metrics // warthog::search_metrics& met); }; -} // namespace warthog::search - std::ostream& -operator<<(std::ostream& str, const warthog::search::search_metrics& met); +operator<<(std::ostream& str, const search_metrics& met); + +} // namespace warthog::search #endif // WARTHOG_SEARCH_SEARCH_METRICS_H diff --git a/include/warthog/search/search_node.h b/include/warthog/search/search_node.h index a0cddf9..bdfa9e4 100644 --- a/include/warthog/search/search_node.h +++ b/include/warthog/search/search_node.h @@ -8,6 +8,7 @@ // #include +#include #include #include @@ -15,23 +16,15 @@ namespace warthog::search { -class search_node +struct search_node { -public: - search_node(pad_id id = pad_id::max()) - : id_(id), parent_id_(warthog::SN_ID_MAX), g_(warthog::COST_MAX), - f_(warthog::COST_MAX), ub_(warthog::COST_MAX), status_(0), - priority_(warthog::INF32), search_number_(UINT32_MAX) - { - refcount_++; - } - - ~search_node() { refcount_--; } + search_node() noexcept = default; + search_node(pad_id id) noexcept : id_(id) { } inline void init( uint32_t search_number, pad_id parent_id, cost_t g, cost_t f, - cost_t ub = warthog::COST_MAX) + cost_t ub = warthog::COST_MAX) noexcept { parent_id_ = parent_id; f_ = f; @@ -42,103 +35,103 @@ class search_node } inline uint32_t - get_search_number() const + get_search_number() const noexcept { return search_number_; } inline void - set_search_number(uint32_t search_number) + set_search_number(uint32_t search_number) noexcept { search_number_ = search_number; } inline pad_id - get_id() const + get_id() const noexcept { return id_; } inline void - set_id(pad_id id) + set_id(pad_id id) noexcept { id_ = id; } inline bool - get_expanded() const + get_expanded() const noexcept { return status_; } inline void - set_expanded(bool expanded) + set_expanded(bool expanded) noexcept { status_ = expanded; } inline pad_id - get_parent() const + get_parent() const noexcept { return parent_id_; } inline void - set_parent(pad_id parent_id) + set_parent(pad_id parent_id) noexcept { parent_id_ = parent_id; } inline uint32_t - get_priority() const + get_priority() const noexcept { return priority_; } inline void - set_priority(uint32_t priority) + set_priority(uint32_t priority) noexcept { priority_ = priority; } inline cost_t - get_g() const + get_g() const noexcept { return g_; } inline void - set_g(cost_t g) + set_g(cost_t g) noexcept { g_ = g; } inline cost_t - get_f() const + get_f() const noexcept { return f_; } inline void - set_f(cost_t f) + set_f(cost_t f) noexcept { f_ = f; } inline cost_t - get_ub() const + get_ub() const noexcept { return ub_; } inline void - set_ub(cost_t ub) + set_ub(cost_t ub) noexcept { ub_ = ub; } inline void - relax(cost_t g, pad_id parent_id) + relax(cost_t g, pad_id parent_id) noexcept { assert(g < g_); f_ = (f_ - g_) + g; @@ -148,7 +141,7 @@ class search_node } inline bool - operator<(const search_node& other) const + operator<(const search_node& other) const noexcept { // static uint64_t SIGN_MASK = UINT64_MAX & (1ULL<<63); // cost_t result = this->f_ - other.f_; @@ -169,7 +162,7 @@ class search_node } inline bool - operator>(const search_node& other) const + operator>(const search_node& other) const noexcept { if(f_ > other.f_) { return true; } if(f_ < other.f_) { return false; } @@ -180,14 +173,14 @@ class search_node } inline bool - operator==(const search_node& other) const + operator==(const search_node& other) const noexcept { if(!(*this < other) && !(*this > other)) { return true; } return false; } inline bool - operator<=(const search_node& other) const + operator<=(const search_node& other) const noexcept { if(*this < other) { return true; } if(!(*this > other)) { return true; } @@ -195,50 +188,34 @@ class search_node } inline bool - operator>=(const search_node& other) const + operator>=(const search_node& other) const noexcept { if(*this > other) { return true; } if(!(*this < other)) { return true; } return false; } - inline void - print(std::ostream& out) const - { - out << "search_node id:" << get_id().id; - out << " p_id: "; - out << parent_id_.id; - out << " g: " << g_ << " f: " << this->get_f() << " ub: " << ub_ - << " expanded: " << get_expanded() << " " - << " search_number_: " << search_number_; - } + void + print(std::ostream& out) const; uint32_t - mem() + mem() noexcept { return sizeof(*this); } - static uint32_t - get_refcount() - { - return refcount_; - } - -private: - pad_id id_; - pad_id parent_id_; + pad_id id_ = pad_id(warthog::SN_ID_MAX); + pad_id parent_id_ = pad_id(warthog::SN_ID_MAX); - cost_t g_; - cost_t f_; - cost_t ub_; + cost_t g_ = warthog::COST_MAX; + cost_t f_ = warthog::COST_MAX; + cost_t ub_ = warthog::COST_MAX; // TODO steal the high-bit from priority instead of ::status_ ? - uint8_t status_; // open or closed - uint32_t priority_; // expansion priority + uint8_t status_ = 0; // open or closed + uint32_t priority_ = warthog::INF32; // expansion priority - uint32_t search_number_; - static uint32_t refcount_; + uint32_t search_number_ = UINT32_MAX; }; struct cmp_less_search_node @@ -273,4 +250,27 @@ struct cmp_less_search_node_f_only std::ostream& operator<<(std::ostream& str, const warthog::search::search_node& sn); +template<> +struct std::formatter<::warthog::search::search_node, char> +{ + template + constexpr auto + parse(ParseContext& ctx) const + { + return ctx.begin(); + } + + template + FmtContext::iterator + format(const ::warthog::search::search_node& s, FmtContext& ctx) const + { + return std::format_to( + ctx.out(), + "search_node id:{} p_id:{} g:{} f:{} ub:{} expanded:{} " + "search_number:{}", + s.get_id().id, s.get_parent().id, s.get_g(), s.get_f(), s.get_ub(), + s.get_expanded(), s.get_search_number()); + } +}; + #endif // WARTHOG_SEARCH_SEARCH_NODE_H diff --git a/include/warthog/search/uds_traits.h b/include/warthog/search/uds_traits.h index 8e51229..d931d0a 100644 --- a/include/warthog/search/uds_traits.h +++ b/include/warthog/search/uds_traits.h @@ -1,19 +1,24 @@ #ifndef WARTHOG_SEARCH_UDS_TRAITS_H #define WARTHOG_SEARCH_UDS_TRAITS_H -// search/uds_traits.h -// -// Traits that specify how a Uni-Directional Search should behave: -// - to determine admissibility -// - to determine termination -// - to determine whether to reopen -// -// @author: dharabor -// @created: 2021-10-12 -// +/// @file uds_traits.h +/// +/// Traits that specify how a Uni-Directional Search should behave: +/// - to determine admissibility +/// - to determine termination +/// - to determine whether to reopen +/// +/// Traits are applied through a trait class, see uds_traits for an example +/// of a complete (and user definable) class of all traits. +/// Every trait has a default value, and thus are optional to include, i.e. +/// an empty struct is the same as uds_default_traits. +/// +/// @author: dharabor & Ryan Hechenberger +/// @created: 2021-10-12 #include "search_metrics.h" -#include +#include +#include namespace warthog::search { @@ -22,6 +27,7 @@ namespace warthog::search enum class admissibility_criteria { any, + optimal, w_admissible, eps_admissible }; @@ -37,15 +43,36 @@ enum class admissibility_criteria template inline bool -admissible(cost_t lb, cost_t ub, search_parameters* par) +admissible(cost_t lb, cost_t ub, search_parameters* par); + +/// any: +/// the any admissible approach always returns true solution; i.e., +/// a solution is admissible if it is feasible. +template<> +inline bool +admissible( + cost_t lb, cost_t ub, search_parameters* par) +{ + // default admissibility: lower bound meets upper bound + return lb >= ub; +} + +/// optimal: +/// the optimal admissible approach returns when the lower-bound has +/// reached or exceeded the upper bound i.e., no better solution +/// exists in the queue. +template<> +inline bool +admissible( + cost_t lb, cost_t ub, search_parameters* par) { // default admissibility: any solution at all - return ub != warthog::COST_MAX; + return lb >= ub; } -// w_admissibility: -// the current upperbound is not more than w * lowerbound, with w a user -// defined parameter (w=1 guarantees optimality). +/// w_admissibility: +/// the current upperbound is not more than w * lowerbound, with w a user +/// defined parameter (w=1 guarantees optimality). template<> inline bool admissible( @@ -54,12 +81,12 @@ admissible( // TODO: precision issues can arise here. rounding would fix this // but we need to know a minimum cost-delta (round with half of that) assert(par->get_w_admissibility() >= 1.0); - return ub <= (par->get_w_admissibility() * lb); + return (par->get_w_admissibility() * lb) >= ub; } -// eps_admissibility: -// the current upperbound is not more than eps(ilon) + lowerbound. -// Here eps is a user defined parameter (eps=0 guarantees optimality). +/// eps_admissibility: +/// the current upperbound is not more than eps(ilon) + lowerbound. +/// Here eps is a user defined parameter (eps=0 guarantees optimality). template<> inline bool admissible( @@ -68,7 +95,7 @@ admissible( // TODO: precision issues can arise here. rounding would fix this // but we need to know a minimum cost-delta (round with half of that) assert(par->get_eps_admissibility() >= 0); - return ub <= (par->get_eps_admissibility() + lb); + return (par->get_eps_admissibility() + lb) >= ub; } //////////////////////////////////////////////////////////////////////////////// @@ -78,13 +105,20 @@ enum class feasibility_criteria until_cutoff }; -// test if the search is still feasible; i.e., if a solution could still -// exist. our default approach is to suppose a solution still exists if -// there are more nodes to expand. other criteria (e.g., termination due -// to reaching some limit) are handled via specialisation +/// test if the search is still feasible; i.e., if a solution could still +/// exist. template inline bool -feasible(search_node* next, search_metrics* met, search_parameters* par) +feasible(search_node* next, search_metrics* met, search_parameters* par); + +/// test if the search is still feasible; i.e., if a solution could still +/// exist. our default approach is to suppose a solution still exists if +/// there are more nodes to expand. other criteria (e.g., termination due +/// to reaching some limit) are handled via specialisation +template<> +inline bool +feasible( + search_node* next, search_metrics* met, search_parameters* par) { // default feasibility: still have unexpanded nodes return next; @@ -99,24 +133,24 @@ feasible( if(next->get_f() > par->get_max_cost_cutoff()) { - info( - par->verbose_, "cost cutoff", next->get_f(), ">", + WARTHOG_GINFO_FMT_IF( + par->verbose_, "cost cutoff {} > {}", next->get_f(), par->get_max_cost_cutoff()); return false; } if(met->nodes_expanded_ >= par->get_max_expansions_cutoff()) { - info( - par->verbose_, "expansions cutoff", met->nodes_expanded_, ">", + WARTHOG_GINFO_FMT_IF( + par->verbose_, "expansions cutoff {} > {}", met->nodes_expanded_, par->get_max_expansions_cutoff()); return false; } if(met->time_elapsed_nano_ > par->get_max_time_cutoff()) { - info( - par->verbose_, "time cutoff", met->time_elapsed_nano_, ">", + WARTHOG_GINFO_FMT_IF( + par->verbose_, "time cutoff {} > {}", met->time_elapsed_nano_, par->get_max_time_cutoff()); return false; } @@ -133,9 +167,13 @@ enum class reopen_policy // decide whether to renopen nodes already expanded (when their g-value // can be improved). we handle the positive case via specialisation. -template +template inline bool -reopen() +reopen(); + +template<> +inline bool +reopen() { return false; } @@ -147,6 +185,183 @@ reopen() return true; } +/// The default parameters given in the class for uds traits. +/// Is equivalent to an empty struct in behaviour, as +/// admissibility_criteria::any, feasibility_criteria::until_exhaustion +/// and reopen_policy::no are the default values in uds. +struct uds_default_traits +{ + using node = search_node; + using observer = std::tuple<>; + + static consteval admissibility_criteria + ac() + { + return admissibility_criteria::any; + } + static consteval feasibility_criteria + fc() + { + return feasibility_criteria::until_exhaustion; + } + static consteval reopen_policy + rp() + { + return reopen_policy::no; + } +}; + +/// Modify search behaviour of unidirectional_search. +/// To be passed as template parameters with compile-time values +/// and types. +/// These values are optional and a user-provided struct only require +/// parameter for values that differ to the default. +template< + typename N = uds_default_traits::node, + typename L = uds_default_traits::observer, + admissibility_criteria AC = uds_default_traits::ac(), + feasibility_criteria FC = uds_default_traits::fc(), + reopen_policy RP = uds_default_traits::rp()> +struct uds_traits +{ + using node = N; + using observer = L; + + static consteval admissibility_criteria + ac() + { + return AC; + } + static consteval feasibility_criteria + fc() + { + return FC; + } + static consteval reopen_policy + rp() + { + return RP; + } +}; + +namespace details +{ + +template +struct uds_trait_node +{ + using type = uds_default_traits::node; +}; +template + requires requires { typename Traits::node; } +struct uds_trait_node +{ + using type = typename Traits::node; +}; + +template +struct uds_trait_observer +{ + using type = uds_default_traits::observer; +}; +template + requires requires { typename Traits::observer; } +struct uds_trait_observer +{ + using type = typename Traits::observer; +}; + +} // namespace details + +/// @brief deduce typename node from Traits if exists, or +/// uds_default_traits::node otherwise +template +using uds_trait_node = typename details::uds_trait_node::type; + +/// @brief deduce typename observer from Traits if exists, or +/// uds_default_traits::observer otherwise +template +using uds_trait_observer = typename details::uds_trait_observer::type; + +/// @return admissibility_criteria value Traits::ac() if exists, or +/// uds_default_traits::ac() otherwise +template +consteval admissibility_criteria +uds_trait_ac() noexcept +{ + // ensure user overrides trait correctly + static_assert( + !(requires { + { Traits::ac }; + }) || (requires { + { Traits::ac() } -> util::same_as_rmref; + }), + "optional Traits::ac must be a static consteval function that returns " + "admissibility_criteria."); + + if constexpr(requires { + { + Traits::ac() + } -> util::same_as_rmref; + }) + { + return Traits::ac(); + } + else { return uds_default_traits::ac(); } +} + +/// @return admissibility_criteria value Traits::fc() if exists, or +/// uds_default_traits::fc() otherwise +template +consteval feasibility_criteria +uds_trait_fc() noexcept +{ + // ensure user overrides trait correctly + static_assert( + !(requires { + { Traits::fc }; + }) || (requires { + { Traits::fc() } -> util::same_as_rmref; + }), + "optional Traits::fc must be a static consteval function that returns " + "feasibility_criteria."); + + if constexpr(requires { + { + Traits::fc() + } -> util::same_as_rmref; + }) + { + return Traits::fc(); + } + else { return uds_default_traits::fc(); } +} + +/// @return admissibility_criteria value Traits::rp() if exists, or +/// uds_default_traits::rp() otherwise +template +consteval reopen_policy +uds_trait_rp() noexcept +{ + // ensure user overrides trait correctly + static_assert( + !(requires { + { Traits::rp }; + }) || (requires { + { Traits::rp() } -> util::same_as_rmref; + }), + "optional Traits::rp must be a static consteval function that returns " + "reopen_policy."); + + if constexpr(requires { + { Traits::rp() } -> util::same_as_rmref; + }) + { + return Traits::rp(); + } + else { return uds_default_traits::rp(); } +} + } // namespace warthog::search #endif // WARTHOG_SEARCH_UDS_TRAITS_H diff --git a/include/warthog/search/unidirectional_search.h b/include/warthog/search/unidirectional_search.h index b8fec89..cef10ce 100644 --- a/include/warthog/search/unidirectional_search.h +++ b/include/warthog/search/unidirectional_search.h @@ -10,7 +10,6 @@ // @created: 2021-10-13 // -#include "dummy_listener.h" #include "problem_instance.h" #include "search.h" #include "search_parameters.h" @@ -18,11 +17,9 @@ #include "uds_traits.h" #include #include +#include #include -#include -#include #include -#include #include #include @@ -41,20 +38,29 @@ namespace warthog::search // used determine if a search should continue or terminate. // (default: search for any solution, until OPEN is exhausted) template< - class H, class E, class Q = util::pqueue_min, class L = dummy_listener, - admissibility_criteria AC = admissibility_criteria::any, - feasibility_criteria FC = feasibility_criteria::until_exhaustion, - reopen_policy RP = reopen_policy::no> + typename H, typename E, typename Q, typename Traits = uds_default_traits> class unidirectional_search { public: + using traits = Traits; + using search_node = uds_trait_node; + using L = uds_trait_observer; + + static constexpr admissibility_criteria AC = uds_trait_ac(); + static constexpr feasibility_criteria FC = uds_trait_fc(); + static constexpr reopen_policy RP = uds_trait_rp(); + unidirectional_search( - H* heuristic, E* expander, Q* queue, L* listener = nullptr) + H* heuristic, E* expander, Q* queue, L listeners = L{}) : heuristic_(heuristic), expander_(expander), open_(queue), - listener_(listener) + listeners_(listeners) { } + unidirectional_search(const unidirectional_search& other) = delete; + ~unidirectional_search() = default; - ~unidirectional_search() { } + unidirectional_search& + operator=(const unidirectional_search& other) + = delete; void get_pathcost(problem_instance* pi, search_parameters* par, solution* sol) @@ -96,27 +102,12 @@ class unidirectional_search sol->s_node_->get_id(), spi->target_, &sol->path_); heuristic_->h(&hv); } - - DO_ON_DEBUG_IF(spi->verbose_) - { - for(auto& node_id : sol->path_) - { - int32_t x, y; - expander_->get_xy(node_id, x, y); - std::cerr << "final path: (" << x << ", " << y << ")..."; - search_node* n - = expander_->generate(expander_->unget_state(node_id)); - assert(n->get_search_number() == spi->instance_id_); - n->print(std::cerr); - std::cerr << std::endl; - } - } } - void - set_listener(L* listener) + L& + get_listeners() noexcept { - listener_ = listener; + return listeners_; } E* @@ -151,15 +142,7 @@ class unidirectional_search H* heuristic_; E* expander_; Q* open_; - L* listener_; - - // no copy ctor - unidirectional_search(const unidirectional_search& other) { } - unidirectional_search& - operator=(const unidirectional_search& other) - { - return *this; - } + [[no_unique_address]] L listeners_; /** * Initialise a new 'search_node' for the ongoing search given the parent @@ -199,8 +182,8 @@ class unidirectional_search if(n->get_ub() < sol->met_.ub_) { sol->met_.ub_ = n->get_ub(); - debug( - pi->verbose_, "NEW UB:", "Incumbent Cost", + WARTHOG_GDEBUG_FMT_IF( + pi->verbose_, "NEW UB: Incumbent Cost {}", sol->sum_of_edge_costs_); } } @@ -212,6 +195,9 @@ class unidirectional_search mytimer.start(); open_->clear(); + io::observer_begin_search( + listeners_, static_cast(pi->instance_id_), *pi); + // initialise the start node and push to OPEN { if(pi->start_ == pad_id::max()) { return; } @@ -223,9 +209,10 @@ class unidirectional_search initialise_node_(start, pad_id::max(), 0, pi, par, sol); open_->push(start); - listener_->generate_node(0, start, 0, UINT32_MAX); - user(pi->verbose_, pi); - trace(pi->verbose_, "Start node:", *start); + io::observer_generate_node( + listeners_, nullptr, *start, 0, UINT32_MAX); + WARTHOG_GINFO_FMT_IF(pi->verbose_, "{}", *pi); + WARTHOG_GINFO_FMT_IF(pi->verbose_, "Start node: {}", *start); update_ub(start, sol, pi); } @@ -247,8 +234,8 @@ class unidirectional_search current->set_expanded(true); // NB: set before generating succ sol->met_.nodes_expanded_++; sol->met_.lb_ = current->get_f(); - listener_->expand_node(current); - trace(pi->verbose_, "Expanding:", *current); + io::observer_expand_node(listeners_, *current); + WARTHOG_GINFO_FMT_IF(pi->verbose_, "Expanding: {}", *current); // Generate successors of the current node search_node* n = nullptr; @@ -258,7 +245,6 @@ class unidirectional_search expander_->get_successor(i, n, cost_to_n); sol->met_.nodes_generated_++; cost_t gval = current->get_g() + cost_to_n; - listener_->generate_node(current, n, gval, i); // Generate new search nodes, provided they're not // dominated by the current upperbound @@ -268,8 +254,10 @@ class unidirectional_search if(n->get_f() < sol->sum_of_edge_costs_) { open_->push(n); - trace(pi->verbose_, "Generate:", *n); + WARTHOG_GINFO_FMT_IF(pi->verbose_, "Generate: {}", *n); update_ub(current, sol, pi); + io::observer_generate_node( + listeners_, current, *n, gval, i); continue; } } @@ -278,16 +266,22 @@ class unidirectional_search // for the node is less than the current upperbound if(gval < n->get_g()) { - if((gval + n->get_f() - n->get_g()) + if((gval + (n->get_f() - n->get_g())) < sol->sum_of_edge_costs_) { + // if target node, update solution cost + if(sol->s_node_ == n) + { + sol->sum_of_edge_costs_ = gval; + } n->relax(gval, current->get_id()); - listener_->relax_node(n); + io::observer_relax_node(listeners_, *n); if(open_->contains(n)) { open_->decrease_key(n); - trace(pi->verbose_, "Updating;", *n); + WARTHOG_GINFO_FMT_IF( + pi->verbose_, "Updating: {}", *n); update_ub(current, sol, pi); continue; } @@ -295,42 +289,42 @@ class unidirectional_search if(reopen()) { open_->push(n); - trace(pi->verbose_, "Reopen;", *n); + WARTHOG_GINFO_FMT_IF( + pi->verbose_, "Reopen: {}", *n); update_ub(current, sol, pi); sol->met_.nodes_reopen_++; continue; } } } - trace(pi->verbose_, "Dominated;", *n); + WARTHOG_GINFO_FMT_IF(pi->verbose_, "Dominated: {}", *n); } if constexpr(FC == feasibility_criteria::until_cutoff) { // patched until AC FC RP reworked sol->met_.time_elapsed_nano_ = mytimer.elapsed_time_nano(); } + io::observer_close_node(listeners_, *current); + WARTHOG_GINFO_FMT_IF(pi->verbose_, "Expanded: {}", *current); } sol->met_.time_elapsed_nano_ = mytimer.elapsed_time_nano(); sol->met_.nodes_surplus_ = open_->size(); sol->met_.heap_ops_ = open_->get_heap_ops(); - DO_ON_DEBUG_IF(pi->verbose_) - { - if(sol->sum_of_edge_costs_ == warthog::COST_MAX) - { - warning(pi->verbose_, "Search failed; no solution exists."); - } - else { user(pi->verbose_, "Solution found", *sol->s_node_); } - } + WARTHOG_GINFO_IF( + pi->verbose_ && sol->sum_of_edge_costs_ == warthog::COST_MAX, + "Search failed; no solution exists."); } }; -template< - class H, class E, class Q = util::pqueue_min, class L = dummy_listener> -unidirectional_search( - H* heuristic, E* expander, Q* queue, - L* listener = nullptr) -> unidirectional_search; +template +unidirectional_search(H* heuristic, E* expander, Q* queue) + -> unidirectional_search; + +template +unidirectional_search(H* heuristic, E* expander, Q* queue, L listeners) + -> unidirectional_search>; } // namespace warthog::search diff --git a/include/warthog/util/file_utils.h b/include/warthog/util/file_utils.h deleted file mode 100644 index dbf17a8..0000000 --- a/include/warthog/util/file_utils.h +++ /dev/null @@ -1,113 +0,0 @@ -/* - * file_utils.h - * - * Created on: Oct 1, 2018 - * Author: koldar - */ - -#ifndef WARTHOG_UTIL_FILE_UTILS_H -#define WARTHOG_UTIL_FILE_UTILS_H - -#include - -namespace warthog::util -{ - -/** - * @brief get the number of bytes the file occipies on the filesyste, - * - * @param name the name fo the file to aqnalyze - * @return size_t number of bytes @c name occupies - */ -[[deprecated("Move to std::filesystem")]] -size_t -getBytesOfFile(const std::string& name); - -/** - * Check if a file exists - * - * @param[in] name the filename to check - * @return - * @li true fi the file exists; - * @li false otherwise; - */ -[[deprecated("Move to std::filesystem")]] -bool -isFileExists(const std::string& name); - -/** - * Get the basename of a file given its absolute path - * - * @pre - * @li filepath is an absolute path (like the one returneed by __FILE__); - * - * @param[in] filepath the absolute path to handle - * @return a pointer in @c filepath where the basename of the file starts - */ -consteval const char* -getBaseName_(const char* filepath) -{ - if(filepath == nullptr) return nullptr; - const char* name_start = filepath; - for(const char* p = filepath; *p != '\0'; ++p) - { - if(*p == '/' || *p == '\\') name_start = p + 1; - } - return name_start; -} - -/** - * Get the basename of a file given its absolute path - * - * @pre - * @li filepath is an absolute path (like the one returneed by __FILE__); - * - * @param[in] filepath the absolute path to handle - * @return a pointer in @c filepath where the basename of the file starts - */ -[[deprecated("Move to std::filesystem")]] -const char* -getBaseName(const char* filepath); - -/** - * @brief Get the basename of a file given its path - * - * @pre - * @li filepath does not end with "/" - * - * @param filepath the path to handle - * @return const char* a pointer of the given path - */ -[[deprecated("Move to std::filesystem")]] -const char* -getBaseName(const std::string& filepath); - -/** - * @brief Get the basename of a file given its path - * - * @pre - * @li filepath does not end with "/" - * - * @param filepath the path to handle - * @return a copy of the basename path - */ -[[deprecated("Move to std::filesystem")]] -std::string -getBaseNameAsString(const std::string& filepath); - -/** - * @brief Get the basename of a file given its path - * - * @pre - * @li filepath does not end with "/" - * - * @param filepath the path to handle - * @return a copy of the basename path - */ -[[deprecated("Move to std::filesystem")]] -std::string -getBaseNameAsString(const char* filepath); - -} // namespace warthog::util - -#endif // WARTHOG_UTIL_FILE_UTILS_H diff --git a/include/warthog/util/gm_parser.h b/include/warthog/util/gm_parser.h deleted file mode 100644 index f96207b..0000000 --- a/include/warthog/util/gm_parser.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef WARTHOG_UTIL_GM_PARSER_H -#define WARTHOG_UTIL_GM_PARSER_H - -// gm_parser.h -// -// A parser for gridmap files written in Nathan Sturtevant's HOG format. -// -// @author: dharabor -// @created: 08/08/2012 -// - -#include -#include -#include -#include - -namespace warthog::util -{ - -class gm_header -{ -public: - gm_header(unsigned int height, unsigned int width, const char* type) - : height_(height), width_(width), type_(type) - { } - - gm_header() : height_(0), width_(0), type_("") { } - - gm_header(const gm_header& other) { (*this) = other; } - - virtual ~gm_header() { } - - gm_header& - operator=(const gm_header& other) - { - this->height_ = other.height_; - this->width_ = other.width_; - this->type_ = other.type_; - return *this; - } - - unsigned int height_; - unsigned int width_; - std::string type_; -}; - -class gm_parser -{ -public: - gm_parser(const char* filename); - ~gm_parser(); - - inline gm_header - get_header() - { - return this->header_; - } - - inline size_t - get_num_tiles() - { - return this->map_.size(); - } - - inline unsigned char - get_tile_at(unsigned int index) - { - if(index >= this->map_.size()) - { - std::cerr << "err; gm_parser::get_tile_at " - "invalid index " - << index << std::endl; - exit(1); - } - return this->map_.at(index); - } - -private: - gm_parser(const gm_parser&) { } - gm_parser& - operator=(const gm_parser&) - { - return *this; - } - - void - parse_header(std::fstream&); - void - parse_map(std::fstream&); - - std::vector map_; - gm_header header_; -}; - -} // namespace warthog::util - -#endif // WARTHOG_UTIL_GM_PARSER_H diff --git a/include/warthog/util/helpers.h b/include/warthog/util/helpers.h index 60b9349..24cfc00 100644 --- a/include/warthog/util/helpers.h +++ b/include/warthog/util/helpers.h @@ -47,36 +47,6 @@ load_integer_labels_dimacs( void value_index_swap_array(std::vector& vec); -struct thread_params -{ - // thread data - uint32_t thread_id_; - uint32_t max_threads_; - bool thread_finished_; - void* (*fn_worker_)(void*); - - // task data - uint32_t nprocessed_; - uint32_t first_id_; - uint32_t last_id_; - void* shared_; -}; - -// helper code for simple parallel computations. -// simple in this case means no synchronisation between threads. -// @param fn_worker: the actual precompute function: -// - it takes as input a pointer whose actual type is -// warthog::label::thread_params -// - it returns a (possibly null) pointer to a result -// @param shared_data: -// a pointer to data which will be shared among all worker -// threads -// @param task_total: the total number of tasks in the workload -// @return: 0 (the function always succeeds) -void* -parallel_compute( - void* (*fn_worker)(void*), void* shared_data, uint32_t task_total); - } // namespace warthog::util #endif // WARTHOG_UTIL_HELPERS_H diff --git a/include/warthog/util/intrin.h b/include/warthog/util/intrin.h index 010a6c9..ddd8a8b 100644 --- a/include/warthog/util/intrin.h +++ b/include/warthog/util/intrin.h @@ -14,6 +14,8 @@ // Check // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html +#include + #if defined(__x86_64__) && __has_include() #include #define WARTHOG_INTRIN diff --git a/include/warthog/util/log.h b/include/warthog/util/log.h deleted file mode 100644 index 90dfcae..0000000 --- a/include/warthog/util/log.h +++ /dev/null @@ -1,237 +0,0 @@ -/** - * @file - * - * Simple log utility. Can work both on preprocessor time or at compile time - * - * All this function works only if: - * @li the macro @c DEBUG is active OR; - * @li the macro @c NDEBUG is not active; - * - * Otherwise, they will become just empty (or can be easily optimized away) - * - * @date Oct 1, 2018 - * @author Massimo Bono - */ - -#ifndef WARTHOG_UTIL_LOG_H -#define WARTHOG_UTIL_LOG_H - -#include "file_utils.h" -#include "macros.h" -#include -#include - -#ifndef QUICK_LOG -#define QUICK_LOG 0 -#endif - -#if QUICK_LOG <= 0 -/** - * always log an entry via std cio - * - * Does no impact performances whatsoever - * - * @code - * debug("hello", person->name, "!"); - * @endcode - * - * @param[in] ... the entries to put on stream - */ -#define debug(p, ...) _abstractLog("DEBUG", p, __VA_ARGS__) -#else -#define debug(...) {}; -#endif - -#if QUICK_LOG <= 1 -/** - * always log an entry via std cio - * - * Does no impact performances whatsoever - * - * @code - * debug("hello", person->name, "!"); - * @endcode - * - * @param[in] ... the entries to put on stream - */ -#define trace(p, ...) _abstractLog("TRACE", p, __VA_ARGS__) -#else -#define trace(...) {}; -#endif - -#if QUICK_LOG <= 4 -/** - * always log an entry via std cio - * - * Does no impact performances whatsoever - * - * @code - * debug("hello", person->name, "!"); - * @endcode - * - * @param[in] ... the entries to put on stream - */ -#define info(p, ...) _abstractLog("INFO ", p, __VA_ARGS__) -#else -#define info(...) {}; -#endif - -#if QUICK_LOG <= 5 -/** - * always log an entry via std cio - * - * Does no impact performances whatsoever - * - * @code - * debug("hello", person->name, "!"); - * @endcode - * - * @param[in] ... the entries to put on stream - */ -#define user(p, ...) _abstractLog("USER ", p, __VA_ARGS__) -#else -#define user(...) {}; -#endif - -#if QUICK_LOG <= 6 -/** - * always log an entry via std cio - * - * Does no impact performances whatsoever - * - * @code - * debug("hello", person->name, "!"); - * @endcode - * - * @param[in] ... the entries to put on stream - */ -#define warning(p, ...) _abstractLog("WARN ", p, __VA_ARGS__) -#else -#define warning(...) {}; -#endif - -#if QUICK_LOG <= 7 -/** - * always log an entry via std cio - * - * Does no impact performances whatsoever - * - * @code - * debug("hello", person->name, "!"); - * @endcode - * - * @param[in] ... the entries to put on stream - */ -#define error(...) _abstractLog("ERROR", true, __VA_ARGS__) -#else -#define error(...) {}; -#endif - -#if QUICK_LOG <= 8 -/** - * always log an entry via std cio - * - * Does no impact performances whatsoever - * - * @code - * debug("hello", person->name, "!"); - * @endcode - * - * @param[in] ... the entries to put on stream - */ -#define critical(...) _abstractLog("CRTCL", true, __VA_ARGS__) -#else -#define critical(...) {}; -#endif - -/** - * like ::log but will log only if at runtime the @c expr will evaluate to true - * - * Will impact performances (even if by little) even if the log is turned off - * - * @code - * clog(true)("hello ", this->name); - * @endcode - * - * @param[in] expr the expression to be evaluated - * @param[in] ... input for ::log - */ -#define clog(expr) _clog1(expr) - -#define _clog1(expr) \ - if(expr) \ - { \ - _clog2 -#define _clog2(...) \ - debug(__VA_ARGS__); \ - } - -/** - * Condition Statement Log utility allows to perform some previous statement - * before logging - * - * This logging macro is useful when your logging needs some local variable - * - * @code - * cslog(true)(int a = 5)("a is %d", a); - * @endcode - * - * @param[in] expr the condition to check if the log is enabled - */ -#define cslog(expr) _cslog1(expr) -#define _cslog1(expr) \ - if(expr) \ - { \ - _cslog2 -#define _cslog2(...) \ - __VA_ARGS__; \ - _cslog3 -#define _cslog3(...) \ - debug(__VA_ARGS__); \ - } - -#define _LOG_OP(context, index, x) x -#define _LOG_COMB(context, x, y) x << " " << y - -#define _debug(...) FOR_EACH(, _LOG_OP, _LOG_COMB, __VA_ARGS__) - -#if defined(DEBUG) || !defined(NDEBUG) -/** - * Perform some work if debug has been enabled - * - * - */ -#define DO_ON_DEBUG_IF(expr) if(expr) -#define DO_ON_DEBUG if(true) - -/** - * always log an entry via std cio - * - * Does no impact performances whatsoever - * - * @code - * debug("hello", person->name, "!"); - * @endcode - * - * @param[in] level the name of the log level - * @param[in] ... the entries to put on stream - */ -#define _abstractLog(level, p, ...) \ - { \ - constexpr auto src = std::source_location::current(); \ - if(p) \ - std::cerr << "[" << level << "] " \ - << warthog::util::getBaseName_(src.file_name()) << "@" \ - << __func__ << ":" << src.line() << " " \ - << _debug(__VA_ARGS__) << std::endl; \ - } - -#else - -#define DO_ON_DEBUG_IF(expr) if(false) -#define DO_ON_DEBUG if(false) -#define _abstractLog(level, ...) {}; - -#endif - -#endif // WARTHOG_UTIL_LOG_H diff --git a/include/warthog/util/macros.h b/include/warthog/util/macros.h deleted file mode 100644 index d2ef7a4..0000000 --- a/include/warthog/util/macros.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * macros.h - * - * Created on: Oct 1, 2018 - * Author: koldar - */ - -#ifndef WARTHOG_UTIL_MACROS_H -#define WARTHOG_UTIL_MACROS_H - -#define CAT(x, y) x##y - -#define PASTE(x, y) CAT(x, y) - -/** - * Count the arguments in a variadic macro - * - * @code - * COUNT_ARGS(a) //1 - * COUNT_ARGS(a,b) //2 - * @endcode - * - * @param[in] ... params to count - */ -#define COUNT_ARGS(...) _COUNT_ARGS(__VA_ARGS__, _PP_RSEQ_N()) -#define _COUNT_ARGS(...) _PP_ARG_N(__VA_ARGS__) -#define _PP_ARG_N( \ - _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, \ - _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \ - _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, \ - _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, \ - _59, _60, _61, _62, _63, N, ...) \ - N - -#define _PP_RSEQ_N() \ - 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, \ - 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, \ - 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, \ - 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 - -/** - * Execute an operation for each element of a list - * - * Here's an example - * @code - * #define OPERATION_SUM_MAP(context, index, x) (x*x) - * #define OPERATION_SUM_COMBINE(context, x, y) x + y - * - * FOR_EACH(,OPERATION_SUM_MAP, OPERATION_MAP_COMBINE, 1, 2, 3, 4); - * //outputs (1*1)+(2*2)+(3*3)+(4*4) - * @endcode - * - * @attention - * empty variadic is not support - * - * @param[in] CONTEXT a macro that will be available to both the mapping macro - * and the combine macro - * @param[in] OP a macro telling us what we need to do with a single value in - * the variadic - * @param[in] COMB a macro telling us how to combine 2 values previously - * generated by OP macro - */ -#define FOR_EACH(CONTEXT, OP, COMB, ...) \ - PASTE(_FOR_EACH_, COUNT_ARGS(__VA_ARGS__))(CONTEXT, OP, COMB, __VA_ARGS__) - -#define _FOR_EACH_1(CONTEXT, OP, COMB, x) OP(CONTEXT, 1, x) -#define _FOR_EACH_2(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 2, x), \ - _FOR_EACH_1(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_3(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 3, x), \ - _FOR_EACH_2(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_4(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 4, x), \ - _FOR_EACH_3(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_5(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 5, x), \ - _FOR_EACH_4(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_6(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 6, x), \ - _FOR_EACH_5(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_7(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 7, x), \ - _FOR_EACH_6(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_8(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 8, x), \ - _FOR_EACH_7(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_9(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 9, x), \ - _FOR_EACH_8(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_10(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 10, x), \ - _FOR_EACH_9(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_11(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 11, x), \ - _FOR_EACH_10(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_12(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 12, x), \ - _FOR_EACH_11(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_13(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 13, x), \ - _FOR_EACH_12(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_14(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 14, x), \ - _FOR_EACH_13(CONTEXT, OP, COMB, __VA_ARGS__)) -#define _FOR_EACH_15(CONTEXT, OP, COMB, x, ...) \ - COMB( \ - CONTEXT, OP(CONTEXT, 15, x), \ - _FOR_EACH_14(CONTEXT, OP, COMB, __VA_ARGS__)) - -/** - * @attention - * empty variadic is not support - * - * @return the first item of a variadic sequence - */ -#define FIRST_ELEMENT(x, ...) x - -/** - * Executive the statements only if the pointer is not NULL - * - * @code - * int* a = ... - * DO_IF_NOT_NULL(a) { - * std::cout << " a is " << *a << std::endl; - * } - * @endcode - * - * @param[in] x the pointer to check - */ -#define DO_IF_NOT_NULL(x) if(x != nullptr) - -#endif // WARTHOG_UTIL_MACROS_H diff --git a/include/warthog/util/pqueue.h b/include/warthog/util/pqueue.h index 3e65f79..1e96040 100644 --- a/include/warthog/util/pqueue.h +++ b/include/warthog/util/pqueue.h @@ -221,12 +221,13 @@ class pqueue newsize = newsize >= 4 ? newsize : 4; if(newsize < queuesize_) { - std::cerr << "err; pqueue::resize newsize < queuesize " - << std::endl; - exit(1); + WARTHOG_GCRIT_FMT( + "pqueue::resize newsize({}) < queuesize({})", newsize, + queuesize_); + throw std::logic_error("newsize < queuesize_"); } - search::search_node** tmp = new search::search_node* [newsize] {}; + search::search_node** tmp = new search::search_node* [newsize] { }; for(unsigned int i = 0; i < queuesize_; i++) { tmp[i] = elts_[i]; diff --git a/include/warthog/util/scenario_manager.h b/include/warthog/util/scenario_manager.h deleted file mode 100644 index 33ba408..0000000 --- a/include/warthog/util/scenario_manager.h +++ /dev/null @@ -1,105 +0,0 @@ -#ifndef WARTHOG_UTIL_SCENARIO_MANAGER_H -#define WARTHOG_UTIL_SCENARIO_MANAGER_H - -// scenario_manager.h -// -// Read and generate/write scenario files -// -// Supported formats for read: -// - GPPC 1.0 format (as at 2012 Grid-based Path Planning Competition) -// (fields: bucket,map,mapwidth,mapheight,sx,sy,gx,gy,distance) -// - DIMACS format (as at the 9th DIMACS Implementation Challenge) -// (fields: q [source-id] [target-id]) -// -// Supported formats for generate/write: -// - GPPC 1.0 format (as at 2012 Grid-based Path Planning Competition) -// -// @author: dharabor -// @created: 21/08/2012 -// - -#include "experiment.h" -#include -#include -#include - -#include -#include -#include -#include - -namespace warthog::util -{ - -class scenario_manager -{ -public: - scenario_manager(); - ~scenario_manager(); - - experiment* - get_experiment(unsigned int which) - { - if(which < experiments_.size()) { return experiments_[which]; } - return 0; - } - const experiment* - get_experiment(unsigned int which) const - { - if(which < experiments_.size()) { return experiments_[which]; } - return 0; - } - - void - add_experiment(experiment* newexp) - { - experiments_.push_back(newexp); - } - - uint32_t - num_experiments() const noexcept - { - return (uint32_t)experiments_.size(); - } - - size_t - mem() const noexcept - { - return sizeof(*this) + sizeof(experiment) * experiments_.size(); - } - - const std::string& - last_file_loaded() noexcept - { - return sfile_; - } - void - clear() - { - experiments_.clear(); - } - - void - generate_experiments(domain::gridmap*, int num); - void - load_scenario(const char* filelocation); - void - write_scenario(std::ostream& out); - void - sort(); // organise by increasing solution length - -private: - void - load_gppc_scenario(std::ifstream& infile); - - std::vector experiments_; - std::string sfile_; -}; - -std::filesystem::path -find_map_filename( - const scenario_manager& scenmgr, std::filesystem::path sfilename = {}); - -} // namespace warthog::util - -#endif // WARTHOG_UTIL_SCENARIO_MANAGER_H diff --git a/include/warthog/util/string.h b/include/warthog/util/string.h new file mode 100644 index 0000000..2419e4d --- /dev/null +++ b/include/warthog/util/string.h @@ -0,0 +1,505 @@ +#ifndef WARTHOG_UTIL_STRING_H +#define WARTHOG_UTIL_STRING_H + +// template.h +// +// Utility string functions. +// Includes handling of space and conversion of string to other values, +// mainly int/double. +// +// @author: Ryan Hechenberger +// @created: 2026-04-14 +// + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace warthog::util +{ + +/// @brief remove white spaces (as std::isspace) from beginning of string_view +inline std::string_view +ltrim(std::string_view str) +{ + str.remove_prefix( + std::find_if( + str.begin(), str.end(), + [](char c) { return !isspace((unsigned char)c); }) + - str.begin()); + return str; +} + +/// @brief remove white spaces (as std::isspace) from end of string_view +inline std::string_view +rtrim(std::string_view str) +{ + str.remove_suffix( + std::find_if( + str.rbegin(), str.rend(), + [](char c) { return !isspace((unsigned char)c); }) + - str.rbegin()); + return str; +} + +/// @brief string_view is either empty or only contains spaces (as +/// std::isspace) +inline bool +is_blank(std::string_view str) +{ + return std::all_of(str.begin(), str.end(), [](char c) { + return isspace((unsigned char)c); + }); +} + +struct token_return +{ + std::string_view token; ///< token extracted + size_t trim; ///< amount of space discarded from front of string +}; + +inline token_return +get_token(std::string_view str) +{ + auto fstr = ltrim(str); + if(fstr.empty()) { return {std::string_view(), str.size()}; } + auto endsp = std::find_if( + fstr.begin(), fstr.end(), + [](char c) { return isspace((unsigned char)c); }) + - fstr.begin(); + token_return ret; + ret.token = fstr.substr(0, endsp); + ret.trim = str.size() - fstr.size(); + return ret; +} + +inline token_return +get_token_quoted(std::string_view str, char quote = '"', char escape = '\\') +{ + if(quote == escape) { return {std::string_view(), 0}; } + auto fstr = ltrim(str); + if(fstr.empty()) { return {std::string_view(), str.size()}; } + token_return ret; + ret.trim = str.size() - fstr.size(); + if(fstr[0] == quote) + { + // quoted + size_t len = 0; + while(true) + { + len = fstr.find(quote, len + 1); + if(len == std::string_view::npos) + { + // no quote close + return {std::string_view(), ret.trim}; + } + auto epos = fstr.find_last_not_of(escape, len - 1) - len; + if((epos & 1) != 0) + { + // not delimited, return + ret.token = fstr.substr(0, len + 1); + break; + } + // delimited, continue + } + } + else + { + // no delimiter, read as normal + auto endsp = std::find_if( + fstr.begin(), fstr.end(), + [](char c) { return isspace((unsigned char)c); }) + - fstr.begin(); + ret.token = fstr.substr(0, endsp); + } + return ret; +} + +inline std::errc +parse_token(std::string_view token, std::integral auto& out, int base = 10) +{ + const char* const f = token.data(); + const char* const ed = token.data() + token.size(); + auto res = std::from_chars(token.data(), ed, out, base); + if(res.ec != std::errc{}) return res.ec; + // value set + if(res.ptr != ed) { return std::errc::invalid_argument; } + return std::errc{}; +} +inline std::errc +parse_token( + std::string_view token, std::floating_point auto& out, + std::chars_format fmt = std::chars_format::general) +{ + const char* const ed = token.data() + token.size(); + auto res = std::from_chars(token.data(), ed, out, fmt); + if(res.ec != std::errc{}) return res.ec; + // value set + if(res.ptr != ed) { return std::errc::invalid_argument; } + return std::errc{}; +} + +inline std::pair +parse_token_part( + std::string_view token, std::integral auto& out, int base = 10) +{ + std::from_chars_result res = std::from_chars( + token.data(), token.data() + token.size(), out, base); + if(res.ec != std::errc{}) return {{}, res.ec}; + // value set + token.remove_prefix(res.ptr - token.data()); + return {token, {}}; +} +inline std::pair +parse_token_part( + std::string_view token, std::floating_point auto& out, + std::chars_format fmt = std::chars_format::general) +{ + std::from_chars_result res + = std::from_chars(token.data(), token.data() + token.size(), out, fmt); + if(res.ec != std::errc{}) return {{}, res.ec}; + // value set + token.remove_prefix(res.ptr - token.data()); + return {token, {}}; +} + +inline std::pair +parse_token_quoted( + std::string_view token, char* buffer, size_t size, char quote = '"', + char escape = '\\') +{ + if(quote == escape) { return {nullptr, std::errc::invalid_argument}; } + if(token.empty() || size == 0) + { + return {nullptr, std::errc::invalid_argument}; + } + const char* const ed = token.end() + token.size(); + if(token[0] != '"') + { + // not quoted, take as whole token + if(std::any_of(token.data(), ed, [](char c) { + return std::isspace((unsigned char)c); + })) + { + // space detected, error + return {nullptr, std::errc::invalid_argument}; + } + if(token.size() + 1 > size) + { + // too large to hold token + return {nullptr, std::errc::value_too_large}; + } + token.copy(buffer, token.size()); + buffer[token.size()] = '\0'; + return {buffer + token.size() + 1, {}}; + } + // quoted text, process + const char* t_at = token.data() + 1; + while(true) + { + assert(size > 0); + if(t_at >= ed) + { + // reached end of token with no end-quote + return {buffer, std::errc::invalid_argument}; + } + if(*t_at == '\\') [[unlikely]] + { + if(++t_at >= ed) + { + // unexpected end of string + return {buffer, std::errc::invalid_argument}; + } + } + else if(*t_at == '"') [[unlikely]] + { + // found end quote, append null-terminator + *(buffer++) = '\0'; + // check is end of token + return { + buffer, + t_at + 1 == ed ? std::errc{} : std::errc::invalid_argument}; + } + *(buffer++) = *(t_at++); + if(--size == 0) + { + // out of space for null-terminator + return {buffer, std::errc::value_too_large}; + } + } +} +inline std::errc +parse_token_quoted( + std::string_view token, auto& str_out, char quote = '"', + char escape = '\\') +{ + str_out.resize(token.size() + 1); // plus 1 to hold \0 placed in buffer + auto [ed, ec] = parse_token_quoted( + token, str_out.data(), str_out.size(), quote, escape); + if(ec != std::errc{}) + { + // failed to read, clear str_out and return error code + str_out.resize(0); + return ec; + } + else + { + // successor, adjust str_out length and return + assert(ed - str_out.data() > 0); + str_out.resize((ed - str_out.data()) - 1); + return std::errc{}; + } +} + +class string_parser +{ +public: + string_parser(); + string_parser(std::string_view str) : m_str(str) { } + // error codes + void + clear_error() noexcept + { + m_error = std::errc{}; + } + std::errc + error() const noexcept + { + return m_error; + } + bool + is_error() const noexcept + { + return m_error != std::errc{}; + } + operator bool() const noexcept { return m_error == std::errc{}; } + + // set string + std::string_view + str() const noexcept + { + return m_str; + } + void + str(std::string_view s) noexcept + { + m_str = s; + m_token = std::string_view{}; + clear_error(); + } + + std::string_view + last_token() const noexcept + { + return m_token; + } + + string_parser& + next(std::integral auto& int_out, int base = 10) + { + if(is_error()) // do nothing if in error state + return *this; + if(!next_token_()) return *this; + std::errc ec = util::parse_token(m_token, int_out, base); + if(ec != std::errc{}) m_error = ec; + return *this; + } + string_parser& + next( + std::floating_point auto& float_out, + std::chars_format fmt = std::chars_format::general) + { + if(is_error()) // do nothing if in error state + return *this; + if(!next_token_()) return *this; + std::errc ec = util::parse_token(m_token, float_out, fmt); + if(ec != std::errc{}) m_error = ec; + return *this; + } + string_parser& + next(std::span& buffer) + { + if(is_error()) // do nothing if in error state + return *this; + if(buffer.empty()) + { + m_error = std::errc::invalid_argument; + return *this; + } + if(!next_token_()) return *this; + if(m_token.size() > buffer.size()) + { + m_error = std::errc::value_too_large; + return *this; + } + m_token.copy(buffer.data(), m_token.size()); + buffer = buffer.subspan(0, m_token.size()); + return *this; + } + string_parser& + next(std::string_view& out_token) + { + if(is_error()) // do nothing if in error state + return *this; + if(!next_token_()) return *this; + out_token = m_token; + return *this; + } + string_parser& + next(std::string& out_token) + { + if(is_error()) // do nothing if in error state + return *this; + if(!next_token_()) return *this; + out_token = m_token; + return *this; + } + string_parser& + next(std::pmr::string& out_token) + { + if(is_error()) // do nothing if in error state + return *this; + if(!next_token_()) return *this; + out_token = m_token; + return *this; + } + + string_parser& + next_q(std::span& buffer, char quote = '"', char escape = '\\') + { + if(is_error()) // do nothing if in error state + return *this; + if(buffer.empty()) + { + m_error = std::errc::invalid_argument; + return *this; + } + if(!next_token_quoted_(quote, escape)) return *this; + auto [ed, ec] = util::parse_token_quoted( + m_token, buffer.data(), buffer.size(), quote, escape); + if(ec != std::errc{}) + { + m_error = ec; + return *this; + } + if(ed == buffer.data()) + { + assert(false); // should never occur + m_error = std::errc::state_not_recoverable; + return *this; + } + buffer = buffer.subspan(0, (ed - buffer.data()) - 1); + return *this; + } + string_parser& + next_q(std::string& out_token, char quote = '"', char escape = '\\') + { + if(is_error()) // do nothing if in error state + return *this; + if(!next_token_quoted_(quote, escape)) return *this; + std::errc ec + = util::parse_token_quoted(m_token, out_token, quote, escape); + if(ec != std::errc{}) + { + m_error = ec; + return *this; + } + return *this; + } + string_parser& + next_q(std::pmr::string& out_token, char quote = '"', char escape = '\\') + { + if(is_error()) // do nothing if in error state + return *this; + if(!next_token_quoted_(quote, escape)) return *this; + std::errc ec + = util::parse_token_quoted(m_token, out_token, quote, escape); + if(ec != std::errc{}) + { + m_error = ec; + return *this; + } + return *this; + } + string_parser& + ignore() + { + if(is_error()) // do nothing if in error state + return *this; + next_token_(); + return *this; + } + string_parser& + ignore_q(char quote = '"', char escape = '\\') + { + if(is_error()) // do nothing if in error state + return *this; + next_token_quoted_(quote, escape); + return *this; + } + + bool + eof() + { + if(is_error()) return false; + if(!util::is_blank(m_str)) + { + m_error = std::errc::invalid_argument; + return false; + } + return true; + } + +protected: + bool + next_token_() + { + auto ret = util::get_token(m_str); + if(ret.token.empty()) + { + // failed to read a token, error + m_error = std::errc::invalid_argument; + return false; + } + else + { + m_token = ret.token; + assert(ret.trim <= m_str.size()); + m_str.remove_prefix(ret.token.size() + ret.trim); + return true; + } + } + bool + next_token_quoted_(char quote, char escape) + { + auto ret = util::get_token_quoted(m_str, quote, escape); + if(ret.token.empty()) + { + // failed to read a token, error + m_error = std::errc::invalid_argument; + return false; + } + else + { + m_token = ret.token; + assert(ret.trim <= m_str.size()); + m_str.remove_prefix(ret.token.size() + ret.trim); + return true; + } + } + +protected: + std::string_view m_str; + std::string_view m_token; + std::errc m_error = std::errc{}; +}; + +} // namespace warthog::util + +#endif // WARTHOG_UTIL_STRING_H diff --git a/include/warthog/util/template.h b/include/warthog/util/template.h index ce94e3d..9562db2 100644 --- a/include/warthog/util/template.h +++ b/include/warthog/util/template.h @@ -14,6 +14,7 @@ namespace warthog::util { +// implementation details, user function after namespace namespace details { @@ -108,6 +109,13 @@ choose_integer_sequence(auto value, TemplateFunc&& tfunc) value, std::forward(tfunc)); } +template +concept same_as_rmref + = std::same_as, std::remove_reference_t>; +template +concept same_as_rmcvref + = std::same_as, std::remove_cvref_t>; + } // namespace warthog::util #endif // WARTHOG_UTIL_CAST_H diff --git a/include/warthog/util/timer.h b/include/warthog/util/timer.h index 6b3337a..47f21cb 100644 --- a/include/warthog/util/timer.h +++ b/include/warthog/util/timer.h @@ -45,18 +45,6 @@ class timer } clock::time_point get_time(); - // std::chrono::nanoseconds - // get_time_nano(); - // double - // get_time_micro() - // { - // return get_time_nano().count() * 1e-3; - // } - // double - // get_time_sec() - // { - // return get_time_nano().count() * 1e-9; - // } private: clock::time_point start_time; diff --git a/include/warthog/util/vec_io.h b/include/warthog/util/vec_io.h deleted file mode 100644 index 6d82c92..0000000 --- a/include/warthog/util/vec_io.h +++ /dev/null @@ -1,136 +0,0 @@ -#ifndef WARTHOG_UTIL_VEC_IO_H -#define WARTHOG_UTIL_VEC_IO_H - -#include "log.h" -#include -#include -#include -#include -#include -#include -#include - -template -[[deprecated("TDB")]] -std::ostream& -operator<<(std::ostream& str, const std::unordered_set& v) -{ - str << "[ "; - for(auto it = v.begin(); it != v.end(); ++it) - { - str << *it << " "; - } - str << "]"; - return str; -} - -template -[[deprecated("TDB")]] -std::ostream& -operator<<(std::ostream& stream, const std::unordered_map& map) -{ - stream << "{ "; - for(auto el : map) - { - stream << "[" << el.first << ", " << el.second << "], "; - } - stream << " }"; - return stream; -} - -template -[[deprecated("TDB")]] -std::ostream& -operator<<(std::ostream& str, const std::vector& v) -{ - str << "[ "; - for(auto it = v.cbegin(); it != v.cend(); ++it) - { - str << *it << " "; - } - str << "]"; - return str; -} - -/** - * store a vector instance into a file - * - * @pre - * @li @c file open with "wb"; - * - * @param[inout] file the file to write into - * @param[in] v the vector to save into the file - */ -template -[[deprecated("TDB")]] -void -save_vector(std::FILE* file, const std::vector& v) -{ - int s = v.size(); - if(std::fwrite(&s, sizeof(s), 1, file) != 1) - throw std::runtime_error("std::fwrite failed"); - if(std::fwrite(&v[0], sizeof(T), v.size(), file) != v.size()) - throw std::runtime_error("std::fwrite failed"); -} - -/** - * Load a vector from a file - * - * @pre - * @li @c file open with "rb"; - * - * @param[inout] file the file to read - * @return a vector instance which has been just read from @c file - */ -template -[[deprecated("TDB")]] -std::vector -load_vector(std::FILE* file) -{ - int s; - if(std::fread(&s, sizeof(s), 1, file) != 1) - throw std::runtime_error("std::fread failed"); - std::vector v(s); - - size_t stuffRead = std::fread(&v[0], sizeof(T), s, file); - if((int)stuffRead != s) - { - error( - "we were expecting to read ", s, " but we read", stuffRead, - "elements instead"); - throw std::runtime_error("std::fread failed"); - } - - return v; // NVRO -} - -/** - * Convert an array of bytes to a vector of T. - */ -template -[[deprecated("TDB")]] -std::vector -load_vector(const char*& ss) -{ - // unsigned char temp; - int s, i = 0, st = sizeof(T); - - memcpy(&s, ss, sizeof(int)); - ss += sizeof(int); - - std::vector v(s); - - while(i < s) - { - T c; - - memcpy(&c, ss, st); - ss += st; - v.at(i) = c; - i++; - } - - return v; -} - -#endif // WARTHOG_UTIL_VEC_IO_H diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1f53bdd..aae1329 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,12 +4,19 @@ target_sources(warthog_core PRIVATE domain/gridmap.cpp geometry/geography.cpp -geometry/geom.cpp -io/grid.cpp +io/bittable_serialize.cpp +io/grid_trace.cpp +io/log.cpp +io/scenario_serialize.cpp +io/serialize_base.cpp memory/node_pool.cpp +scenario/grid_patch_set.cpp +scenario/scenario_manager.cpp +scenario/scenario_runner.cpp + search/expansion_policy.cpp search/gridmap_expansion_policy.cpp search/problem_instance.cpp @@ -20,11 +27,6 @@ search/vl_gridmap_expansion_policy.cpp util/cost_table.cpp util/dimacs_parser.cpp -util/experiment.cpp -util/file_utils.cpp -util/gm_parser.cpp util/helpers.cpp -util/scenario_manager.cpp util/timer.cpp - ) diff --git a/src/domain/gridmap.cpp b/src/domain/gridmap.cpp index 9f8ed5d..dc0e2eb 100644 --- a/src/domain/gridmap.cpp +++ b/src/domain/gridmap.cpp @@ -1,40 +1,195 @@ #include +#include +#include +#include + #include #include #include #include #include -#include namespace warthog::domain { -gridmap::gridmap(unsigned int h, unsigned int w) : header_(h, w, "octile") +gridmap::gridmap() = default; + +gridmap::gridmap(uint32_t h, uint32_t w) : header_{h, w} { this->init_db(); } +gridmap::gridmap(std::istream& input) +{ + if(!setup_stream_(input)) throw std::runtime_error("invalid grid"); +} + +gridmap::gridmap(io::bittable_serialize& parser) +{ + if(!setup_ser_(parser)) throw std::runtime_error("invalid grid"); +} + +gridmap::gridmap(std::filesystem::path&& filename) +{ + filename_ = std::move(filename); + std::ifstream in(filename_); + if(!setup_stream_(in)) throw std::runtime_error("invalid grid"); +} + +gridmap::gridmap(const std::filesystem::path& filename) + : gridmap(std::filesystem::path(filename)) +{ } + gridmap::gridmap(const char* filename) + : gridmap(std::filesystem::path(filename)) +{ } + +void +gridmap::setup(uint32_t h, uint32_t w) { - strcpy(filename_, filename); - io::bittable_serialize parser; + header_.height_ = h; + header_.width_ = w; + this->init_db(); +} + +bool +gridmap::load(std::istream& input) +{ + return setup_stream_(input); +} + +bool +gridmap::load(io::bittable_serialize& parser) +{ + return setup_ser_(parser); +} + +bool +gridmap::load(std::filesystem::path filename) +{ + filename_ = std::move(filename); std::ifstream in(filename_); - if(!parser.read_header(in)) - throw std::runtime_error("invalid grid format"); - if(parser.get_type() != io::bittable_type::OCTILE) - throw std::runtime_error("gridmap::gridmap must be OCTILE"); - this->header_.type_ = "octile"; + return setup_stream_(in); +} + +bool +gridmap::load(const char* filename) +{ + return load(std::filesystem::path(filename)); +} + +bool +gridmap::save(std::ostream& input, bool padding) +{ + io::bittable_serialize parser; + if(!parser.open_write(&input)) + { + WARTHOG_GERROR("gridmap save failed with input stream"); + return false; + } + return save(parser, padding); +} + +bool +gridmap::save(const std::filesystem::path& filename, bool padding) +{ + io::bittable_serialize parser; + parser.set_filename(std::filesystem::path(filename)); + if(!parser.open_write()) + { + WARTHOG_GERROR_FMT( + "gridmap save failed to write to file \"{}\"", filename.string()); + return false; + } + return save(parser, padding); +} + +bool +gridmap::save(const char* filename, bool padding) +{ + io::bittable_serialize parser; + parser.set_filename(filename); + if(!parser.open_write()) + { + WARTHOG_GERROR_FMT( + "gridmap save failed to write to file \"{}\"", filename); + return false; + } + return save(parser, padding); +} + +bool +gridmap::save(io::bittable_serialize& parser, bool padding) +{ + if(!*this) + { + WARTHOG_GERROR("gridmap save failed due to empty gridmap"); + return false; + } + uint32_t lwidth = padding ? width() : header_width(); + uint32_t lheight = padding ? height() : header_height(); + if(!parser.set_type(warthog::io::bittable_type::OCTILE)) + { + WARTHOG_GERROR("gridmap save failed to set type"); + return false; + } + if(!parser.set_dim(lwidth, lheight)) + { + WARTHOG_GERROR_FMT( + "gridmap save invalid dimensions {}x{}", lwidth, lheight); + return false; + } + + // write gridmap data + if(auto r = parser.write_header(); !r) + { + WARTHOG_GERROR_FMT( + "gridmap save failed header write errc={}", (int)r.error()); + return false; + } + if(auto r = parser.write_grid_data(*this, 0, !padding ? PADDED_ROWS : 0); + !r) + { + WARTHOG_GERROR_FMT( + "gridmap save failed grid write errc={}", (int)r.error()); + return false; + } + if(auto r = parser.write_end(); !r) + { + WARTHOG_GERROR_FMT( + "gridmap save failed finalize errc={}", (int)r.error()); + return false; + } + + return true; +} + +bool +gridmap::setup_stream_(std::istream& in) +{ + if(!in) return false; + io::bittable_serialize parser; + if(!parser.open_read(&in)) return false; + if(!parser.read_header()) return false; + return setup_ser_(parser); +} + +bool +gridmap::setup_ser_(io::bittable_serialize& parser) +{ + if(!parser.read_grid_header()) return false; this->header_.width_ = parser.get_dim().width; this->header_.height_ = parser.get_dim().height; init_db(); - if(!parser.read_map(in, *this, 0, PADDED_ROWS)) - throw std::runtime_error("invalid grid format"); + if(!parser.read_grid_data(*this, 0, PADDED_ROWS)) return false; // calculate traversable num_traversable_ = static_cast(std::transform_reduce( - db_, db_ + db_size_, static_cast(0), std::plus(), - &std::popcount)); + db_.get(), db_.get() + db_size_, static_cast(0), + std::plus(), &std::popcount)); + + return true; } void @@ -44,7 +199,7 @@ gridmap::init_db() // zeroes. this eliminates the need for bounds checking when // fetching the neighbours of a node. uint32_t store_width, store_height; - store_height = this->header_.height_ + PADDED_ROWS + PADDED_ROWS; + store_height = this->header_.height_ + 2 * PADDED_ROWS; // calculate # of extra/redundant padding bits required, // per row, to align map width with dbword size @@ -62,24 +217,20 @@ gridmap::init_db() this->db_size_ = bittable::calc_array_size(store_width, store_height) + 8; // create a one dimensional dbword array to store the grid - this->db_ = new warthog::dbword[db_size_]; - bittable::setup(this->db_, store_width, store_height); + this->db_ = std::make_unique(db_size_); + bittable::setup(this->db_.get(), store_width, store_height); fill(0); - max_id_ = this->dbheight_ * this->dbwidth_ - 1; + this->max_id_ = this->dbheight_ * this->dbwidth_ - 1; } -gridmap::~gridmap() -{ - delete[] db_; -} +gridmap::~gridmap() = default; void gridmap::print(std::ostream& out) { out << "printing padded map" << std::endl; out << "-------------------" << std::endl; - out << "type " << header_.type_ << std::endl; out << "height " << this->height() << std::endl; out << "width " << this->width() << std::endl; out << "map" << std::endl; diff --git a/src/geometry/geography.cpp b/src/geometry/geography.cpp index b650c8c..0daa079 100644 --- a/src/geometry/geography.cpp +++ b/src/geometry/geography.cpp @@ -1,9 +1,8 @@ -#include -#include #include -#define PI_360 0.00872664625997 -#define PI_180 0.017453292519943295 +#include + +#include /* Writes result sine result sin(Ï€a) to the location pointed to by sp Writes result cosine result cos(Ï€a) to the location pointed to by cp @@ -19,6 +18,11 @@ namespace warthog::geometry namespace { +constexpr double PI_360 + = 0.008'726'646'259'971'647'884'618'453'842'443'063'567; +constexpr double PI_180 + = 0.017'453'292'519'943'295'769'236'907'684'886'127'134; + void sincospi(double a, double* sp, double* cp) { @@ -71,19 +75,11 @@ sincospi(double a, double* sp, double* cp) *cp = c; } -#ifdef NDEBUG -inline double -deg_to_rad(double deg) -{ - return deg * PI_180; -} -#else double deg_to_rad(double deg) { - return deg * M_PI / 180; + return deg * PI_180; } -#endif double rad_to_deg(double rad) diff --git a/src/geometry/geom.cpp b/src/geometry/geom.cpp deleted file mode 100644 index b1c5032..0000000 --- a/src/geometry/geom.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include -#include - -std::ostream& -operator<<(std::ostream& out, warthog::geometry::rectangle& rect) -{ - out.write((char*)(&rect.x1), sizeof(rect.x1)); - out.write((char*)(&rect.x2), sizeof(rect.x2)); - out.write((char*)(&rect.y1), sizeof(rect.y1)); - out.write((char*)(&rect.y2), sizeof(rect.y2)); - return out; -} - -std::istream& -operator>>(std::istream& in, warthog::geometry::rectangle& rect) -{ - in.read((char*)(&rect.x1), sizeof(rect.x1)); - in.read((char*)(&rect.x2), sizeof(rect.x2)); - in.read((char*)(&rect.y1), sizeof(rect.y1)); - in.read((char*)(&rect.y2), sizeof(rect.y2)); - return in; -} diff --git a/src/io/bittable_serialize.cpp b/src/io/bittable_serialize.cpp new file mode 100644 index 0000000..6e8aff3 --- /dev/null +++ b/src/io/bittable_serialize.cpp @@ -0,0 +1,275 @@ +#include + +#include +#include + +namespace warthog::io +{ + +bittable_serialize::bittable_serialize() +{ + // increase max line length for larger grids + set_max_line_length(20 << 10); +} + +std::expected +bittable_serialize::read_header(std::istream* in) +{ + if(auto r = get_istream(in); r) + in = *r; + else + return std::unexpected(r.error()); + + std::string_view line; + std::string_view token; + if(auto r = readline(in); r) + line = *r; + else + return std::unexpected(r.error()); + bittable_type detected_type = bittable_type::NONE; + { + parser par(line); + if(!par.next(token) || token != "type") + return std::unexpected(std::errc::io_error); + if(!par.next(token).eof()) return std::unexpected(std::errc::io_error); + } + + if(token == "octile") + detected_type = bittable_type::OCTILE; + else if(token == "patch") + detected_type = bittable_type::PATCH; + else + detected_type = bittable_type::OTHER; + m_type = detected_type; + + // read patch header before map header + if(detected_type == bittable_type::OCTILE) { m_patch_amount = 1; } + else if(detected_type == bittable_type::PATCH) + { + if(auto r = readline(in); r) + line = *r; + else + return std::unexpected(r.error()); + parser par(line); + if(!par.next(token).next(m_patch_amount).eof()) + return std::unexpected(std::errc::io_error); + if(token != "patches" || m_patch_amount > PATCH_COUNT_LIMIT) + { + m_patch_amount = 0; + return std::unexpected(std::errc::argument_out_of_domain); + } + } + m_patch_count = 0; + m_patch_id = 0; + + return {}; +} + +std::expected +bittable_serialize::read_grid_header(std::istream* in) +{ + std::errc err; + if(auto r = get_istream(in); r) + in = *r; + else + return std::unexpected(r.error()); + std::string_view line; + std::string_view token; + + m_patch_count += 1; + + // read height + if(auto r = readline(in); r) + line = *r; + else + return std::unexpected(r.error()); + if(m_type == bittable_type::PATCH) + { + // get patch number + parser par(line); + if(!par.next(token).next(m_patch_id).eof()) + return std::unexpected(std::errc::io_error); + if(token != "patch") + return std::unexpected(std::errc::argument_out_of_domain); + + if(auto r = readline(in); r) + line = *r; + else + return std::unexpected(r.error()); + } + { + parser par(line); + if(!par.next(token).next(m_dim.height).eof()) + return std::unexpected(std::errc::io_error); + if(token != "height" || m_dim.height > GRID_DIMENSION_MAX) + return std::unexpected(std::errc::argument_out_of_domain); + } + + // read width + if(auto r = readline(in); r) + line = *r; + else + return std::unexpected(r.error()); + { + parser par(line); + if(!par.next(token).next(m_dim.width).eof()) + return std::unexpected(std::errc::io_error); + if(token != "width" || m_dim.width > GRID_DIMENSION_MAX) + return std::unexpected(std::errc::argument_out_of_domain); + } + + // read "map" + if(auto r = readline(in); r) + line = *r; + else + return std::unexpected(r.error()); + { + parser par(line); + if(!par.next(token).eof()) return std::unexpected(std::errc::io_error); + if(token != "map") + return std::unexpected(std::errc::argument_out_of_domain); + } + + return {}; +} + +std::expected +bittable_serialize::read_grid_raw(std::span buffer, std::istream* in) +{ + const memory::bittable_dimension read_dim = m_dim; + if(buffer.size() < (uint64_t)read_dim.width * (uint64_t)read_dim.height) + return std::unexpected(std::errc::result_out_of_range); + char* data_at = buffer.data(); + std::string_view line; + std::string_view token; + + if(auto r = get_istream(in); r) + in = *r; + else + return std::unexpected(r.error()); + for(uint32_t y = 0; y < read_dim.height; ++y) + { + // read row + if(auto r = readline(in); r) + line = *r; + else + return std::unexpected(r.error()); + parser par(line); + if(!par.next(token).eof()) return std::unexpected(std::errc::io_error); + if(token.size() != read_dim.width) + return std::unexpected(std::errc::argument_out_of_domain); + // copy row to table + token.copy(data_at, token.size()); + data_at += read_dim.width; + } + return {}; +} + +std::expected +bittable_serialize::write_header(std::ostream* out) +{ + using namespace std::string_view_literals; + if(auto r = get_ostream(out); r) + out = *r; + else + return std::unexpected(r.error()); + + m_patch_auto_pos = 0; + m_patch_count = 0; + m_patch_id = 0; + if(m_type == bittable_type::OCTILE) + { + // expect single map, user does not need to provide this info + if(!(*out << "type octile\n")) + return std::unexpected(std::errc::io_error); + m_patch_amount = 1; + } + else if(m_type == bittable_type::PATCH) + { + // expect variable number of patches + if(!(*out << "type patch\npatches ")) + return std::unexpected(std::errc::io_error); + if(m_patch_amount == patch_auto) + { + // not known in advance, out must be seekable to work + m_patch_auto_pos = out->tellp(); + if(m_patch_auto_pos < 0 || !*out) + return std::unexpected(std::errc::invalid_seek); + // output 9 spaces, replace at end + *out << " "sv; + } + else + { + // set number of patches + *out << m_patch_amount; + } + } + else { return std::unexpected(std::errc::invalid_argument); } + // check after previous write + if(!*out) return std::unexpected(std::errc::io_error); + + m_patch_count += 1; + return {}; +} + +std::expected +bittable_serialize::write_grid_raw(std::span buffer, std::ostream* out) +{ + const memory::bittable_dimension write_dim = m_dim; + if(buffer.size() < (uint64_t)write_dim.width * (uint64_t)write_dim.height) + return std::unexpected(std::errc::result_out_of_range); + char* data_at = buffer.data(); + + if(auto r = get_ostream(out); r) + out = *r; + else + return std::unexpected(r.error()); + + if(m_type == bittable_type::PATCH) + { + if(!(*out << "patch " << m_patch_id++ << '\n')) + return std::unexpected(std::errc::io_error); + } + if(!(*out << "height " << write_dim.height << "\nwidth " << write_dim.width + << "\nmap\n")) + return std::unexpected(std::errc::io_error); + + for(uint32_t y = 0; y < write_dim.height; ++y) + { + // read row + out->write(data_at, write_dim.width); + out->put('\n'); + if(!*out) return std::unexpected(std::errc::io_error); + data_at += write_dim.width; + } + + m_patch_count += 1; + return {}; +} + +std::expected +bittable_serialize::write_end(std::ostream* out) +{ + if(auto r = get_ostream(out); r) + out = *r; + else + return std::unexpected(r.error()); + if(!*out) return std::unexpected(std::errc::io_error); + + if(m_patch_amount == patch_auto) + { + // auto, go and write m_patch_count + if(!out->seekp(m_patch_auto_pos)) + return std::unexpected(std::errc::invalid_seek); + if(!*out << m_patch_count) return std::unexpected(std::errc::io_error); + } + else + { + if(m_patch_count != m_patch_amount) + return std::unexpected(std::errc::result_out_of_range); + } + + return {}; +} + +} // namespace warthog::io diff --git a/src/io/grid.cpp b/src/io/grid.cpp deleted file mode 100644 index 0219240..0000000 --- a/src/io/grid.cpp +++ /dev/null @@ -1,48 +0,0 @@ -#include -#include -#include - -namespace warthog::io -{ - -bool -bittable_serialize::read_header(std::istream& in) -{ - char buffer[32]; - auto read_key - = [&]() { return static_cast(in >> std::setw(32) >> buffer); }; - - if(!read_key()) return false; - bittable_type detected_type = bittable_type::NONE; - if(std::strcmp(buffer, "type") == 0) - { - if(!read_key()) return false; - if(std::strcmp(buffer, "octile") == 0) - detected_type = bittable_type::OCTILE; - else if(std::strcmp(buffer, "patch") == 0) - detected_type = bittable_type::PATCH; - else - detected_type = bittable_type::OTHER; - - if(!read_key()) return false; - } - - // read patch header before map header - if(detected_type == bittable_type::PATCH) - { - if(std::strcmp(buffer, "patches") != 0) return false; - in >> m_patch_count; - if(!read_key()) return false; - } - - if(std::strcmp(buffer, "height") != 0) return false; - if(!(in >> m_dim.height)) return false; - if(!read_key()) return false; - if(std::strcmp(buffer, "width") != 0) return false; - if(!(in >> m_dim.width)) return false; - m_type = detected_type; - if(!read_key() || std::strcmp(buffer, "map") != 0) return false; - return true; -} - -} // namespace warthog::io diff --git a/src/io/grid_trace.cpp b/src/io/grid_trace.cpp new file mode 100644 index 0000000..a608701 --- /dev/null +++ b/src/io/grid_trace.cpp @@ -0,0 +1,156 @@ +#include + +#include +#include + +namespace warthog::io +{ + +void +grid_trace::print_posthoc_header() +{ + if(*this) + { + stream() << R"posthoc(version: 1.4.0 +views: + cell: + - $: rect + width: 1 + height: 1 + x: ${{$.x}} + y: ${{$.y}} + fill: ${{$.fill}} + clear: ${{ $.clear }} + main: + - $: cell + $if: ${{ $.type == 'source' }} + fill: green + clear: false + - $: cell + $if: ${{ $.type == 'destination' }} + fill: red + clear: false + - $: cell + $if: ${{ $.type == 'expand' }} + fill: cyan + clear: false + - $: cell + $if: ${{ $.type == 'expand' }} + fill: blue + clear: close + - $: cell + $if: ${{ $.type == 'generate' }} + fill: purple + clear: false + - $: cell + $if: ${{ $.type == 'generate' }} + fill: orange + clear: true +pivot: + x: ${{ $.x + 0.5 }} + y: ${{ $.y + 0.5 }} + scale: 1 +events: +)posthoc"; + } +} + +void +grid_trace::begin_search(int id, const search::search_problem_instance& pi) +{ + if(*this) + { + if(grid_ == nullptr) + { + throw std::logic_error("grid_trace::grid_ is null"); + } + uint32_t x, y; + grid_->to_unpadded_xy(pi.start_, x, y); + stream() << std::format( + " - {{ type: source, id: {}, x: {}, y: {} }}\n", pi.start_.id, x, + y); + grid_->to_unpadded_xy(pi.target_, x, y); + stream() << std::format( + " - {{ type: destination, id: {}, x: {}, y: {} }}\n", + pi.target_.id, x, y); + } +} + +void +grid_trace::expand_node(const node& current) const +{ + if(*this) + { + assert(grid_ != nullptr); + std::string pid; + if(auto cpid = current.get_parent(); !cpid.is_none()) + { + pid = std::format(", pId: {}", cpid.id); + } + uint32_t x, y; + grid_->to_unpadded_xy(current.get_id(), x, y); + stream() << std::format( + " - {{ type: expand, id: {}{}, x: {}, y: {}, f: {}, g: {} }}\n", + current.get_id().id, pid, x, y, current.get_f(), current.get_g()); + } +} + +void +grid_trace::relax_node(const node& current) const +{ + if(*this) + { + assert(grid_ != nullptr); + std::string pid; + if(auto cpid = current.get_parent(); !cpid.is_none()) + { + pid = std::format(", pId: {}", cpid.id); + } + uint32_t x, y; + grid_->to_unpadded_xy(current.get_id(), x, y); + stream() << std::format( + " - {{ type: relax, id: {}{}, x: {}, y: {}, f: {}, g: {} }}\n", + current.get_id().id, pid, x, y, current.get_f(), current.get_g()); + } +} + +void +grid_trace::close_node(const node& current) const +{ + if(*this) + { + assert(grid_ != nullptr); + std::string pid; + if(auto cpid = current.get_parent(); !cpid.is_none()) + { + pid = std::format(", pId: {}", cpid.id); + } + uint32_t x, y; + grid_->to_unpadded_xy(current.get_id(), x, y); + stream() << std::format( + " - {{ type: close, id: {}{}, x: {}, y: {}, f: {}, g: {} }}\n", + current.get_id().id, pid, x, y, current.get_f(), current.get_g()); + } +} + +void +grid_trace::generate_node( + const node* parent, const node& child, cost_t, uint32_t) const +{ + if(*this) + { + assert(grid_ != nullptr); + std::string pid; + if(parent != nullptr) + { + pid = std::format(", pId: {}", parent->get_id().id); + } + uint32_t x, y; + grid_->to_unpadded_xy(child.get_id(), x, y); + stream() << std::format( + " - {{ type: generate, id: {}{}, x: {}, y: {}, f: {}, g: {} }}\n", + child.get_id().id, pid, x, y, child.get_f(), child.get_g()); + } +} + +} // namespace warthog::io diff --git a/src/io/log.cpp b/src/io/log.cpp new file mode 100644 index 0000000..5d93e8e --- /dev/null +++ b/src/io/log.cpp @@ -0,0 +1,190 @@ +#include + +#include +#include +#include + +namespace warthog::io +{ + +log_sink_stream::log_sink_stream() + : log_sink{ + nullptr, + {{&log_sink_stream::write_trace, &log_sink_stream::write_debug, + &log_sink_stream::write_information, + &log_sink_stream::write_warning, &log_sink_stream::write_error, + &log_sink_stream::write_critical}}} +{ } + +log_sink_stream::log_sink_stream( + const std::filesystem::path& filename, std::ios_base::openmode mode) + : log_sink_stream() +{ + data = this; + owned_file_ = std::make_unique(filename, mode); + log_stream_ = owned_file_.get(); +} +log_sink_stream::log_sink_stream(std::ostream* stream) : log_sink_stream() +{ + data = this; + log_stream_ = stream; +} + +void +log_sink_stream::open( + const std::filesystem::path& filename, std::ios_base::openmode mode) +{ + data = this; + owned_file_ = std::make_unique(filename, mode); + log_stream_ = owned_file_.get(); +} +void +log_sink_stream::open(std::ostream& stream) +{ + data = this; + owned_file_.release(); + log_stream_ = &stream; +} + +// log_sink_stream + +log_sink_std::log_sink_std() + : log_sink{ + nullptr, + {{&log_sink_std::write_trace, &log_sink_std::write_debug, + &log_sink_std::write_information, &log_sink_std::write_warning, + &log_sink_std::write_error, &log_sink_std::write_critical}}} +{ } +log_sink_std::log_sink_std(bool cerr) + : log_sink{ + cerr ? &std::cerr : &std::cout, + {{&log_sink_std::write_trace, &log_sink_std::write_debug, + &log_sink_std::write_information, &log_sink_std::write_warning, + &log_sink_std::write_error, &log_sink_std::write_critical}}} +{ } + +void +log_sink_std::write_trace(void* logger, std::string_view msg) +{ + std::ostream* stream = static_cast(logger); + assert(stream != nullptr); + *stream << std::format( + "[{:" WARTHOG_LOG_TIME_FORMAT "} TRACE] {}\n", + std::chrono::floor(WARTHOG_LOG_NOW), msg); +} +void +log_sink_std::write_debug(void* logger, std::string_view msg) +{ + std::ostream* stream = static_cast(logger); + assert(stream != nullptr); + *stream << std::format( + "[{:" WARTHOG_LOG_TIME_FORMAT "} DEBUG] {}\n", + std::chrono::floor(WARTHOG_LOG_NOW), msg); +} +void +log_sink_std::write_information(void* logger, std::string_view msg) +{ + std::ostream* stream = static_cast(logger); + assert(stream != nullptr); + *stream << std::format( + "[{:" WARTHOG_LOG_TIME_FORMAT "} INFO] {}\n", + std::chrono::floor(WARTHOG_LOG_NOW), msg); +} +void +log_sink_std::write_warning(void* logger, std::string_view msg) +{ + std::ostream* stream = static_cast(logger); + assert(stream != nullptr); + *stream << std::format( + "[{:" WARTHOG_LOG_TIME_FORMAT "} WARN] {}\n", + std::chrono::floor(WARTHOG_LOG_NOW), msg); +} +void +log_sink_std::write_error(void* logger, std::string_view msg) +{ + std::ostream* stream = static_cast(logger); + assert(stream != nullptr); + *stream << std::format( + "[{:" WARTHOG_LOG_TIME_FORMAT "} ERROR] {}\n", + std::chrono::floor(WARTHOG_LOG_NOW), msg); +} +void +log_sink_std::write_critical(void* logger, std::string_view msg) +{ + std::ostream* stream = static_cast(logger); + assert(stream != nullptr); + *stream << std::format( + "[{:" WARTHOG_LOG_TIME_FORMAT "} CRIT] {}\n", + std::chrono::floor(WARTHOG_LOG_NOW), msg); +} + +void +log_sink_stream::write_trace(void* logger, std::string_view msg) +{ + log_sink_stream* log_stream = static_cast(logger); + assert(log_stream != nullptr); + std::lock_guard lock(log_stream->lock_); + log_sink_std::write_trace(log_stream->log_stream_, msg); +} +void +log_sink_stream::write_debug(void* logger, std::string_view msg) +{ + log_sink_stream* log_stream = static_cast(logger); + assert(log_stream != nullptr); + std::lock_guard lock(log_stream->lock_); + log_sink_std::write_debug(log_stream->log_stream_, msg); +} +void +log_sink_stream::write_information(void* logger, std::string_view msg) +{ + log_sink_stream* log_stream = static_cast(logger); + assert(log_stream != nullptr); + std::lock_guard lock(log_stream->lock_); + log_sink_std::write_information(log_stream->log_stream_, msg); +} +void +log_sink_stream::write_warning(void* logger, std::string_view msg) +{ + log_sink_stream* log_stream = static_cast(logger); + assert(log_stream != nullptr); + std::lock_guard lock(log_stream->lock_); + log_sink_std::write_warning(log_stream->log_stream_, msg); +} +void +log_sink_stream::write_error(void* logger, std::string_view msg) +{ + log_sink_stream* log_stream = static_cast(logger); + assert(log_stream != nullptr); + std::lock_guard lock(log_stream->lock_); + log_sink_std::write_error(log_stream->log_stream_, msg); +} +void +log_sink_stream::write_critical(void* logger, std::string_view msg) +{ + log_sink_stream* log_stream = static_cast(logger); + assert(log_stream != nullptr); + std::lock_guard lock(log_stream->lock_); + log_sink_std::write_critical(log_stream->log_stream_, msg); +} + +namespace +{ +global_logger_type global_logger_(log_sink_std(true).sink()); +} +global_logger_type& +glog() +{ + return global_logger_; +} +const log_sink& +glogs() +{ + return global_logger_.sink(); +} +void +set_glog(log_sink log) +{ + global_logger_ = log; +} + +} // namespace warthog::io diff --git a/src/io/scenario_serialize.cpp b/src/io/scenario_serialize.cpp new file mode 100644 index 0000000..7d1025a --- /dev/null +++ b/src/io/scenario_serialize.cpp @@ -0,0 +1,633 @@ +#include + +#include + +#include +#include +#include +#include + +namespace warthog::io +{ + +scenario_serialize::scenario_serialize() + : m_dyn_res(1024), m_string_res(256), m_cost_strings(&m_dyn_res), + m_cost_type(&m_dyn_res), m_cost_value(&m_dyn_res) +{ } +scenario_serialize::~scenario_serialize() = default; + +void +scenario_serialize::close() +{ + serialize_base::close(); + m_state = serialize_state::INIT; + m_version = scenario_version::UNKNOWN; + m_map_width = 0; + m_map_height = 0; + m_inst_at = 0; + m_cost_strings.clear(); + m_cost_type.clear(); + m_cost_value.clear(); +} + +void +scenario_serialize::set_relative_map_filename( + const std::filesystem::path& filename) +{ + m_map_filename + = std::filesystem::proximate(filename, get_scenario_filename()); +} + +int +scenario_serialize::last_command_type() const +{ + if(m_command_type == "Q") return CMD_INST; + if(m_command_type == "P") return CMD_PATCH; + return CMD_UNKNOWN; +} + +std::expected +scenario_serialize::read_version(std::istream* in) +{ + if(m_state != serialize_state::INIT) + return std::unexpected(std::errc::state_not_recoverable); + if(auto r = get_istream(in); r) { in = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + std::string_view line; + std::string_view token; + + if(auto r = readline(in); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + parser par(line); + int version; + if(!par.next(token).next(version).eof()) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + if(version < 1 || version > 2) + { + m_state = serialize_state::ERROR; + return std::unexpected(std::errc::invalid_argument); + } + m_version = version == 1 ? scenario_version::VERSION_1 + : scenario_version::VERSION_2; + m_state = serialize_state::VERSION; + return {}; +} + +std::expected +scenario_serialize::read_header(std::istream* in) +{ + if(!can_read(in) || m_state != serialize_state::VERSION) + return std::unexpected(std::errc::state_not_recoverable); + + switch(m_version) + { + case scenario_version::VERSION_1: + return read_header_v1(in); + case scenario_version::VERSION_2: + return read_header_v2(in); + default: + return std::unexpected(std::errc::state_not_recoverable); + } +} + +std::expected +scenario_serialize::read_header_v1(std::istream* in) +{ + if(auto r = get_istream(in); r) { in = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + // setup cost types + m_cost_strings.resize(1); + m_cost_type.resize(1); + m_cost_value.resize(1); + m_cost_strings[0] = get_cost_str(cost_type::G_8C_NCC); + m_cost_type[0] = cost_type::G_8C_NCC; + m_cost_value[0] = -1; + + // read first inst line to get map + auto line = readline(in); + if(!line) + { + m_state = serialize_state::ERROR; + return std::unexpected(line.error()); + } + parser par(*line); + std::string_view map; + if(!par.ignore().next(map).next(m_map_width).next(m_map_height)) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + if(m_map_height < 1 || m_map_height > GRID_MAX_SIZE) + { + m_state = serialize_state::ERROR; + return std::unexpected(std::errc::invalid_argument); + } + if(m_map_width <= 0 || m_map_width > GRID_MAX_SIZE || m_map_height <= 0 + || m_map_height > GRID_MAX_SIZE) + { + m_state = serialize_state::ERROR; + return std::unexpected(std::errc::invalid_argument); + } + set_relative_map_filename(map); + unreadline(*line); + m_state = serialize_state::COMMAND; + return {}; +} + +std::expected +scenario_serialize::read_header_v2(std::istream* in) +{ + if(auto r = get_istream(in); r) { in = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + // read first inst line to get map + std::string_view line; + std::string_view token; + + // height + if(auto r = readline(in); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + { + parser par(line); + if(!par.next(token).next(m_map_height).eof()) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + if(token != "height" || m_map_height < 1 + || m_map_height > GRID_MAX_SIZE) + { + m_state = serialize_state::ERROR; + return std::unexpected(std::errc::invalid_argument); + } + } + + // width + if(auto r = readline(in); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + { + parser par(line); + if(!par.next(token).next(m_map_width).eof()) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + if(token != "width" || m_map_width < 1 || m_map_width > GRID_MAX_SIZE) + { + m_state = serialize_state::ERROR; + return std::unexpected(std::errc::invalid_argument); + } + } + + // cost + if(auto r = readline(in); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + { + parser par(line); + int cost_count; + if(!par.next(token).next(cost_count)) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + if(token != "cost" || cost_count < 0 || cost_count > 128) + { + // limit cost_count to be within reason + m_state = serialize_state::ERROR; + return std::unexpected(std::errc::invalid_argument); + } + m_cost_strings.resize(cost_count); + m_cost_type.resize(cost_count); + m_cost_value.resize(cost_count); + for(int i = 0; i < cost_count; ++i) + { + if(!par.next(token)) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + std::string_view ctype = copy_string(token); + m_cost_strings[i] = ctype; + m_cost_type[i] = get_cost_type(ctype); + m_cost_value[i] = -1; + } + // end of line + if(!par.eof()) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + } + + // get map (patch) filename + if(auto r = readline(in); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + { + parser par(line); + std::string fname; + if(!par.next(token).next_q(fname).eof()) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + m_map_filename = std::move(fname); + if(token != "patch") + { + m_state = serialize_state::ERROR; + return std::unexpected(std::errc::invalid_argument); + } + } + + // read in "commands" + if(auto r = readline(in); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + { + parser par(line); + if(!par.next(token).eof()) + { + m_state = serialize_state::ERROR; + return std::unexpected(par.error()); + } + if(token != "commands") + { + m_state = serialize_state::ERROR; + return std::unexpected(std::errc::invalid_argument); + } + } + + // set_relative_map_filename(m_inst.map); + m_state = serialize_state::COMMAND; + return {}; +} + +std::expected +scenario_serialize::next_command_type(std::istream* in) +{ + if(!can_read(in) || m_state != serialize_state::COMMAND) + return std::unexpected(std::errc::state_not_recoverable); + if(auto r = get_istream(in); r) { in = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + + switch(m_version) + { + case scenario_version::VERSION_1: + { + auto line = readline(in); + if(!line) + { + m_state = serialize_state::ERROR; + return std::unexpected(line.error()); + } + if(istream_eof(in)) + { + m_state = serialize_state::END; + return FINAL; + } + unreadline(*line); + return CMD_INST; + } + case scenario_version::VERSION_2: + { + auto line = readline(in); + if(!line) + { + m_state = serialize_state::ERROR; + return std::unexpected(line.error()); + } + if(istream_eof(in)) + { + m_state = serialize_state::END; + return FINAL; + } + parser par(*line); + if(!par.next(m_command_type)) return std::unexpected(par.error()); + auto cmd_type = last_command_type(); + unreadline(*line); + return cmd_type; + } + default: + return std::unexpected(std::errc::state_not_recoverable); + } +} + +std::expected +scenario_serialize::skip_commands(int count, std::istream* in) +{ + if(m_state == serialize_state::END) { return {}; } + if(!can_read(in) || m_state != serialize_state::COMMAND) + return std::unexpected(std::errc::state_not_recoverable); + + if(auto r = get_istream(in); r) { in = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + int skipped = 0; + while(count > 0) + { + --count; + if(auto r = readline(in, true); !r) + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + if(istream_eof(in)) + { + m_state = serialize_state::END; + break; + } + ++skipped; + } + return skipped; +} + +std::expected +scenario_serialize::read_instance_line( + scenario_instance& inst, std::istream* in) +{ + if(m_state == serialize_state::END) return FINAL; + if(!can_read(in) || m_state != serialize_state::COMMAND) + return std::unexpected(std::errc::state_not_recoverable); + + switch(m_version) + { + case scenario_version::VERSION_1: + return read_instance_line_v1(inst, in); + case scenario_version::VERSION_2: + return read_instance_line_v2(inst, in); + default: + return std::unexpected(std::errc::state_not_recoverable); + } +} + +std::expected +scenario_serialize::read_instance_line_v1( + scenario_instance& inst, std::istream* in) +{ + assert(can_read(in)); + // move to start of read + std::string_view line; + std::string_view token; + + if(auto r = get_istream(in); r) { in = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + if(auto r = readline(in, true); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + if(istream_eof(in)) + { + m_state = serialize_state::END; + return FINAL; + } + parser par(line); + if(!par.next(inst.bucket) + .next(token) + .next(inst.width) + .next(inst.height) + .next(inst.start_x) + .next(inst.start_y) + .next(inst.goal_x) + .next(inst.goal_y) + .next(m_cost_value.at(0)) + .eof()) + { + // state not set to error, up to user + return std::unexpected(par.error()); + } + inst.map = token; + inst.cost = m_cost_value; + if(!std::isfinite(inst.start_x) || !std::isfinite(inst.start_y) + || !std::isfinite(inst.goal_x) || !std::isfinite(inst.goal_y) + || !std::isfinite(inst.cost[0])) + return INVALID; + // perform checking of values, but do not return as error if fail + if(inst.width != m_map_width || inst.height != m_map_height) + return INVALID; + if(m_force_int) + { + // check integer bounds + if(rint(inst.start_x) != inst.start_x + || rint(inst.start_y) != inst.start_y + || rint(inst.goal_x) != inst.goal_x + || rint(inst.goal_y) != inst.goal_y) + return INVALID; + if(inst.start_x < 0 || inst.start_y >= m_map_width || inst.goal_x < 0 + || inst.goal_y >= m_map_height) + return INVALID; + } + else + { + if(inst.start_x < 0 || inst.start_y > m_map_width || inst.goal_x < 0 + || inst.goal_y > m_map_height) + return INVALID; + } + return VALID; +} + +std::expected +scenario_serialize::read_instance_line_v2( + scenario_instance& inst, std::istream* in) +{ + assert(can_read(in)); + // move to start of read + std::string_view line; + std::string_view token; + + if(auto r = get_istream(in); r) { in = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + if(auto r = readline(in, true); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + if(istream_eof(in)) + { + m_state = serialize_state::END; + return FINAL; + } + + parser par(line); + if(!par.next(m_command_type)) return std::unexpected(par.error()); + auto cmd_type = last_command_type(); + if(cmd_type != CMD_INST) + { + unreadline(line); + return cmd_type; + } + if(!par.next(inst.bucket) + .next(inst.start_x) + .next(inst.start_y) + .next(inst.goal_x) + .next(inst.goal_y)) + return std::unexpected(par.error()); + if(!std::isfinite(inst.start_x) || !std::isfinite(inst.start_y) + || !std::isfinite(inst.goal_x) || !std::isfinite(inst.goal_y)) + return std::unexpected(std::errc::invalid_argument); + inst.width = inst.height = 0; + for(auto& cost : m_cost_value) + { + if(!par.next(cost)) return std::unexpected(par.error()); + if(!std::isfinite(cost)) + return std::unexpected(std::errc::invalid_argument); + } + inst.cost = m_cost_value; + if(!par.eof()) + { + // unexpected number of paramters + return std::unexpected(par.error()); + } + if(m_force_int) + { + // check integer bounds + if(rint(inst.start_x) != inst.start_x + || rint(inst.start_y) != inst.start_y + || rint(inst.goal_x) != inst.goal_x + || rint(inst.goal_y) != inst.goal_y) + return INVALID; + if(inst.start_x < 0 || inst.start_y >= m_map_width || inst.goal_x < 0 + || inst.goal_y >= m_map_height) + return INVALID; + } + else + { + if(inst.start_x < 0 || inst.start_y > m_map_width || inst.goal_x < 0 + || inst.goal_y > m_map_height) + { + return INVALID; + } + } + return VALID; +} + +std::expected +scenario_serialize::read_patch_line(scenario_patch& patch, std::istream* in) +{ + if(!can_read(in) || m_state != serialize_state::COMMAND) + { + return std::unexpected(std::errc::state_not_recoverable); + } + + switch(m_version) + { + case scenario_version::VERSION_2: + return read_patch_line_v2(patch, in); + default: + return std::unexpected(std::errc::state_not_recoverable); + } +} + +auto +scenario_serialize::read_patch_line_v2(scenario_patch& patch, std::istream* in) + -> std::expected +{ + assert(can_read(in)); + // move to start of read + std::string_view line; + std::string_view token; + + if(auto r = get_istream(in); r) { in = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + if(auto r = readline(in, true); r) { line = *r; } + else + { + m_state = serialize_state::ERROR; + return std::unexpected(r.error()); + } + if(istream_eof(in)) + { + m_state = serialize_state::END; + return FINAL; + } + + parser par(line); + if(!par.next(token)) return std::unexpected(par.error()); + auto cmd_type = last_command_type(); + if(cmd_type != CMD_PATCH) + { + unreadline(line); + return cmd_type; + } + + if(!par.next(patch.bucket) + .next(patch.patch_id) + .next(patch.loc_x) + .next(patch.loc_y) + .eof()) + return std::unexpected(par.error()); + if(patch.loc_x >= m_map_width || patch.loc_y > m_map_height) + return INVALID; + + return VALID; +} + +std::string_view +scenario_serialize::copy_string(std::string_view str) +{ + size_t len = str.size(); + if(len == 0) return std::string_view(); + char* data = static_cast(m_string_res.allocate(len + 1, 8)); + std::memcpy(data, str.data(), len); + data[len] = '\0'; + return std::string_view(data, len); +} + +} // namespace warthog::io diff --git a/src/io/serialize_base.cpp b/src/io/serialize_base.cpp new file mode 100644 index 0000000..f2d5e88 --- /dev/null +++ b/src/io/serialize_base.cpp @@ -0,0 +1,166 @@ +#include + +#include +#include +#include +#include +#include + +namespace warthog::io +{ + +serialize_base::serialize_base() { } +serialize_base::~serialize_base() = default; + +std::expected +serialize_base::open_read(std::istream* is) +{ + close(); + if(is != nullptr) { m_stream_in = is; } + else + { + auto stream = std::make_unique(get_filename()); + m_stream_in = stream.get(); + m_stream = std::move(stream); + } + if(!*m_stream_in) + { + // bad stream + m_stream_in = nullptr; + m_stream = nullptr; + return std::unexpected(std::errc::io_error); + } + return {}; +} + +std::expected +serialize_base::open_write(std::ostream* os) +{ + close(); + if(os != nullptr) { m_stream_out = os; } + else + { + auto stream = std::make_unique(get_filename()); + m_stream_out = stream.get(); + m_stream = std::move(stream); + } + if(!*m_stream_out) + { + // bad stream + m_stream_out = nullptr; + m_stream = nullptr; + return std::unexpected(std::errc::io_error); + } + return {}; +} + +void +serialize_base::close() +{ + m_line_num = 0; + m_line = std::string_view(); + m_unget_line.clear(); + m_stream = nullptr; + m_stream_in = nullptr; + m_stream_out = nullptr; +} + +bool +serialize_base::istream_eof(std::istream* in) +{ + in = get_istream(in).value_or(nullptr); + return in != nullptr && in->eof(); +} + +std::expected +serialize_base::readline(std::istream* in, bool skip_blanks) +{ + size_t len; + if(auto r = get_istream(in); r) + in = *r; + else + return std::unexpected(r.error()); + if(!m_line_data) + { + m_max_line_length + = m_max_line_length > 0 ? m_max_line_length : max_line_length; + m_line_data = std::make_unique(m_max_line_length); + } + while(true) + { + if(len = m_unget_line.size(); len != 0) + { + // return last unreadline + if(len > m_max_line_length - 1) + { + return std::unexpected(std::errc::invalid_argument); + } + if(len == 1 && m_unget_line[0] == '\0') + { + // empty line + m_line = std::string_view(); + } + else + { + // copy line + std::memcpy(m_line_data.get(), m_unget_line.c_str(), len + 1); + m_line = std::string_view(m_line_data.get(), len); + } + m_unget_line.clear(); + } + else + { + if(in->eof()) return std::unexpected(std::errc::io_error); + if(!in->getline(m_line_data.get(), m_max_line_length)) + { + if(in->eof() && in->gcount() == 0) + { + in->clear(std::ios::eofbit); + // extracted no characters and reached end of file, return + // no error + return std::string_view(); + } + else + { + // error + return std::unexpected(std::errc::io_error); + } + } + // get length, if eof is set, is last line and no delimiter was + // extracted + len = static_cast(in->gcount()) - (in->eof() ? 0 : 1); + if(len == 0) { m_line = std::string_view(); } + else + { + if(std::iscntrl(m_line_data[len - 1])) + { + // mainly \r reading windows files in linux + m_line_data[--len] = '\0'; + } + m_line = std::string_view(m_line_data.get(), len); + } + m_line_num += 1; + } + if(skip_blanks && is_line_blank(m_line)) + { + continue; // blank line, repeat + } + return m_line; + } +} +void +serialize_base::unreadline(std::string_view line) +{ + if(!line.empty()) [[likely]] { m_unget_line = line; } + else { m_unget_line = '\0'; } +} + +bool +serialize_base::is_line_blank(std::string_view line) +{ + return std::all_of(line.begin(), line.end(), [](char c) { + return std::isspace((unsigned char)c); + }); +} + +} // namespace warthog::io diff --git a/src/memory/node_pool.cpp b/src/memory/node_pool.cpp index d2df7a1..b7a3576 100644 --- a/src/memory/node_pool.cpp +++ b/src/memory/node_pool.cpp @@ -1,4 +1,5 @@ #include + #include #include diff --git a/src/scenario/grid_patch_set.cpp b/src/scenario/grid_patch_set.cpp new file mode 100644 index 0000000..990ade7 --- /dev/null +++ b/src/scenario/grid_patch_set.cpp @@ -0,0 +1,304 @@ +#include + +#include +#include + +#include + +namespace warthog::scenario +{ + +bool +grid_patch_set::load(std::istream& file, int max_grids) +{ + io::bittable_serialize S; + if(auto r = S.open_read(&file); !r) + { + WARTHOG_GWARN_FMT( + "grid patch failed to open file code={}", (int)r.error()); + return false; + } + if(int r = load(S, max_grids); r < 0) + { + WARTHOG_GWARN_FMT("grid patch failed to read patch {}", -r - 1); + return false; + } + return true; +} + +bool +grid_patch_set::load(const std::filesystem::path& maps, int max_grids) +{ + io::bittable_serialize S; + S.set_filename(std::filesystem::path(maps)); + if(auto r = S.open_read(); !r) + { + WARTHOG_GWARN_FMT( + "grid patch failed to open file code={}", (int)r.error()); + return false; + } + if(int r = load(S); r < 0) + { + WARTHOG_GWARN_FMT("grid patch failed to read patch {}", -r - 1); + return false; + } + return true; +} + +int +grid_patch_set::load(io::bittable_serialize& S, int max_grids, uint32_t flags) +{ + // read header + if(S.get_type() == io::bittable_type::NONE) + { + // header not read + if((flags & SKIP_HEADER) != 0) + { + WARTHOG_GWARN( + "grid patch SKIP_HEADER for serializer when header " + "has not been read."); + return -1; + } + if(auto r = S.read_header(); !r) + { + WARTHOG_GWARN_FMT( + "grid patch failed to read header code={}", (int)r.error()); + return -1; + } + } + else + { + // header has been read, check + if((flags & FORCE_HEADER) != 0) + { + WARTHOG_GWARN( + "grid patch FORCE_HEADER for serializer when header " + "has already been read."); + return -1; + } + } + auto type = S.get_type(); + if(type != io::bittable_type::OCTILE && type != io::bittable_type::PATCH) + { + WARTHOG_GWARN( + "grid patch only supports reading type octile or patch."); + return -1; + } + + // start reading grids + int count = 0; + if(max_grids < 0) { max_grids = std::numeric_limits::max(); } + while(count < max_grids && S.get_patch_count() < S.get_patch_amount()) + { + // read new grid + ++count; + if(auto r = S.read_grid_header(); !r) + { + WARTHOG_GWARN_FMT( + "grid patch failed to read patch {} header code={}", count, + (int)r.error()); + return -count; + } + if((flags & IGNORE_INDEX) == 0) + { + // check index + if(S.get_patch_id() != patches_.size()) + { + // index mismatch + WARTHOG_GWARN_FMT( + "grid patch failed patch {} index mismatch of {} expected " + "{}", + count, S.get_patch_id(), patches_.size()); + return -count; + } + } + // setup patch data + auto dim = S.get_dim(); + auto bytes = bittable::calc_array_size(dim.width, dim.height); + auto* grid_data = static_cast( + grid_res_.allocate(bytes, alignof(bittable::value_type))); + bittable patch(grid_data, dim.width, dim.height); + if(auto r = S.read_grid_data(patch); !r) + { + WARTHOG_GWARN_FMT( + "grid patch failed to read patch {} data code={}", count, + (int)r.error()); + return -count; + } + patches_.push_back(patch); + } + + return count; +} + +bool +grid_patch_set::save(std::ostream& file, int grid_id) +{ + io::bittable_serialize S; + if(auto r = S.open_write(&file); !r) + { + WARTHOG_GWARN_FMT( + "grid patch failed to open file code={}", (int)r.error()); + return false; + } + if(int r = load(S, grid_id); r < 0) + { + WARTHOG_GWARN_FMT("grid patch failed to write patch {}", -r - 1); + return false; + } + return true; +} + +bool +grid_patch_set::save(const std::filesystem::path& maps, int grid_id) +{ + io::bittable_serialize S; + S.set_filename(std::filesystem::path(maps)); + if(auto r = S.open_write(); !r) + { + WARTHOG_GWARN_FMT( + "grid patch failed to open file code={}", (int)r.error()); + return false; + } + if(int r = load(S, grid_id); r < 0) + { + WARTHOG_GWARN_FMT("grid patch failed to write patch {}", -r - 1); + return false; + } + return true; +} + +int +grid_patch_set::save(io::bittable_serialize& S, int grid_id, uint32_t flags) +{ + if(!(flags & SKIP_HEADER)) + { + // write header + if(S.get_type() == warthog::io::bittable_type::NONE) + { + if(grid_id >= 0) + { + // set type + if(auto r = S.set_type(warthog::io::bittable_type::OCTILE); !r) + { + WARTHOG_GERROR("grid patch save failed to set type"); + return -1; + } + } + else + { + // set type + if(auto r = S.set_type(warthog::io::bittable_type::PATCH); !r) + { + WARTHOG_GERROR("grid patch save failed to set type"); + return -1; + } + if(auto r = S.set_patch_amount(size()); !r) + { + WARTHOG_GERROR("grid patch save failed to set amount"); + return -1; + } + } + } + } + // write header + if(auto type = S.get_type(); + type != io::bittable_type::OCTILE && type != io::bittable_type::PATCH) + { + WARTHOG_GERROR_IF( + (flags & SKIP_HEADER) != 0, + "grid patch SKIP_HEADER given but serialize not setup"); + WARTHOG_GERROR_IF( + (flags & SKIP_HEADER) == 0, "grid patch not in state to use"); + return -1; + } + if(auto r = S.write_header(); !r) + { + WARTHOG_GERROR_FMT( + "grid patch failed to write header errc={}", (int)r.error()); + return -1; + } + + // start writing grids + int count = 0; + while(count < patches_.size() + && S.get_patch_count() < S.get_patch_amount()) + { + // read new grid + auto& P = patches_[grid_id >= 0 ? grid_id : count]; + ++count; + if(!S.set_dim(P.width(), P.height())) + { + WARTHOG_GERROR_FMT( + "grid patch failed to set dimensions {}x{}", P.width(), + P.height()); + return -count; + } + if(auto r = S.write_grid_data(P); !r) + { + WARTHOG_GERROR_FMT( + "grid patch failed to write grid errc={}", (int)r.error()); + return -count; + } + if(grid_id >= 0) break; + } + + return count; +} + +bool +grid_patch_set::push_copy( + bittable table, uint16_t offset_x, uint16_t offset_y, uint16_t width, + uint16_t height) +{ + if(table.size() == 0) { return false; } + bittable patch; + if(offset_x == 0 && offset_y == 0 && width == npos && height == npos) + { + // copy as is + auto size = table.size_bytes(); + auto* grid_data = static_cast( + grid_res_.allocate(size, alignof(bittable::value_type))); + std::memcpy(grid_data, table.data(), size); + patch = bittable(grid_data, table.width(), table.height()); + } + else + { + // crop + if(offset_x >= table.width() || width > table.width() + || offset_x + width > table.width()) + { + return false; + } + if(offset_y >= table.height() || height > table.height() + || offset_y + height > table.height()) + { + return false; + } + auto size = bittable::calc_array_size(width, height); + auto* grid_data = static_cast( + grid_res_.allocate(size, alignof(bittable::value_type))); + patch = bittable(grid_data, table.width(), table.height()); + table.copy( + patch, pad_id::zero(), table.xy_to_id(offset_x, offset_y), width, + height); + } + patches_.push_back(patch); + return true; +} + +bool +grid_patch_set::push_ref(bittable patch) +{ + patches_.push_back(patch); + return true; +} + +void +grid_patch_set::reset() +{ + patches_.clear(); + grid_res_.release(); +} + +} // namespace warthog::scenario diff --git a/src/scenario/scenario_manager.cpp b/src/scenario/scenario_manager.cpp new file mode 100644 index 0000000..23d8137 --- /dev/null +++ b/src/scenario/scenario_manager.cpp @@ -0,0 +1,467 @@ +#include + +#include +#include +#include + +#include +#include + +namespace warthog::scenario +{ + +scenario_manager::scenario_manager() { } + +scenario_manager::~scenario_manager() = default; + +void +scenario_manager::clear() +{ + experiments_.clear(); + experiments_res_.release(); + mfile_.clear(); + inst_count_ = 0; + patch_count_ = 0; + snapshot_count_ = 0; + static_scenario_start_ = -1; +} + +void +scenario_manager::set_cost_type(io::cost_type c) noexcept +{ + cost_type_ = io::scenario_serialize::get_cost_str(c); +} + +void +scenario_manager::load_scenario(const std::filesystem::path& filelocation) +{ + sfile_ = filelocation; + std::ifstream in(filelocation); + if(!load_gppc_scenario(in)) + { + WARTHOG_GERROR_FMT( + "Failed to load scenario file \"{}\"", sfile_.string()); + throw std::runtime_error("scenario_manager failed to load scenario"); + } +} + +void +scenario_manager::load_scenario( + std::istream& file, std::filesystem::path&& scenfile) +{ + sfile_ = std::move(scenfile); + if(!load_gppc_scenario(file)) + { + WARTHOG_GERROR_FMT( + "Failed to load scenario file \"{}\"", std::string(sfile_)); + throw std::runtime_error("scenario_manager failed to load scenario"); + } +} + +// V1.0 is the version officially supported by HOG +std::expected +scenario_manager::load_gppc_scenario(std::istream& scenfile) +{ + clear(); + + io::scenario_serialize si; + si.set_scenario_filename(std::filesystem::path(sfile_)); + si.set_force_int(true); + + // open stream and read header + if(auto r = si.open_read(&scenfile); !r) + { + WARTHOG_GERROR("scenario_manager failed to open for read"); + return std::unexpected(r.error()); + } + if(auto r = si.read_version(); !r) + { + WARTHOG_GERROR_FMT( + "scenario_manager failed to read version on line: {}", + si.get_line_num()); + return std::unexpected(r.error()); + } + version_ = si.get_version(); + if(version_ == io::scenario_version::VERSION_1) + { + return load_gppc_scenario_body_v1(si); + } + else if(version_ == io::scenario_version::VERSION_2) + { + return load_gppc_scenario_body_v2(si); + } + else + { + WARTHOG_GERROR("scenario_manager reading unsupported version"); + return std::unexpected(std::errc::invalid_argument); + } +} + +std::expected +scenario_manager::load_gppc_scenario_body_v1(io::scenario_serialize& si) +{ + if(auto r = si.read_header(); !r) + { + WARTHOG_GERROR_FMT( + "scenario_manager failed to read scenario v1 header on line: {}", + si.get_line_num()); + return std::unexpected(r.error()); + } + + mfile_ = si.get_map_filename(); + experiments_.reserve(1024); + commands_.reserve(1024); + scenario_width_ = si.get_map_width(); + scenario_height_ = si.get_map_height(); + + // check cost type + bool use_cost = true; + if(!cost_type_.empty()) + { + if(cost_type_ == "-") + { + // use no cost type + use_cost = false; + } + else + { + // user-provided cost, error for v1 + WARTHOG_GERROR_FMT( + "scenario_manager v1 does not support cost type, was provided " + "{}", + cost_type_); + return std::unexpected(std::errc::invalid_argument); + } + } + + // setup commands header for static scenario + commands_.push_back(scenario_command::make_snapshot(0, 0)); + commands_.push_back(scenario_command::make_patch(0, 0, 0, 0)); + patch_count_ += 1; + snapshot_count_ += 1; + static_scenario_start_ = (int32_t)commands_.size(); + // read queries until done + bool first = true; + io::scenario_instance Q; + std::string_view map_string; + while(true) + { + Q.reset(); + auto con = si.read_instance_line(Q); + if(!con) + { + WARTHOG_GERROR_FMT( + "scenario_manager failed to read inst on line: {}", + si.get_line_num()); + return std::unexpected(std::errc::io_error); + } + if(*con == io::scenario_serialize::VALID) + { + std::string_view current_map(Q.map); + if(current_map.size() > 2048) // limit string size + { + WARTHOG_GERROR_FMT( + "scenario_manager v1 inst line map exceeds 2048 chars on " + "line: {}", + si.get_line_num()); + return std::unexpected(std::errc::argument_out_of_domain); + } + if(map_string != current_map) + { + map_string = copy_string(current_map); + } + std::optional cost_value; + if(use_cost) + { + // add cost + cost_value.emplace(Q.cost[0]); + } + experiment* ex = std::construct_at( + static_cast(experiments_res_.allocate( + sizeof(experiment), alignof(experiment))), + (uint32_t)Q.start_x, (uint32_t)Q.start_y, (uint32_t)Q.goal_x, + (uint32_t)Q.goal_y, si.get_map_width(), si.get_map_height(), + cost_value, map_string); + experiments_.push_back(ex); + commands_.push_back( + scenario_command::make_inst( + Q.bucket, inst_count_++, + (uint32_t)(experiments_.size() - 1))); + } + else if(*con == io::scenario_serialize::FINAL) { break; } + else + { + WARTHOG_GWARN_FMT( + "scenario_manager v1 invalid instance on line {}", + si.get_line_num()); + } + } + return {}; +} + +std::expected +scenario_manager::load_gppc_scenario_body_v2(io::scenario_serialize& si) +{ + if(!si.read_header()) + { + WARTHOG_GERROR_FMT( + "scenario_manager failed to read scenario v2 header on line: {}", + si.get_line_num()); + return std::unexpected(std::errc::io_error); + } + + mfile_ = si.get_map_filename(); + experiments_.reserve(1024); + commands_.reserve(1024); + scenario_width_ = si.get_map_width(); + scenario_height_ = si.get_map_height(); + static_scenario_start_ = -1; // init dynamic scenario + + // set map filename + std::string_view map_string = copy_string(si.get_map_filename().string()); + if(map_string.size() > 2048) // limit string size + { + WARTHOG_GERROR("scenario_manager v2 map exceeds 2048 chars"); + return std::unexpected(std::errc::filename_too_long); + } + + // get cost index + int cost_index = si.get_cost_type().size() != 0 ? 0 : -1; + if(!cost_type_.empty()) + { + if(cost_type_ == "-") + { + // use no cost type + cost_index = -1; + } + else + { + // user-provided cost index + cost_index = si.find_cost_index(cost_type_); + if(cost_index < 0) + { + WARTHOG_GERROR_FMT( + "scenario_manager v2 failed to find user-provided cost: " + "{}", + cost_type_); + return std::unexpected(std::errc::invalid_argument); + } + } + } + + // read queries until done + io::scenario_instance Q; + io::scenario_patch P; + int last_type = -1; + int last_bucket = -1; + while(true) + { + // try reading a inst line + auto con = si.read_instance_line(Q); + if(!con) + { + WARTHOG_GERROR_FMT( + "scenario_manager failed to read command on line: {}", + si.get_line_num()); + return std::unexpected(std::errc::io_error); + } + if(*con == io::scenario_serialize::VALID) + { + if(last_type == -1) + { + // only used if first command is a inst + commands_.push_back( + scenario_command::make_snapshot( + Q.bucket, snapshot_count_++)); + } + if(last_type == -1 + || last_type == io::scenario_serialize::CMD_PATCH) + { + // set as static scenario (for now) + static_scenario_start_ + = static_cast(commands_.size()); + } + last_type = io::scenario_serialize::CMD_INST; + last_bucket = Q.bucket; + + std::optional ex_cost; + if(cost_index >= 0) { ex_cost = Q.cost[cost_index]; } + experiment* ex = std::construct_at( + static_cast(experiments_res_.allocate( + sizeof(experiment), alignof(experiment))), + Q.start_x, Q.start_y, Q.goal_x, Q.goal_y, si.get_map_width(), + si.get_map_height(), ex_cost, map_string); + experiments_.push_back(ex); + commands_.push_back( + scenario_command::make_inst( + Q.bucket, inst_count_++, + (uint32_t)(experiments_.size() - 1))); + } + else if(*con == io::scenario_serialize::CMD_PATCH) + { + auto pcon = si.read_patch_line(P); + if(!pcon || *pcon != io::scenario_serialize::VALID) + { + WARTHOG_GERROR_FMT( + "scenario_manager failed to read command on line: {}", + si.get_line_num()); + return std::unexpected(std::errc::io_error); + } + if(last_type != io::scenario_serialize::CMD_PATCH + || last_bucket != P.bucket) + { + commands_.push_back( + scenario_command::make_snapshot( + P.bucket, snapshot_count_++)); + } + last_type = io::scenario_serialize::CMD_PATCH; + last_bucket = P.bucket; + + commands_.push_back( + scenario_command::make_patch( + P.bucket, P.patch_id, P.loc_x, P.loc_y)); + } + else if(*con == io::scenario_serialize::FINAL) { break; } + else + { + WARTHOG_GWARN_FMT_IF( + *con == io::scenario_serialize::INVALID, + "scenario_manager invalid command on line {}", + si.get_line_num()); + WARTHOG_GINFO_FMT_IF( + *con != io::scenario_serialize::INVALID, + "scenario_manager unknown command on line {}", + si.get_line_num()); + // ignore + if(auto r = si.skip_commands(); !r) + return std::unexpected(r.error()); + } + } + + // check if still static scenario + if(snapshot_count_ != 1) + { + // set to dynamic scenario + static_scenario_start_ = -1; + } + + return {}; +} + +std::string_view +scenario_manager::copy_string(std::string_view str) +{ + if(str.empty()) return std::string_view(); + char* mapchars + = static_cast(experiments_res_.allocate(str.size() + 1)); + std::memcpy(mapchars, str.data(), str.size()); + mapchars[str.size()] = '\0'; + return std::string_view(mapchars, str.size()); +} + +/** + * Finds a matching map file to a scenario. + * Take mappath as scenmgr map name. scendir as partent(sfilename), or + * current_working_dir. Returns path in order below: If mappath is absolute + * path: if exists return mappath, else return no path. If scendir/mappath + * exists: return scendir/mappath. If sfilename != '' and replace sfilename ext + * to '.map': if exists return that. If sfilename != '' and remove sfilename + * ext: if new extension is '.map' and exists return that. Return empty path. + */ +std::filesystem::path +find_map_filename( + const scenario_manager& scenmgr, const std::filesystem::path& sfilename) +{ + namespace fs = std::filesystem; + const auto& mapname = scenmgr.get_experiment(0)->map(); + // scen file has a map name designated. + if(!mapname.empty()) + { + auto mappath = fs::path(mapname); + // absolute path, try to use that only. + if(mappath.is_absolute()) + { + if(fs::is_regular_file(mappath)) { return mappath; } + else { return {}; } + } + // path is relative path + auto spath = !sfilename.empty() ? sfilename.parent_path() + : fs::current_path(); + // check relative path from either sfilename directory or + // current_working_directory + if(auto append_path = spath / mapname; + fs::is_regular_file(append_path)) + { + return append_path; + } + } + // if a scenario filename was presented, try to deduce map from scenario + // filename + if(!sfilename.empty()) + { + // replace extenion with .map + auto mapfile = sfilename; + mapfile.replace_extension(".map"); + if(fs::is_regular_file(mapfile)) return mapfile; + // remove extension and check it is now .map (test for .map.scen) + mapfile.replace_extension(""); + if(mapfile.extension() == ".map" && fs::is_regular_file(mapfile)) + return mapfile; + } + // no clear way to deduce map, return empty path for no success + return {}; +} +/** + * Finds a matching map file to a scenario. + * Take mappath as scenmgr map name. scendir as partent(sfilename), or + * current_working_dir. Returns path in order below: If mappath is absolute + * path: if exists return mappath, else return no path. If scendir/mappath + * exists: return scendir/mappath. If sfilename != '' and replace sfilename ext + * to '.map': if exists return that. If sfilename != '' and remove sfilename + * ext: if new extension is '.map' and exists return that. Return empty path. + */ +std::filesystem::path +find_map_filename( + const std::filesystem::path& mapname, + const std::filesystem::path& sfilename) +{ + namespace fs = std::filesystem; + // scen file has a map name designated. + if(!mapname.empty()) + { + auto mappath = fs::path(mapname); + // absolute path, try to use that only. + if(mappath.is_absolute()) + { + if(fs::is_regular_file(mappath)) { return mappath; } + else { return {}; } + } + // path is relative path + auto spath = !sfilename.empty() ? sfilename.parent_path() + : fs::current_path(); + // check relative path from either sfilename directory or + // current_working_directory + if(auto append_path = spath / mapname; + fs::is_regular_file(append_path)) + { + return append_path; + } + } + // if a scenario filename was presented, try to deduce map from scenario + // filename + if(!sfilename.empty()) + { + // replace extenion with .map + auto mapfile = sfilename; + mapfile.replace_extension(".map"); + if(fs::is_regular_file(mapfile)) return mapfile; + // remove extension and check it is now .map (test for .map.scen) + mapfile.replace_extension(""); + if(mapfile.extension() == ".map" && fs::is_regular_file(mapfile)) + return mapfile; + } + // no clear way to deduce map, return empty path for no success + return {}; +} + +} // namespace warthog::scenario diff --git a/src/scenario/scenario_runner.cpp b/src/scenario/scenario_runner.cpp new file mode 100644 index 0000000..45d28e5 --- /dev/null +++ b/src/scenario/scenario_runner.cpp @@ -0,0 +1,258 @@ +#include + +#include +#include + +#include +#include + +namespace warthog::scenario +{ + +scenario_runner::scenario_runner() = default; + +scenario_runner::scenario_runner(const scenario_manager* scen) + : scenario_(scen) +{ } + +scenario_runner::~scenario_runner() = default; + +std::pair +scenario_runner::experiment_next(uint32_t count, bool progress) +{ + assert(scenario_ != nullptr); + auto commands = scenario_->get_commands(); + patches_.clear(); // reset patches + if(count == 0) return {nullptr, 0}; + int patch_count = 0; + while(command_at_ < commands.size()) + { + auto cmd = commands[command_at_]; + // command_at_ incremented in following fuction calls + switch(cmd.type) + { + case scenario_command::SNAPSHOT: + case scenario_command::PATCH: + patch_count += snapshot_patches(false); + break; + case scenario_command::INST: + if(const experiment* inst + = snapshot_inst(count > 1 ? true : progress); + inst != nullptr) + { + if(--count == 0) return {inst, patch_count}; + } + break; + default: + // should never be reached + ++command_at_; + WARTHOG_GDEBUG( + "scenario_runner::experiment_next invalid command " + "type in " WARTHOG_FILENAME_LINE); + } + // exits loop + } + // no more experiments + return {nullptr, patch_count}; +} + +void +scenario_runner::clear() +{ + restart(); + scenario_ = nullptr; +} + +void +scenario_runner::restart() +{ + patches_.clear(); + experiments_.clear(); + command_at_ = 0; + experiment_at_ = -1; + snapshot_at_ = -1; +} + +int +scenario_runner::snapshot_next(bool clear_patch) +{ + assert(scenario_ != nullptr); + auto commands = scenario_->get_commands(); + if(clear_patch) patches_.clear(); + while(command_at_ < commands.size()) + { + auto cmd = commands[command_at_]; + switch(cmd.type) + { + case scenario_command::SNAPSHOT: + if(cmd.id != snapshot_at_) + { + // at new snapshot, return + snapshot_at_ = cmd.id; + return snapshot_at_; + } + // current snapshot, goto next snapshot + [[fallthrough]]; + case scenario_command::INST: + command_at_ += 1; + experiment_at_ += 1; + break; + case scenario_command::PATCH: + snapshot_patches(false); + // snapshot_patches increments snapshot_at_ + break; + default: + WARTHOG_GDEBUG( + "scenario_runner::snapshot_next invalid command " + "type in " WARTHOG_FILENAME_LINE); + } + } + return false; +} + +int +scenario_runner::snapshot_patches(bool clear_patch) +{ + assert(scenario_ != nullptr); + auto commands = scenario_->get_commands(); + if(clear_patch) patches_.clear(); + int count = 0; + // if start of snapshot, apply that snapshot patches + if(command_at_ < commands.size() + && commands[command_at_].type == scenario_command::SNAPSHOT) + { + snapshot_at_ = commands[command_at_].id; + command_at_ += 1; + } + // while command_at_ is PATCH, add patch to applied list + while(command_at_ < commands.size()) + { + if(auto cmd = commands[command_at_]; + cmd.type == scenario_command::PATCH) + { + command_at_ += 1; + count += 1; + patches_.push_back( + {cmd.id, cmd.cmd.patch.topleft_x, cmd.cmd.patch.topleft_y}); + } + else { break; } + } + // end at first non-PATCH command + return count; +} + +const experiment* +scenario_runner::snapshot_inst(bool progress) +{ + assert(scenario_ != nullptr); + auto commands = scenario_->get_commands(); + if(command_at_ >= commands.size()) return nullptr; + auto cmd = commands[command_at_]; + if(cmd.type != scenario_command::INST) return nullptr; + int32_t exp_at = experiment_at_ + 1; + if(progress) + { + command_at_ += 1; + experiment_at_ += 1; + } + if(cmd.cmd.inst.experiment_id >= scenario_->num_experiments() + || cmd.cmd.inst.experiment_id != (uint32_t)exp_at) + { + WARTHOG_GERROR_FMT( + "scenario_runner::snapshot_inst invalid experiment_id {} to " + "experiment, expected {} (max {}) in {}", + cmd.cmd.inst.experiment_id, exp_at, scenario_->num_experiments(), + WARTHOG_FILENAME_LINE); + return nullptr; + } + return scenario_->get_experiment(cmd.cmd.inst.experiment_id); +} + +std::span +scenario_runner::snapshot_inst_all() +{ + assert(scenario_ != nullptr); + experiments_.clear(); + auto commands = scenario_->get_commands(); + auto exp = scenario_->get_experiments(); + while(command_at_ < commands.size()) + { + auto cmd = commands[command_at_]; + if(cmd.type != scenario_command::INST) break; + if(cmd.cmd.inst.experiment_id >= exp.size() + || cmd.cmd.inst.experiment_id != (uint32_t)experiment_at_) + { + WARTHOG_GERROR_FMT( + "scenario_runner::snapshot_inst_all invalid experiment_id {} " + "to experiment, expected {} (max {}) in {}", + cmd.cmd.inst.experiment_id, experiment_at_, exp.size(), + WARTHOG_FILENAME_LINE); + return {}; + } + experiments_.push_back(exp[cmd.cmd.inst.experiment_id]); + command_at_ += 1; + experiment_at_ += 1; + } + return experiments_; +} + +bool +scenario_runner::gridmap_init( + domain::gridmap& grid, const grid_patch_set& patch_set, bool setup_grid) +{ + if(setup_grid) + { + grid.setup( + scenario_->get_scenario_height(), scenario_->get_scenario_width()); + // grid is 0 (non-traversable), make map area traversable but keep + // padding non-traversable + for(uint32_t y = 0, ye = grid.header_height(), + xe = grid.header_width(); + y < ye; ++y) + { + pad_id row_id = grid.to_padded_id_from_unpadded(0, y); + for(uint32_t x = 0; x < xe; ++x, ++row_id.id) + { + grid.set_label(row_id, true); + } + } + } + restart(); + snapshot_patches(); + return gridmap_apply_patches(grid, patch_set) >= 0; +} +int +scenario_runner::gridmap_apply_patches( + domain::gridmap& grid, const grid_patch_set& patch_set) +{ + int count = 0; + for(auto& P : patches_) + { + ++count; + if(P.patch_id >= patch_set.size()) return -count; + uint32_t x, y; + grid.to_padded_xy_from_unpadded(P.topleft_x, P.topleft_y, x, y); + if(!girdmap_apply_patch(grid, patch_set.get_patch(P.patch_id), x, y)) + { + return -count; + } + } + return count; +} +bool +scenario_runner::girdmap_apply_patch( + domain::gridmap& grid, domain::gridmap::bittable patch, uint32_t padded_x, + uint32_t padded_y) +{ + if((uint64_t)padded_x + patch.width() >= (uint64_t)grid.width() + || (uint64_t)padded_y + patch.height() >= (uint64_t)grid.height()) + return false; + + // apply patch + patch.copy( + grid, grid.to_padded_id_from_padded(padded_x, padded_y), + pad_id::zero(), patch.width(), patch.height()); + return true; +} + +} // namespace warthog::scenario diff --git a/src/search/gridmap_expansion_policy.cpp b/src/search/gridmap_expansion_policy.cpp index f60470b..676e2ed 100644 --- a/src/search/gridmap_expansion_policy.cpp +++ b/src/search/gridmap_expansion_policy.cpp @@ -1,4 +1,5 @@ #include + #include #include diff --git a/src/search/problem_instance.cpp b/src/search/problem_instance.cpp index 2239a7f..602f767 100644 --- a/src/search/problem_instance.cpp +++ b/src/search/problem_instance.cpp @@ -1,7 +1,10 @@ #include +namespace warthog::search +{ + std::ostream& -operator<<(std::ostream& str, const warthog::search::problem_instance& pi) +operator<<(std::ostream& str, const problem_instance& pi) { pi.print(str); @@ -9,10 +12,11 @@ operator<<(std::ostream& str, const warthog::search::problem_instance& pi) } std::ostream& -operator<<( - std::ostream& str, const warthog::search::search_problem_instance& pi) +operator<<(std::ostream& str, const search_problem_instance& pi) { pi.print(str); return str; } + +} diff --git a/src/search/search_metrics.cpp b/src/search/search_metrics.cpp index a2a9fb7..64ed2d2 100644 --- a/src/search/search_metrics.cpp +++ b/src/search/search_metrics.cpp @@ -1,5 +1,8 @@ #include +namespace warthog::search +{ + std::ostream& operator<<(std::ostream& str, const warthog::search::search_metrics& met) { @@ -11,3 +14,5 @@ operator<<(std::ostream& str, const warthog::search::search_metrics& met) << " lb=" << met.lb_ << " ub=" << met.ub_; return str; } + +} diff --git a/src/search/search_node.cpp b/src/search/search_node.cpp index 4e90feb..cae2985 100644 --- a/src/search/search_node.cpp +++ b/src/search/search_node.cpp @@ -1,6 +1,18 @@ #include -unsigned int warthog::search::search_node::refcount_ = 0; +namespace warthog::search +{ + +void +search_node::print(std::ostream& out) const +{ + out << "search_node id:" << get_id().id; + out << " p_id: "; + out << parent_id_.id; + out << " g: " << g_ << " f: " << this->get_f() << " ub: " << ub_ + << " expanded: " << get_expanded() << " " + << " search_number_: " << search_number_; +} std::ostream& operator<<(std::ostream& str, const warthog::search::search_node& sn) @@ -9,3 +21,5 @@ operator<<(std::ostream& str, const warthog::search::search_node& sn) return str; } + +} // namespace warthog::search diff --git a/src/search/vl_gridmap_expansion_policy.cpp b/src/search/vl_gridmap_expansion_policy.cpp index e8750c4..0a7945d 100644 --- a/src/search/vl_gridmap_expansion_policy.cpp +++ b/src/search/vl_gridmap_expansion_policy.cpp @@ -1,5 +1,6 @@ -#include #include + +#include #include namespace warthog::search diff --git a/src/util/cost_table.cpp b/src/util/cost_table.cpp index 7ca626b..b180135 100644 --- a/src/util/cost_table.cpp +++ b/src/util/cost_table.cpp @@ -1,6 +1,9 @@ #include +#include + #include +#include namespace warthog::util { @@ -10,10 +13,8 @@ cost_table::cost_table(const char* filename) : cost_table() std::ifstream file(filename, std::fstream::in); if(!file.is_open()) { - std::cerr << "err; cost_table::cost_table " - "cannot open costs file: " - << filename << std::endl; - exit(1); + WARTHOG_GERROR_FMT("cost_table cannot open costs file {}", filename); + throw std::runtime_error("cost_table"); } while(!file.eof()) @@ -23,25 +24,22 @@ cost_table::cost_table(const char* filename) : cost_table() file >> terrain >> cost; if(!file.good()) { - std::cerr << "err; cost_table::cost_table " - "failed to parse cost for terrain `" - << terrain << "`" << std::endl; - exit(1); + WARTHOG_GERROR_FMT( + "cost_table failed to parse cost for terrain `{}`", terrain); + throw std::runtime_error("cost_table"); } if(costs_[terrain] == costs_[terrain]) { - std::cerr - << "err; cost_table::cost_table " - "costs file contains multiple definitions for terrain `" - << terrain << "`" << std::endl; - exit(1); + WARTHOG_GERROR_FMT( + "cost_table multiple definitions for terrain `{}`", terrain); + throw std::runtime_error("cost_table"); } if(cost < 0.0) { - std::cerr << "err; cost_table::cost_table " - "costs file specifies a negative cost for terrain `" - << terrain << "`" << std::endl; - exit(1); + WARTHOG_GERROR_FMT( + "cost_table has negative cost for terrain `{}` at {}", terrain, + cost); + throw std::runtime_error("cost_table"); } costs_[terrain] = cost; file >> std::ws; @@ -56,7 +54,7 @@ cost_table::cost_table(const char* filename) : cost_table() cost_t cost_table::lowest_cost(domain::vl_gridmap& map) { - warthog::cost_t lowest = INFINITY; + warthog::cost_t lowest = std::numeric_limits::infinity(); for(uint32_t id = 0; id < map.width() * map.height(); id++) { auto cost = costs_[map.get_label(id)]; diff --git a/src/util/dimacs_parser.cpp b/src/util/dimacs_parser.cpp index 51eb8b5..75b0f64 100644 --- a/src/util/dimacs_parser.cpp +++ b/src/util/dimacs_parser.cpp @@ -1,6 +1,7 @@ -#include #include +#include + #include #include #include diff --git a/src/util/experiment.cpp b/src/util/experiment.cpp deleted file mode 100644 index 25b0fb4..0000000 --- a/src/util/experiment.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include - -#include - -namespace warthog::util -{ - -void -experiment::print(std::ostream& out) -{ - out << this->map() << "\t"; - out << this->mapwidth() << "\t"; - out << this->mapheight() << "\t"; - out << this->startx() << "\t"; - out << this->starty() << "\t"; - out << this->goalx() << "\t"; - out << this->goaly() << "\t"; - out << std::fixed << std::setprecision((int)this->precision()); - out << this->distance(); -} - -} // namespace warthog::util diff --git a/src/util/file_utils.cpp b/src/util/file_utils.cpp deleted file mode 100644 index 1944804..0000000 --- a/src/util/file_utils.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * file_utils.cpp - * - * Created on: Oct 1, 2018 - * Author: koldar - */ - -#include -#include -#include -#include -#include - -namespace warthog::util -{ - -namespace -{ -const char* -getBaseName_aux(const char* filepath) -{ - if(filepath == nullptr) return nullptr; - const char* name_start = filepath; - for(const char* p = filepath; *p != '\0'; ++p) - { - if(*p == '/' || *p == '\\') name_start = p + 1; - } - return name_start; -} -} - -size_t -getBytesOfFile(const std::string& name) -{ - return std::filesystem::file_size(name); -} - -bool -isFileExists(const std::string& name) -{ - return std::filesystem::exists(name); -} - -std::string -getBaseNameAsString(const std::string& filepath) -{ - return getBaseName_aux(filepath.c_str()); -} - -std::string -getBaseNameAsString(const char* filepath) -{ - return getBaseName_aux(filepath); -} - -const char* -getBaseName(const std::string& filepath) -{ - return getBaseName_aux(filepath.c_str()); -} - -const char* -getBaseName(const char* filepath) -{ - return getBaseName_aux(filepath); -} - -} // namespace warthog::util diff --git a/src/util/gm_parser.cpp b/src/util/gm_parser.cpp deleted file mode 100644 index cbec14c..0000000 --- a/src/util/gm_parser.cpp +++ /dev/null @@ -1,129 +0,0 @@ -#include - -#include -#include - -namespace warthog::util -{ - -gm_parser::gm_parser(const char* filename) -{ - std::fstream mapfs(filename, std::fstream::in); - if(!mapfs.is_open()) - { - std::cerr << "err; gm_parser::gm_parser " - "cannot open map file: " - << filename << std::endl; - exit(1); - } - - this->parse_header(mapfs); - this->parse_map(mapfs); - mapfs.close(); -} - -gm_parser::~gm_parser() { } - -void -gm_parser::parse_header(std::fstream& mapfs) -{ - // read header fields - std::unordered_map contents; - for(int i = 0; i < 3; i++) - { - std::string hfield, hvalue; - mapfs >> hfield; - if(mapfs.good()) - { - mapfs >> hvalue; - if(mapfs.good()) { contents[hfield] = hvalue; } - else - { - std::cerr << "err; map load failed. could not read header." - << hfield << std::endl; - exit(1); - } - } - else - { - std::cerr << "err; map load failed. format looks wrong." - << std::endl; - exit(1); - } - } - - this->header_.type_ = contents[std::string("type")]; - if(this->header_.type_.compare("octile") != 0) - { - std::cerr << "err; map type " << this->header_.type_ - << "is unknown. known types: octile " << std::endl; - ; - exit(1); - } - - this->header_.height_ - = (uint32_t)atoi(contents[std::string("height")].c_str()); - if(this->header_.height_ == 0) - { - std::cerr << "err; map file specifies invalid height. " << std::endl; - exit(1); - } - - this->header_.width_ - = (uint32_t)atoi(contents[std::string("width")].c_str()); - if(this->header_.width_ == 0) - { - std::cerr << "err; map file specifies invalid width. " << std::endl; - exit(1); - } -} - -void -gm_parser::parse_map(std::fstream& mapfs) -{ - std::string hfield; - mapfs >> hfield; - if(hfield.compare("map") != 0) - { - std::cerr << "err; map load failed. missing 'map' keyword." - << std::endl; - exit(1); - } - - // read map data - uint32_t index = 0; - uint32_t max_tiles = this->header_.height_ * this->header_.width_; - while(true) - { - unsigned char c = (unsigned char)mapfs.get(); - if(!mapfs.good()) - { - // eof - break; - } - - if(c == ' ' || c == '\t' || c == '\n' || c == '\r') - { - // skip whitespace - continue; - } - - if(index >= max_tiles) - { - index++; - continue; - } - - this->map_.push_back(c); - index++; - } - - if(index != max_tiles) - { - std::cerr << "err; expected " << max_tiles << " tiles; read " << index - << " tiles." << std::endl; - exit(1); - } -} - -} // namespace warthog::util diff --git a/src/util/helpers.cpp b/src/util/helpers.cpp index f3c78b2..5132b97 100644 --- a/src/util/helpers.cpp +++ b/src/util/helpers.cpp @@ -1,14 +1,12 @@ +#include + +#include #include #include -#include -#include #include #include #include -#include -#include -#include namespace warthog::util { @@ -52,83 +50,6 @@ load_integer_labels_dimacs(const char* filename, std::vector& labels) return load_integer_labels(filename, labels); } -void* -parallel_compute( - void* (*fn_worker)(void*), void* shared_data, uint32_t task_total) -{ - std::cerr << "parallel compute begin. tasks to process: " << task_total - << "\n"; - if(task_total == 0) { return 0; } - -// OK, let's fork some threads -// TODO: detect cores with std::thread::hardware_concurrency(); -#ifdef SINGLE_THREADED - const uint32_t NUM_THREADS = 1; -#else - const uint32_t NUM_THREADS = (uint32_t)std::thread::hardware_concurrency(); -#endif - - std::vector threads(NUM_THREADS); - std::vector task_data(NUM_THREADS); - - void* (*fn_task_wrapper)(void*) = [](void* in) -> void* { - thread_params* par = (thread_params*)in; - par->thread_finished_ = false; - void* retval = par->fn_worker_(in); - par->thread_finished_ = true; - return retval; - }; - - for(uint32_t i = 0; i < NUM_THREADS; i++) - { - // define workloads - task_data[i].thread_id_ = i; - task_data[i].max_threads_ = NUM_THREADS; - task_data[i].nprocessed_ = 0; - task_data[i].shared_ = shared_data; - task_data[i].fn_worker_ = fn_worker; - - // gogogogo - pthread_create( - &threads[i], NULL, fn_task_wrapper, (void*)&task_data[i]); - } - std::cerr << "forked " << NUM_THREADS << " threads \n"; - - std::cerr << "progress: ["; - for(uint32_t i = 0; i < 100; i++) - { - std::cerr << " "; - } - std::cerr << "]\rprogress: ["; - uint32_t pct_done = 0; - while(true) - { - // check progress - uint32_t nprocessed = 0; - uint32_t nfinished = 0; - for(uint32_t i = 0; i < NUM_THREADS; i++) - { - nprocessed += task_data[i].nprocessed_; - nfinished += task_data[i].thread_finished_; - } - - uint32_t pct_progress = (nprocessed * 100) / task_total; - if(pct_progress > pct_done) - { - for(uint32_t i = 0; i < (pct_progress - pct_done); i++) - { - std::cerr << "="; - } - pct_done = pct_progress; - } - - if(nfinished == NUM_THREADS) { break; } - else { sleep(0.5); } - } - std::cerr << "\nparallel compute; end\n"; - return 0; -} - void value_index_swap_array(std::vector& vec) { diff --git a/src/util/scenario_manager.cpp b/src/util/scenario_manager.cpp deleted file mode 100644 index 7bbaa13..0000000 --- a/src/util/scenario_manager.cpp +++ /dev/null @@ -1,172 +0,0 @@ -#include -#include -#include - -#include -#include - -namespace warthog::util -{ - -scenario_manager::scenario_manager() { } - -scenario_manager::~scenario_manager() -{ - for(unsigned int i = 0; i < experiments_.size(); i++) - { - delete experiments_[i]; - } - experiments_.clear(); -} - -void -scenario_manager::load_scenario(const char* filelocation) -{ - std::ifstream infile; - infile.open(filelocation, std::ios::in); - - if(!infile.good()) - { - std::cerr << "err; scenario_manager::load_scenario " - << "Invalid scenario file: " << filelocation << std::endl; - infile.close(); - exit(1); - } - - sfile_ = filelocation; - - char buf[1024]; - infile.getline(buf, 1024); - if(strstr(buf, "version 1")) - { - // GPPC format scenarios - load_gppc_scenario(infile); - } - else - { - std::cerr << "err; scenario_manager::load_scenario " - << " scenario file not in GPPC format\n"; - infile.close(); - exit(1); - } - infile.close(); -} - -// V1.0 is the version officially supported by HOG -void -scenario_manager::load_gppc_scenario(std::ifstream& infile) -{ - uint32_t sizeX = 0, sizeY = 0; - uint32_t bucket; - std::string map; - uint32_t xs, ys, xg, yg; - std::string dist; - - while(infile >> bucket >> map >> sizeX >> sizeY >> xs >> ys >> xg >> yg - >> dist) - { - double dbl_dist = strtod(dist.c_str(), 0); - experiments_.push_back( - new experiment(xs, ys, xg, yg, sizeX, sizeY, dbl_dist, map)); - - int32_t precision = 0; - if(dist.find(".") != std::string::npos) - { - precision = ((int32_t)dist.size() - (int32_t)(dist.find(".") + 1)); - } - experiments_.back()->set_precision(precision); - } -} - -void -scenario_manager::write_scenario(std::ostream& scenariofile) -{ - - std::cerr << "dumping scenario file..\n"; - if(experiments_.size() == 0) // nothing to write - return; - - // std::ofstream scenariofile; - scenariofile.precision(16); - // scenariofile.open(filelocation, std::ios::out); - scenariofile << "version 1" << std::endl; - - for(unsigned int i = 0; i < experiments_.size(); i++) - { - experiment* cur = experiments_.at(i); - cur->print(scenariofile); - scenariofile << std::endl; - } - // scenariofile.close(); -} - -void -scenario_manager::sort() -{ - for(unsigned int i = 0; i < experiments_.size(); i++) - { - for(unsigned int j = i; j < experiments_.size(); j++) - { - if(experiments_.at(j)->distance() < experiments_.at(i)->distance()) - { - experiment* tmp = experiments_.at(i); - experiments_.at(i) = experiments_.at(j); - experiments_.at(j) = tmp; - } - } - } -} - -/** - * Finds a matching map file to a scenario. - * Take mappath as scenmgr map name. scendir as partent(sfilename), or - * current_working_dir. Returns path in order below: If mappath is absolute - * path: if exists return mappath, else return no path. If scendir/mappath - * exists: return scendir/mappath. If sfilename != '' and replace sfilename ext - * to '.map': if exists return that. If sfilename != '' and remove sfilename - * ext: if new extension is '.map' and exists return that. Return empty path. - */ -std::filesystem::path -find_map_filename( - const scenario_manager& scenmgr, std::filesystem::path sfilename) -{ - namespace fs = std::filesystem; - const auto& mapname = scenmgr.get_experiment(0)->map(); - // scen file has a map name designated. - if(!mapname.empty()) - { - auto mappath = fs::path(mapname); - // absolute path, try to use that only. - if(mappath.is_absolute()) - { - if(fs::is_regular_file(mappath)) { return mappath; } - else { return {}; } - } - // path is relative path - auto spath = !sfilename.empty() ? sfilename.parent_path() - : fs::current_path(); - // check relative path from either sfilename directory or - // current_working_directory - if(auto append_path = spath / mapname; - fs::is_regular_file(append_path)) - { - return append_path; - } - } - // if a scenario filename was presented, try to deduce map from scenario - // filename - if(!sfilename.empty()) - { - // replace extenion with .map - auto mapfile = sfilename.replace_extension(".map"); - if(fs::is_regular_file(mapfile)) return mapfile; - // remove extension and check it is now .map (test for .map.scen) - mapfile = sfilename.replace_extension(""); - if(mapfile.extension() == ".map" && fs::is_regular_file(mapfile)) - return mapfile; - } - // no clear way to deduce map, return empty path for no success - return {}; -} - -} // namespace warthog::util diff --git a/src/util/timer.cpp b/src/util/timer.cpp index 702b7a3..0029b6b 100644 --- a/src/util/timer.cpp +++ b/src/util/timer.cpp @@ -1,6 +1,7 @@ -#include #include +#include + namespace warthog::util { diff --git a/tests/memory/bittable.cxx b/tests/memory/bittable.cxx index 2d7f356..e7272f2 100644 --- a/tests/memory/bittable.cxx +++ b/tests/memory/bittable.cxx @@ -32,7 +32,7 @@ test_bittable_vector(const bt& b, const vec& v) TEMPLATE_TEST_CASE_SIG( "bittable random testing", "[bittable][rng]", ((typename T, size_t B), T, B), (uint8_t, 1), (uint8_t, 2), (uint8_t, 8), - (uint32_t, 1), (uint32_t, 16), (uint64_t, 32), (uint64_t, 64)) + (uint32_t, 1), (uint32_t, 8), (uint64_t, 4), (uint64_t, 8)) { using bittable = warthog::memory::bittable; auto width = GENERATE(1, 128, 1000); diff --git a/tools/update_file.py b/tools/update_file.py deleted file mode 100755 index ab7be9f..0000000 --- a/tools/update_file.py +++ /dev/null @@ -1,166 +0,0 @@ -#!/usr/bin/env python3 - -from pathlib import Path -import re -import sys -import collections as cl -import shutil - -GUARD_PREFIX = '' -root = Path(__file__).resolve().parent.parent -root_inc = root/'include' -root_src = root/'src' - -class SrcFile: - def __init__(self, fname): - self.fname:Path = Path(fname).resolve() - self.relative:Path = None - self.header:bool = False - try: - self.relative = self.fname.relative_to(root_inc) - self.header = True - except ValueError: # not in include directory - self.relative = self.fname.relative_to(root_src) - # will throw if not in include or src directory - self.namespace:tuple[str,...] = self.relative.parts[0:-1] - self.data:list[str]|None = None - self.preamble_end = 0 # the end of any license, is 0 if none - self.blank_file = False - self.lines = 0 - - def load(self): - # loads file into data, trimming blank start/end lines - with open(self.fname) as f: - self.data = list(map(lambda g: g.removesuffix('\n'), f.readlines())) - comment_open = False - for start_line in range(len(self.data)): - line = self.data[start_line].strip() - if comment_open: - if '*/' in line: - comment_open = False - else: - if line.startswith('/*'): - comment_open = True - elif line.startswith('//'): - pass - elif len(line) == 0: - pass - else: # found first non-empty comment line - break - - self.preamble_end = start_line - while len(self.data) > self.preamble_end and len(self.data[-1].strip()) == 0: - del self.data[-1] - self.lines = len(self.data) - self.preamble_end - self.blank_file = self.lines == 0 - -class SrcAlter: - def __init__(self, src:SrcFile): - self.src = src - self.issues:list[str] = [] - - def line_conv(self, line:str, no:int) -> str|None: - raise NotImplemented() - - def issue(self, no:int, message): - print(f'line {no}: {message}', file=sys.stderr) - -class GuardAlter(SrcAlter): - def __init__(self, src:SrcFile): - super().__init__(src) - elem_list = [] - if GUARD_PREFIX is not None and len(GUARD_PREFIX) > 0: - elem_list.append(GUARD_PREFIX) - elem_list.extend( (*src.namespace, src.fname.name.replace('.','_')) ) - self.guard = '_'.join(map(str.upper, elem_list)) - self.has_guard = src.header - - - def line_conv(self, line:str, no:int) -> str|None: - if not self.has_guard: - return None - if no == 0: # header gurad check - if line.rstrip().startswith('#ifndef'): - return f'#ifndef {self.guard}' - else: - self.has_guard = False - self.issue(no, 'missing header guard') - elif no == 1: # define header guard - if line.rstrip().startswith('#define'): - return f'#define {self.guard}' - else: - self.issue(no, 'header guard missing define') - elif no == self.src.lines-1: - if line.rstrip().startswith('#endif'): - return f'#endif // {self.guard}' - else: - self.issue(no, 'header guard not at end of file') - return None - -class IncludeAlter(SrcAlter): - INCLUDE = re.compile('^\\s*#include\\s+["<]([^">]+)[">]\\s*$') - FILES: dict[str,list[Path]]|None = None - - def line_conv(self, line:str, no:int) -> str|None: - line = line.strip() - res = re.fullmatch(IncludeAlter.INCLUDE, line) - if res is None: - return None - if IncludeAlter.FILES is None: - IncludeAlter.gen_files() - fname = Path(res[1]) - includes = IncludeAlter.FILES.get(fname.name, None) - if includes is None: - self.issue(no, f'file {fname.name} not found in include') - return None - if len(includes) > 1: - self.issue(no, f'file {fname.name} has multiple solutions') - return None - if self.src.header: - # header checks if include should be a relative include - try: - relfile = includes[0].relative_to(self.src.relative.parent) - return f'#include "{relfile}"' - except ValueError: - pass - except Exception as e: - self.issue(no, e) - return f'#include <{includes[0]}>' - - @staticmethod - def gen_files(): - lookup = cl.defaultdict(list) - for f in root_inc.rglob('*.*'): - lookup[f.name].append(f.relative_to(root_inc)) - IncludeAlter.FILES = lookup - -def conv_file(file:str, alters: list): - # alters is list of alter constructors - file:Path = Path(file) - src = SrcFile(file) - src.load() - run_alters: list[SrcAlter] = [a(src) for a in alters] - shutil.copyfile(file, file.with_name(f'{file.name}.backup')) - with open(file, 'w', buffering=4096, encoding='utf-8', newline='\n') as output: - def writeln(line:str): - output.write(line + '\n') - end = src.preamble_end - for no in range(0, end): - writeln(src.data[no]) - for no in range(src.lines): - line = src.data[no+end] - for a in run_alters: - new_line = a.line_conv(line, no) - if new_line is not None: - print(f'conv: {line!r} => {new_line!r}') - line = new_line - break - writeln(line) - -def _main(): - for i in range(1, len(sys.argv)): - print(f'file "{sys.argv[i]}"', file=sys.stderr) - conv_file(sys.argv[i], [GuardAlter, IncludeAlter]) - -if __name__ == '__main__': - _main()