From 54255d59f2427c02113db39c028e0f95905035cc Mon Sep 17 00:00:00 2001 From: Sergio Martin Date: Mon, 22 Jan 2024 17:58:58 +0100 Subject: [PATCH] Removing unnecessary library --- extern/phmap/.appveyor_old.yml | 57 - extern/phmap/.gitattributes | 2 - extern/phmap/.github/FUNDING.yml | 1 - extern/phmap/.github/workflows/linux.yml | 25 - extern/phmap/.github/workflows/macos.yml | 25 - extern/phmap/.github/workflows/windows.yml | 25 - extern/phmap/.gitignore | 8 - extern/phmap/CMakeLists.txt | 150 - extern/phmap/LICENSE | 202 - extern/phmap/README.md | 305 - extern/phmap/benchmark/BENCHMARK.md | 16 - extern/phmap/benchmark/Makefile | 63 - extern/phmap/benchmark/bench.cc | 451 - extern/phmap/benchmark/bench.py | 73 - extern/phmap/benchmark/charts-template.html | 135 - extern/phmap/benchmark/js/examples.css | 146 - .../benchmark/js/jquery.canvaswrapper.js | 538 - .../phmap/benchmark/js/jquery.colorhelpers.js | 199 - .../benchmark/js/jquery.flot.axislabels.js | 212 - .../phmap/benchmark/js/jquery.flot.browser.js | 98 - .../benchmark/js/jquery.flot.categories.js | 202 - .../benchmark/js/jquery.flot.composeImages.js | 325 - .../benchmark/js/jquery.flot.crosshair.js | 202 - .../benchmark/js/jquery.flot.drawSeries.js | 604 -- .../benchmark/js/jquery.flot.errorbars.js | 375 - .../benchmark/js/jquery.flot.fillbetween.js | 254 - .../benchmark/js/jquery.flot.flatdata.js | 47 - .../phmap/benchmark/js/jquery.flot.hover.js | 346 - .../phmap/benchmark/js/jquery.flot.image.js | 249 - extern/phmap/benchmark/js/jquery.flot.js | 2785 ----- .../phmap/benchmark/js/jquery.flot.legend.js | 395 - .../phmap/benchmark/js/jquery.flot.logaxis.js | 296 - .../benchmark/js/jquery.flot.navigate.js | 781 -- extern/phmap/benchmark/js/jquery.flot.pie.js | 786 -- .../phmap/benchmark/js/jquery.flot.resize.js | 60 - .../benchmark/js/jquery.flot.saturated.js | 43 - .../benchmark/js/jquery.flot.selection.js | 504 - .../phmap/benchmark/js/jquery.flot.stack.js | 220 - .../phmap/benchmark/js/jquery.flot.symbol.js | 98 - .../benchmark/js/jquery.flot.threshold.js | 143 - extern/phmap/benchmark/js/jquery.flot.time.js | 460 - .../phmap/benchmark/js/jquery.flot.touch.js | 322 - .../benchmark/js/jquery.flot.touchNavigate.js | 340 - .../benchmark/js/jquery.flot.uiConstants.js | 10 - extern/phmap/benchmark/js/jquery.js | 9473 ----------------- .../phmap/benchmark/js/jquery.mousewheel.js | 86 - extern/phmap/benchmark/make_chart_data.py | 151 - extern/phmap/benchmark/martinus/Vagrantfile | 97 - .../phmap/benchmark/results/output_flat_par | 320 - .../benchmark/results/output_flat_par_mutex_4 | 316 - .../benchmark/results/output_flat_par_mutex_5 | 315 - .../benchmark/results/output_mt_par_only | 104 - .../benchmark/results/output_mt_stl_flat_par | 446 - .../results/output_mt_stl_flat_par_run2 | 374 - .../phmap/benchmark/results/output_stl_flat | 225 - .../benchmark/results/output_stl_flat_par | 499 - .../phmap/benchmark/results/output_various_N | 838 -- extern/phmap/cmake/CMakeLists.txt.in | 15 - extern/phmap/cmake/DetectVersion.cmake | 8 - extern/phmap/cmake/DownloadGTest.cmake | 34 - extern/phmap/cmake/helpers.cmake | 60 - extern/phmap/cmake/phmap.cmake | 42 - extern/phmap/css/bootstrap-responsive.min.css | 9 - extern/phmap/css/bootstrap.min.css | 10 - extern/phmap/css/colors.css | 302 - extern/phmap/css/style.css | 271 - extern/phmap/examples/allmaps.cc | 75 - extern/phmap/examples/basic.cc | 23 - extern/phmap/examples/bench.cc | 480 - extern/phmap/examples/btree.cc | 49 - extern/phmap/examples/btree_fwd.h | 6 - extern/phmap/examples/dump_load.cc | 53 - extern/phmap/examples/dump_nested.cc | 88 - extern/phmap/examples/emplace.cc | 166 - extern/phmap/examples/f1.cc | 25 - extern/phmap/examples/f2.cc | 23 - extern/phmap/examples/hash_std.cc | 20 - extern/phmap/examples/hash_std.h | 34 - extern/phmap/examples/hash_value.cc | 20 - extern/phmap/examples/hash_value.h | 28 - extern/phmap/examples/insert_bench.cc | 143 - extern/phmap/examples/knucleotide-input.txt | 171 - extern/phmap/examples/knucleotide-input0.txt | 4171 -------- extern/phmap/examples/knucleotide.cc | 236 - extern/phmap/examples/lazy_emplace_l.cc | 54 - extern/phmap/examples/matt.cc | 139 - extern/phmap/examples/serialize.cc | 204 - extern/phmap/html/Makefile | 48 - .../martinus_mod/InsertManyInt.html | 69 - .../bench_results/martinus_mod/Lookup.html | 84 - .../bench_results/martinus_mod/index2.html | 12 - .../html/css/bootstrap-responsive.min.css | 9 - extern/phmap/html/css/bootstrap.min.css | 10 - extern/phmap/html/css/colors.css | 302 - extern/phmap/html/css/style.css | 271 - extern/phmap/html/diagrams/closed_hashing | 28 - extern/phmap/html/diagrams/closed_hashing.svg | 133 - extern/phmap/html/diagrams/index_computation | 29 - .../phmap/html/diagrams/index_computation.svg | 196 - extern/phmap/html/img/closed_hashing.png | Bin 9074 -> 0 bytes extern/phmap/html/img/flat_mem_usage.gif | Bin 1755 -> 0 bytes extern/phmap/html/img/flat_mem_usage.png | Bin 8657 -> 0 bytes extern/phmap/html/img/flat_par_mutex_4.PNG | Bin 48452 -> 0 bytes extern/phmap/html/img/flat_par_mutex_5.PNG | Bin 48886 -> 0 bytes .../phmap/html/img/flat_par_mutex_5_speed.PNG | Bin 27653 -> 0 bytes .../phmap/html/img/flat_par_mutex_6_speed.PNG | Bin 27852 -> 0 bytes extern/phmap/html/img/flat_par_speed.PNG | Bin 30321 -> 0 bytes extern/phmap/html/img/flat_peak.gif | Bin 1772 -> 0 bytes extern/phmap/html/img/flat_peak.png | Bin 9022 -> 0 bytes .../phmap/html/img/hashtable_benchmarks.PNG | Bin 15260 -> 0 bytes .../phmap/html/img/idx_computation_cost.PNG | Bin 35737 -> 0 bytes extern/phmap/html/img/index_computation.png | Bin 16321 -> 0 bytes extern/phmap/html/img/lock_various_sizes.PNG | Bin 43021 -> 0 bytes .../phmap/html/img/mt_stl_flat_par_both.PNG | Bin 86110 -> 0 bytes .../html/img/mt_stl_flat_par_both_run2.PNG | Bin 63452 -> 0 bytes extern/phmap/html/img/mt_stl_flat_par_mem.PNG | Bin 44876 -> 0 bytes .../html/img/mt_stl_flat_par_mem_run2.PNG | Bin 33233 -> 0 bytes .../img/mt_stl_flat_par_mem_run2_zoomed.PNG | Bin 24740 -> 0 bytes .../html/img/mt_stl_flat_par_mem_zoomed.PNG | Bin 31969 -> 0 bytes .../phmap/html/img/mt_stl_flat_par_speed.PNG | Bin 41915 -> 0 bytes .../html/img/mt_stl_flat_par_speed_run2.PNG | Bin 32369 -> 0 bytes extern/phmap/html/img/no_preselection.PNG | Bin 20066 -> 0 bytes extern/phmap/html/img/node_mem_usage.gif | Bin 2008 -> 0 bytes extern/phmap/html/img/node_mem_usage.png | Bin 9198 -> 0 bytes extern/phmap/html/img/node_peak.gif | Bin 955 -> 0 bytes extern/phmap/html/img/node_peak.png | Bin 5651 -> 0 bytes extern/phmap/html/img/par_align_test.png | Bin 51554 -> 0 bytes extern/phmap/html/img/par_mt_memory.PNG | Bin 26288 -> 0 bytes extern/phmap/html/img/par_mt_speed.PNG | Bin 22958 -> 0 bytes extern/phmap/html/img/parallel_flat_peak.gif | Bin 1810 -> 0 bytes extern/phmap/html/img/parallel_flat_peak.png | Bin 9061 -> 0 bytes extern/phmap/html/img/parallel_node_peak.gif | Bin 1005 -> 0 bytes extern/phmap/html/img/parallel_node_peak.png | Bin 5602 -> 0 bytes extern/phmap/html/img/phash.png | Bin 14738 -> 0 bytes extern/phmap/html/img/phmap_logo.png | Bin 131578 -> 0 bytes extern/phmap/html/img/spp_flat_par_both.png | Bin 62089 -> 0 bytes extern/phmap/html/img/stl_flat_both.PNG | Bin 52927 -> 0 bytes extern/phmap/html/img/stl_flat_mem.PNG | Bin 26242 -> 0 bytes extern/phmap/html/img/stl_flat_par_both.PNG | Bin 84902 -> 0 bytes extern/phmap/html/img/stl_flat_par_mem.PNG | Bin 28894 -> 0 bytes .../html/img/stl_flat_par_mem_zoomed.PNG | Bin 28188 -> 0 bytes extern/phmap/html/img/stl_flat_par_speed.PNG | Bin 32742 -> 0 bytes extern/phmap/html/img/stl_flat_speed.PNG | Bin 24937 -> 0 bytes extern/phmap/html/includes.hs | 65 - extern/phmap/html/latex_macros | 15 - extern/phmap/html/parallel_hashmap.html | 343 - extern/phmap/html/parallel_hashmap.md | 274 - extern/phmap/html/parallel_hashmap.pdf | Bin 356851 -> 0 bytes extern/phmap/html/template.html | 50 - extern/phmap/html/template.latex | 308 - extern/phmap/index.html | 348 - extern/phmap/parallel_hashmap/btree.h | 4050 ------- extern/phmap/parallel_hashmap/conanfile.py | 36 - extern/phmap/parallel_hashmap/meminfo.h | 195 - extern/phmap/parallel_hashmap/phmap.h | 4812 --------- extern/phmap/parallel_hashmap/phmap_base.h | 5171 --------- extern/phmap/parallel_hashmap/phmap_bits.h | 663 -- extern/phmap/parallel_hashmap/phmap_config.h | 771 -- extern/phmap/parallel_hashmap/phmap_dump.h | 260 - .../phmap/parallel_hashmap/phmap_fwd_decl.h | 154 - extern/phmap/parallel_hashmap/phmap_utils.h | 378 - extern/phmap/phmap.natvis | 141 - extern/phmap/phmap_gdb.py | 201 - extern/phmap/phmap_lldb.py | 248 - extern/phmap/tests/btree_test.cc | 2376 ----- extern/phmap/tests/btree_test.h | 490 - extern/phmap/tests/compressed_tuple_test.cc | 201 - extern/phmap/tests/container_memory_test.cc | 193 - extern/phmap/tests/dump_load_test.cc | 65 - extern/phmap/tests/flat_hash_map_test.cc | 286 - extern/phmap/tests/flat_hash_set_test.cc | 133 - extern/phmap/tests/hash_generator_testing.h | 218 - extern/phmap/tests/hash_policy_testing.h | 195 - .../phmap/tests/hash_policy_testing_test.cc | 44 - extern/phmap/tests/hashtable_debug.h | 106 - extern/phmap/tests/node_hash_map_test.cc | 225 - extern/phmap/tests/node_hash_policy_test.cc | 65 - extern/phmap/tests/node_hash_set_test.cc | 110 - .../parallel_flat_hash_map_mutex_test.cc | 12 - .../tests/parallel_flat_hash_map_test.cc | 4 - .../tests/parallel_flat_hash_set_test.cc | 4 - extern/phmap/tests/parallel_hash_map_test.cc | 123 - .../tests/parallel_node_hash_map_test.cc | 4 - .../tests/parallel_node_hash_set_test.cc | 4 - .../tests/raw_hash_set_allocator_test.cc | 428 - extern/phmap/tests/raw_hash_set_test.cc | 1962 ---- extern/phmap/tests/test_instance_tracker.h | 262 - extern/phmap/tests/tracked.h | 78 - .../tests/unordered_map_constructor_test.h | 496 - .../phmap/tests/unordered_map_lookup_test.h | 123 - .../phmap/tests/unordered_map_members_test.h | 95 - .../tests/unordered_map_modifiers_test.h | 281 - .../tests/unordered_set_constructor_test.h | 493 - .../phmap/tests/unordered_set_lookup_test.h | 89 - .../phmap/tests/unordered_set_members_test.h | 83 - .../tests/unordered_set_modifiers_test.h | 188 - 196 files changed, 61891 deletions(-) delete mode 100644 extern/phmap/.appveyor_old.yml delete mode 100644 extern/phmap/.gitattributes delete mode 100644 extern/phmap/.github/FUNDING.yml delete mode 100644 extern/phmap/.github/workflows/linux.yml delete mode 100644 extern/phmap/.github/workflows/macos.yml delete mode 100644 extern/phmap/.github/workflows/windows.yml delete mode 100644 extern/phmap/.gitignore delete mode 100644 extern/phmap/CMakeLists.txt delete mode 100644 extern/phmap/LICENSE delete mode 100644 extern/phmap/README.md delete mode 100644 extern/phmap/benchmark/BENCHMARK.md delete mode 100644 extern/phmap/benchmark/Makefile delete mode 100644 extern/phmap/benchmark/bench.cc delete mode 100644 extern/phmap/benchmark/bench.py delete mode 100644 extern/phmap/benchmark/charts-template.html delete mode 100644 extern/phmap/benchmark/js/examples.css delete mode 100644 extern/phmap/benchmark/js/jquery.canvaswrapper.js delete mode 100644 extern/phmap/benchmark/js/jquery.colorhelpers.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.axislabels.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.browser.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.categories.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.composeImages.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.crosshair.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.drawSeries.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.errorbars.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.fillbetween.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.flatdata.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.hover.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.image.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.legend.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.logaxis.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.navigate.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.pie.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.resize.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.saturated.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.selection.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.stack.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.symbol.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.threshold.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.time.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.touch.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.touchNavigate.js delete mode 100644 extern/phmap/benchmark/js/jquery.flot.uiConstants.js delete mode 100644 extern/phmap/benchmark/js/jquery.js delete mode 100644 extern/phmap/benchmark/js/jquery.mousewheel.js delete mode 100644 extern/phmap/benchmark/make_chart_data.py delete mode 100644 extern/phmap/benchmark/martinus/Vagrantfile delete mode 100644 extern/phmap/benchmark/results/output_flat_par delete mode 100644 extern/phmap/benchmark/results/output_flat_par_mutex_4 delete mode 100644 extern/phmap/benchmark/results/output_flat_par_mutex_5 delete mode 100644 extern/phmap/benchmark/results/output_mt_par_only delete mode 100644 extern/phmap/benchmark/results/output_mt_stl_flat_par delete mode 100644 extern/phmap/benchmark/results/output_mt_stl_flat_par_run2 delete mode 100644 extern/phmap/benchmark/results/output_stl_flat delete mode 100644 extern/phmap/benchmark/results/output_stl_flat_par delete mode 100644 extern/phmap/benchmark/results/output_various_N delete mode 100644 extern/phmap/cmake/CMakeLists.txt.in delete mode 100644 extern/phmap/cmake/DetectVersion.cmake delete mode 100644 extern/phmap/cmake/DownloadGTest.cmake delete mode 100644 extern/phmap/cmake/helpers.cmake delete mode 100644 extern/phmap/cmake/phmap.cmake delete mode 100644 extern/phmap/css/bootstrap-responsive.min.css delete mode 100644 extern/phmap/css/bootstrap.min.css delete mode 100644 extern/phmap/css/colors.css delete mode 100644 extern/phmap/css/style.css delete mode 100644 extern/phmap/examples/allmaps.cc delete mode 100644 extern/phmap/examples/basic.cc delete mode 100644 extern/phmap/examples/bench.cc delete mode 100644 extern/phmap/examples/btree.cc delete mode 100644 extern/phmap/examples/btree_fwd.h delete mode 100644 extern/phmap/examples/dump_load.cc delete mode 100644 extern/phmap/examples/dump_nested.cc delete mode 100644 extern/phmap/examples/emplace.cc delete mode 100644 extern/phmap/examples/f1.cc delete mode 100644 extern/phmap/examples/f2.cc delete mode 100644 extern/phmap/examples/hash_std.cc delete mode 100644 extern/phmap/examples/hash_std.h delete mode 100644 extern/phmap/examples/hash_value.cc delete mode 100644 extern/phmap/examples/hash_value.h delete mode 100644 extern/phmap/examples/insert_bench.cc delete mode 100644 extern/phmap/examples/knucleotide-input.txt delete mode 100644 extern/phmap/examples/knucleotide-input0.txt delete mode 100644 extern/phmap/examples/knucleotide.cc delete mode 100644 extern/phmap/examples/lazy_emplace_l.cc delete mode 100644 extern/phmap/examples/matt.cc delete mode 100644 extern/phmap/examples/serialize.cc delete mode 100644 extern/phmap/html/Makefile delete mode 100644 extern/phmap/html/bench_results/martinus_mod/InsertManyInt.html delete mode 100644 extern/phmap/html/bench_results/martinus_mod/Lookup.html delete mode 100644 extern/phmap/html/bench_results/martinus_mod/index2.html delete mode 100644 extern/phmap/html/css/bootstrap-responsive.min.css delete mode 100644 extern/phmap/html/css/bootstrap.min.css delete mode 100644 extern/phmap/html/css/colors.css delete mode 100644 extern/phmap/html/css/style.css delete mode 100644 extern/phmap/html/diagrams/closed_hashing delete mode 100644 extern/phmap/html/diagrams/closed_hashing.svg delete mode 100644 extern/phmap/html/diagrams/index_computation delete mode 100644 extern/phmap/html/diagrams/index_computation.svg delete mode 100644 extern/phmap/html/img/closed_hashing.png delete mode 100644 extern/phmap/html/img/flat_mem_usage.gif delete mode 100644 extern/phmap/html/img/flat_mem_usage.png delete mode 100644 extern/phmap/html/img/flat_par_mutex_4.PNG delete mode 100644 extern/phmap/html/img/flat_par_mutex_5.PNG delete mode 100644 extern/phmap/html/img/flat_par_mutex_5_speed.PNG delete mode 100644 extern/phmap/html/img/flat_par_mutex_6_speed.PNG delete mode 100644 extern/phmap/html/img/flat_par_speed.PNG delete mode 100644 extern/phmap/html/img/flat_peak.gif delete mode 100644 extern/phmap/html/img/flat_peak.png delete mode 100644 extern/phmap/html/img/hashtable_benchmarks.PNG delete mode 100644 extern/phmap/html/img/idx_computation_cost.PNG delete mode 100644 extern/phmap/html/img/index_computation.png delete mode 100644 extern/phmap/html/img/lock_various_sizes.PNG delete mode 100644 extern/phmap/html/img/mt_stl_flat_par_both.PNG delete mode 100644 extern/phmap/html/img/mt_stl_flat_par_both_run2.PNG delete mode 100644 extern/phmap/html/img/mt_stl_flat_par_mem.PNG delete mode 100644 extern/phmap/html/img/mt_stl_flat_par_mem_run2.PNG delete mode 100644 extern/phmap/html/img/mt_stl_flat_par_mem_run2_zoomed.PNG delete mode 100644 extern/phmap/html/img/mt_stl_flat_par_mem_zoomed.PNG delete mode 100644 extern/phmap/html/img/mt_stl_flat_par_speed.PNG delete mode 100644 extern/phmap/html/img/mt_stl_flat_par_speed_run2.PNG delete mode 100644 extern/phmap/html/img/no_preselection.PNG delete mode 100644 extern/phmap/html/img/node_mem_usage.gif delete mode 100644 extern/phmap/html/img/node_mem_usage.png delete mode 100644 extern/phmap/html/img/node_peak.gif delete mode 100644 extern/phmap/html/img/node_peak.png delete mode 100644 extern/phmap/html/img/par_align_test.png delete mode 100644 extern/phmap/html/img/par_mt_memory.PNG delete mode 100644 extern/phmap/html/img/par_mt_speed.PNG delete mode 100644 extern/phmap/html/img/parallel_flat_peak.gif delete mode 100644 extern/phmap/html/img/parallel_flat_peak.png delete mode 100644 extern/phmap/html/img/parallel_node_peak.gif delete mode 100644 extern/phmap/html/img/parallel_node_peak.png delete mode 100644 extern/phmap/html/img/phash.png delete mode 100644 extern/phmap/html/img/phmap_logo.png delete mode 100644 extern/phmap/html/img/spp_flat_par_both.png delete mode 100644 extern/phmap/html/img/stl_flat_both.PNG delete mode 100644 extern/phmap/html/img/stl_flat_mem.PNG delete mode 100644 extern/phmap/html/img/stl_flat_par_both.PNG delete mode 100644 extern/phmap/html/img/stl_flat_par_mem.PNG delete mode 100644 extern/phmap/html/img/stl_flat_par_mem_zoomed.PNG delete mode 100644 extern/phmap/html/img/stl_flat_par_speed.PNG delete mode 100644 extern/phmap/html/img/stl_flat_speed.PNG delete mode 100644 extern/phmap/html/includes.hs delete mode 100644 extern/phmap/html/latex_macros delete mode 100644 extern/phmap/html/parallel_hashmap.html delete mode 100644 extern/phmap/html/parallel_hashmap.md delete mode 100644 extern/phmap/html/parallel_hashmap.pdf delete mode 100644 extern/phmap/html/template.html delete mode 100644 extern/phmap/html/template.latex delete mode 100644 extern/phmap/index.html delete mode 100644 extern/phmap/parallel_hashmap/btree.h delete mode 100644 extern/phmap/parallel_hashmap/conanfile.py delete mode 100644 extern/phmap/parallel_hashmap/meminfo.h delete mode 100644 extern/phmap/parallel_hashmap/phmap.h delete mode 100644 extern/phmap/parallel_hashmap/phmap_base.h delete mode 100644 extern/phmap/parallel_hashmap/phmap_bits.h delete mode 100644 extern/phmap/parallel_hashmap/phmap_config.h delete mode 100644 extern/phmap/parallel_hashmap/phmap_dump.h delete mode 100644 extern/phmap/parallel_hashmap/phmap_fwd_decl.h delete mode 100644 extern/phmap/parallel_hashmap/phmap_utils.h delete mode 100644 extern/phmap/phmap.natvis delete mode 100644 extern/phmap/phmap_gdb.py delete mode 100755 extern/phmap/phmap_lldb.py delete mode 100644 extern/phmap/tests/btree_test.cc delete mode 100644 extern/phmap/tests/btree_test.h delete mode 100644 extern/phmap/tests/compressed_tuple_test.cc delete mode 100644 extern/phmap/tests/container_memory_test.cc delete mode 100644 extern/phmap/tests/dump_load_test.cc delete mode 100644 extern/phmap/tests/flat_hash_map_test.cc delete mode 100644 extern/phmap/tests/flat_hash_set_test.cc delete mode 100644 extern/phmap/tests/hash_generator_testing.h delete mode 100644 extern/phmap/tests/hash_policy_testing.h delete mode 100644 extern/phmap/tests/hash_policy_testing_test.cc delete mode 100644 extern/phmap/tests/hashtable_debug.h delete mode 100644 extern/phmap/tests/node_hash_map_test.cc delete mode 100644 extern/phmap/tests/node_hash_policy_test.cc delete mode 100644 extern/phmap/tests/node_hash_set_test.cc delete mode 100644 extern/phmap/tests/parallel_flat_hash_map_mutex_test.cc delete mode 100644 extern/phmap/tests/parallel_flat_hash_map_test.cc delete mode 100644 extern/phmap/tests/parallel_flat_hash_set_test.cc delete mode 100644 extern/phmap/tests/parallel_hash_map_test.cc delete mode 100644 extern/phmap/tests/parallel_node_hash_map_test.cc delete mode 100644 extern/phmap/tests/parallel_node_hash_set_test.cc delete mode 100644 extern/phmap/tests/raw_hash_set_allocator_test.cc delete mode 100644 extern/phmap/tests/raw_hash_set_test.cc delete mode 100644 extern/phmap/tests/test_instance_tracker.h delete mode 100644 extern/phmap/tests/tracked.h delete mode 100644 extern/phmap/tests/unordered_map_constructor_test.h delete mode 100644 extern/phmap/tests/unordered_map_lookup_test.h delete mode 100644 extern/phmap/tests/unordered_map_members_test.h delete mode 100644 extern/phmap/tests/unordered_map_modifiers_test.h delete mode 100644 extern/phmap/tests/unordered_set_constructor_test.h delete mode 100644 extern/phmap/tests/unordered_set_lookup_test.h delete mode 100644 extern/phmap/tests/unordered_set_members_test.h delete mode 100644 extern/phmap/tests/unordered_set_modifiers_test.h diff --git a/extern/phmap/.appveyor_old.yml b/extern/phmap/.appveyor_old.yml deleted file mode 100644 index c9b9286..0000000 --- a/extern/phmap/.appveyor_old.yml +++ /dev/null @@ -1,57 +0,0 @@ -# Use the Appveyor build number for naming the build. -# src: https://www.appveyor.com/docs/build-configuration/#build-versioning -version: '{Windows}' -# see https://www.appveyor.com/docs/how-to/repository-shallow-clone/ -shallow_clone: true - -platform: x64 - -environment: - matrix: -# CMake - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - VS: 2017 - CONFIG: Release - TEST: OFF - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - VS: 2017 - CONFIG: Release - TEST: ON - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 - VS: 2017 - CONFIG: Debug - TEST: ON - - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - VS: 2015 - CONFIG: Release - TEST: OFF - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - VS: 2015 - CONFIG: Release - TEST: ON - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - VS: 2015 - CONFIG: Debug - TEST: ON - -matrix: - fast_finish: false - -before_build: - # see https://www.appveyor.com/docs/lang/cpp/#visual-studio-2017 - - if "%VS%"=="2017" call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" - - if "%VS%"=="2017" set CMAKE_GENERATOR="Visual Studio 15 2017 Win64" - # see https://www.appveyor.com/docs/lang/cpp/#visual-studio-2015 - - if "%VS%"=="2015" call "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64 - - if "%VS%"=="2015" call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64 - - if "%VS%"=="2015" set CMAKE_GENERATOR="Visual Studio 14 2015 Win64" - -build_script: - - cmake --version - - cmake -H. -Bbuild -DPHMAP_BUILD_TESTS=%TEST% -DPHMAP_BUILD_EXAMPLES=%TEST% -G %CMAKE_GENERATOR% - - cmake --build build --config %CONFIG% --target ALL_BUILD -- /maxcpucount - -test_script: - - if "%TEST%"=="ON" set CTEST_OUTPUT_ON_FAILURE=1 - - if "%TEST%"=="ON" cmake --build build --config %CONFIG% --target RUN_TESTS diff --git a/extern/phmap/.gitattributes b/extern/phmap/.gitattributes deleted file mode 100644 index 3f8c819..0000000 --- a/extern/phmap/.gitattributes +++ /dev/null @@ -1,2 +0,0 @@ -* linguist-vendored -*.cc linguist-vendored=false diff --git a/extern/phmap/.github/FUNDING.yml b/extern/phmap/.github/FUNDING.yml deleted file mode 100644 index 24008d5..0000000 --- a/extern/phmap/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -github: greg7mdp diff --git a/extern/phmap/.github/workflows/linux.yml b/extern/phmap/.github/workflows/linux.yml deleted file mode 100644 index 86a472a..0000000 --- a/extern/phmap/.github/workflows/linux.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Linux - -on: - push: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest] - compiler: [g++, clang++] - flags: [-std=c++11, -std=c++17] - optimize: [-O2] - steps: - - name: Checkout - uses: actions/checkout@v2.0.0 - - name: Build and test - env: - CXX: ${{ matrix.compiler }} - CXXFLAGS: ${{ matrix.flags }} ${{ matrix.optimize }} - run: | - mkdir build && cd build && cmake -DPHMAP_BUILD_TESTS=ON -DPHMAP_BUILD_EXAMPLES=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCMAKE_BUILD_TYPE=Release .. && cmake --build . && make test diff --git a/extern/phmap/.github/workflows/macos.yml b/extern/phmap/.github/workflows/macos.yml deleted file mode 100644 index c20934b..0000000 --- a/extern/phmap/.github/workflows/macos.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: MacOS - -on: - push: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [macos-latest] - compiler: [g++, clang++] - flags: [-std=c++11, -std=c++17] - optimize: [-O2] - steps: - - name: Checkout - uses: actions/checkout@v2.0.0 - - name: Build and test - env: - CXX: ${{ matrix.compiler }} - CXXFLAGS: ${{ matrix.flags }} ${{ matrix.optimize }} - run: | - mkdir build && cd build && cmake -DPHMAP_BUILD_TESTS=ON -DPHMAP_BUILD_EXAMPLES=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCMAKE_BUILD_TYPE=Release .. && cmake --build . && make test diff --git a/extern/phmap/.github/workflows/windows.yml b/extern/phmap/.github/workflows/windows.yml deleted file mode 100644 index 0fb07f7..0000000 --- a/extern/phmap/.github/workflows/windows.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Windows - -on: - push: - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [windows-latest] - flags: ["/std:c++11", "/std:c++latest"] - optimize: [/O2] - steps: - - name: Checkout - uses: actions/checkout@v2.0.0 - - name: Build and test - env: - CXX: ${{ matrix.compiler }} - CXXFLAGS: ${{ matrix.flags }} ${{ matrix.optimize }} - CTEST_OUTPUT_ON_FAILURE: 1 - run: | - cmake -Bbuild -DPHMAP_BUILD_TESTS=ON -DPHMAP_BUILD_EXAMPLES=ON -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON -DCMAKE_BUILD_TYPE=Release && cmake --build build --target ALL_BUILD && cmake --build build --target RUN_TESTS diff --git a/extern/phmap/.gitignore b/extern/phmap/.gitignore deleted file mode 100644 index b208e24..0000000 --- a/extern/phmap/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -VagrantFile -benchmark/build -benchmark/output -benchmark/charts.html -build* -.vagrant -**/.vscode -TAGS diff --git a/extern/phmap/CMakeLists.txt b/extern/phmap/CMakeLists.txt deleted file mode 100644 index 3fd9d58..0000000 --- a/extern/phmap/CMakeLists.txt +++ /dev/null @@ -1,150 +0,0 @@ -cmake_minimum_required(VERSION 3.8) - -list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") - -include(DetectVersion) - -cmake_policy(SET CMP0048 NEW) ## set VERSION as documented by the project() command. -set(CMAKE_CXX_STANDARD 11) ## compile with C++11 support -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -project(phmap VERSION ${DETECTED_PHMAP_VERSION} LANGUAGES CXX) - -set(PHMAP_DIR parallel_hashmap) -set(PHMAP_HEADERS ${PHMAP_DIR}/phmap.h - ${PHMAP_DIR}/phmap_base.h - ${PHMAP_DIR}/phmap_bits.h - ${PHMAP_DIR}/phmap_utils.h - ${PHMAP_DIR}/phmap_config.h) -set(CMAKE_SUPPRESS_REGENERATION true) ## suppress ZERO_CHECK project - -include(GNUInstallDirs) -include(CMakePackageConfigHelpers) -include(helpers) -include_directories("${CMAKE_CURRENT_SOURCE_DIR}") - -add_library(${PROJECT_NAME} INTERFACE) - -target_sources(${PROJECT_NAME} INTERFACE ${PHMAP_HEADERS}) - -target_include_directories( - ${PROJECT_NAME} INTERFACE - $ - $) - -install( - DIRECTORY ${PROJECT_SOURCE_DIR}/${PHMAP_DIR}/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHMAP_DIR}) - -install(TARGETS ${PROJECT_NAME} - EXPORT ${PROJECT_NAME}-targets) - -export(EXPORT ${PROJECT_NAME}-targets - FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake") - -## ------------------------- building tests and examples ------------- -option(PHMAP_BUILD_TESTS "Whether or not to build the tests" OFF) -option(PHMAP_BUILD_EXAMPLES "Whether or not to build the examples" OFF) - -if(MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") -endif() - -if (PHMAP_BUILD_TESTS) - - include(cmake/DownloadGTest.cmake) - include_directories(${PROJECT_SOURCE_DIR}) - - check_target(gtest) - check_target(gtest_main) - check_target(gmock) - - enable_testing() - - ## ---------------- regular hash maps ---------------------------- - phmap_cc_test(NAME compressed_tuple SRCS "tests/compressed_tuple_test.cc" - DEPS gmock_main) - - phmap_cc_test(NAME container_memory SRCS "tests/container_memory_test.cc" - DEPS gmock_main) - - phmap_cc_test(NAME hash_policy_testing SRCS "tests/hash_policy_testing_test.cc" - DEPS gmock_main) - - phmap_cc_test(NAME node_hash_policy SRCS "tests/node_hash_policy_test.cc" - DEPS gmock_main) - - phmap_cc_test(NAME raw_hash_set SRCS "tests/raw_hash_set_test.cc" - DEPS gmock_main) - - phmap_cc_test(NAME raw_hash_set_allocator SRCS "tests/raw_hash_set_allocator_test.cc" - DEPS gmock_main) - - ## ---------------- regular hash maps ---------------------------- - phmap_cc_test(NAME flat_hash_set SRCS "tests/flat_hash_set_test.cc" - COPTS "-DUNORDERED_SET_CXX17" DEPS gmock_main) - - phmap_cc_test(NAME flat_hash_map SRCS "tests/flat_hash_map_test.cc" - DEPS gmock_main) - - phmap_cc_test(NAME node_hash_map SRCS "tests/node_hash_map_test.cc" - DEPS gmock_main) - - phmap_cc_test(NAME node_hash_set SRCS "tests/node_hash_set_test.cc" - COPTS "-DUNORDERED_SET_CXX17" DEPS gmock_main) - - ## --------------- parallel hash maps ----------------------------------------------- - phmap_cc_test(NAME parallel_flat_hash_map SRCS "tests/parallel_flat_hash_map_test.cc" - COPTS "-DUNORDERED_MAP_CXX17" DEPS gmock_main) - - phmap_cc_test(NAME parallel_flat_hash_set SRCS "tests/parallel_flat_hash_set_test.cc" - COPTS "-DUNORDERED_SET_CXX17" DEPS gmock_main) - - phmap_cc_test(NAME parallel_node_hash_map SRCS "tests/parallel_node_hash_map_test.cc" - DEPS gmock_main) - - phmap_cc_test(NAME parallel_node_hash_set SRCS "tests/parallel_node_hash_set_test.cc" - COPTS "-DUNORDERED_SET_CXX17" DEPS gmock_main) - - phmap_cc_test(NAME parallel_flat_hash_map_mutex SRCS "tests/parallel_flat_hash_map_mutex_test.cc" - COPTS "-DUNORDERED_MAP_CXX17" DEPS gmock_main) - - phmap_cc_test(NAME dump_load SRCS "tests/dump_load_test.cc" - COPTS "-DUNORDERED_MAP_CXX17" DEPS gmock_main) - - ## --------------- btree ----------------------------------------------- - phmap_cc_test(NAME btree SRCS "tests/btree_test.cc" - CLOPTS "-w" DEPS gmock_main) - - -endif() - -if (PHMAP_BUILD_EXAMPLES) - if(NOT MSVC) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wdisabled-optimization -Winit-self -Wlogical-op -Wmissing-include-dirs -Woverloaded-virtual -Wredundant-decls -Wshadow -Wstrict-null-sentinel -Wswitch-default -Wno-unused -Wno-unknown-warning-option -Wno-gnu-zero-variadic-macro-arguments") - else() - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /Zc:__cplusplus") - endif() - - set(THREADS_PREFER_PTHREAD_FLAG ON) - find_package(Threads REQUIRED) - - add_executable(ex_allmaps examples/allmaps.cc phmap.natvis) - add_executable(ex_basic examples/basic.cc phmap.natvis) - add_executable(ex_bench examples/bench.cc phmap.natvis) - add_executable(ex_emplace examples/emplace.cc phmap.natvis) - add_executable(ex_serialize examples/serialize.cc phmap.natvis) - target_include_directories(ex_serialize PUBLIC $) - add_executable(ex_hash_std examples/hash_std.cc phmap.natvis) - add_executable(ex_hash_value examples/hash_value.cc phmap.natvis) - add_executable(ex_two_files examples/f1.cc examples/f2.cc phmap.natvis) - add_executable(ex_insert_bench examples/insert_bench.cc phmap.natvis) - add_executable(ex_knucleotide examples/knucleotide.cc phmap.natvis) - add_executable(ex_dump_load examples/dump_load.cc phmap.natvis) - add_executable(ex_btree examples/btree.cc phmap.natvis) - add_executable(ex_matt examples/matt.cc phmap.natvis) - - target_link_libraries(ex_knucleotide Threads::Threads) - target_link_libraries(ex_bench Threads::Threads) -endif() - diff --git a/extern/phmap/LICENSE b/extern/phmap/LICENSE deleted file mode 100644 index 62589ed..0000000 --- a/extern/phmap/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - https://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/extern/phmap/README.md b/extern/phmap/README.md deleted file mode 100644 index 4ffa40a..0000000 --- a/extern/phmap/README.md +++ /dev/null @@ -1,305 +0,0 @@ - - - -# The Parallel Hashmap [![Linux](https://github.com/greg7mdp/parallel-hashmap/actions/workflows/linux.yml/badge.svg)](https://github.com/greg7mdp/parallel-hashmap/actions/workflows/linux.yml) [![MacOS](https://github.com/greg7mdp/parallel-hashmap/actions/workflows/macos.yml/badge.svg)](https://github.com/greg7mdp/parallel-hashmap/actions/workflows/macos.yml) [![Windows](https://github.com/greg7mdp/parallel-hashmap/actions/workflows/windows.yml/badge.svg)](https://github.com/greg7mdp/parallel-hashmap/actions/workflows/windows.yml) - -## Overview - -This repository aims to provide a set of excellent **hash map** implementations, as well as a **btree** alternative to std::map and std::set, with the following characteristics: - -- **Header only**: nothing to build, just copy the `parallel_hashmap` directory to your project and you are good to go. - -- **drop-in replacement** for `std::unordered_map`, `std::unordered_set`, `std::map` and `std::set` - -- Compiler with **C++11 support** required, **C++14 and C++17 APIs are provided (such as `try_emplace`)** - -- **Very efficient**, significantly faster than your compiler's unordered map/set or Boost's, or than [sparsepp](https://github.com/greg7mdp/sparsepp) - -- **Memory friendly**: low memory usage, although a little higher than [sparsepp](https://github.com/greg7mdp/sparsepp) - -- Supports **heterogeneous lookup** - -- Easy to **forward declare**: just include `phmap_fwd_decl.h` in your header files to forward declare Parallel Hashmap containers [note: this does not work currently for hash maps with pointer keys] - -- **Dump/load** feature: when a `flat` hash map stores data that is `std::trivially_copyable`, the table can be dumped to disk and restored as a single array, very efficiently, and without requiring any hash computation. This is typically about 10 times faster than doing element-wise serialization to disk, but it will use 10% to 60% extra disk space. See `examples/serialize.cc`. _(flat hash map/set only)_ - -- **Tested** on Windows (vs2015 & vs2017, vs2019, Intel compiler 18 and 19), linux (g++ 4.8.4, 5, 6, 7, 8, clang++ 3.9, 4.0, 5.0) and MacOS (g++ and clang++) - click on travis and appveyor icons above for detailed test status. - -- Automatic support for **boost's hash_value()** method for providing the hash function (see `examples/hash_value.h`). Also default hash support for `std::pair` and `std::tuple`. - -- **natvis** visualization support in Visual Studio _(hash map/set only)_ - -@byronhe kindly provided this [Chinese translation](https://byronhe.com/post/2020/11/10/parallel-hashmap-btree-fast-multi-thread-intro/) of the README.md. - - -## Fast *and* memory friendly - -Click here [For a full writeup explaining the design and benefits of the Parallel Hashmap](https://greg7mdp.github.io/parallel-hashmap/). - -The hashmaps and btree provided here are built upon those open sourced by Google in the Abseil library. The hashmaps use closed hashing, where values are stored directly into a memory array, avoiding memory indirections. By using parallel SSE2 instructions, these hashmaps are able to look up items by checking 16 slots in parallel, allowing the implementation to remain fast even when the table is filled up to 87.5% capacity. - -> **IMPORTANT:** This repository borrows code from the [abseil-cpp](https://github.com/abseil/abseil-cpp) repository, with modifications, and may behave differently from the original. This repository is an independent work, with no guarantees implied or provided by the authors. Please visit [abseil-cpp](https://github.com/abseil/abseil-cpp) for the official Abseil libraries. - -## Installation - -Copy the parallel_hashmap directory to your project. Update your include path. That's all. - -If you are using Visual Studio, you probably want to add `phmap.natvis` to your projects. This will allow for a clear display of the hash table contents in the debugger. - -> A cmake configuration files (CMakeLists.txt) is provided for building the tests and examples. Command for building and running the tests is: `mkdir build && cd build && cmake -DPHMAP_BUILD_TESTS=ON -DPHMAP_BUILD_EXAMPLES=ON .. && cmake --build . && make test` - -## Example - -```c++ -#include -#include -#include - -using phmap::flat_hash_map; - -int main() -{ - // Create an unordered_map of three strings (that map to strings) - flat_hash_map email = - { - { "tom", "tom@gmail.com"}, - { "jeff", "jk@gmail.com"}, - { "jim", "jimg@microsoft.com"} - }; - - // Iterate and print keys and values - for (const auto& n : email) - std::cout << n.first << "'s email is: " << n.second << "\n"; - - // Add a new entry - email["bill"] = "bg@whatever.com"; - - // and print it - std::cout << "bill's email is: " << email["bill"] << "\n"; - - return 0; -} -``` - -## Various hash maps and their pros and cons - -The header `parallel_hashmap/phmap.h` provides the implementation for the following eight hash tables: -- phmap::flat_hash_set -- phmap::flat_hash_map -- phmap::node_hash_set -- phmap::node_hash_map -- phmap::parallel_flat_hash_set -- phmap::parallel_flat_hash_map -- phmap::parallel_node_hash_set -- phmap::parallel_node_hash_map - -The header `parallel_hashmap/btree.h` provides the implementation for the following btree-based ordered containers: -- phmap::btree_set -- phmap::btree_map -- phmap::btree_multiset -- phmap::btree_multimap - -The btree containers are direct ports from Abseil, and should behave exactly the same as the Abseil ones, modulo small differences (such as supporting std::string_view instead of absl::string_view, and being forward declarable). - -When btrees are mutated, values stored within can be moved in memory. This means that pointers or iterators to values stored in btree containers can be invalidated when that btree is modified. This is a significant difference with `std::map` and `std::set`, as the std containers do offer a guarantee of pointer stability. The same is true for the 'flat' hash maps and sets. - -The full types with template parameters can be found in the [parallel_hashmap/phmap_fwd_decl.h](https://raw.githubusercontent.com/greg7mdp/parallel-hashmap/master/parallel_hashmap/phmap_fwd_decl.h) header, which is useful for forward declaring the Parallel Hashmaps when necessary. - -**Key decision points for hash containers:** - -- The `flat` hash maps will move the keys and values in memory. So if you keep a pointer to something inside a `flat` hash map, this pointer may become invalid when the map is mutated. The `node` hash maps don't, and should be used instead if this is a problem. - -- The `flat` hash maps will use less memory, and usually be faster than the `node` hash maps, so use them if you can. the exception is when the values inserted in the hash map are large (say more than 100 bytes [*needs testing*]) and costly to move. - -- The `parallel` hash maps are preferred when you have a few hash maps that will store a very large number of values. The `non-parallel` hash maps are preferred if you have a large number of hash maps, each storing a relatively small number of values. - -- The benefits of the `parallel` hash maps are: - a. reduced peak memory usage (when resizing), and - b. multithreading support (and inherent internal parallelism) - -**Key decision points for btree containers:** - -Btree containers are ordered containers, which can be used as alternatives to `std::map` and `std::set`. They store multiple values in each tree node, and are therefore more cache friendly and use significantly less memory. - -Btree containers will usually be preferable to the default red-black trees of the STL, except when: -- pointer stability or iterator stability is required -- the value_type is large and expensive to move - -When an ordering is not needed, a hash container is typically a better choice than a btree one. - -## Changes to Abseil's hashmaps - -- The default hash framework is std::hash, not absl::Hash. However, if you prefer the default to be the Abseil hash framework, include the Abseil headers before `phmap.h` and define the preprocessor macro `PHMAP_USE_ABSL_HASH`. - -- The `erase(iterator)` and `erase(const_iterator)` both return an iterator to the element following the removed element, as does the std::unordered_map. A non-standard `void _erase(iterator)` is provided in case the return value is not needed. - -- No new types, such as `absl::string_view`, are provided. All types with a `std::hash<>` implementation are supported by phmap tables (including `std::string_view` of course if your compiler provides it). - -- The Abseil hash tables internally randomize a hash seed, so that the table iteration order is non-deterministic. This can be useful to prevent *Denial Of Service* attacks when a hash table is used for a customer facing web service, but it can make debugging more difficult. The *phmap* hashmaps by default do **not** implement this randomization, but it can be enabled by adding `#define PHMAP_NON_DETERMINISTIC 1` before including the header `phmap.h` (as is done in raw_hash_set_test.cc). - -- Unlike the Abseil hash maps, we do an internal mixing of the hash value provided. This prevents serious degradation of the hash table performance when the hash function provided by the user has poor entropy distribution. The cost in performance is very minimal, and this helps provide reliable performance even with *imperfect* hash functions. - - -## Memory usage - -| type | memory usage | additional *peak* memory usage when resizing | -|-----------------------|-------------------|-----------------------------------------------| -| flat tables | ![flat_mem_usage](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/flat_mem_usage.png?raw=true) | ![flat_peak_usage](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/flat_peak.png?raw=true) | -| node tables | ![node_mem_usage](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/node_mem_usage.png?raw=true) | ![node_peak_usage](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/node_peak.png?raw=true) | -| parallel flat tables | ![flat_mem_usage](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/flat_mem_usage.png?raw=true) | ![parallel_flat_peak](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/parallel_flat_peak.png?raw=true) | -| parallel node tables | ![node_mem_usage](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/node_mem_usage.png?raw=true) | ![parallel_node_peak](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/parallel_node_peak.png?raw=true) | - - -- *size()* is the number of values in the container, as returned by the size() method -- *load_factor()* is the ratio: `size() / bucket_count()`. It varies between 0.4375 (just after the resize) to 0.875 (just before the resize). The size of the bucket array doubles at each resize. -- the value 9 comes from `sizeof(void *) + 1`, as the *node* hash maps store one pointer plus one byte of metadata for each entry in the bucket array. -- flat tables store the values, plus one byte of metadata per value), directly into the bucket array, hence the `sizeof(C::value_type) + 1`. -- the additional peak memory usage (when resizing) corresponds the the old bucket array (half the size of the new one, hence the 0.5), which contains the values to be copied to the new bucket array, and which is freed when the values have been copied. -- the *parallel* hashmaps, when created with a template parameter N=4, create 16 submaps. When the hash values are well distributed, and in single threaded mode, only one of these 16 submaps resizes at any given time, hence the factor `0.03` roughly equal to `0.5 / 16` - -## Iterator invalidation for hash containers - -The rules are the same as for `std::unordered_map`, and are valid for all the phmap hash containers: - - -| Operations | Invalidated | -|-------------------------------------------|----------------------------| -| All read only operations, swap, std::swap | Never | -| clear, rehash, reserve, operator= | Always | -| insert, emplace, emplace_hint, operator[] | Only if rehash triggered | -| erase | Only to the element erased | - -## Iterator invalidation for btree containers - -Unlike for `std::map` and `std::set`, any mutating operation may invalidate existing iterators to btree containers. - - -| Operations | Invalidated | -|-------------------------------------------|----------------------------| -| All read only operations, swap, std::swap | Never | -| clear, operator= | Always | -| insert, emplace, emplace_hint, operator[] | Yes | -| erase | Yes | - -## Example 2 - providing a hash function for a user-defined class - -In order to use a flat_hash_set or flat_hash_map, a hash function should be provided. This can be done with one of the following methods: - -- Provide a hash functor via the HashFcn template parameter - -- As with boost, you may add a `hash_value()` friend function in your class. - -For example: - -```c++ -#include // minimal header providing phmap::HashState() -#include -using std::string; - -struct Person -{ - bool operator==(const Person &o) const - { - return _first == o._first && _last == o._last && _age == o._age; - } - - friend size_t hash_value(const Person &p) - { - return phmap::HashState().combine(0, p._first, p._last, p._age); - } - - string _first; - string _last; - int _age; -}; -``` - -- Inject a specialization of `std::hash` for the class into the "std" namespace. We provide a convenient and small header `phmap_utils.h` which allows to easily add such specializations. - -For example: - -### file "Person.h" - -```c++ -#include // minimal header providing phmap::HashState() -#include -using std::string; - -struct Person -{ - bool operator==(const Person &o) const - { - return _first == o._first && _last == o._last && _age == o._age; - } - - string _first; - string _last; - int _age; -}; - -namespace std -{ - // inject specialization of std::hash for Person into namespace std - // ---------------------------------------------------------------- - template<> struct hash - { - std::size_t operator()(Person const &p) const - { - return phmap::HashState().combine(0, p._first, p._last, p._age); - } - }; -} -``` - -The `std::hash` specialization for `Person` combines the hash values for both first and last name and age, using the convenient phmap::HashState() function, and returns the combined hash value. - -### file "main.cpp" - -```c++ -#include "Person.h" // defines Person with std::hash specialization - -#include -#include - -int main() -{ - // As we have defined a specialization of std::hash() for Person, - // we can now create sparse_hash_set or sparse_hash_map of Persons - // ---------------------------------------------------------------- - phmap::flat_hash_set persons = - { { "John", "Mitchell", 35 }, - { "Jane", "Smith", 32 }, - { "Jane", "Smith", 30 }, - }; - - for (auto& p: persons) - std::cout << p._first << ' ' << p._last << " (" << p._age << ")" << '\n'; - -} -``` - - -## Thread safety - -Parallel Hashmap containers follow the thread safety rules of the Standard C++ library. In Particular: - -- A single phmap hash table is thread safe for reading from multiple threads. For example, given a hash table A, it is safe to read A from thread 1 and from thread 2 simultaneously. - -- If a single hash table is being written to by one thread, then all reads and writes to that hash table on the same or other threads must be protected. For example, given a hash table A, if thread 1 is writing to A, then thread 2 must be prevented from reading from or writing to A. - -- It is safe to read and write to one instance of a type even if another thread is reading or writing to a different instance of the same type. For example, given hash tables A and B of the same type, it is safe if A is being written in thread 1 and B is being read in thread 2. - -- The *parallel* tables can be made internally thread-safe for concurrent read and write access, by providing a synchronization type (for example [std::mutex](https://en.cppreference.com/w/cpp/thread/mutex)) as the last template argument. Because locking is performed at the *submap* level, a high level of concurrency can still be achieved. Read access can be done safely using `if_contains()`, which passes a reference value to the callback while holding the *submap* lock. Similarly, write access can be done safely using `modify_if`, `try_emplace_l` or `lazy_emplace_l`. However, please be aware that iterators or references returned by standard APIs are not protected by the mutex, so they cannot be used reliably on a hash map which can be changed by another thread. - -- Examples on how to use various mutex types, including boost::mutex, boost::shared_mutex and absl::Mutex can be found in `examples/bench.cc` - - -## Using the Parallel Hashmap from languages other than C++ - -While C++ is the native language of the Parallel Hashmap, we welcome bindings making it available for other languages. One such implementation has been created for Python and is described below: - -- [GetPy - A Simple, Fast, and Small Hash Map for Python](https://github.com/atom-moyer/getpy): GetPy is a thin and robust binding to The Parallel Hashmap (https://github.com/greg7mdp/parallel-hashmap.git) which is the current state of the art for minimal memory overhead and fast runtime speed. The binding layer is supported by PyBind11 (https://github.com/pybind/pybind11.git) which is fast to compile and simple to extend. Serialization is handled by Cereal (https://github.com/USCiLab/cereal.git) which supports streaming binary serialization, a critical feature for the large hash maps this package is designed to support. - -## Acknowledgements - -Many thanks to the Abseil developers for implementing the swiss table and btree data structures (see [abseil-cpp](https://github.com/abseil/abseil-cpp)) upon which this work is based, and to Google for releasing it as open-source. diff --git a/extern/phmap/benchmark/BENCHMARK.md b/extern/phmap/benchmark/BENCHMARK.md deleted file mode 100644 index eb3fecf..0000000 --- a/extern/phmap/benchmark/BENCHMARK.md +++ /dev/null @@ -1,16 +0,0 @@ -# parallel-hashmap - -How to run these benchmarks -=========================== - -These bencharks were run on windows using Visual Studio 2017, in a cygwin window with the VC++ 2017 compiler env vars (add something like this in your Cygwin.bat: - -CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" - -Running them on linux would require Makefile changes. - -To build and run the tests, just update the path to the abseil libraries in the makefile, and run make. - -Your charts are now in charts.html. - - diff --git a/extern/phmap/benchmark/Makefile b/extern/phmap/benchmark/Makefile deleted file mode 100644 index 8ac6b5a..0000000 --- a/extern/phmap/benchmark/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -CXX=CL -EHsc -DNDEBUG -Fo$@ -O2 -#CXX=CL -EHsc -g -debug -Zi -Fo$@ -#CXX=g++ -ggdb -O2 -lm -std=c++11 -DNDEBUG - -ABSEIL_LIBS=absl_bad_optional_access.lib absl_bad_variant_access.lib absl_base.lib absl_demangle_internal.lib absl_hash.lib absl_int128.lib absl_internal_bad_any_cast_impl.lib absl_internal_city.lib absl_internal_civil_time.lib absl_internal_debugging_internal.lib absl_internal_graphcycles_internal.lib absl_internal_hashtablez_sampler.lib absl_internal_malloc_internal.lib absl_internal_spinlock_wait.lib absl_internal_strings_internal.lib absl_internal_throw_delegate.lib absl_internal_time_zone.lib absl_optional.lib absl_raw_hash_set.lib absl_stacktrace.lib absl_strings.lib absl_symbolize.lib absl_synchronization.lib absl_time.lib - -PROGS = stl_unordered_map sparsepp phmap abseil_flat abseil_parallel_flat phmap_flat -BUILD_PROGS = $(addprefix build/,$(PROGS)) -SIZE = 100000000 -ABSEIL = ../../abseil-cpp -PHMAP_SRC = ../parallel_hashmap - -all: test - -builddir: - @if [ ! -d build ]; then mkdir build; fi - -build/stl_unordered_map: bench.cc Makefile - $(CXX) -DSTL_UNORDERED -I.. bench.cc -o $@ - -build/sparsepp: bench.cc Makefile - $(CXX) -DSPARSEPP -I.. -I../../sparsepp bench.cc -o $@ - -build/phmap: bench.cc Makefile $(PHMAP_SRC)/phmap.h - $(CXX) -DPHMAP -I.. -I$(ABSEIL) bench.cc /MD -o $@ /link /LIBPATH:$(ABSEIL)/build/lib ${ABSEIL_LIBS} - -build/phmap_flat: bench.cc Makefile $(PHMAP_SRC)/phmap.h - $(CXX) -DPHMAP_FLAT -I.. bench.cc /MD -o $@ - -build/abseil_flat: bench.cc Makefile - $(CXX) -DABSEIL_FLAT -I.. -I$(ABSEIL) bench.cc /MD -o $@ /link /LIBPATH:$(ABSEIL)/build/lib ${ABSEIL_LIBS} - -build/abseil_parallel_flat: bench.cc Makefile - $(CXX) -DABSEIL_PARALLEL_FLAT -I.. -I $(ABSEIL) bench.cc /MD -o $@ /link /LIBPATH:$(ABSEIL)/build/lib ${ABSEIL_LIBS} - -build/emplace: emplace.cc Makefile $(PHMAP_SRC)/phmap.h - $(CXX) -DABSEIL_FLAT -I.. -I$(ABSEIL) emplace.cc /MD -o $@ /link /LIBPATH:$(ABSEIL)/build/lib ${ABSEIL_LIBS} - -progs: $(BUILD_PROGS) - -test: builddir progs - -rm -f output - #./build/stl_unordered_map $(SIZE) random >> output - #./build/sparsepp $(SIZE) random >> output - ./build/abseil_flat $(SIZE) random >> output - #./build/phmap_flat $(SIZE) random >> output - ./build/phmap $(SIZE) random >> output - ./build/abseil_parallel_flat $(SIZE) random >> output - python make_chart_data.py < output - -test_cust: - -rm -f output - #./build/abseil_flat $(SIZE) random >> output - #./build/sparsepp $(SIZE) random >> output - ./build/abseil_parallel_flat_5 $(SIZE) random >> output - ./build/abseil_parallel_flat $(SIZE) random >> output - python make_chart_data.py < output - -chart: - python make_chart_data.py < output - -clean: - -rm -fr output build diff --git a/extern/phmap/benchmark/bench.cc b/extern/phmap/benchmark/bench.cc deleted file mode 100644 index 479a9e3..0000000 --- a/extern/phmap/benchmark/bench.cc +++ /dev/null @@ -1,451 +0,0 @@ -#include - -#ifdef STL_UNORDERED - #include - #define MAPNAME std::unordered_map - #define EXTRAARGS -#elif defined(SPARSEPP) - #define SPP_USE_SPP_ALLOC 1 - #include - #define MAPNAME spp::sparse_hash_map - #define EXTRAARGS -#elif defined(ABSEIL_FLAT) - #include "absl/container/flat_hash_map.h" - #define MAPNAME absl::flat_hash_map - #define EXTRAARGS -#elif defined(PHMAP_FLAT) - #include "parallel_hashmap/phmap.h" - #define MAPNAME phmap::flat_hash_map - #define NMSP phmap - #define EXTRAARGS -#elif defined(ABSEIL_PARALLEL_FLAT) || defined(PHMAP) - #if defined(ABSEIL_PARALLEL_FLAT) - #include "absl/container/parallel_flat_hash_map.h" - #define MAPNAME absl::parallel_flat_hash_map - #define NMSP absl - #define MTX absl::Mutex - #else - #if 1 - // use Abseil's mutex... faster - #include "absl/synchronization/mutex.h" - #define MTX absl::Mutex - #else - #include - #define MTX std::mutex - #endif - - #include "parallel_hashmap/phmap.h" - #define MAPNAME phmap::parallel_flat_hash_map - #define NMSP phmap - #endif - - #define MT_SUPPORT 2 - #if MT_SUPPORT == 1 - // create the parallel_flat_hash_map without internal mutexes, for when - // we programatically ensure that each thread uses different internal submaps - // -------------------------------------------------------------------------- - #define EXTRAARGS , NMSP::priv::hash_default_hash, \ - NMSP::priv::hash_default_eq, \ - std::allocator>, 4, NMSP::NullMutex - #elif MT_SUPPORT == 2 - // create the parallel_flat_hash_map with internal mutexes, for when - // we read/write the same parallel_flat_hash_map from multiple threads, - // without any special precautions. - // -------------------------------------------------------------------------- - #define EXTRAARGS , NMSP::priv::hash_default_hash, \ - NMSP::priv::hash_default_eq, \ - std::allocator>, 4, MTX - #else - #define EXTRAARGS - #endif - -#endif - -#define xstr(s) str(s) -#define str(s) #s - -template -using HashT = MAPNAME; - -using hash_t = HashT; -using str_hash_t = HashT; - -const char *program_slug = xstr(MAPNAME); // "_4"; - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "parallel_hashmap/meminfo.h" -#include -using std::vector; - -int64_t _abs(int64_t x) { return (x < 0) ? -x : x; } - - -// -------------------------------------------------------------------------- -class Timer -{ - typedef std::chrono::high_resolution_clock high_resolution_clock; - typedef std::chrono::milliseconds milliseconds; - -public: - explicit Timer(bool run = false) { if (run) reset(); } - void reset() { _start = high_resolution_clock::now(); } - - milliseconds elapsed() const - { - return std::chrono::duration_cast(high_resolution_clock::now() - _start); - } - -private: - high_resolution_clock::time_point _start; -}; - - -// -------------------------------------------------------------------------- -// from: https://github.com/preshing/RandomSequence -// -------------------------------------------------------------------------- -class RSU -{ -private: - unsigned int m_index; - unsigned int m_intermediateOffset; - - static unsigned int permuteQPR(unsigned int x) - { - static const unsigned int prime = 4294967291u; - if (x >= prime) - return x; // The 5 integers out of range are mapped to themselves. - unsigned int residue = ((unsigned long long) x * x) % prime; - return (x <= prime / 2) ? residue : prime - residue; - } - -public: - RSU(unsigned int seedBase, unsigned int seedOffset) - { - m_index = permuteQPR(permuteQPR(seedBase) + 0x682f0161); - m_intermediateOffset = permuteQPR(permuteQPR(seedOffset) + 0x46790905); - } - - unsigned int next() - { - return permuteQPR((permuteQPR(m_index++) + m_intermediateOffset) ^ 0x5bf03635); - } -}; - -// -------------------------------------------------------------------------- -char * new_string_from_integer(int num) -{ - int ndigits = num == 0 ? 1 : (int)log10(num) + 1; - char * str = (char *)malloc(ndigits + 1); - sprintf(str, "%d", num); - return str; -} - -// -------------------------------------------------------------------------- -template -void _fill(vector &v) -{ - srand(1); // for a fair/deterministic comparison - for (size_t i = 0, sz = v.size(); i < sz; ++i) - v[i] = (T)(i * 10 + rand() % 10); -} - -// -------------------------------------------------------------------------- -template -void _shuffle(vector &v) -{ - for (size_t n = v.size(); n >= 2; --n) - std::swap(v[n - 1], v[static_cast(rand()) % n]); -} - -// -------------------------------------------------------------------------- -template -Timer _fill_random(vector &v, HT &hash) -{ - _fill(v); - _shuffle(v); - - Timer timer(true); - - for (size_t i = 0, sz = v.size(); i < sz; ++i) - hash.insert(typename HT::value_type(v[i], 0)); - return timer; -} - -// -------------------------------------------------------------------------- -void out(const char* test, int64_t cnt, const Timer &t) -{ - printf("%s,time,%lld,%s,%f\n", test, cnt, program_slug, (float)((double)t.elapsed().count() / 1000)); -} - -// -------------------------------------------------------------------------- -void outmem(const char* test, int64_t cnt, uint64_t mem) -{ - printf("%s,memory,%lld,%s,%lld\n", test, cnt, program_slug, mem); -} - -static bool all_done = false; -static int64_t num_keys[16] = { 0 }; -static int64_t loop_idx = 0; -static int64_t inner_cnt = 0; -static const char *test = "random"; - -// -------------------------------------------------------------------------- -template -void _fill_random_inner(int64_t cnt, HT &hash, RSU &rsu) -{ - for (int64_t i=0; i -void _fill_random_inner_mt(int64_t cnt, HT &hash, RSU &rsu) -{ - constexpr int64_t num_threads = 8; // has to be a power of two - std::unique_ptr threads[num_threads]; - - auto thread_fn = [&hash, cnt, num_threads](int64_t thread_idx, RSU rsu) { -#if MT_SUPPORT - size_t modulo = hash.subcnt() / num_threads; // subcnt() returns the number of submaps - - for (int64_t i=0; ijoin(); -} - -// -------------------------------------------------------------------------- -size_t total_num_keys() -{ - size_t n = 0; - for (int i=0; i<16; ++i) - n += num_keys[i]; - return n; -} - -// -------------------------------------------------------------------------- -template -Timer _fill_random2(int64_t cnt, HT &hash) -{ - test = "random"; - unsigned int seed = 76687; - RSU rsu(seed, seed + 1); - - Timer timer(true); - const int64_t num_loops = 10; - inner_cnt = cnt / num_loops; - - for (int i=0; i<16; ++i) - num_keys[i] = 0; - - for (loop_idx=0; loop_idx -Timer _lookup(vector &v, HT &hash, size_t &num_present) -{ - _fill_random(v, hash); - - num_present = 0; - size_t max_val = v.size() * 10; - Timer timer(true); - - for (size_t i = 0, sz = v.size(); i < sz; ++i) - { - num_present += (size_t)(hash.find(v[i]) != hash.end()); - num_present += (size_t)(hash.find((T)(rand() % max_val)) != hash.end()); - } - return timer; -} - -// -------------------------------------------------------------------------- -template -Timer _delete(vector &v, HT &hash) -{ - _fill_random(v, hash); - _shuffle(v); // don't delete in insertion order - - Timer timer(true); - - for(size_t i = 0, sz = v.size(); i < sz; ++i) - hash.erase(v[i]); - return timer; -} - -// -------------------------------------------------------------------------- -void memlog() -{ - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - uint64_t nbytes_old_out = spp::GetProcessMemoryUsed(); - uint64_t nbytes_old = spp::GetProcessMemoryUsed(); // last non outputted mem measurement - outmem(test, 0, nbytes_old); - int64_t last_loop = 0; - - while (!all_done) - { - uint64_t nbytes = spp::GetProcessMemoryUsed(); - - if ((double)_abs(nbytes - nbytes_old_out) / nbytes_old_out > 0.03 || - (double)_abs(nbytes - nbytes_old) / nbytes_old > 0.01) - { - if ((double)(nbytes - nbytes_old) / nbytes_old > 0.03) - outmem(test, total_num_keys() - 1, nbytes_old); - outmem(test, total_num_keys(), nbytes); - nbytes_old_out = nbytes; - last_loop = loop_idx; - } - else if (loop_idx > last_loop) - { - outmem(test, total_num_keys(), nbytes); - nbytes_old_out = nbytes; - last_loop = loop_idx; - } - nbytes_old = nbytes; - - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } -} - - -// -------------------------------------------------------------------------- -int main(int argc, char ** argv) -{ - int64_t i, value = 0; - - if(argc <= 2) - return 1; - - int64_t num_keys = atoi(argv[1]); - - hash_t hash; - str_hash_t str_hash; - - srand(1); // for a fair/deterministic comparison - Timer timer(true); - -#if MT_SUPPORT - if (!strcmp(program_slug,"absl::parallel_flat_hash_map") || - !strcmp(program_slug,"phmap::parallel_flat_hash_map")) - program_slug = xstr(MAPNAME) "_mt"; -#endif - - std::thread t1(memlog); - - try - { - if(!strcmp(argv[2], "sequential")) - { - for(i = 0; i < num_keys; i++) - hash.insert(hash_t::value_type(i, value)); - } -#if 0 - else if(!strcmp(argv[2], "random")) - { - vector v(num_keys); - timer = _fill_random(v, hash); - out("random", num_keys, timer); - } -#endif - else if(!strcmp(argv[2], "random")) - { - fprintf(stderr, "size = %d\n", sizeof(hash)); - timer = _fill_random2(num_keys, hash); - //out("random", num_keys, timer); - //fprintf(stderr, "inserted %llu\n", hash.size()); - } - else if(!strcmp(argv[2], "lookup")) - { - vector v(num_keys); - size_t num_present; - - timer = _lookup(v, hash, num_present); - //fprintf(stderr, "found %llu\n", num_present); - } - else if(!strcmp(argv[2], "delete")) - { - vector v(num_keys); - timer = _delete(v, hash); - } - else if(!strcmp(argv[2], "sequentialstring")) - { - for(i = 0; i < num_keys; i++) - str_hash.insert(str_hash_t::value_type(new_string_from_integer(i), value)); - } - else if(!strcmp(argv[2], "randomstring")) - { - for(i = 0; i < num_keys; i++) - str_hash.insert(str_hash_t::value_type(new_string_from_integer((int)rand()), value)); - } - else if(!strcmp(argv[2], "deletestring")) - { - for(i = 0; i < num_keys; i++) - str_hash.insert(str_hash_t::value_type(new_string_from_integer(i), value)); - timer.reset(); - for(i = 0; i < num_keys; i++) - str_hash.erase(new_string_from_integer(i)); - } - - - //printf("%f\n", (float)((double)timer.elapsed().count() / 1000)); - fflush(stdout); - //std::this_thread::sleep_for(std::chrono::seconds(1000)); - } - catch (...) - { - } - - all_done = true; - t1.join(); - return 0; -} diff --git a/extern/phmap/benchmark/bench.py b/extern/phmap/benchmark/bench.py deleted file mode 100644 index 142e571..0000000 --- a/extern/phmap/benchmark/bench.py +++ /dev/null @@ -1,73 +0,0 @@ -import sys, os, subprocess, signal - -programs = [ - 'stl_unordered_map', - 'abseil_flat', - 'abseil_parallel_flat' -] - -test_size = 1 -minkeys = 0 -maxkeys = 1000 -interval = 100 -best_out_of = 1 - -if test_size == 2: - multiplier = 1000 * 1000 - maxkeys = 500 - best_out_of = 3 - -elif test_size == 1: - multiplier = 100 * 1000 - interval = 200 -else: - multiplier = 10 * 1000 - -# and use nice/ionice -# and shut down to the console -# and swapoff any swap files/partitions - -outfile = open('output', 'w') - -if len(sys.argv) > 1: - benchtypes = sys.argv[1:] -else: - benchtypes = ( 'random', 'lookup', 'delete',) - #benchtypes = ( 'lookup', ) - -for benchtype in benchtypes: - nkeys = minkeys * multiplier - while nkeys <= (maxkeys * multiplier): - for program in programs: - fastest_attempt = 1000000 - fastest_attempt_data = '' - - for attempt in range(best_out_of): - proc = subprocess.Popen(['./build/'+program, str(nkeys), benchtype], stdout=subprocess.PIPE) - - # wait for the program to fill up memory and spit out its "ready" message - try: - runtime = float(proc.stdout.readline().strip()) - except: - runtime = 0 - - ps_proc = subprocess.Popen(['ps up %d | tail -n1' % proc.pid], shell=True, stdout=subprocess.PIPE) - #nbytes = int(ps_proc.stdout.read().split()[4]) * 1024 - #ps_proc.wait() - nbytes = 1000000 - - os.kill(proc.pid, signal.SIGKILL) - proc.wait() - - if nbytes and runtime: # otherwise it crashed - line = ','.join(map(str, [benchtype, nkeys, program, nbytes, "%0.6f" % runtime])) - - if runtime < fastest_attempt: - fastest_attempt = runtime - fastest_attempt_data = line - - if fastest_attempt != 1000000: - print >> outfile, fastest_attempt_data - print fastest_attempt_data - - nkeys += interval * multiplier diff --git a/extern/phmap/benchmark/charts-template.html b/extern/phmap/benchmark/charts-template.html deleted file mode 100644 index 9d5ca53..0000000 --- a/extern/phmap/benchmark/charts-template.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - Hash Table Benchmarks - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -__PLOT_DIV_SPEC_GOES_HERE__ - - - diff --git a/extern/phmap/benchmark/js/examples.css b/extern/phmap/benchmark/js/examples.css deleted file mode 100644 index d63816a..0000000 --- a/extern/phmap/benchmark/js/examples.css +++ /dev/null @@ -1,146 +0,0 @@ -* { padding: 0; margin: 0; vertical-align: top; } - -body { - background: url(background.png) repeat-x; - font: 18px "proxima-nova", Helvetica, Arial, sans-serif; - line-height: 1.5; -} - -a { color: #069; } -a:hover { color: #28b; } - -h2 { - margin-top: 15px; - font: normal 32px "omnes-pro", Helvetica, Arial, sans-serif; -} - -h3 { - margin-left: 30px; - font: normal 26px "omnes-pro", Helvetica, Arial, sans-serif; - color: #666; -} - -p { - margin-top: 10px; -} - -button { - font-size: 18px; - padding: 1px 7px; -} - -input { - font-size: 18px; -} - -input[type=checkbox] { - margin: 7px; -} - -#header { - position: relative; - width: 900px; - margin: auto; -} - -#header h2 { - margin-left: 10px; - vertical-align: middle; - font-size: 42px; - font-weight: bold; - text-decoration: none; - color: #000; -} - -#content { - width: 880px; - margin: 0 auto; - padding: 10px; -} - -#footer { - margin-top: 25px; - margin-bottom: 10px; - text-align: center; - font-size: 12px; - color: #999; -} - -.demo-container { - box-sizing: border-box; - width: 850px; - height: 450px; - padding: 20px 15px 15px 15px; - margin: 15px auto 30px auto; - border: 1px solid #ddd; - background: #fff; - background: linear-gradient(#f6f6f6 0, #fff 50px); - background: -o-linear-gradient(#f6f6f6 0, #fff 50px); - background: -ms-linear-gradient(#f6f6f6 0, #fff 50px); - background: -moz-linear-gradient(#f6f6f6 0, #fff 50px); - background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px); - box-shadow: 0 3px 10px rgba(0,0,0,0.15); - -o-box-shadow: 0 3px 10px rgba(0,0,0,0.1); - -ms-box-shadow: 0 3px 10px rgba(0,0,0,0.1); - -moz-box-shadow: 0 3px 10px rgba(0,0,0,0.1); - -webkit-box-shadow: 0 3px 10px rgba(0,0,0,0.1); - -webkit-tap-highlight-color: rgba(0,0,0,0); - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.demo-placeholder { - width: 100%; - height: 100%; - font-size: 14px; -} - -fieldset { - display: block; - -webkit-margin-start: 2px; - -webkit-margin-end: 2px; - -webkit-padding-before: 0.35em; - -webkit-padding-start: 0.75em; - -webkit-padding-end: 0.75em; - -webkit-padding-after: 0.625em; - min-width: -webkit-min-content; - border-width: 2px; - border-style: groove; - border-color: threedface; - border-image: initial; - padding: 10px; -} - -.legend { - display: block; - -webkit-padding-start: 2px; - -webkit-padding-end: 2px; - border-width: initial; - border-style: none; - border-color: initial; - border-image: initial; - padding-left: 10px; - padding-right: 10px; - padding-top: 10px; - padding-bottom: 10px; -} - -.legendLayer .background { - fill: rgba(255, 255, 255, 0.85); - stroke: rgba(0, 0, 0, 0.85); - stroke-width: 1; -} - -input[type="radio"] { - margin-top: -1px; - vertical-align: middle; -} - -.tickLabel { - line-height: 1.1; -} diff --git a/extern/phmap/benchmark/js/jquery.canvaswrapper.js b/extern/phmap/benchmark/js/jquery.canvaswrapper.js deleted file mode 100644 index 69eb0f3..0000000 --- a/extern/phmap/benchmark/js/jquery.canvaswrapper.js +++ /dev/null @@ -1,538 +0,0 @@ -/** ## jquery.flot.canvaswrapper - -This plugin contains the function for creating and manipulating both the canvas -layers and svg layers. - -The Canvas object is a wrapper around an HTML5 canvas tag. -The constructor Canvas(cls, container) takes as parameters cls, -the list of classes to apply to the canvas adnd the containter, -element onto which to append the canvas. The canvas operations -don't work unless the canvas is attached to the DOM. - -### jquery.canvaswrapper.js API functions -*/ - -(function($) { - var Canvas = function(cls, container) { - var element = container.getElementsByClassName(cls)[0]; - - if (!element) { - element = document.createElement('canvas'); - element.className = cls; - element.style.direction = 'ltr'; - element.style.position = 'absolute'; - element.style.left = '0px'; - element.style.top = '0px'; - - container.appendChild(element); - - // If HTML5 Canvas isn't available, throw - - if (!element.getContext) { - throw new Error('Canvas is not available.'); - } - } - - this.element = element; - - var context = this.context = element.getContext('2d'); - this.pixelRatio = $.plot.browser.getPixelRatio(context); - - // Size the canvas to match the internal dimensions of its container - - var box = container.getBoundingClientRect(); - this.resize(box.width, box.height); - - // Collection of HTML div layers for text overlaid onto the canvas - - this.SVGContainer = null; - this.SVG = {}; - - // Cache of text fragments and metrics, so we can avoid expensively - // re-calculating them when the plot is re-rendered in a loop. - - this._textCache = {}; - } - - /** - - resize(width, height) - - Resizes the canvas to the given dimensions. - The width represents the new width of the canvas, meanwhile the height - is the new height of the canvas, both of them in pixels. - */ - - Canvas.prototype.resize = function(width, height) { - var minSize = 10; - width = width < minSize ? minSize : width; - height = height < minSize ? minSize : height; - - var element = this.element, - context = this.context, - pixelRatio = this.pixelRatio; - - // Resize the canvas, increasing its density based on the display's - // pixel ratio; basically giving it more pixels without increasing the - // size of its element, to take advantage of the fact that retina - // displays have that many more pixels in the same advertised space. - - // Resizing should reset the state (excanvas seems to be buggy though) - - if (this.width !== width) { - element.width = width * pixelRatio; - element.style.width = width + 'px'; - this.width = width; - } - - if (this.height !== height) { - element.height = height * pixelRatio; - element.style.height = height + 'px'; - this.height = height; - } - - // Save the context, so we can reset in case we get replotted. The - // restore ensure that we're really back at the initial state, and - // should be safe even if we haven't saved the initial state yet. - - context.restore(); - context.save(); - - // Scale the coordinate space to match the display density; so even though we - // may have twice as many pixels, we still want lines and other drawing to - // appear at the same size; the extra pixels will just make them crisper. - - context.scale(pixelRatio, pixelRatio); - }; - - /** - - clear() - - Clears the entire canvas area, not including any overlaid HTML text - */ - Canvas.prototype.clear = function() { - this.context.clearRect(0, 0, this.width, this.height); - }; - - /** - - render() - - Finishes rendering the canvas, including managing the text overlay. - */ - Canvas.prototype.render = function() { - var cache = this._textCache; - - // For each text layer, add elements marked as active that haven't - // already been rendered, and remove those that are no longer active. - - for (var layerKey in cache) { - if (hasOwnProperty.call(cache, layerKey)) { - var layer = this.getSVGLayer(layerKey), - layerCache = cache[layerKey]; - - var display = layer.style.display; - layer.style.display = 'none'; - - for (var styleKey in layerCache) { - if (hasOwnProperty.call(layerCache, styleKey)) { - var styleCache = layerCache[styleKey]; - for (var key in styleCache) { - if (hasOwnProperty.call(styleCache, key)) { - var val = styleCache[key], - positions = val.positions; - - for (var i = 0, position; positions[i]; i++) { - position = positions[i]; - if (position.active) { - if (!position.rendered) { - layer.appendChild(position.element); - position.rendered = true; - } - } else { - positions.splice(i--, 1); - if (position.rendered) { - while (position.element.firstChild) { - position.element.removeChild(position.element.firstChild); - } - position.element.parentNode.removeChild(position.element); - } - } - } - - if (positions.length === 0) { - if (val.measured) { - val.measured = false; - } else { - delete styleCache[key]; - } - } - } - } - } - } - - layer.style.display = display; - } - } - }; - - /** - - getSVGLayer(classes) - - Creates (if necessary) and returns the SVG overlay container. - The classes string represents the string of space-separated CSS classes - used to uniquely identify the text layer. It return the svg-layer div. - */ - Canvas.prototype.getSVGLayer = function(classes) { - var layer = this.SVG[classes]; - - // Create the SVG layer if it doesn't exist - - if (!layer) { - // Create the svg layer container, if it doesn't exist - - var svgElement; - - if (!this.SVGContainer) { - this.SVGContainer = document.createElement('div'); - this.SVGContainer.className = 'flot-svg'; - this.SVGContainer.style.position = 'absolute'; - this.SVGContainer.style.top = '0px'; - this.SVGContainer.style.left = '0px'; - this.SVGContainer.style.bottom = '0px'; - this.SVGContainer.style.right = '0px'; - this.SVGContainer.style.pointerEvents = 'none'; - this.element.parentNode.appendChild(this.SVGContainer); - - svgElement = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); - svgElement.style.width = '100%'; - svgElement.style.height = '100%'; - - this.SVGContainer.appendChild(svgElement); - } else { - svgElement = this.SVGContainer.firstChild; - } - - layer = document.createElementNS('http://www.w3.org/2000/svg', 'g'); - layer.setAttribute('class', classes); - layer.style.position = 'absolute'; - layer.style.top = '0px'; - layer.style.left = '0px'; - layer.style.bottom = '0px'; - layer.style.right = '0px'; - svgElement.appendChild(layer); - this.SVG[classes] = layer; - } - - return layer; - }; - - /** - - getTextInfo(layer, text, font, angle, width) - - Creates (if necessary) and returns a text info object. - The object looks like this: - ```js - { - width //Width of the text's wrapper div. - height //Height of the text's wrapper div. - element //The HTML div containing the text. - positions //Array of positions at which this text is drawn. - } - ``` - The positions array contains objects that look like this: - ```js - { - active //Flag indicating whether the text should be visible. - rendered //Flag indicating whether the text is currently visible. - element //The HTML div containing the text. - text //The actual text and is identical with element[0].textContent. - x //X coordinate at which to draw the text. - y //Y coordinate at which to draw the text. - } - ``` - Each position after the first receives a clone of the original element. - The idea is that that the width, height, and general 'identity' of the - text is constant no matter where it is placed; the placements are a - secondary property. - - Canvas maintains a cache of recently-used text info objects; getTextInfo - either returns the cached element or creates a new entry. - - The layer parameter is string of space-separated CSS classes uniquely - identifying the layer containing this text. - Text is the text string to retrieve info for. - Font is either a string of space-separated CSS classes or a font-spec object, - defining the text's font and style. - Angle is the angle at which to rotate the text, in degrees. Angle is currently unused, - it will be implemented in the future. - The last parameter is the Maximum width of the text before it wraps. - The method returns a text info object. - */ - Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) { - var textStyle, layerCache, styleCache, info; - - // Cast the value to a string, in case we were given a number or such - - text = '' + text; - - // If the font is a font-spec object, generate a CSS font definition - - if (typeof font === 'object') { - textStyle = font.style + ' ' + font.variant + ' ' + font.weight + ' ' + font.size + 'px/' + font.lineHeight + 'px ' + font.family; - } else { - textStyle = font; - } - - // Retrieve (or create) the cache for the text's layer and styles - - layerCache = this._textCache[layer]; - - if (layerCache == null) { - layerCache = this._textCache[layer] = {}; - } - - styleCache = layerCache[textStyle]; - - if (styleCache == null) { - styleCache = layerCache[textStyle] = {}; - } - - var key = generateKey(text); - info = styleCache[key]; - - // If we can't find a matching element in our cache, create a new one - - if (!info) { - var element = document.createElementNS('http://www.w3.org/2000/svg', 'text'); - if (text.indexOf('
') !== -1) { - addTspanElements(text, element, -9999); - } else { - var textNode = document.createTextNode(text); - element.appendChild(textNode); - } - - element.style.position = 'absolute'; - element.style.maxWidth = width; - element.setAttributeNS(null, 'x', -9999); - element.setAttributeNS(null, 'y', -9999); - - if (typeof font === 'object') { - element.style.font = textStyle; - element.style.fill = font.fill; - } else if (typeof font === 'string') { - element.setAttribute('class', font); - } - - this.getSVGLayer(layer).appendChild(element); - var elementRect = element.getBBox(); - - info = styleCache[key] = { - width: elementRect.width, - height: elementRect.height, - measured: true, - element: element, - positions: [] - }; - - //remove elements from dom - while (element.firstChild) { - element.removeChild(element.firstChild); - } - element.parentNode.removeChild(element); - } - - info.measured = true; - return info; - }; - - /** - - addText (layer, x, y, text, font, angle, width, halign, valign, transforms) - - Adds a text string to the canvas text overlay. - The text isn't drawn immediately; it is marked as rendering, which will - result in its addition to the canvas on the next render pass. - - The layer is string of space-separated CSS classes uniquely - identifying the layer containing this text. - X and Y represents the X and Y coordinate at which to draw the text. - and text is the string to draw - */ - Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign, transforms) { - var info = this.getTextInfo(layer, text, font, angle, width), - positions = info.positions; - - // Tweak the div's position to match the text's alignment - - if (halign === 'center') { - x -= info.width / 2; - } else if (halign === 'right') { - x -= info.width; - } - - if (valign === 'middle') { - y -= info.height / 2; - } else if (valign === 'bottom') { - y -= info.height; - } - - y += 0.75 * info.height; - - // Determine whether this text already exists at this position. - // If so, mark it for inclusion in the next render pass. - - for (var i = 0, position; positions[i]; i++) { - position = positions[i]; - if (position.x === x && position.y === y && position.text === text) { - position.active = true; - return; - } else if (position.active === false) { - position.active = true; - position.text = text; - if (text.indexOf('
') !== -1) { - y -= 0.25 * info.height; - addTspanElements(text, position.element, x); - } else { - position.element.textContent = text; - } - position.element.setAttributeNS(null, 'x', x); - position.element.setAttributeNS(null, 'y', y); - position.x = x; - position.y = y; - return; - } - } - - // If the text doesn't exist at this position, create a new entry - - // For the very first position we'll re-use the original element, - // while for subsequent ones we'll clone it. - - position = { - active: true, - rendered: false, - element: positions.length ? info.element.cloneNode() : info.element, - text: text, - x: x, - y: y - }; - - positions.push(position); - - if (text.indexOf('
') !== -1) { - y -= 0.25 * info.height; - addTspanElements(text, position.element, x); - } else { - position.element.textContent = text; - } - - // Move the element to its final position within the container - position.element.setAttributeNS(null, 'x', x); - position.element.setAttributeNS(null, 'y', y); - position.element.style.textAlign = halign; - - if (transforms) { - transforms.forEach(function(t) { - info.element.transform.baseVal.appendItem(t); - }); - } - }; - - var addTspanElements = function(text, element, x) { - var lines = text.split('
'), - tspan, i, offset; - - for (i = 0; i < lines.length; i++) { - if (!element.childNodes[i]) { - tspan = document.createElementNS('http://www.w3.org/2000/svg', 'tspan'); - element.appendChild(tspan); - } else { - tspan = element.childNodes[i]; - } - tspan.textContent = lines[i]; - offset = i * 1 + 'em'; - tspan.setAttributeNS(null, 'dy', offset); - tspan.setAttributeNS(null, 'x', x); - } - } - - /** - - removeText (layer, x, y, text, font, angle) - - The function removes one or more text strings from the canvas text overlay. - If no parameters are given, all text within the layer is removed. - - Note that the text is not immediately removed; it is simply marked as - inactive, which will result in its removal on the next render pass. - This avoids the performance penalty for 'clear and redraw' behavior, - where we potentially get rid of all text on a layer, but will likely - add back most or all of it later, as when redrawing axes, for example. - - The layer is a string of space-separated CSS classes uniquely - identifying the layer containing this text. The following parameter are - X and Y coordinate of the text. - Text is the string to remove, while the font is either a string of space-separated CSS - classes or a font-spec object, defining the text's font and style. - */ - Canvas.prototype.removeText = function(layer, x, y, text, font, angle) { - var info, htmlYCoord; - if (text == null) { - var layerCache = this._textCache[layer]; - if (layerCache != null) { - for (var styleKey in layerCache) { - if (hasOwnProperty.call(layerCache, styleKey)) { - var styleCache = layerCache[styleKey]; - for (var key in styleCache) { - if (hasOwnProperty.call(styleCache, key)) { - var positions = styleCache[key].positions; - positions.forEach(function(position) { - position.active = false; - }); - } - } - } - } - } - } else { - info = this.getTextInfo(layer, text, font, angle); - positions = info.positions; - positions.forEach(function(position) { - htmlYCoord = y + 0.75 * info.height; - if (position.x === x && position.y === htmlYCoord && position.text === text) { - position.active = false; - } - }); - } - }; - - /** - - clearCache() - - Clears the cache used to speed up the text size measurements. - As an (unfortunate) side effect all text within the text Layer is removed. - Use this function before plot.setupGrid() and plot.draw() if the plot just - became visible or the styles changed. - */ - Canvas.prototype.clearCache = function() { - var cache = this._textCache; - for (var layerKey in cache) { - if (hasOwnProperty.call(cache, layerKey)) { - var layer = this.getSVGLayer(layerKey); - while (layer.firstChild) { - layer.removeChild(layer.firstChild); - } - } - }; - - this._textCache = {}; - }; - - function generateKey(text) { - return text.replace(/0|1|2|3|4|5|6|7|8|9/g, '0'); - } - - if (!window.Flot) { - window.Flot = {}; - } - - window.Flot.Canvas = Canvas; -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.colorhelpers.js b/extern/phmap/benchmark/js/jquery.colorhelpers.js deleted file mode 100644 index c59cf2f..0000000 --- a/extern/phmap/benchmark/js/jquery.colorhelpers.js +++ /dev/null @@ -1,199 +0,0 @@ -/* Plugin for jQuery for working with colors. - * - * Version 1.1. - * - * Inspiration from jQuery color animation plugin by John Resig. - * - * Released under the MIT license by Ole Laursen, October 2009. - * - * Examples: - * - * $.color.parse("#fff").scale('rgb', 0.25).add('a', -0.5).toString() - * var c = $.color.extract($("#mydiv"), 'background-color'); - * console.log(c.r, c.g, c.b, c.a); - * $.color.make(100, 50, 25, 0.4).toString() // returns "rgba(100,50,25,0.4)" - * - * Note that .scale() and .add() return the same modified object - * instead of making a new one. - * - * V. 1.1: Fix error handling so e.g. parsing an empty string does - * produce a color rather than just crashing. - */ - -(function($) { - $.color = {}; - - // construct color object with some convenient chainable helpers - $.color.make = function (r, g, b, a) { - var o = {}; - o.r = r || 0; - o.g = g || 0; - o.b = b || 0; - o.a = a != null ? a : 1; - - o.add = function (c, d) { - for (var i = 0; i < c.length; ++i) { - o[c.charAt(i)] += d; - } - - return o.normalize(); - }; - - o.scale = function (c, f) { - for (var i = 0; i < c.length; ++i) { - o[c.charAt(i)] *= f; - } - - return o.normalize(); - }; - - o.toString = function () { - if (o.a >= 1.0) { - return "rgb(" + [o.r, o.g, o.b].join(",") + ")"; - } else { - return "rgba(" + [o.r, o.g, o.b, o.a].join(",") + ")"; - } - }; - - o.normalize = function () { - function clamp(min, value, max) { - return value < min ? min : (value > max ? max : value); - } - - o.r = clamp(0, parseInt(o.r), 255); - o.g = clamp(0, parseInt(o.g), 255); - o.b = clamp(0, parseInt(o.b), 255); - o.a = clamp(0, o.a, 1); - return o; - }; - - o.clone = function () { - return $.color.make(o.r, o.b, o.g, o.a); - }; - - return o.normalize(); - } - - // extract CSS color property from element, going up in the DOM - // if it's "transparent" - $.color.extract = function (elem, css) { - var c; - - do { - c = elem.css(css).toLowerCase(); - // keep going until we find an element that has color, or - // we hit the body or root (have no parent) - if (c !== '' && c !== 'transparent') { - break; - } - - elem = elem.parent(); - } while (elem.length && !$.nodeName(elem.get(0), "body")); - - // catch Safari's way of signalling transparent - if (c === "rgba(0, 0, 0, 0)") { - c = "transparent"; - } - - return $.color.parse(c); - } - - // parse CSS color string (like "rgb(10, 32, 43)" or "#fff"), - // returns color object, if parsing failed, you get black (0, 0, - // 0) out - $.color.parse = function (str) { - var res, m = $.color.make; - - // Look for rgb(num,num,num) - res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str); - if (res) { - return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10)); - } - - // Look for rgba(num,num,num,num) - res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str) - if (res) { - return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4])); - } - - // Look for rgb(num%,num%,num%) - res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*\)/.exec(str); - if (res) { - return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55); - } - - // Look for rgba(num%,num%,num%,num) - res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str); - if (res) { - return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55, parseFloat(res[4])); - } - - // Look for #a0b1c2 - res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str); - if (res) { - return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)); - } - - // Look for #fff - res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str); - if (res) { - return m(parseInt(res[1] + res[1], 16), parseInt(res[2] + res[2], 16), parseInt(res[3] + res[3], 16)); - } - - // Otherwise, we're most likely dealing with a named color - var name = $.trim(str).toLowerCase(); - if (name === "transparent") { - return m(255, 255, 255, 0); - } else { - // default to black - res = lookupColors[name] || [0, 0, 0]; - return m(res[0], res[1], res[2]); - } - } - - var lookupColors = { - aqua: [0, 255, 255], - azure: [240, 255, 255], - beige: [245, 245, 220], - black: [0, 0, 0], - blue: [0, 0, 255], - brown: [165, 42, 42], - cyan: [0, 255, 255], - darkblue: [0, 0, 139], - darkcyan: [0, 139, 139], - darkgrey: [169, 169, 169], - darkgreen: [0, 100, 0], - darkkhaki: [189, 183, 107], - darkmagenta: [139, 0, 139], - darkolivegreen: [85, 107, 47], - darkorange: [255, 140, 0], - darkorchid: [153, 50, 204], - darkred: [139, 0, 0], - darksalmon: [233, 150, 122], - darkviolet: [148, 0, 211], - fuchsia: [255, 0, 255], - gold: [255, 215, 0], - green: [0, 128, 0], - indigo: [75, 0, 130], - khaki: [240, 230, 140], - lightblue: [173, 216, 230], - lightcyan: [224, 255, 255], - lightgreen: [144, 238, 144], - lightgrey: [211, 211, 211], - lightpink: [255, 182, 193], - lightyellow: [255, 255, 224], - lime: [0, 255, 0], - magenta: [255, 0, 255], - maroon: [128, 0, 0], - navy: [0, 0, 128], - olive: [128, 128, 0], - orange: [255, 165, 0], - pink: [255, 192, 203], - purple: [128, 0, 128], - violet: [128, 0, 128], - red: [255, 0, 0], - silver: [192, 192, 192], - white: [255, 255, 255], - yellow: [255, 255, 0] - }; -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.axislabels.js b/extern/phmap/benchmark/js/jquery.flot.axislabels.js deleted file mode 100644 index 8c80828..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.axislabels.js +++ /dev/null @@ -1,212 +0,0 @@ -/* -Axis label plugin for flot - -Derived from: -Axis Labels Plugin for flot. -http://github.com/markrcote/flot-axislabels - -Original code is Copyright (c) 2010 Xuan Luo. -Original code was released under the GPLv3 license by Xuan Luo, September 2010. -Original code was rereleased under the MIT license by Xuan Luo, April 2012. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -(function($) { - "use strict"; - - var options = { - axisLabels: { - show: true - } - }; - - function AxisLabel(axisName, position, padding, placeholder, axisLabel, surface) { - this.axisName = axisName; - this.position = position; - this.padding = padding; - this.placeholder = placeholder; - this.axisLabel = axisLabel; - this.surface = surface; - this.width = 0; - this.height = 0; - this.elem = null; - } - - AxisLabel.prototype.calculateSize = function() { - var axisId = this.axisName + 'Label', - layerId = axisId + 'Layer', - className = axisId + ' axisLabels'; - - var info = this.surface.getTextInfo(layerId, this.axisLabel, className); - this.labelWidth = info.width; - this.labelHeight = info.height; - - if (this.position === 'left' || this.position === 'right') { - this.width = this.labelHeight + this.padding; - this.height = 0; - } else { - this.width = 0; - this.height = this.labelHeight + this.padding; - } - }; - - AxisLabel.prototype.transforms = function(degrees, x, y, svgLayer) { - var transforms = [], translate, rotate; - if (x !== 0 || y !== 0) { - translate = svgLayer.createSVGTransform(); - translate.setTranslate(x, y); - transforms.push(translate); - } - if (degrees !== 0) { - rotate = svgLayer.createSVGTransform(); - var centerX = Math.round(this.labelWidth / 2), - centerY = 0; - rotate.setRotate(degrees, centerX, centerY); - transforms.push(rotate); - } - - return transforms; - }; - - AxisLabel.prototype.calculateOffsets = function(box) { - var offsets = { - x: 0, - y: 0, - degrees: 0 - }; - if (this.position === 'bottom') { - offsets.x = box.left + box.width / 2 - this.labelWidth / 2; - offsets.y = box.top + box.height - this.labelHeight; - } else if (this.position === 'top') { - offsets.x = box.left + box.width / 2 - this.labelWidth / 2; - offsets.y = box.top; - } else if (this.position === 'left') { - offsets.degrees = -90; - offsets.x = box.left - this.labelWidth / 2; - offsets.y = box.height / 2 + box.top; - } else if (this.position === 'right') { - offsets.degrees = 90; - offsets.x = box.left + box.width - this.labelWidth / 2; - offsets.y = box.height / 2 + box.top; - } - offsets.x = Math.round(offsets.x); - offsets.y = Math.round(offsets.y); - - return offsets; - }; - - AxisLabel.prototype.cleanup = function() { - var axisId = this.axisName + 'Label', - layerId = axisId + 'Layer', - className = axisId + ' axisLabels'; - this.surface.removeText(layerId, 0, 0, this.axisLabel, className); - }; - - AxisLabel.prototype.draw = function(box) { - var axisId = this.axisName + 'Label', - layerId = axisId + 'Layer', - className = axisId + ' axisLabels', - offsets = this.calculateOffsets(box), - style = { - position: 'absolute', - bottom: '', - right: '', - display: 'inline-block', - 'white-space': 'nowrap' - }; - - var layer = this.surface.getSVGLayer(layerId); - var transforms = this.transforms(offsets.degrees, offsets.x, offsets.y, layer.parentNode); - - this.surface.addText(layerId, 0, 0, this.axisLabel, className, undefined, undefined, undefined, undefined, transforms); - this.surface.render(); - Object.keys(style).forEach(function(key) { - layer.style[key] = style[key]; - }); - }; - - function init(plot) { - plot.hooks.processOptions.push(function(plot, options) { - if (!options.axisLabels.show) { - return; - } - - var axisLabels = {}; - var defaultPadding = 2; // padding between axis and tick labels - - plot.hooks.axisReserveSpace.push(function(plot, axis) { - var opts = axis.options; - var axisName = axis.direction + axis.n; - - axis.labelHeight += axis.boxPosition.centerY; - axis.labelWidth += axis.boxPosition.centerX; - - if (!opts || !opts.axisLabel || !axis.show) { - return; - } - - var padding = opts.axisLabelPadding === undefined - ? defaultPadding - : opts.axisLabelPadding; - - var axisLabel = axisLabels[axisName]; - if (!axisLabel) { - axisLabel = new AxisLabel(axisName, - opts.position, padding, - plot.getPlaceholder()[0], opts.axisLabel, plot.getSurface()); - axisLabels[axisName] = axisLabel; - } - - axisLabel.calculateSize(); - - // Incrementing the sizes of the tick labels. - axis.labelHeight += axisLabel.height; - axis.labelWidth += axisLabel.width; - }); - - // TODO - use the drawAxis hook - plot.hooks.draw.push(function(plot, ctx) { - $.each(plot.getAxes(), function(flotAxisName, axis) { - var opts = axis.options; - if (!opts || !opts.axisLabel || !axis.show) { - return; - } - - var axisName = axis.direction + axis.n; - axisLabels[axisName].draw(axis.box); - }); - }); - - plot.hooks.shutdown.push(function(plot, eventHolder) { - for (var axisName in axisLabels) { - axisLabels[axisName].cleanup(); - } - }); - }); - }; - - $.plot.plugins.push({ - init: init, - options: options, - name: 'axisLabels', - version: '3.0' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.browser.js b/extern/phmap/benchmark/js/jquery.flot.browser.js deleted file mode 100644 index e50a629..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.browser.js +++ /dev/null @@ -1,98 +0,0 @@ -/** ## jquery.flot.browser.js - -This plugin is used to make available some browser-related utility functions. - -### Methods -*/ - -(function ($) { - 'use strict'; - - var browser = { - /** - - getPageXY(e) - - Calculates the pageX and pageY using the screenX, screenY properties of the event - and the scrolling of the page. This is needed because the pageX and pageY - properties of the event are not correct while running tests in Edge. */ - getPageXY: function (e) { - // This code is inspired from https://stackoverflow.com/a/3464890 - var doc = document.documentElement, - pageX = e.clientX + (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0), - pageY = e.clientY + (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0); - return { X: pageX, Y: pageY }; - }, - - /** - - getPixelRatio(context) - - This function returns the current pixel ratio defined by the product of desktop - zoom and page zoom. - Additional info: https://www.html5rocks.com/en/tutorials/canvas/hidpi/ - */ - getPixelRatio: function(context) { - var devicePixelRatio = window.devicePixelRatio || 1, - backingStoreRatio = - context.webkitBackingStorePixelRatio || - context.mozBackingStorePixelRatio || - context.msBackingStorePixelRatio || - context.oBackingStorePixelRatio || - context.backingStorePixelRatio || 1; - return devicePixelRatio / backingStoreRatio; - }, - - /** - - isSafari, isMobileSafari, isOpera, isFirefox, isIE, isEdge, isChrome, isBlink - - This is a collection of functions, used to check if the code is running in a - particular browser or Javascript engine. - */ - isSafari: function() { - // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - // Safari 3.0+ "[object HTMLElementConstructor]" - return /constructor/i.test(window.top.HTMLElement) || (function (p) { return p.toString() === "[object SafariRemoteNotification]"; })(!window.top['safari'] || (typeof window.top.safari !== 'undefined' && window.top.safari.pushNotification)); - }, - - isMobileSafari: function() { - //isMobileSafari adapted from https://stackoverflow.com/questions/3007480/determine-if-user-navigated-from-mobile-safari - return navigator.userAgent.match(/(iPod|iPhone|iPad)/) && navigator.userAgent.match(/AppleWebKit/); - }, - - isOpera: function() { - // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - //Opera 8.0+ - return (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0; - }, - - isFirefox: function() { - // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - // Firefox 1.0+ - return typeof InstallTrigger !== 'undefined'; - }, - - isIE: function() { - // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - // Internet Explorer 6-11 - return /*@cc_on!@*/false || !!document.documentMode; - }, - - isEdge: function() { - // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - // Edge 20+ - return !browser.isIE() && !!window.StyleMedia; - }, - - isChrome: function() { - // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - // Chrome 1+ - return !!window.chrome && !!window.chrome.webstore; - }, - - isBlink: function() { - // *** https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser - return (browser.isChrome() || browser.isOpera()) && !!window.CSS; - } - }; - - $.plot.browser = browser; -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.categories.js b/extern/phmap/benchmark/js/jquery.flot.categories.js deleted file mode 100644 index af16f78..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.categories.js +++ /dev/null @@ -1,202 +0,0 @@ -/* Flot plugin for plotting textual data or categories. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -Consider a dataset like [["February", 34], ["March", 20], ...]. This plugin -allows you to plot such a dataset directly. - -To enable it, you must specify mode: "categories" on the axis with the textual -labels, e.g. - - $.plot("#placeholder", data, { xaxis: { mode: "categories" } }); - -By default, the labels are ordered as they are met in the data series. If you -need a different ordering, you can specify "categories" on the axis options -and list the categories there: - - xaxis: { - mode: "categories", - categories: ["February", "March", "April"] - } - -If you need to customize the distances between the categories, you can specify -"categories" as an object mapping labels to values - - xaxis: { - mode: "categories", - categories: { "February": 1, "March": 3, "April": 4 } - } - -If you don't specify all categories, the remaining categories will be numbered -from the max value plus 1 (with a spacing of 1 between each). - -Internally, the plugin works by transforming the input data through an auto- -generated mapping where the first category becomes 0, the second 1, etc. -Hence, a point like ["February", 34] becomes [0, 34] internally in Flot (this -is visible in hover and click events that return numbers rather than the -category labels). The plugin also overrides the tick generator to spit out the -categories as ticks instead of the values. - -If you need to map a value back to its label, the mapping is always accessible -as "categories" on the axis object, e.g. plot.getAxes().xaxis.categories. - -*/ - -(function ($) { - var options = { - xaxis: { - categories: null - }, - yaxis: { - categories: null - } - }; - - function processRawData(plot, series, data, datapoints) { - // if categories are enabled, we need to disable - // auto-transformation to numbers so the strings are intact - // for later processing - - var xCategories = series.xaxis.options.mode === "categories", - yCategories = series.yaxis.options.mode === "categories"; - - if (!(xCategories || yCategories)) { - return; - } - - var format = datapoints.format; - - if (!format) { - // FIXME: auto-detection should really not be defined here - var s = series; - format = []; - format.push({ x: true, number: true, required: true, computeRange: true}); - format.push({ y: true, number: true, required: true, computeRange: true }); - - if (s.bars.show || (s.lines.show && s.lines.fill)) { - var autoScale = !!((s.bars.show && s.bars.zero) || (s.lines.show && s.lines.zero)); - format.push({ y: true, number: true, required: false, defaultValue: 0, computeRange: autoScale }); - if (s.bars.horizontal) { - delete format[format.length - 1].y; - format[format.length - 1].x = true; - } - } - - datapoints.format = format; - } - - for (var m = 0; m < format.length; ++m) { - if (format[m].x && xCategories) { - format[m].number = false; - } - - if (format[m].y && yCategories) { - format[m].number = false; - format[m].computeRange = false; - } - } - } - - function getNextIndex(categories) { - var index = -1; - - for (var v in categories) { - if (categories[v] > index) { - index = categories[v]; - } - } - - return index + 1; - } - - function categoriesTickGenerator(axis) { - var res = []; - for (var label in axis.categories) { - var v = axis.categories[label]; - if (v >= axis.min && v <= axis.max) { - res.push([v, label]); - } - } - - res.sort(function (a, b) { return a[0] - b[0]; }); - - return res; - } - - function setupCategoriesForAxis(series, axis, datapoints) { - if (series[axis].options.mode !== "categories") { - return; - } - - if (!series[axis].categories) { - // parse options - var c = {}, o = series[axis].options.categories || {}; - if ($.isArray(o)) { - for (var i = 0; i < o.length; ++i) { - c[o[i]] = i; - } - } else { - for (var v in o) { - c[v] = o[v]; - } - } - - series[axis].categories = c; - } - - // fix ticks - if (!series[axis].options.ticks) { - series[axis].options.ticks = categoriesTickGenerator; - } - - transformPointsOnAxis(datapoints, axis, series[axis].categories); - } - - function transformPointsOnAxis(datapoints, axis, categories) { - // go through the points, transforming them - var points = datapoints.points, - ps = datapoints.pointsize, - format = datapoints.format, - formatColumn = axis.charAt(0), - index = getNextIndex(categories); - - for (var i = 0; i < points.length; i += ps) { - if (points[i] == null) { - continue; - } - - for (var m = 0; m < ps; ++m) { - var val = points[i + m]; - - if (val == null || !format[m][formatColumn]) { - continue; - } - - if (!(val in categories)) { - categories[val] = index; - ++index; - } - - points[i + m] = categories[val]; - } - } - } - - function processDatapoints(plot, series, datapoints) { - setupCategoriesForAxis(series, "xaxis", datapoints); - setupCategoriesForAxis(series, "yaxis", datapoints); - } - - function init(plot) { - plot.hooks.processRawData.push(processRawData); - plot.hooks.processDatapoints.push(processDatapoints); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'categories', - version: '1.0' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.composeImages.js b/extern/phmap/benchmark/js/jquery.flot.composeImages.js deleted file mode 100644 index a3d6fe6..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.composeImages.js +++ /dev/null @@ -1,325 +0,0 @@ -/** ## jquery.flot.composeImages.js - -This plugin is used to expose a function used to overlap several canvases and -SVGs, for the purpose of creating a snaphot out of them. - -### When composeImages is used: -When multiple canvases and SVGs have to be overlapped into a single image -and their offset on the page, must be preserved. - -### Where can be used: -In creating a downloadable snapshot of the plots, axes, cursors etc of a graph. - -### How it works: -The entry point is composeImages function. It expects an array of objects, -which should be either canvases or SVGs (or a mix). It does a prevalidation -of them, by verifying if they will be usable or not, later in the flow. -After selecting only usable sources, it passes them to getGenerateTempImg -function, which generates temporary images out of them. This function -expects that some of the passed sources (canvas or SVG) may still have -problems being converted to an image and makes sure the promises system, -used by composeImages function, moves forward. As an example, SVGs with -missing information from header or with unsupported content, may lead to -failure in generating the temporary image. Temporary images are required -mostly on extracting content from SVGs, but this is also where the x/y -offsets are extracted for each image which will be added. For SVGs in -particular, their CSS rules have to be applied. -After all temporary images are generated, they are overlapped using -getExecuteImgComposition function. This is where the destination canvas -is set to the proper dimensions. It is then output by composeImages. -This function returns a promise, which can be used to wait for the whole -composition process. It requires to be asynchronous, because this is how -temporary images load their data. -*/ - -(function($) { - "use strict"; - const GENERALFAILURECALLBACKERROR = -100; //simply a negative number - const SUCCESSFULIMAGEPREPARATION = 0; - const EMPTYARRAYOFIMAGESOURCES = -1; - const NEGATIVEIMAGESIZE = -2; - var pixelRatio = 1; - var browser = $.plot.browser; - var getPixelRatio = browser.getPixelRatio; - - function composeImages(canvasOrSvgSources, destinationCanvas) { - var validCanvasOrSvgSources = canvasOrSvgSources.filter(isValidSource); - pixelRatio = getPixelRatio(destinationCanvas.getContext('2d')); - - var allImgCompositionPromises = validCanvasOrSvgSources.map(function(validCanvasOrSvgSource) { - var tempImg = new Image(); - var currentPromise = new Promise(getGenerateTempImg(tempImg, validCanvasOrSvgSource)); - return currentPromise; - }); - - var lastPromise = Promise.all(allImgCompositionPromises).then(getExecuteImgComposition(destinationCanvas), failureCallback); - return lastPromise; - } - - function isValidSource(canvasOrSvgSource) { - var isValidFromCanvas = true; - var isValidFromContent = true; - if ((canvasOrSvgSource === null) || (canvasOrSvgSource === undefined)) { - isValidFromContent = false; - } else { - if (canvasOrSvgSource.tagName === 'CANVAS') { - if ((canvasOrSvgSource.getBoundingClientRect().right === canvasOrSvgSource.getBoundingClientRect().left) || - (canvasOrSvgSource.getBoundingClientRect().bottom === canvasOrSvgSource.getBoundingClientRect().top)) { - isValidFromCanvas = false; - } - } - } - return isValidFromContent && isValidFromCanvas && (window.getComputedStyle(canvasOrSvgSource).visibility === 'visible'); - } - - function getGenerateTempImg(tempImg, canvasOrSvgSource) { - tempImg.sourceDescription = ''; - tempImg.sourceComponent = canvasOrSvgSource; - - return function doGenerateTempImg(successCallbackFunc, failureCallbackFunc) { - tempImg.onload = function(evt) { - tempImg.successfullyLoaded = true; - successCallbackFunc(tempImg); - }; - - tempImg.onabort = function(evt) { - tempImg.successfullyLoaded = false; - console.log('Can\'t generate temp image from ' + tempImg.sourceDescription + '. It is possible that it is missing some properties or its content is not supported by this browser. Source component:', tempImg.sourceComponent); - successCallbackFunc(tempImg); //call successCallback, to allow snapshot of all working images - }; - - tempImg.onerror = function(evt) { - tempImg.successfullyLoaded = false; - console.log('Can\'t generate temp image from ' + tempImg.sourceDescription + '. It is possible that it is missing some properties or its content is not supported by this browser. Source component:', tempImg.sourceComponent); - successCallbackFunc(tempImg); //call successCallback, to allow snapshot of all working images - }; - - generateTempImageFromCanvasOrSvg(canvasOrSvgSource, tempImg); - }; - } - - function getExecuteImgComposition(destinationCanvas) { - return function executeImgComposition(tempImgs) { - var compositionResult = copyImgsToCanvas(tempImgs, destinationCanvas); - return compositionResult; - }; - } - - function copyCanvasToImg(canvas, img) { - img.src = canvas.toDataURL('image/png'); - } - - function getCSSRules(document) { - var styleSheets = document.styleSheets, - rulesList = []; - for (var i = 0; i < styleSheets.length; i++) { - // in Chrome, the external CSS files are empty when the page is directly loaded from disk - var rules = styleSheets[i].cssRules || []; - for (var j = 0; j < rules.length; j++) { - var rule = rules[j]; - rulesList.push(rule.cssText); - } - } - return rulesList; - } - - function embedCSSRulesInSVG(rules, svg) { - var text = [ - '', - '', - svg.innerHTML, - '' - ].join('\n'); - return text; - } - - function copySVGToImgMostBrowsers(svg, img) { - var rules = getCSSRules(document), - source = embedCSSRulesInSVG(rules, svg); - - source = patchSVGSource(source); - - var blob = new Blob([source], {type: "image/svg+xml;charset=utf-8"}), - domURL = self.URL || self.webkitURL || self, - url = domURL.createObjectURL(blob); - img.src = url; - } - - function copySVGToImgSafari(svg, img) { - // Use this method to convert a string buffer array to a binary string. - // Do so by breaking up large strings into smaller substrings; this is necessary to avoid the - // "maximum call stack size exceeded" exception that can happen when calling 'String.fromCharCode.apply' - // with a very long array. - function buildBinaryString (arrayBuffer) { - var binaryString = ""; - const utf8Array = new Uint8Array(arrayBuffer); - const blockSize = 16384; - for (var i = 0; i < utf8Array.length; i = i + blockSize) { - const binarySubString = String.fromCharCode.apply(null, utf8Array.subarray(i, i + blockSize)); - binaryString = binaryString + binarySubString; - } - return binaryString; - }; - - var rules = getCSSRules(document), - source = embedCSSRulesInSVG(rules, svg), - data, - utf8BinaryString; - - source = patchSVGSource(source); - - // Encode the string as UTF-8 and convert it to a binary string. The UTF-8 encoding is required to - // capture unicode characters correctly. - utf8BinaryString = buildBinaryString(new (TextEncoder || TextEncoderLite)('utf-8').encode(source)); - - data = "data:image/svg+xml;base64," + btoa(utf8BinaryString); - img.src = data; - } - - function patchSVGSource(svgSource) { - var source = ''; - //add name spaces. - if (!svgSource.match(/^]+xmlns="http:\/\/www\.w3\.org\/2000\/svg"/)) { - source = svgSource.replace(/^]+"http:\/\/www\.w3\.org\/1999\/xlink"/)) { - source = svgSource.replace(/^\r\n' + source; - } - - function copySVGToImg(svg, img) { - if (browser.isSafari() || browser.isMobileSafari()) { - copySVGToImgSafari(svg, img); - } else { - copySVGToImgMostBrowsers(svg, img); - } - } - - function adaptDestSizeToZoom(destinationCanvas, sources) { - function containsSVGs(source) { - return source.srcImgTagName === 'svg'; - } - - if (sources.find(containsSVGs) !== undefined) { - if (pixelRatio < 1) { - destinationCanvas.width = destinationCanvas.width * pixelRatio; - destinationCanvas.height = destinationCanvas.height * pixelRatio; - } - } - } - - function prepareImagesToBeComposed(sources, destination) { - var result = SUCCESSFULIMAGEPREPARATION; - if (sources.length === 0) { - result = EMPTYARRAYOFIMAGESOURCES; //nothing to do if called without sources - } else { - var minX = sources[0].genLeft; - var minY = sources[0].genTop; - var maxX = sources[0].genRight; - var maxY = sources[0].genBottom; - var i = 0; - - for (i = 1; i < sources.length; i++) { - if (minX > sources[i].genLeft) { - minX = sources[i].genLeft; - } - - if (minY > sources[i].genTop) { - minY = sources[i].genTop; - } - } - - for (i = 1; i < sources.length; i++) { - if (maxX < sources[i].genRight) { - maxX = sources[i].genRight; - } - - if (maxY < sources[i].genBottom) { - maxY = sources[i].genBottom; - } - } - - if ((maxX - minX <= 0) || (maxY - minY <= 0)) { - result = NEGATIVEIMAGESIZE; //this might occur on hidden images - } else { - destination.width = Math.round(maxX - minX); - destination.height = Math.round(maxY - minY); - - for (i = 0; i < sources.length; i++) { - sources[i].xCompOffset = sources[i].genLeft - minX; - sources[i].yCompOffset = sources[i].genTop - minY; - } - - adaptDestSizeToZoom(destination, sources); - } - } - return result; - } - - function copyImgsToCanvas(sources, destination) { - var prepareImagesResult = prepareImagesToBeComposed(sources, destination); - if (prepareImagesResult === SUCCESSFULIMAGEPREPARATION) { - var destinationCtx = destination.getContext('2d'); - - for (var i = 0; i < sources.length; i++) { - if (sources[i].successfullyLoaded === true) { - destinationCtx.drawImage(sources[i], sources[i].xCompOffset * pixelRatio, sources[i].yCompOffset * pixelRatio); - } - } - } - return prepareImagesResult; - } - - function adnotateDestImgWithBoundingClientRect(srcCanvasOrSvg, destImg) { - destImg.genLeft = srcCanvasOrSvg.getBoundingClientRect().left; - destImg.genTop = srcCanvasOrSvg.getBoundingClientRect().top; - - if (srcCanvasOrSvg.tagName === 'CANVAS') { - destImg.genRight = destImg.genLeft + srcCanvasOrSvg.width; - destImg.genBottom = destImg.genTop + srcCanvasOrSvg.height; - } - - if (srcCanvasOrSvg.tagName === 'svg') { - destImg.genRight = srcCanvasOrSvg.getBoundingClientRect().right; - destImg.genBottom = srcCanvasOrSvg.getBoundingClientRect().bottom; - } - } - - function generateTempImageFromCanvasOrSvg(srcCanvasOrSvg, destImg) { - if (srcCanvasOrSvg.tagName === 'CANVAS') { - copyCanvasToImg(srcCanvasOrSvg, destImg); - } - - if (srcCanvasOrSvg.tagName === 'svg') { - copySVGToImg(srcCanvasOrSvg, destImg); - } - - destImg.srcImgTagName = srcCanvasOrSvg.tagName; - adnotateDestImgWithBoundingClientRect(srcCanvasOrSvg, destImg); - } - - function failureCallback() { - return GENERALFAILURECALLBACKERROR; - } - - // used for testing - $.plot.composeImages = composeImages; - - function init(plot) { - // used to extend the public API of the plot - plot.composeImages = composeImages; - } - - $.plot.plugins.push({ - init: init, - name: 'composeImages', - version: '1.0' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.crosshair.js b/extern/phmap/benchmark/js/jquery.flot.crosshair.js deleted file mode 100644 index 385c705..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.crosshair.js +++ /dev/null @@ -1,202 +0,0 @@ -/* Flot plugin for showing crosshairs when the mouse hovers over the plot. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -The plugin supports these options: - - crosshair: { - mode: null or "x" or "y" or "xy" - color: color - lineWidth: number - } - -Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical -crosshair that lets you trace the values on the x axis, "y" enables a -horizontal crosshair and "xy" enables them both. "color" is the color of the -crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of -the drawn lines (default is 1). - -The plugin also adds four public methods: - - - setCrosshair( pos ) - - Set the position of the crosshair. Note that this is cleared if the user - moves the mouse. "pos" is in coordinates of the plot and should be on the - form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple - axes), which is coincidentally the same format as what you get from a - "plothover" event. If "pos" is null, the crosshair is cleared. - - - clearCrosshair() - - Clear the crosshair. - - - lockCrosshair(pos) - - Cause the crosshair to lock to the current location, no longer updating if - the user moves the mouse. Optionally supply a position (passed on to - setCrosshair()) to move it to. - - Example usage: - - var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } }; - $("#graph").bind( "plothover", function ( evt, position, item ) { - if ( item ) { - // Lock the crosshair to the data point being hovered - myFlot.lockCrosshair({ - x: item.datapoint[ 0 ], - y: item.datapoint[ 1 ] - }); - } else { - // Return normal crosshair operation - myFlot.unlockCrosshair(); - } - }); - - - unlockCrosshair() - - Free the crosshair to move again after locking it. -*/ - -(function ($) { - var options = { - crosshair: { - mode: null, // one of null, "x", "y" or "xy", - color: "rgba(170, 0, 0, 0.80)", - lineWidth: 1 - } - }; - - function init(plot) { - // position of crosshair in pixels - var crosshair = {x: -1, y: -1, locked: false, highlighted: false}; - - plot.setCrosshair = function setCrosshair(pos) { - if (!pos) { - crosshair.x = -1; - } else { - var o = plot.p2c(pos); - crosshair.x = Math.max(0, Math.min(o.left, plot.width())); - crosshair.y = Math.max(0, Math.min(o.top, plot.height())); - } - - plot.triggerRedrawOverlay(); - }; - - plot.clearCrosshair = plot.setCrosshair; // passes null for pos - - plot.lockCrosshair = function lockCrosshair(pos) { - if (pos) { - plot.setCrosshair(pos); - } - - crosshair.locked = true; - }; - - plot.unlockCrosshair = function unlockCrosshair() { - crosshair.locked = false; - crosshair.rect = null; - }; - - function onMouseOut(e) { - if (crosshair.locked) { - return; - } - - if (crosshair.x !== -1) { - crosshair.x = -1; - plot.triggerRedrawOverlay(); - } - } - - function onMouseMove(e) { - var offset = plot.offset(); - if (crosshair.locked) { - var mouseX = Math.max(0, Math.min(e.pageX - offset.left, plot.width())); - var mouseY = Math.max(0, Math.min(e.pageY - offset.top, plot.height())); - - if ((mouseX > crosshair.x - 4) && (mouseX < crosshair.x + 4) && (mouseY > crosshair.y - 4) && (mouseY < crosshair.y + 4)) { - if (!crosshair.highlighted) { - crosshair.highlighted = true; - plot.triggerRedrawOverlay(); - } - } else { - if (crosshair.highlighted) { - crosshair.highlighted = false; - plot.triggerRedrawOverlay(); - } - } - return; - } - - if (plot.getSelection && plot.getSelection()) { - crosshair.x = -1; // hide the crosshair while selecting - return; - } - - crosshair.x = Math.max(0, Math.min(e.pageX - offset.left, plot.width())); - crosshair.y = Math.max(0, Math.min(e.pageY - offset.top, plot.height())); - plot.triggerRedrawOverlay(); - } - - plot.hooks.bindEvents.push(function (plot, eventHolder) { - if (!plot.getOptions().crosshair.mode) { - return; - } - - eventHolder.mouseout(onMouseOut); - eventHolder.mousemove(onMouseMove); - }); - - plot.hooks.drawOverlay.push(function (plot, ctx) { - var c = plot.getOptions().crosshair; - if (!c.mode) { - return; - } - - var plotOffset = plot.getPlotOffset(); - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - if (crosshair.x !== -1) { - var adj = plot.getOptions().crosshair.lineWidth % 2 ? 0.5 : 0; - - ctx.strokeStyle = c.color; - ctx.lineWidth = c.lineWidth; - ctx.lineJoin = "round"; - - ctx.beginPath(); - if (c.mode.indexOf("x") !== -1) { - var drawX = Math.floor(crosshair.x) + adj; - ctx.moveTo(drawX, 0); - ctx.lineTo(drawX, plot.height()); - } - if (c.mode.indexOf("y") !== -1) { - var drawY = Math.floor(crosshair.y) + adj; - ctx.moveTo(0, drawY); - ctx.lineTo(plot.width(), drawY); - } - if (crosshair.locked) { - if (crosshair.highlighted) ctx.fillStyle = 'orange'; - else ctx.fillStyle = c.color; - ctx.fillRect(Math.floor(crosshair.x) + adj - 4, Math.floor(crosshair.y) + adj - 4, 8, 8); - } - ctx.stroke(); - } - ctx.restore(); - }); - - plot.hooks.shutdown.push(function (plot, eventHolder) { - eventHolder.unbind("mouseout", onMouseOut); - eventHolder.unbind("mousemove", onMouseMove); - }); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'crosshair', - version: '1.0' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.drawSeries.js b/extern/phmap/benchmark/js/jquery.flot.drawSeries.js deleted file mode 100644 index 472ad30..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.drawSeries.js +++ /dev/null @@ -1,604 +0,0 @@ -/** -## jquery.flot.drawSeries.js - -This plugin is used by flot for drawing lines, plots, bars or area. - -### Public methods -*/ - -(function($) { - "use strict"; - - function DrawSeries() { - function plotLine(datapoints, xoffset, yoffset, axisx, axisy, ctx) { - var points = datapoints.points, - ps = datapoints.pointsize, - prevx = null, - prevy = null; - var x1 = 0.0, - y1 = 0.0, - x2 = 0.0, - y2 = 0.0, - i = 0; - - ctx.beginPath(); - for (i = ps; i < points.length; i += ps) { - x1 = points[i - ps]; - y1 = points[i - ps + 1]; - x2 = points[i]; - y2 = points[i + 1]; - - if (x1 === null || x2 === null) { - continue; - } - - // clip with ymin - if (y1 <= y2 && y1 < axisy.min) { - if (y2 < axisy.min) { - // line segment is outside - continue; - } - // compute new intersection point - x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.min; - } else if (y2 <= y1 && y2 < axisy.min) { - if (y1 < axisy.min) { - continue; - } - - x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.min; - } - - // clip with ymax - if (y1 >= y2 && y1 > axisy.max) { - if (y2 > axisy.max) { - continue; - } - - x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.max; - } else if (y2 >= y1 && y2 > axisy.max) { - if (y1 > axisy.max) { - continue; - } - - x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.max; - } - - // clip with xmin - if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) { - continue; - } - - y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.min; - } else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) { - continue; - } - - y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.min; - } - - // clip with xmax - if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) { - continue; - } - - y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.max; - } else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) { - continue; - } - - y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.max; - } - - if (x1 !== prevx || y1 !== prevy) { - ctx.moveTo(axisx.p2c(x1) + xoffset, axisy.p2c(y1) + yoffset); - } - - prevx = x2; - prevy = y2; - ctx.lineTo(axisx.p2c(x2) + xoffset, axisy.p2c(y2) + yoffset); - } - ctx.stroke(); - } - - function plotLineArea(datapoints, axisx, axisy, fillTowards, ctx) { - var points = datapoints.points, - ps = datapoints.pointsize, - bottom = fillTowards > axisy.min ? Math.min(axisy.max, fillTowards) : axisy.min, - i = 0, - ypos = 1, - areaOpen = false, - segmentStart = 0, - segmentEnd = 0; - - // we process each segment in two turns, first forward - // direction to sketch out top, then once we hit the - // end we go backwards to sketch the bottom - while (true) { - if (ps > 0 && i > points.length + ps) { - break; - } - - i += ps; // ps is negative if going backwards - - var x1 = points[i - ps], - y1 = points[i - ps + ypos], - x2 = points[i], - y2 = points[i + ypos]; - - if (ps === -2) { - /* going backwards and no value for the bottom provided in the series*/ - y1 = y2 = bottom; - } - - if (areaOpen) { - if (ps > 0 && x1 != null && x2 == null) { - // at turning point - segmentEnd = i; - ps = -ps; - ypos = 2; - continue; - } - - if (ps < 0 && i === segmentStart + ps) { - // done with the reverse sweep - ctx.fill(); - areaOpen = false; - ps = -ps; - i = segmentStart = segmentEnd + ps; - continue; - } - } - - if (x1 == null || x2 == null) { - continue; - } - - // clip x values - - // clip with xmin - if (x1 <= x2 && x1 < axisx.min) { - if (x2 < axisx.min) { - continue; - } - - y1 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.min; - } else if (x2 <= x1 && x2 < axisx.min) { - if (x1 < axisx.min) { - continue; - } - - y2 = (axisx.min - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.min; - } - - // clip with xmax - if (x1 >= x2 && x1 > axisx.max) { - if (x2 > axisx.max) { - continue; - } - - y1 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x1 = axisx.max; - } else if (x2 >= x1 && x2 > axisx.max) { - if (x1 > axisx.max) { - continue; - } - - y2 = (axisx.max - x1) / (x2 - x1) * (y2 - y1) + y1; - x2 = axisx.max; - } - - if (!areaOpen) { - // open area - ctx.beginPath(); - ctx.moveTo(axisx.p2c(x1), axisy.p2c(bottom)); - areaOpen = true; - } - - // now first check the case where both is outside - if (y1 >= axisy.max && y2 >= axisy.max) { - ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.max)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.max)); - continue; - } else if (y1 <= axisy.min && y2 <= axisy.min) { - ctx.lineTo(axisx.p2c(x1), axisy.p2c(axisy.min)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(axisy.min)); - continue; - } - - // else it's a bit more complicated, there might - // be a flat maxed out rectangle first, then a - // triangular cutout or reverse; to find these - // keep track of the current x values - var x1old = x1, - x2old = x2; - - // clip the y values, without shortcutting, we - // go through all cases in turn - - // clip with ymin - if (y1 <= y2 && y1 < axisy.min && y2 >= axisy.min) { - x1 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.min; - } else if (y2 <= y1 && y2 < axisy.min && y1 >= axisy.min) { - x2 = (axisy.min - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.min; - } - - // clip with ymax - if (y1 >= y2 && y1 > axisy.max && y2 <= axisy.max) { - x1 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y1 = axisy.max; - } else if (y2 >= y1 && y2 > axisy.max && y1 <= axisy.max) { - x2 = (axisy.max - y1) / (y2 - y1) * (x2 - x1) + x1; - y2 = axisy.max; - } - - // if the x value was changed we got a rectangle - // to fill - if (x1 !== x1old) { - ctx.lineTo(axisx.p2c(x1old), axisy.p2c(y1)); - // it goes to (x1, y1), but we fill that below - } - - // fill triangular section, this sometimes result - // in redundant points if (x1, y1) hasn't changed - // from previous line to, but we just ignore that - ctx.lineTo(axisx.p2c(x1), axisy.p2c(y1)); - ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); - - // fill the other rectangle if it's there - if (x2 !== x2old) { - ctx.lineTo(axisx.p2c(x2), axisy.p2c(y2)); - ctx.lineTo(axisx.p2c(x2old), axisy.p2c(y2)); - } - } - } - - /** - - drawSeriesLines(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) - - This function is used for drawing lines or area fill. In case the series has line decimation function - attached, before starting to draw, as an optimization the points will first be decimated. - - The series parameter contains the series to be drawn on ctx context. The plotOffset, plotWidth and - plotHeight are the corresponding parameters of flot used to determine the drawing surface. - The function getColorOrGradient is used to compute the fill style of lines and area. - */ - function drawSeriesLines(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) { - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - ctx.lineJoin = "round"; - - if (series.lines.dashes && ctx.setLineDash) { - ctx.setLineDash(series.lines.dashes); - } - - var datapoints = { - format: series.datapoints.format, - points: series.datapoints.points, - pointsize: series.datapoints.pointsize - }; - - if (series.decimate) { - datapoints.points = series.decimate(series, series.xaxis.min, series.xaxis.max, plotWidth, series.yaxis.min, series.yaxis.max, plotHeight); - } - - var lw = series.lines.lineWidth; - - ctx.lineWidth = lw; - ctx.strokeStyle = series.color; - var fillStyle = getFillStyle(series.lines, series.color, 0, plotHeight, getColorOrGradient); - if (fillStyle) { - ctx.fillStyle = fillStyle; - plotLineArea(datapoints, series.xaxis, series.yaxis, series.lines.fillTowards || 0, ctx); - } - - if (lw > 0) { - plotLine(datapoints, 0, 0, series.xaxis, series.yaxis, ctx); - } - - ctx.restore(); - } - - /** - - drawSeriesPoints(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) - - This function is used for drawing points using a given symbol. In case the series has points decimation - function attached, before starting to draw, as an optimization the points will first be decimated. - - The series parameter contains the series to be drawn on ctx context. The plotOffset, plotWidth and - plotHeight are the corresponding parameters of flot used to determine the drawing surface. - The function drawSymbol is used to compute and draw the symbol chosen for the points. - */ - function drawSeriesPoints(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) { - function drawCircle(ctx, x, y, radius, shadow, fill) { - ctx.moveTo(x + radius, y); - ctx.arc(x, y, radius, 0, shadow ? Math.PI : Math.PI * 2, false); - } - drawCircle.fill = true; - function plotPoints(datapoints, radius, fill, offset, shadow, axisx, axisy, drawSymbolFn) { - var points = datapoints.points, - ps = datapoints.pointsize; - - ctx.beginPath(); - for (var i = 0; i < points.length; i += ps) { - var x = points[i], - y = points[i + 1]; - if (x == null || x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) { - continue; - } - - x = axisx.p2c(x); - y = axisy.p2c(y) + offset; - - drawSymbolFn(ctx, x, y, radius, shadow, fill); - } - if (drawSymbolFn.fill && !shadow) { - ctx.fill(); - } - ctx.stroke(); - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - var datapoints = { - format: series.datapoints.format, - points: series.datapoints.points, - pointsize: series.datapoints.pointsize - }; - - if (series.decimatePoints) { - datapoints.points = series.decimatePoints(series, series.xaxis.min, series.xaxis.max, plotWidth, series.yaxis.min, series.yaxis.max, plotHeight); - } - - var lw = series.points.lineWidth, - radius = series.points.radius, - symbol = series.points.symbol, - drawSymbolFn; - - if (symbol === 'circle') { - drawSymbolFn = drawCircle; - } else if (typeof symbol === 'string' && drawSymbol && drawSymbol[symbol]) { - drawSymbolFn = drawSymbol[symbol]; - } else if (typeof drawSymbol === 'function') { - drawSymbolFn = drawSymbol; - } - - // If the user sets the line width to 0, we change it to a very - // small value. A line width of 0 seems to force the default of 1. - - if (lw === 0) { - lw = 0.0001; - } - - ctx.lineWidth = lw; - ctx.fillStyle = getFillStyle(series.points, series.color, null, null, getColorOrGradient); - ctx.strokeStyle = series.color; - plotPoints(datapoints, radius, - true, 0, false, - series.xaxis, series.yaxis, drawSymbolFn); - ctx.restore(); - } - - function drawBar(x, y, b, barLeft, barRight, fillStyleCallback, axisx, axisy, c, horizontal, lineWidth) { - var left = x + barLeft, - right = x + barRight, - bottom = b, top = y, - drawLeft, drawRight, drawTop, drawBottom = false, - tmp; - - drawLeft = drawRight = drawTop = true; - - // in horizontal mode, we start the bar from the left - // instead of from the bottom so it appears to be - // horizontal rather than vertical - if (horizontal) { - drawBottom = drawRight = drawTop = true; - drawLeft = false; - left = b; - right = x; - top = y + barLeft; - bottom = y + barRight; - - // account for negative bars - if (right < left) { - tmp = right; - right = left; - left = tmp; - drawLeft = true; - drawRight = false; - } - } - else { - drawLeft = drawRight = drawTop = true; - drawBottom = false; - left = x + barLeft; - right = x + barRight; - bottom = b; - top = y; - - // account for negative bars - if (top < bottom) { - tmp = top; - top = bottom; - bottom = tmp; - drawBottom = true; - drawTop = false; - } - } - - // clip - if (right < axisx.min || left > axisx.max || - top < axisy.min || bottom > axisy.max) { - return; - } - - if (left < axisx.min) { - left = axisx.min; - drawLeft = false; - } - - if (right > axisx.max) { - right = axisx.max; - drawRight = false; - } - - if (bottom < axisy.min) { - bottom = axisy.min; - drawBottom = false; - } - - if (top > axisy.max) { - top = axisy.max; - drawTop = false; - } - - left = axisx.p2c(left); - bottom = axisy.p2c(bottom); - right = axisx.p2c(right); - top = axisy.p2c(top); - - // fill the bar - if (fillStyleCallback) { - c.fillStyle = fillStyleCallback(bottom, top); - c.fillRect(left, top, right - left, bottom - top) - } - - // draw outline - if (lineWidth > 0 && (drawLeft || drawRight || drawTop || drawBottom)) { - c.beginPath(); - - // FIXME: inline moveTo is buggy with excanvas - c.moveTo(left, bottom); - if (drawLeft) { - c.lineTo(left, top); - } else { - c.moveTo(left, top); - } - - if (drawTop) { - c.lineTo(right, top); - } else { - c.moveTo(right, top); - } - - if (drawRight) { - c.lineTo(right, bottom); - } else { - c.moveTo(right, bottom); - } - - if (drawBottom) { - c.lineTo(left, bottom); - } else { - c.moveTo(left, bottom); - } - - c.stroke(); - } - } - - /** - - drawSeriesBars(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) - - This function is used for drawing series represented as bars. In case the series has decimation - function attached, before starting to draw, as an optimization the points will first be decimated. - - The series parameter contains the series to be drawn on ctx context. The plotOffset, plotWidth and - plotHeight are the corresponding parameters of flot used to determine the drawing surface. - The function getColorOrGradient is used to compute the fill style of bars. - */ - function drawSeriesBars(series, ctx, plotOffset, plotWidth, plotHeight, drawSymbol, getColorOrGradient) { - function plotBars(datapoints, barLeft, barRight, fillStyleCallback, axisx, axisy) { - var points = datapoints.points, - ps = datapoints.pointsize, - fillTowards = series.bars.fillTowards || 0, - calculatedBottom = fillTowards > axisy.min ? Math.min(axisy.max, fillTowards) : axisy.min; - - for (var i = 0; i < points.length; i += ps) { - if (points[i] == null) { - continue; - } - - // Use third point as bottom if pointsize is 3 - var bottom = ps === 3 ? points[i + 2] : calculatedBottom; - drawBar(points[i], points[i + 1], bottom, barLeft, barRight, fillStyleCallback, axisx, axisy, ctx, series.bars.horizontal, series.bars.lineWidth); - } - } - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - var datapoints = { - format: series.datapoints.format, - points: series.datapoints.points, - pointsize: series.datapoints.pointsize - }; - - if (series.decimate) { - datapoints.points = series.decimate(series, series.xaxis.min, series.xaxis.max, plotWidth); - } - - ctx.lineWidth = series.bars.lineWidth; - ctx.strokeStyle = series.color; - - var barLeft; - var barWidth = series.bars.barWidth[0] || series.bars.barWidth; - switch (series.bars.align) { - case "left": - barLeft = 0; - break; - case "right": - barLeft = -barWidth; - break; - default: - barLeft = -barWidth / 2; - } - - var fillStyleCallback = series.bars.fill ? function(bottom, top) { - return getFillStyle(series.bars, series.color, bottom, top, getColorOrGradient); - } : null; - - plotBars(datapoints, barLeft, barLeft + barWidth, fillStyleCallback, series.xaxis, series.yaxis); - ctx.restore(); - } - - function getFillStyle(filloptions, seriesColor, bottom, top, getColorOrGradient) { - var fill = filloptions.fill; - if (!fill) { - return null; - } - - if (filloptions.fillColor) { - return getColorOrGradient(filloptions.fillColor, bottom, top, seriesColor); - } - - var c = $.color.parse(seriesColor); - c.a = typeof fill === "number" ? fill : 0.4; - c.normalize(); - return c.toString(); - } - - this.drawSeriesLines = drawSeriesLines; - this.drawSeriesPoints = drawSeriesPoints; - this.drawSeriesBars = drawSeriesBars; - this.drawBar = drawBar; - }; - - $.plot.drawSeries = new DrawSeries(); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.errorbars.js b/extern/phmap/benchmark/js/jquery.flot.errorbars.js deleted file mode 100644 index 956562e..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.errorbars.js +++ /dev/null @@ -1,375 +0,0 @@ -/* Flot plugin for plotting error bars. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -Error bars are used to show standard deviation and other statistical -properties in a plot. - -* Created by Rui Pereira - rui (dot) pereira (at) gmail (dot) com - -This plugin allows you to plot error-bars over points. Set "errorbars" inside -the points series to the axis name over which there will be error values in -your data array (*even* if you do not intend to plot them later, by setting -"show: null" on xerr/yerr). - -The plugin supports these options: - - series: { - points: { - errorbars: "x" or "y" or "xy", - xerr: { - show: null/false or true, - asymmetric: null/false or true, - upperCap: null or "-" or function, - lowerCap: null or "-" or function, - color: null or color, - radius: null or number - }, - yerr: { same options as xerr } - } - } - -Each data point array is expected to be of the type: - - "x" [ x, y, xerr ] - "y" [ x, y, yerr ] - "xy" [ x, y, xerr, yerr ] - -Where xerr becomes xerr_lower,xerr_upper for the asymmetric error case, and -equivalently for yerr. Eg., a datapoint for the "xy" case with symmetric -error-bars on X and asymmetric on Y would be: - - [ x, y, xerr, yerr_lower, yerr_upper ] - -By default no end caps are drawn. Setting upperCap and/or lowerCap to "-" will -draw a small cap perpendicular to the error bar. They can also be set to a -user-defined drawing function, with (ctx, x, y, radius) as parameters, as eg. - - function drawSemiCircle( ctx, x, y, radius ) { - ctx.beginPath(); - ctx.arc( x, y, radius, 0, Math.PI, false ); - ctx.moveTo( x - radius, y ); - ctx.lineTo( x + radius, y ); - ctx.stroke(); - } - -Color and radius both default to the same ones of the points series if not -set. The independent radius parameter on xerr/yerr is useful for the case when -we may want to add error-bars to a line, without showing the interconnecting -points (with radius: 0), and still showing end caps on the error-bars. -shadowSize and lineWidth are derived as well from the points series. - -*/ - -(function ($) { - var options = { - series: { - points: { - errorbars: null, //should be 'x', 'y' or 'xy' - xerr: {err: 'x', show: null, asymmetric: null, upperCap: null, lowerCap: null, color: null, radius: null}, - yerr: {err: 'y', show: null, asymmetric: null, upperCap: null, lowerCap: null, color: null, radius: null} - } - } - }; - - function processRawData(plot, series, data, datapoints) { - if (!series.points.errorbars) { - return; - } - - // x,y values - var format = [ - { x: true, number: true, required: true }, - { y: true, number: true, required: true } - ]; - - var errors = series.points.errorbars; - // error bars - first X then Y - if (errors === 'x' || errors === 'xy') { - // lower / upper error - if (series.points.xerr.asymmetric) { - format.push({ x: true, number: true, required: true }); - format.push({ x: true, number: true, required: true }); - } else { - format.push({ x: true, number: true, required: true }); - } - } - if (errors === 'y' || errors === 'xy') { - // lower / upper error - if (series.points.yerr.asymmetric) { - format.push({ y: true, number: true, required: true }); - format.push({ y: true, number: true, required: true }); - } else { - format.push({ y: true, number: true, required: true }); - } - } - datapoints.format = format; - } - - function parseErrors(series, i) { - var points = series.datapoints.points; - - // read errors from points array - var exl = null, - exu = null, - eyl = null, - eyu = null; - var xerr = series.points.xerr, - yerr = series.points.yerr; - - var eb = series.points.errorbars; - // error bars - first X - if (eb === 'x' || eb === 'xy') { - if (xerr.asymmetric) { - exl = points[i + 2]; - exu = points[i + 3]; - if (eb === 'xy') { - if (yerr.asymmetric) { - eyl = points[i + 4]; - eyu = points[i + 5]; - } else { - eyl = points[i + 4]; - } - } - } else { - exl = points[i + 2]; - if (eb === 'xy') { - if (yerr.asymmetric) { - eyl = points[i + 3]; - eyu = points[i + 4]; - } else { - eyl = points[i + 3]; - } - } - } - // only Y - } else { - if (eb === 'y') { - if (yerr.asymmetric) { - eyl = points[i + 2]; - eyu = points[i + 3]; - } else { - eyl = points[i + 2]; - } - } - } - - // symmetric errors? - if (exu == null) exu = exl; - if (eyu == null) eyu = eyl; - - var errRanges = [exl, exu, eyl, eyu]; - // nullify if not showing - if (!xerr.show) { - errRanges[0] = null; - errRanges[1] = null; - } - if (!yerr.show) { - errRanges[2] = null; - errRanges[3] = null; - } - return errRanges; - } - - function drawSeriesErrors(plot, ctx, s) { - var points = s.datapoints.points, - ps = s.datapoints.pointsize, - ax = [s.xaxis, s.yaxis], - radius = s.points.radius, - err = [s.points.xerr, s.points.yerr], - tmp; - - //sanity check, in case some inverted axis hack is applied to flot - var invertX = false; - if (ax[0].p2c(ax[0].max) < ax[0].p2c(ax[0].min)) { - invertX = true; - tmp = err[0].lowerCap; - err[0].lowerCap = err[0].upperCap; - err[0].upperCap = tmp; - } - - var invertY = false; - if (ax[1].p2c(ax[1].min) < ax[1].p2c(ax[1].max)) { - invertY = true; - tmp = err[1].lowerCap; - err[1].lowerCap = err[1].upperCap; - err[1].upperCap = tmp; - } - - for (var i = 0; i < s.datapoints.points.length; i += ps) { - //parse - var errRanges = parseErrors(s, i); - - //cycle xerr & yerr - for (var e = 0; e < err.length; e++) { - var minmax = [ax[e].min, ax[e].max]; - - //draw this error? - if (errRanges[e * err.length]) { - //data coordinates - var x = points[i], - y = points[i + 1]; - - //errorbar ranges - var upper = [x, y][e] + errRanges[e * err.length + 1], - lower = [x, y][e] - errRanges[e * err.length]; - - //points outside of the canvas - if (err[e].err === 'x') { - if (y > ax[1].max || y < ax[1].min || upper < ax[0].min || lower > ax[0].max) { - continue; - } - } - - if (err[e].err === 'y') { - if (x > ax[0].max || x < ax[0].min || upper < ax[1].min || lower > ax[1].max) { - continue; - } - } - - // prevent errorbars getting out of the canvas - var drawUpper = true, - drawLower = true; - - if (upper > minmax[1]) { - drawUpper = false; - upper = minmax[1]; - } - if (lower < minmax[0]) { - drawLower = false; - lower = minmax[0]; - } - - //sanity check, in case some inverted axis hack is applied to flot - if ((err[e].err === 'x' && invertX) || (err[e].err === 'y' && invertY)) { - //swap coordinates - tmp = lower; - lower = upper; - upper = tmp; - tmp = drawLower; - drawLower = drawUpper; - drawUpper = tmp; - tmp = minmax[0]; - minmax[0] = minmax[1]; - minmax[1] = tmp; - } - - // convert to pixels - x = ax[0].p2c(x); - y = ax[1].p2c(y); - upper = ax[e].p2c(upper); - lower = ax[e].p2c(lower); - minmax[0] = ax[e].p2c(minmax[0]); - minmax[1] = ax[e].p2c(minmax[1]); - - //same style as points by default - var lw = err[e].lineWidth ? err[e].lineWidth : s.points.lineWidth, - sw = s.points.shadowSize != null ? s.points.shadowSize : s.shadowSize; - - //shadow as for points - if (lw > 0 && sw > 0) { - var w = sw / 2; - ctx.lineWidth = w; - ctx.strokeStyle = "rgba(0,0,0,0.1)"; - drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, w + w / 2, minmax); - - ctx.strokeStyle = "rgba(0,0,0,0.2)"; - drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, w / 2, minmax); - } - - ctx.strokeStyle = err[e].color - ? err[e].color - : s.color; - ctx.lineWidth = lw; - //draw it - drawError(ctx, err[e], x, y, upper, lower, drawUpper, drawLower, radius, 0, minmax); - } - } - } - } - - function drawError(ctx, err, x, y, upper, lower, drawUpper, drawLower, radius, offset, minmax) { - //shadow offset - y += offset; - upper += offset; - lower += offset; - - // error bar - avoid plotting over circles - if (err.err === 'x') { - if (upper > x + radius) drawPath(ctx, [[upper, y], [Math.max(x + radius, minmax[0]), y]]); - else drawUpper = false; - - if (lower < x - radius) drawPath(ctx, [[Math.min(x - radius, minmax[1]), y], [lower, y]]); - else drawLower = false; - } else { - if (upper < y - radius) drawPath(ctx, [[x, upper], [x, Math.min(y - radius, minmax[0])]]); - else drawUpper = false; - - if (lower > y + radius) drawPath(ctx, [[x, Math.max(y + radius, minmax[1])], [x, lower]]); - else drawLower = false; - } - - //internal radius value in errorbar, allows to plot radius 0 points and still keep proper sized caps - //this is a way to get errorbars on lines without visible connecting dots - radius = err.radius != null - ? err.radius - : radius; - - // upper cap - if (drawUpper) { - if (err.upperCap === '-') { - if (err.err === 'x') drawPath(ctx, [[upper, y - radius], [upper, y + radius]]); - else drawPath(ctx, [[x - radius, upper], [x + radius, upper]]); - } else if ($.isFunction(err.upperCap)) { - if (err.err === 'x') err.upperCap(ctx, upper, y, radius); - else err.upperCap(ctx, x, upper, radius); - } - } - // lower cap - if (drawLower) { - if (err.lowerCap === '-') { - if (err.err === 'x') drawPath(ctx, [[lower, y - radius], [lower, y + radius]]); - else drawPath(ctx, [[x - radius, lower], [x + radius, lower]]); - } else if ($.isFunction(err.lowerCap)) { - if (err.err === 'x') err.lowerCap(ctx, lower, y, radius); - else err.lowerCap(ctx, x, lower, radius); - } - } - } - - function drawPath(ctx, pts) { - ctx.beginPath(); - ctx.moveTo(pts[0][0], pts[0][1]); - for (var p = 1; p < pts.length; p++) { - ctx.lineTo(pts[p][0], pts[p][1]); - } - - ctx.stroke(); - } - - function draw(plot, ctx) { - var plotOffset = plot.getPlotOffset(); - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - $.each(plot.getData(), function (i, s) { - if (s.points.errorbars && (s.points.xerr.show || s.points.yerr.show)) { - drawSeriesErrors(plot, ctx, s); - } - }); - ctx.restore(); - } - - function init(plot) { - plot.hooks.processRawData.push(processRawData); - plot.hooks.draw.push(draw); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'errorbars', - version: '1.0' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.fillbetween.js b/extern/phmap/benchmark/js/jquery.flot.fillbetween.js deleted file mode 100644 index 96cb292..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.fillbetween.js +++ /dev/null @@ -1,254 +0,0 @@ -/* Flot plugin for computing bottoms for filled line and bar charts. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -The case: you've got two series that you want to fill the area between. In Flot -terms, you need to use one as the fill bottom of the other. You can specify the -bottom of each data point as the third coordinate manually, or you can use this -plugin to compute it for you. - -In order to name the other series, you need to give it an id, like this: - - var dataset = [ - { data: [ ... ], id: "foo" } , // use default bottom - { data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom - ]; - - $.plot($("#placeholder"), dataset, { lines: { show: true, fill: true }}); - -As a convenience, if the id given is a number that doesn't appear as an id in -the series, it is interpreted as the index in the array instead (so fillBetween: -0 can also mean the first series). - -Internally, the plugin modifies the datapoints in each series. For line series, -extra data points might be inserted through interpolation. Note that at points -where the bottom line is not defined (due to a null point or start/end of line), -the current line will show a gap too. The algorithm comes from the -jquery.flot.stack.js plugin, possibly some code could be shared. - -*/ - -(function ($) { - var options = { - series: { - fillBetween: null // or number - } - }; - - function init(plot) { - function findBottomSeries(s, allseries) { - var i; - - for (i = 0; i < allseries.length; ++i) { - if (allseries[ i ].id === s.fillBetween) { - return allseries[ i ]; - } - } - - if (typeof s.fillBetween === "number") { - if (s.fillBetween < 0 || s.fillBetween >= allseries.length) { - return null; - } - return allseries[ s.fillBetween ]; - } - - return null; - } - - function computeFormat(plot, s, data, datapoints) { - if (s.fillBetween == null) { - return; - } - - format = datapoints.format; - var plotHasId = function(id) { - var plotData = plot.getData(); - for (i = 0; i < plotData.length; i++) { - if (plotData[i].id === id) { - return true; - } - } - - return false; - } - - if (!format) { - format = []; - - format.push({ - x: true, - number: true, - computeRange: s.xaxis.options.autoScale !== 'none', - required: true - }); - format.push({ - y: true, - number: true, - computeRange: s.yaxis.options.autoScale !== 'none', - required: true - }); - - if (s.fillBetween !== undefined && s.fillBetween !== '' && plotHasId(s.fillBetween) && s.fillBetween !== s.id) { - format.push({ - x: false, - y: true, - number: true, - required: false, - computeRange: s.yaxis.options.autoScale !== 'none', - defaultValue: 0 - }); - } - - datapoints.format = format; - } - } - - function computeFillBottoms(plot, s, datapoints) { - if (s.fillBetween == null) { - return; - } - - var other = findBottomSeries(s, plot.getData()); - - if (!other) { - return; - } - - var ps = datapoints.pointsize, - points = datapoints.points, - otherps = other.datapoints.pointsize, - otherpoints = other.datapoints.points, - newpoints = [], - px, py, intery, qx, qy, bottom, - withlines = s.lines.show, - withbottom = ps > 2 && datapoints.format[2].y, - withsteps = withlines && s.lines.steps, - fromgap = true, - i = 0, - j = 0, - l, m; - - while (true) { - if (i >= points.length) { - break; - } - - l = newpoints.length; - - if (points[ i ] == null) { - // copy gaps - for (m = 0; m < ps; ++m) { - newpoints.push(points[ i + m ]); - } - - i += ps; - } else if (j >= otherpoints.length) { - // for lines, we can't use the rest of the points - if (!withlines) { - for (m = 0; m < ps; ++m) { - newpoints.push(points[ i + m ]); - } - } - - i += ps; - } else if (otherpoints[ j ] == null) { - // oops, got a gap - for (m = 0; m < ps; ++m) { - newpoints.push(null); - } - - fromgap = true; - j += otherps; - } else { - // cases where we actually got two points - px = points[ i ]; - py = points[ i + 1 ]; - qx = otherpoints[ j ]; - qy = otherpoints[ j + 1 ]; - bottom = 0; - - if (px === qx) { - for (m = 0; m < ps; ++m) { - newpoints.push(points[ i + m ]); - } - - //newpoints[ l + 1 ] += qy; - bottom = qy; - - i += ps; - j += otherps; - } else if (px > qx) { - // we got past point below, might need to - // insert interpolated extra point - - if (withlines && i > 0 && points[ i - ps ] != null) { - intery = py + (points[ i - ps + 1 ] - py) * (qx - px) / (points[ i - ps ] - px); - newpoints.push(qx); - newpoints.push(intery); - for (m = 2; m < ps; ++m) { - newpoints.push(points[ i + m ]); - } - bottom = qy; - } - - j += otherps; - } else { - // px < qx - // if we come from a gap, we just skip this point - - if (fromgap && withlines) { - i += ps; - continue; - } - - for (m = 0; m < ps; ++m) { - newpoints.push(points[ i + m ]); - } - - // we might be able to interpolate a point below, - // this can give us a better y - - if (withlines && j > 0 && otherpoints[ j - otherps ] != null) { - bottom = qy + (otherpoints[ j - otherps + 1 ] - qy) * (px - qx) / (otherpoints[ j - otherps ] - qx); - } - - //newpoints[l + 1] += bottom; - - i += ps; - } - - fromgap = false; - - if (l !== newpoints.length && withbottom) { - newpoints[ l + 2 ] = bottom; - } - } - - // maintain the line steps invariant - - if (withsteps && l !== newpoints.length && l > 0 && - newpoints[ l ] !== null && - newpoints[ l ] !== newpoints[ l - ps ] && - newpoints[ l + 1 ] !== newpoints[ l - ps + 1 ]) { - for (m = 0; m < ps; ++m) { - newpoints[ l + ps + m ] = newpoints[ l + m ]; - } - newpoints[ l + 1 ] = newpoints[ l - ps + 1 ]; - } - } - - datapoints.points = newpoints; - } - - plot.hooks.processRawData.push(computeFormat); - plot.hooks.processDatapoints.push(computeFillBottoms); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: "fillbetween", - version: "1.0" - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.flatdata.js b/extern/phmap/benchmark/js/jquery.flot.flatdata.js deleted file mode 100644 index b91d168..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.flatdata.js +++ /dev/null @@ -1,47 +0,0 @@ -/* Support for flat 1D data series. - -A 1D flat data series is a data series in the form of a regular 1D array. The -main reason for using a flat data series is that it performs better, consumes -less memory and generates less garbage collection than the regular flot format. - -Example: - - plot.setData([[[0,0], [1,1], [2,2], [3,3]]]); // regular flot format - plot.setData([{flatdata: true, data: [0, 1, 2, 3]}]); // flatdata format - -Set series.flatdata to true to enable this plugin. - -You can use series.start to specify the starting index of the series (default is 0) -You can use series.step to specify the interval between consecutive indexes of the series (default is 1) -*/ - -/* global jQuery*/ - -(function ($) { - 'use strict'; - - function process1DRawData(plot, series, data, datapoints) { - if (series.flatdata === true) { - var start = series.start || 0; - var step = typeof series.step === 'number' ? series.step : 1; - datapoints.pointsize = 2; - for (var i = 0, j = 0; i < data.length; i++, j += 2) { - datapoints.points[j] = start + (i * step); - datapoints.points[j + 1] = data[i]; - } - if (datapoints.points !== undefined) { - datapoints.points.length = data.length * 2; - } else { - datapoints.points = []; - } - } - } - - $.plot.plugins.push({ - init: function(plot) { - plot.hooks.processRawData.push(process1DRawData); - }, - name: 'flatdata', - version: '0.0.2' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.hover.js b/extern/phmap/benchmark/js/jquery.flot.hover.js deleted file mode 100644 index 4f0f08e..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.hover.js +++ /dev/null @@ -1,346 +0,0 @@ -/* global jQuery */ - -/** -## jquery.flot.hover.js - -This plugin is used for mouse hover and tap on a point of plot series. -It supports the following options: -```js -grid: { - hoverable: false, //to trigger plothover event on mouse hover or tap on a point - clickable: false //to trigger plotclick event on mouse hover -} -``` - -It listens to native mouse move event or click, as well as artificial generated -tap and touchevent. - -When the mouse is over a point or a tap on a point is performed, that point or -the correscponding bar will be highlighted and a "plothover" event will be generated. - -Custom "touchevent" is triggered when any touch interaction is made. Hover plugin -handles this events by unhighlighting all of the previously highlighted points and generates -"plothovercleanup" event to notify any part that is handling plothover (for exemple to cleanup -the tooltip from webcharts). -*/ - -(function($) { - 'use strict'; - - var options = { - grid: { - hoverable: false, - clickable: false - } - }; - - var browser = $.plot.browser; - - function init(plot) { - plot.hooks.processOptions.push(initHover); - } - - function initHover(plot, options) { - var highlights = []; - - var eventType = { - click: 'click', - hover: 'hover' - } - - var lastMouseMoveEvent = plot.getPlaceholder()[0].lastMouseMoveEvent; - - plot.highlight = highlight; - plot.unhighlight = unhighlight; - - function bindEvents(plot, eventHolder) { - var o = plot.getOptions(); - - if (o.grid.hoverable || o.grid.clickable) { - eventHolder[0].addEventListener('touchevent', triggerCleanupEvent, false); - eventHolder[0].addEventListener('tap', tap.generatePlothoverEvent, false); - } - - if (options.grid.clickable) { - eventHolder.click(onClick); - } - - if (options.grid.hoverable) { - eventHolder.mousemove(onMouseMove); - - // Use bind, rather than .mouseleave, because we officially - // still support jQuery 1.2.6, which doesn't define a shortcut - // for mouseenter or mouseleave. This was a bug/oversight that - // was fixed somewhere around 1.3.x. We can return to using - // .mouseleave when we drop support for 1.2.6. - - eventHolder.bind("mouseleave", onMouseLeave); - } - } - - function shutdown(plot, eventHolder) { - eventHolder[0].removeEventListener('tap', tap.generatePlothoverEvent); - eventHolder[0].removeEventListener('tap', triggerCleanupEvent); - eventHolder.unbind("mousemove", onMouseMove); - eventHolder.unbind("mouseleave", onMouseLeave); - eventHolder.unbind("click", onClick); - highlights = []; - } - - function doTriggerClickHoverEvent(event, eventType, searchDistance) { - var series = plot.getData(); - if (event !== undefined - && series.length > 0 - && series[0].xaxis.c2p !== undefined - && series[0].yaxis.c2p !== undefined) { - var eventToTrigger = "plot" + eventType; - var seriesFlag = eventType + "able"; - triggerClickHoverEvent(eventToTrigger, event, - function(i) { - return series[i][seriesFlag] !== false; - }, searchDistance); - } - } - - var tap = { - generatePlothoverEvent: function (e) { - var o = plot.getOptions(), - newEvent = new CustomEvent('mouseevent'); - - //transform from touch event to mouse event format - newEvent.pageX = e.detail.changedTouches[0].pageX; - newEvent.pageY = e.detail.changedTouches[0].pageY; - newEvent.clientX = e.detail.changedTouches[0].clientX; - newEvent.clientY = e.detail.changedTouches[0].clientY; - - if (o.grid.hoverable) { - doTriggerClickHoverEvent(newEvent, eventType.hover, 30); - } - return false; - } - }; - - if (options.grid.hoverable || options.grid.clickable) { - plot.hooks.bindEvents.push(bindEvents); - plot.hooks.shutdown.push(shutdown); - plot.hooks.drawOverlay.push(drawOverlay); - plot.hooks.processRawData.push(processRawData); - } - - function onMouseMove(e) { - lastMouseMoveEvent = e; - plot.getPlaceholder()[0].lastMouseMoveEvent = e; - doTriggerClickHoverEvent(e, eventType.hover); - } - - function onMouseLeave(e) { - lastMouseMoveEvent = undefined; - plot.getPlaceholder()[0].lastMouseMoveEvent = undefined; - triggerClickHoverEvent("plothover", e, - function(i) { - return false; - }); - } - - function onClick(e) { - doTriggerClickHoverEvent(e, eventType.click); - } - - function triggerCleanupEvent() { - plot.unhighlight(); - plot.getPlaceholder().trigger('plothovercleanup'); - } - - // trigger click or hover event (they send the same parameters - // so we share their code) - function triggerClickHoverEvent(eventname, event, seriesFilter, searchDistance) { - var options = plot.getOptions(), - offset = plot.offset(), - page = browser.getPageXY(event), - canvasX = page.X - offset.left, - canvasY = page.Y - offset.top, - pos = plot.c2p({ - left: canvasX, - top: canvasY - }), - distance = searchDistance !== undefined ? searchDistance : options.grid.mouseActiveRadius; - - pos.pageX = page.X; - pos.pageY = page.Y; - - var item = plot.findNearbyItem(canvasX, canvasY, seriesFilter, distance); - - if (item) { - // fill in mouse pos for any listeners out there - item.pageX = parseInt(item.series.xaxis.p2c(item.datapoint[0]) + offset.left, 10); - item.pageY = parseInt(item.series.yaxis.p2c(item.datapoint[1]) + offset.top, 10); - } - - if (options.grid.autoHighlight) { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if ((h.auto === eventname && - !(item && h.series === item.series && - h.point[0] === item.datapoint[0] && - h.point[1] === item.datapoint[1])) || !item) { - unhighlight(h.series, h.point); - } - } - - if (item) { - highlight(item.series, item.datapoint, eventname); - } - } - - plot.getPlaceholder().trigger(eventname, [pos, item]); - } - - function highlight(s, point, auto) { - if (typeof s === "number") { - s = plot.getData()[s]; - } - - if (typeof point === "number") { - var ps = s.datapoints.pointsize; - point = s.datapoints.points.slice(ps * point, ps * (point + 1)); - } - - var i = indexOfHighlight(s, point); - if (i === -1) { - highlights.push({ - series: s, - point: point, - auto: auto - }); - - plot.triggerRedrawOverlay(); - } else if (!auto) { - highlights[i].auto = false; - } - } - - function unhighlight(s, point) { - if (s == null && point == null) { - highlights = []; - plot.triggerRedrawOverlay(); - return; - } - - if (typeof s === "number") { - s = plot.getData()[s]; - } - - if (typeof point === "number") { - var ps = s.datapoints.pointsize; - point = s.datapoints.points.slice(ps * point, ps * (point + 1)); - } - - var i = indexOfHighlight(s, point); - if (i !== -1) { - highlights.splice(i, 1); - - plot.triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s, p) { - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.series === s && - h.point[0] === p[0] && - h.point[1] === p[1]) { - return i; - } - } - - return -1; - } - - function processRawData() { - triggerCleanupEvent(); - doTriggerClickHoverEvent(lastMouseMoveEvent, eventType.hover); - } - - function drawOverlay(plot, octx, overlay) { - var plotOffset = plot.getPlotOffset(), - i, hi; - - octx.save(); - octx.translate(plotOffset.left, plotOffset.top); - for (i = 0; i < highlights.length; ++i) { - hi = highlights[i]; - - if (hi.series.bars.show) drawBarHighlight(hi.series, hi.point, octx); - else drawPointHighlight(hi.series, hi.point, octx, plot); - } - octx.restore(); - } - } - - function drawPointHighlight(series, point, octx, plot) { - var x = point[0], - y = point[1], - axisx = series.xaxis, - axisy = series.yaxis, - highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(); - - if (x < axisx.min || x > axisx.max || y < axisy.min || y > axisy.max) { - return; - } - - var pointRadius = series.points.radius + series.points.lineWidth / 2; - octx.lineWidth = pointRadius; - octx.strokeStyle = highlightColor; - var radius = 1.5 * pointRadius; - x = axisx.p2c(x); - y = axisy.p2c(y); - - octx.beginPath(); - var symbol = series.points.symbol; - if (symbol === 'circle') { - octx.arc(x, y, radius, 0, 2 * Math.PI, false); - } else if (typeof symbol === 'string' && plot.drawSymbol && plot.drawSymbol[symbol]) { - plot.drawSymbol[symbol](octx, x, y, radius, false); - } - - octx.closePath(); - octx.stroke(); - } - - function drawBarHighlight(series, point, octx) { - var highlightColor = (typeof series.highlightColor === "string") ? series.highlightColor : $.color.parse(series.color).scale('a', 0.5).toString(), - fillStyle = highlightColor, - barLeft; - - var barWidth = series.bars.barWidth[0] || series.bars.barWidth; - switch (series.bars.align) { - case "left": - barLeft = 0; - break; - case "right": - barLeft = -barWidth; - break; - default: - barLeft = -barWidth / 2; - } - - octx.lineWidth = series.bars.lineWidth; - octx.strokeStyle = highlightColor; - - var fillTowards = series.bars.fillTowards || 0, - bottom = fillTowards > series.yaxis.min ? Math.min(series.yaxis.max, fillTowards) : series.yaxis.min; - - $.plot.drawSeries.drawBar(point[0], point[1], point[2] || bottom, barLeft, barLeft + barWidth, - function() { - return fillStyle; - }, series.xaxis, series.yaxis, octx, series.bars.horizontal, series.bars.lineWidth); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'hover', - version: '0.1' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.image.js b/extern/phmap/benchmark/js/jquery.flot.image.js deleted file mode 100644 index ae98fb4..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.image.js +++ /dev/null @@ -1,249 +0,0 @@ -/* Flot plugin for plotting images. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -The data syntax is [ [ image, x1, y1, x2, y2 ], ... ] where (x1, y1) and -(x2, y2) are where you intend the two opposite corners of the image to end up -in the plot. Image must be a fully loaded Javascript image (you can make one -with new Image()). If the image is not complete, it's skipped when plotting. - -There are two helpers included for retrieving images. The easiest work the way -that you put in URLs instead of images in the data, like this: - - [ "myimage.png", 0, 0, 10, 10 ] - -Then call $.plot.image.loadData( data, options, callback ) where data and -options are the same as you pass in to $.plot. This loads the images, replaces -the URLs in the data with the corresponding images and calls "callback" when -all images are loaded (or failed loading). In the callback, you can then call -$.plot with the data set. See the included example. - -A more low-level helper, $.plot.image.load(urls, callback) is also included. -Given a list of URLs, it calls callback with an object mapping from URL to -Image object when all images are loaded or have failed loading. - -The plugin supports these options: - - series: { - images: { - show: boolean - anchor: "corner" or "center" - alpha: [ 0, 1 ] - } - } - -They can be specified for a specific series: - - $.plot( $("#placeholder"), [{ - data: [ ... ], - images: { ... } - ]) - -Note that because the data format is different from usual data points, you -can't use images with anything else in a specific data series. - -Setting "anchor" to "center" causes the pixels in the image to be anchored at -the corner pixel centers inside of at the pixel corners, effectively letting -half a pixel stick out to each side in the plot. - -A possible future direction could be support for tiling for large images (like -Google Maps). - -*/ - -(function ($) { - var options = { - series: { - images: { - show: false, - alpha: 1, - anchor: "corner" // or "center" - } - } - }; - - $.plot.image = {}; - - $.plot.image.loadDataImages = function (series, options, callback) { - var urls = [], points = []; - - var defaultShow = options.series.images.show; - - $.each(series, function (i, s) { - if (!(defaultShow || s.images.show)) { - return; - } - - if (s.data) { - s = s.data; - } - - $.each(s, function (i, p) { - if (typeof p[0] === "string") { - urls.push(p[0]); - points.push(p); - } - }); - }); - - $.plot.image.load(urls, function (loadedImages) { - $.each(points, function (i, p) { - var url = p[0]; - if (loadedImages[url]) { - p[0] = loadedImages[url]; - } - }); - - callback(); - }); - } - - $.plot.image.load = function (urls, callback) { - var missing = urls.length, loaded = {}; - if (missing === 0) { - callback({}); - } - - $.each(urls, function (i, url) { - var handler = function () { - --missing; - loaded[url] = this; - - if (missing === 0) { - callback(loaded); - } - }; - - $('').load(handler).error(handler).attr('src', url); - }); - }; - - function drawSeries(plot, ctx, series) { - var plotOffset = plot.getPlotOffset(); - - if (!series.images || !series.images.show) { - return; - } - - var points = series.datapoints.points, - ps = series.datapoints.pointsize; - - for (var i = 0; i < points.length; i += ps) { - var img = points[i], - x1 = points[i + 1], y1 = points[i + 2], - x2 = points[i + 3], y2 = points[i + 4], - xaxis = series.xaxis, yaxis = series.yaxis, - tmp; - - // actually we should check img.complete, but it - // appears to be a somewhat unreliable indicator in - // IE6 (false even after load event) - if (!img || img.width <= 0 || img.height <= 0) { - continue; - } - - if (x1 > x2) { - tmp = x2; - x2 = x1; - x1 = tmp; - } - if (y1 > y2) { - tmp = y2; - y2 = y1; - y1 = tmp; - } - - // if the anchor is at the center of the pixel, expand the - // image by 1/2 pixel in each direction - if (series.images.anchor === "center") { - tmp = 0.5 * (x2 - x1) / (img.width - 1); - x1 -= tmp; - x2 += tmp; - tmp = 0.5 * (y2 - y1) / (img.height - 1); - y1 -= tmp; - y2 += tmp; - } - - // clip - if (x1 === x2 || y1 === y2 || - x1 >= xaxis.max || x2 <= xaxis.min || - y1 >= yaxis.max || y2 <= yaxis.min) { - continue; - } - - var sx1 = 0, sy1 = 0, sx2 = img.width, sy2 = img.height; - if (x1 < xaxis.min) { - sx1 += (sx2 - sx1) * (xaxis.min - x1) / (x2 - x1); - x1 = xaxis.min; - } - - if (x2 > xaxis.max) { - sx2 += (sx2 - sx1) * (xaxis.max - x2) / (x2 - x1); - x2 = xaxis.max; - } - - if (y1 < yaxis.min) { - sy2 += (sy1 - sy2) * (yaxis.min - y1) / (y2 - y1); - y1 = yaxis.min; - } - - if (y2 > yaxis.max) { - sy1 += (sy1 - sy2) * (yaxis.max - y2) / (y2 - y1); - y2 = yaxis.max; - } - - x1 = xaxis.p2c(x1); - x2 = xaxis.p2c(x2); - y1 = yaxis.p2c(y1); - y2 = yaxis.p2c(y2); - - // the transformation may have swapped us - if (x1 > x2) { - tmp = x2; - x2 = x1; - x1 = tmp; - } - if (y1 > y2) { - tmp = y2; - y2 = y1; - y1 = tmp; - } - - tmp = ctx.globalAlpha; - ctx.globalAlpha *= series.images.alpha; - ctx.drawImage(img, - sx1, sy1, sx2 - sx1, sy2 - sy1, - x1 + plotOffset.left, y1 + plotOffset.top, - x2 - x1, y2 - y1); - ctx.globalAlpha = tmp; - } - } - - function processRawData(plot, series, data, datapoints) { - if (!series.images.show) { - return; - } - - // format is Image, x1, y1, x2, y2 (opposite corners) - datapoints.format = [ - { required: true }, - { x: true, number: true, required: true }, - { y: true, number: true, required: true }, - { x: true, number: true, required: true }, - { y: true, number: true, required: true } - ]; - } - - function init(plot) { - plot.hooks.processRawData.push(processRawData); - plot.hooks.drawSeries.push(drawSeries); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'image', - version: '1.1' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.js b/extern/phmap/benchmark/js/jquery.flot.js deleted file mode 100644 index 9469ced..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.js +++ /dev/null @@ -1,2785 +0,0 @@ -/* Javascript plotting library for jQuery, version 1.0.3. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -*/ - -// the actual Flot code -(function($) { - "use strict"; - - var Canvas = window.Flot.Canvas; - - function defaultTickGenerator(axis) { - var ticks = [], - start = $.plot.saturated.saturate($.plot.saturated.floorInBase(axis.min, axis.tickSize)), - i = 0, - v = Number.NaN, - prev; - - if (start === -Number.MAX_VALUE) { - ticks.push(start); - start = $.plot.saturated.floorInBase(axis.min + axis.tickSize, axis.tickSize); - } - - do { - prev = v; - //v = start + i * axis.tickSize; - v = $.plot.saturated.multiplyAdd(axis.tickSize, i, start); - ticks.push(v); - ++i; - } while (v < axis.max && v !== prev); - - return ticks; - } - - function defaultTickFormatter(value, axis, precision) { - var oldTickDecimals = axis.tickDecimals, - expPosition = ("" + value).indexOf("e"); - - if (expPosition !== -1) { - return expRepTickFormatter(value, axis, precision); - } - - if (precision > 0) { - axis.tickDecimals = precision; - } - - var factor = axis.tickDecimals ? Math.pow(10, axis.tickDecimals) : 1, - formatted = "" + Math.round(value * factor) / factor; - - // If tickDecimals was specified, ensure that we have exactly that - // much precision; otherwise default to the value's own precision. - if (axis.tickDecimals != null) { - var decimal = formatted.indexOf("."), - decimalPrecision = decimal === -1 ? 0 : formatted.length - decimal - 1; - if (decimalPrecision < axis.tickDecimals) { - var decimals = ("" + factor).substr(1, axis.tickDecimals - decimalPrecision); - formatted = (decimalPrecision ? formatted : formatted + ".") + decimals; - } - } - - axis.tickDecimals = oldTickDecimals; - return formatted; - }; - - function expRepTickFormatter(value, axis, precision) { - var expPosition = ("" + value).indexOf("e"), - exponentValue = parseInt(("" + value).substr(expPosition + 1)), - tenExponent = expPosition !== -1 ? exponentValue : (value > 0 ? Math.floor(Math.log(value) / Math.LN10) : 0), - roundWith = Math.pow(10, tenExponent), - x = value / roundWith; - - if (precision) { - var updatedPrecision = recomputePrecision(value, precision); - return (value / roundWith).toFixed(updatedPrecision) + 'e' + tenExponent; - } - - if (axis.tickDecimals > 0) { - return x.toFixed(recomputePrecision(value, axis.tickDecimals)) + 'e' + tenExponent; - } - return x.toFixed() + 'e' + tenExponent; - } - - function recomputePrecision(num, precision) { - //for numbers close to zero, the precision from flot will be a big number - //while for big numbers, the precision will be negative - var log10Value = Math.log(Math.abs(num)) * Math.LOG10E, - newPrecision = Math.abs(log10Value + precision); - - return newPrecision <= 20 ? Math.floor(newPrecision) : 20; - } - - /////////////////////////////////////////////////////////////////////////// - // The top-level container for the entire plot. - function Plot(placeholder, data_, options_, plugins) { - // data is on the form: - // [ series1, series2 ... ] - // where series is either just the data as [ [x1, y1], [x2, y2], ... ] - // or { data: [ [x1, y1], [x2, y2], ... ], label: "some label", ... } - - var series = [], - options = { - // the color theme used for graphs - colors: ["#edc240", "#afd8f8", "#cb4b4b", "#4da74d", "#9440ed"], - xaxis: { - show: null, // null = auto-detect, true = always, false = never - position: "bottom", // or "top" - mode: null, // null or "time" - font: null, // null (derived from CSS in placeholder) or object like { size: 11, lineHeight: 13, style: "italic", weight: "bold", family: "sans-serif", variant: "small-caps" } - color: null, // base color, labels, ticks - tickColor: null, // possibly different color of ticks, e.g. "rgba(0,0,0,0.15)" - transform: null, // null or f: number -> number to transform axis - inverseTransform: null, // if transform is set, this should be the inverse function - min: null, // min. value to show, null means set automatically - max: null, // max. value to show, null means set automatically - autoScaleMargin: null, // margin in % to add if autoScale option is on "loose" mode, - autoScale: "exact", // Available modes: "none", "loose", "exact", "sliding-window" - windowSize: null, // null or number. This is the size of sliding-window. - growOnly: null, // grow only, useful for smoother auto-scale, the scales will grow to accomodate data but won't shrink back. - ticks: null, // either [1, 3] or [[1, "a"], 3] or (fn: axis info -> ticks) or app. number of ticks for auto-ticks - tickFormatter: null, // fn: number -> string - showTickLabels: "major", // "none", "endpoints", "major", "all" - labelWidth: null, // size of tick labels in pixels - labelHeight: null, - reserveSpace: null, // whether to reserve space even if axis isn't shown - tickLength: null, // size in pixels of major tick marks - showMinorTicks: null, // true = show minor tick marks, false = hide minor tick marks - showTicks: null, // true = show tick marks, false = hide all tick marks - gridLines: null, // true = show grid lines, false = hide grid lines - alignTicksWithAxis: null, // axis number or null for no sync - tickDecimals: null, // no. of decimals, null means auto - tickSize: null, // number or [number, "unit"] - minTickSize: null, // number or [number, "unit"] - offset: { below: 0, above: 0 }, // the plot drawing offset. this is calculated by the flot.navigate for each axis - boxPosition: { centerX: 0, centerY: 0 } //position of the axis on the corresponding axis box - }, - yaxis: { - autoScaleMargin: 0.02, // margin in % to add if autoScale option is on "loose" mode - autoScale: "loose", // Available modes: "none", "loose", "exact" - growOnly: null, // grow only, useful for smoother auto-scale, the scales will grow to accomodate data but won't shrink back. - position: "left", // or "right" - showTickLabels: "major", // "none", "endpoints", "major", "all" - offset: { below: 0, above: 0 }, // the plot drawing offset. this is calculated by the flot.navigate for each axis - boxPosition: { centerX: 0, centerY: 0 } //position of the axis on the corresponding axis box - }, - xaxes: [], - yaxes: [], - series: { - points: { - show: false, - radius: 3, - lineWidth: 2, // in pixels - fill: true, - fillColor: "#ffffff", - symbol: 'circle' // or callback - }, - lines: { - // we don't put in show: false so we can see - // whether lines were actively disabled - lineWidth: 1, // in pixels - fill: false, - fillColor: null, - steps: false - // Omit 'zero', so we can later default its value to - // match that of the 'fill' option. - }, - bars: { - show: false, - lineWidth: 2, // in pixels - // barWidth: number or [number, absolute] - // when 'absolute' is false, 'number' is relative to the minimum distance between points for the series - // when 'absolute' is true, 'number' is considered to be in units of the x-axis - horizontal: false, - barWidth: 0.8, - fill: true, - fillColor: null, - align: "left", // "left", "right", or "center" - zero: true - }, - shadowSize: 3, - highlightColor: null - }, - grid: { - show: true, - aboveData: false, - color: "#545454", // primary color used for outline and labels - backgroundColor: null, // null for transparent, else color - borderColor: null, // set if different from the grid color - tickColor: null, // color for the ticks, e.g. "rgba(0,0,0,0.15)" - margin: 0, // distance from the canvas edge to the grid - labelMargin: 5, // in pixels - axisMargin: 8, // in pixels - borderWidth: 1, // in pixels - minBorderMargin: null, // in pixels, null means taken from points radius - markings: null, // array of ranges or fn: axes -> array of ranges - markingsColor: "#f4f4f4", - markingsLineWidth: 2, - // interactive stuff - clickable: false, - hoverable: false, - autoHighlight: true, // highlight in case mouse is near - mouseActiveRadius: 15 // how far the mouse can be away to activate an item - }, - interaction: { - redrawOverlayInterval: 1000 / 60 // time between updates, -1 means in same flow - }, - hooks: {} - }, - surface = null, // the canvas for the plot itself - overlay = null, // canvas for interactive stuff on top of plot - eventHolder = null, // jQuery object that events should be bound to - ctx = null, - octx = null, - xaxes = [], - yaxes = [], - plotOffset = { - left: 0, - right: 0, - top: 0, - bottom: 0 - }, - plotWidth = 0, - plotHeight = 0, - hooks = { - processOptions: [], - processRawData: [], - processDatapoints: [], - processOffset: [], - setupGrid: [], - adjustSeriesDataRange: [], - setRange: [], - drawBackground: [], - drawSeries: [], - drawAxis: [], - draw: [], - axisReserveSpace: [], - bindEvents: [], - drawOverlay: [], - resize: [], - shutdown: [] - }, - plot = this; - - var eventManager = {}; - - // interactive features - - var redrawTimeout = null; - - // public functions - plot.setData = setData; - plot.setupGrid = setupGrid; - plot.draw = draw; - plot.getPlaceholder = function() { - return placeholder; - }; - plot.getCanvas = function() { - return surface.element; - }; - plot.getSurface = function() { - return surface; - }; - plot.getEventHolder = function() { - return eventHolder[0]; - }; - plot.getPlotOffset = function() { - return plotOffset; - }; - plot.width = function() { - return plotWidth; - }; - plot.height = function() { - return plotHeight; - }; - plot.offset = function() { - var o = eventHolder.offset(); - o.left += plotOffset.left; - o.top += plotOffset.top; - return o; - }; - plot.getData = function() { - return series; - }; - plot.getAxes = function() { - var res = {}; - $.each(xaxes.concat(yaxes), function(_, axis) { - if (axis) { - res[axis.direction + (axis.n !== 1 ? axis.n : "") + "axis"] = axis; - } - }); - return res; - }; - plot.getXAxes = function() { - return xaxes; - }; - plot.getYAxes = function() { - return yaxes; - }; - plot.c2p = canvasToCartesianAxisCoords; - plot.p2c = cartesianAxisToCanvasCoords; - plot.getOptions = function() { - return options; - }; - plot.triggerRedrawOverlay = triggerRedrawOverlay; - plot.pointOffset = function(point) { - return { - left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10), - top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10) - }; - }; - plot.shutdown = shutdown; - plot.destroy = function() { - shutdown(); - placeholder.removeData("plot").empty(); - - series = []; - options = null; - surface = null; - overlay = null; - eventHolder = null; - ctx = null; - octx = null; - xaxes = []; - yaxes = []; - hooks = null; - plot = null; - }; - - plot.resize = function() { - var width = placeholder.width(), - height = placeholder.height(); - surface.resize(width, height); - overlay.resize(width, height); - - executeHooks(hooks.resize, [width, height]); - }; - - plot.clearTextCache = function () { - surface.clearCache(); - overlay.clearCache(); - }; - - plot.autoScaleAxis = autoScaleAxis; - plot.computeRangeForDataSeries = computeRangeForDataSeries; - plot.adjustSeriesDataRange = adjustSeriesDataRange; - plot.findNearbyItem = findNearbyItem; - plot.findNearbyInterpolationPoint = findNearbyInterpolationPoint; - plot.computeValuePrecision = computeValuePrecision; - plot.computeTickSize = computeTickSize; - plot.addEventHandler = addEventHandler; - - // public attributes - plot.hooks = hooks; - - // initialize - var MINOR_TICKS_COUNT_CONSTANT = $.plot.uiConstants.MINOR_TICKS_COUNT_CONSTANT; - var TICK_LENGTH_CONSTANT = $.plot.uiConstants.TICK_LENGTH_CONSTANT; - initPlugins(plot); - setupCanvases(); - parseOptions(options_); - setData(data_); - setupGrid(true); - draw(); - bindEvents(); - - function executeHooks(hook, args) { - args = [plot].concat(args); - for (var i = 0; i < hook.length; ++i) { - hook[i].apply(this, args); - } - } - - function initPlugins() { - // References to key classes, allowing plugins to modify them - - var classes = { - Canvas: Canvas - }; - - for (var i = 0; i < plugins.length; ++i) { - var p = plugins[i]; - p.init(plot, classes); - if (p.options) { - $.extend(true, options, p.options); - } - } - } - - function parseOptions(opts) { - $.extend(true, options, opts); - - // $.extend merges arrays, rather than replacing them. When less - // colors are provided than the size of the default palette, we - // end up with those colors plus the remaining defaults, which is - // not expected behavior; avoid it by replacing them here. - - if (opts && opts.colors) { - options.colors = opts.colors; - } - - if (options.xaxis.color == null) { - options.xaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); - } - - if (options.yaxis.color == null) { - options.yaxis.color = $.color.parse(options.grid.color).scale('a', 0.22).toString(); - } - - if (options.xaxis.tickColor == null) { - // grid.tickColor for back-compatibility - options.xaxis.tickColor = options.grid.tickColor || options.xaxis.color; - } - - if (options.yaxis.tickColor == null) { - // grid.tickColor for back-compatibility - options.yaxis.tickColor = options.grid.tickColor || options.yaxis.color; - } - - if (options.grid.borderColor == null) { - options.grid.borderColor = options.grid.color; - } - - if (options.grid.tickColor == null) { - options.grid.tickColor = $.color.parse(options.grid.color).scale('a', 0.22).toString(); - } - - // Fill in defaults for axis options, including any unspecified - // font-spec fields, if a font-spec was provided. - - // If no x/y axis options were provided, create one of each anyway, - // since the rest of the code assumes that they exist. - - var i, axisOptions, axisCount, - fontSize = placeholder.css("font-size"), - fontSizeDefault = fontSize ? +fontSize.replace("px", "") : 13, - fontDefaults = { - style: placeholder.css("font-style"), - size: Math.round(0.8 * fontSizeDefault), - variant: placeholder.css("font-variant"), - weight: placeholder.css("font-weight"), - family: placeholder.css("font-family") - }; - - axisCount = options.xaxes.length || 1; - for (i = 0; i < axisCount; ++i) { - axisOptions = options.xaxes[i]; - if (axisOptions && !axisOptions.tickColor) { - axisOptions.tickColor = axisOptions.color; - } - - axisOptions = $.extend(true, {}, options.xaxis, axisOptions); - options.xaxes[i] = axisOptions; - - if (axisOptions.font) { - axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); - if (!axisOptions.font.color) { - axisOptions.font.color = axisOptions.color; - } - if (!axisOptions.font.lineHeight) { - axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); - } - } - } - - axisCount = options.yaxes.length || 1; - for (i = 0; i < axisCount; ++i) { - axisOptions = options.yaxes[i]; - if (axisOptions && !axisOptions.tickColor) { - axisOptions.tickColor = axisOptions.color; - } - - axisOptions = $.extend(true, {}, options.yaxis, axisOptions); - options.yaxes[i] = axisOptions; - - if (axisOptions.font) { - axisOptions.font = $.extend({}, fontDefaults, axisOptions.font); - if (!axisOptions.font.color) { - axisOptions.font.color = axisOptions.color; - } - if (!axisOptions.font.lineHeight) { - axisOptions.font.lineHeight = Math.round(axisOptions.font.size * 1.15); - } - } - } - - // save options on axes for future reference - for (i = 0; i < options.xaxes.length; ++i) { - getOrCreateAxis(xaxes, i + 1).options = options.xaxes[i]; - } - - for (i = 0; i < options.yaxes.length; ++i) { - getOrCreateAxis(yaxes, i + 1).options = options.yaxes[i]; - } - - //process boxPosition options used for axis.box size - $.each(allAxes(), function(_, axis) { - axis.boxPosition = axis.options.boxPosition || {centerX: 0, centerY: 0}; - }); - - // add hooks from options - for (var n in hooks) { - if (options.hooks[n] && options.hooks[n].length) { - hooks[n] = hooks[n].concat(options.hooks[n]); - } - } - - executeHooks(hooks.processOptions, [options]); - } - - function setData(d) { - var oldseries = series; - series = parseData(d); - fillInSeriesOptions(); - processData(oldseries); - } - - function parseData(d) { - var res = []; - for (var i = 0; i < d.length; ++i) { - var s = $.extend(true, {}, options.series); - - if (d[i].data != null) { - s.data = d[i].data; // move the data instead of deep-copy - delete d[i].data; - - $.extend(true, s, d[i]); - - d[i].data = s.data; - } else { - s.data = d[i]; - } - - res.push(s); - } - - return res; - } - - function axisNumber(obj, coord) { - var a = obj[coord + "axis"]; - if (typeof a === "object") { - // if we got a real axis, extract number - a = a.n; - } - - if (typeof a !== "number") { - a = 1; // default to first axis - } - - return a; - } - - function allAxes() { - // return flat array without annoying null entries - return xaxes.concat(yaxes).filter(function(a) { - return a; - }); - } - - // canvas to axis for cartesian axes - function canvasToCartesianAxisCoords(pos) { - // return an object with x/y corresponding to all used axes - var res = {}, - i, axis; - for (i = 0; i < xaxes.length; ++i) { - axis = xaxes[i]; - if (axis && axis.used) { - res["x" + axis.n] = axis.c2p(pos.left); - } - } - - for (i = 0; i < yaxes.length; ++i) { - axis = yaxes[i]; - if (axis && axis.used) { - res["y" + axis.n] = axis.c2p(pos.top); - } - } - - if (res.x1 !== undefined) { - res.x = res.x1; - } - - if (res.y1 !== undefined) { - res.y = res.y1; - } - - return res; - } - - // axis to canvas for cartesian axes - function cartesianAxisToCanvasCoords(pos) { - // get canvas coords from the first pair of x/y found in pos - var res = {}, - i, axis, key; - - for (i = 0; i < xaxes.length; ++i) { - axis = xaxes[i]; - if (axis && axis.used) { - key = "x" + axis.n; - if (pos[key] == null && axis.n === 1) { - key = "x"; - } - - if (pos[key] != null) { - res.left = axis.p2c(pos[key]); - break; - } - } - } - - for (i = 0; i < yaxes.length; ++i) { - axis = yaxes[i]; - if (axis && axis.used) { - key = "y" + axis.n; - if (pos[key] == null && axis.n === 1) { - key = "y"; - } - - if (pos[key] != null) { - res.top = axis.p2c(pos[key]); - break; - } - } - } - - return res; - } - - function getOrCreateAxis(axes, number) { - if (!axes[number - 1]) { - axes[number - 1] = { - n: number, // save the number for future reference - direction: axes === xaxes ? "x" : "y", - options: $.extend(true, {}, axes === xaxes ? options.xaxis : options.yaxis) - }; - } - - return axes[number - 1]; - } - - function fillInSeriesOptions() { - var neededColors = series.length, - maxIndex = -1, - i; - - // Subtract the number of series that already have fixed colors or - // color indexes from the number that we still need to generate. - - for (i = 0; i < series.length; ++i) { - var sc = series[i].color; - if (sc != null) { - neededColors--; - if (typeof sc === "number" && sc > maxIndex) { - maxIndex = sc; - } - } - } - - // If any of the series have fixed color indexes, then we need to - // generate at least as many colors as the highest index. - - if (neededColors <= maxIndex) { - neededColors = maxIndex + 1; - } - - // Generate all the colors, using first the option colors and then - // variations on those colors once they're exhausted. - - var c, colors = [], - colorPool = options.colors, - colorPoolSize = colorPool.length, - variation = 0, - definedColors = Math.max(0, series.length - neededColors); - - for (i = 0; i < neededColors; i++) { - c = $.color.parse(colorPool[(definedColors + i) % colorPoolSize] || "#666"); - - // Each time we exhaust the colors in the pool we adjust - // a scaling factor used to produce more variations on - // those colors. The factor alternates negative/positive - // to produce lighter/darker colors. - - // Reset the variation after every few cycles, or else - // it will end up producing only white or black colors. - - if (i % colorPoolSize === 0 && i) { - if (variation >= 0) { - if (variation < 0.5) { - variation = -variation - 0.2; - } else variation = 0; - } else variation = -variation; - } - - colors[i] = c.scale('rgb', 1 + variation); - } - - // Finalize the series options, filling in their colors - - var colori = 0, - s; - for (i = 0; i < series.length; ++i) { - s = series[i]; - - // assign colors - if (s.color == null) { - s.color = colors[colori].toString(); - ++colori; - } else if (typeof s.color === "number") { - s.color = colors[s.color].toString(); - } - - // turn on lines automatically in case nothing is set - if (s.lines.show == null) { - var v, show = true; - for (v in s) { - if (s[v] && s[v].show) { - show = false; - break; - } - } - - if (show) { - s.lines.show = true; - } - } - - // If nothing was provided for lines.zero, default it to match - // lines.fill, since areas by default should extend to zero. - - if (s.lines.zero == null) { - s.lines.zero = !!s.lines.fill; - } - - // setup axes - s.xaxis = getOrCreateAxis(xaxes, axisNumber(s, "x")); - s.yaxis = getOrCreateAxis(yaxes, axisNumber(s, "y")); - } - } - - function processData(prevSeries) { - var topSentry = Number.POSITIVE_INFINITY, - bottomSentry = Number.NEGATIVE_INFINITY, - i, j, k, m, - s, points, ps, val, f, p, - data, format; - - function updateAxis(axis, min, max) { - if (min < axis.datamin && min !== -Infinity) { - axis.datamin = min; - } - - if (max > axis.datamax && max !== Infinity) { - axis.datamax = max; - } - } - - function reusePoints(prevSeries, i) { - if (prevSeries && prevSeries[i] && prevSeries[i].datapoints && prevSeries[i].datapoints.points) { - return prevSeries[i].datapoints.points; - } - - return []; - } - - $.each(allAxes(), function(_, axis) { - // init axis - if (axis.options.growOnly !== true) { - axis.datamin = topSentry; - axis.datamax = bottomSentry; - } else { - if (axis.datamin === undefined) { - axis.datamin = topSentry; - } - if (axis.datamax === undefined) { - axis.datamax = bottomSentry; - } - } - axis.used = false; - }); - - for (i = 0; i < series.length; ++i) { - s = series[i]; - s.datapoints = { - points: [] - }; - - if (s.datapoints.points.length === 0) { - s.datapoints.points = reusePoints(prevSeries, i); - } - - executeHooks(hooks.processRawData, [s, s.data, s.datapoints]); - } - - // first pass: clean and copy data - for (i = 0; i < series.length; ++i) { - s = series[i]; - - data = s.data; - format = s.datapoints.format; - - if (!format) { - format = []; - // find out how to copy - format.push({ - x: true, - y: false, - number: true, - required: true, - computeRange: s.xaxis.options.autoScale !== 'none', - defaultValue: null - }); - - format.push({ - x: false, - y: true, - number: true, - required: true, - computeRange: s.yaxis.options.autoScale !== 'none', - defaultValue: null - }); - - if (s.stack || s.bars.show || (s.lines.show && s.lines.fill)) { - var expectedPs = s.datapoints.pointsize != null ? s.datapoints.pointsize : (s.data && s.data[0] && s.data[0].length ? s.data[0].length : 3); - if (expectedPs > 2) { - format.push({ - x: false, - y: true, - number: true, - required: false, - computeRange: s.yaxis.options.autoScale !== 'none', - defaultValue: 0 - }); - } - } - - s.datapoints.format = format; - } - - s.xaxis.used = s.yaxis.used = true; - - if (s.datapoints.pointsize != null) continue; // already filled in - - s.datapoints.pointsize = format.length; - ps = s.datapoints.pointsize; - points = s.datapoints.points; - - var insertSteps = s.lines.show && s.lines.steps; - - for (j = k = 0; j < data.length; ++j, k += ps) { - p = data[j]; - - var nullify = p == null; - if (!nullify) { - for (m = 0; m < ps; ++m) { - val = p[m]; - f = format[m]; - - if (f) { - if (f.number && val != null) { - val = +val; // convert to number - if (isNaN(val)) { - val = null; - } - } - - if (val == null) { - if (f.required) nullify = true; - - if (f.defaultValue != null) val = f.defaultValue; - } - } - - points[k + m] = val; - } - } - - if (nullify) { - for (m = 0; m < ps; ++m) { - val = points[k + m]; - if (val != null) { - f = format[m]; - // extract min/max info - if (f.computeRange) { - if (f.x) { - updateAxis(s.xaxis, val, val); - } - if (f.y) { - updateAxis(s.yaxis, val, val); - } - } - } - points[k + m] = null; - } - } else { - // a little bit of line specific stuff that - // perhaps shouldn't be here, but lacking - // better means... - if (insertSteps && k > 0 && - points[k - ps] != null && - points[k - ps] !== points[k] && - points[k - ps + 1] !== points[k + 1]) { - // copy the point to make room for a middle point - for (m = 0; m < ps; ++m) { - points[k + ps + m] = points[k + m]; - } - - // middle point has same y - points[k + 1] = points[k - ps + 1]; - - // we've added a point, better reflect that - k += ps; - } - } - } - - points.length = k; //trims the internal buffer to the correct length - } - - // give the hooks a chance to run - for (i = 0; i < series.length; ++i) { - s = series[i]; - - executeHooks(hooks.processDatapoints, [s, s.datapoints]); - } - - // second pass: find datamax/datamin for auto-scaling - for (i = 0; i < series.length; ++i) { - s = series[i]; - format = s.datapoints.format; - - if (format.every(function (f) { return !f.computeRange; })) { - continue; - } - - var range = plot.adjustSeriesDataRange(s, - plot.computeRangeForDataSeries(s)); - - executeHooks(hooks.adjustSeriesDataRange, [s, range]); - - updateAxis(s.xaxis, range.xmin, range.xmax); - updateAxis(s.yaxis, range.ymin, range.ymax); - } - - $.each(allAxes(), function(_, axis) { - if (axis.datamin === topSentry) { - axis.datamin = null; - } - - if (axis.datamax === bottomSentry) { - axis.datamax = null; - } - }); - } - - function setupCanvases() { - // Make sure the placeholder is clear of everything except canvases - // from a previous plot in this container that we'll try to re-use. - - placeholder.css("padding", 0) // padding messes up the positioning - .children().filter(function() { - return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base'); - }).remove(); - - if (placeholder.css("position") === 'static') { - placeholder.css("position", "relative"); // for positioning labels and overlay - } - - surface = new Canvas("flot-base", placeholder[0]); - overlay = new Canvas("flot-overlay", placeholder[0]); // overlay canvas for interactive features - - ctx = surface.context; - octx = overlay.context; - - // define which element we're listening for events on - eventHolder = $(overlay.element).unbind(); - - // If we're re-using a plot object, shut down the old one - - var existing = placeholder.data("plot"); - - if (existing) { - existing.shutdown(); - overlay.clear(); - } - - // save in case we get replotted - placeholder.data("plot", plot); - } - - function bindEvents() { - executeHooks(hooks.bindEvents, [eventHolder]); - } - - function addEventHandler(event, handler, eventHolder, priority) { - var key = eventHolder + event; - var eventList = eventManager[key] || []; - - eventList.push({"event": event, "handler": handler, "eventHolder": eventHolder, "priority": priority}); - eventList.sort((a, b) => b.priority - a.priority ); - eventList.forEach( eventData => { - eventData.eventHolder.unbind(eventData.event, eventData.handler); - eventData.eventHolder.bind(eventData.event, eventData.handler); - }); - - eventManager[key] = eventList; - } - - function shutdown() { - if (redrawTimeout) { - clearTimeout(redrawTimeout); - } - - executeHooks(hooks.shutdown, [eventHolder]); - } - - function setTransformationHelpers(axis) { - // set helper functions on the axis, assumes plot area - // has been computed already - - function identity(x) { - return x; - } - - var s, m, t = axis.options.transform || identity, - it = axis.options.inverseTransform; - - // precompute how much the axis is scaling a point - // in canvas space - if (axis.direction === "x") { - if (isFinite(t(axis.max) - t(axis.min))) { - s = axis.scale = plotWidth / Math.abs(t(axis.max) - t(axis.min)); - } else { - s = axis.scale = 1 / Math.abs($.plot.saturated.delta(t(axis.min), t(axis.max), plotWidth)); - } - m = Math.min(t(axis.max), t(axis.min)); - } else { - if (isFinite(t(axis.max) - t(axis.min))) { - s = axis.scale = plotHeight / Math.abs(t(axis.max) - t(axis.min)); - } else { - s = axis.scale = 1 / Math.abs($.plot.saturated.delta(t(axis.min), t(axis.max), plotHeight)); - } - s = -s; - m = Math.max(t(axis.max), t(axis.min)); - } - - // data point to canvas coordinate - if (t === identity) { - // slight optimization - axis.p2c = function(p) { - if (isFinite(p - m)) { - return (p - m) * s; - } else { - return (p / 4 - m / 4) * s * 4; - } - }; - } else { - axis.p2c = function(p) { - var tp = t(p); - - if (isFinite(tp - m)) { - return (tp - m) * s; - } else { - return (tp / 4 - m / 4) * s * 4; - } - }; - } - - // canvas coordinate to data point - if (!it) { - axis.c2p = function(c) { - return m + c / s; - }; - } else { - axis.c2p = function(c) { - return it(m + c / s); - }; - } - } - - function measureTickLabels(axis) { - var opts = axis.options, - ticks = opts.showTickLabels !== 'none' && axis.ticks ? axis.ticks : [], - showMajorTickLabels = opts.showTickLabels === 'major' || opts.showTickLabels === 'all', - showEndpointsTickLabels = opts.showTickLabels === 'endpoints' || opts.showTickLabels === 'all', - labelWidth = opts.labelWidth || 0, - labelHeight = opts.labelHeight || 0, - legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", - layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, - font = opts.font || "flot-tick-label tickLabel"; - - for (var i = 0; i < ticks.length; ++i) { - var t = ticks[i]; - var label = t.label; - - if (!t.label || - (showMajorTickLabels === false && i > 0 && i < ticks.length - 1) || - (showEndpointsTickLabels === false && (i === 0 || i === ticks.length - 1))) { - continue; - } - - if (typeof t.label === 'object') { - label = t.label.name; - } - - var info = surface.getTextInfo(layer, label, font); - - labelWidth = Math.max(labelWidth, info.width); - labelHeight = Math.max(labelHeight, info.height); - } - - axis.labelWidth = opts.labelWidth || labelWidth; - axis.labelHeight = opts.labelHeight || labelHeight; - } - - function allocateAxisBoxFirstPhase(axis) { - // find the bounding box of the axis by looking at label - // widths/heights and ticks, make room by diminishing the - // plotOffset; this first phase only looks at one - // dimension per axis, the other dimension depends on the - // other axes so will have to wait - - // here reserve additional space - executeHooks(hooks.axisReserveSpace, [axis]); - - var lw = axis.labelWidth, - lh = axis.labelHeight, - pos = axis.options.position, - isXAxis = axis.direction === "x", - tickLength = axis.options.tickLength, - showTicks = axis.options.showTicks, - showMinorTicks = axis.options.showMinorTicks, - gridLines = axis.options.gridLines, - axisMargin = options.grid.axisMargin, - padding = options.grid.labelMargin, - innermost = true, - outermost = true, - found = false; - - // Determine the axis's position in its direction and on its side - - $.each(isXAxis ? xaxes : yaxes, function(i, a) { - if (a && (a.show || a.reserveSpace)) { - if (a === axis) { - found = true; - } else if (a.options.position === pos) { - if (found) { - outermost = false; - } else { - innermost = false; - } - } - } - }); - - // The outermost axis on each side has no margin - if (outermost) { - axisMargin = 0; - } - - // Set the default tickLength if necessary - if (tickLength == null) { - tickLength = TICK_LENGTH_CONSTANT; - } - - // By default, major tick marks are visible - if (showTicks == null) { - showTicks = true; - } - - // By default, minor tick marks are visible - if (showMinorTicks == null) { - showMinorTicks = true; - } - - // By default, grid lines are visible - if (gridLines == null) { - if (innermost) { - gridLines = true; - } else { - gridLines = false; - } - } - - if (!isNaN(+tickLength)) { - padding += showTicks ? +tickLength : 0; - } - - if (isXAxis) { - lh += padding; - - if (pos === "bottom") { - plotOffset.bottom += lh + axisMargin; - axis.box = { - top: surface.height - plotOffset.bottom, - height: lh - }; - } else { - axis.box = { - top: plotOffset.top + axisMargin, - height: lh - }; - plotOffset.top += lh + axisMargin; - } - } else { - lw += padding; - - if (pos === "left") { - axis.box = { - left: plotOffset.left + axisMargin, - width: lw - }; - plotOffset.left += lw + axisMargin; - } else { - plotOffset.right += lw + axisMargin; - axis.box = { - left: surface.width - plotOffset.right, - width: lw - }; - } - } - - // save for future reference - axis.position = pos; - axis.tickLength = tickLength; - axis.showMinorTicks = showMinorTicks; - axis.showTicks = showTicks; - axis.gridLines = gridLines; - axis.box.padding = padding; - axis.innermost = innermost; - } - - function allocateAxisBoxSecondPhase(axis) { - // now that all axis boxes have been placed in one - // dimension, we can set the remaining dimension coordinates - if (axis.direction === "x") { - axis.box.left = plotOffset.left - axis.labelWidth / 2; - axis.box.width = surface.width - plotOffset.left - plotOffset.right + axis.labelWidth; - } else { - axis.box.top = plotOffset.top - axis.labelHeight / 2; - axis.box.height = surface.height - plotOffset.bottom - plotOffset.top + axis.labelHeight; - } - } - - function adjustLayoutForThingsStickingOut() { - // possibly adjust plot offset to ensure everything stays - // inside the canvas and isn't clipped off - - var minMargin = options.grid.minBorderMargin, - i; - - // check stuff from the plot (FIXME: this should just read - // a value from the series, otherwise it's impossible to - // customize) - if (minMargin == null) { - minMargin = 0; - for (i = 0; i < series.length; ++i) { - minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth / 2)); - } - } - - var a, offset = {}, - margins = { - left: minMargin, - right: minMargin, - top: minMargin, - bottom: minMargin - }; - - // check axis labels, note we don't check the actual - // labels but instead use the overall width/height to not - // jump as much around with replots - $.each(allAxes(), function(_, axis) { - if (axis.reserveSpace && axis.ticks && axis.ticks.length) { - if (axis.direction === "x") { - margins.left = Math.max(margins.left, axis.labelWidth / 2); - margins.right = Math.max(margins.right, axis.labelWidth / 2); - } else { - margins.bottom = Math.max(margins.bottom, axis.labelHeight / 2); - margins.top = Math.max(margins.top, axis.labelHeight / 2); - } - } - }); - - for (a in margins) { - offset[a] = margins[a] - plotOffset[a]; - } - $.each(xaxes.concat(yaxes), function(_, axis) { - alignAxisWithGrid(axis, offset, function (offset) { - return offset > 0; - }); - }); - - plotOffset.left = Math.ceil(Math.max(margins.left, plotOffset.left)); - plotOffset.right = Math.ceil(Math.max(margins.right, plotOffset.right)); - plotOffset.top = Math.ceil(Math.max(margins.top, plotOffset.top)); - plotOffset.bottom = Math.ceil(Math.max(margins.bottom, plotOffset.bottom)); - } - - function alignAxisWithGrid(axis, offset, isValid) { - if (axis.direction === "x") { - if (axis.position === "bottom" && isValid(offset.bottom)) { - axis.box.top -= Math.ceil(offset.bottom); - } - if (axis.position === "top" && isValid(offset.top)) { - axis.box.top += Math.ceil(offset.top); - } - } else { - if (axis.position === "left" && isValid(offset.left)) { - axis.box.left += Math.ceil(offset.left); - } - if (axis.position === "right" && isValid(offset.right)) { - axis.box.left -= Math.ceil(offset.right); - } - } - } - - function setupGrid(autoScale) { - var i, a, axes = allAxes(), - showGrid = options.grid.show; - - // Initialize the plot's offset from the edge of the canvas - - for (a in plotOffset) { - plotOffset[a] = 0; - } - - executeHooks(hooks.processOffset, [plotOffset]); - - // If the grid is visible, add its border width to the offset - for (a in plotOffset) { - if (typeof (options.grid.borderWidth) === "object") { - plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0; - } else { - plotOffset[a] += showGrid ? options.grid.borderWidth : 0; - } - } - - $.each(axes, function(_, axis) { - var axisOpts = axis.options; - axis.show = axisOpts.show == null ? axis.used : axisOpts.show; - axis.reserveSpace = axisOpts.reserveSpace == null ? axis.show : axisOpts.reserveSpace; - setupTickFormatter(axis); - executeHooks(hooks.setRange, [axis, autoScale]); - setRange(axis, autoScale); - }); - - if (showGrid) { - plotWidth = surface.width - plotOffset.left - plotOffset.right; - plotHeight = surface.height - plotOffset.bottom - plotOffset.top; - - var allocatedAxes = $.grep(axes, function(axis) { - return axis.show || axis.reserveSpace; - }); - - $.each(allocatedAxes, function(_, axis) { - // make the ticks - setupTickGeneration(axis); - setMajorTicks(axis); - snapRangeToTicks(axis, axis.ticks); - - //for computing the endpoints precision, transformationHelpers are needed - setTransformationHelpers(axis); - setEndpointTicks(axis, series); - - // find labelWidth/Height for axis - measureTickLabels(axis); - }); - - // with all dimensions calculated, we can compute the - // axis bounding boxes, start from the outside - // (reverse order) - for (i = allocatedAxes.length - 1; i >= 0; --i) { - allocateAxisBoxFirstPhase(allocatedAxes[i]); - } - - // make sure we've got enough space for things that - // might stick out - adjustLayoutForThingsStickingOut(); - - $.each(allocatedAxes, function(_, axis) { - allocateAxisBoxSecondPhase(axis); - }); - } - - //adjust axis and plotOffset according to grid.margins - if (options.grid.margin) { - for (a in plotOffset) { - var margin = options.grid.margin || 0; - plotOffset[a] += typeof margin === "number" ? margin : (margin[a] || 0); - } - $.each(xaxes.concat(yaxes), function(_, axis) { - alignAxisWithGrid(axis, options.grid.margin, function(offset) { - return offset !== undefined && offset !== null; - }); - }); - } - - //after adjusting the axis, plot width and height will be modified - plotWidth = surface.width - plotOffset.left - plotOffset.right; - plotHeight = surface.height - plotOffset.bottom - plotOffset.top; - - // now we got the proper plot dimensions, we can compute the scaling - $.each(axes, function(_, axis) { - setTransformationHelpers(axis); - }); - - if (showGrid) { - drawAxisLabels(); - } - - executeHooks(hooks.setupGrid, []); - } - - function widenMinMax(minimum, maximum) { - var min = (minimum === undefined ? null : minimum); - var max = (maximum === undefined ? null : maximum); - var delta = max - min; - if (delta === 0.0) { - // degenerate case - var widen = max === 0 ? 1 : 0.01; - var wmin = null; - if (min == null) { - wmin -= widen; - } - - // always widen max if we couldn't widen min to ensure we - // don't fall into min == max which doesn't work - if (max == null || min != null) { - max += widen; - } - - if (wmin != null) { - min = wmin; - } - } - - return { - min: min, - max: max - }; - } - - function autoScaleAxis(axis) { - var opts = axis.options, - min = opts.min, - max = opts.max, - datamin = axis.datamin, - datamax = axis.datamax, - delta; - - switch (opts.autoScale) { - case "none": - min = +(opts.min != null ? opts.min : datamin); - max = +(opts.max != null ? opts.max : datamax); - break; - case "loose": - if (datamin != null && datamax != null) { - min = datamin; - max = datamax; - delta = $.plot.saturated.saturate(max - min); - var margin = ((typeof opts.autoScaleMargin === 'number') ? opts.autoScaleMargin : 0.02); - min = $.plot.saturated.saturate(min - delta * margin); - max = $.plot.saturated.saturate(max + delta * margin); - - // make sure we don't go below zero if all values are positive - if (min < 0 && datamin >= 0) { - min = 0; - } - } else { - min = opts.min; - max = opts.max; - } - break; - case "exact": - min = (datamin != null ? datamin : opts.min); - max = (datamax != null ? datamax : opts.max); - break; - case "sliding-window": - if (datamax > max) { - // move the window to fit the new data, - // keeping the axis range constant - max = datamax; - min = Math.max(datamax - (opts.windowSize || 100), min); - } - break; - } - - var widenedMinMax = widenMinMax(min, max); - min = widenedMinMax.min; - max = widenedMinMax.max; - - // grow loose or grow exact supported - if (opts.growOnly === true && opts.autoScale !== "none" && opts.autoScale !== "sliding-window") { - min = (min < datamin) ? min : (datamin !== null ? datamin : min); - max = (max > datamax) ? max : (datamax !== null ? datamax : max); - } - - axis.autoScaledMin = min; - axis.autoScaledMax = max; - } - - function setRange(axis, autoScale) { - var min = typeof axis.options.min === 'number' ? axis.options.min : axis.min, - max = typeof axis.options.max === 'number' ? axis.options.max : axis.max, - plotOffset = axis.options.offset; - - if (autoScale) { - autoScaleAxis(axis); - min = axis.autoScaledMin; - max = axis.autoScaledMax; - } - - min = (min != null ? min : -1) + (plotOffset.below || 0); - max = (max != null ? max : 1) + (plotOffset.above || 0); - - if (min > max) { - var tmp = min; - min = max; - max = tmp; - axis.options.offset = { above: 0, below: 0 }; - } - - axis.min = $.plot.saturated.saturate(min); - axis.max = $.plot.saturated.saturate(max); - } - - function computeValuePrecision (min, max, direction, ticks, tickDecimals) { - var noTicks = fixupNumberOfTicks(direction, surface, ticks); - - var delta = $.plot.saturated.delta(min, max, noTicks), - dec = -Math.floor(Math.log(delta) / Math.LN10); - - //if it is called with tickDecimals, then the precision should not be greather then that - if (tickDecimals && dec > tickDecimals) { - dec = tickDecimals; - } - - var magn = Math.pow(10, -dec), - norm = delta / magn; - - if (norm > 2.25 && norm < 3 && (dec + 1) <= tickDecimals) { - //we need an extra decimals when tickSize is 2.5 - ++dec; - } - - return isFinite(dec) ? dec : 0; - }; - - function computeTickSize (min, max, noTicks, tickDecimals) { - var delta = $.plot.saturated.delta(min, max, noTicks), - dec = -Math.floor(Math.log(delta) / Math.LN10); - - //if it is called with tickDecimals, then the precision should not be greather then that - if (tickDecimals && dec > tickDecimals) { - dec = tickDecimals; - } - - var magn = Math.pow(10, -dec), - norm = delta / magn, // norm is between 1.0 and 10.0 - size; - - if (norm < 1.5) { - size = 1; - } else if (norm < 3) { - size = 2; - if (norm > 2.25 && (tickDecimals == null || (dec + 1) <= tickDecimals)) { - size = 2.5; - } - } else if (norm < 7.5) { - size = 5; - } else { - size = 10; - } - - size *= magn; - return size; - } - - function getAxisTickSize(min, max, direction, options, tickDecimals) { - var noTicks; - - if (typeof options.ticks === "number" && options.ticks > 0) { - noTicks = options.ticks; - } else { - // heuristic based on the model a*sqrt(x) fitted to - // some data points that seemed reasonable - noTicks = 0.3 * Math.sqrt(direction === "x" ? surface.width : surface.height); - } - - var size = computeTickSize(min, max, noTicks, tickDecimals); - - if (options.minTickSize != null && size < options.minTickSize) { - size = options.minTickSize; - } - - return options.tickSize || size; - }; - - function fixupNumberOfTicks(direction, surface, ticksOption) { - var noTicks; - - if (typeof ticksOption === "number" && ticksOption > 0) { - noTicks = ticksOption; - } else { - noTicks = 0.3 * Math.sqrt(direction === "x" ? surface.width : surface.height); - } - - return noTicks; - } - - function setupTickFormatter(axis) { - var opts = axis.options; - if (!axis.tickFormatter) { - if (typeof opts.tickFormatter === 'function') { - axis.tickFormatter = function() { - var args = Array.prototype.slice.call(arguments); - return "" + opts.tickFormatter.apply(null, args); - }; - } else { - axis.tickFormatter = defaultTickFormatter; - } - } - } - - function setupTickGeneration(axis) { - var opts = axis.options; - var noTicks; - - noTicks = fixupNumberOfTicks(axis.direction, surface, opts.ticks); - - axis.delta = $.plot.saturated.delta(axis.min, axis.max, noTicks); - var precision = plot.computeValuePrecision(axis.min, axis.max, axis.direction, noTicks, opts.tickDecimals); - - axis.tickDecimals = Math.max(0, opts.tickDecimals != null ? opts.tickDecimals : precision); - axis.tickSize = getAxisTickSize(axis.min, axis.max, axis.direction, opts, opts.tickDecimals); - - // Flot supports base-10 axes; any other mode else is handled by a plug-in, - // like flot.time.js. - - if (!axis.tickGenerator) { - if (typeof opts.tickGenerator === 'function') { - axis.tickGenerator = opts.tickGenerator; - } else { - axis.tickGenerator = defaultTickGenerator; - } - } - - if (opts.alignTicksWithAxis != null) { - var otherAxis = (axis.direction === "x" ? xaxes : yaxes)[opts.alignTicksWithAxis - 1]; - if (otherAxis && otherAxis.used && otherAxis !== axis) { - // consider snapping min/max to outermost nice ticks - var niceTicks = axis.tickGenerator(axis, plot); - if (niceTicks.length > 0) { - if (opts.min == null) { - axis.min = Math.min(axis.min, niceTicks[0]); - } - - if (opts.max == null && niceTicks.length > 1) { - axis.max = Math.max(axis.max, niceTicks[niceTicks.length - 1]); - } - } - - axis.tickGenerator = function(axis) { - // copy ticks, scaled to this axis - var ticks = [], - v, i; - for (i = 0; i < otherAxis.ticks.length; ++i) { - v = (otherAxis.ticks[i].v - otherAxis.min) / (otherAxis.max - otherAxis.min); - v = axis.min + v * (axis.max - axis.min); - ticks.push(v); - } - return ticks; - }; - - // we might need an extra decimal since forced - // ticks don't necessarily fit naturally - if (!axis.mode && opts.tickDecimals == null) { - var extraDec = Math.max(0, -Math.floor(Math.log(axis.delta) / Math.LN10) + 1), - ts = axis.tickGenerator(axis, plot); - - // only proceed if the tick interval rounded - // with an extra decimal doesn't give us a - // zero at end - if (!(ts.length > 1 && /\..*0$/.test((ts[1] - ts[0]).toFixed(extraDec)))) { - axis.tickDecimals = extraDec; - } - } - } - } - } - - function setMajorTicks(axis) { - var oticks = axis.options.ticks, - ticks = []; - if (oticks == null || (typeof oticks === "number" && oticks > 0)) { - ticks = axis.tickGenerator(axis, plot); - } else if (oticks) { - if ($.isFunction(oticks)) { - // generate the ticks - ticks = oticks(axis); - } else { - ticks = oticks; - } - } - - // clean up/labelify the supplied ticks, copy them over - var i, v; - axis.ticks = []; - for (i = 0; i < ticks.length; ++i) { - var label = null; - var t = ticks[i]; - if (typeof t === "object") { - v = +t[0]; - if (t.length > 1) { - label = t[1]; - } - } else { - v = +t; - } - - if (!isNaN(v)) { - axis.ticks.push( - newTick(v, label, axis, 'major')); - } - } - } - - function newTick(v, label, axis, type) { - if (label === null) { - switch (type) { - case 'min': - case 'max': - //improving the precision of endpoints - var precision = getEndpointPrecision(v, axis); - label = isFinite(precision) ? axis.tickFormatter(v, axis, precision, plot) : axis.tickFormatter(v, axis, precision, plot); - break; - case 'major': - label = axis.tickFormatter(v, axis, undefined, plot); - } - } - return { - v: v, - label: label - }; - } - - function snapRangeToTicks(axis, ticks) { - if (axis.options.autoScale === "loose" && ticks.length > 0) { - // snap to ticks - axis.min = Math.min(axis.min, ticks[0].v); - axis.max = Math.max(axis.max, ticks[ticks.length - 1].v); - } - } - - function getEndpointPrecision(value, axis) { - var canvas1 = Math.floor(axis.p2c(value)), - canvas2 = axis.direction === "x" ? canvas1 + 1 : canvas1 - 1, - point1 = axis.c2p(canvas1), - point2 = axis.c2p(canvas2), - precision = computeValuePrecision(point1, point2, axis.direction, 1); - - return precision; - } - - function setEndpointTicks(axis, series) { - if (isValidEndpointTick(axis, series)) { - axis.ticks.unshift(newTick(axis.min, null, axis, 'min')); - axis.ticks.push(newTick(axis.max, null, axis, 'max')); - } - } - - function isValidEndpointTick(axis, series) { - if (axis.options.showTickLabels === 'endpoints') { - return true; - } - if (axis.options.showTickLabels === 'all') { - var associatedSeries = series.filter(function(s) { - return s.xaxis === axis; - }), - notAllBarSeries = associatedSeries.some(function(s) { - return !s.bars.show; - }); - return associatedSeries.length === 0 || notAllBarSeries; - } - if (axis.options.showTickLabels === 'major' || axis.options.showTickLabels === 'none') { - return false; - } - } - - function draw() { - surface.clear(); - executeHooks(hooks.drawBackground, [ctx]); - - var grid = options.grid; - - // draw background, if any - if (grid.show && grid.backgroundColor) { - drawBackground(); - } - - if (grid.show && !grid.aboveData) { - drawGrid(); - } - - for (var i = 0; i < series.length; ++i) { - executeHooks(hooks.drawSeries, [ctx, series[i], i, getColorOrGradient]); - drawSeries(series[i]); - } - - executeHooks(hooks.draw, [ctx]); - - if (grid.show && grid.aboveData) { - drawGrid(); - } - - surface.render(); - - // A draw implies that either the axes or data have changed, so we - // should probably update the overlay highlights as well. - triggerRedrawOverlay(); - } - - function extractRange(ranges, coord) { - var axis, from, to, key, axes = allAxes(); - - for (var i = 0; i < axes.length; ++i) { - axis = axes[i]; - if (axis.direction === coord) { - key = coord + axis.n + "axis"; - if (!ranges[key] && axis.n === 1) { - // support x1axis as xaxis - key = coord + "axis"; - } - - if (ranges[key]) { - from = ranges[key].from; - to = ranges[key].to; - break; - } - } - } - - // backwards-compat stuff - to be removed in future - if (!ranges[key]) { - axis = coord === "x" ? xaxes[0] : yaxes[0]; - from = ranges[coord + "1"]; - to = ranges[coord + "2"]; - } - - // auto-reverse as an added bonus - if (from != null && to != null && from > to) { - var tmp = from; - from = to; - to = tmp; - } - - return { - from: from, - to: to, - axis: axis - }; - } - - function drawBackground() { - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - ctx.fillStyle = getColorOrGradient(options.grid.backgroundColor, plotHeight, 0, "rgba(255, 255, 255, 0)"); - ctx.fillRect(0, 0, plotWidth, plotHeight); - ctx.restore(); - } - - function drawMarkings() { - // draw markings - var markings = options.grid.markings, - axes; - - if (markings) { - if ($.isFunction(markings)) { - axes = plot.getAxes(); - // xmin etc. is backwards compatibility, to be - // removed in the future - axes.xmin = axes.xaxis.min; - axes.xmax = axes.xaxis.max; - axes.ymin = axes.yaxis.min; - axes.ymax = axes.yaxis.max; - - markings = markings(axes); - } - - var i; - for (i = 0; i < markings.length; ++i) { - var m = markings[i], - xrange = extractRange(m, "x"), - yrange = extractRange(m, "y"); - - // fill in missing - if (xrange.from == null) { - xrange.from = xrange.axis.min; - } - - if (xrange.to == null) { - xrange.to = xrange.axis.max; - } - - if (yrange.from == null) { - yrange.from = yrange.axis.min; - } - - if (yrange.to == null) { - yrange.to = yrange.axis.max; - } - - // clip - if (xrange.to < xrange.axis.min || xrange.from > xrange.axis.max || - yrange.to < yrange.axis.min || yrange.from > yrange.axis.max) { - continue; - } - - xrange.from = Math.max(xrange.from, xrange.axis.min); - xrange.to = Math.min(xrange.to, xrange.axis.max); - yrange.from = Math.max(yrange.from, yrange.axis.min); - yrange.to = Math.min(yrange.to, yrange.axis.max); - - var xequal = xrange.from === xrange.to, - yequal = yrange.from === yrange.to; - - if (xequal && yequal) { - continue; - } - - // then draw - xrange.from = Math.floor(xrange.axis.p2c(xrange.from)); - xrange.to = Math.floor(xrange.axis.p2c(xrange.to)); - yrange.from = Math.floor(yrange.axis.p2c(yrange.from)); - yrange.to = Math.floor(yrange.axis.p2c(yrange.to)); - - if (xequal || yequal) { - var lineWidth = m.lineWidth || options.grid.markingsLineWidth, - subPixel = lineWidth % 2 ? 0.5 : 0; - ctx.beginPath(); - ctx.strokeStyle = m.color || options.grid.markingsColor; - ctx.lineWidth = lineWidth; - if (xequal) { - ctx.moveTo(xrange.to + subPixel, yrange.from); - ctx.lineTo(xrange.to + subPixel, yrange.to); - } else { - ctx.moveTo(xrange.from, yrange.to + subPixel); - ctx.lineTo(xrange.to, yrange.to + subPixel); - } - ctx.stroke(); - } else { - ctx.fillStyle = m.color || options.grid.markingsColor; - ctx.fillRect(xrange.from, yrange.to, - xrange.to - xrange.from, - yrange.from - yrange.to); - } - } - } - } - - function findEdges(axis) { - var box = axis.box, - x = 0, - y = 0; - - // find the edges - if (axis.direction === "x") { - x = 0; - y = box.top - plotOffset.top + (axis.position === "top" ? box.height : 0); - } else { - y = 0; - x = box.left - plotOffset.left + (axis.position === "left" ? box.width : 0) + axis.boxPosition.centerX; - } - - return { - x: x, - y: y - }; - }; - - function alignPosition(lineWidth, pos) { - return ((lineWidth % 2) !== 0) ? Math.floor(pos) + 0.5 : pos; - }; - - function drawTickBar(axis) { - ctx.lineWidth = 1; - var edges = findEdges(axis), - x = edges.x, - y = edges.y; - - // draw tick bar - if (axis.show) { - var xoff = 0, - yoff = 0; - - ctx.strokeStyle = axis.options.color; - ctx.beginPath(); - if (axis.direction === "x") { - xoff = plotWidth + 1; - } else { - yoff = plotHeight + 1; - } - - if (axis.direction === "x") { - y = alignPosition(ctx.lineWidth, y); - } else { - x = alignPosition(ctx.lineWidth, x); - } - - ctx.moveTo(x, y); - ctx.lineTo(x + xoff, y + yoff); - ctx.stroke(); - } - }; - - function drawTickMarks(axis) { - var t = axis.tickLength, - minorTicks = axis.showMinorTicks, - minorTicksNr = MINOR_TICKS_COUNT_CONSTANT, - edges = findEdges(axis), - x = edges.x, - y = edges.y, - i = 0; - - // draw major tick marks - ctx.strokeStyle = axis.options.color; - ctx.beginPath(); - - for (i = 0; i < axis.ticks.length; ++i) { - var v = axis.ticks[i].v, - xoff = 0, - yoff = 0, - xminor = 0, - yminor = 0, - j; - - if (!isNaN(v) && v >= axis.min && v <= axis.max) { - if (axis.direction === "x") { - x = axis.p2c(v); - yoff = t; - - if (axis.position === "top") { - yoff = -yoff; - } - } else { - y = axis.p2c(v); - xoff = t; - - if (axis.position === "left") { - xoff = -xoff; - } - } - - if (axis.direction === "x") { - x = alignPosition(ctx.lineWidth, x); - } else { - y = alignPosition(ctx.lineWidth, y); - } - - ctx.moveTo(x, y); - ctx.lineTo(x + xoff, y + yoff); - } - - //draw minor tick marks - if (minorTicks === true && i < axis.ticks.length - 1) { - var v1 = axis.ticks[i].v, - v2 = axis.ticks[i + 1].v, - step = (v2 - v1) / (minorTicksNr + 1); - - for (j = 1; j <= minorTicksNr; j++) { - // compute minor tick position - if (axis.direction === "x") { - yminor = t / 2; // minor ticks are half length - x = alignPosition(ctx.lineWidth, axis.p2c(v1 + j * step)) - - if (axis.position === "top") { - yminor = -yminor; - } - - // don't go over the plot borders - if ((x < 0) || (x > plotWidth)) { - continue; - } - } else { - xminor = t / 2; // minor ticks are half length - y = alignPosition(ctx.lineWidth, axis.p2c(v1 + j * step)); - - if (axis.position === "left") { - xminor = -xminor; - } - - // don't go over the plot borders - if ((y < 0) || (y > plotHeight)) { - continue; - } - } - - ctx.moveTo(x, y); - ctx.lineTo(x + xminor, y + yminor); - } - } - } - - ctx.stroke(); - }; - - function drawGridLines(axis) { - // check if the line will be overlapped with a border - var overlappedWithBorder = function (value) { - var bw = options.grid.borderWidth; - return (((typeof bw === "object" && bw[axis.position] > 0) || bw > 0) && (value === axis.min || value === axis.max)); - }; - - ctx.strokeStyle = options.grid.tickColor; - ctx.beginPath(); - var i; - for (i = 0; i < axis.ticks.length; ++i) { - var v = axis.ticks[i].v, - xoff = 0, - yoff = 0, - x = 0, - y = 0; - - if (isNaN(v) || v < axis.min || v > axis.max) continue; - - // skip those lying on the axes if we got a border - if (overlappedWithBorder(v)) continue; - - if (axis.direction === "x") { - x = axis.p2c(v); - y = plotHeight; - yoff = -plotHeight; - } else { - x = 0; - y = axis.p2c(v); - xoff = plotWidth; - } - - if (axis.direction === "x") { - x = alignPosition(ctx.lineWidth, x); - } else { - y = alignPosition(ctx.lineWidth, y); - } - - ctx.moveTo(x, y); - ctx.lineTo(x + xoff, y + yoff); - } - - ctx.stroke(); - }; - - function drawBorder() { - // If either borderWidth or borderColor is an object, then draw the border - // line by line instead of as one rectangle - var bw = options.grid.borderWidth, - bc = options.grid.borderColor; - - if (typeof bw === "object" || typeof bc === "object") { - if (typeof bw !== "object") { - bw = { - top: bw, - right: bw, - bottom: bw, - left: bw - }; - } - if (typeof bc !== "object") { - bc = { - top: bc, - right: bc, - bottom: bc, - left: bc - }; - } - - if (bw.top > 0) { - ctx.strokeStyle = bc.top; - ctx.lineWidth = bw.top; - ctx.beginPath(); - ctx.moveTo(0 - bw.left, 0 - bw.top / 2); - ctx.lineTo(plotWidth, 0 - bw.top / 2); - ctx.stroke(); - } - - if (bw.right > 0) { - ctx.strokeStyle = bc.right; - ctx.lineWidth = bw.right; - ctx.beginPath(); - ctx.moveTo(plotWidth + bw.right / 2, 0 - bw.top); - ctx.lineTo(plotWidth + bw.right / 2, plotHeight); - ctx.stroke(); - } - - if (bw.bottom > 0) { - ctx.strokeStyle = bc.bottom; - ctx.lineWidth = bw.bottom; - ctx.beginPath(); - ctx.moveTo(plotWidth + bw.right, plotHeight + bw.bottom / 2); - ctx.lineTo(0, plotHeight + bw.bottom / 2); - ctx.stroke(); - } - - if (bw.left > 0) { - ctx.strokeStyle = bc.left; - ctx.lineWidth = bw.left; - ctx.beginPath(); - ctx.moveTo(0 - bw.left / 2, plotHeight + bw.bottom); - ctx.lineTo(0 - bw.left / 2, 0); - ctx.stroke(); - } - } else { - ctx.lineWidth = bw; - ctx.strokeStyle = options.grid.borderColor; - ctx.strokeRect(-bw / 2, -bw / 2, plotWidth + bw, plotHeight + bw); - } - }; - - function drawGrid() { - var axes, bw; - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - drawMarkings(); - - axes = allAxes(); - bw = options.grid.borderWidth; - - for (var j = 0; j < axes.length; ++j) { - var axis = axes[j]; - - if (!axis.show) { - continue; - } - - drawTickBar(axis); - if (axis.showTicks === true) { - drawTickMarks(axis); - } - - if (axis.gridLines === true) { - drawGridLines(axis, bw); - } - } - - // draw border - if (bw) { - drawBorder(); - } - - ctx.restore(); - } - - function drawAxisLabels() { - $.each(allAxes(), function(_, axis) { - var box = axis.box, - legacyStyles = axis.direction + "Axis " + axis.direction + axis.n + "Axis", - layer = "flot-" + axis.direction + "-axis flot-" + axis.direction + axis.n + "-axis " + legacyStyles, - font = axis.options.font || "flot-tick-label tickLabel", - i, x, y, halign, valign, info, - margin = 3, - nullBox = {x: NaN, y: NaN, width: NaN, height: NaN}, newLabelBox, labelBoxes = [], - overlapping = function(x11, y11, x12, y12, x21, y21, x22, y22) { - return ((x11 <= x21 && x21 <= x12) || (x21 <= x11 && x11 <= x22)) && - ((y11 <= y21 && y21 <= y12) || (y21 <= y11 && y11 <= y22)); - }, - overlapsOtherLabels = function(newLabelBox, previousLabelBoxes) { - return previousLabelBoxes.some(function(labelBox) { - return overlapping( - newLabelBox.x, newLabelBox.y, newLabelBox.x + newLabelBox.width, newLabelBox.y + newLabelBox.height, - labelBox.x, labelBox.y, labelBox.x + labelBox.width, labelBox.y + labelBox.height); - }); - }, - drawAxisLabel = function (tick, labelBoxes) { - if (!tick || !tick.label || tick.v < axis.min || tick.v > axis.max) { - return nullBox; - } - - info = surface.getTextInfo(layer, tick.label, font); - - if (axis.direction === "x") { - halign = "center"; - x = plotOffset.left + axis.p2c(tick.v); - if (axis.position === "bottom") { - y = box.top + box.padding - axis.boxPosition.centerY; - } else { - y = box.top + box.height - box.padding + axis.boxPosition.centerY; - valign = "bottom"; - } - newLabelBox = {x: x - info.width / 2 - margin, y: y - margin, width: info.width + 2 * margin, height: info.height + 2 * margin}; - } else { - valign = "middle"; - y = plotOffset.top + axis.p2c(tick.v); - if (axis.position === "left") { - x = box.left + box.width - box.padding - axis.boxPosition.centerX; - halign = "right"; - } else { - x = box.left + box.padding + axis.boxPosition.centerX; - } - newLabelBox = {x: x - info.width / 2 - margin, y: y - margin, width: info.width + 2 * margin, height: info.height + 2 * margin}; - } - - if (overlapsOtherLabels(newLabelBox, labelBoxes)) { - return nullBox; - } - - surface.addText(layer, x, y, tick.label, font, null, null, halign, valign); - - return newLabelBox; - }; - - // Remove text before checking for axis.show and ticks.length; - // otherwise plugins, like flot-tickrotor, that draw their own - // tick labels will end up with both theirs and the defaults. - - surface.removeText(layer); - - executeHooks(hooks.drawAxis, [axis, surface]); - - if (!axis.show) { - return; - } - - switch (axis.options.showTickLabels) { - case 'none': - break; - case 'endpoints': - labelBoxes.push(drawAxisLabel(axis.ticks[0], labelBoxes)); - labelBoxes.push(drawAxisLabel(axis.ticks[axis.ticks.length - 1], labelBoxes)); - break; - case 'major': - labelBoxes.push(drawAxisLabel(axis.ticks[0], labelBoxes)); - labelBoxes.push(drawAxisLabel(axis.ticks[axis.ticks.length - 1], labelBoxes)); - for (i = 1; i < axis.ticks.length - 1; ++i) { - labelBoxes.push(drawAxisLabel(axis.ticks[i], labelBoxes)); - } - break; - case 'all': - labelBoxes.push(drawAxisLabel(axis.ticks[0], [])); - labelBoxes.push(drawAxisLabel(axis.ticks[axis.ticks.length - 1], labelBoxes)); - for (i = 1; i < axis.ticks.length - 1; ++i) { - labelBoxes.push(drawAxisLabel(axis.ticks[i], labelBoxes)); - } - break; - } - }); - } - - function drawSeries(series) { - if (series.lines.show) { - $.plot.drawSeries.drawSeriesLines(series, ctx, plotOffset, plotWidth, plotHeight, plot.drawSymbol, getColorOrGradient); - } - - if (series.bars.show) { - $.plot.drawSeries.drawSeriesBars(series, ctx, plotOffset, plotWidth, plotHeight, plot.drawSymbol, getColorOrGradient); - } - - if (series.points.show) { - $.plot.drawSeries.drawSeriesPoints(series, ctx, plotOffset, plotWidth, plotHeight, plot.drawSymbol, getColorOrGradient); - } - } - - function computeRangeForDataSeries(series, force, isValid) { - var points = series.datapoints.points, - ps = series.datapoints.pointsize, - format = series.datapoints.format, - topSentry = Number.POSITIVE_INFINITY, - bottomSentry = Number.NEGATIVE_INFINITY, - range = { - xmin: topSentry, - ymin: topSentry, - xmax: bottomSentry, - ymax: bottomSentry - }; - - for (var j = 0; j < points.length; j += ps) { - if (points[j] === null) { - continue; - } - - if (typeof (isValid) === 'function' && !isValid(points[j])) { - continue; - } - - for (var m = 0; m < ps; ++m) { - var val = points[j + m], - f = format[m]; - if (f === null || f === undefined) { - continue; - } - - if (typeof (isValid) === 'function' && !isValid(val)) { - continue; - } - - if ((!force && !f.computeRange) || val === Infinity || val === -Infinity) { - continue; - } - - if (f.x === true) { - if (val < range.xmin) { - range.xmin = val; - } - - if (val > range.xmax) { - range.xmax = val; - } - } - - if (f.y === true) { - if (val < range.ymin) { - range.ymin = val; - } - - if (val > range.ymax) { - range.ymax = val; - } - } - } - } - - return range; - }; - - function adjustSeriesDataRange(series, range) { - if (series.bars.show) { - // make sure we got room for the bar on the dancing floor - var delta; - - // update bar width if needed - var useAbsoluteBarWidth = series.bars.barWidth[1]; - if (series.datapoints && series.datapoints.points && !useAbsoluteBarWidth) { - computeBarWidth(series); - } - - var barWidth = series.bars.barWidth[0] || series.bars.barWidth; - switch (series.bars.align) { - case "left": - delta = 0; - break; - case "right": - delta = -barWidth; - break; - default: - delta = -barWidth / 2; - } - - if (series.bars.horizontal) { - range.ymin += delta; - range.ymax += delta + barWidth; - } - else { - range.xmin += delta; - range.xmax += delta + barWidth; - } - } - - if ((series.bars.show && series.bars.zero) || (series.lines.show && series.lines.zero)) { - var ps = series.datapoints.pointsize; - - // make sure the 0 point is included in the computed y range when requested - if (ps <= 2) { - /*if ps > 0 the points were already taken into account for autoScale */ - range.ymin = Math.min(0, range.ymin); - range.ymax = Math.max(0, range.ymax); - } - } - - return range; - }; - - function computeBarWidth(series) { - var pointsize = series.datapoints.pointsize, minDistance = Number.MAX_VALUE, - distance = series.datapoints.points[pointsize] - series.datapoints.points[0] || 1; - - if (isFinite(distance)) { - minDistance = distance; - } - for (var j = pointsize; j < series.datapoints.points.length - pointsize; j += pointsize) { - distance = Math.abs(series.datapoints.points[pointsize + j] - series.datapoints.points[j]); - if (distance < minDistance && isFinite(distance)) { - minDistance = distance; - } - } - - if (typeof series.bars.barWidth === "number") { - series.bars.barWidth = series.bars.barWidth * minDistance; - } else { - series.bars.barWidth[0] = series.bars.barWidth[0] * minDistance; - } - } - - // returns the data item the mouse is over/ the cursor is closest to, or null if none is found - function findNearbyItem(mouseX, mouseY, seriesFilter, radius, computeDistance) { - var i, j, - item = null, - smallestDistance = radius * radius + 1; - - for (var i = series.length - 1; i >= 0; --i) { - if (!seriesFilter(i)) continue; - - var s = series[i]; - if (!s.datapoints) return; - - if (s.lines.show || s.points.show) { - var found = findNearbyPoint(s, mouseX, mouseY, radius, smallestDistance, computeDistance); - if (found) { - smallestDistance = found.distance; - item = [i, found.dataIndex]; - } - } - - if (s.bars.show && !item) { // no other point can be nearby - var foundIndex = findNearbyBar(s, mouseX, mouseY); - if (foundIndex) item = [i, foundIndex]; - } - } - - if (item) { - i = item[0]; - j = item[1]; - var ps = series[i].datapoints.pointsize; - - return { - datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps), - dataIndex: j, - series: series[i], - seriesIndex: i - }; - } - - return null; - } - - function findNearbyPoint (series, mouseX, mouseY, maxDistance, smallestDistance, computeDistance) { - var mx = series.xaxis.c2p(mouseX), - my = series.yaxis.c2p(mouseY), - maxx = maxDistance / series.xaxis.scale, - maxy = maxDistance / series.yaxis.scale, - points = series.datapoints.points, - ps = series.datapoints.pointsize; - - // with inverse transforms, we can't use the maxx/maxy - // optimization, sadly - if (series.xaxis.options.inverseTransform) { - maxx = Number.MAX_VALUE; - } - - if (series.yaxis.options.inverseTransform) { - maxy = Number.MAX_VALUE; - } - - var found = null; - for (var j = 0; j < points.length; j += ps) { - var x = points[j]; - var y = points[j + 1]; - if (x == null) { - continue; - } - - if (x - mx > maxx || x - mx < -maxx || - y - my > maxy || y - my < -maxy) { - continue; - } - - // We have to calculate distances in pixels, not in - // data units, because the scales of the axes may be different - var dx = Math.abs(series.xaxis.p2c(x) - mouseX); - var dy = Math.abs(series.yaxis.p2c(y) - mouseY); - var dist = computeDistance ? computeDistance(dx, dy) : dx * dx + dy * dy; - - // use <= to ensure last point takes precedence - // (last generally means on top of) - if (dist < smallestDistance) { - smallestDistance = dist; - found = { dataIndex: j / ps, distance: dist }; - } - } - - return found; - } - - function findNearbyBar (series, mouseX, mouseY) { - var barLeft, barRight, - barWidth = series.bars.barWidth[0] || series.bars.barWidth, - mx = series.xaxis.c2p(mouseX), - my = series.yaxis.c2p(mouseY), - points = series.datapoints.points, - ps = series.datapoints.pointsize; - - switch (series.bars.align) { - case "left": - barLeft = 0; - break; - case "right": - barLeft = -barWidth; - break; - default: - barLeft = -barWidth / 2; - } - - barRight = barLeft + barWidth; - - var fillTowards = series.bars.fillTowards || 0; - var bottom = fillTowards > series.yaxis.min ? Math.min(series.yaxis.max, fillTowards) : series.yaxis.min; - - var foundIndex = null; - for (var j = 0; j < points.length; j += ps) { - var x = points[j], y = points[j + 1]; - if (x == null) - continue; - - // for a bar graph, the cursor must be inside the bar - if (series.bars.horizontal ? - (mx <= Math.max(bottom, x) && mx >= Math.min(bottom, x) && - my >= y + barLeft && my <= y + barRight) : - (mx >= x + barLeft && mx <= x + barRight && - my >= Math.min(bottom, y) && my <= Math.max(bottom, y))) - foundIndex = j / ps; - } - - return foundIndex; - } - - function findNearbyInterpolationPoint(posX, posY, seriesFilter) { - var i, j, dist, dx, dy, ps, - item, - smallestDistance = Number.MAX_VALUE; - - for (i = 0; i < series.length; ++i) { - if (!seriesFilter(i)) { - continue; - } - var points = series[i].datapoints.points; - ps = series[i].datapoints.pointsize; - - // if the data is coming from positive -> negative, reverse the comparison - const comparer = points[points.length - ps] < points[0] - ? function (x1, x2) { return x1 > x2 } - : function (x1, x2) { return x2 > x1 }; - - // do not interpolate outside the bounds of the data. - if (comparer(posX, points[0])) { - continue; - } - - // Find the nearest points, x-wise - for (j = ps; j < points.length; j += ps) { - if (comparer(posX, points[j])) { - break; - } - } - - // Now Interpolate - var y, - p1x = points[j - ps], - p1y = points[j - ps + 1], - p2x = points[j], - p2y = points[j + 1]; - - if ((p1x === undefined) || (p2x === undefined) || - (p1y === undefined) || (p2y === undefined)) { - continue; - } - - if (p1x === p2x) { - y = p2y - } else { - y = p1y + (p2y - p1y) * (posX - p1x) / (p2x - p1x); - } - - posY = y; - - dx = Math.abs(series[i].xaxis.p2c(p2x) - posX); - dy = Math.abs(series[i].yaxis.p2c(p2y) - posY); - dist = dx * dx + dy * dy; - - if (dist < smallestDistance) { - smallestDistance = dist; - item = [posX, posY, i, j]; - } - } - - if (item) { - i = item[2]; - j = item[3]; - ps = series[i].datapoints.pointsize; - points = series[i].datapoints.points; - p1x = points[j - ps]; - p1y = points[j - ps + 1]; - p2x = points[j]; - p2y = points[j + 1]; - - return { - datapoint: [item[0], item[1]], - leftPoint: [p1x, p1y], - rightPoint: [p2x, p2y], - seriesIndex: i - }; - } - - return null; - } - - function triggerRedrawOverlay() { - var t = options.interaction.redrawOverlayInterval; - if (t === -1) { // skip event queue - drawOverlay(); - return; - } - - if (!redrawTimeout) { - redrawTimeout = setTimeout(function() { - drawOverlay(plot); - }, t); - } - } - - function drawOverlay(plot) { - redrawTimeout = null; - - if (!octx) { - return; - } - overlay.clear(); - executeHooks(hooks.drawOverlay, [octx, overlay]); - var event = new CustomEvent('onDrawingDone'); - plot.getEventHolder().dispatchEvent(event); - } - - function getColorOrGradient(spec, bottom, top, defaultColor) { - if (typeof spec === "string") { - return spec; - } else { - // assume this is a gradient spec; IE currently only - // supports a simple vertical gradient properly, so that's - // what we support too - var gradient = ctx.createLinearGradient(0, top, 0, bottom); - - for (var i = 0, l = spec.colors.length; i < l; ++i) { - var c = spec.colors[i]; - if (typeof c !== "string") { - var co = $.color.parse(defaultColor); - if (c.brightness != null) { - co = co.scale('rgb', c.brightness); - } - - if (c.opacity != null) { - co.a *= c.opacity; - } - - c = co.toString(); - } - gradient.addColorStop(i / (l - 1), c); - } - - return gradient; - } - } - } - - // Add the plot function to the top level of the jQuery object - - $.plot = function(placeholder, data, options) { - var plot = new Plot($(placeholder), data, options, $.plot.plugins); - return plot; - }; - - $.plot.version = "1.0.3"; - - $.plot.plugins = []; - - // Also add the plot function as a chainable property - $.fn.plot = function(data, options) { - return this.each(function() { - $.plot(this, data, options); - }); - }; - - $.plot.linearTickGenerator = defaultTickGenerator; - $.plot.defaultTickFormatter = defaultTickFormatter; - $.plot.expRepTickFormatter = expRepTickFormatter; -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.legend.js b/extern/phmap/benchmark/js/jquery.flot.legend.js deleted file mode 100644 index 3a6ae15..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.legend.js +++ /dev/null @@ -1,395 +0,0 @@ -/* Flot plugin for drawing legends. - -*/ - -(function($) { - var defaultOptions = { - legend: { - show: false, - labelFormatter: null, // fn: string -> string - container: null, // container (as jQuery object) to put legend in, null means default on top of graph - position: 'ne', // position of default legend container within plot - margin: 5, // distance from grid edge to default legend container within plot - sorted: null // default to no legend sorting - } - }; - - function insertLegend(plot, options, placeholder, legendEntries) { - // clear before redraw - if (options.legend.container != null) { - $(options.legend.container).html(''); - } else { - placeholder.find('.legend').remove(); - } - - if (!options.legend.show) { - return; - } - - // Save the legend entries in legend options - var entries = options.legend.legendEntries = legendEntries, - plotOffset = options.legend.plotOffset = plot.getPlotOffset(), - html = [], - entry, labelHtml, iconHtml, - maxLabelLength = 0, - j = 0, - pos = "", - p = options.legend.position, - m = options.legend.margin, - shape = { - name: '', - label: '', - xPos: '', - yPos: '' - }; - - html[j++] = ''; - html[j++] = ''; - html[j++] = svgShapeDefs; - - // Generate html for icons and labels from a list of entries - for (var i = 0; i < entries.length; ++i) { - entry = entries[i]; - iconHtml = ''; - shape.label = entry.label; - shape.xPos = '0em'; - shape.yPos = i * 1.5 + 'em'; - // area - if (entry.options.lines.show && entry.options.lines.fill) { - shape.name = 'area'; - shape.fillColor = entry.color; - iconHtml += getEntryIconHtml(shape); - } - // bars - if (entry.options.bars.show) { - shape.name = 'bar'; - shape.fillColor = entry.color; - iconHtml += getEntryIconHtml(shape); - } - // lines - if (entry.options.lines.show && !entry.options.lines.fill) { - shape.name = 'line'; - shape.strokeColor = entry.color; - shape.strokeWidth = entry.options.lines.lineWidth; - iconHtml += getEntryIconHtml(shape); - } - // points - if (entry.options.points.show) { - shape.name = entry.options.points.symbol; - shape.strokeColor = entry.color; - shape.fillColor = entry.options.points.fillColor; - shape.strokeWidth = entry.options.points.lineWidth; - iconHtml += getEntryIconHtml(shape); - } - - maxLabelLength = maxLabelLength < shape.label.length ? shape.label.length : maxLabelLength; - labelHtml = '' + shape.label + '' - html[j++] = '' + iconHtml + labelHtml + ''; - } - - html[j++] = ''; - if (m[0] == null) { - m = [m, m]; - } - - if (p.charAt(0) === 'n') { - pos += 'top:' + (m[1] + plotOffset.top) + 'px;'; - } else if (p.charAt(0) === 's') { - pos += 'bottom:' + (m[1] + plotOffset.bottom) + 'px;'; - } - - if (p.charAt(1) === 'e') { - pos += 'right:' + (m[0] + plotOffset.right) + 'px;'; - } else if (p.charAt(1) === 'w') { - pos += 'left:' + (m[0] + plotOffset.left) + 'px;'; - } - - var legendEl, - width = 3 + maxLabelLength / 2, - height = entries.length * 1.6; - if (!options.legend.container) { - legendEl = $('
' + html.join('') + '
').appendTo(placeholder); - legendEl.css('width', width + 'em'); - legendEl.css('height', height + 'em'); - legendEl.css('pointerEvents', 'none'); - } else { - legendEl = $(html.join('')).appendTo(options.legend.container)[0]; - options.legend.container.style.width = width + 'em'; - options.legend.container.style.height = height + 'em'; - } - } - - // Generate html for a shape - function getEntryIconHtml(shape) { - var html = '', - name = shape.name, - x = shape.xPos, - y = shape.yPos, - fill = shape.fillColor, - stroke = shape.strokeColor, - width = shape.strokeWidth; - switch (name) { - case 'circle': - html = ''; - break; - case 'diamond': - html = ''; - break; - case 'cross': - html = ''; - break; - case 'rectangle': - html = ''; - break; - case 'plus': - html = ''; - break; - case 'bar': - html = ''; - break; - case 'area': - html = ''; - break; - case 'line': - html = ''; - break; - default: - // default is circle - html = ''; - } - - return html; - } - - // Define svg symbols for shapes - var svgShapeDefs = '' + - '' + - '' + - '' + - '' + - - '' + - '' + - '' + - - '' + - '' + - '' + - - '' + - '' + - '' + - '' + - '' + - '' + - - '' + - '' + - '' + - '' + - '' + - '' + - - '' + - '' + - '' + - '' + - '' + - '' + - - '' + - '' + - '' + - '' + - '' + - '' + - - '' + - '' + - '' + - '' + - '' + - '' + - ''; - - // Generate a list of legend entries in their final order - function getLegendEntries(series, labelFormatter, sorted) { - var lf = labelFormatter, - legendEntries = series.map(function(s, i) { - return { - label: (lf ? lf(s.label, s) : s.label) || 'Plot ' + (i + 1), - color: s.color, - options: { - lines: s.lines, - points: s.points, - bars: s.bars - } - }; - }); - - // Sort the legend using either the default or a custom comparator - if (sorted) { - if ($.isFunction(sorted)) { - legendEntries.sort(sorted); - } else if (sorted === 'reverse') { - legendEntries.reverse(); - } else { - var ascending = (sorted !== 'descending'); - legendEntries.sort(function(a, b) { - return a.label === b.label - ? 0 - : ((a.label < b.label) !== ascending ? 1 : -1 // Logical XOR - ); - }); - } - } - - return legendEntries; - } - - // return false if opts1 same as opts2 - function checkOptions(opts1, opts2) { - for (var prop in opts1) { - if (opts1.hasOwnProperty(prop)) { - if (opts1[prop] !== opts2[prop]) { - return true; - } - } - } - return false; - } - - // Compare two lists of legend entries - function shouldRedraw(oldEntries, newEntries) { - if (!oldEntries || !newEntries) { - return true; - } - - if (oldEntries.length !== newEntries.length) { - return true; - } - var i, newEntry, oldEntry, newOpts, oldOpts; - for (i = 0; i < newEntries.length; i++) { - newEntry = newEntries[i]; - oldEntry = oldEntries[i]; - - if (newEntry.label !== oldEntry.label) { - return true; - } - - if (newEntry.color !== oldEntry.color) { - return true; - } - - // check for changes in lines options - newOpts = newEntry.options.lines; - oldOpts = oldEntry.options.lines; - if (checkOptions(newOpts, oldOpts)) { - return true; - } - - // check for changes in points options - newOpts = newEntry.options.points; - oldOpts = oldEntry.options.points; - if (checkOptions(newOpts, oldOpts)) { - return true; - } - - // check for changes in bars options - newOpts = newEntry.options.bars; - oldOpts = oldEntry.options.bars; - if (checkOptions(newOpts, oldOpts)) { - return true; - } - } - - return false; - } - - function init(plot) { - plot.hooks.setupGrid.push(function (plot) { - var options = plot.getOptions(); - var series = plot.getData(), - labelFormatter = options.legend.labelFormatter, - oldEntries = options.legend.legendEntries, - oldPlotOffset = options.legend.plotOffset, - newEntries = getLegendEntries(series, labelFormatter, options.legend.sorted), - newPlotOffset = plot.getPlotOffset(); - - if (shouldRedraw(oldEntries, newEntries) || - checkOptions(oldPlotOffset, newPlotOffset)) { - insertLegend(plot, options, plot.getPlaceholder(), newEntries); - } - }); - } - - $.plot.plugins.push({ - init: init, - options: defaultOptions, - name: 'legend', - version: '1.0' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.logaxis.js b/extern/phmap/benchmark/js/jquery.flot.logaxis.js deleted file mode 100644 index 8622f73..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.logaxis.js +++ /dev/null @@ -1,296 +0,0 @@ -/* Pretty handling of log axes. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Copyright (c) 2015 Ciprian Ceteras cipix2000@gmail.com. -Copyright (c) 2017 Raluca Portase -Licensed under the MIT license. - -Set axis.mode to "log" to enable. -*/ - -/* global jQuery*/ - -/** -## jquery.flot.logaxis -This plugin is used to create logarithmic axis. This includes tick generation, -formatters and transformers to and from logarithmic representation. - -### Methods and hooks -*/ - -(function ($) { - 'use strict'; - - var options = { - xaxis: {} - }; - - /*tick generators and formatters*/ - var PREFERRED_LOG_TICK_VALUES = computePreferedLogTickValues(Number.MAX_VALUE, 10), - EXTENDED_LOG_TICK_VALUES = computePreferedLogTickValues(Number.MAX_VALUE, 4); - - function computePreferedLogTickValues(endLimit, rangeStep) { - var log10End = Math.floor(Math.log(endLimit) * Math.LOG10E) - 1, - log10Start = -log10End, - val, range, vals = []; - - for (var power = log10Start; power <= log10End; power++) { - range = Math.pow(10, power); - for (var mult = 1; mult < 9; mult += rangeStep) { - val = range * mult; - vals.push(val); - } - } - return vals; - } - - /** - - logTickGenerator(plot, axis, noTicks) - - Generates logarithmic ticks, depending on axis range. - In case the number of ticks that can be generated is less than the expected noTicks/4, - a linear tick generation is used. - */ - var logTickGenerator = function (plot, axis, noTicks) { - var ticks = [], - minIdx = -1, - maxIdx = -1, - surface = plot.getCanvas(), - logTickValues = PREFERRED_LOG_TICK_VALUES, - min = clampAxis(axis, plot), - max = axis.max; - - if (!noTicks) { - noTicks = 0.3 * Math.sqrt(axis.direction === "x" ? surface.width : surface.height); - } - - PREFERRED_LOG_TICK_VALUES.some(function (val, i) { - if (val >= min) { - minIdx = i; - return true; - } else { - return false; - } - }); - - PREFERRED_LOG_TICK_VALUES.some(function (val, i) { - if (val >= max) { - maxIdx = i; - return true; - } else { - return false; - } - }); - - if (maxIdx === -1) { - maxIdx = PREFERRED_LOG_TICK_VALUES.length - 1; - } - - if (maxIdx - minIdx <= noTicks / 4 && logTickValues.length !== EXTENDED_LOG_TICK_VALUES.length) { - //try with multiple of 5 for tick values - logTickValues = EXTENDED_LOG_TICK_VALUES; - minIdx *= 2; - maxIdx *= 2; - } - - var lastDisplayed = null, - inverseNoTicks = 1 / noTicks, - tickValue, pixelCoord, tick; - - // Count the number of tick values would appear, if we can get at least - // nTicks / 4 accept them. - if (maxIdx - minIdx >= noTicks / 4) { - for (var idx = maxIdx; idx >= minIdx; idx--) { - tickValue = logTickValues[idx]; - pixelCoord = (Math.log(tickValue) - Math.log(min)) / (Math.log(max) - Math.log(min)); - tick = tickValue; - - if (lastDisplayed === null) { - lastDisplayed = { - pixelCoord: pixelCoord, - idealPixelCoord: pixelCoord - }; - } else { - if (Math.abs(pixelCoord - lastDisplayed.pixelCoord) >= inverseNoTicks) { - lastDisplayed = { - pixelCoord: pixelCoord, - idealPixelCoord: lastDisplayed.idealPixelCoord - inverseNoTicks - }; - } else { - tick = null; - } - } - - if (tick) { - ticks.push(tick); - } - } - // Since we went in backwards order. - ticks.reverse(); - } else { - var tickSize = plot.computeTickSize(min, max, noTicks), - customAxis = {min: min, max: max, tickSize: tickSize}; - ticks = $.plot.linearTickGenerator(customAxis); - } - - return ticks; - }; - - var clampAxis = function (axis, plot) { - var min = axis.min, - max = axis.max; - - if (min <= 0) { - //for empty graph if axis.min is not strictly positive make it 0.1 - if (axis.datamin === null) { - min = axis.min = 0.1; - } else { - min = processAxisOffset(plot, axis); - } - - if (max < min) { - axis.max = axis.datamax !== null ? axis.datamax : axis.options.max; - axis.options.offset.below = 0; - axis.options.offset.above = 0; - } - } - - return min; - } - - /** - - logTickFormatter(value, axis, precision) - - This is the corresponding tickFormatter of the logaxis. - For a number greater that 10^6 or smaller than 10^(-3), this will be drawn - with e representation - */ - var logTickFormatter = function (value, axis, precision) { - var tenExponent = value > 0 ? Math.floor(Math.log(value) / Math.LN10) : 0; - - if (precision) { - if ((tenExponent >= -4) && (tenExponent <= 7)) { - return $.plot.defaultTickFormatter(value, axis, precision); - } else { - return $.plot.expRepTickFormatter(value, axis, precision); - } - } - if ((tenExponent >= -4) && (tenExponent <= 7)) { - //if we have float numbers, return a limited length string(ex: 0.0009 is represented as 0.000900001) - var formattedValue = tenExponent < 0 ? value.toFixed(-tenExponent) : value.toFixed(tenExponent + 2); - if (formattedValue.indexOf('.') !== -1) { - var lastZero = formattedValue.lastIndexOf('0'); - - while (lastZero === formattedValue.length - 1) { - formattedValue = formattedValue.slice(0, -1); - lastZero = formattedValue.lastIndexOf('0'); - } - - //delete the dot if is last - if (formattedValue.indexOf('.') === formattedValue.length - 1) { - formattedValue = formattedValue.slice(0, -1); - } - } - return formattedValue; - } else { - return $.plot.expRepTickFormatter(value, axis); - } - }; - - /*logaxis caracteristic functions*/ - var logTransform = function (v) { - if (v < PREFERRED_LOG_TICK_VALUES[0]) { - v = PREFERRED_LOG_TICK_VALUES[0]; - } - - return Math.log(v); - }; - - var logInverseTransform = function (v) { - return Math.exp(v); - }; - - var invertedTransform = function (v) { - return -v; - } - - var invertedLogTransform = function (v) { - return -logTransform(v); - } - - var invertedLogInverseTransform = function (v) { - return logInverseTransform(-v); - } - - /** - - setDataminRange(plot, axis) - - It is used for clamping the starting point of a logarithmic axis. - This will set the axis datamin range to 0.1 or to the first datapoint greater then 0. - The function is usefull since the logarithmic representation can not show - values less than or equal to 0. - */ - function setDataminRange(plot, axis) { - if (axis.options.mode === 'log' && axis.datamin <= 0) { - if (axis.datamin === null) { - axis.datamin = 0.1; - } else { - axis.datamin = processAxisOffset(plot, axis); - } - } - } - - function processAxisOffset(plot, axis) { - var series = plot.getData(), - range = series - .filter(function(series) { - return series.xaxis === axis || series.yaxis === axis; - }) - .map(function(series) { - return plot.computeRangeForDataSeries(series, null, isValid); - }), - min = axis.direction === 'x' ? Math.min(0.1, range[0].xmin) : Math.min(0.1, range[0].ymin); - - axis.min = min; - - return min; - } - - function isValid(a) { - return a > 0; - } - - function init(plot) { - plot.hooks.processOptions.push(function (plot) { - $.each(plot.getAxes(), function (axisName, axis) { - var opts = axis.options; - if (opts.mode === 'log') { - axis.tickGenerator = function (axis) { - var noTicks = 11; - return logTickGenerator(plot, axis, noTicks); - }; - if (typeof axis.options.tickFormatter !== 'function') { - axis.options.tickFormatter = logTickFormatter; - } - axis.options.transform = opts.inverted ? invertedLogTransform : logTransform; - axis.options.inverseTransform = opts.inverted ? invertedLogInverseTransform : logInverseTransform; - axis.options.autoScaleMargin = 0; - plot.hooks.setRange.push(setDataminRange); - } else if (opts.inverted) { - axis.options.transform = invertedTransform; - axis.options.inverseTransform = invertedTransform; - } - }); - }); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'log', - version: '0.1' - }); - - $.plot.logTicksGenerator = logTickGenerator; - $.plot.logTickFormatter = logTickFormatter; -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.navigate.js b/extern/phmap/benchmark/js/jquery.flot.navigate.js deleted file mode 100644 index 1c3ce37..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.navigate.js +++ /dev/null @@ -1,781 +0,0 @@ -/* Flot plugin for adding the ability to pan and zoom the plot. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Copyright (c) 2016 Ciprian Ceteras. -Copyright (c) 2017 Raluca Portase. -Licensed under the MIT license. - -*/ - -/** -## jquery.flot.navigate.js - -This flot plugin is used for adding the ability to pan and zoom the plot. -A higher level overview is available at [interactions](interactions.md) documentation. - -The default behaviour is scrollwheel up/down to zoom in, drag -to pan. The plugin defines plot.zoom({ center }), plot.zoomOut() and -plot.pan( offset ) so you easily can add custom controls. It also fires -"plotpan" and "plotzoom" events, useful for synchronizing plots. - -The plugin supports these options: -```js - zoom: { - interactive: false, - active: false, - amount: 1.5 // 2 = 200% (zoom in), 0.5 = 50% (zoom out) - } - - pan: { - interactive: false, - active: false, - cursor: "move", // CSS mouse cursor value used when dragging, e.g. "pointer" - frameRate: 60, - mode: "smart" // enable smart pan mode - } - - xaxis: { - axisZoom: true, //zoom axis when mouse over it is allowed - plotZoom: true, //zoom axis is allowed for plot zoom - axisPan: true, //pan axis when mouse over it is allowed - plotPan: true //pan axis is allowed for plot pan - } - - yaxis: { - axisZoom: true, //zoom axis when mouse over it is allowed - plotZoom: true, //zoom axis is allowed for plot zoom - axisPan: true, //pan axis when mouse over it is allowed - plotPan: true //pan axis is allowed for plot pan - } -``` -**interactive** enables the built-in drag/click behaviour. If you enable -interactive for pan, then you'll have a basic plot that supports moving -around; the same for zoom. - -**active** is true after a touch tap on plot. This enables plot navigation. -Once activated, zoom and pan cannot be deactivated. When the plot becomes active, -"plotactivated" event is triggered. - -**amount** specifies the default amount to zoom in (so 1.5 = 150%) relative to -the current viewport. - -**cursor** is a standard CSS mouse cursor string used for visual feedback to the -user when dragging. - -**frameRate** specifies the maximum number of times per second the plot will -update itself while the user is panning around on it (set to null to disable -intermediate pans, the plot will then not update until the mouse button is -released). - -**mode** a string specifies the pan mode for mouse interaction. Accepted values: -'manual': no pan hint or direction snapping; -'smart': The graph shows pan hint bar and the pan movement will snap -to one direction when the drag direction is close to it; -'smartLock'. The graph shows pan hint bar and the pan movement will always -snap to a direction that the drag diorection started with. - -Example API usage: -```js - plot = $.plot(...); - - // zoom default amount in on the pixel ( 10, 20 ) - plot.zoom({ center: { left: 10, top: 20 } }); - - // zoom out again - plot.zoomOut({ center: { left: 10, top: 20 } }); - - // zoom 200% in on the pixel (10, 20) - plot.zoom({ amount: 2, center: { left: 10, top: 20 } }); - - // pan 100 pixels to the left (changing x-range in a positive way) and 20 down - plot.pan({ left: -100, top: 20 }) -``` - -Here, "center" specifies where the center of the zooming should happen. Note -that this is defined in pixel space, not the space of the data points (you can -use the p2c helpers on the axes in Flot to help you convert between these). - -**amount** is the amount to zoom the viewport relative to the current range, so -1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is 70% (zoom out). You -can set the default in the options. -*/ - -/* eslint-enable */ -(function($) { - 'use strict'; - - var options = { - zoom: { - interactive: false, - active: false, - amount: 1.5 // how much to zoom relative to current position, 2 = 200% (zoom in), 0.5 = 50% (zoom out) - }, - pan: { - interactive: false, - active: false, - cursor: "move", - frameRate: 60, - mode: 'smart' - }, - xaxis: { - axisZoom: true, //zoom axis when mouse over it is allowed - plotZoom: true, //zoom axis is allowed for plot zoom - axisPan: true, //pan axis when mouse over it is allowed - plotPan: true //pan axis is allowed for plot pan - }, - yaxis: { - axisZoom: true, - plotZoom: true, - axisPan: true, - plotPan: true - } - }; - - var saturated = $.plot.saturated; - var browser = $.plot.browser; - var SNAPPING_CONSTANT = $.plot.uiConstants.SNAPPING_CONSTANT; - var PANHINT_LENGTH_CONSTANT = $.plot.uiConstants.PANHINT_LENGTH_CONSTANT; - - function init(plot) { - plot.hooks.processOptions.push(initNevigation); - } - - function initNevigation(plot, options) { - var panAxes = null; - var canDrag = false; - var useManualPan = options.pan.mode === 'manual', - smartPanLock = options.pan.mode === 'smartLock', - useSmartPan = smartPanLock || options.pan.mode === 'smart'; - - function onZoomClick(e, zoomOut, amount) { - var page = browser.getPageXY(e); - - var c = plot.offset(); - c.left = page.X - c.left; - c.top = page.Y - c.top; - - var ec = plot.getPlaceholder().offset(); - ec.left = page.X - ec.left; - ec.top = page.Y - ec.top; - - var axes = plot.getXAxes().concat(plot.getYAxes()).filter(function (axis) { - var box = axis.box; - if (box !== undefined) { - return (ec.left > box.left) && (ec.left < box.left + box.width) && - (ec.top > box.top) && (ec.top < box.top + box.height); - } - }); - - if (axes.length === 0) { - axes = undefined; - } - - if (zoomOut) { - plot.zoomOut({ - center: c, - axes: axes, - amount: amount - }); - } else { - plot.zoom({ - center: c, - axes: axes, - amount: amount - }); - } - } - - var prevCursor = 'default', - panHint = null, - panTimeout = null, - plotState, - prevDragPosition = { x: 0, y: 0 }, - isPanAction = false; - - function onMouseWheel(e, delta) { - var maxAbsoluteDeltaOnMac = 1, - isMacScroll = Math.abs(e.originalEvent.deltaY) <= maxAbsoluteDeltaOnMac, - defaultNonMacScrollAmount = null, - macMagicRatio = 50, - amount = isMacScroll ? 1 + Math.abs(e.originalEvent.deltaY) / macMagicRatio : defaultNonMacScrollAmount; - - if (isPanAction) { - onDragEnd(e); - } - - if (plot.getOptions().zoom.active) { - e.preventDefault(); - onZoomClick(e, delta < 0, amount); - return false; - } - } - - plot.navigationState = function(startPageX, startPageY) { - var axes = this.getAxes(); - var result = {}; - Object.keys(axes).forEach(function(axisName) { - var axis = axes[axisName]; - result[axisName] = { - navigationOffset: { below: axis.options.offset.below || 0, - above: axis.options.offset.above || 0}, - axisMin: axis.min, - axisMax: axis.max, - diagMode: false - } - }); - - result.startPageX = startPageX || 0; - result.startPageY = startPageY || 0; - return result; - } - - function onMouseDown(e) { - canDrag = true; - } - - function onMouseUp(e) { - canDrag = false; - } - - function isLeftMouseButtonPressed(e) { - return e.button === 0; - } - - function onDragStart(e) { - if (!canDrag || !isLeftMouseButtonPressed(e)) { - return false; - } - - isPanAction = true; - var page = browser.getPageXY(e); - - var ec = plot.getPlaceholder().offset(); - ec.left = page.X - ec.left; - ec.top = page.Y - ec.top; - - panAxes = plot.getXAxes().concat(plot.getYAxes()).filter(function (axis) { - var box = axis.box; - if (box !== undefined) { - return (ec.left > box.left) && (ec.left < box.left + box.width) && - (ec.top > box.top) && (ec.top < box.top + box.height); - } - }); - - if (panAxes.length === 0) { - panAxes = undefined; - } - - var c = plot.getPlaceholder().css('cursor'); - if (c) { - prevCursor = c; - } - - plot.getPlaceholder().css('cursor', plot.getOptions().pan.cursor); - - if (useSmartPan) { - plotState = plot.navigationState(page.X, page.Y); - } else if (useManualPan) { - prevDragPosition.x = page.X; - prevDragPosition.y = page.Y; - } - } - - function onDrag(e) { - var page = browser.getPageXY(e); - var frameRate = plot.getOptions().pan.frameRate; - - if (frameRate === -1) { - if (useSmartPan) { - plot.smartPan({ - x: plotState.startPageX - page.X, - y: plotState.startPageY - page.Y - }, plotState, panAxes, false, smartPanLock); - } else if (useManualPan) { - plot.pan({ - left: prevDragPosition.x - page.X, - top: prevDragPosition.y - page.Y, - axes: panAxes - }); - prevDragPosition.x = page.X; - prevDragPosition.y = page.Y; - } - return; - } - - if (panTimeout || !frameRate) return; - - panTimeout = setTimeout(function() { - if (useSmartPan) { - plot.smartPan({ - x: plotState.startPageX - page.X, - y: plotState.startPageY - page.Y - }, plotState, panAxes, false, smartPanLock); - } else if (useManualPan) { - plot.pan({ - left: prevDragPosition.x - page.X, - top: prevDragPosition.y - page.Y, - axes: panAxes - }); - prevDragPosition.x = page.X; - prevDragPosition.y = page.Y; - } - - panTimeout = null; - }, 1 / frameRate * 1000); - } - - function onDragEnd(e) { - if (panTimeout) { - clearTimeout(panTimeout); - panTimeout = null; - } - - isPanAction = false; - var page = browser.getPageXY(e); - - plot.getPlaceholder().css('cursor', prevCursor); - - if (useSmartPan) { - plot.smartPan({ - x: plotState.startPageX - page.X, - y: plotState.startPageY - page.Y - }, plotState, panAxes, false, smartPanLock); - plot.smartPan.end(); - } else if (useManualPan) { - plot.pan({ - left: prevDragPosition.x - page.X, - top: prevDragPosition.y - page.Y, - axes: panAxes - }); - prevDragPosition.x = 0; - prevDragPosition.y = 0; - } - } - - function onDblClick(e) { - plot.activate(); - - var axes = plot.getTouchedAxis(e.clientX, e.clientY), - event; - if (axes[0]) { - event = new $.Event('re-center', { detail: { - axisTouched: axes[0] - }}); - } else { - event = new $.Event('re-center', {detail: e}); - } - plot.getPlaceholder().trigger(event); - } - - function onClick(e) { - plot.activate(); - - if (isPanAction) { - onDragEnd(e); - } - - return false; - } - - plot.activate = function() { - var o = plot.getOptions(); - if (!o.pan.active || !o.zoom.active) { - o.pan.active = true; - o.zoom.active = true; - plot.getPlaceholder().trigger("plotactivated", [plot]); - } - } - - function bindEvents(plot, eventHolder) { - var o = plot.getOptions(); - if (o.zoom.interactive) { - eventHolder.mousewheel(onMouseWheel); - } - - if (o.pan.interactive) { - plot.addEventHandler("dragstart", onDragStart, eventHolder, 0); - plot.addEventHandler("drag", onDrag, eventHolder, 0); - plot.addEventHandler("dragend", onDragEnd, eventHolder, 0); - eventHolder.bind("mousedown", onMouseDown); - eventHolder.bind("mouseup", onMouseUp); - } - - eventHolder.dblclick(onDblClick); - eventHolder.click(onClick); - } - - plot.zoomOut = function(args) { - if (!args) { - args = {}; - } - - if (!args.amount) { - args.amount = plot.getOptions().zoom.amount; - } - - args.amount = 1 / args.amount; - plot.zoom(args); - }; - - plot.zoom = function(args) { - if (!args) { - args = {}; - } - - var c = args.center, - amount = args.amount || plot.getOptions().zoom.amount, - w = plot.width(), - h = plot.height(), - axes = args.axes || plot.getAxes(); - - if (!c) { - c = { - left: w / 2, - top: h / 2 - }; - } - - var xf = c.left / w, - yf = c.top / h, - minmax = { - x: { - min: c.left - xf * w / amount, - max: c.left + (1 - xf) * w / amount - }, - y: { - min: c.top - yf * h / amount, - max: c.top + (1 - yf) * h / amount - } - }; - - for (var key in axes) { - if (!axes.hasOwnProperty(key)) { - continue; - } - - var axis = axes[key], - opts = axis.options, - min = minmax[axis.direction].min, - max = minmax[axis.direction].max, - navigationOffset = axis.options.offset; - - //skip axis without axisZoom when zooming only on certain axis or axis without plotZoom for zoom on entire plot - if ((!opts.axisZoom && args.axes) || (!args.axes && !opts.plotZoom)) { - continue; - } - - min = $.plot.saturated.saturate(axis.c2p(min)); - max = $.plot.saturated.saturate(axis.c2p(max)); - if (min > max) { - // make sure min < max - var tmp = min; - min = max; - max = tmp; - } - - var offsetBelow = $.plot.saturated.saturate(navigationOffset.below - (axis.min - min)); - var offsetAbove = $.plot.saturated.saturate(navigationOffset.above - (axis.max - max)); - opts.offset = { below: offsetBelow, above: offsetAbove }; - }; - - plot.setupGrid(true); - plot.draw(); - - if (!args.preventEvent) { - plot.getPlaceholder().trigger("plotzoom", [plot, args]); - } - }; - - plot.pan = function(args) { - var delta = { - x: +args.left, - y: +args.top - }; - - if (isNaN(delta.x)) delta.x = 0; - if (isNaN(delta.y)) delta.y = 0; - - $.each(args.axes || plot.getAxes(), function(_, axis) { - var opts = axis.options, - d = delta[axis.direction]; - - //skip axis without axisPan when panning only on certain axis or axis without plotPan for pan the entire plot - if ((!opts.axisPan && args.axes) || (!opts.plotPan && !args.axes)) { - return; - } - - if (d !== 0) { - var navigationOffsetBelow = saturated.saturate(axis.c2p(axis.p2c(axis.min) + d) - axis.c2p(axis.p2c(axis.min))), - navigationOffsetAbove = saturated.saturate(axis.c2p(axis.p2c(axis.max) + d) - axis.c2p(axis.p2c(axis.max))); - - if (!isFinite(navigationOffsetBelow)) { - navigationOffsetBelow = 0; - } - - if (!isFinite(navigationOffsetAbove)) { - navigationOffsetAbove = 0; - } - - opts.offset = { - below: saturated.saturate(navigationOffsetBelow + (opts.offset.below || 0)), - above: saturated.saturate(navigationOffsetAbove + (opts.offset.above || 0)) - }; - } - }); - - plot.setupGrid(true); - plot.draw(); - if (!args.preventEvent) { - plot.getPlaceholder().trigger("plotpan", [plot, args]); - } - }; - - plot.recenter = function(args) { - $.each(args.axes || plot.getAxes(), function(_, axis) { - if (args.axes) { - if (this.direction === 'x') { - axis.options.offset = { below: 0 }; - } else if (this.direction === 'y') { - axis.options.offset = { above: 0 }; - } - } else { - axis.options.offset = { below: 0, above: 0 }; - } - }); - plot.setupGrid(true); - plot.draw(); - }; - - var shouldSnap = function(delta) { - return (Math.abs(delta.y) < SNAPPING_CONSTANT && Math.abs(delta.x) >= SNAPPING_CONSTANT) || - (Math.abs(delta.x) < SNAPPING_CONSTANT && Math.abs(delta.y) >= SNAPPING_CONSTANT); - } - - // adjust delta so the pan action is constrained on the vertical or horizontal direction - // it the movements in the other direction are small - var adjustDeltaToSnap = function(delta) { - if (Math.abs(delta.x) < SNAPPING_CONSTANT && Math.abs(delta.y) >= SNAPPING_CONSTANT) { - return {x: 0, y: delta.y}; - } - - if (Math.abs(delta.y) < SNAPPING_CONSTANT && Math.abs(delta.x) >= SNAPPING_CONSTANT) { - return {x: delta.x, y: 0}; - } - - return delta; - } - - var lockedDirection = null; - var lockDeltaDirection = function(delta) { - if (!lockedDirection && Math.max(Math.abs(delta.x), Math.abs(delta.y)) >= SNAPPING_CONSTANT) { - lockedDirection = Math.abs(delta.x) < Math.abs(delta.y) ? 'y' : 'x'; - } - - switch (lockedDirection) { - case 'x': - return { x: delta.x, y: 0 }; - case 'y': - return { x: 0, y: delta.y }; - default: - return { x: 0, y: 0 }; - } - } - - var isDiagonalMode = function(delta) { - if (Math.abs(delta.x) > 0 && Math.abs(delta.y) > 0) { - return true; - } - return false; - } - - var restoreAxisOffset = function(axes, initialState, delta) { - var axis; - Object.keys(axes).forEach(function(axisName) { - axis = axes[axisName]; - if (delta[axis.direction] === 0) { - axis.options.offset.below = initialState[axisName].navigationOffset.below; - axis.options.offset.above = initialState[axisName].navigationOffset.above; - } - }); - } - - var prevDelta = { x: 0, y: 0 }; - plot.smartPan = function(delta, initialState, panAxes, preventEvent, smartLock) { - var snap = smartLock ? true : shouldSnap(delta), - axes = plot.getAxes(), - opts; - delta = smartLock ? lockDeltaDirection(delta) : adjustDeltaToSnap(delta); - - if (isDiagonalMode(delta)) { - initialState.diagMode = true; - } - - if (snap && initialState.diagMode === true) { - initialState.diagMode = false; - restoreAxisOffset(axes, initialState, delta); - } - - if (snap) { - panHint = { - start: { - x: initialState.startPageX - plot.offset().left + plot.getPlotOffset().left, - y: initialState.startPageY - plot.offset().top + plot.getPlotOffset().top - }, - end: { - x: initialState.startPageX - delta.x - plot.offset().left + plot.getPlotOffset().left, - y: initialState.startPageY - delta.y - plot.offset().top + plot.getPlotOffset().top - } - } - } else { - panHint = { - start: { - x: initialState.startPageX - plot.offset().left + plot.getPlotOffset().left, - y: initialState.startPageY - plot.offset().top + plot.getPlotOffset().top - }, - end: false - } - } - - if (isNaN(delta.x)) delta.x = 0; - if (isNaN(delta.y)) delta.y = 0; - - if (panAxes) { - axes = panAxes; - } - - var axis, axisMin, axisMax, p, d; - Object.keys(axes).forEach(function(axisName) { - axis = axes[axisName]; - axisMin = axis.min; - axisMax = axis.max; - opts = axis.options; - - d = delta[axis.direction]; - p = prevDelta[axis.direction]; - - //skip axis without axisPan when panning only on certain axis or axis without plotPan for pan the entire plot - if ((!opts.axisPan && panAxes) || (!panAxes && !opts.plotPan)) { - return; - } - - if (d !== 0) { - var navigationOffsetBelow = saturated.saturate(axis.c2p(axis.p2c(axisMin) - (p - d)) - axis.c2p(axis.p2c(axisMin))), - navigationOffsetAbove = saturated.saturate(axis.c2p(axis.p2c(axisMax) - (p - d)) - axis.c2p(axis.p2c(axisMax))); - - if (!isFinite(navigationOffsetBelow)) { - navigationOffsetBelow = 0; - } - - if (!isFinite(navigationOffsetAbove)) { - navigationOffsetAbove = 0; - } - - axis.options.offset.below = saturated.saturate(navigationOffsetBelow + (axis.options.offset.below || 0)); - axis.options.offset.above = saturated.saturate(navigationOffsetAbove + (axis.options.offset.above || 0)); - } - }); - - prevDelta = delta; - plot.setupGrid(true); - plot.draw(); - - if (!preventEvent) { - plot.getPlaceholder().trigger("plotpan", [plot, delta, panAxes, initialState]); - } - }; - - plot.smartPan.end = function() { - panHint = null; - lockedDirection = null; - prevDelta = { x: 0, y: 0 }; - plot.triggerRedrawOverlay(); - } - - function shutdown(plot, eventHolder) { - eventHolder.unbind("mousewheel", onMouseWheel); - eventHolder.unbind("mousedown", onMouseDown); - eventHolder.unbind("mouseup", onMouseUp); - eventHolder.unbind("dragstart", onDragStart); - eventHolder.unbind("drag", onDrag); - eventHolder.unbind("dragend", onDragEnd); - eventHolder.unbind("dblclick", onDblClick); - eventHolder.unbind("click", onClick); - - if (panTimeout) clearTimeout(panTimeout); - } - - function drawOverlay(plot, ctx) { - if (panHint) { - ctx.strokeStyle = 'rgba(96, 160, 208, 0.7)'; - ctx.lineWidth = 2; - ctx.lineJoin = "round"; - var startx = Math.round(panHint.start.x), - starty = Math.round(panHint.start.y), - endx, endy; - - if (panAxes) { - if (panAxes[0].direction === 'x') { - endy = Math.round(panHint.start.y); - endx = Math.round(panHint.end.x); - } else if (panAxes[0].direction === 'y') { - endx = Math.round(panHint.start.x); - endy = Math.round(panHint.end.y); - } - } else { - endx = Math.round(panHint.end.x); - endy = Math.round(panHint.end.y); - } - - ctx.beginPath(); - - if (panHint.end === false) { - ctx.moveTo(startx, starty - PANHINT_LENGTH_CONSTANT); - ctx.lineTo(startx, starty + PANHINT_LENGTH_CONSTANT); - - ctx.moveTo(startx + PANHINT_LENGTH_CONSTANT, starty); - ctx.lineTo(startx - PANHINT_LENGTH_CONSTANT, starty); - } else { - var dirX = starty === endy; - - ctx.moveTo(startx - (dirX ? 0 : PANHINT_LENGTH_CONSTANT), starty - (dirX ? PANHINT_LENGTH_CONSTANT : 0)); - ctx.lineTo(startx + (dirX ? 0 : PANHINT_LENGTH_CONSTANT), starty + (dirX ? PANHINT_LENGTH_CONSTANT : 0)); - - ctx.moveTo(startx, starty); - ctx.lineTo(endx, endy); - - ctx.moveTo(endx - (dirX ? 0 : PANHINT_LENGTH_CONSTANT), endy - (dirX ? PANHINT_LENGTH_CONSTANT : 0)); - ctx.lineTo(endx + (dirX ? 0 : PANHINT_LENGTH_CONSTANT), endy + (dirX ? PANHINT_LENGTH_CONSTANT : 0)); - } - - ctx.stroke(); - } - } - - plot.getTouchedAxis = function(touchPointX, touchPointY) { - var ec = plot.getPlaceholder().offset(); - ec.left = touchPointX - ec.left; - ec.top = touchPointY - ec.top; - - var axis = plot.getXAxes().concat(plot.getYAxes()).filter(function (axis) { - var box = axis.box; - if (box !== undefined) { - return (ec.left > box.left) && (ec.left < box.left + box.width) && - (ec.top > box.top) && (ec.top < box.top + box.height); - } - }); - - return axis; - } - - plot.hooks.drawOverlay.push(drawOverlay); - plot.hooks.bindEvents.push(bindEvents); - plot.hooks.shutdown.push(shutdown); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'navigate', - version: '1.3' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.pie.js b/extern/phmap/benchmark/js/jquery.flot.pie.js deleted file mode 100644 index ec734a1..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.pie.js +++ /dev/null @@ -1,786 +0,0 @@ -/* Flot plugin for rendering pie charts. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -The plugin assumes that each series has a single data value, and that each -value is a positive integer or zero. Negative numbers don't make sense for a -pie chart, and have unpredictable results. The values do NOT need to be -passed in as percentages; the plugin will calculate the total and per-slice -percentages internally. - -* Created by Brian Medendorp - -* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars - -The plugin supports these options: - - series: { - pie: { - show: true/false - radius: 0-1 for percentage of fullsize, or a specified pixel length, or 'auto' - innerRadius: 0-1 for percentage of fullsize or a specified pixel length, for creating a donut effect - startAngle: 0-2 factor of PI used for starting angle (in radians) i.e 3/2 starts at the top, 0 and 2 have the same result - tilt: 0-1 for percentage to tilt the pie, where 1 is no tilt, and 0 is completely flat (nothing will show) - offset: { - top: integer value to move the pie up or down - left: integer value to move the pie left or right, or 'auto' - }, - stroke: { - color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#FFF') - width: integer pixel width of the stroke - }, - label: { - show: true/false, or 'auto' - formatter: a user-defined function that modifies the text/style of the label text - radius: 0-1 for percentage of fullsize, or a specified pixel length - background: { - color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#000') - opacity: 0-1 - }, - threshold: 0-1 for the percentage value at which to hide labels (if they're too small) - }, - combine: { - threshold: 0-1 for the percentage value at which to combine slices (if they're too small) - color: any hexidecimal color value (other formats may or may not work, so best to stick with something like '#CCC'), if null, the plugin will automatically use the color of the first slice to be combined - label: any text value of what the combined slice should be labeled - } - highlight: { - opacity: 0-1 - } - } - } - -More detail and specific examples can be found in the included HTML file. - -*/ - -(function($) { - // Maximum redraw attempts when fitting labels within the plot - - var REDRAW_ATTEMPTS = 10; - - // Factor by which to shrink the pie when fitting labels within the plot - - var REDRAW_SHRINK = 0.95; - - function init(plot) { - var canvas = null, - target = null, - options = null, - maxRadius = null, - centerLeft = null, - centerTop = null, - processed = false, - ctx = null; - - // interactive variables - - var highlights = []; - - // add hook to determine if pie plugin in enabled, and then perform necessary operations - - plot.hooks.processOptions.push(function(plot, options) { - if (options.series.pie.show) { - options.grid.show = false; - - // set labels.show - - if (options.series.pie.label.show === "auto") { - if (options.legend.show) { - options.series.pie.label.show = false; - } else { - options.series.pie.label.show = true; - } - } - - // set radius - - if (options.series.pie.radius === "auto") { - if (options.series.pie.label.show) { - options.series.pie.radius = 3 / 4; - } else { - options.series.pie.radius = 1; - } - } - - // ensure sane tilt - - if (options.series.pie.tilt > 1) { - options.series.pie.tilt = 1; - } else if (options.series.pie.tilt < 0) { - options.series.pie.tilt = 0; - } - } - }); - - plot.hooks.bindEvents.push(function(plot, eventHolder) { - var options = plot.getOptions(); - if (options.series.pie.show) { - if (options.grid.hoverable) { - eventHolder.unbind("mousemove").mousemove(onMouseMove); - } - if (options.grid.clickable) { - eventHolder.unbind("click").click(onClick); - } - } - }); - - plot.hooks.processDatapoints.push(function(plot, series, data, datapoints) { - var options = plot.getOptions(); - if (options.series.pie.show) { - processDatapoints(plot, series, data, datapoints); - } - }); - - plot.hooks.drawOverlay.push(function(plot, octx) { - var options = plot.getOptions(); - if (options.series.pie.show) { - drawOverlay(plot, octx); - } - }); - - plot.hooks.draw.push(function(plot, newCtx) { - var options = plot.getOptions(); - if (options.series.pie.show) { - draw(plot, newCtx); - } - }); - - function processDatapoints(plot, series, datapoints) { - if (!processed) { - processed = true; - canvas = plot.getCanvas(); - target = $(canvas).parent(); - options = plot.getOptions(); - plot.setData(combine(plot.getData())); - } - } - - function combine(data) { - var total = 0, - combined = 0, - numCombined = 0, - color = options.series.pie.combine.color, - newdata = [], - i, - value; - - // Fix up the raw data from Flot, ensuring the data is numeric - - for (i = 0; i < data.length; ++i) { - value = data[i].data; - - // If the data is an array, we'll assume that it's a standard - // Flot x-y pair, and are concerned only with the second value. - - // Note how we use the original array, rather than creating a - // new one; this is more efficient and preserves any extra data - // that the user may have stored in higher indexes. - - if ($.isArray(value) && value.length === 1) { - value = value[0]; - } - - if ($.isArray(value)) { - // Equivalent to $.isNumeric() but compatible with jQuery < 1.7 - if (!isNaN(parseFloat(value[1])) && isFinite(value[1])) { - value[1] = +value[1]; - } else { - value[1] = 0; - } - } else if (!isNaN(parseFloat(value)) && isFinite(value)) { - value = [1, +value]; - } else { - value = [1, 0]; - } - - data[i].data = [value]; - } - - // Sum up all the slices, so we can calculate percentages for each - - for (i = 0; i < data.length; ++i) { - total += data[i].data[0][1]; - } - - // Count the number of slices with percentages below the combine - // threshold; if it turns out to be just one, we won't combine. - - for (i = 0; i < data.length; ++i) { - value = data[i].data[0][1]; - if (value / total <= options.series.pie.combine.threshold) { - combined += value; - numCombined++; - if (!color) { - color = data[i].color; - } - } - } - - for (i = 0; i < data.length; ++i) { - value = data[i].data[0][1]; - if (numCombined < 2 || value / total > options.series.pie.combine.threshold) { - newdata.push( - $.extend(data[i], { /* extend to allow keeping all other original data values - and using them e.g. in labelFormatter. */ - data: [[1, value]], - color: data[i].color, - label: data[i].label, - angle: value * Math.PI * 2 / total, - percent: value / (total / 100) - }) - ); - } - } - - if (numCombined > 1) { - newdata.push({ - data: [[1, combined]], - color: color, - label: options.series.pie.combine.label, - angle: combined * Math.PI * 2 / total, - percent: combined / (total / 100) - }); - } - - return newdata; - } - - function draw(plot, newCtx) { - if (!target) { - return; // if no series were passed - } - - var canvasWidth = plot.getPlaceholder().width(), - canvasHeight = plot.getPlaceholder().height(), - legendWidth = target.children().filter(".legend").children().width() || 0; - - ctx = newCtx; - - // WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE! - - // When combining smaller slices into an 'other' slice, we need to - // add a new series. Since Flot gives plugins no way to modify the - // list of series, the pie plugin uses a hack where the first call - // to processDatapoints results in a call to setData with the new - // list of series, then subsequent processDatapoints do nothing. - - // The plugin-global 'processed' flag is used to control this hack; - // it starts out false, and is set to true after the first call to - // processDatapoints. - - // Unfortunately this turns future setData calls into no-ops; they - // call processDatapoints, the flag is true, and nothing happens. - - // To fix this we'll set the flag back to false here in draw, when - // all series have been processed, so the next sequence of calls to - // processDatapoints once again starts out with a slice-combine. - // This is really a hack; in 0.9 we need to give plugins a proper - // way to modify series before any processing begins. - - processed = false; - - // calculate maximum radius and center point - maxRadius = Math.min(canvasWidth, canvasHeight / options.series.pie.tilt) / 2; - centerTop = canvasHeight / 2 + options.series.pie.offset.top; - centerLeft = canvasWidth / 2; - - if (options.series.pie.offset.left === "auto") { - if (options.legend.position.match("w")) { - centerLeft += legendWidth / 2; - } else { - centerLeft -= legendWidth / 2; - } - if (centerLeft < maxRadius) { - centerLeft = maxRadius; - } else if (centerLeft > canvasWidth - maxRadius) { - centerLeft = canvasWidth - maxRadius; - } - } else { - centerLeft += options.series.pie.offset.left; - } - - var slices = plot.getData(), - attempts = 0; - - // Keep shrinking the pie's radius until drawPie returns true, - // indicating that all the labels fit, or we try too many times. - do { - if (attempts > 0) { - maxRadius *= REDRAW_SHRINK; - } - attempts += 1; - clear(); - if (options.series.pie.tilt <= 0.8) { - drawShadow(); - } - } while (!drawPie() && attempts < REDRAW_ATTEMPTS) - - if (attempts >= REDRAW_ATTEMPTS) { - clear(); - target.prepend("
Could not draw pie with labels contained inside canvas
"); - } - - if (plot.setSeries && plot.insertLegend) { - plot.setSeries(slices); - plot.insertLegend(); - } - - // we're actually done at this point, just defining internal functions at this point - function clear() { - ctx.clearRect(0, 0, canvasWidth, canvasHeight); - target.children().filter(".pieLabel, .pieLabelBackground").remove(); - } - - function drawShadow() { - var shadowLeft = options.series.pie.shadow.left; - var shadowTop = options.series.pie.shadow.top; - var edge = 10; - var alpha = options.series.pie.shadow.alpha; - var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - if (radius >= canvasWidth / 2 - shadowLeft || radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= edge) { - return; // shadow would be outside canvas, so don't draw it - } - - ctx.save(); - ctx.translate(shadowLeft, shadowTop); - ctx.globalAlpha = alpha; - ctx.fillStyle = "#000"; - - // center and rotate to starting position - ctx.translate(centerLeft, centerTop); - ctx.scale(1, options.series.pie.tilt); - - //radius -= edge; - for (var i = 1; i <= edge; i++) { - ctx.beginPath(); - ctx.arc(0, 0, radius, 0, Math.PI * 2, false); - ctx.fill(); - radius -= i; - } - - ctx.restore(); - } - - function drawPie() { - var startAngle = Math.PI * options.series.pie.startAngle; - var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - var i; - // center and rotate to starting position - - ctx.save(); - ctx.translate(centerLeft, centerTop); - ctx.scale(1, options.series.pie.tilt); - //ctx.rotate(startAngle); // start at top; -- This doesn't work properly in Opera - - // draw slices - ctx.save(); - - var currentAngle = startAngle; - for (i = 0; i < slices.length; ++i) { - slices[i].startAngle = currentAngle; - drawSlice(slices[i].angle, slices[i].color, true); - } - - ctx.restore(); - - // draw slice outlines - if (options.series.pie.stroke.width > 0) { - ctx.save(); - ctx.lineWidth = options.series.pie.stroke.width; - currentAngle = startAngle; - for (i = 0; i < slices.length; ++i) { - drawSlice(slices[i].angle, options.series.pie.stroke.color, false); - } - - ctx.restore(); - } - - // draw donut hole - drawDonutHole(ctx); - - ctx.restore(); - - // Draw the labels, returning true if they fit within the plot - if (options.series.pie.label.show) { - return drawLabels(); - } else return true; - - function drawSlice(angle, color, fill) { - if (angle <= 0 || isNaN(angle)) { - return; - } - - if (fill) { - ctx.fillStyle = color; - } else { - ctx.strokeStyle = color; - ctx.lineJoin = "round"; - } - - ctx.beginPath(); - if (Math.abs(angle - Math.PI * 2) > 0.000000001) { - ctx.moveTo(0, 0); // Center of the pie - } - - //ctx.arc(0, 0, radius, 0, angle, false); // This doesn't work properly in Opera - ctx.arc(0, 0, radius, currentAngle, currentAngle + angle / 2, false); - ctx.arc(0, 0, radius, currentAngle + angle / 2, currentAngle + angle, false); - ctx.closePath(); - //ctx.rotate(angle); // This doesn't work properly in Opera - currentAngle += angle; - - if (fill) { - ctx.fill(); - } else { - ctx.stroke(); - } - } - - function drawLabels() { - var currentAngle = startAngle; - var radius = options.series.pie.label.radius > 1 ? options.series.pie.label.radius : maxRadius * options.series.pie.label.radius; - - for (var i = 0; i < slices.length; ++i) { - if (slices[i].percent >= options.series.pie.label.threshold * 100) { - if (!drawLabel(slices[i], currentAngle, i)) { - return false; - } - } - currentAngle += slices[i].angle; - } - - return true; - - function drawLabel(slice, startAngle, index) { - if (slice.data[0][1] === 0) { - return true; - } - - // format label text - var lf = options.legend.labelFormatter, text, plf = options.series.pie.label.formatter; - - if (lf) { - text = lf(slice.label, slice); - } else { - text = slice.label; - } - - if (plf) { - text = plf(text, slice); - } - - var halfAngle = ((startAngle + slice.angle) + startAngle) / 2; - var x = centerLeft + Math.round(Math.cos(halfAngle) * radius); - var y = centerTop + Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt; - - var html = "" + text + ""; - target.append(html); - - var label = target.children("#pieLabel" + index); - var labelTop = (y - label.height() / 2); - var labelLeft = (x - label.width() / 2); - - label.css("top", labelTop); - label.css("left", labelLeft); - - // check to make sure that the label is not outside the canvas - if (0 - labelTop > 0 || 0 - labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth - (labelLeft + label.width()) < 0) { - return false; - } - - if (options.series.pie.label.background.opacity !== 0) { - // put in the transparent background separately to avoid blended labels and label boxes - var c = options.series.pie.label.background.color; - if (c == null) { - c = slice.color; - } - - var pos = "top:" + labelTop + "px;left:" + labelLeft + "px;"; - $("
") - .css("opacity", options.series.pie.label.background.opacity) - .insertBefore(label); - } - - return true; - } // end individual label function - } // end drawLabels function - } // end drawPie function - } // end draw function - - // Placed here because it needs to be accessed from multiple locations - - function drawDonutHole(layer) { - if (options.series.pie.innerRadius > 0) { - // subtract the center - layer.save(); - var innerRadius = options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius * options.series.pie.innerRadius; - layer.globalCompositeOperation = "destination-out"; // this does not work with excanvas, but it will fall back to using the stroke color - layer.beginPath(); - layer.fillStyle = options.series.pie.stroke.color; - layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false); - layer.fill(); - layer.closePath(); - layer.restore(); - - // add inner stroke - layer.save(); - layer.beginPath(); - layer.strokeStyle = options.series.pie.stroke.color; - layer.arc(0, 0, innerRadius, 0, Math.PI * 2, false); - layer.stroke(); - layer.closePath(); - layer.restore(); - - // TODO: add extra shadow inside hole (with a mask) if the pie is tilted. - } - } - - //-- Additional Interactive related functions -- - - function isPointInPoly(poly, pt) { - for (var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) { - ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || - (poly[j][1] <= pt[1] && pt[1] < poly[i][1])) && - (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] - poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0]) && - (c = !c); - } - return c; - } - - function findNearbySlice(mouseX, mouseY) { - var slices = plot.getData(), - options = plot.getOptions(), - radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius, - x, y; - - for (var i = 0; i < slices.length; ++i) { - var s = slices[i]; - if (s.pie.show) { - ctx.save(); - ctx.beginPath(); - ctx.moveTo(0, 0); // Center of the pie - //ctx.scale(1, options.series.pie.tilt); // this actually seems to break everything when here. - ctx.arc(0, 0, radius, s.startAngle, s.startAngle + s.angle / 2, false); - ctx.arc(0, 0, radius, s.startAngle + s.angle / 2, s.startAngle + s.angle, false); - ctx.closePath(); - x = mouseX - centerLeft; - y = mouseY - centerTop; - - if (ctx.isPointInPath) { - if (ctx.isPointInPath(mouseX - centerLeft, mouseY - centerTop)) { - ctx.restore(); - return { - datapoint: [s.percent, s.data], - dataIndex: 0, - series: s, - seriesIndex: i - }; - } - } else { - // excanvas for IE doesn;t support isPointInPath, this is a workaround. - var p1X = radius * Math.cos(s.startAngle), - p1Y = radius * Math.sin(s.startAngle), - p2X = radius * Math.cos(s.startAngle + s.angle / 4), - p2Y = radius * Math.sin(s.startAngle + s.angle / 4), - p3X = radius * Math.cos(s.startAngle + s.angle / 2), - p3Y = radius * Math.sin(s.startAngle + s.angle / 2), - p4X = radius * Math.cos(s.startAngle + s.angle / 1.5), - p4Y = radius * Math.sin(s.startAngle + s.angle / 1.5), - p5X = radius * Math.cos(s.startAngle + s.angle), - p5Y = radius * Math.sin(s.startAngle + s.angle), - arrPoly = [[0, 0], [p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]], - arrPoint = [x, y]; - - // TODO: perhaps do some mathmatical trickery here with the Y-coordinate to compensate for pie tilt? - - if (isPointInPoly(arrPoly, arrPoint)) { - ctx.restore(); - return { - datapoint: [s.percent, s.data], - dataIndex: 0, - series: s, - seriesIndex: i - }; - } - } - - ctx.restore(); - } - } - - return null; - } - - function onMouseMove(e) { - triggerClickHoverEvent("plothover", e); - } - - function onClick(e) { - triggerClickHoverEvent("plotclick", e); - } - - // trigger click or hover event (they send the same parameters so we share their code) - - function triggerClickHoverEvent(eventname, e) { - var offset = plot.offset(); - var canvasX = parseInt(e.pageX - offset.left); - var canvasY = parseInt(e.pageY - offset.top); - var item = findNearbySlice(canvasX, canvasY); - - if (options.grid.autoHighlight) { - // clear auto-highlights - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.auto === eventname && !(item && h.series === item.series)) { - unhighlight(h.series); - } - } - } - - // highlight the slice - - if (item) { - highlight(item.series, eventname); - } - - // trigger any hover bind events - - var pos = { pageX: e.pageX, pageY: e.pageY }; - target.trigger(eventname, [pos, item]); - } - - function highlight(s, auto) { - //if (typeof s == "number") { - // s = series[s]; - //} - - var i = indexOfHighlight(s); - - if (i === -1) { - highlights.push({ series: s, auto: auto }); - plot.triggerRedrawOverlay(); - } else if (!auto) { - highlights[i].auto = false; - } - } - - function unhighlight(s) { - if (s == null) { - highlights = []; - plot.triggerRedrawOverlay(); - } - - //if (typeof s == "number") { - // s = series[s]; - //} - - var i = indexOfHighlight(s); - - if (i !== -1) { - highlights.splice(i, 1); - plot.triggerRedrawOverlay(); - } - } - - function indexOfHighlight(s) { - for (var i = 0; i < highlights.length; ++i) { - var h = highlights[i]; - if (h.series === s) { - return i; - } - } - return -1; - } - - function drawOverlay(plot, octx) { - var options = plot.getOptions(); - var radius = options.series.pie.radius > 1 ? options.series.pie.radius : maxRadius * options.series.pie.radius; - - octx.save(); - octx.translate(centerLeft, centerTop); - octx.scale(1, options.series.pie.tilt); - - for (var i = 0; i < highlights.length; ++i) { - drawHighlight(highlights[i].series); - } - - drawDonutHole(octx); - - octx.restore(); - - function drawHighlight(series) { - if (series.angle <= 0 || isNaN(series.angle)) { - return; - } - - //octx.fillStyle = parseColor(options.series.pie.highlight.color).scale(null, null, null, options.series.pie.highlight.opacity).toString(); - octx.fillStyle = "rgba(255, 255, 255, " + options.series.pie.highlight.opacity + ")"; // this is temporary until we have access to parseColor - octx.beginPath(); - if (Math.abs(series.angle - Math.PI * 2) > 0.000000001) { - octx.moveTo(0, 0); // Center of the pie - } - octx.arc(0, 0, radius, series.startAngle, series.startAngle + series.angle / 2, false); - octx.arc(0, 0, radius, series.startAngle + series.angle / 2, series.startAngle + series.angle, false); - octx.closePath(); - octx.fill(); - } - } - } // end init (plugin body) - - // define pie specific options and their default values - var options = { - series: { - pie: { - show: false, - radius: "auto", // actual radius of the visible pie (based on full calculated radius if <=1, or hard pixel value) - innerRadius: 0, /* for donut */ - startAngle: 3 / 2, - tilt: 1, - shadow: { - left: 5, // shadow left offset - top: 15, // shadow top offset - alpha: 0.02 // shadow alpha - }, - offset: { - top: 0, - left: "auto" - }, - stroke: { - color: "#fff", - width: 1 - }, - label: { - show: "auto", - formatter: function(label, slice) { - return "
" + label + "
" + Math.round(slice.percent) + "%
"; - }, // formatter function - radius: 1, // radius at which to place the labels (based on full calculated radius if <=1, or hard pixel value) - background: { - color: null, - opacity: 0 - }, - threshold: 0 // percentage at which to hide the label (i.e. the slice is too narrow) - }, - combine: { - threshold: -1, // percentage at which to combine little slices into one larger slice - color: null, // color to give the new slice (auto-generated if null) - label: "Other" // label to give the new slice - }, - highlight: { - //color: "#fff", // will add this functionality once parseColor is available - opacity: 0.5 - } - } - } - }; - - $.plot.plugins.push({ - init: init, - options: options, - name: "pie", - version: "1.1" - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.resize.js b/extern/phmap/benchmark/js/jquery.flot.resize.js deleted file mode 100644 index 930c68e..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.resize.js +++ /dev/null @@ -1,60 +0,0 @@ -/* eslint-disable */ -/* Flot plugin for automatically redrawing plots as the placeholder resizes. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -It works by listening for changes on the placeholder div (through the jQuery -resize event plugin) - if the size changes, it will redraw the plot. - -There are no options. If you need to disable the plugin for some plots, you -can just fix the size of their placeholders. - -*/ - -/* Inline dependency: - * jQuery resize event - v1.1 - 3/14/2010 - * http://benalman.com/projects/jquery-resize-plugin/ - * - * Copyright (c) 2010 "Cowboy" Ben Alman - * Dual licensed under the MIT and GPL licenses. - * http://benalman.com/about/license/ - */ -(function($,e,t){"$:nomunge";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this); - -/* eslint-enable */ -(function ($) { - var options = { }; // no options - - function init(plot) { - function onResize() { - var placeholder = plot.getPlaceholder(); - - // somebody might have hidden us and we can't plot - // when we don't have the dimensions - if (placeholder.width() === 0 || placeholder.height() === 0) return; - - plot.resize(); - plot.setupGrid(); - plot.draw(); - } - - function bindEvents(plot, eventHolder) { - plot.getPlaceholder().resize(onResize); - } - - function shutdown(plot, eventHolder) { - plot.getPlaceholder().unbind("resize", onResize); - } - - plot.hooks.bindEvents.push(bindEvents); - plot.hooks.shutdown.push(shutdown); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'resize', - version: '1.0' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.saturated.js b/extern/phmap/benchmark/js/jquery.flot.saturated.js deleted file mode 100644 index 34b9c50..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.saturated.js +++ /dev/null @@ -1,43 +0,0 @@ -(function ($) { - 'use strict'; - var saturated = { - saturate: function (a) { - if (a === Infinity) { - return Number.MAX_VALUE; - } - - if (a === -Infinity) { - return -Number.MAX_VALUE; - } - - return a; - }, - delta: function(min, max, noTicks) { - return ((max - min) / noTicks) === Infinity ? (max / noTicks - min / noTicks) : (max - min) / noTicks - }, - multiply: function (a, b) { - return saturated.saturate(a * b); - }, - // returns c * bInt * a. Beahves properly in the case where c is negative - // and bInt * a is bigger that Number.MAX_VALUE (Infinity) - multiplyAdd: function (a, bInt, c) { - if (isFinite(a * bInt)) { - return saturated.saturate(a * bInt + c); - } else { - var result = c; - - for (var i = 0; i < bInt; i++) { - result += a; - } - - return saturated.saturate(result); - } - }, - // round to nearby lower multiple of base - floorInBase: function(n, base) { - return base * Math.floor(n / base); - } - }; - - $.plot.saturated = saturated; -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.selection.js b/extern/phmap/benchmark/js/jquery.flot.selection.js deleted file mode 100644 index c14625a..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.selection.js +++ /dev/null @@ -1,504 +0,0 @@ -/* Flot plugin for selecting regions of a plot. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -The plugin supports these options: - -selection: { - mode: null or "x" or "y" or "xy" or "smart", - color: color, - shape: "round" or "miter" or "bevel", - minSize: number of pixels -} - -Selection support is enabled by setting the mode to one of "x", "y" or "xy". -In "x" mode, the user will only be able to specify the x range, similarly for -"y" mode. For "xy", the selection becomes a rectangle where both ranges can be -specified. "color" is color of the selection (if you need to change the color -later on, you can get to it with plot.getOptions().selection.color). "shape" -is the shape of the corners of the selection. - -"minSize" is the minimum size a selection can be in pixels. This value can -be customized to determine the smallest size a selection can be and still -have the selection rectangle be displayed. When customizing this value, the -fact that it refers to pixels, not axis units must be taken into account. -Thus, for example, if there is a bar graph in time mode with BarWidth set to 1 -minute, setting "minSize" to 1 will not make the minimum selection size 1 -minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent -"plotunselected" events from being fired when the user clicks the mouse without -dragging. - -When selection support is enabled, a "plotselected" event will be emitted on -the DOM element you passed into the plot function. The event handler gets a -parameter with the ranges selected on the axes, like this: - - placeholder.bind( "plotselected", function( event, ranges ) { - alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to) - // similar for yaxis - with multiple axes, the extra ones are in - // x2axis, x3axis, ... - }); - -The "plotselected" event is only fired when the user has finished making the -selection. A "plotselecting" event is fired during the process with the same -parameters as the "plotselected" event, in case you want to know what's -happening while it's happening, - -A "plotunselected" event with no arguments is emitted when the user clicks the -mouse to remove the selection. As stated above, setting "minSize" to 0 will -destroy this behavior. - -The plugin allso adds the following methods to the plot object: - -- setSelection( ranges, preventEvent ) - - Set the selection rectangle. The passed in ranges is on the same form as - returned in the "plotselected" event. If the selection mode is "x", you - should put in either an xaxis range, if the mode is "y" you need to put in - an yaxis range and both xaxis and yaxis if the selection mode is "xy", like - this: - - setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } }); - - setSelection will trigger the "plotselected" event when called. If you don't - want that to happen, e.g. if you're inside a "plotselected" handler, pass - true as the second parameter. If you are using multiple axes, you can - specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of - xaxis, the plugin picks the first one it sees. - -- clearSelection( preventEvent ) - - Clear the selection rectangle. Pass in true to avoid getting a - "plotunselected" event. - -- getSelection() - - Returns the current selection in the same format as the "plotselected" - event. If there's currently no selection, the function returns null. - -*/ - -(function ($) { - function init(plot) { - var selection = { - first: {x: -1, y: -1}, - second: {x: -1, y: -1}, - show: false, - currentMode: 'xy', - active: false - }; - - var SNAPPING_CONSTANT = $.plot.uiConstants.SNAPPING_CONSTANT; - - // FIXME: The drag handling implemented here should be - // abstracted out, there's some similar code from a library in - // the navigation plugin, this should be massaged a bit to fit - // the Flot cases here better and reused. Doing this would - // make this plugin much slimmer. - var savedhandlers = {}; - - var mouseUpHandler = null; - - function onMouseMove(e) { - if (selection.active) { - updateSelection(e); - - plot.getPlaceholder().trigger("plotselecting", [ getSelection() ]); - } - } - - function onMouseDown(e) { - // only accept left-click - if (e.which !== 1) return; - - // cancel out any text selections - document.body.focus(); - - // prevent text selection and drag in old-school browsers - if (document.onselectstart !== undefined && savedhandlers.onselectstart == null) { - savedhandlers.onselectstart = document.onselectstart; - document.onselectstart = function () { return false; }; - } - if (document.ondrag !== undefined && savedhandlers.ondrag == null) { - savedhandlers.ondrag = document.ondrag; - document.ondrag = function () { return false; }; - } - - setSelectionPos(selection.first, e); - - selection.active = true; - - // this is a bit silly, but we have to use a closure to be - // able to whack the same handler again - mouseUpHandler = function (e) { onMouseUp(e); }; - - $(document).one("mouseup", mouseUpHandler); - } - - function onMouseUp(e) { - mouseUpHandler = null; - - // revert drag stuff for old-school browsers - if (document.onselectstart !== undefined) { - document.onselectstart = savedhandlers.onselectstart; - } - - if (document.ondrag !== undefined) { - document.ondrag = savedhandlers.ondrag; - } - - // no more dragging - selection.active = false; - updateSelection(e); - - if (selectionIsSane()) { - triggerSelectedEvent(); - } else { - // this counts as a clear - plot.getPlaceholder().trigger("plotunselected", [ ]); - plot.getPlaceholder().trigger("plotselecting", [ null ]); - } - - return false; - } - - function getSelection() { - if (!selectionIsSane()) return null; - - if (!selection.show) return null; - - var r = {}, - c1 = {x: selection.first.x, y: selection.first.y}, - c2 = {x: selection.second.x, y: selection.second.y}; - - if (selectionDirection(plot) === 'x') { - c1.y = 0; - c2.y = plot.height(); - } - - if (selectionDirection(plot) === 'y') { - c1.x = 0; - c2.x = plot.width(); - } - - $.each(plot.getAxes(), function (name, axis) { - if (axis.used) { - var p1 = axis.c2p(c1[axis.direction]), p2 = axis.c2p(c2[axis.direction]); - r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) }; - } - }); - return r; - } - - function triggerSelectedEvent() { - var r = getSelection(); - - plot.getPlaceholder().trigger("plotselected", [ r ]); - - // backwards-compat stuff, to be removed in future - if (r.xaxis && r.yaxis) { - plot.getPlaceholder().trigger("selected", [ { x1: r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]); - } - } - - function clamp(min, value, max) { - return value < min ? min : (value > max ? max : value); - } - - function selectionDirection(plot) { - var o = plot.getOptions(); - - if (o.selection.mode === 'smart') { - return selection.currentMode; - } else { - return o.selection.mode; - } - } - - function updateMode(pos) { - if (selection.first) { - var delta = { - x: pos.x - selection.first.x, - y: pos.y - selection.first.y - }; - - if (Math.abs(delta.x) < SNAPPING_CONSTANT) { - selection.currentMode = 'y'; - } else if (Math.abs(delta.y) < SNAPPING_CONSTANT) { - selection.currentMode = 'x'; - } else { - selection.currentMode = 'xy'; - } - } - } - - function setSelectionPos(pos, e) { - var offset = plot.getPlaceholder().offset(); - var plotOffset = plot.getPlotOffset(); - pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, plot.width()); - pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, plot.height()); - - if (pos !== selection.first) updateMode(pos); - - if (selectionDirection(plot) === "y") { - pos.x = pos === selection.first ? 0 : plot.width(); - } - - if (selectionDirection(plot) === "x") { - pos.y = pos === selection.first ? 0 : plot.height(); - } - } - - function updateSelection(pos) { - if (pos.pageX == null) return; - - setSelectionPos(selection.second, pos); - if (selectionIsSane()) { - selection.show = true; - plot.triggerRedrawOverlay(); - } else clearSelection(true); - } - - function clearSelection(preventEvent) { - if (selection.show) { - selection.show = false; - selection.currentMode = ''; - plot.triggerRedrawOverlay(); - if (!preventEvent) { - plot.getPlaceholder().trigger("plotunselected", [ ]); - } - } - } - - // function taken from markings support in Flot - function extractRange(ranges, coord) { - var axis, from, to, key, axes = plot.getAxes(); - - for (var k in axes) { - axis = axes[k]; - if (axis.direction === coord) { - key = coord + axis.n + "axis"; - if (!ranges[key] && axis.n === 1) { - // support x1axis as xaxis - key = coord + "axis"; - } - - if (ranges[key]) { - from = ranges[key].from; - to = ranges[key].to; - break; - } - } - } - - // backwards-compat stuff - to be removed in future - if (!ranges[key]) { - axis = coord === "x" ? plot.getXAxes()[0] : plot.getYAxes()[0]; - from = ranges[coord + "1"]; - to = ranges[coord + "2"]; - } - - // auto-reverse as an added bonus - if (from != null && to != null && from > to) { - var tmp = from; - from = to; - to = tmp; - } - - return { from: from, to: to, axis: axis }; - } - - function setSelection(ranges, preventEvent) { - var range; - - if (selectionDirection(plot) === "y") { - selection.first.x = 0; - selection.second.x = plot.width(); - } else { - range = extractRange(ranges, "x"); - selection.first.x = range.axis.p2c(range.from); - selection.second.x = range.axis.p2c(range.to); - } - - if (selectionDirection(plot) === "x") { - selection.first.y = 0; - selection.second.y = plot.height(); - } else { - range = extractRange(ranges, "y"); - selection.first.y = range.axis.p2c(range.from); - selection.second.y = range.axis.p2c(range.to); - } - - selection.show = true; - plot.triggerRedrawOverlay(); - if (!preventEvent && selectionIsSane()) { - triggerSelectedEvent(); - } - } - - function selectionIsSane() { - var minSize = plot.getOptions().selection.minSize; - return Math.abs(selection.second.x - selection.first.x) >= minSize && - Math.abs(selection.second.y - selection.first.y) >= minSize; - } - - plot.clearSelection = clearSelection; - plot.setSelection = setSelection; - plot.getSelection = getSelection; - - plot.hooks.bindEvents.push(function(plot, eventHolder) { - var o = plot.getOptions(); - if (o.selection.mode != null) { - eventHolder.mousemove(onMouseMove); - eventHolder.mousedown(onMouseDown); - } - }); - - function drawSelectionDecorations(ctx, x, y, w, h, oX, oY, mode) { - var spacing = 3; - var fullEarWidth = 15; - var earWidth = Math.max(0, Math.min(fullEarWidth, w / 2 - 2, h / 2 - 2)); - ctx.fillStyle = '#ffffff'; - - if (mode === 'xy') { - ctx.beginPath(); - ctx.moveTo(x, y + earWidth); - ctx.lineTo(x - 3, y + earWidth); - ctx.lineTo(x - 3, y - 3); - ctx.lineTo(x + earWidth, y - 3); - ctx.lineTo(x + earWidth, y); - ctx.lineTo(x, y); - ctx.closePath(); - - ctx.moveTo(x, y + h - earWidth); - ctx.lineTo(x - 3, y + h - earWidth); - ctx.lineTo(x - 3, y + h + 3); - ctx.lineTo(x + earWidth, y + h + 3); - ctx.lineTo(x + earWidth, y + h); - ctx.lineTo(x, y + h); - ctx.closePath(); - - ctx.moveTo(x + w, y + earWidth); - ctx.lineTo(x + w + 3, y + earWidth); - ctx.lineTo(x + w + 3, y - 3); - ctx.lineTo(x + w - earWidth, y - 3); - ctx.lineTo(x + w - earWidth, y); - ctx.lineTo(x + w, y); - ctx.closePath(); - - ctx.moveTo(x + w, y + h - earWidth); - ctx.lineTo(x + w + 3, y + h - earWidth); - ctx.lineTo(x + w + 3, y + h + 3); - ctx.lineTo(x + w - earWidth, y + h + 3); - ctx.lineTo(x + w - earWidth, y + h); - ctx.lineTo(x + w, y + h); - ctx.closePath(); - - ctx.stroke(); - ctx.fill(); - } - - x = oX; - y = oY; - - if (mode === 'x') { - ctx.beginPath(); - ctx.moveTo(x, y + fullEarWidth); - ctx.lineTo(x, y - fullEarWidth); - ctx.lineTo(x - spacing, y - fullEarWidth); - ctx.lineTo(x - spacing, y + fullEarWidth); - ctx.closePath(); - - ctx.moveTo(x + w, y + fullEarWidth); - ctx.lineTo(x + w, y - fullEarWidth); - ctx.lineTo(x + w + spacing, y - fullEarWidth); - ctx.lineTo(x + w + spacing, y + fullEarWidth); - ctx.closePath(); - ctx.stroke(); - ctx.fill(); - } - - if (mode === 'y') { - ctx.beginPath(); - - ctx.moveTo(x - fullEarWidth, y); - ctx.lineTo(x + fullEarWidth, y); - ctx.lineTo(x + fullEarWidth, y - spacing); - ctx.lineTo(x - fullEarWidth, y - spacing); - ctx.closePath(); - - ctx.moveTo(x - fullEarWidth, y + h); - ctx.lineTo(x + fullEarWidth, y + h); - ctx.lineTo(x + fullEarWidth, y + h + spacing); - ctx.lineTo(x - fullEarWidth, y + h + spacing); - ctx.closePath(); - ctx.stroke(); - ctx.fill(); - } - } - - plot.hooks.drawOverlay.push(function (plot, ctx) { - // draw selection - if (selection.show && selectionIsSane()) { - var plotOffset = plot.getPlotOffset(); - var o = plot.getOptions(); - - ctx.save(); - ctx.translate(plotOffset.left, plotOffset.top); - - var c = $.color.parse(o.selection.color); - - ctx.strokeStyle = c.scale('a', 1).toString(); - ctx.lineWidth = 1; - ctx.lineJoin = o.selection.shape; - ctx.fillStyle = c.scale('a', 0.4).toString(); - - var x = Math.min(selection.first.x, selection.second.x) + 0.5, - oX = x, - y = Math.min(selection.first.y, selection.second.y) + 0.5, - oY = y, - w = Math.abs(selection.second.x - selection.first.x) - 1, - h = Math.abs(selection.second.y - selection.first.y) - 1; - - if (selectionDirection(plot) === 'x') { - h += y; - y = 0; - } - - if (selectionDirection(plot) === 'y') { - w += x; - x = 0; - } - - ctx.fillRect(0, 0, plot.width(), plot.height()); - ctx.clearRect(x, y, w, h); - drawSelectionDecorations(ctx, x, y, w, h, oX, oY, selectionDirection(plot)); - - ctx.restore(); - } - }); - - plot.hooks.shutdown.push(function (plot, eventHolder) { - eventHolder.unbind("mousemove", onMouseMove); - eventHolder.unbind("mousedown", onMouseDown); - - if (mouseUpHandler) { - $(document).unbind("mouseup", mouseUpHandler); - } - }); - } - - $.plot.plugins.push({ - init: init, - options: { - selection: { - mode: null, // one of null, "x", "y" or "xy" - color: "#888888", - shape: "round", // one of "round", "miter", or "bevel" - minSize: 5 // minimum number of pixels - } - }, - name: 'selection', - version: '1.1' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.stack.js b/extern/phmap/benchmark/js/jquery.flot.stack.js deleted file mode 100644 index f4b88e7..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.stack.js +++ /dev/null @@ -1,220 +0,0 @@ -/* Flot plugin for stacking data sets rather than overlaying them. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -The plugin assumes the data is sorted on x (or y if stacking horizontally). -For line charts, it is assumed that if a line has an undefined gap (from a -null point), then the line above it should have the same gap - insert zeros -instead of "null" if you want another behaviour. This also holds for the start -and end of the chart. Note that stacking a mix of positive and negative values -in most instances doesn't make sense (so it looks weird). - -Two or more series are stacked when their "stack" attribute is set to the same -key (which can be any number or string or just "true"). To specify the default -stack, you can set the stack option like this: - - series: { - stack: null/false, true, or a key (number/string) - } - -You can also specify it for a single series, like this: - - $.plot( $("#placeholder"), [{ - data: [ ... ], - stack: true - }]) - -The stacking order is determined by the order of the data series in the array -(later series end up on top of the previous). - -Internally, the plugin modifies the datapoints in each series, adding an -offset to the y value. For line series, extra data points are inserted through -interpolation. If there's a second y value, it's also adjusted (e.g for bar -charts or filled areas). - -*/ - -(function ($) { - var options = { - series: { stack: null } // or number/string - }; - - function init(plot) { - function findMatchingSeries(s, allseries) { - var res = null; - for (var i = 0; i < allseries.length; ++i) { - if (s === allseries[i]) break; - - if (allseries[i].stack === s.stack) { - res = allseries[i]; - } - } - - return res; - } - - function addBottomPoints (s, datapoints) { - var formattedPoints = []; - for (var i = 0; i < datapoints.points.length; i += 2) { - formattedPoints.push(datapoints.points[i]); - formattedPoints.push(datapoints.points[i + 1]); - formattedPoints.push(0); - } - - datapoints.format.push({ - x: false, - y: true, - number: true, - required: false, - computeRange: s.yaxis.options.autoScale !== 'none', - defaultValue: 0 - }); - datapoints.points = formattedPoints; - datapoints.pointsize = 3; - } - - function stackData(plot, s, datapoints) { - if (s.stack == null || s.stack === false) return; - - var needsBottom = s.bars.show || (s.lines.show && s.lines.fill); - var hasBottom = datapoints.pointsize > 2 && (horizontal ? datapoints.format[2].x : datapoints.format[2].y); - // Series data is missing bottom points - need to format - if (needsBottom && !hasBottom) { - addBottomPoints(s, datapoints); - } - - var other = findMatchingSeries(s, plot.getData()); - if (!other) return; - - var ps = datapoints.pointsize, - points = datapoints.points, - otherps = other.datapoints.pointsize, - otherpoints = other.datapoints.points, - newpoints = [], - px, py, intery, qx, qy, bottom, - withlines = s.lines.show, - horizontal = s.bars.horizontal, - withsteps = withlines && s.lines.steps, - fromgap = true, - keyOffset = horizontal ? 1 : 0, - accumulateOffset = horizontal ? 0 : 1, - i = 0, j = 0, l, m; - - while (true) { - if (i >= points.length) break; - - l = newpoints.length; - - if (points[i] == null) { - // copy gaps - for (m = 0; m < ps; ++m) { - newpoints.push(points[i + m]); - } - - i += ps; - } else if (j >= otherpoints.length) { - // for lines, we can't use the rest of the points - if (!withlines) { - for (m = 0; m < ps; ++m) { - newpoints.push(points[i + m]); - } - } - - i += ps; - } else if (otherpoints[j] == null) { - // oops, got a gap - for (m = 0; m < ps; ++m) { - newpoints.push(null); - } - - fromgap = true; - j += otherps; - } else { - // cases where we actually got two points - px = points[i + keyOffset]; - py = points[i + accumulateOffset]; - qx = otherpoints[j + keyOffset]; - qy = otherpoints[j + accumulateOffset]; - bottom = 0; - - if (px === qx) { - for (m = 0; m < ps; ++m) { - newpoints.push(points[i + m]); - } - - newpoints[l + accumulateOffset] += qy; - bottom = qy; - - i += ps; - j += otherps; - } else if (px > qx) { - // we got past point below, might need to - // insert interpolated extra point - if (withlines && i > 0 && points[i - ps] != null) { - intery = py + (points[i - ps + accumulateOffset] - py) * (qx - px) / (points[i - ps + keyOffset] - px); - newpoints.push(qx); - newpoints.push(intery + qy); - for (m = 2; m < ps; ++m) { - newpoints.push(points[i + m]); - } - - bottom = qy; - } - - j += otherps; - } else { // px < qx - if (fromgap && withlines) { - // if we come from a gap, we just skip this point - i += ps; - continue; - } - - for (m = 0; m < ps; ++m) { - newpoints.push(points[i + m]); - } - - // we might be able to interpolate a point below, - // this can give us a better y - if (withlines && j > 0 && otherpoints[j - otherps] != null) { - bottom = qy + (otherpoints[j - otherps + accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - qx); - } - - newpoints[l + accumulateOffset] += bottom; - - i += ps; - } - - fromgap = false; - - if (l !== newpoints.length && needsBottom) { - newpoints[l + 2] += bottom; - } - } - - // maintain the line steps invariant - if (withsteps && l !== newpoints.length && l > 0 && - newpoints[l] !== null && - newpoints[l] !== newpoints[l - ps] && - newpoints[l + 1] !== newpoints[l - ps + 1]) { - for (m = 0; m < ps; ++m) { - newpoints[l + ps + m] = newpoints[l + m]; - } - - newpoints[l + 1] = newpoints[l - ps + 1]; - } - } - - datapoints.points = newpoints; - } - - plot.hooks.processDatapoints.push(stackData); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'stack', - version: '1.2' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.symbol.js b/extern/phmap/benchmark/js/jquery.flot.symbol.js deleted file mode 100644 index 0e06513..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.symbol.js +++ /dev/null @@ -1,98 +0,0 @@ -/* Flot plugin that adds some extra symbols for plotting points. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -The symbols are accessed as strings through the standard symbol options: - - series: { - points: { - symbol: "square" // or "diamond", "triangle", "cross", "plus", "ellipse", "rectangle" - } - } - -*/ - -(function ($) { - // we normalize the area of each symbol so it is approximately the - // same as a circle of the given radius - - var square = function (ctx, x, y, radius, shadow) { - // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 - var size = radius * Math.sqrt(Math.PI) / 2; - ctx.rect(x - size, y - size, size + size, size + size); - }, - rectangle = function (ctx, x, y, radius, shadow) { - // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 - var size = radius * Math.sqrt(Math.PI) / 2; - ctx.rect(x - size, y - size, size + size, size + size); - }, - diamond = function (ctx, x, y, radius, shadow) { - // pi * r^2 = 2s^2 => s = r * sqrt(pi/2) - var size = radius * Math.sqrt(Math.PI / 2); - ctx.moveTo(x - size, y); - ctx.lineTo(x, y - size); - ctx.lineTo(x + size, y); - ctx.lineTo(x, y + size); - ctx.lineTo(x - size, y); - ctx.lineTo(x, y - size); - }, - triangle = function (ctx, x, y, radius, shadow) { - // pi * r^2 = 1/2 * s^2 * sin (pi / 3) => s = r * sqrt(2 * pi / sin(pi / 3)) - var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 3)); - var height = size * Math.sin(Math.PI / 3); - ctx.moveTo(x - size / 2, y + height / 2); - ctx.lineTo(x + size / 2, y + height / 2); - if (!shadow) { - ctx.lineTo(x, y - height / 2); - ctx.lineTo(x - size / 2, y + height / 2); - ctx.lineTo(x + size / 2, y + height / 2); - } - }, - cross = function (ctx, x, y, radius, shadow) { - // pi * r^2 = (2s)^2 => s = r * sqrt(pi)/2 - var size = radius * Math.sqrt(Math.PI) / 2; - ctx.moveTo(x - size, y - size); - ctx.lineTo(x + size, y + size); - ctx.moveTo(x - size, y + size); - ctx.lineTo(x + size, y - size); - }, - ellipse = function(ctx, x, y, radius, shadow, fill) { - if (!shadow) { - ctx.moveTo(x + radius, y); - ctx.arc(x, y, radius, 0, Math.PI * 2, false); - } - }, - plus = function (ctx, x, y, radius, shadow) { - var size = radius * Math.sqrt(Math.PI / 2); - ctx.moveTo(x - size, y); - ctx.lineTo(x + size, y); - ctx.moveTo(x, y + size); - ctx.lineTo(x, y - size); - }, - handlers = { - square: square, - rectangle: rectangle, - diamond: diamond, - triangle: triangle, - cross: cross, - ellipse: ellipse, - plus: plus - }; - - square.fill = true; - rectangle.fill = true; - diamond.fill = true; - triangle.fill = true; - ellipse.fill = true; - - function init(plot) { - plot.drawSymbol = handlers; - } - - $.plot.plugins.push({ - init: init, - name: 'symbols', - version: '1.0' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.threshold.js b/extern/phmap/benchmark/js/jquery.flot.threshold.js deleted file mode 100644 index db5a59c..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.threshold.js +++ /dev/null @@ -1,143 +0,0 @@ -/* Flot plugin for thresholding data. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -The plugin supports these options: - - series: { - threshold: { - below: number - color: colorspec - } - } - -It can also be applied to a single series, like this: - - $.plot( $("#placeholder"), [{ - data: [ ... ], - threshold: { ... } - }]) - -An array can be passed for multiple thresholding, like this: - - threshold: [{ - below: number1 - color: color1 - },{ - below: number2 - color: color2 - }] - -These multiple threshold objects can be passed in any order since they are -sorted by the processing function. - -The data points below "below" are drawn with the specified color. This makes -it easy to mark points below 0, e.g. for budget data. - -Internally, the plugin works by splitting the data into two series, above and -below the threshold. The extra series below the threshold will have its label -cleared and the special "originSeries" attribute set to the original series. -You may need to check for this in hover events. - -*/ - -(function ($) { - var options = { - series: { threshold: null } // or { below: number, color: color spec} - }; - - function init(plot) { - function thresholdData(plot, s, datapoints, below, color) { - var ps = datapoints.pointsize, i, x, y, p, prevp, - thresholded = $.extend({}, s); // note: shallow copy - - thresholded.datapoints = { points: [], pointsize: ps, format: datapoints.format }; - thresholded.label = null; - thresholded.color = color; - thresholded.threshold = null; - thresholded.originSeries = s; - thresholded.data = []; - - var origpoints = datapoints.points, - addCrossingPoints = s.lines.show; - - var threspoints = []; - var newpoints = []; - var m; - - for (i = 0; i < origpoints.length; i += ps) { - x = origpoints[i]; - y = origpoints[i + 1]; - - prevp = p; - if (y < below) p = threspoints; - else p = newpoints; - - if (addCrossingPoints && prevp !== p && - x !== null && i > 0 && - origpoints[i - ps] != null) { - var interx = x + (below - y) * (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]); - prevp.push(interx); - prevp.push(below); - for (m = 2; m < ps; ++m) { - prevp.push(origpoints[i + m]); - } - - p.push(null); // start new segment - p.push(null); - for (m = 2; m < ps; ++m) { - p.push(origpoints[i + m]); - } - - p.push(interx); - p.push(below); - for (m = 2; m < ps; ++m) { - p.push(origpoints[i + m]); - } - } - - p.push(x); - p.push(y); - for (m = 2; m < ps; ++m) { - p.push(origpoints[i + m]); - } - } - - datapoints.points = newpoints; - thresholded.datapoints.points = threspoints; - - if (thresholded.datapoints.points.length > 0) { - var origIndex = $.inArray(s, plot.getData()); - // Insert newly-generated series right after original one (to prevent it from becoming top-most) - plot.getData().splice(origIndex + 1, 0, thresholded); - } - - // FIXME: there are probably some edge cases left in bars - } - - function processThresholds(plot, s, datapoints) { - if (!s.threshold) return; - if (s.threshold instanceof Array) { - s.threshold.sort(function(a, b) { - return a.below - b.below; - }); - - $(s.threshold).each(function(i, th) { - thresholdData(plot, s, datapoints, th.below, th.color); - }); - } else { - thresholdData(plot, s, datapoints, s.threshold.below, s.threshold.color); - } - } - - plot.hooks.processDatapoints.push(processThresholds); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'threshold', - version: '1.2' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.time.js b/extern/phmap/benchmark/js/jquery.flot.time.js deleted file mode 100644 index 3dac995..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.time.js +++ /dev/null @@ -1,460 +0,0 @@ -/* Pretty handling of time axes. - -Copyright (c) 2007-2014 IOLA and Ole Laursen. -Licensed under the MIT license. - -Set axis.mode to "time" to enable. See the section "Time series data" in -API.txt for details. -*/ - -(function($) { - 'use strict'; - - var options = { - xaxis: { - timezone: null, // "browser" for local to the client or timezone for timezone-js - timeformat: null, // format string to use - twelveHourClock: false, // 12 or 24 time in time mode - monthNames: null, // list of names of months - timeBase: 'seconds' // are the values in milliseconds or seconds - }, - yaxis: { - timeBase: 'seconds' - } - }; - - var floorInBase = $.plot.saturated.floorInBase; - - // Returns a string with the date d formatted according to fmt. - // A subset of the Open Group's strftime format is supported. - - function formatDate(d, fmt, monthNames, dayNames) { - if (typeof d.strftime === "function") { - return d.strftime(fmt); - } - - var leftPad = function(n, pad) { - n = "" + n; - pad = "" + (pad == null ? "0" : pad); - return n.length == 1 ? pad + n : n; - }; - - var r = []; - var escape = false; - var hours = d.getHours(); - var isAM = hours < 12; - - if (!monthNames) { - monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]; - } - - if (!dayNames) { - dayNames = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]; - } - - var hours12; - if (hours > 12) { - hours12 = hours - 12; - } else if (hours == 0) { - hours12 = 12; - } else { - hours12 = hours; - } - - for (var i = 0; i < fmt.length; ++i) { - var c = fmt.charAt(i); - - if (escape) { - switch (c) { - case 'a': c = "" + dayNames[d.getDay()]; break; - case 'b': c = "" + monthNames[d.getMonth()]; break; - case 'd': c = leftPad(d.getDate()); break; - case 'e': c = leftPad(d.getDate(), " "); break; - case 'h': // For back-compat with 0.7; remove in 1.0 - case 'H': c = leftPad(hours); break; - case 'I': c = leftPad(hours12); break; - case 'l': c = leftPad(hours12, " "); break; - case 'm': c = leftPad(d.getMonth() + 1); break; - case 'M': c = leftPad(d.getMinutes()); break; - // quarters not in Open Group's strftime specification - case 'q': - c = "" + (Math.floor(d.getMonth() / 3) + 1); break; - case 'S': c = leftPad(d.getSeconds()); break; - case 'y': c = leftPad(d.getFullYear() % 100); break; - case 'Y': c = "" + d.getFullYear(); break; - case 'p': c = (isAM) ? ("" + "am") : ("" + "pm"); break; - case 'P': c = (isAM) ? ("" + "AM") : ("" + "PM"); break; - case 'w': c = "" + d.getDay(); break; - } - r.push(c); - escape = false; - } else { - if (c == "%") { - escape = true; - } else { - r.push(c); - } - } - } - - return r.join(""); - } - - // To have a consistent view of time-based data independent of which time - // zone the client happens to be in we need a date-like object independent - // of time zones. This is done through a wrapper that only calls the UTC - // versions of the accessor methods. - - function makeUtcWrapper(d) { - function addProxyMethod(sourceObj, sourceMethod, targetObj, targetMethod) { - sourceObj[sourceMethod] = function() { - return targetObj[targetMethod].apply(targetObj, arguments); - }; - } - - var utc = { - date: d - }; - - // support strftime, if found - if (d.strftime !== undefined) { - addProxyMethod(utc, "strftime", d, "strftime"); - } - - addProxyMethod(utc, "getTime", d, "getTime"); - addProxyMethod(utc, "setTime", d, "setTime"); - - var props = ["Date", "Day", "FullYear", "Hours", "Milliseconds", "Minutes", "Month", "Seconds"]; - - for (var p = 0; p < props.length; p++) { - addProxyMethod(utc, "get" + props[p], d, "getUTC" + props[p]); - addProxyMethod(utc, "set" + props[p], d, "setUTC" + props[p]); - } - - return utc; - } - - // select time zone strategy. This returns a date-like object tied to the - // desired timezone - function dateGenerator(ts, opts) { - var maxDateValue = 8640000000000000; - - if (opts && opts.timeBase === 'seconds') { - ts *= 1000; - } - - if (ts > maxDateValue) { - ts = maxDateValue; - } else if (ts < -maxDateValue) { - ts = -maxDateValue; - } - - if (opts.timezone === "browser") { - return new Date(ts); - } else if (!opts.timezone || opts.timezone === "utc") { - return makeUtcWrapper(new Date(ts)); - } else if (typeof timezoneJS !== "undefined" && typeof timezoneJS.Date !== "undefined") { - var d = new timezoneJS.Date(); - // timezone-js is fickle, so be sure to set the time zone before - // setting the time. - d.setTimezone(opts.timezone); - d.setTime(ts); - return d; - } else { - return makeUtcWrapper(new Date(ts)); - } - } - - // map of app. size of time units in milliseconds - var timeUnitSizeSeconds = { - "millisecond": 0.001, - "second": 1, - "minute": 60, - "hour": 60 * 60, - "day": 24 * 60 * 60, - "month": 30 * 24 * 60 * 60, - "quarter": 3 * 30 * 24 * 60 * 60, - "year": 365.2425 * 24 * 60 * 60 - }; - - var timeUnitSizeMilliseconds = { - "millisecond": 1, - "second": 1000, - "minute": 60 * 1000, - "hour": 60 * 60 * 1000, - "day": 24 * 60 * 60 * 1000, - "month": 30 * 24 * 60 * 60 * 1000, - "quarter": 3 * 30 * 24 * 60 * 60 * 1000, - "year": 365.2425 * 24 * 60 * 60 * 1000 - }; - - // the allowed tick sizes, after 1 year we use - // an integer algorithm - - var baseSpec = [ - [1, "millisecond"], [2, "millisecond"], [5, "millisecond"], [10, "millisecond"], - [25, "millisecond"], [50, "millisecond"], [100, "millisecond"], [250, "millisecond"], [500, "millisecond"], - [1, "second"], [2, "second"], [5, "second"], [10, "second"], - [30, "second"], - [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], - [30, "minute"], - [1, "hour"], [2, "hour"], [4, "hour"], - [8, "hour"], [12, "hour"], - [1, "day"], [2, "day"], [3, "day"], - [0.25, "month"], [0.5, "month"], [1, "month"], - [2, "month"] - ]; - - // we don't know which variant(s) we'll need yet, but generating both is - // cheap - - var specMonths = baseSpec.concat([[3, "month"], [6, "month"], - [1, "year"]]); - var specQuarters = baseSpec.concat([[1, "quarter"], [2, "quarter"], - [1, "year"]]); - - - function dateTickGenerator(axis) { - var opts = axis.options, - ticks = [], - d = dateGenerator(axis.min, opts), - minSize = 0; - - // make quarter use a possibility if quarters are - // mentioned in either of these options - var spec = (opts.tickSize && opts.tickSize[1] === - "quarter") || - (opts.minTickSize && opts.minTickSize[1] === - "quarter") ? specQuarters : specMonths; - - var timeUnitSize = opts.timeBase === 'seconds' ? timeUnitSizeSeconds : timeUnitSizeMilliseconds; - - if (opts.minTickSize !== null && opts.minTickSize !== undefined) { - if (typeof opts.tickSize === "number") { - minSize = opts.tickSize; - } else { - minSize = opts.minTickSize[0] * timeUnitSize[opts.minTickSize[1]]; - } - } - - for (var i = 0; i < spec.length - 1; ++i) { - if (axis.delta < (spec[i][0] * timeUnitSize[spec[i][1]] + - spec[i + 1][0] * timeUnitSize[spec[i + 1][1]]) / 2 && - spec[i][0] * timeUnitSize[spec[i][1]] >= minSize) { - break; - } - } - - var size = spec[i][0]; - var unit = spec[i][1]; - // special-case the possibility of several years - if (unit === "year") { - // if given a minTickSize in years, just use it, - // ensuring that it's an integer - - if (opts.minTickSize !== null && opts.minTickSize !== undefined && opts.minTickSize[1] === "year") { - size = Math.floor(opts.minTickSize[0]); - } else { - var magn = Math.pow(10, Math.floor(Math.log(axis.delta / timeUnitSize.year) / Math.LN10)); - var norm = (axis.delta / timeUnitSize.year) / magn; - - if (norm < 1.5) { - size = 1; - } else if (norm < 3) { - size = 2; - } else if (norm < 7.5) { - size = 5; - } else { - size = 10; - } - - size *= magn; - } - - // minimum size for years is 1 - - if (size < 1) { - size = 1; - } - } - - axis.tickSize = opts.tickSize || [size, unit]; - var tickSize = axis.tickSize[0]; - unit = axis.tickSize[1]; - - var step = tickSize * timeUnitSize[unit]; - - if (unit === "millisecond") { - d.setMilliseconds(floorInBase(d.getMilliseconds(), tickSize)); - } else if (unit === "second") { - d.setSeconds(floorInBase(d.getSeconds(), tickSize)); - } else if (unit === "minute") { - d.setMinutes(floorInBase(d.getMinutes(), tickSize)); - } else if (unit === "hour") { - d.setHours(floorInBase(d.getHours(), tickSize)); - } else if (unit === "month") { - d.setMonth(floorInBase(d.getMonth(), tickSize)); - } else if (unit === "quarter") { - d.setMonth(3 * floorInBase(d.getMonth() / 3, - tickSize)); - } else if (unit === "year") { - d.setFullYear(floorInBase(d.getFullYear(), tickSize)); - } - - // reset smaller components - - if (step >= timeUnitSize.second) { - d.setMilliseconds(0); - } - - if (step >= timeUnitSize.minute) { - d.setSeconds(0); - } - if (step >= timeUnitSize.hour) { - d.setMinutes(0); - } - if (step >= timeUnitSize.day) { - d.setHours(0); - } - if (step >= timeUnitSize.day * 4) { - d.setDate(1); - } - if (step >= timeUnitSize.month * 2) { - d.setMonth(floorInBase(d.getMonth(), 3)); - } - if (step >= timeUnitSize.quarter * 2) { - d.setMonth(floorInBase(d.getMonth(), 6)); - } - if (step >= timeUnitSize.year) { - d.setMonth(0); - } - - var carry = 0; - var v = Number.NaN; - var v1000; - var prev; - do { - prev = v; - v1000 = d.getTime(); - if (opts && opts.timeBase === 'seconds') { - v = v1000 / 1000; - } else { - v = v1000; - } - - ticks.push(v); - - if (unit === "month" || unit === "quarter") { - if (tickSize < 1) { - // a bit complicated - we'll divide the - // month/quarter up but we need to take - // care of fractions so we don't end up in - // the middle of a day - d.setDate(1); - var start = d.getTime(); - d.setMonth(d.getMonth() + - (unit === "quarter" ? 3 : 1)); - var end = d.getTime(); - d.setTime((v + carry * timeUnitSize.hour + (end - start) * tickSize)); - carry = d.getHours(); - d.setHours(0); - } else { - d.setMonth(d.getMonth() + - tickSize * (unit === "quarter" ? 3 : 1)); - } - } else if (unit === "year") { - d.setFullYear(d.getFullYear() + tickSize); - } else { - if (opts.timeBase === 'seconds') { - d.setTime((v + step) * 1000); - } else { - d.setTime(v + step); - } - } - } while (v < axis.max && v !== prev); - - return ticks; - }; - - function init(plot) { - plot.hooks.processOptions.push(function (plot) { - $.each(plot.getAxes(), function(axisName, axis) { - var opts = axis.options; - if (opts.mode === "time") { - axis.tickGenerator = dateTickGenerator; - - axis.tickFormatter = function (v, axis) { - var d = dateGenerator(v, axis.options); - - // first check global format - if (opts.timeformat != null) { - return formatDate(d, opts.timeformat, opts.monthNames, opts.dayNames); - } - - // possibly use quarters if quarters are mentioned in - // any of these places - var useQuarters = (axis.options.tickSize && - axis.options.tickSize[1] == "quarter") || - (axis.options.minTickSize && - axis.options.minTickSize[1] == "quarter"); - - var timeUnitSize = opts.timeBase === 'seconds' ? timeUnitSizeSeconds : timeUnitSizeMilliseconds; - - var t = axis.tickSize[0] * timeUnitSize[axis.tickSize[1]]; - var span = axis.max - axis.min; - var suffix = (opts.twelveHourClock) ? " %p" : ""; - var hourCode = (opts.twelveHourClock) ? "%I" : "%H"; - var fmt; - - if (t < timeUnitSize.minute) { - fmt = hourCode + ":%M:%S" + suffix; - } else if (t < timeUnitSize.day) { - if (span < 2 * timeUnitSize.day) { - fmt = hourCode + ":%M" + suffix; - } else { - fmt = "%b %d " + hourCode + ":%M" + suffix; - } - } else if (t < timeUnitSize.month) { - fmt = "%b %d"; - } else if ((useQuarters && t < timeUnitSize.quarter) || - (!useQuarters && t < timeUnitSize.year)) { - if (span < timeUnitSize.year) { - fmt = "%b"; - } else { - fmt = "%b %Y"; - } - } else if (useQuarters && t < timeUnitSize.year) { - if (span < timeUnitSize.year) { - fmt = "Q%q"; - } else { - fmt = "Q%q %Y"; - } - } else { - fmt = "%Y"; - } - - var rt = formatDate(d, fmt, opts.monthNames, opts.dayNames); - - return rt; - }; - } - }); - }); - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'time', - version: '1.0' - }); - - // Time-axis support used to be in Flot core, which exposed the - // formatDate function on the plot object. Various plugins depend - // on the function, so we need to re-expose it here. - - $.plot.formatDate = formatDate; - $.plot.dateGenerator = dateGenerator; - $.plot.dateTickGenerator = dateTickGenerator; - $.plot.makeUtcWrapper = makeUtcWrapper; -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.touch.js b/extern/phmap/benchmark/js/jquery.flot.touch.js deleted file mode 100644 index e5153bf..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.touch.js +++ /dev/null @@ -1,322 +0,0 @@ - -/* global jQuery */ - -(function($) { - 'use strict'; - - var options = { - pan: { - enableTouch: false - } - }; - - function init(plot) { - plot.hooks.processOptions.push(initTouchNavigation); - } - - function initTouchNavigation(plot, options) { - var gestureState = { - twoTouches: false, - currentTapStart: { x: 0, y: 0 }, - currentTapEnd: { x: 0, y: 0 }, - prevTap: { x: 0, y: 0 }, - currentTap: { x: 0, y: 0 }, - interceptedLongTap: false, - allowEventPropagation: false, - prevTapTime: null, - tapStartTime: null, - longTapTriggerId: null - }, - maxDistanceBetweenTaps = 20, - maxIntervalBetweenTaps = 500, - maxLongTapDistance = 20, - minLongTapDuration = 1500, - pressedTapDuration = 125, - mainEventHolder; - - function interpretGestures(e) { - var o = plot.getOptions(); - - if (!o.pan.active && !o.zoom.active) { - return; - } - - updateOnMultipleTouches(e); - mainEventHolder.dispatchEvent(new CustomEvent('touchevent', { detail: e })); - - if (isPinchEvent(e)) { - executeAction(e, 'pinch'); - } else { - executeAction(e, 'pan'); - if (!wasPinchEvent(e)) { - if (isDoubleTap(e)) { - executeAction(e, 'doubleTap'); - } - executeAction(e, 'tap'); - executeAction(e, 'longTap'); - } - } - } - - function executeAction(e, gesture) { - switch (gesture) { - case 'pan': - pan[e.type](e); - break; - case 'pinch': - pinch[e.type](e); - break; - case 'doubleTap': - doubleTap.onDoubleTap(e); - break; - case 'longTap': - longTap[e.type](e); - break; - case 'tap': - tap[e.type](e); - break; - default: - break; - } - } - - function bindEvents(plot, eventHolder) { - mainEventHolder = eventHolder[0]; - eventHolder[0].addEventListener('touchstart', interpretGestures, false); - eventHolder[0].addEventListener('touchmove', interpretGestures, false); - eventHolder[0].addEventListener('touchend', interpretGestures, false); - } - - function shutdown(plot, eventHolder) { - eventHolder[0].removeEventListener('touchstart', interpretGestures); - eventHolder[0].removeEventListener('touchmove', interpretGestures); - eventHolder[0].removeEventListener('touchend', interpretGestures); - if (gestureState.longTapTriggerId) { - clearTimeout(gestureState.longTapTriggerId); - gestureState.longTapTriggerId = null; - } - } - - var pan = { - touchstart: function(e) { - updatePrevForDoubleTap(); - updateCurrentForDoubleTap(e); - updateStateForLongTapStart(e); - - mainEventHolder.dispatchEvent(new CustomEvent('panstart', { detail: e })); - }, - - touchmove: function(e) { - preventEventPropagation(e); - - updateCurrentForDoubleTap(e); - updateStateForLongTapEnd(e); - - if (!gestureState.allowEventPropagation) { - mainEventHolder.dispatchEvent(new CustomEvent('pandrag', { detail: e })); - } - }, - - touchend: function(e) { - preventEventPropagation(e); - - if (wasPinchEvent(e)) { - mainEventHolder.dispatchEvent(new CustomEvent('pinchend', { detail: e })); - mainEventHolder.dispatchEvent(new CustomEvent('panstart', { detail: e })); - } else if (noTouchActive(e)) { - mainEventHolder.dispatchEvent(new CustomEvent('panend', { detail: e })); - } - } - }; - - var pinch = { - touchstart: function(e) { - mainEventHolder.dispatchEvent(new CustomEvent('pinchstart', { detail: e })); - }, - - touchmove: function(e) { - preventEventPropagation(e); - gestureState.twoTouches = isPinchEvent(e); - if (!gestureState.allowEventPropagation) { - mainEventHolder.dispatchEvent(new CustomEvent('pinchdrag', { detail: e })); - } - }, - - touchend: function(e) { - preventEventPropagation(e); - } - }; - - var doubleTap = { - onDoubleTap: function(e) { - preventEventPropagation(e); - mainEventHolder.dispatchEvent(new CustomEvent('doubletap', { detail: e })); - } - }; - - var longTap = { - touchstart: function(e) { - longTap.waitForLongTap(e); - }, - - touchmove: function(e) { - }, - - touchend: function(e) { - if (gestureState.longTapTriggerId) { - clearTimeout(gestureState.longTapTriggerId); - gestureState.longTapTriggerId = null; - } - }, - - isLongTap: function(e) { - var currentTime = new Date().getTime(), - tapDuration = currentTime - gestureState.tapStartTime; - if (tapDuration >= minLongTapDuration && !gestureState.interceptedLongTap) { - if (distance(gestureState.currentTapStart.x, gestureState.currentTapStart.y, gestureState.currentTapEnd.x, gestureState.currentTapEnd.y) < maxLongTapDistance) { - gestureState.interceptedLongTap = true; - return true; - } - } - return false; - }, - - waitForLongTap: function(e) { - var longTapTrigger = function() { - if (longTap.isLongTap(e)) { - mainEventHolder.dispatchEvent(new CustomEvent('longtap', { detail: e })); - } - gestureState.longTapTriggerId = null; - }; - if (!gestureState.longTapTriggerId) { - gestureState.longTapTriggerId = setTimeout(longTapTrigger, minLongTapDuration); - } - } - }; - - var tap = { - touchstart: function(e) { - gestureState.tapStartTime = new Date().getTime(); - }, - - touchmove: function(e) { - }, - - touchend: function(e) { - if (tap.isTap(e)) { - mainEventHolder.dispatchEvent(new CustomEvent('tap', { detail: e })); - preventEventPropagation(e); - } - }, - - isTap: function(e) { - var currentTime = new Date().getTime(), - tapDuration = currentTime - gestureState.tapStartTime; - if (tapDuration <= pressedTapDuration) { - if (distance(gestureState.currentTapStart.x, gestureState.currentTapStart.y, gestureState.currentTapEnd.x, gestureState.currentTapEnd.y) < maxLongTapDistance) { - return true; - } - } - return false; - } - }; - - if (options.pan.enableTouch === true) { - plot.hooks.bindEvents.push(bindEvents); - plot.hooks.shutdown.push(shutdown); - }; - - function updatePrevForDoubleTap() { - gestureState.prevTap = { - x: gestureState.currentTap.x, - y: gestureState.currentTap.y - }; - }; - - function updateCurrentForDoubleTap(e) { - gestureState.currentTap = { - x: e.touches[0].pageX, - y: e.touches[0].pageY - }; - } - - function updateStateForLongTapStart(e) { - gestureState.tapStartTime = new Date().getTime(); - gestureState.interceptedLongTap = false; - gestureState.currentTapStart = { - x: e.touches[0].pageX, - y: e.touches[0].pageY - }; - gestureState.currentTapEnd = { - x: e.touches[0].pageX, - y: e.touches[0].pageY - }; - }; - - function updateStateForLongTapEnd(e) { - gestureState.currentTapEnd = { - x: e.touches[0].pageX, - y: e.touches[0].pageY - }; - }; - - function isDoubleTap(e) { - var currentTime = new Date().getTime(), - intervalBetweenTaps = currentTime - gestureState.prevTapTime; - - if (intervalBetweenTaps >= 0 && intervalBetweenTaps < maxIntervalBetweenTaps) { - if (distance(gestureState.prevTap.x, gestureState.prevTap.y, gestureState.currentTap.x, gestureState.currentTap.y) < maxDistanceBetweenTaps) { - e.firstTouch = gestureState.prevTap; - e.secondTouch = gestureState.currentTap; - return true; - } - } - gestureState.prevTapTime = currentTime; - return false; - } - - function preventEventPropagation(e) { - if (!gestureState.allowEventPropagation) { - e.preventDefault(); - e.stopPropagation(); - } - } - - function distance(x1, y1, x2, y2) { - return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); - } - - function noTouchActive(e) { - return (e.touches && e.touches.length === 0); - } - - function wasPinchEvent(e) { - return (gestureState.twoTouches && e.touches.length === 1); - } - - function updateOnMultipleTouches(e) { - if (e.touches.length >= 3) { - gestureState.allowEventPropagation = true; - } else { - gestureState.allowEventPropagation = false; - } - } - - function isPinchEvent(e) { - if (e.touches && e.touches.length >= 2) { - if (e.touches[0].target === plot.getEventHolder() && - e.touches[1].target === plot.getEventHolder()) { - return true; - } - } - return false; - } - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'navigateTouch', - version: '0.3' - }); -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.touchNavigate.js b/extern/phmap/benchmark/js/jquery.flot.touchNavigate.js deleted file mode 100644 index b467b2e..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.touchNavigate.js +++ /dev/null @@ -1,340 +0,0 @@ -/* global jQuery */ - -(function($) { - 'use strict'; - - var options = { - pan: { - enableTouch: false, - touchMode: 'manual' - } - }; - - var ZOOM_DISTANCE_MARGIN = $.plot.uiConstants.ZOOM_DISTANCE_MARGIN; - - function init(plot) { - plot.hooks.processOptions.push(initTouchNavigation); - } - - function initTouchNavigation(plot, options) { - var gestureState = { - zoomEnable: false, - prevDistance: null, - prevTapTime: 0, - prevPanPosition: { x: 0, y: 0 }, - prevTapPosition: { x: 0, y: 0 } - }, - navigationState = { - prevTouchedAxis: 'none', - currentTouchedAxis: 'none', - touchedAxis: null, - navigationConstraint: 'unconstrained', - initialState: null, - }, - useManualPan = options.pan.touchMode === 'manual', - smartPanLock = options.pan.touchMode === 'smartLock', - useSmartPan = smartPanLock || options.pan.touchMode === 'smart', - pan, pinch, doubleTap; - - function bindEvents(plot, eventHolder) { - var o = plot.getOptions(); - - if (o.pan.interactive) { - eventHolder[0].addEventListener('panstart', pan.start, false); - eventHolder[0].addEventListener('pandrag', pan.drag, false); - eventHolder[0].addEventListener('panend', pan.end, false); - eventHolder[0].addEventListener('pinchstart', pinch.start, false); - eventHolder[0].addEventListener('pinchdrag', pinch.drag, false); - eventHolder[0].addEventListener('pinchend', pinch.end, false); - eventHolder[0].addEventListener('doubletap', doubleTap.recenterPlot, false); - } - } - - function shutdown(plot, eventHolder) { - eventHolder[0].removeEventListener('panstart', pan.start); - eventHolder[0].removeEventListener('pandrag', pan.drag); - eventHolder[0].removeEventListener('panend', pan.end); - eventHolder[0].removeEventListener('pinchstart', pinch.start); - eventHolder[0].removeEventListener('pinchdrag', pinch.drag); - eventHolder[0].removeEventListener('pinchend', pinch.end); - eventHolder[0].removeEventListener('doubletap', doubleTap.recenterPlot); - } - - pan = { - start: function(e) { - presetNavigationState(e, 'pan', gestureState); - updateData(e, 'pan', gestureState, navigationState); - - if (useSmartPan) { - var point = getPoint(e, 'pan'); - navigationState.initialState = plot.navigationState(point.x, point.y); - } - }, - - drag: function(e) { - presetNavigationState(e, 'pan', gestureState); - - if (useSmartPan) { - var point = getPoint(e, 'pan'); - plot.smartPan({ - x: navigationState.initialState.startPageX - point.x, - y: navigationState.initialState.startPageY - point.y - }, navigationState.initialState, navigationState.touchedAxis, false, smartPanLock); - } else if (useManualPan) { - plot.pan({ - left: -delta(e, 'pan', gestureState).x, - top: -delta(e, 'pan', gestureState).y, - axes: navigationState.touchedAxis - }); - updatePrevPanPosition(e, 'pan', gestureState, navigationState); - } - }, - - end: function(e) { - presetNavigationState(e, 'pan', gestureState); - - if (useSmartPan) { - plot.smartPan.end(); - } - - if (wasPinchEvent(e, gestureState)) { - updateprevPanPosition(e, 'pan', gestureState, navigationState); - } - } - }; - - var pinchDragTimeout; - pinch = { - start: function(e) { - if (pinchDragTimeout) { - clearTimeout(pinchDragTimeout); - pinchDragTimeout = null; - } - presetNavigationState(e, 'pinch', gestureState); - setPrevDistance(e, gestureState); - updateData(e, 'pinch', gestureState, navigationState); - }, - - drag: function(e) { - if (pinchDragTimeout) { - return; - } - pinchDragTimeout = setTimeout(function() { - presetNavigationState(e, 'pinch', gestureState); - plot.pan({ - left: -delta(e, 'pinch', gestureState).x, - top: -delta(e, 'pinch', gestureState).y, - axes: navigationState.touchedAxis - }); - updatePrevPanPosition(e, 'pinch', gestureState, navigationState); - - var dist = pinchDistance(e); - - if (gestureState.zoomEnable || Math.abs(dist - gestureState.prevDistance) > ZOOM_DISTANCE_MARGIN) { - zoomPlot(plot, e, gestureState, navigationState); - - //activate zoom mode - gestureState.zoomEnable = true; - } - pinchDragTimeout = null; - }, 1000 / 60); - }, - - end: function(e) { - if (pinchDragTimeout) { - clearTimeout(pinchDragTimeout); - pinchDragTimeout = null; - } - presetNavigationState(e, 'pinch', gestureState); - gestureState.prevDistance = null; - } - }; - - doubleTap = { - recenterPlot: function(e) { - if (e && e.detail && e.detail.type === 'touchmove') { - // do not recenter during touch moving; - return; - } - recenterPlotOnDoubleTap(plot, e, gestureState, navigationState); - } - }; - - if (options.pan.enableTouch === true) { - plot.hooks.bindEvents.push(bindEvents); - plot.hooks.shutdown.push(shutdown); - } - - function presetNavigationState(e, gesture, gestureState) { - navigationState.touchedAxis = getAxis(plot, e, gesture, navigationState); - if (noAxisTouched(navigationState)) { - navigationState.navigationConstraint = 'unconstrained'; - } else { - navigationState.navigationConstraint = 'axisConstrained'; - } - } - } - - $.plot.plugins.push({ - init: init, - options: options, - name: 'navigateTouch', - version: '0.3' - }); - - function recenterPlotOnDoubleTap(plot, e, gestureState, navigationState) { - checkAxesForDoubleTap(plot, e, navigationState); - if ((navigationState.currentTouchedAxis === 'x' && navigationState.prevTouchedAxis === 'x') || - (navigationState.currentTouchedAxis === 'y' && navigationState.prevTouchedAxis === 'y') || - (navigationState.currentTouchedAxis === 'none' && navigationState.prevTouchedAxis === 'none')) { - plot.recenter({ axes: navigationState.touchedAxis }); - } - } - - function checkAxesForDoubleTap(plot, e, navigationState) { - var axis = plot.getTouchedAxis(e.detail.firstTouch.x, e.detail.firstTouch.y); - if (axis[0] !== undefined) { - navigationState.prevTouchedAxis = axis[0].direction; - } - - axis = plot.getTouchedAxis(e.detail.secondTouch.x, e.detail.secondTouch.y); - if (axis[0] !== undefined) { - navigationState.touchedAxis = axis; - navigationState.currentTouchedAxis = axis[0].direction; - } - - if (noAxisTouched(navigationState)) { - navigationState.touchedAxis = null; - navigationState.prevTouchedAxis = 'none'; - navigationState.currentTouchedAxis = 'none'; - } - } - - function zoomPlot(plot, e, gestureState, navigationState) { - var offset = plot.offset(), - center = { - left: 0, - top: 0 - }, - zoomAmount = pinchDistance(e) / gestureState.prevDistance, - dist = pinchDistance(e); - - center.left = getPoint(e, 'pinch').x - offset.left; - center.top = getPoint(e, 'pinch').y - offset.top; - - // send the computed touched axis to the zoom function so that it only zooms on that one - plot.zoom({ - center: center, - amount: zoomAmount, - axes: navigationState.touchedAxis - }); - gestureState.prevDistance = dist; - } - - function wasPinchEvent(e, gestureState) { - return (gestureState.zoomEnable && e.detail.touches.length === 1); - } - - function getAxis(plot, e, gesture, navigationState) { - if (e.type === 'pinchstart') { - var axisTouch1 = plot.getTouchedAxis(e.detail.touches[0].pageX, e.detail.touches[0].pageY); - var axisTouch2 = plot.getTouchedAxis(e.detail.touches[1].pageX, e.detail.touches[1].pageY); - - if (axisTouch1.length === axisTouch2.length && axisTouch1.toString() === axisTouch2.toString()) { - return axisTouch1; - } - } else if (e.type === 'panstart') { - return plot.getTouchedAxis(e.detail.touches[0].pageX, e.detail.touches[0].pageY); - } else if (e.type === 'pinchend') { - //update axis since instead on pinch, a pan event is made - return plot.getTouchedAxis(e.detail.touches[0].pageX, e.detail.touches[0].pageY); - } else { - return navigationState.touchedAxis; - } - } - - function noAxisTouched(navigationState) { - return (!navigationState.touchedAxis || navigationState.touchedAxis.length === 0); - } - - function setPrevDistance(e, gestureState) { - gestureState.prevDistance = pinchDistance(e); - } - - function updateData(e, gesture, gestureState, navigationState) { - var axisDir, - point = getPoint(e, gesture); - - switch (navigationState.navigationConstraint) { - case 'unconstrained': - navigationState.touchedAxis = null; - gestureState.prevTapPosition = { - x: gestureState.prevPanPosition.x, - y: gestureState.prevPanPosition.y - }; - gestureState.prevPanPosition = { - x: point.x, - y: point.y - }; - break; - case 'axisConstrained': - axisDir = navigationState.touchedAxis[0].direction; - navigationState.currentTouchedAxis = axisDir; - gestureState.prevTapPosition[axisDir] = gestureState.prevPanPosition[axisDir]; - gestureState.prevPanPosition[axisDir] = point[axisDir]; - break; - default: - break; - } - } - - function distance(x1, y1, x2, y2) { - return Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); - } - - function pinchDistance(e) { - var t1 = e.detail.touches[0], - t2 = e.detail.touches[1]; - return distance(t1.pageX, t1.pageY, t2.pageX, t2.pageY); - } - - function updatePrevPanPosition(e, gesture, gestureState, navigationState) { - var point = getPoint(e, gesture); - - switch (navigationState.navigationConstraint) { - case 'unconstrained': - gestureState.prevPanPosition.x = point.x; - gestureState.prevPanPosition.y = point.y; - break; - case 'axisConstrained': - gestureState.prevPanPosition[navigationState.currentTouchedAxis] = - point[navigationState.currentTouchedAxis]; - break; - default: - break; - } - } - - function delta(e, gesture, gestureState) { - var point = getPoint(e, gesture); - - return { - x: point.x - gestureState.prevPanPosition.x, - y: point.y - gestureState.prevPanPosition.y - } - } - - function getPoint(e, gesture) { - if (gesture === 'pinch') { - return { - x: (e.detail.touches[0].pageX + e.detail.touches[1].pageX) / 2, - y: (e.detail.touches[0].pageY + e.detail.touches[1].pageY) / 2 - } - } else { - return { - x: e.detail.touches[0].pageX, - y: e.detail.touches[0].pageY - } - } - } -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.flot.uiConstants.js b/extern/phmap/benchmark/js/jquery.flot.uiConstants.js deleted file mode 100644 index 627847d..0000000 --- a/extern/phmap/benchmark/js/jquery.flot.uiConstants.js +++ /dev/null @@ -1,10 +0,0 @@ -(function ($) { - 'use strict'; - $.plot.uiConstants = { - SNAPPING_CONSTANT: 20, - PANHINT_LENGTH_CONSTANT: 10, - MINOR_TICKS_COUNT_CONSTANT: 4, - TICK_LENGTH_CONSTANT: 10, - ZOOM_DISTANCE_MARGIN: 25 - }; -})(jQuery); diff --git a/extern/phmap/benchmark/js/jquery.js b/extern/phmap/benchmark/js/jquery.js deleted file mode 100644 index f9f969a..0000000 --- a/extern/phmap/benchmark/js/jquery.js +++ /dev/null @@ -1,9473 +0,0 @@ -/*! - * jQuery JavaScript Library v1.8.3 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2012 jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: Tue Nov 13 2012 08:20:33 GMT-0500 (Eastern Standard Time) - */ -/* eslint-disable */ -(function( window, undefined ) { -var - // A central reference to the root jQuery(document) - rootjQuery, - - // The deferred used on DOM ready - readyList, - - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - location = window.location, - navigator = window.navigator, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // Save a reference to some core methods - core_push = Array.prototype.push, - core_slice = Array.prototype.slice, - core_indexOf = Array.prototype.indexOf, - core_toString = Object.prototype.toString, - core_hasOwn = Object.prototype.hasOwnProperty, - core_trim = String.prototype.trim, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Used for matching numbers - core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source, - - // Used for detecting and trimming whitespace - core_rnotwhite = /\S/, - core_rspace = /\s+/, - - // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, - rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, - - // The ready event handler and self cleanup method - DOMContentLoaded = function() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - } else if ( document.readyState === "complete" ) { - // we're here because readyState === "complete" in oldIE - // which is good enough for us to call the dom ready! - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }, - - // [[Class]] -> type pairs - class2type = {}; - -jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = ( context && context.nodeType ? context.ownerDocument || context : document ); - - // scripts is true for back-compat - selector = jQuery.parseHTML( match[1], doc, true ); - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - this.attr.call( selector, context, true ); - } - - return jQuery.merge( this, selector ); - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.8.3", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return core_slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; - }, - - eq: function( i ) { - i = +i; - return i === -1 ? - this.slice( i ) : - this.slice( i, i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( core_slice.apply( this, arguments ), - "slice", core_slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ core_toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !core_hasOwn.call(obj, "constructor") && - !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || core_hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // scripts (optional): If true, will include scripts passed in the html string - parseHTML: function( data, context, scripts ) { - var parsed; - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - scripts = context; - context = 0; - } - context = context || document; - - // Single tag - if ( (parsed = rsingleTag.exec( data )) ) { - return [ context.createElement( parsed[1] ) ]; - } - - parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] ); - return jQuery.merge( [], - (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes ); - }, - - parseJSON: function( data ) { - if ( !data || typeof data !== "string") { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && core_rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var name, - i = 0, - length = obj.length, - isObj = length === undefined || jQuery.isFunction( obj ); - - if ( args ) { - if ( isObj ) { - for ( name in obj ) { - if ( callback.apply( obj[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( obj[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in obj ) { - if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) { - break; - } - } - } - } - - return obj; - }, - - // Use native String.trim function wherever possible - trim: core_trim && !core_trim.call("\uFEFF\xA0") ? - function( text ) { - return text == null ? - "" : - core_trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var type, - ret = results || []; - - if ( arr != null ) { - // The window, strings (and functions) also have 'length' - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - type = jQuery.type( arr ); - - if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) { - core_push.call( ret, arr ); - } else { - jQuery.merge( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( core_indexOf ) { - return core_indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; - - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, - ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = core_slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context, args.concat( core_slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, pass ) { - var exec, - bulk = key == null, - i = 0, - length = elems.length; - - // Sets many values - if ( key && typeof key === "object" ) { - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); - } - chainable = 1; - - // Sets one value - } else if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = pass === undefined && jQuery.isFunction( value ); - - if ( bulk ) { - // Bulk operations only iterate when executing function values - if ( exec ) { - exec = fn; - fn = function( elem, key, value ) { - return exec.call( jQuery( elem ), value ); - }; - - // Otherwise they run against the entire set - } else { - fn.call( elems, value ); - fn = null; - } - } - - if ( fn ) { - for (; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - } - - chainable = 1; - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: function() { - return ( new Date() ).getTime(); - } -}); - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready, 1 ); - - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch(e) {} - - if ( top && top.doScroll ) { - (function doScrollCheck() { - if ( !jQuery.isReady ) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch(e) { - return setTimeout( doScrollCheck, 50 ); - } - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } - } - } - return readyList.promise( obj ); -}; - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.split( core_rspace ), function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Control if a given callback is in the list - has: function( fn ) { - return jQuery.inArray( fn, list ) > -1; - }, - // Remove all callbacks from the list - empty: function() { - list = []; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( list && ( !fired || stack ) ) { - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var action = tuple[ 0 ], - fn = fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ]( jQuery.isFunction( fn ) ? - function() { - var returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - } : - newDefer[ action ] - ); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] = list.fire - deferred[ tuple[0] ] = list.fire; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; - if( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); -jQuery.support = (function() { - - var support, - all, - a, - select, - opt, - input, - fragment, - eventName, - i, - isSupported, - clickFn, - div = document.createElement("div"); - - // Setup - div.setAttribute( "className", "t" ); - div.innerHTML = "
a"; - - // Support tests won't run in some limited or non-browser environments - all = div.getElementsByTagName("*"); - a = div.getElementsByTagName("a")[ 0 ]; - if ( !all || !a || !all.length ) { - return {}; - } - - // First batch of tests - select = document.createElement("select"); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName("input")[ 0 ]; - - a.style.cssText = "top:1px;float:left;opacity:.5"; - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName("tbody").length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName("link").length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute("href") === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.5/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Tests for enctype support on a form (#6743) - enctype: !!document.createElement("form").enctype, - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", - - // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode - boxModel: ( document.compatMode === "CSS1Compat" ), - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true, - boxSizingReliable: true, - pixelPosition: false - }; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", clickFn = function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent("onclick"); - div.detachEvent( "onclick", clickFn ); - } - - // Check if a radio maintains its value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute( "type", "radio" ); - support.radioValue = input.value === "t"; - - input.setAttribute( "checked", "checked" ); - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.lastChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - fragment.removeChild( input ); - fragment.appendChild( div ); - - // Technique from Juriy Zaytsev - // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for ( i in { - submit: true, - change: true, - focusin: true - }) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } - - // Run tests that need a body at doc ready - jQuery(function() { - var container, div, tds, marginDiv, - divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;", - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px"; - body.insertBefore( container, body.firstChild ); - - // Construct the test element - div = document.createElement("div"); - container.appendChild( div ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - div.innerHTML = "
t
"; - tds = div.getElementsByTagName("td"); - tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE <= 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Check box-sizing and margin behavior - div.innerHTML = ""; - div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; - support.boxSizing = ( div.offsetWidth === 4 ); - support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 ); - - // NOTE: To any future maintainer, we've window.getComputedStyle - // because jsdom on node.js will break without it. - if ( window.getComputedStyle ) { - support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; - support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = document.createElement("div"); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); - } - - if ( typeof div.style.zoom !== "undefined" ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.innerHTML = ""; - div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = "block"; - div.style.overflow = "visible"; - div.innerHTML = "
"; - div.firstChild.style.width = "5px"; - support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); - - container.style.zoom = 1; - } - - // Null elements to avoid leaks in IE - body.removeChild( container ); - container = div = tds = marginDiv = null; - }); - - // Null elements to avoid leaks in IE - fragment.removeChild( div ); - all = a = select = opt = input = fragment = div = null; - - return support; -})(); -var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - -jQuery.extend({ - cache: {}, - - deletedIds: [], - - // Remove at next major release (1.9/2.0) - uuid: 0, - - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // Avoids exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, l, - - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split(" "); - } - } - } - - for ( i = 0, l = name.length; i < l; i++ ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } - - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - } else if ( jQuery.support.deleteExpando || cache != cache.window ) { - delete cache[ id ]; - - // When all else fails, null - } else { - cache[ id ] = null; - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; - - // nodes accept data unless otherwise specified; rejection can be conditional - return !noData || noData !== true && elem.getAttribute("classid") === noData; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var parts, part, attr, name, l, - elem = this[0], - i = 0, - data = null; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - attr = elem.attributes; - for ( l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( !name.indexOf( "data-" ) ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( elem, name, data[ name ] ); - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - parts = key.split( ".", 2 ); - parts[1] = parts[1] ? "." + parts[1] : ""; - part = parts[1] + "!"; - - return jQuery.access( this, function( value ) { - - if ( value === undefined ) { - data = this.triggerHandler( "getData" + part, [ parts[0] ] ); - - // Try to fetch any internally stored data first - if ( data === undefined && elem ) { - data = jQuery.data( elem, key ); - data = dataAttr( elem, key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - } - - parts[1] = value; - this.each(function() { - var self = jQuery( this ); - - self.triggerHandler( "setData" + part, parts ); - jQuery.data( this, key, value ); - self.triggerHandler( "changeData" + part, parts ); - }); - }, null, value, arguments.length > 1, null, false ); - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray(data) ) { - queue = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - jQuery.removeData( elem, type + "queue", true ); - jQuery.removeData( elem, key, true ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var nodeHook, boolHook, fixSpecified, - rclass = /[\t\r\n]/g, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea|)$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( core_rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( setClass.indexOf( " " + classNames[ c ] + " " ) < 0 ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var removes, className, elem, c, cl, i, l; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - if ( (value && typeof value === "string") || value === undefined ) { - removes = ( value || "" ).split( core_rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - if ( elem.nodeType === 1 && elem.className ) { - - className = (" " + elem.className + " ").replace( rclass, " " ); - - // loop over each item in the removal list - for ( c = 0, cl = removes.length; c < cl; c++ ) { - // Remove until there is nothing to remove, - while ( className.indexOf(" " + removes[ c ] + " ") >= 0 ) { - className = className.replace( " " + removes[ c ] + " " , " " ); - } - } - elem.className = value ? jQuery.trim( className ) : ""; - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( core_rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space separated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var val, - self = jQuery(this); - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // oldIE doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - // Don't return options that are disabled or in a disabled optgroup - ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && - ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9 - attrFn: {}, - - attr: function( elem, name, value, pass ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( notxml ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, value + "" ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var propName, attrNames, name, isBool, - i = 0; - - if ( value && elem.nodeType === 1 ) { - - attrNames = value.split( core_rspace ); - - for ( ; i < attrNames.length; i++ ) { - name = attrNames[ i ]; - - if ( name ) { - propName = jQuery.propFix[ name ] || name; - isBool = rboolean.test( name ); - - // See #9699 for explanation of this approach (setting first, then removal) - // Do not do this for boolean attributes (see #10870) - if ( !isBool ) { - jQuery.attr( elem, name, "" ); - } - elem.removeAttribute( getSetAttribute ? name : propName ); - - // Set corresponding property to false for boolean attributes - if ( isBool && propName in elem ) { - elem[ propName ] = false; - } - } - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return ( elem[ name ] = value ); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - } - } -}); - -// Hook for boolean attributes -boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode, - property = jQuery.prop( elem, name ); - return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } -}; - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - fixSpecified = { - name: true, - id: true, - coords: true - }; - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ? - ret.value : - undefined; - }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return ( ret.value = value + "" ); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - get: nodeHook.get, - set: function( elem, value, name ) { - if ( value === "" ) { - value = "false"; - } - nodeHook.set( elem, value, name ); - } - }; -} - - -// Some attributes require a special call on IE -if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = value + "" ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }); -} - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); -} -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }); -}); -var rformElems = /^(?:textarea|input|select)$/i, - rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/, - rhoverHack = /(?:^|\s)hover(\.\S+|)\b/, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - hoverHack = function( events ) { - return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); - }; - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - add: function( elem, types, handler, data, selector ) { - - var elemData, eventHandle, events, - t, tns, type, namespaces, handleObj, - handleObjIn, handlers, special; - - // Don't attach events to noData or text/comment nodes (allow plain objects tho) - if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - events = elemData.events; - if ( !events ) { - elemData.events = events = {}; - } - eventHandle = elemData.handle; - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = jQuery.trim( hoverHack(types) ).split( " " ); - for ( t = 0; t < types.length; t++ ) { - - tns = rtypenamespace.exec( types[t] ) || []; - type = tns[1]; - namespaces = ( tns[2] || "" ).split( "." ).sort(); - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: tns[1], - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - handlers = events[ type ]; - if ( !handlers ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var t, tns, type, origType, namespaces, origCount, - j, events, special, eventType, handleObj, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = jQuery.trim( hoverHack( types || "" ) ).split(" "); - for ( t = 0; t < types.length; t++ ) { - tns = rtypenamespace.exec( types[t] ) || []; - type = origType = tns[1]; - namespaces = tns[2]; - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector? special.delegateType : special.bindType ) || type; - eventType = events[ type ] || []; - origCount = eventType.length; - namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null; - - // Remove matching events - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !namespaces || namespaces.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - eventType.splice( j--, 1 ); - - if ( handleObj.selector ) { - eventType.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( eventType.length === 0 && origCount !== eventType.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery.removeData( elem, "events", true ); - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Don't do events on text and comment nodes - if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { - return; - } - - // Event object or event type - var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType, - type = event.type || event, - namespaces = []; - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "!" ) >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf( "." ) >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.isTrigger = true; - event.exclusive = exclusive; - event.namespace = namespaces.join( "." ); - event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; - ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; - - // Handle a global trigger - if ( !elem ) { - - // TODO: Stop taunting the data cache; remove global events and always attach to document - cache = jQuery.cache; - for ( i in cache ) { - if ( cache[ i ].events && cache[ i ].events[ type ] ) { - jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); - } - } - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - eventPath = [[ elem, special.bindType || type ]]; - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; - for ( old = elem; cur; cur = cur.parentNode ) { - eventPath.push([ cur, bubbleType ]); - old = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( old === (elem.ownerDocument || document) ) { - eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); - } - } - - // Fire handlers on the event path - for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { - - cur = eventPath[i][0]; - event.type = eventPath[i][1]; - - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - // Note that this is a bare JS function and not a jQuery handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - // IE<9 dies on focus/blur to hidden element (#1486) - if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( old ) { - elem[ ontype ] = old; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event || window.event ); - - var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related, - handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), - delegateCount = handlers.delegateCount, - args = core_slice.call( arguments ), - run_all = !event.exclusive && !event.namespace, - special = jQuery.event.special[ event.type ] || {}, - handlerQueue = []; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers that should run if there are delegated events - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && !(event.button && event.type === "click") ) { - - for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { - - // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - selMatch = {}; - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - sel = handleObj.selector; - - if ( selMatch[ sel ] === undefined ) { - selMatch[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( selMatch[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, matches: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( handlers.length > delegateCount ) { - handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); - } - - // Run delegates first; they may want to stop propagation beneath us - for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { - matched = handlerQueue[ i ]; - event.currentTarget = matched.elem; - - for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { - handleObj = matched.matches[ j ]; - - // Triggered event must either 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { - - event.data = handleObj.data; - event.handleObj = handleObj; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** - props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, - originalEvent = event, - fixHook = jQuery.event.fixHooks[ event.type ] || {}, - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = jQuery.Event( originalEvent ); - - for ( i = copy.length; i; ) { - prop = copy[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Target should not be a text node (#504, Safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8) - event.metaKey = !!event.metaKey; - - return fixHook.filter? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - - focus: { - delegateType: "focusin" - }, - blur: { - delegateType: "focusout" - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -// Some plugins are using, but it's undocumented/deprecated and will be removed. -// The 1.7 special event interface should provide all the hooks needed now. -jQuery.event.handle = jQuery.event.dispatch; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - var name = "on" + type; - - if ( elem.detachEvent ) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if ( typeof elem[ name ] === "undefined" ) { - elem[ name ] = null; - } - - elem.detachEvent( name, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -function returnFalse() { - return false; -} -function returnTrue() { - return true; -} - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj, - selector = handleObj.selector; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !jQuery._data( form, "_submit_attached" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - jQuery._data( form, "_submit_attached", true ); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event, true ); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - jQuery._data( elem, "_change_attached", true ); - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { // && selector != null - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - bind: function( types, data, fn ) { - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - return this.off( types, null, fn ); - }, - - live: function( types, data, fn ) { - jQuery( this.context ).on( types, this.selector, data, fn ); - return this; - }, - die: function( types, fn ) { - jQuery( this.context ).off( types, this.selector || "**", fn ); - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - // ( namespace ) or ( selector, types [, fn] ) - return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; - - if ( rkeyEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; - } - - if ( rmouseEvent.test( name ) ) { - jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; - } -}); -/*! - * Sizzle CSS Selector Engine - * Copyright 2012 jQuery Foundation and other contributors - * Released under the MIT license - * http://sizzlejs.com/ - */ -(function( window, undefined ) { - -var cachedruns, - assertGetIdNotName, - Expr, - getText, - isXML, - contains, - compile, - sortOrder, - hasDuplicate, - outermostContext, - - baseHasDuplicate = true, - strundefined = "undefined", - - expando = ( "sizcache" + Math.random() ).replace( ".", "" ), - - Token = String, - document = window.document, - docElem = document.documentElement, - dirruns = 0, - done = 0, - pop = [].pop, - push = [].push, - slice = [].slice, - // Use a stripped-down indexOf if a native one is unavailable - indexOf = [].indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - // Augment a function for special use by Sizzle - markFunction = function( fn, value ) { - fn[ expando ] = value == null || value; - return fn; - }, - - createCache = function() { - var cache = {}, - keys = []; - - return markFunction(function( key, value ) { - // Only keep the most recent entries - if ( keys.push( key ) > Expr.cacheLength ) { - delete cache[ keys.shift() ]; - } - - // Retrieve with (key + " ") to avoid collision with native Object.prototype properties (see Issue #157) - return (cache[ key + " " ] = value); - }, cache ); - }, - - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - - // Regex - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors) - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - operators = "([*^$|!~]?=)", - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments not in parens/brackets, - // then attribute selectors and non-pseudos (denoted by :), - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)", - - // For matchExpr.POS and matchExpr.needsContext - pos = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ), - rpseudo = new RegExp( pseudos ), - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/, - - rnot = /^:not/, - rsibling = /[\x20\t\r\n\f]*[+~]/, - rendsWithNot = /:not\($/, - - rheader = /h\d/i, - rinputs = /input|select|textarea|button/i, - - rbackslash = /\\(?!\\)/g, - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "POS": new RegExp( pos, "i" ), - "CHILD": new RegExp( "^:(only|nth|first|last)-child(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - // For use in libraries implementing .is() - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" ) - }, - - // Support - - // Used for testing something on an element - assert = function( fn ) { - var div = document.createElement("div"); - - try { - return fn( div ); - } catch (e) { - return false; - } finally { - // release memory in IE - div = null; - } - }, - - // Check if getElementsByTagName("*") returns only elements - assertTagNameNoComments = assert(function( div ) { - div.appendChild( document.createComment("") ); - return !div.getElementsByTagName("*").length; - }), - - // Check if getAttribute returns normalized href attributes - assertHrefNotNormalized = assert(function( div ) { - div.innerHTML = ""; - return div.firstChild && typeof div.firstChild.getAttribute !== strundefined && - div.firstChild.getAttribute("href") === "#"; - }), - - // Check if attributes should be retrieved by attribute nodes - assertAttributes = assert(function( div ) { - div.innerHTML = ""; - var type = typeof div.lastChild.getAttribute("multiple"); - // IE8 returns a string for some attributes even when not present - return type !== "boolean" && type !== "string"; - }), - - // Check if getElementsByClassName can be trusted - assertUsableClassName = assert(function( div ) { - // Opera can't find a second classname (in 9.6) - div.innerHTML = ""; - if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) { - return false; - } - - // Safari 3.2 caches class attributes and doesn't catch changes - div.lastChild.className = "e"; - return div.getElementsByClassName("e").length === 2; - }), - - // Check if getElementById returns elements by name - // Check if getElementsByName privileges form controls or returns elements by ID - assertUsableName = assert(function( div ) { - // Inject content - div.id = expando + 0; - div.innerHTML = "
"; - docElem.insertBefore( div, docElem.firstChild ); - - // Test - var pass = document.getElementsByName && - // buggy browsers will return fewer than the correct 2 - document.getElementsByName( expando ).length === 2 + - // buggy browsers will return more than the correct 0 - document.getElementsByName( expando + 0 ).length; - assertGetIdNotName = !document.getElementById( expando ); - - // Cleanup - docElem.removeChild( div ); - - return pass; - }); - -// If slice is not available, provide a backup -try { - slice.call( docElem.childNodes, 0 )[0].nodeType; -} catch ( e ) { - slice = function( i ) { - var elem, - results = []; - for ( ; (elem = this[i]); i++ ) { - results.push( elem ); - } - return results; - }; -} - -function Sizzle( selector, context, results, seed ) { - results = results || []; - context = context || document; - var match, elem, xml, m, - nodeType = context.nodeType; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( nodeType !== 1 && nodeType !== 9 ) { - return []; - } - - xml = isXML( context ); - - if ( !xml && !seed ) { - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) { - push.apply( results, slice.call(context.getElementsByClassName( m ), 0) ); - return results; - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed, xml ); -} - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - return Sizzle( expr, null, null, [ elem ] ).length > 0; -}; - -// Returns a function to use in pseudos for input types -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -// Returns a function to use in pseudos for buttons -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -// Returns a function to use in pseudos for positionals -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( nodeType ) { - if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - } else { - - // If no nodeType, this is expected to be an array - for ( ; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } - return ret; -}; - -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -// Element contains another -contains = Sizzle.contains = docElem.contains ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) ); - } : - docElem.compareDocumentPosition ? - function( a, b ) { - return b && !!( a.compareDocumentPosition( b ) & 16 ); - } : - function( a, b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - return false; - }; - -Sizzle.attr = function( elem, name ) { - var val, - xml = isXML( elem ); - - if ( !xml ) { - name = name.toLowerCase(); - } - if ( (val = Expr.attrHandle[ name ]) ) { - return val( elem ); - } - if ( xml || assertAttributes ) { - return elem.getAttribute( name ); - } - val = elem.getAttributeNode( name ); - return val ? - typeof elem[ name ] === "boolean" ? - elem[ name ] ? name : null : - val.specified ? val.value : null : - null; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - // IE6/7 return a modified href - attrHandle: assertHrefNotNormalized ? - {} : - { - "href": function( elem ) { - return elem.getAttribute( "href", 2 ); - }, - "type": function( elem ) { - return elem.getAttribute("type"); - } - }, - - find: { - "ID": assertGetIdNotName ? - function( id, context, xml ) { - if ( typeof context.getElementById !== strundefined && !xml ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - } : - function( id, context, xml ) { - if ( typeof context.getElementById !== strundefined && !xml ) { - var m = context.getElementById( id ); - - return m ? - m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ? - [m] : - undefined : - []; - } - }, - - "TAG": assertTagNameNoComments ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - var elem, - tmp = [], - i = 0; - - for ( ; (elem = results[i]); i++ ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }, - - "NAME": assertUsableName && function( tag, context ) { - if ( typeof context.getElementsByName !== strundefined ) { - return context.getElementsByName( name ); - } - }, - - "CLASS": assertUsableClassName && function( className, context, xml ) { - if ( typeof context.getElementsByClassName !== strundefined && !xml ) { - return context.getElementsByClassName( className ); - } - } - }, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( rbackslash, "" ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 3 xn-component of xn+y argument ([+-]?\d*n|) - 4 sign of xn-component - 5 x of xn-component - 6 sign of y-component - 7 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1] === "nth" ) { - // nth-child requires argument - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) ); - match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" ); - - // other types prohibit arguments - } else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var unquoted, excess; - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - if ( match[3] ) { - match[2] = match[3]; - } else if ( (unquoted = match[4]) ) { - // Only check arguments that contain a pseudo - if ( rpseudo.test(unquoted) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - unquoted = unquoted.slice( 0, excess ); - match[0] = match[0].slice( 0, excess ); - } - match[2] = unquoted; - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - "ID": assertGetIdNotName ? - function( id ) { - id = id.replace( rbackslash, "" ); - return function( elem ) { - return elem.getAttribute("id") === id; - }; - } : - function( id ) { - id = id.replace( rbackslash, "" ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === id; - }; - }, - - "TAG": function( nodeName ) { - if ( nodeName === "*" ) { - return function() { return true; }; - } - nodeName = nodeName.replace( rbackslash, "" ).toLowerCase(); - - return function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ expando ][ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem, context ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.substr( result.length - check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.substr( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, argument, first, last ) { - - if ( type === "nth" ) { - return function( elem ) { - var node, diff, - parent = elem.parentNode; - - if ( first === 1 && last === 0 ) { - return true; - } - - if ( parent ) { - diff = 0; - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - diff++; - if ( elem === node ) { - break; - } - } - } - } - - // Incorporate the offset (or cast to NaN), then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - }; - } - - return function( elem ) { - var node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - /* falls through */ - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - var nodeType; - elem = elem.firstChild; - while ( elem ) { - if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) { - return false; - } - elem = elem.nextSibling; - } - return true; - }, - - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "text": function( elem ) { - var type, attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - (type = elem.type) === "text" && - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type ); - }, - - // Input types - "radio": createInputPseudo("radio"), - "checkbox": createInputPseudo("checkbox"), - "file": createInputPseudo("file"), - "password": createInputPseudo("password"), - "image": createInputPseudo("image"), - - "submit": createButtonPseudo("submit"), - "reset": createButtonPseudo("reset"), - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "focus": function( elem ) { - var doc = elem.ownerDocument; - return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - "active": function( elem ) { - return elem === elem.ownerDocument.activeElement; - }, - - // Positional types - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - for ( var i = 0; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - for ( var i = 1; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - for ( var i = argument < 0 ? argument + length : argument; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - for ( var i = argument < 0 ? argument + length : argument; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -function siblingCheck( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; -} - -sortOrder = docElem.compareDocumentPosition ? - function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - return ( !a.compareDocumentPosition || !b.compareDocumentPosition ? - a.compareDocumentPosition : - a.compareDocumentPosition(b) & 4 - ) ? -1 : 1; - } : - function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - -// Always assume the presence of duplicates if sort doesn't -// pass them to our comparison function (as in Google Chrome). -[0, 0].sort( sortOrder ); -baseHasDuplicate = !hasDuplicate; - -// Document sorting and removing duplicates -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - i = 1, - j = 0; - - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( ; (elem = results[i]); i++ ) { - if ( elem === results[ i - 1 ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - return results; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ expando ][ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( tokens = [] ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - tokens.push( matched = new Token( match.shift() ) ); - soFar = soFar.slice( matched.length ); - - // Cast descendant combinators to space - matched.type = match[0].replace( rtrim, " " ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - - tokens.push( matched = new Token( match.shift() ) ); - soFar = soFar.slice( matched.length ); - matched.type = type; - matched.matches = match; - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && combinator.dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( checkNonElements || elem.nodeType === 1 ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( !xml ) { - var cache, - dirkey = dirruns + " " + doneName + " ", - cachedkey = dirkey + cachedruns; - while ( (elem = elem[ dir ]) ) { - if ( checkNonElements || elem.nodeType === 1 ) { - if ( (cache = elem[ expando ]) === cachedkey ) { - return elem.sizset; - } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) { - if ( elem.sizset ) { - return elem; - } - } else { - elem[ expando ] = cachedkey; - if ( matcher( elem, context, xml ) ) { - elem.sizset = true; - return elem; - } - elem.sizset = false; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( checkNonElements || elem.nodeType === 1 ) { - if ( matcher( elem, context, xml ) ) { - return elem; - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && tokens.slice( 0, i - 1 ).join("").replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && tokens.join("") - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, expandContext ) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), - // Nested matchers should use non-integer dirruns - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.E); - - if ( outermost ) { - outermostContext = context !== document && context; - cachedruns = superMatcher.el; - } - - // Add elements passing elementMatchers directly to results - for ( ; (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - for ( j = 0; (matcher = elementMatchers[j]); j++ ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - cachedruns = ++superMatcher.el; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - for ( j = 0; (matcher = setMatchers[j]); j++ ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - superMatcher.el = 0; - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ expando ][ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed, xml ) { - var i, tokens, token, type, find, - match = tokenize( selector ), - j = match.length; - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && !xml && - Expr.relative[ tokens[1].type ] ) { - - context = Expr.find["ID"]( token.matches[0].replace( rbackslash, "" ), context, xml )[0]; - if ( !context ) { - return results; - } - - selector = selector.slice( tokens.shift().length ); - } - - // Fetch a seed set for right-to-left matching - for ( i = matchExpr["POS"].test( selector ) ? -1 : tokens.length - 1; i >= 0; i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( rbackslash, "" ), - rsibling.test( tokens[0].type ) && context.parentNode || context, - xml - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && tokens.join(""); - if ( !selector ) { - push.apply( results, slice.call( seed, 0 ) ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - xml, - results, - rsibling.test( selector ) - ); - return results; -} - -if ( document.querySelectorAll ) { - (function() { - var disconnectedMatch, - oldSelect = select, - rescape = /'|\\/g, - rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, - - // qSa(:focus) reports false when true (Chrome 21), no need to also add to buggyMatches since matches checks buggyQSA - // A support test would require too much code (would include document ready) - rbuggyQSA = [ ":focus" ], - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - // A support test would require too much code (would include document ready) - // just skip matchesSelector for :active - rbuggyMatches = [ ":active" ], - matches = docElem.matchesSelector || - docElem.mozMatchesSelector || - docElem.webkitMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector; - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explictly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // IE8 - Some boolean attributes are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here (do not put tests after this one) - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - - // Opera 10-12/IE9 - ^= $= *= and empty values - // Should not select anything - div.innerHTML = "

"; - if ( div.querySelectorAll("[test^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here (do not put tests after this one) - div.innerHTML = ""; - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push(":enabled", ":disabled"); - } - }); - - // rbuggyQSA always contains :focus, so no need for a length check - rbuggyQSA = /* rbuggyQSA.length && */ new RegExp( rbuggyQSA.join("|") ); - - select = function( selector, context, results, seed, xml ) { - // Only use querySelectorAll when not filtering, - // when this is not xml, - // and when no QSA bugs apply - if ( !seed && !xml && !rbuggyQSA.test( selector ) ) { - var groups, i, - old = true, - nid = expando, - newContext = context, - newSelector = context.nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + groups[i].join(""); - } - newContext = rsibling.test( selector ) && context.parentNode || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, slice.call( newContext.querySelectorAll( - newSelector - ), 0 ) ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - - return oldSelect( selector, context, results, seed, xml ); - }; - - if ( matches ) { - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - try { - matches.call( div, "[test!='']:sizzle" ); - rbuggyMatches.push( "!=", pseudos ); - } catch ( e ) {} - }); - - // rbuggyMatches always contains :active and :focus, so no need for a length check - rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") ); - - Sizzle.matchesSelector = function( elem, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - // rbuggyMatches always contains :active, so no need for an existence check - if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && !rbuggyQSA.test( expr ) ) { - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, null, null, [ elem ] ).length > 0; - }; - } - })(); -} - -// Deprecated -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Back-compat -function setFilters() {} -Expr.filters = setFilters.prototype = Expr.pseudos; -Expr.setFilters = new setFilters(); - -// Override sizzle attribute retrieval -Sizzle.attr = jQuery.attr; -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})( window ); -var runtil = /Until$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - isSimple = /^.[^:#\[\.,]*$/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var i, l, length, n, r, ret, - self = this; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - ret = this.pushStack( "", "find", selector ); - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; - - return this.filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( - typeof selector === "string" ? - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - rneedsContext.test( selector ) ? - jQuery( selector, this.context ).index( this[0] ) >= 0 : - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - ret = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - cur = this[i]; - - while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - } - cur = cur.parentNode; - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -jQuery.fn.andSelf = jQuery.fn.addBack; - -// A painfully simple check to see if an element is disconnected -// from a document (should be improved, where feasible). -function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; -} - -function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( this.length > 1 && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - - return this.pushStack( ret, name, core_slice.call( arguments ).join(",") ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, keep ) { - - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return ( elem === qualifier ) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; - }); -} -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /]", "i"), - rcheckableType = /^(?:checkbox|radio)$/, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /\/(java|ecma)script/i, - rcleanScript = /^\s*\s*$/g, - wrapMap = { - option: [ 1, "" ], - legend: [ 1, "
", "
" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - col: [ 2, "", "
" ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement("div") ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, -// unless wrapped in a div with non-breaking characters in front of it. -if ( !jQuery.support.htmlSerialize ) { - wrapMap._default = [ 1, "X
", "
" ]; -} - -jQuery.fn.extend({ - text: function( value ) { - return jQuery.access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - wrapAll: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapAll( html.call(this, i) ); - }); - } - - if ( this[0] ) { - // The elements to wrap the target around - var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); - - if ( this[0].parentNode ) { - wrap.insertBefore( this[0] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { - elem = elem.firstChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function(i) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - }, - - append: function() { - return this.domManip(arguments, true, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 ) { - this.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip(arguments, true, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 ) { - this.insertBefore( elem, this.firstChild ); - } - }); - }, - - before: function() { - if ( !isDisconnected( this[0] ) ) { - return this.domManip(arguments, false, function( elem ) { - this.parentNode.insertBefore( elem, this ); - }); - } - - if ( arguments.length ) { - var set = jQuery.clean( arguments ); - return this.pushStack( jQuery.merge( set, this ), "before", this.selector ); - } - }, - - after: function() { - if ( !isDisconnected( this[0] ) ) { - return this.domManip(arguments, false, function( elem ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - }); - } - - if ( arguments.length ) { - var set = jQuery.clean( arguments ); - return this.pushStack( jQuery.merge( this, set ), "after", this.selector ); - } - }, - - // keepData is for internal use only--do not document - remove: function( selector, keepData ) { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( !selector || jQuery.filter( selector, [ elem ] ).length ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( elem.getElementsByTagName("*") ); - jQuery.cleanData( [ elem ] ); - } - - if ( elem.parentNode ) { - elem.parentNode.removeChild( elem ); - } - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( elem.getElementsByTagName("*") ); - } - - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return jQuery.access( this, function( value ) { - var elem = this[0] || {}, - i = 0, - l = this.length; - - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for (; i < l; i++ ) { - // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if ( elem.nodeType === 1 ) { - jQuery.cleanData( elem.getElementsByTagName( "*" ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch(e) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function( value ) { - if ( !isDisconnected( this[0] ) ) { - // Make sure that the elements are removed from the DOM before they are inserted - // this can help fix replacing a parent with child elements - if ( jQuery.isFunction( value ) ) { - return this.each(function(i) { - var self = jQuery(this), old = self.html(); - self.replaceWith( value.call( this, i, old ) ); - }); - } - - if ( typeof value !== "string" ) { - value = jQuery( value ).detach(); - } - - return this.each(function() { - var next = this.nextSibling, - parent = this.parentNode; - - jQuery( this ).remove(); - - if ( next ) { - jQuery(next).before( value ); - } else { - jQuery(parent).append( value ); - } - }); - } - - return this.length ? - this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) : - this; - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, table, callback ) { - - // Flatten any nested arrays - args = [].concat.apply( [], args ); - - var results, first, fragment, iNoClone, - i = 0, - value = args[0], - scripts = [], - l = this.length; - - // We can't cloneNode fragments that contain checked, in WebKit - if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) { - return this.each(function() { - jQuery(this).domManip( args, table, callback ); - }); - } - - if ( jQuery.isFunction(value) ) { - return this.each(function(i) { - var self = jQuery(this); - args[0] = value.call( this, i, table ? self.html() : undefined ); - self.domManip( args, table, callback ); - }); - } - - if ( this[0] ) { - results = jQuery.buildFragment( args, this, scripts ); - fragment = results.fragment; - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - table = table && jQuery.nodeName( first, "tr" ); - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - // Fragments from the fragment cache must always be cloned and never used in place. - for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) { - callback.call( - table && jQuery.nodeName( this[i], "table" ) ? - findOrAppend( this[i], "tbody" ) : - this[i], - i === iNoClone ? - fragment : - jQuery.clone( fragment, true, true ) - ); - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - - if ( scripts.length ) { - jQuery.each( scripts, function( i, elem ) { - if ( elem.src ) { - if ( jQuery.ajax ) { - jQuery.ajax({ - url: elem.src, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } else { - jQuery.error("no ajax"); - } - } else { - jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) ); - } - - if ( elem.parentNode ) { - elem.parentNode.removeChild( elem ); - } - }); - } - } - - return this; - } -}); - -function findOrAppend( elem, tag ) { - return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) ); -} - -function cloneCopyEvent( src, dest ) { - - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { - return; - } - - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; - - if ( events ) { - delete curData.handle; - curData.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); - } -} - -function cloneFixAttributes( src, dest ) { - var nodeName; - - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; - } - - // clearAttributes removes the attributes, which we don't want, - // but also removes the attachEvent events, which we *do* want - if ( dest.clearAttributes ) { - dest.clearAttributes(); - } - - // mergeAttributes, in contrast, only merges back on the - // original attributes, not the events - if ( dest.mergeAttributes ) { - dest.mergeAttributes( src ); - } - - nodeName = dest.nodeName.toLowerCase(); - - if ( nodeName === "object" ) { - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) { - dest.innerHTML = src.innerHTML; - } - - } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - - // IE blanks contents when cloning scripts - } else if ( nodeName === "script" && dest.text !== src.text ) { - dest.text = src.text; - } - - // Event data gets referenced instead of copied if the expando - // gets copied too - dest.removeAttribute( jQuery.expando ); -} - -jQuery.buildFragment = function( args, context, scripts ) { - var fragment, cacheable, cachehit, - first = args[ 0 ]; - - // Set context from what may come in as undefined or a jQuery collection or a node - // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 & - // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception - context = context || document; - context = !context.nodeType && context[0] || context; - context = context.ownerDocument || context; - - // Only cache "small" (1/2 KB) HTML strings that are associated with the main document - // Cloning options loses the selected state, so don't cache them - // IE 6 doesn't like it when you put or elements in a fragment - // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache - // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501 - if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document && - first.charAt(0) === "<" && !rnocache.test( first ) && - (jQuery.support.checkClone || !rchecked.test( first )) && - (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) { - - // Mark cacheable and look for a hit - cacheable = true; - fragment = jQuery.fragments[ first ]; - cachehit = fragment !== undefined; - } - - if ( !fragment ) { - fragment = context.createDocumentFragment(); - jQuery.clean( args, context, fragment, scripts ); - - // Update the cache, but only store false - // unless this is a second parsing of the same content - if ( cacheable ) { - jQuery.fragments[ first ] = cachehit && fragment; - } - } - - return { fragment: fragment, cacheable: cacheable }; -}; - -jQuery.fragments = {}; - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - i = 0, - ret = [], - insert = jQuery( selector ), - l = insert.length, - parent = this.length === 1 && this[0].parentNode; - - if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) { - insert[ original ]( this[0] ); - return this; - } else { - for ( ; i < l; i++ ) { - elems = ( i > 0 ? this.clone(true) : this ).get(); - jQuery( insert[i] )[ original ]( elems ); - ret = ret.concat( elems ); - } - - return this.pushStack( ret, name, insert.selector ); - } - }; -}); - -function getAll( elem ) { - if ( typeof elem.getElementsByTagName !== "undefined" ) { - return elem.getElementsByTagName( "*" ); - - } else if ( typeof elem.querySelectorAll !== "undefined" ) { - return elem.querySelectorAll( "*" ); - - } else { - return []; - } -} - -// Used in clean, fixes the defaultChecked property -function fixDefaultChecked( elem ) { - if ( rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var srcElements, - destElements, - i, - clone; - - if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); - } - - if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { - // IE copies events bound via attachEvent when using cloneNode. - // Calling detachEvent on the clone will also remove the events - // from the original. In order to get around this, we use some - // proprietary methods to clear the events. Thanks to MooTools - // guys for this hotness. - - cloneFixAttributes( elem, clone ); - - // Using Sizzle here is crazy slow, so we use getElementsByTagName instead - srcElements = getAll( elem ); - destElements = getAll( clone ); - - // Weird iteration because IE will replace the length property - // with an element if you are cloning the body and one of the - // elements on the page has a name or id of "length" - for ( i = 0; srcElements[i]; ++i ) { - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[i] ) { - cloneFixAttributes( srcElements[i], destElements[i] ); - } - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - cloneCopyEvent( elem, clone ); - - if ( deepDataAndEvents ) { - srcElements = getAll( elem ); - destElements = getAll( clone ); - - for ( i = 0; srcElements[i]; ++i ) { - cloneCopyEvent( srcElements[i], destElements[i] ); - } - } - } - - srcElements = destElements = null; - - // Return the cloned set - return clone; - }, - - clean: function( elems, context, fragment, scripts ) { - var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags, - safe = context === document && safeFragment, - ret = []; - - // Ensure that context is a document - if ( !context || typeof context.createDocumentFragment === "undefined" ) { - context = document; - } - - // Use the already-created safe fragment if context permits - for ( i = 0; (elem = elems[i]) != null; i++ ) { - if ( typeof elem === "number" ) { - elem += ""; - } - - if ( !elem ) { - continue; - } - - // Convert html string into DOM nodes - if ( typeof elem === "string" ) { - if ( !rhtml.test( elem ) ) { - elem = context.createTextNode( elem ); - } else { - // Ensure a safe container in which to render the html - safe = safe || createSafeFragment( context ); - div = context.createElement("div"); - safe.appendChild( div ); - - // Fix "XHTML"-style tags in all browsers - elem = elem.replace(rxhtmlTag, "<$1>"); - - // Go to html and back, then peel off extra wrappers - tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - depth = wrap[0]; - div.innerHTML = wrap[1] + elem + wrap[2]; - - // Move to the right depth - while ( depth-- ) { - div = div.lastChild; - } - - // Remove IE's autoinserted from table fragments - if ( !jQuery.support.tbody ) { - - // String was a , *may* have spurious - hasBody = rtbody.test(elem); - tbody = tag === "table" && !hasBody ? - div.firstChild && div.firstChild.childNodes : - - // String was a bare or - wrap[1] === "
" && !hasBody ? - div.childNodes : - []; - - for ( j = tbody.length - 1; j >= 0 ; --j ) { - if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) { - tbody[ j ].parentNode.removeChild( tbody[ j ] ); - } - } - } - - // IE completely kills leading whitespace when innerHTML is used - if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild ); - } - - elem = div.childNodes; - - // Take out of fragment container (we need a fresh div each time) - div.parentNode.removeChild( div ); - } - } - - if ( elem.nodeType ) { - ret.push( elem ); - } else { - jQuery.merge( ret, elem ); - } - } - - // Fix #11356: Clear elements from safeFragment - if ( div ) { - elem = div = safe = null; - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !jQuery.support.appendChecked ) { - for ( i = 0; (elem = ret[i]) != null; i++ ) { - if ( jQuery.nodeName( elem, "input" ) ) { - fixDefaultChecked( elem ); - } else if ( typeof elem.getElementsByTagName !== "undefined" ) { - jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked ); - } - } - } - - // Append elements to a provided document fragment - if ( fragment ) { - // Special handling of each script element - handleScript = function( elem ) { - // Check if we consider it executable - if ( !elem.type || rscriptType.test( elem.type ) ) { - // Detach the script and store it in the scripts array (if provided) or the fragment - // Return truthy to indicate that it has been handled - return scripts ? - scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) : - fragment.appendChild( elem ); - } - }; - - for ( i = 0; (elem = ret[i]) != null; i++ ) { - // Check if we're done after handling an executable script - if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) { - // Append to fragment and handle embedded scripts - fragment.appendChild( elem ); - if ( typeof elem.getElementsByTagName !== "undefined" ) { - // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration - jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript ); - - // Splice the scripts into ret after their former ancestor and advance our index beyond them - ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); - i += jsTags.length; - } - } - } - } - - return ret; - }, - - cleanData: function( elems, /* internal */ acceptData ) { - var data, id, elem, type, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = jQuery.support.deleteExpando, - special = jQuery.event.special; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( acceptData || jQuery.acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; - - if ( data ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( deleteExpando ) { - delete elem[ internalKey ]; - - } else if ( elem.removeAttribute ) { - elem.removeAttribute( internalKey ); - - } else { - elem[ internalKey ] = null; - } - - jQuery.deletedIds.push( id ); - } - } - } - } - } -}); -// Limit scope pollution from any deprecated API -(function() { - -var matched, browser; - -// Use of jQuery.browser is frowned upon. -// More details: http://api.jquery.com/jQuery.browser -// jQuery.uaMatch maintained for back-compat -jQuery.uaMatch = function( ua ) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || - /(webkit)[ \/]([\w.]+)/.exec( ua ) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || - /(msie) ([\w.]+)/.exec( ua ) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; -}; - -matched = jQuery.uaMatch( navigator.userAgent ); -browser = {}; - -if ( matched.browser ) { - browser[ matched.browser ] = true; - browser.version = matched.version; -} - -// Chrome is Webkit, but Webkit is also Safari. -if ( browser.chrome ) { - browser.webkit = true; -} else if ( browser.webkit ) { - browser.safari = true; -} - -jQuery.browser = browser; - -jQuery.sub = function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; -}; - -})(); -var curCSS, iframe, iframeDoc, - ralpha = /alpha\([^)]*\)/i, - ropacity = /opacity=([^)]*)/, - rposition = /^(top|right|bottom|left)$/, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), - rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), - rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ), - elemdisplay = { BODY: "block" }, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = [ "Top", "Right", "Bottom", "Left" ], - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], - - eventsToggle = jQuery.fn.toggle; - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( style, name ) { - - // shortcut for names that are not vendor prefixed - if ( name in style ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in style ) { - return name; - } - } - - return origName; -} - -function isHidden( elem, el ) { - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); -} - -function showHide( elements, show ) { - var elem, display, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - values[ index ] = jQuery._data( elem, "olddisplay" ); - if ( show ) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && elem.style.display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); - } - } else { - display = curCSS( elem, "display" ); - - if ( !values[ index ] && display !== "none" ) { - jQuery._data( elem, "olddisplay", display ); - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.fn.extend({ - css: function( name, value ) { - return jQuery.access( this, function( elem, name, value ) { - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state, fn2 ) { - var bool = typeof state === "boolean"; - - if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) { - return eventsToggle.apply( this, arguments ); - } - - return this.each(function() { - if ( bool ? state : isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - }); - } -}); - -jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - - } - } - } - }, - - // Exclude the following css properties to add px - cssNumber: { - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if ( type === "string" && (ret = rrelNum.exec( value )) ) { - value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if ( value == null || type === "number" && isNaN( value ) ) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( type === "number" && !jQuery.cssNumber[ origName ] ) { - value += "px"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - // Wrapped to prevent IE from throwing errors when 'invalid' values are provided - // Fixes bug #5509 - try { - style[ name ] = value; - } catch(e) {} - } - - } else { - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, numeric, extra ) { - var val, num, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( numeric || extra !== undefined ) { - num = parseFloat( val ); - return numeric || jQuery.isNumeric( num ) ? num || 0 : val; - } - return val; - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations - swap: function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - } -}); - -// NOTE: To any future maintainer, we've window.getComputedStyle -// because jsdom on node.js will break without it. -if ( window.getComputedStyle ) { - curCSS = function( elem, name ) { - var ret, width, minWidth, maxWidth, - computed = window.getComputedStyle( elem, null ), - style = elem.style; - - if ( computed ) { - - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; - }; -} else if ( document.documentElement.currentStyle ) { - curCSS = function( elem, name ) { - var left, rsLeft, - ret = elem.currentStyle && elem.currentStyle[ name ], - style = elem.style; - - // Avoid setting ret to empty string here - // so we don't default to auto - if ( ret == null && style && style[ name ] ) { - ret = style[ name ]; - } - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - // but not position css attributes, as those are proportional to the parent element instead - // and we can't measure the parent instead because it might trigger a "stacking dolls" problem - if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { - - // Remember the original values - left = style.left; - rsLeft = elem.runtimeStyle && elem.runtimeStyle.left; - - // Put in the new values to get a computed value out - if ( rsLeft ) { - elem.runtimeStyle.left = elem.currentStyle.left; - } - style.left = name === "fontSize" ? "1em" : ret; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - if ( rsLeft ) { - elem.runtimeStyle.left = rsLeft; - } - } - - return ret === "" ? "auto" : ret; - }; -} - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - // we use jQuery.css instead of curCSS here - // because of the reliableMarginRight CSS hook! - val += jQuery.css( elem, extra + cssExpand[ i ], true ); - } - - // From this point on we use curCSS for maximum performance (relevant in animations) - if ( isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0; - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; - } - } else { - // at this point, extra isn't content, so add padding - val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0; - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0; - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - valueIsBorderBox = true, - isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox - ) - ) + "px"; -} - - -// Try to determine the default display value of an element -function css_defaultDisplay( nodeName ) { - if ( elemdisplay[ nodeName ] ) { - return elemdisplay[ nodeName ]; - } - - var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ), - display = elem.css("display"); - elem.remove(); - - // If the simple way fails, - // get element's real default display by attaching it to a temp iframe - if ( display === "none" || display === "" ) { - // Use the already-created iframe if possible - iframe = document.body.appendChild( - iframe || jQuery.extend( document.createElement("iframe"), { - frameBorder: 0, - width: 0, - height: 0 - }) - ); - - // Create a cacheable copy of the iframe document on first call. - // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML - // document to it; WebKit & Firefox won't allow reusing the iframe document. - if ( !iframeDoc || !iframe.createElement ) { - iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document; - iframeDoc.write(""); - iframeDoc.close(); - } - - elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) ); - - display = curCSS( elem, "display" ); - document.body.removeChild( iframe ); - } - - // Store the correct default display - elemdisplay[ nodeName ] = display; - - return display; -} - -jQuery.each([ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - // certain elements can have dimension info if we invisibly show them - // however, it must have a current display style that would benefit from this - if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) { - return jQuery.swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - }); - } else { - return getWidthOrHeight( elem, name, extra ); - } - } - }, - - set: function( elem, value, extra ) { - return setPositiveNumber( elem, value, extra ? - augmentWidthOrHeight( - elem, - name, - extra, - jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box" - ) : 0 - ); - } - }; -}); - -if ( !jQuery.support.opacity ) { - jQuery.cssHooks.opacity = { - get: function( elem, computed ) { - // IE uses filters for opacity - return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ? - ( 0.01 * parseFloat( RegExp.$1 ) ) + "" : - computed ? "1" : ""; - }, - - set: function( elem, value ) { - var style = elem.style, - currentStyle = elem.currentStyle, - opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", - filter = currentStyle && currentStyle.filter || style.filter || ""; - - // IE has trouble with opacity if it does not have layout - // Force it by setting the zoom level - style.zoom = 1; - - // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652 - if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" && - style.removeAttribute ) { - - // Setting style.filter to null, "" & " " still leave "filter:" in the cssText - // if "filter:" is present at all, clearType is disabled, we want to avoid this - // style.removeAttribute is IE Only, but so apparently is this code path... - style.removeAttribute( "filter" ); - - // if there there is no filter style applied in a css rule, we are done - if ( currentStyle && !currentStyle.filter ) { - return; - } - } - - // otherwise, set new filter values - style.filter = ralpha.test( filter ) ? - filter.replace( ralpha, opacity ) : - filter + " " + opacity; - } - }; -} - -// These hooks cannot be added until DOM ready because the support test -// for it is not run until after DOM ready -jQuery(function() { - if ( !jQuery.support.reliableMarginRight ) { - jQuery.cssHooks.marginRight = { - get: function( elem, computed ) { - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - // Work around by temporarily setting element display to inline-block - return jQuery.swap( elem, { "display": "inline-block" }, function() { - if ( computed ) { - return curCSS( elem, "marginRight" ); - } - }); - } - }; - } - - // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 - // getComputedStyle returns percent when specified for top/left/bottom/right - // rather than make the css module depend on the offset module, we just check for it here - if ( !jQuery.support.pixelPosition && jQuery.fn.position ) { - jQuery.each( [ "top", "left" ], function( i, prop ) { - jQuery.cssHooks[ prop ] = { - get: function( elem, computed ) { - if ( computed ) { - var ret = curCSS( elem, prop ); - // if curCSS returns percentage, fallback to offset - return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret; - } - } - }; - }); - } - -}); - -if ( jQuery.expr && jQuery.expr.filters ) { - jQuery.expr.filters.hidden = function( elem ) { - return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none"); - }; - - jQuery.expr.filters.visible = function( elem ) { - return !jQuery.expr.filters.hidden( elem ); - }; -} - -// These hooks are used by animate to expand properties -jQuery.each({ - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i, - - // assumes a single number if not a string - parts = typeof value === "string" ? value.split(" ") : [ value ], - expanded = {}; - - for ( i = 0; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -}); -var r20 = /%20/g, - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, - rselectTextarea = /^(?:select|textarea)/i; - -jQuery.fn.extend({ - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map(function(){ - return this.elements ? jQuery.makeArray( this.elements ) : this; - }) - .filter(function(){ - return this.name && !this.disabled && - ( this.checked || rselectTextarea.test( this.nodeName ) || - rinput.test( this.type ) ); - }) - .map(function( i, elem ){ - var val = jQuery( this ).val(); - - return val == null ? - null : - jQuery.isArray( val ) ? - jQuery.map( val, function( val, i ){ - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - }) : - { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - }).get(); - } -}); - -//Serialize an array of form elements or a set of -//key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, value ) { - // If value is a function, invoke it and return its value - value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); - s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); - }; - - // Set traditional to true for jQuery <= 1.3.2 behavior. - if ( traditional === undefined ) { - traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - }); - - } else { - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ).replace( r20, "+" ); -}; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( jQuery.isArray( obj ) ) { - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - // If array item is non-scalar (array or object), encode its - // numeric index to resolve deserialization ambiguity issues. - // Note that rack (as of 1.0.0) can't currently deserialize - // nested arrays properly, and attempting to do so may cause - // a server error. Possible fixes are to modify rack's - // deserialization algorithm or to provide an option or flag - // to force array serialization to be shallow. - buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add ); - } - }); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - // Serialize scalar item. - add( prefix, obj ); - } -} -var - // Document location - ajaxLocParts, - ajaxLocation, - - rhash = /#.*$/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - rquery = /\?/, - rscript = /)<[^<]*)*<\/script>/gi, - rts = /([?&])_=[^&]*/, - rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/, - - // Keep a copy of the old load method - _load = jQuery.fn.load, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = ["*/"] + ["*"]; - -// #8138, IE may throw an exception when accessing -// a field from window.location if document.domain has been set -try { - ajaxLocation = location.href; -} catch( e ) { - // Use the href attribute of an A element - // since IE will modify it given document.location - ajaxLocation = document.createElement( "a" ); - ajaxLocation.href = ""; - ajaxLocation = ajaxLocation.href; -} - -// Segment location into parts -ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, list, placeBefore, - dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ), - i = 0, - length = dataTypes.length; - - if ( jQuery.isFunction( func ) ) { - // For each dataType in the dataTypeExpression - for ( ; i < length; i++ ) { - dataType = dataTypes[ i ]; - // We control if we're asked to add before - // any existing element - placeBefore = /^\+/.test( dataType ); - if ( placeBefore ) { - dataType = dataType.substr( 1 ) || "*"; - } - list = structure[ dataType ] = structure[ dataType ] || []; - // then we add to the structure accordingly - list[ placeBefore ? "unshift" : "push" ]( func ); - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR, - dataType /* internal */, inspected /* internal */ ) { - - dataType = dataType || options.dataTypes[ 0 ]; - inspected = inspected || {}; - - inspected[ dataType ] = true; - - var selection, - list = structure[ dataType ], - i = 0, - length = list ? list.length : 0, - executeOnly = ( structure === prefilters ); - - for ( ; i < length && ( executeOnly || !selection ); i++ ) { - selection = list[ i ]( options, originalOptions, jqXHR ); - // If we got redirected to another dataType - // we try there if executing only and not done already - if ( typeof selection === "string" ) { - if ( !executeOnly || inspected[ selection ] ) { - selection = undefined; - } else { - options.dataTypes.unshift( selection ); - selection = inspectPrefiltersOrTransports( - structure, options, originalOptions, jqXHR, selection, inspected ); - } - } - } - // If we're only executing or nothing was selected - // we try the catchall dataType if not done already - if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) { - selection = inspectPrefiltersOrTransports( - structure, options, originalOptions, jqXHR, "*", inspected ); - } - // unnecessary when only executing (prefilters) - // but it'll be ignored by the caller in that case - return selection; -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } -} - -jQuery.fn.load = function( url, params, callback ) { - if ( typeof url !== "string" && _load ) { - return _load.apply( this, arguments ); - } - - // Don't do a request if no elements are being requested - if ( !this.length ) { - return this; - } - - var selector, type, response, - self = this, - off = url.indexOf(" "); - - if ( off >= 0 ) { - selector = url.slice( off, url.length ); - url = url.slice( 0, off ); - } - - // If it's a function - if ( jQuery.isFunction( params ) ) { - - // We assume that it's the callback - callback = params; - params = undefined; - - // Otherwise, build a param string - } else if ( params && typeof params === "object" ) { - type = "POST"; - } - - // Request the remote document - jQuery.ajax({ - url: url, - - // if "type" variable is undefined, then "GET" method will be used - type: type, - dataType: "html", - data: params, - complete: function( jqXHR, status ) { - if ( callback ) { - self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] ); - } - } - }).done(function( responseText ) { - - // Save response for use in complete callback - response = arguments; - - // See if a selector was specified - self.html( selector ? - - // Create a dummy div to hold the results - jQuery("
") - - // inject the contents of the document in, removing the scripts - // to avoid any 'Permission Denied' errors in IE - .append( responseText.replace( rscript, "" ) ) - - // Locate the specified elements - .find( selector ) : - - // If not, just inject the full result - responseText ); - - }); - - return this; -}; - -// Attach a bunch of functions for handling common AJAX events -jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){ - jQuery.fn[ o ] = function( f ){ - return this.on( o, f ); - }; -}); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - // shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - return jQuery.ajax({ - type: method, - url: url, - data: data, - success: callback, - dataType: type - }); - }; -}); - -jQuery.extend({ - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - if ( settings ) { - // Building a settings object - ajaxExtend( target, jQuery.ajaxSettings ); - } else { - // Extending ajaxSettings - settings = target; - target = jQuery.ajaxSettings; - } - ajaxExtend( target, settings ); - return target; - }, - - ajaxSettings: { - url: ajaxLocation, - isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), - global: true, - type: "GET", - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - processData: true, - async: true, - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - xml: "application/xml, text/xml", - html: "text/html", - text: "text/plain", - json: "application/json, text/javascript", - "*": allTypes - }, - - contents: { - xml: /xml/, - html: /html/, - json: /json/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText" - }, - - // List of data converters - // 1) key format is "source_type destination_type" (a single space in-between) - // 2) the catchall symbol "*" can be used for source_type - converters: { - - // Convert anything to text - "* text": window.String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": jQuery.parseJSON, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - context: true, - url: true - } - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var // ifModified key - ifModifiedKey, - // Response headers - responseHeadersString, - responseHeaders, - // transport - transport, - // timeout handle - timeoutTimer, - // Cross-domain detection vars - parts, - // To know if global events are to be dispatched - fireGlobals, - // Loop variable - i, - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - // Callbacks context - callbackContext = s.context || s, - // Context for global events - // It's the callbackContext if one was provided in the options - // and if it's a DOM node or a jQuery collection - globalEventContext = callbackContext !== s && - ( callbackContext.nodeType || callbackContext instanceof jQuery ) ? - jQuery( callbackContext ) : jQuery.event, - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - // Status-dependent callbacks - statusCode = s.statusCode || {}, - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - // The jqXHR state - state = 0, - // Default abort message - strAbort = "canceled", - // Fake xhr - jqXHR = { - - readyState: 0, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( !state ) { - var lname = name.toLowerCase(); - name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Raw string - getAllResponseHeaders: function() { - return state === 2 ? responseHeadersString : null; - }, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( state === 2 ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[1].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match === undefined ? null : match; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( !state ) { - s.mimeType = type; - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - statusText = statusText || strAbort; - if ( transport ) { - transport.abort( statusText ); - } - done( 0, statusText ); - return this; - } - }; - - // Callback for when everything is done - // It is defined here because jslint complains if it is declared - // at the end of the function (which would be more logical and readable) - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Called once - if ( state === 2 ) { - return; - } - - // State is "done" now - state = 2; - - // Clear timeout if it exists - if ( timeoutTimer ) { - clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // If successful, handle type chaining - if ( status >= 200 && status < 300 || status === 304 ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - - modified = jqXHR.getResponseHeader("Last-Modified"); - if ( modified ) { - jQuery.lastModified[ ifModifiedKey ] = modified; - } - modified = jqXHR.getResponseHeader("Etag"); - if ( modified ) { - jQuery.etag[ ifModifiedKey ] = modified; - } - } - - // If not modified - if ( status === 304 ) { - - statusText = "notmodified"; - isSuccess = true; - - // If we have data - } else { - - isSuccess = ajaxConvert( s, response ); - statusText = isSuccess.state; - success = isSuccess.data; - error = isSuccess.error; - isSuccess = !error; - } - } else { - // We extract error from statusText - // then normalize statusText and status for non-aborts - error = statusText; - if ( !statusText || status ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ), - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - // Attach deferreds - deferred.promise( jqXHR ); - jqXHR.success = jqXHR.done; - jqXHR.error = jqXHR.fail; - jqXHR.complete = completeDeferred.add; - - // Status-dependent callbacks - jqXHR.statusCode = function( map ) { - if ( map ) { - var tmp; - if ( state < 2 ) { - for ( tmp in map ) { - statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ]; - } - } else { - tmp = map[ jqXHR.status ]; - jqXHR.always( tmp ); - } - } - return this; - }; - - // Remove hash character (#7531: and string promotion) - // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) - // We also use the url parameter if available - s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); - - // Extract dataTypes list - s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace ); - - // A cross-domain request is in order when we have a protocol:host:port mismatch - if ( s.crossDomain == null ) { - parts = rurl.exec( s.url.toLowerCase() ); - s.crossDomain = !!( parts && - ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || - ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) != - ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) ) - ); - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( state === 2 ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - fireGlobals = s.global; - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // If data is available, append data to url - if ( s.data ) { - s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data; - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Get ifModifiedKey before adding the anti-cache parameter - ifModifiedKey = s.url; - - // Add anti-cache in url if needed - if ( s.cache === false ) { - - var ts = jQuery.now(), - // try replacing _= if it is there - ret = s.url.replace( rts, "$1_=" + ts ); - - // if nothing was replaced, add timestamp to the end - s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - ifModifiedKey = ifModifiedKey || s.url; - if ( jQuery.lastModified[ ifModifiedKey ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] ); - } - if ( jQuery.etag[ ifModifiedKey ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] ); - } - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ? - s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { - // Abort if not done already and return - return jqXHR.abort(); - - } - - // aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - for ( i in { success: 1, error: 1, complete: 1 } ) { - jqXHR[ i ]( s[ i ] ); - } - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = setTimeout( function(){ - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - state = 1; - transport.send( requestHeaders, done ); - } catch (e) { - // Propagate exception as error if not done - if ( state < 2 ) { - done( -1, e ); - // Simply rethrow otherwise - } else { - throw e; - } - } - } - - return jqXHR; - }, - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {} - -}); - -/* Handles responses to an ajax request: - * - sets all responseXXX fields accordingly - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes, - responseFields = s.responseFields; - - // Fill responseXXX fields - for ( type in responseFields ) { - if ( type in responses ) { - jqXHR[ responseFields[type] ] = responses[ type ]; - } - } - - // Remove auto dataType and get content-type in the process - while( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "content-type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -// Chain conversions given the request and the original response -function ajaxConvert( s, response ) { - - var conv, conv2, current, tmp, - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(), - prev = dataTypes[ 0 ], - converters = {}, - i = 0; - - // Apply the dataFilter if provided - if ( s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - // Convert to each sequential dataType, tolerating list modification - for ( ; (current = dataTypes[++i]); ) { - - // There's only work to do if current dataType is non-auto - if ( current !== "*" ) { - - // Convert response if prev dataType is non-auto and differs from current - if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split(" "); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.splice( i--, 0, current ); - } - - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s["throws"] ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current }; - } - } - } - } - - // Update prev for next iteration - prev = current; - } - } - - return { state: "success", data: response }; -} -var oldCallbacks = [], - rquestion = /\?/, - rjsonp = /(=)\?(?=&|$)|\?\?/, - nonce = jQuery.now(); - -// Default jsonp settings -jQuery.ajaxSetup({ - jsonp: "callback", - jsonpCallback: function() { - var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); - this[ callback ] = true; - return callback; - } -}); - -// Detect, normalize options and install callbacks for jsonp requests -jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { - - var callbackName, overwritten, responseContainer, - data = s.data, - url = s.url, - hasCallback = s.jsonp !== false, - replaceInUrl = hasCallback && rjsonp.test( url ), - replaceInData = hasCallback && !replaceInUrl && typeof data === "string" && - !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && - rjsonp.test( data ); - - // Handle iff the expected data type is "jsonp" or we have a parameter to set - if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) { - - // Get callback name, remembering preexisting value associated with it - callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? - s.jsonpCallback() : - s.jsonpCallback; - overwritten = window[ callbackName ]; - - // Insert callback into url or form data - if ( replaceInUrl ) { - s.url = url.replace( rjsonp, "$1" + callbackName ); - } else if ( replaceInData ) { - s.data = data.replace( rjsonp, "$1" + callbackName ); - } else if ( hasCallback ) { - s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; - } - - // Use data converter to retrieve json after script execution - s.converters["script json"] = function() { - if ( !responseContainer ) { - jQuery.error( callbackName + " was not called" ); - } - return responseContainer[ 0 ]; - }; - - // force json dataType - s.dataTypes[ 0 ] = "json"; - - // Install callback - window[ callbackName ] = function() { - responseContainer = arguments; - }; - - // Clean-up function (fires after converters) - jqXHR.always(function() { - // Restore preexisting value - window[ callbackName ] = overwritten; - - // Save back as free - if ( s[ callbackName ] ) { - // make sure that re-using the options doesn't screw things around - s.jsonpCallback = originalSettings.jsonpCallback; - - // save the callback name for future use - oldCallbacks.push( callbackName ); - } - - // Call if it was a function and we have a response - if ( responseContainer && jQuery.isFunction( overwritten ) ) { - overwritten( responseContainer[ 0 ] ); - } - - responseContainer = overwritten = undefined; - }); - - // Delegate to script - return "script"; - } -}); -// Install script dataType -jQuery.ajaxSetup({ - accepts: { - script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /javascript|ecmascript/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -}); - -// Handle cache's special case and global -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - s.global = false; - } -}); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function(s) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - - var script, - head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; - - return { - - send: function( _, callback ) { - - script = document.createElement( "script" ); - - script.async = "async"; - - if ( s.scriptCharset ) { - script.charset = s.scriptCharset; - } - - script.src = s.url; - - // Attach handlers for all browsers - script.onload = script.onreadystatechange = function( _, isAbort ) { - - if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { - - // Handle memory leak in IE - script.onload = script.onreadystatechange = null; - - // Remove the script - if ( head && script.parentNode ) { - head.removeChild( script ); - } - - // Dereference the script - script = undefined; - - // Callback if not abort - if ( !isAbort ) { - callback( 200, "success" ); - } - } - }; - // Use insertBefore instead of appendChild to circumvent an IE6 bug. - // This arises when a base node is used (#2709 and #4378). - head.insertBefore( script, head.firstChild ); - }, - - abort: function() { - if ( script ) { - script.onload( 0, 1 ); - } - } - }; - } -}); -var xhrCallbacks, - // #5280: Internet Explorer will keep connections alive if we don't abort on unload - xhrOnUnloadAbort = window.ActiveXObject ? function() { - // Abort all pending requests - for ( var key in xhrCallbacks ) { - xhrCallbacks[ key ]( 0, 1 ); - } - } : false, - xhrId = 0; - -// Functions to create xhrs -function createStandardXHR() { - try { - return new window.XMLHttpRequest(); - } catch( e ) {} -} - -function createActiveXHR() { - try { - return new window.ActiveXObject( "Microsoft.XMLHTTP" ); - } catch( e ) {} -} - -// Create the request object -// (This is still attached to ajaxSettings for backward compatibility) -jQuery.ajaxSettings.xhr = window.ActiveXObject ? - /* Microsoft failed to properly - * implement the XMLHttpRequest in IE7 (can't request local files), - * so we use the ActiveXObject when it is available - * Additionally XMLHttpRequest can be disabled in IE7/IE8 so - * we need a fallback. - */ - function() { - return !this.isLocal && createStandardXHR() || createActiveXHR(); - } : - // For all other browsers, use the standard XMLHttpRequest object - createStandardXHR; - -// Determine support properties -(function( xhr ) { - jQuery.extend( jQuery.support, { - ajax: !!xhr, - cors: !!xhr && ( "withCredentials" in xhr ) - }); -})( jQuery.ajaxSettings.xhr() ); - -// Create transport if the browser can provide an xhr -if ( jQuery.support.ajax ) { - - jQuery.ajaxTransport(function( s ) { - // Cross domain only allowed if supported through XMLHttpRequest - if ( !s.crossDomain || jQuery.support.cors ) { - - var callback; - - return { - send: function( headers, complete ) { - - // Get a new xhr - var handle, i, - xhr = s.xhr(); - - // Open the socket - // Passing null username, generates a login popup on Opera (#2865) - if ( s.username ) { - xhr.open( s.type, s.url, s.async, s.username, s.password ); - } else { - xhr.open( s.type, s.url, s.async ); - } - - // Apply custom fields if provided - if ( s.xhrFields ) { - for ( i in s.xhrFields ) { - xhr[ i ] = s.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( s.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( s.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !s.crossDomain && !headers["X-Requested-With"] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Need an extra try/catch for cross domain requests in Firefox 3 - try { - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - } catch( _ ) {} - - // Do send the request - // This may raise an exception which is actually - // handled in jQuery.ajax (so no try/catch here) - xhr.send( ( s.hasContent && s.data ) || null ); - - // Listener - callback = function( _, isAbort ) { - - var status, - statusText, - responseHeaders, - responses, - xml; - - // Firefox throws exceptions when accessing properties - // of an xhr when a network error occurred - // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE) - try { - - // Was never called and is aborted or complete - if ( callback && ( isAbort || xhr.readyState === 4 ) ) { - - // Only called once - callback = undefined; - - // Do not keep as active anymore - if ( handle ) { - xhr.onreadystatechange = jQuery.noop; - if ( xhrOnUnloadAbort ) { - delete xhrCallbacks[ handle ]; - } - } - - // If it's an abort - if ( isAbort ) { - // Abort it manually if needed - if ( xhr.readyState !== 4 ) { - xhr.abort(); - } - } else { - status = xhr.status; - responseHeaders = xhr.getAllResponseHeaders(); - responses = {}; - xml = xhr.responseXML; - - // Construct response list - if ( xml && xml.documentElement /* #4958 */ ) { - responses.xml = xml; - } - - // When requesting binary data, IE6-9 will throw an exception - // on any attempt to access responseText (#11426) - try { - responses.text = xhr.responseText; - } catch( e ) { - } - - // Firefox throws an exception when accessing - // statusText for faulty cross-domain requests - try { - statusText = xhr.statusText; - } catch( e ) { - // We normalize with Webkit giving an empty statusText - statusText = ""; - } - - // Filter status for non standard behaviors - - // If the request is local and we have data: assume a success - // (success with no data won't get notified, that's the best we - // can do given current implementations) - if ( !status && s.isLocal && !s.crossDomain ) { - status = responses.text ? 200 : 404; - // IE - #1450: sometimes returns 1223 when it should be 204 - } else if ( status === 1223 ) { - status = 204; - } - } - } - } catch( firefoxAccessException ) { - if ( !isAbort ) { - complete( -1, firefoxAccessException ); - } - } - - // Call complete if needed - if ( responses ) { - complete( status, statusText, responses, responseHeaders ); - } - }; - - if ( !s.async ) { - // if we're in sync mode we fire the callback - callback(); - } else if ( xhr.readyState === 4 ) { - // (IE6 & IE7) if it's in cache and has been - // retrieved directly we need to fire the callback - setTimeout( callback, 0 ); - } else { - handle = ++xhrId; - if ( xhrOnUnloadAbort ) { - // Create the active xhrs callbacks list if needed - // and attach the unload handler - if ( !xhrCallbacks ) { - xhrCallbacks = {}; - jQuery( window ).unload( xhrOnUnloadAbort ); - } - // Add to list of active xhrs callbacks - xhrCallbacks[ handle ] = callback; - } - xhr.onreadystatechange = callback; - } - }, - - abort: function() { - if ( callback ) { - callback(0,1); - } - } - }; - } - }); -} -var fxNow, timerId, - rfxtypes = /^(?:toggle|show|hide)$/, - rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ), - rrun = /queueHooks$/, - animationPrefilters = [ defaultPrefilter ], - tweeners = { - "*": [function( prop, value ) { - var end, unit, - tween = this.createTween( prop, value ), - parts = rfxnum.exec( value ), - target = tween.cur(), - start = +target || 0, - scale = 1, - maxIterations = 20; - - if ( parts ) { - end = +parts[2]; - unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - - // We need to compute starting value - if ( unit !== "px" && start ) { - // Iteratively approximate from a nonzero starting point - // Prefer the current property, because this process will be trivial if it uses the same units - // Fallback to end or a simple constant - start = jQuery.css( tween.elem, prop, true ) || end || 1; - - do { - // If previous iteration zeroed out, double until we get *something* - // Use a string for doubling factor so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - start = start / scale; - jQuery.style( tween.elem, prop, start + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // And breaking the loop if scale is unchanged or perfect, or if we've just had enough - } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations ); - } - - tween.unit = unit; - tween.start = start; - // If a +=/-= token was provided, we're doing a relative animation - tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end; - } - return tween; - }] - }; - -// Animations created synchronously will run synchronously -function createFxNow() { - setTimeout(function() { - fxNow = undefined; - }, 0 ); - return ( fxNow = jQuery.now() ); -} - -function createTweens( animation, props ) { - jQuery.each( props, function( prop, value ) { - var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( collection[ index ].call( animation, prop, value ) ) { - - // we're done with this property - return; - } - } - }); -} - -function Animation( elem, properties, options ) { - var result, - index = 0, - tweenerIndex = 0, - length = animationPrefilters.length, - deferred = jQuery.Deferred().always( function() { - // don't match elem in the :animated selector - delete tick.elem; - }), - tick = function() { - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length ; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ]); - - if ( percent < 1 && length ) { - return remaining; - } else { - deferred.resolveWith( elem, [ animation ] ); - return false; - } - }, - animation = deferred.promise({ - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { specialEasing: {} }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end, easing ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - // if we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - - for ( ; index < length ; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // resolve when we played the last frame - // otherwise, reject - if ( gotoEnd ) { - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - }), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length ; index++ ) { - result = animationPrefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - return result; - } - } - - createTweens( animation, props ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - jQuery.fx.timer( - jQuery.extend( tick, { - anim: animation, - queue: animation.opts.queue, - elem: elem - }) - ); - - // attach callbacks from options - return animation.progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( jQuery.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // not quite $.extend, this wont overwrite keys already present. - // also - reusing 'index' from above because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.split(" "); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length ; index++ ) { - prop = props[ index ]; - tweeners[ prop ] = tweeners[ prop ] || []; - tweeners[ prop ].unshift( callback ); - } - }, - - prefilter: function( callback, prepend ) { - if ( prepend ) { - animationPrefilters.unshift( callback ); - } else { - animationPrefilters.push( callback ); - } - } -}); - -function defaultPrefilter( elem, props, opts ) { - var index, prop, value, length, dataShow, toggle, tween, hooks, oldfire, - anim = this, - style = elem.style, - orig = {}, - handled = [], - hidden = elem.nodeType && isHidden( elem ); - - // handle queue: false promises - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always(function() { - // doing this makes sure that the complete handler will be called - // before this completes - anim.always(function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - }); - }); - } - - // height/width overflow pass - if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { - // Make sure that nothing sneaks out - // Record all 3 overflow attributes because IE does not - // change the overflow attribute when overflowX and - // overflowY are set to the same value - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Set display property to inline-block for height/width - // animations on inline elements that are having width/height animated - if ( jQuery.css( elem, "display" ) === "inline" && - jQuery.css( elem, "float" ) === "none" ) { - - // inline-level elements accept inline-block; - // block-level elements need to be inline with layout - if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) { - style.display = "inline-block"; - - } else { - style.zoom = 1; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - if ( !jQuery.support.shrinkWrapBlocks ) { - anim.done(function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - }); - } - } - - - // show/hide pass - for ( index in props ) { - value = props[ index ]; - if ( rfxtypes.exec( value ) ) { - delete props[ index ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - continue; - } - handled.push( index ); - } - } - - length = handled.length; - if ( length ) { - dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} ); - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - - // store state if its toggle - enables .stop().toggle() to "reverse" - if ( toggle ) { - dataShow.hidden = !hidden; - } - if ( hidden ) { - jQuery( elem ).show(); - } else { - anim.done(function() { - jQuery( elem ).hide(); - }); - } - anim.done(function() { - var prop; - jQuery.removeData( elem, "fxshow", true ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - }); - for ( index = 0 ; index < length ; index++ ) { - prop = handled[ index ]; - tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 ); - orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop ); - - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = tween.start; - if ( hidden ) { - tween.end = tween.start; - tween.start = prop === "width" || prop === "height" ? 1 : 0; - } - } - } - } -} - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || "swing"; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - if ( tween.elem[ tween.prop ] != null && - (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) { - return tween.elem[ tween.prop ]; - } - - // passing any value as a 4th parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails - // so, simple values such as "10px" are parsed to Float. - // complex values such as "rotate(1rad)" are returned as is. - result = jQuery.css( tween.elem, tween.prop, false, "" ); - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - // use step hook for back compat - use cssHook if its there - use .style if its - // available and use plain properties where available - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Remove in 2.0 - this supports IE8's panic based approach -// to setting things on disconnected nodes - -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.each([ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" || - // special check for .toggle( handler, handler, ... ) - ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -}); - -jQuery.fn.extend({ - fadeTo: function( speed, to, easing, callback ) { - - // show any hidden elements after setting opacity to 0 - return this.filter( isHidden ).css( "opacity", 0 ).show() - - // animate to the value specified - .end().animate({ opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations resolve immediately - if ( empty ) { - anim.stop( true ); - } - }; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each(function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = jQuery._data( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) { - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // start the next in the queue if the last step wasn't forced - // timers currently will call their complete callbacks, which will dequeue - // but only if they were gotoEnd - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - }); - } -}); - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - attrs = { height: type }, - i = 0; - - // if we include width, step value is 1 to do all cssExpand values, - // if we don't include width, step value is 2 to skip over Left and Right - includeWidth = includeWidth? 1 : 0; - for( ; i < 4 ; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -// Generate shortcuts for custom animations -jQuery.each({ - slideDown: genFx("show"), - slideUp: genFx("hide"), - slideToggle: genFx("toggle"), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -}); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : - opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; - - // normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p*Math.PI ) / 2; - } -}; - -jQuery.timers = []; -jQuery.fx = Tween.prototype.init; -jQuery.fx.tick = function() { - var timer, - timers = jQuery.timers, - i = 0; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - // Checks the timer has not already been removed - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - if ( timer() && jQuery.timers.push( timer ) && !timerId ) { - timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval ); - } -}; - -jQuery.fx.interval = 13; - -jQuery.fx.stop = function() { - clearInterval( timerId ); - timerId = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - // Default speed - _default: 400 -}; - -// Back Compat <1.8 extension point -jQuery.fx.step = {}; - -if ( jQuery.expr && jQuery.expr.filters ) { - jQuery.expr.filters.animated = function( elem ) { - return jQuery.grep(jQuery.timers, function( fn ) { - return elem === fn.elem; - }).length; - }; -} -var rroot = /^(?:body|html)$/i; - -jQuery.fn.offset = function( options ) { - if ( arguments.length ) { - return options === undefined ? - this : - this.each(function( i ) { - jQuery.offset.setOffset( this, options, i ); - }); - } - - var docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, - box = { top: 0, left: 0 }, - elem = this[ 0 ], - doc = elem && elem.ownerDocument; - - if ( !doc ) { - return; - } - - if ( (body = doc.body) === elem ) { - return jQuery.offset.bodyOffset( elem ); - } - - docElem = doc.documentElement; - - // Make sure it's not a disconnected DOM node - if ( !jQuery.contains( docElem, elem ) ) { - return box; - } - - // If we don't have gBCR, just use 0,0 rather than error - // BlackBerry 5, iOS 3 (original iPhone) - if ( typeof elem.getBoundingClientRect !== "undefined" ) { - box = elem.getBoundingClientRect(); - } - win = getWindow( doc ); - clientTop = docElem.clientTop || body.clientTop || 0; - clientLeft = docElem.clientLeft || body.clientLeft || 0; - scrollTop = win.pageYOffset || docElem.scrollTop; - scrollLeft = win.pageXOffset || docElem.scrollLeft; - return { - top: box.top + scrollTop - clientTop, - left: box.left + scrollLeft - clientLeft - }; -}; - -jQuery.offset = { - - bodyOffset: function( body ) { - var top = body.offsetTop, - left = body.offsetLeft; - - if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) { - top += parseFloat( jQuery.css(body, "marginTop") ) || 0; - left += parseFloat( jQuery.css(body, "marginLeft") ) || 0; - } - - return { top: top, left: left }; - }, - - setOffset: function( elem, options, i ) { - var position = jQuery.css( elem, "position" ); - - // set position first, in-case top/left are set even on static elem - if ( position === "static" ) { - elem.style.position = "relative"; - } - - var curElem = jQuery( elem ), - curOffset = curElem.offset(), - curCSSTop = jQuery.css( elem, "top" ), - curCSSLeft = jQuery.css( elem, "left" ), - calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1, - props = {}, curPosition = {}, curTop, curLeft; - - // need to be able to calculate position if either top or left is auto and position is either absolute or fixed - if ( calculatePosition ) { - curPosition = curElem.position(); - curTop = curPosition.top; - curLeft = curPosition.left; - } else { - curTop = parseFloat( curCSSTop ) || 0; - curLeft = parseFloat( curCSSLeft ) || 0; - } - - if ( jQuery.isFunction( options ) ) { - options = options.call( elem, i, curOffset ); - } - - if ( options.top != null ) { - props.top = ( options.top - curOffset.top ) + curTop; - } - if ( options.left != null ) { - props.left = ( options.left - curOffset.left ) + curLeft; - } - - if ( "using" in options ) { - options.using.call( elem, props ); - } else { - curElem.css( props ); - } - } -}; - - -jQuery.fn.extend({ - - position: function() { - if ( !this[0] ) { - return; - } - - var elem = this[0], - - // Get *real* offsetParent - offsetParent = this.offsetParent(), - - // Get correct offsets - offset = this.offset(), - parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset(); - - // Subtract element margins - // note: when an element has margin: auto the offsetLeft and marginLeft - // are the same in Safari causing offset.left to incorrectly be 0 - offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0; - offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0; - - // Add offsetParent borders - parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0; - parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0; - - // Subtract the two offsets - return { - top: offset.top - parentOffset.top, - left: offset.left - parentOffset.left - }; - }, - - offsetParent: function() { - return this.map(function() { - var offsetParent = this.offsetParent || document.body; - while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) { - offsetParent = offsetParent.offsetParent; - } - return offsetParent || document.body; - }); - } -}); - - -// Create scrollLeft and scrollTop methods -jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) { - var top = /Y/.test( prop ); - - jQuery.fn[ method ] = function( val ) { - return jQuery.access( this, function( elem, method, val ) { - var win = getWindow( elem ); - - if ( val === undefined ) { - return win ? (prop in win) ? win[ prop ] : - win.document.documentElement[ method ] : - elem[ method ]; - } - - if ( win ) { - win.scrollTo( - !top ? val : jQuery( win ).scrollLeft(), - top ? val : jQuery( win ).scrollTop() - ); - - } else { - elem[ method ] = val; - } - }, method, val, arguments.length, null ); - }; -}); - -function getWindow( elem ) { - return jQuery.isWindow( elem ) ? - elem : - elem.nodeType === 9 ? - elem.defaultView || elem.parentWindow : - false; -} -// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods -jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { - jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) { - // margin is only for outerHeight, outerWidth - jQuery.fn[ funcName ] = function( margin, value ) { - var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), - extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); - - return jQuery.access( this, function( elem, type, value ) { - var doc; - - if ( jQuery.isWindow( elem ) ) { - // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there - // isn't a whole lot we can do. See pull request at this URL for discussion: - // https://github.com/jquery/jquery/pull/764 - return elem.document.documentElement[ "client" + name ]; - } - - // Get document width or height - if ( elem.nodeType === 9 ) { - doc = elem.documentElement; - - // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest - // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it. - return Math.max( - elem.body[ "scroll" + name ], doc[ "scroll" + name ], - elem.body[ "offset" + name ], doc[ "offset" + name ], - doc[ "client" + name ] - ); - } - - return value === undefined ? - // Get width or height on the element, requesting but not forcing parseFloat - jQuery.css( elem, type, value, extra ) : - - // Set width or height on the element - jQuery.style( elem, type, value, extra ); - }, type, chainable ? margin : undefined, chainable, null ); - }; - }); -}); -// Expose jQuery to the global object -window.jQuery = window.$ = jQuery; - -// Expose jQuery as an AMD module, but only for AMD loaders that -// understand the issues with loading multiple versions of jQuery -// in a page that all might call define(). The loader will indicate -// they have special allowances for multiple jQuery versions by -// specifying define.amd.jQuery = true. Register as a named module, -// since jQuery can be concatenated with other files that may use define, -// but not use a proper concatenation script that understands anonymous -// AMD modules. A named AMD is safest and most robust way to register. -// Lowercase jquery is used because AMD module names are derived from -// file names, and jQuery is normally delivered in a lowercase file name. -// Do this after creating the global so that if an AMD module wants to call -// noConflict to hide this version of jQuery, it will work. -if ( typeof define === "function" && define.amd && define.amd.jQuery ) { - define( "jquery", [], function () { return jQuery; } ); -} - -})( window ); diff --git a/extern/phmap/benchmark/js/jquery.mousewheel.js b/extern/phmap/benchmark/js/jquery.mousewheel.js deleted file mode 100644 index a999c63..0000000 --- a/extern/phmap/benchmark/js/jquery.mousewheel.js +++ /dev/null @@ -1,86 +0,0 @@ -// Source: https://github.com/jquery/jquery-mousewheel/blob/a06ef4e1a127795606642c55e22d4f2945edc061/jquery.mousewheel.js - -/*! Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net) - * Licensed under the MIT License (LICENSE.txt). - * - * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. - * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. - * Thanks to: Seamus Leahy for adding deltaX and deltaY - * - * Version: 3.0.6 - * - * Requires: 1.2.2+ - */ - -(function($) { - -var types = ['DOMMouseScroll', 'mousewheel']; - -if ($.event.fixHooks) { - for ( var i=types.length; i; ) { - $.event.fixHooks[ types[--i] ] = $.event.mouseHooks; - } -} - -$.event.special.mousewheel = { - setup: function() { - if ( this.addEventListener ) { - for ( var i=types.length; i; ) { - this.addEventListener( types[--i], handler, false ); - } - } else { - this.onmousewheel = handler; - } - }, - - teardown: function() { - if ( this.removeEventListener ) { - for ( var i=types.length; i; ) { - this.removeEventListener( types[--i], handler, false ); - } - } else { - this.onmousewheel = null; - } - } -}; - -$.fn.extend({ - mousewheel: function(fn) { - return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); - }, - - unmousewheel: function(fn) { - return this.unbind("mousewheel", fn); - } -}); - - -function handler(event) { - var orgEvent = event || window.event, args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true, deltaX = 0, deltaY = 0; - event = $.event.fix(orgEvent); - event.type = "mousewheel"; - - // Old school scrollwheel delta - if ( orgEvent.wheelDelta ) { delta = orgEvent.wheelDelta/120; } - if ( orgEvent.detail ) { delta = -orgEvent.detail/3; } - - // New school multidimensional scroll (touchpads) deltas - deltaY = delta; - - // Gecko - if ( orgEvent.axis !== undefined && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { - deltaY = 0; - deltaX = -1*delta; - } - - // Webkit - if ( orgEvent.wheelDeltaY !== undefined ) { deltaY = orgEvent.wheelDeltaY/120; } - if ( orgEvent.wheelDeltaX !== undefined ) { deltaX = -1*orgEvent.wheelDeltaX/120; } - - // Add event and delta to the front of the arguments - args.unshift(event, delta, deltaX, deltaY); - - return ($.event.dispatch || $.event.handle).apply(this, args); -} - -})(jQuery); diff --git a/extern/phmap/benchmark/make_chart_data.py b/extern/phmap/benchmark/make_chart_data.py deleted file mode 100644 index dc15f72..0000000 --- a/extern/phmap/benchmark/make_chart_data.py +++ /dev/null @@ -1,151 +0,0 @@ -# random,1310720,google_dense_hash_map,45621248,0.344362020493 -# random,2621440,glib_hash_table,109867008,1.01163601875 -# random,2621440,stl_unordered_map,130715648,1.73484396935 -# random,2621440,boost_unordered_map,108380160,1.11585187912 -# random,2621440,google_sparse_hash_map,37015552,1.76031804085 -# random,2621440,google_dense_hash_map,79175680,0.504401922226 -# random,5242880,glib_hash_table,210530304,1.86031603813 -# random,5242880,stl_unordered_map,250298368,3.81597208977 -# random,5242880,boost_unordered_map,192184320,2.63760495186 -# random,5242880,google_sparse_hash_map,62066688,3.93570995331 -# random,5242880,google_dense_hash_map,146284544,1.22620105743 -# random,10485760,glib_hash_table,411856896,4.16937494278 -# random,10485760,stl_unordered_map,490430464,7.91806197166 -# random,10485760,boost_unordered_map,359251968,7.52085900307 -# random,10485760,google_sparse_hash_map,111902720,8.11318516731 -# random,10485760,google_dense_hash_map,280502272,2.32930994034 -# random,20971520,glib_hash_table,814510080,8.32456207275 -# random,20971520,stl_unordered_map,971583488,16.1606841087 -# random,20971520,boost_unordered_map,692441088,24.5845990181 -# random,20971520,google_sparse_hash_map,211435520,16.2772600651 -# random,20971520,google_dense_hash_map,548937728,4.85360789299 -# random,41943040,glib_hash_table,1619816448,90.6313672066 - -import sys, json - -lines = [ line.strip() for line in sys.stdin if line.strip() ] - -by_benchtype = {} -benches = {} -programs = {} - -for line in lines: - benchtype, type, nkeys, program, value = line.split(',') - nkeys = int(nkeys) - programs[program] = 1 - - if (type == 'time'): - by_benchtype.setdefault("%s-runtime" % benchtype, {}).setdefault(program, []).append([nkeys, float(value)]) - else: - by_benchtype.setdefault("%s-memory" % benchtype, {}).setdefault(program, []).append([nkeys, int(value)]) - benches[benchtype] = 1 - -proper_names = { - 'std::unordered_map': 'std::unordered_map (1 thread)', - 'spp::sparse_hash_map': 'sparsepp (1 thread, use_spp_alloc)', - 'absl::flat_hash_map': 'absl::flat_hash_map (1 thread)', - 'phmap::flat_hash_map': 'phmap::flat_hash_map', - 'phmap::parallel_flat_hash_map': 'phmap::parallel_flat_hash_map (1 thread)', - 'phmap::parallel_flat_hash_map_mt': 'phmap::parallel_flat_hash_map (8 thread)', - 'absl::parallel_flat_hash_map': 'absl::parallel_flat_hash_map (1 thread)', - 'absl::parallel_flat_hash_map_mt': 'absl::parallel_flat_hash_map (8 threads)', - 'phmap::parallel_flat_hash_map_4': 'phmap::parallel_flat_hash_map (N=4, 8 threads)', - 'phmap::parallel_flat_hash_map_5': 'phmap::parallel_flat_hash_map (N=5, 8 threads)', - 'phmap::parallel_flat_hash_map_6': 'phmap::parallel_flat_hash_map (N=6, 8 threads)' -} - -proper_color = { - 'std::unordered_map': 0, - 'spp::sparse_hash_map': 0, - 'absl::flat_hash_map': 1, - 'phmap::flat_hash_map': 1, - 'phmap::parallel_flat_hash_map': 2, - 'phmap::parallel_flat_hash_map_mt': 2, - 'absl::parallel_flat_hash_map': 3, - 'absl::parallel_flat_hash_map_mt': 3, - 'phmap::parallel_flat_hash_map_4': 3, - 'phmap::parallel_flat_hash_map_5': 4, - 'phmap::parallel_flat_hash_map_6': 5 -} - -bench_titles = { - 'lookup': 'Random Lookup', - 'sequential' : 'Sequential Insert', - 'random' : 'Random Insert', - 'delete' : 'Deletion', - 'sequentialstring' : 'Sequential String Insert', - 'randomstring' : 'Random String Insert', - 'deletestring' : 'String Deletion' - } - -# do them in the desired order to make the legend not overlap the chart data -# too much -program_slugs = [ - 'std::unordered_map', - 'sparsepp', - 'absl::flat_hash_map', - 'phmap::flat_hash_map', - 'absl::parallel_flat_hash_map', - 'phmap::parallel_flat_hash_map', - 'phmap::parallel_flat_hash_map_mt', - 'absl::parallel_flat_hash_map_mt', - 'phmap::parallel_flat_hash_map_4', - 'phmap::parallel_flat_hash_map_5', - 'phmap::parallel_flat_hash_map_6' -] - -chart_data = {} - -for i, (benchtype, programs) in enumerate(by_benchtype.items()): - chart_data[benchtype] = [] - k = programs.keys() - k.sort() - for program in k: - data = programs.get(program, []) - chart_data[benchtype].append({ - 'label': proper_names[program], - 'color': proper_color[program], - 'data': [], - }) - - for k, (nkeys, value) in enumerate(data): - chart_data[benchtype][-1]['data'].append([nkeys, value]) - -html_chart_data = 'chart_data = ' + json.dumps(chart_data) - -## print chart_data['delete-runtime'] - -html_plot_spec = '' -for b in benches.keys(): - html_plot_spec += """ - $.plot($("#{0}-runtime"), chart_data['{0}-runtime'], runtime_settings); - $.plot($("#{0}-memory"), chart_data['{0}-memory'], memory_settings);""".format(b) - -html_div_spec = '' -first = 1 - -for b in benches.keys(): - if 1: - first = 0 - html_div_spec += """ -
{1} (integers): Memory Usage
-
-
number of entries in hash table
-""".format(b, bench_titles[b]) - - html_div_spec += """ -
{1} (integers): Execution Time
-
-
number of entries in hash table
- -""".format(b, bench_titles[b]) - - - -html_template = file('charts-template.html', 'r').read() - -html_template = html_template.replace('__CHART_DATA_GOES_HERE__', html_chart_data) -html_template = html_template.replace('__PLOT_SPEC_GOES_HERE__', html_plot_spec) -html_template = html_template.replace('__PLOT_DIV_SPEC_GOES_HERE__', html_div_spec) - -file('charts.html', 'w').write(html_template) diff --git a/extern/phmap/benchmark/martinus/Vagrantfile b/extern/phmap/benchmark/martinus/Vagrantfile deleted file mode 100644 index ede95d2..0000000 --- a/extern/phmap/benchmark/martinus/Vagrantfile +++ /dev/null @@ -1,97 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -# All Vagrant configuration is done below. The "2" in Vagrant.configure -# configures the configuration version (we support older styles for -# backwards compatibility). Please don't change it unless you know what -# you're doing. -Vagrant.configure("2") do |config| - # The most common configuration options are documented and commented below. - # For a complete reference, please see the online documentation at - # https://docs.vagrantup.com. - - # Every Vagrant development environment requires a box. You can search for - # boxes at https://atlas.hashicorp.com/search. - config.vm.box = "ubuntu/xenial64" - # sudo apt-get update - # sudo apt-get install -y build-essential - # sudo apt-get install -y cmake - # sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python - # sudo apt-get install -y libboost1.55-dev - # wget https://github.com/bazelbuild/bazel/releases/download/0.22.0/bazel-0.22.0-installer-linux-x86_64.sh - # chmod +x ./bazel-0.22.0-installer-linux-x86_64.sh - # ./bazel-0.22.0-installer-linux-x86_64.sh - # ./bazel-bin/hashtable_benchmarks --benchmark_format=json > benchmark-results.json - - - # Disable automatic box update checking. If you disable this, then - # boxes will only be checked for updates when the user runs - # `vagrant box outdated`. This is not recommended. - # config.vm.box_check_update = false - - # Create a forwarded port mapping which allows access to a specific port - # within the machine from a port on the host machine. In the example below, - # accessing "localhost:8080" will access port 80 on the guest machine. - # config.vm.network "forwarded_port", guest: 80, host: 8080 - - # Create a private network, which allows host-only access to the machine - # using a specific IP. - # config.vm.network "private_network", ip: "192.168.33.10" - - # Create a public network, which generally matched to bridged network. - # Bridged networks make the machine appear as another physical device on - # your network. - # config.vm.network "public_network" - - # Share an additional folder to the guest VM. The first argument is - # the path on the host to the actual folder. The second argument is - # the path on the guest to mount the folder. And the optional third - # argument is a set of non-required options. - # config.vm.synced_folder "../data", "/vagrant_data" - - # Provider-specific configuration so you can fine-tune various - # backing providers for Vagrant. These expose provider-specific options. - # Example for VirtualBox: - # - config.vm.provider "virtualbox" do |vb| - vb.customize ["modifyvm", :id, "--cableconnected1", "on"] - - # Display the VirtualBox GUI when booting the machine - vb.gui = false - - # Customize the amount of memory on the VM: - vb.memory = "16384" - end - # - # Define a Vagrant Push strategy for pushing to Atlas. Other push strategies - # such as FTP and Heroku are also available. See the documentation at - # https://docs.vagrantup.com/v2/push/atlas.html for more information. - # config.push.define "atlas" do |push| - # push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME" - # end - - # Enable provisioning with a shell script. Additional provisioners such as - # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the - # documentation for more information about their specific syntax and use. - config.vm.provision "shell", inline: <<-SHELL - sudo apt-get update - sudo apt-get install -y build-essential - sudo apt-get install -y cmake - sudo apt-get install -y ninja-build - sudo apt-get install -y pkg-config zip zlib1g-dev unzip python python-pip - # for folly - sudo apt-get install -y libboost-all-dev libevent-dev libdouble-conversion-dev \ - libgoogle-glog-dev libgflags-dev libiberty-dev liblz4-dev liblzma-dev \ - libsnappy-dev zlib1g-dev binutils-dev libjemalloc-dev libssl-dev pkg-config - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test - sudo apt-get install -y python3 python3-pip - sudo apt-get update - sudo apt-get install -y gcc-8 g++-8 - python3 -m pip install --upgrade pip - python3 -m pip install perf - cd /vagrant - git clone --recurse-submodules https://github.com/greg7mdp/map_benchmark.git - ./map_benchmark/tools/build.sh - sudo apt install -y ruby-full - SHELL -end diff --git a/extern/phmap/benchmark/results/output_flat_par b/extern/phmap/benchmark/results/output_flat_par deleted file mode 100644 index dbd9c01..0000000 --- a/extern/phmap/benchmark/results/output_flat_par +++ /dev/null @@ -1,320 +0,0 @@ -random,memory,0,phmap::flat_hash_map,15740928 -random,memory,240967,phmap::flat_hash_map,11272192 -random,memory,458751,phmap::flat_hash_map,11272192 -random,memory,458752,phmap::flat_hash_map,29138944 -random,memory,493930,phmap::flat_hash_map,20205568 -random,memory,678845,phmap::flat_hash_map,19087360 -random,memory,917503,phmap::flat_hash_map,19087360 -random,memory,917504,phmap::flat_hash_map,54812672 -random,memory,930488,phmap::flat_hash_map,36945920 -random,memory,1835007,phmap::flat_hash_map,36945920 -random,memory,1835008,phmap::flat_hash_map,108392448 -random,memory,1860950,phmap::flat_hash_map,72667136 -random,memory,3670015,phmap::flat_hash_map,72667136 -random,memory,3670016,phmap::flat_hash_map,215556096 -random,memory,3681610,phmap::flat_hash_map,144109568 -random,memory,7340031,phmap::flat_hash_map,144109568 -random,memory,7340032,phmap::flat_hash_map,429883392 -random,memory,7348393,phmap::flat_hash_map,286994432 -random,time,10000000,phmap::flat_hash_map,0.917000 -random,memory,10000174,phmap::flat_hash_map,286994432 -random,memory,14680063,phmap::flat_hash_map,286994432 -random,memory,14680064,phmap::flat_hash_map,858537984 -random,memory,14680512,phmap::flat_hash_map,572764160 -random,time,20000000,phmap::flat_hash_map,2.199000 -random,memory,20013320,phmap::flat_hash_map,572764160 -random,memory,29360127,phmap::flat_hash_map,572764160 -random,memory,29360128,phmap::flat_hash_map,1715859456 -random,memory,29369210,phmap::flat_hash_map,1144307712 -random,time,30000000,phmap::flat_hash_map,3.818000 -random,memory,30002294,phmap::flat_hash_map,1144307712 -random,time,40000000,phmap::flat_hash_map,5.070000 -random,memory,40010797,phmap::flat_hash_map,1144307712 -random,time,50000000,phmap::flat_hash_map,6.323000 -random,memory,50009729,phmap::flat_hash_map,1144307712 -random,memory,58720255,phmap::flat_hash_map,1144307712 -random,memory,58720256,phmap::flat_hash_map,3430486016 -random,memory,58721491,phmap::flat_hash_map,2287403008 -random,time,60000000,phmap::flat_hash_map,8.700000 -random,memory,60002661,phmap::flat_hash_map,2287403008 -random,time,70000000,phmap::flat_hash_map,10.155000 -random,memory,70010887,phmap::flat_hash_map,2287403008 -random,time,80000000,phmap::flat_hash_map,11.589000 -random,memory,80002681,phmap::flat_hash_map,2287403008 -random,time,90000000,phmap::flat_hash_map,13.020000 -random,memory,90012468,phmap::flat_hash_map,2287403008 -random,time,100000000,phmap::flat_hash_map,14.407000 -random,memory,0,phmap::parallel_flat_hash_map,6688768 -random,memory,228584,phmap::parallel_flat_hash_map,6688768 -random,memory,228585,phmap::parallel_flat_hash_map,8372224 -random,memory,230683,phmap::parallel_flat_hash_map,8372224 -random,memory,230684,phmap::parallel_flat_hash_map,11190272 -random,memory,257042,phmap::parallel_flat_hash_map,11190272 -random,memory,257105,phmap::parallel_flat_hash_map,11751424 -random,memory,456008,phmap::parallel_flat_hash_map,11751424 -random,memory,456009,phmap::parallel_flat_hash_map,13996032 -random,memory,456819,phmap::parallel_flat_hash_map,13582336 -random,memory,458740,phmap::parallel_flat_hash_map,13582336 -random,memory,458741,phmap::parallel_flat_hash_map,15847424 -random,memory,459266,phmap::parallel_flat_hash_map,15847424 -random,memory,459267,phmap::parallel_flat_hash_map,17518592 -random,memory,465267,phmap::parallel_flat_hash_map,17518592 -random,memory,465268,phmap::parallel_flat_hash_map,21155840 -random,memory,494937,phmap::parallel_flat_hash_map,20598784 -random,memory,911236,phmap::parallel_flat_hash_map,20598784 -random,memory,911237,phmap::parallel_flat_hash_map,22835200 -random,memory,913145,phmap::parallel_flat_hash_map,22835200 -random,memory,913146,phmap::parallel_flat_hash_map,25067520 -random,memory,914338,phmap::parallel_flat_hash_map,25067520 -random,memory,914339,phmap::parallel_flat_hash_map,27303936 -random,memory,916480,phmap::parallel_flat_hash_map,27303936 -random,memory,916481,phmap::parallel_flat_hash_map,29536256 -random,memory,916523,phmap::parallel_flat_hash_map,29536256 -random,memory,916524,phmap::parallel_flat_hash_map,30650368 -random,memory,917790,phmap::parallel_flat_hash_map,30650368 -random,memory,917791,phmap::parallel_flat_hash_map,32882688 -random,memory,918474,phmap::parallel_flat_hash_map,32882688 -random,memory,918475,phmap::parallel_flat_hash_map,35115008 -random,memory,924420,phmap::parallel_flat_hash_map,35115008 -random,memory,924421,phmap::parallel_flat_hash_map,37355520 -random,memory,937279,phmap::parallel_flat_hash_map,37355520 -random,memory,937319,phmap::parallel_flat_hash_map,38465536 -random,memory,1826595,phmap::parallel_flat_hash_map,38465536 -random,memory,1826596,phmap::parallel_flat_hash_map,42934272 -random,memory,1827102,phmap::parallel_flat_hash_map,42934272 -random,memory,1827103,phmap::parallel_flat_hash_map,45170688 -random,memory,1828265,phmap::parallel_flat_hash_map,45170688 -random,memory,1828266,phmap::parallel_flat_hash_map,47398912 -random,memory,1831166,phmap::parallel_flat_hash_map,47398912 -random,memory,1831167,phmap::parallel_flat_hash_map,49631232 -random,memory,1831515,phmap::parallel_flat_hash_map,49631232 -random,memory,1831516,phmap::parallel_flat_hash_map,51867648 -random,memory,1833264,phmap::parallel_flat_hash_map,51867648 -random,memory,1833265,phmap::parallel_flat_hash_map,54099968 -random,memory,1833345,phmap::parallel_flat_hash_map,54099968 -random,memory,1833346,phmap::parallel_flat_hash_map,56332288 -random,memory,1835078,phmap::parallel_flat_hash_map,56332288 -random,memory,1835079,phmap::parallel_flat_hash_map,58572800 -random,memory,1836213,phmap::parallel_flat_hash_map,58572800 -random,memory,1836214,phmap::parallel_flat_hash_map,60801024 -random,memory,1836364,phmap::parallel_flat_hash_map,60801024 -random,memory,1836365,phmap::parallel_flat_hash_map,63033344 -random,memory,1836849,phmap::parallel_flat_hash_map,63033344 -random,memory,1836850,phmap::parallel_flat_hash_map,65265664 -random,memory,1838065,phmap::parallel_flat_hash_map,65265664 -random,memory,1838066,phmap::parallel_flat_hash_map,67502080 -random,memory,1839241,phmap::parallel_flat_hash_map,67502080 -random,memory,1839242,phmap::parallel_flat_hash_map,69734400 -random,memory,1839771,phmap::parallel_flat_hash_map,69734400 -random,memory,1839772,phmap::parallel_flat_hash_map,71962624 -random,memory,1844031,phmap::parallel_flat_hash_map,71962624 -random,memory,1844032,phmap::parallel_flat_hash_map,74194944 -random,memory,1844165,phmap::parallel_flat_hash_map,74194944 -random,memory,1844166,phmap::parallel_flat_hash_map,76423168 -random,memory,1849529,phmap::parallel_flat_hash_map,74186752 -random,memory,3656347,phmap::parallel_flat_hash_map,74186752 -random,memory,3656348,phmap::parallel_flat_hash_map,83120128 -random,memory,3658236,phmap::parallel_flat_hash_map,83120128 -random,memory,3658237,phmap::parallel_flat_hash_map,87592960 -random,memory,3660832,phmap::parallel_flat_hash_map,87592960 -random,memory,3660833,phmap::parallel_flat_hash_map,92061696 -random,memory,3663897,phmap::parallel_flat_hash_map,92061696 -random,memory,3663898,phmap::parallel_flat_hash_map,96526336 -random,memory,3668004,phmap::parallel_flat_hash_map,96526336 -random,memory,3668005,phmap::parallel_flat_hash_map,100990976 -random,memory,3668781,phmap::parallel_flat_hash_map,100990976 -random,memory,3668782,phmap::parallel_flat_hash_map,105459712 -random,memory,3669316,phmap::parallel_flat_hash_map,100990976 -random,memory,3669736,phmap::parallel_flat_hash_map,100990976 -random,memory,3669737,phmap::parallel_flat_hash_map,109928448 -random,memory,3670780,phmap::parallel_flat_hash_map,109928448 -random,memory,3670781,phmap::parallel_flat_hash_map,114388992 -random,memory,3671735,phmap::parallel_flat_hash_map,114388992 -random,memory,3671736,phmap::parallel_flat_hash_map,118853632 -random,memory,3672742,phmap::parallel_flat_hash_map,118853632 -random,memory,3672743,phmap::parallel_flat_hash_map,123322368 -random,memory,3672841,phmap::parallel_flat_hash_map,123322368 -random,memory,3672842,phmap::parallel_flat_hash_map,127787008 -random,memory,3674661,phmap::parallel_flat_hash_map,127787008 -random,memory,3674662,phmap::parallel_flat_hash_map,132259840 -random,memory,3675918,phmap::parallel_flat_hash_map,132259840 -random,memory,3675919,phmap::parallel_flat_hash_map,136724480 -random,memory,3676502,phmap::parallel_flat_hash_map,136724480 -random,memory,3676503,phmap::parallel_flat_hash_map,141180928 -random,memory,3676556,phmap::parallel_flat_hash_map,141180928 -random,memory,3676557,phmap::parallel_flat_hash_map,145645568 -random,memory,3679943,phmap::parallel_flat_hash_map,141176832 -random,memory,3682847,phmap::parallel_flat_hash_map,141176832 -random,memory,3682848,phmap::parallel_flat_hash_map,150106112 -random,memory,3701420,phmap::parallel_flat_hash_map,145637376 -random,memory,7323550,phmap::parallel_flat_hash_map,145637376 -random,memory,7323551,phmap::parallel_flat_hash_map,163500032 -random,memory,7325955,phmap::parallel_flat_hash_map,154566656 -random,memory,7326781,phmap::parallel_flat_hash_map,154566656 -random,memory,7326782,phmap::parallel_flat_hash_map,172433408 -random,memory,7327471,phmap::parallel_flat_hash_map,172433408 -random,memory,7327472,phmap::parallel_flat_hash_map,181362688 -random,memory,7328548,phmap::parallel_flat_hash_map,181362688 -random,memory,7328549,phmap::parallel_flat_hash_map,190300160 -random,memory,7331571,phmap::parallel_flat_hash_map,190300160 -random,memory,7331572,phmap::parallel_flat_hash_map,199229440 -random,memory,7333270,phmap::parallel_flat_hash_map,199229440 -random,memory,7333271,phmap::parallel_flat_hash_map,208154624 -random,memory,7336330,phmap::parallel_flat_hash_map,208154624 -random,memory,7336331,phmap::parallel_flat_hash_map,217083904 -random,memory,7338941,phmap::parallel_flat_hash_map,217083904 -random,memory,7338942,phmap::parallel_flat_hash_map,226021376 -random,memory,7339987,phmap::parallel_flat_hash_map,226021376 -random,memory,7339988,phmap::parallel_flat_hash_map,234950656 -random,memory,7340192,phmap::parallel_flat_hash_map,234950656 -random,memory,7340193,phmap::parallel_flat_hash_map,243879936 -random,memory,7340212,phmap::parallel_flat_hash_map,243879936 -random,memory,7340213,phmap::parallel_flat_hash_map,252805120 -random,memory,7340756,phmap::parallel_flat_hash_map,252805120 -random,memory,7340757,phmap::parallel_flat_hash_map,261734400 -random,memory,7353138,phmap::parallel_flat_hash_map,261734400 -random,memory,7353139,phmap::parallel_flat_hash_map,270659584 -random,memory,7355638,phmap::parallel_flat_hash_map,270659584 -random,memory,7355639,phmap::parallel_flat_hash_map,279592960 -random,memory,7358552,phmap::parallel_flat_hash_map,279592960 -random,memory,7358553,phmap::parallel_flat_hash_map,288522240 -random,memory,7363002,phmap::parallel_flat_hash_map,279584768 -random,memory,7364175,phmap::parallel_flat_hash_map,279584768 -random,memory,7364176,phmap::parallel_flat_hash_map,297451520 -random,memory,7379232,phmap::parallel_flat_hash_map,288518144 -random,time,10000000,phmap::parallel_flat_hash_map,1.115000 -random,memory,10001837,phmap::parallel_flat_hash_map,288518144 -random,memory,14641981,phmap::parallel_flat_hash_map,288518144 -random,memory,14641982,phmap::parallel_flat_hash_map,324243456 -random,memory,14649536,phmap::parallel_flat_hash_map,306380800 -random,memory,14658094,phmap::parallel_flat_hash_map,306380800 -random,memory,14658095,phmap::parallel_flat_hash_map,342106112 -random,memory,14663598,phmap::parallel_flat_hash_map,342106112 -random,memory,14663599,phmap::parallel_flat_hash_map,359968768 -random,memory,14667323,phmap::parallel_flat_hash_map,359968768 -random,memory,14667324,phmap::parallel_flat_hash_map,377835520 -random,memory,14668425,phmap::parallel_flat_hash_map,377835520 -random,memory,14668426,phmap::parallel_flat_hash_map,395694080 -random,memory,14669145,phmap::parallel_flat_hash_map,395694080 -random,memory,14669146,phmap::parallel_flat_hash_map,413560832 -random,memory,14669916,phmap::parallel_flat_hash_map,395698176 -random,memory,14673506,phmap::parallel_flat_hash_map,395698176 -random,memory,14673507,phmap::parallel_flat_hash_map,431423488 -random,memory,14676201,phmap::parallel_flat_hash_map,431423488 -random,memory,14676202,phmap::parallel_flat_hash_map,449286144 -random,memory,14681323,phmap::parallel_flat_hash_map,449286144 -random,memory,14681324,phmap::parallel_flat_hash_map,467152896 -random,memory,14684771,phmap::parallel_flat_hash_map,449286144 -random,memory,14686498,phmap::parallel_flat_hash_map,449286144 -random,memory,14686499,phmap::parallel_flat_hash_map,485011456 -random,memory,14691299,phmap::parallel_flat_hash_map,485011456 -random,memory,14691300,phmap::parallel_flat_hash_map,502865920 -random,memory,14694531,phmap::parallel_flat_hash_map,502865920 -random,memory,14694532,phmap::parallel_flat_hash_map,520728576 -random,memory,14696324,phmap::parallel_flat_hash_map,520728576 -random,memory,14696325,phmap::parallel_flat_hash_map,538587136 -random,memory,14701255,phmap::parallel_flat_hash_map,538587136 -random,memory,14701256,phmap::parallel_flat_hash_map,556445696 -random,memory,14702651,phmap::parallel_flat_hash_map,538578944 -random,memory,14704639,phmap::parallel_flat_hash_map,538578944 -random,memory,14704640,phmap::parallel_flat_hash_map,574300160 -random,memory,14707748,phmap::parallel_flat_hash_map,574300160 -random,memory,14707749,phmap::parallel_flat_hash_map,592158720 -random,memory,14711651,phmap::parallel_flat_hash_map,574296064 -random,time,20000000,phmap::parallel_flat_hash_map,2.484000 -random,memory,20006564,phmap::parallel_flat_hash_map,574296064 -random,memory,29321443,phmap::parallel_flat_hash_map,574296064 -random,memory,29321444,phmap::parallel_flat_hash_map,645742592 -random,memory,29322576,phmap::parallel_flat_hash_map,645742592 -random,memory,29322577,phmap::parallel_flat_hash_map,681463808 -random,memory,29331685,phmap::parallel_flat_hash_map,645742592 -random,memory,29333141,phmap::parallel_flat_hash_map,645742592 -random,memory,29333142,phmap::parallel_flat_hash_map,717189120 -random,memory,29336447,phmap::parallel_flat_hash_map,717189120 -random,memory,29336448,phmap::parallel_flat_hash_map,752910336 -random,memory,29345055,phmap::parallel_flat_hash_map,717185024 -random,memory,29352413,phmap::parallel_flat_hash_map,717185024 -random,memory,29352414,phmap::parallel_flat_hash_map,788627456 -random,memory,29357051,phmap::parallel_flat_hash_map,752902144 -random,memory,29357141,phmap::parallel_flat_hash_map,752902144 -random,memory,29357142,phmap::parallel_flat_hash_map,824348672 -random,memory,29359481,phmap::parallel_flat_hash_map,824348672 -random,memory,29359482,phmap::parallel_flat_hash_map,860069888 -random,memory,29362077,phmap::parallel_flat_hash_map,860069888 -random,memory,29362078,phmap::parallel_flat_hash_map,895795200 -random,memory,29366120,phmap::parallel_flat_hash_map,895795200 -random,memory,29366121,phmap::parallel_flat_hash_map,931512320 -random,memory,29368098,phmap::parallel_flat_hash_map,931512320 -random,memory,29368099,phmap::parallel_flat_hash_map,967229440 -random,memory,29368978,phmap::parallel_flat_hash_map,931508224 -random,memory,29373953,phmap::parallel_flat_hash_map,931508224 -random,memory,29373954,phmap::parallel_flat_hash_map,1002954752 -random,memory,29376083,phmap::parallel_flat_hash_map,1002954752 -random,memory,29376084,phmap::parallel_flat_hash_map,1038680064 -random,memory,29378406,phmap::parallel_flat_hash_map,1002950656 -random,memory,29378970,phmap::parallel_flat_hash_map,1002950656 -random,memory,29378971,phmap::parallel_flat_hash_map,1074397184 -random,memory,29380083,phmap::parallel_flat_hash_map,1074397184 -random,memory,29380084,phmap::parallel_flat_hash_map,1110122496 -random,memory,29381250,phmap::parallel_flat_hash_map,1110122496 -random,memory,29381251,phmap::parallel_flat_hash_map,1145839616 -random,memory,29384576,phmap::parallel_flat_hash_map,1110110208 -random,memory,29391514,phmap::parallel_flat_hash_map,1110110208 -random,memory,29391515,phmap::parallel_flat_hash_map,1181556736 -random,memory,29398827,phmap::parallel_flat_hash_map,1145835520 -random,time,30000000,phmap::parallel_flat_hash_map,4.197000 -random,memory,30003726,phmap::parallel_flat_hash_map,1145835520 -random,time,40000000,phmap::parallel_flat_hash_map,5.407000 -random,memory,40004260,phmap::parallel_flat_hash_map,1145835520 -random,time,50000000,phmap::parallel_flat_hash_map,6.651000 -random,memory,50008463,phmap::parallel_flat_hash_map,1145835520 -random,memory,58650774,phmap::parallel_flat_hash_map,1145835520 -random,memory,58650775,phmap::parallel_flat_hash_map,1288724480 -random,memory,58651341,phmap::parallel_flat_hash_map,1217282048 -random,memory,58670748,phmap::parallel_flat_hash_map,1217282048 -random,memory,58670749,phmap::parallel_flat_hash_map,1360171008 -random,memory,58672543,phmap::parallel_flat_hash_map,1288724480 -random,memory,58679343,phmap::parallel_flat_hash_map,1288724480 -random,memory,58679344,phmap::parallel_flat_hash_map,1431609344 -random,memory,58679621,phmap::parallel_flat_hash_map,1431609344 -random,memory,58679622,phmap::parallel_flat_hash_map,1503047680 -random,memory,58681449,phmap::parallel_flat_hash_map,1503047680 -random,memory,58681450,phmap::parallel_flat_hash_map,1574498304 -random,memory,58687442,phmap::parallel_flat_hash_map,1503055872 -random,memory,58716081,phmap::parallel_flat_hash_map,1503055872 -random,memory,58716082,phmap::parallel_flat_hash_map,1645944832 -random,memory,58719988,phmap::parallel_flat_hash_map,1574498304 -random,memory,58720496,phmap::parallel_flat_hash_map,1574498304 -random,memory,58720497,phmap::parallel_flat_hash_map,1717387264 -random,memory,58723911,phmap::parallel_flat_hash_map,1717387264 -random,memory,58723912,phmap::parallel_flat_hash_map,1788841984 -random,memory,58728095,phmap::parallel_flat_hash_map,1717395456 -random,memory,58731608,phmap::parallel_flat_hash_map,1717395456 -random,memory,58731609,phmap::parallel_flat_hash_map,1860280320 -random,memory,58737338,phmap::parallel_flat_hash_map,1860280320 -random,memory,58737339,phmap::parallel_flat_hash_map,1931718656 -random,memory,58737397,phmap::parallel_flat_hash_map,1860272128 -random,memory,58744726,phmap::parallel_flat_hash_map,1860272128 -random,memory,58744727,phmap::parallel_flat_hash_map,2003165184 -random,memory,58746205,phmap::parallel_flat_hash_map,1931718656 -random,memory,58752523,phmap::parallel_flat_hash_map,1931718656 -random,memory,58752524,phmap::parallel_flat_hash_map,2074607616 -random,memory,58753838,phmap::parallel_flat_hash_map,2074607616 -random,memory,58753839,phmap::parallel_flat_hash_map,2146054144 -random,memory,58756083,phmap::parallel_flat_hash_map,2146054144 -random,memory,58756084,phmap::parallel_flat_hash_map,2217496576 -random,memory,58758266,phmap::parallel_flat_hash_map,2217496576 -random,memory,58758267,phmap::parallel_flat_hash_map,2288943104 -random,memory,58760494,phmap::parallel_flat_hash_map,2217492480 -random,memory,58766191,phmap::parallel_flat_hash_map,2217492480 -random,memory,58766192,phmap::parallel_flat_hash_map,2360381440 -random,memory,58773720,phmap::parallel_flat_hash_map,2288934912 -random,time,60000000,phmap::parallel_flat_hash_map,9.067000 -random,memory,60002586,phmap::parallel_flat_hash_map,2288934912 -random,time,70000000,phmap::parallel_flat_hash_map,10.409000 -random,memory,70011900,phmap::parallel_flat_hash_map,2288934912 -random,time,80000000,phmap::parallel_flat_hash_map,11.747000 -random,memory,80002981,phmap::parallel_flat_hash_map,2288934912 -random,time,90000000,phmap::parallel_flat_hash_map,13.091000 -random,memory,90007030,phmap::parallel_flat_hash_map,2288934912 -random,time,100000000,phmap::parallel_flat_hash_map,14.467000 diff --git a/extern/phmap/benchmark/results/output_flat_par_mutex_4 b/extern/phmap/benchmark/results/output_flat_par_mutex_4 deleted file mode 100644 index c22410f..0000000 --- a/extern/phmap/benchmark/results/output_flat_par_mutex_4 +++ /dev/null @@ -1,316 +0,0 @@ -random,memory,0,phmap::flat_hash_map,15753216 -random,memory,299298,phmap::flat_hash_map,15753216 -random,memory,299585,phmap::flat_hash_map,11284480 -random,memory,458751,phmap::flat_hash_map,11284480 -random,memory,458752,phmap::flat_hash_map,29151232 -random,memory,505180,phmap::flat_hash_map,29151232 -random,memory,505419,phmap::flat_hash_map,20217856 -random,memory,599314,phmap::flat_hash_map,20217856 -random,memory,599573,phmap::flat_hash_map,19095552 -random,memory,917503,phmap::flat_hash_map,19095552 -random,memory,917504,phmap::flat_hash_map,54820864 -random,memory,963390,phmap::flat_hash_map,54820864 -random,memory,963601,phmap::flat_hash_map,36954112 -random,memory,1835007,phmap::flat_hash_map,36954112 -random,memory,1835008,phmap::flat_hash_map,108400640 -random,memory,1860352,phmap::flat_hash_map,108400640 -random,memory,1860468,phmap::flat_hash_map,72675328 -random,memory,3670015,phmap::flat_hash_map,72675328 -random,memory,3670016,phmap::flat_hash_map,215564288 -random,memory,3686835,phmap::flat_hash_map,215564288 -random,memory,3686879,phmap::flat_hash_map,144117760 -random,memory,7340031,phmap::flat_hash_map,144117760 -random,memory,7340032,phmap::flat_hash_map,429891584 -random,memory,7352288,phmap::flat_hash_map,429891584 -random,memory,7352289,phmap::flat_hash_map,287002624 -random,time,10000000,phmap::flat_hash_map,0.923000 -random,memory,10003658,phmap::flat_hash_map,287002624 -random,memory,14680063,phmap::flat_hash_map,287002624 -random,memory,14680064,phmap::flat_hash_map,858554368 -random,memory,14690134,phmap::flat_hash_map,858554368 -random,memory,14690179,phmap::flat_hash_map,572776448 -random,time,20000000,phmap::flat_hash_map,2.224000 -random,memory,20009269,phmap::flat_hash_map,572776448 -random,memory,29360127,phmap::flat_hash_map,572776448 -random,memory,29360128,phmap::flat_hash_map,1715867648 -random,memory,29366940,phmap::flat_hash_map,1715867648 -random,memory,29366994,phmap::flat_hash_map,1144315904 -random,time,30000000,phmap::flat_hash_map,3.846000 -random,memory,30008884,phmap::flat_hash_map,1144315904 -random,time,40000000,phmap::flat_hash_map,5.131000 -random,memory,40002137,phmap::flat_hash_map,1144315904 -random,time,50000000,phmap::flat_hash_map,6.445000 -random,memory,50005385,phmap::flat_hash_map,1144315904 -random,memory,58720255,phmap::flat_hash_map,1144315904 -random,memory,58720256,phmap::flat_hash_map,3430494208 -random,memory,58729667,phmap::flat_hash_map,3430494208 -random,memory,58729713,phmap::flat_hash_map,2287415296 -random,time,60000000,phmap::flat_hash_map,8.827000 -random,memory,60010828,phmap::flat_hash_map,2287415296 -random,time,70000000,phmap::flat_hash_map,10.317000 -random,memory,70006827,phmap::flat_hash_map,2287415296 -random,time,80000000,phmap::flat_hash_map,11.803000 -random,memory,80002090,phmap::flat_hash_map,2287415296 -random,time,90000000,phmap::flat_hash_map,13.277000 -random,memory,90005422,phmap::flat_hash_map,2287415296 -random,time,100000000,phmap::flat_hash_map,14.716000 -random,memory,0,phmap::parallel_flat_hash_map_mt,7884800 -random,memory,229053,phmap::parallel_flat_hash_map_mt,7884800 -random,memory,229054,phmap::parallel_flat_hash_map_mt,12562432 -random,memory,244827,phmap::parallel_flat_hash_map_mt,12562432 -random,memory,244899,phmap::parallel_flat_hash_map_mt,13127680 -random,memory,455707,phmap::parallel_flat_hash_map_mt,13127680 -random,memory,455708,phmap::parallel_flat_hash_map_mt,14254080 -random,memory,457702,phmap::parallel_flat_hash_map_mt,14254080 -random,memory,457703,phmap::parallel_flat_hash_map_mt,14700544 -random,memory,458422,phmap::parallel_flat_hash_map_mt,14700544 -random,memory,458423,phmap::parallel_flat_hash_map_mt,16953344 -random,memory,459497,phmap::parallel_flat_hash_map_mt,16953344 -random,memory,459498,phmap::parallel_flat_hash_map_mt,18644992 -random,memory,460681,phmap::parallel_flat_hash_map_mt,18644992 -random,memory,460682,phmap::parallel_flat_hash_map_mt,21450752 -random,memory,482289,phmap::parallel_flat_hash_map_mt,21450752 -random,memory,482359,phmap::parallel_flat_hash_map_mt,22495232 -random,memory,914327,phmap::parallel_flat_hash_map_mt,22495232 -random,memory,914328,phmap::parallel_flat_hash_map_mt,25849856 -random,memory,914709,phmap::parallel_flat_hash_map_mt,25849856 -random,memory,914710,phmap::parallel_flat_hash_map_mt,29200384 -random,memory,915833,phmap::parallel_flat_hash_map_mt,29200384 -random,memory,915834,phmap::parallel_flat_hash_map_mt,33673216 -random,memory,917742,phmap::parallel_flat_hash_map_mt,33673216 -random,memory,917743,phmap::parallel_flat_hash_map_mt,35905536 -random,memory,920586,phmap::parallel_flat_hash_map_mt,35905536 -random,memory,920587,phmap::parallel_flat_hash_map_mt,37023744 -random,memory,921976,phmap::parallel_flat_hash_map_mt,37023744 -random,memory,921977,phmap::parallel_flat_hash_map_mt,40370176 -random,memory,922650,phmap::parallel_flat_hash_map_mt,41484288 -random,memory,983562,phmap::parallel_flat_hash_map_mt,41484288 -random,memory,1172876,phmap::parallel_flat_hash_map_mt,40366080 -random,memory,1825547,phmap::parallel_flat_hash_map_mt,40366080 -random,memory,1825548,phmap::parallel_flat_hash_map_mt,44834816 -random,memory,1826741,phmap::parallel_flat_hash_map_mt,44834816 -random,memory,1826816,phmap::parallel_flat_hash_map_mt,42598400 -random,memory,1828151,phmap::parallel_flat_hash_map_mt,42598400 -random,memory,1828152,phmap::parallel_flat_hash_map_mt,47067136 -random,memory,1830082,phmap::parallel_flat_hash_map_mt,47067136 -random,memory,1830083,phmap::parallel_flat_hash_map_mt,49295360 -random,memory,1831123,phmap::parallel_flat_hash_map_mt,49295360 -random,memory,1831124,phmap::parallel_flat_hash_map_mt,51531776 -random,memory,1832184,phmap::parallel_flat_hash_map_mt,51531776 -random,memory,1832185,phmap::parallel_flat_hash_map_mt,53760000 -random,memory,1832769,phmap::parallel_flat_hash_map_mt,53760000 -random,memory,1832770,phmap::parallel_flat_hash_map_mt,55996416 -random,memory,1832874,phmap::parallel_flat_hash_map_mt,55996416 -random,memory,1832875,phmap::parallel_flat_hash_map_mt,58228736 -random,memory,1835220,phmap::parallel_flat_hash_map_mt,58228736 -random,memory,1835221,phmap::parallel_flat_hash_map_mt,60465152 -random,memory,1836418,phmap::parallel_flat_hash_map_mt,60465152 -random,memory,1836419,phmap::parallel_flat_hash_map_mt,62701568 -random,memory,1836633,phmap::parallel_flat_hash_map_mt,62701568 -random,memory,1836634,phmap::parallel_flat_hash_map_mt,64929792 -random,memory,1837724,phmap::parallel_flat_hash_map_mt,64929792 -random,memory,1837725,phmap::parallel_flat_hash_map_mt,67158016 -random,memory,1838209,phmap::parallel_flat_hash_map_mt,67158016 -random,memory,1838210,phmap::parallel_flat_hash_map_mt,69394432 -random,memory,1838995,phmap::parallel_flat_hash_map_mt,69394432 -random,memory,1838996,phmap::parallel_flat_hash_map_mt,71622656 -random,memory,1840918,phmap::parallel_flat_hash_map_mt,71622656 -random,memory,1840919,phmap::parallel_flat_hash_map_mt,73859072 -random,memory,1841584,phmap::parallel_flat_hash_map_mt,73859072 -random,memory,1841585,phmap::parallel_flat_hash_map_mt,76095488 -random,memory,1842548,phmap::parallel_flat_hash_map_mt,78323712 -random,memory,1854401,phmap::parallel_flat_hash_map_mt,78323712 -random,memory,2039888,phmap::parallel_flat_hash_map_mt,76087296 -random,memory,3656563,phmap::parallel_flat_hash_map_mt,76091392 -random,memory,3656564,phmap::parallel_flat_hash_map_mt,85028864 -random,memory,3657600,phmap::parallel_flat_hash_map_mt,85028864 -random,memory,3657601,phmap::parallel_flat_hash_map_mt,89497600 -random,memory,3659709,phmap::parallel_flat_hash_map_mt,89497600 -random,memory,3659710,phmap::parallel_flat_hash_map_mt,93958144 -random,memory,3664287,phmap::parallel_flat_hash_map_mt,93958144 -random,memory,3664288,phmap::parallel_flat_hash_map_mt,98418688 -random,memory,3665897,phmap::parallel_flat_hash_map_mt,98418688 -random,memory,3665898,phmap::parallel_flat_hash_map_mt,102879232 -random,memory,3668708,phmap::parallel_flat_hash_map_mt,102879232 -random,memory,3668709,phmap::parallel_flat_hash_map_mt,107347968 -random,memory,3669267,phmap::parallel_flat_hash_map_mt,107347968 -random,memory,3669268,phmap::parallel_flat_hash_map_mt,111816704 -random,memory,3673233,phmap::parallel_flat_hash_map_mt,111816704 -random,memory,3673234,phmap::parallel_flat_hash_map_mt,134148096 -random,memory,3673249,phmap::parallel_flat_hash_map_mt,134148096 -random,memory,3673261,phmap::parallel_flat_hash_map_mt,125210624 -random,memory,3673702,phmap::parallel_flat_hash_map_mt,125210624 -random,memory,3673703,phmap::parallel_flat_hash_map_mt,129679360 -random,memory,3674703,phmap::parallel_flat_hash_map_mt,129679360 -random,memory,3674704,phmap::parallel_flat_hash_map_mt,134139904 -random,memory,3675513,phmap::parallel_flat_hash_map_mt,134139904 -random,memory,3675514,phmap::parallel_flat_hash_map_mt,138600448 -random,memory,3677599,phmap::parallel_flat_hash_map_mt,138600448 -random,memory,3677600,phmap::parallel_flat_hash_map_mt,143073280 -random,memory,3678958,phmap::parallel_flat_hash_map_mt,143073280 -random,memory,3678959,phmap::parallel_flat_hash_map_mt,147537920 -random,memory,3679455,phmap::parallel_flat_hash_map_mt,147537920 -random,memory,3679456,phmap::parallel_flat_hash_map_mt,152006656 -random,memory,3829988,phmap::parallel_flat_hash_map_mt,152006656 -random,memory,3830019,phmap::parallel_flat_hash_map_mt,147537920 -random,memory,7327631,phmap::parallel_flat_hash_map_mt,147537920 -random,memory,7327632,phmap::parallel_flat_hash_map_mt,183267328 -random,memory,7327726,phmap::parallel_flat_hash_map_mt,183267328 -random,memory,7327727,phmap::parallel_flat_hash_map_mt,174333952 -random,memory,7328167,phmap::parallel_flat_hash_map_mt,174333952 -random,memory,7328168,phmap::parallel_flat_hash_map_mt,183263232 -random,memory,7332754,phmap::parallel_flat_hash_map_mt,183263232 -random,memory,7332755,phmap::parallel_flat_hash_map_mt,192196608 -random,memory,7334286,phmap::parallel_flat_hash_map_mt,192196608 -random,memory,7334287,phmap::parallel_flat_hash_map_mt,201121792 -random,memory,7336335,phmap::parallel_flat_hash_map_mt,201121792 -random,memory,7336336,phmap::parallel_flat_hash_map_mt,210059264 -random,memory,7337725,phmap::parallel_flat_hash_map_mt,210059264 -random,memory,7337726,phmap::parallel_flat_hash_map_mt,218984448 -random,memory,7339260,phmap::parallel_flat_hash_map_mt,218984448 -random,memory,7339261,phmap::parallel_flat_hash_map_mt,227909632 -random,memory,7340643,phmap::parallel_flat_hash_map_mt,227909632 -random,memory,7340644,phmap::parallel_flat_hash_map_mt,236838912 -random,memory,7342329,phmap::parallel_flat_hash_map_mt,236838912 -random,memory,7342330,phmap::parallel_flat_hash_map_mt,245776384 -random,memory,7343707,phmap::parallel_flat_hash_map_mt,245776384 -random,memory,7343708,phmap::parallel_flat_hash_map_mt,254709760 -random,memory,7344092,phmap::parallel_flat_hash_map_mt,254709760 -random,memory,7344093,phmap::parallel_flat_hash_map_mt,263639040 -random,memory,7344454,phmap::parallel_flat_hash_map_mt,263639040 -random,memory,7344529,phmap::parallel_flat_hash_map_mt,254705664 -random,memory,7349960,phmap::parallel_flat_hash_map_mt,254705664 -random,memory,7349961,phmap::parallel_flat_hash_map_mt,272572416 -random,memory,7350165,phmap::parallel_flat_hash_map_mt,272572416 -random,memory,7350166,phmap::parallel_flat_hash_map_mt,281497600 -random,memory,7353807,phmap::parallel_flat_hash_map_mt,281497600 -random,memory,7353808,phmap::parallel_flat_hash_map_mt,290430976 -random,memory,7354809,phmap::parallel_flat_hash_map_mt,290430976 -random,memory,7354810,phmap::parallel_flat_hash_map_mt,299356160 -random,memory,7359696,phmap::parallel_flat_hash_map_mt,299356160 -random,memory,7359779,phmap::parallel_flat_hash_map_mt,290422784 -random,time,10000000,phmap::parallel_flat_hash_map_mt,0.788000 -random,memory,10043554,phmap::parallel_flat_hash_map_mt,288821248 -random,memory,14660773,phmap::parallel_flat_hash_map_mt,288821248 -random,memory,14660774,phmap::parallel_flat_hash_map_mt,324546560 -random,memory,14668394,phmap::parallel_flat_hash_map_mt,324546560 -random,memory,14668395,phmap::parallel_flat_hash_map_mt,342409216 -random,memory,14670081,phmap::parallel_flat_hash_map_mt,342409216 -random,memory,14670082,phmap::parallel_flat_hash_map_mt,360271872 -random,memory,14670721,phmap::parallel_flat_hash_map_mt,360271872 -random,memory,14670722,phmap::parallel_flat_hash_map_mt,378126336 -random,memory,14673268,phmap::parallel_flat_hash_map_mt,378126336 -random,memory,14673269,phmap::parallel_flat_hash_map_mt,395984896 -random,memory,14675927,phmap::parallel_flat_hash_map_mt,395984896 -random,memory,14675929,phmap::parallel_flat_hash_map_mt,413843456 -random,memory,14677274,phmap::parallel_flat_hash_map_mt,413843456 -random,memory,14677275,phmap::parallel_flat_hash_map_mt,431706112 -random,memory,14679690,phmap::parallel_flat_hash_map_mt,431706112 -random,memory,14679691,phmap::parallel_flat_hash_map_mt,449564672 -random,memory,14680028,phmap::parallel_flat_hash_map_mt,449564672 -random,memory,14680031,phmap::parallel_flat_hash_map_mt,431702016 -random,memory,14682548,phmap::parallel_flat_hash_map_mt,431702016 -random,memory,14682549,phmap::parallel_flat_hash_map_mt,467423232 -random,memory,14683242,phmap::parallel_flat_hash_map_mt,467423232 -random,memory,14683243,phmap::parallel_flat_hash_map_mt,485289984 -random,memory,14684510,phmap::parallel_flat_hash_map_mt,485289984 -random,memory,14684511,phmap::parallel_flat_hash_map_mt,503152640 -random,memory,14685762,phmap::parallel_flat_hash_map_mt,503152640 -random,memory,14685763,phmap::parallel_flat_hash_map_mt,521015296 -random,memory,14687183,phmap::parallel_flat_hash_map_mt,521015296 -random,memory,14687184,phmap::parallel_flat_hash_map_mt,538873856 -random,memory,14687856,phmap::parallel_flat_hash_map_mt,538873856 -random,memory,14687857,phmap::parallel_flat_hash_map_mt,556740608 -random,memory,14688774,phmap::parallel_flat_hash_map_mt,556740608 -random,memory,14688775,phmap::parallel_flat_hash_map_mt,574595072 -random,memory,14708553,phmap::parallel_flat_hash_map_mt,574595072 -random,memory,14708554,phmap::parallel_flat_hash_map_mt,592453632 -random,memory,14952078,phmap::parallel_flat_hash_map_mt,592453632 -random,memory,14952197,phmap::parallel_flat_hash_map_mt,574582784 -random,time,20000000,phmap::parallel_flat_hash_map_mt,1.615000 -random,memory,20008974,phmap::parallel_flat_hash_map_mt,574586880 -random,memory,29333764,phmap::parallel_flat_hash_map_mt,574586880 -random,memory,29333765,phmap::parallel_flat_hash_map_mt,646033408 -random,memory,29334022,phmap::parallel_flat_hash_map_mt,646033408 -random,memory,29334023,phmap::parallel_flat_hash_map_mt,681766912 -random,memory,29342949,phmap::parallel_flat_hash_map_mt,681766912 -random,memory,29342950,phmap::parallel_flat_hash_map_mt,717488128 -random,memory,29345586,phmap::parallel_flat_hash_map_mt,717488128 -random,memory,29345587,phmap::parallel_flat_hash_map_mt,753205248 -random,memory,29347489,phmap::parallel_flat_hash_map_mt,753205248 -random,memory,29347490,phmap::parallel_flat_hash_map_mt,788930560 -random,memory,29348504,phmap::parallel_flat_hash_map_mt,788930560 -random,memory,29348542,phmap::parallel_flat_hash_map_mt,753209344 -random,memory,29349198,phmap::parallel_flat_hash_map_mt,753209344 -random,memory,29349199,phmap::parallel_flat_hash_map_mt,824655872 -random,memory,29352494,phmap::parallel_flat_hash_map_mt,824655872 -random,memory,29352495,phmap::parallel_flat_hash_map_mt,860377088 -random,memory,29358759,phmap::parallel_flat_hash_map_mt,860377088 -random,memory,29358760,phmap::parallel_flat_hash_map_mt,896094208 -random,memory,29361234,phmap::parallel_flat_hash_map_mt,896094208 -random,memory,29361235,phmap::parallel_flat_hash_map_mt,931811328 -random,memory,29362544,phmap::parallel_flat_hash_map_mt,931811328 -random,memory,29362545,phmap::parallel_flat_hash_map_mt,967536640 -random,memory,29369457,phmap::parallel_flat_hash_map_mt,967536640 -random,memory,29369458,phmap::parallel_flat_hash_map_mt,1003257856 -random,memory,29372921,phmap::parallel_flat_hash_map_mt,1003257856 -random,memory,29372922,phmap::parallel_flat_hash_map_mt,1038979072 -random,memory,29374936,phmap::parallel_flat_hash_map_mt,1038979072 -random,memory,29374937,phmap::parallel_flat_hash_map_mt,1074696192 -random,memory,29383512,phmap::parallel_flat_hash_map_mt,1074696192 -random,memory,29383513,phmap::parallel_flat_hash_map_mt,1110417408 -random,memory,29383512,phmap::parallel_flat_hash_map_mt,1110417408 -random,memory,29383513,phmap::parallel_flat_hash_map_mt,1181863936 -random,memory,29474438,phmap::parallel_flat_hash_map_mt,1181851648 -random,memory,29475679,phmap::parallel_flat_hash_map_mt,1146126336 -random,time,30000000,phmap::parallel_flat_hash_map_mt,2.718000 -random,memory,30039213,phmap::parallel_flat_hash_map_mt,1146114048 -random,time,40000000,phmap::parallel_flat_hash_map_mt,3.314000 -random,memory,40063406,phmap::parallel_flat_hash_map_mt,1146126336 -random,time,50000000,phmap::parallel_flat_hash_map_mt,3.930000 -random,memory,50000796,phmap::parallel_flat_hash_map_mt,1146003456 -random,memory,58662905,phmap::parallel_flat_hash_map_mt,1146118144 -random,memory,58662906,phmap::parallel_flat_hash_map_mt,1289007104 -random,memory,58690501,phmap::parallel_flat_hash_map_mt,1289007104 -random,memory,58690502,phmap::parallel_flat_hash_map_mt,1360453632 -random,memory,58698182,phmap::parallel_flat_hash_map_mt,1360453632 -random,memory,58698183,phmap::parallel_flat_hash_map_mt,1431904256 -random,memory,58704661,phmap::parallel_flat_hash_map_mt,1431904256 -random,memory,58704662,phmap::parallel_flat_hash_map_mt,1503346688 -random,memory,58708120,phmap::parallel_flat_hash_map_mt,1503346688 -random,memory,58708121,phmap::parallel_flat_hash_map_mt,1574785024 -random,memory,58718704,phmap::parallel_flat_hash_map_mt,1574785024 -random,memory,58718705,phmap::parallel_flat_hash_map_mt,1646223360 -random,memory,58720588,phmap::parallel_flat_hash_map_mt,1646223360 -random,memory,58720589,phmap::parallel_flat_hash_map_mt,1860554752 -random,memory,58720613,phmap::parallel_flat_hash_map_mt,1860554752 -random,memory,58720614,phmap::parallel_flat_hash_map_mt,1789112320 -random,memory,58721807,phmap::parallel_flat_hash_map_mt,1789112320 -random,memory,58721808,phmap::parallel_flat_hash_map_mt,1860558848 -random,memory,58722210,phmap::parallel_flat_hash_map_mt,1860558848 -random,memory,58722854,phmap::parallel_flat_hash_map_mt,1789112320 -random,memory,58722853,phmap::parallel_flat_hash_map_mt,1789112320 -random,memory,58722854,phmap::parallel_flat_hash_map_mt,1931997184 -random,memory,58723270,phmap::parallel_flat_hash_map_mt,1931997184 -random,memory,58723271,phmap::parallel_flat_hash_map_mt,2003435520 -random,memory,58725728,phmap::parallel_flat_hash_map_mt,2003435520 -random,memory,58725729,phmap::parallel_flat_hash_map_mt,2074873856 -random,memory,58729127,phmap::parallel_flat_hash_map_mt,2074873856 -random,memory,58729128,phmap::parallel_flat_hash_map_mt,2146328576 -random,memory,58738897,phmap::parallel_flat_hash_map_mt,2146328576 -random,memory,58738898,phmap::parallel_flat_hash_map_mt,2217775104 -random,memory,58747088,phmap::parallel_flat_hash_map_mt,2217775104 -random,memory,58747089,phmap::parallel_flat_hash_map_mt,2289213440 -random,memory,58790495,phmap::parallel_flat_hash_map_mt,2289213440 -random,memory,58790496,phmap::parallel_flat_hash_map_mt,2360659968 -random,memory,58912378,phmap::parallel_flat_hash_map_mt,2360659968 -random,memory,58915332,phmap::parallel_flat_hash_map_mt,2289213440 -random,time,60000000,phmap::parallel_flat_hash_map_mt,5.665000 -random,memory,60121415,phmap::parallel_flat_hash_map_mt,2289217536 -random,time,70000000,phmap::parallel_flat_hash_map_mt,6.304000 -random,memory,70000000,phmap::parallel_flat_hash_map_mt,2289008640 -random,time,80000000,phmap::parallel_flat_hash_map_mt,6.942000 -random,memory,80007185,phmap::parallel_flat_hash_map_mt,2289209344 -random,time,90000000,phmap::parallel_flat_hash_map_mt,7.608000 -random,memory,90008872,phmap::parallel_flat_hash_map_mt,2289201152 -random,time,100000000,phmap::parallel_flat_hash_map_mt,8.286000 diff --git a/extern/phmap/benchmark/results/output_flat_par_mutex_5 b/extern/phmap/benchmark/results/output_flat_par_mutex_5 deleted file mode 100644 index adcfe3d..0000000 --- a/extern/phmap/benchmark/results/output_flat_par_mutex_5 +++ /dev/null @@ -1,315 +0,0 @@ -random,memory,0,absl::flat_hash_map,15745024 -random,memory,238685,absl::flat_hash_map,15745024 -random,memory,238809,absl::flat_hash_map,11276288 -random,memory,458751,absl::flat_hash_map,11276288 -random,memory,458752,absl::flat_hash_map,29143040 -random,memory,485817,absl::flat_hash_map,29143040 -random,memory,486085,absl::flat_hash_map,20209664 -random,memory,675678,absl::flat_hash_map,20209664 -random,memory,675893,absl::flat_hash_map,19091456 -random,memory,917503,absl::flat_hash_map,19091456 -random,memory,917504,absl::flat_hash_map,54816768 -random,memory,927664,absl::flat_hash_map,54816768 -random,memory,927716,absl::flat_hash_map,36950016 -random,memory,1835007,absl::flat_hash_map,36950016 -random,memory,1835008,absl::flat_hash_map,108396544 -random,memory,1855763,absl::flat_hash_map,108396544 -random,memory,1855867,absl::flat_hash_map,72671232 -random,memory,3670015,absl::flat_hash_map,72671232 -random,memory,3670016,absl::flat_hash_map,215560192 -random,memory,3677233,absl::flat_hash_map,215560192 -random,memory,3677313,absl::flat_hash_map,144113664 -random,memory,7340031,absl::flat_hash_map,144113664 -random,memory,7340032,absl::flat_hash_map,429887488 -random,memory,7344858,absl::flat_hash_map,429887488 -random,memory,7344912,absl::flat_hash_map,286998528 -random,time,10000000,absl::flat_hash_map,0.935000 -random,memory,10007722,absl::flat_hash_map,286998528 -random,memory,14680063,absl::flat_hash_map,286998528 -random,memory,14680064,absl::flat_hash_map,858546176 -random,memory,14682782,absl::flat_hash_map,858546176 -random,memory,14682830,absl::flat_hash_map,572768256 -random,time,20000000,absl::flat_hash_map,2.244000 -random,memory,20010261,absl::flat_hash_map,572768256 -random,memory,29360127,absl::flat_hash_map,572768256 -random,memory,29360128,absl::flat_hash_map,1715859456 -random,memory,29363189,absl::flat_hash_map,1715859456 -random,memory,29363226,absl::flat_hash_map,1144311808 -random,time,30000000,absl::flat_hash_map,3.899000 -random,memory,30008430,absl::flat_hash_map,1144311808 -random,time,40000000,absl::flat_hash_map,5.165000 -random,memory,40003909,absl::flat_hash_map,1144311808 -random,time,50000000,absl::flat_hash_map,6.428000 -random,memory,50001112,absl::flat_hash_map,1144311808 -random,memory,58720255,absl::flat_hash_map,1144311808 -random,memory,58720256,absl::flat_hash_map,3430490112 -random,memory,58728488,absl::flat_hash_map,3430490112 -random,memory,58728529,absl::flat_hash_map,2287411200 -random,time,60000000,absl::flat_hash_map,8.813000 -random,memory,60004544,absl::flat_hash_map,2287411200 -random,time,70000000,absl::flat_hash_map,10.289000 -random,memory,70001141,absl::flat_hash_map,2287411200 -random,time,80000000,absl::flat_hash_map,11.765000 -random,memory,80002276,absl::flat_hash_map,2287411200 -random,time,90000000,absl::flat_hash_map,13.235000 -random,memory,90011453,absl::flat_hash_map,2287411200 -random,time,100000000,absl::flat_hash_map,14.683000 -random,memory,0,absl::parallel_flat_hash_map_mt,8097792 -random,memory,226683,absl::parallel_flat_hash_map_mt,8101888 -random,memory,226684,absl::parallel_flat_hash_map_mt,9236480 -random,memory,233565,absl::parallel_flat_hash_map_mt,9236480 -random,memory,233647,absl::parallel_flat_hash_map_mt,12922880 -random,memory,274958,absl::parallel_flat_hash_map_mt,13205504 -random,memory,454560,absl::parallel_flat_hash_map_mt,13205504 -random,memory,454569,absl::parallel_flat_hash_map_mt,15454208 -random,memory,458135,absl::parallel_flat_hash_map_mt,15454208 -random,memory,458136,absl::parallel_flat_hash_map_mt,20520960 -random,memory,464748,absl::parallel_flat_hash_map_mt,20520960 -random,memory,464749,absl::parallel_flat_hash_map_mt,23891968 -random,memory,585537,absl::parallel_flat_hash_map_mt,24461312 -random,memory,904457,absl::parallel_flat_hash_map_mt,24461312 -random,memory,904458,absl::parallel_flat_hash_map_mt,25587712 -random,memory,906298,absl::parallel_flat_hash_map_mt,25587712 -random,memory,906305,absl::parallel_flat_hash_map_mt,22061056 -random,memory,912070,absl::parallel_flat_hash_map_mt,22061056 -random,memory,912071,absl::parallel_flat_hash_map_mt,25481216 -random,memory,913175,absl::parallel_flat_hash_map_mt,25481216 -random,memory,913176,absl::parallel_flat_hash_map_mt,28229632 -random,memory,916122,absl::parallel_flat_hash_map_mt,28229632 -random,memory,916123,absl::parallel_flat_hash_map_mt,29917184 -random,memory,917759,absl::parallel_flat_hash_map_mt,29917184 -random,memory,917760,absl::parallel_flat_hash_map_mt,31617024 -random,memory,921180,absl::parallel_flat_hash_map_mt,31617024 -random,memory,921181,absl::parallel_flat_hash_map_mt,34426880 -random,memory,923206,absl::parallel_flat_hash_map_mt,34426880 -random,memory,923207,absl::parallel_flat_hash_map_mt,37249024 -random,memory,932268,absl::parallel_flat_hash_map_mt,37249024 -random,memory,932269,absl::parallel_flat_hash_map_mt,39493632 -random,memory,960264,absl::parallel_flat_hash_map_mt,39972864 -random,memory,1818080,absl::parallel_flat_hash_map_mt,39972864 -random,memory,1818081,absl::parallel_flat_hash_map_mt,42213376 -random,memory,1818368,absl::parallel_flat_hash_map_mt,43331584 -random,memory,1824622,absl::parallel_flat_hash_map_mt,44445696 -random,memory,1825724,absl::parallel_flat_hash_map_mt,44445696 -random,memory,1825725,absl::parallel_flat_hash_map_mt,46682112 -random,memory,1827670,absl::parallel_flat_hash_map_mt,47800320 -random,memory,1829247,absl::parallel_flat_hash_map_mt,47800320 -random,memory,1829248,absl::parallel_flat_hash_map_mt,52269056 -random,memory,1833459,absl::parallel_flat_hash_map_mt,52264960 -random,memory,1833460,absl::parallel_flat_hash_map_mt,56733696 -random,memory,1835812,absl::parallel_flat_hash_map_mt,56729600 -random,memory,1835813,absl::parallel_flat_hash_map_mt,60080128 -random,memory,1836350,absl::parallel_flat_hash_map_mt,60080128 -random,memory,1836351,absl::parallel_flat_hash_map_mt,63438848 -random,memory,1837412,absl::parallel_flat_hash_map_mt,64548864 -random,memory,1838938,absl::parallel_flat_hash_map_mt,64548864 -random,memory,1838939,absl::parallel_flat_hash_map_mt,66777088 -random,memory,1839594,absl::parallel_flat_hash_map_mt,67891200 -random,memory,1841385,absl::parallel_flat_hash_map_mt,67891200 -random,memory,1841386,absl::parallel_flat_hash_map_mt,70123520 -random,memory,1843499,absl::parallel_flat_hash_map_mt,70123520 -random,memory,1843500,absl::parallel_flat_hash_map_mt,74596352 -random,memory,1851800,absl::parallel_flat_hash_map_mt,76824576 -random,memory,1881249,absl::parallel_flat_hash_map_mt,76824576 -random,memory,1881322,absl::parallel_flat_hash_map_mt,75706368 -random,memory,3642650,absl::parallel_flat_hash_map_mt,75706368 -random,memory,3642651,absl::parallel_flat_hash_map_mt,80175104 -random,memory,3650189,absl::parallel_flat_hash_map_mt,82411520 -random,memory,3658302,absl::parallel_flat_hash_map_mt,84652032 -random,memory,3659792,absl::parallel_flat_hash_map_mt,86884352 -random,memory,3660327,absl::parallel_flat_hash_map_mt,89116672 -random,memory,3662326,absl::parallel_flat_hash_map_mt,89116672 -random,memory,3662327,absl::parallel_flat_hash_map_mt,95813632 -random,memory,3666371,absl::parallel_flat_hash_map_mt,95817728 -random,memory,3666372,absl::parallel_flat_hash_map_mt,102522880 -random,memory,3667092,absl::parallel_flat_hash_map_mt,104767488 -random,memory,3667485,absl::parallel_flat_hash_map_mt,104767488 -random,memory,3667486,absl::parallel_flat_hash_map_mt,111464448 -random,memory,3668276,absl::parallel_flat_hash_map_mt,111464448 -random,memory,3668277,absl::parallel_flat_hash_map_mt,115920896 -random,memory,3670350,absl::parallel_flat_hash_map_mt,118145024 -random,memory,3671585,absl::parallel_flat_hash_map_mt,120381440 -random,memory,3672959,absl::parallel_flat_hash_map_mt,122617856 -random,memory,3673809,absl::parallel_flat_hash_map_mt,122617856 -random,memory,3673810,absl::parallel_flat_hash_map_mt,129314816 -random,memory,3675897,absl::parallel_flat_hash_map_mt,131547136 -random,memory,3676555,absl::parallel_flat_hash_map_mt,133783552 -random,memory,3676779,absl::parallel_flat_hash_map_mt,136015872 -random,memory,3677839,absl::parallel_flat_hash_map_mt,138244096 -random,memory,3678355,absl::parallel_flat_hash_map_mt,140472320 -random,memory,3678866,absl::parallel_flat_hash_map_mt,142700544 -random,memory,3690202,absl::parallel_flat_hash_map_mt,142700544 -random,memory,3690203,absl::parallel_flat_hash_map_mt,149397504 -random,memory,3722970,absl::parallel_flat_hash_map_mt,149393408 -random,memory,3723091,absl::parallel_flat_hash_map_mt,147161088 -random,memory,7304291,absl::parallel_flat_hash_map_mt,147161088 -random,memory,7304305,absl::parallel_flat_hash_map_mt,156094464 -random,memory,7317618,absl::parallel_flat_hash_map_mt,160567296 -random,memory,7321953,absl::parallel_flat_hash_map_mt,165027840 -random,memory,7324203,absl::parallel_flat_hash_map_mt,169492480 -random,memory,7327095,absl::parallel_flat_hash_map_mt,173953024 -random,memory,7329008,absl::parallel_flat_hash_map_mt,178417664 -random,memory,7330112,absl::parallel_flat_hash_map_mt,182886400 -random,memory,7330870,absl::parallel_flat_hash_map_mt,187346944 -random,memory,7332208,absl::parallel_flat_hash_map_mt,191815680 -random,memory,7332866,absl::parallel_flat_hash_map_mt,196280320 -random,memory,7333480,absl::parallel_flat_hash_map_mt,196280320 -random,memory,7333481,absl::parallel_flat_hash_map_mt,209686528 -random,memory,7336329,absl::parallel_flat_hash_map_mt,214155264 -random,memory,7337014,absl::parallel_flat_hash_map_mt,218624000 -random,memory,7338084,absl::parallel_flat_hash_map_mt,223092736 -random,memory,7338525,absl::parallel_flat_hash_map_mt,227553280 -random,memory,7340267,absl::parallel_flat_hash_map_mt,232026112 -random,memory,7340739,absl::parallel_flat_hash_map_mt,236490752 -random,memory,7342416,absl::parallel_flat_hash_map_mt,240955392 -random,memory,7343877,absl::parallel_flat_hash_map_mt,245415936 -random,memory,7348892,absl::parallel_flat_hash_map_mt,245415936 -random,memory,7348911,absl::parallel_flat_hash_map_mt,240947200 -random,memory,7349331,absl::parallel_flat_hash_map_mt,240947200 -random,memory,7349332,absl::parallel_flat_hash_map_mt,249876480 -random,memory,7349765,absl::parallel_flat_hash_map_mt,254345216 -random,memory,7349943,absl::parallel_flat_hash_map_mt,258818048 -random,memory,7351616,absl::parallel_flat_hash_map_mt,263278592 -random,memory,7352328,absl::parallel_flat_hash_map_mt,267739136 -random,memory,7352954,absl::parallel_flat_hash_map_mt,272199680 -random,memory,7353831,absl::parallel_flat_hash_map_mt,276664320 -random,memory,7360307,absl::parallel_flat_hash_map_mt,281124864 -random,memory,7360322,absl::parallel_flat_hash_map_mt,281124864 -random,memory,7360340,absl::parallel_flat_hash_map_mt,276656128 -random,memory,7362083,absl::parallel_flat_hash_map_mt,276656128 -random,memory,7362084,absl::parallel_flat_hash_map_mt,285589504 -random,memory,7368696,absl::parallel_flat_hash_map_mt,290050048 -random,memory,7370511,absl::parallel_flat_hash_map_mt,294510592 -random,memory,7545581,absl::parallel_flat_hash_map_mt,294510592 -random,memory,7545600,absl::parallel_flat_hash_map_mt,290041856 -random,time,10000000,absl::parallel_flat_hash_map_mt,0.685000 -random,memory,10125610,absl::parallel_flat_hash_map_mt,290045952 -random,memory,14624490,absl::parallel_flat_hash_map_mt,290045952 -random,memory,14624491,absl::parallel_flat_hash_map_mt,307908608 -random,memory,14640456,absl::parallel_flat_hash_map_mt,316846080 -random,memory,14645771,absl::parallel_flat_hash_map_mt,325771264 -random,memory,14646996,absl::parallel_flat_hash_map_mt,334704640 -random,memory,14657141,absl::parallel_flat_hash_map_mt,334704640 -random,memory,14657247,absl::parallel_flat_hash_map_mt,325775360 -random,memory,14658963,absl::parallel_flat_hash_map_mt,325775360 -random,memory,14658964,absl::parallel_flat_hash_map_mt,343642112 -random,memory,14659931,absl::parallel_flat_hash_map_mt,352571392 -random,memory,14665267,absl::parallel_flat_hash_map_mt,352571392 -random,memory,14665268,absl::parallel_flat_hash_map_mt,379363328 -random,memory,14670387,absl::parallel_flat_hash_map_mt,379363328 -random,memory,14670388,absl::parallel_flat_hash_map_mt,397221888 -random,memory,14671763,absl::parallel_flat_hash_map_mt,397221888 -random,memory,14671764,absl::parallel_flat_hash_map_mt,424009728 -random,memory,14677622,absl::parallel_flat_hash_map_mt,432939008 -random,memory,14680084,absl::parallel_flat_hash_map_mt,441864192 -random,memory,14680689,absl::parallel_flat_hash_map_mt,450789376 -random,memory,14683195,absl::parallel_flat_hash_map_mt,459726848 -random,memory,14683950,absl::parallel_flat_hash_map_mt,468652032 -random,memory,14688089,absl::parallel_flat_hash_map_mt,477581312 -random,memory,14691193,absl::parallel_flat_hash_map_mt,486514688 -random,memory,14694936,absl::parallel_flat_hash_map_mt,495443968 -random,memory,14696388,absl::parallel_flat_hash_map_mt,504377344 -random,memory,14697737,absl::parallel_flat_hash_map_mt,513314816 -random,memory,14698140,absl::parallel_flat_hash_map_mt,522248192 -random,memory,14699618,absl::parallel_flat_hash_map_mt,531177472 -random,memory,14700009,absl::parallel_flat_hash_map_mt,540110848 -random,memory,14700466,absl::parallel_flat_hash_map_mt,540110848 -random,memory,14700467,absl::parallel_flat_hash_map_mt,566910976 -random,memory,14716491,absl::parallel_flat_hash_map_mt,575832064 -random,memory,14739622,absl::parallel_flat_hash_map_mt,584757248 -random,memory,14831157,absl::parallel_flat_hash_map_mt,584757248 -random,memory,14831255,absl::parallel_flat_hash_map_mt,575823872 -random,time,20000000,absl::parallel_flat_hash_map_mt,1.386000 -random,memory,20162525,absl::parallel_flat_hash_map_mt,575811584 -random,memory,29290166,absl::parallel_flat_hash_map_mt,575811584 -random,memory,29290167,absl::parallel_flat_hash_map_mt,611536896 -random,memory,29290166,absl::parallel_flat_hash_map_mt,611536896 -random,memory,29290167,absl::parallel_flat_hash_map_mt,647262208 -random,memory,29308217,absl::parallel_flat_hash_map_mt,665128960 -random,memory,29316853,absl::parallel_flat_hash_map_mt,682983424 -random,memory,29322818,absl::parallel_flat_hash_map_mt,682983424 -random,memory,29322819,absl::parallel_flat_hash_map_mt,736567296 -random,memory,29335771,absl::parallel_flat_hash_map_mt,754425856 -random,memory,29341930,absl::parallel_flat_hash_map_mt,772284416 -random,memory,29343145,absl::parallel_flat_hash_map_mt,790142976 -random,memory,29350232,absl::parallel_flat_hash_map_mt,808005632 -random,memory,29354162,absl::parallel_flat_hash_map_mt,825868288 -random,memory,29356843,absl::parallel_flat_hash_map_mt,843722752 -random,memory,29362327,absl::parallel_flat_hash_map_mt,843722752 -random,memory,29362363,absl::parallel_flat_hash_map_mt,825860096 -random,memory,29366343,absl::parallel_flat_hash_map_mt,825860096 -random,memory,29366344,absl::parallel_flat_hash_map_mt,861585408 -random,memory,29369094,absl::parallel_flat_hash_map_mt,879448064 -random,memory,29370268,absl::parallel_flat_hash_map_mt,897310720 -random,memory,29370522,absl::parallel_flat_hash_map_mt,897310720 -random,memory,29370585,absl::parallel_flat_hash_map_mt,879452160 -random,memory,29371240,absl::parallel_flat_hash_map_mt,879452160 -random,memory,29371241,absl::parallel_flat_hash_map_mt,915177472 -random,memory,29377637,absl::parallel_flat_hash_map_mt,933036032 -random,memory,29378552,absl::parallel_flat_hash_map_mt,950894592 -random,memory,29380612,absl::parallel_flat_hash_map_mt,968757248 -random,memory,29382146,absl::parallel_flat_hash_map_mt,986615808 -random,memory,29383649,absl::parallel_flat_hash_map_mt,1004474368 -random,memory,29386774,absl::parallel_flat_hash_map_mt,1022328832 -random,memory,29391253,absl::parallel_flat_hash_map_mt,1040187392 -random,memory,29392067,absl::parallel_flat_hash_map_mt,1058045952 -random,memory,29393223,absl::parallel_flat_hash_map_mt,1075908608 -random,memory,29397664,absl::parallel_flat_hash_map_mt,1093763072 -random,memory,29397820,absl::parallel_flat_hash_map_mt,1111621632 -random,memory,29402968,absl::parallel_flat_hash_map_mt,1129480192 -random,memory,29416940,absl::parallel_flat_hash_map_mt,1147346944 -random,memory,29425034,absl::parallel_flat_hash_map_mt,1165201408 -random,memory,29437495,absl::parallel_flat_hash_map_mt,1165201408 -random,memory,29437615,absl::parallel_flat_hash_map_mt,1147342848 -random,time,30000000,absl::parallel_flat_hash_map_mt,2.397000 -random,memory,30000064,absl::parallel_flat_hash_map_mt,1147179008 -random,time,40000000,absl::parallel_flat_hash_map_mt,2.894000 -random,memory,40092788,absl::parallel_flat_hash_map_mt,1147342848 -random,time,50000000,absl::parallel_flat_hash_map_mt,3.419000 -random,memory,50016621,absl::parallel_flat_hash_map_mt,1147351040 -random,memory,58617730,absl::parallel_flat_hash_map_mt,1147351040 -random,memory,58617731,absl::parallel_flat_hash_map_mt,1218797568 -random,memory,58624447,absl::parallel_flat_hash_map_mt,1254522880 -random,memory,58647163,absl::parallel_flat_hash_map_mt,1290244096 -random,memory,58652294,absl::parallel_flat_hash_map_mt,1290244096 -random,memory,58652331,absl::parallel_flat_hash_map_mt,1254518784 -random,memory,58657858,absl::parallel_flat_hash_map_mt,1254518784 -random,memory,58657859,absl::parallel_flat_hash_map_mt,1325965312 -random,memory,58672238,absl::parallel_flat_hash_map_mt,1361690624 -random,memory,58684143,absl::parallel_flat_hash_map_mt,1361690624 -random,memory,58684144,absl::parallel_flat_hash_map_mt,1468854272 -random,memory,58686216,absl::parallel_flat_hash_map_mt,1504571392 -random,memory,58705047,absl::parallel_flat_hash_map_mt,1540292608 -random,memory,58707030,absl::parallel_flat_hash_map_mt,1576017920 -random,memory,58713785,absl::parallel_flat_hash_map_mt,1611739136 -random,memory,58719051,absl::parallel_flat_hash_map_mt,1647460352 -random,memory,58719339,absl::parallel_flat_hash_map_mt,1683181568 -random,memory,58721442,absl::parallel_flat_hash_map_mt,1718906880 -random,memory,58722510,absl::parallel_flat_hash_map_mt,1754628096 -random,memory,58731866,absl::parallel_flat_hash_map_mt,1790353408 -random,memory,58732950,absl::parallel_flat_hash_map_mt,1826086912 -random,memory,58733354,absl::parallel_flat_hash_map_mt,1861804032 -random,memory,58734852,absl::parallel_flat_hash_map_mt,1897525248 -random,memory,58735358,absl::parallel_flat_hash_map_mt,1933242368 -random,memory,58739746,absl::parallel_flat_hash_map_mt,1968967680 -random,memory,58739993,absl::parallel_flat_hash_map_mt,2004692992 -random,memory,58745310,absl::parallel_flat_hash_map_mt,2040410112 -random,memory,58746926,absl::parallel_flat_hash_map_mt,2076135424 -random,memory,58747125,absl::parallel_flat_hash_map_mt,2111860736 -random,memory,58756624,absl::parallel_flat_hash_map_mt,2147586048 -random,memory,58769646,absl::parallel_flat_hash_map_mt,2183303168 -random,memory,58771866,absl::parallel_flat_hash_map_mt,2219024384 -random,memory,58789875,absl::parallel_flat_hash_map_mt,2254741504 -random,memory,58798355,absl::parallel_flat_hash_map_mt,2290466816 -random,memory,58824040,absl::parallel_flat_hash_map_mt,2326183936 -random,memory,59024387,absl::parallel_flat_hash_map_mt,2326183936 -random,memory,59024466,absl::parallel_flat_hash_map_mt,2290458624 -random,time,60000000,absl::parallel_flat_hash_map_mt,4.973000 -random,memory,60000000,absl::parallel_flat_hash_map_mt,2290229248 -random,time,70000000,absl::parallel_flat_hash_map_mt,5.544000 -random,memory,70133805,absl::parallel_flat_hash_map_mt,2290458624 -random,time,80000000,absl::parallel_flat_hash_map_mt,6.054000 -random,memory,80033533,absl::parallel_flat_hash_map_mt,2290458624 -random,time,90000000,absl::parallel_flat_hash_map_mt,6.624000 -random,memory,90023483,absl::parallel_flat_hash_map_mt,2290458624 -random,time,100000000,absl::parallel_flat_hash_map_mt,7.175000 diff --git a/extern/phmap/benchmark/results/output_mt_par_only b/extern/phmap/benchmark/results/output_mt_par_only deleted file mode 100644 index 30ed8e4..0000000 --- a/extern/phmap/benchmark/results/output_mt_par_only +++ /dev/null @@ -1,104 +0,0 @@ -random,memory,0,absl::parallel_flat_hash_map,41910272 -random,memory,924422,absl::parallel_flat_hash_map,41910272 -random,memory,924433,absl::parallel_flat_hash_map,44146688 -random,memory,952903,absl::parallel_flat_hash_map,44146688 -random,memory,953013,absl::parallel_flat_hash_map,40779776 -random,memory,1010078,absl::parallel_flat_hash_map,40779776 -random,memory,1010200,absl::parallel_flat_hash_map,38539264 -random,memory,1863512,absl::parallel_flat_hash_map,38539264 -random,memory,1863540,absl::parallel_flat_hash_map,85454848 -random,memory,2941624,absl::parallel_flat_hash_map,85454848 -random,memory,2941816,absl::parallel_flat_hash_map,74272768 -random,memory,3683917,absl::parallel_flat_hash_map,74272768 -random,memory,3683918,absl::parallel_flat_hash_map,154685440 -random,memory,3692980,absl::parallel_flat_hash_map,154685440 -random,memory,3693011,absl::parallel_flat_hash_map,168075264 -random,memory,4474443,absl::parallel_flat_hash_map,168075264 -random,memory,4474556,absl::parallel_flat_hash_map,145719296 -random,memory,6754095,absl::parallel_flat_hash_map,145707008 -random,memory,6754147,absl::parallel_flat_hash_map,226099200 -random,memory,7294556,absl::parallel_flat_hash_map,226099200 -random,memory,7294670,absl::parallel_flat_hash_map,235036672 -random,memory,7983489,absl::parallel_flat_hash_map,235036672 -random,memory,7983651,absl::parallel_flat_hash_map,261820416 -random,memory,8242552,absl::parallel_flat_hash_map,261820416 -random,memory,8242691,absl::parallel_flat_hash_map,252887040 -random,memory,8949833,absl::parallel_flat_hash_map,252887040 -random,memory,8949892,absl::parallel_flat_hash_map,305504256 -random,memory,8987991,absl::parallel_flat_hash_map,305475584 -random,memory,8988323,absl::parallel_flat_hash_map,296538112 -random,memory,9004502,absl::parallel_flat_hash_map,296538112 -random,memory,9004594,absl::parallel_flat_hash_map,287604736 -random,time,10000000,absl::parallel_flat_hash_map,0.471000 -random,memory,10862319,absl::parallel_flat_hash_map,287756288 -random,memory,14670115,absl::parallel_flat_hash_map,287756288 -random,memory,14670116,absl::parallel_flat_hash_map,573566976 -random,memory,14678079,absl::parallel_flat_hash_map,573566976 -random,memory,14678102,absl::parallel_flat_hash_map,627142656 -random,memory,14690163,absl::parallel_flat_hash_map,627142656 -random,memory,14690164,absl::parallel_flat_hash_map,716455936 -random,memory,15024573,absl::parallel_flat_hash_map,716455936 -random,memory,15024686,absl::parallel_flat_hash_map,591388672 -random,memory,15476837,absl::parallel_flat_hash_map,591388672 -random,memory,15476994,absl::parallel_flat_hash_map,573521920 -random,time,20000000,absl::parallel_flat_hash_map,0.956000 -random,memory,20410280,absl::parallel_flat_hash_map,573497344 -random,memory,29273379,absl::parallel_flat_hash_map,573497344 -random,memory,29273380,absl::parallel_flat_hash_map,1073627136 -random,memory,29353638,absl::parallel_flat_hash_map,1073627136 -random,memory,29353639,absl::parallel_flat_hash_map,1252241408 -random,memory,29686553,absl::parallel_flat_hash_map,1287847936 -random,memory,29688294,absl::parallel_flat_hash_map,1287847936 -random,memory,29688316,absl::parallel_flat_hash_map,1252122624 -random,memory,29707720,absl::parallel_flat_hash_map,1252122624 -random,memory,29707784,absl::parallel_flat_hash_map,1180663808 -random,memory,29924480,absl::parallel_flat_hash_map,1180577792 -random,memory,29924509,absl::parallel_flat_hash_map,1144856576 -random,time,30000000,absl::parallel_flat_hash_map,1.567000 -random,memory,30708549,absl::parallel_flat_hash_map,1145061376 -random,time,40000000,absl::parallel_flat_hash_map,1.993000 -random,memory,40790845,absl::parallel_flat_hash_map,1145049088 -random,time,50000000,absl::parallel_flat_hash_map,2.423000 -random,memory,50009479,absl::parallel_flat_hash_map,1145065472 -random,memory,58110357,absl::parallel_flat_hash_map,1145065472 -random,memory,58110423,absl::parallel_flat_hash_map,1716617216 -random,memory,58545607,absl::parallel_flat_hash_map,1716617216 -random,memory,58545651,absl::parallel_flat_hash_map,1859506176 -random,memory,58671713,absl::parallel_flat_hash_map,1859506176 -random,memory,58672142,absl::parallel_flat_hash_map,2002403328 -random,memory,58697955,absl::parallel_flat_hash_map,2002403328 -random,memory,58697956,absl::parallel_flat_hash_map,2288181248 -random,memory,58704727,absl::parallel_flat_hash_map,2288181248 -random,memory,58704728,absl::parallel_flat_hash_map,2359627776 -random,memory,58705597,absl::parallel_flat_hash_map,2359627776 -random,memory,58705598,absl::parallel_flat_hash_map,2288181248 -random,memory,58730957,absl::parallel_flat_hash_map,2288181248 -random,memory,58730958,absl::parallel_flat_hash_map,2573950976 -random,memory,58736077,absl::parallel_flat_hash_map,2645401600 -random,memory,58736169,absl::parallel_flat_hash_map,2716848128 -random,memory,58742702,absl::parallel_flat_hash_map,2716848128 -random,memory,58742703,absl::parallel_flat_hash_map,2859741184 -random,memory,58787870,absl::parallel_flat_hash_map,2859741184 -random,memory,58787918,absl::parallel_flat_hash_map,2716848128 -random,memory,58863920,absl::parallel_flat_hash_map,2716848128 -random,memory,58863994,absl::parallel_flat_hash_map,2645397504 -random,memory,59087411,absl::parallel_flat_hash_map,2645397504 -random,memory,59087521,absl::parallel_flat_hash_map,2573955072 -random,memory,59355340,absl::parallel_flat_hash_map,2573877248 -random,memory,59355391,absl::parallel_flat_hash_map,2502426624 -random,memory,59387965,absl::parallel_flat_hash_map,2502426624 -random,memory,59388025,absl::parallel_flat_hash_map,2430980096 -random,memory,59484220,absl::parallel_flat_hash_map,2430951424 -random,memory,59484283,absl::parallel_flat_hash_map,2359500800 -random,memory,59503076,absl::parallel_flat_hash_map,2359500800 -random,memory,59503156,absl::parallel_flat_hash_map,2288058368 -random,time,60000000,absl::parallel_flat_hash_map,3.220000 -random,memory,60745902,absl::parallel_flat_hash_map,2288160768 -random,time,70000000,absl::parallel_flat_hash_map,3.671000 -random,memory,70722318,absl::parallel_flat_hash_map,2288156672 -random,time,80000000,absl::parallel_flat_hash_map,4.159000 -random,memory,80002281,absl::parallel_flat_hash_map,2288119808 -random,time,90000000,absl::parallel_flat_hash_map,4.615000 -random,memory,90715643,absl::parallel_flat_hash_map,2288152576 -random,time,100000000,absl::parallel_flat_hash_map,5.128000 -random,memory,100000000,absl::parallel_flat_hash_map,2287927296 diff --git a/extern/phmap/benchmark/results/output_mt_stl_flat_par b/extern/phmap/benchmark/results/output_mt_stl_flat_par deleted file mode 100644 index e6b94d5..0000000 --- a/extern/phmap/benchmark/results/output_mt_stl_flat_par +++ /dev/null @@ -1,446 +0,0 @@ -random,memory,0,std::unordered_map,6217728 -random,memory,81839,std::unordered_map,6217728 -random,memory,81866,std::unordered_map,7081984 -random,memory,96791,std::unordered_map,7081984 -random,memory,96811,std::unordered_map,7938048 -random,memory,108492,std::unordered_map,7938048 -random,memory,108510,std::unordered_map,8482816 -random,memory,119431,std::unordered_map,8482816 -random,memory,119443,std::unordered_map,9027584 -random,memory,127648,std::unordered_map,9027584 -random,memory,127666,std::unordered_map,9420800 -random,memory,131071,std::unordered_map,9420800 -random,memory,131072,std::unordered_map,11681792 -random,memory,140589,std::unordered_map,11681792 -random,memory,140596,std::unordered_map,12238848 -random,memory,152717,std::unordered_map,12238848 -random,memory,152732,std::unordered_map,12861440 -random,memory,164819,std::unordered_map,12861440 -random,memory,164832,std::unordered_map,13570048 -random,memory,176210,std::unordered_map,13570048 -random,memory,176219,std::unordered_map,14192640 -random,memory,185598,std::unordered_map,14581760 -random,memory,195438,std::unordered_map,14581760 -random,memory,195443,std::unordered_map,15126528 -random,memory,206045,std::unordered_map,15126528 -random,memory,206062,std::unordered_map,15675392 -random,memory,216715,std::unordered_map,15675392 -random,memory,216726,std::unordered_map,16220160 -random,memory,227698,std::unordered_map,16220160 -random,memory,227712,std::unordered_map,16764928 -random,memory,238365,std::unordered_map,16764928 -random,memory,238381,std::unordered_map,17309696 -random,memory,248089,std::unordered_map,17309696 -random,memory,248095,std::unordered_map,17858560 -random,memory,257442,std::unordered_map,18325504 -random,memory,262143,std::unordered_map,18325504 -random,memory,262144,std::unordered_map,26894336 -random,memory,262143,std::unordered_map,26894336 -random,memory,262144,std::unordered_map,22691840 -random,memory,273217,std::unordered_map,23314432 -random,memory,284202,std::unordered_map,23937024 -random,memory,294934,std::unordered_map,24403968 -random,memory,304770,std::unordered_map,24948736 -random,memory,314973,std::unordered_map,25497600 -random,memory,325228,std::unordered_map,26046464 -random,memory,335546,std::unordered_map,26591232 -random,memory,344776,std::unordered_map,26980352 -random,memory,353536,std::unordered_map,27525120 -random,memory,362203,std::unordered_map,27996160 -random,memory,371418,std::unordered_map,28385280 -random,memory,380977,std::unordered_map,28852224 -random,memory,390397,std::unordered_map,29396992 -random,memory,399764,std::unordered_map,29863936 -random,memory,409260,std::unordered_map,30334976 -random,memory,418252,std::unordered_map,30801920 -random,memory,426340,std::unordered_map,31191040 -random,memory,434549,std::unordered_map,31657984 -random,memory,443151,std::unordered_map,32129024 -random,memory,451873,std::unordered_map,32518144 -random,memory,460714,std::unordered_map,32985088 -random,memory,469657,std::unordered_map,33476608 -random,memory,478601,std::unordered_map,33865728 -random,memory,487440,std::unordered_map,34336768 -random,memory,494742,std::unordered_map,34725888 -random,memory,502423,std::unordered_map,35192832 -random,memory,518619,std::unordered_map,35971072 -random,memory,524287,std::unordered_map,35971072 -random,memory,524288,std::unordered_map,53104640 -random,memory,524287,std::unordered_map,53104640 -random,memory,524288,std::unordered_map,44699648 -random,memory,549272,std::unordered_map,45944832 -random,memory,558487,std::unordered_map,46411776 -random,memory,568160,std::unordered_map,46882816 -random,memory,577422,std::unordered_map,47427584 -random,memory,605424,std::unordered_map,48828416 -random,memory,640487,std::unordered_map,50622464 -random,memory,649784,std::unordered_map,51171328 -random,memory,684975,std::unordered_map,52965376 -random,memory,718904,std::unordered_map,54677504 -random,memory,753470,std::unordered_map,56393728 -random,memory,787320,std::unordered_map,58187776 -random,memory,828012,std::unordered_map,60215296 -random,memory,868058,std::unordered_map,62320640 -random,memory,906661,std::unordered_map,64348160 -random,memory,945911,std::unordered_map,66297856 -random,memory,990443,std::unordered_map,68644864 -random,memory,1036174,std::unordered_map,70983680 -random,memory,1048575,std::unordered_map,71294976 -random,memory,1048576,std::unordered_map,105234432 -random,memory,1048575,std::unordered_map,105234432 -random,memory,1048576,std::unordered_map,88424448 -random,memory,1100160,std::unordered_map,91078656 -random,memory,1160386,std::unordered_map,94117888 -random,memory,1221920,std::unordered_map,97316864 -random,memory,1282706,std::unordered_map,100433920 -random,memory,1342726,std::unordered_map,103477248 -random,memory,1401981,std::unordered_map,106594304 -random,memory,1464762,std::unordered_map,109793280 -random,memory,1530705,std::unordered_map,113143808 -random,memory,1603780,std::unordered_map,116887552 -random,memory,1674989,std::unordered_map,120631296 -random,memory,1752908,std::unordered_map,124608512 -random,memory,1826840,std::unordered_map,128352256 -random,memory,1901645,std::unordered_map,132247552 -random,memory,1981814,std::unordered_map,136306688 -random,memory,2068859,std::unordered_map,140754944 -random,memory,2097151,std::unordered_map,141922304 -random,memory,2097152,std::unordered_map,209481728 -random,memory,2097151,std::unordered_map,209481728 -random,memory,2097152,std::unordered_map,175861760 -random,memory,2207315,std::unordered_map,181477376 -random,memory,2312577,std::unordered_map,186937344 -random,memory,2423407,std::unordered_map,192659456 -random,memory,2540989,std::unordered_map,198664192 -random,memory,2659046,std::unordered_map,204750848 -random,memory,2780893,std::unordered_map,210989056 -random,memory,2908456,std::unordered_map,217616384 -random,memory,3037917,std::unordered_map,224169984 -random,memory,3170468,std::unordered_map,230952960 -random,memory,3306278,std::unordered_map,237973504 -random,memory,3450118,std::unordered_map,245383168 -random,memory,3598043,std::unordered_map,252985344 -random,memory,3747662,std::unordered_map,260706304 -random,memory,3904906,std::unordered_map,268820480 -random,memory,4066463,std::unordered_map,277086208 -random,memory,4194303,std::unordered_map,283484160 -random,memory,4194304,std::unordered_map,418127872 -random,memory,4194303,std::unordered_map,418127872 -random,memory,4194304,std::unordered_map,350887936 -random,memory,4406007,std::unordered_map,361725952 -random,memory,4618998,std::unordered_map,372645888 -random,memory,4841808,std::unordered_map,384188416 -random,memory,5068021,std::unordered_map,395784192 -random,memory,5303596,std::unordered_map,407875584 -random,memory,5541719,std::unordered_map,420122624 -random,memory,5791497,std::unordered_map,432910336 -random,memory,6050086,std::unordered_map,446242816 -random,memory,6317526,std::unordered_map,459972608 -random,memory,6591123,std::unordered_map,474009600 -random,memory,6871888,std::unordered_map,488439808 -random,memory,7157069,std::unordered_map,503103488 -random,memory,7455408,std::unordered_map,518389760 -random,memory,7759096,std::unordered_map,533991424 -random,memory,8071668,std::unordered_map,550060032 -random,memory,8388607,std::unordered_map,566202368 -random,memory,8388608,std::unordered_map,835330048 -random,memory,8388607,std::unordered_map,835330048 -random,memory,8388608,std::unordered_map,700846080 -random,memory,8800929,std::unordered_map,721985536 -random,memory,9229377,std::unordered_map,743981056 -random,memory,9669903,std::unordered_map,766681088 -random,time,10000000,std::unordered_map,4.058000 -random,memory,10006234,std::unordered_map,783917056 -random,memory,10471995,std::unordered_map,807780352 -random,memory,10944895,std::unordered_map,832118784 -random,memory,11437088,std::unordered_map,857387008 -random,memory,11942425,std::unordered_map,883281920 -random,memory,12462221,std::unordered_map,910032896 -random,memory,12997032,std::unordered_map,937488384 -random,memory,13549619,std::unordered_map,965877760 -random,memory,14116358,std::unordered_map,994889728 -random,memory,14695755,std::unordered_map,1024761856 -random,memory,15302036,std::unordered_map,1055805440 -random,memory,15922424,std::unordered_map,1087705088 -random,memory,16564203,std::unordered_map,1120698368 -random,memory,16777216,std::unordered_map,1131618304 -random,memory,16777217,std::unordered_map,1669545984 -random,memory,16777216,std::unordered_map,1669545984 -random,memory,16777217,std::unordered_map,1400582144 -random,memory,17598216,std::unordered_map,1442697216 -random,memory,18446165,std::unordered_map,1486299136 -random,memory,19317877,std::unordered_map,1531068416 -random,time,20000000,std::unordered_map,8.836000 -random,memory,20005214,std::unordered_map,1566400512 -random,memory,20925154,std::unordered_map,1613586432 -random,memory,21874581,std::unordered_map,1662332928 -random,memory,22851058,std::unordered_map,1712484352 -random,memory,23854188,std::unordered_map,1764044800 -random,memory,24889194,std::unordered_map,1817235456 -random,memory,25956856,std::unordered_map,1871986688 -random,memory,27052917,std::unordered_map,1928302592 -random,memory,28182525,std::unordered_map,1986330624 -random,memory,29343496,std::unordered_map,2045997056 -random,time,30000000,std::unordered_map,12.189000 -random,memory,30003110,std::unordered_map,2079850496 -random,memory,31219769,std::unordered_map,2142253056 -random,memory,32472749,std::unordered_map,2206601216 -random,memory,33554433,std::unordered_map,2262134784 -random,memory,33554434,std::unordered_map,3338063872 -random,memory,33554433,std::unordered_map,3338063872 -random,memory,33554434,std::unordered_map,2800144384 -random,memory,35192104,std::unordered_map,2884296704 -random,memory,36882738,std::unordered_map,2971029504 -random,memory,38624262,std::unordered_map,3060490240 -random,time,40000000,std::unordered_map,19.469000 -random,memory,40004148,std::unordered_map,3131314176 -random,memory,41836642,std::unordered_map,3225452544 -random,memory,43723699,std::unordered_map,3322322944 -random,memory,45664059,std::unordered_map,3422003200 -random,memory,47663952,std::unordered_map,3524804608 -random,memory,49729822,std::unordered_map,3630796800 -random,time,50000000,std::unordered_map,22.945000 -random,memory,50002422,std::unordered_map,3644837888 -random,memory,52133946,std::unordered_map,3754262528 -random,memory,54331297,std::unordered_map,3867045888 -random,memory,56594458,std::unordered_map,3983339520 -random,memory,58922279,std::unordered_map,4102909952 -random,time,60000000,std::unordered_map,26.724001 -random,memory,60000504,std::unordered_map,4158287872 -random,memory,62432538,std::unordered_map,4283162624 -random,memory,64938021,std::unordered_map,4411858944 -random,memory,67108867,std::unordered_map,4523159552 -random,memory,67108868,std::unordered_map,6675017728 -random,memory,67108867,std::unordered_map,6674984960 -random,memory,67108868,std::unordered_map,5599145984 -random,time,70000000,std::unordered_map,38.929001 -random,memory,70005239,std::unordered_map,5747884032 -random,memory,73363452,std::unordered_map,5920329728 -random,memory,76824572,std::unordered_map,6098083840 -random,time,80000000,std::unordered_map,42.421001 -random,memory,80004058,std::unordered_map,6261411840 -random,memory,83663065,std::unordered_map,6449299456 -random,memory,87431119,std::unordered_map,6642888704 -random,time,90000000,std::unordered_map,46.064999 -random,memory,90003941,std::unordered_map,6775009280 -random,memory,93967227,std::unordered_map,6978502656 -random,memory,98046859,std::unordered_map,7188000768 -random,time,100000000,std::unordered_map,49.808998 -random,memory,0,absl::flat_hash_map,15753216 -random,memory,246268,absl::flat_hash_map,15753216 -random,memory,246423,absl::flat_hash_map,11280384 -random,memory,458751,absl::flat_hash_map,11280384 -random,memory,458752,absl::flat_hash_map,29143040 -random,memory,494344,absl::flat_hash_map,29143040 -random,memory,494581,absl::flat_hash_map,20209664 -random,memory,587568,absl::flat_hash_map,20209664 -random,memory,587757,absl::flat_hash_map,19087360 -random,memory,917503,absl::flat_hash_map,19087360 -random,memory,917504,absl::flat_hash_map,54812672 -random,memory,933203,absl::flat_hash_map,54812672 -random,memory,933351,absl::flat_hash_map,36950016 -random,memory,1835007,absl::flat_hash_map,36950016 -random,memory,1835008,absl::flat_hash_map,108396544 -random,memory,1862555,absl::flat_hash_map,108396544 -random,memory,1862669,absl::flat_hash_map,72671232 -random,memory,3670015,absl::flat_hash_map,72671232 -random,memory,3670016,absl::flat_hash_map,215560192 -random,memory,3671239,absl::flat_hash_map,215560192 -random,memory,3671292,absl::flat_hash_map,144113664 -random,memory,7340031,absl::flat_hash_map,144113664 -random,memory,7340032,absl::flat_hash_map,429895680 -random,memory,7357262,absl::flat_hash_map,429895680 -random,memory,7357325,absl::flat_hash_map,287002624 -random,time,10000000,absl::flat_hash_map,0.917000 -random,memory,10004410,absl::flat_hash_map,287002624 -random,memory,14680063,absl::flat_hash_map,287002624 -random,memory,14680064,absl::flat_hash_map,858546176 -random,memory,14692106,absl::flat_hash_map,858546176 -random,memory,14692158,absl::flat_hash_map,572772352 -random,time,20000000,absl::flat_hash_map,2.219000 -random,memory,20000770,absl::flat_hash_map,572772352 -random,memory,29360127,absl::flat_hash_map,572772352 -random,memory,29360128,absl::flat_hash_map,1715863552 -random,memory,29364265,absl::flat_hash_map,1715863552 -random,memory,29364312,absl::flat_hash_map,1144311808 -random,time,30000000,absl::flat_hash_map,3.875000 -random,memory,30003827,absl::flat_hash_map,1144311808 -random,time,40000000,absl::flat_hash_map,5.254000 -random,memory,40009000,absl::flat_hash_map,1144311808 -random,time,50000000,absl::flat_hash_map,6.636000 -random,memory,50012195,absl::flat_hash_map,1144311808 -random,memory,58720255,absl::flat_hash_map,1144311808 -random,memory,58720256,absl::flat_hash_map,3430490112 -random,memory,58721997,absl::flat_hash_map,3430490112 -random,memory,58722035,absl::flat_hash_map,2287411200 -random,time,60000000,absl::flat_hash_map,9.076000 -random,memory,60006216,absl::flat_hash_map,2287411200 -random,time,70000000,absl::flat_hash_map,10.597000 -random,memory,70010624,absl::flat_hash_map,2287411200 -random,time,80000000,absl::flat_hash_map,12.121000 -random,memory,80009799,absl::flat_hash_map,2287411200 -random,time,90000000,absl::flat_hash_map,13.627000 -random,memory,90004802,absl::flat_hash_map,2287411200 -random,time,100000000,absl::flat_hash_map,15.121000 -random,memory,0,absl::parallel_flat_hash_map,10170368 -random,memory,411848,absl::parallel_flat_hash_map,10170368 -random,memory,411907,absl::parallel_flat_hash_map,16375808 -random,memory,434804,absl::parallel_flat_hash_map,16375808 -random,memory,434919,absl::parallel_flat_hash_map,19169280 -random,memory,499955,absl::parallel_flat_hash_map,19169280 -random,memory,500092,absl::parallel_flat_hash_map,18636800 -random,memory,767798,absl::parallel_flat_hash_map,18636800 -random,memory,767958,absl::parallel_flat_hash_map,20873216 -random,memory,810538,absl::parallel_flat_hash_map,20873216 -random,memory,810597,absl::parallel_flat_hash_map,30941184 -random,memory,819492,absl::parallel_flat_hash_map,30941184 -random,memory,819493,absl::parallel_flat_hash_map,39882752 -random,memory,835988,absl::parallel_flat_hash_map,39882752 -random,memory,836052,absl::parallel_flat_hash_map,36519936 -random,memory,894649,absl::parallel_flat_hash_map,36519936 -random,memory,894754,absl::parallel_flat_hash_map,34279424 -random,memory,1154846,absl::parallel_flat_hash_map,34242560 -random,memory,1154988,absl::parallel_flat_hash_map,35360768 -random,memory,1216254,absl::parallel_flat_hash_map,35360768 -random,memory,1216391,absl::parallel_flat_hash_map,36552704 -random,memory,1583771,absl::parallel_flat_hash_map,36552704 -random,memory,1583947,absl::parallel_flat_hash_map,39907328 -random,memory,1622124,absl::parallel_flat_hash_map,39907328 -random,memory,1622237,absl::parallel_flat_hash_map,52199424 -random,memory,1639638,absl::parallel_flat_hash_map,52199424 -random,memory,1639661,absl::parallel_flat_hash_map,65605632 -random,memory,1653514,absl::parallel_flat_hash_map,65605632 -random,memory,1653539,absl::parallel_flat_hash_map,72306688 -random,memory,1666888,absl::parallel_flat_hash_map,72306688 -random,memory,1666916,absl::parallel_flat_hash_map,79003648 -random,memory,1691750,absl::parallel_flat_hash_map,79003648 -random,memory,1691824,absl::parallel_flat_hash_map,72306688 -random,memory,1738807,absl::parallel_flat_hash_map,72306688 -random,memory,1738925,absl::parallel_flat_hash_map,65593344 -random,memory,2222488,absl::parallel_flat_hash_map,65593344 -random,memory,2222655,absl::parallel_flat_hash_map,70066176 -random,memory,2275719,absl::parallel_flat_hash_map,70066176 -random,memory,2275807,absl::parallel_flat_hash_map,72294400 -random,memory,2319482,absl::parallel_flat_hash_map,72294400 -random,memory,2319616,absl::parallel_flat_hash_map,76759040 -random,memory,2370330,absl::parallel_flat_hash_map,76759040 -random,memory,2370869,absl::parallel_flat_hash_map,74518528 -random,memory,2422380,absl::parallel_flat_hash_map,74518528 -random,memory,2422622,absl::parallel_flat_hash_map,76754944 -random,memory,2471942,absl::parallel_flat_hash_map,76754944 -random,memory,2472109,absl::parallel_flat_hash_map,74518528 -random,memory,3212727,absl::parallel_flat_hash_map,74518528 -random,memory,3212832,absl::parallel_flat_hash_map,92385280 -random,memory,3279060,absl::parallel_flat_hash_map,92385280 -random,memory,3279135,absl::parallel_flat_hash_map,110256128 -random,memory,3330438,absl::parallel_flat_hash_map,110256128 -random,memory,3330505,absl::parallel_flat_hash_map,119193600 -random,memory,3357017,absl::parallel_flat_hash_map,119193600 -random,memory,3357061,absl::parallel_flat_hash_map,123658240 -random,memory,3382717,absl::parallel_flat_hash_map,123658240 -random,memory,3382766,absl::parallel_flat_hash_map,128126976 -random,memory,3410216,absl::parallel_flat_hash_map,128126976 -random,memory,3410294,absl::parallel_flat_hash_map,119193600 -random,memory,3487891,absl::parallel_flat_hash_map,119193600 -random,memory,3487995,absl::parallel_flat_hash_map,114720768 -random,memory,3535204,absl::parallel_flat_hash_map,114720768 -random,memory,3535343,absl::parallel_flat_hash_map,110252032 -random,memory,3806272,absl::parallel_flat_hash_map,110252032 -random,memory,3806419,absl::parallel_flat_hash_map,119189504 -random,memory,3851844,absl::parallel_flat_hash_map,119189504 -random,memory,3851947,absl::parallel_flat_hash_map,137056256 -random,memory,3912789,absl::parallel_flat_hash_map,137056256 -random,memory,3912899,absl::parallel_flat_hash_map,141520896 -random,memory,3936842,absl::parallel_flat_hash_map,141520896 -random,memory,3936909,absl::parallel_flat_hash_map,150458368 -random,memory,3959815,absl::parallel_flat_hash_map,150458368 -random,memory,3959905,absl::parallel_flat_hash_map,159383552 -random,memory,4023374,absl::parallel_flat_hash_map,159383552 -random,memory,4023538,absl::parallel_flat_hash_map,150446080 -random,memory,4065053,absl::parallel_flat_hash_map,154906624 -random,memory,4204140,absl::parallel_flat_hash_map,154906624 -random,memory,4204297,absl::parallel_flat_hash_map,150437888 -random,memory,4301074,absl::parallel_flat_hash_map,150437888 -random,memory,4301249,absl::parallel_flat_hash_map,145965056 -random,memory,6549677,absl::parallel_flat_hash_map,145965056 -random,memory,6549825,absl::parallel_flat_hash_map,181694464 -random,memory,6997079,absl::parallel_flat_hash_map,181694464 -random,memory,6997211,absl::parallel_flat_hash_map,208494592 -random,memory,7230339,absl::parallel_flat_hash_map,208494592 -random,memory,7230465,absl::parallel_flat_hash_map,226361344 -random,memory,7291549,absl::parallel_flat_hash_map,226361344 -random,memory,7291670,absl::parallel_flat_hash_map,217427968 -random,memory,7657520,absl::parallel_flat_hash_map,217427968 -random,memory,7657607,absl::parallel_flat_hash_map,297807872 -random,memory,7804692,absl::parallel_flat_hash_map,297807872 -random,memory,7804756,absl::parallel_flat_hash_map,315654144 -random,memory,7862884,absl::parallel_flat_hash_map,324587520 -random,memory,8300446,absl::parallel_flat_hash_map,324587520 -random,memory,8300602,absl::parallel_flat_hash_map,288845824 -random,time,10000000,absl::parallel_flat_hash_map,0.424000 -random,memory,10549382,absl::parallel_flat_hash_map,287694848 -random,memory,14509630,absl::parallel_flat_hash_map,287694848 -random,memory,14509631,absl::parallel_flat_hash_map,537772032 -random,memory,14625205,absl::parallel_flat_hash_map,537772032 -random,memory,14625206,absl::parallel_flat_hash_map,662798336 -random,memory,14985538,absl::parallel_flat_hash_map,662798336 -random,memory,14985695,absl::parallel_flat_hash_map,573476864 -random,memory,15812726,absl::parallel_flat_hash_map,573476864 -random,memory,15812791,absl::parallel_flat_hash_map,591331328 -random,memory,16545857,absl::parallel_flat_hash_map,591331328 -random,memory,16545973,absl::parallel_flat_hash_map,573460480 -random,time,20000000,absl::parallel_flat_hash_map,0.954000 -random,memory,20807098,absl::parallel_flat_hash_map,573456384 -random,memory,29087356,absl::parallel_flat_hash_map,573456384 -random,memory,29087477,absl::parallel_flat_hash_map,644902912 -random,memory,29349303,absl::parallel_flat_hash_map,644902912 -random,memory,29349304,absl::parallel_flat_hash_map,1145028608 -random,memory,29350502,absl::parallel_flat_hash_map,1145028608 -random,memory,29350503,absl::parallel_flat_hash_map,1180753920 -random,memory,29353744,absl::parallel_flat_hash_map,1180753920 -random,memory,29353745,absl::parallel_flat_hash_map,1252196352 -random,memory,29356269,absl::parallel_flat_hash_map,1252196352 -random,memory,29356270,absl::parallel_flat_hash_map,1216475136 -random,memory,29371063,absl::parallel_flat_hash_map,1216475136 -random,memory,29371064,absl::parallel_flat_hash_map,1430810624 -random,memory,29406162,absl::parallel_flat_hash_map,1430810624 -random,memory,29406217,absl::parallel_flat_hash_map,1359364096 -random,memory,29624052,absl::parallel_flat_hash_map,1359364096 -random,memory,29624117,absl::parallel_flat_hash_map,1216425984 -random,memory,29711436,absl::parallel_flat_hash_map,1216397312 -random,memory,29711557,absl::parallel_flat_hash_map,1180667904 -random,memory,29779052,absl::parallel_flat_hash_map,1180643328 -random,memory,29779149,absl::parallel_flat_hash_map,1144913920 -random,time,30000000,absl::parallel_flat_hash_map,1.510000 -random,memory,30000000,absl::parallel_flat_hash_map,1144786944 -random,time,40000000,absl::parallel_flat_hash_map,1.977000 -random,memory,40000000,absl::parallel_flat_hash_map,1144782848 -random,time,50000000,absl::parallel_flat_hash_map,2.410000 -random,memory,50109244,absl::parallel_flat_hash_map,1144987648 -random,memory,58696456,absl::parallel_flat_hash_map,1144987648 -random,memory,58696478,absl::parallel_flat_hash_map,2145222656 -random,memory,58705957,absl::parallel_flat_hash_map,2145222656 -random,memory,58705958,absl::parallel_flat_hash_map,2288111616 -random,memory,58710284,absl::parallel_flat_hash_map,2288111616 -random,memory,58710285,absl::parallel_flat_hash_map,2502451200 -random,memory,58716154,absl::parallel_flat_hash_map,2502451200 -random,memory,58716155,absl::parallel_flat_hash_map,2645327872 -random,memory,58719191,absl::parallel_flat_hash_map,2645327872 -random,memory,58719214,absl::parallel_flat_hash_map,2573885440 -random,memory,58734799,absl::parallel_flat_hash_map,2573885440 -random,memory,58734800,absl::parallel_flat_hash_map,2859651072 -random,memory,58754516,absl::parallel_flat_hash_map,2859651072 -random,memory,58754559,absl::parallel_flat_hash_map,2716762112 -random,memory,59072502,absl::parallel_flat_hash_map,2716762112 -random,memory,59072581,absl::parallel_flat_hash_map,2359533568 -random,memory,59445636,absl::parallel_flat_hash_map,2359533568 -random,memory,59449345,absl::parallel_flat_hash_map,2288054272 -random,time,60000000,absl::parallel_flat_hash_map,3.184000 -random,memory,60659819,absl::parallel_flat_hash_map,2288070656 -random,time,70000000,absl::parallel_flat_hash_map,3.678000 -random,memory,70001013,absl::parallel_flat_hash_map,2288001024 -random,time,80000000,absl::parallel_flat_hash_map,4.120000 -random,memory,80008641,absl::parallel_flat_hash_map,2288046080 -random,time,90000000,absl::parallel_flat_hash_map,4.653000 -random,memory,90000000,absl::parallel_flat_hash_map,2287878144 -random,time,100000000,absl::parallel_flat_hash_map,5.111000 diff --git a/extern/phmap/benchmark/results/output_mt_stl_flat_par_run2 b/extern/phmap/benchmark/results/output_mt_stl_flat_par_run2 deleted file mode 100644 index d01e475..0000000 --- a/extern/phmap/benchmark/results/output_mt_stl_flat_par_run2 +++ /dev/null @@ -1,374 +0,0 @@ -random,memory,0,std::unordered_map,6262784 -random,memory,66147,std::unordered_map,6340608 -random,memory,82637,std::unordered_map,6340608 -random,memory,82649,std::unordered_map,7204864 -random,memory,99619,std::unordered_map,7204864 -random,memory,99639,std::unordered_map,8060928 -random,memory,116159,std::unordered_map,8060928 -random,memory,116174,std::unordered_map,8916992 -random,memory,129704,std::unordered_map,8916992 -random,memory,129718,std::unordered_map,9621504 -random,memory,131071,std::unordered_map,9621504 -random,memory,131072,std::unordered_map,11804672 -random,memory,135283,std::unordered_map,12038144 -random,memory,147679,std::unordered_map,12038144 -random,memory,147680,std::unordered_map,12660736 -random,memory,159818,std::unordered_map,12660736 -random,memory,159834,std::unordered_map,13291520 -random,memory,170700,std::unordered_map,13291520 -random,memory,170717,std::unordered_map,13914112 -random,memory,179486,std::unordered_map,14303232 -random,memory,188398,std::unordered_map,14303232 -random,memory,188409,std::unordered_map,14770176 -random,memory,195927,std::unordered_map,14770176 -random,memory,195939,std::unordered_map,15237120 -random,memory,203959,std::unordered_map,15630336 -random,memory,211779,std::unordered_map,15941632 -random,memory,220483,std::unordered_map,15941632 -random,memory,220484,std::unordered_map,16486400 -random,memory,229922,std::unordered_map,16953344 -random,memory,239746,std::unordered_map,17424384 -random,memory,250042,std::unordered_map,17424384 -random,memory,250053,std::unordered_map,17969152 -random,memory,259821,std::unordered_map,18436096 -random,memory,262143,std::unordered_map,18436096 -random,memory,262144,std::unordered_map,26927104 -random,memory,262143,std::unordered_map,26927104 -random,memory,262144,std::unordered_map,22724608 -random,memory,273337,std::unordered_map,23347200 -random,memory,281584,std::unordered_map,23814144 -random,memory,291318,std::unordered_map,24293376 -random,memory,301478,std::unordered_map,24838144 -random,memory,311977,std::unordered_map,25382912 -random,memory,322715,std::unordered_map,25935872 -random,memory,333302,std::unordered_map,26558464 -random,memory,343264,std::unordered_map,27025408 -random,memory,352924,std::unordered_map,27492352 -random,memory,361958,std::unordered_map,27963392 -random,memory,369865,std::unordered_map,28352512 -random,memory,378535,std::unordered_map,28819456 -random,memory,387443,std::unordered_map,29286400 -random,memory,396689,std::unordered_map,29753344 -random,memory,405932,std::unordered_map,30224384 -random,memory,415263,std::unordered_map,30691328 -random,memory,424445,std::unordered_map,31158272 -random,memory,433724,std::unordered_map,31625216 -random,memory,442183,std::unordered_map,32096256 -random,memory,450170,std::unordered_map,32485376 -random,memory,458338,std::unordered_map,32874496 -random,memory,466025,std::unordered_map,33341440 -random,memory,474254,std::unordered_map,33730560 -random,memory,482593,std::unordered_map,34123776 -random,memory,491058,std::unordered_map,34590720 -random,memory,499360,std::unordered_map,35057664 -random,memory,514720,std::unordered_map,35758080 -random,memory,522349,std::unordered_map,36147200 -random,memory,524287,std::unordered_map,36147200 -random,memory,524288,std::unordered_map,53125120 -random,memory,524287,std::unordered_map,53125120 -random,memory,524288,std::unordered_map,44720128 -random,memory,543462,std::unordered_map,45654016 -random,memory,552986,std::unordered_map,46198784 -random,memory,572111,std::unordered_map,47136768 -random,memory,608007,std::unordered_map,49004544 -random,memory,626830,std::unordered_map,49938432 -random,memory,662501,std::unordered_map,51838976 -random,memory,697143,std::unordered_map,53633024 -random,memory,730779,std::unordered_map,55349248 -random,memory,763966,std::unordered_map,57061376 -random,memory,797419,std::unordered_map,58777600 -random,memory,838262,std::unordered_map,60805120 -random,memory,877693,std::unordered_map,62910464 -random,memory,919839,std::unordered_map,65015808 -random,memory,963409,std::unordered_map,67280896 -random,memory,1006880,std::unordered_map,69541888 -random,memory,1048575,std::unordered_map,71491584 -random,memory,1048576,std::unordered_map,105275392 -random,memory,1048575,std::unordered_map,105279488 -random,memory,1048576,std::unordered_map,88469504 -random,memory,1101898,std::unordered_map,91201536 -random,memory,1159041,std::unordered_map,94085120 -random,memory,1214581,std::unordered_map,96968704 -random,memory,1277500,std::unordered_map,100163584 -random,memory,1336144,std::unordered_map,103211008 -random,memory,1401705,std::unordered_map,106561536 -random,memory,1467192,std::unordered_map,109993984 -random,memory,1539228,std::unordered_map,113659904 -random,memory,1610540,std::unordered_map,117321728 -random,memory,1679692,std::unordered_map,120909824 -random,memory,1754775,std::unordered_map,124731392 -random,memory,1829692,std::unordered_map,128552960 -random,memory,1911333,std::unordered_map,132685824 -random,memory,1992045,std::unordered_map,136900608 -random,memory,2078160,std::unordered_map,141344768 -random,memory,2097151,std::unordered_map,141967360 -random,memory,2097152,std::unordered_map,209526784 -random,memory,2097151,std::unordered_map,209526784 -random,memory,2097152,std::unordered_map,175906816 -random,memory,2203649,std::unordered_map,181366784 -random,memory,2313060,std::unordered_map,187060224 -random,memory,2430763,std::unordered_map,193064960 -random,memory,2547134,std::unordered_map,199041024 -random,memory,2663349,std::unordered_map,205049856 -random,memory,2783850,std::unordered_map,211288064 -random,memory,2910198,std::unordered_map,217763840 -random,memory,3037927,std::unordered_map,224313344 -random,memory,3177861,std::unordered_map,231485440 -random,memory,3313832,std::unordered_map,238505984 -random,memory,3457523,std::unordered_map,245760000 -random,memory,3602506,std::unordered_map,253329408 -random,memory,3759506,std::unordered_map,261279744 -random,memory,3911955,std::unordered_map,269160448 -random,memory,4070796,std::unordered_map,277348352 -random,memory,4194303,std::unordered_map,283435008 -random,memory,4194304,std::unordered_map,418156544 -random,memory,4194303,std::unordered_map,418156544 -random,memory,4194304,std::unordered_map,350916608 -random,memory,4407009,std::unordered_map,361832448 -random,memory,4622523,std::unordered_map,372908032 -random,memory,4840785,std::unordered_map,384139264 -random,memory,5069285,std::unordered_map,395759616 -random,memory,5303878,std::unordered_map,407928832 -random,memory,5543266,std::unordered_map,420253696 -random,memory,5791025,std::unordered_map,432885760 -random,memory,6044095,std::unordered_map,445906944 -random,memory,6305319,std::unordered_map,459321344 -random,memory,6577545,std::unordered_map,473284608 -random,memory,6858697,std::unordered_map,487792640 -random,memory,7147317,std::unordered_map,502611968 -random,memory,7442937,std::unordered_map,517742592 -random,memory,7748304,std::unordered_map,533422080 -random,memory,8065615,std::unordered_map,549801984 -random,memory,8388607,std::unordered_map,566177792 -random,memory,8388608,std::unordered_map,835301376 -random,memory,8388607,std::unordered_map,835301376 -random,memory,8388608,std::unordered_map,700817408 -random,memory,8802366,std::unordered_map,722030592 -random,memory,9226003,std::unordered_map,743714816 -random,memory,9659613,std::unordered_map,766099456 -random,time,10000000,std::unordered_map,4.219000 -random,memory,10004203,std::unordered_map,783728640 -random,memory,10467953,std::unordered_map,807591936 -random,memory,10941688,std::unordered_map,831930368 -random,memory,11430458,std::unordered_map,856965120 -random,memory,11932272,std::unordered_map,882782208 -random,memory,12452228,std::unordered_map,909455360 -random,memory,12986599,std::unordered_map,936914944 -random,memory,13534295,std::unordered_map,965074944 -random,memory,14099120,std::unordered_map,994086912 -random,memory,14685277,std::unordered_map,1024192512 -random,memory,15284333,std::unordered_map,1055002624 -random,memory,15901280,std::unordered_map,1086668800 -random,memory,16540739,std::unordered_map,1119506432 -random,memory,16777216,std::unordered_map,1131593728 -random,memory,16777217,std::unordered_map,1669521408 -random,memory,16777216,std::unordered_map,1669521408 -random,memory,16777217,std::unordered_map,1400561664 -random,memory,17594843,std::unordered_map,1442594816 -random,memory,18441168,std::unordered_map,1486041088 -random,memory,19314823,std::unordered_map,1530888192 -random,time,20000000,std::unordered_map,9.237000 -random,memory,20001449,std::unordered_map,1566220288 -random,memory,20922961,std::unordered_map,1613488128 -random,memory,21867605,std::unordered_map,1661919232 -random,memory,22842566,std::unordered_map,1711992832 -random,memory,23846371,std::unordered_map,1763553280 -random,memory,24877882,std::unordered_map,1816588288 -random,memory,25939795,std::unordered_map,1871106048 -random,memory,27035961,std::unordered_map,1927417856 -random,memory,28166332,std::unordered_map,1985449984 -random,memory,29325566,std::unordered_map,2045038592 -random,time,30000000,std::unordered_map,12.731000 -random,memory,30005312,std::unordered_map,2079903744 -random,memory,31220485,std::unordered_map,2142306304 -random,memory,32473699,std::unordered_map,2206654464 -random,memory,33554433,std::unordered_map,2261954560 -random,memory,33554434,std::unordered_map,3338039296 -random,memory,33554433,std::unordered_map,3338039296 -random,memory,33554434,std::unordered_map,2800119808 -random,memory,35190517,std::unordered_map,2884198400 -random,memory,36881331,std::unordered_map,2971004928 -random,memory,38618963,std::unordered_map,3060154368 -random,time,40000000,std::unordered_map,20.341999 -random,memory,40000165,std::unordered_map,3131133952 -random,memory,41832534,std::unordered_map,3225194496 -random,memory,43716435,std::unordered_map,3321987072 -random,memory,45660968,std::unordered_map,3421900800 -random,memory,47664978,std::unordered_map,3524857856 -random,memory,49728995,std::unordered_map,3630772224 -random,time,50000000,std::unordered_map,23.892000 -random,memory,50003393,std::unordered_map,3644891136 -random,memory,52133603,std::unordered_map,3754237952 -random,memory,54328284,std::unordered_map,3866943488 -random,memory,56590586,std::unordered_map,3983159296 -random,memory,58922512,std::unordered_map,4102963200 -random,time,60000000,std::unordered_map,27.804001 -random,memory,60002789,std::unordered_map,4158418944 -random,memory,62434781,std::unordered_map,4283215872 -random,memory,64938804,std::unordered_map,4411912192 -random,memory,67108867,std::unordered_map,4523261952 -random,memory,67108868,std::unordered_map,6674964480 -random,memory,67108867,std::unordered_map,6674964480 -random,memory,67108868,std::unordered_map,5599125504 -random,time,70000000,std::unordered_map,40.429001 -random,memory,70000893,std::unordered_map,5747630080 -random,memory,73361782,std::unordered_map,5920231424 -random,memory,76823810,std::unordered_map,6098063360 -random,time,80000000,std::unordered_map,43.907001 -random,memory,80001253,std::unordered_map,6261313536 -random,memory,83662519,std::unordered_map,6449278976 -random,memory,87433081,std::unordered_map,6642946048 -random,time,90000000,std::unordered_map,47.674000 -random,memory,90000620,std::unordered_map,6774833152 -random,memory,93961521,std::unordered_map,6978170880 -random,memory,98041926,std::unordered_map,7187746816 -random,time,100000000,std::unordered_map,51.557999 -random,memory,100000000,std::unordered_map,7288283136 -random,memory,0,phmap::flat_hash_map,15810560 -random,memory,239818,phmap::flat_hash_map,15810560 -random,memory,240039,phmap::flat_hash_map,11341824 -random,memory,458751,phmap::flat_hash_map,11341824 -random,memory,458752,phmap::flat_hash_map,29208576 -random,memory,487182,phmap::flat_hash_map,29208576 -random,memory,487416,phmap::flat_hash_map,20275200 -random,memory,669554,phmap::flat_hash_map,20275200 -random,memory,669793,phmap::flat_hash_map,19144704 -random,memory,917503,phmap::flat_hash_map,19144704 -random,memory,917504,phmap::flat_hash_map,54870016 -random,memory,956900,phmap::flat_hash_map,54870016 -random,memory,957064,phmap::flat_hash_map,37003264 -random,memory,1835007,phmap::flat_hash_map,37003264 -random,memory,1835008,phmap::flat_hash_map,108449792 -random,memory,1849262,phmap::flat_hash_map,108449792 -random,memory,1849368,phmap::flat_hash_map,72724480 -random,memory,3670015,phmap::flat_hash_map,72724480 -random,memory,3670016,phmap::flat_hash_map,215613440 -random,memory,3671196,phmap::flat_hash_map,215613440 -random,memory,3671252,phmap::flat_hash_map,144166912 -random,memory,7340031,phmap::flat_hash_map,144166912 -random,memory,7340032,phmap::flat_hash_map,429944832 -random,memory,7345416,phmap::flat_hash_map,429944832 -random,memory,7345476,phmap::flat_hash_map,287055872 -random,time,10000000,phmap::flat_hash_map,0.952000 -random,memory,10005890,phmap::flat_hash_map,287055872 -random,memory,14680063,phmap::flat_hash_map,287055872 -random,memory,14680064,phmap::flat_hash_map,858599424 -random,memory,14681371,phmap::flat_hash_map,858599424 -random,memory,14681406,phmap::flat_hash_map,572825600 -random,time,20000000,phmap::flat_hash_map,2.315000 -random,memory,20016264,phmap::flat_hash_map,572825600 -random,memory,29360127,phmap::flat_hash_map,572825600 -random,memory,29360128,phmap::flat_hash_map,1715916800 -random,memory,29363718,phmap::flat_hash_map,1715916800 -random,memory,29363764,phmap::flat_hash_map,1144373248 -random,time,30000000,phmap::flat_hash_map,4.047000 -random,memory,30001212,phmap::flat_hash_map,1144373248 -random,time,40000000,phmap::flat_hash_map,5.437000 -random,memory,40013884,phmap::flat_hash_map,1144373248 -random,time,50000000,phmap::flat_hash_map,6.807000 -random,memory,50012642,phmap::flat_hash_map,1144373248 -random,memory,58720255,phmap::flat_hash_map,1144373248 -random,memory,58720256,phmap::flat_hash_map,3430551552 -random,memory,58726692,phmap::flat_hash_map,3430551552 -random,memory,58726725,phmap::flat_hash_map,2287464448 -random,time,60000000,phmap::flat_hash_map,9.232000 -random,memory,60005561,phmap::flat_hash_map,2287464448 -random,time,70000000,phmap::flat_hash_map,10.811000 -random,memory,70008847,phmap::flat_hash_map,2287464448 -random,time,80000000,phmap::flat_hash_map,12.387000 -random,memory,80000522,phmap::flat_hash_map,2287464448 -random,time,90000000,phmap::flat_hash_map,13.936000 -random,memory,90006732,phmap::flat_hash_map,2287464448 -random,time,100000000,phmap::flat_hash_map,15.467000 -random,memory,0,phmap::parallel_flat_hash_map,37785600 -random,memory,1921864,phmap::parallel_flat_hash_map,37785600 -random,memory,1921990,phmap::parallel_flat_hash_map,75739136 -random,memory,2969317,phmap::parallel_flat_hash_map,75739136 -random,memory,2969478,phmap::parallel_flat_hash_map,73498624 -random,memory,3714056,phmap::parallel_flat_hash_map,73498624 -random,memory,3714057,phmap::parallel_flat_hash_map,162828288 -random,memory,4501128,phmap::parallel_flat_hash_map,162828288 -random,memory,4501312,phmap::parallel_flat_hash_map,144936960 -random,memory,7228404,phmap::parallel_flat_hash_map,144936960 -random,memory,7228507,phmap::parallel_flat_hash_map,207466496 -random,memory,7275817,phmap::parallel_flat_hash_map,207466496 -random,memory,7275940,phmap::parallel_flat_hash_map,216391680 -random,memory,7498901,phmap::parallel_flat_hash_map,216391680 -random,memory,7499009,phmap::parallel_flat_hash_map,323563520 -random,memory,7543411,phmap::parallel_flat_hash_map,323563520 -random,memory,7543523,phmap::parallel_flat_hash_map,305696768 -random,memory,8354331,phmap::parallel_flat_hash_map,305696768 -random,memory,8354519,phmap::parallel_flat_hash_map,287825920 -random,time,10000000,phmap::parallel_flat_hash_map,0.406000 -random,memory,10849279,phmap::parallel_flat_hash_map,288239616 -random,memory,14474156,phmap::parallel_flat_hash_map,288239616 -random,memory,14474206,phmap::parallel_flat_hash_map,395419648 -random,memory,14565308,phmap::parallel_flat_hash_map,395419648 -random,memory,14565382,phmap::parallel_flat_hash_map,466870272 -random,memory,14678635,phmap::parallel_flat_hash_map,466870272 -random,memory,14678636,phmap::parallel_flat_hash_map,609767424 -random,memory,14683611,phmap::parallel_flat_hash_map,627630080 -random,memory,14800987,phmap::parallel_flat_hash_map,627630080 -random,memory,14801039,phmap::parallel_flat_hash_map,663339008 -random,memory,15290395,phmap::parallel_flat_hash_map,663339008 -random,memory,15290450,phmap::parallel_flat_hash_map,591884288 -random,memory,15480090,phmap::parallel_flat_hash_map,591884288 -random,memory,15480237,phmap::parallel_flat_hash_map,574021632 -random,time,20000000,phmap::parallel_flat_hash_map,0.912000 -random,memory,20838704,phmap::parallel_flat_hash_map,574017536 -random,memory,28900745,phmap::parallel_flat_hash_map,574017536 -random,memory,28900840,phmap::parallel_flat_hash_map,645464064 -random,memory,29185725,phmap::parallel_flat_hash_map,645464064 -random,memory,29185801,phmap::parallel_flat_hash_map,788357120 -random,memory,29330003,phmap::parallel_flat_hash_map,788357120 -random,memory,29330055,phmap::parallel_flat_hash_map,1002696704 -random,memory,29349427,phmap::parallel_flat_hash_map,1002696704 -random,memory,29349428,phmap::parallel_flat_hash_map,1145589760 -random,memory,29352020,phmap::parallel_flat_hash_map,1145589760 -random,memory,29352021,phmap::parallel_flat_hash_map,1181310976 -random,memory,29355250,phmap::parallel_flat_hash_map,1181310976 -random,memory,29355251,phmap::parallel_flat_hash_map,1252745216 -random,memory,29363721,phmap::parallel_flat_hash_map,1252745216 -random,memory,29363722,phmap::parallel_flat_hash_map,1324191744 -random,memory,29370810,phmap::parallel_flat_hash_map,1324191744 -random,memory,29370811,phmap::parallel_flat_hash_map,1431351296 -random,memory,29553925,phmap::parallel_flat_hash_map,1431351296 -random,memory,29553998,phmap::parallel_flat_hash_map,1252732928 -random,memory,29747915,phmap::parallel_flat_hash_map,1252732928 -random,memory,29748035,phmap::parallel_flat_hash_map,1181249536 -random,memory,29849570,phmap::parallel_flat_hash_map,1181167616 -random,memory,29849635,phmap::parallel_flat_hash_map,1145438208 -random,time,30000000,phmap::parallel_flat_hash_map,1.470000 -random,memory,30044703,phmap::parallel_flat_hash_map,1145556992 -random,time,40000000,phmap::parallel_flat_hash_map,1.935000 -random,memory,40000000,phmap::parallel_flat_hash_map,1145356288 -random,time,50000000,phmap::parallel_flat_hash_map,2.359000 -random,memory,50622111,phmap::parallel_flat_hash_map,1145556992 -random,memory,58670362,phmap::parallel_flat_hash_map,1145556992 -random,memory,58670384,phmap::parallel_flat_hash_map,2145792000 -random,memory,58698634,phmap::parallel_flat_hash_map,2145792000 -random,memory,58698635,phmap::parallel_flat_hash_map,2288680960 -random,memory,58715876,phmap::parallel_flat_hash_map,2288685056 -random,memory,58715877,phmap::parallel_flat_hash_map,2574458880 -random,memory,58720779,phmap::parallel_flat_hash_map,2574458880 -random,memory,58720802,phmap::parallel_flat_hash_map,2503016448 -random,memory,58723605,phmap::parallel_flat_hash_map,2503016448 -random,memory,58723606,phmap::parallel_flat_hash_map,2645905408 -random,memory,58729212,phmap::parallel_flat_hash_map,2645905408 -random,memory,58729213,phmap::parallel_flat_hash_map,2788790272 -random,memory,58741845,phmap::parallel_flat_hash_map,2860228608 -random,memory,58760201,phmap::parallel_flat_hash_map,2860228608 -random,memory,58760227,phmap::parallel_flat_hash_map,2788786176 -random,memory,58967162,phmap::parallel_flat_hash_map,2788786176 -random,memory,58967269,phmap::parallel_flat_hash_map,2360111104 -random,memory,59568547,phmap::parallel_flat_hash_map,2360111104 -random,memory,59568692,phmap::parallel_flat_hash_map,2288660480 -random,time,60000000,phmap::parallel_flat_hash_map,3.120000 -random,memory,60764467,phmap::parallel_flat_hash_map,2288656384 -random,time,70000000,phmap::parallel_flat_hash_map,3.567000 -random,memory,70747076,phmap::parallel_flat_hash_map,2288652288 -random,time,80000000,phmap::parallel_flat_hash_map,4.004000 -random,memory,80005300,phmap::parallel_flat_hash_map,2288590848 -random,time,90000000,phmap::parallel_flat_hash_map,4.527000 -random,memory,90699330,phmap::parallel_flat_hash_map,2288656384 -random,time,100000000,phmap::parallel_flat_hash_map,4.986000 diff --git a/extern/phmap/benchmark/results/output_stl_flat b/extern/phmap/benchmark/results/output_stl_flat deleted file mode 100644 index aee5272..0000000 --- a/extern/phmap/benchmark/results/output_stl_flat +++ /dev/null @@ -1,225 +0,0 @@ -random,memory,0,std::unordered_map,6688768 -random,memory,94189,std::unordered_map,7778304 -random,memory,109769,std::unordered_map,8556544 -random,memory,122654,std::unordered_map,9261056 -random,memory,131072,std::unordered_map,13778944 -random,memory,131072,std::unordered_map,11677696 -random,memory,139313,std::unordered_map,12144640 -random,memory,153935,std::unordered_map,12943360 -random,memory,165753,std::unordered_map,13643776 -random,memory,177309,std::unordered_map,14266368 -random,memory,188501,std::unordered_map,14733312 -random,memory,198715,std::unordered_map,15282176 -random,memory,208082,std::unordered_map,15749120 -random,memory,217961,std::unordered_map,16293888 -random,memory,228367,std::unordered_map,16838656 -random,memory,248349,std::unordered_map,17854464 -random,memory,262144,std::unordered_map,26890240 -random,memory,262144,std::unordered_map,22683648 -random,memory,276980,std::unordered_map,23543808 -random,memory,296991,std::unordered_map,24477696 -random,memory,317107,std::unordered_map,25571328 -random,memory,336773,std::unordered_map,26660864 -random,memory,356852,std::unordered_map,27676672 -random,memory,374674,std::unordered_map,28532736 -random,memory,393524,std::unordered_map,29544448 -random,memory,412757,std::unordered_map,30482432 -random,memory,430634,std::unordered_map,31416320 -random,memory,456096,std::unordered_map,32743424 -random,memory,480998,std::unordered_map,34017280 -random,memory,506761,std::unordered_map,35340288 -random,memory,524288,std::unordered_map,53096448 -random,memory,524288,std::unordered_map,44687360 -random,memory,559809,std::unordered_map,46481408 -random,memory,586869,std::unordered_map,47882240 -random,memory,625664,std::unordered_map,49827840 -random,memory,661343,std::unordered_map,51781632 -random,memory,697780,std::unordered_map,53575680 -random,memory,732263,std::unordered_map,55369728 -random,memory,767346,std::unordered_map,57163776 -random,memory,801265,std::unordered_map,58880000 -random,memory,843401,std::unordered_map,61063168 -random,memory,883359,std::unordered_map,63008768 -random,memory,923703,std::unordered_map,65114112 -random,memory,962276,std::unordered_map,67145728 -random,memory,1000499,std::unordered_map,69173248 -random,memory,1046029,std::unordered_map,71438336 -random,memory,1048576,std::unordered_map,105222144 -random,memory,1048576,std::unordered_map,88412160 -random,memory,1103068,std::unordered_map,91217920 -random,memory,1166341,std::unordered_map,94412800 -random,memory,1227947,std::unordered_map,97611776 -random,memory,1288360,std::unordered_map,100732928 -random,memory,1348784,std::unordered_map,103849984 -random,memory,1415960,std::unordered_map,107282432 -random,memory,1483476,std::unordered_map,110710784 -random,memory,1551489,std::unordered_map,114221056 -random,memory,1622998,std::unordered_map,117964800 -random,memory,1698528,std::unordered_map,121786368 -random,memory,1774279,std::unordered_map,125607936 -random,memory,1852847,std::unordered_map,129658880 -random,memory,1935045,std::unordered_map,133955584 -random,memory,2016124,std::unordered_map,138084352 -random,memory,2097152,std::unordered_map,209465344 -random,memory,2097152,std::unordered_map,175845376 -random,memory,2202017,std::unordered_map,181227520 -random,memory,2308233,std::unordered_map,186687488 -random,memory,2421995,std::unordered_map,192569344 -random,memory,2540952,std::unordered_map,198647808 -random,memory,2664197,std::unordered_map,205049856 -random,memory,2786842,std::unordered_map,211288064 -random,memory,2914893,std::unordered_map,217915392 -random,memory,3042611,std::unordered_map,224464896 -random,memory,3177918,std::unordered_map,231325696 -random,memory,3316856,std::unordered_map,238583808 -random,memory,3463219,std::unordered_map,245989376 -random,memory,3606297,std::unordered_map,253440000 -random,memory,3758685,std::unordered_map,261234688 -random,memory,3918344,std::unordered_map,269426688 -random,memory,4082497,std::unordered_map,277848064 -random,memory,4194304,std::unordered_map,418111488 -random,memory,4194304,std::unordered_map,350871552 -random,memory,4405390,std::unordered_map,361631744 -random,memory,4622462,std::unordered_map,372862976 -random,memory,4843447,std::unordered_map,384253952 -random,memory,5077057,std::unordered_map,396234752 -random,memory,5310379,std::unordered_map,408170496 -random,memory,5553459,std::unordered_map,420728832 -random,memory,5801485,std::unordered_map,433438720 -random,memory,6061642,std::unordered_map,446771200 -random,memory,6321544,std::unordered_map,460189696 -random,memory,6597657,std::unordered_map,474308608 -random,memory,6874638,std::unordered_map,488579072 -random,memory,7165061,std::unordered_map,503480320 -random,memory,7464156,std::unordered_map,518844416 -random,memory,7769321,std::unordered_map,534519808 -random,memory,8083787,std::unordered_map,550666240 -random,memory,8388608,std::unordered_map,835313664 -random,memory,8388608,std::unordered_map,700833792 -random,memory,8799364,std::unordered_map,721883136 -random,memory,9228893,std::unordered_map,743878656 -random,memory,9664620,std::unordered_map,766345216 -random,time,10000000,std::unordered_map,4.373000 -random,memory,10005035,std::unordered_map,783814656 -random,memory,10114472,std::unordered_map,789352448 -random,memory,10581340,std::unordered_map,813371392 -random,memory,11060026,std::unordered_map,837943296 -random,memory,11554760,std::unordered_map,863367168 -random,memory,12063672,std::unordered_map,889499648 -random,memory,12588048,std::unordered_map,916488192 -random,memory,13128601,std::unordered_map,944173056 -random,memory,13682065,std::unordered_map,972640256 -random,memory,14255923,std::unordered_map,1002127360 -random,memory,14847433,std::unordered_map,1032548352 -random,memory,15456818,std::unordered_map,1063825408 -random,memory,16080459,std::unordered_map,1095798784 -random,memory,16726977,std::unordered_map,1128947712 -random,memory,16777217,std::unordered_map,1669529600 -random,memory,16777217,std::unordered_map,1400569856 -random,memory,17595085,std::unordered_map,1442603008 -random,memory,18438183,std::unordered_map,1485893632 -random,memory,19311311,std::unordered_map,1530658816 -random,time,20000000,std::unordered_map,8.842000 -random,memory,20000810,std::unordered_map,1566150656 -random,memory,20207250,std::unordered_map,1576677376 -random,memory,21131235,std::unordered_map,1624178688 -random,memory,22086647,std::unordered_map,1673158656 -random,memory,23064920,std::unordered_map,1723465728 -random,memory,24073299,std::unordered_map,1775177728 -random,memory,25110516,std::unordered_map,1828532224 -random,memory,26181575,std::unordered_map,1883516928 -random,memory,27282467,std::unordered_map,1940062208 -random,memory,28422030,std::unordered_map,1998561280 -random,memory,29593778,std::unordered_map,2058694656 -random,time,30000000,std::unordered_map,12.018000 -random,memory,30000114,std::unordered_map,2079678464 -random,memory,30796939,std::unordered_map,2120552448 -random,memory,32039135,std::unordered_map,2184355840 -random,memory,33320240,std::unordered_map,2250104832 -random,memory,33554434,std::unordered_map,3338047488 -random,memory,33554434,std::unordered_map,2800128000 -random,memory,35194605,std::unordered_map,2884362240 -random,memory,36886268,std::unordered_map,2971246592 -random,memory,38624437,std::unordered_map,3060473856 -random,time,40000000,std::unordered_map,18.924999 -random,memory,40003628,std::unordered_map,3131297792 -random,memory,40417618,std::unordered_map,3152588800 -random,memory,42264600,std::unordered_map,3247431680 -random,memory,44165274,std::unordered_map,3345006592 -random,memory,46122181,std::unordered_map,3445542912 -random,memory,48137986,std::unordered_map,3549040640 -random,time,50000000,std::unordered_map,22.261999 -random,memory,50001657,std::unordered_map,3644821504 -random,memory,50216354,std::unordered_map,3655737344 -random,memory,52356080,std::unordered_map,3765637120 -random,memory,54556920,std::unordered_map,3878731776 -random,memory,56823702,std::unordered_map,3995103232 -random,memory,59156726,std::unordered_map,4114980864 -random,time,60000000,std::unordered_map,25.919001 -random,memory,60002957,std::unordered_map,4158427136 -random,memory,61562985,std::unordered_map,4238528512 -random,memory,64040759,std::unordered_map,4365746176 -random,memory,66594964,std::unordered_map,4496855040 -random,memory,67108868,std::unordered_map,6675001344 -random,memory,67108868,std::unordered_map,5599162368 -random,time,70000000,std::unordered_map,37.734001 -random,memory,70005322,std::unordered_map,5747867648 -random,memory,70384719,std::unordered_map,5767364608 -random,memory,73758686,std::unordered_map,5940674560 -random,memory,77233925,std::unordered_map,6119124992 -random,time,80000000,std::unordered_map,41.104000 -random,memory,80002815,std::unordered_map,6261395456 -random,memory,80810186,std::unordered_map,6302810112 -random,memory,84496350,std::unordered_map,6492106752 -random,memory,88293603,std::unordered_map,6687174656 -random,time,90000000,std::unordered_map,44.681000 -random,memory,90004365,std::unordered_map,6774996992 -random,memory,92206220,std::unordered_map,6888091648 -random,memory,96235553,std::unordered_map,7095013376 -random,time,100000000,std::unordered_map,48.382000 -random,memory,0,absl::flat_hash_map,15740928 -random,memory,240967,absl::flat_hash_map,11272192 -random,memory,458751,absl::flat_hash_map,11272192 -random,memory,458752,absl::flat_hash_map,29138944 -random,memory,493930,absl::flat_hash_map,20205568 -random,memory,678845,absl::flat_hash_map,19087360 -random,memory,917503,absl::flat_hash_map,19087360 -random,memory,917504,absl::flat_hash_map,54812672 -random,memory,930488,absl::flat_hash_map,36945920 -random,memory,1835007,absl::flat_hash_map,36945920 -random,memory,1835008,absl::flat_hash_map,108392448 -random,memory,1860950,absl::flat_hash_map,72667136 -random,memory,3670015,absl::flat_hash_map,72667136 -random,memory,3670016,absl::flat_hash_map,215556096 -random,memory,3681610,absl::flat_hash_map,144109568 -random,memory,7340031,absl::flat_hash_map,144109568 -random,memory,7340032,absl::flat_hash_map,429883392 -random,memory,7348393,absl::flat_hash_map,286994432 -random,time,10000000,absl::flat_hash_map,0.917000 -random,memory,10000174,absl::flat_hash_map,286994432 -random,memory,14680063,absl::flat_hash_map,286994432 -random,memory,14680064,absl::flat_hash_map,858537984 -random,memory,14680512,absl::flat_hash_map,572764160 -random,time,20000000,absl::flat_hash_map,2.199000 -random,memory,20013320,absl::flat_hash_map,572764160 -random,memory,29360127,absl::flat_hash_map,572764160 -random,memory,29360128,absl::flat_hash_map,1715859456 -random,memory,29369210,absl::flat_hash_map,1144307712 -random,time,30000000,absl::flat_hash_map,3.818000 -random,memory,30002294,absl::flat_hash_map,1144307712 -random,time,40000000,absl::flat_hash_map,5.070000 -random,memory,40010797,absl::flat_hash_map,1144307712 -random,time,50000000,absl::flat_hash_map,6.323000 -random,memory,50009729,absl::flat_hash_map,1144307712 -random,memory,58720255,absl::flat_hash_map,1144307712 -random,memory,58720256,absl::flat_hash_map,3430486016 -random,memory,58721491,absl::flat_hash_map,2287403008 -random,time,60000000,absl::flat_hash_map,8.700000 -random,memory,60002661,absl::flat_hash_map,2287403008 -random,time,70000000,absl::flat_hash_map,10.155000 -random,memory,70010887,absl::flat_hash_map,2287403008 -random,time,80000000,absl::flat_hash_map,11.589000 -random,memory,80002681,absl::flat_hash_map,2287403008 -random,time,90000000,absl::flat_hash_map,13.020000 -random,memory,90012468,absl::flat_hash_map,2287403008 -random,time,100000000,absl::flat_hash_map,14.407000 diff --git a/extern/phmap/benchmark/results/output_stl_flat_par b/extern/phmap/benchmark/results/output_stl_flat_par deleted file mode 100644 index 8714815..0000000 --- a/extern/phmap/benchmark/results/output_stl_flat_par +++ /dev/null @@ -1,499 +0,0 @@ -random,memory,0,std::unordered_map,6688768 -random,memory,94189,std::unordered_map,7778304 -random,memory,109769,std::unordered_map,8556544 -random,memory,122654,std::unordered_map,9261056 -random,memory,131072,std::unordered_map,13778944 -random,memory,131072,std::unordered_map,11677696 -random,memory,139313,std::unordered_map,12144640 -random,memory,153935,std::unordered_map,12943360 -random,memory,165753,std::unordered_map,13643776 -random,memory,177309,std::unordered_map,14266368 -random,memory,188501,std::unordered_map,14733312 -random,memory,198715,std::unordered_map,15282176 -random,memory,208082,std::unordered_map,15749120 -random,memory,217961,std::unordered_map,16293888 -random,memory,228367,std::unordered_map,16838656 -random,memory,248349,std::unordered_map,17854464 -random,memory,262144,std::unordered_map,26890240 -random,memory,262144,std::unordered_map,22683648 -random,memory,276980,std::unordered_map,23543808 -random,memory,296991,std::unordered_map,24477696 -random,memory,317107,std::unordered_map,25571328 -random,memory,336773,std::unordered_map,26660864 -random,memory,356852,std::unordered_map,27676672 -random,memory,374674,std::unordered_map,28532736 -random,memory,393524,std::unordered_map,29544448 -random,memory,412757,std::unordered_map,30482432 -random,memory,430634,std::unordered_map,31416320 -random,memory,456096,std::unordered_map,32743424 -random,memory,480998,std::unordered_map,34017280 -random,memory,506761,std::unordered_map,35340288 -random,memory,524288,std::unordered_map,53096448 -random,memory,524288,std::unordered_map,44687360 -random,memory,559809,std::unordered_map,46481408 -random,memory,586869,std::unordered_map,47882240 -random,memory,625664,std::unordered_map,49827840 -random,memory,661343,std::unordered_map,51781632 -random,memory,697780,std::unordered_map,53575680 -random,memory,732263,std::unordered_map,55369728 -random,memory,767346,std::unordered_map,57163776 -random,memory,801265,std::unordered_map,58880000 -random,memory,843401,std::unordered_map,61063168 -random,memory,883359,std::unordered_map,63008768 -random,memory,923703,std::unordered_map,65114112 -random,memory,962276,std::unordered_map,67145728 -random,memory,1000499,std::unordered_map,69173248 -random,memory,1046029,std::unordered_map,71438336 -random,memory,1048576,std::unordered_map,105222144 -random,memory,1048576,std::unordered_map,88412160 -random,memory,1103068,std::unordered_map,91217920 -random,memory,1166341,std::unordered_map,94412800 -random,memory,1227947,std::unordered_map,97611776 -random,memory,1288360,std::unordered_map,100732928 -random,memory,1348784,std::unordered_map,103849984 -random,memory,1415960,std::unordered_map,107282432 -random,memory,1483476,std::unordered_map,110710784 -random,memory,1551489,std::unordered_map,114221056 -random,memory,1622998,std::unordered_map,117964800 -random,memory,1698528,std::unordered_map,121786368 -random,memory,1774279,std::unordered_map,125607936 -random,memory,1852847,std::unordered_map,129658880 -random,memory,1935045,std::unordered_map,133955584 -random,memory,2016124,std::unordered_map,138084352 -random,memory,2097152,std::unordered_map,209465344 -random,memory,2097152,std::unordered_map,175845376 -random,memory,2202017,std::unordered_map,181227520 -random,memory,2308233,std::unordered_map,186687488 -random,memory,2421995,std::unordered_map,192569344 -random,memory,2540952,std::unordered_map,198647808 -random,memory,2664197,std::unordered_map,205049856 -random,memory,2786842,std::unordered_map,211288064 -random,memory,2914893,std::unordered_map,217915392 -random,memory,3042611,std::unordered_map,224464896 -random,memory,3177918,std::unordered_map,231325696 -random,memory,3316856,std::unordered_map,238583808 -random,memory,3463219,std::unordered_map,245989376 -random,memory,3606297,std::unordered_map,253440000 -random,memory,3758685,std::unordered_map,261234688 -random,memory,3918344,std::unordered_map,269426688 -random,memory,4082497,std::unordered_map,277848064 -random,memory,4194304,std::unordered_map,418111488 -random,memory,4194304,std::unordered_map,350871552 -random,memory,4405390,std::unordered_map,361631744 -random,memory,4622462,std::unordered_map,372862976 -random,memory,4843447,std::unordered_map,384253952 -random,memory,5077057,std::unordered_map,396234752 -random,memory,5310379,std::unordered_map,408170496 -random,memory,5553459,std::unordered_map,420728832 -random,memory,5801485,std::unordered_map,433438720 -random,memory,6061642,std::unordered_map,446771200 -random,memory,6321544,std::unordered_map,460189696 -random,memory,6597657,std::unordered_map,474308608 -random,memory,6874638,std::unordered_map,488579072 -random,memory,7165061,std::unordered_map,503480320 -random,memory,7464156,std::unordered_map,518844416 -random,memory,7769321,std::unordered_map,534519808 -random,memory,8083787,std::unordered_map,550666240 -random,memory,8388608,std::unordered_map,835313664 -random,memory,8388608,std::unordered_map,700833792 -random,memory,8799364,std::unordered_map,721883136 -random,memory,9228893,std::unordered_map,743878656 -random,memory,9664620,std::unordered_map,766345216 -random,time,10000000,std::unordered_map,4.373000 -random,memory,10005035,std::unordered_map,783814656 -random,memory,10114472,std::unordered_map,789352448 -random,memory,10581340,std::unordered_map,813371392 -random,memory,11060026,std::unordered_map,837943296 -random,memory,11554760,std::unordered_map,863367168 -random,memory,12063672,std::unordered_map,889499648 -random,memory,12588048,std::unordered_map,916488192 -random,memory,13128601,std::unordered_map,944173056 -random,memory,13682065,std::unordered_map,972640256 -random,memory,14255923,std::unordered_map,1002127360 -random,memory,14847433,std::unordered_map,1032548352 -random,memory,15456818,std::unordered_map,1063825408 -random,memory,16080459,std::unordered_map,1095798784 -random,memory,16726977,std::unordered_map,1128947712 -random,memory,16777217,std::unordered_map,1669529600 -random,memory,16777217,std::unordered_map,1400569856 -random,memory,17595085,std::unordered_map,1442603008 -random,memory,18438183,std::unordered_map,1485893632 -random,memory,19311311,std::unordered_map,1530658816 -random,time,20000000,std::unordered_map,8.842000 -random,memory,20000810,std::unordered_map,1566150656 -random,memory,20207250,std::unordered_map,1576677376 -random,memory,21131235,std::unordered_map,1624178688 -random,memory,22086647,std::unordered_map,1673158656 -random,memory,23064920,std::unordered_map,1723465728 -random,memory,24073299,std::unordered_map,1775177728 -random,memory,25110516,std::unordered_map,1828532224 -random,memory,26181575,std::unordered_map,1883516928 -random,memory,27282467,std::unordered_map,1940062208 -random,memory,28422030,std::unordered_map,1998561280 -random,memory,29593778,std::unordered_map,2058694656 -random,time,30000000,std::unordered_map,12.018000 -random,memory,30000114,std::unordered_map,2079678464 -random,memory,30796939,std::unordered_map,2120552448 -random,memory,32039135,std::unordered_map,2184355840 -random,memory,33320240,std::unordered_map,2250104832 -random,memory,33554434,std::unordered_map,3338047488 -random,memory,33554434,std::unordered_map,2800128000 -random,memory,35194605,std::unordered_map,2884362240 -random,memory,36886268,std::unordered_map,2971246592 -random,memory,38624437,std::unordered_map,3060473856 -random,time,40000000,std::unordered_map,18.924999 -random,memory,40003628,std::unordered_map,3131297792 -random,memory,40417618,std::unordered_map,3152588800 -random,memory,42264600,std::unordered_map,3247431680 -random,memory,44165274,std::unordered_map,3345006592 -random,memory,46122181,std::unordered_map,3445542912 -random,memory,48137986,std::unordered_map,3549040640 -random,time,50000000,std::unordered_map,22.261999 -random,memory,50001657,std::unordered_map,3644821504 -random,memory,50216354,std::unordered_map,3655737344 -random,memory,52356080,std::unordered_map,3765637120 -random,memory,54556920,std::unordered_map,3878731776 -random,memory,56823702,std::unordered_map,3995103232 -random,memory,59156726,std::unordered_map,4114980864 -random,time,60000000,std::unordered_map,25.919001 -random,memory,60002957,std::unordered_map,4158427136 -random,memory,61562985,std::unordered_map,4238528512 -random,memory,64040759,std::unordered_map,4365746176 -random,memory,66594964,std::unordered_map,4496855040 -random,memory,67108868,std::unordered_map,6675001344 -random,memory,67108868,std::unordered_map,5599162368 -random,time,70000000,std::unordered_map,37.734001 -random,memory,70005322,std::unordered_map,5747867648 -random,memory,70384719,std::unordered_map,5767364608 -random,memory,73758686,std::unordered_map,5940674560 -random,memory,77233925,std::unordered_map,6119124992 -random,time,80000000,std::unordered_map,41.104000 -random,memory,80002815,std::unordered_map,6261395456 -random,memory,80810186,std::unordered_map,6302810112 -random,memory,84496350,std::unordered_map,6492106752 -random,memory,88293603,std::unordered_map,6687174656 -random,time,90000000,std::unordered_map,44.681000 -random,memory,90004365,std::unordered_map,6774996992 -random,memory,92206220,std::unordered_map,6888091648 -random,memory,96235553,std::unordered_map,7095013376 -random,time,100000000,std::unordered_map,48.382000 -random,memory,0,phmap::flat_hash_map,15740928 -random,memory,240967,phmap::flat_hash_map,11272192 -random,memory,458751,phmap::flat_hash_map,11272192 -random,memory,458752,phmap::flat_hash_map,29138944 -random,memory,493930,phmap::flat_hash_map,20205568 -random,memory,678845,phmap::flat_hash_map,19087360 -random,memory,917503,phmap::flat_hash_map,19087360 -random,memory,917504,phmap::flat_hash_map,54812672 -random,memory,930488,phmap::flat_hash_map,36945920 -random,memory,1835007,phmap::flat_hash_map,36945920 -random,memory,1835008,phmap::flat_hash_map,108392448 -random,memory,1860950,phmap::flat_hash_map,72667136 -random,memory,3670015,phmap::flat_hash_map,72667136 -random,memory,3670016,phmap::flat_hash_map,215556096 -random,memory,3681610,phmap::flat_hash_map,144109568 -random,memory,7340031,phmap::flat_hash_map,144109568 -random,memory,7340032,phmap::flat_hash_map,429883392 -random,memory,7348393,phmap::flat_hash_map,286994432 -random,time,10000000,phmap::flat_hash_map,0.917000 -random,memory,10000174,phmap::flat_hash_map,286994432 -random,memory,14680063,phmap::flat_hash_map,286994432 -random,memory,14680064,phmap::flat_hash_map,858537984 -random,memory,14680512,phmap::flat_hash_map,572764160 -random,time,20000000,phmap::flat_hash_map,2.199000 -random,memory,20013320,phmap::flat_hash_map,572764160 -random,memory,29360127,phmap::flat_hash_map,572764160 -random,memory,29360128,phmap::flat_hash_map,1715859456 -random,memory,29369210,phmap::flat_hash_map,1144307712 -random,time,30000000,phmap::flat_hash_map,3.818000 -random,memory,30002294,phmap::flat_hash_map,1144307712 -random,time,40000000,phmap::flat_hash_map,5.070000 -random,memory,40010797,phmap::flat_hash_map,1144307712 -random,time,50000000,phmap::flat_hash_map,6.323000 -random,memory,50009729,phmap::flat_hash_map,1144307712 -random,memory,58720255,phmap::flat_hash_map,1144307712 -random,memory,58720256,phmap::flat_hash_map,3430486016 -random,memory,58721491,phmap::flat_hash_map,2287403008 -random,time,60000000,phmap::flat_hash_map,8.700000 -random,memory,60002661,phmap::flat_hash_map,2287403008 -random,time,70000000,phmap::flat_hash_map,10.155000 -random,memory,70010887,phmap::flat_hash_map,2287403008 -random,time,80000000,phmap::flat_hash_map,11.589000 -random,memory,80002681,phmap::flat_hash_map,2287403008 -random,time,90000000,phmap::flat_hash_map,13.020000 -random,memory,90012468,phmap::flat_hash_map,2287403008 -random,time,100000000,phmap::flat_hash_map,14.407000 -random,memory,0,phmap::parallel_flat_hash_map,6688768 -random,memory,228584,phmap::parallel_flat_hash_map,6688768 -random,memory,228585,phmap::parallel_flat_hash_map,8372224 -random,memory,230683,phmap::parallel_flat_hash_map,8372224 -random,memory,230684,phmap::parallel_flat_hash_map,11190272 -random,memory,257042,phmap::parallel_flat_hash_map,11190272 -random,memory,257105,phmap::parallel_flat_hash_map,11751424 -random,memory,456008,phmap::parallel_flat_hash_map,11751424 -random,memory,456009,phmap::parallel_flat_hash_map,13996032 -random,memory,456819,phmap::parallel_flat_hash_map,13582336 -random,memory,458740,phmap::parallel_flat_hash_map,13582336 -random,memory,458741,phmap::parallel_flat_hash_map,15847424 -random,memory,459266,phmap::parallel_flat_hash_map,15847424 -random,memory,459267,phmap::parallel_flat_hash_map,17518592 -random,memory,465267,phmap::parallel_flat_hash_map,17518592 -random,memory,465268,phmap::parallel_flat_hash_map,21155840 -random,memory,494937,phmap::parallel_flat_hash_map,20598784 -random,memory,911236,phmap::parallel_flat_hash_map,20598784 -random,memory,911237,phmap::parallel_flat_hash_map,22835200 -random,memory,913145,phmap::parallel_flat_hash_map,22835200 -random,memory,913146,phmap::parallel_flat_hash_map,25067520 -random,memory,914338,phmap::parallel_flat_hash_map,25067520 -random,memory,914339,phmap::parallel_flat_hash_map,27303936 -random,memory,916480,phmap::parallel_flat_hash_map,27303936 -random,memory,916481,phmap::parallel_flat_hash_map,29536256 -random,memory,916523,phmap::parallel_flat_hash_map,29536256 -random,memory,916524,phmap::parallel_flat_hash_map,30650368 -random,memory,917790,phmap::parallel_flat_hash_map,30650368 -random,memory,917791,phmap::parallel_flat_hash_map,32882688 -random,memory,918474,phmap::parallel_flat_hash_map,32882688 -random,memory,918475,phmap::parallel_flat_hash_map,35115008 -random,memory,924420,phmap::parallel_flat_hash_map,35115008 -random,memory,924421,phmap::parallel_flat_hash_map,37355520 -random,memory,937279,phmap::parallel_flat_hash_map,37355520 -random,memory,937319,phmap::parallel_flat_hash_map,38465536 -random,memory,1826595,phmap::parallel_flat_hash_map,38465536 -random,memory,1826596,phmap::parallel_flat_hash_map,42934272 -random,memory,1827102,phmap::parallel_flat_hash_map,42934272 -random,memory,1827103,phmap::parallel_flat_hash_map,45170688 -random,memory,1828265,phmap::parallel_flat_hash_map,45170688 -random,memory,1828266,phmap::parallel_flat_hash_map,47398912 -random,memory,1831166,phmap::parallel_flat_hash_map,47398912 -random,memory,1831167,phmap::parallel_flat_hash_map,49631232 -random,memory,1831515,phmap::parallel_flat_hash_map,49631232 -random,memory,1831516,phmap::parallel_flat_hash_map,51867648 -random,memory,1833264,phmap::parallel_flat_hash_map,51867648 -random,memory,1833265,phmap::parallel_flat_hash_map,54099968 -random,memory,1833345,phmap::parallel_flat_hash_map,54099968 -random,memory,1833346,phmap::parallel_flat_hash_map,56332288 -random,memory,1835078,phmap::parallel_flat_hash_map,56332288 -random,memory,1835079,phmap::parallel_flat_hash_map,58572800 -random,memory,1836213,phmap::parallel_flat_hash_map,58572800 -random,memory,1836214,phmap::parallel_flat_hash_map,60801024 -random,memory,1836364,phmap::parallel_flat_hash_map,60801024 -random,memory,1836365,phmap::parallel_flat_hash_map,63033344 -random,memory,1836849,phmap::parallel_flat_hash_map,63033344 -random,memory,1836850,phmap::parallel_flat_hash_map,65265664 -random,memory,1838065,phmap::parallel_flat_hash_map,65265664 -random,memory,1838066,phmap::parallel_flat_hash_map,67502080 -random,memory,1839241,phmap::parallel_flat_hash_map,67502080 -random,memory,1839242,phmap::parallel_flat_hash_map,69734400 -random,memory,1839771,phmap::parallel_flat_hash_map,69734400 -random,memory,1839772,phmap::parallel_flat_hash_map,71962624 -random,memory,1844031,phmap::parallel_flat_hash_map,71962624 -random,memory,1844032,phmap::parallel_flat_hash_map,74194944 -random,memory,1844165,phmap::parallel_flat_hash_map,74194944 -random,memory,1844166,phmap::parallel_flat_hash_map,76423168 -random,memory,1849529,phmap::parallel_flat_hash_map,74186752 -random,memory,3656347,phmap::parallel_flat_hash_map,74186752 -random,memory,3656348,phmap::parallel_flat_hash_map,83120128 -random,memory,3658236,phmap::parallel_flat_hash_map,83120128 -random,memory,3658237,phmap::parallel_flat_hash_map,87592960 -random,memory,3660832,phmap::parallel_flat_hash_map,87592960 -random,memory,3660833,phmap::parallel_flat_hash_map,92061696 -random,memory,3663897,phmap::parallel_flat_hash_map,92061696 -random,memory,3663898,phmap::parallel_flat_hash_map,96526336 -random,memory,3668004,phmap::parallel_flat_hash_map,96526336 -random,memory,3668005,phmap::parallel_flat_hash_map,100990976 -random,memory,3668781,phmap::parallel_flat_hash_map,100990976 -random,memory,3668782,phmap::parallel_flat_hash_map,105459712 -random,memory,3669316,phmap::parallel_flat_hash_map,100990976 -random,memory,3669736,phmap::parallel_flat_hash_map,100990976 -random,memory,3669737,phmap::parallel_flat_hash_map,109928448 -random,memory,3670780,phmap::parallel_flat_hash_map,109928448 -random,memory,3670781,phmap::parallel_flat_hash_map,114388992 -random,memory,3671735,phmap::parallel_flat_hash_map,114388992 -random,memory,3671736,phmap::parallel_flat_hash_map,118853632 -random,memory,3672742,phmap::parallel_flat_hash_map,118853632 -random,memory,3672743,phmap::parallel_flat_hash_map,123322368 -random,memory,3672841,phmap::parallel_flat_hash_map,123322368 -random,memory,3672842,phmap::parallel_flat_hash_map,127787008 -random,memory,3674661,phmap::parallel_flat_hash_map,127787008 -random,memory,3674662,phmap::parallel_flat_hash_map,132259840 -random,memory,3675918,phmap::parallel_flat_hash_map,132259840 -random,memory,3675919,phmap::parallel_flat_hash_map,136724480 -random,memory,3676502,phmap::parallel_flat_hash_map,136724480 -random,memory,3676503,phmap::parallel_flat_hash_map,141180928 -random,memory,3676556,phmap::parallel_flat_hash_map,141180928 -random,memory,3676557,phmap::parallel_flat_hash_map,145645568 -random,memory,3679943,phmap::parallel_flat_hash_map,141176832 -random,memory,3682847,phmap::parallel_flat_hash_map,141176832 -random,memory,3682848,phmap::parallel_flat_hash_map,150106112 -random,memory,3701420,phmap::parallel_flat_hash_map,145637376 -random,memory,7323550,phmap::parallel_flat_hash_map,145637376 -random,memory,7323551,phmap::parallel_flat_hash_map,163500032 -random,memory,7325955,phmap::parallel_flat_hash_map,154566656 -random,memory,7326781,phmap::parallel_flat_hash_map,154566656 -random,memory,7326782,phmap::parallel_flat_hash_map,172433408 -random,memory,7327471,phmap::parallel_flat_hash_map,172433408 -random,memory,7327472,phmap::parallel_flat_hash_map,181362688 -random,memory,7328548,phmap::parallel_flat_hash_map,181362688 -random,memory,7328549,phmap::parallel_flat_hash_map,190300160 -random,memory,7331571,phmap::parallel_flat_hash_map,190300160 -random,memory,7331572,phmap::parallel_flat_hash_map,199229440 -random,memory,7333270,phmap::parallel_flat_hash_map,199229440 -random,memory,7333271,phmap::parallel_flat_hash_map,208154624 -random,memory,7336330,phmap::parallel_flat_hash_map,208154624 -random,memory,7336331,phmap::parallel_flat_hash_map,217083904 -random,memory,7338941,phmap::parallel_flat_hash_map,217083904 -random,memory,7338942,phmap::parallel_flat_hash_map,226021376 -random,memory,7339987,phmap::parallel_flat_hash_map,226021376 -random,memory,7339988,phmap::parallel_flat_hash_map,234950656 -random,memory,7340192,phmap::parallel_flat_hash_map,234950656 -random,memory,7340193,phmap::parallel_flat_hash_map,243879936 -random,memory,7340212,phmap::parallel_flat_hash_map,243879936 -random,memory,7340213,phmap::parallel_flat_hash_map,252805120 -random,memory,7340756,phmap::parallel_flat_hash_map,252805120 -random,memory,7340757,phmap::parallel_flat_hash_map,261734400 -random,memory,7353138,phmap::parallel_flat_hash_map,261734400 -random,memory,7353139,phmap::parallel_flat_hash_map,270659584 -random,memory,7355638,phmap::parallel_flat_hash_map,270659584 -random,memory,7355639,phmap::parallel_flat_hash_map,279592960 -random,memory,7358552,phmap::parallel_flat_hash_map,279592960 -random,memory,7358553,phmap::parallel_flat_hash_map,288522240 -random,memory,7363002,phmap::parallel_flat_hash_map,279584768 -random,memory,7364175,phmap::parallel_flat_hash_map,279584768 -random,memory,7364176,phmap::parallel_flat_hash_map,297451520 -random,memory,7379232,phmap::parallel_flat_hash_map,288518144 -random,time,10000000,phmap::parallel_flat_hash_map,1.115000 -random,memory,10001837,phmap::parallel_flat_hash_map,288518144 -random,memory,14641981,phmap::parallel_flat_hash_map,288518144 -random,memory,14641982,phmap::parallel_flat_hash_map,324243456 -random,memory,14649536,phmap::parallel_flat_hash_map,306380800 -random,memory,14658094,phmap::parallel_flat_hash_map,306380800 -random,memory,14658095,phmap::parallel_flat_hash_map,342106112 -random,memory,14663598,phmap::parallel_flat_hash_map,342106112 -random,memory,14663599,phmap::parallel_flat_hash_map,359968768 -random,memory,14667323,phmap::parallel_flat_hash_map,359968768 -random,memory,14667324,phmap::parallel_flat_hash_map,377835520 -random,memory,14668425,phmap::parallel_flat_hash_map,377835520 -random,memory,14668426,phmap::parallel_flat_hash_map,395694080 -random,memory,14669145,phmap::parallel_flat_hash_map,395694080 -random,memory,14669146,phmap::parallel_flat_hash_map,413560832 -random,memory,14669916,phmap::parallel_flat_hash_map,395698176 -random,memory,14673506,phmap::parallel_flat_hash_map,395698176 -random,memory,14673507,phmap::parallel_flat_hash_map,431423488 -random,memory,14676201,phmap::parallel_flat_hash_map,431423488 -random,memory,14676202,phmap::parallel_flat_hash_map,449286144 -random,memory,14681323,phmap::parallel_flat_hash_map,449286144 -random,memory,14681324,phmap::parallel_flat_hash_map,467152896 -random,memory,14684771,phmap::parallel_flat_hash_map,449286144 -random,memory,14686498,phmap::parallel_flat_hash_map,449286144 -random,memory,14686499,phmap::parallel_flat_hash_map,485011456 -random,memory,14691299,phmap::parallel_flat_hash_map,485011456 -random,memory,14691300,phmap::parallel_flat_hash_map,502865920 -random,memory,14694531,phmap::parallel_flat_hash_map,502865920 -random,memory,14694532,phmap::parallel_flat_hash_map,520728576 -random,memory,14696324,phmap::parallel_flat_hash_map,520728576 -random,memory,14696325,phmap::parallel_flat_hash_map,538587136 -random,memory,14701255,phmap::parallel_flat_hash_map,538587136 -random,memory,14701256,phmap::parallel_flat_hash_map,556445696 -random,memory,14702651,phmap::parallel_flat_hash_map,538578944 -random,memory,14704639,phmap::parallel_flat_hash_map,538578944 -random,memory,14704640,phmap::parallel_flat_hash_map,574300160 -random,memory,14707748,phmap::parallel_flat_hash_map,574300160 -random,memory,14707749,phmap::parallel_flat_hash_map,592158720 -random,memory,14711651,phmap::parallel_flat_hash_map,574296064 -random,time,20000000,phmap::parallel_flat_hash_map,2.484000 -random,memory,20006564,phmap::parallel_flat_hash_map,574296064 -random,memory,29321443,phmap::parallel_flat_hash_map,574296064 -random,memory,29321444,phmap::parallel_flat_hash_map,645742592 -random,memory,29322576,phmap::parallel_flat_hash_map,645742592 -random,memory,29322577,phmap::parallel_flat_hash_map,681463808 -random,memory,29331685,phmap::parallel_flat_hash_map,645742592 -random,memory,29333141,phmap::parallel_flat_hash_map,645742592 -random,memory,29333142,phmap::parallel_flat_hash_map,717189120 -random,memory,29336447,phmap::parallel_flat_hash_map,717189120 -random,memory,29336448,phmap::parallel_flat_hash_map,752910336 -random,memory,29345055,phmap::parallel_flat_hash_map,717185024 -random,memory,29352413,phmap::parallel_flat_hash_map,717185024 -random,memory,29352414,phmap::parallel_flat_hash_map,788627456 -random,memory,29357051,phmap::parallel_flat_hash_map,752902144 -random,memory,29357141,phmap::parallel_flat_hash_map,752902144 -random,memory,29357142,phmap::parallel_flat_hash_map,824348672 -random,memory,29359481,phmap::parallel_flat_hash_map,824348672 -random,memory,29359482,phmap::parallel_flat_hash_map,860069888 -random,memory,29362077,phmap::parallel_flat_hash_map,860069888 -random,memory,29362078,phmap::parallel_flat_hash_map,895795200 -random,memory,29366120,phmap::parallel_flat_hash_map,895795200 -random,memory,29366121,phmap::parallel_flat_hash_map,931512320 -random,memory,29368098,phmap::parallel_flat_hash_map,931512320 -random,memory,29368099,phmap::parallel_flat_hash_map,967229440 -random,memory,29368978,phmap::parallel_flat_hash_map,931508224 -random,memory,29373953,phmap::parallel_flat_hash_map,931508224 -random,memory,29373954,phmap::parallel_flat_hash_map,1002954752 -random,memory,29376083,phmap::parallel_flat_hash_map,1002954752 -random,memory,29376084,phmap::parallel_flat_hash_map,1038680064 -random,memory,29378406,phmap::parallel_flat_hash_map,1002950656 -random,memory,29378970,phmap::parallel_flat_hash_map,1002950656 -random,memory,29378971,phmap::parallel_flat_hash_map,1074397184 -random,memory,29380083,phmap::parallel_flat_hash_map,1074397184 -random,memory,29380084,phmap::parallel_flat_hash_map,1110122496 -random,memory,29381250,phmap::parallel_flat_hash_map,1110122496 -random,memory,29381251,phmap::parallel_flat_hash_map,1145839616 -random,memory,29384576,phmap::parallel_flat_hash_map,1110110208 -random,memory,29391514,phmap::parallel_flat_hash_map,1110110208 -random,memory,29391515,phmap::parallel_flat_hash_map,1181556736 -random,memory,29398827,phmap::parallel_flat_hash_map,1145835520 -random,time,30000000,phmap::parallel_flat_hash_map,4.197000 -random,memory,30003726,phmap::parallel_flat_hash_map,1145835520 -random,time,40000000,phmap::parallel_flat_hash_map,5.407000 -random,memory,40004260,phmap::parallel_flat_hash_map,1145835520 -random,time,50000000,phmap::parallel_flat_hash_map,6.651000 -random,memory,50008463,phmap::parallel_flat_hash_map,1145835520 -random,memory,58650774,phmap::parallel_flat_hash_map,1145835520 -random,memory,58650775,phmap::parallel_flat_hash_map,1288724480 -random,memory,58651341,phmap::parallel_flat_hash_map,1217282048 -random,memory,58670748,phmap::parallel_flat_hash_map,1217282048 -random,memory,58670749,phmap::parallel_flat_hash_map,1360171008 -random,memory,58672543,phmap::parallel_flat_hash_map,1288724480 -random,memory,58679343,phmap::parallel_flat_hash_map,1288724480 -random,memory,58679344,phmap::parallel_flat_hash_map,1431609344 -random,memory,58679621,phmap::parallel_flat_hash_map,1431609344 -random,memory,58679622,phmap::parallel_flat_hash_map,1503047680 -random,memory,58681449,phmap::parallel_flat_hash_map,1503047680 -random,memory,58681450,phmap::parallel_flat_hash_map,1574498304 -random,memory,58687442,phmap::parallel_flat_hash_map,1503055872 -random,memory,58716081,phmap::parallel_flat_hash_map,1503055872 -random,memory,58716082,phmap::parallel_flat_hash_map,1645944832 -random,memory,58719988,phmap::parallel_flat_hash_map,1574498304 -random,memory,58720496,phmap::parallel_flat_hash_map,1574498304 -random,memory,58720497,phmap::parallel_flat_hash_map,1717387264 -random,memory,58723911,phmap::parallel_flat_hash_map,1717387264 -random,memory,58723912,phmap::parallel_flat_hash_map,1788841984 -random,memory,58728095,phmap::parallel_flat_hash_map,1717395456 -random,memory,58731608,phmap::parallel_flat_hash_map,1717395456 -random,memory,58731609,phmap::parallel_flat_hash_map,1860280320 -random,memory,58737338,phmap::parallel_flat_hash_map,1860280320 -random,memory,58737339,phmap::parallel_flat_hash_map,1931718656 -random,memory,58737397,phmap::parallel_flat_hash_map,1860272128 -random,memory,58744726,phmap::parallel_flat_hash_map,1860272128 -random,memory,58744727,phmap::parallel_flat_hash_map,2003165184 -random,memory,58746205,phmap::parallel_flat_hash_map,1931718656 -random,memory,58752523,phmap::parallel_flat_hash_map,1931718656 -random,memory,58752524,phmap::parallel_flat_hash_map,2074607616 -random,memory,58753838,phmap::parallel_flat_hash_map,2074607616 -random,memory,58753839,phmap::parallel_flat_hash_map,2146054144 -random,memory,58756083,phmap::parallel_flat_hash_map,2146054144 -random,memory,58756084,phmap::parallel_flat_hash_map,2217496576 -random,memory,58758266,phmap::parallel_flat_hash_map,2217496576 -random,memory,58758267,phmap::parallel_flat_hash_map,2288943104 -random,memory,58760494,phmap::parallel_flat_hash_map,2217492480 -random,memory,58766191,phmap::parallel_flat_hash_map,2217492480 -random,memory,58766192,phmap::parallel_flat_hash_map,2360381440 -random,memory,58773720,phmap::parallel_flat_hash_map,2288934912 -random,time,60000000,phmap::parallel_flat_hash_map,9.067000 -random,memory,60002586,phmap::parallel_flat_hash_map,2288934912 -random,time,70000000,phmap::parallel_flat_hash_map,10.409000 -random,memory,70011900,phmap::parallel_flat_hash_map,2288934912 -random,time,80000000,phmap::parallel_flat_hash_map,11.747000 -random,memory,80002981,phmap::parallel_flat_hash_map,2288934912 -random,time,90000000,phmap::parallel_flat_hash_map,13.091000 -random,memory,90007030,phmap::parallel_flat_hash_map,2288934912 -random,time,100000000,phmap::parallel_flat_hash_map,14.467000 diff --git a/extern/phmap/benchmark/results/output_various_N b/extern/phmap/benchmark/results/output_various_N deleted file mode 100644 index 352a033..0000000 --- a/extern/phmap/benchmark/results/output_various_N +++ /dev/null @@ -1,838 +0,0 @@ -random,memory,0,phmap::flat_hash_map,15736832 -random,memory,262696,phmap::flat_hash_map,15736832 -random,memory,262879,phmap::flat_hash_map,11268096 -random,memory,458751,phmap::flat_hash_map,11268096 -random,memory,458752,phmap::flat_hash_map,29134848 -random,memory,493071,phmap::flat_hash_map,29134848 -random,memory,493277,phmap::flat_hash_map,20201472 -random,memory,680181,phmap::flat_hash_map,20201472 -random,memory,680399,phmap::flat_hash_map,19083264 -random,memory,917503,phmap::flat_hash_map,19083264 -random,memory,917504,phmap::flat_hash_map,54808576 -random,memory,927756,phmap::flat_hash_map,54808576 -random,memory,927844,phmap::flat_hash_map,36941824 -random,memory,1835007,phmap::flat_hash_map,36941824 -random,memory,1835008,phmap::flat_hash_map,108388352 -random,memory,1840514,phmap::flat_hash_map,108388352 -random,memory,1840562,phmap::flat_hash_map,72663040 -random,memory,3670015,phmap::flat_hash_map,72663040 -random,memory,3670016,phmap::flat_hash_map,215552000 -random,memory,3672773,phmap::flat_hash_map,215552000 -random,memory,3672818,phmap::flat_hash_map,144105472 -random,memory,7340031,phmap::flat_hash_map,144105472 -random,memory,7340032,phmap::flat_hash_map,429887488 -random,memory,7341507,phmap::flat_hash_map,429887488 -random,memory,7341551,phmap::flat_hash_map,286994432 -random,time,10000000,phmap::flat_hash_map,0.959000 -random,memory,10013489,phmap::flat_hash_map,286994432 -random,memory,14680063,phmap::flat_hash_map,286994432 -random,memory,14680064,phmap::flat_hash_map,858537984 -random,memory,14689336,phmap::flat_hash_map,858537984 -random,memory,14689395,phmap::flat_hash_map,572764160 -random,time,20000000,phmap::flat_hash_map,2.235000 -random,memory,20014360,phmap::flat_hash_map,572764160 -random,memory,29360127,phmap::flat_hash_map,572764160 -random,memory,29360128,phmap::flat_hash_map,1715855360 -random,memory,29362598,phmap::flat_hash_map,1715855360 -random,memory,29362641,phmap::flat_hash_map,1144303616 -random,time,30000000,phmap::flat_hash_map,3.893000 -random,memory,30002217,phmap::flat_hash_map,1144303616 -random,time,40000000,phmap::flat_hash_map,5.194000 -random,memory,40013295,phmap::flat_hash_map,1144303616 -random,time,50000000,phmap::flat_hash_map,6.478000 -random,memory,50004165,phmap::flat_hash_map,1144303616 -random,memory,58720255,phmap::flat_hash_map,1144303616 -random,memory,58720256,phmap::flat_hash_map,3430486016 -random,memory,58730855,phmap::flat_hash_map,3430486016 -random,memory,58730895,phmap::flat_hash_map,2287407104 -random,time,60000000,phmap::flat_hash_map,8.861000 -random,memory,60005803,phmap::flat_hash_map,2287407104 -random,time,70000000,phmap::flat_hash_map,10.361000 -random,memory,70008717,phmap::flat_hash_map,2287407104 -random,time,80000000,phmap::flat_hash_map,11.848000 -random,memory,80003058,phmap::flat_hash_map,2287407104 -random,time,90000000,phmap::flat_hash_map,13.318000 -random,memory,90012411,phmap::flat_hash_map,2287407104 -random,time,100000000,phmap::flat_hash_map,14.773000 -random,memory,0,phmap::parallel_flat_hash_map_4,8425472 -random,memory,230139,phmap::parallel_flat_hash_map_4,8503296 -random,memory,230140,phmap::parallel_flat_hash_map_4,10977280 -random,memory,253089,phmap::parallel_flat_hash_map_4,10977280 -random,memory,253158,phmap::parallel_flat_hash_map_4,13225984 -random,memory,454288,phmap::parallel_flat_hash_map_4,13225984 -random,memory,454289,phmap::parallel_flat_hash_map_4,14352384 -random,memory,456498,phmap::parallel_flat_hash_map_4,14352384 -random,memory,456499,phmap::parallel_flat_hash_map_4,14082048 -random,memory,457735,phmap::parallel_flat_hash_map_4,14082048 -random,memory,457736,phmap::parallel_flat_hash_map_4,15777792 -random,memory,459898,phmap::parallel_flat_hash_map_4,15777792 -random,memory,459899,phmap::parallel_flat_hash_map_4,18591744 -random,memory,461397,phmap::parallel_flat_hash_map_4,18591744 -random,memory,461398,phmap::parallel_flat_hash_map_4,20283392 -random,memory,471716,phmap::parallel_flat_hash_map_4,20283392 -random,memory,471760,phmap::parallel_flat_hash_map_4,21397504 -random,memory,911802,phmap::parallel_flat_hash_map_4,21397504 -random,memory,911803,phmap::parallel_flat_hash_map_4,23633920 -random,memory,911912,phmap::parallel_flat_hash_map_4,23633920 -random,memory,911963,phmap::parallel_flat_hash_map_4,22515712 -random,memory,912599,phmap::parallel_flat_hash_map_4,22515712 -random,memory,912600,phmap::parallel_flat_hash_map_4,25866240 -random,memory,915388,phmap::parallel_flat_hash_map_4,25866240 -random,memory,915389,phmap::parallel_flat_hash_map_4,28098560 -random,memory,916642,phmap::parallel_flat_hash_map_4,28098560 -random,memory,916643,phmap::parallel_flat_hash_map_4,30339072 -random,memory,917177,phmap::parallel_flat_hash_map_4,30339072 -random,memory,917178,phmap::parallel_flat_hash_map_4,32575488 -random,memory,917415,phmap::parallel_flat_hash_map_4,32575488 -random,memory,917416,phmap::parallel_flat_hash_map_4,33689600 -random,memory,920064,phmap::parallel_flat_hash_map_4,33689600 -random,memory,920065,phmap::parallel_flat_hash_map_4,35917824 -random,memory,921982,phmap::parallel_flat_hash_map_4,35917824 -random,memory,921983,phmap::parallel_flat_hash_map_4,38154240 -random,memory,922325,phmap::parallel_flat_hash_map_4,39272448 -random,memory,1826091,phmap::parallel_flat_hash_map_4,39268352 -random,memory,1826092,phmap::parallel_flat_hash_map_4,43737088 -random,memory,1827754,phmap::parallel_flat_hash_map_4,43737088 -random,memory,1827755,phmap::parallel_flat_hash_map_4,45973504 -random,memory,1830054,phmap::parallel_flat_hash_map_4,45973504 -random,memory,1830055,phmap::parallel_flat_hash_map_4,48209920 -random,memory,1830521,phmap::parallel_flat_hash_map_4,48209920 -random,memory,1830522,phmap::parallel_flat_hash_map_4,50438144 -random,memory,1831966,phmap::parallel_flat_hash_map_4,50438144 -random,memory,1831967,phmap::parallel_flat_hash_map_4,52666368 -random,memory,1832841,phmap::parallel_flat_hash_map_4,52666368 -random,memory,1832842,phmap::parallel_flat_hash_map_4,59375616 -random,memory,1836262,phmap::parallel_flat_hash_map_4,59367424 -random,memory,1836263,phmap::parallel_flat_hash_map_4,61603840 -random,memory,1836728,phmap::parallel_flat_hash_map_4,61603840 -random,memory,1836729,phmap::parallel_flat_hash_map_4,63836160 -random,memory,1836910,phmap::parallel_flat_hash_map_4,63836160 -random,memory,1836911,phmap::parallel_flat_hash_map_4,66064384 -random,memory,1838008,phmap::parallel_flat_hash_map_4,66064384 -random,memory,1838009,phmap::parallel_flat_hash_map_4,68300800 -random,memory,1839009,phmap::parallel_flat_hash_map_4,68300800 -random,memory,1839010,phmap::parallel_flat_hash_map_4,70529024 -random,memory,1842043,phmap::parallel_flat_hash_map_4,70529024 -random,memory,1842044,phmap::parallel_flat_hash_map_4,72761344 -random,memory,1842263,phmap::parallel_flat_hash_map_4,72761344 -random,memory,1842264,phmap::parallel_flat_hash_map_4,74993664 -random,memory,1843365,phmap::parallel_flat_hash_map_4,77230080 -random,memory,1902147,phmap::parallel_flat_hash_map_4,77230080 -random,memory,1902233,phmap::parallel_flat_hash_map_4,74997760 -random,memory,3656950,phmap::parallel_flat_hash_map_4,74997760 -random,memory,3656951,phmap::parallel_flat_hash_map_4,83935232 -random,memory,3658625,phmap::parallel_flat_hash_map_4,83939328 -random,memory,3658626,phmap::parallel_flat_hash_map_4,88403968 -random,memory,3660741,phmap::parallel_flat_hash_map_4,88403968 -random,memory,3660742,phmap::parallel_flat_hash_map_4,92872704 -random,memory,3663376,phmap::parallel_flat_hash_map_4,92872704 -random,memory,3663377,phmap::parallel_flat_hash_map_4,97341440 -random,memory,3665288,phmap::parallel_flat_hash_map_4,97341440 -random,memory,3665289,phmap::parallel_flat_hash_map_4,101801984 -random,memory,3668214,phmap::parallel_flat_hash_map_4,101801984 -random,memory,3668215,phmap::parallel_flat_hash_map_4,106270720 -random,memory,3669632,phmap::parallel_flat_hash_map_4,106270720 -random,memory,3669633,phmap::parallel_flat_hash_map_4,110731264 -random,memory,3670422,phmap::parallel_flat_hash_map_4,110731264 -random,memory,3670423,phmap::parallel_flat_hash_map_4,115195904 -random,memory,3671980,phmap::parallel_flat_hash_map_4,115195904 -random,memory,3671981,phmap::parallel_flat_hash_map_4,119656448 -random,memory,3673456,phmap::parallel_flat_hash_map_4,119656448 -random,memory,3673457,phmap::parallel_flat_hash_map_4,124116992 -random,memory,3675504,phmap::parallel_flat_hash_map_4,124116992 -random,memory,3675548,phmap::parallel_flat_hash_map_4,119644160 -random,memory,3675608,phmap::parallel_flat_hash_map_4,119644160 -random,memory,3675609,phmap::parallel_flat_hash_map_4,137519104 -random,memory,3676812,phmap::parallel_flat_hash_map_4,137515008 -random,memory,3676813,phmap::parallel_flat_hash_map_4,141983744 -random,memory,3677010,phmap::parallel_flat_hash_map_4,141983744 -random,memory,3677011,phmap::parallel_flat_hash_map_4,146444288 -random,memory,3682438,phmap::parallel_flat_hash_map_4,146444288 -random,memory,3682439,phmap::parallel_flat_hash_map_4,150904832 -random,memory,3705594,phmap::parallel_flat_hash_map_4,150904832 -random,memory,3705595,phmap::parallel_flat_hash_map_4,146440192 -random,memory,7320177,phmap::parallel_flat_hash_map_4,146440192 -random,memory,7320178,phmap::parallel_flat_hash_map_4,164302848 -random,memory,7321389,phmap::parallel_flat_hash_map_4,164302848 -random,memory,7321390,phmap::parallel_flat_hash_map_4,173240320 -random,memory,7332480,phmap::parallel_flat_hash_map_4,173240320 -random,memory,7332481,phmap::parallel_flat_hash_map_4,182169600 -random,memory,7334320,phmap::parallel_flat_hash_map_4,182169600 -random,memory,7334321,phmap::parallel_flat_hash_map_4,191094784 -random,memory,7338310,phmap::parallel_flat_hash_map_4,191094784 -random,memory,7338311,phmap::parallel_flat_hash_map_4,200028160 -random,memory,7338542,phmap::parallel_flat_hash_map_4,200028160 -random,memory,7338543,phmap::parallel_flat_hash_map_4,208961536 -random,memory,7339365,phmap::parallel_flat_hash_map_4,208961536 -random,memory,7339366,phmap::parallel_flat_hash_map_4,217899008 -random,memory,7339930,phmap::parallel_flat_hash_map_4,217899008 -random,memory,7339931,phmap::parallel_flat_hash_map_4,226828288 -random,memory,7341026,phmap::parallel_flat_hash_map_4,226828288 -random,memory,7341027,phmap::parallel_flat_hash_map_4,253620224 -random,memory,7345230,phmap::parallel_flat_hash_map_4,253616128 -random,memory,7345231,phmap::parallel_flat_hash_map_4,262545408 -random,memory,7347839,phmap::parallel_flat_hash_map_4,262545408 -random,memory,7347840,phmap::parallel_flat_hash_map_4,271470592 -random,memory,7349398,phmap::parallel_flat_hash_map_4,271470592 -random,memory,7349399,phmap::parallel_flat_hash_map_4,280399872 -random,memory,7350072,phmap::parallel_flat_hash_map_4,280399872 -random,memory,7350073,phmap::parallel_flat_hash_map_4,289329152 -random,memory,7358606,phmap::parallel_flat_hash_map_4,289329152 -random,memory,7358607,phmap::parallel_flat_hash_map_4,298262528 -random,memory,7418699,phmap::parallel_flat_hash_map_4,298262528 -random,memory,7418807,phmap::parallel_flat_hash_map_4,289329152 -random,time,10000000,phmap::parallel_flat_hash_map_4,0.775000 -random,memory,10143429,phmap::parallel_flat_hash_map_4,288841728 -random,memory,14656465,phmap::parallel_flat_hash_map_4,288841728 -random,memory,14656466,phmap::parallel_flat_hash_map_4,324567040 -random,memory,14666142,phmap::parallel_flat_hash_map_4,324567040 -random,memory,14666153,phmap::parallel_flat_hash_map_4,342429696 -random,memory,14668185,phmap::parallel_flat_hash_map_4,342429696 -random,memory,14668186,phmap::parallel_flat_hash_map_4,360292352 -random,memory,14669296,phmap::parallel_flat_hash_map_4,360292352 -random,memory,14669297,phmap::parallel_flat_hash_map_4,378155008 -random,memory,14669466,phmap::parallel_flat_hash_map_4,378155008 -random,memory,14669467,phmap::parallel_flat_hash_map_4,396017664 -random,memory,14673507,phmap::parallel_flat_hash_map_4,396017664 -random,memory,14673508,phmap::parallel_flat_hash_map_4,413876224 -random,memory,14677314,phmap::parallel_flat_hash_map_4,413876224 -random,memory,14677315,phmap::parallel_flat_hash_map_4,467460096 -random,memory,14677330,phmap::parallel_flat_hash_map_4,467460096 -random,memory,14677331,phmap::parallel_flat_hash_map_4,449593344 -random,memory,14681511,phmap::parallel_flat_hash_map_4,449593344 -random,memory,14681512,phmap::parallel_flat_hash_map_4,467456000 -random,memory,14681884,phmap::parallel_flat_hash_map_4,467456000 -random,memory,14681885,phmap::parallel_flat_hash_map_4,485318656 -random,memory,14685984,phmap::parallel_flat_hash_map_4,485318656 -random,memory,14685985,phmap::parallel_flat_hash_map_4,503173120 -random,memory,14692178,phmap::parallel_flat_hash_map_4,503173120 -random,memory,14692179,phmap::parallel_flat_hash_map_4,521035776 -random,memory,14693317,phmap::parallel_flat_hash_map_4,521035776 -random,memory,14693318,phmap::parallel_flat_hash_map_4,538902528 -random,memory,14695057,phmap::parallel_flat_hash_map_4,538902528 -random,memory,14695058,phmap::parallel_flat_hash_map_4,556769280 -random,memory,14696242,phmap::parallel_flat_hash_map_4,556769280 -random,memory,14696243,phmap::parallel_flat_hash_map_4,574623744 -random,memory,14699788,phmap::parallel_flat_hash_map_4,574623744 -random,memory,14699789,phmap::parallel_flat_hash_map_4,592478208 -random,memory,14724882,phmap::parallel_flat_hash_map_4,592478208 -random,memory,14724958,phmap::parallel_flat_hash_map_4,574607360 -random,time,20000000,phmap::parallel_flat_hash_map_4,1.624000 -random,memory,20059632,phmap::parallel_flat_hash_map_4,574607360 -random,memory,29320741,phmap::parallel_flat_hash_map_4,574607360 -random,memory,29320742,phmap::parallel_flat_hash_map_4,646053888 -random,memory,29324660,phmap::parallel_flat_hash_map_4,646053888 -random,memory,29324661,phmap::parallel_flat_hash_map_4,681779200 -random,memory,29337731,phmap::parallel_flat_hash_map_4,681779200 -random,memory,29337732,phmap::parallel_flat_hash_map_4,717500416 -random,memory,29344679,phmap::parallel_flat_hash_map_4,717500416 -random,memory,29344680,phmap::parallel_flat_hash_map_4,753221632 -random,memory,29345420,phmap::parallel_flat_hash_map_4,753221632 -random,memory,29345421,phmap::parallel_flat_hash_map_4,788938752 -random,memory,29346467,phmap::parallel_flat_hash_map_4,788938752 -random,memory,29346468,phmap::parallel_flat_hash_map_4,824659968 -random,memory,29350032,phmap::parallel_flat_hash_map_4,824659968 -random,memory,29350033,phmap::parallel_flat_hash_map_4,860385280 -random,memory,29363538,phmap::parallel_flat_hash_map_4,860385280 -random,memory,29363539,phmap::parallel_flat_hash_map_4,896106496 -random,memory,29368515,phmap::parallel_flat_hash_map_4,896106496 -random,memory,29368516,phmap::parallel_flat_hash_map_4,931831808 -random,memory,29377392,phmap::parallel_flat_hash_map_4,931831808 -random,memory,29377393,phmap::parallel_flat_hash_map_4,967553024 -random,memory,29378023,phmap::parallel_flat_hash_map_4,967553024 -random,memory,29378024,phmap::parallel_flat_hash_map_4,1003274240 -random,memory,29379201,phmap::parallel_flat_hash_map_4,1003274240 -random,memory,29379202,phmap::parallel_flat_hash_map_4,1038991360 -random,memory,29380427,phmap::parallel_flat_hash_map_4,1038991360 -random,memory,29380428,phmap::parallel_flat_hash_map_4,1074712576 -random,memory,29380936,phmap::parallel_flat_hash_map_4,1074712576 -random,memory,29380937,phmap::parallel_flat_hash_map_4,1110429696 -random,memory,29381222,phmap::parallel_flat_hash_map_4,1110429696 -random,memory,29381223,phmap::parallel_flat_hash_map_4,1146150912 -random,memory,29383327,phmap::parallel_flat_hash_map_4,1146150912 -random,memory,29383328,phmap::parallel_flat_hash_map_4,1181872128 -random,memory,29481786,phmap::parallel_flat_hash_map_4,1181872128 -random,memory,29482210,phmap::parallel_flat_hash_map_4,1146150912 -random,time,30000000,phmap::parallel_flat_hash_map_4,2.765000 -random,memory,30042200,phmap::parallel_flat_hash_map_4,1146150912 -random,time,40000000,phmap::parallel_flat_hash_map_4,3.366000 -random,memory,40007439,phmap::parallel_flat_hash_map_4,1146093568 -random,time,50000000,phmap::parallel_flat_hash_map_4,3.980000 -random,memory,50022406,phmap::parallel_flat_hash_map_4,1146150912 -random,memory,58667479,phmap::parallel_flat_hash_map_4,1146150912 -random,memory,58667498,phmap::parallel_flat_hash_map_4,1289039872 -random,memory,58667500,phmap::parallel_flat_hash_map_4,1289039872 -random,memory,58667517,phmap::parallel_flat_hash_map_4,1217597440 -random,memory,58679732,phmap::parallel_flat_hash_map_4,1217597440 -random,memory,58679733,phmap::parallel_flat_hash_map_4,1360486400 -random,memory,58694839,phmap::parallel_flat_hash_map_4,1360486400 -random,memory,58694840,phmap::parallel_flat_hash_map_4,1431928832 -random,memory,58698836,phmap::parallel_flat_hash_map_4,1431928832 -random,memory,58698837,phmap::parallel_flat_hash_map_4,1503367168 -random,memory,58699874,phmap::parallel_flat_hash_map_4,1503367168 -random,memory,58699875,phmap::parallel_flat_hash_map_4,1574809600 -random,memory,58709079,phmap::parallel_flat_hash_map_4,1574809600 -random,memory,58709080,phmap::parallel_flat_hash_map_4,1646252032 -random,memory,58719855,phmap::parallel_flat_hash_map_4,1646252032 -random,memory,58719863,phmap::parallel_flat_hash_map_4,1717694464 -random,memory,58722595,phmap::parallel_flat_hash_map_4,1717694464 -random,memory,58722596,phmap::parallel_flat_hash_map_4,1789149184 -random,memory,58724186,phmap::parallel_flat_hash_map_4,1789149184 -random,memory,58724187,phmap::parallel_flat_hash_map_4,1860595712 -random,memory,58728663,phmap::parallel_flat_hash_map_4,1860595712 -random,memory,58728664,phmap::parallel_flat_hash_map_4,1932034048 -random,memory,58734146,phmap::parallel_flat_hash_map_4,1932034048 -random,memory,58734147,phmap::parallel_flat_hash_map_4,2003476480 -random,memory,58739881,phmap::parallel_flat_hash_map_4,2003476480 -random,memory,58739882,phmap::parallel_flat_hash_map_4,2074923008 -random,memory,58743626,phmap::parallel_flat_hash_map_4,2074923008 -random,memory,58743627,phmap::parallel_flat_hash_map_4,2146361344 -random,memory,58748930,phmap::parallel_flat_hash_map_4,2146361344 -random,memory,58748931,phmap::parallel_flat_hash_map_4,2217803776 -random,memory,58752653,phmap::parallel_flat_hash_map_4,2217803776 -random,memory,58752654,phmap::parallel_flat_hash_map_4,2289242112 -random,memory,58761467,phmap::parallel_flat_hash_map_4,2289242112 -random,memory,58761468,phmap::parallel_flat_hash_map_4,2360680448 -random,memory,58767953,phmap::parallel_flat_hash_map_4,2360680448 -random,memory,58767993,phmap::parallel_flat_hash_map_4,2289233920 -random,time,60000000,phmap::parallel_flat_hash_map_4,5.747000 -random,memory,60013676,phmap::parallel_flat_hash_map_4,2289242112 -random,time,70000000,phmap::parallel_flat_hash_map_4,6.369000 -random,memory,70124243,phmap::parallel_flat_hash_map_4,2289233920 -random,time,80000000,phmap::parallel_flat_hash_map_4,7.042000 -random,memory,80028849,phmap::parallel_flat_hash_map_4,2289238016 -random,time,90000000,phmap::parallel_flat_hash_map_4,7.670000 -random,memory,90048047,phmap::parallel_flat_hash_map_4,2289238016 -random,time,100000000,phmap::parallel_flat_hash_map_4,8.369000 -random,memory,0,phmap::parallel_flat_hash_map_5,8171520 -random,memory,230048,phmap::parallel_flat_hash_map_5,8171520 -random,memory,230049,phmap::parallel_flat_hash_map_5,11292672 -random,memory,447941,phmap::parallel_flat_hash_map_5,11292672 -random,memory,447942,phmap::parallel_flat_hash_map_5,12705792 -random,memory,454330,phmap::parallel_flat_hash_map_5,12705792 -random,memory,454331,phmap::parallel_flat_hash_map_5,16080896 -random,memory,459541,phmap::parallel_flat_hash_map_5,16080896 -random,memory,459542,phmap::parallel_flat_hash_map_5,18911232 -random,memory,463883,phmap::parallel_flat_hash_map_5,18911232 -random,memory,463884,phmap::parallel_flat_hash_map_5,23703552 -random,memory,907467,phmap::parallel_flat_hash_map_5,23703552 -random,memory,907468,phmap::parallel_flat_hash_map_5,25948160 -random,memory,910634,phmap::parallel_flat_hash_map_5,25948160 -random,memory,910635,phmap::parallel_flat_hash_map_5,25681920 -random,memory,912368,phmap::parallel_flat_hash_map_5,25681920 -random,memory,912369,phmap::parallel_flat_hash_map_5,25169920 -random,memory,914982,phmap::parallel_flat_hash_map_5,25169920 -random,memory,914983,phmap::parallel_flat_hash_map_5,29949952 -random,memory,918814,phmap::parallel_flat_hash_map_5,29949952 -random,memory,918815,phmap::parallel_flat_hash_map_5,32497664 -random,memory,920383,phmap::parallel_flat_hash_map_5,32497664 -random,memory,920384,phmap::parallel_flat_hash_map_5,33644544 -random,memory,922282,phmap::parallel_flat_hash_map_5,33644544 -random,memory,922283,phmap::parallel_flat_hash_map_5,35336192 -random,memory,924207,phmap::parallel_flat_hash_map_5,35336192 -random,memory,924208,phmap::parallel_flat_hash_map_5,38166528 -random,memory,1045187,phmap::parallel_flat_hash_map_5,38166528 -random,memory,1045188,phmap::parallel_flat_hash_map_5,39317504 -random,memory,1821687,phmap::parallel_flat_hash_map_5,39317504 -random,memory,1821688,phmap::parallel_flat_hash_map_5,41553920 -random,memory,1825706,phmap::parallel_flat_hash_map_5,41553920 -random,memory,1825707,phmap::parallel_flat_hash_map_5,43786240 -random,memory,1827224,phmap::parallel_flat_hash_map_5,43786240 -random,memory,1827225,phmap::parallel_flat_hash_map_5,47144960 -random,memory,1828449,phmap::parallel_flat_hash_map_5,48259072 -random,memory,1831516,phmap::parallel_flat_hash_map_5,48259072 -random,memory,1831517,phmap::parallel_flat_hash_map_5,52727808 -random,memory,1832911,phmap::parallel_flat_hash_map_5,52727808 -random,memory,1832912,phmap::parallel_flat_hash_map_5,56082432 -random,memory,1835515,phmap::parallel_flat_hash_map_5,56078336 -random,memory,1835516,phmap::parallel_flat_hash_map_5,60547072 -random,memory,1836508,phmap::parallel_flat_hash_map_5,60547072 -random,memory,1836509,phmap::parallel_flat_hash_map_5,62779392 -random,memory,1837620,phmap::parallel_flat_hash_map_5,63893504 -random,memory,1838419,phmap::parallel_flat_hash_map_5,63893504 -random,memory,1838420,phmap::parallel_flat_hash_map_5,68362240 -random,memory,1844110,phmap::parallel_flat_hash_map_5,68358144 -random,memory,1844111,phmap::parallel_flat_hash_map_5,71704576 -random,memory,1845194,phmap::parallel_flat_hash_map_5,72822784 -random,memory,1848605,phmap::parallel_flat_hash_map_5,72822784 -random,memory,1848606,phmap::parallel_flat_hash_map_5,76173312 -random,memory,1903391,phmap::parallel_flat_hash_map_5,76173312 -random,memory,2062005,phmap::parallel_flat_hash_map_5,75051008 -random,memory,3647995,phmap::parallel_flat_hash_map_5,75051008 -random,memory,3647996,phmap::parallel_flat_hash_map_5,79519744 -random,memory,3653763,phmap::parallel_flat_hash_map_5,81756160 -random,memory,3654750,phmap::parallel_flat_hash_map_5,83988480 -random,memory,3655941,phmap::parallel_flat_hash_map_5,86216704 -random,memory,3658224,phmap::parallel_flat_hash_map_5,88457216 -random,memory,3658959,phmap::parallel_flat_hash_map_5,90689536 -random,memory,3659868,phmap::parallel_flat_hash_map_5,90689536 -random,memory,3659869,phmap::parallel_flat_hash_map_5,97394688 -random,memory,3665747,phmap::parallel_flat_hash_map_5,99618816 -random,memory,3666483,phmap::parallel_flat_hash_map_5,101855232 -random,memory,3666786,phmap::parallel_flat_hash_map_5,104083456 -random,memory,3668303,phmap::parallel_flat_hash_map_5,106319872 -random,memory,3669798,phmap::parallel_flat_hash_map_5,108560384 -random,memory,3670157,phmap::parallel_flat_hash_map_5,110800896 -random,memory,3670634,phmap::parallel_flat_hash_map_5,110800896 -random,memory,3670635,phmap::parallel_flat_hash_map_5,117501952 -random,memory,3671412,phmap::parallel_flat_hash_map_5,117497856 -random,memory,3671413,phmap::parallel_flat_hash_map_5,124194816 -random,memory,3676143,phmap::parallel_flat_hash_map_5,126423040 -random,memory,3676807,phmap::parallel_flat_hash_map_5,128655360 -random,memory,3677068,phmap::parallel_flat_hash_map_5,128655360 -random,memory,3677069,phmap::parallel_flat_hash_map_5,135356416 -random,memory,3677181,phmap::parallel_flat_hash_map_5,135356416 -random,memory,3677182,phmap::parallel_flat_hash_map_5,133115904 -random,memory,3680571,phmap::parallel_flat_hash_map_5,135348224 -random,memory,3683612,phmap::parallel_flat_hash_map_5,137580544 -random,memory,3684355,phmap::parallel_flat_hash_map_5,139808768 -random,memory,3684486,phmap::parallel_flat_hash_map_5,142045184 -random,memory,3684703,phmap::parallel_flat_hash_map_5,144277504 -random,memory,3687105,phmap::parallel_flat_hash_map_5,146505728 -random,memory,3690770,phmap::parallel_flat_hash_map_5,148733952 -random,memory,3715764,phmap::parallel_flat_hash_map_5,148733952 -random,memory,3715808,phmap::parallel_flat_hash_map_5,146497536 -random,memory,7297554,phmap::parallel_flat_hash_map_5,146497536 -random,memory,7297555,phmap::parallel_flat_hash_map_5,155435008 -random,memory,7311903,phmap::parallel_flat_hash_map_5,159903744 -random,memory,7322014,phmap::parallel_flat_hash_map_5,164372480 -random,memory,7324284,phmap::parallel_flat_hash_map_5,168845312 -random,memory,7325861,phmap::parallel_flat_hash_map_5,168845312 -random,memory,7325862,phmap::parallel_flat_hash_map_5,182243328 -random,memory,7327665,phmap::parallel_flat_hash_map_5,186707968 -random,memory,7328023,phmap::parallel_flat_hash_map_5,186707968 -random,memory,7328024,phmap::parallel_flat_hash_map_5,200101888 -random,memory,7329789,phmap::parallel_flat_hash_map_5,200110080 -random,memory,7329790,phmap::parallel_flat_hash_map_5,213512192 -random,memory,7334043,phmap::parallel_flat_hash_map_5,217964544 -random,memory,7334415,phmap::parallel_flat_hash_map_5,222425088 -random,memory,7339734,phmap::parallel_flat_hash_map_5,226893824 -random,memory,7341649,phmap::parallel_flat_hash_map_5,231358464 -random,memory,7344137,phmap::parallel_flat_hash_map_5,235819008 -random,memory,7344731,phmap::parallel_flat_hash_map_5,240279552 -random,memory,7345981,phmap::parallel_flat_hash_map_5,244748288 -random,memory,7347533,phmap::parallel_flat_hash_map_5,249208832 -random,memory,7348108,phmap::parallel_flat_hash_map_5,253677568 -random,memory,7348995,phmap::parallel_flat_hash_map_5,258142208 -random,memory,7352977,phmap::parallel_flat_hash_map_5,262598656 -random,memory,7355355,phmap::parallel_flat_hash_map_5,267063296 -random,memory,7356095,phmap::parallel_flat_hash_map_5,271536128 -random,memory,7357263,phmap::parallel_flat_hash_map_5,276004864 -random,memory,7365455,phmap::parallel_flat_hash_map_5,280465408 -random,memory,7367447,phmap::parallel_flat_hash_map_5,284930048 -random,memory,7371641,phmap::parallel_flat_hash_map_5,289386496 -random,memory,7378137,phmap::parallel_flat_hash_map_5,289386496 -random,memory,7378146,phmap::parallel_flat_hash_map_5,284917760 -random,memory,7389605,phmap::parallel_flat_hash_map_5,284917760 -random,memory,7389606,phmap::parallel_flat_hash_map_5,293851136 -random,memory,7544723,phmap::parallel_flat_hash_map_5,293851136 -random,memory,7544854,phmap::parallel_flat_hash_map_5,289382400 -random,time,10000000,phmap::parallel_flat_hash_map_5,0.706000 -random,memory,10026761,phmap::parallel_flat_hash_map_5,288780288 -random,memory,14626943,phmap::parallel_flat_hash_map_5,288780288 -random,memory,14626967,phmap::parallel_flat_hash_map_5,306647040 -random,memory,14639253,phmap::parallel_flat_hash_map_5,306647040 -random,memory,14639317,phmap::parallel_flat_hash_map_5,297713664 -random,memory,14649711,phmap::parallel_flat_hash_map_5,297713664 -random,memory,14649712,phmap::parallel_flat_hash_map_5,315576320 -random,memory,14652713,phmap::parallel_flat_hash_map_5,324509696 -random,memory,14654833,phmap::parallel_flat_hash_map_5,333443072 -random,memory,14662126,phmap::parallel_flat_hash_map_5,342380544 -random,memory,14663094,phmap::parallel_flat_hash_map_5,351309824 -random,memory,14666099,phmap::parallel_flat_hash_map_5,360239104 -random,memory,14670830,phmap::parallel_flat_hash_map_5,360239104 -random,memory,14670831,phmap::parallel_flat_hash_map_5,387043328 -random,memory,14672442,phmap::parallel_flat_hash_map_5,387043328 -random,memory,14672443,phmap::parallel_flat_hash_map_5,404893696 -random,memory,14672704,phmap::parallel_flat_hash_map_5,404893696 -random,memory,14672705,phmap::parallel_flat_hash_map_5,422756352 -random,memory,14676798,phmap::parallel_flat_hash_map_5,431681536 -random,memory,14677479,phmap::parallel_flat_hash_map_5,440610816 -random,memory,14677635,phmap::parallel_flat_hash_map_5,440610816 -random,memory,14677636,phmap::parallel_flat_hash_map_5,467410944 -random,memory,14677806,phmap::parallel_flat_hash_map_5,467410944 -random,memory,14677964,phmap::parallel_flat_hash_map_5,449540096 -random,memory,14679982,phmap::parallel_flat_hash_map_5,449540096 -random,memory,14679983,phmap::parallel_flat_hash_map_5,467406848 -random,memory,14681796,phmap::parallel_flat_hash_map_5,476340224 -random,memory,14683621,phmap::parallel_flat_hash_map_5,485265408 -random,memory,14685751,phmap::parallel_flat_hash_map_5,494202880 -random,memory,14686247,phmap::parallel_flat_hash_map_5,503128064 -random,memory,14689965,phmap::parallel_flat_hash_map_5,503128064 -random,memory,14689966,phmap::parallel_flat_hash_map_5,529915904 -random,memory,14701543,phmap::parallel_flat_hash_map_5,538849280 -random,memory,14702897,phmap::parallel_flat_hash_map_5,547774464 -random,memory,14706767,phmap::parallel_flat_hash_map_5,556707840 -random,memory,14718882,phmap::parallel_flat_hash_map_5,565637120 -random,memory,14723067,phmap::parallel_flat_hash_map_5,574562304 -random,memory,14725863,phmap::parallel_flat_hash_map_5,583491584 -random,memory,14830100,phmap::parallel_flat_hash_map_5,583491584 -random,memory,14830101,phmap::parallel_flat_hash_map_5,574558208 -random,time,20000000,phmap::parallel_flat_hash_map_5,1.394000 -random,memory,20032077,phmap::parallel_flat_hash_map_5,574541824 -random,memory,29275812,phmap::parallel_flat_hash_map_5,574541824 -random,memory,29275813,phmap::parallel_flat_hash_map_5,610267136 -random,memory,29289707,phmap::parallel_flat_hash_map_5,610267136 -random,memory,29289796,phmap::parallel_flat_hash_map_5,592404480 -random,memory,29315566,phmap::parallel_flat_hash_map_5,592404480 -random,memory,29315567,phmap::parallel_flat_hash_map_5,628129792 -random,memory,29323636,phmap::parallel_flat_hash_map_5,645992448 -random,memory,29330379,phmap::parallel_flat_hash_map_5,663855104 -random,memory,29331279,phmap::parallel_flat_hash_map_5,681713664 -random,memory,29336070,phmap::parallel_flat_hash_map_5,699576320 -random,memory,29339390,phmap::parallel_flat_hash_map_5,717447168 -random,memory,29341008,phmap::parallel_flat_hash_map_5,735305728 -random,memory,29341515,phmap::parallel_flat_hash_map_5,753164288 -random,memory,29344933,phmap::parallel_flat_hash_map_5,771031040 -random,memory,29349195,phmap::parallel_flat_hash_map_5,771031040 -random,memory,29349196,phmap::parallel_flat_hash_map_5,824614912 -random,memory,29352451,phmap::parallel_flat_hash_map_5,824614912 -random,memory,29352452,phmap::parallel_flat_hash_map_5,878198784 -random,memory,29355941,phmap::parallel_flat_hash_map_5,878198784 -random,memory,29355942,phmap::parallel_flat_hash_map_5,913915904 -random,memory,29356055,phmap::parallel_flat_hash_map_5,913915904 -random,memory,29356056,phmap::parallel_flat_hash_map_5,896053248 -random,memory,29359791,phmap::parallel_flat_hash_map_5,913915904 -random,memory,29363827,phmap::parallel_flat_hash_map_5,931774464 -random,memory,29366034,phmap::parallel_flat_hash_map_5,949637120 -random,memory,29367103,phmap::parallel_flat_hash_map_5,967495680 -random,memory,29368343,phmap::parallel_flat_hash_map_5,985354240 -random,memory,29375432,phmap::parallel_flat_hash_map_5,1003216896 -random,memory,29376205,phmap::parallel_flat_hash_map_5,1021071360 -random,memory,29378354,phmap::parallel_flat_hash_map_5,1038925824 -random,memory,29385594,phmap::parallel_flat_hash_map_5,1056784384 -random,memory,29388397,phmap::parallel_flat_hash_map_5,1074647040 -random,memory,29401214,phmap::parallel_flat_hash_map_5,1092509696 -random,memory,29403877,phmap::parallel_flat_hash_map_5,1110368256 -random,memory,29410744,phmap::parallel_flat_hash_map_5,1128235008 -random,memory,29417350,phmap::parallel_flat_hash_map_5,1146093568 -random,memory,29423045,phmap::parallel_flat_hash_map_5,1163956224 -random,memory,29554740,phmap::parallel_flat_hash_map_5,1163956224 -random,memory,29554741,phmap::parallel_flat_hash_map_5,1146097664 -random,time,30000000,phmap::parallel_flat_hash_map_5,2.388000 -random,memory,30058375,phmap::parallel_flat_hash_map_5,1146105856 -random,time,40000000,phmap::parallel_flat_hash_map_5,2.859000 -random,memory,40129005,phmap::parallel_flat_hash_map_5,1146118144 -random,time,50000000,phmap::parallel_flat_hash_map_5,3.398000 -random,memory,50130659,phmap::parallel_flat_hash_map_5,1146114048 -random,memory,58648505,phmap::parallel_flat_hash_map_5,1146114048 -random,memory,58648506,phmap::parallel_flat_hash_map_5,1217560576 -random,memory,58659099,phmap::parallel_flat_hash_map_5,1253285888 -random,memory,58664853,phmap::parallel_flat_hash_map_5,1289011200 -random,memory,58672884,phmap::parallel_flat_hash_map_5,1324728320 -random,memory,58677336,phmap::parallel_flat_hash_map_5,1360449536 -random,memory,58685517,phmap::parallel_flat_hash_map_5,1396174848 -random,memory,58694184,phmap::parallel_flat_hash_map_5,1431896064 -random,memory,58695854,phmap::parallel_flat_hash_map_5,1467617280 -random,memory,58697408,phmap::parallel_flat_hash_map_5,1503346688 -random,memory,58697642,phmap::parallel_flat_hash_map_5,1503346688 -random,memory,58697658,phmap::parallel_flat_hash_map_5,1467617280 -random,memory,58702073,phmap::parallel_flat_hash_map_5,1467617280 -random,memory,58702074,phmap::parallel_flat_hash_map_5,1539063808 -random,memory,58705027,phmap::parallel_flat_hash_map_5,1574785024 -random,memory,58706773,phmap::parallel_flat_hash_map_5,1610506240 -random,memory,58709256,phmap::parallel_flat_hash_map_5,1646227456 -random,memory,58713971,phmap::parallel_flat_hash_map_5,1681940480 -random,memory,58714578,phmap::parallel_flat_hash_map_5,1717657600 -random,memory,58714931,phmap::parallel_flat_hash_map_5,1753378816 -random,memory,58723299,phmap::parallel_flat_hash_map_5,1789095936 -random,memory,58724869,phmap::parallel_flat_hash_map_5,1824829440 -random,memory,58728103,phmap::parallel_flat_hash_map_5,1860554752 -random,memory,58728557,phmap::parallel_flat_hash_map_5,1896271872 -random,memory,58735188,phmap::parallel_flat_hash_map_5,1931988992 -random,memory,58736098,phmap::parallel_flat_hash_map_5,1967710208 -random,memory,58737751,phmap::parallel_flat_hash_map_5,2003435520 -random,memory,58738589,phmap::parallel_flat_hash_map_5,2039152640 -random,memory,58739865,phmap::parallel_flat_hash_map_5,2074877952 -random,memory,58742832,phmap::parallel_flat_hash_map_5,2110599168 -random,memory,58754529,phmap::parallel_flat_hash_map_5,2146316288 -random,memory,58762104,phmap::parallel_flat_hash_map_5,2182037504 -random,memory,58767879,phmap::parallel_flat_hash_map_5,2217758720 -random,memory,58778531,phmap::parallel_flat_hash_map_5,2253479936 -random,memory,58793956,phmap::parallel_flat_hash_map_5,2289197056 -random,memory,58800861,phmap::parallel_flat_hash_map_5,2324922368 -random,memory,58894435,phmap::parallel_flat_hash_map_5,2324922368 -random,memory,58894436,phmap::parallel_flat_hash_map_5,2289197056 -random,time,60000000,phmap::parallel_flat_hash_map_5,4.975000 -random,memory,60010883,phmap::parallel_flat_hash_map_5,2289197056 -random,time,70000000,phmap::parallel_flat_hash_map_5,5.534000 -random,memory,70176985,phmap::parallel_flat_hash_map_5,2289192960 -random,time,80000000,phmap::parallel_flat_hash_map_5,6.041000 -random,memory,80051145,phmap::parallel_flat_hash_map_5,2289180672 -random,time,90000000,phmap::parallel_flat_hash_map_5,6.613000 -random,memory,90041943,phmap::parallel_flat_hash_map_5,2289188864 -random,time,100000000,phmap::parallel_flat_hash_map_5,7.142000 -random,memory,0,phmap::parallel_flat_hash_map_6,9543680 -random,memory,240118,phmap::parallel_flat_hash_map_6,9543680 -random,memory,240274,phmap::parallel_flat_hash_map_6,13426688 -random,memory,447602,phmap::parallel_flat_hash_map_6,13713408 -random,memory,456883,phmap::parallel_flat_hash_map_6,13713408 -random,memory,456884,phmap::parallel_flat_hash_map_6,17674240 -random,memory,462632,phmap::parallel_flat_hash_map_6,17674240 -random,memory,462653,phmap::parallel_flat_hash_map_6,23060480 -random,memory,564425,phmap::parallel_flat_hash_map_6,23060480 -random,memory,564455,phmap::parallel_flat_hash_map_6,23908352 -random,memory,910490,phmap::parallel_flat_hash_map_6,23920640 -random,memory,910491,phmap::parallel_flat_hash_map_6,27856896 -random,memory,914643,phmap::parallel_flat_hash_map_6,27856896 -random,memory,914659,phmap::parallel_flat_hash_map_6,32354304 -random,memory,918680,phmap::parallel_flat_hash_map_6,32354304 -random,memory,918789,phmap::parallel_flat_hash_map_6,37982208 -random,memory,923341,phmap::parallel_flat_hash_map_6,37982208 -random,memory,923342,phmap::parallel_flat_hash_map_6,43044864 -random,memory,967301,phmap::parallel_flat_hash_map_6,43479040 -random,memory,1818677,phmap::parallel_flat_hash_map_6,43479040 -random,memory,1818678,phmap::parallel_flat_hash_map_6,46841856 -random,memory,1820853,phmap::parallel_flat_hash_map_6,46841856 -random,memory,1820854,phmap::parallel_flat_hash_map_6,42500096 -random,memory,1822952,phmap::parallel_flat_hash_map_6,42500096 -random,memory,1822953,phmap::parallel_flat_hash_map_6,45305856 -random,memory,1826229,phmap::parallel_flat_hash_map_6,45305856 -random,memory,1826230,phmap::parallel_flat_hash_map_6,48701440 -random,memory,1828846,phmap::parallel_flat_hash_map_6,48701440 -random,memory,1828847,phmap::parallel_flat_hash_map_6,52629504 -random,memory,1830697,phmap::parallel_flat_hash_map_6,53891072 -random,memory,1834838,phmap::parallel_flat_hash_map_6,53891072 -random,memory,1834839,phmap::parallel_flat_hash_map_6,57712640 -random,memory,1835801,phmap::parallel_flat_hash_map_6,57712640 -random,memory,1835802,phmap::parallel_flat_hash_map_6,60547072 -random,memory,1837939,phmap::parallel_flat_hash_map_6,61685760 -random,memory,1839861,phmap::parallel_flat_hash_map_6,61685760 -random,memory,1839862,phmap::parallel_flat_hash_map_6,65630208 -random,memory,1843172,phmap::parallel_flat_hash_map_6,65630208 -random,memory,1843173,phmap::parallel_flat_hash_map_6,67899392 -random,memory,1846075,phmap::parallel_flat_hash_map_6,67899392 -random,memory,1846076,phmap::parallel_flat_hash_map_6,71970816 -random,memory,1850890,phmap::parallel_flat_hash_map_6,73510912 -random,memory,1864735,phmap::parallel_flat_hash_map_6,73510912 -random,memory,1864741,phmap::parallel_flat_hash_map_6,75743232 -random,memory,3640764,phmap::parallel_flat_hash_map_6,77979648 -random,memory,3643691,phmap::parallel_flat_hash_map_6,77979648 -random,memory,3643692,phmap::parallel_flat_hash_map_6,82452480 -random,memory,3647471,phmap::parallel_flat_hash_map_6,84680704 -random,memory,3647865,phmap::parallel_flat_hash_map_6,84680704 -random,memory,3647866,phmap::parallel_flat_hash_map_6,88031232 -random,memory,3657171,phmap::parallel_flat_hash_map_6,90267648 -random,memory,3659273,phmap::parallel_flat_hash_map_6,90267648 -random,memory,3659274,phmap::parallel_flat_hash_map_6,94740480 -random,memory,3661956,phmap::parallel_flat_hash_map_6,94736384 -random,memory,3661971,phmap::parallel_flat_hash_map_6,98091008 -random,memory,3662467,phmap::parallel_flat_hash_map_6,98091008 -random,memory,3662468,phmap::parallel_flat_hash_map_6,101441536 -random,memory,3663439,phmap::parallel_flat_hash_map_6,102551552 -random,memory,3664226,phmap::parallel_flat_hash_map_6,103669760 -random,memory,3667885,phmap::parallel_flat_hash_map_6,103669760 -random,memory,3667897,phmap::parallel_flat_hash_map_6,109264896 -random,memory,3669813,phmap::parallel_flat_hash_map_6,109264896 -random,memory,3669814,phmap::parallel_flat_hash_map_6,113737728 -random,memory,3675800,phmap::parallel_flat_hash_map_6,114843648 -random,memory,3675801,phmap::parallel_flat_hash_map_6,119308288 -random,memory,3676890,phmap::parallel_flat_hash_map_6,121536512 -random,memory,3679398,phmap::parallel_flat_hash_map_6,124882944 -random,memory,3681013,phmap::parallel_flat_hash_map_6,129355776 -random,memory,3682289,phmap::parallel_flat_hash_map_6,129355776 -random,memory,3682290,phmap::parallel_flat_hash_map_6,133828608 -random,memory,3684318,phmap::parallel_flat_hash_map_6,137175040 -random,memory,3687517,phmap::parallel_flat_hash_map_6,138289152 -random,memory,3687518,phmap::parallel_flat_hash_map_6,142753792 -random,memory,3690464,phmap::parallel_flat_hash_map_6,144990208 -random,memory,3699225,phmap::parallel_flat_hash_map_6,147214336 -random,memory,7301764,phmap::parallel_flat_hash_map_6,147214336 -random,memory,7301801,phmap::parallel_flat_hash_map_6,151683072 -random,memory,7304266,phmap::parallel_flat_hash_map_6,151683072 -random,memory,7304267,phmap::parallel_flat_hash_map_6,158388224 -random,memory,7306423,phmap::parallel_flat_hash_map_6,158388224 -random,memory,7306424,phmap::parallel_flat_hash_map_6,167325696 -random,memory,7307845,phmap::parallel_flat_hash_map_6,167325696 -random,memory,7307846,phmap::parallel_flat_hash_map_6,165093376 -random,memory,7313817,phmap::parallel_flat_hash_map_6,167325696 -random,memory,7317898,phmap::parallel_flat_hash_map_6,167325696 -random,memory,7317899,phmap::parallel_flat_hash_map_6,174026752 -random,memory,7321356,phmap::parallel_flat_hash_map_6,178499584 -random,memory,7324610,phmap::parallel_flat_hash_map_6,178503680 -random,memory,7324611,phmap::parallel_flat_hash_map_6,185208832 -random,memory,7324981,phmap::parallel_flat_hash_map_6,189681664 -random,memory,7329399,phmap::parallel_flat_hash_map_6,191909888 -random,memory,7330096,phmap::parallel_flat_hash_map_6,194138112 -random,memory,7330493,phmap::parallel_flat_hash_map_6,194138112 -random,memory,7330494,phmap::parallel_flat_hash_map_6,200835072 -random,memory,7330662,phmap::parallel_flat_hash_map_6,203063296 -random,memory,7331146,phmap::parallel_flat_hash_map_6,203063296 -random,memory,7331147,phmap::parallel_flat_hash_map_6,200830976 -random,memory,7333567,phmap::parallel_flat_hash_map_6,200830976 -random,memory,7333568,phmap::parallel_flat_hash_map_6,207536128 -random,memory,7334082,phmap::parallel_flat_hash_map_6,212000768 -random,memory,7339042,phmap::parallel_flat_hash_map_6,214237184 -random,memory,7339605,phmap::parallel_flat_hash_map_6,216465408 -random,memory,7340722,phmap::parallel_flat_hash_map_6,218705920 -random,memory,7341125,phmap::parallel_flat_hash_map_6,220938240 -random,memory,7342276,phmap::parallel_flat_hash_map_6,223170560 -random,memory,7342941,phmap::parallel_flat_hash_map_6,223170560 -random,memory,7342942,phmap::parallel_flat_hash_map_6,229871616 -random,memory,7346101,phmap::parallel_flat_hash_map_6,238796800 -random,memory,7350910,phmap::parallel_flat_hash_map_6,252190720 -random,memory,7351597,phmap::parallel_flat_hash_map_6,256651264 -random,memory,7353724,phmap::parallel_flat_hash_map_6,263344128 -random,memory,7356932,phmap::parallel_flat_hash_map_6,267808768 -random,memory,7365358,phmap::parallel_flat_hash_map_6,278974464 -random,memory,7367048,phmap::parallel_flat_hash_map_6,285671424 -random,memory,7381268,phmap::parallel_flat_hash_map_6,292360192 -random,time,10000000,phmap::parallel_flat_hash_map_6,0.625000 -random,memory,10048265,phmap::parallel_flat_hash_map_6,290181120 -random,memory,14624411,phmap::parallel_flat_hash_map_6,290181120 -random,memory,14624412,phmap::parallel_flat_hash_map_6,299114496 -random,memory,14629443,phmap::parallel_flat_hash_map_6,303583232 -random,memory,14631641,phmap::parallel_flat_hash_map_6,308051968 -random,memory,14634044,phmap::parallel_flat_hash_map_6,312520704 -random,memory,14636495,phmap::parallel_flat_hash_map_6,312520704 -random,memory,14636496,phmap::parallel_flat_hash_map_6,325926912 -random,memory,14643433,phmap::parallel_flat_hash_map_6,325914624 -random,memory,14643434,phmap::parallel_flat_hash_map_6,339308544 -random,memory,14646091,phmap::parallel_flat_hash_map_6,348241920 -random,memory,14653553,phmap::parallel_flat_hash_map_6,352714752 -random,memory,14654529,phmap::parallel_flat_hash_map_6,357175296 -random,memory,14655407,phmap::parallel_flat_hash_map_6,361639936 -random,memory,14658190,phmap::parallel_flat_hash_map_6,366100480 -random,memory,14658689,phmap::parallel_flat_hash_map_6,366100480 -random,memory,14658907,phmap::parallel_flat_hash_map_6,361635840 -random,memory,14658907,phmap::parallel_flat_hash_map_6,370573312 -random,memory,14659991,phmap::parallel_flat_hash_map_6,375033856 -random,memory,14665883,phmap::parallel_flat_hash_map_6,379498496 -random,memory,14667814,phmap::parallel_flat_hash_map_6,383963136 -random,memory,14669160,phmap::parallel_flat_hash_map_6,388435968 -random,memory,14671676,phmap::parallel_flat_hash_map_6,392896512 -random,memory,14673074,phmap::parallel_flat_hash_map_6,397361152 -random,memory,14675455,phmap::parallel_flat_hash_map_6,401829888 -random,memory,14676709,phmap::parallel_flat_hash_map_6,406294528 -random,memory,14678913,phmap::parallel_flat_hash_map_6,410755072 -random,memory,14680761,phmap::parallel_flat_hash_map_6,415219712 -random,memory,14682022,phmap::parallel_flat_hash_map_6,415219712 -random,memory,14682023,phmap::parallel_flat_hash_map_6,428617728 -random,memory,14682463,phmap::parallel_flat_hash_map_6,437538816 -random,memory,14685126,phmap::parallel_flat_hash_map_6,437534720 -random,memory,14685127,phmap::parallel_flat_hash_map_6,450936832 -random,memory,14686842,phmap::parallel_flat_hash_map_6,455397376 -random,memory,14690779,phmap::parallel_flat_hash_map_6,473251840 -random,memory,14692933,phmap::parallel_flat_hash_map_6,491126784 -random,memory,14696606,phmap::parallel_flat_hash_map_6,508981248 -random,memory,14700141,phmap::parallel_flat_hash_map_6,526839808 -random,memory,14711382,phmap::parallel_flat_hash_map_6,544669696 -random,memory,14716503,phmap::parallel_flat_hash_map_6,562524160 -random,memory,14754604,phmap::parallel_flat_hash_map_6,580382720 -random,time,20000000,phmap::parallel_flat_hash_map_6,1.270000 -random,memory,20169331,phmap::parallel_flat_hash_map_6,575909888 -random,memory,29250365,phmap::parallel_flat_hash_map_6,575909888 -random,memory,29250366,phmap::parallel_flat_hash_map_6,593772544 -random,memory,29252297,phmap::parallel_flat_hash_map_6,593772544 -random,memory,29252377,phmap::parallel_flat_hash_map_6,584843264 -random,memory,29295606,phmap::parallel_flat_hash_map_6,584843264 -random,memory,29295607,phmap::parallel_flat_hash_map_6,620572672 -random,memory,29295923,phmap::parallel_flat_hash_map_6,620572672 -random,memory,29295924,phmap::parallel_flat_hash_map_6,611643392 -random,memory,29298230,phmap::parallel_flat_hash_map_6,611643392 -random,memory,29298231,phmap::parallel_flat_hash_map_6,638443520 -random,memory,29301877,phmap::parallel_flat_hash_map_6,647368704 -random,memory,29307581,phmap::parallel_flat_hash_map_6,656306176 -random,memory,29311094,phmap::parallel_flat_hash_map_6,656306176 -random,memory,29311198,phmap::parallel_flat_hash_map_6,647376896 -random,memory,29318505,phmap::parallel_flat_hash_map_6,647376896 -random,memory,29318506,phmap::parallel_flat_hash_map_6,683106304 -random,memory,29324837,phmap::parallel_flat_hash_map_6,692023296 -random,memory,29328401,phmap::parallel_flat_hash_map_6,700956672 -random,memory,29328874,phmap::parallel_flat_hash_map_6,709894144 -random,memory,29330147,phmap::parallel_flat_hash_map_6,709894144 -random,memory,29330451,phmap::parallel_flat_hash_map_6,700964864 -random,memory,29330597,phmap::parallel_flat_hash_map_6,718827520 -random,memory,29333160,phmap::parallel_flat_hash_map_6,727752704 -random,memory,29336160,phmap::parallel_flat_hash_map_6,727752704 -random,memory,29336161,phmap::parallel_flat_hash_map_6,754544640 -random,memory,29344925,phmap::parallel_flat_hash_map_6,763461632 -random,memory,29345974,phmap::parallel_flat_hash_map_6,772395008 -random,memory,29346343,phmap::parallel_flat_hash_map_6,781320192 -random,memory,29348045,phmap::parallel_flat_hash_map_6,790245376 -random,memory,29352980,phmap::parallel_flat_hash_map_6,790245376 -random,memory,29352981,phmap::parallel_flat_hash_map_6,817045504 -random,memory,29357735,phmap::parallel_flat_hash_map_6,825970688 -random,memory,29359312,phmap::parallel_flat_hash_map_6,834904064 -random,memory,29360390,phmap::parallel_flat_hash_map_6,843833344 -random,memory,29361898,phmap::parallel_flat_hash_map_6,852766720 -random,memory,29363938,phmap::parallel_flat_hash_map_6,852766720 -random,memory,29363939,phmap::parallel_flat_hash_map_6,879566848 -random,memory,29366353,phmap::parallel_flat_hash_map_6,888500224 -random,memory,29366942,phmap::parallel_flat_hash_map_6,888500224 -random,memory,29366943,phmap::parallel_flat_hash_map_6,915296256 -random,memory,29370042,phmap::parallel_flat_hash_map_6,951009280 -random,memory,29373396,phmap::parallel_flat_hash_map_6,977809408 -random,memory,29378157,phmap::parallel_flat_hash_map_6,986734592 -random,memory,29378158,phmap::parallel_flat_hash_map_6,1022464000 -random,memory,29382962,phmap::parallel_flat_hash_map_6,1022464000 -random,memory,29382991,phmap::parallel_flat_hash_map_6,1004597248 -random,memory,29383516,phmap::parallel_flat_hash_map_6,1022435328 -random,memory,29395727,phmap::parallel_flat_hash_map_6,1067077632 -random,memory,29400644,phmap::parallel_flat_hash_map_6,1076006912 -random,memory,29411954,phmap::parallel_flat_hash_map_6,1111728128 -random,memory,29443826,phmap::parallel_flat_hash_map_6,1138507776 -random,time,30000000,phmap::parallel_flat_hash_map_6,2.204000 -random,memory,30001149,phmap::parallel_flat_hash_map_6,1147379712 -random,time,40000000,phmap::parallel_flat_hash_map_6,2.689000 -random,memory,40030313,phmap::parallel_flat_hash_map_6,1147482112 -random,time,50000000,phmap::parallel_flat_hash_map_6,3.140000 -random,memory,50107035,phmap::parallel_flat_hash_map_6,1147482112 -random,memory,58567867,phmap::parallel_flat_hash_map_6,1147482112 -random,memory,58567868,phmap::parallel_flat_hash_map_6,1183207424 -random,memory,58618664,phmap::parallel_flat_hash_map_6,1183207424 -random,memory,58618684,phmap::parallel_flat_hash_map_6,1165344768 -random,memory,58633951,phmap::parallel_flat_hash_map_6,1165344768 -random,memory,58633952,phmap::parallel_flat_hash_map_6,1201070080 -random,memory,58638135,phmap::parallel_flat_hash_map_6,1218936832 -random,memory,58641806,phmap::parallel_flat_hash_map_6,1218936832 -random,memory,58641908,phmap::parallel_flat_hash_map_6,1201074176 -random,memory,58644567,phmap::parallel_flat_hash_map_6,1236799488 -random,memory,58654398,phmap::parallel_flat_hash_map_6,1254662144 -random,memory,58661628,phmap::parallel_flat_hash_map_6,1272520704 -random,memory,58663366,phmap::parallel_flat_hash_map_6,1290387456 -random,memory,58664512,phmap::parallel_flat_hash_map_6,1308254208 -random,memory,58666679,phmap::parallel_flat_hash_map_6,1308254208 -random,memory,58666680,phmap::parallel_flat_hash_map_6,1361838080 -random,memory,58673711,phmap::parallel_flat_hash_map_6,1379696640 -random,memory,58680789,phmap::parallel_flat_hash_map_6,1397563392 -random,memory,58684297,phmap::parallel_flat_hash_map_6,1415430144 -random,memory,58688420,phmap::parallel_flat_hash_map_6,1433292800 -random,memory,58688990,phmap::parallel_flat_hash_map_6,1451155456 -random,memory,58690080,phmap::parallel_flat_hash_map_6,1469009920 -random,memory,58692416,phmap::parallel_flat_hash_map_6,1469009920 -random,memory,58692417,phmap::parallel_flat_hash_map_6,1522601984 -random,memory,58696961,phmap::parallel_flat_hash_map_6,1522597888 -random,memory,58696962,phmap::parallel_flat_hash_map_6,1576189952 -random,memory,58701807,phmap::parallel_flat_hash_map_6,1611915264 -random,memory,58702134,phmap::parallel_flat_hash_map_6,1611915264 -random,memory,58702166,phmap::parallel_flat_hash_map_6,1594044416 -random,memory,58702606,phmap::parallel_flat_hash_map_6,1611902976 -random,memory,58705250,phmap::parallel_flat_hash_map_6,1629765632 -random,memory,58706394,phmap::parallel_flat_hash_map_6,1647628288 -random,memory,58709861,phmap::parallel_flat_hash_map_6,1665486848 -random,memory,58710992,phmap::parallel_flat_hash_map_6,1683341312 -random,memory,58718600,phmap::parallel_flat_hash_map_6,1683341312 -random,memory,58718601,phmap::parallel_flat_hash_map_6,1736929280 -random,memory,58718836,phmap::parallel_flat_hash_map_6,1736929280 -random,memory,58718837,phmap::parallel_flat_hash_map_6,1719058432 -random,memory,58719131,phmap::parallel_flat_hash_map_6,1736916992 -random,memory,58721235,phmap::parallel_flat_hash_map_6,1754771456 -random,memory,58722232,phmap::parallel_flat_hash_map_6,1772634112 -random,memory,58723234,phmap::parallel_flat_hash_map_6,1790488576 -random,memory,58726963,phmap::parallel_flat_hash_map_6,1861939200 -random,memory,58740972,phmap::parallel_flat_hash_map_6,1933361152 -random,memory,58745109,phmap::parallel_flat_hash_map_6,2022670336 -random,memory,58754148,phmap::parallel_flat_hash_map_6,2058383360 -random,memory,58765822,phmap::parallel_flat_hash_map_6,2147696640 -random,memory,58786363,phmap::parallel_flat_hash_map_6,2201272320 -random,memory,58826606,phmap::parallel_flat_hash_map_6,2272714752 -random,time,60000000,phmap::parallel_flat_hash_map_6,4.560000 -random,memory,60000411,phmap::parallel_flat_hash_map_6,2290417664 -random,time,70000000,phmap::parallel_flat_hash_map_6,5.082000 -random,memory,70138168,phmap::parallel_flat_hash_map_6,2290565120 -random,time,80000000,phmap::parallel_flat_hash_map_6,5.576000 -random,memory,80036567,phmap::parallel_flat_hash_map_6,2290556928 -random,time,90000000,phmap::parallel_flat_hash_map_6,6.062000 -random,memory,90013913,phmap::parallel_flat_hash_map_6,2290528256 -random,time,100000000,phmap::parallel_flat_hash_map_6,6.613000 diff --git a/extern/phmap/cmake/CMakeLists.txt.in b/extern/phmap/cmake/CMakeLists.txt.in deleted file mode 100644 index 3e01ff5..0000000 --- a/extern/phmap/cmake/CMakeLists.txt.in +++ /dev/null @@ -1,15 +0,0 @@ -cmake_minimum_required(VERSION 3.8) - -project(googletest-download NONE) - -include(ExternalProject) -ExternalProject_Add(googletest - GIT_REPOSITORY https://github.com/google/googletest.git - GIT_TAG main - SOURCE_DIR "${CMAKE_BINARY_DIR}/googletest-src" - BINARY_DIR "${CMAKE_BINARY_DIR}/googletest-build" - CONFIGURE_COMMAND "" - BUILD_COMMAND "" - INSTALL_COMMAND "" - TEST_COMMAND "" -) \ No newline at end of file diff --git a/extern/phmap/cmake/DetectVersion.cmake b/extern/phmap/cmake/DetectVersion.cmake deleted file mode 100644 index 4bffa5e..0000000 --- a/extern/phmap/cmake/DetectVersion.cmake +++ /dev/null @@ -1,8 +0,0 @@ - -file(READ "${CMAKE_CURRENT_SOURCE_DIR}/parallel_hashmap/phmap_config.h" _PHMAP_H_CONTENTS) -string(REGEX REPLACE ".*#define PHMAP_VERSION_MAJOR ([0-9]+).*" "\\1" DETECTED_PHMAP_VERSION_MAJOR "${_PHMAP_H_CONTENTS}") -string(REGEX REPLACE ".*#define PHMAP_VERSION_MINOR ([0-9]+).*" "\\1" DETECTED_PHMAP_VERSION_MINOR "${_PHMAP_H_CONTENTS}") -string(REGEX REPLACE ".*#define PHMAP_VERSION_PATCH ([0-9]+).*" "\\1" DETECTED_PHMAP_VERSION_PATCH "${_PHMAP_H_CONTENTS}") -set(DETECTED_PHMAP_VERSION "${DETECTED_PHMAP_VERSION_MAJOR}.${DETECTED_PHMAP_VERSION_MINOR}.${DETECTED_PHMAP_VERSION_PATCH}") - -message(STATUS "Detected PHMAP Version - ${DETECTED_PHMAP_VERSION}") diff --git a/extern/phmap/cmake/DownloadGTest.cmake b/extern/phmap/cmake/DownloadGTest.cmake deleted file mode 100644 index 055270f..0000000 --- a/extern/phmap/cmake/DownloadGTest.cmake +++ /dev/null @@ -1,34 +0,0 @@ -# Downloads and unpacks googletest at configure time. Based on the instructions -# at https://github.com/google/googletest/tree/master/googletest#incorporating-into-an-existing-cmake-project - -# Download the latest googletest from Github master -configure_file( - ${CMAKE_CURRENT_LIST_DIR}/CMakeLists.txt.in - ${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt -) - -# Configure and build the downloaded googletest source -execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download ) - -if(result) - message(FATAL_ERROR "CMake step for googletest failed: ${result}") -endif() - -execute_process(COMMAND ${CMAKE_COMMAND} --build . - RESULT_VARIABLE result - WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/googletest-download) - -if(result) - message(FATAL_ERROR "Build step for googletest failed: ${result}") -endif() - -# Prevent overriding the parent project's compiler/linker settings on Windows -set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) - -# Add googletest directly to our build. This defines the gtest and gtest_main -# targets. -add_subdirectory(${CMAKE_BINARY_DIR}/googletest-src - ${CMAKE_BINARY_DIR}/googletest-build - EXCLUDE_FROM_ALL) diff --git a/extern/phmap/cmake/helpers.cmake b/extern/phmap/cmake/helpers.cmake deleted file mode 100644 index b290066..0000000 --- a/extern/phmap/cmake/helpers.cmake +++ /dev/null @@ -1,60 +0,0 @@ -#set_property(GLOBAL PROPERTY USE_FOLDERS ON) -set(PHMAP_IDE_FOLDER phmap) - -# ------------------------------------------------------------- -# phmap_cc_test(NAME awesome_test -# SRCS "awesome_test.cc" -# DEPS phmap::awesome gmock gtest_main) -# ------------------------------------------------------------- -function(phmap_cc_test) - cmake_parse_arguments(PHMAP_CC_TEST - "" - "NAME" - "SRCS;COPTS;CWOPTS;CLOPTS;DEFINES;LINKOPTS;DEPS" - ${ARGN} - ) - - set(_NAME "test_${PHMAP_CC_TEST_NAME}") - add_executable(${_NAME} "") - target_sources(${_NAME} PRIVATE ${PHMAP_CC_TEST_SRCS}) - target_include_directories(${_NAME} - PUBLIC ${PHMAP_COMMON_INCLUDE_DIRS} - PRIVATE ${GMOCK_INCLUDE_DIRS} ${GTEST_INCLUDE_DIRS} - ) - target_compile_definitions(${_NAME} - PUBLIC ${PHMAP_CC_TEST_DEFINES} - ) -if(MSVC) - target_compile_options(${_NAME} - PRIVATE ${PHMAP_CC_TEST_CWOPTS} /W4 /Zc:__cplusplus /std:c++latest - ) -else() - target_compile_options(${_NAME} - PRIVATE ${PHMAP_CC_TEST_CLOPTS} - ) -endif() - target_compile_options(${_NAME} - PRIVATE ${PHMAP_CC_TEST_COPTS} - ) - target_link_libraries(${_NAME} - PUBLIC ${PHMAP_CC_TEST_DEPS} - PRIVATE ${PHMAP_CC_TEST_LINKOPTS} - ) - # Add all Abseil targets to a a folder in the IDE for organization. - set_property(TARGET ${_NAME} PROPERTY FOLDER ${PHMAP_IDE_FOLDER}/test) - - set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${PHMAP_CXX_STANDARD}) - set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) - - add_test(NAME ${_NAME} COMMAND ${_NAME}) -endfunction() - -# ------------------------------------------------------------- -function(check_target my_target) - if(NOT TARGET ${my_target}) - message(FATAL_ERROR " PHMAP: compiling phmap tests requires a ${my_target} CMake target in your project, - see CMake/README.md for more details") - endif(NOT TARGET ${my_target}) -endfunction() - - diff --git a/extern/phmap/cmake/phmap.cmake b/extern/phmap/cmake/phmap.cmake deleted file mode 100644 index 931bef1..0000000 --- a/extern/phmap/cmake/phmap.cmake +++ /dev/null @@ -1,42 +0,0 @@ -# --------------------------------------------------------------------------- -# Copyright (c) 2019, Gregory Popovitch - greg7mdp@gmail.com -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -# Includes work from abseil-cpp (https://github.com/abseil/abseil-cpp) -# with modifications. -# -# Copyright 2017 The Abseil Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# --------------------------------------------------------------------------- - - -include(CMakeParseArguments) - -function(check_target my_target) - if(NOT TARGET ${my_target}) - message(FATAL_ERROR " ABSL: compiling absl requires a ${my_target} CMake target in your project, - see CMake/README.md for more details") - endif(NOT TARGET ${my_target}) -endfunction() diff --git a/extern/phmap/css/bootstrap-responsive.min.css b/extern/phmap/css/bootstrap-responsive.min.css deleted file mode 100644 index ab59da3..0000000 --- a/extern/phmap/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.1.0 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#555;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/extern/phmap/css/bootstrap.min.css b/extern/phmap/css/bootstrap.min.css deleted file mode 100644 index 4a4440c..0000000 --- a/extern/phmap/css/bootstrap.min.css +++ /dev/null @@ -1,10 +0,0 @@ -/*! - * Bootstrap v2.1.0 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - * Augmented by Eric Kryski @ekryski - */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map-canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea{width:210px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #bbb}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:32px;height:32px;margin-top:1px;margin-right:.3em;line-height:32px;vertical-align:text-top;background-image:url("../img/glyphicons.png");background-position:32px 32px;background-repeat:no-repeat}.icon-white,.nav>.active>a>[class^="icon-"],.nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-white.png")}.icon-glass{background-position:0 0}.icon-leaf{background-position:-56px 0}.icon-dog{background-position:-112px 0}.icon-user{background-position:-170px 0}.icon-girl{background-position:-225px 0}.icon-car{background-position:-279px 0}.icon-user-add{background-position:-337px 0}.icon-user-remove{background-position:-397px 0}.icon-film{background-position:-455px 0}.icon-magic{background-position:-509px 0}.icon-envelope{background-position:-565px 0}.icon-camera{background-position:-621px 0}.icon-heart{background-position:-679px 0}.icon-beach-umbrella{background-position:-735px 0}.icon-train{background-position:-792px 0}.icon-print{background-position:-844px 0}.icon-bin{background-position:-900px 0}.icon-music{background-position:-952px 0}.icon-note{background-position:-1005px 0}.icon-cogwheel{background-position:-1055px 0}.icon-home{background-position:-1111px 0}.icon-snowflake{background-position:-1170px 0}.icon-fire{background-position:-1230px 0}.icon-cogwheels{background-position:-1282px 0}.icon-parents{background-position:-1340px 0}.icon-binoculars{background-position:-1404px 0}.icon-road{background-position:-1460px 0}.icon-search{background-position:-1520px 0}.icon-cars{background-position:-1576px 0}.icon-notes-2{background-position:-1644px 0}.icon-pencil{background-position:-1696px 0}.icon-bus{background-position:-1753px 0}.icon-wifi-alt{background-position:-1817px 0}.icon-luggage{background-position:-1875px 0}.icon-old-man{background-position:-1927px 0}.icon-woman{background-position:0 -60px}.icon-file{background-position:-54px -60px}.icon-credit{background-position:-105px -60px}.icon-airplane{background-position:-163px -60px}.icon-notes{background-position:-219px -60px}.icon-stats{background-position:-271px -60px}.icon-charts{background-position:-329px -60px}.icon-pie-chart{background-position:-388px -60px}.icon-group{background-position:-446px -60px}.icon-keys{background-position:-513px -60px}.icon-calendar{background-position:-569px -60px}.icon-router{background-position:-624px -60px}.icon-camera-small{background-position:-683px -60px}.icon-dislikes{background-position:-737px -60px}.icon-star{background-position:-795px -60px}.icon-link{background-position:-852px -60px}.icon-eye-open{background-position:-905px -60px}.icon-eye-close{background-position:-968px -60px}.icon-alarm{background-position:-1031px -60px}.icon-clock{background-position:-1091px -60px}.icon-stopwatch{background-position:-1147px -60px}.icon-projector{background-position:-1202px -60px}.icon-history{background-position:-1262px -60px}.icon-truck{background-position:-1319px -60px}.icon-cargo{background-position:-1383px -60px}.icon-compass{background-position:-1440px -60px}.icon-keynote{background-position:-1496px -60px}.icon-attach{background-position:-1548px -60px}.icon-power{background-position:-1606px -60px}.icon-lightbulb{background-position:-1660px -60px}.icon-tag{background-position:-1712px -60px}.icon-tags{background-position:-1768px -60px}.icon-cleaning{background-position:-1830px -60px}.icon-ruler{background-position:-1886px -60px}.icon-gift{background-position:-1945px -60px}.icon-umbrella{background-position:0 -122px}.icon-book{background-position:-58px -122px}.icon-bookmark{background-position:-112px -122px}.icon-signal{background-position:-160px -122px}.icon-cup{background-position:-223px -122px}.icon-stroller{background-position:-277px -122px}.icon-headphones{background-position:-334px -122px}.icon-headset{background-position:-390px -122px}.icon-warning-sign{background-position:-446px -122px}.icon-signal{background-position:-507px -122px}.icon-retweet{background-position:-563px -122px}.icon-refresh{background-position:-625px -122px}.icon-roundabout{background-position:-682px -122px}.icon-random{background-position:-741px -122px}.icon-heat{background-position:-801px -122px}.icon-repeat{background-position:-862px -122px}.icon-display{background-position:-918px -122px}.icon-log-book{background-position:-978px -122px}.icon-adress-book{background-position:-1032px -122px}.icon-magnet{background-position:-1086px -122px}.icon-table{background-position:-1139px -122px}.icon-adjust{background-position:-1195px -122px}.icon-tint{background-position:-1253px -122px}.icon-crop{background-position:-1308px -122px}.icon-vector-path-square{background-position:-1366px -122px}.icon-vector-path-circle{background-position:-1422px -122px}.icon-vector-path-polygon{background-position:-1478px -122px}.icon-vector-path-line{background-position:-1536px -122px}.icon-vector-path-curve{background-position:-1592px -122px}.icon-vector-path-all{background-position:-1648px -122px}.icon-font{background-position:-1704px -122px}.icon-italic{background-position:-1763px -122px}.icon-bold{background-position:-1809px -122px}.icon-text-underline{background-position:-1860px -122px}.icon-text-strike{background-position:-1912px -122px}.icon-text-height{background-position:-1964px -122px}.icon-text-width{background-position:0 -184px}.icon-text-resize{background-position:-54px -184px}.icon-left-indent{background-position:-112px -184px}.icon-right-indent{background-position:-168px -184px}.icon-align-left{background-position:-224px -184px}.icon-align-center{background-position:-280px -184px}.icon-align-right{background-position:-336px -184px}.icon-justify{background-position:-392px -184px}.icon-list{background-position:-448px -184px}.icon-text-smaller{background-position:-504px -184px}.icon-text-bigger{background-position:-558px -184px}.icon-embed{background-position:-614px -184px}.icon-embed-close{background-position:-676px -184px}.icon-adjust{background-position:-738px -184px}.icon-message-full{background-position:-793px -184px}.icon-message-empty{background-position:-849px -184px}.icon-message-in{background-position:-905px -184px}.icon-message-out{background-position:-961px -184px}.icon-message-plus{background-position:-1017px -184px}.icon-message-minus{background-position:-1078px -184px}.icon-message-ban{background-position:-1139px -184px}.icon-message-flag{background-position:-1200px -184px}.icon-message-lock{background-position:-1259px -184px}.icon-message-new{background-position:-1319px -184px}.icon-inbox{background-position:-1379px -184px}.icon-inbox-plus{background-position:-1435px -184px}.icon-inbox-minus{background-position:-1494px -184px}.icon-inbox-lock{background-position:-1553px -184px}.icon-inbox-in{background-position:-1611px -184px}.icon-inbox-out{background-position:-1667px -184px}.icon-computer-locked{background-position:-1723px -184px}.icon-computer-service{background-position:-1783px -184px}.icon-computer-process{background-position:-1843px -184px}.icon-phone{background-position:-1903px -184px}.icon-database-lock{background-position:-1950px -184px}.icon-database-plus{background-position:0 -246px}.icon-database-minus{background-position:-59px -246px}.icon-database-ban{background-position:-118px -246px}.icon-folder-open{background-position:-176px -246px}.icon-folder-plus{background-position:-238px -246px}.icon-folder-minus{background-position:-299px -246px}.icon-folder-lock{background-position:-360px -246px}.icon-folder-flag{background-position:-420px -246px}.icon-folder-new{background-position:-479px -246px}.icon-check{background-position:-539px -246px}.icon-edit{background-position:-593px -246px}.icon-new-window{background-position:-649px -246px}.icon-more-windows{background-position:-707px -246px}.icon-show-big-thumbnails{background-position:-762px -246px}.icon-show-thumbnails{background-position:-816px -246px}.icon-show-thumbnails-with-lines{background-position:-870px -246px}.icon-show-lines{background-position:-926px -246px}.icon-playlist{background-position:-982px -246px}.icon-picture{background-position:-1043px -246px}.icon-imac{background-position:-1099px -246px}.icon-macbook{background-position:-1157px -246px}.icon-ipad{background-position:-1217px -246px}.icon-iphone{background-position:-1269px -246px}.icon-iphone-transfer{background-position:-1315px -246px}.icon-iphone-exchange{background-position:-1376px -246px}.icon-ipod{background-position:-1437px -246px}.icon-ipod-shuffle{background-position:-1483px -246px}.icon-ear-plugs{background-position:-1530px -246px}.icon-albums{background-position:-1582px -246px}.icon-step-backward{background-position:-1642px -246px}.icon-fast-backward{background-position:-1688px -246px}.icon-rewind{background-position:-1745px -246px}.icon-play{background-position:-1800px -246px}.icon-pause{background-position:-1848px -246px}.icon-stop{background-position:-1890px -246px}.icon-forward{background-position:-1936px -246px}.icon-fast-forward{background-position:0 -308px}.icon-step-forward{background-position:-57px -308px}.icon-eject{background-position:-103px -308px}.icon-facetime-video{background-position:-153px -308px}.icon-download-alt{background-position:-209px -308px}.icon-mute{background-position:-265px -308px}.icon-volume-down{background-position:-319px -308px}.icon-volume-up{background-position:-367px -308px}.icon-screenshot{background-position:-423px -308px}.icon-move{background-position:-482px -308px}.icon-more{background-position:-538px -308px}.icon-brightness-reduce{background-position:-592px -308px}.icon-brightness-increase{background-position:-644px -308px}.icon-circle-plus{background-position:-700px -308px}.icon-circle-minus{background-position:-758px -308px}.icon-circle-remove{background-position:-816px -308px}.icon-circle-ok{background-position:-874px -308px}.icon-circle-question-mark{background-position:-932px -308px}.icon-circle-info{background-position:-990px -308px}.icon-circle-exclamation-mark{background-position:-1048px -308px}.icon-remove{background-position:-1106px -308px}.icon-ok{background-position:-1164px -308px}.icon-ban{background-position:-1222px -308px}.icon-download{background-position:-1280px -308px}.icon-upload{background-position:-1338px -308px}.icon-shopping-cart{background-position:-1396px -308px}.icon-lock{background-position:-1454px -308px}.icon-unlock{background-position:-1507px -308px}.icon-electricity{background-position:-1560px -308px}.icon-ok-2{background-position:-1603px -308px}.icon-remove-2{background-position:-1660px -308px}.icon-cart-out{background-position:-1710px -308px}.icon-cart-in{background-position:-1768px -308px}.icon-left-arrow{background-position:-1826px -308px}.icon-right-arrow{background-position:-1878px -308px}.icon-down-arrow{background-position:-1930px -308px}.icon-up-arrow{background-position:0 -370px}.icon-resize-small{background-position:-50px -370px}.icon-resize-full{background-position:-106px -370px}.icon-circle-arrow-left{background-position:-162px -370px}.icon-circle-arrow-right{background-position:-220px -370px}.icon-circle-arrow-up{background-position:-278px -370px}.icon-circle-arrow-down{background-position:-336px -370px}.icon-play-button{background-position:-394px -370px}.icon-unshare{background-position:-452px -370px}.icon-share{background-position:-508px -370px}.icon-thin-arrow-right{background-position:-564px -370px}.icon-thin-arrow-left{background-position:-611px -370px}.icon-bluetooth{background-position:-658px -370px}.icon-euro{background-position:-704px -370px}.icon-usd{background-position:-758px -370px}.icon-bp{background-position:-807px -370px}.icon-retweet-2{background-position:-856px -370px}.icon-moon{background-position:-921px -370px}.icon-sun{background-position:-975px -370px}.icon-cloud{background-position:-1031px -370px}.icon-direction{background-position:-1090px -370px}.icon-brush{background-position:-1148px -370px}.icon-pen{background-position:-1205px -370px}.icon-zoom-in{background-position:-1261px -370px}.icon-zoom-out{background-position:-1318px -370px}.icon-pin{background-position:-1375px -370px}.icon-riflescope{background-position:-1417px -370px}.icon-rotation-lock{background-position:-1474px -370px}.icon-flash{background-position:-1533px -370px}.icon-google-maps{background-position:-1579px -370px}.icon-anchor{background-position:-1626px -370px}.icon-conversation{background-position:-1682px -370px}.icon-chat{background-position:-1739px -370px}.icon-male{background-position:-1795px -370px}.icon-female{background-position:-1849px -370px}.icon-asterisk{background-position:-1897px -370px}.icon-divide{background-position:-1949px -370px}.icon-snorkel-diving{background-position:0 -432px}.icon-scuba-diving{background-position:-59px -432px}.icon-oxygen-bottle{background-position:-118px -432px}.icon-fins{background-position:-172px -432px}.icon-fishes{background-position:-235px -432px}.icon-boat{background-position:-295px -432px}.icon-delete-point{background-position:-351px -432px}.icon-sheriffs-star{background-position:-409px -432px}.icon-qrcode{background-position:-465px -432px}.icon-barcode{background-position:-521px -432px}.icon-pool{background-position:-577px -432px}.icon-buoy{background-position:-633px -432px}.icon-spade{background-position:-689px -432px}.icon-bank{background-position:-745px -432px}.icon-vcard{background-position:-801px -432px}.icon-electrical-plug{background-position:-855px -432px}.icon-flag{background-position:-905px -432px}.icon-credit-card{background-position:-958px -432px}.icon-keyboard-wireless{background-position:-1016px -432px}.icon-keyboard-wired{background-position:-1075px -432px}.icon-shield{background-position:-1134px -432px}.icon-ring{background-position:-1188px -432px}.icon-cake{background-position:-1241px -432px}.icon-drink{background-position:-1295px -432px}.icon-beer{background-position:-1350px -432px}.icon-fast-food{background-position:-1405px -432px}.icon-cutlery{background-position:-1465px -432px}.icon-pizza{background-position:-1510px -432px}.icon-birthday-cake{background-position:-1568px -432px}.icon-tablet{background-position:-1626px -432px}.icon-settings{background-position:-1683px -432px}.icon-bullets{background-position:-1739px -432px}.icon-cardio{background-position:-1798px -432px}.icon-t-shirt{background-position:-1855px -432px}.icon-pants{background-position:-1915px -432px}.icon-sweater{background-position:-1966px -432px}.icon-fabric{background-position:0 -494px}.icon-leather{background-position:-59px -494px}.icon-scissors{background-position:-114px -494px}.icon-podium{background-position:-170px -494px}.icon-skull{background-position:-230px -494px}.icon-celebration{background-position:-284px -494px}.icon-tea-kettle{background-position:-340px -494px}.icon-french-press{background-position:-398px -494px}.icon-coffe-cup{background-position:-453px -494px}.icon-pot{background-position:-510px -494px}.icon-grater{background-position:-569px -494px}.icon-kettle{background-position:-619px -494px}.icon-hospital{background-position:-674px -494px}.icon-hospital-h{background-position:-730px -494px}.icon-microphone{background-position:-786px -494px}.icon-webcam{background-position:-835px -494px}.icon-temple-christianity-church{background-position:-886px -494px}.icon-temple-islam{background-position:-942px -494px}.icon-temple-hindu{background-position:-999px -494px}.icon-temple-buddhist{background-position:-1055px -494px}.icon-electrical-socket-eu{background-position:-1115px -494px}.icon-electrical-socket-us{background-position:-1170px -494px}.icon-bomb{background-position:-1225px -494px}.icon-comments{background-position:-1284px -494px}.icon-flower{background-position:-1340px -494px}.icon-baseball{background-position:-1391px -494px}.icon-rugby{background-position:-1448px -494px}.icon-ax{background-position:-1503px -494px}.icon-table-tennis{background-position:-1562px -494px}.icon-bowling{background-position:-1618px -494px}.icon-tree-conifer{background-position:-1674px -494px}.icon-tree-deciduous{background-position:-1727px -494px}.icon-more-items{background-position:-1779px -494px}.icon-sort{background-position:-1832px -494px}.icon-filter{background-position:-1889px -494px}.icon-gamepad{background-position:-1941px -494px}.icon-playing-dices{background-position:0 -556px}.icon-calculator{background-position:-59px -556px}.icon-tie{background-position:-112px -556px}.icon-wallet{background-position:-155px -556px}.icon-share{background-position:-212px -556px}.icon-sampler{background-position:-266px -556px}.icon-piano{background-position:-325px -556px}.icon-web-browser{background-position:-380px -556px}.icon-blog{background-position:-436px -556px}.icon-dashboard{background-position:-489px -556px}.icon-certificate{background-position:-545px -556px}.icon-bell{background-position:-594px -556px}.icon-candle{background-position:-650px -556px}.icon-pin-classic{background-position:-702px -556px}.icon-iphone-shake{background-position:-758px -556px}.icon-pin-flag{background-position:-814px -556px}.icon-turtle{background-position:-876px -556px}.icon-rabbit{background-position:-936px -556px}.icon-globe{background-position:-994px -556px}.icon-briefcase{background-position:-1050px -556px}.icon-hdd{background-position:-1106px -556px}.icon-thumbs-up{background-position:-1162px -556px}.icon-thumbs-down{background-position:-1218px -556px}.icon-hand-right{background-position:-1274px -556px}.icon-hand-left{background-position:-1332px -556px}.icon-hand-up{background-position:-1390px -556px}.icon-hand-down{background-position:-1441px -556px}.icon-fullscreen{background-position:-1492px -556px}.icon-shopping-bag{background-position:-1548px -556px}.icon-book-open{background-position:-1603px -556px}.icon-nameplate{background-position:-1660px -556px}.icon-nameplate-alt{background-position:-1716px -556px}.icon-vases{background-position:-1772px -556px}.icon-announcement{background-position:-1828px -556px}.icon-dumbbell{background-position:-1885px -556px}.icon-suitcase{background-position:-1943px -556px}.icon-file-import{background-position:0 -618px}.icon-file-export{background-position:-54px -618px}.icon-pinterest{background-position:-109px -618px}.icon-dropbox{background-position:-165px -618px}.icon-google-alt{background-position:-221px -618px}.icon-jolicloud{background-position:-277px -618px}.icon-yahoo{background-position:-333px -618px}.icon-blogger{background-position:-389px -618px}.icon-picasa{background-position:-445px -618px}.icon-amazon{background-position:-501px -618px}.icon-tumblr{background-position:-557px -618px}.icon-wordpress{background-position:-613px -618px}.icon-instapaper{background-position:-669px -618px}.icon-evernote{background-position:-725px -618px}.icon-xing{background-position:-781px -618px}.icon-zootool{background-position:-837px -618px}.icon-dribbble{background-position:-893px -618px}.icon-deviantart{background-position:-949px -618px}.icon-read-it-later{background-position:-1005px -618px}.icon-linked-in{background-position:-1061px -618px}.icon-forrst{background-position:-1117px -618px}.icon-pinboard{background-position:-1173px -618px}.icon-behance{background-position:-1229px -618px}.icon-github{background-position:-1285px -618px}.icon-youtube{background-position:-1341px -618px}.icon-skitch{background-position:-1397px -618px}.icon-4square{background-position:-1453px -618px}.icon-quora{background-position:-1509px -618px}.icon-google-plus{background-position:-1565px -618px}.icon-spotify{background-position:-1621px -618px}.icon-stumbleupon{background-position:-1677px -618px}.icon-readability{background-position:-1733px -618px}.icon-facebook{background-position:-1789px -618px}.icon-twitter-t{background-position:-1845px -618px}.icon-twitter{background-position:-1901px -618px}.icon-buzz{background-position:-1957px -618px}.icon-vimeo{background-position:0 -680px}.icon-flickr{background-position:-56px -680px}.icon-last-fm{background-position:-112px -680px}.icon-rss{background-position:-168px -680px}.icon-skype{background-position:-224px -680px}.icon-e-mail{background-position:-280px -680px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:linear-gradient(to bottom,#08c,#0077b3);background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-image:-moz-linear-gradient(top,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-image:-moz-linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-image:-moz-linear-gradient(top,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#555}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#555;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#555}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:6px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner,.navbar-static-top .navbar-inner{border:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#555;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-image:-moz-linear-gradient(top,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination li{display:inline}.pagination a,.pagination span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination a:hover,.pagination .active a,.pagination .active span{background-color:#f5f5f5}.pagination .active a,.pagination .active span{color:#999;cursor:default}.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999;cursor:default;background-color:transparent}.pagination li:first-child a,.pagination li:first-child span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination li:last-child a,.pagination li:last-child span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover{color:#999;cursor:default;background-color:#fff}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} \ No newline at end of file diff --git a/extern/phmap/css/colors.css b/extern/phmap/css/colors.css deleted file mode 100644 index 8774c02..0000000 --- a/extern/phmap/css/colors.css +++ /dev/null @@ -1,302 +0,0 @@ -/*** - - colors.css v2.0.0 - http://clrs.cc - @mrmrs - MIT License - -***/ -/* - - SKINS - - Backgrounds - - Colors - - Border colors - - SVG fills - - SVG Strokes - -*/ -/* Backgrounds */ -.bg-navy { - background-color: #001F3F; } - -.bg-blue { - background-color: #0074D9; } - -.bg-aqua { - background-color: #7FDBFF; } - -.bg-teal { - background-color: #39CCCC; } - -.bg-olive { - background-color: #3D9970; } - -.bg-green { - background-color: #2ECC40; } - -.bg-lime { - background-color: #01FF70; } - -.bg-yellow { - background-color: #FFDC00; } - -.bg-orange { - background-color: #FF851B; } - -.bg-red { - background-color: #FF4136; } - -.bg-fuchsia { - background-color: #F012BE; } - -.bg-purple { - background-color: #B10DC9; } - -.bg-maroon { - background-color: #85144B; } - -.bg-white { - background-color: #fff; } - -.bg-gray { - background-color: #aaa; } - -.bg-silver { - background-color: #ddd; } - -.bg-black { - background-color: #111; } - -/* Colors */ -.navy { - color: #001F3F; } - -.blue { - color: #0074D9; } - -.aqua { - color: #7FDBFF; } - -.teal { - color: #39CCCC; } - -.olive { - color: #3D9970; } - -.green { - color: #2ECC40; } - -.lime { - color: #01FF70; } - -.yellow { - color: #FFDC00; } - -.orange { - color: #FF851B; } - -.red { - color: #FF4136; } - -.fuchsia { - color: #F012BE; } - -.purple { - color: #B10DC9; } - -.maroon { - color: #85144B; } - -.white { - color: #fff; } - -.silver { - color: #ddd; } - -.gray { - color: #aaa; } - -.black { - color: #111; } - -/* Border colors - - Use with another border utility that sets border-width and style - i.e .border { border-width: 1px; border-style: solid; } -*/ -.border--navy { - border-color: #001F3F; } - -.border--blue { - border-color: #0074D9; } - -.border--aqua { - border-color: #7FDBFF; } - -.border--teal { - border-color: #39CCCC; } - -.border--olive { - border-color: #3D9970; } - -.border--green { - border-color: #2ECC40; } - -.border--lime { - border-color: #01FF70; } - -.border--yellow { - border-color: #FFDC00; } - -.border--orange { - border-color: #FF851B; } - -.border--red { - border-color: #FF4136; } - -.border--fuchsia { - border-color: #F012BE; } - -.border--purple { - border-color: #B10DC9; } - -.border--maroon { - border-color: #85144B; } - -.border--white { - border-color: #fff; } - -.border--gray { - border-color: #aaa; } - -.border--silver { - border-color: #ddd; } - -.border--black { - border-color: #111; } - -/* Fills for SVG */ -.fill-navy { - fill: #001F3F; } - -.fill-blue { - fill: #0074D9; } - -.fill-aqua { - fill: #7FDBFF; } - -.fill-teal { - fill: #39CCCC; } - -.fill-olive { - fill: #3D9970; } - -.fill-green { - fill: #2ECC40; } - -.fill-lime { - fill: #01FF70; } - -.fill-yellow { - fill: #FFDC00; } - -.fill-orange { - fill: #FF851B; } - -.fill-red { - fill: #FF4136; } - -.fill-fuchsia { - fill: #F012BE; } - -.fill-purple { - fill: #B10DC9; } - -.fill-maroon { - fill: #85144B; } - -.fill-white { - fill: #fff; } - -.fill-gray { - fill: #aaa; } - -.fill-silver { - fill: #ddd; } - -.fill-black { - fill: #111; } - -/* Strokes for SVG */ -.stroke-navy { - stroke: #001F3F; } - -.stroke-blue { - stroke: #0074D9; } - -.stroke-aqua { - stroke: #7FDBFF; } - -.stroke-teal { - stroke: #39CCCC; } - -.stroke-olive { - stroke: #3D9970; } - -.stroke-green { - stroke: #2ECC40; } - -.stroke-lime { - stroke: #01FF70; } - -.stroke-yellow { - stroke: #FFDC00; } - -.stroke-orange { - stroke: #FF851B; } - -.stroke-red { - stroke: #FF4136; } - -.stroke-fuchsia { - stroke: #F012BE; } - -.stroke-purple { - stroke: #B10DC9; } - -.stroke-maroon { - stroke: #85144B; } - -.stroke-white { - stroke: #fff; } - -.stroke-gray { - stroke: #aaa; } - -.stroke-silver { - stroke: #ddd; } - -.stroke-black { - stroke: #111; } - -/* PRETTIER LINKS */ -a { - text-decoration: none; - -webkit-transition: color .3s ease-in-out; - transition: color .3s ease-in-out; } - -a:link { - -webkit-transition: color .3s ease-in-out; - transition: color .3s ease-in-out; } - -a:visited { } - -a:hover { - color: #001F3F; - -webkit-transition: color .3s ease-in-out; - transition: color .3s ease-in-out; } - -a:active { - -webkit-transition: color .3s ease-in-out; - transition: color .3s ease-in-out; } diff --git a/extern/phmap/css/style.css b/extern/phmap/css/style.css deleted file mode 100644 index ca7987f..0000000 --- a/extern/phmap/css/style.css +++ /dev/null @@ -1,271 +0,0 @@ -/* main stylesheet */ - -@import url(http://fonts.googleapis.com/css?family=Signika); - -html { - overflow-y: scroll; -} - -body { - font-size: 15px; - font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, sans-serif; - color: #332; -} - -h1, h2, h3, h4, h5 { - color: #332; - font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, sans-serif; - font-weight: 400; - font-size: 1.4em; - line-height: 1.1; - margin-top: 30px; -} - -pre code { - font: 14px/19px Inconsolata, Monaco,"Lucida Console",Terminal,"Courier New",Courier; -} - -.figure { - text-align: center; -} - -.small .figure img { - height: 200px; -} - -.pagetitle .figure { - text-align: left !important; -} - -.pagetitle .figure img { - height: 36px; -} - -table{ - background:#fff; - border:1px solid #ccc; - border-width:2px; - border-collapse:collapse; - margin:5px 0 10px; - - margin-top: 20px; - margin-bottom: 20px; -} - -th, td{ - border:1px solid #ccc; - padding:3px 10px; - text-align:left; - vertical-align:top; -} - -tr.even td{ - background:#f7f7f7; -} - -th{ - background:#edeff0; -} - -td code { - border: 0px; -} - -img { - max-width: 100%; - height: auto; -} - -hr { - border: 0px; - height: 0; - border-bottom: 1px solid #ccc; - margin-bottom: 100px; -} - -/* Logo */ - -.logo { - text-align: center; -} - -.tagline { - font-family: Georgia; - font-size: 18px; - font-style: italic; - line-height: 1.45; - color: #383838; -} - -.author { -} - -.halfbreak { - padding-bottom: 100px; -} - -.break { - padding-bottom: 200px; -} - -/* TOC Links */ - -a { - color: #111111; - text-decoration: none; -} - -.body li a { - text-decoration: underline; -} - -/* Math */ - -.MathJax_Display { - padding-top: 20px; - padding-bottom: 20px; -} - -/* Body Links */ - -p a { - text-decoration: underline; -} - -li code, p code { - font-size: 12px; - border: 1px solid #ccc; - margin-left: 3px; - margin-right: 3px; - padding-left: 2px; - padding-right: 2px; -} - -/* */ - -.center { - text-align: center; -} - -.bigger img { - width: 120%; - height: 120%; -} - -pre { - font-size: 0.9em; - - margin-bottom: 18px; - margin-top: 18px; - - border-left: 1px solid #ccc; - -} - -h1 { - margin-top: 0px; -} - -.annotation { - font-size: 10pt; -} - -.annotation pre { - display: block; - margin: 0; - padding: 7px 10px; - overflow-x: auto; -} - -.annotation.span2 { - /* Override bootstrap */ - margin-left: 0px !important; - margin-top: 18px !important; -} - -.annotation pre code { - border: 0; - padding: 0; - background: transparent; -} - -blockquote { - border-left: 1px solid #ccc; - font-family: Georgia, serif; - font-size: 14px; - font-style: italic; - margin: 0.25em 0; - padding-left: 10px; - line-height: 1.45; - color: #383838; - left: 20px; -} - - -blockquote cite { - color: #999999; - font-size: 14px; - display: block; - margin-top: 5px; -} - -ul.sections { - list-style: none; - padding:0 0 5px 0; - margin:0; -} - -code.sourceCode { - padding: 0; - background: inherit; -} - -pre.sourceCode { - padding: 10px; -} - -ul.sections > li > div { - -moz-box-sizing: border-box; /* firefox */ - -ms-box-sizing: border-box; /* ie */ - -webkit-box-sizing: border-box; /* webkit */ - -khtml-box-sizing: border-box; /* konqueror */ - box-sizing: border-box; /* css3 */ -} - - -/* Make the naviation centered and larger on small screens */ -/*---------------------- (> 481px) ---------------------*/ - -@media only screen and (max-width: 481px) { - -} - -@media only screen and (min-width: 1025px) { - body { - padding: 10px; - } - - .side { - position: fixed; - width: 120px !important; - margin-left: 0px; - z-index: 1000; - } - - .side ul ul { - display: none; - } - - .side ul ul.active { - display: block; - } - - .side .active { - font-weight: bold; - } - - .body { - margin-left: 120px !important; - } - -} diff --git a/extern/phmap/examples/allmaps.cc b/extern/phmap/examples/allmaps.cc deleted file mode 100644 index 89b1ac0..0000000 --- a/extern/phmap/examples/allmaps.cc +++ /dev/null @@ -1,75 +0,0 @@ -// Silly program just to test the natvis file for Visual Studio -// ------------------------------------------------------------ -#include -#include "parallel_hashmap/phmap.h" - -template -void test_set(const F &f) -{ - Set s; - typename Set::iterator it; - for (int i=0; i<100; ++i) - s.insert(f(i)); - - it = s.begin(); - ++it; - - it = s.end(); - it = s.begin(); - while(it != s.end()) - ++it; - it = s.begin(); -} - -int main(int, char **) -{ - using namespace std; - - auto make_int = [](int i) { return i; }; - auto make_string = [](int i) { return std::to_string(i); }; - - auto make_2int = [](int i) { return std::make_pair(i, i); }; - auto make_2string = [](int i) { return std::make_pair(std::to_string(i), std::to_string(i)); }; - - - test_set>(make_int); - test_set>(make_string); - - test_set>(make_int); - test_set>(make_string); - - test_set>(make_2int); - test_set>(make_2string); - - test_set>(make_2int); - test_set>(make_2string); - - test_set>(make_int); - test_set>(make_string); - - test_set>(make_int); - test_set>(make_string); - - test_set>(make_2int); - test_set>(make_2string); - - test_set>(make_2int); - test_set>(make_2string); - - // example of using default parameters in order to specify the mutex type. - // - // Please be aware that the iterators returned (by find for example) cannot - // be safely read in a multithreaded environment. Instead use if_contains(), - // which passes a reference value to the callback while holding the submap lock. - // Similarly, write access can be done safely using modify_if, try_emplace_l - // or lazy_emplace_l. - // ---------------------------------------------------------------------------- - using Map = phmap::parallel_flat_hash_map, - std::equal_to, - std::allocator>, - 4, - std::mutex>; - auto make_2size_t = [](size_t i) { return std::make_pair(i, i); }; - test_set(make_2size_t); -} diff --git a/extern/phmap/examples/basic.cc b/extern/phmap/examples/basic.cc deleted file mode 100644 index f83d6fb..0000000 --- a/extern/phmap/examples/basic.cc +++ /dev/null @@ -1,23 +0,0 @@ -#include -#include -#include - -using phmap::flat_hash_map; - -int main() -{ - // Create an unordered_map of three strings (that map to strings) - flat_hash_map email; - - // Iterate and print keys and values - for (const auto& n : email) - std::cout << n.first << "'s email is: " << n.second << "\n"; - - // Add a new entry - email["bill"] = "bg@whatever.com"; - - // and print it - std::cout << "bill's email is: " << email["bill"] << "\n"; - - return 0; -} diff --git a/extern/phmap/examples/bench.cc b/extern/phmap/examples/bench.cc deleted file mode 100644 index 3c81471..0000000 --- a/extern/phmap/examples/bench.cc +++ /dev/null @@ -1,480 +0,0 @@ -#include - -#ifdef STL_UNORDERED - #include - #define MAPNAME std::unordered_map - #define EXTRAARGS -#elif defined(PHMAP_FLAT) - #include "parallel_hashmap/phmap.h" - #define MAPNAME phmap::flat_hash_map - #define NMSP phmap - #define EXTRAARGS -#else - #if 1 - #include - #define MTX std::mutex - #elif 0 - // Abseil's mutexes are very efficient (at least on windows) - #include "absl/synchronization/mutex.h" - #define MTX absl::Mutex - #elif 1 - #include - #if 1 - #include - #define MTX boost::mutex // faster if all we do is exclusive locks like this bench - #else - #include - #define MTX boost::upgrade_mutex - #endif - #elif 1 - #include - class srwlock { - SRWLOCK _lock; - public: - srwlock() { InitializeSRWLock(&_lock); } - void lock() { AcquireSRWLockExclusive(&_lock); } - void unlock() { ReleaseSRWLockExclusive(&_lock); } - }; - #define MTX srwlock - #else - // spinlocks - slow! - #include - class spinlock { - std::atomic_flag flag = ATOMIC_FLAG_INIT; - public: - void lock() { while(flag.test_and_set(std::memory_order_acquire)); } - void unlock() { flag.clear(std::memory_order_release); } - }; - #define MTX spinlock - #endif - - #include "parallel_hashmap/phmap.h" - #define MAPNAME phmap::parallel_flat_hash_map - #define NMSP phmap - - #define MT_SUPPORT 1 - #if MT_SUPPORT == 1 - // create the parallel_flat_hash_map without internal mutexes, for when - // we programatically ensure that each thread uses different internal submaps - // -------------------------------------------------------------------------- - #define EXTRAARGS , NMSP::priv::hash_default_hash, \ - NMSP::priv::hash_default_eq, \ - std::allocator>, 4, NMSP::NullMutex - #elif MT_SUPPORT == 2 - // create the parallel_flat_hash_map with internal mutexes, for when - // we read/write the same parallel_flat_hash_map from multiple threads, - // without any special precautions. - // -------------------------------------------------------------------------- - #define EXTRAARGS , NMSP::priv::hash_default_hash, \ - NMSP::priv::hash_default_eq, \ - std::allocator>, 4, MTX - #else - #define EXTRAARGS - #endif -#endif - -#define xstr(s) str(s) -#define str(s) #s - -template -using HashT = MAPNAME; - -using hash_t = HashT; -using str_hash_t = HashT; - -const char *program_slug = xstr(MAPNAME); // "_4"; - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "parallel_hashmap/meminfo.h" -#include -using std::vector; - -int64_t _abs(int64_t x) { return (x < 0) ? -x : x; } - -#ifdef _MSC_VER - #pragma warning(disable : 4996) -#endif // _MSC_VER - -// -------------------------------------------------------------------------- -class Timer -{ - typedef std::chrono::high_resolution_clock high_resolution_clock; - typedef std::chrono::milliseconds milliseconds; - -public: - explicit Timer(bool run = false) { if (run) reset(); } - void reset() { _start = high_resolution_clock::now(); } - - milliseconds elapsed() const - { - return std::chrono::duration_cast(high_resolution_clock::now() - _start); - } - -private: - high_resolution_clock::time_point _start; -}; - - -// -------------------------------------------------------------------------- -// from: https://github.com/preshing/RandomSequence -// -------------------------------------------------------------------------- -class RSU -{ -private: - unsigned int m_index; - unsigned int m_intermediateOffset; - - static unsigned int permuteQPR(unsigned int x) - { - static const unsigned int prime = 4294967291u; - if (x >= prime) - return x; // The 5 integers out of range are mapped to themselves. - unsigned int residue = ((unsigned long long) x * x) % prime; - return (x <= prime / 2) ? residue : prime - residue; - } - -public: - RSU(unsigned int seedBase, unsigned int seedOffset) - { - m_index = permuteQPR(permuteQPR(seedBase) + 0x682f0161); - m_intermediateOffset = permuteQPR(permuteQPR(seedOffset) + 0x46790905); - } - - unsigned int next() - { - return permuteQPR((permuteQPR(m_index++) + m_intermediateOffset) ^ 0x5bf03635); - } -}; - -// -------------------------------------------------------------------------- -char * new_string_from_integer(uint64_t num) -{ - int ndigits = num == 0 ? 1 : (int)log10(num) + 1; - char * str = (char *)malloc(ndigits + 1); - sprintf(str, "%u", (unsigned int)num); - return str; -} - -// -------------------------------------------------------------------------- -template -void _fill(vector &v) -{ - srand(1); // for a fair/deterministic comparison - for (size_t i = 0, sz = v.size(); i < sz; ++i) - v[i] = (T)(i * 10 + rand() % 10); -} - -// -------------------------------------------------------------------------- -template -void _shuffle(vector &v) -{ - for (size_t n = v.size(); n >= 2; --n) - std::swap(v[n - 1], v[static_cast(rand()) % n]); -} - -// -------------------------------------------------------------------------- -template -Timer _fill_random(vector &v, HT &hash) -{ - _fill(v); - _shuffle(v); - - Timer timer(true); - - for (size_t i = 0, sz = v.size(); i < sz; ++i) - hash.insert(typename HT::value_type(v[i], 0)); - return timer; -} - -// -------------------------------------------------------------------------- -void out(const char* test, int64_t cnt, const Timer &t, bool = false) -{ - printf("%s,time,%u,%s,%f\n", test, (unsigned int)cnt, program_slug, - (float)((double)t.elapsed().count() / 1000)); -} - -// -------------------------------------------------------------------------- -void outmem(const char*, int64_t cnt, uint64_t mem, bool final = false) -{ - static uint64_t max_mem = 0; - static uint64_t max_keys = 0; - if (final) - printf("peak memory usage for %u values: %.2f GB\n", (unsigned int)max_keys, - max_mem / ((double)1000 * 1000 * 1000)); - else { - if (mem > max_mem) - max_mem = mem; - if ((uint64_t)cnt > max_keys) - max_keys = cnt; - } -} - -static bool all_done = false; -static int64_t s_num_keys[16] = { 0 }; -static int64_t loop_idx = 0; -static int64_t inner_cnt = 0; -static const char *test = "random"; - -// -------------------------------------------------------------------------- -template -void _fill_random_inner(int64_t cnt, HT &hash, RSU &rsu) -{ - for (int64_t i=0; i -void _fill_random_inner_mt(int64_t cnt, HT &hash, RSU &rsu) -{ - constexpr int64_t num_threads = 8; // has to be a power of two - std::unique_ptr threads[num_threads]; - - auto thread_fn = [&hash, cnt, num_threads](size_t thread_idx, RSU rsu_) { -#if MT_SUPPORT - size_t modulo = hash.subcnt() / num_threads; // subcnt() returns the number of submaps - - for (int64_t i=0; ijoin(); -} - -// -------------------------------------------------------------------------- -size_t total_num_keys() -{ - size_t n = 0; - for (int i=0; i<16; ++i) - n += s_num_keys[i]; - return n; -} - -// -------------------------------------------------------------------------- -template -Timer _fill_random2(int64_t cnt, HT &hash) -{ - test = "random"; - unsigned int seed = 76687; - RSU rsu(seed, seed + 1); - - Timer timer(true); - const int64_t num_loops = 10; - inner_cnt = cnt / num_loops; - - for (int i=0; i<16; ++i) - s_num_keys[i] = 0; - - for (loop_idx=0; loop_idx -Timer _lookup(vector &v, HT &hash, size_t &num_present) -{ - _fill_random(v, hash); - - num_present = 0; - size_t max_val = v.size() * 10; - Timer timer(true); - - for (size_t i = 0, sz = v.size(); i < sz; ++i) - { - num_present += (size_t)(hash.find(v[i]) != hash.end()); - num_present += (size_t)(hash.find((T)(rand() % max_val)) != hash.end()); - } - return timer; -} - -// -------------------------------------------------------------------------- -template -Timer _delete(vector &v, HT &hash) -{ - _fill_random(v, hash); - _shuffle(v); // don't delete in insertion order - - Timer timer(true); - - for(size_t i = 0, sz = v.size(); i < sz; ++i) - hash.erase(v[i]); - return timer; -} - -// -------------------------------------------------------------------------- -void memlog() -{ - std::this_thread::sleep_for(std::chrono::milliseconds(10)); - uint64_t nbytes_old_out = spp::GetProcessMemoryUsed(); - uint64_t nbytes_old = spp::GetProcessMemoryUsed(); // last non outputted mem measurement - outmem(test, 0, nbytes_old); - int64_t last_loop = 0; - - while (!all_done) - { - uint64_t nbytes = spp::GetProcessMemoryUsed(); - - if ((double)_abs(nbytes - nbytes_old_out) / nbytes_old_out > 0.03 || - (double)_abs(nbytes - nbytes_old) / nbytes_old > 0.01) - { - if ((double)(nbytes - nbytes_old) / nbytes_old > 0.03) - outmem(test, total_num_keys() - 1, nbytes_old); - outmem(test, total_num_keys(), nbytes); - nbytes_old_out = nbytes; - last_loop = loop_idx; - } - else if (loop_idx > last_loop) - { - outmem(test, total_num_keys(), nbytes); - nbytes_old_out = nbytes; - last_loop = loop_idx; - } - nbytes_old = nbytes; - - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - } -} - - -// -------------------------------------------------------------------------- -int main(int argc, char ** argv) -{ - int64_t num_keys = 100000000; - const char *bench_name = "random"; - int64_t i, value = 0; - - if(argc > 2) - { - num_keys = atoi(argv[1]); - bench_name = argv[2]; - } - - hash_t hash; - str_hash_t str_hash; - - srand(1); // for a fair/deterministic comparison - Timer timer(true); - -#if MT_SUPPORT - if (!strcmp(program_slug,"absl::parallel_flat_hash_map") || - !strcmp(program_slug,"phmap::parallel_flat_hash_map")) - program_slug = xstr(MAPNAME) "_mt"; -#endif - - std::thread t1(memlog); - - try - { - if(!strcmp(bench_name, "sequential")) - { - for(i = 0; i < num_keys; i++) - hash.insert(hash_t::value_type(i, value)); - } -#if 0 - else if(!strcmp(bench_name, "random")) - { - vector v(num_keys); - timer = _fill_random(v, hash); - out("random", num_keys, timer); - } -#endif - else if(!strcmp(bench_name, "random")) - { - fprintf(stderr, "size = %zu\n", sizeof(hash)); - timer = _fill_random2(num_keys, hash); - } - else if(!strcmp(bench_name, "lookup")) - { - vector v(num_keys); - size_t num_present; - - timer = _lookup(v, hash, num_present); - //fprintf(stderr, "found %zu\n", num_present); - } - else if(!strcmp(bench_name, "delete")) - { - vector v(num_keys); - timer = _delete(v, hash); - } - else if(!strcmp(bench_name, "sequentialstring")) - { - for(i = 0; i < num_keys; i++) - str_hash.insert(str_hash_t::value_type(new_string_from_integer(i), value)); - } - else if(!strcmp(bench_name, "randomstring")) - { - for(i = 0; i < num_keys; i++) - str_hash.insert(str_hash_t::value_type(new_string_from_integer((int)rand()), value)); - } - else if(!strcmp(bench_name, "deletestring")) - { - for(i = 0; i < num_keys; i++) - str_hash.insert(str_hash_t::value_type(new_string_from_integer(i), value)); - timer.reset(); - for(i = 0; i < num_keys; i++) - str_hash.erase(new_string_from_integer(i)); - } - - - //printf("%f\n", (float)((double)timer.elapsed().count() / 1000)); - fflush(stdout); - //std::this_thread::sleep_for(std::chrono::seconds(1000)); - } - catch (...) - { - } - - all_done = true; - outmem(test, 0, 0, true); - t1.join(); - return 0; -} diff --git a/extern/phmap/examples/btree.cc b/extern/phmap/examples/btree.cc deleted file mode 100644 index 4ff8e23..0000000 --- a/extern/phmap/examples/btree.cc +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include "btree_fwd.h" -#include - -int main() -{ - // initialise map with some values using an initializer_list - phmap::btree_map map = - { { "John", 35 }, - { "Jane", 32 }, - { "Joe", 30 }, - }; - - // add a couple more values using operator[]() - map["lucy"] = 18; - map["Andre"] = 20; - - auto it = map.find("Joe"); - map.erase(it); - - map.insert(std::make_pair("Alex", 16)); - map.emplace("Emily", 18); // emplace uses pair template constructor - - for (auto& p: map) - std::cout << p.first << ", " << p.second << '\n'; - - IntString map2; // IntString is declared in btree_fwd.h - - map2.emplace(std::piecewise_construct, std::forward_as_tuple(0), std::forward_as_tuple(10, 'c')); - map2.try_emplace(1, 10, 'a'); // phmap::btree_map supports c++17 API - - for (auto& p: map2) - std::cout << p.first << ", " << p.second << '\n'; - - // create a btree_set of tuples - using X = std::tuple; - phmap::btree_set set; - - for (int i=0; i<10; ++i) - set.insert(X((float)i, std::to_string(i))); - set.emplace(15.0f, "15"); - - set.erase(X(1.0f, "1")); - - for (auto& e: set) - std::cout << std::get<0>(e) << ", \"" << std::get<1>(e) << "\" \n"; - - return 0; -} diff --git a/extern/phmap/examples/btree_fwd.h b/extern/phmap/examples/btree_fwd.h deleted file mode 100644 index bd8c5e7..0000000 --- a/extern/phmap/examples/btree_fwd.h +++ /dev/null @@ -1,6 +0,0 @@ -#include - -#include - -using IntString = phmap::btree_map; - diff --git a/extern/phmap/examples/dump_load.cc b/extern/phmap/examples/dump_load.cc deleted file mode 100644 index 6b003e4..0000000 --- a/extern/phmap/examples/dump_load.cc +++ /dev/null @@ -1,53 +0,0 @@ -#include -#include - -void dump_load_uint64_uint32() { - phmap::flat_hash_map mp1 = { {100, 99}, {300, 299} }; - - for (const auto& n : mp1) - std::cout << n.first << "'s value is: " << n.second << "\n"; - - { - phmap::BinaryOutputArchive ar_out("./dump.data"); - mp1.phmap_dump(ar_out); - } - - phmap::flat_hash_map mp2; - { - phmap::BinaryInputArchive ar_in("./dump.data"); - mp2.phmap_load(ar_in); - } - - for (const auto& n : mp2) - std::cout << n.first << "'s value is: " << n.second << "\n"; -} - -void dump_load_parallel_flat_hash_map() { - phmap::parallel_flat_hash_map mp1 = { - {100, 99}, {300, 299}, {101, 992} }; - - for (const auto& n : mp1) - std::cout << "key: " << n.first << ", value: " << n.second << "\n"; - - { - phmap::BinaryOutputArchive ar_out("./dump.data"); - mp1.phmap_dump(ar_out); - } - - phmap::parallel_flat_hash_map mp2; - { - phmap::BinaryInputArchive ar_in("./dump.data"); - mp2.phmap_load(ar_in); - } - - for (const auto& n : mp2) - std::cout << "key: " << n.first << ", value: " << n.second << "\n"; -} - -int main() -{ - dump_load_uint64_uint32(); - dump_load_parallel_flat_hash_map(); - return 0; -} - diff --git a/extern/phmap/examples/dump_nested.cc b/extern/phmap/examples/dump_nested.cc deleted file mode 100644 index c207ba3..0000000 --- a/extern/phmap/examples/dump_nested.cc +++ /dev/null @@ -1,88 +0,0 @@ -/* - * - * Example of dumping a map, containing values which are phmap maps or sets - * building this requires c++17 support - * - */ - -#include -#include - -template -class MyMap : public phmap::flat_hash_map> -{ -public: - using Set = phmap::flat_hash_set; - - void dump(const std::string &filename) - { - phmap::BinaryOutputArchive ar_out (filename.c_str()); - - ar_out.dump(this->size()); - for (auto& [k, v] : *this) - { - ar_out.dump(k); - v.dump(ar_out); - } - } - - void load(const std::string & filename) - { - phmap::BinaryInputArchive ar_in(filename.c_str()); - - size_t size; - ar_in.load(&size); - this->reserve(size); - - while (size--) - { - K k; - Set v; - - ar_in.load(&k); - v.load(ar_in); - - this->insert_or_assign(std::move(k), std::move(v)); - } - } - - void insert(K k, V v) - { - Set &set = (*this)[k]; - set.insert(v); - } - - friend std::ostream& operator<<(std::ostream& os, const MyMap& map) - { - for (const auto& [k, m] : map) - { - os << k << ": ["; - for (const auto& x : m) - os << x << ", "; - os << "]\n"; - } - return os; - } -}; - -int main() -{ - MyMap m; - m.insert(1, 5); - m.insert(1, 8); - m.insert(2, 3); - m.insert(1, 15); - m.insert(1, 27); - m.insert(2, 10); - m.insert(2, 13); - - std::cout << m << "\n"; - - m.dump("test_archive"); - m.clear(); - m.load("test_archive"); - - std::cout << m << "\n"; - - return 0; -} diff --git a/extern/phmap/examples/emplace.cc b/extern/phmap/examples/emplace.cc deleted file mode 100644 index 540318c..0000000 --- a/extern/phmap/examples/emplace.cc +++ /dev/null @@ -1,166 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include - -template -using milliseconds = std::chrono::duration; - -// type containing std::string. Seems to take a long time to construct (and maybe move) -// ------------------------------------------------------------------------------------ -class custom_type -{ - std::string one = "one"; - std::string two = "two"; - std::uint32_t three = 3; - std::uint64_t four = 4; - std::uint64_t five = 5; -public: - custom_type() = default; - - // Make object movable and non-copyable - custom_type(custom_type &&) = default; - custom_type& operator=(custom_type &&) = default; - - // should be automatically deleted per http://www.slideshare.net/ripplelabs/howard-hinnant-accu2014 - //custom_type(custom_type const&) = delete; - //custom_type& operator=(custom_type const&) = delete; -}; - -// type containing only integrals. should be faster to create. -// ----------------------------------------------------------- -class custom_type_2 -{ - std::uint32_t three = 3; - std::uint64_t four = 4; - std::uint64_t five = 5; - std::uint64_t six = 6; -public: - custom_type_2() = default; - - // Make object movable and non-copyable - custom_type_2(custom_type_2 &&) = default; - custom_type_2& operator=(custom_type_2 &&) = default; - - // should be automatically deleted per http://www.slideshare.net/ripplelabs/howard-hinnant-accu2014 - //custom_type_2(custom_type_2 const&) = delete; - //custom_type_2& operator=(custom_type_2 const&) = delete; -}; - -// convert std::size_t to appropriate key -// -------------------------------------- -template -struct GenKey -{ - K operator()(std::size_t j); -}; - -template <> -struct GenKey -{ - std::string operator()(std::size_t j) { - std::ostringstream stm; - stm << j; - return stm.str(); - } -}; - -template <> -struct GenKey -{ - int operator()(std::size_t j) { - return (int)j; - } -}; - -// emplace key + large struct -// -------------------------- -template struct _emplace -{ - void operator()(Map &m, std::size_t j); -}; - -// "void" template parameter -> use emplace -template struct _emplace -{ - void operator()(Map &m, std::size_t j) - { - m.emplace(GenKey()(j), V()); - } -}; - -// "int" template parameter -> use emplace_back for std::vector -template struct _emplace -{ - void operator()(Map &m, std::size_t j) - { - m.emplace_back(GenKey()(j), V()); - } -}; - -// The test itself -// --------------- -template class INSERT> -void _test(std::size_t iterations, std::size_t container_size, const char *map_name) -{ - std::size_t count = 0; - auto t1 = std::chrono::high_resolution_clock::now(); - INSERT insert; - for (std::size_t i=0; i(t2 - t1).count(); - if (count != iterations*container_size) - std::clog << " invalid count: " << count << "\n"; - std::clog << map_name << std::fixed << int(elapsed) << " ms\n"; -} - - -template class INSERT> -void test(std::size_t iterations, std::size_t container_size) -{ - std::clog << "bench: iterations: " << iterations << " / container_size: " << container_size << "\n"; - - _test, K, V, void, INSERT>(iterations, container_size, " std::map: "); - _test, K, V, void, INSERT>(iterations, container_size, " std::unordered_map: "); - _test, K, V, void, INSERT>(iterations, container_size, " phmap::flat_hash_map: "); - _test>, K, V, int, INSERT> (iterations, container_size, " std::vector: "); - std::clog << "\n"; - -} - -int main() -{ - std::size_t iterations = 100000; - - // test with custom_type_2 (int key + 32 byte value). This is representative - // of the hash table insertion speed. - // ------------------------------------------------------------------------- - std::clog << "\n\n" << "testing with " "\n"; - std::clog << "---------------------------------" "\n"; - test(iterations,10); - test(iterations,100); - test(iterations,500); - - // test with custom_type, which contains two std::string values, and use - // a generated string key. This is not very indicative of the speed of the - // hash itself, as a good chunk of the time is spent creating the keys and - // values (as shown by the long times even for std::vector). - // ----------------------------------------------------------------------- - std::clog << "\n" << "testing with " "\n"; - std::clog << "---------------------------------" "\n"; - test(iterations,1); - test(iterations,10); - test(iterations,50); - -} diff --git a/extern/phmap/examples/f1.cc b/extern/phmap/examples/f1.cc deleted file mode 100644 index 9cec278..0000000 --- a/extern/phmap/examples/f1.cc +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Make sure that the phmap.h header builds fine when included in two separate - * source files - */ -#include -#include - -using phmap::flat_hash_map; - -int main() -{ - // Create an unordered_map of three strings (that map to strings) - using Map = flat_hash_map; - Map email = - { - { "tom", "tom@gmail.com"}, - { "jeff", "jk@gmail.com"}, - { "jim", "jimg@microsoft.com"} - }; - - extern void f2(Map&); - f2(email); - - return 0; -} diff --git a/extern/phmap/examples/f2.cc b/extern/phmap/examples/f2.cc deleted file mode 100644 index eca567e..0000000 --- a/extern/phmap/examples/f2.cc +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Make sure that the phmap.h header builds fine when included in two separate - * source files - */ -#include -#include -#include - -using phmap::flat_hash_map; -using Map = flat_hash_map; - -void f2(Map& email) -{ - // Iterate and print keys and values - for (const auto& n : email) - std::cout << n.first << "'s email is: " << n.second << "\n"; - - // Add a new entry - email["bill"] = "bg@whatever.com"; - - // and print it - std::cout << "bill's email is: " << email["bill"] << "\n"; -} diff --git a/extern/phmap/examples/hash_std.cc b/extern/phmap/examples/hash_std.cc deleted file mode 100644 index 04551ff..0000000 --- a/extern/phmap/examples/hash_std.cc +++ /dev/null @@ -1,20 +0,0 @@ -#include "hash_std.h" // defines Person with std::hash specialization - -#include -#include - -int main() -{ - // As we have defined a specialization of std::hash() for Person, - // we can now create sparse_hash_set or sparse_hash_map of Persons - // ---------------------------------------------------------------- - phmap::flat_hash_set persons = - { { "John", "Mitchell", 35 }, - { "Jane", "Smith", 32 }, - { "Jane", "Smith", 30 }, - }; - - for (auto& p: persons) - std::cout << p._first << ' ' << p._last << " (" << p._age << ")" << '\n'; - -} diff --git a/extern/phmap/examples/hash_std.h b/extern/phmap/examples/hash_std.h deleted file mode 100644 index debf4a9..0000000 --- a/extern/phmap/examples/hash_std.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef phmap_example_hash_std_ -#define phmap_example_hash_std_ - -#include // minimal header providing phmap::HashState() -#include -using std::string; - -struct Person -{ - bool operator==(const Person &o) const - { - return _first == o._first && _last == o._last && _age == o._age; - } - - string _first; - string _last; - int _age; -}; - -namespace std -{ - // inject specialization of std::hash for Person into namespace std - // An alternative is to provide a hash_value() friend function (see hash_value.h) - // ------------------------------------------------------------------------------ - template<> struct hash - { - std::size_t operator()(Person const &p) const - { - return phmap::HashState().combine(0, p._first, p._last, p._age); - } - }; -} - -#endif // phmap_example_hash_std_ diff --git a/extern/phmap/examples/hash_value.cc b/extern/phmap/examples/hash_value.cc deleted file mode 100644 index 43d2b05..0000000 --- a/extern/phmap/examples/hash_value.cc +++ /dev/null @@ -1,20 +0,0 @@ -#include "hash_value.h" // defines Person with std::hash specialization - -#include -#include - -int main() -{ - // As we have defined a specialization of std::hash() for Person, - // we can now create sparse_hash_set or sparse_hash_map of Persons - // ---------------------------------------------------------------- - phmap::flat_hash_set persons = - { { "John", "Mitchell", 35 }, - { "Jane", "Smith", 32 }, - { "Jane", "Smith", 30 }, - }; - - for (auto& p: persons) - std::cout << p._first << ' ' << p._last << " (" << p._age << ")" << '\n'; - -} diff --git a/extern/phmap/examples/hash_value.h b/extern/phmap/examples/hash_value.h deleted file mode 100644 index ffcc3e0..0000000 --- a/extern/phmap/examples/hash_value.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef phmap_example_hash_value_ -#define phmap_example_hash_value_ - -#include // minimal header providing phmap::HashState() -#include -using std::string; - -struct Person -{ - bool operator==(const Person &o) const - { - return _first == o._first && _last == o._last && _age == o._age; - } - - // Demonstrates how to provide the hash function as a friend member function of the class - // This can be used as an alternative to providing a std::hash specialization - // -------------------------------------------------------------------------------------- - friend size_t hash_value(const Person &p) - { - return phmap::HashState().combine(0, p._first, p._last, p._age); - } - - string _first; - string _last; - int _age; -}; - -#endif // phmap_example_hash_value_ diff --git a/extern/phmap/examples/insert_bench.cc b/extern/phmap/examples/insert_bench.cc deleted file mode 100644 index b01b982..0000000 --- a/extern/phmap/examples/insert_bench.cc +++ /dev/null @@ -1,143 +0,0 @@ -#include -#include -#include -#include -#include -#include -#define PHMAP_ALLOCATOR_NOTHROW 1 -#include - -// this is probably the fastest high quality 64bit random number generator that exists. -// Implements Small Fast Counting v4 RNG from PractRand. -class sfc64 { -public: - using result_type = uint64_t; - - // no copy ctors so we don't accidentally get the same random again - sfc64(sfc64 const&) = delete; - sfc64& operator=(sfc64 const&) = delete; - - sfc64(sfc64&&) = default; - sfc64& operator=(sfc64&&) = default; - - sfc64(std::array const& _state) - : m_a(_state[0]) - , m_b(_state[1]) - , m_c(_state[2]) - , m_counter(_state[3]) {} - - static constexpr uint64_t(min)() { - return (std::numeric_limits::min)(); - } - static constexpr uint64_t(max)() { - return (std::numeric_limits::max)(); - } - - sfc64() - : sfc64(UINT64_C(0x853c49e6748fea9b)) {} - - sfc64(uint64_t _seed) - : m_a(_seed) - , m_b(_seed) - , m_c(_seed) - , m_counter(1) { - for (int i = 0; i < 12; ++i) { - operator()(); - } - } - - void seed() { - *this = sfc64{std::random_device{}()}; - } - - uint64_t operator()() noexcept { - auto const tmp = m_a + m_b + m_counter++; - m_a = m_b ^ (m_b >> right_shift); - m_b = m_c + (m_c << left_shift); - m_c = rotl(m_c, rotation) + tmp; - return tmp; - } - - // this is a bit biased, but for our use case that's not important. - uint64_t operator()(uint64_t boundExcluded) noexcept { -#ifdef PHMAP_HAS_UMUL128 - uint64_t h; - (void)umul128(operator()(), boundExcluded, &h); - return h; -#else - return 0; -#endif - } - - std::array state() const { - return {{m_a, m_b, m_c, m_counter}}; - } - - void state(std::array const& s) { - m_a = s[0]; - m_b = s[1]; - m_c = s[2]; - m_counter = s[3]; - } - -private: - template - T rotl(T const x, int k) { - return (x << k) | (x >> (8 * sizeof(T) - k)); - } - - static constexpr int rotation = 24; - static constexpr int right_shift = 11; - static constexpr int left_shift = 3; - uint64_t m_a; - uint64_t m_b; - uint64_t m_c; - uint64_t m_counter; -}; - - -int main() -{ - // Create an unordered_map of three strings (that map to strings) - using Map = phmap::parallel_node_hash_map; - static size_t const n = 50000000; - sfc64 rng(123); - - size_t checksum = 0; - - if (0) - { - size_t const max_rng = n / 20; - Map map; - for (size_t i = 0; i < n; ++i) { - checksum += ++map[static_cast(rng(max_rng))]; - } - } - - if (0) - { - size_t const max_rng = n / 4; - Map map; - for (size_t i = 0; i < n; ++i) { - checksum += ++map[static_cast(rng(max_rng))]; - } - } - - if (1) - { - size_t const max_rng = n / 2; - Map map; - for (size_t i = 0; i < n; ++i) { - checksum += ++map[static_cast(rng(max_rng))]; - } - } - - if (0) - { - Map map; - for (size_t i = 0; i < n; ++i) { - checksum += ++map[static_cast(rng())]; - } - } - printf("%zu\n", checksum); -} diff --git a/extern/phmap/examples/knucleotide-input.txt b/extern/phmap/examples/knucleotide-input.txt deleted file mode 100644 index f1caba0..0000000 --- a/extern/phmap/examples/knucleotide-input.txt +++ /dev/null @@ -1,171 +0,0 @@ ->ONE Homo sapiens alu -GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA -TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT -AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG -GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG -CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT -GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA -GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA -TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG -AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA -GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT -AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC -AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG -GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC -CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG -AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT -TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA -TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT -GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG -TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT -CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG -CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG -TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA -CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG -AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG -GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC -TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA -TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA -GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT -GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC -ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT -TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC -CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG -CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG -GGCGACAGAGCGAGACTCCG ->TWO IUB ambiguity codes -cttBtatcatatgctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcg -tactDtDagcctatttSVHtHttKtgtHMaSattgWaHKHttttagacatWatgtRgaaa -NtactMcSMtYtcMgRtacttctWBacgaaatatagScDtttgaagacacatagtVgYgt -cattHWtMMWcStgttaggKtSgaYaaccWStcgBttgcgaMttBYatcWtgacaYcaga -gtaBDtRacttttcWatMttDBcatWtatcttactaBgaYtcttgttttttttYaaScYa -HgtgttNtSatcMtcVaaaStccRcctDaataataStcYtRDSaMtDttgttSagtRRca -tttHatSttMtWgtcgtatSSagactYaaattcaMtWatttaSgYttaRgKaRtccactt -tattRggaMcDaWaWagttttgacatgttctacaaaRaatataataaMttcgDacgaSSt -acaStYRctVaNMtMgtaggcKatcttttattaaaaagVWaHKYagtttttatttaacct -tacgtVtcVaattVMBcttaMtttaStgacttagattWWacVtgWYagWVRctDattBYt -gtttaagaagattattgacVatMaacattVctgtBSgaVtgWWggaKHaatKWcBScSWa -accRVacacaaactaccScattRatatKVtactatatttHttaagtttSKtRtacaaagt -RDttcaaaaWgcacatWaDgtDKacgaacaattacaRNWaatHtttStgttattaaMtgt -tgDcgtMgcatBtgcttcgcgaDWgagctgcgaggggVtaaScNatttacttaatgacag -cccccacatYScaMgtaggtYaNgttctgaMaacNaMRaacaaacaKctacatagYWctg -ttWaaataaaataRattagHacacaagcgKatacBttRttaagtatttccgatctHSaat -actcNttMaagtattMtgRtgaMgcataatHcMtaBSaRattagttgatHtMttaaKagg -YtaaBataSaVatactWtataVWgKgttaaaacagtgcgRatatacatVtHRtVYataSa -KtWaStVcNKHKttactatccctcatgWHatWaRcttactaggatctataDtDHBttata -aaaHgtacVtagaYttYaKcctattcttcttaataNDaaggaaaDYgcggctaaWSctBa -aNtgctggMBaKctaMVKagBaactaWaDaMaccYVtNtaHtVWtKgRtcaaNtYaNacg -gtttNattgVtttctgtBaWgtaattcaagtcaVWtactNggattctttaYtaaagccgc -tcttagHVggaYtgtNcDaVagctctctKgacgtatagYcctRYHDtgBattDaaDgccK -tcHaaStttMcctagtattgcRgWBaVatHaaaataYtgtttagMDMRtaataaggatMt -ttctWgtNtgtgaaaaMaatatRtttMtDgHHtgtcattttcWattRSHcVagaagtacg -ggtaKVattKYagactNaatgtttgKMMgYNtcccgSKttctaStatatNVataYHgtNa -BKRgNacaactgatttcctttaNcgatttctctataScaHtataRagtcRVttacDSDtt -aRtSatacHgtSKacYagttMHtWataggatgactNtatSaNctataVtttRNKtgRacc -tttYtatgttactttttcctttaaacatacaHactMacacggtWataMtBVacRaSaatc -cgtaBVttccagccBcttaRKtgtgcctttttRtgtcagcRttKtaaacKtaaatctcac -aattgcaNtSBaaccgggttattaaBcKatDagttactcttcattVtttHaaggctKKga -tacatcBggScagtVcacattttgaHaDSgHatRMaHWggtatatRgccDttcgtatcga -aacaHtaagttaRatgaVacttagattVKtaaYttaaatcaNatccRttRRaMScNaaaD -gttVHWgtcHaaHgacVaWtgttScactaagSgttatcttagggDtaccagWattWtRtg -ttHWHacgattBtgVcaYatcggttgagKcWtKKcaVtgaYgWctgYggVctgtHgaNcV -taBtWaaYatcDRaaRtSctgaHaYRttagatMatgcatttNattaDttaattgttctaa -ccctcccctagaWBtttHtBccttagaVaatMcBHagaVcWcagBVttcBtaYMccagat -gaaaaHctctaacgttagNWRtcggattNatcRaNHttcagtKttttgWatWttcSaNgg -gaWtactKKMaacatKatacNattgctWtatctaVgagctatgtRaHtYcWcttagccaa -tYttWttaWSSttaHcaaaaagVacVgtaVaRMgattaVcDactttcHHggHRtgNcctt -tYatcatKgctcctctatVcaaaaKaaaagtatatctgMtWtaaaacaStttMtcgactt -taSatcgDataaactaaacaagtaaVctaggaSccaatMVtaaSKNVattttgHccatca -cBVctgcaVatVttRtactgtVcaattHgtaaattaaattttYtatattaaRSgYtgBag -aHSBDgtagcacRHtYcBgtcacttacactaYcgctWtattgSHtSatcataaatataHt -cgtYaaMNgBaatttaRgaMaatatttBtttaaaHHKaatctgatWatYaacttMctctt -ttVctagctDaaagtaVaKaKRtaacBgtatccaaccactHHaagaagaaggaNaaatBW -attccgStaMSaMatBttgcatgRSacgttVVtaaDMtcSgVatWcaSatcttttVatag -ttactttacgatcaccNtaDVgSRcgVcgtgaacgaNtaNatatagtHtMgtHcMtagaa -attBgtataRaaaacaYKgtRccYtatgaagtaataKgtaaMttgaaRVatgcagaKStc -tHNaaatctBBtcttaYaBWHgtVtgacagcaRcataWctcaBcYacYgatDgtDHccta ->THREE Homo sapiens frequency -aacacttcaccaggtatcgtgaaggctcaagattacccagagaacctttgcaatataaga -atatgtatgcagcattaccctaagtaattatattctttttctgactcaaagtgacaagcc -ctagtgtatattaaatcggtatatttgggaaattcctcaaactatcctaatcaggtagcc -atgaaagtgatcaaaaaagttcgtacttataccatacatgaattctggccaagtaaaaaa -tagattgcgcaaaattcgtaccttaagtctctcgccaagatattaggatcctattactca -tatcgtgtttttctttattgccgccatccccggagtatctcacccatccttctcttaaag -gcctaatattacctatgcaaataaacatatattgttgaaaattgagaacctgatcgtgat -tcttatgtgtaccatatgtatagtaatcacgcgactatatagtgctttagtatcgcccgt -gggtgagtgaatattctgggctagcgtgagatagtttcttgtcctaatatttttcagatc -gaatagcttctatttttgtgtttattgacatatgtcgaaactccttactcagtgaaagtc -atgaccagatccacgaacaatcttcggaatcagtctcgttttacggcggaatcttgagtc -taacttatatcccgtcgcttactttctaacaccccttatgtatttttaaaattacgttta -ttcgaacgtacttggcggaagcgttattttttgaagtaagttacattgggcagactcttg -acattttcgatacgactttctttcatccatcacaggactcgttcgtattgatatcagaag -ctcgtgatgattagttgtcttctttaccaatactttgaggcctattctgcgaaatttttg -ttgccctgcgaacttcacataccaaggaacacctcgcaacatgccttcatatccatcgtt -cattgtaattcttacacaatgaatcctaagtaattacatccctgcgtaaaagatggtagg -ggcactgaggatatattaccaagcatttagttatgagtaatcagcaatgtttcttgtatt -aagttctctaaaatagttacatcgtaatgttatctcgggttccgcgaataaacgagatag -attcattatatatggccctaagcaaaaacctcctcgtattctgttggtaattagaatcac -acaatacgggttgagatattaattatttgtagtacgaagagatataaaaagatgaacaat -tactcaagtcaagatgtatacgggatttataataaaaatcgggtagagatctgctttgca -attcagacgtgccactaaatcgtaatatgtcgcgttacatcagaaagggtaactattatt -aattaataaagggcttaatcactacatattagatcttatccgatagtcttatctattcgt -tgtatttttaagcggttctaattcagtcattatatcagtgctccgagttctttattattg -ttttaaggatgacaaaatgcctcttgttataacgctgggagaagcagactaagagtcgga -gcagttggtagaatgaggctgcaaaagacggtctcgacgaatggacagactttactaaac -caatgaaagacagaagtagagcaaagtctgaagtggtatcagcttaattatgacaaccct -taatacttccctttcgccgaatactggcgtggaaaggttttaaaagtcgaagtagttaga -ggcatctctcgctcataaataggtagactactcgcaatccaatgtgactatgtaatactg -ggaacatcagtccgcgatgcagcgtgtttatcaaccgtccccactcgcctggggagacat -gagaccacccccgtggggattattagtccgcagtaatcgactcttgacaatccttttcga -ttatgtcatagcaatttacgacagttcagcgaagtgactactcggcgaaatggtattact -aaagcattcgaacccacatgaatgtgattcttggcaatttctaatccactaaagcttttc -cgttgaatctggttgtagatatttatataagttcactaattaagatcacggtagtatatt -gatagtgatgtctttgcaagaggttggccgaggaatttacggattctctattgatacaat -ttgtctggcttataactcttaaggctgaaccaggcgtttttagacgacttgatcagctgt -tagaatggtttggactccctctttcatgtcagtaacatttcagccgttattgttacgata -tgcttgaacaatattgatctaccacacacccatagtatattttataggtcatgctgttac -ctacgagcatggtattccacttcccattcaatgagtattcaacatcactagcctcagaga -tgatgacccacctctaataacgtcacgttgcggccatgtgaaacctgaacttgagtagac -gatatcaagcgctttaaattgcatataacatttgagggtaaagctaagcggatgctttat -ataatcaatactcaataataagatttgattgcattttagagttatgacacgacatagttc -actaacgagttactattcccagatctagactgaagtactgatcgagacgatccttacgtc -gatgatcgttagttatcgacttaggtcgggtctctagcggtattggtacttaaccggaca -ctatactaataacccatgatcaaagcataacagaatacagacgataatttcgccaacata -tatgtacagaccccaagcatgagaagctcattgaaagctatcattgaagtcccgctcaca -atgtgtcttttccagacggtttaactggttcccgggagtcctggagtttcgacttacata -aatggaaacaatgtattttgctaatttatctatagcgtcatttggaccaatacagaatat -tatgttgcctagtaatccactataacccgcaagtgctgatagaaaatttttagacgattt -ataaatgccccaagtatccctcccgtgaatcctccgttatactaattagtattcgttcat -acgtataccgcgcatatatgaacatttggcgataaggcgcgtgaattgttacgtgacaga -gatagcagtttcttgtgatatggttaacagacgtacatgaagggaaactttatatctata -gtgatgcttccgtagaaataccgccactggtctgccaatgatgaagtatgtagctttagg -tttgtactatgaggctttcgtttgtttgcagagtataacagttgcgagtgaaaaaccgac -gaatttatactaatacgctttcactattggctacaaaatagggaagagtttcaatcatga -gagggagtatatggatgctttgtagctaaaggtagaacgtatgtatatgctgccgttcat -tcttgaaagatacataagcgataagttacgacaattataagcaacatccctaccttcgta -acgatttcactgttactgcgcttgaaatacactatggggctattggcggagagaagcaga -tcgcgccgagcatatacgagacctataatgttgatgatagagaaggcgtctgaattgata -catcgaagtacactttctttcgtagtatctctcgtcctctttctatctccggacacaaga -attaagttatatatatagagtcttaccaatcatgttgaatcctgattctcagagttcttt -ggcgggccttgtgatgactgagaaacaatgcaatattgctccaaatttcctaagcaaatt -ctcggttatgttatgttatcagcaaagcgttacgttatgttatttaaatctggaatgacg -gagcgaagttcttatgtcggtgtgggaataattcttttgaagacagcactccttaaataa -tatcgctccgtgtttgtatttatcgaatgggtctgtaaccttgcacaagcaaatcggtgg -tgtatatatcggataacaattaatacgatgttcatagtgacagtatactgatcgagtcct -ctaaagtcaattacctcacttaacaatctcattgatgttgtgtcattcccggtatcgccc -gtagtatgtgctctgattgaccgagtgtgaaccaaggaacatctactaatgcctttgtta -ggtaagatctctctgaattccttcgtgccaacttaaaacattatcaaaatttcttctact -tggattaactacttttacgagcatggcaaattcccctgtggaagacggttcattattatc -ggaaaccttatagaaattgcgtgttgactgaaattagatttttattgtaagagttgcatc -tttgcgattcctctggtctagcttccaatgaacagtcctcccttctattcgacatcgggt -ccttcgtacatgtctttgcgatgtaataattaggttcggagtgtggccttaatgggtgca -actaggaatacaacgcaaatttgctgacatgatagcaaatcggtatgccggcaccaaaac -gtgctccttgcttagcttgtgaatgagactcagtagttaaataaatccatatctgcaatc -gattccacaggtattgtccactatctttgaactactctaagagatacaagcttagctgag -accgaggtgtatatgactacgctgatatctgtaaggtaccaatgcaggcaaagtatgcga -gaagctaataccggctgtttccagctttataagattaaaatttggctgtcctggcggcct -cagaattgttctatcgtaatcagttggttcattaattagctaagtacgaggtacaactta -tctgtcccagaacagctccacaagtttttttacagccgaaacccctgtgtgaatcttaat -atccaagcgcgttatctgattagagtttacaactcagtattttatcagtacgttttgttt -ccaacattacccggtatgacaaaatgacgccacgtgtcgaataatggtctgaccaatgta -ggaagtgaaaagataaatat diff --git a/extern/phmap/examples/knucleotide-input0.txt b/extern/phmap/examples/knucleotide-input0.txt deleted file mode 100644 index fd4414b..0000000 --- a/extern/phmap/examples/knucleotide-input0.txt +++ /dev/null @@ -1,4171 +0,0 @@ ->ONE Homo sapiens alu -GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA -TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT -AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG -GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG -CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT -GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA -GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA -TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG -AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA -GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT -AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC -AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG -GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC -CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG -AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT -TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA -TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT -GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG -TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT -CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG -CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG -TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA -CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG -AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG -GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC -TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA -TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA -GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT -GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC -ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT -TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC -CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG -CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG -GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC -CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT -GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC -GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA -GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA -GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA -GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG -AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT -CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA -GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA -AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC -GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT -ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG -GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC -GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC -GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG -TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA -AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG -GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT -CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC -TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG -ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC -GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA -ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA -CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA -CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA -ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG -CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG -AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC -CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG -AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC -CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG -CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG -CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG -CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC -ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA -AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC -TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC -ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG -CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG -AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT -AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA -TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC -CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA -TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG -CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT -GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG -GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG -CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG -GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG -GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT -AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT -GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT -CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG -GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC -TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT -CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG -ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG -CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG -AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA -CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG -CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC -ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC -GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC -GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG -GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT -TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG -CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA -GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG -CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC -GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG -CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA -CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG -CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA -ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC -CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT -GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA -AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG -ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC -TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA -GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC -GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG -TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC -AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA -ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA -GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC -AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG -TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC -CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT -GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC -CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA -GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT -TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC -ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC -TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG -GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG -TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG -GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC -GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT -ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC -GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC -GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC -CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA -ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG -AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC -TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT -CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG -TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG -CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC -GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT -GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC -CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC -TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG -CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG -AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG -AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG -AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT -GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA -TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC -AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA -AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG -CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC -TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG -GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT -CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG -CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG -GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA -AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA -GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC -TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC -CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA -GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG -CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG -AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG -ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC -ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC -AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC -GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG -GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT -CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC -GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC -CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA -GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA -GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG -GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT -CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA -AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG -CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC -CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG -GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG -GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT -TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA -ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG -CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA -ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA -GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG -TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC -GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA -GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT -GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT -GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG -TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT -TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC -TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC -GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT -CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC -TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA -GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG -GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT -GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT -ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG -GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG -CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA -CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT -CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC -GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC -TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG -GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC -AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG -GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG -CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG -GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG -ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG -GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA -AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC -CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG -TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA -AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG -GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA -CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG -AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG -CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG -GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT -CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA -AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG -AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC -CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT -GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA -CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG -TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA -CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC -AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC -TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA -CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC -CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA -GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC -GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA -GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC -CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC -TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC -CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC -CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA -CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA -AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT -GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA -CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC -TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA -GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA -GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT -CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC -TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT -CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC -CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG -GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG -GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC -GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG -GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG -TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA -ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG -CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC -AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG -GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT -CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC -GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA -TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC -GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA -GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC -AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC -AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA -CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG -CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG -AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG -GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT -GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC -GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG -CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC -CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG -CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC -GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC -TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC -CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA -CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC -AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG -AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA -GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA -TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT -AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG -GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG -CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT -GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA -GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA -TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG -AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA -GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT -AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC -AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG -GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC -CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG -AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT -TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA -TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT -GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG -TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT -CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG -CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG -TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA -CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG -AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG -GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC -TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA -TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA -GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT -GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC -ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT -TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC -CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG -CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG -GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC -CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT -GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC -GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA -GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA -GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA -GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG -AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT -CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA -GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA -AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC -GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT -ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG -GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC -GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC -GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG -TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA -AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG -GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT -CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC -TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG -ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC -GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA -ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA -CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA -CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA -ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG -CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG -AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC -CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG -AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC -CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG -CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG -CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG -CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC -ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA -AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC -TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC -ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG -CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG -AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT -AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA -TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC -CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA -TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG -CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT -GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG -GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG -CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG -GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG -GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT -AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT -GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT -CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG -GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC -TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT -CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG -ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG -CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG -AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA -CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG -CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC -ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC -GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC -GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG -GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT -TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG -CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA -GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG -CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC -GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG -CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA -CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG -CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA -ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC -CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT -GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA -AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG -ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC -TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA -GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC -GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG -TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC -AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA -ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA -GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC -AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG -TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC -CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT -GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC -CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA -GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT -TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC -ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC -TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG -GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG -TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG -GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC -GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT -ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC -GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC -GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC -CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA -ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG -AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC -TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT -CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG -TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG -CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC -GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT -GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC -CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC -TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG -CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG -AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG -AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG -AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT -GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA -TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC -AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA -AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG -CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC -TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG -GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT -CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG -CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG -GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA -AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA -GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC -TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC -CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA -GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG -CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG -AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG -ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC -ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC -AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC -GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG -GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT -CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC -GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC -CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA -GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA -GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG -GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT -CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA -AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG -CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC -CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG -GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG -GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT -TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA -ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG -CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA -ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA -GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG -TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC -GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA -GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT -GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT -GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG -TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT -TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC -TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC -GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT -CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC -TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA -GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG -GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT -GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT -ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG -GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG -CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA -CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT -CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC -GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC -TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG -GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC -AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG -GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG -CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG -GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG -ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG -GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA -AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC -CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG -TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA -AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG -GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA -CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG -AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG -CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG -GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT -CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA -AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG -AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC -CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT -GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA -CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG -TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA -CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC -AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC -TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA -CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC -CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA -GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC -GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA -GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC -CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC -TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC -CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC -CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA -CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA -AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT -GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA -CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC -TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA -GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA -GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT -CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC -TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT -CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC -CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG -GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG -GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC -GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG -GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG -TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA -ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG -CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC -AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG -GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT -CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC -GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA -TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC -GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA -GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC -AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC -AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA -CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG -CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG -AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG -GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT -GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC -GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG -CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC -CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG -CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC -GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC -TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC -CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA -CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC -AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG -AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA -GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA -TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT -AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG -GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG -CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT -GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA -GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA -TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG -AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA -GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT -AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC -AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG -GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC -CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG -AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT -TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA -TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT -GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG -TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT -CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG -CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG -TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA -CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG -AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG -GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC -TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA -TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA -GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT -GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC -ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT -TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC -CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG -CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG -GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC -CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT -GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC -GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA -GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA -GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA -GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG -AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT -CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA -GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA -AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC -GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT -ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG -GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC -GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC -GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG -TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA -AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG -GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT -CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC -TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG -ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC -GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA -ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA -CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA -CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA -ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG -CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG -AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC -CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG -AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC -CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG -CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG -CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG -CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC -ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA -AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC -TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC -ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG -CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG -AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT -AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA -TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC -CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA -TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG -CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT -GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG -GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG -CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG -GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG -GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT -AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT -GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT -CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG -GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC -TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT -CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG -ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG -CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG -AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA -CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG -CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC -ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC -GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC -GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG -GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT -TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG -CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA -GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG -CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC -GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG -CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA -CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG -CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA -ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC -CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT -GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA -AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG -ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC -TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA -GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC -GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG -TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC -AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA -ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA -GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC -AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG -TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC -CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT -GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC -CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA -GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT -TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC -ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC -TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG -GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG -TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG -GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC -GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT -ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC -GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC -GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC -CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA -ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG -AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC -TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT -CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG -TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG -CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC -GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT -GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC -CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC -TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG -CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG -AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG -AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG -AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT -GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA -TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC -AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA -AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG -CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC -TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG -GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT -CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG -CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG -GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA -AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA -GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC -TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC -CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA -GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG -CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG -AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG -ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC -ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC -AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC -GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG -GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT -CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC -GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC -CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA -GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA -GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG -GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT -CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA -AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG -CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC -CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG -GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG -GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT -TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA -ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG -CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA -ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA -GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG -TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC -GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA -GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT -GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT -GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG -TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT -TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC -TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC -GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT -CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC -TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA -GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG -GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT -GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT -ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG -GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG -CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA -CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT -CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC -GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC -TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG -GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC -AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG -GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG -CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG -GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG -ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG -GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA -AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC -CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG -TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA -AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG -GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA -CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG -AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG -CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG -GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT -CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA -AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG -AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC -CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT -GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA -CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG -TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA -CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC -AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC -TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA -CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC -CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA -GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC -GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA -GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC -CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC -TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC -CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC -CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA -CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA -AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT -GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA -CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC -TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA -GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA -GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT -CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC -TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT -CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC -CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG -GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG -GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC -GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG -GAGGCCGAGGCGGGCGGATC ->TWO IUB ambiguity codes -cttBtatcatatgctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcg -tactDtDagcctatttSVHtHttKtgtHMaSattgWaHKHttttagacatWatgtRgaaa -NtactMcSMtYtcMgRtacttctWBacgaaatatagScDtttgaagacacatagtVgYgt -cattHWtMMWcStgttaggKtSgaYaaccWStcgBttgcgaMttBYatcWtgacaYcaga -gtaBDtRacttttcWatMttDBcatWtatcttactaBgaYtcttgttttttttYaaScYa -HgtgttNtSatcMtcVaaaStccRcctDaataataStcYtRDSaMtDttgttSagtRRca -tttHatSttMtWgtcgtatSSagactYaaattcaMtWatttaSgYttaRgKaRtccactt -tattRggaMcDaWaWagttttgacatgttctacaaaRaatataataaMttcgDacgaSSt -acaStYRctVaNMtMgtaggcKatcttttattaaaaagVWaHKYagtttttatttaacct -tacgtVtcVaattVMBcttaMtttaStgacttagattWWacVtgWYagWVRctDattBYt -gtttaagaagattattgacVatMaacattVctgtBSgaVtgWWggaKHaatKWcBScSWa -accRVacacaaactaccScattRatatKVtactatatttHttaagtttSKtRtacaaagt -RDttcaaaaWgcacatWaDgtDKacgaacaattacaRNWaatHtttStgttattaaMtgt -tgDcgtMgcatBtgcttcgcgaDWgagctgcgaggggVtaaScNatttacttaatgacag -cccccacatYScaMgtaggtYaNgttctgaMaacNaMRaacaaacaKctacatagYWctg -ttWaaataaaataRattagHacacaagcgKatacBttRttaagtatttccgatctHSaat -actcNttMaagtattMtgRtgaMgcataatHcMtaBSaRattagttgatHtMttaaKagg -YtaaBataSaVatactWtataVWgKgttaaaacagtgcgRatatacatVtHRtVYataSa -KtWaStVcNKHKttactatccctcatgWHatWaRcttactaggatctataDtDHBttata -aaaHgtacVtagaYttYaKcctattcttcttaataNDaaggaaaDYgcggctaaWSctBa -aNtgctggMBaKctaMVKagBaactaWaDaMaccYVtNtaHtVWtKgRtcaaNtYaNacg -gtttNattgVtttctgtBaWgtaattcaagtcaVWtactNggattctttaYtaaagccgc -tcttagHVggaYtgtNcDaVagctctctKgacgtatagYcctRYHDtgBattDaaDgccK -tcHaaStttMcctagtattgcRgWBaVatHaaaataYtgtttagMDMRtaataaggatMt -ttctWgtNtgtgaaaaMaatatRtttMtDgHHtgtcattttcWattRSHcVagaagtacg -ggtaKVattKYagactNaatgtttgKMMgYNtcccgSKttctaStatatNVataYHgtNa -BKRgNacaactgatttcctttaNcgatttctctataScaHtataRagtcRVttacDSDtt -aRtSatacHgtSKacYagttMHtWataggatgactNtatSaNctataVtttRNKtgRacc -tttYtatgttactttttcctttaaacatacaHactMacacggtWataMtBVacRaSaatc -cgtaBVttccagccBcttaRKtgtgcctttttRtgtcagcRttKtaaacKtaaatctcac -aattgcaNtSBaaccgggttattaaBcKatDagttactcttcattVtttHaaggctKKga -tacatcBggScagtVcacattttgaHaDSgHatRMaHWggtatatRgccDttcgtatcga -aacaHtaagttaRatgaVacttagattVKtaaYttaaatcaNatccRttRRaMScNaaaD -gttVHWgtcHaaHgacVaWtgttScactaagSgttatcttagggDtaccagWattWtRtg -ttHWHacgattBtgVcaYatcggttgagKcWtKKcaVtgaYgWctgYggVctgtHgaNcV -taBtWaaYatcDRaaRtSctgaHaYRttagatMatgcatttNattaDttaattgttctaa -ccctcccctagaWBtttHtBccttagaVaatMcBHagaVcWcagBVttcBtaYMccagat -gaaaaHctctaacgttagNWRtcggattNatcRaNHttcagtKttttgWatWttcSaNgg -gaWtactKKMaacatKatacNattgctWtatctaVgagctatgtRaHtYcWcttagccaa -tYttWttaWSSttaHcaaaaagVacVgtaVaRMgattaVcDactttcHHggHRtgNcctt -tYatcatKgctcctctatVcaaaaKaaaagtatatctgMtWtaaaacaStttMtcgactt -taSatcgDataaactaaacaagtaaVctaggaSccaatMVtaaSKNVattttgHccatca -cBVctgcaVatVttRtactgtVcaattHgtaaattaaattttYtatattaaRSgYtgBag -aHSBDgtagcacRHtYcBgtcacttacactaYcgctWtattgSHtSatcataaatataHt -cgtYaaMNgBaatttaRgaMaatatttBtttaaaHHKaatctgatWatYaacttMctctt -ttVctagctDaaagtaVaKaKRtaacBgtatccaaccactHHaagaagaaggaNaaatBW -attccgStaMSaMatBttgcatgRSacgttVVtaaDMtcSgVatWcaSatcttttVatag -ttactttacgatcaccNtaDVgSRcgVcgtgaacgaNtaNatatagtHtMgtHcMtagaa -attBgtataRaaaacaYKgtRccYtatgaagtaataKgtaaMttgaaRVatgcagaKStc -tHNaaatctBBtcttaYaBWHgtVtgacagcaRcataWctcaBcYacYgatDgtDHccta -aagacYRcaggattHaYgtKtaatgcVcaataMYacccatatcacgWDBtgaatcBaata -cKcttRaRtgatgaBDacggtaattaaYtataStgVHDtDctgactcaaatKtacaatgc -gYatBtRaDatHaactgtttatatDttttaaaKVccYcaaccNcBcgHaaVcattHctcg -attaaatBtatgcaaaaatYMctSactHatacgaWacattacMBgHttcgaatVaaaaca -BatatVtctgaaaaWtctRacgBMaatSgRgtgtcgactatcRtattaScctaStagKga -DcWgtYtDDWKRgRtHatRtggtcgaHgggcgtattaMgtcagccaBggWVcWctVaaat -tcgNaatcKWagcNaHtgaaaSaaagctcYctttRVtaaaatNtataaccKtaRgtttaM -tgtKaBtRtNaggaSattHatatWactcagtgtactaKctatttgRYYatKatgtccgtR -tttttatttaatatVgKtttgtatgtNtataRatWYNgtRtHggtaaKaYtKSDcatcKg -taaYatcSRctaVtSMWtVtRWHatttagataDtVggacagVcgKWagBgatBtaaagNc -aRtagcataBggactaacacRctKgttaatcctHgDgttKHHagttgttaatgHBtatHc -DaagtVaBaRccctVgtgDtacRHSctaagagcggWYaBtSaKtHBtaaactYacgNKBa -VYgtaacttagtVttcttaatgtBtatMtMtttaattaatBWccatRtttcatagVgMMt -agctStKctaMactacDNYgKYHgaWcgaHgagattacVgtttgtRaSttaWaVgataat -gtgtYtaStattattMtNgWtgttKaccaatagNYttattcgtatHcWtctaaaNVYKKt -tWtggcDtcgaagtNcagatacgcattaagaccWctgcagcttggNSgaNcHggatgtVt -catNtRaaBNcHVagagaaBtaaSggDaatWaatRccaVgggStctDaacataKttKatt -tggacYtattcSatcttagcaatgaVBMcttDattctYaaRgatgcattttNgVHtKcYR -aatRKctgtaaacRatVSagctgtWacBtKVatctgttttKcgtctaaDcaagtatcSat -aWVgcKKataWaYttcccSaatgaaaacccWgcRctWatNcWtBRttYaattataaNgac -acaatagtttVNtataNaYtaatRaVWKtBatKagtaatataDaNaaaaataMtaagaaS -tccBcaatNgaataWtHaNactgtcDtRcYaaVaaaaaDgtttRatctatgHtgttKtga -aNSgatactttcgagWaaatctKaaDaRttgtggKKagcDgataaattgSaacWaVtaNM -acKtcaDaaatttctRaaVcagNacaScRBatatctRatcctaNatWgRtcDcSaWSgtt -RtKaRtMtKaatgttBHcYaaBtgatSgaSWaScMgatNtctcctatttctYtatMatMt -RRtSaattaMtagaaaaStcgVgRttSVaScagtgDtttatcatcatacRcatatDctta -tcatVRtttataaHtattcYtcaaaatactttgVctagtaaYttagatagtSYacKaaac -gaaKtaaatagataatSatatgaaatSgKtaatVtttatcctgKHaatHattagaaccgt -YaaHactRcggSBNgtgctaaBagBttgtRttaaattYtVRaaaattgtaatVatttctc -ttcatgBcVgtgKgaHaaatattYatagWacNctgaaMcgaattStagWaSgtaaKagtt -ttaagaDgatKcctgtaHtcatggKttVDatcaaggtYcgccagNgtgcVttttagagat -gctaccacggggtNttttaSHaNtatNcctcatSaaVgtactgBHtagcaYggYVKNgta -KBcRttgaWatgaatVtagtcgattYgatgtaatttacDacSctgctaaaStttaWMagD -aaatcaVYctccgggcgaVtaaWtStaKMgDtttcaaMtVgBaatccagNaaatcYRMBg -gttWtaaScKttMWtYataRaDBMaDataatHBcacDaaKDactaMgagttDattaHatH -taYatDtattDcRNStgaatattSDttggtattaaNSYacttcDMgYgBatWtaMagact -VWttctttgYMaYaacRgHWaattgRtaagcattctMKVStatactacHVtatgatcBtV -NataaBttYtSttacKgggWgYDtgaVtYgatDaacattYgatggtRDaVDttNactaSa -MtgNttaacaaSaBStcDctaccacagacgcaHatMataWKYtaYattMcaMtgSttDag -cHacgatcaHttYaKHggagttccgatYcaatgatRaVRcaagatcagtatggScctata -ttaNtagcgacgtgKaaWaactSgagtMYtcttccaKtStaacggMtaagNttattatcg -tctaRcactctctDtaacWYtgaYaSaagaWtNtatttRacatgNaatgttattgWDDcN -aHcctgaaHacSgaataaRaataMHttatMtgaSDSKatatHHaNtacagtccaYatWtc -actaactatKDacSaStcggataHgYatagKtaatKagStaNgtatactatggRHacttg -tattatgtDVagDVaRctacMYattDgtttYgtctatggtKaRSttRccRtaaccttaga -gRatagSaaMaacgcaNtatgaaatcaRaagataatagatactcHaaYKBctccaagaRa -BaStNagataggcgaatgaMtagaatgtcaKttaaatgtaWcaBttaatRcggtgNcaca -aKtttScRtWtgcatagtttWYaagBttDKgcctttatMggNttattBtctagVtacata -aaYttacacaaRttcYtWttgHcaYYtaMgBaBatctNgcDtNttacgacDcgataaSat -YaSttWtcctatKaatgcagHaVaacgctgcatDtgttaSataaaaYSNttatagtaNYt -aDaaaNtggggacttaBggcHgcgtNtaaMcctggtVtaKcgNacNtatVaSWctWtgaW -cggNaBagctctgaYataMgaagatBSttctatacttgtgtKtaattttRagtDtacata -tatatgatNHVgBMtKtaKaNttDHaagatactHaccHtcatttaaagttVaMcNgHata -tKtaNtgYMccttatcaaNagctggacStttcNtggcaVtattactHaSttatgNMVatt -MMDtMactattattgWMSgtHBttStStgatatRaDaagattttctatMtaaaaaggtac -taaVttaSacNaatactgMttgacHaHRttgMacaaaatagttaatatWKRgacDgaRta -tatttattatcYttaWtgtBRtWatgHaaattHataagtVaDtWaVaWtgStcgtMSgaS -RgMKtaaataVacataatgtaSaatttagtcgaaHtaKaatgcacatcggRaggSKctDc -agtcSttcccStYtccRtctctYtcaaKcgagtaMttttcRaYDttgttatctaatcata -NctctgctatcaMatactataggDaHaaSttMtaDtcNatataattctMcStaaBYtaNa -gatgtaatHagagSttgWHVcttatKaYgDctcttggtgttMcRaVgSgggtagacaata -aDtaattSaDaNaHaBctattgNtaccaaRgaVtKNtaaYggHtaKKgHcatctWtctDt -ttctttggSDtNtaStagttataaacaattgcaBaBWggHgcaaaBtYgctaatgaaatW -cDcttHtcMtWWattBHatcatcaaatctKMagtDNatttWaBtHaaaNgMttaaStagt -tctctaatDtcRVaYttgttMtRtgtcaSaaYVgSWDRtaatagctcagDgcWWaaaBaa -RaBctgVgggNgDWStNaNBKcBctaaKtttDcttBaaggBttgaccatgaaaNgttttt -tttatctatgttataccaaDRaaSagtaVtDtcaWatBtacattaWacttaSgtattggD -gKaaatScaattacgWcagKHaaccaYcRcaRttaDttRtttHgaHVggcttBaRgtccc -tDatKaVtKtcRgYtaKttacgtatBtStaagcaattaagaRgBagSaattccSWYttta -ttVaataNctgHgttaaNBgcVYgtRtcccagWNaaaacaDNaBcaaaaRVtcWMgBagM -tttattacgDacttBtactatcattggaaatVccggttRttcatagttVYcatYaSHaHc -ttaaagcNWaHataaaRWtctVtRYtagHtaaaYMataHYtNBctNtKaatattStgaMc -BtRgctaKtgcScSttDgYatcVtggaaKtaagatWccHccgKYctaNNctacaWctttt -gcRtgtVcgaKttcMRHgctaHtVaataaDtatgKDcttatBtDttggNtacttttMtga -acRattaaNagaactcaaaBBVtcDtcgaStaDctgaaaSgttMaDtcgttcaccaaaag -gWtcKcgSMtcDtatgtttStaaBtatagDcatYatWtaaaBacaKgcaDatgRggaaYc -taRtccagattDaWtttggacBaVcHtHtaacDacYgtaatataMagaatgHMatcttat -acgtatttttatattacHactgttataMgStYaattYaccaattgagtcaaattaYtgta -tcatgMcaDcgggtcttDtKgcatgWRtataatatRacacNRBttcHtBgcRttgtgcgt -catacMtttBctatctBaatcattMttMYgattaaVYatgDaatVagtattDacaacDMa -tcMtHcccataagatgBggaccattVWtRtSacatgctcaaggggYtttDtaaNgNtaaB -atggaatgtctRtaBgBtcNYatatNRtagaacMgagSaSDDSaDcctRagtVWSHtVSR -ggaacaBVaccgtttaStagaacaMtactccagtttVctaaRaaHttNcttagcaattta -ttaatRtaaaatctaacDaBttggSagagctacHtaaRWgattcaaBtctRtSHaNtgta -cattVcaHaNaagtataccacaWtaRtaaVKgMYaWgttaKggKMtKcgWatcaDatYtK -SttgtacgaccNctSaattcDcatcttcaaaDKttacHtggttHggRRaRcaWacaMtBW -VHSHgaaMcKattgtaRWttScNattBBatYtaNRgcggaagacHSaattRtttcYgacc -BRccMacccKgatgaacttcgDgHcaaaaaRtatatDtatYVtttttHgSHaSaatagct -NYtaHYaVYttattNtttgaaaYtaKttWtctaNtgagaaaNctNDctaaHgttagDcRt -tatagccBaacgcaRBtRctRtggtaMYYttWtgataatcgaataattattataVaaaaa -ttacNRVYcaaMacNatRttcKatMctgaagactaattataaYgcKcaSYaatMNctcaa -cgtgatttttBacNtgatDccaattattKWWcattttatatatgatBcDtaaaagttgaa -VtaHtaHHtBtataRBgtgDtaataMttRtDgDcttattNtggtctatctaaBcatctaR -atgNacWtaatgaagtcMNaacNgHttatactaWgcNtaStaRgttaaHacccgaYStac -aaaatWggaYaWgaattattcMaactcBKaaaRVNcaNRDcYcgaBctKaacaaaaaSgc -tccYBBHYaVagaatagaaaacagYtctVccaMtcgtttVatcaatttDRtgWctagtac -RttMctgtDctttcKtWttttataaatgVttgBKtgtKWDaWagMtaaagaaattDVtag -gttacatcatttatgtcgMHaVcttaBtVRtcgtaYgBRHatttHgaBcKaYWaatcNSc -tagtaaaaatttacaatcactSWacgtaatgKttWattagttttNaggtctcaagtcact -attcttctaagKggaataMgtttcataagataaaaatagattatDgcBVHWgaBKttDgc -atRHaagcaYcRaattattatgtMatatattgHDtcaDtcaaaHctStattaatHaccga -cNattgatatattttgtgtDtRatagSacaMtcRtcattcccgacacSattgttKaWatt -NHcaacttccgtttSRtgtctgDcgctcaaMagVtBctBMcMcWtgtaacgactctcttR -ggRKSttgYtYatDccagttDgaKccacgVatWcataVaaagaataMgtgataaKYaaat -cHDaacgataYctRtcYatcgcaMgtNttaBttttgatttaRtStgcaacaaaataccVg -aaDgtVgDcStctatatttattaaaaRKDatagaaagaKaaYYcaYSgKStctccSttac -agtcNactttDVttagaaagMHttRaNcSaRaMgBttattggtttaRMggatggcKDgWR -tNaataataWKKacttcKWaaagNaBttaBatMHtccattaacttccccYtcBcYRtaga -ttaagctaaYBDttaNtgaaaccHcaRMtKtaaHMcNBttaNaNcVcgVttWNtDaBatg -ataaVtcWKcttRggWatcattgaRagHgaattNtatttctctattaattaatgaDaaMa -tacgttgggcHaYVaaNaDDttHtcaaHtcVVDgBVagcMacgtgttaaBRNtatRtcag -taagaggtttaagacaVaaggttaWatctccgtVtaDtcDatttccVatgtacNtttccg -tHttatKgScBatgtVgHtYcWagcaKtaMYaaHgtaattaSaHcgcagtWNaatNccNN -YcacgVaagaRacttctcattcccRtgtgtaattagcSttaaStWaMtctNNcSMacatt -ataaactaDgtatWgtagtttaagaaaattgtagtNagtcaataaatttgatMMYactaa -tatcggBWDtVcYttcDHtVttatacYaRgaMaacaStaatcRttttVtagaDtcacWat -ttWtgaaaagaaagNRacDtttStVatBaDNtaactatatcBSMcccaSttccggaMatg -attaaWatKMaBaBatttgataNctgttKtVaagtcagScgaaaDggaWgtgttttKtWt -atttHaatgtagttcactaaKMagttSYBtKtaYgaactcagagRtatagtVtatcaaaW -YagcgNtaDagtacNSaaYDgatBgtcgataacYDtaaactacagWDcYKaagtttatta -gcatcgagttKcatDaattgattatDtcagRtWSKtcgNtMaaaaacaMttKcaWcaaSV -MaaaccagMVtaMaDtMaHaBgaacataBBVtaatVYaNSWcSgNtDNaaKacacBttta -tKtgtttcaaHaMctcagtaacgtcgYtactDcgcctaNgagagcYgatattttaaattt -ccattttacatttDaaRctattttWctttacgtDatYtttcagacgcaaVttagtaaKaa -aRtgVtccataBggacttatttgtttaWNtgttVWtaWNVDaattgtatttBaagcBtaa -BttaaVatcHcaVgacattccNggtcgacKttaaaRtagRtctWagaYggtgMtataatM -tgaaRttattttgWcttNtDRRgMDKacagaaaaggaaaRStcccagtYccVattaNaaK -StNWtgacaVtagaagcttSaaDtcacaacgDYacWDYtgtttKatcVtgcMaDaSKStV -cgtagaaWaKaagtttcHaHgMgMtctataagBtKaaaKKcactggagRRttaagaBaaN -atVVcgRcKSttDaactagtSttSattgttgaaRYatggttVttaataaHttccaagDtg -atNWtaagHtgcYtaactRgcaatgMgtgtRaatRaNaacHKtagactactggaatttcg -ccataacgMctRgatgttaccctaHgtgWaYcactcacYaattcttaBtgacttaaacct -gYgaWatgBttcttVttcgttWttMcNYgtaaaatctYgMgaaattacNgaHgaacDVVM -tttggtHtctaaRgtacagacgHtVtaBMNBgattagcttaRcttacaHcRctgttcaaD -BggttKaacatgKtttYataVaNattccgMcgcgtagtRaVVaattaKaatggttRgaMc -agtatcWBttNtHagctaatctagaaNaaacaYBctatcgcVctBtgcaaagDgttVtga -HtactSNYtaaNccatgtgDacgaVtDcgKaRtacDcttgctaagggcagMDagggtBWR -tttSgccttttttaacgtcHctaVtVDtagatcaNMaVtcVacatHctDWNaataRgcgt -aVHaggtaaaaSgtttMtattDgBtctgatSgtRagagYtctSaKWaataMgattRKtaa -catttYcgtaacacattRWtBtcggtaaatMtaaacBatttctKagtcDtttgcBtKYYB -aKttctVttgttaDtgattttcttccacttgSaaacggaaaNDaattcYNNaWcgaaYat -tttMgcBtcatRtgtaaagatgaWtgaccaYBHgaatagataVVtHtttVgYBtMctaMt -cctgaDcYttgtccaaaRNtacagcMctKaaaggatttacatgtttaaWSaYaKttBtag -DacactagctMtttNaKtctttcNcSattNacttggaacaatDagtattRtgSHaataat -gccVgacccgatactatccctgtRctttgagaSgatcatatcgDcagWaaHSgctYYWta -tHttggttctttatVattatcgactaagtgtagcatVgtgHMtttgtttcgttaKattcM -atttgtttWcaaStNatgtHcaaaDtaagBaKBtRgaBgDtSagtatMtaacYaatYtVc -KatgtgcaacVaaaatactKcRgtaYtgtNgBBNcKtcttaccttKgaRaYcaNKtactt -tgagSBtgtRagaNgcaaaNcacagtVtttHWatgttaNatBgtttaatNgVtctgaata -tcaRtattcttttttttRaaKcRStctcggDgKagattaMaaaKtcaHacttaataataK -taRgDtKVBttttcgtKaggHHcatgttagHggttNctcgtatKKagVagRaaaggaaBt -NatttVKcRttaHctaHtcaaatgtaggHccaBataNaNaggttgcWaatctgatYcaaa -HaatWtaVgaaBttagtaagaKKtaaaKtRHatMaDBtBctagcatWtatttgWttVaaa -ScMNattRactttgtYtttaaaagtaagtMtaMaSttMBtatgaBtttaKtgaatgagYg -tNNacMtcNRacMMHcttWtgtRtctttaacaacattattcYaMagBaacYttMatcttK -cRMtgMNccattaRttNatHaHNaSaaHMacacaVaatacaKaSttHatattMtVatWga -ttttttaYctttKttHgScWaacgHtttcaVaaMgaacagNatcgttaacaaaaagtaca -HBNaattgttKtcttVttaaBtctgctacgBgcWtttcaggacacatMgacatcccagcg -gMgaVKaBattgacttaatgacacacaaaaaatRKaaBctacgtRaDcgtagcVBaacDS -BHaaaaSacatatacagacRNatcttNaaVtaaaataHattagtaaaaSWccgtatWatg -gDttaactattgcccatcttHaSgYataBttBaactattBtcHtgatcaataSttaBtat -KSHYttWggtcYtttBttaataccRgVatStaHaKagaatNtagRMNgtcttYaaSaact -cagDSgagaaYtMttDtMRVgWKWtgMaKtKaDttttgactatacataatcNtatNaHat -tVagacgYgatatatttttgtStWaaatctWaMgagaRttRatacgStgattcttaagaD -taWccaaatRcagcagaaNKagtaaDggcgccBtYtagSBMtactaaataMataBSacRM -gDgattMMgtcHtcaYDtRaDaacggttDaggcMtttatgttaNctaattaVacgaaMMt -aatDccSgtattgaRtWWaccaccgagtactMcgVNgctDctaMScatagcgtcaactat -acRacgHRttgctatttaatgaattataYKttgtaagWgtYttgcHgMtaMattWaWVta -RgcttgYgttBHtYataSccStBtgtagMgtDtggcVaaSBaatagDttgBgtctttctc -attttaNagtHKtaMWcYactVcgcgtatMVtttRacVagDaatcttgctBBcRDgcaac -KttgatSKtYtagBMagaRtcgBattHcBWcaactgatttaatttWDccatttatcgagS -KaWttataHactaHMttaatHtggaHtHagaatgtKtaaRactgtttMatacgatcaagD -gatKaDctataMggtHDtggHacctttRtatcttYattttgacttgaaSaataaatYcgB -aaaaccgNatVBttMacHaKaataagtatKgtcaagactcttaHttcggaattgttDtct -aaccHttttWaaatgaaatataaaWattccYDtKtaaaacggtgaggWVtctattagtga -ctattaagtMgtttaagcatttgSgaaatatccHaaggMaaaattttcWtatKctagDtY -tMcctagagHcactttactatacaaacattaacttaHatcVMYattYgVgtMttaaRtga -aataaDatcaHgtHHatKcDYaatcttMtNcgatYatgSaMaNtcttKcWataScKggta -tcttacgcttWaaagNatgMgHtctttNtaacVtgttcMaaRatccggggactcMtttaY -MtcWRgNctgNccKatcttgYDcMgattNYaRagatHaaHgKctcataRDttacatBatc -cattgDWttatttaWgtcggagaaaaatacaatacSNtgggtttccttacSMaagBatta -caMaNcactMttatgaRBacYcYtcaaaWtagctSaacttWgDMHgaggatgBVgcHaDt -ggaactttggtcNatNgtaKaBcccaNtaagttBaacagtatacDYttcctNgWgcgSMc -acatStctHatgRcNcgtacacaatRttMggaNKKggataaaSaYcMVcMgtaMaHtgat -tYMatYcggtcttcctHtcDccgtgRatcattgcgccgatatMaaYaataaYSggatagc -gcBtNtaaaScaKgttBgagVagttaKagagtatVaactaSacWactSaKatWccaKaaa -atBKgaaKtDMattttgtaaatcRctMatcaaMagMttDgVatggMaaWgttcgaWatga -aatttgRtYtattaWHKcRgctacatKttctaccaaHttRatctaYattaaWatVNccat -NgagtcKttKataStRaatatattcctRWatDctVagttYDgSBaatYgttttgtVaatt -taatagcagMatRaacttBctattgtMagagattaaactaMatVtHtaaatctRgaaaaa -aaatttWacaacaYccYDSaattMatgaccKtaBKWBattgtcaagcHKaagttMMtaat -ttcKcMagNaaKagattggMagaggtaatttYacatcWaaDgatMgKHacMacgcVaaca -DtaDatatYggttBcgtatgWgaSatttgtagaHYRVacaRtctHaaRtatgaactaata -tctSSBgggaaHMWtcaagatKgagtDaSatagttgattVRatNtctMtcSaagaSHaat -aNataataRaaRgattctttaataaagWaRHcYgcatgtWRcttgaaggaMcaataBRaa -ccagStaaacNtttcaatataYtaatatgHaDgcStcWttaacctaRgtYaRtataKtgM -ttttatgactaaaatttacYatcccRWtttHRtattaaatgtttatatttgttYaatMca -RcSVaaDatcgtaYMcatgtagacatgaaattgRtcaaYaaYtRBatKacttataccaNa -aattVaBtctggacaagKaaYaaatatWtMtatcYaaVNtcgHaactBaagKcHgtctac -aatWtaDtSgtaHcataHtactgataNctRgttMtDcDttatHtcgtacatcccaggStt -aBgtcacacWtccNMcNatMVaVgtccDYStatMaccDatggYaRKaaagataRatttHK -tSaaatDgataaacttaHgttgVBtcttVttHgDacgaKatgtatatNYataactctSat -atatattgcHRRYttStggaactHgttttYtttaWtatMcttttctatctDtagVHYgMR -BgtHttcctaatYRttKtaagatggaVRataKDctaMtKBNtMtHNtWtttYcVtattMc -gRaacMcctNSctcatttaaagDcaHtYccSgatgcaatYaaaaDcttcgtaWtaattct -cgttttScttggtaatctttYgtctaactKataHacctMctcttacHtKataacacagcN -RatgKatttttSaaatRYcgDttaMRcgaaattactMtgcgtaagcgttatBtttttaat -taagtNacatHgttcRgacKcBBtVgatKttcgaBaatactDRgtRtgaNacWtcacYtt -aaKcgttctHaKttaNaMgWgWaggtctRgaKgWttSttBtDcNtgtttacaaatYcDRt -gVtgcctattcNtctaaaDMNttttNtggctgagaVctDaacVtWccaagtaacacaNct -gaScattccDHcVBatcgatgtMtaatBgHaatDctMYgagaatgYWKcctaatNaStHa -aaKccgHgcgtYaaYtattgtStgtgcaaRtattaKatattagaWVtcaMtBagttatta -gNaWHcVgcaattttDcMtgtaRHVYtHtctgtaaaaHVtMKacatcgNaatttMatatg -ttgttactagWYtaRacgataKagYNKcattataNaRtgaacKaYgcaaYYacaNccHat -MatDcNgtHttRaWttagaaDcaaaaaatagggtKDtStaDaRtaVtHWKNtgtattVct -SVgRgataDaRaWataBgaagaaKtaataaYgDcaStaNgtaDaaggtattHaRaWMYaY -aWtggttHYgagVtgtgcttttcaaDKcagVcgttagacNaaWtagtaataDttctggtt -VcatcataaagtgKaaaNaMtaBBaattaatWaattgctHaVKaSgDaaVKaHtatatat -HatcatSBagNgHtatcHYMHgttDgtaHtBttWatcgtttaRaattgStKgSKNWKatc -agDtctcagatttctRtYtBatBgHHtKaWtgYBgacVVWaKtacKcDttKMaKaVcggt -gttataagaataaHaatattagtataatMHgttYgaRttagtaRtcaaVatacggtcMcg -agtaaRttacWgactKRYataaaagSattYaWgagatYagKagatgSaagKgttaatMgg -tataatgttWYttatgagaaacctNVataatHcccKtDctcctaatactggctHggaSag -gRtKHaWaattcgSatMatttagaggcYtctaMcgctcataSatatgRagacNaaDagga -VBagaYttKtacNaKgtSYtagttggaWcatcWttaatctatgaVtcgtgtMtatcaYcg -tRccaaYgDctgcMgtgtWgacWtgataacacgcgctBtgttaKtYDtatDcatcagKaV -MctaatcttgVcaaRgcRMtDcgattaHttcaNatgaatMtactacVgtRgatggaWttt -actaaKatgagSaaKggtaNtactVaYtaaKRagaacccacaMtaaMtKtatBcttgtaa -WBtMctaataaVcDaaYtcRHBtcgttNtaaHatttBNgRStVDattBatVtaagttaYa -tVattaagaBcacggtSgtVtatttaRattgatgtaHDKgcaatattKtggcctatgaWD -KRYcggattgRctatNgatacaatMNttctgtcRBYRaaaHctNYattcHtaWcaattct -BtMKtVgYataatMgYtcagcttMDataVtggRtKtgaatgccNcRttcaMtRgattaac -attRcagcctHtWMtgtDRagaKaBtgDttYaaaaKatKgatctVaaYaacWcgcatagB -VtaNtRtYRaggBaaBtgKgttacataagagcatgtRattccacttaccatRaaatgWgD -aMHaYVgVtaSctatcgKaatatattaDgacccYagtgtaYNaaatKcagtBRgagtcca -tgKgaaaccBgaagBtgSttWtacgatWHaYatcgatttRaaNRgcaNaKVacaNtDgat -tgHVaatcDaagcgtatgcNttaDataatcSataaKcaataaHWataBtttatBtcaKtK -tatagttaDgSaYctacaRatNtaWctSaatatttYaKaKtaccWtatcRagacttaYtt -VcKgSDcgagaagatccHtaattctSttatggtKYgtMaHagVaBRatttctgtRgtcta -tgggtaHKgtHacHtSYacgtacacHatacKaaBaVaccaDtatcSaataaHaagagaat -ScagactataaRttagcaaVcaHataKgDacatWccccaagcaBgagWatctaYttgaaa -tctVNcYtttWagHcgcgcDcVaaatgttKcHtNtcaatagtgtNRaactttttcaatgg -WgBcgDtgVgtttctacMtaaataaaRggaaacWaHttaRtNtgctaaRRtVBctYtVta -tDcattDtgaccYatagatYRKatNYKttNgcctagtaWtgaactaMVaacctgaStttc -tgaKVtaaVaRKDttVtVctaDNtataaaDtccccaagtWtcgatcactDgYaBcatcct -MtVtacDaaBtYtMaKNatNtcaNacgDatYcatcgcaRatWBgaacWttKttagYtaat -tcggttgSWttttDWctttacYtatatWtcatDtMgtBttgRtVDggttaacYtacgtac -atgaattgaaWcttMStaDgtatattgaDtcRBcattSgaaVBRgagccaaKtttcDgcg -aSMtatgWattaKttWtgDBMaggBBttBaatWttRtgcNtHcgttttHtKtcWtagHSt -aacagttgatatBtaWSaWggtaataaMttaKacDaatactcBttcaatatHttcBaaSa -aatYggtaRtatNtHcaatcaHtagVtgtattataNggaMtcttHtNagctaaaggtaga -YctMattNaMVNtcKtactBKcaHHcBttaSagaKacataYgctaKaYgttYcgacWVtt -WtSagcaacatcccHaccKtcttaacgaKttcacKtNtacHtatatRtaaatacactaBt -ttgaHaRttggttWtatYagcatYDatcggagagcWBataagRtacctataRKgtBgatg -aDatataSttagBaHtaatNtaDWcWtgtaattacagKttcNtMagtattaNgtctcgtc -ctcttBaHaKcKccgtRcaaYagSattaagtKataDatatatagtcDtaacaWHcaKttD -gaaRcgtgYttgtcatatNtatttttatggccHtgDtYHtWgttatYaacaattcaWtat -NgctcaaaSttRgctaatcaaatNatcgtttaBtNNVtgttataagcaaagattBacgtD -atttNatttaaaDcBgtaSKgacgtagataatttcHMVNttgttBtDtgtaWKaaRMcKM -tHtaVtagataWctccNNaSWtVaHatctcMgggDgtNHtDaDttatatVWttgttattt -aacctttcacaaggaSaDcggttttttatatVtctgVtaacaStDVaKactaMtttaSNa -gtgaaattaNacttSKctattcctctaSagKcaVttaagNaVcttaVaaRNaHaaHttat -gtHttgtgatMccaggtaDcgaccgtWgtWMtttaHcRtattgScctatttKtaaccaag -tYagaHgtWcHaatgccKNRtttagtMYSgaDatctgtgaWDtccMNcgHgcaaacNDaa -aRaStDWtcaaaaHKtaNBctagBtgtattaactaattttVctagaatggcWSatMaccc -ttHttaSgSgtgMRcatRVKtatctgaaaccDNatYgaaVHNgatMgHRtacttaaaRta -tStRtDtatDttYatattHggaBcttHgcgattgaKcKtttcRataMtcgaVttWacatN -catacctRataDDatVaWNcggttgaHtgtMacVtttaBHtgagVttMaataattatgtt -cttagtttgtgcDtSatttgBtcaacHattaaBagVWcgcaSYttMgcttacYKtVtatc -aYaKctgBatgcgggcYcaaaaacgNtctagKBtattatctttKtaVttatagtaYtRag -NtaYataaVtgaatatcHgcaaRataHtacacatgtaNtgtcgYatWMatttgaactacR -ctaWtWtatacaatctBatatgYtaagtatgtgtatSttactVatcttYtaBcKgRaSgg -RaaaaatgcagtaaaWgtaRgcgataatcBaataccgtatttttccatcNHtatWYgatH -SaaaDHttgctgtccHtggggcctaataatttttctatattYWtcattBtgBRcVttaVM -RSgctaatMagtYtttaaaaatBRtcBttcaaVtaacagctccSaaSttKNtHtKYcagc -agaaaccccRtttttaaDcDtaStatccaagcgctHtatcttaDRYgatDHtWcaaaBcW -gKWHttHataagHacgMNKttMKHccaYcatMVaacgttaKgYcaVaaBtacgcaacttt -MctaaHaatgtBatgagaSatgtatgSRgHgWaVWgataaatatttccKagVgataattW -aHNcYggaaatgctHtKtaDtctaaagtMaatVDVactWtSaaWaaMtaHtaSKtcBRaN -cttStggtBttacNagcatagRgtKtgcgaacaacBcgKaatgataagatgaaaattgta -ctgcgggtccHHWHaaNacaBttNKtKtcaaBatatgctaHNgtKcDWgtttatNgVDHg -accaacWctKaaggHttgaRgYaatHcaBacaatgagcaaattactgtaVaaYaDtagat -tgagNKggtggtgKtWKaatacagDRtatRaMRtgattDggtcaaYRtatttNtagaDtc -acaaSDctDtataatcgtactaHttatacaatYaacaaHttHatHtgcgatRRttNgcat -SVtacWWgaaggagtatVMaVaaattScDDKNcaYBYaDatHgtctatBagcaacaagaa -tgagaaRcataaKNaRtBDatcaaacgcattttttaaBtcSgtacaRggatgtMNaattg -gatatWtgagtattaaaVctgcaYMtatgatttttYgaHtgtcttaagWBttHttgtctt -attDtcgtatWtataataSgctaHagcDVcNtaatcaagtaBDaWaDgtttagYctaNcc -DtaKtaHcttaataacccaRKtacaVaatNgcWRaMgaattatgaBaaagattVYaHMDc -aDHtcRcgYtcttaaaWaaaVKgatacRtttRRKYgaatacaWVacVcRtatMacaBtac -tggMataaattttHggNagSctacHgtBagcgtcgtgattNtttgatSaaggMttctttc -ttNtYNagBtaaacaaatttMgaccttacataattgYtcgacBtVMctgStgMDtagtaR -ctHtatgttcatatVRNWataDKatWcgaaaaagttaaaagcacgHNacgtaatctttMR -tgacttttDacctataaacgaaatatgattagaactccSYtaBctttaataacWgaaaYa -tagatgWttcatKtNgatttttcaagHtaYgaaRaDaagtaggagcttatVtagtctttc -attaaaatcgKtattaRttacagVaDatgcatVgattgggtctttHVtagKaaRBtaHta -aggccccaaaaKatggtttaMWgtBtaaacttcactttKHtcgatctccctaYaBacMgt -cttBaBaNgcgaaacaatctagtHccHtKttcRtRVttccVctttcatacYagMVtMcag -aMaaacaataBctgYtaatRaaagattaaccatVRatHtaRagcgcaBcgDttStttttc -VtttaDtKgcaaWaaaaatSccMcVatgtKgtaKgcgatatgtagtSaaaDttatacaaa -catYaRRcVRHctKtcgacKttaaVctaDaatgttMggRcWaacttttHaDaKaDaBctg -taggcgtttaHBccatccattcNHtDaYtaataMttacggctNVaacDattgatatttta -cVttSaattacaaRtataNDgacVtgaacataVRttttaDtcaaacataYDBtttaatBa -DtttYDaDaMccMttNBttatatgagaaMgaNtattHccNataattcaHagtgaaggDga -tgtatatatgYatgaStcataaBStWacgtcccataRMaaDattggttaaattcMKtctM -acaBSactcggaatDDgatDgcWctaacaccgggaVcacWKVacggtaNatatacctMta -tgatagtgcaKagggVaDtgtaacttggagtcKatatcgMcttRaMagcattaBRaStct -YSggaHYtacaactMBaagDcaBDRaaacMYacaHaattagcattaaaHgcgctaaggSc -cKtgaaKtNaBtatDDcKBSaVtgatVYaagVtctSgMctacgttaacWaaattctSgtD -actaaStaaattgcagBBRVctaatatacctNttMcRggctttMttagacRaHcaBaacV -KgaataHttttMgYgattcYaNRgttMgcVaaacaVVcDHaatttgKtMYgtatBtVVct -WgVtatHtacaaHttcacgatagcagtaaNattBatatatttcVgaDagcggttMaagtc -ScHagaaatgcYNggcgtttttMtStggtRatctacttaaatVVtBacttHNttttaRca -aatcacagHgagagtMgatcSWaNRacagDtatactaaDKaSRtgattctccatSaaRtt -aaYctacacNtaRtaactggatgaccYtacactttaattaattgattYgttcagDtNKtt -agDttaaaaaaaBtttaaNaYWKMBaaaacVcBMtatWtgBatatgaacVtattMtYatM -NYDKNcKgDttDaVtaaaatgggatttctgtaaatWtctcWgtVVagtcgRgacttcccc -taDcacagcRcagagtgtWSatgtacatgttaaSttgtaaHcgatgggMagtgaacttat -RtttaVcaccaWaMgtactaatSSaHtcMgaaYtatcgaaggYgggcgtgaNDtgttMNg -aNDMtaattcgVttttaacatgVatgtWVMatatcaKgaaattcaBcctccWcttgaaWH -tWgHtcgNWgaRgctcBgSgaattgcaaHtgattgtgNagtDttHHgBttaaWcaaWagc -aSaHHtaaaVctRaaMagtaDaatHtDMtcVaWMtagSagcttHSattaacaaagtRacM -tRtctgttagcMtcaBatVKtKtKacgagaSNatSactgtatatcBctgagVtYactgta -aattaaaggcYgDHgtaacatSRDatMMccHatKgttaacgactKtgKagtcttcaaHRV -tccttKgtSataatttacaactggatDNgaacttcaRtVaagDcaWatcBctctHYatHa -DaaatttagYatSatccaWtttagaaatVaacBatHcatcgtacaatatcgcNYRcaata -YaRaYtgattVttgaatgaVaactcRcaNStgtgtattMtgaggtNttBaDRcgaaaagc -tNgBcWaWgtSaDcVtgVaatMKBtttcgtttctaaHctaaagYactgMtatBDtcStga -ccgtSDattYaataHctgggaYYttcggttaWaatctggtRagWMaDagtaacBccacta -cgHWMKaatgatWatcctgHcaBaSctVtcMtgtDttacctaVgatYcWaDRaaaaRtag -atcgaMagtggaRaWctctgMgcWttaagKBRtaaDaaWtctgtaagYMttactaHtaat -cttcataacggcacBtSgcgttNHtgtHccatgttttaaagtatcgaKtMttVcataYBB -aKtaMVaVgtattNDSataHcagtWMtaggtaSaaKgttgBtVtttgttatcatKcgHac -acRtctHatNVagSBgatgHtgaRaSgttRcctaacaaattDNttgacctaaYtBgaaaa -tagttattactcttttgatgtNNtVtgtatMgtcttRttcatttgatgacacttcHSaaa -ccaWWDtWagtaRDDVNacVaRatgttBccttaatHtgtaaacStcVNtcacaSRttcYa -gacagaMMttttgMcNttBcgWBtactgVtaRttctccaaYHBtaaagaBattaYacgat -ttacatctgtaaMKaRYtttttactaaVatWgctBtttDVttctggcDaHaggDaagtcg -aWcaagtagtWttHtgKtVataStccaMcWcaagataagatcactctHatgtcYgaKcat -cagatactaagNSStHcctRRNtattgtccttagttagMVgtatagactaactctVcaat -MctgtttgtgttgccttatWgtaBVtttctggMcaaKgDWtcgtaaYStgSactatttHg -atctgKagtagBtVacRaagRtMctatgggcaaaKaaaatacttcHctaRtgtDcttDat -taggaaatttcYHaRaaBttaatggcacKtgctHVcaDcaaaVDaaaVcgMttgtNagcg -taDWgtcgttaatDgKgagcSatatcSHtagtagttggtgtHaWtaHKtatagctgtVga -ttaBVaatgaataagtaatVatSttaHctttKtttgtagttaccttaatcgtagtcctgB -cgactatttVcMacHaaaggaatgDatggKtaHtgStatattaaSagctWcctccRtata -BaDYcgttgcNaagaggatRaaaYtaWgNtSMcaatttactaacatttaaWttHtatBat -tgtcgacaatNgattgcNgtMaaaKaBDattHacttggtRtttaYaacgVactBtaBaKt -gBttatgVttgtVttcaatcWcNctDBaaBgaDHacBttattNtgtDtatttVSaaacag -gatgcRatSgtaSaNtgBatagttcHBgcBBaaattaHgtDattatDaKaatBaaYaaMa -ataaataKtttYtagtBgMatNcatgtttgaNagtgttgtgKaNaSagtttgaSMaYBca -aaacDStagttVacaaaaactaaWttBaagtctgtgcgtMgtaattctcctacctcaNtt -taaccaaaaVtBcacataacaccccBcWMtatVtggaatgaWtcaaWaaaaaaaaWtDta -atatRcctDWtcctaccMtVVatKttaWaaKaaatataaagScHBagaggBaSMtaWaVt -atattactSaaaKNaactatNatccttgaYctattcaaaVgatttYHcRagattttaSat -aggttattcVtaaagaKgtattattKtRttNcggcRgtgtgtWYtaacHgKatKgatYta -cYagDtWcHBDctctgRaYKaYagcactKcacSaRtBttttBHKcMtNtcBatttatttt -tgSatVgaaagaWtcDtagDatatgMacaacRgatatatgtttgtKtNRaatatNatgYc -aHtgHataacKtgagtagtaacYttaNccaaatHcacaacaVDtagtaYtccagcattNt -acKtBtactaaagaBatVtKaaHBctgStgtBgtatgaSNtgDataaccctgtagcaBgt -gatcttaDataStgaMaccaSBBgWagtacKcgattgaDgNNaaaacacagtSatBacKD -gcgtataBKcatacactaSaatYtYcDaactHttcatRtttaatcaattataRtttgtaa -gMcgNttcatcBtYBagtNWNMtSHcattcRctttttRWgaKacKttgggagBcgttcgc -MaWHtaatactgtctctatttataVgtttaBScttttaBMaNaatMacactYtBMggtHa -cMagtaRtctgcatttaHtcaaaatttgagKtgNtactBacaHtcgtatttctMaSRagc -agttaatgtNtaaattgagagWcKtaNttagVtacgatttgaatttcgRtgtWcVatcgt -taaDVctgtttBWgaccagaaagtcSgtVtatagaBccttttcctaaattgHtatcggRa -ttttcaaggcYSKaagWaWtRactaaaacccBatMtttBaatYtaagaactSttcgaaSc -aatagtattgaccaagtgttttctaacatgtttNVaatcaaagagaaaNattaaRtttta -VaaaccgcaggNMtatattVctcaagaggaacgBgtttaacaagttcKcYaatatactaa -ccBaaaSggttcNtattctagttRtBacgScVctcaatttaatYtaaaaaaatgSaatga -tagaMBRatgRcMcgttgaWHtcaVYgaatYtaatctttYttatRaWtctgBtDcgatNa -tcKaBaDgatgtaNatWKctccgatattaacattNaaacDatgBgttctgtDtaaaMggt -gaBaSHataacgccSctaBtttaRBtcNHcDatcDcctagagtcRtaBgWttDRVHagat -tYatgtatcWtaHtttYcattWtaaagtctNgtStggRNcgcggagSSaaagaaaatYcH -DtcgctttaatgYcKBVSgtattRaYBaDaaatBgtatgaHtaaRaRgcaSWNtagatHa -acttNctBtcaccatctMcatattccaSatttgcgaDagDgtatYtaaaVDtaagtttWV -aagtagYatRttaagDcNgacKBcScagHtattatcDaDactaaaaaYgHttBcgaDttg -gataaaKSRcBMaBcgaBSttcWtgNBatRaccgattcatttataacggHVtaattcaca -agagVttaaRaatVVRKcgWtVgacctgDgYaaHaWtctttcacMagggatVgactagMa -aataKaaNWagKatagNaaWtaaaatttgaattttatttgctaaVgaHatBatcaaBWcB -gttcMatcgBaaNgttcgSNaggSaRtttgHtRtattaNttcDcatSaVttttcgaaaaa -ttgHatctaRaggSaNatMDaaatDcacgattttagaHgHaWtYgattaatHNSttatMS -gggNtcKtYatRggtttgtMWVtttaYtagcagBagHaYagttatatggtBacYcattaR -SataBatMtttaaatctHcaaaSaaaagttNSaaWcWRccRtKaagtBWtcaaattSttM -tattggaaaccttaacgttBtWatttatatWcDaatagattcctScacctaagggRaaYt -aNaatgVtBcttaaBaacaMVaaattatStYgRcctgtactatcMcVKatttcgSgatRH -MaaaHtagtaaHtVgcaaataatatcgKKtgccaatBNgaaWcVttgagttaKatagttc -aggKDatDtattgaKaVcaKtaataDataataHSaHcattagttaatRVYcNaHtaRcaa -ggtNHcgtcaaccaBaaagYtHWaaaRcKgaYaaDttgcWYtataRgaatatgtYtgcKt -aNttWacatYHctRaDtYtattcBttttatcSataYaYgttWaRagcacHMgtttHtYtt -YaatcggtatStttcgtRSattaaDaKMaatatactaNBaWgctacacYtgaYVgtgHta -aaRaaRgHtagtWattataaaSDaaWtgMattatcgaaaagtaYRSaWtSgNtBgagcRY -aMDtactaacttaWgtatctagacaagNtattHggataatYttYatcataDcgHgttBtt -ctttVttgccgaaWtaaaacgKgtatctaaaaaNtccDtaDatBMaMggaatNKtatBaa -atVtccRaHtaSacataHattgtttKVYattcataVaattWtcgtgMttcttKtgtctaa -cVtatctatatBRataactcgKatStatattcatHHRttKtccaacgtgggtgRgtgaMt -attattggctatcgtgacMtRcBDtcttgtactaatRHttttaagatcgVMDStattatY -BtttDttgtBtNttgRcMtYtgBacHaWaBaatDKctaagtgaaactaatgRaaKgatcc -aagNaaaatattaggWNtaagtatacttttKcgtcggSYtcttgRctataYcttatataa -agtatattaatttataVaacacaDHatctatttttKYVatHRactttaBHccaWagtact -BtcacgaVgcgttRtttttttSVgtSagtBaaattctgaHgactcttgMcattttagVta -agaattHctHtcaDaaNtaacRggWatagttcgtSttgaDatcNgNagctagDgatcNtt -KgttgtaDtctttRaaYStRatDtgMggactSttaDtagSaVtBDttgtDgccatcacaM -attaaaMtNacaVcgSWcVaaDatcaHaatgaattaMtatccVtctBtaattgtWattat -BRcWcaatgNNtactWYtDaKttaaatcactcagtRaaRgatggtKgcgccaaHgaggat -StattYcaNMtcaBttacttatgagDaNtaMgaaWtgtttcttctaHtMNgttatctaWW -atMtBtaaatagDVatgtBYtatcggcttaagacMRtaHScgatatYgRDtcattatSDa -HggaaataNgaWSRRaaaBaatagBattaDctttgHWNttacaataaaaaaatacggttt -gHgVtaHtWMttNtBtctagtMcgKMgHgYtataHaNagWtcaacYattaataYRgtaWK -gaBctataaccgatttaHaNBRaRaMtccggtNgacMtctcatttgcaattcWgMactta -caaDaaNtactWatVtttagccttMaatcagVaagtctVaaDaBtattaattaYtNaYtg -gattaKtaKctYaMtattYgatattataatKtVgDcttatatNBtcgttgtStttttMag -aggttaHYSttcKgtcKtDNtataagttataagSgttatDtRttattgttttSNggRtca -aKMNatgaatattgtBWtaMacctgggYgaSgaagYataagattacgagaatBtggtRcV -HtgYggaDgaYaKagWagctatagacgaaHgtWaNgacttHRatVaWacKYtgRVNgVcS -gRWctacatcKSactctgWYtBggtataagcttNRttVtgRcaWaaatDMatYattaact -ttcgaagRatSctgccttgcRKaccHtttSNVagtagHagBagttagaccaRtataBcca -taatSHatRtcHagacBWatagcaMtacaRtgtgaaBatctKRtScttccaNaatcNgta -atatWtcaMgactctBtWtaaNactHaaaaRctcgcatggctMcaaNtcagaaaaacaca -gtggggWttRttagtaagaVctVMtcgaatcttcMaaaHcaHBttcgattatgtcaDagc -YRtBtYcgacMgtDcagcgaNgttaataatagcagKYYtcgtaBtYctMaRtaRtDagaa -aacacatgYaBttgattattcgaaNttBctSataaMataWRgaHtttccgtDgaYtatgg -tDgHKgMtatttVtMtVagttaRatMattRagataaccctKctMtSttgaHagtcStcta -tttccSagatgttccacgaggYNttHRacgattcDatatDcataaaatBBttatcgaHtN -HaaatatDNaggctgaNcaaggagttBttMgRagVatBcRtaWgatgBtSgaKtcgHttt -gaatcaaDaHttcSBgHcagtVaaSttDcagccgttNBtgttHagYtattctttRWaaVt -SttcatatKaaRaaaNacaVtVctMtSDtDtRHRcgtaatgctcttaaatSacacaatcg -HattcaWcttaaaatHaaatcNctWttaNMcMtaKctVtcctaagYgatgatcYaaaRac -tctaRDaYagtaacgtDgaggaaatctcaaacatcaScttcKttNtaccatNtaNataca -tttHaaDHgcaDatMWaaBttcRggctMaagctVYcacgatcaDttatYtaatcKatWat -caatVYtNagatttgattgaYttttYgacttVtcKaRagaaaHVgDtaMatKYagagttN -atWttaccNtYtcDWgSatgaRgtMatgKtcgacaagWtacttaagtcgKtgatccttNc -ttatagMatHVggtagcgHctatagccctYttggtaattKNaacgaaYatatVctaataM -aaaYtgVtcKaYtaataacagaatHcacVagatYWHttagaaSMaatWtYtgtaaagNaa -acaVgaWtcacNWgataNttcaSagctMDaRttgNactaccgataMaaatgtttattDtc -aagacgctDHYYatggttcaagccNctccttcMctttagacBtaaWtaWVHggaaaaNat -ttaDtDtgctaaHHtMtatNtMtagtcatttgcaaaRatacagRHtatDNtgtDgaatVg -tVNtcaaatYBMaaaagcaKgtgatgatMgWWMaHttttMgMagatDtataaattaacca -actMtacataaattgRataatacgBtKtaataattRgtatDagDtcRDacctatRcagag -cSHatNtcaScNtttggacNtaaggaccgtgKNttgttNcttgaaRgYgRtNtcagttBc -ttttcHtKtgcttYaaNgYagtaaatgaatggWaMattBHtatctatSgtcYtgcHtaat -tHgaaMtHcagaaSatggtatgccaHBtYtcNattWtgtNgctttaggtttgtWatNtgH -tgcDttactttttttgcNtactKtWRaVcttcatagtgSNKaNccgaataaBttataata -YtSagctttaaatSttggctaaKSaatRccgWHgagDttaaatcatgagMtcgagtVtaD -ggaBtatttgDacataaacgtagYRagBWtgDStKDgatgaagttcattatttaKWcata -aatWRgatataRgttRacaaNKttNtKagaaYaStaactScattattaacgatttaaatg -DtaattagatHgaYataaactatggggatVHtgccgtNgatNYcaStRtagaccacWcaM -tatRagHgVactYtWHtcttcatgatWgagaKggagtatgaWtDtVtNaNtcgYYgtaaa -ctttaDtBactagtaDctatagtaatatttatatataacgHaaaRagKattSagttYtSt -atatatagtcttaaaaMtcatgttcaaDactgRttctaagagDtatttttagcgacttgt -gRtgNctgSgRaaaaatgcaMtYtDcatcaaYKttHcatSWgaaaatDataggttatgBD -MtgttataacaaYSgagttacgttatgtDStttaaatctcgWKtcSacgagagaSgttat -BMDgtcggtgtgcgaNtaSHBatBtttVMgVcagaNatcaDDaKMtMYtatagaBccctc -tDtgtatttatatKNtgggtatgtRaacttgaWaaYgcaHatccctggtttStatMtcgc -MtaaaWKttMVtWctVtgttaKDWctgWaVttaDVatgKtagagtcatctaKWgtaaMtt -SacBaMattaKaaHDataattgWtgttttgtcatBacacgtStacaaagtNctNtgtgat -cHtWttcKaagagttttaaaaWacgRacatctNatVStgaatDHgttWcgtRKcatatat -ctcaNttaaBDcctgaaaaaDtaYaHaKttNtaYVaVtttaDtctacttctWttaactaa -ttttMagWcaatcccNKYtBaacatgttgaKgKcgcBHaatDMttatatcSWacatDatR -cWaMtDgatBctHgScttaaaHtSgKtDtttattgtRStWgttccatatttcacWttcat -attgtaHVgaBtacaMtgMaaagDaataactDatattagMaNBagcttcattcgtaaKtg -tatttcacMtgBaVtaattStcttagtYgtgtcgccttKatgggtgaWaataggaatacM -MagaSKRttBgatgacRtgMtagaSRataggtatcaccgaNaaaWSWacDgatacttgat -tagcttgtgVMttatYctaRgHVcDtVRRtSaMtcaVtVtatcaYaHatattaaVaatct -aBtgtacRatNtatttgaYatSaHctaNgNtYtYaYagattVgatcRtaacgYggtgtat -KttaatMagatgRtatatgHaKccHaaaaYtgaacgaWaNgtYHgacagaYtctaVtacc -cgatttttaaagcDttatNRgattKaaattttcatctaatgccgcaataataattgttat -YtagtRNtaagttggtHaKttWMtDKgatSagBYcgRggtWaVaattHtatgtaaaMgSa -aagataaKaaKgttDttttRaagaacaWRcaacDgtgttaatattaKtatcaWacacatt -tVtctgatHRcagtttNcaaatcNctNttttataactWacBBttgBttaaaRaWtBKaaa -cgtatcRcaMaatgYacaaaagtgBataStWYtggtatgacaKWtctSgcKHgtcNaMNc -ataSatattgactacMcataattNVtDaRccaaatcagttttYttagYaacgtaatMtMV -atNgKaaMaaBgattaKttatDaBcttKtccttttacDagaYtacHgttggacaaaVaat -agtYatcataSgatcaaWVttcgaatgaccctccttNtaSBWaatttDttttcaatatYg -gctatDcttatNctttagDcMttcaacWaaNattSYgctttcaHcRaattaataaaatcV -ccRaattactctaMaVRattacagtgRcDtcgtgctcttNtWVtacagtHtatHaBDtcW -ggtgctcaaRHtatgtDgacStgcaaaVKtagttataatactaatatgtagScaatRSac -aattgtattgcagatHHtgBcaatKKtaaMMcaRcgactatKBaMaYatgKatttDaaNt -RatattgtatWttagcaaaaacaWgcacaaHcataYtDaHgttataaSacgcagggggtY -atgcKctaaaHgcVgctBDaVttccStagNgcSgtatgVYaMatcaWRBtVtgYttgtgR -cYttcgctgaacNttgtgtctattWttttcctagMtagaWtaKgatStScatMaBtaSta -SactattYNatctgtacRatYDaatgatgatatgaatYaaaaSHttaaYMaWtDcaNHaB -caYtgVgcatVaacattMRatBtaatttaDacRtagtaaaNYVSMtcagaaDtttDHtRc -YatacSNKaaMcHgatBaaVttactggBYgaYatttttgcDacHctWatcgtagagtact -cattDggtcatKaSgctttatttagtDtRBacttaWYaaaattttgaccttaaWtaatgc -RgccacttMtaggKtcBtgacgaHctttatcgtcStatMHDNagattatNagVaaaWcgg -aaaYcaVactDYactaStattgBHtcYctgggtacatataaYcgaYagaggaggacaVat -acHRtYtctgtaVgaYcNgaaaNatacVgcNgtaatttDcatttttcaacttSNcaaDat -VYctSgcaccttagMgacgcttgaSttaaaatagttaggRHttaaacMatagcaWgMgag -tcgctagtgtKgactaaHttattaWgcaaaaaaSatatgcgttaBNggttaYVatgaact -ttttgccatataaataRatSaBctagttataBccgaaacaagatacttaattttgaHgHM -gtaaKctttaYtaaRacBMtBaYgaBaaacaYtVtagcRgWatHaWagattWSacStMHa -tttaDagacaatcgtgtKtttggaMtgtWtgtgcaaNaaaaWtKaaBcMWtcttctatga -cVgagcgaggHaYYtttWgSaaYYaWtRYHHaMDtctttacaatggaaMctataagcttB -cgHcNWaatttgtatatYtStatctagcactgtVttccagaaattaDtttaRtVataBtt -WagcatDMVactYtgcatWtttgaaMggKaatgaaaaHtataDtgYcMggVaaatSMHtt -tgVttaYaWaataRttgttaYttattttRtWtataaBgtDtttatatcVgaaBcaDtatg -tcaDagaWtgaYtWctcVagctcagctatatagcRVtcaKtaataatHgNaccgaaaatV -HBaatattcgttaVYttatttctBYaatKaagaccVStttcattgaMagSaaaaccccWK -caaNtMYacctaDStagaaatttatcatVgtcaatacccKattgtaaagtggWgtatatV -tagBcttDaBacaattWtDYKtatRKggStRtaaaWatBtaagtaattDaaaaBRacWta -agtacaSttaaatccgctaaccKaattgVWttDattatttattKaMtcYtMRWagMtcgK -gBagacgggVaaNaaatgctKcgtaataaKtaaagtccWcttHMatSYgataaatDttBa -HccattgBttSgaaHYtaataaaMtgaagatgtttBgRcattaRaDHcttBgaMaWaaVM -MattaatttgtgBRctattgKMagNcMtatttaaaWttgaaacatWgcScgYYDYgttYt -VtattgcKcWtagcggtgBaSctaKatacaaVtcaRDccccgtgttBgKgggtHagcgaa -ttaaagMMttScggtDttttaHcSaagaacactcacactBcVgaKNaDHacacttatSag -aattSKHtcagtataaatKaaHtgaaRagaaVcBtaHtaaatcgatcWcaRtaaaattta -WttaagtcaggRctgaWcttDttgactttaVSaaaatggtaWDaRMtBtaaaaaKatBga -tMtctatatcaVaMgatttgNagtDRttDatcttttaMtYaaatcggagttctctaYatN -tagaNcgMMactacHcaagtaaaatStaSaacaHcacSgggtNKatggaaagcggaaKgg -gtaYtacSgccgBaggcRacgtVgDtggaMcYaaaMatggacgYStKKatgaBcaaRtSt -ccSagcRccgccgcSDtgcggBDgaDtBtSSggacMttttaWcatcMatgtNMBWgataa -tcaaVtgaataataaNatgcaaNttNctgacDMcaHccgatgKgWVttccaStggattct -cDacttttttctttaaNcWaMWccWKWttgaaaMctDaaBactRtVattttBtcMaNttW -cKacagttKSttaYaWSactHSaBtHgatgttacatgcatatMtttgtaacScWHBatHa -ctggatatatctgagMgRSatctaaSttaVagcaRcttggaYaatKHtagBBactattcg -taaagaagttgtVcgatgaVatHMtcaggtcgKSgWattgaaaVctccVgtDcaaatgaa -HgMYactcaMatatatattNVttWtWaatttacRagKataaaNtttacaaWgMVactatt -aSgaggVaaagVtaccDRHaaataRaHaRgcattMttcaatcaKaaataDcaDKtctcga -ggBggacctDtttatHacWVaWgatDctaNaNcgKatcMtcMaatBtttggacgtgataa -tagaaacRactcBtattttaKtgSaaggKtaggRaVtatagcccaNRttaccttSMaaga -tcggDacNBatWcgaactacactaactNBtaStgVtNagcatctaVtaKatKgaBtcgtt -tWaagWMgagRaNatHaaaaDtacagacaBagtgcaHaNatctcBccNttaagttDgaat -aaNtcgctaacRBgtaatSttaatatgcataacccaSattKcccttDttggtcaatgggt -tWaacgatacattBtgMaYgaRttatgatKaKgtattDtKWgataacgNBtaccgaKWat -cttcttKtgtcttagcattcctWcaaHgagtatDMSgKtcagcttgVHaKcttDaataaa -VaatttDgtgaaataaRgtcaVaatacttagtVatatgggcatgtDDtMtgtatBggatt -HtgcVtgtgatcaaSattatKYVaacSNNttNWcgaHttKDaaMYHatcgttaattaStt -gctWaacHtaKBtaaaaKHttcRWgaaWcRtBtttggBcDtgtacNttaagcKtaHgtag -aaaaRttgaaacatagtWRaacYggtaaatcgctYaBtWDRtgttgSctaaKatNcattg -tgtMttatccatatagctSacgccSNaaactacgNtgtgcttMatSKtcaaBaNaaacat -aacagaaatagtagctcNcatcVgaagStaataVcDKKttcagDHDtattctaatgaggg -RgBMctatacaagYactctMaaagtcgctttctcgtgaattatNcgatMtttaggcBaaa -tctNtactaaRKtgKactattgtcatatgtacgagttMaaHSSgHgBatatcgcaSaata -aaWgaagtatagaHgcttctttatgaccWaatttaRtaDaatttaatcgaaattgattMc -atcaWaMtaWaKactttctBacactatNgtccttaWgtctgaccKatStaKtgagtacgg -gcgcgtYNtatttagacctctKcatgatKWStcaataactaWgMSgHtgatctttttgtc -gacgtSacttaYgcctWctcctctacaagVtttMaBactWVaccaYtgtSgcgttattcK -tatStgaaKaccgNaataaHtatWtYtRacggcaDaScagcagHaYWRtRNcDtHtcVWt -ggaataaaYttgVaNtgttagtYttgtagSaaatDgaggccDcgBRYStattatttaagg -ccgHgggYRaaccMaagttatSttctttagcMtgcgMtgaSagaNaDagttSatgattWa -tttagtDgcttgagtgMKaYWaYccagcaHatKctaKaDgctagacttattgattaaYtt -atcttattattStaattWaRaYBWagYaatatgttRgScttgBagDaWgcgtgcVDaggc -ttgtctaDRKacttgcaKBWRtaaVaSctKtacttMaaSVaWWcgSaNtttSWgtcggtc -acttggVVtgagaataaataaDttgaaccaaaaMttaaaagaaaaaaaatcNBtatMgcc -WagcaNgaVaNaaaaaaYaMgttaWtatHaagtNtacgacaBtMMattttWNaRtaaata -gYaScKattacagctVKBtWNSKgYtYgtWatHaVatDaaatWgDatcctggSRagagta -aaaMgatttRtaHacatggtaKagVcctgatgaMtaaYgatgtattattttHggBaccaD -ctctggNNtYaatctVttgVtRtVcRacttNctttataggHSRtaRacaaattaacHaHg -tgttgtttcBtBtatWtgtattttgcKagMcaaagaMtattagtStagcBacYaaHcagV -gWtgtttcgtgDHaVtagDatcRaRtggtWtaactgcacgaggaaaRttSDaaVaSttaa -aaacSMttactaNtcaacaattDtacttttYatVSacYtWtMttaattatcKtcttctat -caKDtctStSaaacggtYccatgtgagagtWtagWKgcaBaaaaKttgNactaatcgagg -cWtcDDaaaaaacactHattaattcactatYttaagacactaKaagRtRataaattttca -tHggtaataaatgataHtggctaacBacDgtaatattRtYgtDNDBgKtcaggcHatttt -gHNgWtaatttccgactactgacatVNttYYgactcgctctatttagaMcgggatHcgtt -tatBaDSagBaaaagRttBggttaaBactVHgatgaatttattcaaaattgcacttcDga -cttYcVttactVtttatBaKHagaWgtgaatggBtaaSggcagacNcttaDttVgMtWag -attggVatttacHtctNcMatacttSatMagcttgtNcYaaScaYactcKctKtagScSt -cagtttcatWaatggtgagaggHaggggcaacgcRKtaRcMaNtHaatRaRaaactVtBt -gttaatRtWWcaaagKttccaaKaaatacgVttcacaaacgcggtgagaRaatggtgDMW -atcWVScacaaaDaggaaHtgttSMaaaaaccYccDBtatYgtMagcSagaccaVcctcg -gtVWaaagttatcNaagataataSaataaaKccgtaDtYttatYcttHttaagKcMctaa -atggaatRgaaaVaaVtcKYaggatWcaBtDaggDatccttcYNtgcSMRgaRtNgaatc -gttRttatDVMtagctttacatDVtatatatcagctaDagMtataccYgaggYaaatgDa -aaatSgctctgatgtttVaaBcctgataKtagaaaccaKatatgttaDtgaDtatagata -atacagtaDtatcNtgtDMtYcattRVtctataNtWttggNaSgtMgaaYctctDggHtg -gHDccaccacKKaaacaaaatRatttccctttaagcRattMHctattHaRtataVattgg -atcSttaaHaHgaaHNDtacattSaaggDatttcaaaYgctBcatattaaaKagtgccca -tSctcgatRtaaaMtgWactttNMaWctYgRatDggaactcDcaattaKaactgagtatc -tataagYaaaSRctggtacWtttccWtaYRtKHattatagWtKttaNgcDtatHacccat -taatttataacgctMgaagtaacaacagMgtaYHYVtKMHtacMgKcaaatctgRYataN -tcgttcaatacggWtMcaatYcBWaagYtVaDNagtatagDaaNtaaaYtttcYWttttS -tgggataaMgatattagaaYtNctcttcBagactaYDcgtacHDWccKaHgttcttHgVg -gVDttatcatKaMttttacWaaSattctatagaHaggKaDagBtaaagtcYccattgtYc -atctaNgRgVtgaagtDKttatBKcggDtattRYgHccgtgcgBNMtttVRgacaYctSc -taRacgtagagccgtacRaagtaHKagStSttttgYSatattaaaWHaaWagttDKaaNa -NHaaHttaYcttMtcaaatgKttBtSgtccaaVaattSaacgttgNattgatatNctaWt -VcagtactKcWacgVagggHaaRgaDaatcMttattaataacaBMaaVtgYtKgRgHact -gtactatcBaMtVggtagKcYtHtBSaattagtaatgMcaVVagYYgWtactttccaaSt -tDgaaMaMttcacttYtRgacttcagcttWtttagtgataMaattaagVtagaatatKat -aagtagttaagHMRaDattaHaaVcctDtagtcVYcaataaYcNttNaaaHctcaRaatt -tcaNRgatSHgVatagctRtcatgaBttMaaagRtcgHVtgRgStgatttgtagaKagaR -WRctgNaHYgaaatBctgtttRttNWagaccgagKgtgcggHKVttaatattaatataat -aDtaNcctacaaRgcaNMctctgaaSHWWHcttagtNagtWgWaaKtYaNgcBattatcc -aaaSctRRHKaNtKcBgtgagaDRWBttactaaattSMctatatagaaYacDgatttccV -taagRtgRataatatagtctttttatgtMgtcaacaaNtaaaaactctWtagaVaaaDta -attatagtBStcgaatDtgattVaatMtcaDattVKWaagatagggttgtMRSgtcYgWM -aatgNtagtcBttagtttctctWaaMtVgctWgSgtHagaSagactagKtagWggcattt -HgttgacaaactcggggHggcWBgVgtatgggagVgagtcVcBtDctttagtctaagVWt -HtgtttaScatacMBtKgattatRtgtttgtctttDggcHaBtRtgtaataNataattta -taWctgaYWataStcHaatcRtaaVagDWaSatagtaccNDgaagtatacgttttacgac -gKRtattgDctatRRattVtStaaactagatgVatttagaMaSaaaattVtatYtgttgt -RMagtHaatttSttaaYNaggWagtgcacgaMcactgHgtgtgggHMgtKacttaaYgtc -gcatcSatattgBaagtttacMtYagSatttatttaVtaaDtaWaHcgNatactgactHt -ggWtataDcDScatactcStcDtgtcgtgtatgaggtHaaNKgDattgcBccaagKgtat -gacKSMtttttgttcaaatcaaYtagtaSatgDaaaMccKNaMaatagaataagcaatta -ttataaMgagtgaSgtctNYttattHaNaYYtcDDtaatNRgtatttaaYtaaatcactH -VaHcStccttcccaaVatcVggatKtatgRaaDBgaYtttacttYggactSDtaBcaaNg -gggtattatattBDcttagagYNMatBgttYaagactMatgttRgatacccgtaacacBH -tatKacWgatRcHttaattYtKtStccaaatVDcaNKHHaaataatagtagtatcttgct -NDggVaVVtaVaRaaagSaccgttctcMtVtgNBgtDtttctYgttactBctcRtStWtW -DScMtcWSaRatgaataRHctaNtcStctYtWacagatgtatYBtHaHWBtacggtDcaa -BtatcaggtcaVattaNctactgaaaatWaDgactNWtMtggagaattBaataYcMWYcg -atMYatWtgattSatgaRtDaRgccagtSttatatRaBtattRcWtagtVgaagttMcta -ttatatDttaggtctKtgtgtBagacgttatRKtgatctatttBtataactgataacKcg -gagtgHgtVttcttgtKDgcDtaYatBDatcaatattgttNtaBacatcgcNcaKcaWcR -ataWcVgtacgScaWgttcggHcMttcRccatgaRStYgNacagatacYacWWtggNaDc -WagttHatMaNaatNtcDMDcMaKgHNatScVgatKWatatgNRgtccgYgaagattDHg -tMtcHaSNaaattBatRagtaaatttacaagHWtKatcaagtccHtYcctgttKDMSgta -ctactVctgacaaaaHgatatacataatKtStHgctScSatNatacaYttaaWHtctgaa -tYtagtHtKaggccWBaStaDctaagagNtaatcaatcgttNgaYDaagtaaaaHataga -atcgcgBaYaBgaacSaaWaaaaactccgcMttHttYgtaagaMctKBtacSagattcBa -aWtaattttacRttatcgaRtacaRHgtgRagaaBcttaVgacVDgggaatVatagaact -RRtacgYttNattVHgaHttacaaaaaaaYtcRWtgtgattatgccaSDtttatKWgaat -atSNDgattttaacgtcSRtatggttcttcBtWtttMtBtMScttaHatBattHacYtaY -acattcgttKgtcStSctcKtatatttcaKSgagcttccaacaccRDtttDaccattata -tSgtcWtVaaagttgtagccattDtYaatattDaccatcVDaaRccagttttgtcHacMa -ttcHgaNcatgttKcVttcctgtgcSataaatattgaKtctaWctMRaKggtaYcaagtt -DttcgttacRtatgatggHNaWMtKttcatattaaDaSaBaaaMtMatBgKtttgHtHac -taatcatcgtWaatKaaWcaWtcctVttaaNaggaaaagtaaagaDctNttaDBaBgata -gMgaataacRcYggatcRaaaHaagatRDtVRactaYagttcaccaaWtctcSSaaatcS -KattctggDgaacagDtaDagacagtgtaattcaStYttNaStgtaHgccttaScatMRc -accWtcatttatRtaagatWtNataaWtMNtDVgWttgcWgtgaRttttRgWcttMtcta -HacaaYtKctgaBagtRagacttDatNttaaaDgRtatNcHatcSDgtBatcttacVcYa -cNgaattaacgagttgYgacttDattatacBattMgctagcctagatVcaactNttccta -atgtDaacgYaNatagMatSWtYBaaaRtgMtatSRgaataYaScaVgtaScMagatNNt -ttacaaHBaWtNtRtctaaacDaaaaWMcaNtcVaDNcagaDtgcWKYgagttaHtgcDY -ataaacataBaWWtcggtatgtgaaScaacctttRNatcgttaaagcaDctaatgcBatt -tacaattVaMgSMMtccYaaaBYtggattttcataWttgBtatDtBgactaatgtccWaa -HataaScHttWttDtcgtcaagMctMDtaaaatRtBaaaacaatgtcagcatBgNNBVtt -ttttcBacWtttWtSWWtgaaaaSacgBtaaataaagtcDStaagaactgttaatYatgD -ctattactgaHtaaatStHaagacaKtagDtaaHaDgttccaaDtaaggacactctDggc -gtDagtcWaHgRcHgDgaSctttattgtcttttccttRYaDgNactaaatcaWggcNSBa -gttttatatStKgtcRtgattaaggtcaSBttaacaaKatgggatcaaattgRgcBagtN -tcgDcatttWcctttgtNagDgctgcatttactttgtgtcaBgSatttNHaMcggcagSc -tcKDtWBaagSagWatggYtVatSRgKagattgaVatKttcgatYatKYSgDaacNtcVg -tttaWataWtgVctgcgSggMgatccatgagttgtWcatYWWcctVcNHagtNtgtKttt -gatcaacttaSttattgatNcatWaVgNHcagStVHcggHacaaDttgDttWcaaRaKga -aatKaattagtaWacattgaaatgtgaatgacagtgaRVtaaYagYtcggcatMttgaag -gDgagDRcaKgHtacacaaaMcaBtagHactgKaatRtNttcttcatcatNgYgStggac -tatgSMttgKtDaDgacRRgtWaVattgatttaagYctatatagactaagaggtatWtat -aaactaYaHRctStgKWcgtRtKtYtYtagacgattRaaYBtaStcttaWataatcHtta -taRcactgagtgggagccaattctcDtgDaggHcDRVaVVggaaBtRttaataaRRttgt -aagKNcaVWWgtatacctgatcttBtcttRgaWcaVRKcagttSacttagcgtKtgtYWa -tatcgNttcKaccacacVKctgattBtggacgtctgacaDtWKttattttgMBgKaacaD -ataattWtBtBRtVtacataaatatttgtWtttatagtDtgcctagctHYaatgcaNaaR -caatVtacctgggggKtagBgagaBgRaaNttttMtMagMtgtgattNctcNaKggWtMa -tcttagWgtaatatatNctaYBggKaataBattYtaattataVtggNtcgtgtctaatta -aacctHtacaaactDctDtctgatatgMtgataacWctgtgYSaaNScgDYaWtatDatM -KgcaatttctgNcgtHtaWtagatatcYBttaattactcaaaVattYRWtatttDtaNMY -MttgattataatgcgNggWaatYagttgBagNcaagaaaDtRgtaaaagctgcatctagc -ttaVgtBttatagcKMSaattYtHcMaBttcagtcttgKatgVSVttKgttttttagtgt -DHgNggtcaVtatttaacNtgaatatgctatMcatgaaaBtgBSaWctaataaattatYt -tagtaDtaccggaatgagtaattggatttaacBtctSMgWYtgKgattacgRctctccaa -tgtaggcctgaNaatScgYataaBBacaKtHtttcatgaaHtgBtagaKHVtacctVtca -accaDaaWNHNaatgataattgatgWcagggtcMBtgSgRataHctMctgMHHtKaBtaa -MtMgataaRWtagYtgaaMaSgctYtgcgaaHatDtatgtcWRatKatatYDcBgNtRaR -acattMcagaHgaaagRccgcgWttggSatBagagcHgYtatctVtcatYaaVRtcaSac -aMYDcgRtcaaWgaRgataMtaaaacaggtgtaaYcattgWgDHcWgttaVatttgcatc -taatccacaaagaagSatgcgtagRgagtHDgaVcgtgcttatggMttttcatKSctNac -HcctMaKRatttgatctaaatgHaaScataataatgtttgtgtHaVcaaaaNHaaaatcg -ctgSVtattVttagaaNWcacagtgKtatgattHcYcttgDaWVataBatBttttWtaac -tNaattttctttaaYHaMtttaaaccgStcHaVBaatcRacaaWactgtagVKtNRtcct -agcWaatNgctKccttctcDaBDcatYHatatgcaataaBaagaatgDMttaHcaaYYtc -actgttRtgacRaacctaWtBtBMagBctaaBaWtgatgVtttattataggttaattgta -atYcaRtVctcttgcacSaaMaatactRSgcataKcagcaVNKttcgSatcaaactaatt -DtaHtNaVtgttttttaWVtatNccagWttcgtatBcgttVctcBttaaaaMSaDattKR -cctttcataHaattaatWaaataKcaHVaggaatataBYKHVtgVcVgtcHcttccgcct -attDtMMgWaacttgWttYtttcMcgtcctaaVHtgWtggtgacKtcaWaYMttacttag -VWtacgSatatcgWcKaaatHKaaaYttgtagtcaacWtttggtcaagttgaaBBaSHac -VcgYgttWBSRWggtattttaYDtHatattcgatNttacaaaaVacaMccaaYStaataR -ttVtcttagaVKaacaWcgccgtRatcatctaaatccMcctttaMggccHgYcDgaKcta -tgMRYBagcaNDtgMtcRttgtgHaRttacatgaWcDtgctgtataggNggtgaatagBg -agYNtatcagKtHcatBatgVKgaHWagattRDatatcgYcHagRtaatgWtcStagcVa -tNaaaaKttgRaRBYNgtaaDtStaVRgcMccatMWaaattBDatttaatttataaHtag -tVVaDRMKBtaacaatttttttDaRSgaaKDtVaBatcagtaaMttaagcctRgaNVggg -ttcataatagNatcctacactacgcatgtcggaYgtaKcatggattgactttHtaattWN -RaaWYggttcaaaggaaNtaatgcHcaaaattBtagcttattcaagVtatttWgcctaKt -atBttDYcattagDacKVaYNccgYaYRaaMaattRaagaHtatgcttgcRagcgctSaa -tagaaRacaRacSccagcacVMataatHgRtagcgaKgYRaDcVWSDVgRaMgcDgtaat -tttaYttggtaaWcttKDaaYtatMRcgKccYcagtYcBgRccattcaKtgaSSRtactg -acgHtgtaaaaBatWgcaMcBcYcgccagactcttcSatYattgatgaNccaaaaWaKat -VgcaggtWtBcgttaRMagcaaagtgttcacatataaagaHWtKatctacttatatcacY -RaaVagataagtaattttgatgtBctaataggtaRtaaHaattgtaRcStYSYaWRgMta -caHcNSttVNScattNKaaKgBtagtgatYcaaaStactggttggggaBggtNtgtcaaW -BaYVSNgtaataBNtagtatatcacMcScccVcgtVRRtttNcKaSRNaNtHRttattta -ttgacaatggSaBagataaccgttcctaDNaattgctVtatNtHtatagSccaagctKtt -aaacaaattattgtSHgMWgStttNaccattBMYatRtccStNgttgaaBcctVagcaaa -atgatattcRaBccMWaagKtttttcMtgaRYNaataDttgttWRttattggHtNtataa -tggttgtStYgaMcYVtcattaggtaatVcaNggaRtNataMWcctcYgcgagagRgcHM -gcWtgaYtVSttgDaacgaaaatMttYWtWttcctgaKNttatttattRaattaagaccM -KtttcWgtcaBagKSaWaaacaNtaYaDtBNaaagWtHgacaaagtgVtcatKcgcaatV -aactatgcgaaactccNctatatMgactatttatSaaVttNttRttagHtccKtHtaaaN -atttYVctaatttaaaatHWaNtSacgaaaHggaaatcacagVYcctaattcMNtgtYtg -agttatttaBtcRgBHNacBtactctagaacgcKaaDWYYgcattactVagaYtgaVVcg -caNctttBagKRcSgaaatttgtatccattgtggHcaatRtaVtaSaBtcYYcatcgtgt -cHaVttaHattctgtcaBSNYaKBBattaatggctgtHatattgtBacDcBgatttaaaN -tggaaaaYtNcaKagRRtRgttRtMtWgggatcNtacacctgtWKagatataaYVMtaaD -taaacctctgtgtgccttScacWaggaYacttttKacgtttgtgataKYagaYaVatcWc -SattaMcatBYttYaaatgStKagWattKtttaWgtagaaSgtRattcSaDagVaMatta -ttYaagccSgcNaaDgaaSaggtaNgtWactaWcgHctgaNatttttcaatgtaMHSWaR -tggtaNtaHBtttWWaaatattcVtBtctStWtaWMaBcatttcDagttDtttatatgtt -WBtNaYatcccSgtgagcgaRYtBtagaDacBtaagaataWactaaaagKtaKaWaataa -cKcccgDtagccaaagcggaatcgctSRtacKgcactacccHaactMgtgccaBaRaaaB -VtcgSacRKtttStgatcaaHgKtaaKaccHaccacccKttgagcttcSttttKKcgacB -gggtYMaatcBStcgDBtMcataWtaWaMtgaataagaaDatccSYDtgBatgactBaVt -aagatctcNMgtcaWKtgcWggcgatacgtgtttatttWaDaNWBNaaNtNttcaaatag -taatScgHtMWttgttgaBaDtgNatSaagtttHttaNaNKaattKatttgatcgtVcat -gaatatBtttctaacKaNttVttSagccatRtatatcactcHHatctWSKttaMacaaDa -ttccaRaYttttagttaatattcctYaacVactgctMcgagcaMYtttgaagctagtKgN -WttgaaaMatcaMcttcSVatcaatgtNactaaBagatagagtDMgtNtNWatttSaHac -tagaaaDggtaaaaNctMaatagtaHgacgMaaacMtacatHtaSagaHatYDccagtBt -gaWatcYtVaagataattgatcgacctgcaacgttttattacNMWNcattataDVDacta -tattatYattttgcgaagtgagYVtagYaWaHaatctgWttttatgcHaacgttaccDaK -tatagaccaDDttaacgtHBaacatccgtYaBtVtNccaaataaaatVactDttSKtcMt -DSgaagctaMtatattgattactgtNaagNBcagHaDattaaaWttacacaaatactcaa -tSDatagctcaDttWactttgaStaaDtagatSaaDtgtaatKtgVataggaagWSaaaa -KatttaaagtttgcgtaaagcccggNWaacatacatgttctaRcaHttVtcattatctag -ttttNcataaacDttWaagVtNYtaggctttggtatgagaWgtactNaVatcactVttBK -cttaaccttcMtatcggtaataYaMaYggttgtcaaagSWHctaRMSatVcggactMata -tccgaatcttttttcgagtccagtttgaMtcgcatcaaKagtattRMaaaKDBttDNcca -tttttaaBNtVtccgtaatgaKgtcagMVSattatttaWaattttaHNcaaMaHttgtgg -ctattctacDtgaagattatcgacaaVRHttcSaSaatactNHWaaNcgtWaWgaccgRS -ttNtHtcttcKatYatatBaagtcgctBtgagccatatScctKaagaaKDaWactWagBg -ctgattBagKtgaaataBaaaaagSacScaaagagtagcgaDaYtaMcaYcKtaataMat -ttttaactttgYgtcgaaggacgcHctBcgYgaaVacRYagagBaaYgtagattgcgagt -caagtStDagatBgtgaccctaSWtctDgactaSHttctWatWttctaWtatctYacact -gBWatKKctgtatYgacaaHSatYSaNgSagtatagatgagtatttatgaccMaatgtaH -tStaWttgYagccaWattcagtBaYtaaNaBtaNatactggcttWcaagatDctacggaN -ctatcacatSgKgattgacgacccccgagtNDtattgagaaatattaatcVttNKtaaWt -YacgSNcBHgttgWtatgtttcgccaactKaattaRgacgNataatctacaacKgttBat -YatNMSaaaNtctKgacttatgcttatKtcaVtVcagDaataattYgNtRtHaagcaata -HcacaVgtaNNHtHDatgttaMNtggWagSVaRttcMVDtcttWgtRttctacKaaVttc -VcgcatcctHRKtattSgttSacgaagtcccRDVaacBWagtgYtKtgattgSgaBtgcc -BtcaKacaDatacttHatcattNatttacgtcagtgaggcBtaRNaRcaSgcatattatS -tatgctYcacgtattcattaaRtgStcttWgtattKtSYttNaHaRtNYcRaYtVtggtD -cKcttctactaMcacggcMtacgcttctatatHtaatggcattMDtaaMaKattgaagtB -aaKMVMNacKaDtttKNcgagctaaagtccMMtgagaagVaataatggcaWaaaaVaBgt -aSaVgaaaSaaaataDttVtBccaNagcSBgaMaDaVaVYYRVBgttYMtagtaactDta -agWaattBtattttMDYHtSaStScRaKatattacacctMttgNBKtcRtRggNagtYMa -ttaaatMctYgaatgcKHagSggaaaaBcaggtHtatWcatcgtStagMcctcatgatta -WRcStcgWtgRgttttcctaacatcgctcgDDtRaatatMgtcMtHtMaDYatgDattta -tagctKDtYHaaaaattaSatatctggtctttattttatMtgtYttgtcatactcaaVcY -BgatgSctKtYcctWaRaataWcMgNgcgggagtcttRMgactataHaHtgctNtVaatc -aaccacgSRaDtgKtaaMSKgtaaaaWaKtttVagSDtaaaaaatgttYattttNagMHa -aRtNgBttWattatatgcttatatcatttatKtKaaaagctRaaatcgcYgacgNtacNt -ccVtSaaatttcDVctaatacWgcaMtcttSaaWaaaWagtagtaattaactagRttaVc -SaaatataacHgHatWaattggaagtgcgSSgaaVtgYgSttccatWVataatcgaatat -gHtRcgtBttcttaaggatatgttgtBcNtaatgtcacVatactgaaatMBttRRcRatc -catagagggacatcgccWttagttgWttatKagtaaaagHtttccttSatVatKtgagca -atttattaaYVattcaaattctgSattRaMtgaatMgttattattacaNcggVagcctta -aKgccYcaaDattWtggMcttMacWttccMVgtgaattctDaBYgacttKYtBacatgct -DcRaaKaaRaatatctttagKcKtaactttaatNaaggctgScacctYgcgcaaaccaHt -tVHcBaDgtaatHaHVaaatMgttggtSatHtNNaaVagtgtacaataaagacgKttcaa -aWVacagctcacWHaatcctgtBNWtaNMKcVcVSWtSgcaattctgKtVVaaacaRaat -tgatRcgBacaKacVccVMactagcgMNaaactgataDaSgagaatVHaatVSVtccgga -tgRgtagRatttgtaactaBataVaggcaagHgaaSMSaKgctRagcStNcatttVgcta -tacttcNDtcaKBDcaHtDcaatagttHttattMBgagctgtaaagtMgatStStcagat -atYcBtataacRcaggRaaaggtaWSatKgatatgagcgtgMYatcagcatVttSgaaaa -aatatatgttYttcattatacataatVcacgattataDggttBtRaagtHMtatagaDgN -ttggDaKctBcaaRcgattcgtgccttacaaaWattYWVcaaWagDattgaaagggaaga -HattBtatVggtaHtWtaMagtccagaKttSatatcaStDtgWaagtKWaggtatttaWa -aRcattaatStgaaVtacggaacatKctacatHtaaaBtcNWatttBBaNatRcDattcg -aactataaattataactcagtSgatataagRaYaKHctggtaaNtttaaNgaRHtttatt -atacNttttaDccttYgtaaacaggaagtgataaacatBgaSgtaaaaaaVcBgtWNtRM -ttBttaaBgtaaaatatcHNStaBtaggtaVatYaccNtBaWagRctNSacRtMatDact -StVctaaDtaYSRgttaRNttttKggccagaaBcatagtYcaYNtDatcgtatVcaatWR -taggaattMcatRtgggatgtcMggMtttataagtaBgtggacNaaKYtgctWgagYtWc -ctWtVcttaaactaRacatggtRcatctSDcHcMgcaactttttagttaccttattHRgt -acggcactDBggtMHcVaaRatKctSHacctacaccactaaHaacgSttagKtKttttgN -HVgagtaYaMtVYNVcggttaSBaBtaatttSRcgtBgaWaatctttttKggacaWKaat -tKSaccttgDRgtcatatDatVMtMaVcgaattaNaagMWccctaaHgataatatgtatt -WataaaatBaaMtgRttcHctaagctaagatatattMcggactaRttttKaSttactWYt -gBcaMMacRRgNtactttaaaSKtttcaYBaBttaVagtRtHcWaggaVccttNgtgagt -catataWttYScMtWgVRgattWtaSggacggWWctBHatattataaKaagttactaMRa -aataSRaDttDaaatataVHaatggaaBDgWgHtcKStVcatHtaatcatggBWaagHta -gtMtgHcHtcatggggWcatacaHNHagcDatRcaaattcgcttgDggDNVcaacgSgtg -gcaccttMttaatattVYtVgaagRttaBcagVaYaHcaRDBagatgaVHtNMtcttact -DaggMgMaattRWDcctVtgagaaaaSKatHHttVDgtctgtcacatHNttgaatSaagt -KBatatagacaaRVctcWtgtacKtaacHtgHataSgVtactaggtttatggBgtcaaaY -aDgaaaaaatcgMtagaKaYatgaattatYcttKtacaatttgWttMaatBgaatSttMt -NaVgVtScgcttctBHKgtaRcNBaatcDtacgattgacgtgctatNaaBtMgagNgKct -tWcWKacactYgttVgNcgaattttcttgaaaaactacccctcgcNtgMctatcccacMc -actcMatttatttagtagaacMNtttcttgYKaWtaaBtttcWttagHtgtttctcttgt -ggctatgDgctaatWDataatttagaNcgcRRNataKtctaataHgaaMYctNaKWtact -aacDtgaVcgagaactggtaccaactHgaggctagagHHagtMgKtaaactacaggMatg -tYgSBaKaaaattMgatRtggggtHBVgttaattgKttaaRDacgMactcaaacStaaag -ctctgtgccttcgtSagtSaRctacaataKatattctaVgtgtaattRacKagttattga -MtaatgaNatacDataaggactttccNtStatatKaagaataKtatggtcctctatgagg -ttaaDtgtattgataaaactggatcactKBtttggcgtcaaagaaaNtagtWKatctaaW -BactDaBaYtacaWtaSgcaattattWgaaBgactgaKctatBRgtagttaBaRRgattt -aagBHctStgtVYRtaaataaagtMWtcHgcattcacaaMWtcMccWttgVgcHaWttca -NtgtVaggNgcVatKttataaWDcccctatgatVttttattacagRBBWttcttRaWgaa -tBVgcgtHgWgaccagtYacaattgSttaaMcVtDatttaVttRgttKtcaYWatKtaaD -tttWaYtaatYctSctatagtcctBtccMaMMtaMYHaSSgKaaacttctcBtMtgDtgt -ttttagRcgtacttataHgKtNtMtKcBtaNKaHStgSagYHtataDtcKtagRtNWaac -VgctVtRtttStNtgaaccttaVatgagaaggtcaKSttaDataagcYaSatNStcaatD -NgttcgacaatttaSgaRaBNNacattRatNtgSttHVtgWHgtSHccaactKttYtatH -YttVtgHcNgactMcaacttBatatgSgattttacgtatttgtggtScaacggYtHtgca -tctatttttWtaSatcagaYatcgcagtgtgtMgtattctttcattaRatttStcaatat -gcttDtStaaagaccDcVtaWNcHYtWMaMcgaacKcaNcttacctaBtgcDacatcaHK -tRcDaaacataaRacNNtccDataNactttatBSDYatDtctBtaBatctDatKaMcatt -MatatcDHctaagRgYVcatgttcgtgataHDYaagttSgHYctaaatgtaaaactNgta -gaaactaattRaatcttttBKcgaatSctMaggVaVaaatgagataaataSgttKgtcat -KaKatDYtaaaRttYaMtgctcSatRtagttttagcaaNtaKgatcgWYcacDgaatcaa -tactgBgaNtaactaaWatatacaatacactaNatcaVaKaaMaaaaaatcaccBtgttg -NctaacaBattttaaKWcaggataWMtaattgtaaHtgVtcgaHtScaHtctcHacVata -gtaMcaaKtcccSagMYtWcaaatHHtaagRttDagtMtcYtttaaWWaaaVaRtcHNtc -tcSttagcacaKttgtagtNgWYtatKDtcatttgaacctcKHtatccttattcttNggt -BgtgtKaggWtYgtStgtVaRtaRaaagtagtgtcgcKtKagatgagYtttaatKcScct -gaaaaaRaaHtttttaaaVgtatagKctaNtKaSVgttcgagacattttRSatagttSac -ataMtaYHccacttttctatactagtatgaBaagctttaMtgaatgtcaKYtaaatatgg -attataNcgBHatcctaRaaactgttgacttYaHtStcatcctDaMBttgtaWgagtaat -WKataaaBgBattcttttctttaatWStaatacgNaagtWaMaaNgactMtgaaDaggaa -aSctaSSgatatDttattatcatagBcaataVcHcRgcStaHaaatWagatHttMHacta -RacttaYaaaaNtataHKVaataKtatgatcgtcVaaWgttYtVcaaYggctRWttaaKt -RttDaKtgtatcaattWKaatBHaaaaNgaatggStHgVVgatMgBYtaRNgBDttMcNt -ggaNgtcaHtgttDcNaggBtatYtacVaNttctcWtactHYcSctgtYtDtgWaatcHg -atDatatcHtcttatattaaKaRYaDgaatgSYcgactgcRgaagttagtStYatYtttc -cgacactacagKcaaagDttaatVatcttaaacRaDatRcBatKNtNtaaaHtcBgatKH -cWStSRaKaSMgtaKaBacWgDDttgYaaYttaNtDgHtatSaSataaaaMBaaDtaMat -DaagWtggaMtRcacttatggctNataaaaatatWNMtacctatgtcaYKaRacagttHD -agccgtaaYcaatataatcatagggaaSatgMYBcKBBtaaRVRatRtccVtgtgaagVN -ttcttagtgtcWataVggtaaNaatVgVaKctttNgtttagtaaagBatBtgaYSagHtt -SYaacaStcgcagaSttcDBtKtttggtctacNttgNgKNNtcaaaaKWactgaaYgaYa -ctatHtaWcaactgttSatNVtgtctSttYctgattVaatKgtaYcaaattSgttaStat -ggtccaatgSWccaaactattgccgttacgcNatcHctctcaKatgtagtctattttaag -gHRatcDaagSaVgaVNccaBKtacgtttStagKgtctaHtcattaYcctaVKtttaYaa -atYtccgataaaVttcDgatWcgBtcctaatttNaattgctDYgtgatcaatttaagggc -tctcatcKattgBtaBagcaYcKctctttNtaacHacNStggRtMatHHgtacatgcaMa -gtgtccatRWttRKctaaaDtcMctttaNVgaNtcMatcacHcctgWtaaStcacgtctN -aagRNNaagMaDtactDgctttttcatcYacttaKttatgcStDaStNaMgDtaacKtMt -acctaaWattggtttNaaVHatgaaattaattacgVNaaWtggaWatctgVatcacYctc -VHMtVaNacNtcccaWtttgcaacctcWctHaatcttWcaaaYaBaattSctYatctaag -DgBttagtaSgaWtBcRcKtccYatatcKBgtctttatgaaHDcgNaMatggatgtWagR -ctStagagaagaacagctWtNtataaaataRatHatKgctNactHgttRgRgVcRacatg -HYaNttaHtattaNStaagatgtagaHcVctcYgggccYcaaaatgatcttctagctctH -MaMMgcaVtgHgtaagaWHHtggtaactBcaMNNctagaacggWtctttgaggHcYNaaM -HtaYcttKaagtSccgttgggNMStatacDttataaaVaYcKtcgcattttcgacctctc -acVttNtttattgtcttctaVcatagaattMttgtHtMgacataaatagttctMtgtWgW -ctttcaagYgcgtNaagcaaDaVHaaStMtaaagccccgtgVgtcacatcHVaDtgttBt -BacBtcggYttDagaDYtccMttagcttacNcgaagatRtDataRtgctaatatatgRtW -VttatWKtgcBgactcgagaSgtaaaaagttaaWaaagtatttctcWtatcBtcataacN -cgctcRKaaDKactRaNtagtatBtgaaatttcgcDactttaNtYgagagaNttgaatta -ataaaSMattRHNtYtgttgaDBRBttgWttagSatgacDggNVagRWcggctacDaYSg -aaattHgtYaaagctccVtatacattaMctttgSgacatBKaattRgtaBRtttaactat -tctagcMKMtttctgtgtgVgtctttcDcgtaaMtaggtaaaDtcaYtatccgattcYtg -aaRttctKaNctaYgYaattYgRttWctWttaaaccaatcactVatgcgYttgaaatgat -KBcNRgctcatgaccHagcgaaaatgtVgccatcaBSatKccRStSattaaatttggtaa -gcVattctgVcattMtacatMgaaaaaataYNDtDaatcatWattcaggNcaccctcBtg -cKcHagYtatBatgBttgtVttaYBgBgataaHNtacRtcaaBaKcagNtcagaatYgtt -WgggaNDagtatagRtctcDtDaHScagttcYcatcSYacHcagagNgtgcHagtacagc -tgRtatatMtaatRaWMHgaaKacaBRtagHtaaaNcVHcatWBgWaaacWccggtaaRc -attgMgttaNgttVMVttgcaagagaatcaaaaaagYScKVtgccgacHgacgttcaMcc -tcattatgcBttttaagtKatDactccgBatHYgttcatcgaaatctSaKaagaatWVtc -gttgtcttaMaaYaSDtaaaataccgcKMtatgKtgScaaDMaaaactgtgagcVtttaR -cttgtaNMatatatttggtMgYVatDaatttgctttaaRtaBgttaYaaagKtataMtWS -tcHaaaaNacgctacMttDDgactacaNaatBcagtcattatatSttaVgRtWgSggcaa -tSataVgSYgctBttataaYRRgaactgtgHtgacHWSactYNgtttBactatWStaNtc -StcMttgattStacctgaattctWatNaaHgMatattcaaaKWaBaataatHKgaWgata -YcaWMBtgtacKagaaaaagaattttWttDaMtggttgtgaNMtVtDcaacNttactatt -acggKctatttaaaaBKatagttHaatggaatatYWgtaVtNaaYgataatMaccWagag -atRttMtgKaMcgatattaacaagatgttBBcNaYattcNgtRttgaBcctaagaSMttc -MtcctcYattcaNaRBttaatgVcMNgaacKagatcgNctaWVgttaaYRtgctSctaaa -aNtttgctaaScttcVattaHtaaMacNgttNtKHMcctattttaRtttVtSgtacatBg -tVaaSSaMVaRBcaSaRHtaWtWHttMtattVcaMtWaaaNaccccgHYtcatagaaRta -aBaatttaBccaatcRctcatagWgcBHRtacaaDttcBgaHggcgctaHtgacagcSNa -ttcctcgagaccBggtcaagWctgVcRDgVtaagtttaattatcMtgatNagYttHtYta -gccRatagDtaatcNtaKtacaMSgDaaaatttgHaHtRDgtaattKtaMHgaBcaWtBN -YaWgtttStttaSttgataatgactMKatHBtttaVcYatgggttttaDKcSatttMata -tcagtYaBtgVacaatHcaDMcccgtaataatagDataatVaaagaagaVtctccgaRgt -RtaatcgagtcacttgttSatgNDHaSNRcggtaSaagcSaBgWSgcatcaaWatgttac -atgattcWacMtagtgNcacgatgatttttRcWttSgtaatMRRBaacNWRHaaBaattD -aagStgatccttcaDacccctKaagScSSHaaYHWcHcaWcaaaMBataattgDtagccW -tcRHataMNKtMgHaBcatcgaagtgtaRgtgggaVMatgttaWRtStBHactaaRaact -NctcHaaaggcatgcVHKHgaatcSccttggSaWatWtNcaaBctaRagaaacacgcttc -KatRattcWtgYDaaaaaaNatWtKgaacgtNttactgWHBaccaWacggttcaaVgaga -aacVtMttatagaagtatWtaaaNHYaMacagWagtaatttgcatcttcgaatacggaHt -aatVattctaDaHtRKRaNHcttacatcDKttMDKaWggDtaatcttYctcWtRaaaaKt -aatcctgccccatgcgDtctaaVMtWRKKDctaatatDgactagWtaaaBcKcacMactM -HHttgDataKHDaDttHttatttagtcaaVatccKWtacWtSVcaggtaatatDSatgcc -tKtatDtttagacKaaaagcgtttaaSaaaYtgattgtKtgBMcKttgDaaaagttBRat -HgcaKgDgtgcWataatMWgcVaVatcYgWttaDatcatNaVgtttgggcttgaHRDaWg -atttctgMHgtVtgccttBtWtaatcgttcgKgRcaBaRMtaattWgctaatMaVBccaH -tDagaBNaataRcacYcYcHcatBgaNtgaNgKHttctYaacaaaYgBttRNtNggaagc -WtDggattgagtHaWttVacaaaBtgttaNctaatactKaMaaaaaDtaRatttDaaagN -ttcYcaaactcMgaYgtacaaatMaaatYtcacVaacgaaDagatWgBgaataggtWtKa -aMtgDttHtgagttaatttgVaaDagttNMataatttaSVattNaDtKVccaaatcgaYV -taaaacKRaataatgaBDtctRtgVcttatttYtgaHgttBWatgaatatacSaacctSa -tNNRccagtactKagaRtgSKMcgaaDattttagtHcKcaaagtggtataaaggctccta -SatHtaMtRKattaNRcWtccgctataKggatWttaggtaatHDRatttattRWgcgatc -ttagSgtcttactatgYgttYaVBtgcaYaaRtDaatacHHtDcttHgBgNcccataDta -aaaatctNtacatatWaRMBgaattaaaacgctctctcaagtKcacNacgVRVcttttta -acttgctcStatRScaRaMataNaKagtatcattRttNaVatcKgtacNatttttgaNcg -acaaKctHWtgaKStacMaBatgWttNSacaaKcaDaatcWaKaccgYBggMScgaMcct -agcaDatgtttcVatgtRBtKNWHtcctWDtatttttNNSaatattcMttgatKgNgaNB -atcSggtctRcttttttatatggtNttDYNYgaaaKctcacacYHRgttacatacttYac -aataNaagaaaagttataNaataSatacagttScacVaScaccSWtccagKHtaatcaaa -tVacatWacgBctccaataHaaYtMtacKacHttttKtcataWWtgtgaatWaataaaaa -catttcaccttaHtttgttccaatcccgRBaWgatKgagtttBaVgaNtaNVBgcaataa -gaatagcaKRttgtatcaattaMtaacatataDBgtaaNttcaNcgagatYactggttat -gtNVtaBNtDaaDtDttaSaWtactaVtHactttNttcttcatWttcDatKaacgtttgg -VDaDtVagttatgtcagactKaatcaYtSgttttataaataDttKttKagacWgHgatat -aaatcttagatNKtttWtWaaatattacSHaRgtttScttaatWttacgRRaaMactcat -BacaccatRtttgaacctacttcDMggcVaSBagaatcttaKMagcaVtctDVataWtSg -atagacttBctDtBNWgtgKatWctYgaaStccgVaaaDattYatagtatcaacBaWYct -gaaatttaKVgYtStNtcaVggtggaNYgaRtMaacataSttcagacVactcaVaagtgg -tattaaDBNDaagtatatMtactatatgatRSgtttgccaacgcacRMtacRYNataaga -tcMgttgatcataaacttVcatatgWtacaaaWttggaaactttaScataactRattMtD -acVYataaaagMaattttKtgaBttKcaacatattVtagtcatgactcgDaacDtaWcta -tRttSSYNtgWaScaaataagaaatKtagacataatggNaatttcSKtVWtgacagKWat -tcgVatttcKWgagcaWgNKaaaatatgtaaacgttcactaaWgacaccBNaacagaaSt -ctgctaHcVtttMtcYttStagYcgtttBcRtaYacttgNaacMtDRtagcatgtgcgag -cScaMgtaatBaKataactMttttattaRcattattatacgtaagSNatVRgcttcgaVa -acHNtctaHBKYgKaccYcttagagcccaVgatttgttagactaaacgtgcaBgccaWga -VataggattDBWaattttgtBacWtttttaatDtMgaactaagcVtctcagBMKatgatt -gaNaVttggatDaSaBatttcgccatatgctaattgYacatgatccacaaMHtttcKYKa -WtYcgDtNaaDccgNaNcacacHKttDtttaggctagRVtYgtaactagctttcacaaat -YtHaattYacaattaMSagMactcctcatgtScttcaaYtataaaaScHYaKcaYacact -VcacataNtaBcaRatgYagVBatttgtaactttgRggacaagcVacctattacRcaaMa -cHRagagtaVNctacagtgagacgaaaggKttacattgggacaataKNtattcaagWKtt -gatNagNtgctaNgagatNacSatctNatttatctatRgaaaatKatNKSBcKactatac -StcagtaggtVtcaaaBYYgctattKtWNttcRacaaaNatgaacttaRtaaDSttVBYt -aatccagtNaaacRttagaaccRBatataWaatKctcattcSacWaacaacactDttVtt -gacYaagagtaSgcMttBttaVNgRVagKDcttcttcNtaggttgcgacYacttaaggVH -caagDagaagataaVaatctgtatRatDtKaaSDgattcaattYtcatgYgtgaVMtMaa -ctaagaatgRgDtHttaaccaatStaaaaMctVDDtgttatcttaBBgccNacKMaHggc -BMttctgNctHggagaataYMgtaMccaataattHttYttKggtKaccaactcccHtMSa -atNactcRtttcatgcKcatgcacttcatSaatatactttVtaYttDattgWcctcactc -YccattaDDaHaaKcaatSttagKtWtcatRcaactattaattYaDggKtagtNcgSgtt -tKRgtDWtVHtDNcHWNtKtccgtctagtatSctaBcacgcaBtaacatgagatVtttaa -ggcaVttBttaStWtattgYaggtSatBMBDactVtggttDagacataaactactBgcac -aacMaagaStccaWNaaSYMYtgtaKaMcYSaHaaaatatttMgtcaaDScaKtcaBVta -MVMRRDMtcttRBgWctaacttgaacNaatgttWgtggBtRttHVKgKcHVtatattSaa -aatBttcBtttcDgHccBagtRBRttaVagBctRcaagcattacKccaWVWtaVcggtta -tNaSgccgKtYcBaagcWgcatgaNHaKtagNgcHcgtgtcataaaatagagacttgHYa -tattctaBgtttatRatctatttagacattttNtWaaSagtaHatRtctcggatttatgt -gatBtctRggggcatWctaSVMaRtcatgKattgRcatMaHaataNcBcDcaggcactat -tHBgaatStatattcatBgMVataaSacVacKHatggttaaBKtgtaSaWMattttMacK -tgaaWaaWgctgRatgtgDacBtSaHtDgtgtMVttagatgattagagaSttgattgtSa -aacagHaaatacaRcaccBtaaDtcaMtKaaStttatKagaataaNcaaBtattKaVNaW -aNactagtYattaaagWgHttaMcKaSagatSactctatMSagtggaYctcacKKgaSMg -cRgKtgccagNMataatccaVgatcttHagttttcttaaccataggggcttaDtYatcga -aaMataagcaaatBttgHHcHagacagagaggcacWtacccMttacgtgNttattYctVa -aactgttaagtKatMagttcacaaagggatgaVNMatgcaSattatcKagtHaBtgaagB -cggagtWttVaaDaccMScactgVatccaRaSatattNtgcBatgBaaNgtcaBMgggaa -tgagtatRgaatgtNttacaggcttaHaataaHSagatagtgVctattaaagggaagDWV -ccatcKaaaatRccccaSVaaatttMtatStgtWagtStMaaatBctgcctKWgttDDaS -KactctaaVRtaSWcVactggaaaaNMaaaccgcacNtaVgaagcttDNgaDBtaMaMKN -tKccaVtgctcttMMYaaaaHaattcWgHcgtacatWaMaaKtaataccgBDaYRaggat -atSKcScYagMtaatKHMtaaccatgHgtagDaggtgtaaatatagaKVgccRYctcRaK -BKWtgatHYcaHgBaYtttMcatataatgaDttcatttaStgtcVSgacggtggVgtBtg -acatgtaaSgtBgatKtKtaYcatVtNattataaaHaSccHaaagctSMKattcatagca -cagtgBRataacaatMttKcWaaaaatagStcggRttaattatWaataatMaYagatgVt -atccttttHaScgtBgagWcatgBtgcctatcgtaaWHacagtactgaattaaaaaNatt -RNMaSSNSctattcaaagccVVcatattttagMcgtattNtVBactacScattgKVtata -aKtttgNaWcttNacctagtgaNaaDcagtaWgKggaaKtacgcaaaYttatacSttgYa -YttcDNagggttVDagHatSgtacYVatataVattataSataacgKgatVtVacHYRWtt -atcctaaDtgtaaDgRDttttattWtaaDttggatcattNgtVaaaVggaaggcYgSWaa -attcWHcgaSaVWaMatctMDtHBgttttaatctaWaagatatDKtVttaccgaMatRaa -aBttaNagHatDHWcDtBVttaatKtMataYttSRHHcgtaHDtggttccaaagRRtaWt -VctRcaNDttatacgatMcaatNHtacgaattBaatHtcccatctctccBtgtataYcta -tgtcgaaDYWtNggatNcacRtMaatNtKcttSYSctaDaaaggctDaStatKtataBgc -VaatttggYcttaaatgatgtHctaaccaactttgggttcMaaDattatKtVacgVcSca -actSataSccHttYctttgtggcDtMcactaNSBtMRBMaggttWKtattaatgtKHact -tcaMVatctgttgtccaaYNtaagttKaacttctHcgcWtYttatMBgBaMacaattaDa -actNaaatSatcVtSSgatctatgNatSYaattRatgcDgtctataagagaagRgatatt -tcccaataHgttttWKtgaagNRtctaaBtWcHHcDgaattgaaaKtgttaaRtatgtaM -aggDttcMaccaMaattDctgYctaWtStaNtgRKaBtNcMHcSttMtaKccYacgNNct -ttatStgVtaYtaagttaagaBHaaStVKHatgttRVWtataMtSatgcaattcMcttat -KgMcagtgaatcYtcctNaYcttactttctcttcatggcgNcatScStBtagctWtHaaW -attaccgtctcgtBMcaaacKctcccaacttBgtWStVttMRgKcVagHttVtaagMaNa -tcaHttacatcYKttDBtatgSattVcgBcBVYttHNtcatKgcYgaaSaKtatttttMt -ctatctaSaattDttcWagHSacgttagYgacWaSaDKatcNgctaatgVSctgctYgaK -gKtaataggtggagcgtcgaaaaRYtgYWYSaatacBgacWtaNStcaattWtRctttta -aSYgttcNgtBWWgtgaatHttttBaMcMtKccagtattttcgaHaDtSVgatgaacatg -cacgtcagagDYattBcagDctcttNcNtaaaatRctgMcDacaagtttagtcaaSSaag -aaacatacaDtctctYgcaaacBcaagaBatgtattgacgagYacBDgttcgtgRtaMga -attttcNtgVcttctgtctagtgtccatatctgatYatNtatVWgttacaDacaHDDagW -tgataWtatcaaBRatDRtMgVcgaaattcSMagYgWacgggtaacaaattcagcatagS -gttactBctgSVWatYcYgcBWgggRcHtataSaattBcagHgcgcctttKcttWaggct -ttaaDtRacBactaaVaaKtaaacctcgcgccattactKactKSDcgacaVtatatagga -taKctcgSatgHSatVcgtagtgaBtSYtgaBataatStaaccaagttcaDtHtatatta -acYatattatcctacgagatcaccgtVSttctYgtcataaVactcgWtaVatttgttgga -ctaaaVcaSaDtYcgNtYtctVaMtaattatWRtWcaNtaKcaaYggatgNgaatcaatc -RtcgagtHcgVgttataHDcatttaagttctHtcgMRHtaaagaVactBMtatgaagtaa -aaaBNtataaNttcKcctaNttaaDtcgMacgDcaMatttgYtaaNtcaccgatgagMtg -ttaggWcacHttNgtcttHYMcaattKcagttcNcaaaacgNaaSattgKttaaBaKtta -tttaMggHcttttaaRNVgttaYttttMVRtYVgRatKcgVtacgaatttccBatBgYBR -tSKKctaaaatgatatgBtcttcgtttgacHagtaattatatctgDtBttatgaDtatKt -cKRcRttagattattagHgDNaaaKgcgMtHtttKtDtgaaaagtaMatcagaaccgaat -KgtatatVaccRaKYtDHtcSagtBgtgccWaaaggtYKcaHatDDaaattDStDtcKgg -tMgcMtgtHtcaaVcgtttNtagtNtgKgctaDcScgBcWSatgtatagcKgWgttgaac -gagtgcgcgtKaaaacgRtttccatatatttttMgaKagcVcVRataccWctctcgBcga -ggcgttaatgaHYtttHtaSWtagcagtttKtYaacaaataMtaNDatRgMBaBacSaat -aSDctgaactattgataaRtaVtttHatWaacWtVaHaaBDtactYtaDactttSgtKtR -attgatttatatattattataattBatagattctaacDcRMaaggttcgtcatattRVYc -ttKgtRcgWaatcgaaWWatDctacaaaagaattHaatctgttttacYatKatBaccMaM -aaVtcacStaaYgYKgtttctcattatattNgSaaHtgRaBtcataKYtHtacttgtaca -aaDtYtgatagNRcYatgaStaaagactgtcWDtYaatVaNStagaaaWtaaaataDYtc -aMatSVBVaaaYagaaaattgtgcDagWSaStattttaatNcacgataNBtaattggaat -gcMgacattHaattctctaaMatactaBaaattacaHWgBNtNaaSattttaacHtgtag -tBtcRtttSaNNaYaMaDtatDtagaKggYgcaaSttgctactDcNRtWgtttaVtggca -aactattgSgaagtattatgDgcgtgtcttagcNtRctKggtMaHgaDaaagtactgtcg -atttagatcagNggtaattaKaatgaaYaaHaattggttVaaMggatactctaBgtYHMc -ttccVcaaWtgttHHRgagttKaaagaBtaRtaaWaggttctatRatSgtatcYtaWcat -gtaBtcaatctaatRgaYYtWtccattataBacttWtcctaHaaaaggttgacgtRattK -gaagcattSBtttctaNcSctSStNtYtWaWtgtagtcttgtctttaagNKgaagacgDa -RgtNaBaVDgaattggaYtaccSVYKctSKKcatagttgSttatcStactcaatSMataH -caKgatWVYtNacagtttBtRagYHaagtaNaaVVDgatattMaagattagcatcctaMa -aMctgNtMcSaRcgctHMttaattDtttYttcgataaagtMtaagttaWaaDcaatccKg -tgMMcatBgtRtaHBcttgtBaBggcaDcgaWttgggtaDaggtgatRtYaMWDttatcN -tVcttRaKagctRgtgcNaatctgattatagattagtatatgaataDNatcYaggKRaca -atcaHcaagttagtKgRatRgttaagaaaatacVctaaaagtgtaagKVgcttSWaaHat -agHctagtDgDtSaVtgatcatttaNKgKHataKBctatatWaNgtttgcRaVNttaDgt -cttagHYKatYaVaBtaatgaBattaYcNtgcaBtHaacttVtccatDagVaaaYgWtND -BgacagVgctcaRtaHaaacttttacaaggaSRaaatagaagaatacccVaHatcBRtct -tttaaDMHWtHgacMtctcaagKDttctgYctctcNagaMgcgaaDWatMcMatatttDc -tttactaVSctagttcaRKWgtttKRaVaaKtacaacaKttatttttggcctataaDgtc -BctBDgcYYaatNactcaaRgaRWcgattgVNcWaatctgKagDMgctatKttRatcatt -MaagtctaRaVaattKctgaKtatccgaaRatcHMaaaaaagattccacgtacgaDStat -atctcataggtacgcgatgtgaaggtHYtatWagKVKgaMDcaatttWccttgKgagtct -agatgaatgVRcctaMttgtaRaaYtRtaacWgaaaMttatcatNcgttactaaggtDaa -ggcagtRctcatcaatggYagccagcgaatatagtgttWtaccaRctagatttDtaaatR -cDKtccHtBWgttctWaagccYBSgtggaaagHNttHtctaaattaBatggaDMgaBgat -atcaatactcMtaaKtcYccgatDaYgHDBaagBattWattgatttttaagaRaaggatg -gYggaKttaKtBVBcttaWcttBtacctYaNYttgctgtBaaMtWtcWaagtaaggWcgM -DaaNtccWMWtatcMVgaSaRctaKtBgKWDacDgaaaaNgttcaaaaataMcttaWtat -gNaVaaRataWtgKctRatataagtgttgacgaKgaNgtaHattaaRagSgattctatgt -YtcaattagBYBatccYtgtNacHagHtacVcVacaacaccgNgBtataYaatWHSttat -tgctDacttgtgHgHcMcHacagctRSDtgattaggaDHtYagatggagWtaMatcRccc -acRaaaYagcagatgatacatatttVBBcaaMtctctaWgaNtttcctaVcttaYBDBct -RgSaagcNgatttcacgtcRDaVBttaRaggtaaggHcacttccgDBKgagaatttataa -aMaRattagcVgtttacaaagagaaaMtgDtttYttggcttataKaStacaVttBttctt -gBcVaataaagagtgagBgcgNcNattgaaacRcactDaaccaatWMtaaHtBgaaacaa -ccctcMctcaaatctMWttggttttacttagcRtttacatRtccBttVcatgaaBacaYg -agHttatWDtcctSatRtYggHtNMttRgNtgcatcacgacagaHgtYaSaactgaaNWV -agtagttagaNgatctgcatWYaDacataHtaWttaatHaDgactYgttcaSVtttacct -aatttaDgRcagacaDtgcYVttaagaSSKBYtgHtDtNtcgtcWttDtgtcNtgacKag -cactccDMacDNcccctWataRKcaaatttctRVaacagcaMtataaattWBctttgKgV -catttaVgtDgtatHtgtaSctagtatagcBtBtgtatgtcgcMcgagttctacgaaBgW -ccgaWatgcaRtWtaagYttaNtcWaHtgattYDatWRgRWagtRcHggNatNttWaaac -aSgcaatMatgacNgggaSatgatttcBHcctaaggWactacagaaaagctMcaaagaYt -HVgtaaHKgKattVaWtttcctaWgaKattatgMaattBgaaagtgaSaaaWtSNBtttY -ataVgNatgaSgcBaaccatattcctctagRtattatctttctMtgaRtctcYgaatDtR -cHgcRVtWtaacDtcacYatRcttNgcgaDtVctWtacHtatatgtatKaaggtaNcata -KRaataacacDctcctWgtSaWcatcDgatatBtaatHSNBtcaataaStHtacttaYaD -aMtaagMtgNaaaaNccccgYWHaatgcBcttaBcgtMBKggccaVgacaWgaaaaaVYc -RKctMgcaccWctcSacttcVtacgaagtYtcctttttaYgttattaataactSttRggt -cVgagWRStatKataYcaatNMtacttcgcttVBaYRaKttaaYatacagctBgagcttc -HcaatBaaaVcgctcacaMgttaHaggctaDtSgatattggggBgRMagtaattggattg -YYHtVtcttSRYaacttataBtNKgatVaWSDWacatVcttgttgaagScaDaSttcact -aattagatKttaMcHtMgKccaYatKataMcKNgattgtYtaaRHHcaWagctgtgcYat -MHaatRDgtgttYctatNKtSDtaKgcBttgagtKtacatgaaggcgMatDaWtcBatag -taaaatNYtSVgVatttcaNgRtaRaaNBttggaatVgaaaaagaaggtgNtttVBgcct -tgtgaBtgMgtaaacBgtactWgtaacctatatggaSYattYtVgtttaagccaRtatRM -cgWMgDVSNgataatBRccNagagStHttBgctaBagatattaacaagaggttttcDaRa -gtcDgtHttcataagaacaKBttaBgactaRatgaaDYHttgVagcMcBDgYactWgSga -cBataMMcttSaRHgcagKcgaaYaDgttcataYKcttcMWttattaaBacDcttDtttB -catVggttVHtgtMgKcgaaVgtcgMaaHHYBMaHtaaKaDttaNgNtttttaggMcWtt -NaaaDaaaaactRgaatagSVHtaataagttStccaatcHataatacMcattHtacaatt -tctgatggacatatgcaaacaKBatgcagacagVcctccgcaacNatcMaHtcMtaSctg -taYgtStcBtcatDacRggttRgagaaHatVcttYWgaDtatgYcaBKgtSWVYtttctW -ttHtctaYttttaBtcataaNgtBRaNcgttKgtgVKgggVtWatcWagttSttttttaM -aRWtccgttttattaHatttBVtataSctRWtgcMacaattaStBcacggaatRatactV -gaagMaaagWacaMgctaacaHctHtaatacacgaYagtcttKagcDttaKBHccgtaHa -acaKVtcMKcaataaaNaggttSaatcatgaNaaBtacggBcaagatcRgttttHaNgtK -ctYatBHHtaaaDNHtaVtVagttVacKtcYgcattcatacaaagtaacKaKKtaaNtNa -taaNaaSaBtagaattctgacacNtaHtataBDttBctataatagYSctgtaHcgccgaM -BaggttaMHtKgttactaaHaacgDatataaagcaWtgaMtttgVatcKaattcgHVNat -NgDaaYtataHacaaacaagagtatatDStgcNgcRtaaWVVaDStNgtcaaacgDttaa -ggNttWcaVNaccctgaaaMcagVYVaMtBgtatacSacgSgNtaaaDtRaBSaWcNacg -YaggtcaYtattagVStaccgatgSStMattctWtattHtHaDtatgYaatattgtttta -NggttVatcttRcgaNtHaVaStgaagactcacaaatcactgataaKBtNHtttctWWta -ttgactacNtaWatataaaBaatBttgggtatYtttYtgttttVttgagtcVaMVgaatN -taaNgKMaacgtaatattKWggcagtgRttgtgacactaaYacactggaaKaWYRgcatg -cgttctBcttggtVaaWgtttHagtcaatctcggaNWtaatBNcaMVKStaNcMtgatat -aatDYMctttcgcatgcYtHtVNgStggagcBtggMgccctgtgNtVatactgcctcHca -taDBtaStgNcagaYttaMtcaYtgtagatDaagaHaaaRcRataattcaDtcaDgttgt -atRaaaaYaRgtttDBgDcgaagcNttgcVttcacttaMgtMWaYaattcggaDcgaVtY -attaBYaaaattaHVttttWaacDttaRaSWactcBgaRctacaVStBaaatRgaacMSa -agaatagYtNctcaatagctNttaVtgctgtttgYcttaatgtgMaStactgDBagVSgg -tSKMYttDatgtMaaSaVtccSRMgaaaactHaatWWtcatttctDgcMcggVtgtRtca -tctttNatcaatatYaKaaaatKWtDDDaaactaagtacRHtcKttacaataggttWctt -ataSaYctgctVtaaVggatcctaHVttgWtgHtWttaDHaNgaccctatatgcWtNtta -cctaYtttDWtttaggHNgccatattacKggattVatatcRcggRWMtgcaVRaaHgtaa -taattttaggtctcDccaatatgSaaaagatDtaaVtYgNaHBtcaYttaaaaacagata -taaagttaaaDWccMHMattggtaaagtccgaKtatDKaVHaBagaBatactataVttDt -tDaMagctctaaDSggtttgaDacacVatcttNtgatKtVaBStatgNtgDKYcaatcat -aWtcNatYccgRtcgBHacaBaatagaVtagcttgaKagcgHtttDNtgaagMttStttt -gDDKRWtagtaBgtgagtgBcaDtWtaHcctatHatttgttWgagcggDtgtRDRcaaat -agcacacRtDgtgVaWtaattRacVataBWacSYWVctgYtWDaVtaKataaacttKaaa -MVHaaaaKNtaaacttgVataaaatMaaatMaagtatcaaRtatSYRtBtaataattgtt -tgaWtaNNtctcaatNaataaaaaaattgaaaattattgtgttaaYatccccHtaNcatt -cacttttaMgVDtaDMtcaWSgYWcSYtSgaatHtgctagaVattaBtaaaYgatattcg -aaBtgaaDacacatRaagcgggagggDMtatDttaatttggaKSNtactRMttactgtBg -gcgtcatNttctattaVacgttccKtVttMacttWtctaYcacgtaVtaaRgKcttggat -SYatattttgttacaaMgtgagagaSatattWcagDttggNtNaaYtaggaaKtYHcttg -KattWagNgtaagHHVatYatcattaaaaaYtHgttcaaaataattatBgcaKWKtagaa -tagtatBagaaMtattMagaMtHcWgYcacgttagtgtDNggctatNatRcYYHtaacMa -SStattRagRcgataaaatWNNatgaaatttVtKcRtKtDtaaMcctccaDRcaHtBSWc -YtaKttcacaaMaataaMaactccgSgtYattDtaWctagatBtaatSgatgatHKgttg -caaaaagaScHtgaaHRDatSagatcBcggcatcatYVaatgMaatStgNgWaaaaMttg -cYaaagttSHaYgaaatHattBgtaaMRagSaSacBaagtttttcatgttaaYcagYtgK -tYctaStcaagcgtaVattaNatWtHgtHKNDtcNaKaVaStSacaaStttagaaataat -gcDSatgtaKtgMMtcaaagtNattacMYgtgctNgVcaaNcDtaaaVtYggtaaaactg -caagaWNcaaacctDSaaSgVaKtctcatataMtggBtaRttKtagRcctgttaHgWRaa -ttgDaaatttHtaccagctcagaccKaaBctaagtatWtaVagBgtttatgaHaaggatt -StaactWacKDVtMHccgtacaMWYctDtagatttRctaccRagtWcWgaaaaMcagttc -tgacSctaaaactgaatcacaNcaMWtWccYgtttNaatttggttaaNtggttSattttc -aacgYVccMtcgaactBtatcYttcYDVMttcgattaKWtatttagcaatatcagWatgc -RVaatgRtacWaVVBttggatRtaNgRagttDYataacDVBcaaactttgtttgaccata -gHMtRctaWcgacagtgcVcaaVgRgtaagtRaaaattSBKacBaatcagaatgtHattc -aVRtatVSSaKatNataWRVaaagMaacataDgataWHatcNYcMtatttggaSatttcH -cgacaYcaKaaatattacHcSaBVatHacactaMDataaaggcacaacaSacctgtaaRg -tcccaaaatWtDtagtcaagNtttgatDacDgcagaDcWgatDaaKagctDWtttatatW -gDcaaaWttStDtKtatSagVgaaKtaacgaccgMgaSaatRRcagYtgttNDggcHSca -aYDWtcaacgtaHgaStKtgMtRtaatccagtDaaacHgtacaaccHtagataNaattat -cVtgaKaaNaaaaaaaagttgMgtcRaNaacagtaKcaBgtttgaMDgDMacttattatg -aDgagcgtcacaaRaagtYaggMtaaactagaacagVaMWataggtatHagtttaaHtca -gtaaatgRgcatgRctgaMttBaaataagWVtcHctgtgtYaaaaVtKtaSaaBatMttt -gttatattattcaaBYctBWtggatBtgaggDagtgcacVataRBctaBaaaataatttt -tNggtccgtVaaaaataaattBHaatBaagaHgttaagcctaatcaaatgaYtKaatYta -aggtMgaRggtWgggNactaacgaRaaattSttWtaataaVtHgtacttNtaagHaSacg -WggaYggNStcctgacgDcgHggtttHggtNtMtttDatNDgtgacgtatacgatKatat -aaacaattSaaagcagatKtttSagcaaMttttgaKtMtagtcRacctKSttBttaatMt -gcgttacaaagaVaataattcaSaaWcBVacYKtacaNBaaKRtRtcgWtWBaRKVtYWW -WgattgBctaaatKaattaYtMtSBMBHDtBtaggDtcNctWYagtgSaaBaVtcttNgt -cgttHtgtMtctatKtatVggKaSaagtttattttatgtactactHtHttSMactatHca -agaattVataaaMKNtaMccgtgatDaHcaacttRataacaNgaatcSBtatgacBcctc -gggtaatWaaWtacacaattctRVgattctatgtgtatHagatagggacVaattttDtNa -WKagtatatHtagacgaggtatgtcagtgagHccccaatNataKMBaHtcWgctagtgHa -atBatSataDatatcacccaagattttcSatKgatWtgaagtcBMataaHaaMaattatg -cttWWtttcgVKYNBattggtacttcaaMaVNcctcHatcgctVcttKatgtctctBMgg -acatcaggacSgaKttgagtctKVYaaagtaaSgaaaHaWactgRattaaBttVaHtgga -ttagRWtaaDaaatgatttSMBWMaDactScgRYtgaVagNctgtSBataKacStHRatc -tVgBKaggccaRctaacttcYKtcaDcttgaaacBBataatacYMgWgctgtacttttat -gaSaaatYcccgattattRStccaaaBagaacaaaVtttgcttatagaaacacScccSaN -taaaaBgtaaggcDgtSttRatMYSWatcgtaacgtStBagttaVaaaScccSggaMDBS -gcaaKaggatatacgtatgcWactccgVctNttMaYtaaatKaaatgKStaaaHaKatat -gBtcctatgtVaBggaatBcgcaatgagtatHcYagctDgtWaaccagtatWWtaRtKag -atagtgKatatgaaaggcaWgtNKaaagataWaatHaaaaaKMaaatttBtatHtctNac -tKtBVVagtatcacgtMgtgttaKtaatcgaaMHtYKNcMaatgcaSaaDBaaaaagaWa -DtWMgaacatttDcatttaBaBtDttaaSMtcagcttttRWWaataattcNctactWaat -NaBaattaagaaacttYRHaccatatKtaKcNVgttYagttBtaaaaVtctcgVctagct -cgSVatatagVtMcaaHRctaHStttNtcattRaatgtaRtgttaatYtaagcattgaat -ttaKtctaKKgaaggtcgMctttcWaagcgWaKcttcYttgtgaRaagMtDatgWgYaat -aKaatSWScatKBtYgtaagagaVcacgctHStaacaSgBtgtaNRYaaWtWcKgaccDt -gaWtgagMaYgVVgBaRacYtcKgatcagttgtaKcgttgagNaStctggaatVtactaS -NtaaagtaatcaattaaVaaDattHDBaHKDHctVggcaaacccKMaatVtgttacBcct -StgBgMtScgaaHcatgctMtStaVttttcDaNagtDVaatYcggaDaYtaactaNgtcc -aattSacaaaaRgtagaaKgtcRSNtgatBacccttMtactatKgtaaRMagataMatgV -tVKagaRagtcagMgMaatRHNttagaagaatgggaatcHtttttSgtNgYatgtgcYta -atgDctMaaaMccVScgcRgKNaaagtaMtacaKaMNaBatagBttttcttttYatataN -aWcagatttgMtgaaacaBYtHaaatgtaDactatttNatttKttSattgBatSRtgKHt -tacgattgcggtaaaaacHHtaNgMcgHaVDtgtagaagatBaaagDttaacSatttaat -ttaccagatataattggVgaRctRtcgccVatRNtDgcagBcVaHtBaatDttatgKRKa -gataaRgcagtaKgagttatatcaMSagttccRcttaaatgatcttataaacaaatttcc -cttaBaWtagtagttMaacMaKaaaagHatYKactttRatgtctcgattBcSagaDKttt -HtBaccttNttVttVVtggttacgtaaBMRgatcgtctacaaNBtaVggttYaaggattc -caNgRgtagBtgtaBacaagtataaatBaaatKRtaMtKHgatcgYggDSgKRaSttHSt -catgtatatWacacRacHcatYtttaacYatatgtgttNtgcSagDHgataYttNattat -cVattcaaYttggtaRHtWtcgaBacgtttaBaccaBaatgtcgcNagaNtKtaDtgDta -tgDaBtcKgtBgatacNaccDDatttYtKggMtYNtaactgVacattaaHgMttatcgtH -MNtataBtKSgccaVttaBcttattcBaagtgaWtaRtcctDVRatgaattgatatgaWg -ccacDaatKaHtttacatNttaWNWgtacaggctacttBaYaaatatacaaaatttcgNH -gMgttHctcKYcttgMtaacBaDVtaatttacagaRttttttagcKagtKactatMRtgt -DtaattccRcaaKSttagttttBtctatagaKaVttttgcNagtKVccttagRgWaNaKW -ttataDgcgaatgMKatgatRcYtctgVagaccgcgVgactagaWaaHNtcRNRKaatac -tcYaNtSDKtcVVggNgDagtttaaKRgttaDcgtNNgtcaYttggtttYtatgtaaagg -attttagatattKMcatgYaaatcaVactcagagtRYtgtaactatagtBaDtVaWatDa -tctataaaSgggtactaYaKKWagaaaaataaattatagRcaaaVataVagatatgtagg -cWagacRWattctgacgcDtaBcYattgtaDggMatgagcgagaggctaaatVtctcagR -agDtSgKNcgtVcStacatttagNtgatSNgatcYVtHattHtBgMacRaattaHBacRc -NaaccctVaaYaattcVccatacKcttSagtctgKMNagRaNcatNgcgHattStSKYRg -gtcagtcaccattttagtMaccctggVattHaatVagaaMaattaVacatacacaaatta -attacgtKtagaaaMgatWgWccatYtagacKatctKatMcggYcgcatgHRtcStVtaa -tHgSaaaVagtgaatgtgYtattaYcRagatgatcataacacSgaYaactMKttatRcga -ataaMSatacNgaMatttcggccacgaYYMcaKattRagDtRtatMVBtaattWtMHgNa -WDgStaaSNggStcBcVYtaYagaHtacagttccMcgtYtYttcattgSWcttagttcgt -HtgVRYgaMacttBtatcaactaaaaVtDgataaDgtatcatYDttaStgccBacctaaB -agttgRtaSBtaaaagWgcacBggttagcMaYatttBgtaggtRBaSagttcacgtaDaY -aaaacDSaKattctgtSatatgtatggVBcctctgtgaaHDKgttaRttttBMHgRMgHa -gtagMgacgaagttaatattgRtHtHttatYaaagcagatgtgattagtggcactactVa -ttagatctctgtttatcattYttgatHcHttagStgatgactctDaaatcagtgttgttt -ttcYaaagtatatcYcaSaacaVttcgWtatKaaaHWtRgtttaKacttctgaaNaYacc -tNtcStatttaaagttKgtgatcctBcaBtctttaaaKagttgDtWctDtgtgctataKa -gtaNHatctagYgatcMgtggYaagactgacacttaRaaccHgttcaYtagWtggtgBcS -tacaMcMHataaaNagatactccaggagttaatcatRttttgaKNgSgcaggtgttRaYc -aaataBtaDtatHgBtatacKaataKtaggaaatatgcataaHgaKttttatMaaaNgMa -tYattgaatNtatVaggtKctttHattcatttatYtattagtataYtttagYcattagaa -ataHtaaccttactcatYttHMRagttctDagNSVgcgVaNNattctVcaaVagaattta -agaggttttacRagtagtaaaBaBaaMtaScKgVaRcNtctgtataagtatVgtDgHaYt -tcHYttaagatRgtgaattctYaaaattRtcWtacDDaRatcaKtaSacaagctaNttRY -agMSDKtWgWaYNgaaaatatNtaatatHMtMWRaRacaaaatgctgctacNKaKtagtt -gVatDaVccatSDtgaSggcgWatccBgaaVtgtaWttagatVaBWtacgWtaYattaaa -tMctDgDaaKatttgaaatgctWctttaHtggHaBBSRVBWtgattgagatccNcaaaHt ->THREE Homo sapiens frequency -gcactagtattgtcgggatcccattaacaggctcaaccacgagctcacgcgaggacatgt -agtccgtatctttaacgaagcgacagcgacagaactcccatggataaccaattataaggc -ccgtaatcctctagacatcgtttaccaataaatccgctttctccgtaatcatgttgaata -ccccagagtagtccagatgataaccgatgaaacacaagtctttctcaatgcacttacggt -gaacttattaccgccaacgtagctcatcaaggttgcgacatctagttgtgtgtttgcgac -gagcccagcgaacttcatcaactttcgtatattcaacgccttgtaattttactttaagac -gcctggtgatgtagattcttagataatcagtttgttatcggctgtactttaccataattt -cacaggtttcaggtcaagaagattatagctgtatatacagttccatgctcggtgcacaga -aacgtgatcggataataatcaatcgcttatgtcgtctttaggcgtatccaatacatgccc -cgataccgcagtgtatttcgacatgtaggtataccgtcgcatttgagctcgagtcaggac -gtcagctagattagattccttaatagaatataccgacctctagtccgaactaaactatag -ataacgccaacttcaggttaattgtctagtcgtctgtttgcagatgggattcttagatga -gtgagtatcggccatattggttcgagcactttagtttttgatgcataggatatgcaatgt -atagctgaaagtactttatctgtttcaaactcacattgattaaaccggtaaacctttaaa -gactacaagaaaatattcagtgagggcaattttgtcaatcacaatcttccagctagagat -acttcacaatttgtcttgaggctacgcaacattagacggattttcgcgttttattgaaat -aatcgaggggcccaagagtatccatagttcattttgtaagatttctttacaggcttatta -cagcttcttcagactcctacatgcttacgagttatatgctagcatgtgaacaatagatta -atatacaggaaaacgtacattgagagagatgaccctacacagcgcaaccgttgagtactt -tcattaaagggtaacgctctcgagacagcatccttaagatggccttattgtcaaatcatt -tgcagaagtacgcaagatccctaaccaacgtagaagaatccctacaaacacatgagacgc -ggtgaaaatagacagggtgttagtattcaatcttcggagtatcaatttcgccaatcttgg -tgagaaagcataccctttcttcagagaaagaagatcaatcataacactatctttaacgag -gtacgcacgcgcatcattacctgcctccatggatctttaggatagcggaaagtattggca -gcgtattgtgatttcgttcctactttatcaatttcacattcatatacatgtcttttatca -aaatcgccaataagataggatgagctatattagatgctagtagagttcgcgccaacatca -tcgataggaatactcaggacagcgtgataggacttttcaatccctaatactctctataat -tataactctctcttaagtttggaggcagtaacgcgctctatataatcagtttgctgcacc -attcttcagcctctgatacatacaaataaattccacagcagtaagagggtttaattgaga -catcttgggaacttaggattttactctaacatcaccgaaacgattattggataccgtacc -taaacgaactttctcaaggcagtaatataggacatccgcaataacacaaatgctgcctcc -ccaggagttatgtcttcctggaggctatatcttacacccactcactataggcaaactaaa -gtttaaatgttgattgtctaaaaaaaagatagataagagttggccggcgtagcacatgcg -aaagtgaatcgtaagctataattctctggacttgaagttctgtcctgttcctctgcaaga -aacaaacttcctttaaagctatttacgacgcacatctcagcaagttataaacatgttgga -agtttctagtcggaattcccaaagaacggatctatctaatgcattcctacatttttcctg -tctgccgatggtgccatcctattcaaagaatttcttaaaagtagattaaatgggactttt -aacaatgagtaaccttacgcctctaagggttcctcgagtgccatacaccagtcaggtccg -agccacatacacggagaacattctaacatagcattctcaactcgatcatttgcaggttac -ttctttcctatcctagtgctaaaaatcatacttgcaatcccatagcacggattaagaacc -taagaaacaattcagtaaaacatgttcgaattcttggtatgggaacatcattgcagctat -ggtctaacgcattaatgtttgggtacatcttccatcatataaacaggaagagtctgacga -cagggagtgcttgcgatcatgtctatcattgtgaaatcaaattgtagctcacatgtcgtc -tatgagagcgtgtatccgataagatttagaaaaatagaagtcgtataagatctcactgaa -cttttgaatgaatgtgaagcatatatgatctgctttaataaaactttatccataggatac -gtttccaaatcaattcaataattattagtcaaaatagataaggatgaacaacctgaaggc -cgatcggacgtagaaagtggtcccatcactttgagttgatattgttgaaccacacgttat -tatggttttcaaacagtctcaggatattgtatatacagataatccgataccagttgtctg -acgcccctcttacgtaccccaccctttgtgacgtttaaagcagttgttcagtattttaaa -ctaggcggcaactaatttggaaagaagcacagtggatatgtctaaattcttgttattcag -gcctgaatttaatacaccgcatagttaacttcgcggtagagttgttcatcatgcctcctc -taagctaccacttctatgatacaccaatagttgttctacggaatctgataattggccaag -tcataaacttccgctgcgttcaacccccttgctcgaatatccaactcgaaaagacagcct -tttggtgtccggaacaaatcagttacttcttttctgatgttaattctctgtggtcagata -cagaccaaaaactccgcggatttaccatcctccaagaacaaatttgcatcaacatagcat -tttggctacatattctaagtctcaatagtttaggttttcaactacattatcccaacatta -ggattggaggaataatagctgggtaagtccccttgcgtctacaatcgactattttttatg -aatatgcttctgccgcacctatggttattaaaaaagtcatgactttgaagaaccctgaaa -agatagatgaatcaggtgtaatggcagcagccaaagagcatataattagcaacactctaa -gaacattatagatatgatgatagcgatcgtcatgatgttatccggtcacaatagtagctt -catcagctaattcgttttgccagtggtgacttgcgctggaagaatcgttatacggtccct -tccctcttgatacggtgggggcttattcaaccgcgtggattgggttgtcatacttgcatt -aaacgatgtaaaccatctagtagtcaactatactaaatcacaaaatagtgatcaatacat -acccgcttcatggttttaaccatttaattgattaaagatattccgctaagaaccattatc -tacctaaactgatcgccgtatcctagtagtttgaaatttgatgtaccgtaatgatcaacg -aagtaaaacgttatattgtatgtagaataataggtcttggagctaaatgatgtgattggt -agtgaagacttacccttacaactttaccggtttctcggaagaatatactagagaatcaat -gcatgggctacataagcactttagtctaatgagataaaaaatacacgagtcttccatcat -gaattttttgtcgaaaaactcgaacctggtaatttaaaccatatatctttatgtcgtcaa -taactctcatatgttttatataacttcccaatcacgacttgtaactgcttgttcgactga -gctgtttgagctatgaggccgggatccggttgagctacatctatttgctacaagaaaaat -gaaagcacatttgttgggagttctggctacactcatagagaaataagtggcccgagtggg -tgcggcctgcctccatattcaagtgtatcttaaaccaagtggttccaacgctcgcgctaa -agaattaaagcctttatttcctccacggagtagcccgtaatccggttcgaaagagaccat -tgaagttaattttcatatccagtgaagtttaggcacaagcatgtgttctgccacatgcct -caaagcgctcttcaaccaagatatgattcatcctaacttcgatgaatgcgtctgtaacat -aaatatagaaggaatgattcggcgagttaattttcgccttctccaacatggcatccctac -gttcgttataaggaccatacatgtaggttttaaaggtttgcggttaatcgatatttacat -catagaaattctatagtcaaatttacaagactctagatactcactcgttgcagccggcta -ggaagcgctttgtaccttacttcccttttcgttgcgtaatatgaatttcatatagtaagt -tcaaggcactcatacctccgtgaagagggtagatagactattaaagttgtttaatagtac -gtattgatggaaatgacccgtaggagatttaccactcaatccacaagattcgctgctgtg -cattatcaaaacagtgcatgtcgaaacatgggttgggtccttcaaacacgaatccaggta -gagatacctttgcaatttttcgatgaaggcgaccgagataaatgagctataacactgtat -gtcttttgattgctataaaacacagaaacggatattaatttaggccgtaaccaacatctg -ttatttgacatagaacagatggtcctttacagcgtattccggccttaatattgaggtcca -gtgtattgtcctcctttaaagaagttgattgtaactgacttaaataagacatgtcaccca -ttcactgggttgcaactgctggccctttttgtccatcgcacgctaatgtgataacagtac -cgccctcacacctgcgtttaaaagacataaatgtcgctatgaaggttattcattaatttt -agctgttttcttagaaaaggtaaatttaaaattgaaaaggctagaaaactaaagttacga -caaatgtgtttgtcaagtaggcgggcatcattgagattgtaagaaataaagccataacca -gccccggaatagaaaatgttaaggaaaggcgatcttctttgaattcttattgtcaagtgc -agtcatacgttcttatcagaggacattgcaataaaatctaacaccctcccttgtgtggtt -gggccatttgtacttcgaagcgtccaccatgtgcagaggataacggaatgtggttccgtc -ccataaacgatcattctcgcccacttagtggcgcggtaaatcgctctcatagaggtaact -ggcctgtaatgtccaatgttaggctaccttctccaactttagtacaacgaataatgtccg -attaacaaggagtcaatttgtcatgaccagttcattcaggtacttgtatctatacggacg -cgttccagagtagtatttgaaattttgaggttctactgataagtttagctatcgctgtat -gtctgaataagaatttaatgtttatcttcgataaataacaattaacaactcctaggtgat -acactgtgaagtctgctgttccccaaattacatatgctattttgttcacataccatgaag -ttaagctaagtgctctataatggcataaacggttatcaaactagctcgaatttcttttat -tacgccggaagcggattaactgctgtagatcaaacacgttaggatagtgtcgttttcata -tatatctaaattcggtctaacatgcattacccatgcttgataacgtagcacttcgcagtc -taattatgtaatgtccgtttaaccaaactttaaaaaagtttatctatcaccagtgatgcc -tcatcgtgactacccggatctttagcctttagggtctaaacagaactaatattactacgt -gtcatactccggagcttaaccaggtgaaacttatttgttaaccaaatttagtgacagggt -agaaatacgtatcaaattaacccagcaatacaataagcatgaaaataattgtaatcgggt -ttgggccggaatcccgcttggcgaaaacttaatgacatagtgtgatgcattttgcactgg -attgagccacaaactcaactagcattatgctcaatatttggccagtgttctacggtttga -aatttataaaggccgcgcaaaagtcttgtagttacaaacgcataaatctcgaacgtaata -ggtttaattagaacatccgtaggatttctgtttatagtagatttatactaaatgttctga -ttagattctgacggccttacccatacaattaataaagacgaatatattagttatagttta -ctatccaaataaattaagcgaatcgaaataaactgtcacgatactgggcagttatcaact -tatcacttatacagttcggacactctatattggtctgtgagtactctatcaaactaactc -ataagttaactgcgcttccattaaatttcaatacgttcttgtgctgtgtacaaacctata -atcgaataaatgacacatatggagatgcataataaaaaaaacggctccatatttctcgtt -aatcgggcattcttaaggaggagcatctcaccaaaaataacgttcctgataagtcttaac -tattagaccgtcttcgggaatgaacgaaacctcaagctagcatggtatagttcttgatag -cgcgtaaattctgataatactgggcggacagctggaaattagttgccagtgcacctacgc -aaatagtttacataaatcaacgggctccgaacgtaaatacaaagggttagttacatcgca -acaagatgaaaagcatgtatgtctaccgtcatccgtccctaacaaacataaaggtggtga -agaatctcgtaggtcaactataactccatccttgaagcaactactccgcgtccgtgtgcg -tagttcgcaacgagaacactactgaaaaaagctaaacaactctcggtacaaatgcggctt -gtgtcgataaagttggtggtagtgcacggaataacataacaaggaatattatttattcaa -attttttgtgactgttatttgttttctgcctagaatgtaaggatgtgttttttgtgacct -gatagttacgcttatttcaggtccacggtgcgtgagagtgtgtcctataacggcagggga -gcgaagtagtgtcctttagactattcaaggtagaattttgataacgctctataaaaggta -gaaaatcatgattgagcaataagaccccaacttatcaaaaaaggagttctcgacagcgcg -tgtacagtccctataacggctgtatttcctgtgtcacaacaccctcccatcgcactcaaa -atgtagatttatgatcagacgctaacttgttcttagagaaaaatacacgggatactctgt -gcaacgatttcattaataaggtgcagcttgggacttttttggccgtaggctttattaaca -ttcacagtaggtagcgagacttcctatgaaccaatcatgccacgcgttttaacgtttcaa -atataagctaggaagcgtttgccaggacttctataatgcaccgttttttttagtacttcc -ttactagccttagtttatgttagagtctttccaattacaaaggattgaatagccaaaatt -tctacaattctcagcgaacgccagcttaatctaaacacgagcttcaaatattctacatat -cggcaggagtcaatatataaatatgaaaatcgtaccatcctcgtacttttagaccaaacg -tcttcggataattaaatcctttttcaattaccacagtacgtgcattagaactactgctat -gaaagtaaaccttgaaatatagtcctcaagagcgtatccaagtacattgcacgtgtatac -agtcgtataaacgagttgatgttctgacgctagagcttaccattcgttaaacagataact -aaaatttaatggctgagtgacttagtgttttcgacaaacgtcgcggatgtagactattgt -ttataagcaatttttaaaaacatatgttcaaaacggtatgggatatgtcgaattccacag -gggtttatgtaccatagaagtatgtataaggtactaaaggtttaaatctgtgatattcgg -ttcggtgaaaatcagactagtcacacttagtgtctgtaaattagattgggtgaaggtaag -cgatcccgaactctacaaggcatgggatgagattctaccgactccggataacactttacg -atcgcgcataactctagctcttagataagtttaacttgtcgatctcataaacagttcaaa -atctgcgatttattgtatcaaatccatcctctatcttctataatcatctgaaccgcgata -cggcactatgagccaagtgaagattgaatccaagaaagctataattggtttattttagtc -catttaaattaagtccggtataagtgctctgtacaatatgcagtctcatgggcatatacg -ttaactaccttttgatacttcgaattggtaaaatatcgactatcgatttgcagtaaaagg -tgtagagtccaattactctttcctgttacatacgatctcttagtttggacaactagccca -tgatggcgctcctctagcgcatgaacctactttataattacatctttatcgatgaatttt -tttagactgcggaggccttgagttttaacagggctgctaaatttcttaagcgattagacg -gtagcgtcgtacgctacttgcttggaacaggcaccgaaaatattgatctactattgcgtc -aactctattctgctaatagcgatggcaaatcacagaagccctcttagtgacaatagttgt -caactatatctaagtcgacctttactgtatcaacgatcacggagagaattaccgaatacg -aaacctcaggactaaaaaacggaaaggatttgtcgacggtaaatataatacttgttaagg -gtagcgacacaggtatactttgggtgtaaacgtggtgcttcccggaacgattttcagacc -agaaaattgttccggtaaccaggaaatctcgtctgcgttaattcgtgttagtaaacttga -tcttcagactccttcttttcgttgcagcgagacttaaattatatctgcgaaatagtgccc -cgtgcatacttcagatggtaggagataccatttggcccattgtgactttacgcgattaat -taaccgacatacatctgttcctgagctatgatcgtctgaataaattacggtctcctcttg -atacctaatggtttctggagacgtttctcatgttcaaatggatagcaggagatcgcttca -tcaagtttagctacgcagagcatcaaaatatgtatgggaaagtcgatttccaaaccagaa -gggataaagagaaataacggacttctccgtagattagcctgatattttgatgggaatcat -ggcggcacatacgtaagagttgcgtgaacgaatattttggacggcgggagacacatatcg -gccattcgttaaggtctctatattggacatcacaagcttagcagtatgagctactaacac -tcaagacattattgattttttcaagatatgtttcattcctctaccgctattcccatacgt -tcgattcgccgggtgagcgaaaccacgggactgaggttaagctaatcaataacaactcgt -tgcgatagagacctatgtatactagagagaattccccaacatttttacaaaaacaaagca -gactaaaatagatacagtccctccatacaattaggaccaacatgttattgccgatcctag -cacacacaccacaaactcagaacttctgtcttacctatgaaagggtctgcacttctgatt -gtacgtgtctaattagcattaatattaaaactaattaggataaactataggtacgagctt -tactataagtcactaggtgttttccgatcgaaaaacgggaccttcaagccttggtaagta -catttaggataaagaaaaaaaggaaggtacgtgactaatctgtctaaactgacaatagag -tagtacctacatgcttcatgtcaagtcttaatacgcaagcgctctcgttatactgctcaa -caaaactcataaagttggactccatcatttagaatcatagggaccaaaacatttatttgc -tactgtcactttgtaggtgttctattctgaattcctcatattgatacatgaatcggaata -cctgtggatcccttaggacgcacgtgctttctttacgtcagaatacatattgtcagaatc -gagaagttccatgcaattaagaattcgcctctttgaaaactcatatccccacatataggg -tccaccgttattcggaaacgatataataattattccagcgttgagcgtcccttaagagcg -cattttcgcttggcctttcttctacgactctacaacgcaagtggctgtgtggagtttacc -acagcgcagcaccccatagaactacctctgagagcgcgagatggtggcagtatgctctgc -agctagcgtttagaacgcgcccgcgcattaaccagtcatattaaaatggactgtcttaat -tgtcggcattaggagcaatattaactgatgagggtatcggtcgcagaagtaatgacggaa -atacgcctctagtccgcagagatacgattacagactcagatcccctaacaagcaaaacga -ttaaatcggaatcactccccctatgacatatttgaaatacacaagaaaccacgcaacatg -tcccgcattctcaaccgcgctttataagatgttgagtctgagaattagatgacctaactg -caagaatcatggcgagtttatctagtaggcaagtctgtaccctagggttcgaacgctgtg -acgtcgtgatcggtctaaggacttagatgataaccaagaactggtttaccgagtactttc -actattaggagtaattacatgcgttcaccgcggaatacgacgaaattttttcatatcttt -atgagcgagatcgtgtcgtctttgcattgcaacagtcgctaccagtaattgctgatcaat -tatagattcattatacagatgcttacttttctctattcaatactgtcatgagttgttttt -aaataagcaccagaattatgtcgcctagtataatcttgcttccacttgaatcaatgcgat -ggacagtattctactgattgcaaagtagtctatttcggcttagcagtacgcatgcctatt -tttttgcaggcacagaataatatgcaactaggattctcggcatccaattaacaggctaaa -acaccaccgaaagacaggtaatctacgaagttgatgtttactacagaaagcgaatgatat -cacttggagaacattttagatgcccccttttaatctagactgagtgtaccaatatatcac -cggtctaccgaatcagcttgaataaaccactctagtactcatgataaccgagcatacaca -tgtatttctcaatgcactgaaggtgaactgtttacaccataccttgcgaatcaacgtggc -gacttatacttctgtctttgagtacagcacaccctaatgaatctaagttagttgttgata -cgaattgtaatttgactggatctcgcctcctcatctagattcttagagaagatgtttctt -atagccggtactgtaactttattgatctggtttatggtaatcaacattttacctctattt -aaacgtccttgcgccgtgcactcaatcctgatcggtttagattcaagcgattatcgagtc -tggaggccgagaaaagaaatgcacagagtaagctctctattgcgacatctacgtagaaac -tcgcatttcagatcgagtaagcaactctcattgtgttgattcagtaatacaagattacct -acgcttctacgaaatatactatagatttagcctacgtcacctttagtgtcgagtcggagc -tttgaagatcggatgcggtgtggactgtgtataggcaattttgctgcgagctcgtgactt -ttggttgatgtcgatatcaatgggatacctcaaacgtctttatctctggataactcacat -tgagtataccggtaaaaatttattctattcatctaaatagtcagtgagggctagggtcgc -aatcacattaggccacatacacatacttaacatgttctattgacccgacccaactttagt -agcattgtagccgtttatgcaaatatgccaggcgccaaacactagccagagggcattttg -ttacatttatttaatcgattattacacagtcggaacacgcctacatgcgttcgacttatt -tgcgacatggtcaacaattcagtaatttaatccaaaacctaaagtcagagacatgacact -aaaatcacattaaggtcagttagtgaaggaatggctaaccagctagagaatgcatcatta -acaggcacttattgtcaaatattttccagatctaagcaacatcacgttaaaaagtacaac -aatcacttaaaacacatcagtccaggtgtaattagaaagccgcttagtaggcaagcgtag -gagtataaatgtagacaatagtcgggacttagcagacactggatgcagtcatagaagatc -ttgcataacacgttagggttagagctacgaacgcccatcattaactgcctaaagcgtgcg -tgagcttagcgctaacttttccaacacgtttgtgatttcgttcataatgtatcaatttca -cagtcatatacagggagtgtagaaaaatcgcaattaacatacgttgacctatttttgttc -agagttcagttagagcctaatgattcgagagcaataatcaggacagcctcataggaagtg -tcaatcacttagaagctatattattataaatcgctctttactgtcgtcgaaggaacgagc -gagagagaatcagttgcctgcaactggcttaacaatatgatacataaaaatattttcatc -accactaagacggtggaattcagacttattggcaacttaggatgggactattaaataacc -cataagatgttgggataaagttacgaaacgaaagggatatagcctgttagataggaaatc -cccaataaaacatagccggcctccacagcagtgatctattccgccacgcgatatctttat -accacgcaatataccaataataaaggttaaatgtggttgcgatttaaaaaagatacatat -cagttgcaccgcgtagcaaatccgtatgtgaagcgtaacctagaattatagcgtctgcaa -gttctctaagcttcctctgcaagatacaatatgactttttagcttttttactaccaaatc -tcagaatcttagaaacaggttggtacgtgctactcggaattcccaaagtaccctgctata -tatgccattccttcattggtccgggctcaccatggggccatcatagtaatagaaggtagt -aaaactagttgatttccgacttttaacaatcactatcctgacccagatatgggttccgac -tggcccttactccagtaagggcagacacacagacaacgagaacttgataactttgaattc -tcaaatcgatcattgcaacgtgacttatttactagcctactcctataattcatacgtcaa -atacatttcaacggaggaagataataagtaaatattcactaaataatggtcgaaggagtc -ctttgccaacataagtccacatatgcgctatagattttttcttggggttcatattcaata -agataaacagcaagagtatcacgtcagcgagtcattgagatcttggctagcattgtgata -gcatattctacctaaatggtagtctagcacagagtggataagatatcagttagatataga -caagtactataacagatctcgcttcgttggattgtatggctagctttgatgatatgattt -tataaaaattgatccagacctgacctggccaattatattcattttttatgagtaaaaata -gataaccatgaaaatactcaagccccttaggacgtacaaagtggtaacataaatttcagg -tgttattctgcaaccacacctgttttgggttttcaaaaaggctaagcagattggttttac -agataatccctgaacactggtatctcccaacgatgtcgttcccaacccttgctgaccttt -taagctctgctgaagttttgtaaactaggcggaaaatatgttcgatagatccactcgcct -gaggtagaaattcgtcttagtaacgcctctttggattacacagaatagtgtactgacacg -tacactgctgcagcagccatacgctaacattaaaattcgttgagtctacatttgttgtta -ttcggattatgttattgggaatagtatttttattcccctgcgtgaaaccacatggataga -ttagcctactcctaaagactcccttttggtctacggttcaattctcttactgagtttatg -ttcgtaattatatcggcgcagtgaatctcctaattatcaccggagttaccagacgccatg -aacttatggccagaaacattgcatgtggcctacataggattagtatcaagagtttacgtt -tgcaacgacatttgaccaacttgaccattcctgcttgtagaccgcgggaactcccctgca -cgcgactatagaagttggtggtggatgtggcttatgccgcaaatatggttttgaaaaaag -taatctattgcttgatacctgaattgagacatgtataagggctattgccagatgaaaaac -tgcatataaggtcaaacaatataagaacattatacataggatcttagcgttcctcaggat -ggtatacgctataaagtctagcttcagcagctaaggagttttgccagtgcggacttccgc -tggaagattaggtttaaccgccctgacatcttcataaggtcgggcctgattcaaacccct -ggagtgccgtctcatacttgaattaatcgatggaaaacttcttctagtctaatattatta -ttaacaaatgacggttcaataaataacaccgtaagggtgggaaactgttaagtgatgaat -cattttaacctatcatccattagctacagataatgataccccgatccgactagggggtaa -gtggttgttccgttaggataaaccatgtaaaacgttagagggtttgtagattaattggta -ttccagataaatgaggtcagggcgagtgatcaattacactgaaaaattgtcagcttgcgc -ggtagttgttaagacagtataaatgaaggggattcagaagcaagtttctcgattgactga -atttataaaccagtcgtcaatcatgatttttgtgtcgattaaagcctaaatggtaattta -aaccattgatatttatcgagtctataaatatctttggttgtatattacttcacaatcacc -aattctaaatgattcttccactgtgcgggtggagatatcaggacgggttaaggttgacct -acatcgttttgatacaacaaaaatcaaagcacatggctggggacttctcgatactatctt -tgagatagtacgggcaagagtgggtgacgcctccctacattttcaagtctatcggataac -ttctcggtaaaacgctcgcgatatagttttaaagcattgatttaatccacgcaggagcaa -gttttaccggtcgaatgagaaaattcaacgtaagtgtcatatccagtcatggttagccaa -aagcatgggttatccaaaaggaataaaacagctcttcaacaaagagatgaggcttcataa -cttcgatgaatgcgtatggttctgatatatagatcgatgcatgaggacactttattttag -ccggcgaattaatggaatccatacgttacttatttggacatgacttctaggtgtttttgc -tgtcccgtttagcgatatttacagattagtatttcgtttctcatagttaattgtatctag -atactaactcgttgaagacgcataccttgccatttgtacaggacttaactgttccgtgcg -taatttgaatttcttataggttcttcaaggcacgaatacctcactcatgaccgttcatac -tctagttaaggtcgggaatactacgtatgcagggaattgtaacctaggagatttacaact -ctttaaacaagagtcgctgaggtccaggatcaaaacactgaatctcctaacttcgggtgc -ctccgtaaatcacctagaaacctactcatacatttgcaattttgagatgtaggcgaaaga -gagaaatctgctttttaacggtatctcttgggattccttttaaaaacacataacgatagt -aatgtaccaagtaaccaaaagctgggatgtgtctgtgtactgatccgccgtgtcagagta -gtccgccatgaatattgacgtcaaggctagtgtcatcaggtattgatgttcattgtaaat -gaaggaatgaactaatgtcaccaagtaaagggggtgaaaatgctccccagggttctacag -acatagagatggtcagaacacgacccccctctcaacgcagtgtatttgaaatatatggac -atatctaccttattctgtaattttagatgtgttctgtgtataccgatattgataagtcaa -taggcttgattacgtatcttaagacaaatctgtttcgcaagtaggaccgcatctttcaga -ttgtttctttttatgccataacctgcccaggaattcaaaaggttatcgatacccgatatg -ctgtgaattattattctaatggccactcattcctgcttatatctggaattggcatgaata -tcttacaacctaaagtctggcgttgcgccagttctacttcgtaccggacaccatctccag -tcgttaaccgaaggtgggtacgtcacataaaagttcattagaccacactttgtgccgacg -tatatagatatattacacgtatagggaatgttttctcctaggtgacccgaccttctacta -aggttgtacatcgtataatggcccattaactacgaggaaagtggtattgacctggtaatg -cacgttcttcgatatataccgacgaggtaaagtctactattgcaaagtttgacgttatac -tgataagtttagatttccctggatcgcgcatgaacaatgtatgcgttatctgccatatat -aacatgttacaaatccttggggatactatcgctactatcatcggaccaaaattaaatagg -ctagtgtcttatcagaacatcatgtttaccgaactgatctattttccaatttaagctgat -attacgtccgcgtatttattttagttccccggatgacgattatctgagctacatcataca -agttagcatactcgccggtgcattgatttcttatttcgctatatcttcaagttcacaggc -ttcatatagttccaattagcagtataattaggttttgtaactttaaccatactttataaa -aggttatattgcacaactgatcaagcatccgctataacccgagctttaccagttagcggc -taataacaaataagatgacttcgtgtcatacgaccgtcatgatcatgctctaacttaggt -gggaaccaaatttaggcaatgggtagtaataagtataaaatgataccacatatactataa -caatgaaattatttgtaatccggtttgccaacgtatcccccttcgcgataaattaatgac -atagggtcatccatgtgccaatcgtgtgtgccaaaatctcaaattcaattatcatcaata -ttggccaagtgttataagcgttgaaagtgatataggccgccaaaaagtagtctacttaaa -aaccaatatttatcgttcgttattgctggtagtacaacatcacgagcatttctcttttga -gttgatttatactatatctgctgatgtgattatgtcccacttacccagaatattaagaaa -gtcctagattgtaggtatacttgactataaatataatttaagactatacaaataatctgg -ctacattatgccatcgtagaaactgataacgtagtaacgtcggacactagattttggtcg -gggagtaatctagcatactaacgaatttgttaaatccgctgaaagtatatgtcattacct -gcttggcctgtcttcaatacgtttagactattaaggactcatttcgagatccagtattaa -ttatacgcatccatatttatactgaagacggattgagttaggacgacaagctaaacaaat -attaagttaaggattagtattatattgtagaaactcgtcgggttggaacgattcatcatc -atagaatgcgttacttattcagagagacttaattcggttatgactggcagctcacctgga -aagtaggtgaaaggcaacagaagaatattgttgactgaattctacgggctacgaacgtaa -ttacaaagcggttcgtaaagagcataaagatcaatacaatggatctctacagtattacgt -aaataacatacataaacctggtgttgattcgactagctcatagattaatcattaattgaa -gctacgaagacgcggaagtctgcggagtgagcaaacagtaatcgactgataaatgcttat -aatatcgcgcttaaatgccgcatggtgtacattaacgtgggggtagtcaaaggaatatat -ttactaggaatattagttatgcaaatgttgtgtcaatgtgatgtgttttatccagacatt -ggatgcatggctgtgggggcacaggatacttaccattagttcacctacaagcggcgtgag -agggtctcagttttagccagcgcagagaagtacgggcctttagacgattaatgctagaat -tgtcataaacctcgtgaaaagctagttaataatcatggtgctagaagaacacaacttttc -tataaaccagttctcgactgacagtcgtaactcactatatcgccgctttgtactgtcgca -aaaaaacctcacatagaaagaaaaatctactgggtgcatcagtagagatcgtgttctgag -agataaatacaccggatacgatctgcatcgagttcatgtattaggtcaagcttgggactg -ttgtgccagtagcattttttaacagtcaaagtagggtgagacacgtcatatcataatata -tgccatcgaggtttaaagtttatatgataagctagcatgcgttgcaatcgtattcttgaa -tgctccgtggtttgtactaattcctttatagactgagtgtatcgtacactcggtacaatt -acaaaggatggaagagcaaataggtcttcaattataacagtaccccaccttaatctaaaa -accagcttcaattagtattaatttcgccaggagtatatatataaatatctaaagactaaa -agactcgtacttttacaacttacgtcgtagcataattaaatcatgggtaaatgtcatcag -taagtgcattagaaatactcctttgtaaggatacagtgaatgtgtctcagcaagtcagta -gaaatggaaattcatactcgattaaggcctataaaactgttgttggtatctacagagtga -ttaaaattagtgaatcagattacgaaaatgttttcccgctcgcacttacgcgtttagaca -aaagtacaggtggtacaattggctgtagtagaattttggtataaaataggtgataaaccg -gatgggtgtgggcgaattcaaaagcggtttttgttccatagaactatgtagttggttata -aaggttgtaatctcggagattaggttagggcttaatcagaatagtaacaatttctctatg -taaagtacagtgggtgatcgtatgagttcacgaactcttaatgccatgcctggacaggat -aaacaatacgcatataacttgacgatcgagcttatatcgacctatttgagaagtttaacg -ggtcgatataatatacaggtcttaatagccgattttttctagaaaagcaatcctatatct -tagttaatcagatcaaccccgtgaacgatatatcagcaaactgaacattgtatacaacat -tcctttttgtccgggtggggactccatttaaagtatctcacctagaactcagcggtaata -gatgcagtctcttgcccagttacggtaactaaatgttgatacttagaattgctaaatttt -agtctagacatttccaggtaaaccggtagacgacaatttctctgtcatctgtcataagat -cgcttagtgtgctcaaattgcaattgagggccctactatagacaatcatcagacttttta -attaaatagttttccatgaatgtgttgtcaaggcggaccccttcacttttatcacggctc -ataaatgtcgtatgactgtagtcggtagcggccttcgagtcttcaggggaaatggaaaag -aaattaggcttctaagatggactataatcgattaggctaattccgttcgcaaatcacaga -agcaatcttactcaaaattgttggaatcgatagcgaacgcgaccgtgaatgtttaaaagt -gctcgcacagaattacccaatacctatcatcacgacttaaatacccaaagcagttgtagt -cgcgtaatagattaagtctgaagcctagagacaaagggatactgggcggggaaacctgct -ccttcacggtaacatggtaacaacagaatttggttaaggttaaaacgaaatatactcgga -gtgaattactgttaggtttcgtcatcggatcaataagtagtttccgtgaagacactctta -tattagatctccgaaattctgacccgtgcattaggcacttggtaggagattccatttgga -acttgctcaatgtaagccagtaatgttccgaaataattcgctgcaggagcgaggagccgc -tgaataaaggaccctcgcatcttgttaccttatggttgagggtcaccgttctctgcgtca -attccagagctggagatacattcatcaacgttacctacgcacagaataaaaagatcgagc -gctaactcgttttcctaaacacaacggatttagacaaattaccgaatgcgccggagagta -gcatcttagtgtcatgcctatcatggcggctcagtacgaagagttcaggcatcgaatatt -gtggtagcccgcactcaaagttccgccattaggtaagctatatattgtggtcagaacttg -aggacaactatgagctactaaaaataaacaattttgtcatttgttctagatatgtggcat -tcatcgaacgcttgtaccagaagttacattcgcagcgtgagcgaataaacccgaatgagc -gtaacattatcaataacatatagttcagatagagaacgaggtattcgacagagaattacc -caacattggttattaatctatgcagaataatttagataatgtcactacataatattagga -ccaaaaggtgattccccagaagacaaaacaataaacaatctcacatattcgctagtacct -atgtatgggtatgatcttctgattggacggggataatttccaggtatattaaaacttatt -accataatctagacctaagagaggttatataagtaaagagctgtgttccgatagaaaaac -ccgaccttaaagacttgcgaagtaaattttgctttaacaaaaaaacctacgtaagggaat -attctgtataaactgaaaagtcaggtgtaactacatgagtcatgtcttcgattaattaca -atgcgatctcgttattctgatcaactaatatcataaactgccactacatcttgtacaatc -attcgcaacaatacttttatgtgctaaggtcacgtgcttcctctgctatgctgatttaat -cagattcataaaggaatacgaataactctggatccattaccacgcaagggatttatttac -ggctgattactttttggctgttgacagaactgccatgaaagtaagatgtcgcatcttgca -taaataatagcacctaatatagccgacaaagtgattccgataacagattttaagttgtcc -agccttgagactccatgaagaccgcttgggagcttccccgtgattagaagaatctaaatc -ccaagtggatggggggagtttaaatctcagcaccaacaaatagtacttcctctcagagcg -cgtcatggtcgaaggagcctatcctgatagaggtttgaaagcgcacgcgcatttaactgt -catattaaattggaatctcgtaagtgtcggcagtacgacaaattttaactgatgtcggta -tacggagaagaaggaagcacgcattgaagcagctacgcagaactgagaagatgacactct -aagatacaattaatacaaaaacgttttaagcccaatctatcaacagatgtaagatgtcta -atacacaagaataaaaccttcatgtcccgatgtataataacagctttatttctgctggtc -gaggtgaagtagtggaaattactccatcttgctgcgcgtctttatagtgttggctactct -gtaaccgacgcgtccatccctctctcctagtgatccgtatatccaattagaggataacca -acatctgcgttaccgacgaatttaaatttttcgactatttaattccgttcaaacccgtat -tcgtagtaagtgtttcatagatttatgaccgacatcgtgtacgagttgcagtgcatatgt -agataccactaattgctgatctaggatacatgctttataaacatgcttacttggctattt -tatttactgtcatgtgggggtttttattttcaacaagtatgtgctaccattggataatct -ggcttcaaattgaagatatgcgttccaaacttgtctactgtttgctaagtaggagttgtc -ccattagaactacgcagcacgtggtttgtgatcgaaaagaataattggcaaatacgaggc -tagccttcaaatttaatgcagattactcctcagaaacacacgtaagcgacgaacgtgatg -tttactacacaatgcgtatcatagaaattcgtgataatttttgttccaacctttgaatct -agactgagtggaaaaagatttcaccgggataccgtttatgctggttttaaaaactcgtcg -aatcatcttataactgcattcaaatggatttctcaatcatctgtacgtcaactgttttaa -caataacgtcagaataaaccggcacaatgagacggcggtctttcactacaccacaccctt -aggattataagtgacgtgtggattcgaattctaaggtgacgggatctacaagcctcagct -acattaggtctgaagatctttcgtatagccgcgtatgttactgtttggatatgggttatg -ctaatcaacagttgacagcgagtgaaacggccttgcgacctgaaatctttacggttacct -tttgattcaagacaggatcgacgatggaccacgtgaaatgaattcaaaactgtaacatcg -cttgtgcctcagcgaccgagtaacgacaagttcacatcctctatgcaactatcattgtgg -tcattaaggtattcaagattaactaagagtcgaccatatattctagagttttacaattag -gaaccgttagtctagactaggagcgtgcaacatcgcaggaggtgtggactgtcttgaccc -aagttgcctgacacatagtgtcttttgcttcatgtccttagcaatgcgatacctcaatcg -tagttttatcgggataaataacatggtgtttaaccctattaatggtttctattaatctaa -attgtaaggcagcccttgggtcgaaagcacattaggccacatacacagtatgaaattgtt -cgagtgtccagaccataattgactaccatggtacacggtgttgctattatgactcccgca -aaactcttgacagagggaattttggtacattgatgtaatcgatgatttaacagtaggaac -tagacgtcatccgttagactgagttccgacatgctcaaattgtcaggatttttatccaat -aactaatggctctcacatgtaaataaaatcacattaacgtcacttagtgatggattcgct -aaacagatagactatcattcatgaactggcactgtttcgattatatttgcaacatcgaac -atacttaaagttaaatacgacatcattcaattaaaaaaattcagtacacctctaatgagt -atcccgctttggaggaaagagtagcactttaaatggacaatttaggccggactttcctgt -aaatggatgaagtcattgtacagcttgaataaatcgttagggttagtccttacatccacc -atatgttaatgaataaagcctgagggaccttagagctaacttgtccaacacgttgctcat -ttacttaataaggttgaaatgtatcagtaagtgacagcgagtgtagattttgaccattta -actgaccttcacagttttgtcttcagacgtcacttacaccataatgatgacagagcttgt -agatgcacacactcattcctagtgtaaatcaagtagtagctagattattataaagagata -ttttctggcgtcgaacgtaacacagagagagtataaggggcatgataatggcttatcaat -atgtgtaagaaaaagtttttaatatcatctaactcggtggaatgcacacttatggccaac -tgaccttgggacgagttaagataccataagaggttgcctgtaagttaagataacaaaggg -atattccatctttgtgtgctaagaacctatttatatttgcagccataaaaacctctgtgc -tatgcagccaccagagttatttatacaaagaaagagaccatttagatacgttaattctgc -ttgcgatttattaaacagacatttcacgtccaaccactacaaaagccctatcgcaagacg -atcattgtattatagcctatgcaacgtagctaagcggccgaggaatcataaaatatgaat -tgttacattgtttactacatatgatcacaatctttgtaaaaggttcgttcgtgatactac -catgtacctaactaacctgagatatatgcaatgacttatggggtcagcgcgcaacatccg -caaagcatagtaatacaaggtaggaaaacttctggatttcccaaggttataatgctctat -actgaccaagagatccgttacgactcgcaatgaatactctaagggcactcacaaagaaaa -ccactaattgataaatttcaatgataatatcctgaattgcatcgtgtatgagttacgaga -agtcgcatttaatgaattagtcatagaaatgtcatagcaggaacataattactatatttt -aacgatttaatcgtagttggagtcctttcccaaattatgtcatcagttccgatttagatg -ttttcgggcccttcttagtaaagaagttaatatccaagactagctcctcacccacgcatg -cacatattcgcgagaagtctgatagaatattcgacagaaatgcgactctagctcacactc -gttaactgatcaggtacttatagacaagtacgttatcagatatcgcttcggggcattgtt -gcgctacctttgtgcatagcagttttgaaaaattgttcaagacctgaacgggaaaatgat -attatttttttaggaggaataatacagtaccatgtaaatactcaaccaccttacgtactt -cttacgccgaacatatatggcacgtgttattcggctaacaaaactgttgtgccttttcta -taaggataagcagattcgttttaaacatatgacctgtaaactgggatctacaaaagaggt -acttaaaataaattgcgcaacggtttagatctgcggatctttggttaaagagcaccatta -gatgtgccatacttcctatcgcctgagcgagaatttagtctgaggaaccactcttgggat -ttaaaacaattcggttaggacacctactcggcggatgaagcaatacgataacattaaaag -tcgttcagtctaattttggtcgtagtacgatgagctgatggccaattgtatttttattaa -cagcactgaaacaaaatggagactttagactaatactaaagtctcaatgttcgtcgaacc -ttaaatgctcggaatgaggggatcttcggaagtatagcgccgaagtgtatctcattatta -taacaccagtgtacagacgacatctaattatggccagaaactgtcattgtgccattaaga -ggattagtagatagtctggaccgtggaatagaattttgaccaaattgaccagtcctgctt -gtagacagcgcgatctaaactgcacgagaatatacaagttggtggtgcttgtggctgagc -acgctaagatgcgtttgtttttacgattctagtgcttcttaacgcaattcagtcttctag -atccgctattccaacatcaatatctcaatttaaggtcaatatatataacaaaattagaca -gagcagctgacacttacgaagcatcgtagaaccgatatagtcgaccttatgatgatatgg -acgtgtccaagtccgcacttccgatgcatcttgacggtgaaccgaaatgaaatcttcatt -agggcccccatgtgtcaaaccactcgagtcccgtctctgaagtcaagtattactgcgaaa -aattcgtctactattagtttattatgaacttatgacgcttaaataaattaaacagtaagc -ctgggaaaatgttaaggcaggaatctttgtaacagttcataatgttgctaaagattatca -gaccccgtgaagacttcgggctttgggcttcgtaccgtagcataatacatctatatagtt -agaggcttgcgtgttgttgtgctattccacatatagcagctctgggcgactcttcaatga -aaatgaaaaatggtaacctggcgacctacttgttaagtcagtttaattcaaggggattaa -gtaccaagggtcgagtttctctgtatttattatactgtaggcaagaagcttttttggcga -gatttaagacttaagcctatggtaaaaatttgatagtgagcgactatagtaagagatttg -ggtggttagtaattaaaattctcctatgctaaatcaggcgtacaatctgagggtgcacat -ttctcgacgcgtgaaccttcaccgaaagcgtgtggattatacaaatttcaaacatattgg -cggggcacttatccataatagatttctgtttgtacgccaaactctgcctcacccctccat -aaattgtattggctagaggttaaattctccgtaaatagagacacatatagttttatacaa -ttgtttgaatcaaagcacgagaaacttttaaccgtacattgacaaatgtcttcggatggg -gcagagcatctcttcgtgacccaaatcaatcgctgagcaataagcaagaaaacacagatt -atacaaagagatctggatgaagatattcgtgcaatcactatcgttatgttagagagttcc -atgcatgaggactcgttttttgaccaggagaattaagccaagaaataactgacgtatttc -caaatgaattctacgtgtttttcctgtcacctttagccagtgttaaagatgactatggag -tttcgaataggttattctatagacattataacgagtggaacacccataccttcacagtgc -taaaggtaggaacgggtacgtcaggtagttcaagggattttaggttcttaatccaacgaa -gaaataacgcatcacccgtcattctattgttttcgtcgggattacttagtaggcagggta -ttctaacctacctgagttacaaatctttaaaaaactggccatgaggtcatggtgataaaa -tctgaatcgcctaaattcgcgtccctaaggaaatatactagaatccgtctcagaaagtgc -aaaggttgacttcttcccctaacacagaattctcagttttatagctatctagtggcattc -ctttttataaaactttacgtttgtaagggtccaactttacaaaagctcggatgtgtatgt -gtaatcttccgccgtgtaagacttggaacccatgtatattgacggcatggcgtggctaag -caggtattgatcttcagtgtaaagcaaggtatgttctaatctaacaatgtaaagccgggg -attagccgccaaaggggtctaatgacatagagatgctctgaaatcgtaccaactataaaa -gcacgggatttgaaatatagcgacagatcttccgtattctgttagttgacatctgtgctg -tctttaccgattgtgatttggctttagcagtcatttagtttcgttactcattgctcgtgc -gatagttccaccgaatatggcacattcgttctttttttccattttactgcaaaccttttc -aaaagctgatcgataccactgatgatggcattgattagtcgattggcaactatgtcctgc -ttatatctccaattgcattgaatatagtaaaaaataaaggctcgccttcccaatgggcta -cggagtacacgaaaaaatcgcaactcgtttaaccaagcgccgtacctaacatataagtga -ttgagacaaatagttctccagacgtattgagatatatgtctcctataggcaagcgtttct -aattgctgaccagaaattagaattaggttgttaatactatattcgaccattttattccac -gaatgtgctattctactggtattgctccgtatgcgatatataaccaacacggaaagtcgt -cgattgcaaagtggctccgtagaatcatttctggtcatttaccgggagcgcgcttgaaca -atggatgcggtatctgccatattgttattgttaaaaagacttccgcttactatcgcttcg -atcatcggaaaaatattaatgaggattgggtcgtataagaaaatcatcttttcagttcgc -agatttttgccaatttaaccggttatttcgtcagacttggtagtgtagttacaagcatca -cgattatatcagctacagaattaaactgtcctgactcgacggggcagtgtgtgagtattg -cgctatatattcaaggtaacaggaggcatataggtcatagtacaaggataatgaggtttg -ctaactttaaaaattattgatttaacggttgattgaaaatctctgcaagatgacgctaga -acacctgatgttcaagtttgccgataataacatataagatgaattactgtctttagaccc -tcatgttaatccgctaacttagggcggaaacaatgttaggctatgcggagtaagtactat -attatgataccacatagaatttaacattcatatgatgtctaatacccgttcccaaccttg -caaccgtcccgattaattaagcaattacggtcatcaatgggccaatcctgtctcaaaaat -tatcatattcaaggttcagctattttggcaatgggtgagtaccgttcttagtgatttacg -aacccataatctaggcgacttaatatacaagatttagagttacgttttccgggtagtaca -tattaacgaccatggatcgggtgaggtgttgtattagttatctgatcttgtcagtagctc -ccaatgtcccagaatattatgtttctactagagtgttcgtatactggaatttaaatatta -tgtaagactagacaaattttatggatacattaggccatcgtagaatatgatatagttgta -acgtccctctatagattttcggagggcaggtatattgcttaataaagatgttcggaaatc -agcggaaaggatttgtaattaactgatgcgcagcgcttaaataagtttagactattaagc -tatatgttcgacagcatgtagttttttttaccagaaagtgttatactgatgacccatgga -ggtagctcctcatgataaaaatattgttacttaagcattactattatagtgttcaaacta -gtaccgttgcatactttaagaatcagacatggcgtttcttatgcagacacacttttttag -ctgttgacgcccacctcacatccatagtaggtcaatcgcataagaacaatattctggact -gttttattacccagaagaaagttttttctttccggttcgttaagacaataaagatcattt -cattcgttctcttaacgatgaactaaagtacttaaagtatccgcctcttgtttcgactag -cgcatagtgtaataattaaggcaagataagaagaacaggaacgcgcacgtcggagataac -tctaatagtctctttattccgtttaatatagcccgtaattgcaccatgcgctacagtaac -ggccgccttcgcaaacctatttatgtaattccaagtttaggtatgcaatggttggggcaa -tgtgaggggttttatcaagactttcgttgcttcgcggggggcgcaaagcagactttacag -tagttaaccgaaaaccgcagggagtcgctctaagtgttaccaacccctcactactacgcg -aaggtactcgattattccttgaatgggctgaaacatcgtgattagcgtcttatgattcag -gctgatagaagaaaacttattttctatattccacgtatacaatcacactcgtaactaaat -agttcccagcgttgtaatgtcgctataataaataaaatacaaagaaaattcgtctgggtg -cataagtacagttagtcgtctgtcacataaataatccgcagtcgatctcattacaggtat -tgttgttggtcaaccttcgcaaggtggtccaagtagcattgttgaacagtaaaactaccg -tcacacaaggaatatcataatagatgccatacacggttttacttgatatgtttacagtcc -ttgagttgcaatcgtagtattgtttcatccggggtgtgtacgaagtaatttagacaaggt -gtgtagcggtcactaggtaaaatgacttaggatggatgagcatttaggtattctatgata -acactaaccatcatgtttctaaaatcctcaggaaatttgtattattttaccaacctgtat -ttatagaaagtgcttttgacttaaagaagccgaagtgttcaaattaaggagtacctgatt -gaaagaatggggaattgtaatctgtaactcaattacaaataagccgttctaaggattaag -gctttgtgtctaagcaactcacgtgaattcgaaattcatactcgattaacgactttaata -ctcttctgcgtatctacagactcatttaaattacggaatatgttttcgtttttggtttcc -agctcgcacgtacgcgtttacaaataaggacacctggtacaattggctggagtacaatgt -tggtttttatttgctgattatcccgatccctgtgggcgttggcataaccgggttttcttc -aagactactttcgtgttgcttatatacctggtaatatcggtgagtagcttagggcttaat -cacaatactaacaagttctctatggattggacagggcggcatccgttgactgaacgatct -attaatccattccctgcactggataaacaagacccatttaaattgaccatagagatgtta -gcgtcatatttctgttcgtgatagggtacatatattataaacggattatgagcagtggtt -ttctagaaaagcattcatagttaggagtgtatcagatcataccactgaaccatagagcac -aattctctactggctatacttcattcctttttgtccgggtggggacgaaatttaaaggtt -ctaacctagaacgcagagcgaattgatcaaggcgctggccaagtgaacggttctaaatgt -tcttaatgagaattgcgtattttgactattgacagggcatcgtaaaccgctactcgactt -ggtatctgtaatctgtatgtagatagagtacgggcctataattcaaattcagccaccgaa -gattcacaatcttcagacgtttgaaggaaagaggtttactggtatgtggtgtcaagcccc -acccattctctgttatatccgagcattaatgtagtttcactgtactacggtcacgccgta -gagtcggcagggcaaatccaaaacaatttaggctgagaagtggcactataatagtttagc -ctaagtcccttcgctaataactcaacaaagatgacgcaaaagtcggcgaatagattgcgt -tcgcgtaagggtatcttgaatactgatagctctcatggtaccaagaactttcataacctc -tttatttaccaaacctgttctactagcgttagtgttttagtctgtagccgacacaaaaac -cgagaatggccggcgtaaccggcgcctgcaagctaacatgggatcaaaactattggctta -acgtttaatcgaatgagactagcactgtattactctttcgtttcggcagcggatcaataa -ggaggtgacggcatcactctcttatagtagatatcacttattctcacaacggaagtagga -tcttccgtcctcattaaatttgcaactggctcaatgtaacactgtaatgttaacaaagta -tgagctgaaggtcagagcagacgatgtagtaaggtccctcgaagctgcttacagtatcct -tgaggctcaacgggctatgcggaaattccagacctcgagttacattatgaaacgtgtcat -tccatctcattaaatagttcgtgccctatcgccttgtaatataaacaaccgtttttgtct -attttcccaaggagaaggagagtagcagcttagtggcttgcctatatggccccctaagta -cgtactcggcacgcttagaagattgggctaccccgcactatatgttcccaaagtaggtaa -cctagatagtgtcgtatgaaattcaggtcatcgatgagagtataaaaatatacaattttg -gcaggggttatacattgcgggcatgaagagtaacattggacatgaacggacattcgaacc -ctgtgagtttaataccctatctccggatcattataaagtaaatatacgtcacttactcta -cgtgcgtttagacagtctttgaaactaaattggttatttttctttcatctagatttgtct -gtatctaactaaattatagttccacataaagctgattcaactgaagacataaatataaac -tttctaacatagtagcgaggaaagagctatgcctagcatcggatcatgcgtccgcgagta -gttcctggtagagttaaaagtttttccagaatctagaccgaacacagggtagtgaacgaa -agtgcgcggtgaacatacataataccgaacgtaaacaattccgttcgtattgttgctgta -tctatatttcctacgtaaggctatttgatctataatatgaaaagtcacgtcgaaataaat -caggaagcgcttcgagtatgtacattcagatctccttagtatcatcaaattatagatttt -acggccacgaattattggtctagatgtcccaaaaataatttgatgtcagtagcgatcgtg -cttcctcggagttgaggttggaagaagagtcattatgctataccaagaactctccatcca -gtacctagaaaggcaggtatgtaccgctcattaattttgcgatcttgacagatctgcatg -caaagtaacttgtaccagatggcttttataatagaaactaagtttcccgaataacggtgt -acgataacagatttttaggtgtacagacgtctgactcaatgaacacacattgggacctgc -cccgggaggagtagtagataattaccttctccagcgcgggtcttttaatatcacaacata -aaaatactaattaatatcacacaccctcatcctcgatggagcctagcatcatacacgttt -gatagacaacgccaattttactgtaatatgatattcgaatctagtatgtggacgctgtac -cacattgtttaaaggagctccctttaccgacatgaacgaagcaagctttgtacaagatac -gaagaactcagtactggtaactataagagacaatttatacataaaagtgttaagaccatt -atataaaaagaggtatgaggtctttgtaactacaataatacattcatcgaacgatggaga -ataacagagttatttctgctgctcgagctctagttctgctaatttctcaatcttgatgcc -actcgtttgagtcttccattcgctcttaacgacgcgtacatccctctctcctactcttac -ctatatcctattactggttaacctacatctccgggaaagacgtaggtaaagtggtccacg -attgtattcacttataacacctagtagtactatgtgttgctgagagtgaggacacactta -ctctacgagttcaagtccatatggacattacactttttcagcatctaggtgtcatgatgt -attaacagccgttaggggctatttgattttatcgattgtcggcgtgtgtattttcaacaa -ctaggtgctacaattcgtgaataggcatgaaaattcaagattgcagttcctatcttgtat -aatctttcctttggacgagttgtaccatttcaactaacctgcaagtggggggtcatccat -atgaagatttgccaaatacctggagaccctgaaaagtttatccagattaataataacaaa -caaacctaagcgaagaacgtcagctttaataaactatcactatcatagaaattcctgtta -attgttcttccaaacgttgaatagactatcacgggtaatagattgaacacggagaacgtt -tatccggcttgtaaaatatcgtcgaatctgctgataactcaattatattcgatggagaat -tcatatctaccgcttagcttttaaaaattaagtcagattattccgccacaatgagaaggc -gcgagtgcactaatcaaatcacttaggattattacggacgtctgcattacaatgctttgg -ggtagggttatacaagcatatgattctttaggtctcttgatcgggcgtttaccaccgtag -cttaatgttggcatatccgtgatcctaatattctgttgtcagcgtgtgtataggaatgca -caacgcaaatctttaagctgacctgttcatgaaagacaggagacacgaggcaccacctca -attctatgcaaaactctaacatagcgtggcactatgagtacgtgtaacgacaaggtctca -tactcgatcctaagataattctcgtctggaaggttttaatctttaactaagagtagaact -tagtttattgacttttacaattaggatacggttcgcgactctaccacagggcatcatacc -tggagctctgctatctcgtgaccaaagtggcagcacacatagggtcgggtcctgcatcta -ctgagcaatccctttaagcattcctagtttgagagccatttagatattgctgtttaaacc -gattaatggtttctattattataaagtgtaacgctcccattcgggacattgaaaattagc -aataagacaatgtatgatattcggcgagtctcaacaacattatggtctaccatgggacaa -ggggttgatatgatgaatccacaaaaaatagtcaaacacccatggttcgttaagtgaggg -tatccaggtgttataaggacgatctagaagtattcaggtacacggtgttcagacatgctc -taattgtcaggttgtttataatttaacgtatcgctctctattctaaataatataaaatta -accgctcgtagggatgctttccagtaaaagatacactatcattaaggttatgcaaatgtg -gcgatttgatttgaatcttagtacattcttaaacttaaatacgtattatttaaagtaaat -atattatctaaaccgcttttgtctatccacatttcgtcgaatcacgacctcgttaatgcg -acaatttacgaccctctttcatctaaagcgatcatctatttcttctgattgatgtaatac -tgacccttactccgtacatacaaatgatggtaagcaagaatgactgacgctcctgtcacc -tttcgtggcaatcaactggcgctggtactgaagtagcttgaaagggatatggatgtgtat -gccaggcttcattttgacaatttttctgtcctgctcagtgttgtctgaagtcgtatcgta -cacaataatgatgactctcattgtagatccaatcacgctttcctacgctaatgaaagttc -tagatagtgtaggtgttagacagaggttagcgcctacatccttacacacacagtgttgaa -cggcaagcataatcgagtatcaatagctgtatgtatttgtttggaatatcatatttctcc -cgcctttgaacaatgatgccaaaatgtcctgccctagagttatgataaaataactgctgc -cctgtaacttaagtttacaaaccgatattcaatcgttgtgtcctatgaaaatatttatat -ttgcaccaagaaaatcatctgtgcgatgaacaaaacacagtgatttataaatacaaagag -tacatttagttaccggattgcggcttgacatttattttacagaattttatcggcaaaaca -cttcatatgaactatcgcttcacgataagtctatgatagactagcattcgtagagaacag -gaagagcaatcattatatatgaagtgttacagtgggtactacatatgagatcattaggtc -tatatccggccttcctcataagaccttggaaatatcttacatcagagatatcaaaggaag -tatgggcgaacccagaaaaagccccaaagaatagtaattcatcggacgtaatagtctggt -tttaactaggggttattgatatttaagctaaaagagttccctgaacactcgaaatgtata -atctatcccaactaaaaaagtatacctctaattcagaaatgtcattgagattagactgat -gtcaatacgctaggaggtaagacaagtagaagtttttgatttaggaattgaaatgtaata -cctccatcttaagttctatattttaaagttttatgcggacttcgagtaagtgcacaaatg -atggcataagtgcccagttacatgtttgcggccccgtatgagtaatgatctgtttatcaa -tctctagctactatcccacgaatgcactgatgccagtcatggcgcttacattagtcgaca -gaaatccgacgatacctatcacgcgtgaactgttctggttcttattcaattcgaagtgat -ctcagatacattacggccatgcttgcccttcatgtctgctgagcagttttgttataggct -gaatctcctctaagcgaaattgataggatttttggtggtcgatttagtctgtacctgctt -attaagattcaaaatgacctacttcttacgccgaaatgatagggatcggctgaggaggat -aaatatacgctggtgcctggtatttatccagaacaagttgcctgtgtatcagatgaactc -taatctccgagataaaaaacaggtacgtaaaataaaggccgcaaagggttacatctcagg -atcgtggcgtatagtccaccattagttctgacttacttaatatagactgaccgagattgt -agtatgtggatccaagcttgccatgtaaaacatgtcggttagcaaaacgtataggagcat -gatcaaagaagagttaattaatagtactgcactataattgtcggcggagtaccatgagct -gttgcccaattcgatgtttattaacagcacgcataaaaaatccagacttttcaattagaa -ttaactataaatggtccgcgaaccttaaatgatcggaaggacgggatctgccgttgtata -gaccccaactctatctaatttttataacacctctgtaatcaacaaatcttattatgccat -cattatgtcattcgccaagtaagtccagttcgagattctctggaccgtgcaatagtattg -tcaaattatggtaatggaatccttcttctaacacccttagaaaagccacgagaattgaca -agttgggcgtgcttgtccaggagcaacataagtgccgtttctttttacgatgatagggat -tcttaaagcttttctctattctagatcccagttgccatcatcaatatctcaattgatgct -cattatatagttcttatttagtatgtccagatgtcactgaagatcctgcctagaaccgat -attctcgacaggatcatcagttcgacggggcaaacgcacctatgcacatccatcttgacc -gtgaaacgaaaggaaagagtcagtaccgacccaatgtggaaaaaaactcctgtccacgat -atgtaggcaagttttactgcctttaattagtagtcgattagtgtagtttgatattatcta -ccttatagaatgtaaacagtaacccggccttaatggtttggcaggattctttgtaaaagt -taataatgttcataaactttatcagaaaacctgaagtagtccgcctttcgcctgcgtaac -gttgcagattaattcgttttacggagtggcttgcgtcttgttgtccgagtacacatattg -ctcctctcccccactcttctaggaaaatcaattatgctaacctgcagaccttcttcttta -ctatctttaatgcatgcccagtatgttcatagggtagacttgctatctattttgtataat -ctacgaatgatgcttggggcgcgacttttaacaattaagccgttgggtataatttgagag -ggtgccacgatagtaagagatttccggcgtgagtaaggaaaatgataataggattaagca -ggcgtaatagctcaccctcctcagttctccaaccctgaaccggctaagtatgactgtgca -gtattaattttgaatacatattgcagcccctaggatacattatagatgtctctttcttac -ccaaactcgcccgcaccaagaaagaatgtggattcgattgaggttaaattagccggaatt -acagacacagattcttgtttacaattgtgggaagaaaaccacctcaaacgttgaaaccta -cattcacaaatggattacgttggggatgagaatcgattccggtcaaaaatcatgcccgga -gcaataaccaagaattcacagaggattaatacacttctccatgaagataggactgcttgc -actatccttatctttgtgtcttccttcaagcaccaatcgtttggggacaaccacaattat -gccaagaaataacggaaggtgttccaaatctatgagtccgcggtttcatcgcaacgtttc -actgtgggtatcatgactttggactttagatttgggtattctagagactgtagaaagact -gcaacaacaagacattcacagggcgaaacctaggaaaggggaccgcacgttgtgctaggg -atgtttccttaggaatccatacatgtaagaaagaatcaaccgtaattatagtgttttcgg -ccccttgaattacgtgcatgcctttgctaaaagacctctgggaaatagattgaatattct -ggacagcagcgaatcctgattatatctcaagcgaatatatgacccgcaagaaggatttat -actagaataagtctaagaaagggcattgggtcacttcttccactaacacacttttatcag -ttttataccttgagagtcccatgcatttttatatatatttaactttcgttgcgtaaaact -ttaaatatgatccgtgctctatctctaatctgaacaacggtatcacgtcgaacaaatcta -gtggctacgaatcgcgtcgctaagaacggtttcttctgctggcgttagctacgtatcttc -tatgctaaaaatgtatagccccgcattagcagcaaaaccgggagaatcaaatacacatcc -gatgaaatcgtaacaaagataaaacaacgcgatttctatgtttgccaaagtgattaagtt -gtatcgtaggggtcagcgctgatgtcttttcagtttgggttttggatttaccagtctttt -agtttcggtactatttgatcgggacattcgtccaaacatgatggctcattcgttcttttt -ttcaattttaatcaaaaccttgtatttacctgatacattaaactgagcatcgcatggagg -tggagattcccatatatgtaatcatttgatatcctattccattctttttagttataaata -aacgctccactgcacaatgggagtaggacttcaccaataattagcatctactgtaaacaa -gcgccgtaacgaaatgattactgattgagaaaaataggtctcaacaacttttgacagata -tgtatccgatacccaagcgttgctaattgcgcaaaagtaagtagaattacggtcgtatta -cttgttgccaaatggttattactccaatgggctattctaatccgatggatacgtaggaga -gagtgtacctacaccgaaactcgtagtgggcttagtggctacgtagaagctgttcgggtc -agttacagcgtgcgaccttgtaaaatcgatcacggtgatgaattattgttattgtttaaa -agaagtcccctgaatagcccttagataatacgaaaatttgttatgtccagtcgctcgtat -atcaaaagattcggttaagttcgcagagttttgccaagtttacaggtgatttactaacac -ttgggagggtacgtacaaccatcacctggttagcagagaatgaattatacggtcatgtcg -cgaagggcaagtgtgtgagtattgaccgagttattaaacgtaaatgcaggcatttacgtc -ataggacatcgagtttgtcctttgcgaaatgttaaatttatggttttttccgttgagtga -taatagctgcaacatgaagatagtaaaactgaggttaaactttcaccatattaaattata -tgttcaattacgcgatgtacaaactaatgttaatcagatttaggagcgcgcttaatatgg -gtccctatcccgactttgtacgagattttgataaaaaatagtattgtaaattcatttgat -ggcgtagaaccgggcaaaaccttgaaaaaggacacatttaggatgctatttccctaagaa -agcggaaaatcctggctcaatatttataatagtaatggttaagattgtggcccaatcgct -gagtacccgtcttacgctttttccaacacataatcgacgagaatgtatttaaatgtttga -gacttacgttttccgcgtacttattattaaagtcattggagagggtgtcgtctgggtgta -gttttctcatctgctcaggagctaaaaatgtaaatctattggttgtttctaattctgtcg -tccgtgtaggctatttaatttttatggtacacttgaatatgtttagccataatgtagcca -atactacaatatcagatacttgtatacgacctatagacttttgccgaccgctcgtagagt -gatttagaaagatgttcggatagcacagcaatcgtttgcgaatgtaagcatgcgaagcga -gtatttaactgttgactattttgctatatgttactctgaatgttgttttttttaccagaa -tgtgttataatgatcaaccatgcacgttcctactaatcatataaattttgttacgtaagc -ttttctatgatagtggtctaaagactacccttgcatactttaagattaagacatgcactt -taggaggaactcacacgttttgagctgttctagcccacctataagccattcgtccgcaat -cccataactacaatagtcggcaatcttttattacccagaactaacgtttttatttcccgg -tacgtatcacattaatcttaatttaatgcgtgagagtaacgatgaacgaaagttatttat -gtttaagccgcttcttgagaatacagattactgttagaatgaaggcatcataactagaac -accaacgcgcacctcgcacattactctaatagtagctttattcagtttaatatagacagt -atttgaaccaggcgctaatgttaaggcccccttcgaaaaccttgttatgttattccatgt -ggtcggaggatttgcggggcgatagcgctgggcggggatcaacaatttcgttcatgcgag -cgcccccataaccagtaggtacagttcggaaaagaaaaccccacgcactcgctagaagtg -ttacaatcacatcacttcgtaccgaagggactactgtattccgtcttggggatgtaacag -actgattacagtcttatgatgaagcctcattcatctaaaattagttgatttattccacgg -atactatcacactcctatagaaagagttaccaccgtgggaagctagatataataaataaa -agacatacaatattagtatggctcatgatctacacttactcggatctctctttttttata -accagtagatcgcattacacgtattgttgttccgcatcaggccctaggggctcaaacttc -catggtggataactaaaacgtccgtcactaaacgaagatattaatagatgaaatacacgg -gtttacttgatttctgttcagtcattcacgggaaatcctaggagtctttcataacggcgg -tcttagtaggaatgtagtcaagctctgtagaggtctcgacggaattggtatttcctggca -tcacaatttacctagtattggagatcacttaaaataatgttgagataataatcaggatat -ttctagtatgtgacaaacctctatttagtgattgtgattttcaattaaacaagacgtagg -ggtcaaattaacgactacatgttggaaagaaggccgaattgtaatatctaactcatgtac -taagaagaagtgctttcgtttaaggctttctgtctaacattctaacgtcaattcctatgt -aatactactgtaaccaagttattactcggctgcgtagataaagtctcatgtaaatgacgg -tttatctgttacttttgggtttcaacctagctaggacgccggtactaattacgacacctg -cgtatagtgcagggtgttcaatgtgcctttttatgtccggattataaccatccctctccc -acttggaatatcaccgggttcttaatgacttagttcgtcttccttattttccgggtaaga -tcgctgtggaccggacccattttgatctagtctaaaaaggtatatagcgtttcgtctggc -ccgcttacgttcactgaaacttagattaatcaatgcactgcactggattaacaagaacat -gttatagtgtactgacacatgttagactaagaggtctgttcgggttagccgacttatatg -tttaaccgattttgacaactgggttgagagataacaatgaagagtgaggactgtagaaga -tcttaaaactgtaccatagtgctcaattcgctaatggcttgaattatttaattgttctaa -ccctggcgtcgaatttttttggttcgaaaatacttagcacagcgtattgttcaacgagat -gcacaactgtaccgttagaaagcggcttaatgacaaggcagtattgtgactattgacagg -gaatcctaaaaagctactcgaattggtatatggaagaggtatgtactgagaggtcgcgcc -tattagtcaaattctgccaaagaagagtcaaaagcttaactagtttgatggtatgaggtt -taatgctaggtggtctataccaccaaaaagtatatgggatatcccagaatttatcgactt -tcaatcgtctaccgtcacgacgtacactaggcagccctaatccaaaacttttgaggatga -gtactgccactattatactgtaccatttgtaacttacattttatatcttcaaagaggtag -atattgtcggccattactgtcacttacactaagggtagcttgattactgatacctctcat -ggtaaaaagtaatttaagaacctatttttttacataacctctgctactaccgttagtgtt -ttagtcggttcaagtcacaaaatccctgtagcgcacccctataagcagaaggaaacctta -atgcggataaaaacttttgccggaaccgttaatcctatgagaataccactcttggaatcg -gtcctttaggctgaggatatagaacgaggggaacgcatcaatctaggttaggtgagagaa -ctttgtatcaaaacgcaagtaccatatgccgtcctcagtaaattgccaaatgcagaaatc -ttacactcttttcttaactaagtatgagagcaacctcactcctgaacagcttgttaccta -acgagaagaggctttaagtagcctggagcctcaaccggatatccggatttgactctcatc -cacttacatgatgattacggtcattacatctcatgattttctgagtgccctatagactgg -gaatttaatctaccctgtttctatttgttaacaaggagaaccactggtcaagatgacgcg -cttccatttatgccaccataagtaagttctcggaacccttacatgattggcctaccaacc -tatatatgtgaccaatgtacggtacatagagtgtggcctatcatattcaggtcatcgagc -tcagtatttaaagattatatggtcgctgggggtattcagtgcgcgatggaagactaacat -tggaaatcaacggaattgacaacacgctcactttaataacctatctcaggataagtttaa -tgtaattagacggaactttctctaactccgtgtactaactctttgaaaataatgtgggta -tttttatttcatctagatttgtctgtatcgaaagaaagtattggtccaaataatcctcag -taaaatcaagtcataaatataaaatttagatcttaggacagaggaaagtgctttcccgag -cataggatctggcctacgccagtagttcatgcttgtgttaaaagttgttactgtttatag -tccgtactcagggtagtgttcgatactcagcggggaactgacatattacactaaggaatc -aaggcccttcgtatgggtcatgtttatatatttaattacttacgctatttgatcgagaat -agctatagtaacgtcgtaagaatgcaggatgcgattcgagtttgtaaattcacagatact -gtgtatcatattattatagatgttaaggcatagaattattggtattgatgtacaaaaaat -tatgggtgggcagtaccgataggcattacgagcagtgcagcttggaagaactggatgtat -cctataactagtaagagccttaaaggtactacatacccagggatgttaccatcattaatt -tggccatcttcaatcttcgcaatgcatactttcttctacaagatgccttttagaagacaa -aataagtgtcaacaataacgctgtaacttaactctgttgtacgtggaatcaagtctcact -aaagcaactaacattccgacatgcaaacgcaggactactagattattaaattcgccagcc -cgcctcgtttaatataacatcataaaaattctaagtaatatctcacacactaatccgcca -tcgtccatagcatcagtcacctgtcttacacaaacacatgtttaatcgatgttgttatgc -caagctagtttcgcgaccatgtaactaattgtggaaagctgctaccttgaacgacatcaa -ccatcctacctttgtacaacagaccaacatctctgtactggtaaatagatctgaaaagtt -ataaatataactgttttcacattgatagaaaaacagctatgtgctatttgtatatactat -aataaattaagcgaaacatggagattaaaacagtgttttctcatcctccacctcttgttc -tgctaatttataattcttgatgccactcgtgtgagtcgtccattcgatcgtaaagaaccc -gacataaatagatacgacgctgaacgagatcctatttctcctgaaaattattagcacggt -aactcctagggatagtggtactagttggtatgaacgtataaaaacttgtactactttctc -gggatgtgagggagcaaactattactcgaccagtgcaacgcattatcgacagtaaaagtt -ttcagctgatacctgtctggatggattatatgcaggtaggcgagagtggattgtagcgat -gctcggcgggggtattttaaaaatctaggtgataaaagtcctgtttagccaggaaaagtc -atcattgcactgcatatcgtcgattagctgtcatttcgtccactggtaccagttcaacgt -acatcaaagtccgggcgcatccatatcaagttttgcaatagtactccagaccatgaaatg -gttatccagattaataataacttaatatactttcactacatactcagcgggtattaaatt -tcactttatgtcaaaggactcttatgtggtcttcaaaaaggtctagagtctatcacgcct -aattgtgtgaaaaccgagtaacttgatcagccttgtaaaatatagtagaatatgatgtta -aatcatttatattccagggagattgaatagcttacgattagctggtataatttaactcac -atgattaagcaaatatctgtaggaccgagggaaagaataaaataaagtaccatgagttcg -gaacgctgcattacatggcgttgggctagcctgatacaagaagatgagtatggagctctc -ttcatcgggacgtgacaaccctagcgtaatcttggcagatcccggagcagatgattatcg -tctaacactgtctttaccaatgcacaacgcatagatttaacctgaactgttctggattca -ctcctgactacagcctacaactcatttctatgcataactcttaaagacagtcgcaatatc -agtacctctatacacatcggatcagactagatcataagataagtctcctctggatccttg -tattctgttaagtacactacaaatttgtttagtgtctgggacaattacgataagggtcgc -gactagaccacagggcatatgacctccaccgctcctagcgagtctccaatctgcaagcac -tcatacgctaggggcatgaatcgactgtcaatgcactgtaagatttacgagggtgagacc -catttagatatgcctcgtttaaccgttttaggcttgataggatgagtttgtcgatccatc -aaattcccgacattcatattgtccaataagtatatctagcttattcggactcgctaaact -aaattatggtataaatgccgtcaaccggtgcatttgttcaatcaacaaattatagtcaat -ctcccatggggccttatggcagcgtatacagctggtataacgaccatatacaactatgaa -cggactagctgtgaactaagcagattattggatccttgtgtataattttaagtttcgatc -tatatgctatagtatagaaaatgttccgatcgtacgcttcctttacagttaaacagtcta -tatcatgaagcttatccaaagctggacatttgatggcaatcttacttaattatgaaactt -aattacctattattgaaagtatttatatgatcgaataagatttgctctataaacaggtcg -tccattcacgacctagtgattgcgtaaattgaccaacctaggtaatctaaagcctgcatc -tatttcttatcattcatgttatactgacccgttctcagtacttaaaaatgatcgtaagca -agaatcactcacgctcatgtcacatttagtcgaaataaactgccgatgggaaggaagttc -cgtcattgcgatatcgatgtctatcccacgcgtcattttcaaattggttatctacggata -actgtgcgatgaactactataggtcaaaattatcttcaatctcattctagatcatataaa -gatgtccttcgcgattgatacgtctacagtgtgttggtgttacacagagggtagcgacta -cttacttactaactctctcttgatccgcaagcataagccaggttaaagtgctctatcttt -ttctgtggattataatagttataccgccttgcatctaggtgcccattaggtaatgcccta -gtgttttcataaatttactcctgccatctaacgttactttaatttcccagattcaatagg -tctctcatttgaaaattgttatatgtcaacaaagaatataatagctgagtggaacaatac -actgtgagggagtaatacatactctaaattttctttacggtttgcgcctgcacagttttt -tttatctatgtgatccgcataaaaagtaatttcaacgttccattcaagttaagtcttggt -gacactagcattaggagagatcaccaagaccattatttatttagctagggtttaagtcgg -ttagaaatatcagataatgaggtctttatccggccttacgcagtagaaattggaaatttc -gtaaagcactgagttcaatggaagtatggccgaacccacataatgcacaaatcaagtcga -tttcttccgtccttttagtctcctgggaactacgggttattcatagttaagctaaatcag -ttaacggaactagacaaatgtataatagttcccaaatatatatctataaatcttatgcag -ttagggaatgcagatttgaatcatggcaatacgctagctcggaactcaactacaagtgtt -ggatgtacgaattcaaaggtattacatccttatgatgttcttttttggatacttttatga -cgacttccacgaagtgaaattatgttcgaatatctgaacagttacttggttgagcccaag -gatgacgaatgttctgtttataattctcgtcataatataaatacaagcatatgaggccag -tcatggagctttcatttggactaacatttccgtagagtcatatcacgcctgtaatctgat -ccgtctttttctattcgaagtgttatcagatacatgacgcccttgcgtgacattcatggc -tcctgacatcgggtcttttaggctgaatctaatctaacccaatttgtttggattgtgggt -cctccattttgtctgttaatgcttattaagattaaaaatgtactacgtatttagacctaa -tgattgcgatacgctgtggaccattaatataagctgcgccaggggatttttccagatcat -ctggcctgtgtatatgttcaaatctaatagccgagagaaattactccgacggaaaataaa -ggcagataagcgtttcagagcaccatcgtggcgtttagtcaacctttagttcggaattta -ttaatatacaatctcactctttggacgagctccttaaaagatgcccttgtatatcatgtc -ccgtacctaaaagtataccagcatcatcaaagaacagttaaggaatacgactgctctata -attgtccgaggagtaccttctcatctgccaatagtcgttgggttggaaaacaacgcatta -atatgccacacttgtcaattagaagtttctataaaggggacgagtaactgatttgagacc -tagcacggcagaggacgttcgtgtgacaacatctctttataagtttgagataaaatcgct -aatctacaatgattatttgccaatcattatcgaatgcgcaaagtatctcctgttcgtgat -tctagcctaaggccattactatggtcaaattatgctaatcgaagcagtcttctaacaccc -ttagaaaagcaaacactattgaatactgccgccgcattcgccagcaccaacataactgca -cgtgcttttttccatgattggcattatgaaagatttgatctatgattcttaccagttgca -atattcaatttagcatgtgttcctaattattgtgttattatggtctatctcatcatgtaa -atgaagatcatgacgtcaacacagattctagtcaggatcatcagttcctcggggaaatcg -cacctaggaacagccttatgcaaccgctaaacaaagcaatgaggatgtaccgacaaaagc -tcgatttaaaagcctcgaaacgagatgtacgaatcgtttactgccttttatgaggagtcg -agtactgttggttcatatttgctacatgattgtatgtaataacgatcccgccctttatcg -gttcgatcctttatggcgataagttatgaatcgtcagtatctttagatcaaaaactcaac -tagtacccagttccccggaggaacggtcatgattaatgcgttttacggtctcccgtccct -cttcttgtcagaggaatcagtttcatccgatcccactcgatgattggtatagctatttgc -cgaaaagccacaacgtattcggtactatcttgtttgattcccctgtatcttaattcgcga -cacttgatatcttttgtgtttaatcgacgaatcatcctgggggcgacacttgttacaatt -atccagttgcgtttaatggctgtgggtcacaagattgttagacaggtcccgcgtgtcgta -ggaaattgataattggagtttgcaggacgaatagctcacccgcctaagtgatccaaccct -catcaggataactatcactgggcagtattatttttgatttcatatgccaccccctaggag -actgtagtcatgtatctttcttacccaatctagcccgaaacaagaaagaatgtcgattcc -agtcaccttttattagaccgatttacacacaaagtgtcttggtttaaaggctggcatgaa -tacatactcaaaagttgaaaacgacttgctctattcgattaccttcgcgatctcaatcga -ttacgctaaattttaatgcccgctgaaatatccaacatttaaaacaggattaattctctg -atccatgaacttaggactcattgcacgtgacttatctttctctcttaattcatgctccaa -tacggtgggctaaaccacttttatcacatgaatgtacgcaacgtgttaataagctatgag -tacgcgggggcagcgaaacgggtcaatctgggtatcttctattgggacggtacatttcgg -ttttatagactatgtagttacacggcatcaacatgtaattaaaacggcgtaacctaggaa -agccgaacgcaccttgggattgccatgtgtccggaggattacatacatctaagaaacatt -ctaaactatgtatagtcgtttacgacccttgtagtacgtgcatcccttggcgaaaagtac -tctgggtattagagtgtatattatcgacagcaccgaatcctcattttatagcttgacaat -ttatgacccgaaagaaccttttataagtctataagtatatctaacgcaattgcggcactg -agtccactaactatctttgagcagtgttatacagtgagacgccatggaaggggtttatat -attttactgtcgttccctaaaaagttaattatcagacctgcgcgatctcgtagatgaaca -acgcgatctagtcgaaaaatgcttgtggctaccattccagtcgagatcaaccgtttctgc -ggatcgcgttacattccttgcttatttgcgataaatcgatacaaccccattaccagaaaa -acccggagaatcaattactctgcagatcttatactaaaaaagagattacaacccctgttc -tatgtgtcccaaagtgagtaacgtggagcgttggggtaagagcggagcgattttaacttt -cgcttttccattttccagtattgtactttacgttatatttgagcggcacattcgtcaaaa -catgatccatatggactgaggtgtttaaatgttaatcaaataattgtattttcagctgac -tttaaaatctgcagccattggaggtggagattccaatagatgtaagcaggtgatatcata -tgcaattcttgtgacttattaagataccagacacggcacaatcgcagtagcacgtaaaca -ataatgacaatcgacggttaaattccgaacgtaagatatgtttacggatgcactaaaata -ggtagcaacaacgtttctctgagatgtataagttaccaaacactggagaattccgctaaa -ctaaggacaatttccgtcgtattaattgttgacaaatggttagtaatacattcgcagtgg -ataatccgttgcatacctagcactgagtgtaaataaaaccaatcgactactggcatttcg -ggctaacgactagatgttagcctatgtgaaagcctcacacatgcttattgccttcacggt -gagcaatgtttcttattcgttattagaagtcacctgtagagacagtagagatgacctaaa -tttggtttgtccagtcccgaggtgatctaatgattaggttaacttagaacagtggtcaat -tggttaaagctgatttacgaacacttccgaggggtcgtaaaacattaaactggtgagaac -agtatgatgtattcggtcatctagacaaccccatcgctgggagtttggacagtgttatga -ttcgtaaatccaccatgtgtccgaattcgaaatcctgttgctccggggagatagggttaa -tttaggcttttttacggtgtggcatattagctcaaacatcaacattcttaaaatcagcgt -aaacggtcaccagttgatatttgttctgctaggaagcgatgtacaaaataagcttaataa -gatttaggtccgaccttaatttcggtccatagcacctctttctaagtgttttgcttaaat -aattgtattgttattgattttctgcgagttgaacacggaaaataagtcaaaaaggacact -tttaggttcatatgtaccgatgaatgcgcaatagaatcgagaaatttttagattagtaat -cgtgatgattgtggccaaatcccgcactaaacggctttcgctgtttccaaaaaattttag -tccactaggtatttaaatgttggacactgaacgtggaagccgtcgtattatgaaactaat -ggcagaggggctcctctgcgtgtactttgagcagatgctatcgtcagaaaaaggtaaatc -ttttggttctttataattctggcgtccgtgtagcctagtgaatgtgtttggttcaagtga -atttgtttagccagaatggaccaattacgtcattagctgttacgtctatacgaaatatag -actgtggacgacccatcgtagagtcatgtagttacatgtgaccttagaacaccaatcgtg -tgcgattgtaagcaggacaacacagtattgtactggtcaattggttcatagatctgacta -tgaatcttcgtttttgtacaacaatctcggtgaagcttcaaaaagcctccttcctaataa -tcagttaatttttcgtaaggttcctgttcgaggttagtcgtataaagacgaaacggcctt -aatgtaacattaactattccactgtaggtggatctaacaaggttggacatgtgctaccaa -taagataagaatttcgtccgcaatacaatatctacttttgtagcctatcttggattaaca -acaacttacgttggtatttcaccggacgtatcaaatgattctgattttaatgactgagag -taaacatcaacgaatcttatgtatctttaagccgctgcttgacaagtcacattactgtta -gaatgaacgcttcattactacaaaacctaccaccaactcccacattaatattatactaga -tgtttgaagtttatttgacaaaggttttcaaaaagcacagaatcgttacgaacacgtaca -ttaaattgttagggtattaattgtggtcggtgcatttccggccccatagcgctccgcggg -gagaaactatggccttcatgacagcccccccataacatctaggtaatggtcggataacta -taaacaaccctctccagagaactgtgaaaataaaatctcttagtacacaagcgtatactg -gtttaagtcttgcccatcttaaagactcttttcactattttcttgatgcctcattcttct -aatattaggtgattttttaatccgagaatataaaaagacgatagaaagtgttaaaacacg -gcgtagcgacatattttaaagaaatgaaatactttttgactatccctcatgatctaaact -tacgcggagctatctttttgtataacatgtacagagaattaatccgatgcttcttccgat -taaggacatagcgccgaaaacgtcatggcggcttatcgatatcgtaacgcactataccaa -gtgattaagtgatcaatgaatacgggtttcgggatttctgttaagtcatgcacggcaaat -acttggagtcttgaataacgccgcgcgtagtacgaaggttctcaagctcgcgtgacgtat -agaccgtattgctatttcctgccttctcaattgtccgaggattgctgataacttaaaata -aggttgagtttttaataacgatttgtcgagtttgggaaaatcctcgtttgtgtgtttgtc -attttcaagttatcaagaactacgggtataatttacgacgtaatgttggtttgatgcccg -attgcgaatatcgtacgaatggtatttgtacaactgctttcctttatcgattgctcgaga -acattataaagtctattactatggattaagactgtatacaagtgtttaagcggagcccgt -gataatctataaggttttggtacctttatctgttacttttgccttgaaacatacatacgt -acacgggaatatttacctaaacgccgtatagtccagcctcgtatttgggccgtgttttgt -cagcattttaaactgaaagcgcccacttgcattataacccggtgcggaatctcttagtga -ctcgtcaggagtttacgcctttgagacctctcgacaggacccattttgatctagtcgtta -taggtagagtgcctttcctatcgcaccattaccttctagcaaacttagagtattcaatga -aatcatatcctgtttatactaaatgttataggctaatgacacagctgacactaagaggtc -tcttcgggttacccgaatgagttgtttatacgatgttgacaactcgggggagtcatttca -atgaagactgaggactcttgatcagattaaaacgcttaatgactgataatttagattatg -ccgtgtattatttaagtgggcgaaccctcccctagaatgggtttcctgagaaaagtctta -gaacacagtattctgaatccagatgcaaatcgctaacgttagtaagcggctgtagctctt -ggcagtttggtcaatagtcaatcgcaatccgtttaaccgtctactattcctagagcgaag -agctatgttctgacacgtccccaatattaggcaaaggctccaaaagaacagtcaattgat -taactacgggcttggtttctccgtgaatccttgcgccgctataccacataaaaggatagc -ggtgataccacaagtttgcgacgttaaagcgtcgaccctcaacaagtacactagcaaccc -cttagcaattaattttgtccatcactactgccaagagttgactggaccagttggaaatga -catttgatatattaatagagctacatattgtaccactttactgtcacttacactaaccct -agcgtgattactcatacatatattcgtaaattctaagttatgatactagttttgtaaatt -taatcggcgaagacacgttctcttgtacgagcttcaactaaatatttcactgtagccaac -cactttaaccagaaggataccttaatgccgatataatattgtccaggaaacgttaatact -ttcacaagacaaagcttggaagaggtactttacgatcacctgatagatcgaccggaacga -ttctatataggtttggtctgagaaatttgtagctaaaaccatgttccataggaactcctc -tgtaatgggcaaaatgcagatagcgttcaatcgttgcttaactatctatcacagcatcct -aactcctcaacagcttctttcctaaagacatcagcaggtaagttgacggcacccgataac -ccagagcacgattggaatctaatactctgtatggatcattacgctaagtaaatataatga -ttttctgactcaaagttacactgcgaattttatattaactggttctatttgttaaatacc -acaacctctcgtcaacaggtcgcgatgcaagtgatccaaaaatatctaacttataccaac -cattacttctggcgcagaaaaacatagatatctgaacaatcgaccgttaagactgtctcg -ccgatcttaggaacctaatactgctcagtagttattgtttatttgggccatccccggatt -atgtcagccatggaacactaaaagtcctaatctaacctatggacaaaaagctcactttta -taaaattgctcaccttatgttgattgttatttgtccgaaatgtctataactcagtgtact -atctattggaaaattatggccggagttttattgaatatacttttgtatgttgagaaagaa -tgttgtcgtaataattatcagctggaaaatcatctaatatatattatattgagatattac -gacagacctaagtgctttcccgtcatgagcagatggactaacactcttggtaatccttct -cgttttagttggtaatgtttagtctaagtaatatcccgactcttacttactcagagcgga -aatgactttttaaactaacgtttaaaggcacttagtatgcgtcagggttatttttttaat -tacgtacccttgtgcagagagtttagctattcgatcctacttagtatgaaccatgagagt -acaggttggtaattcacagagaaggtcgagaagattatttttgatgtttaccaatactat -gaggcgtattcatcgaaataattttatggctgcgcacttcacatacgcaggaagaccact -gcagcttgctagatctggatgtatcattgtacttctaagagcctgaaaggtaatacattc -ccagcgagcgtaacagattgtatggggacatattcaatcttagcaatgcattcgttcttc -gaaatcaggcatttttgatgtcataagttctgtcaactataaccctggaactttaatctg -ttgttcgtcgaatcaaggatcaagaaagcttctaaaaggcccaaagcaaaacccaccact -acttcagttttaaattagaatcacaccctagggtattagataataattaaatgtcttagg -aagagatatcaaaagatgcagacatcctcaagtgaataagtctccggtctttcacaaaca -catggttaagcgatgtggttttgactagagacgttcgccaccatcgtaatatttctggtt -acctgcgaacgtgaaccaaatcttacttcatacattgcttaaacagtacaacttatctct -tatcctatagagatctcaaaagtttgtatttttactggtttcaaattgagagaaaaactg -cgttctccgatttctatattattgtttaaatgatgccaaacatccagtttaaaacacggt -gtgatcagccgactcagattcgtatcctatgttagaatgagtcatcaaactacggtcacg -cgtacattacagagtaaactacacgaatgaaagagataagaagatgaaagagttaatagg -tctcctgttaattatgagaaccctaactactacggattggcctactagtgggttggaacg -gatataaaattcgactaagttcgcggcatgtcaggctcctaaatatgaagagaactcggc -atcgaattatccacagtaatagttggaacatgattcctctatgcatggtgtatatccacg -tacgccagtgtgcagtgtagccatgcgaccacgggcgttgtgaatattcttcctcagaaa -aggactgttgagcaaggaattggattctgtgaacggaatatagtcgagtagatggaattt -cctacactgcgaaaaggtcatagtaaatcaaacgccgcgcgcagacatatcttcttggca -attagtactccactaaatcaattggttataaacttttagaatatctttatataagttcac -tacttacgctgcgggtagtatatttaaagtgatgtcttaggaatcttatggcggcggaat -aaacggcttgactatagataccctaattctggcataaccctgtaacgtgtgaagcatgct -ttaatagacgactagatcagcttatagaatggatatgactgccacattgaagagattaac -attagcgggtataatgttacgaacttgtttaacaaaatagctctaccacacacgcatagt -ataatataaaggtcctggagttcgctacgagcctggaattgcagttcccctaccctgagt -aaacaagatcagtatggacctatcttctgacccacgtgtaaaaactaccgttagcggccc -tgagaacggtgaagttgattatcggctaacactcgctttaccaaggaacaaacaattgat -ggaacaggtaagcggctggattctatcctgaatacagcataataatatttgctttcaata -tatagttatgacactcccaatatcactaactctttacaaatcggatatgaagagtgaatt -agagatggagccgatcgttccttgtattctggtaagtactcgactaatgtgtgtagtcta -ggggtaaaggtccttaaccgtcgagtctagaactcacgcattatgaaatcctccgagcat -agagactctaaattcgccaagcaataagtcccgacgcgaaggatgagaagctcattgaac -tgtaacatttacgtcgggctcaccatgttacatatgcagcgggtaaaagtttttgcctgg -agtggttgagtttcgcgatacataaaaggccccactttcatatggtcaaatatctatatc -gtgctttggacgactcgataaactaaagtagcctagtaatgccctaaaccgctgcatttg -tgcaataaaaaatttagagtatatataacttccggacgtatggctgccttgaatcctcgg -atatcgtccttatacaacgatgaacggtatagctcggaactatgcagattaggcgatcct -tgggttgaatttttagtttccatagatatgagttagttttgatatggttaccatacgtcc -ctgcattgaaacttaatctgtatattgattgatccttagcaatagcggcacatttctggg -caatatgacttaattaggttacggtttttactatgatggatacgttttatatgatagaat -aacagttgctatttaaacaggtactacattcaactaatactgtttcactattgtgtccaa -catagggaatatattgcctgaatagatgtattatcaggcatcttttacgctccaggtaga -actaattaaaaatgatccttagaaactttcaagcaacataagctaaaagttacgccaatt -ataagccacatcggtaggatcttcaggcattcccatatccttctctatcaatcccgtctg -ttgctaattggttatctaagcatatcgcggcgagcatctacgataggtataaagttgctg -ctatctaattcgtcataatatatacatggaattacagattcatacgtcttcagtctcgtg -gtgtttctaagagcggacccaagaattacgtaatatctctctcgtgttacccaagaagtt -gacacgtgattgtcagctatctttttctggcgatgttaatagttataaacaattgcatat -agctgcaaattagctaatcaaatactcgtttcttaaatgttatcagcaaagctttaggtt -ctgtaatttcactgtgtaaagagggcgctaagttcaaaattggtttttggcaacaaacaa -tttaatagcgcagtgcaaaaataatatctcagggtgtaattatttctctaattggtcttt -acggttggaccaggcaatgggttttttatctatgtgataccaattaaaagtaatttcaaa -gtgacattaaacttaagtattgctgtcaagaccattacgacacttcaccaacacatttat -gtattgtgctacgcggtatggcccgtagtaatttctgatattgaccgcgttatcagcaag -tacgctgtacaaatgccaaatttagtaaagctctgtgtgcattccaaggtgcccacatca -cacattatcaacatatcatgtcgttgtattacgtccttttactagcctgggaaataccgg -tgattcagagtgaacataaatctctgaaagctactagacaaagctagtatagttaaaata -tatatttcttttaatattaggatctttgcgattgcacatttcaagcatcgcattaaccta -cctccgtactcttctacaacggttgcatgtacgatttctatgcgatgaaatacttatgtt -cttagtttggggttactttgttcacctagtcctcgaacgcaaattagcttcgaatatctg -aaaagtgtatgcgggcaccaaaacgatctcgattcttaggtttataattatagtcagaag -ataaatacatgcatatctggacactcttccacatgtcatgtcgactaactttgaactaca -gtcatatatagactgttatctgatccgtatgtgtctattactactcttatctgagaaagg -acccaatggagtcacagtaagcgatcatgtcatcggggctttttccctgattataagatt -acactattgctgtgcttggggcctcctactttttctatcttaatcattttgtacattaaa -aagctaagaagtaggtacaacttatctttcccatacgagctggaccattaatttaacagc -cgcaaggcgagttttaatgttaatctggaagggctttatgttctaagcttttagcactga -gaaattaatccgtaggaaattaatcccacataacccggtaagagaaccttacgccccgtt -actaataatgttctgcgcaatgtaggaagtgacaagctcactcttgcgacgagctcctta -atacaggccctgcgttatattcgaccgtacctataactagaccaccatcttaaatgtaca -gttatggttttcgacgcatagagtatgggaccacctcgaaatgctcagctgcaaattgta -ctgggggtggttatcaaacatttaatatgaatctatggtaaagtactagtttatagatag -ccgaacactaaaggtttgcagaccttcctcccctgaggaacttcgtgtcacaaattagat -tgagaaggtggtgataaaatcgcgtatctacaatgatttggtgcaaatatttatcgattg -cccaatcgttctactcgtactctttatagcctaacgccttttcttggcgctaattagcct -aatccaagaaggagtctaacaaaattacttaaccatactcttgtctattcggcccacgca -tgcgcaagctcaaaaagttctcaacgggcgtttttacttgagtcccaggaggtaacattg -gatctatgagtcttaacagtggaaatatgatttttagattgtgttcagatttattgtctt -attttggtctatctcatcagctatagctacataatgacgtcttaactgtttcgactaacc -ttcagatctgactaccccaaatacaacatagcaaaagaatgatgctaacgcttaactatc -ctttcacgatcttaacaaaaaagctccatttaaaagaatcgaaaacagatctaccattcg -tggaatcaatttttggacgagtactggtcgggtcgtgcttatttgctacaggattgtttc -gtataacgttcaagcactttagcggttccatccttgatggcgttaactgatgatgcgtaa -gtttatggtgatctaaaactctactacgaaccaggtcccagcacgaaacgtcatctttaa -tgagtttttaggtctccaggcactaggctgcgaagtggaatatgtgtcatcagagacaaa -tagatgattcctatagctttttgcagttaagccactaagtaggcggttctatagggtttc -attcaaatcgatcgtaattcccgactctgcatagcgtgggtcttgtatagaccattcttc -aggcccgccacaatggtttcaagtttcaacttccgtttattggctgtccctcaatagagt -cgttctcagggcacgactctcgttcgttattcataagtccagtttgatccacgaatacag -aacacgcatatctgataataaaagcttaacgataactttcacgcgcatggtttatttttg -atttattaggcaaccaaataccagaatgtagtcagcgatatgtagtaaaatttagacaaa -cataaaacaaagtatcgccattacagtctcctgttaggagaacctttttatcaatatgtg -taggcgtgtattggcgcccttgatttaataataattacggctaaacgtattgatattttc -caggaactgccccatctcatgagatgaccctaaattttattcacacctcatttttaattc -ttttatatcacgattatttatctgagcaagcatctttgcaagcattcatagtgacggtgc -tgtctctatgaatgcatgctaatatacggtgcgctaaacatattggttcaattcaatgta -agctacctcggaatttgcttgcactaagacggggaagccaaaacggtaaatcgccgtata -tgctagtgccaagggacttgtccgttggagtcactatggagttacaagcattataaatct -aaggaaatcgcagtatcagtccttaccccaaagatacttcgcattccctggggtacggac -catgaaatacttctttcatacatgataaacgatggagactcggttaccaccctggtagtt -actccatcaattggagttaactaagatcgctattacaggctttattagccaatcatcaca -agcctctttttagagattcacaagttagcaaaccaaagttcctttgataagtctttaacg -agatctatcccaattccggctaggagtaaaatttatatatttgagatcggggttaaagtc -acacgcaatgcaaggggtttttatatggtaatgtccttccctaattaggtaattttcaga -cctccgagagagagtagatcaacaacgcgttatactcctaaaatgcttgtcgataacatg -acactacagatcatccctggatgagcatcgactttcattacttgattagttcagttaatt -cgtttcaaaccattttcaacaaaatcccccagtagatatgtatatgcacatcttagacta -aataacagttttcataccctgggatttgtgtcactatctcaggaacgtcgagacgtcccc -tatcaccgcagcgagggtaactggccctgttccattgtaatcgatgggacgggacgttat -attgcagacccaaagtagtaataaattcagccatatggacggagggggggaattgttaag -aatataattcgattttcagctgaatgtaaaagctccagccattcctcctccacttgacat -tagttcgaagaaggtctgagaattggaattgcttgtgacgttttttgtttccagacaagg -aaatagcccagtaccaagtataatattatgacaatagaagcttaaattcacaacgtaaca -tatctgttagcatgctctaatagaccgagaaaataagtgtctatgtgtgcgagaactgtc -aattcacggcagtagtcacctaatctaacgtctagttcccgactatgaagtcttcacaaa -tggttagtaataatttcccagtggagtagaagtggcataacgtgcactctctgttaataa -tacctttagactactcccatttcgccagaacgtcttgatggtaccctatgggaaacactc -acacatgcttattgcctgcaacctcagcaatgtgtcgtatgcggtatttctacgaacagc -tagtgaaaggactgatgacctaattttggtttctcaagtccagacgtgatattttgatga -ccgtatctgacatctctgggcaattcggttaacctctggtacgaaatagtccgtcgcgta -ggtaaaaatgataatgctgtcatcactatcatgttttagctaagctacactaccccatcg -ctcgcacgtggcaaagtgtgaggattccgatatcatccatgtgtacgaattcctaatact -cttgctcagggcacttagggttattgtagcctgtgttaccgtctcgcatattagatcatt -aatcaacagtcttataatcaccgtaatcggtaaacagttgttatttgttctgataggtag -acagctaataaagatgctgttgaacagttacgtcccacctttattgccctacagtgaaac -tagttcttactctgttgctgtaatatgtctagggttattgatttgctgccacttcaaaac -ggaaattaagtcattaacgaaaatggttccttcataggtaaagatcaatccccaattgaa -gccagaaattttgagatgtcgattcctgatcattcgccaaatttacagctcgtaaacgag -ttccatgtgtaaaaaaatgttgagtccactagcttgtttattctggctcaaggtacgtgg -aacacgtagtattttgatactaatgccagacccgctacgatccctgtactgtgagcagag -ccgatcctcagaaatagctaaatcttgtgcttcgttagaagtctcgactacgtgtagcct -agtgtttgtgttgcgttatagtctatttgtggacacagtatggtcaaatgacgtcttttg -atctgacggcgttaacaaagatactctgggcaacacacatacttctctcatgttgtttct -tcggacctttcataacctttcctggcacatggttagctgcacatcacaggattgtaaggg -tctagtggttcagtgagcggaatatcattcgtcggtggtgttaatctatctcggtgtagc -ttataaatgcatccgtaagaatattatgtttatttgtcggtacgttcatggtagtggtgt -cgccgatttagacgtaaaggcatgtatggatcttgatctatgcaaaggtaggtccatcta -tatacgttgcacagcggatacaaataagataagaatttactaacatttaaattttcttat -tgtcgagcatagattggaggaaaaacttatttacttggtatttaaacggaagtttctaat -gtttatgattggatgcacggacagtttactgcttactttcttaggtttcttgaacaacag -gatgcactagtaacatgtctcgttcatgcttccattaagttcttcttaaacttacacaaa -ctacctaatttagagttgacgagatggttgaacgtgttgtgacaaacgtttgcaaaatgc -acagtatcgttaccaaaaagtacatttaagtgtgtgcgtaggaattctgctacgtccatt -gcaggccacattcacatcccacccctgaatatatggactgaatcacacacaccaaatttc -atctaccttatcgtagcataactattaacaaacatatacagacttcgcggtaaataaaat -atattagtacacaaccgtatactggttgaactattgcccagctttaagacgcttttaact -aggtgcttgatcaagaagtattattatatgacggcagtgtgtaatacctgaatagatata -gacgttagattgtctgaaaacacgccgtagagacatttttgttagatatgtatttctttt -tgacgagccagcatcttagtatctgaagacgagctatatgtttgtagaaaatcgactgac -attgtatacgaggcggcgtaagattaaccaaattccccagaattagtaatggcgccttat -cgatttactaacgatatataacttgtgatgttgtctgcaatgtatacccgtgtaggctgt -gctcttatcgaaggaaacgcattgaagtccaggctggatgaaaccaccgcgtacttccat -gcgtctatacatagcgtcaccgatactacgttttgctatgtaatccattctaatgggtaa -gaggattcctcttatagtaaaatatgcttgactttttaagaaccattgggagtggttggc -aaaataatagtgggtgtctttctcagtgtatagttttctacaactacccctattaggtta -caagtaatctggctttcttgccacttggcgatgatagttagattcgtatttctacaacgc -agttactgtatccatggcgcgagataattagatacgatttgaatttggatgtagactcgt -tactactgttgtagaccagcacgtgagtatctagatgggtttgctaccttgttagcggac -ttttgccgggaaaaagacatacgtacaaccgtatattttactataagcagtattggccac -cctcgtattgcggcagggtgtgctcacctggttaaaatgaaagagaaaaattccatttta -aaacccggaggaatctattactgacgaggaaggtgtttaacccgttgagacatctcctaa -cgtaaaaggttcatattctagttattccgagagtcactttcctatccaaacatgaactga -tagcataatgacaggttgaatggaaagcatatcctgtttattctaaatctgtttcgctaa -tcaatatgctgtcacgaactcggagcttacccttacaactatgtgttctgtttaccaggt -gctaatatcccggcactcttttcatgcatgtcgctcctagcgtcatctgatttaatagct -taatgtctcatattttacagtagccagtgtagtatggaaggcggcgaaccagcccctaca -ttgggtttcctgacataagtattacatatcacttgtctgattacacagcaaaatcgctaa -ccttactttgcgcatgtagctattggaactttgggctagtgtctatcccattaagtttaa -cagtagactagtccgtgagcgatcaccgagcttatgtctcgtacccaagttttggatttg -gatcaaaaactactcgatattcatgatctacgggcttcctttctccgggtatcattgcgc -cgagattaaaaataaaacgatagcgctgtgaaaacatgtttgacacgggatagcgtagaa -actaaacaacgaatagaccatccaatttgaattttattgggtccagcacttcgccatagt -gttgaatggtaaagttcgaaaggaaatttgttatattaattctgctacattttcgaccac -ttgtatctcaaggacaatatcccttgaggcttttagcagaaagagatgccgtaattctaa -gggatgataataggttgggaaatttaagagcagtagtaacggtcgcgggttcgaccttaa -actatatatttaaatctagccaaacaagttaacaacaaccataaagttatgaccttatta -tattggcaagcttaacgttttaattgctctagtaatagagtggtagaggtaagggaccat -cacctgattcttcctccgcaaccattatatagacgtgtcgtctgacaaatttcgagataa -aacattcgtccttagcaacgaatatcgaatggcaattagccacattgagttaaatagttg -aggatatttcttgcacagaatcagatctaatctaatgattcgttactaaacacttcacca -ggtatcgtgaaggctcaagattacccagagaacctttgcaatataagaatatgtatgcag -cattaccctaagtaattatattctttttctgactcaaagtgacaagccctagtgtatatt -aaatcggtatatttgggaaattcctcaaactatcctaatcaggtagccatgaaagtgatc -aaaaaagttcgtacttataccatacatgaattctggccaagtaaaaaatagattgcgcaa -aattcgtaccttaagtctctcgccaagatattaggatcctattactcatatcgtgttttt -ctttattgccgccatccccggagtatctcacccatccttctcttaaaggcctaatattac -ctatgcaaataaacatatattgttgaaaattgagaacctgatcgtgattcttatgtgtac -catatgtatagtaatcacgcgactatatagtgctttagtatcgcccgtgggtgagtgaat -attctgggctagcgtgagatagtttcttgtcctaatatttttcagatcgaatagcttcta -tttttgtgtttattgacatatgtcgaaactccttactcagtgaaagtcatgaccagatcc -acgaacaatcttcggaatcagtctcgttttacggcggaatcttgagtctaacttatatcc -cgtcgcttactttctaacaccccttatgtatttttaaaattacgtttattcgaacgtact -tggcggaagcgttattttttgaagtaagttacattgggcagactcttgacattttcgata -cgactttctttcatccatcacaggactcgttcgtattgatatcagaagctcgtgatgatt -agttgtcttctttaccaatactttgaggcctattctgcgaaatttttgttgccctgcgaa -cttcacataccaaggaacacctcgcaacatgccttcatatccatcgttcattgtaattct -tacacaatgaatcctaagtaattacatccctgcgtaaaagatggtaggggcactgaggat -atattaccaagcatttagttatgagtaatcagcaatgtttcttgtattaagttctctaaa -atagttacatcgtaatgttatctcgggttccgcgaataaacgagatagattcattatata -tggccctaagcaaaaacctcctcgtattctgttggtaattagaatcacacaatacgggtt -gagatattaattatttgtagtacgaagagatataaaaagatgaacaattactcaagtcaa -gatgtatacgggatttataataaaaatcgggtagagatctgctttgcaattcagacgtgc -cactaaatcgtaatatgtcgcgttacatcagaaagggtaactattattaattaataaagg -gcttaatcactacatattagatcttatccgatagtcttatctattcgttgtatttttaag -cggttctaattcagtcattatatcagtgctccgagttctttattattgttttaaggatga -caaaatgcctcttgttataacgctgggagaagcagactaagagtcggagcagttggtaga -atgaggctgcaaaagacggtctcgacgaatggacagactttactaaaccaatgaaagaca -gaagtagagcaaagtctgaagtggtatcagcttaattatgacaacccttaatacttccct -ttcgccgaatactggcgtggaaaggttttaaaagtcgaagtagttagaggcatctctcgc -tcataaataggtagactactcgcaatccaatgtgactatgtaatactgggaacatcagtc -cgcgatgcagcgtgtttatcaaccgtccccactcgcctggggagacatgagaccaccccc -gtggggattattagtccgcagtaatcgactcttgacaatccttttcgattatgtcatagc -aatttacgacagttcagcgaagtgactactcggcgaaatggtattactaaagcattcgaa -cccacatgaatgtgattcttggcaatttctaatccactaaagcttttccgttgaatctgg -ttgtagatatttatataagttcactaattaagatcacggtagtatattgatagtgatgtc -tttgcaagaggttggccgaggaatttacggattctctattgatacaatttgtctggctta -taactcttaaggctgaaccaggcgtttttagacgacttgatcagctgttagaatggtttg -gactccctctttcatgtcagtaacatttcagccgttattgttacgatatgcttgaacaat -attgatctaccacacacccatagtatattttataggtcatgctgttacctacgagcatgg -tattccacttcccattcaatgagtattcaacatcactagcctcagagatgatgacccacc -tctaataacgtcacgttgcggccatgtgaaacctgaacttgagtagacgatatcaagcgc -tttaaattgcatataacatttgagggtaaagctaagcggatgctttatataatcaatact -caataataagatttgattgcattttagagttatgacacgacatagttcactaacgagtta -ctattcccagatctagactgaagtactgatcgagacgatccttacgtcgatgatcgttag -ttatcgacttaggtcgggtctctagcggtattggtacttaaccggacactatactaataa -cccatgatcaaagcataacagaatacagacgataatttcgccaacatatatgtacagacc -ccaagcatgagaagctcattgaaagctatcattgaagtcccgctcacaatgtgtcttttc -cagacggtttaactggttcccgggagtcctggagtttcgacttacataaatggaaacaat -gtattttgctaatttatctatagcgtcatttggaccaatacagaatattatgttgcctag -taatccactataacccgcaagtgctgatagaaaatttttagacgatttataaatgcccca -agtatccctcccgtgaatcctccgttatactaattagtattcgttcatacgtataccgcg -catatatgaacatttggcgataaggcgcgtgaattgttacgtgacagagatagcagtttc -ttgtgatatggttaacagacgtacatgaagggaaactttatatctatagtgatgcttccg -tagaaataccgccactggtctgccaatgatgaagtatgtagctttaggtttgtactatga -ggctttcgtttgtttgcagagtataacagttgcgagtgaaaaaccgacgaatttatacta -atacgctttcactattggctacaaaatagggaagagtttcaatcatgagagggagtatat -ggatgctttgtagctaaaggtagaacgtatgtatatgctgccgttcattcttgaaagata -cataagcgataagttacgacaattataagcaacatccctaccttcgtaacgatttcactg -ttactgcgcttgaaatacactatggggctattggcggagagaagcagatcgcgccgagca -tatacgagacctataatgttgatgatagagaaggcgtctgaattgatacatcgaagtaca -ctttctttcgtagtatctctcgtcctctttctatctccggacacaagaattaagttatat -atatagagtcttaccaatcatgttgaatcctgattctcagagttctttggcgggccttgt -gatgactgagaaacaatgcaatattgctccaaatttcctaagcaaattctcggttatgtt -atgttatcagcaaagcgttacgttatgttatttaaatctggaatgacggagcgaagttct -tatgtcggtgtgggaataattcttttgaagacagcactccttaaataatatcgctccgtg -tttgtatttatcgaatgggtctgtaaccttgcacaagcaaatcggtggtgtatatatcgg -ataacaattaatacgatgttcatagtgacagtatactgatcgagtcctctaaagtcaatt -acctcacttaacaatctcattgatgttgtgtcattcccggtatcgcccgtagtatgtgct -ctgattgaccgagtgtgaaccaaggaacatctactaatgcctttgttaggtaagatctct -ctgaattccttcgtgccaacttaaaacattatcaaaatttcttctacttggattaactac -ttttacgagcatggcaaattcccctgtggaagacggttcattattatcggaaaccttata -gaaattgcgtgttgactgaaattagatttttattgtaagagttgcatctttgcgattcct -ctggtctagcttccaatgaacagtcctcccttctattcgacatcgggtccttcgtacatg -tctttgcgatgtaataattaggttcggagtgtggccttaatgggtgcaactaggaataca -acgcaaatttgctgacatgatagcaaatcggtatgccggcaccaaaacgtgctccttgct -tagcttgtgaatgagactcagtagttaaataaatccatatctgcaatcgattccacaggt -attgtccactatctttgaactactctaagagatacaagcttagctgagaccgaggtgtat -atgactacgctgatatctgtaaggtaccaatgcaggcaaagtatgcgagaagctaatacc -ggctgtttccagctttataagattaaaatttggctgtcctggcggcctcagaattgttct -atcgtaatcagttggttcattaattagctaagtacgaggtacaacttatctgtcccagaa -cagctccacaagtttttttacagccgaaacccctgtgtgaatcttaatatccaagcgcgt -tatctgattagagtttacaactcagtattttatcagtacgttttgtttccaacattaccc -ggtatgacaaaatgacgccacgtgtcgaataatggtctgaccaatgtaggaagtgaaaag -ataaatattgcctacacatactgaattcaggcaatgcgttttattcgaaaggtcatataa -ctagaaaacatgatgaattcttatcggatccttttactagcatagtgttggcgaacacct -cgtaatgctcagcggcaaattggactgcgggtccttatcatacattttttttcaatatag -gcgattggtctaggttagtgattccccaacacttaaggtttgctgacattcataccctca -gcaacttcctctcaaaaattagagtgagttggtggtcttataagaccgttgattatttga -ggtggtcaaatgatggtgcgatgcacaaatcgttataatcgtactctgtagacaataacc -cattgtagtgccgattttgtgcataatacaagaaggaggatataaaaatgacttttcaat -aatattggctattagcaacaagaaggagaatcctcattaagttagcaaccgcagggggta -ctgcagtccaaggaggtttcattggagagagcagtatgaaaacggcaattatgattgtga -gattcgctgaagattgtgtctctgattttcctagatagaataagctatagctacttaatc -aactcttaactgtggagactatcctgatgatctgaataccccatttacaaaattccatat -caatgaggctaacgcttaaatttcatttctccatcgtaacaaaaatcagcctttttatac -aagacaaaacactgcttccattacgggtagcaatggttgctcgactactggtagcgtcgt -gatgtggtgataaagctgtcttgcgtttatacttaaacaaattttgacctgacataatgg -agcgacttatcggatgttgccgatctttagggtcatctattaagcttatacgaaaaaggg -acaagcacgttacgtaatctggtaggactgggtacctagaaacgcaagaggaggcgaact -ccaatatctgtaagaacagaaaaatacaggagtccttttcatttttcaagttaacaatat -aagtaggagcttagagaggcttgcatgaaaatcgttaggaattacagaataggcagagag -tggggcgtgtagactacattcttcaggccccacaatatgggttataggttaaactgcact -ttttgcgatctcccgaaatactgtcgttctctgcgaaccacgctcgttccttttgctgta -gtccacgttcatccaactattcagataaacaagatcgcagaattaaagcttaaccatatc -ttgatagcccatcgtgtatggggcatgtatgtgcaaacaaaagacctcaatcttgtctgc -gagagggaggaaaatttagacaaacataattcattctttcgactggacacgctaaggttt -ggacaaactttgtatctatatctggaggcctgtattccagcccttcttttaataagattt -acggcttaaactatggatatttgccaggaaatgacactgctattgacaggaacataattt -tgattcaaacctcattgttaattattttatatctcctgtttttatatcagaatgcttctg -tcctagaaggcatactcaaggtgagggctcgaggaatgaatcataatagaccggccccta -ttaatattggttcaattctttcttacataacgcggaatttgattgcacgaacaccgggaa -cacataaccgtatagcgcccgttatgctagtgcctagcgactgggaccgtggagtctata -tcgtctttctaccattattaatctaaggatataccactttaagtcctttcaactaacata -aggcgcattccatgcgctaaggaccttgaatttattatttcttacatgataaaagatcga -gtcgacgggaacaaaaggctacgtactcaataaagtgcagtttactaagagccctttttc -tggcttgtggagactatcataacatgaagatgttttgacattcaatagtttgcaaaacaa -acttactttgtgtagtattgaacgagatctttccaattgccccatagcaggaatagttat -atattgcagatcgcggtgtaacgcactccaaatccatcgcggtgtgtgagggtaagcgac -ttaaagaattacggtttttgatcaaagcacagtgagagttgagcaaattacagttatacg -acttaattcagtctccataaattgaaacgacacttcttaacgggaggaccagacacgttc -attaagtgaggagtgcactttttgactttaaaaacatggtaatcaatttaaaccacttga -tatgtatatgaacagatttgaagttatttctgttttaatacactgggagttctgtcaata -tcgcaggaaccgcctgacgtcccctatcacacctcagagggtaaagggacaggggaaagg -gtaatcgaggggtagggaacgtagttggcacacccaatggacgaataaatgctgccatat -ccacggagggcgggattgcggttgattttaaggcgatggtaacctgaatgtaatagatca -tcaaatgcctcctccactggaaattactgcgtacatccgctgagaattgcaatggagtgt -ctcggtttttctttaaacaaaaccaaattgacaacttcatagtataatttttgcacatta -caagcgttaattaacaaacttactttgctgttagctgcctatatttgtccgacaatataa -ctggatatctctgcgagaactgtaaattaacggcacttggaacataatagttcctattgg -taacgacgttgtaggcggcaattatccggtggaagaattgacaactgcagttgaactgca -tgaaagtcaaatctctcgtaagtataactttagaagactccaaggtacccagaacctctt -cagcggacacgatcgctatcaatcaataaggattattcactgaaaccgctcatatctgga -ggtggacgtttttcttcgaaaagcttgtcaaaggactcatcaaatttttggccgtgctaa -tcgacacacctgttattttcatgaccggataggacatctcgcggaaattcgggtaacagc -tgggtagatataggacctcccctacgtattaatgataagcctgtcataactagcttggtt -taccgaagagacaataaacattcgagcgctcgtgccaaactcggtgcattacgtttgaat -aaatcggtaacatgtactattactctgcctaacggcacttacccgtttgggtccatgggg -taaccgctcgatgttgacagaattatgctaaagtcgtttaagatcccgattaccgaaaat -ctggttatgtctgagcattcgtacactgcgtattaagatcaggttgaacaggttcctaac -aaattttgtgacctaaagtgaaactaggtcgtactctgggcatgttttatgtcgtggcgt -atgcatgtgctgacacttctaaaaccaaattaaggctttatccaatatgggtccttaagt -gctaaacatcattcacaatttcaagacagattgttggtcttgtcgattccgcatctgtcg -ccaaattgacacatcgtaaaccaggtacatcggtaattatatgttgactaaactaccgtg -tgtattctggctctaggtacggcgaacaagtacgatgtgcttaagaagccctcaccccag -acgagcccgcgtaggtcacatcagcagatcctaagtaattccgttttattgtcctgaggg -agtaggatcgacgaactctacaagtcgctttgtcgtgccttataggctatttcgggtcaa -tgtagcgtcaaatgaactattgtcatctgtacgagttaactaagtgtctatcgccaacta -aaagacgtctcgatggttctttatgcggacctgtcatatcattgactggcacttgcttac -atccaaataacacgtttgttagcggatagtcgttaagtgtgcgcaagatcatgaggcggg -gggggtaatatttcgccctctacatgataaatgaataagtaagaagatgatctttttgtg -gcggtaccttaagcgtactcctgtcgacgagttactactaaaggaatgtagggttctgga -tctatgaaaagcgacctccatatatatacgggcctaagcggagtaaaataagtgatcaat -ggactaacattgaaatgttagtattgtcgaccattgagggctggtaaatcttatttacgg -gcgtgggaaaacgaacgtgatatggtttagcatgggatgcaagcactcgttaatgcttac -tttagttggttgcgggaacaacaggaggctatactaactggtagcgttcttgcttccatt -atgttattattataattaaaaataagacatatggtagagttgtagtcagggtggatcggg -ttgtctataacgttggaataatcaaaactatcgttaacaaaaacgaaatttaagtcggtg -cggtggaatgcgcctacctcatgtgcaccacacattcacagcacacccctcattataggc -aaggaagcaaacaaaaaaaagttaatcgaccgtatccgaccttaaattttaaaataaata -gaaacacttagcggtaatgaaaagataggactaaaattcactagtatcctggaacgaggc -aacagagttatctagatggtaacgaggtgctgcatcaagatgtatgatttttggtccgct -gtgtggaatacctctattgatatacaagtgactttctcggtaataacgcacttcacaatg -tgttgtttcttttctatgtattttgcaagagaaagaagcttagtataggtacacctcaga -gatgtttcgtgtaaatcgtatcacatggtataactgcaggaggaacattatccaaattca -ccacaattactaatccacccttttacttttactaaagatatattaattctcatgttgtct -gaattgtataacccggtaccctgggagcgtatcgaaggataccaattgaagtcctcgagg -catgttacaacacacgacttccttccgtctattcagacactcaacgagactaacttttcc -taggtaatcaatgatattgggtaactcgtggcatcttatagttattgatccggctctttt -gtagatcctgtgcgactcgtgcgctaattaagactggctctcttgcgcaggggatacgtt -tattctacgtacccgatttggttactactaagcggcctttcttcaaacttgcagttgtga -cttacattcctatttcttcaaagcagggaagggttacagggagagacttattgagatacg -attggaatttccatgtacaatcgttaatacgcttgtagaccagcaactcagtatagagat -ccgtttcctaaagggtgagcggtaggggcaaggcaataagaaattactaaaaccctagtt -gttaatataagaacgattcgaaacaataggattgcccaagggggtgcgaacatggtgtaa -atcaaagagaaataggcattgttaaaacccgcacgtttctagtacgcaagaggaacgtcg -gtaaccagttctcaaagatcctaacctaaaaggggcttattctactttttccgacactca -atggacgagacaaacatgaacggatagctttaggtctcgttgaatgcaaagaatagaatc -gttattattaatcggtttccattatctatatgcggtatagatctccgagaggaccctgta -aactagctctgcggtttaactggtgctaatagaccgccactatgttattgcttctagctc -ctagcgtcttatcatgttatacattaatgtcgcatattggacagtagccaggcttggatg -gatcgccgacaaaaagaaaagactttccctgtaaggacttaactattacatataacttgg -atcattaatctgcaaattagagtaacggtctttcaccagcttcatattccaacgtggcgc -tagtcgatatcccatgaagtttaaaactagaattggcagtctcacttcacagtgcgtatc -tatacgacaaaagtggtcgatttgcataaatatcttatcgatattcaggttattaccgat -tccttgctaacgctagaagtcacaccagagtaataataattccagacacctgtgaaataa -tcggtcactacggatagactagtaacgataatacgtatagtccataaaagttgaatttta -ggggctaaagatattagcaatactggtctagcctaatcgtcgatagcaaagggctgtgag -gatttctcctacattttcgaccaattgtatcgataggaatagttacagtcacgcttgtag -atgtaagagatgacgttattcttagggttcttaagtcggggggtaatttaagaccactag -taaaggtagaggcgtacacagtaaacgatattttgaaatcgtcaaaaaaaagtttacaac -atcctttaagttagcaactgattttagtggcaaccttaacggttgaattgatctactaat -acaggcctacaccgaagggtacagataatgattcttactaccctaacatgatagagtcct -gtcctatctcataggtcgacattttaaattcgtaatgagcaacgaagatcgtttcccaat -ttgcaacattcacttatagacttcaggttatttcgtgctaacattaagatagaatataat -cagtcgttaagaaactattatccagctttcgtcaaccataaagattaaaaactgaaactt -ggcaagatatgaatagctatcctgctttaaccgatcgtatgagatgctttgtagcaagaa -aagtgactagcacttgtgtttagtaaagcgggagagtgcggtaattaatattaatatact -attaagctacacagcaaaggctgcaataatgttagtaagtagaacataaaggtattctcc -acaagtaataaatagtgtgagctaattgactaacttaactctcgcgacaagtgatgtgga -taagatgactcatatcgtctttttctgtagtgccgacatcccacctggatcgaacaattc -cttctagttatcgactttgattacctatcctattaaacagatagggttgtaaagtcagaa -aatgatcggcttgcgttggtctaccatagctagagttagaacgcgtagatagaggccttt -tgttgccaacgtgggggtgggatgagtctgggcgagcgtgactttctttcgtgtccgaat -ttgtttaacatccattagattagatgtttgtgttttgggtctgatgtcctaactactttc -tcagtgaaactaatgtcatcatccaagtaaaatagtccgatgaagtctccgttttcggcc -gaagcttgtctataacgtatataaagtcgctgaatttagaacacaccttatctatgttgt -aaagttactttattccaaaggacgtgcacgaagcgtgagtgtgggaaggaacttaaagtc -ggatcactcttgtcagtgtagataagaatttctttcatacttcactggaatccggcgtat -ggatatctctaccgcgtcatctggtggtgtctgcggtaaaaagtcttgctgcacgagtct -gagaaatttttggtgccatcacatcgtaactgtacaacgaacaaatagcatcaggccttc -ttatccagcgtgaagtctaattatttcacaagctttcctaagtatgtaaatccctcactt -aatgatgcttgcgccaatgaggatagaggacattgcatgtacgtaggactattctccaag -gggtcttctattttgttagcgaaaattgttacagcctaatgttagagcggcgtacgactt -tataccagatactttcattagatatgcaaatatccaattaaatcatagtagtatcgtggt -atggacaatcaaaaaagacccgttgtgatatgatgtttttctagttcgttctcatatata -tagatcaacaatgaataatctcatgatctataaccgatgtatatttatattccggttgac -tgctccggtgcaattcactacggacactaatgactaatatggcgcctttcatcagaaacg -ctaaatatgattaatgaattaagggagtattatctaattattagagagtagcagttagtc -tgatattttcggtgtatgtgttagccgttataatgctgtctttttatcagtgagaacagg -gagtgtgtagtgttgtatgcttcactttatgactctggttatatccctcggagaacaaga -ataagagtacgagaagttcggtcattgaggatgaaatagaaccgctagacgaatggactc -acgtttataaaactatgtatcacagtactacagctaactctgaagtccgagaagcttttg -taggacaaaacgttataagtacctttcgcagaatacggccgtgcatacctgttataaggc -gtagtagggacaccatgctatccctcatatagagctacactaataccattacatggtgac -tatcgtttacggccatcatctgtaagcgatcatgcctcgttagcatccgtacaatctcgc -atggcgtcactgcagaaaaaccccgtgcggattttgagtcagaactattcgaagcttctc -aatccttttccattatggcatagcaagtgacgactcgtcagccatgggaataatagcact -aatccgattacttatgaattagaacccacatgaatgtgattctgcgaattgtctaagaat -ctaatgattttccggtgaatatggttgttgttatttattgaacttatattattaacatca -cccttcgttagtgatagtcagctatttccaagaggttccccgagcatttttaccattctc -tagtcatacaagttggagcgcttttaaatctttaggctgatcaaggcgttttgtctagaa -ttctgcagatgttagattcgtgtgcaatccctcttgcatgtcagtaacaggtcacccgtt -tttcgttacatatgctggtaaaatattcatagtaataactacaatacttgatttgttacg -taatgctcgtacataacacaatcgtattccacggaacagtaaagctctattattctgatc -gagcctaagagaggatcacactacgctattaaagtcacgttcacgaaatctcaaacctca -actgctggtgaccagttatagacagtgtaattccatattacatgtcaggcttaagctaac -ccgagcctttatataagctataatcaagaattagattggagtgcattttagacttatcta -tcgaaatagtgatagtaagagtttatatgacctgatctagactgatgttctcttccacaa -cagccttaaggcgtggagcctttcttatactattaggtcgcgtcgagagccctattcgta -atgttaacgacactagactaatatacaatgagctaagaataacacaagtcacaagataat -ttacaaatcatatatctacagtccacaaccatcactagcgattgcaaagcgttattggta -ctaccgctctaaatcggtatgtgcaagacgcgttaactggttcaagcctctcctgctcgt -gagactgaaagaaatcgaaaatatggatgtgcctaattgttcttgtgagtcatgtgcaac -tatacagtttagtttggtcaagactatgcaactattaacagcatgtgcgcattgaatatt -tggtgtcgattgataaatgccccaacgttccatcacgtctataagccgtgttactaatgt -gtattagtgcatacctattcagaccatagttcaactgttggactgaaggcccgtcttggg -gttcgtgaatgagagtgcagtttcttgtcttttccttaactgacctaaatgaaggcaatc -ggtttatctagagtcatgcttaaggtgaatttcagccaatgggctcccattgagctagta -tggtgctttacctttgtaagtggtggctttccttggtgtgctgactttaacacggcagag -tgattatccgaagaatggataataagacgctggcaatattggctaataaagtccgatgag -tttcaatcatgactgcgaggagatccatgcggtgtacctaaacctacatcgtatgtattt -gctgacgttcattcttgatacataaagatccgatatcggtccactttgtttaccaaaagc -cctaccttcgtaacgatggaaatgtgaatgagagtgaaatacacgatggggatattgccg -gtgagtacaagttagaccacacattagaactgacctatattcgtcatcatagagatggag -tatgaattgattctgcgaagtacactggctttacgagtatctagacgccgcggtatatct -cccgtcaatactatgaaggtatatatatagaggctgaaaattcatgttcaatcctctttc -taagagtgagtgggagccccttctgttgtcggagtaaaaaggcattattcctcaaattgt -cagaagcaaagtatacgtgatgtttgcttagaacaaaagagttaccttagggtaggtaaa -tctcgattcaccgagagaagtgattttggcggtgtgcgattaattcttttgatgacagat -ctcattattttatatagctccctctttgtatttagagtttgcgtaggtaacctggcaaaa -ccatatcccggggggagagtgcgctgaacattttatacgatgtgattactcaaaggataa -ggttcgaggcctctatactcatggaactatcttataattataatggatcgtggctcattc -cacctatccaaacttctttgtgatctgatgctacgagtgtgaacaaacgtacatcttcta -aggaatttgggacgtttcatagctcgcatttcattcctgaaaacttaaatatttttaaaa -attgattctactgcgaggaactaaggtgtagacaagcccttagtaaccggtggatgtcgc -ttcagttttatagcaaacattattcaatttcagtcttgactgaaattagtttgttagtgt -tagaggtccatatgtcacatgcatatggtctagatgccattgtacagtaataccttagat -tagtattagcggcatgcgtacttggatttcacttgtaagaatgagcttaggacggtcgcc -tgtagggctgcaaataggaatacttacaatttttgatgacttgttagcatatcgctatca -cccataaaaaacctgatacttgatgagcgggtgattgagactatgtactgatataattca -atagctccaatagatgaaacagctatgcgcctatttatgtcaaataatcgatgtgataca -agcttagagctgaacgagcgcgagtggaattagcggtgatctctatcctaaaaagccacg -aaatcgatcccagaagctaatacccgaggtgtcaagcttgagttcagttaaatttgcatc -tcatgccccacgaagaatgggtagagagtttgaaggtgcttctggattttcctaagtacg -tggtaaaaatttgatgtaaatgaacacctcctaatggttgtgttaaccacaaacccctgg -gtgaatctgattagccaacccagtgatctgatttcagttgtcaaatctcttttttataac -taccttttgtttccataatttaaccggatctcataatgaacaaacgggtagaataatggt -agcacatagcgagcttgtctattcagaaatatggcctactcagaatgtattctccaaatc -agtgttatgcgaaacgtaattttacgtgtaataatgatgatttcttatcggttccttgta -ctacaatactcttgcccaacaaatactaagcataacagcaaaattcgaatccccctcctt -ttaataaatggtttttcaatatagccgattcgtattcgttagtctttcaccaactattaa -cctggcatctaattaataaaatcaccaaaggactctataatatgacagtcacttcggcct -cttttaagacagttgattattgcaggtccgcaattgatggtgacatgcacaattagttag -aatccgactatggagacaattaacaattgtagtgcccatttggtccagttgacttcaacc -acgagttataaaggtattttaatttatagtcgatagtaccaacaacaagcacaatcataa -ttatgttagaaaacccagggggtaatgctctaaatccagctttaaggccagagtgcacta -tgaaatcgccattgatcattgtgtcattcgctgaacttggtgtctaggaggtgccgagtg -agaatatcagataccttatgaagcaacgattatatctggactagatcatgatgatcggaa -taaaacattgaaataagtccttatcaaggagcataaacattttatttaatttatacttcg -taaataaattcagaattttttttcaagacattaatctgagtaaatgacggctagaaaggg -ttcctactcgaatcgtagcctacgcatgtgggcagtaacctggcttgcgtttttactgaa -acaaaggttcaccggaaagaaggctgccacttttagcttcttgacgatctttagcgtcat -atttttagattagtcgaaaaacggaaaacaaacttaacgaagctggttgcacggggtacc -gagaaaccaaagagcaggacaactccttgatcgggaagaactgaaatagacagctgtcat -tttcattggtcaacttatcaatataacgaccaccgtagtgacgcttgcatgaaaatactg -aggatgtaaactatagccagtcaggcccgcgtgttgactaattgatgaagcaaacaaaat -agccggtattcgttaaaaggaacgggttgccagctacagatatactctaggtatatccca -aacaagagacgtcctttggctgttgtaatcggtcataatacttgtcacataaacaagatc -gctgaattaaacattaaacagttagtgatacacaatcgtggttggggctgggatgtgcaa -taaaaagtcatctatcgtctatcacagagcgacgtaaatttagacaaacattattatttc -ttgacaatggaatcgataagcgttcctctaacttggtatatatatctcgaccccgggatt -ccagccattcttgtatgaagatttaaccatttaactatgcatagttgaatggtaaggaaa -atgatattgactgcaacagattttggatgcaaaaatatttgtgaattattggttatatac -tggttgtatagcacaatcattaggtcctagaaggcatactcaacctcagcgagagagcta -gcatgcataattgtaccgcccatattaatattcctgaaatgatttcttacattacgccca -atttcagtcatcgaacacccccatcaatttacccgatagagaacgtgatcatacgcaata -ccctatgcgaacgtccactctatagcgtctgtatacaatgattattcgttccatttacaa -cgttaagtaatttaaacttacataaggacaaggaaatccgcgaacctcctggaatgtatg -agttatttatgcagttaacttcgtctcgaccggaactaaaggcgtcgtacgaatgaaagg -ccacttttagaagagacctttgtatccattgtggagaatatcataaattcaagatggggt -gtcatgctattcggtcctaaacattcttaatggctgttctattgttagtctgatttaaaa -tggaaccatagcacgaatagttagatagggctcatacccctgtaacgatctacaaatcct -tccccgggtgtgtgcgttagcgacggaaagttttacggtttgtgatcaaagaacactcac -acgtcagattattacactgatacgaattatttcagtcgacagtaattgaatagaaactta -ttaacgccagcacctgacacggtaagtaaggcaggtctgaactgtttgactgtaaaaaaa -tggtaatatttttaaaaatcttgatttctatatcaaatgatgtgtagttttttctctgtt -attaaaatcccagtgcgcgaaatttagatcgttacgactcacgtacaagatcacacatca -cacgcgttagcgaaagcggaatggctaatacagccctacgcaacgtagtgggatcaacat -atggacgaatttatgctcaatgagccaacctcccccgcattgcggttcattttaaggcct -gggtaacatctatcgtttagataatcaaaggaatccgactatgcaattgtctgacttcat -ccgctctcaagtccaatgcaggcgctacgtgtttctttaatcaataccatattgaaatcg -taatacgataattgttgctattgactacaggttatgaaaaaacttactttgcgggtacat -gcatatttttgtaccacattattacgcgatatctctcagtgtactctaaattaaaccctc -ttcgaacattttagttcctattcgtaaacacgtgctacgcggcaatttgccggtcgtaga -atggacaactccagttcaactgcatgtaactcatagctcgcgttagtataaattgactag -tagccatgggacaaagtaactagtcagcggaaaagatccctttaaagatatatgcaggtt -gcaagcataaagctcattgctcgaggtgcaccgtggtattccaaaagcgtctctatcgta -tcttctaattttgggccgtgagaatcgaaactactctgatttgctgcacacgttaggtaa -tatcgcccattttcccgtataagctccgtacttatacgaactacacgaccttttaagcat -tagccgctcatatcgtgattcgtgtacagatgagtctattaaaattacagacatactcca -tatctcgctccttgaactttgaataatgcgctaacttgtactatgaataggcagaaccca -actttcccgtttgcgtcaagcggggaaacgatacatgttgtcagatttatgattatctag -ttttagatcacgtttaccgataatcggctgtggtctgagcagtcctacactgagtattta -cttcagcttcatatcggtccgaaaaaaggttgtgaccgaatgtcaaaatacggagtacga -tgggcatcttttttcgagtcgcggttgcagggcagcaaaaggcttaaaccatttttacga -tttttactatagcggtcatgaagtgcgaaactgcttgcaaattttctacacacattgtgg -ctcttgtccttgaagcttatggcgaaaatttgaaacatagtataccagggaaagcgcgaa -ttatttggtgactaatagtccgtgggtttgagccatatacctaacgccataaactacgtg -gtgctttagatgcaatctaaacagaacagaaagcgtagcgctcatcagcacagactaact -ttttcagtttgagtcgccggagggacttcgagacaagaacgcgtcaagtcgcttgcgcgg -cacggattcgattgggcggctcaatcttgcctaatttctactattgtcagctgtacgact -gtactaagtgtatagccccaaataaaagaagtatcgatgcgtctttatgaccaaaggtct -tataattgaagcgcacttccgttcatcaaattaaatcctggcttacccgattctccggaa -gtctgacctagagattgacgacggccgcgtattattgagacctcttcaggattaatcaat -aacgaagtagttgatctgtttggcgacgtaccttaagccgactccgctacacgagtttct -actaaaccaatgtagccttatgcttagatgaataccgtcctaattagatattccggcata -acagcagtaaattatctgttcaatggacgaacattgaattgttagtattctacacaagtc -aggcctcgtaaatattaggtaaggccgtgggataacctacgtgatatgcttgagcttgcg -ttgcaagctctcgttaatcattaatttaggtgcgtgagggttaaacaccagcatattcta -tatgctagacgtcttccttaaaggatcgtagtattataattaataataagaaatatggtt -gacgtctagtcagcgggcatacgctgctctatatactggcattattcaaaacttgacggt -aaaaaaacgaattttaaggcgctcacgtcgaatgagccgaactcatgggaaccaaaatgt -cacagaaaacacctctttattgccaagcatgcaataaaaaaaatgttaatagtacgttta -cgacattttattttataataaagagaaactattacacctattgatatgataggacgtaaa -ttaacgagtagcctgcatagaggcaaatgaggtttctacatggtatagacctgatgctga -aacatcgatgagttttggtcccctcgctcgttgaaatctagtcatttactactgtctttc -gagctattataccacttcactatgtggtgtttctttgctatgtatggggctagtcaaaca -tgatgactatagctacaactcagagagcgggcgtgttaagagtatctcatgctagaactg -cacgacgaacttgatacaaagtaacaacatttacgattccacaaggtgactttgaagaaa -catagtttaattctctgcttcgatcatttctataaaccggtaccatcgcagcggatagat -gcataacatttctactactccaggcatcttaaaacacacgtagtacttcactagattaag -acacgataagtgtataacttggcagtgggaagcaaggagattggcgaactcctggcatct -gttacgttttgttcaggctcggttgttgataatgtccgactcctgccatattgaagactc -gctcgagggagatcgggattcgttgattataagtacacgtgttccgtaatactatgaggc -agtgattcaaaatggcacttctgacttacatgactaggtattattaccacggaagcgtta -aaggcacactcttatggacttaagattgcaagtgccttcttctagcctgaattcgcgggt -tcaacacaaactctctttagacatccgttgcctaaaggctgagacgtaggggcaaccctt -taactatgtactaaaaaactagttggtaatttaacaacgtgtccaatcaagacgatgcac -caacgcggtgcgaaaatcgggttaagcaaacacaaataggaattgtgataaaccccacct -tgagaggtcgcaagaccaacctcgggaacaacggctctaagagaataacctaaatccgga -tgagtagactgtgtaactctctaaagggaagtgaaaaaaagctaagcatacatttaggtc -tcctgcattgcattcaattgaatcgtttgtattatgagctgtacagtagctatatcagct -atagttatcccagaggaacaggtaaactagctctgagcgtgaaatccggatattagaacc -cctagatgggattgattctagctaatacaggcttatctggttttacagttatctagatga -ttggtaaggtgaaacgcttggtgccttccaccacttaaacaaaagtattgcccgggaagc -tattttctaggtattataaagtcgagcattaatatcaatttgacagtaaaggtctttcac -cagcttcatatgccatagggcccatactcgatttaaattgaacggtttaacgagtattgg -aactctcacttataactgagtagctatacgaaaaatctggtccatttccagaaatttatt -atcgatttgctgcttagtacccaggaagtgataacccttgaaggcacaacactgtaataa -gttttcctgtcacatctgtaatattcggtcactacgcattcacgactaaagataattact -atactaattaaaagttcaatgttagggccgaatcatagtagaaattctcgtctagcctaa -tcggacttacctatgggctgtgaggatttatcagtatgtggacaaaaatgctagagatag -gtatagttaaagtcaccatggtacatctatgtgaggaagtttgtagttcgcttctttagt -ccgggcgtttgggatgacaactactatacgtagagccgtactcaggattagatagtgtga -aagagtcaaataaaagggttaatattaatttaacgttgcaaatgtgtttaggccaaacat -taaccgttgtagggatattctaatacaggccttcaccgaaccctaatgataatctgtctt -aataacattaaatgattgtctccgctacgagctcttagggcctcattttaaatgactaat -gtccaaagaagagactttcccaatttcaatctgtcacgtatagacggcaccttagtgagt -catatcattaagatagaagattatcaggagggaagtttctattatcaaccgttacgcaac -cataaacttttaaatctcataatggcattgagatcaagagctttcatgatggtaaagttc -gtatgtgatgctggggagctagatatcggtataccacttcggttgtggtaagcccgagtg -ggccgttagtaatattaatagacgattatccgacaatgcattcgctgaaataatcttact -taggagaaattaatgctatgagccaaaactatttatgtctgtcacattattgactaaagt -atctatcgacaaaactgatgtccataagttgtagcagatagtcggtgtatggtgtcacca -atgaaaacctcgagcgaaaaatgaattatagttatccaatttgagtaaattgcctattat -acagataggcttgtttagtcagataaggttccgcttgaggtgctctaacttagcgagagt -tagaaagcctagtgagaggcattttggtgccaaactccggctcgcatgagtaggccagag -agtcactttctttcgtcgaagaagttggtgaacagccttttgattagttgtttgtcttgt -ggctatgtgctactatataagttagaacgcaaactaatctaatcagcaaagtaaaatagg -accttgaacgagacggggtacgccgttgaggctcgagatagtagataaactagaggaatg -tagataaaacattagctagggggtttagttactggattacataggaagtgcaccatcacg -gtgtgggggttcgtacgtaaagtcgcatcaatattgtcagtggacttaacaagttcgtgc -ataatgaaatcctatacggactttgcatatctctaccgactcatctggtcgtctatgcgg -gtaattgtattgctccaagtggatgactattttggcgtcccagcacatagtaaatgtaaa -tccttataatagcataagcaattattagactgcgtgaagtcttagtagttctcaagcttt -acgttgtatgtaaataactcacgtaatcagccgtccccaaatcaccattgaggtcattga -atgtacggagcactattatcaatgcggtatgcgattttctgagcgattattgttaaagac -ttagcgttgagccccggaacacttgattacagattctttaaggagttatccaaatatcat -tttaaataatagtagtatcgtgctttggacaataaaaaaagacccgttctcttatgttgt -tttgcgacgtacttctctgatatatacttcaactatgaagattctattcatcgataaccc -aggtatatttatatgcccgttcactgcgcagggcaaattatctacggacaataatgacgt -agttggacccggtaagaactaacgcttaatatgattaaggatgtatgccagtattatctt -attatgtcagagtagaagtttctctgagattttccgtcgttgtggtacaccggatttggc -tctctttttagaactgagaactcggagtgtgtagtcttgtttccttcaatttatcaatat -gcttttataccgccctcatcaactataacaggacgacaagttccgtcttgctccatcata -tactaccgatacaccaatcgtatcaagtttagtatacttgctttctctcttctacagctt -actcgcttgtccgagaagcggttggtgctcataaagttagtagtaaatgtacaactagta -gccagtccttacctgtttttacgactactacggacaccatgagatacagaagttagtgct -acaattataccattacatgctcaatatcgttgtcggccataagatcgaagagtgcatcac -gcgtgtgaatacgtaaaatctaccatcccgtcaatgcacaaaaacacactccccttgttg -actaacatcttttacaagaggctaaatcattgtccaggatcgaataccttgtgtacaatc -gtcacccatcggaagaataccacttttccgatgtagtatgatttacaaaaaacatctatg -tgagtaggccaattgtagtagaatatattcatttgaccgtcattagccttcttcttaggt -tgtgtacggatagtaggtacataaaccgtcgtgtggcatacgctgcgatttcatacagct -gccaacaccttttttaccaggctagagtcagaaaagttggagccatgttaaatagttacc -atcataaaccactgttgtctactagtctgatcagctttcatgcctgtgcaagcaatatgg -attctcacgtaatggtaacaactgttgcgttacttaggctggttaatttgtcagagtaat -aaatacatgtcttgttgtgtttcctaatcctcggaaagtacacaagcctaggaataggaa -aagtaaagctcttttattctgatagtgactaactcaggatctaaatacgcgattatacta -accttcaccaaagctcaaaaatcatctgctggtgaccagttatagacagggtaattcaat -atttaatgtctcccttaacatttcaccagcatggattgaagatagtataaagttttacat -ggcagtcattgtgtcacggttctatacaaattctgatagttagacggtatttgaaatgtg -cttctagcatggtatcttacacaactgaatgaacgactggagccgttcgtatactatttg -cgagcctcgagaccccgtttcctaatgttaacgaatatagtataatataaattgtgatat -gaataacacaagtaactacagtttggacaattaattgttctaaactaaaaatcattcact -tcagatggcatagagttatggctactacacatataaagcggtatgtgaaacacccgtttt -agccggaaaccctctactgctcgggacaatgaatgatttccaaaatatggatgtgcagaa -ttgttagtgtgactcaggtccaaatagacactttagtttcgtcaagtcgttgcaaagttt -aaaaccatcgcagcattctttatttggtctacattgagaaatgaaaaaacgtgacagaaa -gtctagaagaactgtgaataatgtctattactgattaactagtaagacattagtgcatct -ggtccactgaagcacccgcttggcgttaggcaatctctgtgaactgtcgtggctgttccg -gtaatgtacgaaagcaagcctataggttgatcgagtcgcttcattaaggtcaatttcaca -atatccgatcacattgtgctaggttcgtcctttaccttgcttagtgctgcatgtacgggg -tgtcatgacttgttatcggcagactctttatcccaagaatggataatatgtacatggaaa -gtgtccataattaagtcccttcactgtaaagaatgactgccacgtgatccatgaggtcta -cagaaaccgacttacttgctttttgatcaacttaattatggattcataaagttcagatat -cggtacaattggtgtacaatatgaaattaatgaggaaacatggaaatctgaatgacagtg -atagaaaagatccccatttgcccggtcagttcatgttacaccactcattagtactgtaag -tgtttcgtcagcattgagatccacgatcatgtgtttatgccttcgaaactggatgtacga -cgatcgagacgaagaggtatatataacctaaatactaggtacgttgttagagagacgatg -aaaattaatcgtcaatacgctggcgaacactgagggggacccaatgctcttctcggtcta -aaaaggaatgtgtcagaaattggtcagttcaaaagtagaccggatctttgcggagaacaa -ttcacggaacgtagcgttgggaaatatcctttctaccacacatcggattttcgccctctc -ccattatttattgtgttctcacatagaattattgtttagacatccctcgttgtatggaga -gttgcccgagcgtaaaggcataatccatataccgccgggtgagtgacctgaaattgtttt -tagttgggatttcgctatggattagcttacacgaagagattctaatggtactataggata -attataatgctgcgtggcgcagtacaccgttacaaacgtcgttcgcatatgtggctaaca -cggtgaaaatacctacatcgtatttgcaatttcggtcgtttcatagagcgcattgaatta -ctcaaaaattatatatgttgattatttgattagactgcgtggaaagaaggggtactcaag -ccatttgtaaaagctgcatctcgcttaagtttgagagcttacattagtctatttcagtct -tctaggaaatgtctgtgtgagtggttgtcgtccataggtcactggcatatgcgattcatg -acatgctaaactaagaaagtagattactattaccggcatgcctaatgcgattgcactgct -atgaaggtgcggacgtcgcgcccatgtagccctgataataccaatacttacatttggtca -gcaattctgacattatacctagcacccataaatttactcagacttgaggacaggctcttg -gagtcgatcttctgtttgtatgcatgtgatcatatagatgaataagcgatgcgactagtt -agggcatagtatagatctgtgtatacagttcagctgaacgtccgcgagtggaagtacagc -tgagatctatcctaaaatgcaaccatatcgttcacacatgatatgaacccagggggaaac -attgagttcagttaaattggcagcgaatcccccaagaagaaggcggagtgacgttgaacg -ggcttatggtttttcagtacttcctccgtataagttgagcgaaatgtaaacagaataatc -gttgtgttaacaacattaaaatcgcggaatatgatgagaatacacagtgtgagcatttca -cttgtaaaatatctttggtagaacttactttgctttaaatatgttaaaccgatctaataa -tctacaaaacggtagattttgcctagcacattgcgtccttctctattcagatagaggcaa -tactcagaaggttttatccaaagcactgtgttgactaacctaagttttagtctaataatc -atgattgattataggtgccgtggactacatgactcgtccacaaataatacttagcagatc -agcaattggccaagcacccgacttttatttaatggttgtgcaatagtccagattcgtatt -cgggactctttcaaataatagtttcctggcatctaagtaagaaaagctcataaggaagcg -atattatgacacgctcttccgccgctgttttgaaacttgagtattgctcgtccgaaattg -agggtcacttcaaaatttactgagaagacgaagatcgactaaagttaaaatgctagtcca -cagttggtcaagttgaattcatccacgagttatatagctattttaatttatagtcgagtg -tacaaaaaacatccacaataagatttatcttagaataacaacccccgtatcatcgaaatc -ctccgttatggcctgactcctcgagcttatagcatttgtgctggcgctcttgccaggaac -ttgctcgcgaggtggtgacgagtgagatgatcagtttcattatgatgatacgattttatc -gcgactagttaatcatcatagcaagtaaaatttgaattatgtcattatcatgctccatta -acaggttatttaattgatactgacgaaattttttcacaatgggttttctagaatttaata -tcagtaattgaagccttcataggggtcctactagtatcctacacgacgcaggtccgcagt -atcctggagggacgtgttactgattaaaagggtcaaaggaatgaaggctcacaatgttac -ctgcttcaccatagtgagccgatgagttttacattagtactaaatcccaaatcatacttt -acgatgaggcttgctagcgctaaagagaatacatacaccaccacatagaattgttagcga -tgatatcaaatagactcctggaagtgtcagggggaaactgttcaatatttcgtccacagg -actgaccaggcatggaaaagactgacgttggaaactataccatctcacgcccgacgcttc -actaattgatgatccaaaaaatatagcccggattcctgattagcaaagggttcacagaga -aagatattatcgacgtatatcccaaaaaacagacgtaatgtgcatcttcgaatcgggatg -aatacttgtatcataaaaatgtgacctctagtatacaggttaatgttagtgatacacaat -actcgtgggccatgggttctcaaataaaatgtaatattgcgtcgatcactcacccacgta -tttggtctaattatgttttatttagtgacaatccaatagataaccggtcctattaagggc -tatatttttagcgaccacgcgtttaaacaaaggattgtatgtagatggtaccagtttaat -tgccagtgggcaatcctaagcaaaatgagattctatcctaaagtttgggcttgatataag -atttcggatgtatgggttttataatcgttggagagctcaatcatgagctaatacatggat -ttcgctacctcaccgagagaccttgcatgaagaattctaaccaaaagtttaataggccgg -attggattgagttaattaagaccttgttcagtcatagtaaaaacccttaaattttaccga -ttgacaaagtgagcagtcgcaataccctatgcgaaacgcctcgatagtgactaggtatac -aaggtttttgagttcctttgaaatagttaactaatttaaaattaattaacgacatggaaa -tcacagaacctaatgctttgtaggagttatttatgctgtttactgcctctacaaccctaa -taaagcagtcctaagaatgaaacgcatcttttagttcagaaagtggtatccagggtggtc -aatttaataaattcaacatcgggtctcaggatattcggtcatataatttattaagggctc -ttcgagtcttactctgagtgaaattggaaacagtcatccttttcgttgtgaggcatctta -caccgctatcgatatacaatgcattccaccgcggtgtcccgtacacaaggaaacttgtta -ccttggggatataagaaaactcacacgtctcattattaaactgagtacaatttttgcacg -agaaagtaatgcaatacaatatgatgaaagccagctaatgaaaagggatggaacgcacct -cggatctgttgcactggattaaaatccgattatttttaaaaatattcagtgctagagcat -atcaggtctacttttttatctggtatgtaaagcccacggagcgatagtgagatccttacg -actcaacgaaaagttataacataactcccgttagccaaagcccaatcccgattactgccc -taccctaacgtctgccatctaaatatcgaacttgttatgatcaatgtgactacctcccac -cctttccccttcatttgttccactggggataagctagcgttttcagaatcaatgcaataa -gaatagccaattgtctcacttcatcagagctcttggcaattccaggcgctacgtggttct -ggaatatattcatttttcaaatagtaatacgtttagtgttgctattgtctacacgtttgg -atattacgttatgtgagcggacatcaatagttgtctaactctttagtaagccagagatag -cactcttagcgaatggataccatcttccataagtttagttaatagtccgaaacaactgct -tcgagcatatttgaacctccttgtaggcaaatagcctcttcaaagcaatcttactaatag -atagagtttgttttaagggactactagaaatgggacaatcttaatagtatgacctaaact -gacatttaaagatatatccaggtggcaagcataaagatcattgcgccacctccaccgtgg -gattacttatcagtcgatatcctatatgctaagtttgcgacggcagaatacaaactaagc -tgagttgatgctaaccttacctatgataccccattggaccggttaacagccctacttatt -ccaaataaaagaacttttatgctgtagaagctattatagtgatgcctggtaacttcagta -tattaaaatgacacacatacgccatatagagctcctggaactttgaataatgagcgaact -tcgaagttgaagagcaagaaaccatatgtcacggttgcctaaagcccggtaaccagacat -gtgctatcattgatcattatcgaggttttcataaccttgacccattatcggctgtgcgcg -gacaagtacttaaatcactagtttcttcacctgcttatcggtaagaaataaggttggcaa -agaatcgcataagacggacgtagagccgcagcgttgtgcgagtccaggtgcatgcgcagc -aataggattttaaattttgttccatttttaatttagccgtaaggatgtccgtaaatgatt -gaaaattggattcaatctttgggcctatgctactggaacctgatcgacaaaatttcaaac -atacgttaactccgaaagaccgtatttttgcggctagaatagtcagtcgcttggagccat -ataccttaccacttaaacgacgtgctcctgtagttgaaatataaacagaacacaaagact -accgatcatatcaactgaagatctttgtaactttgaggcgaagcaccctcttcgagacaa -ctaagagtaaagtaccgggcgccgcaaggagtcgattgggaccctaaatcttgacgaatt -gctaagaggctcagagctaccactgtaatttctctagagcccataataaatgaacgatac -atccgtaggtagcacctaagggattataatggaagccaaatgcagttaataatattatat -actggcgtacacgattcgacggatctctcacatagtgattcacgacccccccctttgatt -gacacagcgtcagcattttgcaagaacgatcttctgcatagggtgcgccaccgtaaggat -gacgtcgaagctacaactgggtataatttaccatgcttccctgatgctgagtgcaataca -ctaagaatgagtttttaccccatatcaccagtatttgttctgttattgcgaagaaatggc -tatgctgagttggcgactaaagtcacccatcctttttattaggtaaccccctcccttaaa -ctaactgatttgctggagctgccctgcatacatatactttatcatttatggacgtccgtg -acgcttattatccaccatagtcgatatgctacacggattcattaatggatcgtaggagtt -taagttatatttactaagatcggtctcggctactatcccgccttacccggcgctatttac -ggccatttttaatatattgacggtaattattcctatggtttcgaccgcacgtccttggac -aagaaagaatggcaaaaaaaatgtaaaagaaaaaaaatattgagtccctaccatcatata -aaaaatatgtgatgagtaacttgacgaaatgttagtggttattaaagactatctattaca -ccttttgttttctgtcgtagtatattaaagtctagaagccttacaggaaaatcagggtta -tacagccgatactccgcagcatgaatcatcgaggaggtgtcctaccatcgcgccttgtaa -tcttgtctgtgtatactgtatttagaccttttatacaaagtaaatatctcggctttatgt -gattgggaggggcctactcaaacatgatgacttgacctaataatcactgtgcgggcgtct -tatgactagctattccttgaaatccaccaccaaatggttaatatgtaaaaactttgacga -tgaaacaaggtgaatgtgtagttactttgtgtaattagctgcgtcgagcattgcttgtaa -aaccgtcaatcgcacacgttacttccataaaatttctacgaatacacccttcttaaaaaa -aacgtaggaattcacgagtttaacaaacgataactgtataaagtggaagtccgaagaaag -cagatgcccgaactactcgaagatgtttcgttttcttaaccataggggcttcttaatggc -ccactacgcacattttgttcaagcccgagagggacatccccattacgggagtattactaa -aactgttccgtaatacgttcagcaagggatgaaaaaggccactgctcaagttattgacgt -gggagtattacatcggaagcctgaatcccacactatgatggtctgtacaggcctagggac -tgcgtctagacggtattaccggcttctaatcatacgatcgtgagtcttaacgggaagtaa -ggctcacacctaccccaaaccatttatctatgtaagtataaaattgtgcgtaagtgttca -aagtggacaataaagacgtggcaaaaacccccgcacataagccgctttagatttcacaaa -taccaatgcggttaaaaacatccttgagtcgtacatacaccatactcgcgttaaacggat -ataacagaagataataaatccggatgtggagtcggtgtaactatagaaagccaagtgaaa -taatgcttaccagtcatttagctatacggctttcatttcatgtcaagagggtggagtttg -acctgtacagttgatatatcaccgatacttagaactcacctaaagctaaaattgctcgca -gcgtgtaatccgcatattacaaacaatagatgggattcattatacataagacacgatgat -ctgctttttcaggttgcgagatgttgcctatcgtcaatcgagtcctgccttacaccactt -aaacaaaagtattgacagggaacctattttcgaggtattatatagtccagcttgaatatc -aatttgacagttaacctagtgaaaatcagtaagaggaaatacgccacattctccagtgaa -attctacgggttatcgtctagtccaactatcaattataactcacgagatataagtaaatt -ctcgtacttggcctgatttttattatactttggatccttagtaaacaggaagggagaaac -cttcaacgaaaaacactggattttgttttactctcaaagctcttatatgacggaaatacc -ctgtcaagtcttaactttattactagactaatgaaatgggcttggggtggccagaatcat -agtacaatttagcggatacactattcggactttcctatcggctgtctggttggataagta -tggggactaataggctagacatacctatacttaaactatacaggcgtcatctatctctgc -aactttggagttccctgatgttctcccgccctttgggttcacatcttctataccgacacc -cctaataacgattagtttgtgggttagagtaaattaatacggttaatattaatgtatcgt -tgaaaagctggtgtcgccaataaggtaaccggctaggcagagtatatgtcacgaagtata -actaccctaatgataagctgtaggaataaaattaatgctgtctctaagcgaagagatatt -tccgactctgttttaatgacgaatctcattacttctgacttgcaaatgttcaatatggca -cggtttcacggcacctttgtgacgcatataatgaacttagaagattataacgacggaact -ttatatgataatccgttacgattaaagaatctgttaaatatcataatggcattcagttct -agaccgtgcatcatggtaaacttactttctctgcatggcgacatacatttcgctattcaa -attcgcgtgtggttacacccactcgcacctttggaatattaagagaagatgatcagaaaa -tccattcgctcaatttttctgacgtacgtctaatttatcctaggagacaaatcgttttat -gtctctcacatttttgaagaaaggttcgagagacaatactcaggtcctgaactgctagaa -gatactcggtggagcgtggcaacaatgaaaaactcgtgacataaatgaatgatacttttc -caagttcagttaagtgaatatgtttaacatacccggcttttcgatcttaagctgacgctg -gacgtgcgagtaatgtcagtctcttacatacactagtgactccaagtttcgtcaaaaacg -ccccctcccttctcgagcccactcacgctatgtattgacgcgaacttgttcgggatcaga -cttttcaggagttcggtcgcgtgtccctatgtgctaatatataagttagatcgcattaga -tgctaatctgaatacttatagacgaccttcaacgagaacgggtaccaccttgaggctaga -gttaggtgtgaaacgacaggtagggacatataaaatttgagtgcggctttagttaagggt -ttaattacctactcaaacatcacgctcgcgcccttcgtacgtaatcgaccatctagaggc -taaggggactgtactaggtagtgattaatgatatcctagacgcacgtgccttagatcttc -agactctgatggtccgcgatcaccgtaattgtagtcctccaactcgatcactttgttggc -gtcaaagaaattacgatatctaaatacttataatacaataaccaaggatgagaatgactc -atcgcgttggagttatattgcttgaagttctatggaatgaaagcacgttatctgccgtcc -caatatctccagtgagctaattcattggacggtccactttgatcaatccccgaggagatg -ttcggacactttagtctgtaacacttagcgttgagaccacgaacaattgattactcagtc -ttgaaggtgttttccaaagttcattttaaataagactacgataggcctttcctattgata -taaactacccggctctgttgttcgtgtgagtcgtacttctctgtgtttttctgattatag -caagattcgattcttagtgtaaacagcgatttttatttgacccgtcaatgagaagcgcat -aggatctaagcaaaattatcaagttgtgccacaaggtaagatctttccagttattgcagg -taggatgtatcccacgttgatagtatgaggtctgacgtcaactgtctaggagagttgacc -gcgtgcgggtacaccggatttgcatcgatgttgagaacgcagaactcccactgtcgtggc -ggcgttcctgatatttagcaagaggcgttgataaagccctcatcatctagatctcgacct -catctgccctcttgctccatcattttctacacagactactttcctatctacgttagtata -attgctttctatcttagtatcatttagagcttctccgtcaacaggttcgtgctattaaag -ttagtacgaaagggacaacttgtagcaacgcatttaatcggttttcgactacttcgcaca -aaatcagataaagaagtttgtcattctattagacattgaattgcgcaattgacttgtacc -acttatgatcgaacactgaatcaagactgtgattaactaaaatagacaagccactatatc -aactaataaaaacgcccctggtggtcgaacatagttgactacaggataattaattggact -ggagccattacattctctacaatcgtatcacttcccaagtagacaactttgaccttgtag -tttcatgtacaaaaaaatgctttcgcaggagcacattggtagttcaatagtttcatggga -acctcttgagccgtcttctgtgggtgtgttcggatagtaggtactgataaagtcgtgtcg -ctttcgatgagagggaattcaccggaaaacaccttggttaacaggatagtctatgtaaac -ttcgagacatgtttaagagttaccagcttaatccacggtgctctactagtatcatcagct -gtcttgcctcgcctagaaatatgcattctatcgttatcctatcaacggttgccgtactga -gcagccttattgtggaagagtaatatataaatgtagtcttgtctttacgaagcagacgta -agtaataatgacttggaataccaaaactaaacatagtggattatcatactcaagaactct -ccagataaataacagtttttacgatacgtcaccaatgagcttaaagattaggatcctcaa -aactgatacaaacgctaattcatttgttattggatccagtatcagttaaactgaatggag -tgaagattgtagaatgttgttctggcctcgcatggggtctaggtgatatacaatttctca -tacttacacggtagtggaaatctgattctagcttcgtagctgactatactcaaggaacca -ctgctcaaggtaggagactagttccgaccctacagtcaaagtggccgaagcttaaactat -agactagttgttaaatgctgatttcaagatatcatctatatacagtttggacaattatgt -gtgcgaaactaaaattcatgctattcagatggatttcacttatgccttagaaacagatat -tgcccgagctcaatcaacagttttagccggaaacaatcgaagcatagggacaatgtatct -tttcctaaattgccatgtgcagatttctgagtgtcacgaagcgcataatagaatcttgtg -ttgcctcaactcgttgaaaagtttaaaacaatcgcagcagtctttttggggtctactgtg -tgtttgcaaaataactgaaagaaacgcttgaacaactctgaagtagctcgagtactcatt -aaagtgtaacacattagtgaatatcggccaatgaaccaaacgcttcccggtacgctatct -ctctcatcgggaggcgatgtgcaggttatctacgaaagcatccctttacgttgagagtgt -cgatgcatgaacctcattgtaacaatagcccagcaaattctcatacgtgcctcagggtcc -gggcgtactcctccatggaagggcgcgcatctagtgttataccaactcgctttttaacta -ctatgctgtagttctacaggcatagtggccagtattttctaacttctctggatagatgct -ctcactcctcatccatcacggcttcagtttacgtcttacttgcttgttcagcaacggatg -gaggcattaagtatcttcactgttccctaaaattgctgttcaatatcaaagtaaggacga -tacagggaaagctcaagcacactcattgaatactgccccagttgcaacctcacttaatct -gacaaaaataatgactactctaagtgttgcggaagcagtctcttccacgagcttgtctgt -atcacttcgtataggcatgtaactcgatagacacgaacaccgagtgagaaactatattct -tgcttccgtgtgtgtgacaccaggtaattgatgcggatataagctggagatcactcacgc -ccacacaaggcgctgctacctctttattccaatgtgtaagaatttgctaacttcatttct -agaccgcagctttgcggtcataatttcacggtacggacccttgggttagagacttgataa -cacacttcgcagtttccaccgcgcacatgttttagtggcttctaacatagaatttttgtt -gtgacataaagagtgcgtgggagacttgcccgaccgttaagccataatcaattgaaagcc -ccgtgagtcacatctaattggttgtactgcgcatttagctatcctttagctgactcgaag -agattcgattcctaatataggttaattagatggctgccgcgcgaagtaaaacgtgaaaaa -cgtagtgcgcagatctgcataactcgcgcttaattacttatgagtagttccaagttcgct -acgttatgagagagattggaattaagcaaatatgttttatggtgattttgggatgagaag -gactgctaagtacggctactaaacaaatttctaaaaccgccatctaccttatcttggaga -catttaagttgtatatgtcactagtctagcttttgtctgtgggacgcgttctcggaatga -gggaaatgcaagagccgattcatcaaatgcttatctaagaaagtagtggactattacacc -aagcacgaatgccagggaactgctttcttgctcaggacctcgcgacaaggtaccccgcat -aagtcctagaattacatttggtcagcaatgctgacatttgaccgtgaaaacataatttta -atcagaaggcagctcacccgcttgctctagatcttatctttgtatgaatgtcagaattta -ctgcaatatccgttccgaatagtgagggcttagtatagttctctgtatacaggtcacatc -aaactccccctgtcctagtacagctctgagctttaattaattgcatacatttccttcaat -catcagatgaaaacaccgcgaatcatgctcttctcgtatagggcaagagaagcaacaaac -aactagcccgactcacgttcatccgccgtatccttgttcagttcttactccgtattaggt -cagcgaaatctaatcagaataatcggtcgcgtatcaaaattaaaatcccgcttgaggttg -acaattaaaacgctgagcagttatcggctattagatagtggggtgaaagtaattggctgg -aattatgttaaaacgtgatattaagctaaaatacgctacttgttgccgacctaattcagt -cattcgatattcagttagagccaagaataacaagcttgtataaattgaacggggtgcact -aaacgatgtgttactctaatattcagcttggagtatacctgaaggcgaattcatgtatcg -gccaataataagacgttgaagatcacaatttggactagcaaaagaaggtgatttatgcgt -ggggattgagtccactgtacgagtacggtctctggaaaattataggttcagggaatataa -ggaagtaaagataattaccaagagatttttggtatcgctatgacccagaggtgttctaac -gtctgttttgatccgcagaatttctgcctcaatgcatatttgacggacttgaactagagc -ctctaaagttaaatggcgacgcaactgttcctaaacttcaattattactactcttttttt -cctagggtattgtagaggccagtggacaaaataaatcaaatttaagatgtttcggacatt -aacatcccccgtagcatagaaatcatcagttatccaatctctcatcgagcttttacaatt -tctgctggcgctatggacagcatatgccgcgagacctccgcaagactcacttgatcactg -taagtatcttcattagaggttagagcctatagttaagctgctgacctagtaaaattggta -ttttctaattttattgctcaagttaaaggttagtgaagggataatgacgttatttttgaa -caatgggttgtattcaattttatatcacgaatggaacccttcattcccggcataatacta -gacgacacgaacaagctccgatctatcagccaggcacgtgttaaggtttaattccggcaa -accaatgaagcatcaaaaggtgacctgatgcaacttagggtcacgatgagtttttcagga -ctacttattacctattaataagttaacatgagccttcataccccgtaagacaatacatac -tccaccaattagaattctgagccatcttatctttttgtatcatcgaagggtatggccgaa -taggttaattagttactcctaacgtctctacaggcatgcatttgacgcaccttcgaaaat -agtcaatctctcgccacacgcgtctagtatgcagcatcaaaaatatagtccacggtttcc -ggattaccaaacgcggcaaagagaaacattgtatcgacggagataacttaatacagaagg -aaggggcatcttcgaatacggatgaataattctatctgtttattctgacatcttgttttc -aggttaatcttacgcattcaaatgacgcctgccccatgcgtgcgcaattattttctaata -ttgacgagagcaatctcactccttttgggtctatttatgttttattgaggcacaagccta -tacagaacaggtactattaaggccgtgagtgtgagactcaaaccgtggaaacaaaggatg -ggttgttcttggtacaagttttagtgcatgtgggcaatccttaccaaaatcagatgctat -ccttaactttgggctgcatttaagatggcggttggaggcctgtgagaatcctgcgtgtca -tctttaatgaccgaattcatccatgtagattcagatcacacactcattccttgatgttgt -ctaaacaaaagttgttgtggacgcattggagggagttaagtaacaacttgggatcgcata -cttataaaaattatatgttaaactttcacaaacgctgaagtccaaagtaactagcccaaa -cgcctcgagagtcactaggtattaatggtgtttgagttcctgtgaaatagtgttcgaagg -taaaatttatgtaccaaatcgaaagaacacttaataaggcttgcttgcacggaggtatga -tgtttactgactctacaaccctaattttccagtacgtacattcattccaataggttagtt -ctcaaagtgctatacaggctcctcaattgatgatatgcttcagccgctctatggatatta -gctcattttatttaggaagcccgcttagaggcttactatgagggaaatgccaaaatgtca -tacttttcggtgtgtcccatatgacaccgctttacatagaatttgaattaaaacgcgctc -tcccgttcactaccatacttggtaccgtgcgcatattacatatagatataggatcatttt -ttaaagctgtactaggtttgatcgacaatcttatgctatactatatgatgtaaccctcat -aatcaataccgatcgtacgatcctagcataggtggcaagcgattttatgccgattattgt -gttaaatagtctgtgagtgtgattatcagggctacgttggtagaggggttgtatagacct -cgcacacattgtgacatacttaacaatatacgaaaactgatataataaatccccttaccc -aaacaccaatcccgttgaatcaactaccataacgtctcccatataaattgcctacttgtt -tgcataaatctgaatacataacaccattgcaccttcttgtgttccaatcccgttaagatt -gccttgtcagatgatatgcaagaacaatagcatttgctagcaattattaacagctcttcg -aattgcctccacataacgcgggagggtatattttaatttggcaaatactaagtactgttg -gcgtcatatgctattaacggttggatattaagttatgtcagccgtaagcaagagtgggcg -aaatattttgttacccagtgagagcactcttagagtttggatacaataggccatatgttg -acttaagaggacgtaactacgccgtacaccattgttcaaccgacttcttggcaaatagaa -tcgtattagcaatcttaagaatagagacacgttcgtgttagggtatactacaaatccgaa -aatcttaagaggatcacctaaactgaaatttatacatatttcaacgtggatagatttaac -ataattcagccacctccaacctgggagtaattttcagtagatttactagatgattagtgg -cccaacgcacttgactatataagatctggggatcctaacctgacctatgagacaaaattg -gaaacgttaacagcccttatgtgtacaaagaaaagtaagttgttgctgttcaacagatga -tagtcatgacgcgtaacttcactatagtaaattgaaacaaatacgcaatttagacagaat -ggtacggtcatgaatgacagtaattcgaagtgctagaccaacttaaaataggtaaacgtg -cccgaaaccccccttaacagaaagctgctatcatggtgcagtatcgacgtgttcagaaac -ttgtaacttttgagcaggtccgagcacatggaagtatatcacgtgtttctgaaccggctt -atccctaagatatatccgtcgcaaactttcgatttagtcccacgtagagcccaagcgttg -tgcgactccacgtgcatgcccagaaatacgagtttaaatttggttacatggttaattttg -accgaagcatcgcactttatgattgataattggattcaatatgtcgccctatgcgaatgc -aacatgatccacaatttggctataagacgtttaatccgtatcacactttgtttgcggcta -gtatagtaacgcccgtgcaccaagagtcagtaacaattataagtactccgcaggtacttc -aaatataaaaactaatcaaacacgacccatatgatcatctgaagatatttggaactttct -cgacaaccaccctcgtactcaatacttacactaatcgacaggcacacgcaacgtgtacag -tcgcaccatattgagtcaagatttgcttagtggcgatgagcgtacacgcttatttctcta -gtcacaattagttatctacgagacatcacgagggagcaaataagcgatgttatggctaca -cataggcacgtatgaatatgatataagccagttaaacagtcgaaccatcgagcaaattct -catgcaccaacccacacgttgaggcacaaagagtaagctgtttgaatgtaacttcttctg -ctgagcgggccccaacgtaaggatcaactagaagagaaaactcggtattagtttaaatgc -gtcacggagcatgagtgcatttcactaagaatgtctgtgtaaccaatataacatctattt -gttatctgattgcctacttatggctttgcggtcgtggcgactaatgtctccaatcctttt -gaggtcggtaccaactccctttaaattacgctgtgcaggctcatgcactgcatacatata -cggtagcaggtagggacctcacgcacccttattataatcaatagtagttatcagtcaacg -aggcaggaatgctgaggtcgaggtgttggtatattttctatgtgccgtctaggcgactat -cacgcattaccaggcgagatttaagccaattttgaatatagtcaacgtaatttttactat -gggttccaccgaaacgccttgcacaactaagaatcccataaaatatcgatatcaaataaa -agattgtgtcaataccttcatatatattttttcggttgactaacgtgaactaaggttagg -ggttttgtatgtctatataggaaacagtttcttttctgtcctactttagtaaagtcttca -agccttactccaaaatcacggtgattaagccgttactcagcagcatgattctgcctgctc -gggtcctaaaatccagccttgtaagagtcgctgtgtattagctagggagacctttgttaa -aaaggatatatcgcggcgggatgtgagtgcgtggcgcatactcaatcttcagctcgtgtc -attataatatctctcccccacgcttttcactagatatgccgtgtaagcaaacaccttatg -cttaatttcgaaaatattggtacttgaaaaaagctgtaggggtacttaatgtctggtagg -agatcaggagagaattgagtgtaaaaccgtaaagccctcacctgacttcatgtaaatggc -ttagaagactccatgatttaataaatactacgaaggaaagactggatctaaagataactc -tagtaaggccaactcccttcaatgctgttgccagttataatccaagagctgtccttttct -gaaccatagcggcttctgaagcgaactagaagcaaagttggttctagccagacagccaca -taccctgtacgggtgtattactaaaactggtccggtattagttcaccaagggaggaatta -ggcaaaggatctaggtatgcaagtcggagtattacatccctaccctgaatccatcaatag -gttcctctgtactggccttcgcaatgagtattcaaggttgtacagccgtataataataag -atagtgactatgaacgggaagtaacccgctcaccttccccaaaacattgttatatctaag -tattaaagtctgccgtagtgttaatactcgaaaataaacaactggcaaattacaccgcac -ttaagccgcttttgatttatatttttccaatgcgcttttaaaaataattcagtcctacat -actaattaagacccttaaacggagatatcacaagttaagttttaaccatctcgactaggt -ggaactatagatacccaactcaatttatcattacctgtaatgttcctagaaggattgcat -ttcatgtcaagacggtggagtttcacagcgaaacttcagtgtgaacagattctgagaaat -cacctaaacctattagtcagagcacccggttagaaccagttgtcaaaaaatagagcggtt -gcatgagacagaagtaacgatgagatccgttgtaacgttgagacatctggcctatcgtca -atacagtcctcccttaaaaatatttttaaatactaggcaaacccaacataggttagtcct -atgtgatacgccacatggtatatcattttgtaacgttacctagggataatcaggaagtgg -aattacgcaaaagtagacagtgaaatgcttagggttatagtctagtccaaagataaagga -taaagcacgtcagagaactatattagccgaatgggaatcattgttaggagactgtggatc -atgtctaaaaagcaacgcagaaacagtcatcgaaaaaatctcgtttttgtttgaatctaa -aagagctttgatgaccgatagtacctgtatactagttactgtattacgtgtctaatgatt -tcggattggggtccccagaatcagacgtcattgtagacgattcaagtttaccaatttaat -ttcccagctctccttggagaactatcgccaataattgcagtcactttccttttctgaaac -gataaagccgtcagagttctctgcaacgttggacttacctgaggttctaacccactttcg -gttctaatagtagttaacgacacaacgaataacctttactgtggggctttcacgatattt -tttcgcttattattaatggttacgtcataagctggtgtccaaattaaggttaccggcttc -gcagagtagttgtatccaagtataacttccctaatcataagatcgaggtagaaaattaat -gctgtctctaaccgaacagatatgtcccactatgtggtatggacgttgctaattacttct -gaagggaaattggtcattatggatacgtgtctaccatcaggtcggacgcagatatggttc -tgtcttcagttgatccaccgttctttataggataataactgacgattaaagattatggta -aatagattaagccaattctcttcttgtcagtgaagcatccttaactgacttgctctgcag -cccctcatacatttagctattcaaagtaccggctcgtttcaaactctcccacctttggaa -gaggttgtcaacttgataagtatatcatttacagcattttttcggacgtacctctaatgt -ttcattgcagaaaattagttttttctatcgcacattttgcaagtaacgttagagacacaa -ttatctgcgaatgaactgctagatctgacgaccgggagcctcgcaaatatcaaaaaagac -tgacatatatcaaggagtcgttgacaagtgctggtaagtcaattggtttatctgtcccgg -cgtttcgatcttaagctgaccatgcacggcagagtaatgtcactctcgttcttacaagtc -tgtctccaagggtcggcaaaaaagacccctccattctcgagcccactcacgatatgtagg -gacgacaacttgtgcggcttatgaattgtctggactgcgggcgagggtccatatctccga -agttagaagggacatacctttagatgataagatcaattcttattgacgaaattcatccac -aacggggaacaacttcaccctagacttacgtctgaaaagacacctagcgtcttataaaag -gtcagtgccccgtttcgtaaggctggaattacctacgcaaacttaaacctcgcgcccttc -cttacgtatcgacaagatagaggctatcgcgaatgtactacggaggcatgaatcatatac -tagaaccaagtgcctgtgatattaacaagatgatccgacgcgagcaccgtaattctaggc -ataaaactccagcaatttgggggccgaaaacaaatgacgttagctaattaattatatgac -atgatcaaaggaggtcaatcacgcatcgagttcgacgtatattcattgaacttcgtgcgt -ttgaaagaaacttttatgaaggcaaaattgatcctgtctcctatttcatgcgtacctcct -agttgataattccccgagcagtggttaggacacttttgtcggtatcaagttccggtctca -aaacgtaaaattctgtaatctgtatggatggtctgtgaattagttaatttttatgaagtc -gtcgagacgcagttcctattgatttattctaaacggagatgtgcttcgtgggactcggaa -gtagatctgtgtttatgattattgctactttagatgctgactgttaactccgtgttgttt -ttcaaccgtatatcacaaccgaattggatagaacctatagtttcaagttctgccacaagg -tatcatatttacagttagtgctggttgcttctttcaaacgtggtgagtttgtgctatcac -gtcaacggtagagctcagtggaccgagtgcgcgttcaaccctgttccagagagggtgtga -tagcacatataccacgctcgtcgaggcgttcatgatagtttgcaagagccggtgttaaac -acatattattattgttatccaactaatcggacctatgcataaagcattgtctaaacagaa -taattgcctatatacggtagttttagtgatttatatcttagtatcagttagagcttcgaa -ctcttcaggttcctcatatttaacgttcttcgaaagcgaaaacttctacaaacgaatgta -agcggttttccaagtagtacctataaatcacagaaagatctgtctcagtatagttgaaat -ggtattcagctagtgacgtgtaccaattatcatagttcactcaagcaagacgctcattaa -cgaatatagacaagacactatatcatataataaaaaagaacatggtgctcgaacatagtt -gaattcaccatattgaaggggaatgctgacatgtaattcgctactagacgatcaattccc -tacttgtcaaagttgaactggtacgttcttggaattaaatatgattgcgctggaccaaat -tgcgacttcttgagtttcagggcaaacgattgagccggaggatgtccgtctcttaccttt -cttgcttatgataaacgacggtccctgtacatcactgggaattctcagcaaaaataattg -ggtaaatcgagactcgatgtattcggccacaaaggtgttagacgttaaagattattcaac -ggggcgataataggatcataaccggtatgcaagcgcattgaaagagccatgagatcctta -tccgataaacgctgcacggtatgtgcagccttattgtcgatcacgaatttataaatgtag -tctgggctgtaagttgaagacctaagttataatgaagtgcaataccaaatcgattcatag -tggattatcagactcaagatatctcctgataaattacagttgttaagatacggataaaat -gagatttaagattagcagcctctaatctgtttcaatcccgttggaatgtggtatgcgatc -aaggttaagttaaaatcaagcctgtcttcagtcttgattcttgttctgccatcgcatgcg -gtctacgtgagttaatatgtagcttacgttctagcttgtgctaatctgagtatagattcg -tagaggaatattatcaagcttccacgcctcaacgtacgtgtattggtcacacaagacact -aaaagtggaagtagcgtaaactatagtctagttgttaaatgctcagttcttgttatattc -gatatactcttggctaatttatgtctgagtatataaaattaatgatattaacttgcattt -cacggatcccttagaaaaagattttgaccgagcgcattataaacggttacaccgaatcaa -tagaagcatacccaatagctttctttgaatttattgcctgcgcaacttggctgactctct -agatccgaataattctatatggtcgtgacgaaactagttcattactgtttaaaatgccaa -catgtcttttgggccgataatggctctttgcaaaattactcaatgatacgattgatcaaa -gcggtagttgctagtggtagcatgtaagtctatcaaatgtctgattatccgaaaatcttc -caaaagagtccacgtaccatatctatctcatagcgacgcgaggggaaccttatctaacta -tcattccatttaccgggtgactctcgatgcaggatccgattgggataaattgcccagaaa -tggctcattcctgactaagggtaaggccgttctcagcaagggaaccccgcgaatctaggc -ttataccatctagattgttaactacttgcctgtagttctacagccatactggacagttgt -ttctaaatgatcgggattcatgctagcactcctctgaatgcaccgcgtaagtttaactat -tacgtccgtgggcagataaggatggaggctgtatgtatcttaactgttacctaatatggc -tggtaattatcaaagtaaggaccttaatgccatagcgctagcaatcgctttgtatactga -ccatgtgccaacctctcttaatctgtaaaatataatgtcttagctaactgtggacgatca -tgtctctgcctagagcttcgctgtatcaattcctatagccagcgtactagtgacacaaca -acaccgtgtgagaaaagatattagtccttacgtctgtctctctacagcttattgatgagg -attgaacatggacatatagctccccctcaaaagcagatgctacctctttattccattctc -gaacatttgccgaacttaatttcgacaaacctgaggtcacgtcttaatttatcggtaacg -tcacgtccctttgagactggataaatatattaccaggggccaacgagcaattgttggagg -cgcttctataatacaaggtgtcttgtcaaagaaagacggcgtgcgtctcgtgcaactcac -ttaaccaatattaatgtgaaacccccctctctcacatcttatgcggtgtactgccctggt -acatttcctgtacaggactccaacagtgtagattcctaagatagctgttggagttgcctc -acgccagatcgaaaaactgaataaactagtgagctgagctgcagaaataccgcttaatta -cttatgactagttcaaagggacctacgtgatgtcagacattgcaaggaagaaattaggtt -tgtgcgtcattttggctggactagcactccttacttcccctactattcaaatgtcgtaaa -cagcatgagacaggatcgtgctgacatttaaggtctattgggaacgaggctacctttggt -cgcgcgctcgcgttctccgaatgaccgaaatgcatgagcacagtatgcaattgcttatag -atctaaggtctggtcgttgaaaccaagcacgtaggcctgggaaatcagttcttcctcagc -aactacacaaaagcgtccaagcattagtacttgtagtaaatgtccgaacctatgcgctca -tttgaaagtcaaaaaatatttttaagcagtaggcacctaacccgattcctctacttagta -gctttctttgattctcagaattgactgcaatatcactgcacaattctgtgccattactag -acttctctgtattaacgtctcatcttactaacactcgcctaggacacatctgagagtgaa -gtatttcaatacatttactgaaatcttcagttctaaaatccccgaataaggctcttatcg -gtttggccaacacaagaaaaaaacttcttgcaccactcaccttcatacgcaggagcctgg -ggaacttagtaataactatttcggcagacaaagcttataacaagttgccggcgcgtataa -tatttaaaagaccccttgagctgctcaattaaaacgctcacctggtataggctattagat -agtgccgtcttagtaaggggcgggaattatcggataaactgatattttgataaaataacc -gacttgttcacgacataagtcactaaggagattttatctttctccaaagtatatcttcct -tggataatttcaaagcgctgcaatttaagttctgttactagtttatgctgctgggaggtg -accggaaggcgtagtaatctagaggcaaattataagaagttcatcatatcattttcgact -acaaaaacaaggtgttgtatgccggcgcattgtgtaaactggacgagtaccctagatgga -aaattatacgttaagccaagatttcgatgtaatgataattacctacacatttttgctatc -cataggaacaagagctgttctataggctcgtggcatacgaacatttgctgccgctatgaa -tattggaagctcttcaactacagactctattcttaattgccgtcgaaaatgggccgaatc -ggctattattaatactcggtttttccgaggggattgttgtcgacagtcgtaattattatt -aatattgatgttggtgaggtcatttaaatacaaccttgcagacaatgaataagggatcca -atctctcatactccttttacaattgctcatgcccctatgcaaaccttatgccgccacacc -tccgcaactctctcttctgaactgtaagtagcttcattactggtttgagactatactgaa -gctgatgacattctaaaatggctattttcgaatgtgattcataatgtttatcgtttggga -tggcagaatcacgttatttttgatatagcccgggtattctattgtatagaacgtatgcta -caagtcattccccgaagaagactagaagtaaacaacatgcgaccatcgttaagccacgca -aggctgtagctttatttcccgataacctatcttccataaatagcggacagcaggatactg -acgctcaacatcagtggttatggtctaatttttaacttttaataaggtaacttcagcagg -catacacagtaactctttaatttataatcaaattagaagtctgacacttcttatattttt -ctatcatccaacgcgatcgcccattagcttattgtgttactaataacgtatctaaaccaa -tccttttcaagctactgcctatattgtcaatatatacaaacaacaggatagtaggctgct -taaaaaatattgtcaaccgtgtacgctttacaatacccggaaatcacaaactttgtagac -aacgagtgaaatttatacactacgaagggccagcgtacaagacccatgaattaggcgata -tgtttattctgacatattggtttatccttaatctgtcgctgtaaaatgaagccgccccca -tccctgcgaattttttttcgaagattcacgactgaaatataaatacgtttggctatattt -atgttggagggaggcaatagcctttactgttaaccgaagatttagccagtgagtgtgaca -ctaaaacactggaataaatgcaggcgttcttctgggtaaaaggtttagtcaatctcgcct -ataagttcatatagctctggatataattatctggcccatgcatttatcatggcgcttggt -gccctgtgtgaagccggcctctcatattgaaggtccgaagtattccatgtacattaagat -cactctctcattcatgcatcttggcttaacaaatctggttgtccaagctttccaggcacg -tatggtacaaattcggatcgaatacttataaaaatgatatgttaaactgtctaaaacgct -catctacaaagtaaagtgcactaaccaatagagtctcaagaccgtgtaatgctggtgcac -tgaatgtgtaatacggttagaagggattagttatgttacaaatccattgaaaacttaaga -agcattgcgtgctcggagggtgcatcttttatcaagagactaacattattttcaacgacg -tacatgctttacaatagggtacttatcaaacgccgagaaacgcgcctatagtgatgttat -gattatgacccgatatccattggaccgaattttatgtaggttcccagcgtactcgcgtaa -tatctcggtattgccataatgtaatacttgtcggtctctcccagatgaaaaagcgttaca -gagtatttcaatgaaaaacagcgcgcaacgtcaatacctttaggggtaacggccgctgat -ttcatatagatatacgataagttggtatagctctactaggtggcatccacaatcgttgca -tttactatagctggttacaatcataatctataccgttccttacatactaccatagcggga -tagcgtttttttgccgttgattgggtttaagaggatgtcagtctcattatatccgattcg -gtgggagagccgttgttttcaaatcgcacactttgtgacataatgtacaagataacaaaa -ctgatataagatataaactgtcaatatcaccttgacacttgaatcaaagtaaattaactc -gcaaatataatttgactaattgggtgcagatttctcaattaataaaaaaatggcaccgga -tgggcttacaagccccttatcattcacttgtatcatgatttccaagaacaatagaatttg -ctagcaagtatgaacagagattcgaattgcatccacagtacgccggagcgtttattttaa -tgtggatatgacgatgtactgttggcggcatttgctagtaaccggtccttatttacgtag -cgcacacgtaagcatgtctgggagaaatatggtggtacaatctcagagaaagattacagt -ttggtttaaataggacttatcgggtcggaagtggaacttaataagcagtacacaattggg -caacagacgtcttgcctattacaataggattacaatgcgttagatttcagacacgttcgt -gtttggctattcgtcaattccctaaatagttagacgatcaactattatcaaagtgattct -ttgttcatcctccattcatgtaacagatggcacactacgcataacgccgaggaattttaa -cgagatttaagagagcagttcgggcacaacccacttgactttataacagctcggcagcat -aaacggtaatatgtgacaaatttccaaacgttataagaacgtatgtgtacttagaaaact -aagtggttcatgttcaacagatgtgacgcagcaagcctaacttatctattggttttgcta -taaaagaacaaagttacacagaatcctaagggcttgtttcacacttatgcctagtgcttc -accatcttaaaatagcgaaaccggcacgaatcaaaccttaaaacaatgcgcagatattgg -tgatggtgactccgggtatgataatggtaactgttgaccagcgcccacctcatcgaagta -tagaaagtggttaggataaggatgagaccgaacttatttccggccataactttagatttt -ctacctagtacacaacatcagggcggacacgaaaccgccatcacatcatataccaggttt -aatttgcttaatgggggaagtgtcaacgaaccttcgaactttagcaggcatatggccatt -atatatggccccagagcagaatgctacagcagacaaaatttggatttatgtagtttaata -cctatcaaacttggtgtgaccatacttgtctaacgacagtgcacaaagtgtaagttacaa -ttattactactcagcagcttctgcaatgataaaatcttatcatacacgtcacatatgata -atatctacttagggggaacgggctccacaacctacatagtactcaatacttacactattc -gacaggcacaccaaacctgtacagtcccaaaagattgagtcaactttgcagtactgcaga -tcacagtaatagcttagttagcgagtcaaaattagttttctacgagactgcacgaccgtg -caaatttccgatgtgttggctacaaatagcaacgtatgaatttgtttgaagccacgtaaa -ctgtacaaccttagagataagtctcaggctactaaaaacacgttgtggcactaacaggat -catggttgattcttacttattcggctgaccggcccaataagtaaccttcaactagaacag -aataatcgggagtagtttaattcagtcaaggtgcaggtctcattgtaactaacaagctct -gtgtaaccaagttaaaatcgttttcttagcggattccctacttatggatttgagctcgtc -cacaatattcgatacaagaagtttgtggtccgtaacaacgaaattttaattacgctgtgc -agcctcatccaaggaattaatagaaggttgatggtaggctccgaacgctccatgattata -atcaagtggactgtgcagtaaacgaggaaggtatcctgacgtcgtggtgttcgtttttgt -tatttgtgccctatacgagtagataaaccatgaacagcacagtgtgaacccatggttgat -tttaggctaccttatttttaatttccgttacacagaaacgaattccacaactaacatgcc -attaatttttcgatatcttataaaagatggtcgaaattcattcatttattttttttcggt -tctcgaaagtcaactaagctgtcgcgttttgtttctctttagaggtaaaagtggctttga -tctcctacgtttggatactagtcaaccattactccatttgatccgtgagtatcacctgtc -taacatccagcattatgactcctcggcgaagaaaagacacacttcttagagtcgatgtgt -attagctagggacacagttgtttaatacgatagtgagcccagggagggcagtgcgtcccc -cagtagatttattcagctagtgtaagtataagatatctcacccacgaggttcaagtgata -tgcagtcttagaataatacttatcctgaatttcgatattatgggtacttcaataatccgc -tagcgctactttatgtctcgttggacagcaggacacatggcagtcttaaacactaaagac -atcacctgaatgaatgtaatgggattacaagaatcaatgaggtattatatacgacgtagg -aaactctggatatatacagtaatctagttacgccatcgcacttcattcctctggaaactt -agaagacatcagctgtacgtggaggaaccagacccccgtatgtagccaaatagaaccaaa -gttgcttatacaaacacacccaatgacaatggaccgctggagttcgtaaactcggaacgt -agtactgcacaaacccagcatttagcaataggagctacgtatgcaactcccacgtggtaa -taccttcaagctatcaatatataggtgcctagctaatcgcattcgcaagcagtattcaag -cttgtaaaccagtataataattacagaggctctatgaaacccaactttccagctaaaagt -cccaattaaatggttatttc diff --git a/extern/phmap/examples/knucleotide.cc b/extern/phmap/examples/knucleotide.cc deleted file mode 100644 index 48f5c79..0000000 --- a/extern/phmap/examples/knucleotide.cc +++ /dev/null @@ -1,236 +0,0 @@ -// ------------------------------------------------------------------ -// run with: knucleotide 0 < ../examples/knucleotide-input.txt -// ------------------------------------------------------------------ -// -// output should be: -// -// T 31.520 -// A 29.600 -// C 19.480 -// G 19.400 -// -// AT 9.922 -// TT 9.602 -// TA 9.402 -// AA 8.402 -// GA 6.321 -// TC 6.301 -// TG 6.201 -// GT 6.041 -// CT 5.961 -// AG 5.841 -// CA 5.461 -// AC 5.441 -// CC 4.041 -// CG 4.021 -// GC 3.701 -// GG 3.341 -// -// 54 GGT -// 24 GGTA -// 4 GGTATT -// 0 GGTATTTTAATT -// 0 GGTATTTTAATTTATAGT -// ------------------------------------------------------------------ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// ------------------------------------------------------------------ -constexpr size_t thread_count = 4; - -struct Cfg { - unsigned char *to_char; - unsigned char to_num[128]; - using Data = std::vector; - - Cfg() { - static unsigned char __tochar[] = {'A', 'C', 'T', 'G'}; - to_char = __tochar; - to_num[static_cast('A')] = to_num[static_cast('a')] = 0; - to_num[static_cast('C')] = to_num[static_cast('c')] = 1; - to_num[static_cast('T')] = to_num[static_cast('t')] = 2; - to_num[static_cast('G')] = to_num[static_cast('g')] = 3; - } -} const cfg; - -// ------------------------------------------------------------------ -template -struct Key -{ - // select type to use for 'data', if hash key can fit on 32-bit integer - // then use uint32_t else use uint64_t. - using Data = typename std::conditional::type; - - struct Hash { - Data operator()(const Key& t)const{ return t._data; } - }; - - Key() : _data(0) { - } - - Key(const char *str) { - _data = 0; - for(unsigned i = 0; i < size; ++i){ - _data <<= 2; - _data |= cfg.to_num[unsigned(str[i])]; - } - } - - // initialize hash from input data - void InitKey(const unsigned char *data) { - for(unsigned i = 0; i < size; ++i){ - _data <<= 2; - _data |= data[i]; - } - } - - // updates the key with 1 byte - void UpdateKey(const unsigned char data) { - _data <<= 2; - _data |= data; - } - - // masks out excess information - void MaskKey() { - _data &= _mask; - } - - // implicit casting operator to string - operator std::string() const { - std::string tmp; - Data data = _data; - for(size_t i = 0; i != size; ++i, data >>= 2) - tmp += cfg.to_char[data & 3ull]; - std::reverse(tmp.begin(), tmp.end()); - return tmp; - } - - bool operator== (const Key& in) const { - return _data == in._data; - } -private: - static constexpr Data _mask = ~(Data(-1) << (2 * size)); - Data _data; -}; - -// ------------------------------------------------------------------ -template > -using HashTable = phmap::flat_hash_map; - -// ------------------------------------------------------------------ -template -void Calculate(const Cfg::Data& input, size_t begin, HashTable& table) -{ - // original implementation fully recomputes the hash key for each - // insert to the hash table. This implementation only partially - // updates the hash, this is the same with C GCC, Rust #6 and Rust #4 - Key key; - // initialize key - key.InitKey(input.data() + begin); - // use key to increment value - ++table[key]; - - auto itr_begin = input.data() + begin + thread_count; - auto itr_end = (input.data() + input.size() + 1) - size; - size_t nsize = std::min(size, thread_count); - for(;itr_begin < itr_end; itr_begin += thread_count) { - // update the key 1 byte at a time - for(unsigned i = 0; i < nsize; ++i) - key.UpdateKey( itr_begin[i] ); - - // then finally mask out excess information - key.MaskKey(); - - // then use key to increment value - ++table[key]; - } -} - -// ------------------------------------------------------------------ -template -HashTable CalculateInThreads(const Cfg::Data& input) -{ - HashTable hash_tables[thread_count]; - std::thread threads[thread_count]; - - auto invoke = [&](unsigned begin) { - Calculate(input, begin, hash_tables[begin]); - }; - - for(unsigned i = 0; i < thread_count; ++i) - threads[i] = std::thread(invoke, i); - - for(auto& i : threads) - i.join(); - - auto& frequencies = hash_tables[0]; - for(unsigned i = 1 ; i < thread_count; ++i) - for(auto& j : hash_tables[i]) - frequencies[j.first] += j.second; - - // return the 'frequency' by move instead of copy. - return std::move(frequencies); -} - -// ------------------------------------------------------------------ -template -void WriteFrequencies(const Cfg::Data& input) -{ - // we "receive" the returned object by move instead of copy. - auto&& frequencies = CalculateInThreads(input); - std::map> freq; - for(const auto& i: frequencies) - freq.insert({i.second, i.first}); - - const unsigned sum = static_cast(input.size()) + 1 - size; - for(const auto& i : freq) - std::cout << i.second << ' ' << (sum ? double(100 * i.first) / sum : 0.0) << '\n'; - std::cout << '\n'; -} - -// ------------------------------------------------------------------ -template -void WriteCount( const Cfg::Data& input, const char *text ) { - // we "receive" the returned object by move instead of copy. - auto&& frequencies = CalculateInThreads(input); - std::cout << frequencies[Key(text)] << '\t' << text << '\n'; -} - -// ------------------------------------------------------------------ -int main() -{ - Cfg::Data data; - std::array buf; - - while(fgets(buf.data(), static_cast(buf.size()), stdin) && memcmp(">THREE", buf.data(), 6)); - while(fgets(buf.data(), static_cast(buf.size()), stdin) && buf.front() != '>') { - if(buf.front() != ';'){ - auto i = std::find(buf.begin(), buf.end(), '\n'); - data.insert(data.end(), buf.begin(), i); - } - } - std::transform(data.begin(), data.end(), data.begin(), [](unsigned char c){ - return cfg.to_num[c]; - }); - std::cout << std::setprecision(3) << std::setiosflags(std::ios::fixed); - - WriteFrequencies<1>(data); - WriteFrequencies<2>(data); - // value at left is the length of the passed string. - WriteCount<3>(data, "GGT"); - WriteCount<4>(data, "GGTA"); - WriteCount<6>(data, "GGTATT"); - WriteCount<12>(data, "GGTATTTTAATT"); - WriteCount<18>(data, "GGTATTTTAATTTATAGT"); -} diff --git a/extern/phmap/examples/lazy_emplace_l.cc b/extern/phmap/examples/lazy_emplace_l.cc deleted file mode 100644 index 30a040f..0000000 --- a/extern/phmap/examples/lazy_emplace_l.cc +++ /dev/null @@ -1,54 +0,0 @@ -// ------------------------ -// Windows specific example -// curtesy of @kanonka -// ------------------------ -#include -#include "parallel_hashmap/phmap.h" -#include -#include -#include - -class srwlock { - SRWLOCK _lock; - -public: - srwlock() { InitializeSRWLock(&_lock); } - void lock() { AcquireSRWLockExclusive(&_lock); } - void unlock() { ReleaseSRWLockExclusive(&_lock); } -}; - -using Map = phmap::parallel_flat_hash_map, - phmap::priv::hash_default_eq, - std::allocator>, 8, srwlock>; - -class Dict -{ - Map m_stringsMap; - -public: - int addParallel(std::string&& str, volatile long* curIdx) - { - int newIndex = -1; - m_stringsMap.lazy_emplace_l(std::move(str), - [&](int& v) { newIndex = v; }, // called only when key was already present - [&](const Map::constructor& ctor) // construct value_type in place when key not present - { newIndex = InterlockedIncrement(curIdx); ctor(std::move(str), newIndex); }); - - return newIndex; - } -}; - -int main() -{ - size_t totalSize = 6000000; - std::vector values(totalSize); - Dict dict; - volatile long index = 0; - concurrency::parallel_for(size_t(0), size_t(totalSize), - [&](size_t i) { - std::string s = "ab_uu_" + std::to_string(i % 1000000); - values[i] = dict.addParallel(std::move(s), &index); - }); - - return 0; -} diff --git a/extern/phmap/examples/matt.cc b/extern/phmap/examples/matt.cc deleted file mode 100644 index 51afcce..0000000 --- a/extern/phmap/examples/matt.cc +++ /dev/null @@ -1,139 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// ------------------------------------------------------------------- -// ------------------------------------------------------------------- -class Timer -{ -public: - Timer(std::string name) : _name(name), _start(std::chrono::high_resolution_clock::now()) {} - - ~Timer() - { - std::chrono::duration elapsed_seconds = std::chrono::high_resolution_clock::now() - _start; - printf("%s: %.3fs\n", _name.c_str(), elapsed_seconds.count()); - } - -private: - std::string _name; - std::chrono::high_resolution_clock::time_point _start; -}; - -// -------------------------------------------------------------------------- -// from: https://github.com/preshing/RandomSequence -// -------------------------------------------------------------------------- -class RSU -{ -private: - uint32_t m_index; - uint32_t m_intermediateOffset; - - static uint32_t permuteQPR(uint32_t x) - { - static const uint32_t prime = 4294967291u; - if (x >= prime) - return x; // The 5 integers out of range are mapped to themselves. - uint32_t residue = ((unsigned long long) x * x) % prime; - return (x <= prime / 2) ? residue : prime - residue; - } - -public: - RSU(uint32_t seedBase, uint32_t seedOffset) - { - m_index = permuteQPR(permuteQPR(seedBase) + 0x682f0161); - m_intermediateOffset = permuteQPR(permuteQPR(seedOffset) + 0x46790905); - } - - uint32_t next() - { - return permuteQPR((permuteQPR(m_index++) + m_intermediateOffset) ^ 0x5bf03635); - } -}; - -using Perturb = std::function &)>; - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -void test(const char *name, Perturb perturb1, Perturb /* perturb2 */) -{ - //phmap::btree_set s; - Set s; - - unsigned int seed = 76687; - RSU rsu(seed, seed + 1); - - for (uint32_t i=0; i order(s.begin(), s.end()); // contains sorted, randomly generated keys (when using phmap::btree_set) - // or keys in the final order of a Set (when using Set). - - perturb1(order); // either keep them in same order, or shuffle them - -#if 0 - order.resize(N/4); - perturb2(order); -#endif - - Timer t(name); // start timer - Set c; - //c.reserve(order.size()); // whether this "reserve()" is present or not makes a huge difference - c.insert(order.begin(), order.end()); // time for inserting the same keys into the set - // should not depend on them being sorted or not. -} - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -using pset = phmap::parallel_flat_hash_set, - phmap::priv::hash_default_eq, - phmap::priv::Allocator, // alias for std::allocator - N>; - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -int main() -{ - auto shuffle = [](std::vector &order) { - std::random_device rd; - std::mt19937 g(rd()); - std::shuffle(order.begin(), order.end(), g); - }; - - auto noop = [](std::vector &) {}; - - auto perturb2 = noop; - - constexpr uint32_t num_keys = 10000000; - using T = uint64_t; - - test, num_keys>("flat_hash_set ordered ", noop, perturb2); - - test, num_keys>("flat_hash_set shuffled", shuffle, perturb2); - - test, num_keys>("parallel (16) ordered ", noop, perturb2); - - test, num_keys>("parallel (16) shuffled", shuffle, perturb2); - - test, num_keys>("parallel (64) ordered ", noop, perturb2); - - test, num_keys>("parallel (64) shuffled", shuffle, perturb2); - - test, num_keys>("parallel (256) ordered ", noop, perturb2); - - test, num_keys>("parallel (256) shuffled", shuffle, perturb2); -} - - - - diff --git a/extern/phmap/examples/serialize.cc b/extern/phmap/examples/serialize.cc deleted file mode 100644 index 0d44109..0000000 --- a/extern/phmap/examples/serialize.cc +++ /dev/null @@ -1,204 +0,0 @@ -#include -#include -#include - -#define USE_CEREAL 0 - -#if USE_CEREAL - #include "cereal/types/unordered_map.hpp" - #include "cereal/types/memory.hpp" - #include "cereal/types/bitset.hpp" - #include "cereal/archives/binary.hpp" - #include -#endif - -#include "parallel_hashmap/phmap_dump.h" - -#include -#include -#include - -using phmap::flat_hash_map; -using namespace std; -template using milliseconds = std::chrono::duration; - -// -------------------------------------------------------------------------- -// from: https://github.com/preshing/RandomSequence -// -------------------------------------------------------------------------- -class RSU -{ -private: - unsigned int m_index; - unsigned int m_intermediateOffset; - - static unsigned int permuteQPR(unsigned int x) - { - static const unsigned int prime = 4294967291u; - if (x >= prime) - return x; // The 5 integers out of range are mapped to themselves. - unsigned int residue = ((unsigned long long) x * x) % prime; - return (x <= prime / 2) ? residue : prime - residue; - } - -public: - RSU(unsigned int seedBase, unsigned int seedOffset) - { - m_index = permuteQPR(permuteQPR(seedBase) + 0x682f0161); - m_intermediateOffset = permuteQPR(permuteQPR(seedOffset) + 0x46790905); - } - - unsigned int next() - { - return permuteQPR((permuteQPR(m_index++) + m_intermediateOffset) ^ 0x5bf03635); - } -}; - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -void showtime(const char *name, std::function doit) -{ - auto t1 = std::chrono::high_resolution_clock::now(); - doit(); - auto t2 = std::chrono::high_resolution_clock::now(); - auto elapsed = milliseconds(t2 - t1).count(); - printf("%s: %.3fs\n", name, (int)elapsed / 1000.0f); -} - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -void testMapSerialization(const char *maptype, const char *fname) -{ - MapType table; - const int num_items = 100000000; - - printf("Building test %s\n", maptype); - - // Iterate and add keys and values - // ------------------------------- - showtime("build time", [&table, num_items]() { - unsigned int seed = 76687; - RSU rsu(seed, seed + 1); - - table.reserve(num_items); - for (int i=0; i < num_items; ++i) - table.insert(typename MapType::value_type(rsu.next(), i)); - }); - - // cerealize and save data - // ----------------------- - showtime("serialize", [&]() { -#if !USE_CEREAL - phmap::BinaryOutputArchive ar_out(fname); - table.phmap_dump(ar_out); -#else - ofstream os(fname, std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); - cereal::BinaryOutputArchive archive(os); - archive(table.size()); - archive(table); -#endif - }); - - MapType table_in; - - // deserialize - // ----------- - showtime("deserialize", [&]() { -#if !USE_CEREAL - phmap::BinaryInputArchive ar_in(fname); - table_in.phmap_load(ar_in); -#else - ifstream is(fname, std::ofstream::in | std::ofstream::binary); - cereal::BinaryInputArchive archive_in(is); - size_t table_size; - - archive_in(table_size); - table_in.reserve(table_size); - archive_in(table_in); // deserialize from file out.cereal into table_in -#endif - }); - - - if (table == table_in) - printf("All checks out, table size: %zu\n\n", table_in.size()); - else - printf("FAILURE\n"); -} - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -void testSetSerialization(const char *settype, const char *fname) -{ - SetType table; - const int num_items = 100000000; - - printf("Building test %s\n", settype); - - // Iterate and add keys and values - // ------------------------------- - showtime("build time", [&]() { - unsigned int seed = 76687; - RSU rsu(seed, seed + 1); - - table.reserve(num_items); - for (int i=0; i < num_items; ++i) - table.insert(typename SetType::value_type(rsu.next())); - }); - - // cerealize and save data - // ----------------------- - showtime("serialize", [&]() { -#if !USE_CEREAL - phmap::BinaryOutputArchive ar_out(fname); - table.phmap_dump(ar_out); -#else - ofstream os(fname, std::ofstream::out | std::ofstream::trunc | std::ofstream::binary); - cereal::BinaryOutputArchive archive(os); - archive(table.size()); - archive(table); -#endif - }); - - SetType table_in; - - // deserialize - // ----------- - showtime("deserialize", [&]() { -#if !USE_CEREAL - phmap::BinaryInputArchive ar_in(fname); - table_in.phmap_load(ar_in); -#else - ifstream is(fname, std::ofstream::in | std::ofstream::binary); - cereal::BinaryInputArchive archive_in(is); - size_t table_size; - - archive_in(table_size); - table_in.reserve(table_size); - archive_in(table_in); // deserialize from file out.cereal into table_in -#endif - }); - - - if (table == table_in) - printf("All checks out, table size: %zu\n\n", table_in.size()); - else - printf("FAILURE\n"); -} - - - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -int main() -{ - testSetSerialization>("flat_hash_set", "dump1.bin"); -#if 0 - testSetSerialization>("parallel_flat_hash_set", "dump1.bin"); - - testMapSerialization>("flat_hash_map", "dump1.bin"); - testMapSerialization>("parallel_flat_hash_map", "dump1.bin"); -#endif - - return 0; -} diff --git a/extern/phmap/html/Makefile b/extern/phmap/html/Makefile deleted file mode 100644 index 6f1e09c..0000000 --- a/extern/phmap/html/Makefile +++ /dev/null @@ -1,48 +0,0 @@ -PANDOC = stack exec pandoc -- -MATHJAX = "http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" -FLAGS = --standalone --toc --toc-depth=2 --mathjax=$(MATHJAX) --highlight-style pygments -PNG_IMAGES = $(patsubst %.pdf,%.png,$(wildcard img/*.pdf)) -IFORMAT = -f gfm -FILTER = includes.exe -FILTER_OPT = --filter=${FILTER} # includes.hs - -############################### html -STYLE = css/style.css -TEMPLATE_HTML = template.html -HTML_OPT = -c ${STYLE} --template ${TEMPLATE_HTML} -t html -PGTITLE = --metadata pagetitle="The Parallel Hashmap" - -############################### pdf -TEMPLATE_TEX = template.latex -TEX_OPT = --template $(TEMPLATE_TEX) --pdf-engine=xelatex - -############################### epub -EPUB_COVER = --epub-cover-image=img/cover-kindle.jpg - - -SRC = parallel_hashmap.md - -OBJ = $(SRC:.md=.html) - -all: html - -includes.exe: includes.hs - stack exec ghc -- -o $@ -no-keep-hi-files -no-keep-o-files includes.hs - -html: parallel_hashmap.md $(FILTER) ${TEMPLATE_HTML} ${STYLE} - $(PANDOC) ${FILTER_OPT} ${IFORMAT} ${HTML_OPT} $(FLAGS) ${PGTITLE} -o ../index.html parallel_hashmap.md - -%.pdf: %.md $(FILTER) ${TEMPLATE_TEX} - $(PANDOC) ${FILTER_OPT} ${IFORMAT} ${TEX_OPT} $(FLAGS) -o $@ $< - -pdf: $(FILTER) ${TEMPLATE_TEX} - rm -f parallel_hashmap.pdf; $(PANDOC) ${FILTER_OPT} ${IFORMAT} ${TEX_OPT} $(FLAGS) -o parallel_hashmap.pdf title.md $(SRC) - -native: - $(PANDOC) -s -t native $(SRC) - -native_filt: $(FILTER) - $(PANDOC) ${FILTER_OPT} -s -t native $(SRC) - -clean: - -rm -f *.html *.pdf cppi.epub diff --git a/extern/phmap/html/bench_results/martinus_mod/InsertManyInt.html b/extern/phmap/html/bench_results/martinus_mod/InsertManyInt.html deleted file mode 100644 index 39059cb..0000000 --- a/extern/phmap/html/bench_results/martinus_mod/InsertManyInt.html +++ /dev/null @@ -1,69 +0,0 @@ - - - -
- - - diff --git a/extern/phmap/html/bench_results/martinus_mod/Lookup.html b/extern/phmap/html/bench_results/martinus_mod/Lookup.html deleted file mode 100644 index 21ea085..0000000 --- a/extern/phmap/html/bench_results/martinus_mod/Lookup.html +++ /dev/null @@ -1,84 +0,0 @@ - - - -
- - - diff --git a/extern/phmap/html/bench_results/martinus_mod/index2.html b/extern/phmap/html/bench_results/martinus_mod/index2.html deleted file mode 100644 index d679632..0000000 --- a/extern/phmap/html/bench_results/martinus_mod/index2.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - -

Benchmark Results

- -insert 100m values in map

- -Lookup 100m ints, all present | Lookup 100m ints, few present

- - - diff --git a/extern/phmap/html/css/bootstrap-responsive.min.css b/extern/phmap/html/css/bootstrap-responsive.min.css deleted file mode 100644 index ab59da3..0000000 --- a/extern/phmap/html/css/bootstrap-responsive.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap Responsive v2.1.0 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:auto;margin-left:0}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade.in{top:auto}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#555;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:block;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/extern/phmap/html/css/bootstrap.min.css b/extern/phmap/html/css/bootstrap.min.css deleted file mode 100644 index 4a4440c..0000000 --- a/extern/phmap/html/css/bootstrap.min.css +++ /dev/null @@ -1,10 +0,0 @@ -/*! - * Bootstrap v2.1.0 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - * Augmented by Eric Kryski @ekryski - */article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}a:hover,a:active{outline:0}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{height:auto;max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic}#map-canvas img{max-width:none}button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle}button,input{*overflow:visible;line-height:normal}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}textarea{overflow:auto;vertical-align:top}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333;background-color:#fff}a{color:#08c;text-decoration:none}a:hover{color:#005580;text-decoration:underline}.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);box-shadow:0 1px 3px rgba(0,0,0,0.1)}.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px}.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.span12{width:940px}.span11{width:860px}.span10{width:780px}.span9{width:700px}.span8{width:620px}.span7{width:540px}.span6{width:460px}.span5{width:380px}.span4{width:300px}.span3{width:220px}.span2{width:140px}.span1{width:60px}.offset12{margin-left:980px}.offset11{margin-left:900px}.offset10{margin-left:820px}.offset9{margin-left:740px}.offset8{margin-left:660px}.offset7{margin-left:580px}.offset6{margin-left:500px}.offset5{margin-left:420px}.offset4{margin-left:340px}.offset3{margin-left:260px}.offset2{margin-left:180px}.offset1{margin-left:100px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%}.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%}.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%}.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%}.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%}.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%}.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%}.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%}.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%}.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%}.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%}.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%}.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%}.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%}.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%}.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%}.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%}.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%}.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%}.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%}.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%}.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%}.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%}.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%}.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%}.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%}.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%}.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%}.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%}.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%}.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%}.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%}.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%}.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%}.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%}[class*="span"].hide,.row-fluid [class*="span"].hide{display:none}[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right}.container{margin-right:auto;margin-left:auto;*zoom:1}.container:before,.container:after{display:table;line-height:0;content:""}.container:after{clear:both}.container-fluid{padding-right:20px;padding-left:20px;*zoom:1}.container-fluid:before,.container-fluid:after{display:table;line-height:0;content:""}.container-fluid:after{clear:both}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:20px;font-weight:200;line-height:30px}small{font-size:85%}strong{font-weight:bold}em{font-style:italic}cite{font-style:normal}.muted{color:#999}h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:1;color:inherit;text-rendering:optimizelegibility}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999}h1{font-size:36px;line-height:40px}h2{font-size:30px;line-height:40px}h3{font-size:24px;line-height:40px}h4{font-size:18px;line-height:20px}h5{font-size:14px;line-height:20px}h6{font-size:12px;line-height:20px}h1 small{font-size:24px}h2 small{font-size:18px}h3 small{font-size:14px}h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eee}ul,ol{padding:0;margin:0 0 10px 25px}ul ul,ul ol,ol ol,ol ul{margin-bottom:0}li{line-height:20px}ul.unstyled,ol.unstyled{margin-left:0;list-style:none}dl{margin-bottom:20px}dt,dd{line-height:20px}dt{font-weight:bold}dd{margin-left:10px}.dl-horizontal dt{float:left;width:120px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:130px}hr{margin:20px 0;border:0;border-top:1px solid #eee;border-bottom:1px solid #fff}abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px}blockquote small{display:block;line-height:20px;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:20px}code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}form{margin:0 0 20px}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333;border:0;border-bottom:1px solid #e5e5e5}legend small{font-size:15px;color:#999}label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px}input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}label{display:block;margin-bottom:5px}select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:9px;font-size:14px;line-height:20px;color:#555;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}input,textarea{width:210px}textarea{height:auto}textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#fff;border:1px solid #ccc;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border linear .2s,box-shadow linear .2s;-moz-transition:border linear .2s,box-shadow linear .2s;-o-transition:border linear .2s,box-shadow linear .2s;transition:border linear .2s,box-shadow linear .2s}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82,168,236,0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(82,168,236,0.6)}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;*margin-top:0;line-height:normal;cursor:pointer}input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto}select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px}select{width:220px;background-color:#fff;border:1px solid #bbb}select[multiple],select[size]{height:auto}select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.uneditable-input,.uneditable-textarea{color:#999;cursor:not-allowed;background-color:#fcfcfc;border-color:#ccc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.025);box-shadow:inset 0 1px 2px rgba(0,0,0,0.025)}.uneditable-input{overflow:hidden;white-space:nowrap}.uneditable-textarea{width:auto;height:auto}input:-moz-placeholder,textarea:-moz-placeholder{color:#999}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999}.radio,.checkbox{min-height:18px;padding-left:18px}.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px}.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px}.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle}.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px}.input-mini{width:60px}.input-small{width:90px}.input-medium{width:150px}.input-large{width:210px}.input-xlarge{width:270px}.input-xxlarge{width:530px}input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0}.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:926px}input.span11,textarea.span11,.uneditable-input.span11{width:846px}input.span10,textarea.span10,.uneditable-input.span10{width:766px}input.span9,textarea.span9,.uneditable-input.span9{width:686px}input.span8,textarea.span8,.uneditable-input.span8{width:606px}input.span7,textarea.span7,.uneditable-input.span7{width:526px}input.span6,textarea.span6,.uneditable-input.span6{width:446px}input.span5,textarea.span5,.uneditable-input.span5{width:366px}input.span4,textarea.span4,.uneditable-input.span4{width:286px}input.span3,textarea.span3,.uneditable-input.span3{width:206px}input.span2,textarea.span2,.uneditable-input.span2{width:126px}input.span1,textarea.span1,.uneditable-input.span1{width:46px}.controls-row{*zoom:1}.controls-row:before,.controls-row:after{display:table;line-height:0;content:""}.controls-row:after{clear:both}.controls-row [class*="span"]{float:left}input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eee}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent}.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853}.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48}.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847}.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847}input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7}.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1}.form-actions:before,.form-actions:after{display:table;line-height:0;content:""}.form-actions:after{clear:both}.help-block,.help-inline{color:#595959}.help-block{display:block;margin-bottom:10px}.help-inline{display:inline-block;*display:inline;padding-left:5px;vertical-align:middle;*zoom:1}.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;font-size:14px;vertical-align:top;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2}.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #fff;background-color:#eee;border:1px solid #ccc}.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{margin-left:-1px;vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546}.input-prepend .add-on,.input-prepend .btn{margin-right:-1px}.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0}.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px}.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;margin-bottom:0;vertical-align:middle;*zoom:1}.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none}.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block}.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0}.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle}.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0}.control-group{margin-bottom:10px}legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate}.form-horizontal .control-group{margin-bottom:20px;*zoom:1}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;line-height:0;content:""}.form-horizontal .control-group:after{clear:both}.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right}.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0}.form-horizontal .controls:first-child{*padding-left:160px}.form-horizontal .help-block{margin-top:10px;margin-bottom:0}.form-horizontal .form-actions{padding-left:160px}table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0}.table{width:100%;margin-bottom:20px}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #ddd}.table th{font-weight:bold}.table thead th{vertical-align:bottom}.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table-condensed th,.table-condensed td{padding:4px 5px}.table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.table-bordered th,.table-bordered td{border-left:1px solid #ddd}.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0}.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px}.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px}.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px}.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px}.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-right-topleft:4px}.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9}.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5}table [class*=span],.row-fluid table [class*=span]{display:table-cell;float:none;margin-left:0}table .span1{float:none;width:44px;margin-left:0}table .span2{float:none;width:124px;margin-left:0}table .span3{float:none;width:204px;margin-left:0}table .span4{float:none;width:284px;margin-left:0}table .span5{float:none;width:364px;margin-left:0}table .span6{float:none;width:444px;margin-left:0}table .span7{float:none;width:524px;margin-left:0}table .span8{float:none;width:604px;margin-left:0}table .span9{float:none;width:684px;margin-left:0}table .span10{float:none;width:764px;margin-left:0}table .span11{float:none;width:844px;margin-left:0}table .span12{float:none;width:924px;margin-left:0}table .span13{float:none;width:1004px;margin-left:0}table .span14{float:none;width:1084px;margin-left:0}table .span15{float:none;width:1164px;margin-left:0}table .span16{float:none;width:1244px;margin-left:0}table .span17{float:none;width:1324px;margin-left:0}table .span18{float:none;width:1404px;margin-left:0}table .span19{float:none;width:1484px;margin-left:0}table .span20{float:none;width:1564px;margin-left:0}table .span21{float:none;width:1644px;margin-left:0}table .span22{float:none;width:1724px;margin-left:0}table .span23{float:none;width:1804px;margin-left:0}table .span24{float:none;width:1884px;margin-left:0}.table tbody tr.success td{background-color:#dff0d8}.table tbody tr.error td{background-color:#f2dede}.table tbody tr.info td{background-color:#d9edf7}[class^="icon-"],[class*=" icon-"]{display:inline-block;width:32px;height:32px;margin-top:1px;margin-right:.3em;line-height:32px;vertical-align:text-top;background-image:url("../img/glyphicons.png");background-position:32px 32px;background-repeat:no-repeat}.icon-white,.nav>.active>a>[class^="icon-"],.nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"]{background-image:url("../img/glyphicons-white.png")}.icon-glass{background-position:0 0}.icon-leaf{background-position:-56px 0}.icon-dog{background-position:-112px 0}.icon-user{background-position:-170px 0}.icon-girl{background-position:-225px 0}.icon-car{background-position:-279px 0}.icon-user-add{background-position:-337px 0}.icon-user-remove{background-position:-397px 0}.icon-film{background-position:-455px 0}.icon-magic{background-position:-509px 0}.icon-envelope{background-position:-565px 0}.icon-camera{background-position:-621px 0}.icon-heart{background-position:-679px 0}.icon-beach-umbrella{background-position:-735px 0}.icon-train{background-position:-792px 0}.icon-print{background-position:-844px 0}.icon-bin{background-position:-900px 0}.icon-music{background-position:-952px 0}.icon-note{background-position:-1005px 0}.icon-cogwheel{background-position:-1055px 0}.icon-home{background-position:-1111px 0}.icon-snowflake{background-position:-1170px 0}.icon-fire{background-position:-1230px 0}.icon-cogwheels{background-position:-1282px 0}.icon-parents{background-position:-1340px 0}.icon-binoculars{background-position:-1404px 0}.icon-road{background-position:-1460px 0}.icon-search{background-position:-1520px 0}.icon-cars{background-position:-1576px 0}.icon-notes-2{background-position:-1644px 0}.icon-pencil{background-position:-1696px 0}.icon-bus{background-position:-1753px 0}.icon-wifi-alt{background-position:-1817px 0}.icon-luggage{background-position:-1875px 0}.icon-old-man{background-position:-1927px 0}.icon-woman{background-position:0 -60px}.icon-file{background-position:-54px -60px}.icon-credit{background-position:-105px -60px}.icon-airplane{background-position:-163px -60px}.icon-notes{background-position:-219px -60px}.icon-stats{background-position:-271px -60px}.icon-charts{background-position:-329px -60px}.icon-pie-chart{background-position:-388px -60px}.icon-group{background-position:-446px -60px}.icon-keys{background-position:-513px -60px}.icon-calendar{background-position:-569px -60px}.icon-router{background-position:-624px -60px}.icon-camera-small{background-position:-683px -60px}.icon-dislikes{background-position:-737px -60px}.icon-star{background-position:-795px -60px}.icon-link{background-position:-852px -60px}.icon-eye-open{background-position:-905px -60px}.icon-eye-close{background-position:-968px -60px}.icon-alarm{background-position:-1031px -60px}.icon-clock{background-position:-1091px -60px}.icon-stopwatch{background-position:-1147px -60px}.icon-projector{background-position:-1202px -60px}.icon-history{background-position:-1262px -60px}.icon-truck{background-position:-1319px -60px}.icon-cargo{background-position:-1383px -60px}.icon-compass{background-position:-1440px -60px}.icon-keynote{background-position:-1496px -60px}.icon-attach{background-position:-1548px -60px}.icon-power{background-position:-1606px -60px}.icon-lightbulb{background-position:-1660px -60px}.icon-tag{background-position:-1712px -60px}.icon-tags{background-position:-1768px -60px}.icon-cleaning{background-position:-1830px -60px}.icon-ruler{background-position:-1886px -60px}.icon-gift{background-position:-1945px -60px}.icon-umbrella{background-position:0 -122px}.icon-book{background-position:-58px -122px}.icon-bookmark{background-position:-112px -122px}.icon-signal{background-position:-160px -122px}.icon-cup{background-position:-223px -122px}.icon-stroller{background-position:-277px -122px}.icon-headphones{background-position:-334px -122px}.icon-headset{background-position:-390px -122px}.icon-warning-sign{background-position:-446px -122px}.icon-signal{background-position:-507px -122px}.icon-retweet{background-position:-563px -122px}.icon-refresh{background-position:-625px -122px}.icon-roundabout{background-position:-682px -122px}.icon-random{background-position:-741px -122px}.icon-heat{background-position:-801px -122px}.icon-repeat{background-position:-862px -122px}.icon-display{background-position:-918px -122px}.icon-log-book{background-position:-978px -122px}.icon-adress-book{background-position:-1032px -122px}.icon-magnet{background-position:-1086px -122px}.icon-table{background-position:-1139px -122px}.icon-adjust{background-position:-1195px -122px}.icon-tint{background-position:-1253px -122px}.icon-crop{background-position:-1308px -122px}.icon-vector-path-square{background-position:-1366px -122px}.icon-vector-path-circle{background-position:-1422px -122px}.icon-vector-path-polygon{background-position:-1478px -122px}.icon-vector-path-line{background-position:-1536px -122px}.icon-vector-path-curve{background-position:-1592px -122px}.icon-vector-path-all{background-position:-1648px -122px}.icon-font{background-position:-1704px -122px}.icon-italic{background-position:-1763px -122px}.icon-bold{background-position:-1809px -122px}.icon-text-underline{background-position:-1860px -122px}.icon-text-strike{background-position:-1912px -122px}.icon-text-height{background-position:-1964px -122px}.icon-text-width{background-position:0 -184px}.icon-text-resize{background-position:-54px -184px}.icon-left-indent{background-position:-112px -184px}.icon-right-indent{background-position:-168px -184px}.icon-align-left{background-position:-224px -184px}.icon-align-center{background-position:-280px -184px}.icon-align-right{background-position:-336px -184px}.icon-justify{background-position:-392px -184px}.icon-list{background-position:-448px -184px}.icon-text-smaller{background-position:-504px -184px}.icon-text-bigger{background-position:-558px -184px}.icon-embed{background-position:-614px -184px}.icon-embed-close{background-position:-676px -184px}.icon-adjust{background-position:-738px -184px}.icon-message-full{background-position:-793px -184px}.icon-message-empty{background-position:-849px -184px}.icon-message-in{background-position:-905px -184px}.icon-message-out{background-position:-961px -184px}.icon-message-plus{background-position:-1017px -184px}.icon-message-minus{background-position:-1078px -184px}.icon-message-ban{background-position:-1139px -184px}.icon-message-flag{background-position:-1200px -184px}.icon-message-lock{background-position:-1259px -184px}.icon-message-new{background-position:-1319px -184px}.icon-inbox{background-position:-1379px -184px}.icon-inbox-plus{background-position:-1435px -184px}.icon-inbox-minus{background-position:-1494px -184px}.icon-inbox-lock{background-position:-1553px -184px}.icon-inbox-in{background-position:-1611px -184px}.icon-inbox-out{background-position:-1667px -184px}.icon-computer-locked{background-position:-1723px -184px}.icon-computer-service{background-position:-1783px -184px}.icon-computer-process{background-position:-1843px -184px}.icon-phone{background-position:-1903px -184px}.icon-database-lock{background-position:-1950px -184px}.icon-database-plus{background-position:0 -246px}.icon-database-minus{background-position:-59px -246px}.icon-database-ban{background-position:-118px -246px}.icon-folder-open{background-position:-176px -246px}.icon-folder-plus{background-position:-238px -246px}.icon-folder-minus{background-position:-299px -246px}.icon-folder-lock{background-position:-360px -246px}.icon-folder-flag{background-position:-420px -246px}.icon-folder-new{background-position:-479px -246px}.icon-check{background-position:-539px -246px}.icon-edit{background-position:-593px -246px}.icon-new-window{background-position:-649px -246px}.icon-more-windows{background-position:-707px -246px}.icon-show-big-thumbnails{background-position:-762px -246px}.icon-show-thumbnails{background-position:-816px -246px}.icon-show-thumbnails-with-lines{background-position:-870px -246px}.icon-show-lines{background-position:-926px -246px}.icon-playlist{background-position:-982px -246px}.icon-picture{background-position:-1043px -246px}.icon-imac{background-position:-1099px -246px}.icon-macbook{background-position:-1157px -246px}.icon-ipad{background-position:-1217px -246px}.icon-iphone{background-position:-1269px -246px}.icon-iphone-transfer{background-position:-1315px -246px}.icon-iphone-exchange{background-position:-1376px -246px}.icon-ipod{background-position:-1437px -246px}.icon-ipod-shuffle{background-position:-1483px -246px}.icon-ear-plugs{background-position:-1530px -246px}.icon-albums{background-position:-1582px -246px}.icon-step-backward{background-position:-1642px -246px}.icon-fast-backward{background-position:-1688px -246px}.icon-rewind{background-position:-1745px -246px}.icon-play{background-position:-1800px -246px}.icon-pause{background-position:-1848px -246px}.icon-stop{background-position:-1890px -246px}.icon-forward{background-position:-1936px -246px}.icon-fast-forward{background-position:0 -308px}.icon-step-forward{background-position:-57px -308px}.icon-eject{background-position:-103px -308px}.icon-facetime-video{background-position:-153px -308px}.icon-download-alt{background-position:-209px -308px}.icon-mute{background-position:-265px -308px}.icon-volume-down{background-position:-319px -308px}.icon-volume-up{background-position:-367px -308px}.icon-screenshot{background-position:-423px -308px}.icon-move{background-position:-482px -308px}.icon-more{background-position:-538px -308px}.icon-brightness-reduce{background-position:-592px -308px}.icon-brightness-increase{background-position:-644px -308px}.icon-circle-plus{background-position:-700px -308px}.icon-circle-minus{background-position:-758px -308px}.icon-circle-remove{background-position:-816px -308px}.icon-circle-ok{background-position:-874px -308px}.icon-circle-question-mark{background-position:-932px -308px}.icon-circle-info{background-position:-990px -308px}.icon-circle-exclamation-mark{background-position:-1048px -308px}.icon-remove{background-position:-1106px -308px}.icon-ok{background-position:-1164px -308px}.icon-ban{background-position:-1222px -308px}.icon-download{background-position:-1280px -308px}.icon-upload{background-position:-1338px -308px}.icon-shopping-cart{background-position:-1396px -308px}.icon-lock{background-position:-1454px -308px}.icon-unlock{background-position:-1507px -308px}.icon-electricity{background-position:-1560px -308px}.icon-ok-2{background-position:-1603px -308px}.icon-remove-2{background-position:-1660px -308px}.icon-cart-out{background-position:-1710px -308px}.icon-cart-in{background-position:-1768px -308px}.icon-left-arrow{background-position:-1826px -308px}.icon-right-arrow{background-position:-1878px -308px}.icon-down-arrow{background-position:-1930px -308px}.icon-up-arrow{background-position:0 -370px}.icon-resize-small{background-position:-50px -370px}.icon-resize-full{background-position:-106px -370px}.icon-circle-arrow-left{background-position:-162px -370px}.icon-circle-arrow-right{background-position:-220px -370px}.icon-circle-arrow-up{background-position:-278px -370px}.icon-circle-arrow-down{background-position:-336px -370px}.icon-play-button{background-position:-394px -370px}.icon-unshare{background-position:-452px -370px}.icon-share{background-position:-508px -370px}.icon-thin-arrow-right{background-position:-564px -370px}.icon-thin-arrow-left{background-position:-611px -370px}.icon-bluetooth{background-position:-658px -370px}.icon-euro{background-position:-704px -370px}.icon-usd{background-position:-758px -370px}.icon-bp{background-position:-807px -370px}.icon-retweet-2{background-position:-856px -370px}.icon-moon{background-position:-921px -370px}.icon-sun{background-position:-975px -370px}.icon-cloud{background-position:-1031px -370px}.icon-direction{background-position:-1090px -370px}.icon-brush{background-position:-1148px -370px}.icon-pen{background-position:-1205px -370px}.icon-zoom-in{background-position:-1261px -370px}.icon-zoom-out{background-position:-1318px -370px}.icon-pin{background-position:-1375px -370px}.icon-riflescope{background-position:-1417px -370px}.icon-rotation-lock{background-position:-1474px -370px}.icon-flash{background-position:-1533px -370px}.icon-google-maps{background-position:-1579px -370px}.icon-anchor{background-position:-1626px -370px}.icon-conversation{background-position:-1682px -370px}.icon-chat{background-position:-1739px -370px}.icon-male{background-position:-1795px -370px}.icon-female{background-position:-1849px -370px}.icon-asterisk{background-position:-1897px -370px}.icon-divide{background-position:-1949px -370px}.icon-snorkel-diving{background-position:0 -432px}.icon-scuba-diving{background-position:-59px -432px}.icon-oxygen-bottle{background-position:-118px -432px}.icon-fins{background-position:-172px -432px}.icon-fishes{background-position:-235px -432px}.icon-boat{background-position:-295px -432px}.icon-delete-point{background-position:-351px -432px}.icon-sheriffs-star{background-position:-409px -432px}.icon-qrcode{background-position:-465px -432px}.icon-barcode{background-position:-521px -432px}.icon-pool{background-position:-577px -432px}.icon-buoy{background-position:-633px -432px}.icon-spade{background-position:-689px -432px}.icon-bank{background-position:-745px -432px}.icon-vcard{background-position:-801px -432px}.icon-electrical-plug{background-position:-855px -432px}.icon-flag{background-position:-905px -432px}.icon-credit-card{background-position:-958px -432px}.icon-keyboard-wireless{background-position:-1016px -432px}.icon-keyboard-wired{background-position:-1075px -432px}.icon-shield{background-position:-1134px -432px}.icon-ring{background-position:-1188px -432px}.icon-cake{background-position:-1241px -432px}.icon-drink{background-position:-1295px -432px}.icon-beer{background-position:-1350px -432px}.icon-fast-food{background-position:-1405px -432px}.icon-cutlery{background-position:-1465px -432px}.icon-pizza{background-position:-1510px -432px}.icon-birthday-cake{background-position:-1568px -432px}.icon-tablet{background-position:-1626px -432px}.icon-settings{background-position:-1683px -432px}.icon-bullets{background-position:-1739px -432px}.icon-cardio{background-position:-1798px -432px}.icon-t-shirt{background-position:-1855px -432px}.icon-pants{background-position:-1915px -432px}.icon-sweater{background-position:-1966px -432px}.icon-fabric{background-position:0 -494px}.icon-leather{background-position:-59px -494px}.icon-scissors{background-position:-114px -494px}.icon-podium{background-position:-170px -494px}.icon-skull{background-position:-230px -494px}.icon-celebration{background-position:-284px -494px}.icon-tea-kettle{background-position:-340px -494px}.icon-french-press{background-position:-398px -494px}.icon-coffe-cup{background-position:-453px -494px}.icon-pot{background-position:-510px -494px}.icon-grater{background-position:-569px -494px}.icon-kettle{background-position:-619px -494px}.icon-hospital{background-position:-674px -494px}.icon-hospital-h{background-position:-730px -494px}.icon-microphone{background-position:-786px -494px}.icon-webcam{background-position:-835px -494px}.icon-temple-christianity-church{background-position:-886px -494px}.icon-temple-islam{background-position:-942px -494px}.icon-temple-hindu{background-position:-999px -494px}.icon-temple-buddhist{background-position:-1055px -494px}.icon-electrical-socket-eu{background-position:-1115px -494px}.icon-electrical-socket-us{background-position:-1170px -494px}.icon-bomb{background-position:-1225px -494px}.icon-comments{background-position:-1284px -494px}.icon-flower{background-position:-1340px -494px}.icon-baseball{background-position:-1391px -494px}.icon-rugby{background-position:-1448px -494px}.icon-ax{background-position:-1503px -494px}.icon-table-tennis{background-position:-1562px -494px}.icon-bowling{background-position:-1618px -494px}.icon-tree-conifer{background-position:-1674px -494px}.icon-tree-deciduous{background-position:-1727px -494px}.icon-more-items{background-position:-1779px -494px}.icon-sort{background-position:-1832px -494px}.icon-filter{background-position:-1889px -494px}.icon-gamepad{background-position:-1941px -494px}.icon-playing-dices{background-position:0 -556px}.icon-calculator{background-position:-59px -556px}.icon-tie{background-position:-112px -556px}.icon-wallet{background-position:-155px -556px}.icon-share{background-position:-212px -556px}.icon-sampler{background-position:-266px -556px}.icon-piano{background-position:-325px -556px}.icon-web-browser{background-position:-380px -556px}.icon-blog{background-position:-436px -556px}.icon-dashboard{background-position:-489px -556px}.icon-certificate{background-position:-545px -556px}.icon-bell{background-position:-594px -556px}.icon-candle{background-position:-650px -556px}.icon-pin-classic{background-position:-702px -556px}.icon-iphone-shake{background-position:-758px -556px}.icon-pin-flag{background-position:-814px -556px}.icon-turtle{background-position:-876px -556px}.icon-rabbit{background-position:-936px -556px}.icon-globe{background-position:-994px -556px}.icon-briefcase{background-position:-1050px -556px}.icon-hdd{background-position:-1106px -556px}.icon-thumbs-up{background-position:-1162px -556px}.icon-thumbs-down{background-position:-1218px -556px}.icon-hand-right{background-position:-1274px -556px}.icon-hand-left{background-position:-1332px -556px}.icon-hand-up{background-position:-1390px -556px}.icon-hand-down{background-position:-1441px -556px}.icon-fullscreen{background-position:-1492px -556px}.icon-shopping-bag{background-position:-1548px -556px}.icon-book-open{background-position:-1603px -556px}.icon-nameplate{background-position:-1660px -556px}.icon-nameplate-alt{background-position:-1716px -556px}.icon-vases{background-position:-1772px -556px}.icon-announcement{background-position:-1828px -556px}.icon-dumbbell{background-position:-1885px -556px}.icon-suitcase{background-position:-1943px -556px}.icon-file-import{background-position:0 -618px}.icon-file-export{background-position:-54px -618px}.icon-pinterest{background-position:-109px -618px}.icon-dropbox{background-position:-165px -618px}.icon-google-alt{background-position:-221px -618px}.icon-jolicloud{background-position:-277px -618px}.icon-yahoo{background-position:-333px -618px}.icon-blogger{background-position:-389px -618px}.icon-picasa{background-position:-445px -618px}.icon-amazon{background-position:-501px -618px}.icon-tumblr{background-position:-557px -618px}.icon-wordpress{background-position:-613px -618px}.icon-instapaper{background-position:-669px -618px}.icon-evernote{background-position:-725px -618px}.icon-xing{background-position:-781px -618px}.icon-zootool{background-position:-837px -618px}.icon-dribbble{background-position:-893px -618px}.icon-deviantart{background-position:-949px -618px}.icon-read-it-later{background-position:-1005px -618px}.icon-linked-in{background-position:-1061px -618px}.icon-forrst{background-position:-1117px -618px}.icon-pinboard{background-position:-1173px -618px}.icon-behance{background-position:-1229px -618px}.icon-github{background-position:-1285px -618px}.icon-youtube{background-position:-1341px -618px}.icon-skitch{background-position:-1397px -618px}.icon-4square{background-position:-1453px -618px}.icon-quora{background-position:-1509px -618px}.icon-google-plus{background-position:-1565px -618px}.icon-spotify{background-position:-1621px -618px}.icon-stumbleupon{background-position:-1677px -618px}.icon-readability{background-position:-1733px -618px}.icon-facebook{background-position:-1789px -618px}.icon-twitter-t{background-position:-1845px -618px}.icon-twitter{background-position:-1901px -618px}.icon-buzz{background-position:-1957px -618px}.icon-vimeo{background-position:0 -680px}.icon-flickr{background-position:-56px -680px}.icon-last-fm{background-position:-112px -680px}.icon-rss{background-position:-168px -680px}.icon-skype{background-position:-224px -680px}.icon-e-mail{background-position:-280px -680px}.dropup,.dropdown{position:relative}.dropdown-toggle{*margin-bottom:-3px}.dropdown-toggle:active,.open .dropdown-toggle{outline:0}.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.dropdown .caret{margin-top:8px;margin-left:2px}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.dropdown-menu a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap}.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-image:linear-gradient(to bottom,#08c,#0077b3);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff;text-decoration:none;background-color:#08c;background-color:#0081c2;background-image:linear-gradient(to bottom,#08c,#0077b3);background-image:-moz-linear-gradient(top,#08c,#0077b3);background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#0077b3));background-image:-webkit-linear-gradient(top,#08c,#0077b3);background-image:-o-linear-gradient(top,#08c,#0077b3);background-repeat:repeat-x;outline:0;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0077b3',GradientType=0)}.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999}.dropdown-menu .disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.open{*z-index:1000}.open>.dropdown-menu{display:block}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000;content:"\2191"}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px}.dropdown-submenu:hover .dropdown-menu{display:block}.dropdown-submenu>a:after{display:block;float:right;width:0;height:0;margin-top:5px;margin-right:-10px;border-color:transparent;border-left-color:#ccc;border-style:solid;border-width:5px 0 5px 5px;content:" "}.dropdown-submenu:hover>a:after{border-left-color:#fff}.dropdown .dropdown-menu .nav-header{padding-right:20px;padding-left:20px}.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.fade{opacity:0;-webkit-transition:opacity .15s linear;-moz-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{position:relative;height:0;overflow:hidden;overflow:visible \9;-webkit-transition:height .35s ease;-moz-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.collapse.in{height:auto}.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.4;filter:alpha(opacity=40)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.btn{display:inline-block;*display:inline;padding:4px 14px;margin-bottom:0;*margin-left:.3em;font-size:14px;line-height:20px;*line-height:20px;color:#333;text-align:center;text-shadow:0 1px 1px rgba(255,255,255,0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;*background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,#e6e6e6);background-image:-o-linear-gradient(top,#fff,#e6e6e6);background-image:linear-gradient(to bottom,#fff,#e6e6e6);background-image:-moz-linear-gradient(top,#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #bbb;*border:0;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-bottom-color:#a2a2a2;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);*zoom:1;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333;background-color:#e6e6e6;*background-color:#d9d9d9}.btn:active,.btn.active{background-color:#ccc \9}.btn:first-child{*margin-left:0}.btn:hover{color:#333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position .1s linear;-moz-transition:background-position .1s linear;-o-transition:background-position .1s linear;transition:background-position .1s linear}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-large{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.btn-large [class^="icon-"]{margin-top:2px}.btn-small{padding:3px 9px;font-size:12px;line-height:18px}.btn-small [class^="icon-"]{margin-top:0}.btn-mini{padding:2px 6px;font-size:11px;line-height:16px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.btn-block+.btn-block{margin-top:5px}.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255,255,255,0.75)}.btn{border-color:#c5c5c5;border-color:rgba(0,0,0,0.15) rgba(0,0,0,0.15) rgba(0,0,0,0.25)}.btn-primary{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#006dcc;*background-color:#04c;background-image:-webkit-gradient(linear,0 0,0 100%,from(#08c),to(#04c));background-image:-webkit-linear-gradient(top,#08c,#04c);background-image:-o-linear-gradient(top,#08c,#04c);background-image:linear-gradient(to bottom,#08c,#04c);background-image:-moz-linear-gradient(top,#08c,#04c);background-repeat:repeat-x;border-color:#04c #04c #002a80;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc',endColorstr='#ff0044cc',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#fff;background-color:#04c;*background-color:#003bb3}.btn-primary:active,.btn-primary.active{background-color:#039 \9}.btn-warning{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#faa732;*background-color:#f89406;background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-repeat:repeat-x;border-color:#f89406 #f89406 #ad6704;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#fff;background-color:#f89406;*background-color:#df8505}.btn-warning:active,.btn-warning.active{background-color:#c67605 \9}.btn-danger{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#da4f49;*background-color:#bd362f;background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#bd362f));background-image:-webkit-linear-gradient(top,#ee5f5b,#bd362f);background-image:-o-linear-gradient(top,#ee5f5b,#bd362f);background-image:linear-gradient(to bottom,#ee5f5b,#bd362f);background-image:-moz-linear-gradient(top,#ee5f5b,#bd362f);background-repeat:repeat-x;border-color:#bd362f #bd362f #802420;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffbd362f',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#fff;background-color:#bd362f;*background-color:#a9302a}.btn-danger:active,.btn-danger.active{background-color:#942a25 \9}.btn-success{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#5bb75b;*background-color:#51a351;background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#51a351));background-image:-webkit-linear-gradient(top,#62c462,#51a351);background-image:-o-linear-gradient(top,#62c462,#51a351);background-image:linear-gradient(to bottom,#62c462,#51a351);background-image:-moz-linear-gradient(top,#62c462,#51a351);background-repeat:repeat-x;border-color:#51a351 #51a351 #387038;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff51a351',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#fff;background-color:#51a351;*background-color:#499249}.btn-success:active,.btn-success.active{background-color:#408140 \9}.btn-info{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#49afcd;*background-color:#2f96b4;background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#2f96b4));background-image:-webkit-linear-gradient(top,#5bc0de,#2f96b4);background-image:-o-linear-gradient(top,#5bc0de,#2f96b4);background-image:linear-gradient(to bottom,#5bc0de,#2f96b4);background-image:-moz-linear-gradient(top,#5bc0de,#2f96b4);background-repeat:repeat-x;border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff2f96b4',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#fff;background-color:#2f96b4;*background-color:#2a85a0}.btn-info:active,.btn-info.active{background-color:#24748c \9}.btn-inverse{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#363636;*background-color:#222;background-image:-webkit-gradient(linear,0 0,0 100%,from(#444),to(#222));background-image:-webkit-linear-gradient(top,#444,#222);background-image:-o-linear-gradient(top,#444,#222);background-image:linear-gradient(to bottom,#444,#222);background-image:-moz-linear-gradient(top,#444,#222);background-repeat:repeat-x;border-color:#222 #222 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444',endColorstr='#ff222222',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#fff;background-color:#222;*background-color:#151515}.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9}button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0}button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px}button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px}button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px}.btn-link,.btn-link:active{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.btn-link{color:#08c;cursor:pointer;border-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent}.btn-group{position:relative;*margin-left:.3em;font-size:0;white-space:nowrap}.btn-group:first-child{*margin-left:0}.btn-group+.btn-group{margin-left:5px}.btn-toolbar{margin-top:10px;margin-bottom:10px;font-size:0}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px}.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group>.btn+.btn{margin-left:-1px}.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px}.btn-group>.btn-mini{font-size:11px}.btn-group>.btn-small{font-size:12px}.btn-group>.btn-large{font-size:16px}.btn-group>.btn:first-child{margin-left:0;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-bottomleft:4px;-moz-border-radius-topleft:4px}.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px}.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-bottom-left-radius:6px;border-bottom-left-radius:6px;-webkit-border-top-left-radius:6px;border-top-left-radius:6px;-moz-border-radius-bottomleft:6px;-moz-border-radius-topleft:6px}.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;border-bottom-right-radius:6px;-moz-border-radius-topright:6px;-moz-border-radius-bottomright:6px}.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{*padding-top:5px;padding-right:8px;*padding-bottom:5px;padding-left:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 1px 0 0 rgba(255,255,255,0.125),inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05)}.btn-group>.btn-mini+.dropdown-toggle{*padding-top:2px;padding-right:5px;*padding-bottom:2px;padding-left:5px}.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px}.btn-group>.btn-large+.dropdown-toggle{*padding-top:7px;padding-right:12px;*padding-bottom:7px;padding-left:12px}.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 2px 4px rgba(0,0,0,0.15),0 1px 2px rgba(0,0,0,0.05)}.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6}.btn-group.open .btn-primary.dropdown-toggle{background-color:#04c}.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406}.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f}.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351}.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4}.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222}.btn .caret{margin-top:8px;margin-left:0}.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px}.btn-large .caret{border-top-width:5px;border-right-width:5px;border-left-width:5px}.dropup .btn-large .caret{border-top:0;border-bottom:5px solid #000}.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#fff;border-bottom-color:#fff}.btn-group-vertical{display:inline-block;*display:inline;*zoom:1}.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.btn-group-vertical .btn+.btn{margin-top:-1px;margin-left:0}.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0}.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.alert{padding:8px 35px 8px 14px;margin-bottom:20px;color:#c09853;text-shadow:0 1px 0 rgba(255,255,255,0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.alert h4{margin:0}.alert .close{position:relative;top:-2px;right:-21px;line-height:20px}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-danger,.alert-error{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-block{padding-top:14px;padding-bottom:14px}.alert-block>p,.alert-block>ul{margin-bottom:0}.alert-block p+p{margin-top:5px}.nav{margin-bottom:20px;margin-left:0;list-style:none}.nav>li>a{display:block}.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>.pull-right{float:right}.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999;text-shadow:0 1px 0 rgba(255,255,255,0.5);text-transform:uppercase}.nav li+.nav-header{margin-top:9px}.nav-list{padding-right:15px;padding-left:15px;margin-bottom:0}.nav-list>li>a,.nav-list .nav-header{margin-right:-15px;margin-left:-15px;text-shadow:0 1px 0 rgba(255,255,255,0.5)}.nav-list>li>a{padding:3px 15px}.nav-list>.active>a,.nav-list>.active>a:hover{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.2);background-color:#08c}.nav-list [class^="icon-"]{margin-right:2px}.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #fff}.nav-tabs,.nav-pills{*zoom:1}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;line-height:0;content:""}.nav-tabs:after,.nav-pills:after{clear:both}.nav-tabs>li,.nav-pills>li{float:left}.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{margin-bottom:-1px}.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#fff;background-color:#08c}.nav-stacked>li{float:none}.nav-stacked>li>a{margin-right:0}.nav-tabs.nav-stacked{border-bottom:0}.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-topleft:4px}.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomright:4px;-moz-border-radius-bottomleft:4px}.nav-tabs.nav-stacked>li>a:hover{z-index:2;border-color:#ddd}.nav-pills.nav-stacked>li>a{margin-bottom:3px}.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px}.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.nav .dropdown-toggle .caret{margin-top:6px;border-top-color:#08c;border-bottom-color:#08c}.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580}.nav-tabs .dropdown-toggle .caret{margin-top:8px}.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.nav>.dropdown.active>a:hover{cursor:pointer}.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#fff;background-color:#999;border-color:#999}.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#fff;border-bottom-color:#fff;opacity:1;filter:alpha(opacity=100)}.tabs-stacked .open>a:hover{border-color:#999}.tabbable{*zoom:1}.tabbable:before,.tabbable:after{display:table;line-height:0;content:""}.tabbable:after{clear:both}.tab-content{overflow:auto}.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.tabs-below>.nav-tabs{border-top:1px solid #ddd}.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0}.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px}.tabs-below>.nav-tabs>li>a:hover{border-top-color:#ddd;border-bottom-color:transparent}.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd}.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none}.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px}.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd}.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.tabs-left>.nav-tabs>li>a:hover{border-color:#eee #ddd #eee #eee}.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#fff}.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd}.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0}.tabs-right>.nav-tabs>li>a:hover{border-color:#eee #eee #eee #ddd}.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#fff}.nav>.disabled>a{color:#999}.nav>.disabled>a:hover{text-decoration:none;cursor:default;background-color:transparent}.navbar{*position:relative;*z-index:2;margin-bottom:20px;overflow:visible;color:#555}.navbar-inner{min-height:40px;padding-right:20px;padding-left:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top,#fff,#f2f2f2);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fff),to(#f2f2f2));background-image:-webkit-linear-gradient(top,#fff,#f2f2f2);background-image:-o-linear-gradient(top,#fff,#f2f2f2);background-image:linear-gradient(to bottom,#fff,#f2f2f2);background-repeat:repeat-x;border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff2f2f2',GradientType=0);-webkit-box-shadow:0 1px 4px rgba(0,0,0,0.065);-moz-box-shadow:0 1px 4px rgba(0,0,0,0.065);box-shadow:0 1px 4px rgba(0,0,0,0.065)}.navbar .container{width:auto}.nav-collapse.collapse{height:auto}.navbar .brand{display:block;float:left;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#555;text-shadow:0 1px 0 #fff}.navbar .brand:hover{text-decoration:none}.navbar-text{margin-bottom:0;line-height:40px}.navbar-link{color:#555}.navbar-link:hover{color:#333}.navbar .divider-vertical{height:40px;margin:0 9px;border-right:1px solid #fff;border-left:1px solid #f2f2f2}.navbar .btn,.navbar .btn-group{margin-top:6px}.navbar .btn-group .btn{margin:0}.navbar-form{margin-bottom:0;*zoom:1}.navbar-form:before,.navbar-form:after{display:table;line-height:0;content:""}.navbar-form:after{clear:both}.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px}.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0}.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px}.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0}.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0}.navbar-search .search-query{padding:4px 14px;margin-bottom:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.navbar-static-top{position:static;width:100%;margin-bottom:0}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner,.navbar-static-top .navbar-inner{border:0}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-right:0;padding-left:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px}.navbar-fixed-top{top:0}.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.1),0 1px 10px rgba(0,0,0,0.1)}.navbar-fixed-bottom{bottom:0}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1);box-shadow:inset 0 1px 0 rgba(0,0,0,0.1),0 -1px 10px rgba(0,0,0,0.1)}.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0}.navbar .nav.pull-right{float:right}.navbar .nav>li{float:left}.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#555;text-decoration:none;text-shadow:0 1px 0 #fff}.navbar .nav .dropdown-toggle .caret{margin-top:8px}.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{color:#333;text-decoration:none;background-color:transparent}.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);-moz-box-shadow:inset 0 3px 8px rgba(0,0,0,0.125);box-shadow:inset 0 3px 8px rgba(0,0,0,0.125)}.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-right:5px;margin-left:5px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#ededed;*background-color:#e5e5e5;background-image:-webkit-gradient(linear,0 0,0 100%,from(#f2f2f2),to(#e5e5e5));background-image:-webkit-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:-o-linear-gradient(top,#f2f2f2,#e5e5e5);background-image:linear-gradient(to bottom,#f2f2f2,#e5e5e5);background-image:-moz-linear-gradient(top,#f2f2f2,#e5e5e5);background-repeat:repeat-x;border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2',endColorstr='#ffe5e5e5',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.075)}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#fff;background-color:#e5e5e5;*background-color:#d9d9d9}.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#ccc \9}.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,0.25);-moz-box-shadow:0 1px 0 rgba(0,0,0,0.25);box-shadow:0 1px 0 rgba(0,0,0,0.25)}.btn-navbar .icon-bar+.icon-bar{margin-top:3px}.navbar .nav>li>.dropdown-menu:before{position:absolute;top:-7px;left:9px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.navbar .nav>li>.dropdown-menu:after{position:absolute;top:-6px;left:10px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.navbar-fixed-bottom .nav>li>.dropdown-menu:before{top:auto;bottom:-7px;border-top:7px solid #ccc;border-bottom:0;border-top-color:rgba(0,0,0,0.2)}.navbar-fixed-bottom .nav>li>.dropdown-menu:after{top:auto;bottom:-6px;border-top:6px solid #fff;border-bottom:0}.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{color:#555;background-color:#e5e5e5}.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555;border-bottom-color:#555}.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{right:12px;left:auto}.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{right:13px;left:auto}.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{right:100%;left:auto;margin-right:-1px;margin-left:0;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px}.navbar-inverse{color:#999}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top,#222,#111);background-image:-webkit-gradient(linear,0 0,0 100%,from(#222),to(#111));background-image:-webkit-linear-gradient(top,#222,#111);background-image:-o-linear-gradient(top,#222,#111);background-image:linear-gradient(to bottom,#222,#111);background-repeat:repeat-x;border-color:#252525;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222',endColorstr='#ff111111',GradientType=0)}.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#fff}.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#fff;background-color:#111}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .divider-vertical{border-right-color:#222;border-left-color:#111}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{color:#fff;background-color:#111}.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-search .search-query{color:#fff;background-color:#515151;border-color:#111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1),0 1px 0 rgba(255,255,255,0.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#ccc}.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333;text-shadow:0 1px 0 #fff;background-color:#fff;border:0;outline:0;-webkit-box-shadow:0 0 3px rgba(0,0,0,0.15);-moz-box-shadow:0 0 3px rgba(0,0,0,0.15);box-shadow:0 0 3px rgba(0,0,0,0.15)}.navbar-inverse .btn-navbar{color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e0e0e;*background-color:#040404;background-image:-webkit-gradient(linear,0 0,0 100%,from(#151515),to(#040404));background-image:-webkit-linear-gradient(top,#151515,#040404);background-image:-o-linear-gradient(top,#151515,#040404);background-image:linear-gradient(to bottom,#151515,#040404);background-image:-moz-linear-gradient(top,#151515,#040404);background-repeat:repeat-x;border-color:#040404 #040404 #000;border-color:rgba(0,0,0,0.1) rgba(0,0,0,0.1) rgba(0,0,0,0.25);filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515',endColorstr='#ff040404',GradientType=0);filter:progid:dximagetransform.microsoft.gradient(enabled=false)}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#fff;background-color:#040404;*background-color:#000}.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000 \9}.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.breadcrumb li{display:inline-block;*display:inline;text-shadow:0 1px 0 #fff;*zoom:1}.breadcrumb .divider{padding:0 5px;color:#ccc}.breadcrumb .active{color:#999}.pagination{height:40px;margin:20px 0}.pagination ul{display:inline-block;*display:inline;margin-bottom:0;margin-left:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;*zoom:1;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.pagination li{display:inline}.pagination a,.pagination span{float:left;padding:0 14px;line-height:38px;text-decoration:none;background-color:#fff;border:1px solid #ddd;border-left-width:0}.pagination a:hover,.pagination .active a,.pagination .active span{background-color:#f5f5f5}.pagination .active a,.pagination .active span{color:#999;cursor:default}.pagination .disabled span,.pagination .disabled a,.pagination .disabled a:hover{color:#999;cursor:default;background-color:transparent}.pagination li:first-child a,.pagination li:first-child span{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px}.pagination li:last-child a,.pagination li:last-child span{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.pagination-centered{text-align:center}.pagination-right{text-align:right}.pager{margin:20px 0;text-align:center;list-style:none;*zoom:1}.pager:before,.pager:after{display:table;line-height:0;content:""}.pager:after{clear:both}.pager li{display:inline}.pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px}.pager a:hover{text-decoration:none;background-color:#f5f5f5}.pager .next a{float:right}.pager .previous a{float:left}.pager .disabled a,.pager .disabled a:hover{color:#999;cursor:default;background-color:#fff}.modal-open .dropdown-menu{z-index:2050}.modal-open .dropdown.open{*z-index:2050}.modal-open .popover{z-index:2060}.modal-open .tooltip{z-index:2080}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop,.modal-backdrop.fade.in{opacity:.8;filter:alpha(opacity=80)}.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;overflow:auto;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0,0,0,0.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,0.3);box-shadow:0 3px 7px rgba(0,0,0,0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box}.modal.fade{top:-25%;-webkit-transition:opacity .3s linear,top .3s ease-out;-moz-transition:opacity .3s linear,top .3s ease-out;-o-transition:opacity .3s linear,top .3s ease-out;transition:opacity .3s linear,top .3s ease-out}.modal.fade.in{top:50%}.modal-header{padding:9px 15px;border-bottom:1px solid #eee}.modal-header .close{margin-top:2px}.modal-header h3{margin:0;line-height:30px}.modal-body{max-height:400px;padding:15px;overflow-y:auto}.modal-form{margin-bottom:0}.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;*zoom:1;-webkit-box-shadow:inset 0 1px 0 #fff;-moz-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.modal-footer:before,.modal-footer:after{display:table;line-height:0;content:""}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.tooltip{position:absolute;z-index:1030;display:block;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.8;filter:alpha(opacity=80)}.tooltip.top{margin-top:-3px}.tooltip.right{margin-left:3px}.tooltip.bottom{margin-top:3px}.tooltip.left{margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);-moz-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box}.popover.top{margin-bottom:10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-right:10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0}.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow:after{z-index:-1;content:""}.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-top-color:#fff;border-width:10px 10px 0}.popover.top .arrow:after{bottom:-1px;left:-11px;border-top-color:rgba(0,0,0,0.25);border-width:11px 11px 0}.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-right-color:#fff;border-width:10px 10px 10px 0}.popover.right .arrow:after{bottom:-11px;left:-1px;border-right-color:rgba(0,0,0,0.25);border-width:11px 11px 11px 0}.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-bottom-color:#fff;border-width:0 10px 10px}.popover.bottom .arrow:after{top:-1px;left:-11px;border-bottom-color:rgba(0,0,0,0.25);border-width:0 11px 11px}.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-left-color:#fff;border-width:10px 0 10px 10px}.popover.left .arrow:after{right:-1px;bottom:-11px;border-left-color:rgba(0,0,0,0.25);border-width:11px 0 11px 11px}.thumbnails{margin-left:-20px;list-style:none;*zoom:1}.thumbnails:before,.thumbnails:after{display:table;line-height:0;content:""}.thumbnails:after{clear:both}.row-fluid .thumbnails{margin-left:0}.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px}.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.055);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.055);box-shadow:0 1px 3px rgba(0,0,0,0.055);-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}a.thumbnail:hover{border-color:#08c;-webkit-box-shadow:0 1px 4px rgba(0,105,214,0.25);-moz-box-shadow:0 1px 4px rgba(0,105,214,0.25);box-shadow:0 1px 4px rgba(0,105,214,0.25)}.thumbnail>img{display:block;max-width:100%;margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#555}.label,.badge{font-size:11.844px;font-weight:bold;line-height:14px;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25);white-space:nowrap;vertical-align:baseline;background-color:#999}.label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px}a.label:hover,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.label-important,.badge-important{background-color:#b94a48}.label-important[href],.badge-important[href]{background-color:#953b39}.label-warning,.badge-warning{background-color:#f89406}.label-warning[href],.badge-warning[href]{background-color:#c67605}.label-success,.badge-success{background-color:#468847}.label-success[href],.badge-success[href]{background-color:#356635}.label-info,.badge-info{background-color:#3a87ad}.label-info[href],.badge-info[href]{background-color:#2d6987}.label-inverse,.badge-inverse{background-color:#333}.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a}.btn .label,.btn .badge{position:relative;top:-1px}.btn-mini .label,.btn-mini .badge{top:0}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f7f7f7;background-image:-moz-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f9f9f9));background-image:-webkit-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:-o-linear-gradient(top,#f5f5f5,#f9f9f9);background-image:linear-gradient(to bottom,#f5f5f5,#f9f9f9);background-repeat:repeat-x;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#fff9f9f9',GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress .bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;text-shadow:0 -1px 0 rgba(0,0,0,0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top,#149bdf,#0480be);background-image:-webkit-gradient(linear,0 0,0 100%,from(#149bdf),to(#0480be));background-image:-webkit-linear-gradient(top,#149bdf,#0480be);background-image:-o-linear-gradient(top,#149bdf,#0480be);background-image:linear-gradient(to bottom,#149bdf,#0480be);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf',endColorstr='#ff0480be',GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width .6s ease;-moz-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 1px 0 0 rgba(0,0,0,0.15),inset 0 -1px 0 rgba(0,0,0,0.15)}.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px}.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top,#ee5f5b,#c43c35);background-image:-webkit-gradient(linear,0 0,0 100%,from(#ee5f5b),to(#c43c35));background-image:-webkit-linear-gradient(top,#ee5f5b,#c43c35);background-image:-o-linear-gradient(top,#ee5f5b,#c43c35);background-image:linear-gradient(to bottom,#ee5f5b,#c43c35);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b',endColorstr='#ffc43c35',GradientType=0)}.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top,#62c462,#57a957);background-image:-webkit-gradient(linear,0 0,0 100%,from(#62c462),to(#57a957));background-image:-webkit-linear-gradient(top,#62c462,#57a957);background-image:-o-linear-gradient(top,#62c462,#57a957);background-image:linear-gradient(to bottom,#62c462,#57a957);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462',endColorstr='#ff57a957',GradientType=0)}.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top,#5bc0de,#339bb9);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5bc0de),to(#339bb9));background-image:-webkit-linear-gradient(top,#5bc0de,#339bb9);background-image:-o-linear-gradient(top,#5bc0de,#339bb9);background-image:linear-gradient(to bottom,#5bc0de,#339bb9);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff339bb9',GradientType=0)}.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top,#fbb450,#f89406);background-image:-webkit-gradient(linear,0 0,0 100%,from(#fbb450),to(#f89406));background-image:-webkit-linear-gradient(top,#fbb450,#f89406);background-image:-o-linear-gradient(top,#fbb450,#f89406);background-image:linear-gradient(to bottom,#fbb450,#f89406);background-repeat:repeat-x;filter:progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450',endColorstr='#fff89406',GradientType=0)}.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.accordion{margin-bottom:20px}.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.accordion-heading{border-bottom:0}.accordion-heading .accordion-toggle{display:block;padding:8px 15px}.accordion-toggle{cursor:pointer}.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5}.carousel{position:relative;margin-bottom:20px;line-height:1}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel .item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-moz-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel .item>img{display:block;line-height:1}.carousel .active,.carousel .next,.carousel .prev{display:block}.carousel .active{left:0}.carousel .next,.carousel .prev{position:absolute;top:0;width:100%}.carousel .next{left:100%}.carousel .prev{left:-100%}.carousel .next.left,.carousel .prev.right{left:0}.carousel .active.left{left:-100%}.carousel .active.right{left:100%}.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#fff;text-align:center;background:#222;border:3px solid #fff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:.5;filter:alpha(opacity=50)}.carousel-control.right{right:15px;left:auto}.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-caption{position:absolute;right:0;bottom:0;left:0;padding:15px;background:#333;background:rgba(0,0,0,0.75)}.carousel-caption h4,.carousel-caption p{line-height:20px;color:#fff}.carousel-caption h4{margin:0 0 5px}.carousel-caption p{margin-bottom:0}.hero-unit{padding:60px;margin-bottom:30px;background-color:#eee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;color:inherit}.hero-unit p{font-size:18px;font-weight:200;line-height:30px;color:inherit}.pull-right{float:right}.pull-left{float:left}.hide{display:none}.show{display:block}.invisible{visibility:hidden}.affix{position:fixed} \ No newline at end of file diff --git a/extern/phmap/html/css/colors.css b/extern/phmap/html/css/colors.css deleted file mode 100644 index 8774c02..0000000 --- a/extern/phmap/html/css/colors.css +++ /dev/null @@ -1,302 +0,0 @@ -/*** - - colors.css v2.0.0 - http://clrs.cc - @mrmrs - MIT License - -***/ -/* - - SKINS - - Backgrounds - - Colors - - Border colors - - SVG fills - - SVG Strokes - -*/ -/* Backgrounds */ -.bg-navy { - background-color: #001F3F; } - -.bg-blue { - background-color: #0074D9; } - -.bg-aqua { - background-color: #7FDBFF; } - -.bg-teal { - background-color: #39CCCC; } - -.bg-olive { - background-color: #3D9970; } - -.bg-green { - background-color: #2ECC40; } - -.bg-lime { - background-color: #01FF70; } - -.bg-yellow { - background-color: #FFDC00; } - -.bg-orange { - background-color: #FF851B; } - -.bg-red { - background-color: #FF4136; } - -.bg-fuchsia { - background-color: #F012BE; } - -.bg-purple { - background-color: #B10DC9; } - -.bg-maroon { - background-color: #85144B; } - -.bg-white { - background-color: #fff; } - -.bg-gray { - background-color: #aaa; } - -.bg-silver { - background-color: #ddd; } - -.bg-black { - background-color: #111; } - -/* Colors */ -.navy { - color: #001F3F; } - -.blue { - color: #0074D9; } - -.aqua { - color: #7FDBFF; } - -.teal { - color: #39CCCC; } - -.olive { - color: #3D9970; } - -.green { - color: #2ECC40; } - -.lime { - color: #01FF70; } - -.yellow { - color: #FFDC00; } - -.orange { - color: #FF851B; } - -.red { - color: #FF4136; } - -.fuchsia { - color: #F012BE; } - -.purple { - color: #B10DC9; } - -.maroon { - color: #85144B; } - -.white { - color: #fff; } - -.silver { - color: #ddd; } - -.gray { - color: #aaa; } - -.black { - color: #111; } - -/* Border colors - - Use with another border utility that sets border-width and style - i.e .border { border-width: 1px; border-style: solid; } -*/ -.border--navy { - border-color: #001F3F; } - -.border--blue { - border-color: #0074D9; } - -.border--aqua { - border-color: #7FDBFF; } - -.border--teal { - border-color: #39CCCC; } - -.border--olive { - border-color: #3D9970; } - -.border--green { - border-color: #2ECC40; } - -.border--lime { - border-color: #01FF70; } - -.border--yellow { - border-color: #FFDC00; } - -.border--orange { - border-color: #FF851B; } - -.border--red { - border-color: #FF4136; } - -.border--fuchsia { - border-color: #F012BE; } - -.border--purple { - border-color: #B10DC9; } - -.border--maroon { - border-color: #85144B; } - -.border--white { - border-color: #fff; } - -.border--gray { - border-color: #aaa; } - -.border--silver { - border-color: #ddd; } - -.border--black { - border-color: #111; } - -/* Fills for SVG */ -.fill-navy { - fill: #001F3F; } - -.fill-blue { - fill: #0074D9; } - -.fill-aqua { - fill: #7FDBFF; } - -.fill-teal { - fill: #39CCCC; } - -.fill-olive { - fill: #3D9970; } - -.fill-green { - fill: #2ECC40; } - -.fill-lime { - fill: #01FF70; } - -.fill-yellow { - fill: #FFDC00; } - -.fill-orange { - fill: #FF851B; } - -.fill-red { - fill: #FF4136; } - -.fill-fuchsia { - fill: #F012BE; } - -.fill-purple { - fill: #B10DC9; } - -.fill-maroon { - fill: #85144B; } - -.fill-white { - fill: #fff; } - -.fill-gray { - fill: #aaa; } - -.fill-silver { - fill: #ddd; } - -.fill-black { - fill: #111; } - -/* Strokes for SVG */ -.stroke-navy { - stroke: #001F3F; } - -.stroke-blue { - stroke: #0074D9; } - -.stroke-aqua { - stroke: #7FDBFF; } - -.stroke-teal { - stroke: #39CCCC; } - -.stroke-olive { - stroke: #3D9970; } - -.stroke-green { - stroke: #2ECC40; } - -.stroke-lime { - stroke: #01FF70; } - -.stroke-yellow { - stroke: #FFDC00; } - -.stroke-orange { - stroke: #FF851B; } - -.stroke-red { - stroke: #FF4136; } - -.stroke-fuchsia { - stroke: #F012BE; } - -.stroke-purple { - stroke: #B10DC9; } - -.stroke-maroon { - stroke: #85144B; } - -.stroke-white { - stroke: #fff; } - -.stroke-gray { - stroke: #aaa; } - -.stroke-silver { - stroke: #ddd; } - -.stroke-black { - stroke: #111; } - -/* PRETTIER LINKS */ -a { - text-decoration: none; - -webkit-transition: color .3s ease-in-out; - transition: color .3s ease-in-out; } - -a:link { - -webkit-transition: color .3s ease-in-out; - transition: color .3s ease-in-out; } - -a:visited { } - -a:hover { - color: #001F3F; - -webkit-transition: color .3s ease-in-out; - transition: color .3s ease-in-out; } - -a:active { - -webkit-transition: color .3s ease-in-out; - transition: color .3s ease-in-out; } diff --git a/extern/phmap/html/css/style.css b/extern/phmap/html/css/style.css deleted file mode 100644 index 82ff12c..0000000 --- a/extern/phmap/html/css/style.css +++ /dev/null @@ -1,271 +0,0 @@ -/* main stylesheet */ - -@import url(http://fonts.googleapis.com/css?family=Signika); - -html { - overflow-y: scroll; -} - -body { - font-size: 15px; - font-family: HelveticaNeue, 'Helvetica Neue', Helvetica, Arial, sans-serif; - color: #332; -} - -h1, h2, h3, h4, h5 { - color: #332; - font-family: "Signika"; - font-weight: 400; - font-size: 1.4em; - line-height: 1.1; - margin-top: 30px; -} - -pre code { - font: 14px/19px Inconsolata, Monaco,"Lucida Console",Terminal,"Courier New",Courier; -} - -.figure { - text-align: center; -} - -.small .figure img { - height: 200px; -} - -.pagetitle .figure { - text-align: left !important; -} - -.pagetitle .figure img { - height: 36px; -} - -table{ - background:#fff; - border:1px solid #ccc; - border-width:2px; - border-collapse:collapse; - margin:5px 0 10px; - - margin-top: 20px; - margin-bottom: 20px; -} - -th, td{ - border:1px solid #ccc; - padding:3px 10px; - text-align:left; - vertical-align:top; -} - -tr.even td{ - background:#f7f7f7; -} - -th{ - background:#edeff0; -} - -td code { - border: 0px; -} - -img { - max-width: 100%; - height: auto; -} - -hr { - border: 0px; - height: 0; - border-bottom: 1px solid #ccc; - margin-bottom: 100px; -} - -/* Logo */ - -.logo { - text-align: center; -} - -.tagline { - font-family: Georgia; - font-size: 18px; - font-style: italic; - line-height: 1.45; - color: #383838; -} - -.author { -} - -.halfbreak { - padding-bottom: 100px; -} - -.break { - padding-bottom: 200px; -} - -/* TOC Links */ - -a { - color: #111111; - text-decoration: none; -} - -.body li a { - text-decoration: underline; -} - -/* Math */ - -.MathJax_Display { - padding-top: 20px; - padding-bottom: 20px; -} - -/* Body Links */ - -p a { - text-decoration: underline; -} - -li code, p code { - font-size: 12px; - border: 1px solid #ccc; - margin-left: 3px; - margin-right: 3px; - padding-left: 2px; - padding-right: 2px; -} - -/* */ - -.center { - text-align: center; -} - -.bigger img { - width: 120%; - height: 120%; -} - -pre { - font-size: 0.9em; - - margin-bottom: 18px; - margin-top: 18px; - - border-left: 1px solid #ccc; - -} - -h1 { - margin-top: 0px; -} - -.annotation { - font-size: 10pt; -} - -.annotation pre { - display: block; - margin: 0; - padding: 7px 10px; - overflow-x: auto; -} - -.annotation.span2 { - /* Override bootstrap */ - margin-left: 0px !important; - margin-top: 18px !important; -} - -.annotation pre code { - border: 0; - padding: 0; - background: transparent; -} - -blockquote { - border-left: 1px solid #ccc; - font-family: Georgia, serif; - font-size: 14px; - font-style: italic; - margin: 0.25em 0; - padding-left: 10px; - line-height: 1.45; - color: #383838; - left: 20px; -} - - -blockquote cite { - color: #999999; - font-size: 14px; - display: block; - margin-top: 5px; -} - -ul.sections { - list-style: none; - padding:0 0 5px 0; - margin:0; -} - -code.sourceCode { - padding: 0; - background: inherit; -} - -pre.sourceCode { - padding: 10px; -} - -ul.sections > li > div { - -moz-box-sizing: border-box; /* firefox */ - -ms-box-sizing: border-box; /* ie */ - -webkit-box-sizing: border-box; /* webkit */ - -khtml-box-sizing: border-box; /* konqueror */ - box-sizing: border-box; /* css3 */ -} - - -/* Make the naviation centered and larger on small screens */ -/*---------------------- (> 481px) ---------------------*/ - -@media only screen and (max-width: 481px) { - -} - -@media only screen and (min-width: 1025px) { - body { - padding: 10px; - } - - .side { - position: fixed; - width: 120px !important; - margin-left: 0px; - z-index: 1000; - } - - .side ul ul { - display: none; - } - - .side ul ul.active { - display: block; - } - - .side .active { - font-weight: bold; - } - - .body { - margin-left: 120px !important; - } - -} diff --git a/extern/phmap/html/diagrams/closed_hashing b/extern/phmap/html/diagrams/closed_hashing deleted file mode 100644 index 5e901b5..0000000 --- a/extern/phmap/html/diagrams/closed_hashing +++ /dev/null @@ -1,28 +0,0 @@ - - - - +----------------+ - |"(keyi, valuei)"| "(key, value) pairs are stored directly" - +----+-----------+ "into the array (no pointers)" - | +--------+---------------------+ - | | | | - | | | | - | | | | - | | | | - | | | | - | +--------+---------------------+ - +---------------> | keyi | valuei | - hasher(keyi) +--------+---------------------+ - | | | - | | | - | | | - +--------+---------------------+ - | | | - +--------+---------------------+ - | | | - | | | - | | | - +--------+---------------------+ - - absl::flat_hash_map - diff --git a/extern/phmap/html/diagrams/closed_hashing.svg b/extern/phmap/html/diagrams/closed_hashing.svg deleted file mode 100644 index 7c2bd24..0000000 --- a/extern/phmap/html/diagrams/closed_hashing.svg +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(keyi, valuei) - - - - -hasher(keyi) - - - - -absl::flat_hash_map - - - - -(key, value) pairs are stored directly - - - - -into the array (no pointers) - - - - -keyi - - - - -valuei - - - diff --git a/extern/phmap/html/diagrams/index_computation b/extern/phmap/html/diagrams/index_computation deleted file mode 100644 index e79cfc1..0000000 --- a/extern/phmap/html/diagrams/index_computation +++ /dev/null @@ -1,29 +0,0 @@ - - - - +----------------+ - |"(keyi, valuei)"| - +------+---------+ - | - | hasher(keyi) "Parallel Hash Map" - v "(with 8 submaps)" - +--------+-------------+ +----------------+ - | h=0x7d84ea13707f4657 | | submap0 | - +---------+------------+ +----------------+ - | | submap1 | - | "(h ^ (h >> 3)) & 0x7" +----------------+ - v | submap2 | - +----+----+ +----------------+ - |"idx = 5"| | submap3 | - +----+----+ +----------------+ - | | submap4 | - | +----------------+ - +------------------------------->| submap5 | - +----------------+ - | submap6 | - +----------------+ - | submap7 | - +----------------+ - - "parallel_hash_map with 8 submaps, each submap is an absl::flat_hash_map" - diff --git a/extern/phmap/html/diagrams/index_computation.svg b/extern/phmap/html/diagrams/index_computation.svg deleted file mode 100644 index b986a93..0000000 --- a/extern/phmap/html/diagrams/index_computation.svg +++ /dev/null @@ -1,196 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -parallel_hash_map with 8 submaps, each submap is an absl::flat_hash_map - - - - -h=0x7d84ea13707f4657 - - - - -(keyi, valuei) - - - - -idx = 5 - - - - -(h ^ (h >> 3)) & 0x7 - - - - -hasher(keyi) - - - - -Parallel Hash Map - - - - -(with 8 submaps) - - - - -submap0 - - - - -submap1 - - - - -submap2 - - - - -submap3 - - - - -submap4 - - - - -submap5 - - - - -submap6 - - - - -submap7 - - - diff --git a/extern/phmap/html/img/closed_hashing.png b/extern/phmap/html/img/closed_hashing.png deleted file mode 100644 index 0662041cdf9d76b9fc137afc1c34417e6f704165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9074 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 diff --git a/extern/phmap/html/img/flat_mem_usage.gif b/extern/phmap/html/img/flat_mem_usage.gif deleted file mode 100644 index f14b0986a196e3310093bfc1dff2f057da8e8232..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1755 zcmV<11|<1MNk%w1VPpX-0J8u9|Ns90007+F+=z&Xc6N4{n3!f}X729p5D*Z|%*;eY zL?R+0GBPr{y1J^Ws#H`|A^8LW00000EC2ui0Av9x000F35XecZy*TU5^(j(ubYy9s zXsWJk>%MR-v&MAPbFS}v@BcuV1F;$;D2+jI$!t2G(BMI^Vpy!vtai)odNl=5W#IUl z&*-!|rJz<4kF|VGubUj<0<}@VO&$m!4Q>E=1QSFTiFS;Qj%W>s00aXc00>7R4haJU zVgL$a2@Mj96#g%cs&zBMoy`&Ni^Z;e!)&RiirR)F$&alKo z0k8x(2pm!ZpuvLy4G?BxaIZk7HWuJW`DBKmKpp-ffP_@ROb4Gl&7uJV!E3?0T+$|l zu|OtB$uBp(2w=G81`wYYc6#bl4uFwI2NYZha+Jdm9ybOsYg!@K0|Nt;>|{b9P!0j# zUL+Z);9fnR6I@w4fQbT@M+Cm{3G#Nsl!6W%Fsqw(!8Za6%mP_Z^hKx~d|3$a6hJTl zz6vB!7|<&OM@N2u{+OvnUj@z-6exW&YYAH&A7Th#3ZUMsNM~^rl!$045go8x zT5;TRW1SQH@|=gR{W8vi6Ub6%WsM$V>Zz!vs_Lq&w(9Duu*MoHsm&adOjcB6V?=!s~7pG;q$c-~@`K0yQ9TZE>1f zV8D?_GQa@3Rc3%^rXvIZYKU*)m}U$1*4Is*Zz{_l*0Uc9F3ALE ziIawS82}9zGTOf#a7#hO1H7eU03wvANCzEu@a{jL95(@F`}BA(3Fo+jNIdgQV2_0S z*d|W35-@OVv?EhsfXX)}oPy5zQDMx=N|8d&T@xVPZUdg#fWcu0(1UbjQ3LZ^)o#wb zsmZP-!j@Uf78l&hY?NaVI0-FO&qEOzK%`7Z5GDc8;u*d60%&offdE0mS-1sAe?lCb z?iC{JWjY(`fB>XWgtssLNAMK6bjG;Bz}+Dz zNqL@-xDtWtDY^Y*_F+&u2DvB@fP3GpRzgx3Y^CM{$)1r}PW%wF5CTq?+d z6`~*~dV2waHsFp3u_1ybNDKon*n>d4M*}=$2TVF$b}0!38dWr|y^TU<-u`YOsUIH5Qpm^*t6X?;y^~7cYC*JXrUigpD7-BCY zeM<~S>VS?U#v~*eKoX7H(gd`0nyiV6N|Ip?05M6+GZ>0PcOpdr1_V1^c7S=iBvc6A zq70D*Gio<`BeD!8fpXRInP1>rDSm~WODN6_&Pq}g0hmoqS~FXw$R@CaGp{{u?2OP% zrxSD(FbSceo%u-wJmaW=f*}iH@)Q}RLM5_+K}tx>v7|Z&%7dp-!H7P~PoSE%w7oTL z1JYC|(~cU_&`@p3m0n8d!!Qs~f_l^mkINLakhC}fG!6tMJ?RFTgpOUPw2gxDi&2_6 zQkfudj-&giPJiHucld6SHiO>e9s&!YN-tih+L&M>5j~>9>3rVPLlJ++kw#j8ct%Oz xPPZD2S%TDm4CJaK-it{#m506QcF>0kf= diff --git a/extern/phmap/html/img/flat_mem_usage.png b/extern/phmap/html/img/flat_mem_usage.png deleted file mode 100644 index 800a53c651b585eb0b45d7bd5691b8f551873adf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8657 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 diff --git a/extern/phmap/html/img/flat_par_mutex_4.PNG b/extern/phmap/html/img/flat_par_mutex_4.PNG deleted file mode 100644 index 4f7cb5a49612896bcd1f9121b4f38e69a392099e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48452 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%0DLf;QQ=ruDb_AGWJGv;&N9h66Dc+7v?1La~TI z@{Wi(j+?W8YP#3!zXqDBSFuM#3$NgTa%%CNGVOFE=X=Y|d~Ssn{9EtyT0jOe$@as6 z%`wSH-L}*>{*8OQ_`)9(Z(L92)3@l&HQmcj0vWpm(3kT}k9 z*&3rD^V)7VeJAcAkqGOVkqgGX+D_|mgq6)uJk7>K5blqTPLSbzurlEBTy6LtmMx$}+v7d80UC2+nTAmRj^lKVeeXujQq z(py`~&*+MY-hj0bm^7Qiv%a?Lr>LxHW*~T1ADq&5yyNV$n!5ib)3y9?V>a_K zPsNNU-eI9)HtIMzwKIKP`E}GYXST5A9J`fgI_21%4W$m-B5na~fvcs}p1aYHlP+9k zQkCb0hB*s6C@3PD%liB<`=7mW;C&^zqdKh;pzQh@o%|Kxaa3ZGL?CsZ5jGUg8;jYf zxU(_{gCjb2$gF)W-e}dg#@nbktmJvOaUm!!pawvb++mE2OTj2hto7OHlX$69=KlTZ zU5<~_9$awBJdm<&tEQIH_#`z)_goLtofPbG_ai@Dc{D(?x>PPDnw4GSpZOGm&-c;LeHyV0bY0s}q`qXF7-5&F%HuBYDKj9C zoj!C%b%#3=QQtobxo{vasNSCR^btxCjZg~*>tF5q9{sK6IpH!bT(&-;Z!JUiE7!B_ ztx5Vw#vNgWJM3nqs_~v}32QS47KjhN&FzT5{=xpd;bzK1=g|fK7g|*>b{^g>S=DNX z7ciW=7nzN1C1R)Y>h`Fsf#QYTY70L33^*g`^se01OG^{UXX1!~2P?8{>wuKeC~fRn zss9tREcBPItc9FxYz6fu!peHIPDN4^vlI{qe-sG;;^H6X;hk!IsjuWVlQWu^Lg39s zAKTd%d{l)X!NkwYBlqY;HAfHE{Jqq@@F=#lSP{dHft2EsliH4EViNLqMC|=KAb5`T zQhV~tihaw~ynjC7z3YvqVPyG(DQlW8wh{Ag?zUo>xW{8aI|+IF^u_Cmha}Y9;WhoP z719Pl6&1GWU~cy9%t`IRVrei$5;fo2zYy~#WRqgE(8Y~vJiw&lf*w;Mv}GvYrVn9* zsYi-du=$19&JLg~b8ejaZhb1Z1DCCQ>~oDL37k_=sfHn~u}_%sufQGf$FDz;bH?I^=OY0>4pfy|`C@6!67k>SkC^bP)DRy42JUaS%~_ka z4S=MgEHbGiuRj|Px=`2JK5xz8`lBh-T^pP>z_+dB{p!fuyX~u=rDD*bdBln@ut5;%a#qw zzEVSd`F#=mOjj2T&>cFPLYVL>069Xi{;3682!3rIZbQPsW+(&ZM*Bv5wxStoV@OpP zfAmg4(gO3hSWjA;_~vZLn!ulRe#=@CYoBCBL=~2+L-C^qy{=8u5Z0Plz zeI)uW)k+hqxV1}AYr&Lgf3nXd^_B>BOabguQw$)uydu!<^j*zTRG~QX!FEXnskT4;L|*T7HrE2JEstYU)zvf-igo$vp})7?VfA|Af|Db|lEEF2Zt)~UHWUA2Gp*X}u*{zMOHCd-S z8w!~~T9!U7=DU5pDdFRjvj0)Byy4R~N-B~zA?Bl(btQmC%@sWv8!6aalQPF^3l{uNV7=?q@( zfxkrr*!DE2Q4-3ZEwwHzT1W<#+9mGXhl)6!+;W&URa^Q{V|JSi3{bi6ZwSNI@j7u9 z75AH25Fj*s=snB&ga^6ovsAsnJ#@iu{ax%@k4kfZ3|`DIlrqQE+Pi?xC-b z&bor$5CZNbi;_&q{iutMC1SpJ2g~GdV!ZfeZmW`j;

|b1c`vF-UIhsT5&yK1_~Q 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 ItxjM59d2gso&W#< diff --git a/extern/phmap/html/img/flat_par_mutex_5.PNG b/extern/phmap/html/img/flat_par_mutex_5.PNG deleted file mode 100644 index e43787240f901b46304e07f9d4cab74594e23617..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48886 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 HL)3o(D1Syt diff --git a/extern/phmap/html/img/flat_par_mutex_5_speed.PNG b/extern/phmap/html/img/flat_par_mutex_5_speed.PNG deleted file mode 100644 index 4768a20969616fb948ae9aa4e5c31b0cf8dacb34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27653 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 Tt==oD4zs~=E@ki~z1lY`O!|sM0 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 diff --git a/extern/phmap/html/img/flat_par_speed.PNG b/extern/phmap/html/img/flat_par_speed.PNG deleted file mode 100644 index df36c832195f5ebfab536d1acfcf749b8cf6f2f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30321 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 diff --git a/extern/phmap/html/img/flat_peak.gif b/extern/phmap/html/img/flat_peak.gif deleted file mode 100644 index eefbad6cbc5ef36fbdf35168ee64c29a83445795..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1772 zcmV%MR-W5#sUbFS}v@BhG`1Hl?3D2+jI$!t2G&?w*_U@Wps;jI~1UMn30;v`Ppp;n$1R(+o7z-h-!o$Qd2>}5Lnv{PN31$=s z271B0zrn@X+S?)yfr-l!q!kANg*KQj2iBa%O$ASJcKmZX5g=C6m6Z+_JHZ7QkUJKw& z`6LFL7z<@$p!~A)i-3j%d*-;Ygx?gQKWQ2`2fzrE0}8OjaM}$ZM*{290GJwn_8bp=A;H(5&2~2-BIElglUxuFiAqwNBmVFg$Q&2FP z!Z9a&bC}DKGmK{popH)E@oqu^IklF%hGzhDg8;!Y0v}^?MC%LMrOdMsUV;GxMngIA zHY0&m7aNU}NDc=&hVQ7BHLxl`x-;n49scJ)0GhnF25kRakcSw2_)$S1gA}62cMiZ6 z7zMg4zyJYkrE{Hs`CQQxw4_8K@=@5gKO(g|5jc zA`X-@#+(2YI?e>NY>?!9$8}0Un1%vCCLCV!n5qq+EFc*z$zYJx$i0EBDH0vvUSo0$ zI}<;^$TtGA6Qqk1u9l!G<*FADP$mGtl!M=C0aUwdT>u9x@W2EYOmGITaSP?H$0W1N zD;mip4K=2KQcgJK)KY5zZc$Jf3SBvu2q=j*2W%fp(B+9ri9%F1Bi-m2muJKz+ZLJQNUvcB(Na|?|H)ro6fLR z4pULe=yU_SR&7eh_NaD3Od|j4<+yNG0Jo{5jqTmZcMtGap#b!&cY^AQz%HJ-VXgJP zOb)RKJOiYo<-JW6t>+j1^<;5eI?drZ9zOTTIK|R7s7zYNG-tUp3L%IU3kv?AUy(Tikr|WKRB5C%J2TJM&6>?~kbRxi3S4Ndb z$C2e7B#uH1*#nV8S(9eb5tPk*vZ1bfzkpkvXuzkR>E-THG`wsLLMpddnzbAtfKm+V z18#dvQ#i#7`W)j8rBR=AmJuIMDaitdtKcGB)*A-A;eH>eM#;ospBuo%6ROco9r8yb zB@RSic|<)+;C+JX01M>-7X#pfh^F$yQpgZSHBt@= zYcv5=wBR%w+z}+M>CKBy0Gb|-Q3QnyLLxPAp$b$eE{EjNcf@cjVF?TobU}ttOwhB1R|(`1^nSnmP*q-QWGE4h!O>x?13P# zl!0KfgEkQ3mmZA?1KK>nnJD;3=S=lJBza{52Ivg}pmU3hoTiQ`_(%{w;W`Z62_%Pr z5d-Y9O6Rom1>I>vJXw%5dl(3PJ;^1MfYKj8`tzS>D4RG)M-C4dpeOdaKr^azrAPww zp%86Ps-GTsfrcE^kvvNeUKG_Xheq_HAVmR12U;0In5QRjB+VKV8q$`!bOp1}4?#J4 zQVe`!0;a2IA79GTo+1Yyj&tNf7NVgGJ>X%fDuCo5cR8OrwWWZg-tTZQ3wS(0RMn{- zAgcM)uDVo~r1{{V406k0@Wm~>$&Cm<=GC@>^pS3K2H1FHfB;D24W78wa;}*hIkMHQ OfDNo*2Mf{&002AP73F3C diff --git a/extern/phmap/html/img/flat_peak.png b/extern/phmap/html/img/flat_peak.png deleted file mode 100644 index 167edb80a91ab53944ad0187b8185baba5a2835b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9022 zcmZ`<1yodR^WUIbK|;EhTta#&>23iLq!Eb)7K9~NNeO8|x{(l6kZzD}1e8X)q`Ush z`@UbC@0|ZV=ec+8+~3SRG0&XYXZEeOrV=6ELp%TgK&YZDuL}SG(G9?dgN44!WgOgn z03vji9s|k-X*SR=F*Zgjwi+4$PBe`Jzye|cz;_S;2z|T%4-G`q4*{5e@d1D*KSlreMFaTm#2~8!cfG)MQ8q>Z z0QjVL4G2g{qXYmz`1bln?nWBw;#P1cUJGlur46r_lgphH0Olo*CY@~DEf~C<9Gwy3 zUXo0IA;i)29UIET@E640L6XTxLz_Vk?qn9Q`KA z^upcUMH~wC^z`KQ6y$}w*+Kcm#KfR{0#E?~9yEdnfpm7a@ZxbsF#oOOUwY(i5LRyX zF7EblXNEhy7M5@icS$CuJ464z{_dx{z3qQ2IV1iV7J7ityDw0FUOwo*b)!XLcU*B@ z8wA|Z<4(PSv%R~N0PHXD|FZvM?Qbb9H+vg&fA7Sk`2P|4Z{Gjn<={>(ZZ-(S9bV`k z{D1TQ7q9&S?hZ%KwVS<_inF_o8(R1uYyaxt|Bv`b7YuqgUH>(Gf3MA7T=e2d;lZH) zUT7)2A9$M(0Dyr{MP63l3%E0jT}f*&j=gvI7zNQK1Cru@i7=JL{L(S!1E<8dY!5L9 zvhud(8_7t!;~H5OLQdv#a|KaFs^;i@7g|HHpUrdG*93YNz^e&;)Mc z=PbLuQ8D@QGM}hyK?+P{Z5_6rmVXg!H&u4 zogEuDKypSv>!v|cRQWHFHR+PH^;n4=BiW5d-Z{7DLjj|k<0W?ecrMeErN;4PF7sTs zjfELtN$e^J(eUj`UlOsTofik;ODztteImuIiKctqI&r|6+{Ip~blQ_rBYxBB?FM3* z+l$HOj1TLVlT9bzj&=iX>km_ItcPA_fKw^3dF!{ox^EU07NGf;a$4L=w%_;zFk{|D z!{Ju;;_KxB*ACvhKJ%$Jm-Dv;PF25bN2?na-r$cWH67(IBRIpbFIJ!dVt%Lf^8?fl z!jqBvq?u>(Pix&)^k;H*bMNLu0|lr{{F&(VwMfGaEUjlB5LYc$J!cFRm8 z@Dfaa*5bbU!L9%va5>FmcpQ4Sct2-E0rK>xHC_3sb4LXm>ASvmuRdZ8?5obC@k&2h zxmxOyzS+mXdA|3CB5&*Y?L}bcPp=#C$y&`RpWVjzp(xh5k7R*gX12^uQy|A}%H|iX z#QrXwdGx}s%C3(kvAu~1R$GW9wquAy7f_LyyZ)#3h-KJWu|0Ry?XMyK_j9*5r-gQs zTgDs0)wKgHUp{@ps~VKpZ8)lKzUDD?A5owh2FzPqsDA#MS8|m)c3czOotg+%wjZnEeCnrX|8QDOA=lE!c${4$2r3)KGraHC!A;a_e%|j?1MO>SYs-_K?c%An6Toy~4N(nn6n) zk48DW=eqZ>CaF7O?aQzR1{|i&FZ*jsUmv-5QrYD>m>s4VoKHO2@Z0ryesNSNoh~_! z7!+e~T;YMMppLObYGj*EN0jI#U3cz$qvOI6Jws7ezr_xfXDj~RKr}=yl_&E7x0UW2 zqmib8wo+~kjaLVKW52&gj9r}{j-fTr%P#e-?Q|cK-=Zz7@TJ@Qw9E86P$Y@2^7i-0 z!7{kj@*a(M)71M&1k1dfSu2?JoR_R$eRYOR@UP%*^DyHXC6B3csvJm{5HZC52;C~W z+YLMs;OfR5r!g?y9x5%a;p}&W1iSRXu-UtKk&Bec2DY8bG0pVAxA8Dpi%VSgw3sr# z9f!4qmUg<6&%RH4eoUCaX*C2}22(|#KKXFJEt4^3y8W=DAa)pI=(gH>?w*B`rweP+ zw@9phpP3~(QnN4OPcj^-RUY76_xU=QOy79@v+w0=bc1gE58^YIwVRznn6XE9eb*#5 zM%ADL-E+cW7p|!aL%yqmhgc)eZw``Jgv{GF=1!YD=g2taoSuM<=#k5@Vz=k$DDVib zTU+=FvD)7wL$lCl8hr%P{!{$G^xI2=6Mz27zvmi8wEb<;Ozh?L%$n3BZXPq?4$`e* zBz1P%R;-fl6&0Y6Fn>*Q7rF7dok$JpyNF+*R1`M98t)HQU(p&b=nZ_yRk+EKFO3d} zVu=7qKFF))2DM(hmXR9T7H>dB;y2#4Mg#S(LnQ!Xi+?64f0xg^NUr5ltg257-gtOk zz{xJ0F6J_SF;Ok9mK}nnD+c<$)qHbYj>zWhBw!jE11r?_l#$fU5xZ1c95wFxLD_w9 z-_US;l^fEl#I+Wg|IuSgy-Gvc<*3B`Dl-iX^ThN;=GwQlu@N8k zy!c}7ZSW;ai5T90@HDU_UKHvM*Uxh1nWo9HSe^CYVR%4=n3#HD{-T_01ML}o;ntoe zVWpAXSOd)T=iMD84$RaNlwRoQ+xSUkY2O4rNL-xzE~-k5P7M3pzzamiVH!aKd2ls^ z@bg-R&+6KeBy+j>^NqMDmRjRubIL`PV#$-AR+cc&ro(i>!=1VL6<$wcIQPZACdv-B zM72dr|D70cT%_g4SqMq6^@v4Ytt(0Q7Tuq4OR(ONJjOhN3R3+WqjqICG_B7HY+!#+iZ(^ zAs--hF%rExrMwc5%XG!kr|U$pd;Q0=`EAs*8d>Lo+mUGhqXZ(^MB>t6k@U5zN+*VP z0-}^gitndskko0u_FcBR@lVc)ga9R7_gVRL8N7}J#(ibLzyRF;kmjLPLKK6l-`Qel zc_Cy)1Hcj8=@FkTF|$bYfr_nXn%~|d3*$E`@r;uG^T=*oG*y1Mv?C5eRYG) zVEO^J1qcPXFbj?1Nf!6*mO zlFFOd(r2>oYhzlov1;!{0r0N(wnh0Q&lUm^gvWfQAX)}N?lXa^&uxvR$9{hhnaA!s zvc%rn-a|ff@$}svxY;VBl4!zZ#2i*tHOG_Z4>L|38!!q!5{{FXodwZ1No+E$N60+Nh&=v>MQ z(i$8UBVEc?rP_1k`|j5^nvnG|iaiHl$I&w7H5#7(g+W%Wyp-0&XuPp*2!gxky8x!| zMlpvhv|@b0*$WWDvSniGOk zdo+knA36w(yk0t$JAb{wFCMKsH?W`MD=Lnng?=tL8q+v>dov}G+%Lg7D1CcH<3S){ z24evqv2Ql?IrO}admJ6Eh50ramE#k>d{tD5?2?!pNhuRlyf;x+|0iV{q@%_ENm0}9wg{}s$3zdX0Lqfws5V1uLI5>!x`%=C zcKm+WrRw)H!D??#Mdz4F3qQ$9l5s-r>PiAuvW&xiT#mQ{lDg*oD0qMK61_+ByV}z} zbi6I`5(qNDQApl8AoC03?636|Og^VF>}Q|4=qL=6_kCD?b1d6>v}6`p=Pys?fs7Q} zB9oY`8ZN&0uM`x!cBGD0 zQnbC?wMe|UE~Wb5I^)%g+y{K}>wYyRy44jK&rkb)TkMR~;=Cl@LpuX9d-9v2xn_)t zqz7ar!yf0zRCgE!_hkknO7Wv(C)LOmsyy24HY9c4d$e{{-7Gy_+eocD6n=@J`<`@^ zI<5MV5N_jlH`uF|RA=*?giO$ozCg5+TU zEYyEL!cphbgQ2ug`yD_{*qa#T?3$#{-F~##$z+p8Gir4AdN@E-j9Mflm&2h_2@k?1 z$H|HCvLnl*8eIEo^k4EZ$f#R)4 zU8S`KlP&<~?our(U$0+n27_Q?YO34;wS^7@cz79SXe&qr@RmI!GqOrZgx#-?eUuc7 zR_oKoXfIBLHe^4J^VpnMCYU>x_>}ZRP$Y=Rf=3HK3q)`a|!I?mPjE_Kh<^5VcWE#zn9(L^bui_8H-ElMAQ| z)8tF(w19cMB-r7|)lT|d6>N?%h$3u=GE!<&Yqb-g%GD1h11an^I?V;H0&$iTjiGp! zUw}YaI1@f@jT&a2`>Vaz>{@Ma`V61Sv|YqT`?7G=-FQ)wPyT#eJsDt34a$X|>(6sA zYW2(EcdiV1;<3NxwE-~XJ3zRWC{#D=bi;6qz9fP$_Zr$04WS|viV3w`^q5(iVk-&U zCKrGh;f9pQ3TvNe86-A8<_ai_DbAsqKLT9#XwbZw)Y9j@iLlDGo6#PlTpc>2`jPow0%QTumq0>5}!Py;Dk*TB642&A|FZ zO6jGa_7m#@L*E(Kvk9=*V5X9kGE3~&Z#?Xx^q4$%$WaW6$InuC!Zo2SD*3v8Jp1Q> zjhvg?64`K*e!mLWqH#z4Oyk#bL@M{^U?zea?t*luaN{?cV%TlkPxaTlXcFG+Y3tJ^ zSjhys`iz&DB|Zpa$HXw;!3oA;*xJknw_(Nv870h#8&whqg-+@99_LdXE%}(!pl81sEx6VlghW* z0Q0ZP^P3Lx^F85*f8J7BFL{(Rz*-}!X188Uo~RI`?5SOVk2~LO$06rx`Gp#dy1gkK zsB}6`jY=*=yHQb^ooS?D#AlpSx`aOzr(#*>+~a2+f$S4R60=Q^V1g%W954{X$vQ6R z1-I9Gb&HU%4x z>+kzEk)_$${&}=L26~T(ufkc@bteQ=vf*H8b!>goRzIh%Ex=kxLFF$ZdM*_SGmdMKC@fmaz1!vjZKds zDOj>H4K(I@j0leQw{A1!8Fp;MDvMsnFqt>nr@x~#$GctF?wStZ@3--_*y`sF+!Iq$P%EfeC?Z*&Lkva9g)Rl|j+ zg$qs`6=V>9YHB)xhf?>51qLTCxdN1^=?X5jt#vTOzH~M~=iE`Y&rHhVttRjwPfGyE zkdfrd6`|4R4m1K*gCBcxzZMWY0|dLO-iC!!<}mn8GJg~`yp61#h>kz4Q=)MaWrVrA zMan}q<*6dPH4_&Fnsv$j*rB=%viVosP4~0<2K1I9kzGQ^Lq@k%VnU!ImKvID?eDw} zI6@A*NzAv_f+){1g`iff&>ls4jh*z=9%@|;D`yEsWn5r{62M5$KBnrN6e~lf2;%1I zRbctX5(p3z?Sg1BJ3{|-l=NZD!Bn-#{Vq1C{e;XS1@TH`C42eDk+!LGsvULcJOgD9 z@?#^7AMI6DH}VWg2=Bty849^FUuaOWT`kzZC3h_N&D!?-FmlEPl0+6IhWq6kzgA~& znWU-g#cvh7`3;q$jWnr&;3P6SeyElzAO>U=f}+@*JD6f!toNZ3qzlJ!1p;W-t^ zDyO^?LYOVdY@trzL}F^aoiggwLWxSkc&4D{B|#ATAx6h7a0n%}tVrMLBk)6hD&908 zGK&!AZO!e`=5P&|S1vj$)8|+=E&IiPFTHkw**{e3cl=SXYBFyd!s^ALd&Mv5^{jSs zr{-&M^>54(_sGOyY!fQ$vctG>3h<{fZhQd4hp0Z9_w}&(lXO;|2i2cUuSHwob-ZM4 zwQ)4WA@94EB(fpFEv|UFyX;e!*0>yLO}M;PU<}Gc@8?q{M!ujot;}@X3-_putj)XH zhlzK4L*DyRu!24}V4()$ZLUyU-!WQ*8<$ORYlSM`DtF@)&tvpFC4I8xFi8#B(yIYu zAQ`NgBGdQgDN&|-LqAt2oXB-v_<_jlD^T~OgXS+bm?Wl!w{V&+Ym;v8y>@d4axm~I znQh2o(>_}C1L<6W?^}<+x89)0uCqft<;OUYh!UVXfR4*IcK8d}3w$Iurld%-g`vRo*wNnP5uSh%* zV{kz4*I^{e;9mK;fJ9&94v|e6+E?JjyGC(Yem#3c^n+5%)R$h>R-&sE4V6gV{B?6(cfJ) zOmQqVAJaq-vpoI`;oenw?gh_&9U~PL>qf%e#;k4`#UZKUs_S$#X$EDeQzt+CIqRKmHau3&uzVbzuZPcH%;6?*r>0NySnX1jmB|uNDcyLBCX~w7! zENaQd$2WJ^9Yb^!e%RUWa!@MP7(TE#Ow}2cwrQxZ>-}d%(zm*ahWub8p&UEU>S0EO z?es+*-3H3g!WBnI)~UC=)Kh0)j^mv;ADwPbe@;(_;rkWSU2j8MoCqx!zJ{yY z4{Q%7nb3Key zDve|NZ;XW3@xxr&ui#o3_Z~JdChPQE)Yq>V$>Kmr+)Rju1D6vwflwqJ^gfx>mnaQ zSq1&SW(SyeFeKYW4!HWFv)l%R1|`QDI4u(YMI7THO^78AB;SW?XMYectADF?=;Ca= zg10E`e#k5gpf8Vo?1L31xWG#M`VsQUFaG8Ol2Ar-W>5}(JBid~yB+L1JsC`>3rq~- z3w&}7Ot83sJIFoPPh-e3_MF;0u#U_jbx;*ntA*ELf4EQB`{1x(t8#nBz}^)0T-xNi zio|&tE*EAPfn*cIQ4U5$l*oU+oqjvn_jK<^%^aQ9Hq+a6h9d$> zPzj;93`i-NzP9Pt-*j3XWG?_IL2)+AvN+R)aWfPyB_0X6&$N+9i=wSwd&$R;sM@@} zmR_rU$w>1nUTIT`MVo7{tFrk%_{PITPy#hEIPw{|bPGl6M|fxqLY)8?+Mk(VGfq;% zsT9_wQ6D4VExciF6AymW^!n#IP1@CxM>c$fto8+#MrXppA5$94(ahqUzo;V~E+@4M zi)Wnr=u>}OwE`arDUPwg%~UhyXa)-+Z5Y`69wi3R_fAbg&ZyU-9ByJdJA@)hufiI9 zj`aM?%A;03aGW{24Vxv;8RYFeaeD*fQdN=R5aD7dU$Plk#QYJepd2Li7;2$FV%u{J zRA{3Hy_Ajh0rF*q;}j2fVG*~;%k=Sza8-X>tS#}@UmRFqP+Y}Q|RuU2-_{+O|$ z-N(Wv=-TkIMK~J>K==?Ui_%aVu8?`jwdlR*{Tx5tLxPMJ5M}hX-@`hVgV!B|1eQUE z4gvW+j+^p$B{1puW&{RRmSd@m4$~$mw4`;7_ zwAIg>J>@c3F(9O|3|{>XOz`a*JV(?L{=&*MB4JEdSMN+iDs?JhXKTJE-Y+B=pF)!g zGO^3Q4Ii~M`3jKjM{=}@4L?ey*WUvsJfI#Rlw zi%CpDl7KIc?Cwd}iyJDWdnYU#_p}Lzv~KiYdv9+m&`&96rDDHMc!e`0Hl;q!-Xc;( zIi`Os(d%DITrSOmD=#=Nm^1*@Atu`6B{$d z=NJig+*){K`FKVraX&hrE_gSlHLWBX>CDH9e-}1~Ud{~f<}>~pmMXZc({Sw{8^|p= z^cS@76BYtQ9lxQX5f+^wd!SSw3oeQyAvau~QD}P#Fnm)mD;fx&B00NSlg@0^5o4e$ zCqtdQVqdZHHSFs$`6>Zl)0r1m?zMEQuNJN}N)xb7A~FX!o{`AUB}Enf6x&Hr3n;rg zXCDXzH|S8W_7c~>SeAKds268K6};CNwH=0go4c(j5&T_7^i_HA#-hfBJ}yA!y2z)J zd3{7;j2d00X{bF)`Q5&*;jOxrZl;ilk&br#y5(5uy!EG= zdf8PVt8?|mKud?DuA^I4B)@@C>5z4nha^_wfZ)EL*a{Zn&W zcsC@f9$>1vDp#XY_6!F6;kL5p&QgeKJWP{PD6OGiTqO*w2VIC6TE+!g)JFm0syArU zVTRGe3iK#96@yZObpT6r0tLad6`@3V*P-A;)RdKnaP}J`+M+=57|vbbkCtb}DE5d1 zB?S(Hqmh7~1Pk{6|-ZT1Ap*UFAR#=2JKFAjHpp&Z+lyUL4HD7g;;T-L(JX**KeTyZpah(ZMU zw;b5eXgr2Yh3~t12X5h5P_k78r$1O*rh99-sB?dvm;?;Z!u`C(0^jmZweTqaHdl2! zdsh%H7y`nrB$i|3+>G;as?2cpGcC@;)~E1Lw&St|{;i!it0TzVi0ZG0Hz^s$)qPUG z>N?zJRy>z5Q8!aK@pW{E)GMSKPF9=IcV%0bW0#h>a0**BCGWr~29m~6SCdrJ&v?F1 zo}Di*D=Q6g9kGNeF+FG@<{YKpFuxf5yQr+~BBQFKOkCLT%qAI!%y}?HsOmQ!!>60m zAcK-JFRaFOPnPFSILJWV#xp+_ku8axzf0LMG$aGwAOb1EOBSQffqi#x|Jz@``gms% zTVH+^?$q^7AgZQbUK{2RiiI>8-}&TU)!|ZO!HhwP0FUCE$&Za+mFn*5-^Dl3CaWZ9 zvtwes$>e$#|JG1O-Ut<~a z_S2mUW`IqIupPO3-r}u6>%0b32iIn55ky6zeEx}|X35P1Kew5SPs?`oOzr9=d_I{F z)n9zLb0oB-Sg=FMqs{P5#(lvj(a-%MT92MyOTRS_vT(hKx%*!XKt(}QzU;C2oBsnq CruxtT diff --git a/extern/phmap/html/img/hashtable_benchmarks.PNG b/extern/phmap/html/img/hashtable_benchmarks.PNG deleted file mode 100644 index d18a31b38f923aa87e29979f92da5a2ac81142b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15260 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 diff --git a/extern/phmap/html/img/idx_computation_cost.PNG b/extern/phmap/html/img/idx_computation_cost.PNG deleted file mode 100644 index 7e78e8faecc807cba37441410533f475a4c86149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35737 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 F{tu-VTn+#L diff --git a/extern/phmap/html/img/index_computation.png b/extern/phmap/html/img/index_computation.png deleted file mode 100644 index 550d743b3e262bd9b98fade8f0fc8438893af448..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16321 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 diff --git a/extern/phmap/html/img/lock_various_sizes.PNG b/extern/phmap/html/img/lock_various_sizes.PNG deleted file mode 100644 index e1a486ed4771bfce047aea26cfd23b643f7ea602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43021 zcmd432T&AS+ck;;k`yG1B$1>NsFv z5VoVwD_ypQCKwn6*>aL%U{`~!W*irquDFX*?h5)P;q}&hI8xsdjzodvDrv|{p7v=H z##+hMGL6Jr$yJ+U_eB?SBpD4PVPW2i6!XE5^}%}T+bv*reNS?x&h{Cliuy=Q@*{JM z{WDj@dkGCECzRB(NFhRxj~Hmh&qMF2%9UTAe4gDY{Qbv|EH{A{`gyz{#bx{b@jV_E z`R|VtSib1DM;}&K#n7*WK6u||Uj6k6Bjx`Ox77%_=Y46oVR*qT4mo>pBk@>m5QElh z=EK_Q>e|K9-IKN~OTA%-M7rQA;h9632&|0Jk5Mut-Zps8EnllBQD3YQgJz7kS;RZ9 zS?VRcR<#!K>YdlxN!YnGG?(zNPa*k|A=B(#U7d9|QF)3U{o?UlH^KMCaq$#bc{Zv! z)4P2#b?>}wdGXdx;_k;uue$KrQwrbS{96to%tLDnrx>5`fNQi{o~q;pb^G?dP^A^X zg<&skg_?wcIn>2WYXukG12Zds_4@mnx0&+9s@UYp*aQv}&u~&@%1!X!e9nupjj+>M zdsz*c6Sdl$2tB-y@~f7r9<+PR?z(0@3^c@v)C7SO5gd_whF&q^fmqW+T^M*UFKT^JFM$UR53>)ih}3%L^YjU3IweigM$; zWbA%9>1=uqanq|0nfMpiztATPejFGyxvqzvb|1s9h{fF{q0ZvL_CstWDt-0MVNP?* zOWh3O;`eza-0QUNKjJZ~R&r0N#bB@rvo_L9%xAMp+&?fPFSF8O&?ANOM0}_GeG6Wz zty`Lk%viP!!2$21EJDcDLGe=727j#T=5UZERoE7ka+aJBt}Tu2zKT zQRc(K(g?wIx~=hvR@M?n)5W=zhMNcLfp&v=2)sUrmbiA^lKA7&#(ggFlkzt4^GN^M>qdsIwQo-`>sy5FcWteL~DC4r`O?mATXpw4@dgYtdZ8 zqd5fRa^{!X1R=7f8YO98zn(0)Qan6jw$N`AI;nZLByp%Lgt}GFu`_?Qc-_Ly`(e;B z)d1t(H6-O0xKC%2j~D&6P?CdQ&HAo%C#r$QqWffnnzZs zZ{lUN8UL6?#Mp6Sh3~8~`4hzyWxDxa^#yB{Q8&d)(Tz=xmfHf|^GXaCJ9x`Smp>8W z{>AeNbZ$N#9(6>w_97s=E(x!c`>k2lIH^oy`^l&WFT-Hp+IgsPayM?Hh%u_fm^hFV zEBLE2WLg4&Uxzoe9qB%VcyjuzF6n#Ajn)AVDj*1u(&oi;-fxbujbHBgF4U|+Q?`_U znDG$)V*$w)

9-cfx(A#6(ZP;_M@y_SrSn^|KHQGQ^UWt^a-%vPtJoSO~6CN^T)8-+dBrV7>WqfquBuG#Uzf)2& zRt3jz9kiR=*@d zkS*&QvOjCz$4T5tK#*Qz2@erc`z8rfh;WqK&D&OZn1|0%qn|31W?#62`Rm%JLQLn> zFmqqFDFNvW!h8Nv8dUl!Mc*HKN`~y08#E`wV6aae6u+M{@p1@Dgd7goQ#q^?;ZySpOyK zYjg9UqzUsM-jV$M{rzhc7@;`d2>Gx4bz*7wN|J!1B8s(xxhT{)3YUnD)MQuJ)}+a7 zHRrXMsd3p(7o><%F`RM!oW5*gC4TBnccmlfdOU`DHyNK<7}S^6N|0MN*oE?zekHsK zK5Pr6`|}X=!+-~A%`CeqABUZ%V@vX4L&UJY49!c0x44-SFF zuUEu%2$R)k_R60#^C}*um??eJ##_>l+dhAvPgUOfz0Is7GC25%_rm4Rd8hE{r>82D zINXp0toMR{&YR#nEF9^hSpVPL>gAonZ|^9D?XFJH{yA~kA|L$M9w3*!^GRE zg2b7XO7!G)?nTz4wsbdm9#Gx9ig=zAI8f)-;he`%8BhJ|oiMP-Whv1^jUM7$aTQdO z@229rl*(jZU%4AX#EFc(B`%?_y(d2(Cts`t70oufj3hs?G=KH#vrx3|H&E@&0I+_@ z<-!fUh0A#N-3Gc$mtUTrpzboqEH1umK#l7aefTgTROzu$iw;W!64}ov_QN0>)#^1E zYHiFme9igW1jAJ4^qHuvDA0t4pJVoWtcq@eDI1#{8`>ECNYy70Sykcb3lU=bL54vb zo+}7x9YSAuP-ie`qml+IPWS`&f%Cpd=#=?+D;S%+-CF+e(X~Fze|E8)eQsrNrDNrCF9`D}7EiZ$`f5|365H}k3*owufriSOKhdN*zh zfgmw;&43m&-uhP33*nb5NZy|T)~ka~O2aQ1>SFBHqBv}=9n%t2%KgwZ!6q__jQVg5N}!)ZzXKS zt*?lz2RlX_t@5(Y#aoB0x1cKRFQrcm(-WMeEO6+xPQ&-jOihEW&q1I{n;LrK$wXax zdb3^D9o5-{b5>;Z>7EEb5xmq;51%anD%D{7-X5Tqe}_#X7?;h~r{hSK72*4qb%6KS zF9`JdTgDSVa$ER~2}1{otZ6-=G-_nwkx-7O18@=2EX&$wAShUX3 zry4d#Kn!g9+)X~rB7}J~yKdoIq3>N#c4ST+eyYU~&_3aDY{kVB?x|8AZJdeMqsOX`BG$jXH zrNO2n(t7Q%+tS{%QmOelhhu@hE&b8ECc;osk%C&ebamu=gm?3Klq}F%Piv>J#WT&e zdrTEm<#l?4<>^pI=pNlD(@x5C=lNjQibLf35APap6Hi!Xh~xYVQ%o`JVQlnrie5&0 zD8O`=skhRWHoZs;%tCTb<$$>5ZC<>)o;b^*oFP2M9fn#c57d$i@04vu0PKY!~z2Oma;P)+fvoD!X@EIHHxt8t+%lfi@(Og@#zU3sEqH2tD(y1?4-mnw$Jx_D^#J z8X-E;oaLZTCr){cB{+EtdlixJIJYs&z1pULFA4Z!%+uVbzR1`dl|4{p2}Hk{h)RTO zn*K&}i5IPODSP?_e9*y-){VBNpY5-1gYWZHmR4F@=%Jh)1d2C(5H-g_Em>Fp73Kg< zcsV3+9TX^OW}hM)J8fh;G;J=61HRE*3aSg{ZyX+qSozv_=5eD%Q(9U&=+2_`6DvqA zWW_0Wq+~~LHO^`8$r!JL!MSeKf{=yC9DLAvn^(V7 zCUEf0tY*iE7uO(sp$X!JYAHDhT=bk&(t%0}ccJ!#i%|Q`u-bvF5e>0UC#go4_dI_> zSOfoMmyAmj*i0sWb!~=8LM6?1UoCKf$Kvcg9}HRk&hUlJKbKCb*xm%{EtCw#PQNjELzX z9Lxb^wqgo1jeZc(DosDDjPwoJ!O2nI1Trgs?QPLvjtg#NA(td21Te|e$Icg{LmV1G zZ_=LE37Ij^tO%4bCV59G1!Ni_0?!;9(pz)(zSdl4o52E!-S>$wKty8p3TML9?qum5&55=0pRw;=ZX?d)-J&9aL!7kLrF5=K z7Jcx=TO?0yR+y#p32(;rM3aCy>9^Zv3_|J0m|tF}t3B zPy^`Zb;S3A8Mxoa-QW8!>NX{oEutC~~Te;#SDo>!b z!)v`;2U49{;32)&bT`x{UIs}@JT2`%CTKQ1shGGx9@q6(_2KZ>qH#0;+|Y|(q{USS zhf!g=%&;jPhHL=p-Q7Lxfz%~gnl2V*>J|Y2OrIV`dN+7vkZ^|mLKGftoX)&Ac)Up& zNS8^!)2NWDXL#UpJBjMa;1ny>)knnf4aUV0uUL30dyGV<=yAZ{ipvvZdDqybJvhGa zv&7x4V9H~e>&IQetCEI>^JjI*dqhu8Jej7t*ql!SGN9F%=S1Rc&kG@f#-{hm+D!9V1g9t#?(8p>U3K@~I0=Q-<#6 zscy>eLn8&=GSG~ZaJTq-#ZR-MBz5BjFH7eb&86U5B6sAOZDmk zW(el1equlG!Y-pW>qRqIyn5P;7S>}$fg802en#kH^Fi~oiWM4AV!R3++3OYFhT9N<8qS%cO4_g!jsyFOh1%~9aS_}JF;0CKG5;M@ zTFLzemGc$Gf%SC@8(Ny0A&`}3m?sA^)=2Cb!ik?gVe#n7dV*7@?|#qe%MVH@FO8Bt zd%=~Ok`rm`90P;d^^WOEuKGbI9*^hV(tA^ygR-;h4J(iP@_w_QI|kBUUV8}iFJ28H z#Yr@$Ma6JOw60d!HbnzT`6~bodDNnFviWuaq@KDhc=BMjc1Nj#vo!@Y<~aU^R}gESp4-ECk2`E%*>BM)Y}_U;_-1x^rWRFV@_k0Acz;c zn5mO6>J~ifP=U#WzE>oC+}lG5R0RMTJH1iJnETM8u?KBg%8vg|53F@XpytNVRC#tn z+)>VU6X-duLe$B2pMI4}j_|S_N-v$`(>x;E z5;1jiizv^leO8*WU%2(PVkD#J_iVWtOf^qa^ZjuPFOjJ>?ma^Hfvc8Zq&FPUU=et0 zoHBai?E8(J%6{UP)n^$-t(C319*>4ph?zLaTa%YbmC11X8+{&Jgr&)zeO=vBwAM-K0ErP}zo@;LLq2^Ftkz3K{ zg)D9v&s&A^r+hWM3y+G%`&U<&P~OGwR2wKA#$+Q7`ITSlXw3pn#k{?JlWWl=)$fEo#=r)FD33`PzFhj z5WN<1$sPc$Q4t1gSQt@j11)reZ8lu)Ax`e@c0Ag?tQi}c-Pf;IH#&K>ZppnG#48fC$HuhDpO>F;Qt zE0Hg#{f)n9AP+&dNvQUiHF0qFO?|0h0xhre%t0nuFn>8@7B)h;)zI)Xh!5B=-0H(P z3gGS2sYVRQC~K`#Xq~B`iOA+R#LsEp%3Y=|e8Y6L8DCmXYR3Ou-pXAZwkGiB@U1qJV2#E%>auZpP82}9bTD44Ui^WGuR92s?fWhn^U0F z9FicbbXQiHqy}feW#02BIK#iw&wDNPqTYd|#YH1g;CK3D?*bDu@x7~>IuF*^K(Tu#xP_=!Bzy+P_AlV3mwuppZNs7!x~JQYJ-T^~PygEzm9SC?Kv&IndgTv(@sl5vcBW{Db4Iwt(3MxCPO$fVkhP@Ll0ZWFWH z`b^&@Bmn#vo$OURyttnB#Vq~$??=&nm~j|=u#yu^$es4pSB|FKLH$i*f(4G}<3*ip ze0j{DYbO@@BaonU`y~P02E8^Dv$SNJTsZI%A9DFGY z;gx~QUqSP;&lSbuZ2pDTIccx4V1flVD8(3o*_uD}Y<1RvcrUec+#Uy=998%2<$EOK z6lhjtfxLdhU_VJFf%0E8Y2e{Dp-Nwnp~sG+E&)s1$cZb&@H|qPqor{e2nW1nzszJR z!mn9^pErsx`GhiVN7Vl(if`;}U(U!uqpYLjdv(knw++3D1ItjSg)T`-%L-WN-BSq{ z7BZOc9|RKxDJ-X50YP?dZJlfvx;Y>JE1{d98&Gi7D0Wl4Q40&If<0Q#!l!ZITIBgf z`4M3m-YPm%g3hn6_+|Ebn?^fd42pjb$wtM9zi?xThZAwo=%G{bzxq*s$*!ZhuUX`w z2DCk)_`6X(t?`vN7tf6geLxyJS;I=@LF0Tp&3iIg*;mj}t>GKeNeq3eKhLL7cKDT> z3`tn;@5A<^k4eMpiNv%GUDk3d9p4}q{l8MxB*s?GT#`(08bAwq$yeyfYyE%j89@%7 z0pIa+;dj7bU{;{B$Q3?Qr#WA3b3vivX&=+(snSGUHU=KvhBfbgBx}USq3E+ypJ9(wfr5=y1 z1q$d_Q-~BW(9J;VP2cL3hr{UVo_ZWZwo>A}SWmaRee0Wv*1I{odHBEEQb0#v@J^Ka z(NR#Pm#CQDh38^Q5#!MZ^J(vhNHd;_)(BY~^X1Rs)fQv02Qq4)gKuZut?>$hJZh6= zWn8KON5>x!k1KLmk&8^U-1n7Qek_F^JHRmSPq&>m7_;};3zqcq43+gMm0OiNN*dS1 zTx!)(P109}Ax8IV8*Kdz(x1Mq01K`VrX+M%l2E?_ zqux^mmJps;;(JL-(Lz342wRl&w1 zQ{F3@#_P}pbu`JVVoa0X+>kYs14Vtqk_%MeWA@CV@8424(O@b0R8rOl-GUh2%c zP}IO~%gh=;EuQVp)EQ`Q&j)e#>{ph_ZY?YeI)8g`L_u@j+bgdMZPKcNnx+A2pqzos zIOB98?sLsKqIM@~SRWgAokZ<4%yzWpYhUqcs;k~O^HIH002DbWYcP$VDmr~m87inV z{`%LfCg52lRGHTH>2>#T)YKzIq%tJ(cVj6pQ>R{6QQH4>{N)-{JCc&=8XCF)8T8gb z^FBVxmW-*raN?1xUh+A9vnI?eLY(jO*A>1I3 zu<~}N{pRn&I;aGpf?5XMQ;mblJ+D!bP|bvku%#LtH`>|l6{jD`m8oBf=L{czcn13# zJ;-LT;%PT&UYj$oS8Y~&6h0;_)u;?4+?Oqjtkse0LKcFKBwK@EbPn6!u|^P@(E(A` zI`uR8#it&~j;ucA@xYM68H#e;$87{V4KYWX0zm-9 z{gv9*Q^9VMY`m}qGtIpk5av@lwb8k$a_mi5CKz`QhRLJ~t*FWc`D+r!0D=X_n3!7M zA0=QTPh6$bLBGbT>3Gb#MLDSpzf65ALAF~YRtYxceez@!iTnv+OG9I5OkbcC0*!S* zkl2b@y;XBQ^tG?o5{=iEmMxm2(xW;Mw-})^B;f1oix=I!y(C>@?r}%u`LcsLb1`#J zkmmV4s7{>5PFgU^YRoH0lbdlz-mwQOrq*P;ExXa7!`s`iRKwg% zyVr!jBSW1PZRb`Nvy)c0m3e6V_@L!QcHF85qFKtl_GG^bVMbmi7|r?Mq-L~MMv!%A zpZ_PF)r_7!#&mf6fIM?bOf;?TIVsx*12XQ<$aXX3h^u087-tHaluyq>wViBAyoz9U zv=uZFc}hH3Nu#8|6A6BGK)vXdgDgHqfEz;y)A0qwZ|W< zydNJ_o;ckCI4@USX}T(~=S0DS4{pRsuEm_+BuFys@0+d+uUI%$-8!&m^a;G(-v%sfzqw7`ClW8=7%6p_72z`13ep=Kzd~vnq+st&S7&pc7lq>PLxAbThRJvcMx~a?shwu*@9nyl<DEF7o7kE8CKi2q_Ezqh7 zx6t1e%8@rDevM_w58wUZ&pP zFA=pNCrtvIgDP|hPQ@q(12=;J%Y@aj$`fI`M&eZ>UwjUczW!|>YmLreBfRKWYyFg# z1r63IUJf7w&+dK`VAX z0wn-2ELHzd@}X4P%^3v-6O@*P++&81T?efX9K0?p%{4SM5+~$&0ab}|jxa(+f0F+h z+_`^vO@lG^e913~(G376aRIdM+I2Rw*%#NpHwMpJhH@^&@Veamj8exRZmj!BtUv1=IItV{Z#M+N{Tg0Xu#gp8UA~ope6;6^ zdCOlH@2Lv2ERZ^ikk2*>iDFb3qM;po8{1mQC=kxacIV$B&mN@tu9JRpR$1lbu_qI7 zUiUZr7#2Qx!qz1sCf-m`rZ(w(BdpP{s-tu=|f>blQiZ ztl{~UWU&Xq)tEr59mP7Q?Lq0u+TY)QkIIp6>X*%8+Anh2eE&cV3I0=FmG@v|+876@ z@tH}@C`&!%G_}6aimI&hdKb_T^5x&kPfxX=0V&KM?uR%WPLk$KlzbNmB%Mb2zZFEi z#)^@3LGvblhQg^b8&Yvt{gOJuwm&=jyl&WELi9ga*i6uD{kf#@TC$4URI*CykBOQq z09jt#H73L70AhjUGoF}J=>j?1#J;`*wD9m#iuj9Tp~cWE+@}BN0458UcHj<_Q^Jnf zB4Ekg!qGgN@>_Yy-=98x+YL;3Ke@cj+gpu_jKX=3DZeMl_*QG+$Q0_9d5B?d)q@=u zcpL0C%+@AXG5;`7e{E;J)zv3iXO8tUMW4ry0M= z9$UBks=?zGpi7xslt`tP_qx5kHs#R$h*a>4hY%B^tjt{wK;#L>O_Ft#71maGJnD15 zy!8U|{Csd-fIcBSP;!cto9AZO_3xFbDwKzDZ8is|vei(kGH6aJqRn>cZ3dL10B1}U zNH*^mxz_HIl;5zUXBmcuUIDT-J>U7BHK?#{9jNLQBq%-cqZ8HH$pW$^Pp%)En_Rn! z&xG@v1(GL0hy2@J65W~n)CX$4`HsTQzs;)-jN3-KL%s?{(@da6w5Q~%2xpEZC;PmS zpRAPL7x5XrGI=x}d$SYAnA0mfWJW&gF!)PKyZkAoS;EW0i@7NXaM|8R-`~Pjnq}Wv zjAHQ)@>z<7Bl3#RMTqS_RXuRUe)=;50t}Ld;bGaWw}_HiR_V+=mvf>xy2gahfo1A0 z=ful1mpKj5bzf$78EG@asrd#jnf09pawP@_pl6o#j`tY<6iX?Q3PLLBlp3mzf0aqm z%1#o_!D;n$;-_C~#0NX;(zxFw#)Y{D6w&(U3 z+!JD*OE}M>3&pPU&nVJWa`HV+AB`ga-%wITp+O-)Hn54&Fx-3N2Hg`%2tBYmHYok3 z|NqQK;{vX;sLpI>g*9YmE=94el~666okV7Qp1tLNwFsSPQe?x5bBFlsIeRDs!GN9L zu;5#%VaEI*&tV{FFr|K322?pb8Ksot=$Ko@lqT!!o7)a(L#Hr_d{DsiK*ZDC77q5b zTGk8?wbTTsp30#}Q`1?;-h{zKOaiZ9AmPuDcrAI4oID=DTj|0aVwvBYwqAM=RI)`!21ZbD}#zgqNvl zUZKof@l;o((tV224ixi=kmHZ!J+E73>dl7a#Z5DWlQzXIs;A=I<=eoWbP{F~jyk(g zW=!S%Zlk=&)8`4Pujm27Ev&^C(d(nUl9sI@2AXrwDYGHOaE5Br;hplF z>9i(7L-qI=x3SYuzov|^u>nGSA=WK={3Vxy?bu|QV10FVu%5ig2XSKT(B z&v{>-??+@ho>*8|e2LDAc=5Pouc&LOzD$>Q?hL^@U+|@zMMud+2oOX#(-fO8>j`!E z4E0)Nbbe|`?k|5N^&;QD`vSZ^P+>^hAp8Jw%9w@L4#&&KnFsrvJ0ST$W!u1D4ijwl z4fO%iPH@Fp$dhA7rZ#vHQqPUz)oz2U_W`9sp5$d(!d<3gUg|sgJ2;a{KS^j0s?Qk4 zsf`LOf%X+T$u!tDm!d&+JZ4O~fCV*5-K{QR;Bf%{JtdmqCYx?$iGZ(_MxXg)G{V#F zJ_ccg{!&)(VZnJ)W2H4L^$3rZryK1q#p?g=Xk=baa+JK+5+n z#yYHHwzN*aAQH*{H-xlg>L(XhAa2cacV*f<@tNnzb#tx?EIT+ZH2y;GBJ1$02Ja>* zg|dZwK<1KD0au1TqhyS%p5{=8Y+BO0?ni?1d0pFj{I)HP)&bj<{x?nB*h-%Zbt=m}BR3HO_7MCy1N=|hAkr5^Y zVP2dyTSEhK2SPt50zM5>w&|!cx^!2U;Pt@#Q~d`L$wbQ2DU~?rg6v)S8Ie43-?52_PP5I}W~j5i{+$lAyxR0!I(`JXXsuKciR!K`KJS{Yq~*zQ zbVk`%e4Wmjr-ZX-u)}+D2+mrYA~=c-v<~AC5BA?oqID${@&S5U*ysu8m>*`|EhpWi zW()qpddfiefo_r|ps#10oS;Rt8A#7$8wU2l&htg}X6NdK<`cfTi?C(@bJ0$4RAgZp zA-ww+M4n;0w^(j76FJ*V^r!;daezrs5Yh5wZ~$PBvN&>1YomKSqK5CvJL$h6 z|0a;b#4)C04<;>ut)%Z#VX417L8I@D+G+T7PVIe?lV+XSx)Q@{LXqc#ZpW@d@FAc_ zLQ53J3)bK}>Y`lJ?S)&=0ARr^2K44K*K}1T_pgf%nyMEEybjGCoHjB|cKVe!o@*YK zYZz|YHJ0=u0CA3vt6;AD8_|W~tfp!PAL}_)?=n#I>xH5-{ot%)z*#(xSx2pUu`rR( zZoDmELARSifD8yJR7cTOY}mxS@v`DQo(Hx4E`tY(>zD43(oi(FJ_!wIRJi92cPU&t zAbl0FLJT#oyCo~5oCYE1j!Kn`OlPtnO5JHW-6j(`YRtpd`ElXivn7vsULZcDZq;45*H3&iuXHDMeVpBnzIYz5S{@@XmIaH>&#Z@*Us zCmj_gm|``q-LI|e@nbdQKRYadN)Yiq79c&?%iR|Ml_N=#rX=`pT+S}XF1A@o%ZKgM z1`>YnG0TrSkRrP$%2dfd zOHSFY&4uHtqR(7uz$&+YU-Xx4&{{O47qgrv%yzjAj(b7fX03pv)qWoXNu&JZ9$H~w-#05*-k6}+dP zM)qBk=kmDd(}tw8Ty+iKGzKC9J&YRW?XiCQ8~*tO*g>b+Ms`auhCcF0)ywk7V-dm! zZEso7WDUg$RV_6C$B>>Jj3|%rcpePN#CJtSswKT}k-Z7t?3}QA;q_9V@MRf(VGN3n z?O_BT;pywg*#BrC+WfJ3{g3A*G_Xr~^bs+T;mFXI)FM|&-P3IX&#t2tzk02Y_rQ<; z@=N^764N-!1ERi}qsUBa08*uA%T%H|6#{kUfXm4F@yT!e72yB!pA677lU}jl@r$M- zLvNA#T%sC>5KhYRep}QqKL83MsJ-wKgwXnT-hst zE4F-ii#7^n$}@C!c2>XYznz?v^bi_3v1ZIS>lh=8gqQOTa?tU2U$8vmsYPnzu}ccG_MB2^f&c&_um1_vmbyv4;` zuvOH?KDunNROD%DYD(;{E%aU`Bo6SW`TP5!kJz%Jmijcd+wMh~Ua>sLd!Ua{7&|`;`|nFqifAtNSd6lfRJP2_%mmF# zz7b9h+|LKJ&cCg1FPJB0OKc+=o_oQ*p@t?us}MWE=AN0R8SFO4^o7fMC}213pj}aU zH;bckUEA}KzbtV|m|&UKQEQfT)%TMBoHg;qvu`qku1PTIcoM|TFJ%FI7D0OyL-dd_ zp6Rdd()5)NVG!_FCYJ(ngqes4myK68JFA6NF@-XxNvk=kKU^*k~Ie_9-S zbQi>@zwtf9+_QZIAlG95t-Ib^y3k$HIMoBmCAdsMjct~FvM_jTopjyI6S!pYzdj^r zHoSiin5_7~*8v^5sJdMtyxnWJnGB=iS0MiDwJE5}y(566W+b=owY}S2jh`{^?#;d4 z(gV~qB8{WdLbDm}ap=`M#J^kjA6`NZ7INX1n{UC77D&5f3NV-S3Vp{_t~kNkB!F2B zK%S9X(pevG_#XW>;`~{VI4GJ)-@0W1K*j#l#IrD{mrru6#w(+HFh>W2iQrcl{L_;8 zqGG`*L;FFGYLS9|n{D7t<${OiRJ-c0BGL!$HB6$YrnBYuro9`*QjSz4pf{(V*t(_vA^A^ zFL1m+x?U2UZdOy7`>LxpCV&925Nb?8|N90MdNAj&rKj7tavoO9fDU%`PsGUj-5;dU zKpl(wD%f@JxAb(}RX}eDAGe>f;eEj_bZ82dZ{QxDm7%+N*TSV=B+B(vtBan`p$sTH zQN#EXs=E(_$TKSk{C9GA5HsT1;R90yY*&7HQTcj5j^5GVEYFX5X13ACp0YXi33ag1 zQ?Oa<=@Jko-Se17P@eHoj?w9WL~*~aCI#?&BN%_LGjGiup*S54s%o-n)(1h@kOG?r zpxOWo+6a zQ6>5WZ!vGKAMC=;dsGdcm$M94d)R~{cW*T(p5vc4uV4~OF1Z@B#5o&guMJVy*LU@^ zcMuVj8VW(6^>u(l>7TC(RIY)`I6K_);H(r&&&bih7$^X2`+D#|#y@lX; z>5rX*=_>A!`!1Sy<(|=SEb*BcW}>8af^0Jh;buWYu!cp*?PMz6^2p~CdW&G$8>YxUTPRQk_z&}Qf>(9;NhcpLEli)d z7rvh0&OhU%`1LkeYj4( zdp-gb8*W-D@M;`rsCBur_Mg1!FXjO9={AvQ%kMM3S+aPWW|Zb_IzoEQlJfEbz$oj# zqTlM(?B?wD2Lugc60)=n9S_`p%K{jUi;S&^HDZ67p}%pxxmFP9_d;OYE_&+oRDVvz z;!r00xkl`yM?|gWPHtVurPyHFDdw#EftW&6Zhj--Wpuj0zB?pm!+J`){>cwo^+9H0 zMWau`FAZKEV~E9>XiHWk8fBSc(?cC?>i@JrlQ(8fyh$ic8NVnr%>bcn$1rE|dm4rH z1>70#9B6CES(@4SmiS})UU_rmp@FC@HJ6vXrGp{)(6<8~$jRWh=D0DB+PrH_ICdpUv{C(++Hij!PS^C|1K3&Yn9>4CKmR7Br^z!|N3B3xFR%3e-To_Y!$Zht6 zO&_&eI&pws4WE8QCYS#bF;)yfS~f+ifBfP>-Py~c(Z@>#P4UsW9`dS~HW)o4_-~Y{ z|CCf}iw;3$czfg|8@(dGSNj%$`RKcN6=g&3hWR<(L-7vFhr;gL%ndse5)7a2sWt3u zNZgg}Krg4FTTsHEU{WNLrJJ4|O`OF>4>pFo<5Er1?3ylWEKJ&@?sk&Aq~Xo*wD? z4)m+-8QafPq3PVh5S!Ww-Mh_EUCXYtjGHrLYOMlvk?=_gw-f#CZZev~1g zD${onJp*tEzHyZcrIXeEVl@7Mi=k2_~_F%mx!muqtW`g z0c!bL)zPcYIb&~WMUZBoT71)4XgQI5a6z$-M??NA8!z2vH{RyJuD;ds#S0?C8+RnO z%Nxvk8}D3|+=7Xx{b&!HcCf>ZXvB%bDRh<^-f$VjlRB0K`(vk?$(l`6K8;HX=}#K8omh>b-v-nJnAF>9UMBZc`2_x!<% zJ!E7k4tT-)z5F=|u7_d5VU0%+5;}y0bo!ICXd|wtYF4UJJWMG4>vtq1T+gnP-1d_R zwfzW|GsN!7^@#V22X);XZ|0Tf9t(NxUk1vMG8l$%j>RBhSJ58M`{)WIj#AufbIdng zmE+AlMbUcx>8(G%0A+Ny&iHavwAE6f%ttxmYesk-H;lhPB%&K&xkv-$_Hid`h6dw< zl7xu%d0UiERqjJg;2oS&QhRyvM7jNRYrxE;-;kHiHY4x^e(gKQo7nH#KE4O%=E}hc zKAwoMmhqsCn|zL+{;puApIrgT6kG(?;8)S5_N~0&Sc zw};j9MhoiNz`?=INLdU`-B!?({0QsqHy*U@ZB#&;$r`KcLn4M4;8{JS;I_}=t?H_0 z*9%dmk+#@MiZm#b&@Ssz$=y`Z+ECJho#}Fq?S9o5%R!ewt4Z0TB_bsa`^n6&R5jRoq&NiV_*6C`IM2u zI}Z~SGzW_!q*QrcB9(o3jvp$wi;cnpx%Z7I2eg|qu=7H$eWxcqfEBL&m4EW* zunFr;$&7XFpY;0?VBxixBtG5DYSV9}eCId=gPME8I2z+bXUGb3Kt55TG z#~tk9Nr)dxqyf4^zn(AhaMapOTf*+$$-UEe>D~Ot7|LV-4l&=VjU3ypmu7`d+?R0+ zR2Mx)gb_|i%8x7elW|xZ2{6fLM0|GcA4NqB9*^WL4YUu!tVcKn(htkgA@@mYEijJ2h#M$dIdDRFvE@72cM; z`+fW8HZl|6)tl1cth*idyf@0{kaOgU#teB4Qq;L~NN0^7oA(f|=lnXJg4RPK9C`cu z(1WOt!)j@dJ*1PFPwkEt}}>UUh!i|ZoZa9Ct2SI85 z<}C(rS;vclr;qj&T`jR~F5{fxf#kdk7PH?7iP z*i?8tl+QYX-{Sz|?*bovr;nR-`1Dq}2vThOFn(MB!c5@3!oH(<&MO2xUc{%kv`zwG zCu3g!`b8RJ%*C()ZN5b^W6S|cQjvw>7JMT9UjDC1i-IXpj+Hg>O^WO%gP4xwTiowl zUaNiOtxc+nYxLapF!9L!uSXGdXW0RJNxI$dy(j<|fXe5l`{dUy%~j_r&s&Lf6sz~= ztJ0~oR$MLV)Jo>^owxld7V|yC10vx&+cA=9W9?dJt_2Kg$4YmL>sp>+yo_p`RS!be!RIL=it`>b>35}1>-SdH zt{9h)nlbyA{r&5N>@#yB`b7R^hA9tLgV7v^f8P4N%Y8{(GQeIb?-H@I`ioJ)5p zAdTZADbK>-sBzJy#pF(pm%A`%v%+>bp!d-@+~_kuXb2#l^|}NETh{EvD%3-(HzBVg z{<9_jh|nR~@{4mVD0%xB$r_)=Nim*sUx8w=#e^MIja_p*3YXYWff&i6qtG9zKGA8C zyJEF-edlrDb>hO{?d$D$fNfyB7lEtPGt(iWEE2?Fyn?#dv=Lm-=lIK#DEJ#pyg>Vy zLJgTrI=C4zB_v)uktmFC8>3DhW|Rf z{{&5uzIgWFK2KJ`sTVBI{*eL{z)(y0{@UVSHb{ezO0(Fe`g>bK^7Xa>!v@Nn-g;Oi zH%mz$Th5;7KP~xYQqr0g)=Cw2pYlalVyunJ#wh^%^0uNh*if=#sHRSMy) ztLE)K5TcdhW#b?@SGx%J`164~bZ7c@{+6eQ^5&a#O{J$cw*-nR9iH{iQP(SCT8j*6 zlqFMh+Yn3VpAE^tF1}dDl&#Y|mwv1=3YxQSGU`zA#w7N#wCq(m+rH!Ts$fTK51Z^W zs1*75Je*#js2cr(zWQIcK*`K)Qh+28tDDihoz2f;Iieb0#gr`Z89rhFQZ_el?Y-Ks zdE@72eO|Df4OeL^Ui(>h*AsfRxw&Oe@z0U)!)<=4w2i6{`aRA)2(}>tk_k; zEMO)ox#{8kKWq)ca*kgH=Qaf1oV87MFv9nS!>r+qjlFINWG6)He8vZVwiu$*Sjm@RKo3Z&D`~3QuAZWlx zbEmuc70x3~f&R3jQtVHF|D44*QvJtq(XRnHX(5c?U+1*b;`F!lBT$S?U1O(e} z3FJ=!5isX~gLb&-x;Mm(lZrN|-ShG<@WMwa-o3iU{Qw9YL-z+1CGMC3|Y}K@^$WKOJsyI-CFamQF<3`!Pz78_55t| zp?X->ngLOAv%4NXnVHEhb>=xaoK(5iWcM0%~i z`bmQ2jSG|DG`Rm!$N0V!W7f9^*7|qzmZ9R?90h<3vkXIJ#c^EbY}Cr||BSN5&7w|9 zUCVwr-FBfTDDp#DP0|7WkCgD|Xs3G0QefJ`BcEED{1sdKd2+nvHP0a_lG~S0kA$>o zJ^doz9zE8rb3C135|)uOzME>@LHWE1#dDf)k#Lwq{76b<3r{KPPBgi;+Dl311GgBq zsfvUzv*W2|ma14r(+W-m?UOLm7x$kYjheMDFG+BZ?Wg{HLnr9PReiJ;g453CvVJGF z!8SM-S~e6nm;1&lP_Oi+zCod@8I+$_(-t@B>dFIu6{Xfi*!h`gt;2?pw)+}A00e!0 z%ql3kiCu;%67C`fw6wL3*ahNzlv4%j@{#kL?+#)I%Ri=irnM$Fb~bJ+f+!Sh^fes8 zW#_{>!5y+&ir^jdc6?n@?xtf$Jq4<@n8WsGP zBT4g_O&`6JZow|jXVa)NHcql<$FoABoZzFuk zKEdjCZ(ZQxWnYsyi*Y((En|eimR(bmL&qDmrGD}GQwAndhRvJ1(5_{^sE_XSC{lm5 zD>7!(V8|(1CwQpCdzU9oAi-wb1+F(8_g1mqu=Y)*&Sn-+o?s*^@#018%5A&E-2-i=<5-D#{<%S46{BX6(mY#?7Bv zaadoR1b_3GeIBo8xIBBxr(Na|H&&|8d2Ig5d>LsQSl87otKzZ$WcSmy_rCJLo?h5d z9HMIZPKAzb=E(=7meWQU(+*S|gYM<5M(*ra7xmUp zA#6{Z-Oet67XFUu1BMjU;(@iE_4I7ev>hfq!O#3f;`f+BohAJIgKE)DDD@**$#%U^ z=k~$*Be8712qsZIj~L01KNVJQpmNN5&eAqSc2@7(zl;?QrH6d;XxOsdvpAMoez;Du zeXiN9&PAX~l&E_(?7ELqPFU)BRix%F8n^Vydin#34SY4AF zXqO)!JuwRG0z*A*-8?M<8+JY{a-Lc-!7vg;ZnMcaUF6voE^#E*wse_zz{ciXhTy2Q zpa>~8`G`+gAChdwZ6mnnuR-D~pRAKRLD%v#1a-yoP$J(xSw(>IeMoB|yDi!VUAtZ7 z`*m)iD4X|!M7zc+E)NH@{2a2dG;m499V1+#H|8^*aPwW~>7cCLJMfwrN?Xj$Tn*Ht zHcB%IL8_T-H#6lG9rHUq9cRm$+7^-rl!=UK`$n!`1B#0A%OZAv-t;Be*Zr)Bk%LYy9a(2Nzs~!NS*2Qv~UiNduz*+;}0PpkdoO__?0;#7gdNu$6PR-`l z^({O&Wi`elY+8n8Lq6fOKDyU7Nvy6E`*LhDWxEJvH{p5%AU1D;E!$D_+d>LfJ>oo# zk4s4v+)rAgj6?cajeJ5NaMzen$VbbegpV5%Jyz@Q7_pWl; zeF^AEY8cYHxDJ)N6orZ$8rCLkD{Xgc9Q^RXBa`VT4Z6W2dFD8Gc}aP?f~&J}aGA4Q z@?>X@2-hBMg-3V%0LgPbu69zzbpi2}SUuM32g#8ulr^HK{dtcFkKWjpkOD1YCg8hN z=zg>wZmY?F9kn4oP6Snf#8d)XXM@&`WW)RO2j?qCb8)i@YEg~Q+98j`F(@7XTq&`{dEfAh4{hMa`&-q6f+ZXOMd&?Y()SU%(N$~ zx*?9b^NY_sQ*%R6Vse9Xbo@VzAD@5LpB2km=t>{l&)RRgO~^u@!L)5XfD8)G&||Z0 z@79KG!2yR!vi(jA+5z%LOtVSvol)1Yc(6?$CU60x&9LAuXE4>jH}%k3&wN_;6B*hP z1^LG?j7>Ps#&r@=arU7V%j}gmR!n<`Q%P_4`g41id$E0T z;i^&)7kVSQ4^o=5wke=S4G8GZt({&P*q;>SiSodgaEIdu1Pb{hC8{Pxj;V?!IFu zE!aWT9Bj=y{z%edx8P?J?aSFH7VhY6C8|^p8^6%0gsd*(@9MzWSFwmaqMNjW_kQ*g z;*U*<6a4dJl942&SFEghlaMg)zSyYB3(R4YsL{ePnZShO2RE0w7qLmcWG+pwo9scT z?)Q`OD0j_Qd)jg33duFlI(TMq#XoJ^m%WdJJby-L8H4QTzqiY(@Y~ppe$Ih2ZaQbO zM2YVK9WhF1+eH;#f$Nz9T9PKPg28!sB8{OjiSYOS6Ef*DahDA__LbWENImOMdvoV5 z{a;zqvZQ`p$jJ`RExFU0MrN;X2U9^%nEB70VXB-l9tP8mVqIud8jm zBdD`jFFT(Y89Gfs+t8zkFQ+In-uQU&5G5V2dKSuFmM$baKw~12S2%_lsL+|$f1#Mf zyOsti{j!5j82$TxRjYEw?SKkTA@Q0tVTp10G zJP$6iiSXW(=d<5*KK_ii8G0^8ILRX)e_^mk>E(U=vClR>Z+rcNqDSNQZi!QzJGXl` zbI8|hzPZ$<{+u72MYz@K7u)!$KGvZ?O!`DkL z4`~ZLs(aL+az>WI3z?loua=s}2V-_;@1%N~rx2dO!YjS3+`{kOjSdW>@kew_URcX0 zPu{J>JMfOA?wo>K9T)Y@^QoyX_t&xc9JHZd9t-c1gU{1zcSA-zY4)O@>8b=SNdg zXF<|Dp{C;{*=c><7&CP6Sda)*4;G-W{6>To5i7s>GM!jM+*FN1F-4fv*xoEZ(GeqJ zEM6-%`5LvA*6)Ht~X0+DAS6J-G@ti+o z`+Im_i-H7!3x$^2+Z2aG8@o>E0`o#vsgU7~Ec1L((6F@VOhMUxK3hDSEhS@qXTocE zMH4tV{#h(78}~%~kM$nPj?S5T)VhiqE#}QS^Po{5SL#`d+yS9sH5|*xJ|KkNyq6_> z=QyD70iW5+Cp)Ly(|41Ww!`+L4SL*{#(MPGPoE|20Ie|}(%w4M@cELSJuoX5in^5x zU0{uolpc0yD-)NGuGixKn)&6lFt|U5(6J#Wsd=OYR#O^&+VV~P$3jszUYg!x&v@X; zx!XKx7^pDD>L+9O9=D`;4Tij#IM7upjQOkt461kuvUe?p3v^(hnb!?RXMdZ;gA7^p zX%?CokrxDpxXq#hMpNvz`q)EZV@d$ir&9-g%o5YLq)w*ppO4sHXLPuHZsm4hKS{}%N(U?w-4CDh!^1a8m%+kBHxb_qNqN- zzJ_mh40<~5l2+CU!R|$C+5U1dothq~V|)+#%`Gk4fXE~@H-!5*e(V|Z&AyqIw{y}* zTUC&PjF33z%S~3ghIZ57v}qwl-Nuy6lNUB5_x-3UD#Z2+xenX1&sv)|Q}YtHov8&{ zlzh7MNnU2=pS_TosJ9GGF+=SAlwd-sla{4BxmcFc*bb_%AZ{m*{8nOh z@g(dglJ&S7Gbi{~BswP~puD{AICV4ZxH0)wQg-I5q@_@c0;sHFeMDuji&XlS;cd%( zsV~ZR$G0Qdtxp$%gX3IwG~$m`muGQ)OG2L)#fOY<;V%#?Xp~dXC(hW02v1)vQfis` zG8YhVBM6g$p-=!zIa3c2JEB}rw?(P5*l3QMiet^inH<`mqwR+(LkCV%l2D2RiZ9pD zrpDB0O*UymNL*aGYRY}J{=a&dAU#fR9rYK*m-E4QW{yDF0oPG#z8njiJm`U$0pxAA z4$GmU-&d*V#IRecjFI6oy_f>u1N)iAV7pprcy(EcS=XodQx_mzV)xvT3(vD zofn_IS8A5B+vaQvCirEjrV{f$p;Y>|ah{eh28DdiZFzKC_$C%k!1OdR?H#|jaxmlj zn4-$UhkQ+VH4CrL<%1Ju_G9Wd>=_N@Jvd~^MJf4cV+-@9d0_KvgVJl{Ysbj<4kZJc zw^S6dk0e0Qrk^EARF=XGMz-)zva#FEvHv^UXHy8b@l>sD|j6ouAP+HxXr7>*^!6*h3>;$9wT-x_&cA z)7fVPqHA!qeH_`NjUSvuP}E#r7=xQ-=(n;pM%K_Akp+PaL=G`13)Uq8`EAP$X<8#mWv|FWr% z4)G=Ysi_v9cFafk>BW&FzAJ|sk3LrTn#_Qv5-{ss zi9I}$?lBc~{kHxUF{BtMrwzKw?!1e!_eu6=T6+;$MFZaxsgF(>*c=Ei-JeH|tw||| zUcrNGD%q*z`at#6*j5kcU^AaB3dZ=+h4THG&lfcG*h=i;>ox`HZ9$gi#mwootAv_e z^E`;kBZ7kO-VxmN#$1%4^A+zuVUfTilDx7C!dU3ZPC4B8*(jzDInfEpL1;&8qrHj! z9XYZvHq{f{*gIq2p8OlBj2Y8L4JpRccp!?s6MBBA1O_uFs*b2=JpalXD|DaE$alKx7pb90|xuqrSWVsMdP&=@Lc{8JIxjc@$g#p}Qjw&RdzTJsW~G$1HinrDog zS=#HDttsM@h)ebO)!4x~Nzs{RIF5(T!`kvw z_KDS9Z7sK?g06$U`R3jw&4XlZ;0b0IJrSm$uMTo>xwx-PE2ktfj)Y*JZshC+F=T#- zMhdOCIb2KxFdv3omQ{HrQ?C?ojss4#97YPxnr0@*Wn2ho6SME@-N||1+1*X>5n{6M zrBm7jgomRbLSKdIbKw2%30rb!<7vj#Rt<{>Xu3(sO4 z1`SBJ&5Esv+0(_)qbKasRfNlvMh#AlY0V8%XtjD5KbYzd8OO!su%{53YX1L=iv5Fu zsm~~Qa)z^e0NwI6T>wv2tBlUMBtYO_tBt&!{EUBZf-Ghf7WZSJ(UL8z;96mlh!&1o z(cJsFdf)YfOZ>~W5ajc*1BT4@!%NrK{ZzU8wNSKb`c)!#XdI@AOA(RQ9@Y?Nc5Otp zQ^jum4k5FV^O{kK!utMhk(O2~e8|m&G7@!U}suUb1Q-nYveOD-30xZ{kU7A`*urNWht&v zEeziokh`}bvX{(EtRzt^WWji0A^4!;b{+HJr-al_T9%llgEK;Cz z^k6g2?;HDemGYSina_9&N_d#Efw9qTr9h0e@y+aJwD=%qTWoxvi@|O7KWOgXb0`MG z*fvx2p2okGl_ga_{!9;0Likk36*ou{`;e zt`a(?Qfj8RnjRABYg`psvXFfLH3TQ%C%C98iH#@s+szSWKZ#A9m^$h8-2NLaH6B%V zUuZc|t?$ut#=_9)TM)pCQNv}m4W+~xelyACmDeyRE!*$`*`p~7Z3jmJTWeK7oy0G3)2loL0{etT2&r2wm}JT8*oKLu3APU|x>Bd=TquN4 z<<3_m3b(jAZ7?7je?cujj!8?rV==F;(^lTy1z_6`Ul`VZ;kf6WepGGq*pB)SP4#gR z;i5#K{FhAt7^5$)#|9d<==fwC*HiK9Ceun$98i@^gZ!l%fHB;XZ`LC@UR1Qq~M!pO5wtJ2>Q`-@Nqo9iY;2+ zog3&K!oFDlL2G|U&irOFPv*O;Jt7R`&rG~nI53>*dsKk2#3U1HWH-Wwk&9VpC|Vrc zY1y5ti#JtFt^p9nS3N_08cV$X1N`g9&yTbl=a3E>^SWh$eW6mtS9z4jjT+v8_Jrt5 zMWg-tj2nSh7tP)3`(Dqr66Md0aj#g3D7`p;)gqRyc13~mzn54%)r&x1OF`_R(Kb5_ zr>rSE)$s<{B)R&VyC;*PYd!kn-bAKV3;iDhR=MP~C)FL8iVb)r$TP-dY(!7js`c&w zCx{^ubkulMH0Q1h)wIv?O^xPDu2_5{&Q`$oxUe;P*r8o~81(!RM#ig$f@-2W^ng&*jK~J#z_*94FQgu|D2&pFwfTX`kDzOl4vY zOBNi#0wbo#Bx5(fsI?*X7zT&5C{fytzV-~X>xGTKHnkm&B8W3vfUHx6U|&2O((&+p z)g~sJ2t*4Kd?vH;s^y(T0cn4XV!i)a%Ld`fy&7}Hk=)Mi%i#gOqQlc@UpjckSg7M7 z=5LAKa;_3Sx(Xg-92riFsB&_Rcg!lUdVZ1KFV`@v47y>QngvB&H>O$nmCapS>lOFZ zdOIKrMxd>^8_Tmi&=J&(MGoK5iqr%$d&z<3Z_mtMPL{t$$(Y@GAWMRWD8;?XUe=_N zEB){|yuM3ITpy!OiS9x~YQBPMfJV-iryw|KX-BJjLtpe<`)EvE?83@_$2ctubX9j$ z+bicRbj6&EP)a%?NHUE*7)C2f%AUU=vqzfOgo5Wc1o_*S@E5UuKHHT2m@|Vq@Lc*~ zY9+BcXTj0a?5LpKLhWZR2MOCf!TE0W)rE@BxF2HE$%S!eop7Hn%?4VC!rJu`f@fcN zM(nmUi>+o|#PKmPp+GM%@H)az0+kEi?&@k^?H$78tk?eneSiBL|5yazgg(zymAkBN z?r2$HVK`NGFy|d^vr?!XDuKZ(A!YdvhQaD+o>p2G4VyByi{vWGZZDBWKG-%VixgdE z3jIqBHQ}9r$`eotsq43SJ--TUYa`1$qXI+TPB{|MD40+UM0fN@LkS z3{H6!iA&vdqzt|vp%PzF)07eHArWvftQ>?sptWOyzL^AOB4)O@A1Q8vvf>>v>?Exy zk?lj(v&m@gjH6T53t;$;pWV#M;+1>~Ssyk8YYNWl(KXU6JJdS&F(32PL0(v<{;J>gsz;+v|1S!IEs3 zn*IVlC*L=h%y2d-vX;?e(wVW24aq4|V%J1bmK-uM_sxU$jT)5(ZGI&4f&H&W^J>sh zue-Pj?LK9m-@HKG$IyXIx5FCDCHAXch3sciV*cOnh4&f@rZj7+rQINSGkFr_-ax!& z%%~p{U15nA^MYiUL;)=u@Iy{t_qBg&CRWjc=^xH7rxcm; zR7MU;wFF+n!RKV};N2V(H|rP3iq2cC9&Q_`Gcv6h2el??)H{XEf@Epa2I{nh;&blm!jB)dHZi+O6%8xR z5v$vmeE@1KJscp;?CXuP?KFHAj`Pm$@Lyh_h^BDgYKex8Uxw_G>v65{c6}o_a z=B0Q0y68fBX`ln=E7;Sa%7kVY6gAh167Qy9qc0%zF8fP^dP~(HaOOqkgXh%9<>`*v zuI=+u-4SCaX6S0&5H2tZ`WW4LTG+Q7$2sO^&EsXaO?IL+wYv8+-)sRs+o}lo^q90> z1CFdMuO}rM%FA8gS_o}av~;Wpl3NdJNlU^sp`QM+k{XziE)dzKw&+&G7?Wq-OCL%W)}@Fwje$!HODtU`_Cz9(AD4{ ztJmM=3IM-eLz{MvKTi>tv^22@$GEMUf3fpiY|(DSqif0_*H@v}xOS&av$#$V#Wm@5 zgrQ`g12?8UrjT%4I7A=WOLIFs<}TgdjE$Y{ovq)70b=ad+G^&0{~@^UVH-8qK?t8Z zM#Vf02o`F-GtA&P82)_xiK`hTA2ei!$s1J{56@YZA5v_bH{zO2jl(_wlHyf@#@WGhxVE+EqTpg+&w@ED&7S!lbS`&drwFH z38zQ?d^{4)YGA2Oo!G+WCu|XOW2#9vRl3KXi%pTicW5a!M0RcZS@ zNlIO>z;8Dm%H+n>ubfrGYxJYSH{;N)&Tn0&)oTj{>oNUyp`oHm2xmkDAQSQX8_M$> zc4F%J)FKCSBh9{<1x^y(^g~MYDlLwv^cQXhs?Ce-ZwZ4|UuMaxRgYT?g}IdlT(INs zWY4dL4z`jJ1=}rTH&DC^naBH+N%MP6{^fE_hq?Ce)@q1DBjM}IC@Hi*%efEo)uJ3x z7;P79>jYa;IJe*ZezoJoX1Ot&sK0E{h%{SMT+|7%k)VfrIQEcWUwQAt_@ZD@wfMB0 zqfTb|BF+n#yUG%;>iDIjKalXyZAdqG^SZlpX^{I$@qyB3{J+ezz+(Bk_DzpH$zn(*2*&knUC%_x*w1dJC&{1vYOYleyMd$e-ee_z z5SdCP3EHE|M|HV?iyuJDiMUrx6O?3d;aGjM=}wLec46+{jJvuKB0_Do9hUD#+jDld zswK_2jx-A&+mV1N8@@aQat?Tb@$bh4sm<@6z5*=72=Qa^hj4I{*e+J(iyqzuMY=*6 z+2pJI*z5oL3enPX*$1ON@y?cP74emv8>~ilhniLKW9?T1v)@G_v`N?N?h;OYFjbyS8?-6 z%7~7vS^A;|u{iCH3iyyFSVRptM%vstqH5ODfa{&-U+-8SYY@=tD@#tPc(#;FCD%9;Gs$JQiBs?K18Mu7((tcUmEV5xgNH4im8Fr zAl<=eczQ1K*JZ3^{n4%U#!6#ORgYX`60rSznMblqC{GzzLm9^6dO6y;vA?aCZ@K@@EmiU!`h zlvNVW$S`LgsYjW6Qp~WU!e_D#&AM>J+2F0(MxVGb2MK<=Za{beOPfikWbd8saF;$k zpIBVNeyGcPgQC|tAe*TbR|~)zh`n!6?c&8tY1t1t1wCH+L!;`IkJjSNB&D+(=4WpP z6a4QckNInp2Uuq^t-#(Iexe!XU4Y**b`L?k^s3r>*!E(t?vvDjA=Skr8jh-g{y;MA z2_1GyI9(zg;OT^i*3xpBd-pW9lePHmhRx{Tb+7%TeaC;2|M901LHmSujYS}Ly#QAu z@2u^+gQ*AXjS{7#a!)MUeIn6e+h{--WL*1kdkb@o{YYBRyijCNIk@)C7S|)y7bUZi zFGo7&4_eS$8mQl;!@pyC%-bY4k7 zMtYGpIYJA)@w8A0WOozG!?S-a(7%10_9x)L5F5rnYRRfC2nG=pI$lOAw}{@`hIo?> z^N%UN9h6xxn&oVBQK}cVes&$3aXR0wws=Mz_2ToZ;4J`VjETzJ-Bi`;35$l!GE%MA zIfYkxGGF)-(w@ys_qNI2$0fYc)Wj&PfQ1vb^m%K*HQvWt<7vn+e;r_qm)-l_3py|8 zprXfC?4ZSoPD$D|xi=Nlu#dvG-mWI+73QO%U%C0)(;Q8yd*vwRD{~pF5ioC-kh>dyAA<4s9;DV2ynvy zBopPS+@_G{=~Res@E4a#Hf>pOKQ7lY7G8tLA^aY6faf3R=1TFH3->iAjGLwrl*Tj~ zI$Zr>H;9QrT|l7P@KI_d4=+%`q^WG~2Z?3(zWT!MOxS?D(s-kY^r-9 zTzN0us$R`##%6bJw+_?b2ZTyJcN~*abvjXCWTV58Di9X5hjev!C@Y>`e5kb~3dOc> zKPl=9|Cm~z1f5{TNKXdJ?lm|9n0hVz&38VPUNoTU+WsQj)zXD`DV>t^w3RIO}oBSy8XYuvu<=9}3l1gJ{E?@cqL zeR19C$68+F!XW>ImLljgzG|u8OLDIL@YhT(&@NcH_T2tI2@F_~a@0<ukndl6JlP+T&_2VA+Eaap`#)MtYE@b3^6_yo)eVn>kcr<>PuCfXJvYfa>pLJ8w<(n#CtOU}X2P>duOiOEIJms+t{Ae%X%+ZqcJ@dgE?lf=X(?lDcsBWL1s!VY(qZdrT0-8k@!SB#wE%3FnYL#<*i#VVe7%T4YFS!8hODsRqNcwgKVF2#wv z_GbnGI@aLsE&A&wO)mwQ?#M-vO9SUz2>bt?UHqgJG%kDJH7*6g-#)tQU??p|j+2N0 z-~~$d3o+HJg}b8mmou$&9w2Co?j5)m~j)f8|0U%GpXe#n7BtJ9^LPhh$_+CUdp zn)boWB%*B`bI5Qe`-fwb+$$0P!{2<(=ylP`v2fU-lNB#Hn|-+$;p`Wt5cmXu@k7~> zNx7hlxxz22d09asbEl$D{m_*6LyHw1IZX;yIxhDMNQ z0qBorK$ER<4pSDv^Fn(OyC;%!qGoc!TlxL>cD|cDH+WC`uNA@M5NgC^axdwM*54k! zMrV+{A`Zcc=M5Ev~H_|2g9MuAn9Ay&xICzI@>jmH%7 zma~o^X2RiCtUij<3uYqLaK7-|;Br}z-J;=T+GEd5_KdRtdKjq%r8EFk(>MiiW^N zSJTIe5^UV-s#Ri0RsR)kvBspHO{5&>&5w9l<{^+M#fS+NbiZO`$2jj~z~ycK8a1DJ zF;{#j;hFF!e4KYzp7H*(!`UDIB+&||)h{L0CZ&XE^4p)I2TeZ)!5gm6GRZkg`nT}# z*aY%3YhpWTJXn!7F{(p7{=tZp6MJ@R+6=3A>v5*3%ESA^u(O@VC)HbgCteE%wX1!W zO51xMvm*!6dmB}gL#x!CbqECng!F%~X!QgZs&6}V5krwbMSU7e8Urjl4G5kOsOI8~ zFQ4V9c6uX|RgqIlw|Woz-vpgnjL>10@7KvN?zbo!UYG?tUwHZwiVvx^r>$lW7VU?+ z*IbmoP1W|UjVS1e9~cgU=hwdGfr?z-ja{sl$%Px|&Aw36nrXsewe3~IkJ>{$&$_1x z9+N7alTI8IYrs?&A^GSoi*Z(%zHQ&UUu6DHvtX@(cev%pT|{OjQ%)pPZrcevdyi|I z`PZuaXQ))|sKYm=lISd2@b47l%U)M#B2#MFayvJ?haR^*^djoLG`oW?$dZ3}ngx<2~id8xKl+zm>(9(^`;*p&VN3+f^lBu%&H?o+-JD z_|UCa*Frp5=97SKRbl2}V>C_P$R`)%BXO_N#m6=V;5;$TXSycLkHvRdnAL%R-V#h6 zsSLgF475C~$rtF7@fzmi|2ZMY3>D!2nWhFr9>jd7RQ^WuxJlB}A(p(R4KXa z6E+}Gghpj4u`uv6k9~$yrdjHi1%cc|5J@GX@~+|oPX{AX=g5@k_W(rn%tG)+aC-ag z|C4^Z!v9d`({l5>@tYQ4@*&6^hWk8tm`H%9bpX&bfTL%$&1_|midRIAyj!6^jCKj( zBx!xaa6>e7DP6a+4{wxbF!B&(%9i2UWN365GGeoGbCX}Gz1J=kJp*OAS!{5YCfgcC zov9+^qS*$}!dOQh_2tYFi^X%ejO;+14-MMZl^uQxg&mCAv!ATS9Q~D(<<8wZ@Jx$` zz{LS~Yjmt{MzYf!pRjK*Kgeh||fx;~U`sjGC1yKy0Yx7q6>u-&js z9Xlmth*VvaGk&;65T&j5724$VL0DGEM+PRasmAmG+7Ttjh9Z`9A5~x*J5=Co5niiG zX1;OKumI&`_~V%PYc~6DO@M;o;tMUvmjoh(6i-S*|ETXzNsYz46Gmjo=9+e6T*;Hp z*OCy1r)U0YqUR~OuCwY3^|v>E6r_SVRpIilW{pQIvbxmPMT|(!W+oiT$`2vHw-z#Z zF%Drn4R~BIAuO{l$1QVbz85cTYGF`2_0%C4H#E+*X%xU)_ebPU2!_e)72m~6l56Y= zw;b8I+)|0ynJtldrKHRK$E^Ba;#nKjZQgg0%$pPy0rJ11!MJg?VK2!N=+DX{W;!tP zM|(nFF`1)kkip?nT1vt-GS}A~E$?P4r4NqAy$0G|a_);~OU;=EQo{^RTG!P^JzP^N zQLoS64K5T#_LZEr%i``No%0Pjm&Dat_1^SbWG?vb9tVzG0a;p#jnn*USs%l~pS`GK z>-I*7LByA)D}Of0?~Q_HcG-i+L7LYF+zL~YF#@*TlAkfmA)Q8LfXhiJ9i`}cgI=vw zOxq=ViqkvZ+v&_69Gzdb+s(bU#b6l+xH<$+nIlmzeh}X>`c_%>9pQ7zIgfns2(sa< ze}hG}u8~g>G)A?SPY1PKYGVz!=d}#yb!Sg=2bf&~a9I-3S-Zvx(1Ibu^l?mBm`&uya zh^@*doZVe`T6PB+3v61n_t zM!bgXhN_FI;L89PD|z-g)(*|_gDOQXz?MjBzNt$)*(Js@Y>EtnPPqCld&0}vDRe-apo>EQ*dWz-h8 zpDkXbs>5&M{gs`Wf93dU2u^hIZdQ77a&~Q|yQqPW-xQl$I=x6uo2Ixuzhp#bd;hVp zA_HVK%-_Q^!dd7yhLOD=i1=j&!VjrG5aL7&a969Ct7BvJsDS#pI|`-%=O@%Fgo zgJ@0W!H&c%UDti_ebs|Rj~`pd^#{_xK6TIiV!}Xa8+Lk8*Xpir3>{Sr0Pkf6xngA) zjWln2b$suu7Eu)s+mHvQn+Lp|$5wo?Hocjh(T4du6Qb;VEhJ%gIJRNlm)3#R?h#3y zQkkI7#V-(Q{8EYJkGuIFA(~V7QR_@ca^Si4!1MESttaTHQ}cq_0_t7*+CMC)6ziksR3gY!yv zfW4ad8Y$kK!F86j()jI{RP(m1SxTpen#UnkOTd%OW@~nT>1~>8|F{yIKC>3jR?B6Q z5nK;U$bRQyao^uYTM(V~SCZg&2QdDZCK5gmnwqj1xEvU<9;D^pl2Wf*s={s`@U3^sgi9!cu;d;*GM$oa0@ zneRGBQVX-ggo>Yt1HC>o*KW2YYvhgW&)CoY;@%35fS^H3vfydISydSm_fBX!bO~ z!6WQbx|~j(0qD79JLokp*KIyDrxmPqV1x1^k~r*aFW)`BH+EFlwf75kA&-gUOpQmiX6=U*%au(c+q5jmQOxmP=tSR$&!33ZqIIWs5w_`th^t_ z?C18>&cC5&n;XR4e=+KCks95t^*kKfoY>otds;H*VQ>?UU4UUda{oeHUmJ*AZpR0^=Uld8HjT-tq z)K9j7%lLSv3QkVc+)is0lr{8m4~b}W4K9`ROutbnX^YFUTKp^J#^Hr8KqQi=J0&yH z+Q|5MpV|f^$??Cwp}_dxqYw;B5@wYxV~hwL`;0x*;VuMS+0i&n06FIe*fCuas=7E< zEz(t&_4SG9;Gjsei$L%COKzq9mXHyb-@Uuz`JxsV4IRu8d=eq~sYDTK>jN#wn|Mp- zy8K@ZgE9MOSadZW;gu*_Foo`DoG2h9i)>R|TEzG)YNu+F!C5tLV*TRmz#fSCnCecg78ralF_h>$yui^oXMw|b;GrR5w=yir z1@p^0jNgGF|H>~D^Rs+;?>5s~s#Pg)ueQ4pAkwz4bf0{ew(k?@R{&2LA8#wjsbFF zGqtKzK_(sYTka&$X7-CBPi3TN$OXy9P^VKjDJ|M5LPT~ zqE5nd?H0Rw`}luuZqfxXlO6tX|MNnc0Bv&$w&tt16<}1}LEo@R{`|RM`kjaM|VlV zogjEVe#N?GoqfGpDC|JIHkq*K-1h;>E1*=;C&fVs^=Q;E8}FX#aouG+sE_WV``|#> z)G+HddLiX$U~D-2YL^g0f$M+vRyDw9{KM}9_IWPY9fYMqS1QvQ+u4eSIph(6c?;oZ zKeUeSNknUlX+!is*OWK73!x2HzvFyPw=m=ULIzVk=rbzBPk`@9(frd3=- za;JK}FI@PX3-CitkZe!A!k*Vr@@nVw)%UvVt$>a*y@gCEnlrfQTDWyZ^H1E(KP8Bb zE0l#2Aok)+%UO?A0_3O09x=RA4hn-a$~@IR&<*=SeAYm!hV(#J%IH9->v`h`Q*wu% z$5;}_7gl>!E-r&qw&VjFQa=V8S?Vk{*O|+YSCgKdJOM(+W9;>_dA70BUz9TU&r?;; z)`?&TbM36FAJa8{|z3yO6h-JZ146qIL*}1TFhgWG$UxP2q$PxXy zLD9G9pPRJBAJ8ALdgs7O-AW+*YcXwClB?6E0s5T*-DnyvrMbQKwF#{2s-i0=#BVYs2>QTND=*fV z*4?ME);%nv855>5!<~5gM7e&RAWEczROyHk zK|xW94UiIpN+%R4g3<+~Nr#|Fk)m7)I##p45>)evo! z!#_YWH}}U|OaH0aylPL?vx_74$0IvNAjuhdeD*RaOXv1oQ$?O-TCCh^MQq^e%yN7H zkKEO7S^KULxK`GJt5HUoqJsU7H_`7XA^lLiNcw|v%hpAdVl9R6M=jajkhgVF2ps$k zthqABoy=gi-=<=-tv)`haEg}t7qA$Ru)U-urxROm>-DsG)^ua%3OI?;%rn@O0q%Y{ zByGD)cr(BD!o!F|OVg)^14nGDnr37Di88SHf*`n)Zv5J`P~dFcGHI`}XTiW>xPi~O zyVIc~v}feM;uGxAhm<03f#Pv`}GoK7f*7*@>sP znmq#${udfLdmbquek+~9bPKLl>q>$h0He6r2`|X2U}l*&u8U_fzW7Z$c(!h)nF*ei z-H6d1uAt^@%(-G-k}dwjjkqq3-}PqiIt>*jKE*#lCFQE*N?E^e9RY;(C;t4Mbj@gKsN0j@j{yfD{U`QJ z{f2{>?(S}$GRKzk5yQz7Or5RHQ=*Gxh|l3JAc74{=w!cOGQbAtS#if z!)oykF$&?d>&{Af^G>mz#ZbhG@AL8?=$5npf7R}o-Q1!`sVMzk01fWq9=Vh&bQ@dS zu&6Qs4BZX#8+Ih4cFP%LVhVRvSjLw|6)vTur0DN=-Tb!k17`Q9f7w|*hZ&;vyrdb! zdh({#pH*p7`P|2TIX4xT_)p>ZaN6CGv*7QCnd1AQntXO4L7&0f$b91-`FgxZ$Q&`Xp{L{69!%Oq z*t8fihyXNW+iG?%$bT2mEPs`5-IFM2W5x4MHn`*n&c#KFMhYmHNF*!@$RBXtIEI=z zB3$1t`?c)`-(u6PiLuNb%hX>Ug>+`)2 zsRI^3I)MwuRXEhdYuqMg`cFF@qR;-%fdNvG{AUO5ydcmTb9f7Rbqg332saV}#q9nG zgZ^W;2ih(UK$ef~su~bAwp~pJ;wQJNA!g!5+ZSI0`Qx{%7X*PQ;+ww&pGDOIz~3}e z{;^cTwq70RbbC29;xy>>5Yb**LP!5jE>oX13U{imDUqZ_GLT0l~Bd#N{B670qL%^mnu z7)%UDN@x+A31DVZyeY$VF1_+2PncK`h-)NbuCmKtgjF%}n5lFrXr@tA&69ss4i_#_ z6cSfkYBYZgzw02~zr0qP2`*(FPN5U$%@f9o{BnoU-u^4AW_7S|+KszPGG2csR@4Jn z=sRWg*K;3!RlUm~!$WvjU!OZSon5nh2dM@!Errjxe2+-NmcT1P#7f?(%t|w3(L}$3 z<`)GgtISTPyNTM;RD#h-D=|AjZ|9KDp2GI?5K`h)SbdUNEPLAZrr?aE+A|<2Px+O3 z?a}fXH7F&ShOJ(M*$FS$ZBSJS{tNzvs3uHVcc%kg^=%~(%K>DJBK{@Zh*#c8=d@rZ zd<$Uc%1*AM(dfzrkkO#?AXnM*=R5(AotnNElzn4m#M3UjxrMFooS4Q@`xih(YL~)l z<>@D%4L=Q5zNtmed`qta*VN>ua-L%LUK%;GJQUaOCFF5!!C$3?JkuPCHA?@0eXtlx z3H8z&j$O%e6@5Q$v9SJea8TqCqRxy#ouPR~Tm|FGQ`vwaaOO-VA2T-@m1{W(5vNC> zS%j9Xcfsf4Q2e5Y4z=Ai+L2JCd>Jo0F})IlsMBY}FboT=(}7D>J_WnxKdgk}Vl5m(&pRGzpFqOih_TKIYzO zS8oD{OlD0hasD`FFGkSAq_K<@my9`rT?oLa%FYC&Q{wt=1vnlDp|2iKyfR;}$1XG= zONp(gYo;FE=%fkAep^#jJ9zSfa0pXZ8u4Wf&I-A4uyg^Wf-?}oKNHdF^=n^(p7Dy^ zP{huFmr8i%^Deg680edadUYr9E} zn0#)ptlq$6@OOa@_k&gi!i`7J{#_7OpD*nO!`ud|;0vT>>zah@J}Jp_kzPFukz}Ou z0P>oIC^7HqGbDA*NKKZ0B_i?#&hs&wo`3OIV>SN zWT)d0FC^9P4GZg4{vgwd4)ww-?MQGKN?D1srbItfd-wSTdIgs3h4wPvBfmir(XU-E zsKs$efDkh<;G_hkWlC;?i=Q}Jz?>*1!b3|wb2x)w_s6V#8?&g+Mt&lgs3xZONhEr<69wv4zhM!kW>a}~@)nq89 z^^PEsQE!n^yTubFqpEYO-CYK@Tbf}NecOO8g-Q@%wkCGsA?oW9rmP)xE4jN)b#}=n zbmos1D|^%R`-m;O7m*;F{^iGVks^%VM1pPlB~i3{#EKSZ-)Q-5*h4-!8N4)oJa?h# z2*qlgGvqzRU>{}u?bqfLoeXujAa;|-|JERH+vZ9j27bFb$bNs%cGdHLZ0G+M9{XA# z(4s7_(77+)`PTTE@?c|&lk{XGvUx$J{#)PXMpthqoXO*g!fIZ7qRI5(yn2a4#opQX z?i@fIQZ!@FJ1;6&Q!u#XpN9lyGV$|(y#=YarNoAZ487Rjh}Y-mGDS$21ziQZEj?bv zCichhz;s696yGS+NM;FxKp}4ca0Ji<$b?kEis?V#1XVUcCyze>-?&z2`sH$SzQM*! zr~qW^1{qzRW$l67KK8t2+i-7e{pUXhzN^9|<|wpNPmE4_4ts=)%Je@%ASalU?Hdu=}8@wu~ zN^$FC`j=|zM2Yj)Hu!QPWNP82I&&%<`A-bV(8rf^A!WnQG{5EYHR;WF=HykJ%#IAj zNI2M0;N)vc7x3HG&Hi76cl;MK`{!)!>plo|70*p2`ldxdj0KcME0cbEUR-#ahY zAuIlUIB}^H#@%NjHb6dVZLBzdMIqk zRDm!qu6OE45v69o+Mb7VmQh27yD|*N2gtVZB*w*kUuv#Am8&(o5e-c-TGl|BVzhhm z;6Xx7J$3;PD78v`>{x|Qh9|rt-B53{aQ1dn+yL8_z)DZtD~e(h!Npe7-G*3gCr8@2 zYsJ4Xs3o7(_;{!)1NHW3Jn6a;FYji(PKUmUX=|M zA_M4v?5E~sjq1|bzR%S(3Iee(tK(5B}WaxnW@UwA*&1H>7zM;FMgb3KD z5~IrDy^pwr4g{WTUA3jLuj<`e!E03qX3?&ARq|Wd-8cSY78y-0)p--_{tYu!vVMTV zqYZ}`iq6ntJW+PY0t~hr@_`AElg|yTV)Ny{9Jy-l^1@mXY(+|5Xr9dopV_OKE`eGf zSTGV0+`rp>R3a`gA&1tK(68wRt~xW~BNc<0Ym*i$i{s}UpSs(#=0eGAX|_EWbMcva zrFT%m73BWY#9K9UE!SJ~UGes3sMb=`f%a|sRvl{GlZk16C3#trqwu=|<|P>Ys~CR2 zT;I1BkNwa<;1?*HhT9`@fXvH?f$iIu*wg_x0WRZ20Ug~c{|`<37UBO_6Oj}DI?IU! V&&*nC8r-17Sl?W)T<605e*<5+F=_w+ diff --git a/extern/phmap/html/img/mt_stl_flat_par_both.PNG b/extern/phmap/html/img/mt_stl_flat_par_both.PNG deleted file mode 100644 index b78efe67af1e74f0d03ad58895f9d59a14da6577..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86110 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%0Dij$fWB?dbk(iWggtJOl!`ozbW99VEJooX- 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

O`^282abI$K_Cm`b<`PcI zw^J5M$$a8AI^4&S`DEFqUvWoj zq1JtzzfaHhgiHC)spbNZ$NyN~|3kJp(CBG{|MN!w|8MxOm!Z@5pZ`m&=o8*LIkO@C V;LFL3I+g)6Lqja}Bk z46-j{$Tp0bF~85KdwK5XdA)vreE+D4nK_?x&ULQqdSCDBeR_3Q55#j(qzo4X~F7$~$H`V@@9i55luRU$y-+{$U6WXdKNiQ};u5Z2Y$H2zN z9+)_fILc5k4fFYq>jN?)GpDzmlq_EnoXR|9@NY6o&Uqo1xey*y$|1UEbNrm1&zOII z73{$Fta#Syl}kl-gf$=igl*`EGS?Z#Rqq>|6{E(+mT83X98^duJ=Tw{JTeT zF>te?fT}Et=+xks!ho;krnL>o*vyT-; z&8=)vM7$w`vyNv1!yo$)t^$p@Q=+_G*aREvt`b<_thq^Hsl{dh>#>0Qj# zr~dH-jE^YR>*2_1N?-&A-?mS35^~D=gsB%d(MFJ35z1wV5ae23qxCcRJpI6 z731e;yvCF?sAh(5m~yWpv9uCXjP&_P1yO#-Lcm}aH@ zXCJ-Z#VTIdW-OkY`^YF`nf6&V1<@!^U-J>K%YKU(Y~1H^_kkV8li=xa0-yIp$U&t* zklW1pTXJ=Jigk*BFQuxXL*C3s^wjWBKwW3&F0QKc2I__fH5RTFv$1c~FsxhcB-AkP zl~M0h=*wL&hOE{by5=x;9#`KZ%9%B$JYKINv+w=gNvE~;B5?%GeHt0D;TA!%PYVR% z1M^8>ii+=w?vqthMYx-WhIQGcjachfnovB_LPJ{YoHfB!*{Y8H&kC1riYv49>|cUp zq4nlQhF0F>$v!AzIakE_=9U(TJ0DU)bi7BZ55*UkuP)D&hf}=wjJxGO8X|^{BEU89 zPE0Dc>%+V`TTi>C~a=T>+DhJ;_@!$%kA_nFBOuGvPWHV zM~j|9XMEH1rMn<%=6NSX)@n<;)#W=^$^V+-Tgv(U4XqOJF;x3~Xan}acEPnkZHUN0X=S9r(3 z>$~NfuJXKCZni5jj=cRoI}mP&K$9!;0w-F$(5Bwo>!v;XqzF5502S$?w}d2bs!q@)o~FjE+Qg}L8X7*UVjU^)icu41C2s|a=( zJk&mQ`42|Xq2Qd)st*-4HyF{(jI*!k-}}&EKSd%MwCF3c4_O_fm%u=5d6rik&G0@X z^Lv2-F^rAd37&$ib_E#6sY?4j^BSjk9B}+dmN%4(Dozh+W2uK<(UY<%j$OsQY@ZTI z0}Vq?B+ADgoMk0mHL$ej+Q!&NSok!$dBU&Wi}d8WoaHMNdf}?`PAjYO9B~Ns*;y)I zuSG_%ij|IzosZM=rqRd`Lsl<-ucm1ho9X5>g%MZAyJz=#C7`Q?i2C9X`Bl1hFs#4n zio;Fg>%6*l=(Xbprx~-2@NqlkS9o_Zr&YXhyC?L?kn|+x#%Y?B%UEG=-DPvS( z@_irUFwsm)X&i!ZqI!mpYzwVm%1D3I@8?(>lAQT#;BoOgLQ^Ay_lnne z%H=*)2R2RiXbzRW*+I-##(TY;nMFe4<$G$MAcUtT&(YD@zXmq>RdCO1pKr6ry{-h8 zR=3f8@cTZ}@yz`5Kt)jkbfJx7FqB2}^vL!uy$rQ_up$ffIDhc?;_ zb+5hAqKJJG-$S*LWbdwBFkLTm`u){MbdmX~#FG5P3h^GYeO)ICQENHm`eu2TIvhgv zLsY8J(KTJ<q z@oIgTiQUn|&~q>hP5XmxtOe;`sn*T-^t~L9$9lz7vgz<460l01DGR|~P!WlhH!w-W ze0mg|oSgh>f!$0czq`3v)t!V#qy_~YB4HPL5((KBPAJjs1V&)cC{Zq?TlOQ+^C%tl zIF3l^it2&cQsqQj>`j5*>xx>trsZ}KrU*z{;EEf4B1a^dSD;t$Cb5$q_-b2v6kaSx7(sv0f=d1h zQ@cFjapE~N_{6U-OkJK1OVA*@%raca#M^TbMS5*(qX;>TR~KIJJE$wa&+V)_6-ky+ zI}v%}wJg`4&sdZ_qAK@#moJxFg_Fs`*g5KZZ{mV{FGcsF%E&Gz>P%z>7eX2{Z+8TA zqlRxeB+J!%lap~U z={NTmrt@_Kj_ZP7%l&=)>H?r@}t;P}{oZ816Vc>K7A| z1xKYyxTrG#b_oBc9Y&+JuGNI*OMQ)dJ#QRv)?s-i%ji+wNj8ohssFK{f`RGTHTI zYMW>Xf5@~hBj3-hJ+h|@dvY#JgHYdn=k0!Easv_Z8Qy-q&dfpzu&^0K&X2r~5@r*H zD-j+{dmPQVx0DDCo@n7c4}8BNQ_g?{_OIp-d0&+DTWy1)l=#0pR;H;dasg^Bz5eI+l4V$QNXr+y33%+ zKgTd->sG!b>*^JoTtln~R3vv4;MZ8UC0p)&^%UV`);-%jQE<#|A?JCGbnOLw(bzQ( ztqXgkQQvaPA2%-G8#->*O#;W`xl722<8CLPLkGBuppP|Gj29A;9g%ReB@19La2j&8 z*Nyh|`lN&wx+e8{F{oU3okRJCk_3{5e#Tn_jMY*+NzYt*tjzY!=&z8TyY&HxZgN|skDoI?r)~IQK7_zg^Gct{8k6+Mb}LtAAX>AB0X`&3h&}Y#36K1L0Mgi?@jD%Qt}Wh@ggQG zRwn6n!8Q)}=N%OwW(FWkzwc_38ADJ1hr;`d&tx)sO)7;wz3^j3XCtu%+7Cfv(J~$> zb-mlt^5@isb5W{53Sg)6NUw9=crd)y<9z*cTUn~Cb1^5qMeZGR71qfkSEmneKg=4S z#ixczSc+)LhhZy`)tC<@(ZiD!4)^DF+e+6-G038A!u{%!(3OIxC3W=`llGJTC#R0^ zU6{RinDXJ_qm4MWQIeO?Y@uxEtLCm3d^}T^XKGJIibW0Gv1tcT)@*MkKUB4uoKMn3|IEhB%?0#=2*590@3J5^FbIH(troFgr!Ycc&9{z`VSHQh2to-<(l5x1tj4wO3E$H;C> z2EV^eb*JRG!-*?B%&7*C!X*qDf10W1Rx{|gZ`-dn9-Gd+j#lJJ6NN>t#=qG}%l0Kz zb7=)@drJVb9rsL@vDg!r@+2~m9wHA(6Fv>D zaxJGYzos;2D~LPX#j&Q02jzCfs(w`VX6!Qn4sN#n<$k;eV`EvkGUP)%5O(_TKXAvq z{XH612_90M?SwWzTLs%%B&8^f-@$A+leFY$OR_Z`U(MdGM)jyf?z?Anl^`;-I`>d_ zG?jLKEn$<_+jUQ^`@5mGD^#F32x2Nal~*BW`=Lb9;j3Oi`<=JM^yJ>PR||31kE#3F z+HZ7O&kr|o>1;AsI?Y2UQjp(YyTrMs9R+1c-FAO!-)wm{=DRz8;}Zcfcsw##`b0Md z2=`|lyw49+U< z`Jyycmn>^w4XmFi4jtpN-u|^`BUyNqpXPQ3%t4T(2iM0~Omn%N!6KM7?wxGUI@$^i z^xZ^+f#BVmRt8prI! zzKc!ByLd3ZSZ(^oBUekW3wX?&4V&Pmjc)^g^6-%DIDDwx+MzAlzVo*3Rx^^e|GPI z+UZ)y>mgaw*t<2o#|y8yBdU_un@f!MqRug^OQF-tCdFGeP5{~9^ps{xB>6jT*Sx(8 zl=&Ew?7OMIVC|_5C3|L$le`r?tgg`OvfW&MX36+^ziE)G?Gp2o94?yQdHDJk;-U`a zD<;n6G_vH)RdqZRa`+*FJG1XqgY#rukpJe1iSrvvV2K>B!mXp1){wB{2q%p3>3uA5 zwF=khCBiA_6#O(}Fn-PxJnPyovq#>pemDvpKWDlClmP{iSuXHO7&a7A0x3`&Mwj$K zk9wODMG#Eh7;m^Kl9!Y3mI|v|ZV%;?orH)jWbsQiLv0S26hXRHgI%q2g0YR3_w=N8 zQU;WJ@%3*c1_eX1UaI)y%SOcn!4;}E1)0O+iq#p7WhRtVvj2{kzr8%4{v zW|KPk0}6_p{GdVOX~&^~We5IBYW5(_#-I+8*WT zGmh8UZ95v@0xA8@DS?kKpQm=O`RBGf!HNPEJs-K(OUsLHPH8ggtZD>wYO!O3c95wOE#bd*m=zq&CD>QiB`!$Ot z_@$!<%Tyj>OGoaM0b&9<4i#MZor-cI9RhNoaVsk8LoYR#YfuloYpVGB_;3N`gTsXl z0AndsbkBO#XG($_gAK2Se=W)!kmQN9`6fUw%H|>%9rWVxiTs%tmve&8P|>*fLiG=I z^zvL*&J*>c4C0Akq@`SpljSPtiTugP&p~o$;*s|aB|^QNZ=-)}xtC1PYVcc3)S%SF zVpWUlFKJ=k3ocFG&ie-CrFv0dj+8ru9G;yQ04^!G$Z4^c!!^U7VwdQ0vJupq@Gb zAUN82lO=U`4NVS(r1u5$Ts&U%TS%7N83+45-k38{w7H>eDJ}v*Amt}Qy&R$Z$(K5h z`d)Ra-S$lNFcs`v*5y#kIUA|nN9VA+CZ5Cr+sjIp=W2vz)Ar@p_=vp-b2j!-&)h(z z1r%Xy@)+uG06V(K?gxjCRnQZ zDZiAnOLT4q;oHuXLF+JXAI@~(q z)h7}3kBO<$8U1y0>&`ifjj{SjkPX-zE2S?n#a55|Cls(yn zk1spkMF38L*JwrCdINxOM`yE4PnOfcY(t5kSqmS+uY#@Qj}QT&p;R-DmtpU3O8etK z-q=spPoX%APa=6J>I~60>-I7yUFPz3+MeZ1y3X0pg%VPY8>Iv$uW#hSSuar^U*FT2 zZ;j?q3t>1ZdssL*LE56mBr;&%kL)5aASmZRDhlC8Mx1a6$vOt7e!6npV(&|@(}OFs zo9kz`=z%Q#t1u`cr1rODCwDr@-d~`W&#fIlyRd0DJ&4GP+A;=8Z80h6a%x}2>ZI_w z@kFAFfb`47_%y#md8t!v85w6HJxJJT#t&XVF>-ccp}Vb6XD)R_>Pz30(DSO7XrgCj3j1<-DZRga0w!$C}LZ-9@q^V3)cfXTOjU_%t^8 zHFx6cFFrjR(zR}hw^xTi)D9c|B5n}dthT@3+0AGWw*%2Sy)070oGUkexf-BB>A@cY%9m~f|ps{z*JuB7{5|B;nCl32OKwUhcw$Gty=#xsE= zzYVK8DNF{%+8zNtn%!O2KYZEuDye@Zt7_GCEyqRROGDk`u_K@cz+p77@b+=`>Q?TB zX|kqt;9H51DxkE{cpha2;H6>+F}^|4W4m2+e%QS?C2*(y3#b40EW4E^sQV@y_Gwd$ zx`CV-D~fH#0wo*Xg0iLeZ1uY_gPA1wwPkmd!~2OclVbBy`dhwY1D-DPEHad;?8vH| zO>9u(ahV)l(_9zEpl*VyrrB6Ars}GQ=Nu?_e2#sndm6(@Ne zA4*NLp*vO9#FEvU6ss8+$Q4?AKfxPpol)mxU_xrFV_o&q3S4sZBWI6mP&BHYv|Qmq zq=#+F+85js6A2VTzna{#QV4%Fkc2c}`_ElQt|s7J*$IQzQK zl_o?7nM{ur4K&9qJd15kWXbdRksGW|ETGr5Fvcyrd-Gm#(uyV;^m2`8VIG>iRvfO1 zSw;^$<-wxV2&y|;iJs^I?LcZNq+}&F#;d|2d9}(^KT8Bu#=SGLhY{;soUzM>G@y;Z z$I^01mjr1!h#;&>)TUIf{Zzp47iYo>##Glne5W6~LltYI9qD_4$zE0wsAcSoXlFI5F&9ez9VYUpJ3*r z^We(YO|y9E6Yh*w`&ON43(CflnjVaQNcQrOwYZ3r&cb`hMFTRmA<-e?dC-$8R_!Vs zG>*DfXQqF>U`?5Td(ubQgj*{Cq1N{*ep%kb>cFC8yp}wRye>Kms7F~mV8yJCaVloLIdo50$LmS~o%b2WFo7i!=}1>57Oebu4BXkOfi;N>^E>*1S5{? z`*RUgtk5QI`?mL}#+2sr5C$24i{@-uL$-Sz32xtSR5y3c?b~jUCXCL8tkkn$ZwArQ zJ23xSa#zA5Qercxh0Hgru-j{P%UcGiZlQ~_=XpMMP5Pr#SGw7NQYk4mD3_&;(wu6h z;$X@a(k`jZ=(us)Q>CdI=gK2uYRniKAwBk@^#v&Vy=rsF+A6F=ou5=qa);z#z~Y ziAA+2c`19t;xUbNg<<^2z$u0E&6asMD|ARX5kBI%0dYG(EHtLF z?@I<{Ff82>Nh+!#CgwWr-k=mYf4!cd$=l(~BN5uy=cDcK@oA1F58E84GUCSg7%1F3 zfo09NZ}^=TFDmFxqg6`B$E%hdDp;Wkd*&r_yQFV=fjgzc1Nifj7V|nvG)KG2 zS>x2^PW>2Bx3592!Unn`%-Y;d;e+~nJ<){&<6(YynHg~m@F~x^8vm=aB?Qr_wOF0` z8mAhdtT06s%jP%M743WBl$SQt5ZlW`1zzb_`74SEw*$pCb0!y&nc0NO2G;(+*b6mQm_BnyX zSbYazm#TJAWB4~M7RLJ>PA%gE+eX+I8PSj|06s4}@yXszlH102)MI;OQ;1}ULPP8U zVcT(mNe!}eOHQ8Jidu=!!m3aoY3!`XFixz?xGztMqpr*6#y3xDM>VI0J@eY`Q1*BZ zRXp0sKcz~4OGMgyyTFg4v9DX<&RP5F06&O0yKaOh*X)C&6t><9_b{XGC!YDrf~o5g zU0^tx6UuZyNzqpO3(-gWG0>uTPU9MmfXYouQqZ?R;1oH?Wkipt|TfU$9| z4q;i-0X;y!;B`jkpPY9{R?mQh;hMFZ0agTLjY6IfA65BjtLloDzF8s!kr*Qcx%a1m8glCXb z0%P0o0m1D&doGISDKw`2!1ae>^ub*dWJkmFQg|THyvY99_D})JB)~{kbuXob@73J?CJI)*<`W)S(m8u65`6!by=?HNG*PZctk19t)5rq;J?7s{? zejM~A^ws4bgA+B7<^I!sul9`WycR?AdJH`-!kUgd!-|CCU%N8@jr9$6VP^I#BagdA z)_YBUi!v*_0JI@!m7A?O0@#kxjUisrdd&=2;tMgSK+TN^F6LYc5SBvkpXj|!;}Z@a z%&HHW76NZ?_jh!7RKKB!d(;MWx(-eVKdloK=n*3Z%eCKFu_mm4{w_OHb5AaXLlVKT zDnSffyLSIP?9tII(#(yiS?|X{e-^xhc(I4y2{m4peVR~S9M3u1fxA*tLM5qnL)So- zYs?%nhENGlL3mLwK6v9nRp(^JRa&8WuJxXXcdUB}=NypS#F=jYHG>E)(p!Mt?%7Sg zHY3Cx+43y~_*d*>?g+ivk}_o4H(|*(0nSS28@Px0s>O#>8F>Oe0RjRm0hNw1dy@Zk z;EbmZS7pBftQe@$CMue=9y|Go&u)6ld*;>9SWQq1wi~IjR#4(KKl#Y+Mb#Hk)jw@< z1avwVc{;5EtueI_Vt%PiXe+wG89pD^HQjZVBkpUY@`GaRC9V@Xv~C3cnJHtMyai(h z#Da|%*JQ}hv0)C2p5&?M@bJEg?@2_RYLRiCFn2JUZ}*sUh8Kg{tR5u9JE8H37vYtn zrU(Uly|Kr9FhOa}Xy4j94SVlLYnP+vY>)`Z_(KQM)C-nSTR+*sj}BmXuVe4S+cg8NFD2tEGr~Ed}B2GQ#QBxYSdQ)=J+c^-8l;C8X!gB@=T>Mi z7HlBb_Nh&E!He0d_6h7rJA>fGCmUB-PkONbRYU5kW7%da+B zN*7GpTXgT@Vgln`W_cJ9qDscK%zoi9!@>ht>tdTgzm*sPe5_7YuM_&`I`%MY=MWLu zlzO*0ZC#aUrzqc5X==6I0X;VppG71$0!-xrtCaQfxG^>eeuk}(7{lNxndi!wz3;YR zzR+%^#pql6R^hH&&8Fww9DMZwE$JcGU!bviUQei}jSIJ*VVZQc)awObX)bsE`0H z(rnD!xEF<1jFdR_JK~>IWYC%j>Le#XN_gUZ24juZzO2UoNqFnNG2ncAvubM<6QUiFwm%0yI`#JVKvK0y_&iHl?x6X;4spOG{z3EzPBg)ryXRL0dj4=BzN@MM+8?{V+9~E0Zz_S=NJvr=rU@VJd^S}aG)1S zs>SXI`I@W(;q857@X#|L<^k-LM{;}x4C_NJA)MLj#MJz z!dy&y##s@Kb<~gdD0a9fpTUVMj#)0Vkl$qfi|!Lf%`g zrOfaHo_>C7^8HG1mt#f7et>C7-DFEiEN#UPn1iu%`$w*h0SW76*9(5OxHc;dhMSTu z(HH4?1cTojuZ0U%==I<1rjL zHNfQ{?Z=qQkbCk(dfl|#k_?uXoHl$iWhQ?+#!|#v>6F#>uFz1tmrY}1*h5evdi#h2 z8rGdHZcmN%5-61c`;k4{8)X2fUdLRP?u4l_QVSc5ZQ>Vn z;IP=O1s?B?@~eYJ<^O8TKxIOJ$<0z5+iSuNpfXJ7*Im7<8M_K>p^SYJ!G$3@Qe z688l!5Lf;K?yZr@>tiT!&l0c9VDlv^e#?v~`w0u3cw+-&x2Uu%IymwNJf4j*r(kq* z(&5ugSBe2Z&LDTHOxm#WbfisS?OVkJdG>xRK!#e>>cRXJfZAZ*tz-n=&%9PY5GLTO z=s&Ym&0t&*e-u=3{njFKyO8fspaBRew0VOim}CH#V-{w23E_amg>kBIYFQ+U!GPxL z2Y_N-c8ZPqHc+U^7!?b$_gyJPtyn#NvS=&iw<2)ao3G_;>XaC7SN60B4(M1a!kWpE<8R?=rH_zg!$++ps9l-V$TK77Yc zxU>MUeynFj!D*AoC|${yhsTCkDPfxr*P;*UAZI%II?R|U3?kxynOd}f{?_vECuKQ_ zoqIO56@pGjWnTg`_Of@h>a? z<5NgN>hub;l=3b!$IGw!0ex}jzIKoF>0=fEmE4!gZ=yfVa_v+IR_$*|TtmOJzzR^T zNq;a5&ozuCmdj?y0sz`kgV5Np{N&`6{oH>~2WTi7zLl~TYBXe$2l`ero7OMb!}x@O z4z)B8jg6!NZO~?ST$RrwA|X?>1Ipi~;x)pbWPM-dNbRm*MhW0jW@&Ezwg zSy)mq&d3Hyn3WZ8`u%w^Tn~DVyw{N?j=6}Lt(rlcfBpA~?O&AzlG+n>8fF@`5`eqY zI~M!~PdgWyxqccf1N4g}-^4zi&gqo3Y2(3KxhYsWe~pC795q7E+*rJHa0K1#d0kth zLs(@`)J$pNI;AuDH0a-ucH{&b>?q9 zqKU#Z6*2R;TI+2n&Ek265z87L7{bpnB z$h(P-AN1b_N<)5cczqBtE}nWW5YPrz;S{t;j=p(u+ol#Ou4(_W&qbiKLouJ9C%Rzg zWF1X_`vF&_X|>)OO|sw@tu4y@`-vATCfmlRG^TmLLy~2W(~@hy$pKQ$y_|-r=Z^DZ zYn`e~vl>!B{>fWcQ)K+>sb13GD^5p-T+LOz-2yjXkG2)yYuY9A;*^cuF(m@F^zYQ^p|*ldN(EXo}@M z12Zk2f&t%C9Re#aja#B8HE12apV6`6$?CAmd*01u?WSlRJ&U9ZPnQ^u0*{D42Skcq z!}+-?SOH>i1$%V_g!WS}ynfgR9w`H$;7r6KRlx_br`7gmjOIz)x$uly$ znm13m^OuY)sNZYn@qwY%E`ffExBr>`KcGg|j;8^-?I|BMQ6_+1%aF(db;#bioM;kH zWx+nOgD5$F)ejt3=26-I;*;O={!a<}-_{yXn0KSUgur#jH%a-;p8ilFXC!o7^lXi! zwC6s^ZsoJdllg9DBqw6R^e;s_4fFhrLw@QGu3u-T*O=yZkSKs8)7Aaf_x_P)OB^<^ z=Q^MP2?y~xOmFeq0s1w?%FSOg=6~TD-Mtm>upTIqGk`GZnA`nXrETo$@tn|~68e8a z0NsVNkDZggEFB||)U|-Vl#r}m6tWda5A$JQ=^3F$n+$jcRKW5h;+Gu$Klb(QG*&lu z5(X3e5x!#Td~^o&aKGo<`Fg9ugq55Br14n~Z2u1h zb=hM<=Qq6g@9%YQEX8L=bCn>b9z)5`D4J;@0vurkBx0das>1w#Y~z!5 z(5RiWvbBzDF<~bx1&Bz~UHo=-izVxu3h&=loDi?^`yXo(7CF1nJs6r{9Lg!&O7Ga! zHAHn>Qc#awfIX0Mp6{T3aeQF$_m=;apW<{a$iBLt@=e%*jxE%~6X4^zc3-`~lZRga zwUYnvoD1c0zF)&vYDKOcaWHk7WP3=9oV5A;jSr2jk$`?rO3DPrK^c$THBGIJDsC@<{i{|!J#4lSgLNR z1bc7j8z7$lYs%`#J`r_(pm)Y{J#oKNk4J_02_SkrAOCSdO^%kJ0dE6N>aT5E9D+)z zlt~?xh9@0>6cd<}_M3tAxAT*18zr3GaPIKLTT0gMf}3PO)0TVMy=tY_Tq1O=#LC-BSSs6L`V9HZSj z`N?quEDr6i1?~H#yC`EJy}*Gk>|Sckbr+D)_xznSK0cEqnxYaGP&qNad{>7)+FUfI zKy%|kvA|F(0Brslq{=t6-;^5#dkNDr6o$w6{iLRq@SXHBl!#UXyuEwDdxS`%?lSbj z#Osr6%cqz@Xrb5hD{b!s$#C}&evfkp28lKodpulh;Rvb2%a}1Re1zEs0N0q}eGT-N zNdx24!=u%%*3(yVN$8Y{{PYXfn{yYkz zDNYjM-A(LL01c;$l#0Xb`;okTP>$Vg6NtoI;95mo*)pu_SZC~3X>BZG_W_su8{p&u zWgL6Bz~T`mLC4|3QdnpRtI7$jyU|V4o0u4@*xGcdkzTo?OQovcxTbJPo^3ESDjb#i(MK zEZ(d+rnb|DS|XT>F=iLJN=%0xUz7&S3}6Q06e#%RVKzXb>4!s?=pPq=TN-9z~Y?O#}bSW&R1Hz30pmBO0yByFI3y-yw!0Rx~70%PpTz{q$zu? zsFDI~&=#WO59{Q-2dZqfLw%0cIzTeX7FoIaJzwrG&j0`&h$?LXavKiz(MYXBLc$VE z-Zg$$`Mn2Y33mnYS9}{ial-(anrOjtfFsH`mZ62kaL8}po*;#L7P>#@JEsDI?#d}U z@}MmKEO+0EwHqL?fy}#!Cr2yoj4W&t1HEq0irCr+V5>v2k{I}ims1%s{7mcwqIRb= zKU_a{1;QnJ*=ejIzYNgK9_C}Z3YBw1I%ePgP}ls?;@2Jvjz>L$W(S-Og7!T@vhk4Z zx*H=`EYZ8eV`!?)#=3Xdl})cnE?ZFX;q8lmJ?k+09}k&9S|&*WW#NO-wJpqmg0U*s zBp54$v$zps%P~HfdG=s@AthkW4vhPhEerl3ZDcgO(Fl6i^J$52I8PCaVg#h9LBjTf z7*&x@6abAzc~Th$IB@g^@*=}c57+idL}6NHAiGcBLhzcPk0DN zB)}vH!*Yr%(At0u60CiSNr`qn?1t~%%YaM`K%}4erdryOmwMK|xJ`X7pI>fd>>i?I zAmHP^3;KA;#K`>)a}4!&clU*HBh|bsoXmyS7WDVCo|tM=6Pl$KoaFX4UyXhy0(aG7 zG};5?VxneX(z>lZzd+|X>Jx*8XYVt=I)keL*tr3y-tt9o_ClOB7_?Y1Ctuv#n^BR_ zIyV8?@I0&~ChV<3*DNt3=@kHFvGN#ET1m(6KRk4YN2R8I?ZJBl&<`BfKpwzP*^uhq zad=HTz^alZa+(E&-)XvN9o1-I1r#+zmgum;e_+qpbjxF)?$r&MGDHCXtNc!6#TRBp z1A*fa8M|f4H3Y+&G|emyNh?oY&P)stYN7#on}B(nxA)d1M(DR_;Px7`b_=UXhx34_ z0h(0?s-Oh`XS2?qH|F{WM5gj4*67=Jo&k9f>~5>M-0A)7={Rt`Ae7IBb?RWke}&_; ztu1Z26#1R%@yIEzl7f(T*d{K5v(aed*Zp{rn+CJ%0IxW09AyN=DUN?8j{bom7sH3N zi)Jfl)BON1gY1}fVxq+-^~{6yfi6pd@+Fg`3x&1M1>m;qWf3kRkgR`DBYJ*-IDFns z;SOXWE&ha*>)uHcefc)PG#{HlaiB5!p)chrqb5UN?ND!X#;hT!4%;mgVZz(m)1X{AmV&ulWf}W7CaW z?=6w03n&Q$+@)aHmT5?%QS%F;b*1?6+>8Cz8O^|Cus{ zl#0T#qAi?Dw*fs|gxn*oH^7A~9v^UbJ(0XxUD@+)@}}km`K?A$_k?Uia{|3H__2m} zg7Zpr$X~GHC!3?CzyA%?*=)OIrI?dq&X&?hU^D}%T#{9RzB}aulw-w)Z{K{ND5vav zVzzQu7ys%m{{l+yx?c)%x-1_+4V>RaDH||pZvPt*iRiEXCQFmsM@f~DAmwuIqjBdh zb(=%#lI5uxmtf!Ny(}s4_CQ65DAyLp5hgVm&W5!HyC0doM#a3$$Xzw_tbZf<@{JGT z`z;J_u>^DqxzYOz9Bds1h8hVT8FkpZRzn%5CYjeQ%AN=Y?*<5-AlgnZMpqA?`q!>K zo&&n5^~`eat<+DwAVOhD2siNpb}I*5yo;J0yNwLeJbL?KF=em)pI`l(-!Y!p{Vx0T z1UpZ_NY}VuGZv7?X3$_KdjlLwAARO^McYnvz`qb>Pe<(JnSPPm4*>#65J>L86eE<4 zy*HPNT#E$%^;tdn`Az>jfFE@K=%n@nf$_btXwO&oJ$ed*TBAwaneZMmN_Luk=wCQ8 zZL4BW0R%v1`b@-zS7-B1y;QmxEeRjQ(O;~c7T~uOJ^H@n5@+f2+~YPpYjvbzABgC` zc1Q?N4{j+igCL{c=+x<&%Kv&45TDn!Kvv^!5-G;4e-&G_Hr!7Za*2;KbCTGs*%9RF z9I-I`?;58ckZB`zj)Kf@sO8csu0K)h!E@`fT|BG;DTkQ;8uypCaJQV?OJjK7nF@Qd z_CN@}19W#hF8oI@p$!|$<3IE)I~2fe|6}Mc`NHnY9N?0pppDX6M5zio>e5m;MuGrfr>w{KS3-u4^2cX!|uDQ%L4L8 z?#EoeC}Lh&uAG)6wo&gAW)O{(yia1JFih{xs1zUO6MiwdW6ALn>+rA&_PuppUugbm zv}zhPFsD;xk`s}_)q4N-W|tK)Ni!PNn&>=8t}ZtB>`d9DUdWSYs6&rihv}uiTChtE z$z15|GTDoWbAO>Xw3XVIrZ6p7_R8f98z-kUViH)nZOc3zv9hzXn->216kC1G)zo64sp(nZs{4YDe}8e+OoCr0f<{ChcQcuo-ugWj zv(CT~UU3JUuMFOn-(#L#4r6JV{TQuqS?7xXgnP;8dInNjT$!M=xv_wJlH2a)maAZ~ z|7{0m#X=>UBnwmh$V~o$0q8cuJbZ1C;mCDY^i9g=$9sxX7oG(Fv9v6!@Jt z6JNavh*@oO_EWAqcGY^~R;&{t!C^eiAn1vhg)%)D(ThfIs6rCs&UJUiQ>6e+jy({t zF8axH^h(%GckMXw0`b{-Yd2bscl?p|G0JA?Nnnxuu99@I7kP3A4keRWk$TR?#ZE*p zCSii%ZJA*h!l@jk0e3X+#CCHK$51z?P;0d;c<^5Oi`l50GOQX1!1&r7y0Sgm$Pd zLII-i29QDPE&*J)*O>V#xC#QDtXtXq(!Nh@J3?Vtjprv`9(N_`-P`g(se`3Rt0L4A zWJtR9kD49J@&zINr1P*JA-+WSIT6stwfasKjCqZl#}CY;4mo3E=pmpOTl8sjy-{65 z_W2&fh%b$r5k`IGuFK=}TS2{YDjY7uaXBMMctYm*nh)rY@xrqRK#?a*(P!H6;evg) zUPlf;?Ff+5exIp9qh|$#CEBe;A#yPb-Nl?*81~O`ij%dTjsvtyA%MyWSX-FsTlvR! z#rr)#kZzAVmphYh3y^0|M*#IqazQ-R~ylI<49%iu}B&nzt! zE3X*rH`3T@KF-3ZQ_jf1{0+*>Sj4#%5EM%^!1X#ar#aOdQwWvZMB^HTTT)nuJ=bE{hg*!SG5rCtnB90L_#E<7V( zWH_V#$NyvRJ;R#X`aWS51smcKD;;Sf0xC#{C`eaOs#4`3ozMeP0xHc$7Z4B-30(+1 zgcij@6X_rc5RqOIdLV?5SwTJbIi8tko|$XjZ|^s_lAXQx+H0--FTcV{Q2@|x+X<|` zt;_oO%sdCwlKr}frRvNH@HQng^ZA_jo`SF8M6{HN2?D`>X!g{)*;_{+Rk941O7q^h zcrT9pUcCOWZZnrGmxnWA%Di#x?hC+vVdB87J$$J<>TtQt(BjvAvX5*OZ1<| zbHvqH5*a;SgCcntQ{RgbfW~9BlO8BgiI0xEu|%1dKryylaa6*HyJQ8Rss}Poye?kx zuPF*t!91X(@~vg>k08qZRdD+=@ca>%%Qx8!5NV93#=|mgTdP4!vBisAU{wJ6ril6) zX0gAe1mp3`!8A!}??L^2(kk-9&SEb&Q)Gi26VYBP#uFQ9EV$`Rb*^HXQVx<tGx(s6IuJ!Ggh2rH!>TcCu8TC_o2}b6(H-6qlEf$ zK;{vD4v@@34v`-vb1My=&*U$k>gC@ju+=z-(8!gAZ+NwWg7;q(86OJvN8wu|p?NKA zY(~drlD+L~NqY)CqO$_Hxs=aML{tJd%bUCq4$-anOi%!hG&MVo=RJGvWwA{~vmfTl zYCIpBH`qcpHfp6uKSsPM-Psat0ZN!Td}Vx1(1z`||+Jcg;}zwjf58RZ~#Whz8F6DfbI3Xzk|q zZf1kjPHHr#-a*ZK$VSZ@4;9pb;{Y0Psdj)Jgo1D>P=}>L^k3H4gr%nNU$Yo=&cQ8| z&9-?bf!ekIsDlK2IuW4YX~|unt)eJ@^3CN`@)sZH^VqE{+M}GFpA!SzybUK<|3=Fx zk%OW-?;{gp;PW8Y!dqMt73MH(!yMU)>F<5=Zhz0Xs4muR1<9@Shi+cfKfJcD)W{$=p*T5L318y^Rrngv9t*hUvT}nwvESv?z;fl8gNhD- ziQRP^EjNZQIdssd81V4_maO!)yUGEmWscw=*m!QW#b-3EcWTMB5H@{4DNoSl-3#>K zAqqvsPbKW5@NkIfyE}ki`|Ef*nvz~=ssn>~_DfRUGNjZ>UAYZ3VV(#1pE+$D=3-cM zF!iD*AA{ioz~(gDneA|d2G}f&54xGWRiY?HWkNCXN77? zl+x;?daha0f&qj?t#D^uQ0#_Yc$*db5E?|HrTT zz;;|)O{I@Za!F=--fqr)G7_M0fjrop`t7a>Xdq?Ykgyf}5{T5(eKP2cgNxa$EHsWL z#0WBq-1tu(2wKXyI(5^}pX`zFnH69Ucv99sn)m555dM(;>TKx*HYeD_F9kr&!A(+W zJ>uSUEEryfoMFn`F@(<9qY<*QwRc(vVpJ&{ZU4Gc*!Sx>cTT<%;SM;|3aPm|Y&w4!-dK7V^j?tYxL1WK2?^bY)X!}hB& z^W9Y$SDp-FtGltj-2gnDlIIzfQZi~;>Juv>dhP49{$!9d%5~)%)8`M*HAk zD%On2b`GytTDC-@|3`~=F;Sn!S!(g04=LK^=%)Gh6a{ULC4L@UcxrpE zu?t#JVPG!HcCUiU6?^6x_a#<4?n~C{O3+Wb)Nm>_!{WSxVY!t?(MdwJ*|(OP?Ef0o z&bK#NBah3oMvgJ=1^xOK0`j#{k=yP?f;Pe zLR5RneIvec$vnN;6H?l)9;I+c>%ge(=9uwWSUG6iL^RI_MZsU<7QS-Kp{o;1a+3&OvM~ zs-<=$u{CH&M18}$V2Kma$(LSkGqV{5y{~sWuscTNstb?YR!Nir7fayCvb!k1Rq-zH zzD51Ysxy1-=GIlDz5)1s&*#B_Y5;wx8nM5-rbwcw8p0U+UXWu_-JMo#$k!)9aw}pr z^%h6GkSI-i?$&eqUlR*#gJrxq=Y2oF=z2(nXLua;bAs)C@+9DzPE#9ei%$Wipsqw& zq;xY|0={J?aF9HXMW#P<;@$WAWKtT># zfq&VGpS0T=WtWo4Q2PBw>LdY~H+)n$HGW*0b4^}db9|{?y7AJ8_20+tN5RJgd>5uo z|7q``K%S)ov46h~k1-F~vOubzgpABdU11#1586(HZ`XJi7Um#`1QgyPNgNi}bg^`f zp7R#9PJ5=y2ie+wa{gMJQF;i~V_I(rm}5`fdK5QGs@1luRZ?bP>-ekC_$QkMe>A8t zH-xi4;@{Muw@#QiAUn_inR4rx?cD*oE)i%W7#8Z<%bQrfkHHrytf5dq^{CfLm;=a4 z$vty>&hez2V{7J9mDGo3{ATAIxyP<8l1T{~N!^HAGy^Lm5>AGHwz6VuEi+grO>_-XmXy>=3Z^10sx38^KR37_Z z(s=mP!rUV`HrAmlOt8mQY9n(gy=f3qw872@p}=r++| z%`@6NG(qXdY^G+Xc3P{{r332Ka~_8yH;nUSTy2YJ7xt^Lq->+zJ>~HR$DWlp4b94l zwz|rx2Q7-ozly8r;iP?4&u8=v9H4eGeJ1L{rMhj}Q)ok6Pg8<6;zXBjWefDSnVeex z5Ihmj#3f0AP;YxKylYQRy{QpBDgkN^$&cTMw~bI*+t;pIopvAxp7WOqXd=eVrOah+ zv11qUx*ur`j(^<+hb91GwmjP%i*Oqg7e}NWh1jEE(on3yZ9(B{4l-Tyr_euJIhk8@ zh|9H9+T&C5TcK0)QEgKhQT&VG$H^EjByEUqTi*+GTVvj{NE1T%^7!yH_ncNqa&B5kB0#`q zPkZ=XYAUpxZ;2`DP9FwD_W84-&r;~z^v@Oe6cEdTLQdF+4hhfEcH5;vmLrpfEpOS- zJx5W4r@*#_UJqaDjmjP;qF%I$&r2GUI6iv~P#?E{9pyE~u1IHi2X5-q>oSaKc)K)e zt5O*u2|mHyPLK|w4Y!L>Cl@HgroI7N({`+h^Npt|vE@-r>3(8cCybu{nw?{A3{Mvr zB064u59fiL)KuK3wu<%W7g$DICyTt(m?=LJ8Pby&dsSJt>@??P9j@mqt>kY1&smum z$;2pUsS{DuF9)GP@as(gASAtCi&l!~>vG5jiWkjshO3(%E zRNoLZQVAvMKJX@dAh|Xa?9JJi{su@ zMt;55ih7ig7_NQ%tq*q|w($Wn5cg8fU#Ub4=p(+l%gZ4<`1W)xfH)mrbBx`6oO~~Z z+w5-rZb6#0n;t?j$oz=gn7q8U1oG;iLAts=MZu)$%P4oaN7*j%vPU1*?mfo8f^j>JQKES^~6A20DFw-xC=5De-8l&)J z;!ws)XFs{JUjlK!FD<@?m`sbW(U%d%@WEI7SJZN9RNu!H+?H9I6apnL82LdS*cXX0 zbg+=c1pte1qBrI}aF+V4_8@Un0BhekP5fF~C7!u!62LFTEM?iMGA~|l1#pgJKuu2K zmcOf=<66~m4ZIB)F$=!zVe~2;#S9~TMaD7m-Tv)uak~=>;ysv7-gy_~-iXw7y`%T) zEm&<4V=RNNf?oo1mTJ%c!JM6X{yAiQD_=xC{$lZ`&&<>zi$7v{_=CC=#-&q7PFNOO zX*{vGB)33<6)ZK%$w&P5>!P|=o4Fv8$)y%%BwuDtZ1#*2RjglNt$C@$Jq)w!jpy5L zF=oDJYKzeil5UKoVqaGKeG%)|F5SxZoPgBd+^0by`W7%>v;XIXw`$46;`eyGZv^O* zQCULF{PMH(!CPyUSUnIUzVQC`sSCLnQXT7`n8lcQ0r5m>v`tKb|wkm!|?|u9StRZk<#C~qdP9)>5)x?tC z<$=ZODz!HTAj?p+-RKe*fz2F4GozFeaL~l#f+FqVnci{4t3re?LmT0BrbB=jbuX*g z0)4C4YN~7MHGB)CW|V+?`957YjqqL*VJ^w<=P{V27&+1YKWxaq`_A-^OfhH6q(4<|rM&?8TJANZ@mQm=NR+xoQL=RD8o{tV>lr7tJc)b23e+x( z2<&HG)*9A(@T&%QN(6f@4h~26N^{mlpq{^9!y6xquHsekJZSVcrBSov4L7a+EEcQ^ zIf}-{Nt$be&gjj<8!)nqhxK?(M`&zR`*bg#Fwi|LG*g{9b{pQ^iMyvAgO}M3BGWuY z<|j_R`Aa(#2#cHx;k)p1;es@(hho*MCV-(Sv4_#aHF_Fjs#06|g*-|2xZHAmts^nw zPw;c@NDgMD6?BWWu$k;{tD^Nod}gygtf9^SY?P2rP=TX`UJUz1peuTnoZqoO`T;2t z8RY7~v-L6jEFKnv@6n{li-BKku3KMgar%C|-m`~|QDhqgwEd31Cr)VNg+1BsnQ-BzI(AUx=&DvS_h<_?B{HOUG=2Tv_gS}<@Nqm+`CsGK z2@-Q=Il$tS)K6r`KNiE#0s*v<+(}*RntlO#HSUMS#<2;sOH9Mwx@7k!#v-MpY)|rJ zij&0wQA!{3sZ++Oe_S42jRZ`2EmiVRMwCEU2G9&DHx3)i^vMbxCf93-7)O*pBM$x{ zUU6~ECvnX7k05zj2c1LW@OG_-$!51>JU}}tGN*`(7;!STrH~`R+4kpEa-{L6*;H48skokiFeonPL zGacuOTSWW)r`7%Zj|Ct5rEm-Q3MdmWedt@uGBx?|bAy#HUi5yF_F9^`<)-8J9cE8y z6uCM*!9(1YD3nezD!KJ-kfKfS>kxIxPk-BoZ+=>Jl8Kf7blq}O+_Rurv^uT@0OkiU zOQXm-M@l92aqxnLcy}jz%x(n2w;<~!c|*+;L?b|lH^|3a4DUgm)0nr2m^=2*nT-j_ z1ZaK0Rpq;M#ZJ}+XtP$W4tq|GL>Mx72>bWNyEc4FjIR}b4>kxx?mW;=5z^jJiVQdi zy+qHslHr4kME`=wk6+D%iy}Z~_xDLI*$^|x>~go=Pa<&1N*{=0=_fvaQkH$*z3a0X zKKZ1h+)Yrdl(#UQ*JKOP9-vjiNPR<%-0Qb&k^}nf1e$#u$7~O}oR7WC=0?ix8GoO@J|@j4xb3c%s+fjKSfkC89P zoxz>eg5L|LuV38JAML&lpD!G&G<^~h4R+Yyw1o$?05N=S^+QKj;l&l8p4yx9F-c_c z_)7RYaV3L&DuL5k1sDDy2mF)7(h80PHTEMa*K%4q-f~V%B+)K*qn}O;VCE!(h9O-( zD5Es?>ZFrT5N}r0r;6_2+Yzapn1_s8YLs^~lgER0Je(h!|#a6Iwa z39Sik2n8;nQKh;o7IIyw+9=8liVcFl8+N|j(mb+9-h5YYDEB$);i)9rx|*?aLf{Bq zTt&!fP5%17ZWkuO5r5pyWXr10&nCbvGl^S~r!bzqaCEG2&vHv6#9Af942rHC4@%j( zk#Clz8S7Ou1J=u2VIEbAp9h8=S;JeFr3Jx>1yZ@IM}8NR9#wvSGw;@U0E!39Sb*O0&_<5%u}`CFrhKTx;rbCiDUBx1VSWzs&e6^6d7Ox1o3eh{ zX~>2!#5-9Msjo`BAvD`bJ$dh&gcM@6Ykq3s2mj_TrR!5CjzngEQA|7O{IK>p`* z^SFoi#;=&bd&pMB}}&!1n=dHGm(?YeQ(_@f|b34Z**R(8Av*`MS@TZ6p~0hf#E;I3dH?K3!?*X3BYt;p@6!M(aX5>bF?neU-dp$2;(emwO6x}K zT3-U-nRU?0u;+-_6_uPN#gxO{lkL6b74rLSYIGt#UFu-|eHkTA^>RyhR6WpqAM+Vs z<(`?E^A`_B>O&`TF#V*Pa%(;6xobX;Y9NC~m6d8kY(NNcy|D$O%I}jCcb=bD6L57$ z#{;A_u<{Er9ylELy$%knXFg~wc`^OAGxP|o7R_k90HmVLAt3#mm3B_(ibg%tSU4Yz zqNaDZn*EJQ{82Zo=m{xI-(1}?^Tan}j7wx)z}q>Ro9xRb^>Kv#`PkDtHHywO&#yIk zqOrkSpMHNzn(`wWyP^Zjb&!l`CPOBRH z2-$3&3uv!1?2crzASk>3zAIKEdV%bxWt|Cskig02i$FDrcQuPYra*U9OK;u5K#3Yp zJI@}pf*|)#)|(vj@~&MKTQ16F)l`pN8b;NAR0!x#fyOjmB-H!V;{w*oSW?pAD{&JC z=Fv#K#9z|+(-mFq8(U!qmy9*u#>}5`&~OB>!&&>@j!qXnwPuM@9D%L{sK z2hXaT1YX|xvWu3O{Tpe~A!YI9U9+rn)|2kn&q2H|2 zHTvqX{#czVg^|iw*wJrHVVu{uzuGR*C2kf7S+ex;Em}sT^_=KRM_7^xt85K7S+N&Z zLi-P8h`)JxtMAQiYbhx9ZhB3*=ix{r2rc5>ytIdMbl_`O$*!Q4kc`$MfXto<898*n zT=b0&mZjVhjL6I)ZS=Z@9b5-<

;p>F~7Ya8C3GxcN~3;Jh?ex;zr+dbJC!xe-H> z$XfN^Ig-1Nrh0rydA3<~OKJUEFbQd@F8APC;_K911;%=i7>5n4HmyU6Z)NN>?Cz=C z-pdnhmv~Kexb$498>_X`Z#=N-gMnAUxj65v2Om(SpOlcreI`f&KmwxsZz{*s76qn* z^>Q7b6GGx6NVq_v{ko(P=~HO!jTpS~APf=V))P{DZ%MiJK+#}ih7fDsWPNehPX3dc zObdzXQug>$r%vU`-rh@)-^eZlob(n?fmVC&rNqV=-pND0gdtDuu9Rm0MQNe$3ym8# zo|4X0r-aoKiJrcN)6#Cuv*(Z{^+e*jk%hHy;m~qay-%tVygIuchmz!&_D{owky?8TNOq?(PUrJQbcSd{<62(lLPT8MG&E^oOj8fKFWIP3g(fW}9( zbgJPsOFP-{CMR+Dl?_0(SheSl#w=lKHXyZ2*lyR3XDbW@Y2vId=0Q7rD4w)0G4iPZ z$F$+;#5CmHYKzr`3uS$As~WWFVY_MIv7i`jw%3f)*Ov)BIkSEmIdO)l@n%VDS zXJGf2l*qL6AqokB2qEUYs9tpoV>mR6MZ>aV8GwE?$1cS`D5PMu(xdxLkp|ta-@5xP zEKL;~H86l9%}<;yD%Y(-aF?@3BCZp}m%h46Tn8r{3ylj}aH)zpaZ~Q87n|>e)jjdm z8{b=-l@l~gxC#=}GzNplHnKB?c4omF70DXr)AC*6<&a)eE^51?@!qvT&}LLzO0J$f z$&0KzD0hfc4ord5Yn!j9r0qX|yRH4SWYX$XRPI`_Q6fhcfwp>)Mc|*!1)<>7D|>u& z1($ZU9uQvnz&rLafi*0EWTbmoGj(r4Tq!o7lPWrII3tCJ{)QC zO1yRpSwxA#Gpjccc5Akm$TiQtp}rR-?o-y?r8l^PkbY~EHHyYjkVwlu4bJcyi6k-m zp6fme9_7kv4*u1#t=Xc@z%dLFsElYT=7}R9Xpl2g9QghlmN@^Lt?j=s)A_$Ua;kc^ zUBOvtAs&-FySQw?x&D~^mPzSO>-%;u_ouH{H^(k-%5=h(`;lIr?1x^YU!{D#$IdoQ zBB{b-ph%rU9=WtN9AtwKc+931&`RI=<7EoN3cbGfk7!cus>M52}ekpEJFzjHs%o;>q_+dcPSa`r1y9 zI&0FN&Wp{v8lxlZU%Aj)HvNLV?P?G*lt0(nl8l4yn`4-7qW1#^XZuk4% zwUu7@WN2_IzKUkZS)j4%^i|{?*N);Nz$3}XfDx_DU?6|Si?Mc#=Oz;({+(48Gv|FV z=35myZLcg77a7a6NBFroS7Wol2f`@G?Mh=eEQE#(dPMob8Y31tA z_a1e?s?`Q*L!U<#SmNOpp3m|PT;F%yv7GJaVo!Hj*5gEq_ssd!KI>1Paq+CJ#c`+9 zE0JVmDT57Cxw$pBI># zO3n8bRV|}Wmg``s)OrqW)?KmedV8MNO!5$81#AorDK^VzWogKK=b$Idl5cwQrQjh) zKErNm$M+Ig94gb}poxsyCD;+v^-6&>Ti}6UXORE!q5qprl7e??^>xigWOIo|vZW6` zl@K4>(HL7PE4;Ut)am$mImKCJbW2D#!2%*bYHobP`BB2WL+zM0#Q9qxMpGTJn=R*%BV8qHtlJeY~xvBjh#CH3}g3Q z<>j3oZ9EVQ+v%VYCtNP-T2`dFdgiJibF5+;xI-ubrl;@j&dpY?-jX*+iq9RO2s&&8=_#(NbE zcR9^wcIc=1GqmMzj6bmMrM39OB%_}*QQUEc!Nk&~%YJ!PP)GJQG>$ty1iGrCC5nv5 zf9Kb*1xjC)sM0Nj&5`Vn4Ae2GxRckjd_#;2c=l48Rk4wV!PIgA6Z`}0TYaAt=w1i$ z;%TWWf+UV{Xf5B57$_7{J|ks1EwST%?|(MU;+A9kL-T3-0K(8pbxRans`UTVv+O@d z&`rI5Gc^1EKm6ZWzWskaLN}S_sKc0~APP!ud@JYk4KpMq?6dxw`t0WL@H)Arw2?Op zCR9y&jz)bX#6U4?EaS$GQ!HzhwCakIqT%9x=M9v9n|}ZI9Ku(WFdFG}yHg2YU5EEv zGbYjSpR?hM-9?XRiW`lMA}OT!SqB=hj{`i6ZF^XThNT_O^0dNl^H3mY#llN zgTbLh6tnt+cV|TvOWMYlck=Gtaer78jr++!*8T!W;qNH)NP&!rEHfz^5^rRhXzTYIAh1B5&4VFr8f(Sti91Ph&R7 zo^?9B7ERO zHzu{^j$_^zy%$S4hT(fH{{*tSX)RJh90zFkdO1?C)V@^%7CBa|&NtVxTrOwSqDd8@ zym;smg$;#^p|0U{uxeH~pV^96*@TU`#nq^+GUjopYdOZ9-4KqHyK8{4DEVML>*9%y zXmL8pO)-jG?ji}*W-}YQuEl!D$4@U_u&3bfiog%;*dYn@hwsnqd{y9m{>8TGt7h;S zq|Wypy{49_SDbrEf(O-LuWqekW?)#40q<0}D2rg-Wy4;bx_94WKUlN7mbqAd_j8PN zh#gxsW~uzIY+u_xP%|y^hI6t;jfbUuQrI|XT6GgRW2)cB%`KDepds(sm3X6#+XrZ3 z3HMGEq!o6|gwQkY0wW4?C^&QV}~#<#V;z6b2lI z?;}I6yix?7uay_=3pr|%;eQk|3!2Ive>`)L16YD?ne-^RTGh-ln-oO0UnJqDO)t&n z>J1rbn@k-j@_=0Xn&3yMq9Q|Kpg`gXw4(bzHKJ$m`emz_yU)BRI{!RtakSBN3YpaCrP15F^ZYNvqvd7;58h8>sB-PVvfLj2}C z{o>J*dv5aNQO*T{`JA9@to#IjM0MQ+QkAfLyt3v?bsS@@CRD?rmeydYG`;FHB0~n( z)%%^GF?WDSLJPRy`!qLv$`M(CMrCcp*%>8oL++G>zU~{oiq{#gbzn4U6-8ndvmlDz z_H^YiU}N4(eP;k1T|4jB#$UcO+f(OpRF{SAk-!0F^`a%I**itUcS=n}8c*L$y{|W9 zvE2WfTZa1XKFkDPsi^t^?Siq!mS{PKebQ=h?>L(QD#Cx0McI!b392()~vz(JN z*4rSxE1IC`tOyvG3t(XQ!!sXo)*7(fI>K~o@lF%BnKVbV(4m%=)=NdBP*?hh z2sOmqa%^Pb%->k&4-fWht&U}S-b<)hFp-284OX_mHerduAzbN3*vF0n#Gr?W{!8w( zWc!gzZ;D~91RTLDQG3R}L9Cmn*1v^d6keYU>vi@dINkJoSqBs1n)HrTt^I=CF}fOx zfa~}Xz%w)XYjL{BJfR!5ez{X}j;rTt_d~|9FMh4FTDhZ#IH;>k%pYP!Lz7DcpO~y;hG;Pqk+e1q*3b_laP8hmH&d-+Uviz=f;FT-0S#El2Pd#CAOQMg3X|;GD#61DY%(9R2eRXk$+!@$67ryNJQ7mPl zdZSU+fpg2fvhj8EV*VLqnKw=DXk-Y6MU%dD^Z=ybCxOuP75+nSYqAy2%*VrlTd4*x zh)X(4Q_-HT(c`5t%mesQb?P~r#bagp1*{du$72)bua+3y!w63&1T(RGLQ3w~ksI!| z`|23q9Zl}ZnX@#$8#iyGq0u~jGmY;+98&t=zw%lA`O=Lk3eWuMxM$b`WUao-egdji z+jaN}DBz8y(Y;W2h!hlz*t@xP3w)Z=QXl2-perj;I%U=}{fJ(uCO^6tp0ok1WylAA{g?CUjqhFU)q&$pEOHw$()-T2 zxE;}xp0Av%@Cwh%{PU>8k!%ad zLz;&@TnU9&G$r?6+&adCDpKn64yhSNK<&L@`J5q{ZZFGY7&kb(E@M>KrhGIQK>co? z5Ygv>|0h zj^K!l1K+O^{4wr8eWby?OKp32eqI_7wfX7vDPhXxKUeZ$`ly!l0ji75{`?CXsy_yD zTQpvIF!^jU0Ln~QP9CszyT_Y`wcPgf1dq0c$j8z9XY`YwPnWJTsLeKV2BLp4NKVOa zOHRhsLczE=ip6{$bN>U+F)$=B?vdQ%!3Nu-2DDqmBHX;jCLS_hjq?f^9qi|8JNUh~&^c15_y@Rs7ex;t|2ophV!zslcT<{7~~{~ha1R~Wlr zgfoicgt1tn1Q7Lby|+0uDz@4Wq)#m0OEy*3(x~$&WPt){jVbktO#a91E93=g@N_>= ztY_Apv{Nr7JP(Y2SVkV$vpkq5OSxs%B#wRS<$~CF(&f>7xrDnRMqVTFitI=(h5z$9 zuJFnv3FkWB>c&6*j)~hjZ~m3yZ(|jbnF^k*YffTAv_jCvT{1eLZ3?ZwT=~IL)-h>I zoCY-G2=|SOYO8i$W{jkJ%_PPA@|p=Y_az>R&AOh1Bmg@XPKVjNoV5JUo=n3R-4dj1 zQk4_pDwoIshADb>;06sxn(FcqFa)QAN)DQ0rkiQa3si_X5LJ|-otG!k6u~GPDsj^& z_~E%4-{pyx3mvc)FKFwKnosr7p-5Zm+r*=%%b`ibXI^eJnp2+EKsVSNsC1pV$S4kW zj5rx*;tB}`b~5!XBuAMeU4fZ!^^*-ZMH%z9*CJg^9q2@V>|FABVo`tIH8@5g;k?)S zr-#1NwF>E%CYK48m%1LjmOmN)0CDILjHe(N2CQV>4y)-dz z6#gH1X#&2W#tr9ks{KD#65SxR#C~q=aiv;@22m>qFCV*<_-+ZW|HUWTBr90;l+0Nl zH<4fspI6g;x+Z;`i2X^EV)H<=Eh>sr{&;&K*H>x2SudvA2*ydGRLeyoNvdn=7JuhP zpv)2)$CnJnv|9E-Y?n~Om+?be2)IKzXGEkaa5EH3FLznHRTCB39`YH?^w#&nNKHE;jY?!>HY_W?64)J!v||=c^=Vy2UXha$;OwbD88WAIlg|ywk<~ zqI!9-QH!yb_)2er%y2u8j}|AcirlLaL#T2eRWmD~M!%Z9Zlc50TJ2RQcRtZ(#a$vI zGPKK~nyXM8w&|eNH}9fSLm`OGa=Q+2(N^QB9nhH5t^B>(Sct%^m!+NY4w-qd#`N!NM_Nm1AiT@`+}A?Mp$% zBTo||cj?!}GG-IM^?~aJhC%T=v(9DSO* zFQL^P60lyJDz+S7LnT`G+RNWf^{b^{tp8wKAAw7rCZnYYj9K!!?IGYCB(z7*Z+o;( zNao1&(mWe_d}duw=1B1SrzDE{_?_}Q6T67t3mMdX7N!p!q&~=#@9+W!GCB!2FX|@r z%f~vHoA*&~r78rjkAxEfILE4?m%bPEbH1eD#M_4oq?XLMrAJZYM9fjpJ_u1rT-Bh` zF(GoWI->Q6OOV7?sbB37)a(DsurgpW7wCysoJ5@7ezyX6B=Gh);yuP>**K|XtF&Jc z_vLd+kQ{e`K0u5eAPi%084UWT>|1u|F|EkmSYgU0UY2sWAwsAM*81hFqA^Z)R)Jln zPU{9$12ymewhv_uWoG+sh>OQdBm6#o!7~mh<%zV;);EnJpey8Aci_KSEn51eJ4e@; zQ+lsaFSGiQjZJQps@>s8$A5+z|MqBngQuQJupB$tTwGm%MGDnsV2uQHU zzj1>M?|yT1!+h$sdf_NgtvjtbT8EFroI-Vl^04`lkhUbOq35PVx+Dc(FP4UbY)|vQ#dn7t z-6x&^r}#HXGE~kuJmpLBVSbx!?BV7C+nI*;&pl}Fp3mv*TgHPXK_Hij6}jqBFo>ve zp5|;_IU5^YW7k_Fk{A?zLHa7$_|>KqqUZ}ysDml9jZ8I+Lf-6GNeo={WKY;n4p7K~ zoZk*Whtz*XKpDrfJ_<`D;;gd8oux9vmGoFW5M$n3HK!Dpn$PT}b^w*qr$Czv)r#J4 ztqwR@5fkE=dxdo^J;-XdNd7sX)+To0MUw(8p;_~R<~oYYJ6*`!-2kXbM+fC|OR ztg-YJ)4;b1a8Gzi4m4YZ=Tt{V^0yv`p}p$M@83@}g+p$Um13SR1~Yv}+c3@h>)H%w ztPMK}Msh|>uCQ#!G)4c}i;mhMQwCDn)vrwY3u0*XA9y57*UU*z+5uT12|Xx6;)4Nk zEXO#DUI!tLeQTNSeuf%V-9x8&ok3IvQ!&f|7VdNtO6RGVlye$qR&SlLJx$Yyb&I6Y3X z?dJ`m`US?=+#Nvp22S_QVv$tU$oU)ybvmDr&{!(&Vd1dCR?}FQs?-_rohwMVRJU*? zHU5l;g|;02CXgb|@*HpY_H<%tggeEFqGattyr+HraI6P>jXE*&0GZUPPHP2n#L}L` zmCg^9a<})Y!=`8r8?+SRcN*COdwBO?h0)V`^nn}@#uMB`i%tT5_3EB)!^&uzHIQv~vIrz{QQGj^Y(k2S5{~9$XwA~qU zb5V2gBF1xzz~}Xq-LZWpxRIT4-WP#lWw|r zkBW&CD1@v~5%r3@Z+Ec($UvDFkr@=f5qjO5KVxu$5 z2rQ9fnQ$zISSYnybAXZ{ZOr9#>eM}fq9HlO$StQ=3}-nvr`;1UaveQ36-B@T{q=^Q zV4dKPd|^DOF3Uxa>X%Firrc^$no^oBCHk4<%|rSKFiL)TCZWX()uwj$6jVL(De3y{ zD1T=vbUUI2KFPEB$j~p{@VMCa$pTV0eqN1k7FW;?OGiW)MTKrcVe)sebe9C&4O}I( ztbM4zifcf}9NE|3ZxR*tC9#_5z22y+VeSJd7v;reP_kybY_hI9;6RYfpDRdM)A}oa z-!O0=9^P%W(FGVD*6C$FPnLr_fQ|>9?r}Cq*M5E6ey*x^ejg0r)%J0&0C(eaa<@9j zavB=18A1`&a&8^IfJZ3o!;YBxrk-6B{PZx`%lL3i&O53XGP#o$RhS5dr+ovdKA1~n zP8`7}dQ3~NW<>@a4DnU;Iy}S8f(q;^CBD^Zs`YE^Hjh$Dh}t21yDw-cRuac#Sq5L| z1-6a}-{*5a_djrur)ou}_ne3zsZ=$ZCb&nz`64X(`AzUF>h<0@7_e)gh;`cp)&XzQ z5vAkR&RyQx{%kGu*t9%vRx2Nv_F$s)+Tmh@fuo){;N4`Cyo5`{tdjh*{)!2xRzFkhoVBV{#3viYBF5#*)hRVIp_=A1cR^o@CYt%zDw`vypcb0 z>xpxCfSpQnx!SwSmvBr1xN)ZM2*3Q>z)aB6_$e_xh=bid%Bt%^bYoW$@c*7DeWv8{ z37>`-ebw!yXkt0D-fbX4=o=Lmp$H=j%6acrfA+!U`_idXk7!V!UG?~c=;^I;KT2KKuUN2VSpQ{v5_%-jxdYtv1y84My_c-c z0AG4KkpUP3cW0mXE}vKn@uQ1*flz78d(b#&*@-;>2++~K=Y2AxKz&WdTRN$0jFz${ zd2am6ckkr1+oZ}ZBz6_LAsDoQNo@*2g>C|=$zW()MiyH;S>1T~3FFQo3!iTybo*6c z)`=Cr9p$3lMXJG#x~SB7rvSr1(rjp^ZKLwmOr?lVy>@oismQ@er6fzFxS*&=H`PH; z{D-URj}lX2Y1f}eT@EEri|8ho07n468oUW>2vBihZKFH^`Y1u9Os|h>#O?rjp z|IF)h=Zk-PU3NC6ZrvIhc^^*L81juET_KhAZV;`7=?q&k(+z|VQzzWqh0yKBEXv1A!dDHtThC9L93Y?Wvn z_*Fndl^)M&PZ`LtYx|Hip8`~odv|95fkCXPv##Z!Ge)Rf##7e91I7zVAOFw%E;$i1 zZ#$p`X=;>jsLb}&C&3sNLXQu(lcJ)Fa&~J#-XwRU+MxARI3J4HmuOkx-j9ETPpA!`+_SVe#74^q)2IHdxQ%b)oIK}1vs$9+8&U0*R``0{(eFyMrq2QGFlYEgk$U>9E` zcu@0lvOgJhcLHsmWjc4mR*-`VBLY`tZrgrWA&j^ADTUHTg*7^jmFz_%4ssF0Y7C_!GO}# ztDBR}sZF3fq>BwVnx(YPc$$N%gyhKfK;$;6ZnXd{vr6Qumtyr0(eH=5DeYFvh3HBf z&aFjvoI{@rA9(U`4`64>I#my zcmTce{j453qN+hrDFd^*NsI50DZl~`x&I2#1$iS4)W;nGWAD@FC{C%Y&}NU!Q&)f3 zvi!FkGedTOjIeMf9)5W~dg0a1*T+0Q>OE|AyiGc|ML(bu-)+0`T^y*(@KoSgXMnB%eHkX#`So)6;o|#d{C!1Lo@EudZWplv1zZ-)gvCYK6kNV_MQ$M7qMA+Z*Bu&)fLCNiMJ2OvuJv3-MOyN&vUDgqY#W7m(Jy9FWxz=X2u@wJ4u`k^)wZ7989;pc1$YMl3UyjJUihr&wU64F0Gs;5 zef?DAlLM?bzvb0=4)tUSIiHMW)wm!h44A!t`E^EYz5P$OU}Ueu)Oeur%Q`C{Oaz3W zou#bRAs2M0!|hlT$13*97rD+4Yy1qKk;Ps|a7;s+mH z`Hzh!fqT1ov0aq-BQiS7V%q1T3!O|0EWx8r$&;e%v|nBOWIm!GIcnrc9>ntId}7pV=`rybj9}^ zZhT%>WUo3sAE%FT*AyUw?vnr(s1TAMcM$tP*_VBnwFQE{1=6*Q>8fY?Q}0u>GC#OimW2`_z^)-$Ybmi~+3!!;1sn z@boean1mgKKw}`AMF#E`6EpLlft%^vSAh$A3GkXz5OgO!4;Q|=s{ORg{lKjV`q0z; zTsP!zo-|<(O=tB;Y8qpyg~*N6Dkke+d@5n=d?U8~TUf`=lIOs6Xz0)jSVvwrY+<@D zerM^SYc{XWwXdEaQ?C?U^I_^C2Kb)ibp~Mn_)43!YsOooDZh||VK%o1fW``V#p7aO zHNg`I`0*uU<=~^B!q-zEo?KYKbz6tzKigLb4wA(vDjp(w2@}1WNX?~sUiDlQ{)_EH zYS5YiQmY5H-X*0c-ewGqaY+(irjs0UTCJxUT;yHgo%ZzB#*`n-mk{paU&zC;-9@9% zLVJwJF@k8hT@kH0QXdH2XdhHYr}`w*{r;jlfR^)2O^T`&`NuGnA5INeskwS2WDL1^ zFKM?RFdfGq16kq0(?dI}C}vLpbDc5E#hmjI>f+&e8`zz52xiWn8S5m7l9I)#Z!32(g&bRBReXl&CaYimkNI3ao=&dfoazNP7#YDzi3hSS1DNl5S8^ zy1P+OKpI5p?vj-5?rs6;mKLPDyCeijQ98eUKxces=3oD});DXNH7@7ObDq8Tz3+X; zwXe%q)3w-a%PRcvd~5h^ou<6RM8WLNqytEJc=O%AFA1HiROb$Z!S3#d*OfCEiFC1V z@B2SiP98Kxtd0`-zJW$VEz@T}*pRhe!VEU6 z4ur;!KX#A2s+TygPB+n)97Hxt>KmUX3F9ZoduySL9aN9Ykmcurtaa|Q-antj)srs!STR=R%sap70 zF0J5ywLvQbEpLk9z-MQSyVY>I4)-CMRd9$r{1s@&+*!rGFNGdU!P>otau*E$#)kP% z`ZwBa{TlZ@UERPjy>O}za>;&N3X+(>pZn1h8?P0wj_0q59UV|pSmBE}hGdpe7UqxU zIsqBW|Ak7ZGKPo{=q}aB8B(0of_R|2UC<%Gt_aWX|u&zK!y9b3hU~qzTJ%6 zNT5WcR(?EIl3V}E$_xfH8bQ_oFQFo3?Ys@tC!UDRE*e@mkt`y~TiY4zPCV7;{s7K- z1*)2rLpD;$o~{LlgnflYR){>8&;H8$mumj%ckswTl$!fF;uTvW=jFU(;KfG4T-ok* zg3pOLLl&Uo_jPD!;YX(QQo!}!l*rb7SBLjmF3Y1rpjq`&e9O4Qg6Er~vAR?6>S2Tt z_wz8h5$^d@1|zMRNcJd*$Z4#@?BVTlw7TyC{mEZqq2OG;wX9a@h$kz)1dmT$kEfIP z*6in1S)NOqPpbEy1TX?ktZS36635d#19yRl6)uE(Jq1BxG%oeYXP!mOl z5N~g?1S;xM>lEdLZ?w&!>%OBc?;l9c3%%#jWW(R6yYQ&1FFfab4AcY>K%u^?{A!68 z2+kT+_y4KY%AQT{pgGc1NjZ9P$jT#rSS>OUHxWZVFEPD95dxBlu<_H*DsVXl(sqZ? zvSY6WzSzZbZkOml996y^yfQR?JGTU#0rX;sN7L%Qv#@YnSdTkGZ9xByd_PJrMfA>E z`{BH$qo$98&JL&$C?&2R@*C+6Aw~t`vEvDfTCJhBHPs?99H2Y}f{yny+ zZ3pknvQJ~DX`({wqxx-#g7UGg!_BknER${)aZq(3xBZtaKjJ6k=X)W!4_WM2qo``m zQ%_V4zTHs>;u#uy%WR3o4If8VV=&=S!t)7B%1hgU&w9%&pYi8>ozxdeLqg40ljPZ& zj~Q?sw;X)332WJE)H~;~AJ?Vqep>iT{_`7??QHDjSoNG)xDzO{6nH<#r}mJL9$~MG zoLKo^0njs#@SX9U=;h{A?)k;%Ul_pYxkgk0q&aS&41fz0Fyi)a583Gd*hbmzM+b^@ z>KNYHU09^J&x47sMEiMbBkq;TLw0#BqzAS+W! z%mQGZ+o&FhQ1JkLpc3)5Uj5yP#huD=^Qs5(lrEAg!(r}}F_6B_usOJI8H_g{pRw5G z*2M%rP24JX+o|aWUS%>e;k-lce1FzeS*{1mFkQx^5XPdh?qrT-R(6*H3{K|0%4B! zob>wNpqbnL)NLoi?oc(k>1C77oKM<}y3RWK?n48wa5sUCR(*AM%DsmY0Dc6PP6B|K z{tgwr#;&S4?EqH}pTYZq%OSAJA8{8_T{;21Q91_7>>@*Q?~ddphxZL`=|+Iw2Vjl< zj=EvZ z7RGiGIn!Bj`;7DpH>)Rj8b6SC4x8Ife`4PS=s{gEt(&lXQjV#7NiN-nfKbj(iY_7s zwceMHF$?0iqo|p)jMn=LSM^lcir)gT=ky)KQ1=7MJ4H9BJSup_CgKAH7H69zz*$XP zGn96Vy%KY(*QrG+`(fch@FR&5T+#X)WHsLdp<4Y}dl#_cy7!&zGbW;)pL=e3fpwF=5 z0D3+P4~0YUtSRV%sT_w|#q7apUKRn9VaxHZRwBQd8)J`)J2}wAr)bhh0?cOpiEN6^ zGmHY!j}If==Hxf$0X{FL;8_R+aA)`=iVOhmG#LKGb5$9DU;>v&MFGnak~~A$HWk*1 zICLb4o&f&Xf<(rgujfK5oiavN?B;CFzoBT4AKEr^tzVg8vy}n8y9cQWpDd7JY`}=PV6d12ZJ6ZUTmqO~kegukZqI z3_UUY37Jqk3KR1@=qGuI6*B;GxW8b2b^wa?H$rU&JnAR=9T_e69)4oJ3%PTb<%62- zV=usGH2uvm_~vnV;o)RoM6Vb?pGZ|!054bB$D3!K{>Of;X1)D5l48oA0KNJN8LcbD zajeXXt8<#Lpr0wHV-iZY8wUzqn>C)ohx~fQ?2un+J#vlpj+DCmMR-p3&YCy*FMjJ& zh%}>*@O?%gU^A~VtI#A&vDQ)SOdFP?!G96ewgvrMOP&@=S8 z$Z!y2lL|(8G;vp*2d%`HRbtdqkdgqLPjT7wmOE=Lp+zaFq2u}1wu8SYU?{<)dY&L} zHNY?NYemGQgv5j+-9(G!!uLz=)Y=`Eoy+kYe~3O;skHtFp73ckr_FdUid&YoogwfU zGFH1vyg0pLH(P{W8bN@&zcKS=m^Z=oX4H=o`BUXc-IU#OymH;TLal0Y%s*$}xF5uL zHR}_vS#5TX_X%tf{sTi83$FjKI{33K+#l)B%VI$1f#de-z8GKzV)7~T+J9z?xDMG?K#BJ+z-0KE8;5{>TQK3N zF6Bd+WLLUWFY^_b8wU!Z0s0$ANLp}d4r&m6MILPIm?7J41qq_ZvJjpVVZ>geXn&OK@}Eo)v$) z3}3o~`sE9HkXG`<6o~0a5VN*V7wl_f|ND1Ub}r2!v8L`~J#CBOSx?kHL3Y5u-cF_H zvbd5{2YBK<^gwYG*Dg#d*$$fs_5lcL^iSmE8@8kR(~E^i4_rT@2ZOwVBGv0v%jrKC zqp;eI!}T;k`ccoGvjb+deW%UP(|?a)98|2xZFD;MK~9U2OU(3M#eY3>(z5C1w78M- z`D;N+@y_P^4h7=pLMLZmu$FJp19D3rM`S0ge=Xh6AgK1(v|srbyrRbw*vGn2pvsK1 zx_v6-4EhD6y`0$tN1KJXeMvVn}gZKjidzQc0zg7*YIN#b}z+@7(uknAH%OCVc(4R}BWElsu>7y5 zIW;c!OOP4@UoB(5Rj~##l)ck7Krp~VIoLY0omAZjP6F28waRYM1h_&l31;#1v?P_!y9ZdZvEF< zA4oUT4j@g_iaJ#pZnwofvpRC(#VJ7g_cQ_sEs#}x1}Lq1S`1%@BsBflazs|5{g;W6 z_PZ&oB{M6m6PIYv)LF;HsBxgJ+kTWliay)BLfA@_gK4Dn@u>(zsHSt zX%3oqFNNi>VoZ=41}493!$?>@c-m}CF-D9?7vr!c6<-$LoEP8 z=M*F{KuQcMU9W=INrL`+7VVqWlWR>u>{n!6Wq2{>9>07c$%~`f{;yfItyt^_EZE{l zb2=h&=0GZ-@33f}K$q~}(-;EkYlBIkDdTI_J_(ARO1qH_-1fs_4B%O}dt&OhoSCnImw$ znkTBfaFQK2(^b_1G;4*ruH!WUwqIUivxoWWZ+QR08p&Vrl<(RR&*@Y$*bW}Y38xW+ z`vmFyw}XN~m%J!oXYPl@1bU#}C-XU?K#m6}8GpDhnFdFmA<#L66Llkb1&$6zuJkoz^2<8?;T*U*cXX4wr$VH`mNA>bH5-5W9=ee z^Xu6akaY$wiV<2wanL>;k*vb4%z>>MDWTTU#*sV z95BKD_6UX(z->k814l#)+((#u3!Q9g==!}kx06Ce@#*6tl(k3zEPl!!EJ2z#LDBl; z`1kCeb5AHhewa!6^nLG{9uLs){tdSm$#UaJTQmbmggodhT(==C!hidgu`LH6vQUp6 z*b&P6+PxQk1M^?rqGitkluGpvHgX}yTdTf~bh{(N5bnR+fY&V8w^swJ;6U}wlsgrg zoI7$v9#Z}1_f(`n-Mw$)OIVURR7t=U|7*}VYXW;$+HI)n3Em_$ci2DAPTCxmuB5pE z4#n2+*o%cjeRD%~4a5zi+ZVl+diZ@uq6VafeHTER$F1Q)qJWIt$RP7}uuix9Kb?wAx5V}_u(RdEv_HKH=!x5fFVhltJMd*|x$V%kG{ zYo0|2m+H(jO`xt$cvcTs?jP2?&Ric%06QzrqRVpQGrP)NTAzPT$swJrRw?n@q`L1q z&f^jmH9K*Tie%}5e?sjQwZcOIbLsZlk3MHNq3QpI4sde7x79|>>woP58tbdd{avYc z0YZilIGz3S8y43!_x_7628G1IcKS-czb?=G9X(Ae(9kFPbPKUK|6~M6Gb)f1LIns( z7Gri}Wr4OwwQ@LiZX7>RjmBTsX#T#!qJ9}zG1))&y}9q8T`L|47BB&2jOPzTPN4t_ zYBVff^?d)Mj&+UCN1p*m?tYVt{qGHyA_joQ1LwIR#L@uMs^Jgk#ngwOuiiW!43Thb zx}XJEJ)=Mm;xNE|^XpE|-_cb)BqJW^TewJq$Wh#+vqFX^G0I89pNT7o!;-+K9+feL z=s)h{9EL$CZSntVjHm*>=8m=}(Tm6C0I4y1)6u$^8jjs1s=3Vw{&(6Zlcd|FWhkuR# zR#fj->aV7t5&s0D0q^jR;ya|P7LDBj*poji-lA%PJVy?E`hggfoktIMgTN?pF!#MQd?>kPvk_p|$MXYrj zARi98w7@)xV3I)>ya1ZC8Mpv|n|0^1di5sq=PMqFo4+;rUwM)*-C;dwD>q^Qsl{ui z6`+jPj2Mk+n+^Uy3y2E=wAFx_k%tDcvxs6Y{L9zHWiFr^e|zWcMx6S_E0(IA&u7lD zfg!TE?&IihPp!*<#3z7sW8xE`{*B;Cf_BVd-@)rJ$XwzfI80$Oz$QOeREzyn2eT3@K`HKrIG)BhTE1y&?wHW6`v9( zf!)sx(q({=13n+gIk9#1+ees#dk|0kKRIYd-1+?SSnZ=JUSgPx&i<(g zxW4a4lT>gSDHfGAgQ-Bi=RE5JV$_BDrX9rl{?BF*DLJTb?;e#ybz(>06o7PunQCAs z#_kI{Bm#Yi(0ij{nP;=0L+=BA8RPF?zLgNaIZu@uKoE9R&kv$>ZK^?Y=2I`?XAc09 z0pfXxE=@7L-L&=nt^h?dLwiX2A|x65-`se9+aX801+xQSA@J3A=9gBhC#4`QiCsI8 zFNi>3%-j7~t5k?8jsKoH*~9vg}yegnv z{)nXu^Op%EPW@I`xS?xYT6)df8K01VTk+AIO%lQ74%O_vcfBdfu@0hHhd%*h=LA>u(r-|^%7YGsssW&*9KhZ zi(t#^V0t4bjI??eLD{1JwbE)7ciS%|)d4%>N8%70i@7CPhoC}G@4Eq6quxY>95Dzw z5ZdmY&h>*2;qGgOXUp#GRUW&LwD@*45ied-P?Vk!TST2o{fe4FhXP!$4JqcV68^>f z&kvBq96hHPgNX&_M1{~~k2xF~+UMqKi=AeU+&R`|2_;RvZipA9RY(cgNR{74HmyYc z89+ZX)sp0KDJ*sX;d8nIr1mY2qIA8n2?&p8zk$ZJ+Tf!LTLeHYSyU@TaKj@iq(&1AMGyfYTrn9oz3a7>2}+yHk(R3x>;>_ z%9=$Yo}(Azie$CpN02hKHfB6t#xHMuQ@s2Y;>^g?!~;A83n+YjKoA4Cnrh-G6Rckc z!k?~vIMAn?&gB{rM=&Gum5~$cUs`PF>;$ttY;^c?#a1b0|$6UZ1#Fn@mIhzv{yPp z_4Vo3CKMM6w}~`(3A4!G#iC0iAZ)3>y^;H&7(FD#acUu?nD}?F*Zf&JAy{}gX#Hz{ znrz=RSy*nS(WSp-<+GbY>v`vLpCXIhmvw#J!C4xQM>Rh~ZV+$F2kjq~-2Z;hnDR^c z7T-*R=l!!}VGg3Vmym9@)NvC~JJNUgj(@W>u5EqDW-RZ=(y00VT1J)7)=VZ08%h>l zO=jheps(9qnOtrr!`sbGuRjk74C3_JQ?ut2^dhB@NLQYI&q++$eVr^PN z1vd}R2zJb{@!q0c%F~(ogz1Fg3W>qS=Um-WM(#l=Fgu~5cW*w$M}pEbg=jn&;x2;T zwzy0q#%;2nC8cF?Gprk^AN$p#zoJo3fSS!jhL=I--+tb6no(I9oU_)WtER99yMl|$ zvBy!rEfy=Eu!;9rFgb--wtKXsId}b4!3%;SjKHkTFWH2I)2qRBNY^6zNe=5U!()Ee z2hiuk?c=8 zsvfitb7ydVAd;O?e{Ni?i0zab@r{LJO>FqtC|@~mwU$Z9=G_^>fO|I|O+6B8Ym#tJ z_SeuMh~BXB-P%E_xJ+c(lm3rn^zfhd`b1O)#^~_nyL47t!;8frweDyZ_Ubu|a%k>uoiYU}OMdVET#eG$mPZ<55EboL#(zp#TX1b-%M?AXy z#B{Jf7Mw@UZ4WCRrlVKT(+1c66Zcx?Fx`)M+a-Yjwbfo*PO(7a%ITYGB zN6=Y%VIZMsH2SyXv9HF01tL~24Fut9y_WNwIE^eArq|F^@y>$!SY4PH{k09uBilWc zDUySG+0Jm@fx4^PYPiwd35De?7k8gcHBM;@F)qOjU)j*M-xdJ%-SIu%By zO55p2a3%E-S!$XE)Y6YaHwl3KWK_H$%&%ov#d|A)qurmge5S!rLD#$Dr(1pK{8q@D zY4H+YN^@(%%pdNTNw?Tn^30|Sn%IBkEAyJcd%o=$6htN*rKM5XcNfj8dYn3Vii;;c zQh%r8E1QxaIW()NVE=$x1feMgFN2zLR8KnR2b)KsAN&S{*XRy-)k)m6a|OsI>r%tN zA*S^TaJXJoi1S`zytTV})#hU_k@*gMUej(PYeQ+nv9THwyfZgafyOM#99FrrwMruF z1q&17pK?jK;F+BVC9GWYez>wY2dd0-VsxX!_n;=k{KdOn^UI1?%3S`B<+(5=?2y~# z4u@3pf;G<6Uft<;5MW@DaabqTX=A(=L?1P{Eb2BM+Lgo{+U-)hhi26VA9T6%RLvmj zaYc;HfZ^T33MjdEj}X*^$$yOSC&-m~wF{Ekhn{IuKN~A#H4;`Rgfvq2XPD}#kz7FEu9f)h~VrX_}&DN4fRI^yi&7B_AF zGL1YZcRcN>HA~D6n5qU!G_i4|raGtp?H2EFL z(_f<%&zPTzYz+hqn3Z1dfUl>`c1?PkVf1 zX@HZ`y!6#E@RZ-Eddev#wP$oa8He`jA*==0lX|tiYHjfeiJht6AV3(+JpZ-fj)hld%J z64-uMRNd3C-8uS~jhB7><3m=EQXGk%$JGqyPFKv=_*FVS$E4yNP zUn!0{wzSL8tGVlu{5hM^_C1GBiRQ|iie$Z-i_$^+$rjiCCEO)ajGHUOP zOowY9Rip7*D8&!>?kw*9kROvpd7o`Xk<(e#kFZUa<#@ew58|rY+aq~v+2V&UD<0lLnlY>_wwR>Q)mdxzgsjgdTd2TJ9e@18~X6CK* zL0nyK6nGGDJPXlbN8wvE$Q3tVIlTp%@(68m5)yuMmY%kh2Z#X~`0&FXAM2H0>E zOotwH$PIM+y#nDtBN72i*f5u{`68X}U}xMZvk#AOMRG^jz(ce}wuVR3xf4G0TYF*f zfL^vcJ8g;rE*2H)qgNH4(Gy?1?;o^Uk9fbri30kRj4N# z5qvBFpu}KGFqjbL=H%o^a+9FArg&DM4n{mYyKHTqw8_Pi|ymV)tR0g3%7LF9Z9B z;go1#^hRy)5#&h&6DDrHJ5XriJ$^qyq!O6LtQy97Z))*U@^@H zb_8%>st#tSJk^RCo1+949ME#JVHYd@ac8Od;FH zb@{VD5L|he@ljbBN@&Ei4SCb7k|ha^4wY2sjl6NXJzP+@) zq{Uf+p# z;iMsUCER;zF_|zlIX65yPI75>9nX-#ofQ)> zpI7@5MR|F7=@f`7JA`R$5``BR@MV-J^KkcB%@!Z^w(pV}Z4*VIMUwJpZXL-){wnk@wz(PsZwr$mR-8*>?FXnym8yguf>zw*U z4P}dsQ!7i$vGsILny7UD`xwG+hO@^@J9+H4r#`TWaw1o^R42iZOTj^RK=T^WDfFLI1_SZl)m_Jtamn71hZ_QcOkGt3GRxEi4{ zt6F>IwS;gMd%+upY5mxWx~`2+rtE1w6Yq*mFa7(nKgjCwj3xAO(3Iwzs*L73P|<$2 z!A)RZ_Z=|p4t5vL{`%$jM3eEZRsTR1e>Z2gvuFMx1wY2x9d1oDm&Ri`&-(qKyEqIo zwrt7|6Ho1R^N6W$VVvNdmQJUG7GqCS4JesBLamawr9hZLqAtc8(Tj*tnb`5%AI~4X zu+~QZ3FY1~6&vA>AXZTD%**QIkk_qccoNDJ^SFTqivH~(Lu#_?-mVCnpe}mjX(^r& zsJ_t|UDfcwfF|oS$C;Z5q&`=B66t+xe_TaIyPZq}Jcdho0C1>oaLo;XX|`6ijb5n4fyp5t8D=q`;I9r%MUC;L_(e9y*jN4Rl{cS4aE$d%V88?k6vH zuaj_rEK91WqGg6}qsO<(1(k0zt>2K@(10oHGs_c;1L)>>EqIww&1|Ffd^}M+qKc(!)7OTYKq<1fgDdL=9ifgACDU z<)Vr_Z#Or0?n1j9h;h58{FoOnvx^BaG5PWsg-4<3S`(i#o;U}*?+-~`q_2o;A_rmc zg~5HuNX8fwuVTB5FyZoz`?DU)Xo<{+(!Or(Xpt?chC@uO#{J^W%HdB;$6JSOXnCi_ zwvw;-o1J6;xo*L)tviq}VHI6Fkz)ee&N#13;rnFSOdt{*K8EYHRZH12kVCmb=%>fG z_T&d06(F?i&TS_AvE@F2mv?+xDv;BU&K=^|swTKW5I6TOn&Wpq1!BrvqBc2pHtK+G z9p=f?_-83JyN@_VFR)Yz9Hk;F=&y*@TBMRdh*f-~D!Hb+tfn+NsYcDLm)o52#Y4uu zo^#jE4xgn{$dbuuQ zeqIs9e7QBr&~IK^~}FC)m9ywNP2CGqKXvCl8~CQzu&KuS};b9ZDBq=$@`W;9u5 z1p*r)$2FG2E1{n??{f|N*}0C47#$I&_VxsGO^9bVn_>UXgFuKcOCOZAYMR9^{z3OdL`-#imiBQ)zy7bu;2v^Cl1m;w{h?koeZaAE#hw~#BVxq05EXez_$3o4k-MGY zW3xAMe$8!8I6fR%yzrWQ_&?7N$lCr9u6rXL>)hVPzg5 zJG^aO7Yx`yfvsx>X@c~Mp>!CF_W_4ZpC}=NqxA1W07xlKIjo{pH{@DaMqMl-9=0Zm zAo2}LS$|DNlN~M*?gH;F#5YaI3QxvlX#Otm!NjpppnB&^H5@K80x6?SJY(0;S7MEW zn`p#i(02>>b<%8b1bi%o58&mp-~M!~O1!F8wQTxTbpSsm3WkyZBlWD2(T31DunkrG z0)+K%mrL0-rpzrzsN`M**~4Xcz{1)D6tXitOz7Pp%g(!NoYb{Z$D6m_g2#u-<-eP5 zRz+)0gA2zU`NQ5pzP^d{5NQyc7Rn)AWNV*Kf0bH5{EgwmDc$eTC4Bw#O9*D7eed#; zmTl4wGQ^caw)q zAy`Gr3>Y3zS4OlZB#pFY1b@>Mpfe`S|PMA)OtoTGrH84zug5o7VELG?BT> zkvdpLSfV11x+{sUTP3AO`-l4O7xQ6RA#WT${# zI3OO7)%PPF6s8pP6CJ=VN$_Rt(!M69V4M7E(Z~Y49y{Li4gWs8H+MalFb9n*^YrF0 z#0@#$y@y7n6dIQQHdIGI9vyyl^rm?-63@uWEXwE``ySVmt)hM}Jkso8%HTU$efe59 zC&qk4(W=_4-nX|GOm7drCauoI%p9sd4xQ+BYLl}*vvnl*QQ$~icYoZSj{?azY8KuC z%gYgTMaI4om3bhFWUR}rgDXRA(v@436D%net)YUs;?)#QgoB26POxdcu=%V@4vXt? zGXr&_d>mM-2+ul#=iX@Y0C#d*D?qa_4M*f~EqvX_#&KFQfsHA#m5mNI+4fKT$1d+B zQTtzAyr&DfPyh$<)dUZ*?93sI{M3+=lRgveidt6GI6R^#d>g!IfQ+VyYY44z58*2) z&un&*cSBqp+g0%$&QoS2p4)qxOzhYs>QFb6T;G#$_1*h`{}lh5+d&+&)sjp%l}SM= zk0e7BQ`1_c?$>onHa_}*04r4@+}NBee$|E<`pKD+uDP5b=E<=~73%{%efd%7&ewba zgs#d|i*8Rlj`yO;XW!5G~>B!nBsD|@Lbwq_WrdTX|1VnZ0BOE;}(>dw&B@Du3pBvs?-4c zx%wn=a-|7QNmZpJ@0%^#?K3XiqO{uAJjI9aE7jGifU1w3Q~v|heIbl{vqt?-)q9O+ zW-8OFV`Ns^LhGi*|W1Jc&k^05*U zx<;0Q*v`d0!UleQHLpe<^=zNoFgu?`KXd=y)D}t@)9rw~ zHOqWDA%sPmWzoPu?(Qr@P6FjVMSI!oE_>#7UU|T~Z-Rwwxe1qg-S~`%JKEtyz4=P< z`MWvSIE3)`g9{8HX=m9QA5T|K&8pX)to!{mJ?qOoY*6nzUE#LmGdp&DT0D2H`R%0T zIA?`gAhMWGAZqve+(*Opg6SKRXX)Ow0V}t+v$r$b#bk3=*Oq(SuzPdHaQ1y00qTC& z6y{@`V_Y(%JtG)AH$VRZF;GC%JsNRMeZ+k(MJPn-%`|(Vr%G@VrHk!!(ddtu;?pBE ztFLUC-g1Y#sJ3t-`p*1NVrQv}p|rw4=wWu{#QVenlPQTU+hV70ChLA9Gr>zex=uMO ziD=vvhO}m)%KG?r?(cus;l9a-)GWq2gnuFE#Ai4uQR>u3K*vY(@LISU^0HoYUL3Y9 zoG96i4brMpSKF;4XB5Y)mJFslSwj!0Ss*y8-*{gl3Mk*MrBB;CG z1GT6SF?2dgyk$qGi4u{%keeEPweCg>#dz_GTuj8>O_5yUqw>nv)DYsil8Bsqojv13 z{E>Oow}DCL!RH~iAANQiRJXUrS!>%)K2r2AQt5eH>08N--nE%7I$sa6@o=m>hH>ZN zRSp8>m;ke~6dBnhv|hx_)8bA_F4vC5z(SZ5pC2vD$qGT!4V*&i#$)44$2IjBSZtK= z`2MhOcXG;JD}oip6Ki{smK=37unrIaxp3NQRIvla0)><4bb2>(4DUj7;PPH0)W;@MxZJ z24CBvuOOdNYdV3cJy~;JEf4XIH?iOl&ffZxCV9+w)HSZfN5l7=A6(%`hZn+|JxRKb z>Hh3@upsnq>D3aSrOVbv&75m4f)IRb+iG^Uz5$yLa=tBUNH*$R!FQk3wmn z`*EIhJa<=XA8K7n(|xm~cj@~63$i<{Jo4c#-ISPUgtRXvm#D)G70U?ca!yKy7;7RT zw9f<42k&0rZ}Kf8rhnhhK6S0@F1_X6a8MP~E-XjQ8rLP=+P8HW`&#^_h*`}1z29L= zd6(WYu-^UD=6c*Nvj2lllB&uJ2@Wo{m@sd;!y`iqX!?M4wM4dMW}B~-;v(Vvx>=-_ zA3CoteSDYLzDVoa@%_9JeDy6<<27g3C_v5<6TV$V+DG&V7GJ;C9)w> z#994__AZpFJ$usaM`h0MKhhnpl4fs9;SwB?Oop65r;F3%~?4S6Qd4SzHpR6SIK>Z8vg z1aH#66CW$XbbnJoZ?;^(pirLq@lEvvpOTuYGLL9Df`GfqO!#u$UZTCcOi`W?L^023 z+@z4N_uch2T1963Jzk2_bLC4?ibz!EgH)}ZMNQeOvO=6(e(3OlFwDJ^scU5TA~rZG$YSx!!GNae@Sz0iWqer`$zD@d``8IAar?O8aL|Td^+vyh zK1a9FVfQ7p2k0Fl#+nPkkur&>*&L2h&Vs%C4mmb3IQll2Q8nU3$eM5neC zLlligNoYt4S=oBw>5I^qS`qI(5PsnKpp}jo>2#DvZB%;8j`S381yc~_Bk-EO2&`9->_ba>&WueUBaKv@Jud99|=Y6A_@qk;)??J=& z2K(Sv9siK4MLya_!{Mz-_jGuOh8l8$FC;2lNS0GfR64(@mgcNvVgx_^yOlOgM~x+ydg`s*%c2W?Ka;meJU!ix zRep%I2SdKMVj_>KN2Hn>R5Lv+s=r*2A2(wURWgi4ljQVrc1z-_Z5S$3tMM3<`fSZR z9L&186cpQ$ySqpc{sad@_-^Ob^DIh#l1~YfcxdGEOWP)hT8pY$HZIFqXErC}$_L3# z?mr#(*~gJ*Gmk53p8mw)&uw3+Mqd3<)0|K5MEZn#ICD~?Q?Xf$v6x;f`D!GH`65@j zQmjN=;OZx%<^lRJ%9z)u{8V-_lw-tUYF05pR^#F4E#-vetY=Id)T%n<(_>ST7U?j>ILwy)bR74Ew z#ol%ud4aCqgT^1$9#IHz&W-8)bOgpO70s-?+4LUka?p!od2HNe$DzGrJbqQ*2}A1{ zf=~P!Up00|g>5+z_*atL^I%YnLw!?wE{lbTuQ^4;Ug^5GQ)8rtE#J%F{&R~)@&%%& z6K?jKH|(I}6+VU915OErRR<7%_xQCP|E~(6?2*NaRLb(`jRNw#atOJtFL|oGL}m$D15q z+Tf~a^P|OmnIENc$Z{rIiK@r?!H&PJ@%)7Cr1PNZ#B-u3ed3;(mEC0|j$4V5oc{|F znFnk%Y9tokP?>oBkAfEu^XXMNUpvbg3rcS;;Q*#pwtaOJhc= z7yb$77d$pDw?0}G3)AoNRmJwsY-C@X()poVi#5(t-+owXuq=U}rg;>4lZt|_5Ru9% z259>lC8>3FcWEe{=~vVlep?F&7S}6v8whBM@x5ng`Q$Zp1g+@=Uht3b!*`f8lTu=< zZ$3XJWepGXj?TW|rtFt_xRXuw!q|k?r%Nz8MQp-1;K5p&_0o~=c{NI&Bi-y^*$p6d_1hzOfL#sys$^seMf%0 zX;!ZHI<)4>=uKTLKJYKW4>yJl6CrP=(Yqh?m}=?BD#T88c^{1Rv6Q?nXFD~`;E zj=`0MkGwmo@i^Qyc!EhYN4+On9Og5s*!-*0-C!mIcPt0>WmBVRzw$3J?FLK~HT)>A zNhjM>T;R@IMixdf($13`zIW>3wv!zz{-yyf^l%C<{-(Qlo18-lcM;Ai60{sk;>q2; z%WNi!JTZqG?5sIZ{4l~xEd>#n+IZTSQwsU~eXg;DaM!zc6?Q+l`ELt8fi!;!UyOn% zc9q1Qq!d*~nAWtOKa8i8@G+A7JJ9}RL&1*;YF<#Bt}4B3zMeRssH_o7Qg_)3tFD>V z(?qX?g2jMC_HJt0l@m53sX{ahH_K)4XBo>~N;NFw#g@I;VZmdS-&P({q`Eam2lqquk(q@Rff<4!SF;v>g34rZR=qC&WFm6wq41@Vk2Mnmxa8up z2RW7E>z2y$3x%aj9z4irY&>~L+$@Hn7NVF7aC?(mxn(l(KLrsq*$~5&M#JAw-|Kv- zepe?XvRjJ2p;}lJaWpCEVAi1$T09zFGrQ1c#)805{d)MUzvO%?(lktQnnSP9MiZSC z^^;W~nM4?G!R0n#g95(9_Q_*`9lUzojb`70dO}@4)${$}c57qAMFqFu`t@}x$VWatU zd3+R3GVvz>CGglW?BWEk*jl6xCW)Sbv0;ZxgPM2^S;T_jyVB&8Dh0Zhf+?>>rEK>_ zvkg=DDM$C3bJ5T>Inm}T792IVNGf4h+i|k@rWd6LqnhR3c(U=Z()<|mN_`~6#7#!# zu$aS!O(QuG;Rz#mM}IIC$+dB&3>X30xNsnrvCa!}mZLq6gI7W>rhax(mZ7_c%N8ET zq`I`X-C#&-$&iqap1yl`zJ9H4t9Z1`V36oKW(Osc6_v!oj>>MyK~!yqnnjJn%iIJ2 zFxDGFO#mUFIVGwtXm1WU>Q}5UpPw}cg7W3dHqaNg? zvMh<8VObCD(Zq_7nARO|?MN3-t1AT@o2y9&at%p^fAo!xTwm-}hKj3SH(fcDz+W!8 zG1B+WQD=Wzo1_(b+2-FMMlNj`rl6p(ARMrzk_)}}Emc6NPr?c3F)=sd?Qn0Ky&tl( zvP8^3eu2F-;(Gfd8-W5ohh%E^Y^!8Y;-8J@aqH#$W&7&RG#9`HG@4lcz8?;|eCE)M zD<kdj^4Q}~$Hj5!RGfn2h(H#Q`)!A6B}&q_JG;fHkuiO}rqZkm96e9zis z9ElmdmX`Io8NS+F)54cPa#6XSfYbxN<3i=UP-In5T$m*=*_`+yl9-wsfgxb_RN3Yj zN1;#RS!p=gNEMAru5SHZG~Ya2Skr))uqiONHO1SyqT)SL+m#Rw>Auqm9?-Tn^)f4a z{@qHYtvf^#W|4Z^wIE}^m}fkn_%z8%zW;^aBIk)euZAu3{gL<8>Mixf+gIPz4=)(B zJw$Dq@R(}%)L*r&f~rnj5$(R%eKkUp*#%Gp`s{u>DlOA}<;wiVTdEHM1GC~h0;7mp zXf?ZJ5{DWialq$g%@P+Wf>@W5An1DE0{w0v2Qh-#(B!=0yCb(svK7ATt zIrE6bX=#ic{jQ(D#x_n!lEALr>>22E)=Uu=RA-IGqEXCDOom0Ke!*#4(IG z2PF`z${&2+-;2jo)=vbWG)PM6c!{T>`iz{R7t(r)p;1$_sriJeafv>yZaE{9WD+?e z#A8mEx|{jh6!BR#!aofG-3oecj1wR0-tNy`!LzyP3Ik;<#Vr^!FH)x$ON*w^C~gwm zNjud!Rg_<6HuI+%UyLnAt|dN&T_JIztK7t9;=*rwc2&5$hT< zQs1kQRAy529G9${z%?8Xe=-R}e&uZYeL(`Mgpb>CXBh49yd=W6?XCd*@zi16_03LrN8Ma7HU9VN~FMq7gZhn1*g z45Yzv3%~r`5cz-oOL$UmRAG2ho;!i$;9rnGGrb@{yZxiT$Fe`mn#8cct zfcJ>Wt&SMo#jz0TovQ_KSdc3;Kci~fFHy~pQ7{9rc}VLq*plJ41g8QPnnKe`>*0tT z)4R}oieRYih3QIBCQmDE9=gHq&~f6l5|!;lJ?GC4(=0?%Ac!EDC{{`u)WC<{z1A@C zIw8it5HJqINam4pU77JQVG*iF9Iz;!ziaBZQ+uN5YI3pHz_N~@@+va3|5^6HU3**x5( zcn%K_e${i}?x*UB{PySY))%%lEmr%yzEyJIePfocThcYB7d@&JOf8Pvucy){&&_nYn{Env(EnZ zclJ4J9U_t60YzNEU*E8uvLVZ`KK(M3SSd`s{FwnFI= z9SzXmW;?03PIWB|cMg;-z>AwjevPqkJdwY!FVh&6dkNi=Cfx`G6S97p!9+zx^{QCO z1I@ON1>oU$bjt|XAizTf>1&ln4IiLQ5`iQuR%!bov0ui9`yFC3nL%)`fKBqfp@BmS@RZw9}OLgVmkw%h)JbYU3na+#X?uZ)wGu?*DR|b@;ZfC zBvV-_WO)(@A-#v{Z|?DHL}O^f{raj5(eRe3i>?7V_#O86zkW~3%JVu}@|YWK*yrWO zmM{^O`6F)jQ&#NMM=K?T5VxVDGwi|aDJN5LmJ&$c7LDm3snW^S1>Lw9%OV#WQxbKq zo3j}xS{cl)d(Qv?HdsOXQ&N^dL5RpB?JHbr81E9LvaNv&99Jz&3qO_IE59hl#YbKr zCj(Acp-u(RmWWd};k#3B6uLm)4mf66!#oW&fvy6R8gl*$Gfhta3!mBC`fJ;>#st*N zXQ~aRXh$PfsF9C#OYQ>t7)C$>U>Y0-`ijG2FPP`b&{gqi$vqs8i}(<>=cE}ROFQ6I z3v5Wr4(KcEIcj)tr;^4cTWJ7&726}KFuq9@QrO9H3<0#qlN*MfcxyZAr(2n}!KgeSfY$1s0F%ujQNAUk)3Eb`-1+WeSK-VF72SjIw6T7N1+6cJ91cvv)gwGUg z)D)iEIX%6`*&YZ~4jv?5Uf$s7lPa_DmnpoKK@W3x_H#l4HsMI0L}{#OBm6bMTGONt z#Kp6b9#@ZPTsv%@II{b+_9yoOtYa~$Ee0Y)Sgt~?+asrUxz6UEcFK`}mJJ>SInXk9 znw#4owzhx+mFePTMvZyHM^MWLHaVA8%Gx87jz+&0QD>rVg$`uyQX1A6zqgO|P=>}> zX#5kUk1MU>903NWp|ab?m`XCCHrfn5=b$8_1RUb`Z$X1Y3%7Yq(Tyd6ad*i6K78u~ zN`bw~$aQ@%;Gdyka8P6$(uQOR<6T~fd0Lv(GiqoFDxqH-T~4!NouKoDG&Gg8@`>$a zQd|>awHBTz4Z`0v^yX9!qx;G}EP)M**-nk1yMGeKpR`O{<#zcSLw6W(e`_xL&$#-3 zJ0*hIn`iy1&EI!@jcz>n)H$rYO^tQ3h7WakZd1&hzow_S)tsKVUw#%G`bTT?b50L# zGeV=aoabhYFiyGNni;^{-h88x_jSZ$FCli{sT%ihWv4h6)`=aNPEIuuX`H~Clt2|HIo@y%C^N7D_j zmS6BrW|K>pJVdtLa83K!rHX?&)F1a@Cz^z4%3Nx-Q35H5F)ONXD3LO}!&tt1UL(mzWKFy7lcR+M=v@2PhhDEo5UklZnxlkc zdL+eCKOcE{bXY7=$;YcHhjxx4A9`s>nlXxPN5#xbgb~K=*Ocr#Ilhn1iF7)aZ>d%@ zk$IZcTugKm>!#urzveY^8zHVV$S=f2_rjFWw*ec%o%pRYlgJCKn$O6qMp90@^A^%r z9yn#%FIR2l-MYWZ1x6|kh)h$N2*KWyyDSv+aQ@cwTPIR%oA#2*Z)jGLQdoi52?mC$ z?j;VGWZyZw(Fc?oqt@l~q!u_Sw24*Ut8G5w?k$D%t{CzU?wvfr$nygOVWS`Vn_1O7 zSGV-XhVYqMZwRPb+af1@&Rd7yRuvRpH}}W)j931y((^-wTjd>4{cL zdq6=UONJ3zpFh-<#gs!&LMNI>k7=c6^lbI^nw@SaJW9Y7Q{RsSY_gP zy0|)%I!Hr~$`K=qI@IUN>n^Eo5EHO`F2Bf*{{Hf4#2>KL>`-NzvPn+l%Rn{rcvq$f`@6J~Yog9)F!Un1!dsstEP?S3HGV77M4BKqa~ zQC&e{PkB8rxynuPFJ;mUHSxES;*;WmY&z^f)mbX=MF#rN+B{i53c z$L|==sX4-KlX}^o_kaV>Eo^%F)g{rAGn99^E)cYB|@iiV;qFHOsR zL29qNB0iSFC&|<4g-@Qvm&SVrCWfQmFoNenOyUD8U!&>cgklG4(OfOHQfg2d3>Ln_iBC`gyU3`jRf zpN;x^U*CUxIp@>ix|R%Hv-e(mt@YG>-%qHjvg}=)2RPTRUArqUC#8Pv+6~id*RE&Z zz6tyfqKc{j_;uYyT~^{+=>X*l@CT-~xRUs_YZcMBXQo)d-`LOP^jxl8yZ7m8T<>zs zx43q#bY5OcT=Rv|#=AHE^dkp#6Rqp#U+u?n6pX#L?%%e%+nyWrK4c8`vI21z0HW$6OkjwXh2VVWW%({+! z? zH<+U1(RCi*8MM|0T<8Z46Wn~(3|ryy{+*-Vb4z~OTfAV-Q$e-GfkjPqnxw33q=RRv z^on2I)#ALp!O-tsEKl}EFQ_c}NgIFazLO3tp?uxb3gPp5KvZ_KH@v^Ok)4+NxOmBc zBi{a@X$&WDnF;(!n_X8!pk7(=)C~qZb8-Q_=7u9aHYkN3jh$AgAy&b#tIy0)>4f#j zwvokQHntoY!yVu{T~G|?lpZo5uB4cv5tNFXR!p4(|C3ez6;i7BqKOYpG#%B`d>Ax%R4qTz*pQf6Y|L>z?LZx;tZ$7493nWA-%!R_^|#y1|T! zQF>-S{TA0^FHhNysQbK2t^;T7E(U>>FhobSnmBkpy0wBX56^zA!%iBkLUv@E{~i_G z5@)7=EdQpKpxO+XwP53}e9WRw&O0ViwNW@AoDtDouF9qO2C*lq-1V6S8N^bV>bnYg zxh8VtvmD1>^ugO|of@_+7LzIXI2^sira^5yKlrjDD@}#0I21FxEQ027LE7sH>yne7 zJL|{Kws^vqn-@;=;37(7gA=>fJX@lMY?~uKV_j#neU^~~+S{jebKXx0){gzEPV{a8 zyTVT@%Fa#eb?3`HF zsU(@Mh{@5MruL4^Q7C4*<)VDIinA_@sUN=+Gdd6%LhqfI!c)^u{n2~;{+HFKgH;B5 z$h!UXoVrKCvv*QA_>N>RyoW-Lcb@f#j`}RyV0}Kf^J!i=FN<;cth4v;y?F|u2x`lr z%PLSs1?E=9*Ht>I)AkrU@xXNIo#9n;KE&@u`f#bjsg)3Yno`;>v%#Fb8kx4~QTw*M zQ>j{`yVM!j$A2ci#rIX}qzUI;xYLYH?}$TDqjj>+mUMbp3p1-mfe{QXsB>p%xw9)# zP`f3VQN0R(Y}f}mvHTpKp|r8{V9QhdaD4c5B*C$=IlZl`4V73XD&w2n>LIf;By)I5 z-$;Wy=U8-HeC2m3?f{;pnpn8%i%uIi8RT{)w~5h2k51-rVl0H7gar)IEXC2XaV1{u zcRm*bCZ8U8AAjQz8C&p^ysS|#r%bwKPpikK76)@9rlZU3Y@p%DRMc2q6cP4w~)1l$H#Uq;CI$H92nZFiT zJx;H5&N|clYZVtkqPWM#a7CM7az$IMXY?TEUhgA~JJ_(56VmaF5A_awX#H7jh-eCD zlNIQzE`I!=;XrfTY~E68;nswVfy&egwYBFGhP73tGyxK!#sy0A=K6FXX(yH#{zr(e%MvCFHcSaYOsy>gje!ebrdvs;gz zb->OfN_cSHJr(UacVol5$f0%f^eVvX3Ih}5Dtm$eJcyJ9iwGm}P4SknsEVPukJS=p z>dz9x`G`UG2pJ8vubUd)(B6HJ?@CB~RxwH>E2E)kPQ^jkH(AJ@gc zvJ=L7;_)sgBdJFRh3B|{_nFNT*_yKvd#fEN2}_TFZ%y4vJuNjMYVuRuMA{5?tykqe z9)QoiUO${X($)x``1>?qz{QPw`ZQCu3%@<>?S=L5mc-y{7jv#aj8AYPXnD=bcQ1C~ zMaJpjxn?!m_&o(CtCBhsEY&54qWvB%&zwuE<^^g{NEx$^lR-nk_o-?RaM?(l&f@IO z+**;3bn7y!m~K0ISu0^r5WLv8sbQ==YYTsUY^~+JQF$a!9a{ck_BaX*_%g%TOX2oi z>*26K@|N(3Q~l61Z&s$=xgx9BW`CV}yoe*^bmyw00xR#L3^!mWOkTeVoEU%-Fn-a( ztR%)X$5POSDzc<{LQ+zD<)RqKSXd0WVD>@vswoX_j9vXivl)qz`1po`DcyCB@%DS# zCrYJ3VJ&9*KSZid`@H)pJU1u3zvj@TmSvT;GQoY9MM-ecr9OCM?N9Djt-S;HZ435! z`v{_ri&Kq;F*0m%m)~tAbN9JfmhMxt)^8Eqd{Pi|v38!@t4LkVhC8`9T&rrAD`FLueTK?>@l-z$x%Sv@G-=Hg{9blnK*lHO{^5|oIc*L z3}m+N(_RK%SCz1^$YN+@SStGN;C@uP?vxqOOtK$fcyC6q%6zl>l{SzJUqjsZmD>QH zu7%zHfBx9rsi4~{uC<&dxlCr>b+52EMg0*pKC34cXHsn@S4<_IPFCx%M%Z05ZWB=; zFQgW0)cV?8b5zx;X57DKrA0GhZI9A%Knw_eS3f2Y;c zOOH&By@e(> zu>G?ljOo~$p)J;l@~k#Y=STxLt&Czt#}0KO5|Euq^p zMb^lZS{t}y<`4^Eh=Ei!H7RbjUWzsE4G7=H#CY}O;r-i~S?voycNTdC1q()J!{7K4 zSaG{Ul0?`{Wt@h?;CgGRR?Qa`lP7$L6{DwWZQ4S98H2LQc~vIWwY5Vx@I)R;uZMHA zyys{=BX~9b<>&seNIcE*sqre`8Nj>#QTyDb?0bU{OwQf*~;*jyhZjy5xCuH#>84tF3yYr02=gvf~ z4U5mg2RE_%;H3uGRkoE&uU=i3BP%Bc2H{^rf*eW)MDq_0z)=2c;KY=3V-eh3zX=S? ze~;p8*bt5X&(Dpz zxgQl>)UN}tPXVq&_|?A$@^87{z`o%QRHXlmAUQ-Fk;`bT|9A4$ z(m0zi$0Y2Nm7=1JSjcmEzw#D*}I3d%qVzUY#*?&mA#2r;8y5}yf zo$CygHiO^ktrUtz8@Q3i)~$)-M7Bs*p!K2BNnrTxkR+Kv>m5gZs93bn+REF@Y00Pt zm3C(f+3Cvir%pivRECCzuBh%hw9wHZykT*_lnbgWuG<&Y9FIN4zGlLtCah#v!^mPnr`Gb$WFXZNT zJitqKL__ESIZ}ia((^+1oubrA2WdLuq(R?Je&=PNJ?B}bN|(%M!cJmj4MECfdegh3 zxYpLNg;{ntFf-}GPJLSZy#)5`?CjO-l3NUS#<715JKUHE_3d?Bl*2R|A`Dh-HgI!Z z@p@Pz6;bMo44>vV-7~IwG7UrK4bzd{?G3M;DQ5Y}HF6;EJCGque8o|NT)S_{U zxnz+aUq;Gd7lV)N>7HvF;`Uyb(_I0M`v=Nj`>GonAEx&7ECW?+Ss)ZGQZm--Rai8y zPOIx}c_d*y(~+{HznR+y{^Frn8{B~$VO@%?OoW!ZmNZA*1q_v6r%fH@FsqV&D2%GI zaFq|!HTfZZOqp;irhEuU23`uraGEg1l&gb4YdK#L#@#c{h=lSl<8Kop`s3>sl@Ye4 z8%WeMWbm1#JJYobJBs%@pPs#y*Kja^xfD-(239%n@yqw@C386Kt%V5 zE3(OR_@fKW)6jljdIwkZ(xLmbWNc7PB-;%H?ti|E+;jI&-NrUPH*CL~79)1i;BHXN3_VKd3NDNO5!*nb*i9qzYy@4(ZR)cYLDqV(VZ(V?8(@L_(1g91kyr&wm zU)?iMkLS~@$d0qg{f325?iC*qc2|9+F=?WX%AZx+exQ#B+kDkBY^@WN#p z{qEM2AFu92!=a{4gbggy{d;eoIXS8MeHVN{L9y~BQ?gc$%tJgO0E8KVt>Vj^vG-k? zv0=X`q58u_Ywt3}Ee1QlkJJ(ZpjZEIw^|ZlA@z;^@k7V4PnFA>&)2CcRN=H>Ltmow zi-@!H5tP&P`-qi=&DUge~x{O$JE z9xeaS7;yT}pFYRqV+Rk9PtzGZ`fAi0(#*)2K7VfjJw9}QERngh2n4;*hNS>TZ`w3vqnFJ%}^XF zzcSeXY&VfGh;?%%Aq&0bEwK@hOlLiVgk0GrMiXoX zbgOq_bmlZdZpvQLW|ZAi1CP0C4eM-OJtOzn$9fefk;&4?R8{>OpQF_L@9MM}v?aLoa+n4$_NG-$wA73d+3{YP z8~72nLPxVii*igJnnf*iMtZYT6t(7=V3vN*4OdmMHYgAwMfH#uJis?M{@l{cB7K0F z_we3v$N3M3NfmY{N0u2pcp|$;bDZkyH?=P&w=`*t>BC4flq#Z~ZxU$dj)P1mwaf1; zNYW*}6J)`(iwIcU>c!KZew^=6PQpukECTDZJ(>35ZH2`;Yh79uh0Dd^_9 zxU63{)a?S3W!%1%KG*LGjFyH6LD>T&4D za%wIpmE_G#5=#9A~7e)t7g}C(*Zx z@BMm}_`scdGK6d|(wSiL$IxI_+*zd0=9Xx&16G*)1XPzrnM)^}G7q%&TB6*-Lt>{j zZ^J#(Rf}Z^R69?3{nf`-Rf|L1u+srmmIlRwWF0a&-2|r9JXXh8X}z)t_IHWVa7+p` z9z(I>cbvZQ@#JDxr?cHYj{TpD(T;NN?LXS^)Qf-K=p?uO>GWdP*DaiNn)F@c!_ITb z)wmIj`UAO=c59aPU}$s9%Ms90w^DVcO1o(S-Qq>U0eJzp$Rk3D=5M#Jb1^On(Dn|- zrmvq+nsTMTeo}|`Nw8Rqt7{d+>MfdZ^y!7)#Bx&)OAdMQgJ18gqo50QKQ>!&=38fQ z96Lv?HOXFRyO0PfkK7GY(1Rx5XLP99JrJekA-;Jto#deTy7MFBk`P_CE-VzBkiJze z7FhiNao-)IxS*F2P^iM0?K zt7`*zf2^r)Geku5!;DV}5f=h$0mFI3n3bs-y=A0o&@0iV?sP1Busy9KQD_unc+-;Z zt{`~#*jc$u$|O)E3PuDLc99aH$z`Z>?eLW-q|3U~57H0ePAH#-HhF?nN>oYnub1xY zocNURPlnasTlA7d3sNP*oN>xy&D+k-wRXb|{mKchJM(SMe%K5)Daw)?w`nm^VjvmE z`Q@mT+S>7WrIXgWhrQ^L_0q*H0cST1yz`OR%RZ6@Tf!@c1al#?Os$)9O%0)hTdDrw1N8jx_mqWkP< z_tE5(UtY25>(8bTIkGtpF2_efd1Cl&Mr^26nTa8^%{Uxh8vG8mc5x%9b2csxep^Y6 zTSPK;A|B;nNiLirVqd2w6+)3Kr7MaCnRar487&$WwA8d_9rU1<64E8*AO(Lefgd`7N{WeMsO^pILv(}^yWpF!|r+%9a3vO5r@%me) zJJ*6n6v&wQ|H+`hiGheXr-=pd@W)5SAXpU!y?@eT#ft#*0fFv`5?|}6xJGoUqC!&D zCLP!?ed!$a*hSZFFMYgLEjL-G(=~K32yrKf%(0%jSGBFMCsUy|Mx}RGUN>yA-Py>F z-3@Cr4^+$sGEf-?#ln8DbhyWNt~)K6w`s>Wv(o_e!J~gR_^MXuh~spK+;yMj2wcTT zNm1>I@dSIm5Fu4aiec3`R~AeR=OJr=l`{IzWiX2z7>6NK5w3_VWx-ivD<({7L_b3W zT464-S3rg}92tn1Y(HG(=D~*4i_x1d%xl&v&^dOoS!;A|#^th^HVMpeL7sP5`1z$T zEiLWJNJ`$I5^@dk^72B}hKGmShB>yLYeT2?=?KDyKd47AiaHG+gp^RRno|ETSs+o!MB49}=K;~Z=KYUU5>+fN0bZ0?kG&s^#_3vFhjgCX5|tr{(J z)1NsTe#WO2X$?$_xZXV`P3_rwK-=ma=97-K>$zj7Z}ag;o*cBq8Jnslr#mZ!wK7^l zJi5l9n2d29rOwwgz2g6+I|m3dJ?T3tNO-Cnt6ZiIU*d zZN{9CyMkl0Yy=6^KcaL`o_k0wT6+~?UJ5vQRLC)yHBi6ORoSNDNlHqxOya6Kfbj_^ z`8EifiEuhJ+-U?qPcJ8MvQ!LguT-swc^#y zX2N!>-MOOp(1+G6sUYPp1k8C>$jp=oW6#P7SW`pOn-=~o&J)f`OiN_Hfdy;(Sy17f zBaPjc^3db1-BNP7932QzWY1p8PJ1GAd%{to|H&}`V)=410vRLl&v=hbSK!VI)^svK zZjUewYh#kFxn|Tnm!U+10jr@Kt08Gz-6A_ujQfZWbao@*_Gi`UVfwD19ryIaBIXx| zWyv%S;UC=cx#KuxLXxd2mqwVDx+{%-qjpm`@qEjYK3!iVzBCcca%a2Bt{aDGG{$iG ziOh>D=n7s3=JC+KUomi7lPnvz&b4M}yRYRBls&FeHImUxRx!4m_^`J~(;=kLe@Kl!pfAqP@!bm?g1q zM9dJ33T9C49ek2YkTE#%jc7pPn($bp%;_XM$SWzegfQgLf!4h?C68ws5sNg5x0BBJz_jM{=?$}*Fa3=zBF4&u1X zuNpl;USW*u37jed;EqBkA>~gJEiI%3hr`J&S*Ta|2J6*tvyEywXPi^VXmPKn9Pn3O)bOT5sY$?#s?6qqgRXXv-!2;xGU{T zC2*M@Xz**MhcTM2{%l*n_E;|YFVJROATA-I0laCGxjjCGDlSr0@8lR$>z`qVNJDS_$A+I-XU1fP;IM&`cK@!|T!on**zGi=$nrfUU;9u6! zZ>xv*kt(TgNJX?zYPLKfXzLp)F$wqV3@-_BDmEApXmrWXDunXT*71kRzv6l&6wA%% z^fd~fD7vWfG|3XBSS>2g)b5m1H*c<(^w!sYp6d;{ZbJK^)102~B)CchpR|2Qm9KDR zQ=6WU%iQsg-|ENT6>vyc=$ODhK52a5u5Pj|m?HHW)(l`)>eG+kLz7gZ07(&$!~04z)SQzVQnZbGL!_hqa&RZbhD&~hjP z73UGd99Ka*WRy?yEp$ziiMe4z|{3}Glj~-bWcQ3Kbyen#g&U9Wt zeqtezQWV!Ig?1-gT)I==iU?m=u-?fZt*4fw>9iQ;^Kt*es_e7Eb!;B-46w@qLGBj! zQz8ic*f z6}b*Dernc_1rDMI-ms97MU)fs5ZYl{X`lfY;p()Oe%%4IIscc<-U(7vJS}{@&DIPoQ$l8=1i58h zq$D{J$#%(sh`xcam=ZSAXFUW{IY*8x>?yW+@KG~pGBXU$v3E{U`d=ph!bBH`%maVl zO_bqcuEZ6D(k@*(muPVBT`oNdM^77mtm0660n~M#jl?Tq>}o9dM2`)F*0hS=6_eYk z02Az$QAp-UjdOW@&RgjENU<&eQSeqh(S=m{;_~f$jhn2dg^b1uX|jB>@^fb?$=B|u zkwD=Yl2f74hB{tju*7ounph_>0jXfY)+meJ^!;*mQhIBK!pX;(f5(C;vFAsh0{vgo zN#vecN5vLxO3<3%sdJ0a!&+aMS=7a_8!w9zQC>i#msHfIJ!FcPL!*_AWl>AgYn!|a&y7KDKGXuU#n|F#PV@?N_wp`G#>mnvjO-}I~8 z>(ZvXaL!1(kmYH0OC68)G?yWUE=~%<+@#S31>L2lk)vK#F4@D%)j7xVir)~WcFQ&; z%n2Y8O5=&hd|owC9mV7wyj=JDQP`+!kl}(}{P5kldu&fOMfcO(sVp>Dw;^refRV2AAsEUHv3aWAtESD) zv-lmg^E4+nnV_?%reNQ*^`2PmzMIye@2^TRTF1lAB>T4qDK?N(W7z}_XMEdmhPugj zJz7JLKE)vQhE)z)W&EwB(AY+r%nx6}Q5$}`tc&YGaP0-)t}uLCanc~J5)4(`p@+zpM5E8Vg56m+K32QjcV z-Og1;IG6E_K3fjLzet4gp#YvcGNgVF9gk>oG>^UU)L$&|7}3X@wx=l(rT%<*cJ9yU zcv=E=j_ho%^rlrv%0t`GYRNM5UT_FzkSgeKizxIY!=kWJbUR zfM75bM|{Wg72+4-l5LGCbsUgc>C4RT4-#S#|G@Wrs&t%m zfi}wBa9O#r&d(YR+5kX%WepvrLJt7gM0m3`&Cyi6}ka5w!SKtXnyc>U6UQbLrrMFjx)uKoG+#2J&il z2u%i75gy3`w{@BX_J37sZTE-WA)AWz=hN*ht5^yY5X(KGR9m2 z?ouBC*qYjHB?C75wQJZnv|j>P@>@33R~LQ{M7$F8Ihr*)$8F0BY=7lrfAY*KY+6I7 zxoZH8nfZO&mYc09FA}i^ofztv!F?xD4p3*R05u}`%DI0=+)0HLsO|}-Hj<{EXGOl( z9b8$iqXTM4tlyl1Wl)g6rhvY_{*UeXPZV)fPHYiPKeH0bLhI&ot5ifmG{Pzw+G7FE zK*sQg)v$VJVWAe)v5O}H(rAz+@z)-^Js}qu=z4&&a-v@BttU4o2|bcXEIm=MT#~q$ zn>u)(P}w~V1~Sn0ipaj=Hw7=A+*VMRk`VC-tvmrQIjc_lC#uJmKme)OuStC%hF8Bt zfYt$u<1L+O=#wYVv5@)-hK0WT^DxNM@88AIg3P!NO%Zs%(fd(39DJOprp$qlZWU?Y zlR@E@tepE8#|_k~h&3EAj5{_sjqDhYi0q;<4O4J)ExxPG#TBt24mLcVzcUE)zx|J` z0Z64~IHZ%3)wnB)YAP*}(}~rZ+9yWn9_9NlKLwC)Q*#nNpB=TX-h599?9iX2R*zPm zOXU_awT!MVhBG}oobZ`|?O;6jQemr9Y-w&^&)6Or763PQJ$JIzrsFM;)1fO)tZ4=~ z_A6eUsIe>1b82eE&W*2TYfeSu@{CFPt}!pJu`j3tLfGi8Hod6!pDTY;C8CM7_i64I z)SJrF%q}NFq|Ob5g^oG?9tqQDb|PbTQ7F!%v1@E*XB%5@C-x zOKOy-+UrxG|wrGdF4 zPvRs97^9X01ssRR^oYSTZd$#`yiNRDg3pYLT4=Nx*3(=H^9xx3$ms-%V;r5fIMU>f zuEfo38YAY5>gUrM&|p zInhjIfoRG)BeF+@p#EOLl2TAHl!@nLSEru3(}iDz!{88_vsJL}4M8iw(l=Z5=0uSx zzmCK-Lqxpk_B0Gg%Psp7>(1|iby+Pb(<)+^B&`G&-CliMW)?Z;>M&4B*v^0tb6KgOwB8v9j`w!oJbWBwfZjk#ppOulA0$j*u;Xe86*Z316!hL85&qUm0)KwBRBtk;a8_JTNC69$K8h{po+$E_OYR$x^1 zZAC@XHjs~#W8{#JR&caWadif7R;B&=0@D~teqf(=+P-Z&|H^JP@o6z7xP&ETgD=*> zbK*HRwRYM`a+}Q=RN0P*DIb~Y}u7N{dp0LaBT*H%;y5E*^P};>4}^>9c_kp zrw+H0^a#kKKhYv=jk-w}2~U@nT{3(bGs?mgr60lM`EA{Fk!?lpT=8(r8t&%QupQ{B zd^l9*fwlv-f`W9*Vh_Z$p~4mkR3dspdFy_o5L1X@G;d`QEsai#cR?(KViSuHWHtiN_8P~Bq6QEWR!k*gpt_=CdB6w(a>p7{{&?3IRxS-#{8PT)Kzs8 z_UgnhbsEydI=l-W)%vE$a;h1f`Cj*#F+{?fRd9-g&i9-hx$G1#Aq+Cy`Emisl(m_8ur*jl ziHT2e;!C-CwIunR#T}&kBLaxcWndG^kKGm3lo0N%t4<>V&McV#;?D;sfy5sJ{L)(e zq5i7(Pg6JSuiY+#;F-JhmLeJ#g)9eC@o)yaDb=>4Uo6;f0mTO#fOwj0%~8ngnW`BK z2qb6G$z{`A%BA0u0+cYQi;ejc)$;^?$Sw5_R z;jmVVFsB;tOaKI*7`T>~wcJWT8dh7&FXW60N#OJw@Q>9~@B#FBL*E3OL`6~0>_3ah z+HHMLB#bzuA#X zuJ|pEQp}W+xk7xm(Y{1ZK$Qf*wTgA(<1}Ztpe=Q}`=3YY0ReGF!clU0Q$dyzgJO3y z7jZqcxo0rqb-{SY;cWL3R+O(K|0m{zLBv_=kTBa{nncehG7b zBQp#Utx}tfTVh^lxX%5Mv==Lgq#x)cV}8Ro%#kk^LYcm)?2X>|x90YjT$jHPbmyhd zbDNPT4F*ESpQw5`wP?o40{|JLi@b#&j4wY6*jofU6;Y5&)iS9iI(`YJKG;{1Tb zq_ z>R`d2=7G2b1D*~@oc}fc=&S*0 z-RnkLYGL;~fM)xz^Yf2pTjPr9`oG*5c|kx5vxxvumLAU&gWcLW87_~v4L6Cd)&_ug z{$o9UNtmXulz}2q6oG-~G=gg!wElBkVcw13*q(3!6aQ7f{3 zhsx9jAbA!SyO-uGO(w2BgF}S-=P4mwi$pj<++RmVq-CS2rT<T;>_Go#;t_S~c zKqg93fQXYQ4`$}vzT>H1M(;6< zMr|}j2V`Hq2UHkDsb^2*M)pu^$JvVYAJ+`sNaGsk)py;eX{CywcBhP3?Uw*l(lb+^ zWN^1JCq{ayRqF`jcLLc2Vnx4Sr4r89PkP8K4V2wK(p&~&E6ip2R&-Q`LUAl-1ee#} zQ=O3F0@_n(+47i<`e#iqcx7vEKgNyDg9T5xeiXl}Whs6HAlU~}fnTzHbtpk1z>A3- z8-rCu68okO9(n>aoX#S3%F|CH_0efHq;eI&?ARiQC6B+)DUD$MoVs=T9_er3F zEg!Xi_<{=nVoIedoznnG`0FerR0I}OTEqZ?PknkLiEbN~r?QrJ<(FeI7~3J|BF$nN zFX^7^I}O9TeydrA9{L4TPm?ng3(3|yA61Y5tLyNOr{mXZQ}H`2wj|yW%}SZzK6qwECs+kBg6-wp^Djj7s)>#qFmEF(u~X zUCAGcm>cTWw(pk#Sv%N&@PX7rK})7$Mb zw-m^9;*gbgwO8_iz)z<7Mn;SogVqgx2)Rz6E8;Rr#QqVkQ$vh_M7n@!FrX!+)%2(L zpCbe;$Cz>QIiCRw4{^iWGFr!@Y>CMWXl8*5bLG#*`!&?iKr3eabizUZ_%)w%6}9IJ zl3}NBTn@v>AAIybTk^K`^P2_wfU7eSd)oe`Lza~BSI z*1%=@%=B%qyL>-oe1&k%%Fec#gHxYjdN73PY>fEg`Eq!0@XeI0mb^S!hwvwMu8N9^ zU;6taR)jFknm-gV#jo;ozam#l+b#^`G` zw>`)%l~YS39}evR{Zxsefe2XI(5@MaY3g!>T13QCDfwPC#%FKBY87V|_bZ;lmWt)a zp>yPLih1L>UxeYLylpZb0p zw#5ONGo?PFLoNZcAIGZ}*yc#x@{#Et5v|s&({N|I6V)WnWi5()dl*|}$^?|>x!a0& zgO>dBKBzMt8=9jISl=c_GS7YA;=GWIn-Ibb__X1k6dj0QR8b8og&EgM_h|+s`_ScN zQQfK?O6Hm|pI}p`x|K-sNeh~+OrnE*6}Uep13ApujUX-{>k)WuGCm<+x}$;0C_>~o zO>1#0_I$4=Dgs&`D#PDj0t|QU9H`3)xyq5qW-@T{4tn!bEzFW%QpXqZ!iPdSNjivy zSO@pU6#j)_dopJ^!IVQfr?2x}>4a+VstZUSVhzq{lqFB>{My>c`fp^FBWJJ`(*Lir07qFl`V*TPqlwW=4*#BcylFjaQJzrgkzVX zL?KIpc1h<9%3+)hb4__74DHYmVIa})A|>yfJq0Spd%-Tf+=@sp3Lfc8lfeRd27Kg7*L}J zxz^yWJV-L{yrzry4>91f@*EMwQ}VpJrpB_8UZU+K)t_vV_=Oot(=}yb)7|DevVSw%@C9UKqh99Q!LP@y@cC?y*qkx>(_?CA3`IXNHYL34OfLhX>4^Hz>NXe?7CL_jq zmYUWFX>d(lFxv4ZCClwT^C0?B#%Mg4T`6p4F`t*_WOUXA-4tyjw!Fp<$dvy}T4|40 zuf>9&_Wn!z=~ep?&x2sb$L~K(=vY7!s}2n&CehCtQ+%xNX_%n4BpSr>emJvr_?{<3 zu%j&)6+sf*MW)kJ3P5ww^qZ@8yDN<9KeJYQ@xVJ3*PJRNd~&eBOT~HJ`_`49zA^6v zk&;K<#X;O|XA5P3(n-ULZNGX32q@8kt|MxIYCd8HisqPO`BOh#)lOIT_uDF_B)WGD ztO0^l1?Nt))W;qF(B+IA9^^IaaT?P13s1Y_6LawRyM9U3vzKs&n<8nZg%=Q zr_}BF0bO}lFWDI#o(h#ptcm^Su>MEEWViMKn@`}NvFL&z<=!m#;^;s`=87VIaY(#- zL`^W{*0}D_J%lE?+-ovS8{y=2H?R_nU^{1Tq&)$+>pi%7FNXCcH1tDAL()~Z$3KMv z;m^p3uEol>wvT%FSLM|2Zn@%pc|;sH+~@h3A+3>!!y11I&g^1+C}1w}jhl4R4Hj#o z&D@KoPtS~j2p#-?*t+VlD6_V|YXd4FDG1UHGN3dl-3Um>NT*15tV(wbLxVJkbT`s4 zNQZQTba%{m#(2NoeP6F@{l~p#=81F8egEp#%U2m=X2aXh$?%^kiiy|TdKSQRA)!ES z$fwfH@~bHN(YLOkN%vy6fd=TkbJJgWKQHsyJJ?Ac9mllPXL+$i+~Xq&1$5b3+LkpU za&5k(b)mOsn-IIS{* zu#)`uwc42AePA+p_s-bM?(&7-@S#n2bONDz2V9j2<8IyaxlW{_!Lk>m9hB4LhAZJU ztB}}_A8Lr<|NHG?yw-UKSic@SuHUnngg0yxp1P2Rr?%?XLcn(NC)i9B{Du*rb`u9D zfWf*N1VW3zLU!c)pjJP}DLL4{@Os6g++lS8^WD{?&bg7{g_VIGv??VZ)ID{txdhs= z<;%xP(A(ZRhLMIbgW#^JbR{>YyL*>UdM+n)saD%&e!(yMWhQzZ*?i68s8?jsK>hp! zTKMO((2RXGDa|GyDzi)a&^7u!rDxjC;<;jsnjg$RydBtdQg>v66aI)*>U8DZii&96 zTl!r0{Hj;`4tI)A!HUAzW}o0rsnce<)u+AMtN-~0j53gFk-630j)}`V0GcMJ#TZ^i zMqXQ5ch{0kW!rNE8()O2O;sEV!9?~0%8D5lZ$`Qi->fTO`YiyoUaXt@R4ec)N%(1g zsLtB^<(vMY?`WDUym%p*mHpPzGPBtilaiOB@ZOJCO-+{zk1upMB9b!q3lVzMNZ!78 zkTz3BAg$Pu{Uo(!W97N7(@{FsXBVj(J&Fv=*woa9Hup)}Tm89&0C5;Ip-`-Tj}yc+ z{AXv9kp4C>5OEj&r2D~-Wr;Ea{zWSmQbj*U7Us|9B*(I{x-XItAN6FcY)9zy+n@sm zN`~JF(aSd?*QSI87}JXNynyxUw;7n7y#YryY7wJQ7_puB*pRC$4<3gNkWKYtDRer7 z6&k!sNUjM^-Jg*x0!{Sr)A!vi9mb11ayQBN&LcL=zFSXH)jTTx%Nh}Faj7UO)1}tT zf*w*Q+$l6r_VpJM@uR8#-7G3@;j~@DPvU+t-E(`9s+~#YPjdDCRx;5GkraRAomH1` zH-1kl`SsucyI~y(prT#m)2W|shZVi%Q!f^4n!Hy-&vifmYV#rfKY<|ZKiJt%)y1ui z^hs)_WlL)4O5LL6IIGBp0J-X@L_g3jKCZCTTQu(&J$&+`$2)1DhaeLz_!sW_&BgY1 zdM^8^AwPyep7#5wwJp>=*Zm(KZD1~`rs#Hmo&w!%l!g*^w-^1L83Dy1^Ubr|&Z$Br zbTxx3^H`l}Whgy-GXil9C~r*W-2+%Io?FXjx#dCFY~Y}WL_=b=ipHWL0n=Hlw>lD& zgfNo4^eu(L&Ob^i&&*DC{qoli$+1l?04ctGAAD`dpzJ0lc~*AI2qx~h)^&T zd@Xw7+VMzE@mMH9PQE4E0U~A$$5}*=_Y?$3+HdsiH}=-4685Bri;&O-XkcpC(b%}~ z+?@7=$+h1qz5W;n6d}emVk*_d(=xz6w`b2c4Mey~^>RHk!!FP7OmL>&B2Yd4xx9tQ(NV&r>gw-6Bij*j2f$S- z)mEcia@_S%^!8{A`F{c9Eo5(Tou8`RwzH~wjj;r*)G4Vec3*m+Q2>o==J$bZ*v_#M zr1){W{mu57sQG0wr#K2*C~)n5-um;i4-qs%E-`q3vsu9`G1&h#d0^jaCl|M@M)TjE zIWY2ekl})i1%LsA1@ieof?6L}+Y-xWhjr|dneQ;gB5y1JSG6fZ$OBHdwXU=>h@Ooo z>DX1()9xO7J{S9N%)4*UA>QK8eT+XB@R%Zh44aXdm0B>$K{6`zt(BWU23M^kPUVb zD(9pRRxS3T=89yzC@pS$z#P>aRcjFd^RT@GB`OTXm`-r%qgl}#!(fk4qM-HGeTId4 z5nzUuJPqjZRhRx2PALwq8=$xu;&xRbz+4@fd*nucy{9_R07IIB>yu@XJsli4;TYxM zUt({%^M^(@Y{!IU^%?{?lFr~g807#=vKq2l?U>fueH#EiI%D(H?e@buk2M=l>}{@q z69^aQT0($xrJW&dqXYhX$unmrhSv4lc zZ#u)fQcTvb)<@(={5EYxn1j#G4qWJ8kMG@GDltIw|CF8GEu|S(TKg0230f(9_7lSV zTsk{KET_NqnP1)^biZ^eKj`VF+_15e@`tSvg_TIAQ*I^QK>==PbZ$7Z!3PK^yAHM| z$AM>wIRi0e$L-9!o$?%+44N)XbXkwbH8^|rDs5hyumR%Zd)XNu^sqy+Oge}N_V7|7 zuS;DBV5g}kJ6CA^TD3yXk}+6`56LCR;dF_1v7b2!$Zsx{joIgPKK%5=B9}=zx}elf zd35My#+Rl=2R!9hc~hQA?(1Dzl;E&J`EcGV#guS#Y+1X@E52T|x4|H?y}I(mO*&Pa zGFyM0ZsSr$ixp`+IUCYbb|^6ee8h0~g?D1Qzo#U%q1MF~|2dc+MlOROB}UfHUQbL2rr zSYfhQ8pmoU(&KmO+x4mm#^T;}!Vr9SDV!AlY1+Z}8s_CMbY?`I()}>3oS=V6;g6uQq4w`KY}XT)`@~_K5>x)dMu?kn~p(&+2P(xYzojip+ijn2p{*2Xy{WN_wHGG!;l zWF2w*z|o`#4u5n}D3t6GuY-&fA@bXfIhJ2=5a2TQPTlrA01-&%(b7zcE|-XP&87|* zDSF8RoX+TqZq87Kwo|g#`84Ye9*+BoPeO>(Wze=O6+%|_N_AL85nuD(9TEg)HU0)sYdUX zFH*`{RmsS0QgQIGv~Tyu*W-&sd|!dI4FADWK2EwWwGLQC?UNVMk@rfu+#>MB>+wck zejeSzEHc!4Jt7Xh>$7@ZLcW%)tfBN(&)PcN$jHcmdh92h$U=eZ@4P=n)6OCe5pzf@3goyZ8{)a&0So^e<7QI zmQ{8uW`5Q6?MdFt)tiV)e*JP8(T;Ed(YilB++f%bG1cg1l8VXLHDUY<0BV*`Xg+hy z8Q`v}JnmUmwMhqsQP8mZg(Ph$sY2Iy{Xbevv}e2$zkqRA9yl zFaZqvJZ}uz-V#wUsiHX6G#c|~Kl^G%St(^e^w5eX-h%|YI-My2eQrur2^3dZw`y0(i$=u-ycKB&F8dK04`u z2rwwVUvz!xkH+#paBfMV=pmso+U0NgU{M3EP%2Up_5_~3(~U;2kWdvCX<#LF($~`9 zE#poz*mQn=MWtD;buYS0{}>?Wpt&-{AZ%z8M9Br$4Ia8A#qf|NNC^<_)6p+{DF-;= zkB|R<>>-Ng2hY^1#SFQu$;}tqRB=ki$_@0g(oVG_gFT>xzL*Yi?Eo^^1S<8_kV<(6 zaex@ocbO<++;|KUh<%B&;2izINp1)W6OaI7-n0N?D%Jj4jxNo4-Gu5l`qE167eg^&Sot)~p z$q-F1kvf#*OsLBvDw5=O@0D`L-~x)_lMCATT=z0$A7w*FHY!14Z&mySy4a{ZgB%ex zW^Ho3<1okiD6L3Ar51NFK5mEw9~l>ls5oZ$nc-SY3qFA zWT9Gp{;}qi0SM^vAr5I_`PUWmow^A?1P8y!)m4^PdY$Oi7vs(;n|sX3%dhqb!rHAP z2b%DXbEwzn1Zk|#bdtJp{>Xja^ql^esv7O$UFc6tWY7NKy8^h@d*E7&HP9AB@cluc zOkyyuZAE9kk6uo(;^R@@%od)E^OS;ZG@B79g=RGfn|S$p$C=wB5G-C7(3+(5ozwuB z1U{d{A|-|oV+oi8euFGJ;A)hiCDXo8FaNXzu5|?HS76sb-GJ(#-=h{IxWY~|s-T;J zn&rSPju>HvXZL**1VZQz+`WG9ZF-K~B&^&Om=_VVYA1JfrG@;&8@(ydju|L5TsZ=i zbhuRp29mfWs>fj%SrG)pIlX%TtIDNjVW@k+tbMT1(2zd3?fyc)j2V~UIGpIe+G|Ex z6-r$+*S@?w__?Imd@AtII?4{^1J(pr8g+Z|3aIOu7lcfTD;nt_!o?DH><2!MBknaOA!V zAh)?3OmBlriZ0TRuexQ~9BVcdzw_G0T)R}pO+<=qwp9X6V58Zckf1&*AfnzH7k#9v zEt)v0EgmvelY{IR?;IV=v5fi~E(UZ(Kc0X%1S0;WXhG<6J`f47S3~8TNRI6=R?Q-q z^}qC2bj}9HC4gbNg0Ov)uVi6}xVa>(? z)Q_;@e5x=i%c*dVr`orpB;Vgc{FV;lF#E?>_p_X8WfUI%PslQg6f_^yn&iD-K=x6> z_is}!&&z|X5%7{LMMJ&C%*(~iN@)ktMWkVckmaAb1!3x#&Fslk@%9Jye$l(up*zngSbV zON44!Qb9Bs&^sq%edaZkj?UeM086=WJ-axt=5ms&Co2q%JqM`%g&+u5;oc^YPauiA z_zNe6sBGvfc(YZ6Mcl|_FBZs#9L5ZXs%>ex9X2DZm+Q|>=HlPdE$?P)GW;(4!0vV} zaCC3ah9)jPeiaxEzz-xw)zR%PMQ+yS`0`04>L)rh-)6aM-Wx+xVsh0xhSS5IUbb|| zK#J)~$lKiA_1sNgNs;Tme!6q~vRYbiJtMknmQ8mO=h?wxBnRMa*>)#le(^Uya2}@+ zu&vgB`ZfB7hZzl%y1_>vGdre+(p7DLa7DQFst)njNi?XKlqfxC$O5I}K`6T`!+w;xRgJ#UN5%3UL!GHe`?J>$e z)_u)ee6e0oT!x_2CDG=bktso*gEI#{lm`?jDVcO3PwQg6>VVYpA1mo6T3a~q<9||YI@)B9 zDr775dPf0v#2-Ey@FA#v?Z>|(1d*Q&geJ?R%l)jyT1vfAcqvff4*zxi^E~cxJo%ME zQflW*(d#r8K0h5t|Mhua!m%HEEEA1gTYi12cr!?UXGeFhv@|TMOxf+(ExKg~;h$Le z|LdcEUbob1tFT+iZV?&|#x)c+rBG+;!)beh!)bTUd!+nQ7(iG0rvf*4wl#nK6xrO! z&$jXr$;Y*|b8r|?*wz2A;rHW|1Yn?rG2EjdW0^5OVsF^tbZN-?a5x}nbCTZh^M2!> zYjrE6ap$MT8d?tFqhv3k^a8x|6%g|J!HBuS>Ko~E<`3{j8SwAsNIxf!n0Kkd$2T>y z)6%|%{^iimAAdFh8wK)~Mr?VI0EbYJR0qSx0KO^rw7kcQ{_Z|h{4 zqqSLDbJv&SbGGMv*+G=Y<>8QR`y-*Y{M7u>nUo%Svcq2A4kAA#6U(H8h6|w*GEW&` zauEd%Cn>Qsv(AZVST>ayJh60VeVgO7zn$aM`Cb)I4LyE9w&ov{)=7};`fxFUld!Xy zOHS_iIQn_vKy!f;+wyNiLP}(wVrgU-q40HLub?-f>o-BHrCKRPxC9LdsOSS4DzM$T zq~nl-1dPrJ=VVwR2uD+-;OJx=VlD@vlZ6i{FakNQdaTW+9Ahc8DR>HMLR_|L+4uP# zF}oi3zm>0(g4%JduCvfSEf4D3;oVkjFB@g>=Rexc`l8?7v1t++wPNp`Et5&PhJi~> zK}`5ARz2=yhtjNW%f$?D)TiKWyKrb<_x54tL;+`aPkT>Ct)S8N)I*BOQW^Fcq)1-H zWPXtJWKHyV>p~}M1KX4i!Fr{5cm9%!Um-%+R%l1_t+GHCBzN^4vB}2b=o)QJExjueIU6?_diV+ zePFO>?R%}onxvZ3o)Y}1%{~9mpHS}vlOin0S=6bexw2Y@eA$c|1PLyF%Eh&21L+Nl zR*UxJdhBcXnm{zIb`Oyyue6S*+V$CQaw?3HS^NGW(ynx4OxpgKUrMm%N$gA4E5X*YUGKMEB+@2kUp@;3z97NUn+!4eS|(6|RxYDN+@Mk!YZTQ^8K} z7Qx2Znh=cp5Lw~psbIItDJ7N&lk%bm&~D=_`y%ch%02CL!SqA_wXdvKGc%0y^9_T0 zT*YcQZf54kTc-MZUVLbSx-v8B@H#5CE2{#fz$CRo`OA&*jEmt!;o6Xjb6=6=k5Dcq)&milLL(2og7_I2_ljB>qGj!OGix!GHD&30$8qu-CSplQ_~l!sit z+AGdhE~RewiyMmWbd!;$gg0EeYqrm__oD7ynXQNxaSzK_wIiAR^zmP-M-%)#^*cCa zQ#LiQt0Gls2DZW%IJ0iWv|L)j<=2C!jBVx_r1P~*qFd&^&?`pnma@6t)svYkF@4rL z5$21kx&=#gF8;Nw8aMiLHr;9#@5~4z3YGb%Q9_?-Y^y0XOwbng9{maoS~DX#b6>)1 zl&Yi4NA;V;65rY)f|!6{gGMt?FCQNyueOf9P|TO6eh=u+4ty3k1Bl~kSrA{;2ktir z5c_ouSBl>m_g;L{@ByS7bWYiMW0jfHRckRK#-x6f4?)3bx=t#l)-N?1dGZ_H`6PM1 z6HD^c=~9o+zH93MQhQcbv!K0w1Rt=^q(naGzrO|blrGoVdA6B)jsKwK!MyEIKD^!? zjhSVzuVy=Z!6!c35LD{LNc1(QMK*4lyNfvcw@nU8ShEk8Ct41xwL((N8_oqD&d}&5 zs7O=bWE4eaby#CS3lQ1%y*lKEj(r_jPuK95WMidcVyTv-FyBT-CE=F&uUy~^vgtBO zuCf`9=X=YD?J06li!e~SGPy*hCP;qR@!$N~=G9qb#G|Ce|MNf&rX;_?#IZ{Xs(w63 zS>$BiZ8|_~mm8t{c}{DTK=HspjhHG;rYM2FbXvaQOu`vnW1WRtJo}BeI54&1T%qWz z0KEw*`D>6*3Gz8rj!W(T@_ILnrLC3T={VhK$GrHx{+v|f9VEzHFS!HvgW3!zbzweFKnS_p6)t8m?%9 zYxm{ja^9p;)gSHS9G;qPtZ$plmW{4>kRaA)*SB}Baa+%Ng>HJsuHUtQjN zcs@@o)lx2AR~AGq)1e$izUy-nsQ#3VZ_tT1EmpGRJK(CxFavr{s5X-PiQ4DAqODivXSE7;1% zkGmflKxW|S;LaqJ63c2ZD&&Y526d>o#L$vZDhoD_eO_4c)FNPCFB*Ik4tbaKp`#yA z?nfZPiO5>eL1*TLEO{qxE)t*8I^RNyUHSLYttEGCnPYfQY-VO;P;+1U04IPDv2?>F z&B~1h_~$Lnw^3j6^wJ7y^{V-2R1pZo;;xenz!lg1v#~J#fik9`ybNjK>322Qq{{pc z$3_XMyGspaG&8sUKWN;hoV_s*Q|rZC1I|hy91id1)0N9ovJ8E0VIU(X*ToG4Yj4)A zdcuvZ{rE847p>(Yj7`J%nzzGq_c0eO3EmIyQ#sSr)AVW)I~%RFE`SiF(>qmbEEJxe zPg~*Ztw>M!6ngaf@qo>`cInV5t;Uw;2e>N~zjynw@l=Ks2ifD5*@liXE;A1%O@O#T zczGEay8yCz=Z%cpX$Fi%u9ofUxB)RcQg}t1Otmufs^`cJx_enxSQu7v|J^sg*`J`? zBb40m5bUnxPm0SJ*e#_$#7>%s&@E*{Rv*$)OjVaXL|d>7Ttyisoch_Q1iA6voS)yXMK zK8PqwpGn!59V0e_e`?t9Ng$XxF=9Vasct$$oIF_NiswM&oe}rJ0l)OL^KECX{VoA5 zjK%oV;EU$B5!)NYi}5_7IxA{D)-YkKn?5zQd&jXqp0Lu48|Cd|TXVuJ#g#A|hXXoh z%zH}~y*O>h1oh2W4mVT_Pp9?JP~H}Rsw#@%7=0%-dB22v`2NsN941c-$SemIwm_Ur z!M3t@D3qgoJ*My##q-XN;uFD^UYIvSzc*ROLgfnwa=WKi13`hX79x9s4wd}A7QxOz z2X^M7xl?nWj6vodhDtw1xT@3=02po_L#9S))92*|FeDGS5QqA|$EjB7t9<#)OONr5M5q|^@I3VegzCdzQUu%X1oO{8T1MDv$ zlqtDadfZR~`G^f`5-c2teAp*|9vUtSTW*3t0KkqQY^s)i1BOy}#_g^KTYT6#mC)?zWrge2kj;YQ>e*j6lsAE2rb|l+QiC+klQ*`i3;2 zG4}zN^(sHLE}?e%&0DQ2zlPQDpg81P&Y*?@Z+R zh0q$~QBI|5$LMXy5^se@ky??3ccx&*&cTXMqYil}7URk)QmGo-g~yOFrUc}ts5suC zcMS#%v7*zFbkT(*cW<-|Cu=$*-z6IL`!t(k!z3?m?6{AwAgNnKi~k1S8u9RcA_AM6 zn?I$oq~M0X&XrW7;3C)jNHItji1fsQaL~8wS*HerM4v^|8quEKCBVs}6IQtFCTMk$ zXxDU1ImK>hd^fGr37N3r+$KOAbwQMv92xu@K_Ybno{);Lf^ixaUugBM&$m!F{cixT z5EyV^n`FiFDr9_IgU4y-G2rvW=z%GNNF_o&eSQtc+rY`^nlP(W>^zGXi(C-f36tou z90;(`2Z}<9n)@z5Op~WP>CzfWTLWU%=3Elq>%T=w7fxd|5$Q00ks5Fo?I8AAlBU~t9c=#PA744-pRTcpjo2!X;SDDkj^nMYeyo(weKZ@eE!$p zodeF#fQJGGZZAG$dD~O5-0t)&3CqSIk7T8F$qENNlU@khZ90&>PzXE&A8~(m$lziN z;ZI1Rc(Ip?5`+7w zP!hc!m$9zaeaD;PS91An{KcB&j`Tp>$V4638W?F|1t7hnYus?gCp)DBI3tCD0G;Zv z*1g+%-kN6u&|Sl0VNzill`eZ?QM#nmk{+(aB)@@BeT7fS0sZNmk_zNTukAq{ssTzX zMZl_{U^M`rP7qj122@R?w}>Rl?o~bWJ`*d#M^nRls#cAv)zBm{SaSDF-A{F2Ca7N3+d`y+=wUM|(fTvU51_mG8|1=82SQ04U`g#V zv9L%N_Pzh2shnso2N_Z0Pm5Qt7TYUT&X6b$5(hfEPZ1lEdfDqhN*W+bBApb6C}7fj>@^N7+dypI|L61$d!>)$yl7g zJVOuX%Yo1?NZg<`9Lsnv!^IK^;(p@8icF#J*J$wQ*EMBc-XLpM{`boc%vyWbd+`WD zj*c9D2rn(-zjQJ>c`(WYr#mT<)0z9}`Rabh%zmYX^|-{c5iQ-U=15r~b@L!Dp@(v& zha)GH`GEoOUMp5(9r2Ubpr2KfMxb%1)dIySdd@gKt=KZ?;^vn&-TtcGtO#6jZE+}2 zf4-hMhdy1)!Y;sUc(F`Z|6bErW`)5+@9tJCF|9%;8gU}|D zb}m%;GP|YuKj*=`G@h*X~2FSyHtEeLy! z2okW1oW-!&EU|g*p9#IOW!n?&C$KL2A4?_@D5Zs*EMeMMQ5)|j2TC=K9?9ez_Art^ zpL~yRTY=bkk4A0-LbEOMQ0c~q<5Dd~Z`R_*^JSnyq@(j<;5Zc=Yg&q!&|+pMw#g+x z#DJj?3Y!L6Qfm8lLABU-zMOHBIf&PtUjQ>fB!z!Z)1Bzy8#vG8QTVAE|ghr7Vw>5!S zFbxO1MQiN@zUB$*=&(=HOSbeLddXlyfI-EJB(>P~zjh~e08ax_S%H`v=)Ll8cTiqo z%DM}6W=l^&og0N0HH`7lh}A+6MS8D6$@5=33eoP8=W=#f3P#7EvtaA>v^5*s$}*sm zOzqep0J&9|fb)!6D0FHvK*s6|6*6>8xg`2s53tys)JnDJF(Cw_8#;#G6ljpGNNC|wHKdNl6t2oZo6GR*-7b($jsfmt+YtHJNJAimj~8PG&pIaS5H3 zjMVHnw=x02j4pqr%Gba!IKQ;bo7ufNY!hrj9mqp$sNs}!XKeKHqXqpwCLiSkGXu@h zE;4vwxh|%=GN;^!1-XE>ol{LvF8pKHzj5_q*NHFI#N0gXhgfyKoQhFbC)lg?(wLs( z%x6QWV|BV}n2~?CNU4KB-eH5xNh2Uy`jLEFo=(!px*ExZ8`fN9-dux667Ffkd%(9n620Uw8wZ2 zCKdgojJYP?*S-H?_jc0teXloAHJ{okObkgLXiqZ`6-V|P#(MWDH-PYeYFa_dN*G`9 z`K%7TW&+lS64JA3aP%t;qOw(wt@7;82kon=d^8 z;>J$U%9&Ts)I->V2hcmSWXb&;q|CJJ)nqsog#jxSBHy>OaG*L$s?|_0 zI6bTYX4JzXp~jNN+Q6jQz*A5MuePlAA7`nNky7hTbR5|06;z_YRjjzd`0q^`_5DI% z1c1sDR%6kF#PA1{CE)Xq5mnWd_T3X6z5~=ny3rf&V*;w^w;VdE>Oh65WU}T7>@1(C zmv7_15rC=ePhL`2*&!%XkZTJ%YY(-s+E!J3}4i! zfdaa%3&aP29YmenLhNgds+d$v(W}QZSs}RvJzWH$7}A2%Wq|rS?hOXiLvo69CIOqZJ&9kj z-oUS2>&1gd6B-z!g0jsy z?}Lv-G+a=$dm3sqaP$MpV$qsw=)W%>49XJV<&_2#$RH>8_)&GcMSPQfGmw!1C7-rp zv?Wtmp%zUjS@an8S1OC|owW3QGps8(*BJo|_4nE_Xtqm=r;-?j>wq!}S3+%9(qC$7 z$F?^XozPc*Mj+1RSUZ3vKjGlU^QMva7fhD>y_CPi1KtpLA+GEQh>lu&cIf=D=tAUX zqHPa11TX+JQ}{Vxm|n_f-j#$OaDV2Ive@qtH3P)yB(Li9Zz~(&6F$i&=*=Bk=xe+G zCe|EG=PGBNJOuTrPj>(i4NJ;RTigzN!rz}k&2zpY7>};TQw<`GmK!cZ^xl0uV|Xpr zvYL8&bU)72jApd)v1pxu{k%P!7* zKm%tYSHQ!If~|Xe`ehS_>Gy^=D}#5%BOON>RXaZPofZ9~r`? z>+ry~2IQ%g<+zzPTd&k{TrRNUV(RrgVW&XIJ#t)PnGnG6X=H2WRny+4Ehw?ONOo@~-|0n#88T>G!axka-L5Lgu8b_%x@MDf)ga@< zyB%rkW9`rqd;=$wmLb1A?4(Ui*AbSA9e_^uE^9mn2QL-t|ydd|YQ zdCqzHMD}GDW6t3SugOJZuWUI~_5f}u!{w5_bm*zHKRl|i^6vVO`}yXOM=RctYcD^? zIX9Gje>6(7+rvFze7j11nw8&i3J5Bo@_^BiHAWr^cxo^ImUqxKzzcI8ehNR*8wiMk zQ{_#?_{ZLIN5o!}Rx~ucC;Ko1xNm-VnhO*%^4d~nqI0}<%cGn_+ZnV>Os5!Thc{hAS-2?qX1nSh(j!_$^E_m3)G%Q%=|5R+H&EaRO#) zyqX;6=sQe`MJA>S;76EmjT!he-@{X%74Z|q58A-PYhhL|WTQpE zfB_3mQ#$z{?r0DqX$H1vZAHFh)gfvTb1ifNklNMlMk9)t@ZbfxmyZG6X2bFX|B3v% zeerq9>u^)LNqO-rZ!aWEA%`I2stN9g|EL&Ex$ZB1tDK1 zyYX+c0bASo<@j4(MQnX0$p=CCy!iyz?Yih?`6O7Z)Fanp#qGh~aM#W>52=#hIMrj_ zQ!1H|Ih+Dcs$~g)Xm@q9{u~*gSG{D>MQ5Mc-W*tU_yfgeNFtDlzt>O51WkApjtmu{ zuyGaf7vp%o+xOm&D8M(GZkZT1cF%nZGrXZeie}V`Q(J7St!^H989TyqCCK-~-bC%V z{-<&i11?%_0c@|Vn_1UB`lZzxRVxMQ{$&B16T^+lBh6jz>-vTFnq_Yu@fzCPwCtQ6VQp{rOz$W2AkR{3z|$XVBV5{jjl6sx zXIZN(;ajQVdekA4V0`~k<|@>a(_NOk%}yA@p7b>G!mab%hgPa#760McciVs#8^K(@ zEnhJ6Qf=>adR|Z^4(M&UP6Wn`aEwxT^+^AGaEnGKdDBQuqRF6Y^7nL2 znNZ2=NPBNjJ^*;{iP_q+|7V~=!WxkRMG=Q^zBf5`^P(0B`O3G^MZSH$s_Kx4+-+r> z@+tWq5Uc6%19;S-o7Wnw21v)~sk_?tct3+Kk{PtI*S(yqFOs%==nV4aAT~#Q zqCKY``}*qQ097BjxTw7_FCIJFB*dUh<2X5PP&$7a;8!-|LTt}}^4NaHmDPUA7Sn#( zmCRn5U--e-yc4Zu|JGG?9!8PR3;pfc3tO%^3*R4b>&6iFFN^{QTU+Hx%98j}N2 zM1#Yn(4O5TLEBg8M6CPC?y-7FEC6I;sT1^pImbly_>jgBX|ZJOIW#)&=bH^m!_%KueC@w>A|zw8{Hi1>g6!fl$5x zs~BN8DumBrd2=D(2h1l(w{V`=ehkvSQ!k9^u;XUy9#A*iXvI#wmWkoEwwCot_7Ic$ zHi;>yQ12Y@T=(R50P0ZN1#G%F8_W;9s1t{6`D7tO zg%*$zwr;@kK~UVPcjUQfS*6ht=k%soZqII-)-Z6Xd(a_p!>8k1*2{QNfL{3`fPt!; z1kka+4yqqoL^^%6iRtG}8n-zKfDa(JPLL{D04Bw_pI2SvDIXPLCLMzxa=ND&}Qy7Ibk zZ~uXO;&e=1kFxL@`|N$i?x~1l;@6&kmZ(_$UVr;e=Qw4BuKI!%=LSeaS%MVZLT+1d zKYw6sp6%fjCwK4kdzLOiaAhhk^Op)N9HaYG7Wx1l{T(s%D_+Pvt)aow6*UnH0Q7)% zA+B2E8f&!#fg#KcZE5q>YBl%i$*m{ro?sK=4?O+hk$&|k9E}Zxr2K@4~&C~!&)JpMYrYwf4+n0Yt$5m zJSwKGZPf_P9WC{HyoSrqlNeEy1oxlC;jchKM2x1xuJnzbfKf~|@-sQ0Y<&uSkqk3UjgaI}t9A-0m{P0;nrB6) zGj?(vWLih}3W~bdml!O=$|~qZMPA<-mT&uB6HW)bQYwOYl%BXa<#=Ft>D^z&Evmpp z>FKcU-ZEr(B}d$2eRg09p#ItN$imr{WZZ@glx5%Cn-(SC;K z2I@@O^+_LWc$3_?`D}&Wgd?Ci7P0=F@B$@ag}4KnY*P*A`)CtDjQ9+Y5kCZ|zeT8H z`5Q4K%*5Ci~ioK3DLHJAh_gnsFSR+MP@zSuGvde%-s@f5sJ#;}# zw7AkJCyh&$~!Fp_3VD37TR+i7eHT;b6PQp`)4ApSo|NZR~M&dGPx~u$D2L3CHID5*u zrB)!P;*-IzR8=xu;U>Lu`fZ**0T z!&w-qgvrf#N}fY2x(6`dl$3HjW%aU(#nG!eF;cA783eNT#pqS? z+v*fc)w11;L+EU+{M)B{TsvkQUpY|QS&s_SYnvemZ#zOQs^9=j@7VDEQdB`-eG-V3 zG6=gP_maUBn(>63VF$FeLYut}Qf2K)X>Ef1(wFio{off2`t~pdU&?f-<@ga&$;fvv zr0fjgp7tK}H_kPKU`xS*6g9edr<-a&Czt*wOF*eS*9*i_MK4rUE-~<3vBr`J2dEwk z+jPS%cISrc{>vssLQ9dAWQ zXRo}w-JuSZ_kSW{0pQht?5x)U@sZh9-rgTdC_rqQ#e|`F5X%)^D`M1{OccL9TKkTA z6PNWZM@hS3=w}0#Md$jse2SS^eTcI-2!aNKq=CPJs-B;7#U*3j`k~7_8vSeItp=zR zfpiS$$RBdqc=6;{`J9otzam+`(JHb;&LJT8uEdz0kDob&mx7X_rGvJGmy3_7Vh*zT zSDm?;LkQp1<5iale^!{t6A854g-D!ZeKrHD65Z9r%M<-IKC9>9M#2f$6wB*dDiya> zesQp4Rm`! zNN1WnDT{I0ES!E_+PgB_?nrRY52%A1kclYph$I!Kmkk)8hU}Z~4be9Zf0NKJsF!-A z3Y85>;q}%UiQKQ4$wr2HQngRlDbBX(c*F|n>(7&L9$l_TrfJVn*~_|QzZH;? z{({>YF^>>=Wu|t8FPE5FB`-kkDExs0QQm*f`m{32{AA47b`eoz9z8%&?#jvSd5OpD zlM7_Gs62}Q&!o6cHV4Og`irPBWY+CUfU+o{C8da1$ry><4JM1Wb)esOrB}zCV!mx~ z)D)9jmY$9XD(U6Rl^BXr?dqy2(wjLxSr|J0o>uIdD*RdAQPY5X!LU}=<&hw%=Q=aG zjGRKt`b=R=;&FekvDSg1Z)E+N-M}$F%fr~CKE;v`XQVD_4(*XeZ^>lq&gIc9cdn$F z-`nnUoGd2WZ%48mZDeF5d#Y6XUqk%sHIq6GMw8ANC}U#Bp?SXma%^I+HG5Km3Bikt zb_cPq_RYjv#xV?c_JBeO7T`KuEEO3uA^SmIQ20KnQhH8H$;%>GkyY7@o4Jwu@n*$f zBN;OLPP`Fl&{pd=pN-)RTDNNt9iL5b>|BWx;~yeV!aUB-J#$nppvNP=2Z(jDfmKey zbhs;NL_3$&&f{PZItwY^3}DPYZf%HzE6MdcZ(lD~j?iR2bvKbjvgV673*R;^s*!h( zey9BJZ5AP|#z3FWD3ViZchd)W>mS|py`m@~-m7HUGRuxPQE%DX{`6Od=9jpF$Es7J zi`&kyi12|cNW$4@g8_kXeyy!zlbyLrjoP!li~S+{{jWpCuAy3OY-a<~9LQDz#kK*& z$>Aik^~q{h)D3K*7LB8=v=Ic$Orgo#w=B=;+HHv0+?L}!A-o=$L^1Dc4Dhljc=f$$ z&(7AR^C%T*a^1w3 zz=gXqD&8#CNquy{o`rd6D?MX8&^stm9=P1?%RU8lB72pKDMxgk12)fqQG=c`Llmz7 zdpBjH_R2*xUu4MxBot@7wx0xjP-Y43r}@_Ya?b{t*)J2Bh}rf>Ktwn-+^cYmQD7-k zd&2OPe;@r)=Tgd{>B-NMHDrn{zI&ylfbyU^jLA zk>E~%bZK^o9mrsJB^3-cR*UH$t)LCp(~C?58&xl8jtGT;KF)rCvF zWFUQ6jv=ei)eUDV&vmNmgyeKz6WqjpIZiX{RVL~gx zO@V3&#ozrWxfE45702Sh@7x9R>;JSFRSnD4WxaVTDK#AnLK+!$w^tg3o!8Lu?N@!< z(%sA6cQkB~^eT$i<*8iC%~+s3E1nU3dL5f+=0LXJWWl|(`vJ$OzX@OhUTSgN z9dDDfY)A!7A7l z7zsW}y_Xv^I$6`m;g{muckeOL(*5D924->p<6;}hoIKbE`$tDBKqy^m>jP4-!5GjT z9FwNbeve;Vt&E?%=h{;I*{*7c#j9FETAjH;VB(&22QWZQ39>v-sd(Qau<&5BLdxt6Z1=0<02A!YqUYjI%V%bOqR#%G z#q_%(oGm@Dtl)i+mzQUEvNM;Om5nLyp4roD&jMmrC;^dQngGw9K|;kci^Fv?EfyjM zGG@dk7?w?tf7Nf;4yXz%*mx@)OgM?4kBu6Oc)zg>hm6XwN{5V1HvHft^{SEbVQ|As*r^GT-+H_6xX|dtLE29az9`{bVEbrMQ!GHTV8+n`=q>?65l)(d*K>x*dGw+#Ir+;DQ?sJG&8?FwdeUA9H3LZ%1d}>UO4Ls`3wh{d#Y~WI$?aD~ z`Angm8Bs~ixa)|^j!uVBLaQqmad^P!Ox&b6e4KXEod?`=_gZtTAyUx$UaNsuSWg{# z`(ur-DA+M=i0bAKlggh-iBJ?9cIW#!*K+KRXbxEqE88^i(QK?>)~D3dllcoXabth@ z|7P@eu>-RQCy``ljH-lGSaLQ3rzud&%tts0VIBq=ev|;P^qbSouOpjTRpWJ~Zf8y1 z>7A>{!GWduyFT}7qPDz2GOZoI+?OKHmy=WU4pn5 zLPm!=ZYmbv-K$lf-@TA;2+OLFZz0-CSfzXm6?7JHI=`KrQ|?=Tnc^$w&N}a_!{h#) z-fYY<7Q#AeKiX+iy}ihBa=7@2u$Z~+>Z&?HHBfWA+KHvG&Nagz38($ps^m*RXq99C zYiSpgqAlF@1#=&7icNn6L1eHyK~k#$&aNGf%kqnF_#d~MWki~G52NXty2g8Kt$rNO zhniHbhL)IV`LlBRdi_;xL!{z;5XT{sTZ?&p#T0UGIR8e5ey7}t5^eSOn ze!!)Eo!zZrirvjLe|H1y#K_$nAh*|k9hvClg>@*NIs3BFBl;mfX538y@Gzzu=pv1` zYgb40Cei!g?Vcwxe!f_Sf582(EjK`TZ3f$U_OFe=&?vKG7B5m^^*)Px#Uod|9*bMU z?#G76EzbcEs;^RCt){n+W+x9_(Kuba+i+qqfGp%+`%4{2CcU*0&@3$2Rk#X=Cr(?> z8{%F{SRx$YOj%~&P4hEJ%TGljNC9#56>nDChsM|LvKqa1`aIp^UstdI%6fhYcD%`HqxvFA{o)p+ZeU~!W{d$Gj zL-IcywZ~v_K!!|KNl9!b)h;}j#D~6B{scdrx4~n>?oh4sVvR?rrE2<+3rV{_VBI2z z3>ywx>FMIJk-;{xR(iCxM3wgnk=DiB8unCwZSU3H6>aO`aWnXp9rPmA++z>EI|Iev~dFXj$l?^ zS=3FsEH|D{D{oMhqcDMXs0T~};}P=v%T+QOc|(qN7mkX%=<%vzKSRMaD&eu*;Z(e@ zbFzbGPqO!sl*-Y9^RMS|L64!=UyK9JXZoEdogXu{&@fr#)>SMDA)S9y(k|ZTcvP>{ zj@$xBkA>#IpTwdX1dzzMwa>(MvadqDB_L2kHyoYwnQCPGvfiooqwp8vS7lYICHX)D zGP#-;CE3e{^tmAs?sr2G-N|518p3j&orYackvL!a$ThN&c1oKhBBMrh(5G)^%iKOi z#2hYog|ux{C-5G&_OqsC+9YvS{BR-J;Dhp<%RpWcPJ%7=4B9M03g`6!p`yQ8_5MZ7 zRVxOSwJ^zLmgILDQvdvhJPQ%EP|p(+6BBI~(Qr#NG(FP}1U&;VJ}*$Xi+dx+25r}1 zk;b2#U@c#oipG2Uki#spv?bN_x6Rg{y(|yt*6D}S*2r-*OU;=CSHe69wb$;wHRK&R z=uegyY>0s{*{a*rnf5P}7W(?@LXPR_aU5o2wv;@5^zL^~pi=Sz>iYBAkO~L!=zAo& zVG(#yf@ol`ty?`1{#+$SD3vv*%p2iyo?JZf0H7iGw`cO#cp7oLXZ5Z+0-Iiv8(l4h zAN~g!j!k9a6E1)YN8BDAzR~MnP?#2R?1EwjZ+?_Fz{hIY%}3NC9?aNn4V1?XuC;{9 zq9Uv^w!ZHLg-bxvkjo9pAyoF`wF{SQbc1-+;Nw}1Om20qWMa0`d26F9!;=*b)i!>m zl#^XeCGcS&x)-P@H|YbB;|oa)58hUB3*OVP^zurO(8;;^-&ex7zb6Pp%DT3S(?_H= z<*=47pq5|7+;~i@@{R(JyN$AzSD9l>%JVZZ#5J*PT*z~7_ldlxjZ}OAxU5GoCCA5(pk#$)eAvma$&XbJ~ZuV_r*CxYL`_{-LS9_P_l)`yftcCXV?QztFnsrXd z_AAA9EgFhu+$r$v$8hQ-KD!~667%s4N{%&`-x=qC9}g^N`o~89@AVJ%*p>0V8#Eeg z_-X9VikSh#j9$OtXsC3_d1<{xKB)@&i5C%u}V-eZDk$mzX%GOI7N9!Vn#quMsTS!0^x#0LSf0>-^grXWfUnZZ)cBh1O;~@ zPe!E?W^N81j0P$Xy1tRQfCDIWuR>aIRnO?m`j=35fB!-M=FG|~lMDVHKM%|;k&1=OU!1IjmG*ReluP()Vf-J3Fwd%}8_wh^VVLi&Zo|&Ft%Fes;Y7iQ!bI zMODH5n0!iydl6;q#9%dAO)f?z{mx*_POoEpU+1T>cs^wgOLCTN4Xv z{iJh1?8zIo)plBLYg$iofKjsPcS*vIL*F#8!6|gkM!^oeYbSdCpl{egqES6fy$e~P zUIRU8w8rnii+62Lk52X`0#zWtgj0;Bt8O0bSb75*Sr!Xj_P}8}*?yH&&xuI{p?AMt z#>yE$rMY`J1k$TWw}RJBl#O)x&7-_Yeu%VDw}q~9^lXB5QEe@(bc!Rs^t$~Ub2feB z@`UQa*|TrH_6Q-2KP9g|->nh=2$Dn{5K|A8i#IFP?k(90wKlpwz0E9ci(|-wup{eQ zdrq8w{XW1Jtx_`?#6lmusXJK{*B5V>nMWn=VF-r@p`GiL!t8!v{d8^U>Dl?UR8C1U zQq2W4>%Rg2#risluhZ|q3p?!Ayxz)T_Z2`vYcgyzjuN6glOL}-R_%ANzu8L}6!rB^ zFR23q(o_f2^o-Iv2mrz^VR~SZleUfVcfXI>NKEwVB)^h>d2_eS+(KRoyK0m zL+QXuDGR%wKd%7oWjS3u^I>Q({6wGuYlM*CTfH;vr(}EC=H2 z^wvE|`LN7-GJ9a5r0~84AU!#jOiLpw>^8n00f3>I0oak6*J$#G2-eH0&a3jhGpR9W z4{g`}M#Y+AT5W_QX-jdF5OZ$Q5%7^Rppt)7cJ3?J4~^tqsts6+AL@rL*|4q~-Mhwf z2^$k+EY|h1Vj56s=MBsHy8*l%2R;LD398OIBi}%m5Rfp4q5hd;;Ei}P0^Uu=Tx#2! zOm-0COlM~~E19mK=My-Ns0&B=C7u z9Jq)s+AsnKp(f!UKqj0CMERMCdDI4N;bEfG!Nfc@(V-<9-@S8dGtl`Lt$t+9`9*JV zm1UH?#;2XCY72DHZ0{zbske#Ry>o)SCA$##W;ut>t8R}JfTIEE8RrP^-%VXk5wyI? zClElp+=cjuuX+@}0iHR7fLIeia{f=J=%}5n^inG0KUP0r1$+!W4L~k#4{+xLvpys4 zm@DMngNT)5W|-g#2=FV%4praH`e|}KihGLY*o{xdNpL@c0ymREe?2t+Cz`chfNqA; zvmV7~j;B|ON^(U5&f)(`m;2_F^25SaW#p*~wb0LngmH5-85Ut}m;|coqs(EYXw9eC zZ;>lezv%hID^S_syifZFE%a03fL{2pB+mx zo7(eCbo;E*O0!y35vs**Jk@1-Fu3>es=cUoO~JIo`=fKQ=^Q1Xt*F2+qQ>nWsEE*v zU`<=Jr1knyD*pX5F|i_<1>Q?!-QdV4j{&>4x*&|cYiRK8IUoPF-qmJ8f$)NcWZm1M zyhVV&_MWtR+RM&CzDzc%LfPl#90p(Fedq8XQ>dpY%8>28EB>5^71VRc-w?ZV&^KWO zT;-l>|9A9z;_v+L6Rm#Gvp>;KeS2*D=AcY9 zCi;w^#}yH_KekR=Yg!ot8f4G;_`W~0-IXaW@|_KL1?AihjV}!&;=$5MgRs&`4EVe9 zn=4?`#1FNPz}4cbW1-qN6mB_Jvt1sy%ejc4#h)io0T60TDug`n)biLTHGQUWguuiN z?R9SC^AIjUCP30|MCogd`fFpgt&I}^QKJq;ZL7%uzjG~ZF#I;?!JWg@IV`nqnf@7@ zvW&uB!g9~4-Vs7HwxB`K#?Um~SA>mD@}^3@NBkZm>+ch4Y}0|=x9=~$;z0$PrAPsg zqrTiI-#EBLQzyVGnbP<4P+gZ&()($KPy);KIX)7?m8{V6r)hI{t5o*WQX5K>rPgnnT$oXNsW5w5;~wSJym2gb z=0iUl|9~W0MJY4wiGB<209=s**b$xn+SHaOts~YvLbpp^m>fsCIGvS9iyfsU)H=ig zkg7MUZFv)aW>uuTIzi)*YF*yD8){UtMaO%+)#3EM5w0BNQ}ZGuZ37^c2g<)H0&>G# zwngvBsa<-iTLnFPX$kUOyo+G^;iqOZy6dDqps$R0pZ%F$Nab|`rY~=%NhAG_tiA7v z9~gd6`3UeW(IsENTm)8A)xR@CdN;@I7U@YTQiRD_+1m@IPJ(fDK-V0AaiTCCDX}0q zC1siuhsELexO6zbK#TC#tf(UXL@w%eNBk))XU@kvpLTfLl}ANaB_AA{aq0$6)0Rs_ z!vfI7G$XA~K~|amT-kr_vHqUBM1b0^|0~T8DN|eP%0DoRNwPVrz}cADKpdNn50r|8K1;A)S`lFmzm#)$s{^b7Td{{Czg%O@s_AWiV+x3Rs zA@>#J;bMp*SA>424x(`%>$y_t<6_n16r+_Dp!NEUQ>|P=ZN%{X##jx{A!(HhEddDF zd*0ZC9hloOndm1QI9jnp;n(f2*jyC??#f#UZOV3Vxy{4N^xfj&o(jGy_m{$lq3|$1 zCYr%KuUhHojY;{@sHjzGpks5u%?QwgO#LWnn|fJ_Z7Z3xF|D1!r&j$g;;ze>;6Ev8}dg^*X)5DUytx{R`_M4O{=wmZ!+1Y_Ax;>W1@VHUT$vm95Ou_k5f za*7M7-fB@+l5^n!mtC9;HS5)6hYeKNSJt`W?M8(gZACTw#Mv?DK%n1)fdnm(`JGbM z%O~{`9{X!T>ZZGXfPYcgPk9R26pJrC(K6$&sqn5j?v;FvPU!Az=Qo0zqsuyiU834_ z8n7C6n2m;IU(1^c8gnX>?z0E|oiJaOEpmyE?NdkNo<5&aBxd-Lwf9K5aZXpqy}G+Z z{ZX3kuz_`<`d&LfZ9iaGuA93oay4kk5yJZ{%)pac=CLK4$cJaMYNHD%j4`BmjON@Xz=x+WD%F6#9=DQYl5XAPO$IS}6`$h7&rT=2Mc zzGdBwdU{~x6k?bKKxY>y^Z=Q+lq7nLh1kO{qgrp)sk^yQq^lpjZikrhAV6zAh$!rgH?~8uoo6WEoYW%w( zvPV0ICvyJ%;8LEl7uWoT@NimY>S#CdfUXU zdB-dNZRwli_C-e*AojYU<6Um6ZgE$7%_GiQX;@jQM^a?)oQ)`${L85!4s)E%Z$=L6 zZ*vaWI;&9by)WKqfX`WqTZEmMvR($s@ zL*8NgaL6vPfi~nI3SQT4vM%@W{h>czIn)a=EWjbkke+fGZ(W*W{=RJE))rKt{Mpnk zq|?Xg?XTH|?Eyo1EN8d(nev=(NN_uGY2AfPaI`H@9EWgqO)0U(% zp7l4h`dXfC^Xi36ffrAg68++fNg0PDfL$j8;YZMij#u|_jAyVVFQadUr`Pp0^}NPe zPZ@(N(mGHuQ`TbR4tcgyEeG3dmhRKZT8d?1aIT)WpfN}JtisXlFU@76x3_5c6? diff --git a/extern/phmap/html/img/mt_stl_flat_par_mem_run2.PNG b/extern/phmap/html/img/mt_stl_flat_par_mem_run2.PNG deleted file mode 100644 index 27281e7332c56bd1ff2ae66ea6d2d5611105dc5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33233 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 diff --git a/extern/phmap/html/img/mt_stl_flat_par_mem_run2_zoomed.PNG b/extern/phmap/html/img/mt_stl_flat_par_mem_run2_zoomed.PNG deleted file mode 100644 index bd56cbe97e94091d320086844c474ba885e98920..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24740 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

1%7a@ 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 Bq0 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 diff --git a/extern/phmap/html/img/mt_stl_flat_par_speed.PNG b/extern/phmap/html/img/mt_stl_flat_par_speed.PNG deleted file mode 100644 index 4aece96b13527954139ea9596e7a80e461fa1c92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41915 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%0AI-!e~CPGOj5V(+c??9)-_A)%g>d;%lgX4 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 Y;G8ATLZ4BjQY0fI-K{(!pW9F@&J0~0Kgfkv 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 diff --git a/extern/phmap/html/img/mt_stl_flat_par_speed_run2.PNG b/extern/phmap/html/img/mt_stl_flat_par_speed_run2.PNG deleted file mode 100644 index 38d9882d23b42d9f00bf37e76179597ce89e2ca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32369 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 Ai2wiq diff --git a/extern/phmap/html/img/node_mem_usage.gif b/extern/phmap/html/img/node_mem_usage.gif deleted file mode 100644 index 77dec05f96e6dcecde059d0cc29f6ce19a887918..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2008 zcmV;}2PgPPNk%w1VVMCd0J8u9|Ns90007+F+=z&Xc6N4{n3!f}X729p5D*Z|%*;eY zL?R+0GBPr{y1J^Ws#H`|A^8LW00000EC2ui0GR%MR-&opIB$6fDy@BhG{aM*GnR)YkkF(?uS1|@Myty-^G;z6)tSiGx(VzS_7 z&*-#z%^np#m4Rawm`ez{wtmm=`&|lV6bTO+1Q`MW4HE@Ne~*xnk}nQ#1zZgUc@hr@ z9}R+*hZ2q!r56i`ii`o1uCK7M4WmyU00>e51r7-V1aJTfa0!dI7_Al$hlOIOzy<+= zvD4JmXm}DLi-{Kkzyx3i1R?^ds3H~v59*7x}NJqZB;3c1+c*&$`X z61s927TBXOV8J*2zb@lQL)jV>fm4Lc}xCaIXG_g#C zfTtM(SifLWfp`Tx?nJUSy@mkmOx2hp{%k@z0P8Te^q}b=4|W1dCxAB^q|6LqG^|Tk zu+p$OU5(X5-kb(0hc`d)#~BEzr#<}?DE>g21pG`P5)B~Da2P`a8Gu~_J_SQv8f_(} zhJ71|<%5QU6k-S)H&wu)1O_0G*nmJ}G(!SrwLn&f5E{fMHn|RPqKU znpDuqC!xHtl36$c@E!&}UUF5C6byNlG@?-8zyJj}_Y-(3c{CD){8@Pci&Bs|6qF)K zqniT`nDziLndG4&VOe6305}ePkU)16sCeZ7-arY0krkBWhyrHOV@8rWhB2cl7R+)- zJ0EZa0xyi6MPM;zO(f(px}bO!EtKAp%PzhA65ue!Qy4heJX8R4tB}MRy8r~>;SAeM1Skk@!XZE@1#ct; zz5s}0VZdfIOv+XVuqa+35KByfyB{CWQ+pF6qVST|_M`I3EVu0P%P_|*^UO5Ye1QS$ ztiu2UIWt=;%EtEdk9d#mNm4;?90arkAYahXLt_dJP|;x`fb?9yeZ*Q%KUWZdYl^u* zz`(#{eTy0D9Oof71Pz8k10#)1puqzxaD&xuld+Jy0gx<#0;V0uAh-n?m15~$ zM)gG9;e}#Qz)30j-KR$WqzHHHPYIUXd5y)P4EZf!$0%G1fH87zf*SwbSn8pEG@%7@ ze{9D9ro|d?2%SS3c`zt8WDl)_n^5=#Bhj=GjW|u9Q=bt>n2k`#zb!#g7AQ}Bh&k=_ zkv&^@$^h7D|2{!WA(fs&gbA2YAZ=qT5{-7&qQh(h{{4gjdIuB}A$t>uP>Aw}16ln} zBt{wALPk`)791~o(ufLybU=Wr#3(CUiNf{15*F&bC<85$ps^@u!K+}9E2ZI}lF&A= z2@p#}pILxwdZ7VZ;mSf0DvXKbp%PtituQ`Wm;(f`2(K{WbWBsiWrEl*ewcv)ygK4u zT4=0+$)*6lKqCHt8W=G+%!LFGtiTrY0wBJi!!HYfUBrHoG{U4KOd-ht8G&I&5Xd8q z{1HqWVCkgTz5t%1k{%T5$-#CR?=w0Kec57I)DdIOuUMEo;^03NiG4ShBc92V53H6@tXaSAB|V#X*wn7Ilqtr-^t6k`EiqUM>3gUu08#ypgu z;{MpQObzHR1;V63J7EAzNO*z(vIM|9E0URj)GL~I$xI615;5YLvz(lhCI@JFD02n}_j9ADQ(-{MFY9K@_XdP5Ms7@}r^raX8rj@Y7 z%{8@&A##9C2e^b!oU(~Im1yLhw52K<(Nqdoy2K=xS3Q_I^{FJ0Mzjv+tGdDAR~&e! zv^X&^1B{}FTRopu4%9!B0l;U*xPUI9%GPcz>?r(N#J*hU#e|Juak{W;UiT8fP{ef+ zC{@hTlmybY8ulgSBLy&eq6D)cU{PgrB@U|PSja}|6lP;AiTnmIy&d+mInrGs1Od9y z637vzH5RQJu%y(sF16ws7;Hgzv5+7Mw76x;{J6lj>owthpot%FeMv73BsOS<5pK1( zjKDuoh|em$HJ@~IOI?cmkPIx`2swIKsqG#jqh|%%4h6v76&i*MO0fz$6Fb)nFtCc% zjc-LFS+YJBW)_XiiZ&QIMEwSgWgjCCe*62#dAQ91n>?3&#Z^v+mQubDhVWX4U`q<% qGQt>ct2TH!1a3kn!yx|bJ@ZL~dWQJKY_%wbyjWNiyZ8kW0028H`Aw?; diff --git a/extern/phmap/html/img/node_mem_usage.png b/extern/phmap/html/img/node_mem_usage.png deleted file mode 100644 index 15cb1e0fa404f4df8ee0668fb405e6bbd4b7ec64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9198 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 diff --git a/extern/phmap/html/img/node_peak.png b/extern/phmap/html/img/node_peak.png deleted file mode 100644 index e818cb3ed83cc82c157188cbc2be79772f6967c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5651 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 E0~-xZD*ylh diff --git a/extern/phmap/html/img/par_align_test.png b/extern/phmap/html/img/par_align_test.png deleted file mode 100644 index b28ae35ed6ba2fa378e3569e6101b4f7218dc7e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51554 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 diff --git a/extern/phmap/html/img/par_mt_memory.PNG b/extern/phmap/html/img/par_mt_memory.PNG deleted file mode 100644 index c0c955b69b74f445280762c1cca1f53a4cf417c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26288 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

f)7?ovqHtm9_-x8v+cgV>DKZRC)_8?mar>CS5B{ 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 I_gjho3pL_;oB#j- diff --git a/extern/phmap/html/img/par_mt_speed.PNG b/extern/phmap/html/img/par_mt_speed.PNG deleted file mode 100644 index f3ad52ab265ddb00feb111f18fe91cfd6b441a2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22958 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 diff --git a/extern/phmap/html/img/parallel_flat_peak.gif b/extern/phmap/html/img/parallel_flat_peak.gif deleted file mode 100644 index 45e8ee6550e661cf0f1b24ddb590aa28664563da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1810 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 Q*T+pAO#_WLYW9);2kYVsqW}N^ diff --git a/extern/phmap/html/img/phash.png b/extern/phmap/html/img/phash.png deleted file mode 100644 index 18d18944761b1e3e11fedd8aeaa336c9cb69651f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14738 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 diff --git a/extern/phmap/html/img/phmap_logo.png b/extern/phmap/html/img/phmap_logo.png deleted file mode 100644 index 23314587a0eab3e66ee9dab1d91177966b8d6e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131578 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 diff --git a/extern/phmap/html/img/stl_flat_both.PNG b/extern/phmap/html/img/stl_flat_both.PNG deleted file mode 100644 index 5799f5cf24fd35320c46a1e745a17b073e311db7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52927 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 Qdd04zVR!|tcJtBy0jyfQe*gdg diff --git a/extern/phmap/html/img/stl_flat_mem.PNG b/extern/phmap/html/img/stl_flat_mem.PNG deleted file mode 100644 index 96fb4b843555a38199d8fe6f2a23bb7d83f63264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26242 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 diff --git a/extern/phmap/html/img/stl_flat_par_both.PNG b/extern/phmap/html/img/stl_flat_par_both.PNG deleted file mode 100644 index c92bca15be5f38cbc95a37a291dc2444bb1b3c81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84902 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 diff --git a/extern/phmap/html/img/stl_flat_par_mem.PNG b/extern/phmap/html/img/stl_flat_par_mem.PNG deleted file mode 100644 index 87e6ecac3b8f03b41cee32aad21c97566b27e9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28894 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 diff --git a/extern/phmap/html/img/stl_flat_par_mem_zoomed.PNG b/extern/phmap/html/img/stl_flat_par_mem_zoomed.PNG deleted file mode 100644 index 6424b7ff9ee4746112fdc7a0b2e345b44c5e3acd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28188 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 aVXzy8@b_SKOueB;(7t&2Lh<<<5B?8CGXTN> diff --git a/extern/phmap/html/img/stl_flat_par_speed.PNG b/extern/phmap/html/img/stl_flat_par_speed.PNG deleted file mode 100644 index 12f18e3942c8a997cc5b1bbcd81df15b0c7be2fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32742 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 diff --git a/extern/phmap/html/img/stl_flat_speed.PNG b/extern/phmap/html/img/stl_flat_speed.PNG deleted file mode 100644 index b7a0bce52684c3cefbfad4cc1b4a1b48167b175b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24937 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 Int -> [a] -> [a] -slice from to xs = take (to - from + 1) (drop from xs) - -doSlice :: Block -> IO Block -doSlice cb@(CodeBlock (id, classes, namevals) contents) = do - res <- return $ do - upper <- readMaybe =<< lookup "upper" namevals - lower <- readMaybe =<< lookup "lower" namevals - file <- lookup "slice" namevals - return (upper, lower, file) - - case res of - Nothing -> return cb - Just (upper, lower, f) -> do - contents <- readFile f - let lns = unlines $ slice lower upper (lines contents) - return (CodeBlock (id, classes, namevals) lns) -doSlice x = return x - -doInclude :: Block -> IO Block -doInclude cb@(CodeBlock (id, classes, namevals) contents) = - case lookup "include" namevals of - Just f -> return . (CodeBlock (id, classes, namevals)) =<< readFile f - Nothing -> return cb -doInclude x = return x - -doHtml :: Block -> IO Block -doHtml cb@(CodeBlock (id, classes, namevals) contents) = - case lookup "literal" namevals of - Just f -> return . (RawBlock "html") =<< readFile f - Nothing -> return cb -doHtml x = return x - -injectLatexMacros :: Maybe Format -> Pandoc -> IO Pandoc -injectLatexMacros (Just fmt) p = do - macros <- readFile "latex_macros" - let block = - case fmt of - Format "html" -> - Div ("",[],[("style","display:none")]) . (:[]) - . Para . (:[]) . Math DisplayMath $ macros - Format "latex" -> RawBlock "latex" macros - Format "epub" -> RawBlock "latex" macros - _ -> RawBlock "latex" macros - return (Pandoc nullMeta [block] <> p) -injectLatexMacros _ _ = return mempty - -main :: IO () -main = toJSONFilter - ((\fmt -> injectLatexMacros fmt - >=> walkM doInclude - >=> walkM doSlice - >=> walkM doHtml) :: Maybe Format -> Pandoc -> IO Pandoc) diff --git a/extern/phmap/html/latex_macros b/extern/phmap/html/latex_macros deleted file mode 100644 index 396f08f..0000000 --- a/extern/phmap/html/latex_macros +++ /dev/null @@ -1,15 +0,0 @@ -\newcommand{\andalso}{\quad\quad} -\newcommand{\infabbrev}[2]{\infax{#1 \quad\eqdef\quad #2}} -\newcommand{\infrule}[2]{\displaystyle \dfrac{#1}{#2}} -\newcommand{\ar}{\rightarrow} -\newcommand{\Int}{\mathtt{Int}} -\newcommand{\Bool}{\mathtt{Bool}} -\newcommand{\becomes}{\Downarrow} -\newcommand{\trule}[1]{(\textbf{#1})} -\newcommand{\FV}[1]{\mathtt{fv}(#1)} -\newcommand{\FTV}[1]{\mathtt{ftv}(#1)} -\newcommand{\BV}[1]{\mathtt{bv}(#1)} -\newcommand{\compiles}[1]{\text{C}\llbracket{#1}\rrbracket} -\newcommand{\exec}[1]{\text{E}\llbracket{#1}\rrbracket} -\renewcommand{\t}[1]{\mathtt{#1}} -\newcommand{\ite}[3]{\text{if }#1\text{ then }#2\text{ else }#3} diff --git a/extern/phmap/html/parallel_hashmap.html b/extern/phmap/html/parallel_hashmap.html deleted file mode 100644 index 9599923..0000000 --- a/extern/phmap/html/parallel_hashmap.html +++ /dev/null @@ -1,343 +0,0 @@ - - - - - The Parallel Hashmap (Gregory Popovitch) - - - - - - - - - - - - - - - - -

- -
- -
- -
-

\[\newcommand{\andalso}{\quad\quad} -\newcommand{\infabbrev}[2]{\infax{#1 \quad\eqdef\quad #2}} -\newcommand{\infrule}[2]{\displaystyle \dfrac{#1}{#2}} -\newcommand{\ar}{\rightarrow} -\newcommand{\Int}{\mathtt{Int}} -\newcommand{\Bool}{\mathtt{Bool}} -\newcommand{\becomes}{\Downarrow} -\newcommand{\trule}[1]{(\textbf{#1})} -\newcommand{\FV}[1]{\mathtt{fv}(#1)} -\newcommand{\FTV}[1]{\mathtt{ftv}(#1)} -\newcommand{\BV}[1]{\mathtt{bv}(#1)} -\newcommand{\compiles}[1]{\text{C}\llbracket{#1}\rrbracket} -\newcommand{\exec}[1]{\text{E}\llbracket{#1}\rrbracket} -\renewcommand{\t}[1]{\mathtt{#1}} -\newcommand{\ite}[3]{\text{if }#1\text{ then }#2\text{ else }#3} -\]

-
-

The Parallel Hashmap

-

or Abseiling from the shoulders of giants - © Gregory Popovitch - March 10, 2019

-

[tl;dr] We present a novel hashmap design, the Parallel Hashmap. Built on top of Abseil's flat_hash_map, the Parallel Hashmap has lower space requirements, is nearly as fast as the underlying flat_hash_map, and can be used from multiple threads with high levels of concurrency.

-

A quick look at the current state of the art

-

If you haven't been living under a rock, you know that Google open sourced late last year their Abseil library, which includes a very efficient flat hash table implementation. The absl::flat_hash_map stores the values directly in a memory array, which avoids memory indirections (this is referred to as closed hashing).

-

closed_hashing

-

Using parallel SSE2 instructions, the flat hash table is able to look up items by checking 16 slots in parallel, which allows the implementation to remain fast even when the table is filled to 87.5% capacity.

-

The graphs below show a comparison of time and memory usage necessary to insert up to 100 million values (each value is composed of two 8-byte integers), between the default hashmap of Visual Studio 2017 (std::unordered_map), and Abseil's flat_hash_map:

-

stl_flat comparison

-

On the bottom graph, we can see that, as expected, the Abseil flat_hash_map is significantly faster that the default stl implementation, typically about three times faster.

-

The peak memory usage issue

-

The top graph shown the memory usage for both tables.

-

I used a separate thread to monitor the memory usage, which allows to track the increased memory usage when the table resizes. Indeed, both tables have a peak memory usage that is significantly higher than the memory usage seen between insertions.

-

In the case of Abseil's flat_hash_map, the values are stored directly in a memory array. The memory usage is constant until the table needs to resize, which is why we see these horizontal sections of memory usage.

-

When the flat_hash_map reaches 87.5% occupancy, a new array of twice the size is allocated, the values are moved (rehashed) from the smaller to the larger array, and then the smaller array, now empty, is freed. So we see that during the resize, the occupancy is only one third of 87.5%, or 29.1%, and when the smaller array is released, occupancy is half of 87.5% or 43.75%.

-

The default STL implementation is also subject to this higher peak memory usage, since it typically is implemented with an array of buckets, each bucket having a pointer to a linked list of nodes containing the values. In order to maintain O(1) lookups, the array of buckets also needs to be resized as the table size grows, requiring a 3x temporary memory requirement for moving the old bucket array (1x) to the newly allocated, larger (2x) array. In between the bucket array resizes, the default STL implementation memory usage grows at a constant rate as new values are added to the linked lists.

-
-

Instead of having a separate linked list for each bucket, std::unordered_map implementations often use a single linked list (making iteration faster), with buckets pointing to locations within the single linked list. absl::node_hash_map, on the other hand, has each bucket pointing to a single value, and collisions are handled with open addressing like for the absl::flat_hash_map.

-
-

This peak memory usage can be the limiting factor for large tables. Suppose you are on a machine with 32 GB of ram, and the flat_hash_map needs to resize when you inserted 10 GB of values in it. 10 GB of values means the array size is 11.42 GB (resizing at 87.5% occupancy), and we need to allocate a new array of double size (22.85 GB), which obviously will not be possible on our 32 GB machine.

-

For my work developing mechanical engineering software, this has kept me from using flat hash maps, as the high peak memory usage was the limiting factor for the size of FE models which could be loaded on a given machine. So I used other types of maps, such as sparsepp or Google's cpp-btree.

-

When the Abseil library was open sourced, I started pondering the issue again. Compared to Google's old dense_hash_map which resized at 50% capacity, the new absl::flat_hash_map resizing at 87.5% capacity was more memory friendly, but it still had these significant peaks of memory usage when resizing.

-

If only there was a way to eliminate those peaks, the flat_hash_map would be close to perfect. But how?

-

The peak memory usage solution

-

Suddenly, it hit me. I had a solution. I would create a hash table that internally is made of an array of 16 hash tables (the submaps). When inserting or looking up an item, the index of the target submap would be decided by the hash of the value to insert. For example, if for a given size_t hashval, the index for the internal submap would be computed with:

-

submap_index = (hashval ^ (hashval >> 4)) & 0xF;

-

providing an index between 0 and 15.

-
-

In the actual implementation, the size of the array of hash tables is configurable to a power of two, so it can be 2, 4, 8, 16, 32, ... The following illustration shows a parallel_hash_map with 8 submaps.

-
-

index_computation

-

The benefit of this approach would be that the internal tables would each resize on its own when they reach 87.5% capacity, and since each table contains approximately one sixteenth of the values, the memory usage peak would be only one sixteenth of the size we saw for the single flat_hash_map.

-

The rest of this article describes my implementation of this concept that I have done inside the Abseil library (I have submitted a pull request in the hope it will be merged into the main Abseil codebase). The current name for it is parallel_flat_hash_map or parallel_flat_hash_set. It does provide the same external API as Abseil's other hash tables, and internally it uses a std::array of N flat_hash_maps.

-

I was delighted to find out that not only the parallel_flat_hash_map has significant memory usage benefits compared to the flat_hash_map, but it also has significant advantages for concurrent programming as I will show later.

-
-

I will use the names parallel_hash_map and parallel_flat_hash_map interchangably. They refer to the same data structure. The name used in my Abseil fork is absl::parallel_flat_hash_map, as it may be desirable to also provide a absl::parallel_node_hash_map.

-
-

The Parallel Hashmap: memory usage

-

So, without further ado, let's see the same graphs graphs as above, with the addition of the parallel_flat_hash_map. Let us first look at memory usage (the second graph provides a "zoomed-in" view of the location where resizing occurs):

-

stl_flat_par comparison

-

stl_flat_par_zoomed comparison

-

We see that the parallel_hash_map behaves as expected. The memory usage matches exactly the memory usage of its base flat_hash_map, except that the peaks of memory usage which occur when the table resizes are drastically reduced, to the point that they are not objectionable anymore. In the "zoomed-in" view, we can see the sixteen dots corresponding to each of the individual submaps resizing. The fact that those resizes are occuring at roughly the same x location in the graph shows that we have a good hash function distribution, distributing the values evenly between the sixteen individual submaps.

-

The Parallel Hashmap: speed

-

But what about the speed? After all, for each value inserted into the parallel hashmap, we have to do some extra work (steps 1 and 2 below):

-
    -
  1. compute the hash for the value to insert
  2. -
  3. compute the index of the target submap from the hash)
  4. -
  5. insert the value into the submap
  6. -
-

The first step (compute the hash) is the most problematic one, as it can potentially be costly. As we mentioned above, the second step (computing the index from the hash) is very simple and its cost in minimal (3 processor instruction as shown below in Matt Godbolt's compiler explorer):

-

index computation cost

-

As for the hash value computation, fortunately we can eliminate this cost by providing the computed hash to the submap functions, so that it is computed only once. This is exactly what I have done in my implementation of the parallel_hash_map within the Abseil library, adding a few extra APIs to the Abseil internal raw_hash_map.h header, which allow the parallel_hash_map to pass the precomputed hash value to the underlying submaps.

-

So we have all but eliminated the cost of the first step, and seen that the cost of the second step is very minimal. At this point we expect that the parallel_hash_map performance will be close to the one of its underlying flat_hash_map, and this is confirmed by the chart below:

-

stl_flat_par comparison

-

Indeed, because of the scale is somewhat compressed due to the longer times of the std::unordered_map, we can barely distinguish between the blue curve of the flat_hash_map and the red curve of the parallel_hash_map. So let's look at a graph without the std::unordered_map:

-

flat_par comparison

-

This last graph shows that the parallel_hash_map is slightly slower especially for smaller table sizes. For a reason not obvious to me (maybe better memory locality), the speeds of the parallel_hash_map and flat_hash_map are essentially undistinguishable for larger map sizes (> 80 million values).

-

Are we done yet?

-

This is already looking pretty good. For large hash_maps, the parallel_flat_hash_map is a very appealing solution, as it provides essentially the excellent performance of the flat_hash_map, while virtually eliminating the peaks of memory usage which occur when the hash table resizes.

-

But there is another aspect of the inherent parallelism of the parallel_hash_map which is interesting to explore. As we know, typical hashmaps cannot be modified from multiple threads without explicit synchronization. And bracketing write accesses to a shared hash_map with synchronization primitives, such as mutexes, can reduce the concurrency of our program, and even cause deadlocks.

-

Because the parallel_hash_map is made of sixteen separate submaps, it posesses some intrinsic parallelism. Indeed, suppose you can make sure that different threads will use different submaps, you would be able to insert into the same parallel_hash_map at the same time from the different threads without any locking.

-

Using the intrinsic parallelism of the parallel_hash_map to insert values from multiple threads, lock free.

-

So, if you can iterate over the values you want to insert into the hash table, the idea is that each thread will iterate over all values, and then for each value:

-
    -
  1. compute the hash for that value
  2. -
  3. compute the submap index for that hash
  4. -
  5. if the submap index is one assigned to this thread, then insert the value, otherwise do nothing and continue to the next value
  6. -
-

Here is the code for the single-threaded insert:

- -

and here is the code for the multi-threaded insert:

-
template <class HT>
-void _fill_random_inner_mt(int64_t cnt, HT &hash, RSU &rsu)
-{
-    constexpr int64_t num_threads = 8;   // has to be a power of two
-    std::unique_ptr<std::thread> threads[num_threads];
-
-    auto thread_fn = [&hash, cnt, num_threads](int64_t thread_idx, RSU rsu) {
-        typename HT::hasher hasher;                         // get hasher object from the hash table
-        size_t modulo = hash.subcnt() / num_threads;        // subcnt() returns the number of submaps
-
-        for (int64_t i=0; i<cnt; ++i)                       // iterate over all values
-        {
-            unsigned int key = rsu.next();                  // get next key to insert
-            size_t hashval = hash.hash(key);                // compute its hash
-            size_t idx  = hash.subidx(hashval);             // compute the submap index for this hash
-            if (idx / modulo == thread_idx)                 // if the submap is suitable for this thread
-            {
-                hash.insert(typename HT::value_type(key, 0)); // insert the value
-                ++(num_keys[thread_idx]);                     // increment count of inserted values
-            }
-        }
-    };
-
-    // create and start 8 threads - each will insert in their own submaps
-    // thread 0 will insert the keys whose hash direct them to submap0 or submap1
-    // thread 1 will insert the keys whose hash direct them to submap2 or submap3
-    // --------------------------------------------------------------------------
-    for (int64_t i=0; i<num_threads; ++i)
-        threads[i].reset(new std::thread(thread_fn, i, rsu));
-
-    // rsu passed by value to threads... we need to increment the reference object
-    for (int64_t i=0; i<cnt; ++i)
-        rsu.next();
-    
-    // wait for the threads to finish their work and exit
-    for (int64_t i=0; i<num_threads; ++i)
-        threads[i]->join();
-}
-

Using multiple threads, we are able to populate the parallel_flat_hash_map (inserting 100 million values) three times faster than the standard flat_hash_map (which we could not have populated from multiple threads without explicit locks, which would have prevented performance improvements).

-

And the graphical visualization of the results:

-

mt_stl_flat_par comparison

-

We notice in this last graph that the memory usage peaks, while still smaller than those of the flat_hash_map, are larger that those we saw when populating the parallel_hash_map using a single thread. The obvious reason is that, when using a single thread, only one of the submaps would resize at a time, ensuring that the peak would only be 1/16th of the one for the flat_hash_map (provided of course that the hash function distributes the values somewhat evenly between the submaps).

-

When running in multi-threaded mode (in this case eight threads), potentially as many as eight submaps can resize simultaneaously, so for a parallel_hash_map with sixteen submaps the memory peak size can be half as large as the one for the flat_hash_map.

-

Still, this is a pretty good result, we are now inserting values into our parallel_hash_map three times faster than we were able to do using the flat_hash_map, while using a lower memory ceiling.

-

This is significant, as the speed of insertion into a hash map is important in many algorithms, for example removing duplicates in a collection of values.

-

Using the intrinsic parallelism of the parallel_hash_map with internal mutexes

-

It may not be practical to add logic into your program to ensure you use different internal submaps from each thread. Still, locking the whole parallel_hash_map for each access would forego taking advantage of its intrinsic parallelism.

-

For that reason, the parallel_hash_map can provide internal locking using the absl::Mutex (the default template parameter is absl::NullMutex, which does no locking and has no size cost). When selecting absl::Mutex, one mutex is created for each internal submap at a cost of 8 bytes per submap, and the parallel_hash_map internally protects each submap access with its associated mutex.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mapNumber of submapssizeof(map)
std::unordered_map (vs2017)-64
absl::flat_hash_map-48
absl::parallel_flat_hash_map, N=4, absl::NullMutex16768
absl::parallel_flat_hash_map, N=4, absl::Mutex16896
-

It is about time we provide the complete parallel_flat_hash_map class declaration (the declaration for parallel_flat_hash_set is similar):

-
template <class K, class V,
-          class Hash      = absl::priv::hash_default_hash<K>,
-          class Eq        = absl::priv::hash_default_eq<K>,
-          class Allocator = std::allocator<std::pair<const K, V>>,
-          size_t N        = 4,                 // 2**N submaps
-          class Mutex     = absl::NullMutex>   // use absl::Mutex to enable internal locks
-class parallel_flat_hash_map;
-
-

Let's see what result we get for the insertion of random values from multiple threads, however this time we create a parallel_hash_map with internal locking (by providing absl::Mutex as the last template argument), and modify the code so that each thread inserts values in any submap (no pre-selection).

-

no_preselection

-

If we were to do a intensive insertion test into a hash map from multiple threads, where we lock the whole hash table for each insertion, we would be likely to get even worse results than for a single threaded insert, because of heavy lock contention.

-

In this case, our expectation is that the finer grained locking of the parallel_hash_map (separate locks for each internal submap) will provide a speed benefit when compared to the single threaded insertion, and this is indeed what the benchmarks show:

-

flat_par_mutex_4

-

Interestingly, we notice that the memory peaks (when resizing occur) are again very small, in the order of 1/16th of those for the flat_hash_map. This is likely because, as soon as one of the submaps resizes (which takes much longer than a regular insertion), the other threads very soon have to wait on the resizing submap's mutex for an insertion, before they reach their own resizing threashold.

-

Since threads statistically will insert on a different submap for each value, it would be a surprising coincidence indeed if two submaps reached their resizing threshold without the resizing of the first submap blocking all the other threads first.

-

If we increase the number of submaps, we should see more parallelism (less lock contention across threads, as the odds of two separate threads inserting in the same subhash is lower), but with diminishing returns as every submap resize will quickly block the other threads until the resize is completed.

-

This is indeed what we see:

-

lock_various_sizes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mapNumber of submapssizeof(map)time 100M insertions
absl::flat_hash_map-4814.77s
absl::parallel_flat_hash_map, N=4, absl::Mutex168968.36s
absl::parallel_flat_hash_map, N=5, absl::Mutex3217927.14s
absl::parallel_flat_hash_map, N=6, absl::Mutex6435846.61s
-

There is still some overhead from the mutex lock/unlock, and the occasional lock contention, which prevents us from reaching the performance of the previous multithreaded lock-free insertion (5.12s for inserting 100M elements).

-

In Conclusion

-

We have seen that the novel parallel hashmap approach, used within a single thread, provides significant space advantages, with a very minimal time penalty. When used in a multi-thread context, the parallel hashmap still provides a significant space benefit, in addition to a consequential time benefit by reducing (or even eliminating) lock contention when accessing the parallel hashmap.

-

Future work

-
    -
  1. It would be beneficial to provide additional APIs for the parallel_flat_hash_map and parallel_flat_hash_set taking a precomputed hash value. This would enable the lock-free usage of the parallel_flat_hash_map, described above for multi-threaded environments, without requiring a double hash computation.

  2. -
  3. We may consider providing parallel_node_hash_map and parallel_node_hash_set in Abseil, for the cases when pointer stability is required for keys and/or values. This would be a simple addition.

  4. -
-

Thanks

-

I would like to thank Google's Matt Kulukundis for his eye-opening presentation of the flat_hash_map design at CPPCON 2017 - my frustration with not being able to use it helped trigger my insight into the parallel_hash_map. Also many thanks to the Abseil container developers - I believe the main contributors are Alkis Evlogimenos and Roman Perepelitsa - who created an excellent codebase into which the graft of this new hashmap took easily, and finally to Google for open-sourcing Abseil. Thanks also to my son Andre for reviewing this paper, and for his patience when I was rambling about the parallel_hash_map and its benefits.

- -

Github repository for the benchmark code used in this paper

-

Swiss Tables doc

-

My fork of Google Abseil repository, with the parallel_flat_hash_map implementation

-

Google Abseil repository

-

Matt Kulukindis: Designing a Fast, Efficient, Cache-friendly Hash Table, Step by Step

-
-
- -
- - - diff --git a/extern/phmap/html/parallel_hashmap.md b/extern/phmap/html/parallel_hashmap.md deleted file mode 100644 index d0b5345..0000000 --- a/extern/phmap/html/parallel_hashmap.md +++ /dev/null @@ -1,274 +0,0 @@ -# The Parallel Hashmap - or Abseiling from the shoulders of giants - © Gregory Popovitch - March 10, 2019 - -[tl;dr] We present a novel hashmap design, the Parallel Hashmap. Built on a modified version of Abseil's *flat_hash_map*, the Parallel Hashmap has lower space requirements, is nearly as fast as the underlying *flat_hash_map*, and can be used from multiple threads with high levels of concurrency. The [parallel hashmap](https://github.com/greg7mdp/parallel-hashmap) repository provides header-only version of the flat and node hashmaps, and their parallel versions as well. - -### A quick look at the current state of the art - -If you haven't been living under a rock, you know that Google open sourced late last year their Abseil library, which includes a very efficient flat hash table implementation. The *absl::flat_hash_map* stores the values directly in a memory array, which avoids memory indirections (this is referred to as closed hashing). - -![closed_hashing](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/closed_hashing.png?raw=true) - -Using parallel SSE2 instructions, the flat hash table is able to look up items by checking 16 slots in parallel, which allows the implementation to remain fast even when the table is filled to 87.5% capacity. - -The graphs below show a comparison of time and memory usage necessary to insert up to 100 million values (each value is composed of two 8-byte integers), between the default hashmap of Visual Studio 2017 (std::unordered_map), and Abseil's flat_hash_map: - -![stl_flat comparison](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/stl_flat_both.PNG?raw=true) - -On the bottom graph, we can see that, as expected, the Abseil *flat_hash_map* is significantly faster that the default stl implementation, typically about three times faster. - -### The peak memory usage issue - -The top graph shown the memory usage for both tables. - -I used a separate thread to monitor the memory usage, which allows to track the increased memory usage when the table resizes. Indeed, both tables have a peak memory usage that is significantly higher than the memory usage seen between insertions. - -In the case of Abseil's *flat_hash_map*, the values are stored directly in a memory array. The memory usage is constant until the table needs to resize, which is why we see these horizontal sections of memory usage. - -When the *flat_hash_map* reaches 87.5% occupancy, a new array of twice the size is allocated, the values are moved (rehashed) from the smaller to the larger array, and then the smaller array, now empty, is freed. So we see that during the resize, the occupancy is only one third of 87.5%, or 29.1%, and when the smaller array is released, occupancy is half of 87.5% or 43.75%. - -The default STL implementation is also subject to this higher peak memory usage, since it typically is implemented with an array of buckets, each bucket having a pointer to a linked list of nodes containing the values. In order to maintain O(1) lookups, the array of buckets also needs to be resized as the table size grows, requiring a 3x temporary memory requirement for moving the old bucket array (1x) to the newly allocated, larger (2x) array. In between the bucket array resizes, the default STL implementation memory usage grows at a constant rate as new values are added to the linked lists. - -> Instead of having a separate linked list for each bucket, *std::unordered_map* implementations often use a single linked list (making iteration faster), with buckets pointing to locations within the single linked list. *absl::node_hash_map*, on the other hand, has each bucket pointing to a single value, and collisions are handled with open addressing like for the *absl::flat_hash_map*. - -This peak memory usage can be the limiting factor for large tables. Suppose you are on a machine with 32 GB of ram, and the *flat_hash_map* needs to resize when you inserted 10 GB of values in it. 10 GB of values means the array size is 11.42 GB (resizing at 87.5% occupancy), and we need to allocate a new array of double size (22.85 GB), which obviously will not be possible on our 32 GB machine. - -For my work developing mechanical engineering software, this has kept me from using flat hash maps, as the high peak memory usage was the limiting factor for the size of FE models which could be loaded on a given machine. So I used other types of maps, such as [sparsepp](https://github.com/greg7mdp/sparsepp) or Google's [cpp-btree](https://code.google.com/archive/p/cpp-btree/). - -When the Abseil library was open sourced, I started pondering the issue again. Compared to Google's old dense_hash_map which resized at 50% capacity, the new *absl::flat_hash_map* resizing at 87.5% capacity was more memory friendly, but it still had these significant peaks of memory usage when resizing. - -If only there was a way to eliminate those peaks, the *flat_hash_map* would be close to perfect. But how? - -### The peak memory usage solution - -Suddenly, it hit me. I had a solution. I would create a hash table that internally is made of an array of 16 hash tables (the submaps). When inserting or looking up an item, the index of the target submap would be decided by the hash of the value to insert. For example, if for a given `size_t hashval`, the index for the internal submap would be computed with: - -`submap_index = (hashval ^ (hashval >> 4)) & 0xF;` - -providing an index between 0 and 15. - -> In the actual implementation, the size of the array of hash tables is configurable to a power of two, so it can be 2, 4, 8, 16, 32, ... The following illustration shows a parallel_hash_map with 8 submaps. - -![index_computation](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/index_computation.png?raw=true) - -The benefit of this approach would be that the internal tables would each resize on its own when they reach 87.5% capacity, and since each table contains approximately one sixteenth of the values, the memory usage peak would be only one sixteenth of the size we saw for the single *flat_hash_map*. - -The rest of this article describes my implementation of this concept that I have done in my [parallel hashmap](https://github.com/greg7mdp/parallel-hashmap) repository. This is a header only library, which provides the following eight hashmaps: - -- phmap::flat_hash_set -- phmap::flat_hash_map -- phmap::node_hash_set -- phmap::node_hash_map -- phmap::parallel_flat_hash_set -- phmap::parallel_flat_hash_map -- phmap::parallel_node_hash_set -- phmap::parallel_node_hash_map - -This implementation requires a C++11 compatible compiler, and provides full compatibility with the std::unordered_map (with the exception of *pointer stability* for the `flat` versions. C++14 and C++17 methods, like `try-emplace`, are provided as well. -The names for it are *parallel_flat_hash_map* or *parallel_flat_hash_set*, and the *node* equivalents. These hashmaps provide the same external API as the *flat_hash_map*, and internally use a std::array of 2**N *flat_hash_maps*. - -I was delighted to find out that not only the *parallel_flat_hash_map* has significant memory usage benefits compared to the *flat_hash_map*, but it also has significant advantages for concurrent programming as I will show later. In the rest of this article, we will focus on the *parallel_flat_hash_map*, but similar results are seen for the *parallel_node_hash_map*, and the *set* versions of course. - - -### The Parallel Hashmap: memory usage - -So, without further ado, let's see the same graphs graphs as above, with the addition of the *parallel_flat_hash_map*. Let us first look at memory usage (the second graph provides a "zoomed-in" view of the location where resizing occurs): - -![stl_flat_par comparison](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/stl_flat_par_mem.PNG?raw=true) - -![stl_flat_par_zoomed comparison](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/stl_flat_par_mem_zoomed.PNG?raw=true) - -We see that the *parallel_flat_hash_map* behaves as expected. The memory usage matches exactly the memory usage of its base *flat_hash_map*, except that the peaks of memory usage which occur when the table resizes are drastically reduced, to the point that they are not objectionable anymore. In the "zoomed-in" view, we can see the sixteen dots corresponding to each of the individual submaps resizing. The fact that those resizes are occuring at roughly the same x location in the graph shows that we have a good hash function distribution, distributing the values evenly between the sixteen individual submaps. - - -### The Parallel Hashmap: speed - -But what about the speed? After all, for each value inserted into the parallel hashmap, we have to do some extra work (steps 1 and 2 below): -1. compute the hash for the value to insert -2. compute the index of the target submap from the hash) -3. insert the value into the submap - -The first step (compute the hash) is the most problematic one, as it can potentially be costly. As we mentioned above, the second step (computing the index from the hash) is very simple and its cost in minimal (3 processor instruction as shown below in *Matt Godbolt*'s compiler explorer): - -![index computation cost](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/idx_computation_cost.PNG?raw=true) - -As for the hash value computation, fortunately we can eliminate this cost by providing the computed hash to the submap functions, so that it is computed only once. This is exactly what I have done in my implementation of the *parallel_flat_hash_map*, adding a few extra APIs to the internal raw_hash_map.h header, which allow the *parallel_flat_hash_map* to pass the precomputed hash value to the underlying submaps. - -So we have all but eliminated the cost of the first step, and seen that the cost of the second step is very minimal. At this point we expect that the *parallel_flat_hash_map* performance will be close to the one of its underlying *flat_hash_map*, and this is confirmed by the chart below: - -![stl_flat_par comparison](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/stl_flat_par_speed.PNG?raw=true) - -Indeed, because of the scale is somewhat compressed due to the longer times of the std::unordered_map, we can barely distinguish between the blue curve of the *flat_hash_map* and the red curve of the *parallel_flat_hash_map*. So let's look at a graph without the std::unordered_map: - -![flat_par comparison](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/flat_par_speed.PNG?raw=true) - -This last graph shows that the *parallel_flat_hash_map* is slightly slower especially for smaller table sizes. For a reason not obvious to me (maybe better memory locality), the speeds of the *parallel_flat_hash_map* and *flat_hash_map* are essentially undistinguishable for larger map sizes (> 80 million values). - -### Are we done yet? - -This is already looking pretty good. For large hash_maps, the *parallel_flat_hash_map* is a very appealing solution, as it provides essentially the excellent performance of the *flat_hash_map*, while virtually eliminating the peaks of memory usage which occur when the hash table resizes. - -But there is another aspect of the inherent parallelism of the *parallel_flat_hash_map* which is interesting to explore. As we know, typical hashmaps cannot be modified from multiple threads without explicit synchronization. And bracketing write accesses to a shared hash_map with synchronization primitives, such as mutexes, can reduce the concurrency of our program, and even cause deadlocks. - -Because the *parallel_flat_hash_map* is made of sixteen separate submaps, it posesses some intrinsic parallelism. Indeed, suppose you can make sure that different threads will use different submaps, you would be able to insert into the same *parallel_flat_hash_map* at the same time from the different threads without any locking. - -### Using the intrinsic parallelism of the *parallel_flat_hash_map* to insert values from multiple threads, lock free. - -So, if you can iterate over the values you want to insert into the hash table, the idea is that each thread will iterate over all values, and then for each value: - -1. compute the hash for that value -2. compute the submap index for that hash -3. if the submap index is one assigned to this thread, then insert the value, otherwise do nothing and continue to the next value - -Here is the code for the single-threaded insert: - -```c++ -template -void _fill_random_inner(int64_t cnt, HT &hash, RSU &rsu) -{ - for (int64_t i=0; i -void _fill_random_inner_mt(int64_t cnt, HT &hash, RSU &rsu) -{ - constexpr int64_t num_threads = 8; // has to be a power of two - std::unique_ptr threads[num_threads]; - - auto thread_fn = [&hash, cnt, num_threads](int64_t thread_idx, RSU rsu) { - size_t modulo = hash.subcnt() / num_threads; // subcnt() returns the number of submaps - - for (int64_t i=0; ijoin(); -} -``` - -Using multiple threads, we are able to populate the *parallel_flat_hash_map* (inserting 100 million values) three times faster than the standard *flat_hash_map* (which we could not have populated from multiple threads without explicit locks, which would have prevented performance improvements). - -And the graphical visualization of the results: - -![mt_stl_flat_par comparison](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/mt_stl_flat_par_both_run2.PNG?raw=true) - -We notice in this last graph that the memory usage peaks, while still smaller than those of the *flat_hash_map*, are larger that those we saw when populating the *parallel_flat_hash_map* using a single thread. The obvious reason is that, when using a single thread, only one of the submaps would resize at a time, ensuring that the peak would only be 1/16th of the one for the *flat_hash_map* (provided of course that the hash function distributes the values somewhat evenly between the submaps). - -When running in multi-threaded mode (in this case eight threads), potentially as many as eight submaps can resize simultaneaously, so for a *parallel_flat_hash_map* with sixteen submaps the memory peak size can be half as large as the one for the *flat_hash_map*. - -Still, this is a pretty good result, we are now inserting values into our *parallel_flat_hash_map* three times faster than we were able to do using the *flat_hash_map*, while using a lower memory ceiling. - -This is significant, as the speed of insertion into a hash map is important in many algorithms, for example removing duplicates in a collection of values. - - -### Using the intrinsic parallelism of the *parallel_flat_hash_map* with internal mutexes - -It may not be practical to add logic into your program to ensure you use different internal submaps from each thread. Still, locking the whole *parallel_flat_hash_map* for each access would forego taking advantage of its intrinsic parallelism. - -For that reason, the *parallel_flat_hash_map* can provide internal locking using the `std::mutex` (the default template parameter is `phmap::NullMutex`, which does no locking and has no size cost). When selecting `std::mutex`, one mutex is created for each internal submap at a cost of 8 bytes per submap, and the *parallel_flat_hash_map* internally protects each submap access with its associated mutex. - - -| map | Number of submaps |sizeof(map) | -| :--- | :---: | ---: | -| std::unordered_map (vs2017) | - | 64 | -| phmap::flat_hash_map | - |48 | -| phmap::parallel_flat_hash_map, N=4, phmap::NullMutex | 16 |768 | -| phmap::parallel_flat_hash_map, N=4, std::mutex | 16 | 896 | - -It is about time we provide the complete parallel_flat_hash_map class declaration (the declaration for parallel_flat_hash_set is similar): - -``` -template , - class Eq = phmap::priv::hash_default_eq, - class Allocator = phmap::priv::Allocator>, // alias for std::allocator - size_t N = 4, // 2**N submaps - class Mutex = phmap::NullMutex> // use std::mutex to enable internal locks -class parallel_flat_hash_map; -``` - -Let's see what result we get for the insertion of random values from multiple threads, however this time we create a *parallel_flat_hash_map* with internal locking (by providing std::mutex as the last template argument), and modify the code so that each thread inserts values in any submap (no pre-selection). - -![no_preselection](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/no_preselection.PNG?raw=true) - -If we were to do a intensive insertion test into a hash map from multiple threads, where we lock the whole hash table for each insertion, we would be likely to get even worse results than for a single threaded insert, because of heavy lock contention. - -In this case, our expectation is that the finer grained locking of the *parallel_flat_hash_map* (separate locks for each internal submap) will provide a speed benefit when compared to the single threaded insertion, and this is indeed what the benchmarks show: - -![flat_par_mutex_4](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/flat_par_mutex_4.PNG?raw=true) - -Interestingly, we notice that the memory peaks (when resizing occur) are again very small, in the order of 1/16th of those for the *flat_hash_map*. This is likely because, as soon as one of the submaps resizes (which takes much longer than a regular insertion), the other threads very soon have to wait on the resizing submap's mutex for an insertion, before they reach their own resizing threashold. - -Since threads statistically will insert on a different submap for each value, it would be a surprising coincidence indeed if two submaps reached their resizing threshold without the resizing of the first submap blocking all the other threads first. - -If we increase the number of submaps, we should see more parallelism (less lock contention across threads, as the odds of two separate threads inserting in the same subhash is lower), but with diminishing returns as every submap resize will quickly block the other threads until the resize is completed. - -This is indeed what we see: - -![lock_various_sizes](https://github.com/greg7mdp/parallel-hashmap/blob/master/html/img/lock_various_sizes.PNG?raw=true) - -| map | Number of submaps |sizeof(map) | time 100M insertions | -| :--- | :---: | ---: | ---: | -| phmap::flat_hash_map | - |48 | 14.77s | -| phmap::parallel_flat_hash_map, N=4, std::mutex | 16 | 896 | 8.36s | -| phmap::parallel_flat_hash_map, N=5, std::mutex | 32 | 1792 | 7.14s | -| phmap::parallel_flat_hash_map, N=6, std::mutex | 64 | 3584 | 6.61s | - -There is still some overhead from the mutex lock/unlock, and the occasional lock contention, which prevents us from reaching the performance of the previous multithreaded lock-free insertion (5.12s for inserting 100M elements). - - -### In Conclusion - -We have seen that the novel parallel hashmap approach, used within a single thread, provides significant space advantages, with a very minimal time penalty. When used in a multi-thread context, the parallel hashmap still provides a significant space benefit, in addition to a consequential time benefit by reducing (or even eliminating) lock contention when accessing the parallel hashmap. - - -### Future work - -1. It would be beneficial to provide additional APIs for the *parallel_flat_hash_map* and *parallel_flat_hash_set* taking a precomputed hash value. This would enable the lock-free usage of the *parallel_flat_hash_map*, described above for multi-threaded environments, without requiring a double hash computation. - - -### Thanks - -I would like to thank Google's *Matt Kulukundis* for his eye-opening presentation of the *flat_hash_map* design at CPPCON 2017 - my frustration with not being able to use it helped trigger my insight into the *parallel_flat_hash_map*. Also many thanks to the Abseil container developers - I believe the main contributors are *Alkis Evlogimenos* and *Roman Perepelitsa* - who created an excellent codebase into which the graft of this new hashmap took easily, and finally to Google for open-sourcing Abseil. Thanks also to my son *Andre* for reviewing this paper, and for his patience when I was rambling about the *parallel_flat_hash_map* and its benefits. - - -### Links - -[Repository for the Parallel Hashmap, including the benchmark code used in this paper](https://github.com/greg7mdp/parallel-hashmap) - -[Swiss Tables doc](https://abseil.io/blog/20180927-swisstables) - -[Google Abseil repository](https://github.com/abseil/abseil-cpp) - -[Matt Kulukindis: Designing a Fast, Efficient, Cache-friendly Hash Table, Step by Step](https://www.youtube.com/watch?v=ncHmEUmJZf4) - diff --git a/extern/phmap/html/parallel_hashmap.pdf b/extern/phmap/html/parallel_hashmap.pdf deleted file mode 100644 index 28d05c05f6febc597826ce03f16803345aa86862..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356851 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%0AY( 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 Whm*Ml8W#_ciyeqYODm}?h4x>mEID%k diff --git a/extern/phmap/html/template.html b/extern/phmap/html/template.html deleted file mode 100644 index a48f9d2..0000000 --- a/extern/phmap/html/template.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - - The Parallel Hashmap (Gregory Popovitch) - - - - - - - - - - - $if(highlighting-css)$ - - $endif$ - $for(css)$ - - $endfor$ - $if(math)$ - $if(html5)$ - $else$ - $math$ - $endif$ - $endif$ - $for(header-includes)$ - $header-includes$ - $endfor$ - - - - -

- - - diff --git a/extern/phmap/html/template.latex b/extern/phmap/html/template.latex deleted file mode 100644 index e78902e..0000000 --- a/extern/phmap/html/template.latex +++ /dev/null @@ -1,308 +0,0 @@ -\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$lang$,$endif$$if(papersize)$$papersize$,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$} -\usepackage{geometry} -\usepackage{xcolor} -\usepackage{graphicx} -\usepackage[labelformat=empty]{caption} -\usepackage{afterpage} - -\newcommand\blankpage{% - \null - \thispagestyle{empty}% - \addtocounter{page}{-1}% - \newpage} - -$if(fontfamily)$ -\usepackage{$fontfamily$} -$else$ -\usepackage{lmodern} -$endif$ -$if(linestretch)$ -\usepackage{setspace} -\setstretch{$linestretch$} -$endif$ -\usepackage{amssymb,amsmath} -\usepackage{ifxetex,ifluatex} -\usepackage{fixltx2e} % provides \textsubscript -\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex - \usepackage[T1]{fontenc} - \usepackage[utf8]{inputenc} -$if(euro)$ - \usepackage{eurosym} -$endif$ -\else % if luatex or xelatex - \ifxetex - \usepackage{mathspec} - \usepackage{xltxtra,xunicode} - \else - \usepackage{fontspec} - \fi - \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase} - \newcommand{\euro}{€} -$if(mainfont)$ - \setmainfont{$mainfont$} -$endif$ -$if(sansfont)$ - \setsansfont{$sansfont$} -$endif$ -$if(monofont)$ - %\setmonofont[Mapping=tex-ansi]{$monofont$} - % custom override -$endif$ - -$if(mathfont)$ - \setmathfont(Digits,Latin,Greek){$mathfont$} -$endif$ - -\usepackage{fontspec} -\setmainfont[Ligatures=Common, - ItalicFont={Adobe Garamond Pro Italic}] - {Adobe Garamond Pro} -\setmonofont[Ligatures=NoCommon]{Source Code Pro} - -\fi -% use upquote if available, for straight quotes in verbatim environments -\IfFileExists{upquote.sty}{\usepackage{upquote}}{} -% use microtype if available -\IfFileExists{microtype.sty}{% -\usepackage{microtype} -\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts -}{} -$if(geometry)$ -\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry} -$endif$ -$if(lang)$ -\ifxetex - \usepackage{polyglossia} - \setmainlanguage{$mainlang$} -\else - \usepackage[shorthands=off,$lang$]{babel} -\fi -$endif$ -$if(natbib)$ -\usepackage{natbib} -\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$} -$endif$ -$if(biblatex)$ -\usepackage{biblatex} -$if(biblio-files)$ -\bibliography{$biblio-files$} -$endif$ -$endif$ -$if(listings)$ -\usepackage{listings} -$endif$ -$if(lhs)$ -\lstnewenvironment{code}{\lstset{language=C++,basicstyle=\small\ttfamily}}{} -$endif$ -$if(highlighting-macros)$ -$highlighting-macros$ -$endif$ -$if(verbatim-in-note)$ -\usepackage{fancyvrb} -\VerbatimFootnotes -$endif$ -$if(tables)$ -\usepackage{longtable,booktabs} -$endif$ -$if(graphics)$ -\usepackage{graphicx} -% Redefine \includegraphics so that, unless explicit options are -% given, the image width will not exceed the width or the height of the page. -% Images get their normal width if they fit onto the page, but -% are scaled down if they would overflow the margins. -\makeatletter -\def\ScaleWidthIfNeeded{% - \ifdim\Gin@nat@width>\linewidth - \linewidth - \else - \Gin@nat@width - \fi -} -\def\ScaleHeightIfNeeded{% - \ifdim\Gin@nat@height>0.9\textheight - 0.9\textheight - \else - \Gin@nat@width - \fi -} -\makeatother -\setkeys{Gin}{width=\ScaleWidthIfNeeded,height=\ScaleHeightIfNeeded,keepaspectratio}% -$endif$ -\ifxetex - \usepackage[setpagesize=false, % page size defined by xetex - unicode=false, % unicode breaks when used with xetex - xetex]{hyperref} -\else - \usepackage[unicode=true]{hyperref} -\fi -\hypersetup{breaklinks=true, - bookmarks=true, - pdfauthor={$author-meta$}, - pdftitle={$title-meta$}, - colorlinks=true, - citecolor=$if(citecolor)$$citecolor$$else$blue$endif$, - urlcolor=$if(urlcolor)$$urlcolor$$else$blue$endif$, - linkcolor=$if(linkcolor)$$linkcolor$$else$magenta$endif$, - pdfborder={0 0 0}} -\urlstyle{same} % don't use monospace font for urls -$if(links-as-notes)$ -% Make links footnotes instead of hotlinks: -\renewcommand{\href}[2]{#2\footnote{\url{#1}}} -$endif$ -$if(strikeout)$ -\usepackage[normalem]{ulem} -% avoid problems with \sout in headers with hyperref: -\pdfstringdefDisableCommands{\renewcommand{\sout}{}} -$endif$ -\setlength{\parindent}{0pt} -\setlength{\parskip}{6pt plus 2pt minus 1pt} -\setlength{\emergencystretch}{3em} % prevent overfull lines -\providecommand{\tightlist}{% - \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} -$if(numbersections)$ -\setcounter{secnumdepth}{5} -$else$ -\setcounter{secnumdepth}{0} -$endif$ -$if(verbatim-in-note)$ -\VerbatimFootnotes % allows verbatim text in footnotes -$endif$ - -$if(title)$ -\title{$title$$if(subtitle)$\\\vspace{0.5em}{\large $subtitle$}$endif$} -$endif$ -$if(author)$ -\author{$for(author)$$author$$sep$ \and $endfor$} -$endif$ -\date{$date$} -$for(header-includes)$ -$header-includes$ -$endfor$ - -\begin{document} -$if(title)$ -% ---------- -% Title page -% ---------- - -\begin{titlepage} - -\definecolor{titlepagecolor}{cmyk}{1,.60,0,.40} -\definecolor{namecolor}{cmyk}{1,.50,0,.10} -\newgeometry{left=7.5cm} %defines the geometry for the titlepage -\pagecolor{titlepagecolor} -\begin{figure} - \centering - \includegraphics[width=3.2in]{img/c-plus-plus_logo.eps} -\end{figure} - -\color{white} -\makebox[0pt][l]{\rule{1.3\textwidth}{1pt}} -\par -\noindent -{\huge \textsf{C++ Insights}} -\par -\noindent -{\textit{\textsf{Some stuff that is good to know}}} -%\textbf{\textsf{Something}} \textcolor{namecolor}{\textsf{Else}} -\vfill -\noindent -%{\huge \textsf{C++ Insights}} -\vskip\baselineskip -\noindent -{\huge \textsf{Gregory Popovitch}} -\par -\textsf{Feb 2019 (Draft)} - -\end{titlepage} -\pagecolor{white} -\restoregeometry % restores the geometry - -% Filler page -%\null -%\thispagestyle{empty} -%\addtocounter{page}{-1} -%\newpage - -% Subtitle page -%\vfill{3in} -%\begin{centering} -%{\HUGE \textsf{C++ Insights}} -%\end{centering} - -%\thispagestyle{empty} -%\addtocounter{page}{-1} -%\newpage - -% Copyright page -\thispagestyle{empty} -\addtocounter{page}{-1} - -\begin{minipage}[b]{0.9\textwidth} -\footnotesize\raggedright -\setlength{\parskip}{0.5\baselineskip} - -\begin{textsf} -{\textbf{C++ Insights}}\\ -by Gregory Popovitch - -\par -Copyright \copyright\ 2019. \\ -\href{http://www.tbd.com}{www.tbd.com} - -\par -(c) copyright 2019, Steven Gregory Popovitch -\end{textsf} -\end{minipage} -\vspace*{2\baselineskip} -\cleardoublepage - -$endif$ -$if(abstract)$ -\begin{abstract} -$abstract$ -\end{abstract} -$endif$ - -$for(include-before)$ -$include-before$ - -$endfor$ -$if(toc)$ -{ -\hypersetup{linkcolor=black} -\setcounter{tocdepth}{$toc-depth$} -\tableofcontents -} -\pagebreak -$endif$ -$if(lot)$ -\listoftables -$endif$ -$if(lof)$ -\listoffigures -$endif$ -$body$ - -$if(natbib)$ -$if(biblio-files)$ -$if(biblio-title)$ -$if(book-class)$ -\renewcommand\bibname{$biblio-title$} -$else$ -\renewcommand\refname{$biblio-title$} -$endif$ -$endif$ -\bibliography{$biblio-files$} - -$endif$ -$endif$ -$if(biblatex)$ -\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$ - -$endif$ -$for(include-after)$ -$include-after$ - -$endfor$ -\end{document} diff --git a/extern/phmap/index.html b/extern/phmap/index.html deleted file mode 100644 index 4d269b9..0000000 --- a/extern/phmap/index.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - The Parallel Hashmap (Gregory Popovitch) - - - - - - - - - - - - - - - - -
- -
- -
- -
-

\[\newcommand{\andalso}{\quad\quad} -\newcommand{\infabbrev}[2]{\infax{#1 \quad\eqdef\quad #2}} -\newcommand{\infrule}[2]{\displaystyle \dfrac{#1}{#2}} -\newcommand{\ar}{\rightarrow} -\newcommand{\Int}{\mathtt{Int}} -\newcommand{\Bool}{\mathtt{Bool}} -\newcommand{\becomes}{\Downarrow} -\newcommand{\trule}[1]{(\textbf{#1})} -\newcommand{\FV}[1]{\mathtt{fv}(#1)} -\newcommand{\FTV}[1]{\mathtt{ftv}(#1)} -\newcommand{\BV}[1]{\mathtt{bv}(#1)} -\newcommand{\compiles}[1]{\text{C}\llbracket{#1}\rrbracket} -\newcommand{\exec}[1]{\text{E}\llbracket{#1}\rrbracket} -\renewcommand{\t}[1]{\mathtt{#1}} -\newcommand{\ite}[3]{\text{if }#1\text{ then }#2\text{ else }#3} -\]

-
-

The Parallel Hashmap

-

or Abseiling from the shoulders of giants - © Gregory Popovitch - March 10, 2019

-

[tl;dr] We present a novel hashmap design, the Parallel Hashmap. Built on a modified version of Abseil's flat_hash_map, the Parallel Hashmap has lower space requirements, is nearly as fast as the underlying flat_hash_map, and can be used from multiple threads with high levels of concurrency. The parallel hashmap repository provides header-only version of the flat and node hashmaps, and their parallel versions as well.

-

A quick look at the current state of the art

-

If you haven't been living under a rock, you know that Google open sourced late last year their Abseil library, which includes a very efficient flat hash table implementation. The absl::flat_hash_map stores the values directly in a memory array, which avoids memory indirections (this is referred to as closed hashing).

-

closed_hashing

-

Using parallel SSE2 instructions, the flat hash table is able to look up items by checking 16 slots in parallel, which allows the implementation to remain fast even when the table is filled to 87.5% capacity.

-

The graphs below show a comparison of time and memory usage necessary to insert up to 100 million values (each value is composed of two 8-byte integers), between the default hashmap of Visual Studio 2017 (std::unordered_map), and Abseil's flat_hash_map:

-

stl_flat comparison

-

On the bottom graph, we can see that, as expected, the Abseil flat_hash_map is significantly faster that the default stl implementation, typically about three times faster.

-

The peak memory usage issue

-

The top graph shown the memory usage for both tables.

-

I used a separate thread to monitor the memory usage, which allows to track the increased memory usage when the table resizes. Indeed, both tables have a peak memory usage that is significantly higher than the memory usage seen between insertions.

-

In the case of Abseil's flat_hash_map, the values are stored directly in a memory array. The memory usage is constant until the table needs to resize, which is why we see these horizontal sections of memory usage.

-

When the flat_hash_map reaches 87.5% occupancy, a new array of twice the size is allocated, the values are moved (rehashed) from the smaller to the larger array, and then the smaller array, now empty, is freed. So we see that during the resize, the occupancy is only one third of 87.5%, or 29.1%, and when the smaller array is released, occupancy is half of 87.5% or 43.75%.

-

The default STL implementation is also subject to this higher peak memory usage, since it typically is implemented with an array of buckets, each bucket having a pointer to a linked list of nodes containing the values. In order to maintain O(1) lookups, the array of buckets also needs to be resized as the table size grows, requiring a 3x temporary memory requirement for moving the old bucket array (1x) to the newly allocated, larger (2x) array. In between the bucket array resizes, the default STL implementation memory usage grows at a constant rate as new values are added to the linked lists.

-
-

Instead of having a separate linked list for each bucket, std::unordered_map implementations often use a single linked list (making iteration faster), with buckets pointing to locations within the single linked list. absl::node_hash_map, on the other hand, has each bucket pointing to a single value, and collisions are handled with open addressing like for the absl::flat_hash_map.

-
-

This peak memory usage can be the limiting factor for large tables. Suppose you are on a machine with 32 GB of ram, and the flat_hash_map needs to resize when you inserted 10 GB of values in it. 10 GB of values means the array size is 11.42 GB (resizing at 87.5% occupancy), and we need to allocate a new array of double size (22.85 GB), which obviously will not be possible on our 32 GB machine.

-

For my work developing mechanical engineering software, this has kept me from using flat hash maps, as the high peak memory usage was the limiting factor for the size of FE models which could be loaded on a given machine. So I used other types of maps, such as sparsepp or Google's cpp-btree.

-

When the Abseil library was open sourced, I started pondering the issue again. Compared to Google's old dense_hash_map which resized at 50% capacity, the new absl::flat_hash_map resizing at 87.5% capacity was more memory friendly, but it still had these significant peaks of memory usage when resizing.

-

If only there was a way to eliminate those peaks, the flat_hash_map would be close to perfect. But how?

-

The peak memory usage solution

-

Suddenly, it hit me. I had a solution. I would create a hash table that internally is made of an array of 16 hash tables (the submaps). When inserting or looking up an item, the index of the target submap would be decided by the hash of the value to insert. For example, if for a given size_t hashval, the index for the internal submap would be computed with:

-

submap_index = (hashval ^ (hashval >> 4)) & 0xF;

-

providing an index between 0 and 15.

-
-

In the actual implementation, the size of the array of hash tables is configurable to a power of two, so it can be 2, 4, 8, 16, 32, ... The following illustration shows a parallel_hash_map with 8 submaps.

-
-

index_computation

-

The benefit of this approach would be that the internal tables would each resize on its own when they reach 87.5% capacity, and since each table contains approximately one sixteenth of the values, the memory usage peak would be only one sixteenth of the size we saw for the single flat_hash_map.

-

The rest of this article describes my implementation of this concept that I have done in my parallel hashmap repository. This is a header only library, which provides the following eight hashmaps:

-
    -
  • phmap::flat_hash_set
  • -
  • phmap::flat_hash_map
  • -
  • phmap::node_hash_set
  • -
  • phmap::node_hash_map
  • -
  • phmap::parallel_flat_hash_set
  • -
  • phmap::parallel_flat_hash_map
  • -
  • phmap::parallel_node_hash_set
  • -
  • phmap::parallel_node_hash_map
  • -
-

This implementation requires a C++11 compatible compiler, and provides full compatibility with the std::unordered_map (with the exception of pointer stability for the flat versions. C++14 and C++17 methods, like try-emplace, are provided as well. The names for it are parallel_flat_hash_map or parallel_flat_hash_set, and the node equivalents. These hashmaps provide the same external API as the flat_hash_map, and internally use a std::array of 2**N flat_hash_maps.

-

I was delighted to find out that not only the parallel_flat_hash_map has significant memory usage benefits compared to the flat_hash_map, but it also has significant advantages for concurrent programming as I will show later. In the rest of this article, we will focus on the parallel_flat_hash_map, but similar results are seen for the parallel_node_hash_map, and the set versions of course.

-

The Parallel Hashmap: memory usage

-

So, without further ado, let's see the same graphs graphs as above, with the addition of the parallel_flat_hash_map. Let us first look at memory usage (the second graph provides a "zoomed-in" view of the location where resizing occurs):

-

stl_flat_par comparison

-

stl_flat_par_zoomed comparison

-

We see that the parallel_flat_hash_map behaves as expected. The memory usage matches exactly the memory usage of its base flat_hash_map, except that the peaks of memory usage which occur when the table resizes are drastically reduced, to the point that they are not objectionable anymore. In the "zoomed-in" view, we can see the sixteen dots corresponding to each of the individual submaps resizing. The fact that those resizes are occuring at roughly the same x location in the graph shows that we have a good hash function distribution, distributing the values evenly between the sixteen individual submaps.

-

The Parallel Hashmap: speed

-

But what about the speed? After all, for each value inserted into the parallel hashmap, we have to do some extra work (steps 1 and 2 below):

-
    -
  1. compute the hash for the value to insert
  2. -
  3. compute the index of the target submap from the hash)
  4. -
  5. insert the value into the submap
  6. -
-

The first step (compute the hash) is the most problematic one, as it can potentially be costly. As we mentioned above, the second step (computing the index from the hash) is very simple and its cost in minimal (3 processor instruction as shown below in Matt Godbolt's compiler explorer):

-

index computation cost

-

As for the hash value computation, fortunately we can eliminate this cost by providing the computed hash to the submap functions, so that it is computed only once. This is exactly what I have done in my implementation of the parallel_flat_hash_map, adding a few extra APIs to the internal raw_hash_map.h header, which allow the parallel_flat_hash_map to pass the precomputed hash value to the underlying submaps.

-

So we have all but eliminated the cost of the first step, and seen that the cost of the second step is very minimal. At this point we expect that the parallel_flat_hash_map performance will be close to the one of its underlying flat_hash_map, and this is confirmed by the chart below:

-

stl_flat_par comparison

-

Indeed, because of the scale is somewhat compressed due to the longer times of the std::unordered_map, we can barely distinguish between the blue curve of the flat_hash_map and the red curve of the parallel_flat_hash_map. So let's look at a graph without the std::unordered_map:

-

flat_par comparison

-

This last graph shows that the parallel_flat_hash_map is slightly slower especially for smaller table sizes. For a reason not obvious to me (maybe better memory locality), the speeds of the parallel_flat_hash_map and flat_hash_map are essentially undistinguishable for larger map sizes (> 80 million values).

-

Are we done yet?

-

This is already looking pretty good. For large hash_maps, the parallel_flat_hash_map is a very appealing solution, as it provides essentially the excellent performance of the flat_hash_map, while virtually eliminating the peaks of memory usage which occur when the hash table resizes.

-

But there is another aspect of the inherent parallelism of the parallel_flat_hash_map which is interesting to explore. As we know, typical hashmaps cannot be modified from multiple threads without explicit synchronization. And bracketing write accesses to a shared hash_map with synchronization primitives, such as mutexes, can reduce the concurrency of our program, and even cause deadlocks.

-

Because the parallel_flat_hash_map is made of sixteen separate submaps, it posesses some intrinsic parallelism. Indeed, suppose you can make sure that different threads will use different submaps, you would be able to insert into the same parallel_flat_hash_map at the same time from the different threads without any locking.

-

Using the intrinsic parallelism of the parallel_flat_hash_map to insert values from multiple threads, lock free.

-

So, if you can iterate over the values you want to insert into the hash table, the idea is that each thread will iterate over all values, and then for each value:

-
    -
  1. compute the hash for that value
  2. -
  3. compute the submap index for that hash
  4. -
  5. if the submap index is one assigned to this thread, then insert the value, otherwise do nothing and continue to the next value
  6. -
-

Here is the code for the single-threaded insert:

- -

and here is the code for the multi-threaded insert:

-
template <class HT>
-void _fill_random_inner_mt(int64_t cnt, HT &hash, RSU &rsu)
-{
-    constexpr int64_t num_threads = 8;   // has to be a power of two
-    std::unique_ptr<std::thread> threads[num_threads];
-
-    auto thread_fn = [&hash, cnt, num_threads](int64_t thread_idx, RSU rsu) {
-        size_t modulo = hash.subcnt() / num_threads;        // subcnt() returns the number of submaps
-
-        for (int64_t i=0; i<cnt; ++i)                       // iterate over all values
-        {
-            unsigned int key = rsu.next();                  // get next key to insert
-            size_t hashval = hash.hash(key);                // compute its hash
-            size_t idx  = hash.subidx(hashval);             // compute the submap index for this hash
-            if (idx / modulo == thread_idx)                 // if the submap is suitable for this thread
-            {
-                hash.insert(typename HT::value_type(key, 0)); // insert the value
-                ++(num_keys[thread_idx]);                     // increment count of inserted values
-            }
-        }
-    };
-
-    // create and start 8 threads - each will insert in their own submaps
-    // thread 0 will insert the keys whose hash direct them to submap0 or submap1
-    // thread 1 will insert the keys whose hash direct them to submap2 or submap3
-    // --------------------------------------------------------------------------
-    for (int64_t i=0; i<num_threads; ++i)
-        threads[i].reset(new std::thread(thread_fn, i, rsu));
-
-    // rsu passed by value to threads... we need to increment the reference object
-    for (int64_t i=0; i<cnt; ++i)
-        rsu.next();
-    
-    // wait for the threads to finish their work and exit
-    for (int64_t i=0; i<num_threads; ++i)
-        threads[i]->join();
-}
-

Using multiple threads, we are able to populate the parallel_flat_hash_map (inserting 100 million values) three times faster than the standard flat_hash_map (which we could not have populated from multiple threads without explicit locks, which would have prevented performance improvements).

-

And the graphical visualization of the results:

-

mt_stl_flat_par comparison

-

We notice in this last graph that the memory usage peaks, while still smaller than those of the flat_hash_map, are larger that those we saw when populating the parallel_flat_hash_map using a single thread. The obvious reason is that, when using a single thread, only one of the submaps would resize at a time, ensuring that the peak would only be 1/16th of the one for the flat_hash_map (provided of course that the hash function distributes the values somewhat evenly between the submaps).

-

When running in multi-threaded mode (in this case eight threads), potentially as many as eight submaps can resize simultaneaously, so for a parallel_flat_hash_map with sixteen submaps the memory peak size can be half as large as the one for the flat_hash_map.

-

Still, this is a pretty good result, we are now inserting values into our parallel_flat_hash_map three times faster than we were able to do using the flat_hash_map, while using a lower memory ceiling.

-

This is significant, as the speed of insertion into a hash map is important in many algorithms, for example removing duplicates in a collection of values.

-

Using the intrinsic parallelism of the parallel_flat_hash_map with internal mutexes

-

It may not be practical to add logic into your program to ensure you use different internal submaps from each thread. Still, locking the whole parallel_flat_hash_map for each access would forego taking advantage of its intrinsic parallelism.

-

For that reason, the parallel_flat_hash_map can provide internal locking using the std::mutex (the default template parameter is phmap::NullMutex, which does no locking and has no size cost). When selecting std::mutex, one mutex is created for each internal submap at a cost of 8 bytes per submap, and the parallel_flat_hash_map internally protects each submap access with its associated mutex.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mapNumber of submapssizeof(map)
std::unordered_map (vs2017)-64
phmap::flat_hash_map-48
phmap::parallel_flat_hash_map, N=4, phmap::NullMutex16768
phmap::parallel_flat_hash_map, N=4, phmap::Mutex16896
-

It is about time we provide the complete parallel_flat_hash_map class declaration (the declaration for parallel_flat_hash_set is similar):

-
template <class K, class V,
-          class Hash      = phmap::priv::hash_default_hash<K>,
-          class Eq        = phmap::priv::hash_default_eq<K>,
-          class Allocator = phmap::priv::Allocator<std::pair<const K, V>>, // alias for std::allocator
-          size_t N        = 4,                 // 2**N submaps
-          class Mutex     = phmap::NullMutex>   // use std::mutex to enable internal locks
-class parallel_flat_hash_map;
-
-

Let's see what result we get for the insertion of random values from multiple threads, however this time we create a parallel_flat_hash_map with internal locking (by providing std::mutex as the last template argument), and modify the code so that each thread inserts values in any submap (no pre-selection).

-

no_preselection

-

If we were to do a intensive insertion test into a hash map from multiple threads, where we lock the whole hash table for each insertion, we would be likely to get even worse results than for a single threaded insert, because of heavy lock contention.

-

In this case, our expectation is that the finer grained locking of the parallel_flat_hash_map (separate locks for each internal submap) will provide a speed benefit when compared to the single threaded insertion, and this is indeed what the benchmarks show:

-

flat_par_mutex_4

-

Interestingly, we notice that the memory peaks (when resizing occur) are again very small, in the order of 1/16th of those for the flat_hash_map. This is likely because, as soon as one of the submaps resizes (which takes much longer than a regular insertion), the other threads very soon have to wait on the resizing submap's mutex for an insertion, before they reach their own resizing threashold.

-

Since threads statistically will insert on a different submap for each value, it would be a surprising coincidence indeed if two submaps reached their resizing threshold without the resizing of the first submap blocking all the other threads first.

-

If we increase the number of submaps, we should see more parallelism (less lock contention across threads, as the odds of two separate threads inserting in the same subhash is lower), but with diminishing returns as every submap resize will quickly block the other threads until the resize is completed.

-

This is indeed what we see:

-

lock_various_sizes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
mapNumber of submapssizeof(map)time 100M insertions
phmap::flat_hash_map-4814.77s
phmap::parallel_flat_hash_map, N=4, std::mutex168968.36s
phmap::parallel_flat_hash_map, N=5, std::mutex3217927.14s
phmap::parallel_flat_hash_map, N=6, std::mutex6435846.61s
-

There is still some overhead from the mutex lock/unlock, and the occasional lock contention, which prevents us from reaching the performance of the previous multithreaded lock-free insertion (5.12s for inserting 100M elements).

-

In Conclusion

-

We have seen that the novel parallel hashmap approach, used within a single thread, provides significant space advantages, with a very minimal time penalty. When used in a multi-thread context, the parallel hashmap still provides a significant space benefit, in addition to a consequential time benefit by reducing (or even eliminating) lock contention when accessing the parallel hashmap.

-

Future work

-
    -
  1. It would be beneficial to provide additional APIs for the parallel_flat_hash_map and parallel_flat_hash_set taking a precomputed hash value. This would enable the lock-free usage of the parallel_flat_hash_map, described above for multi-threaded environments, without requiring a double hash computation.
  2. -
-

Thanks

-

I would like to thank Google's Matt Kulukundis for his eye-opening presentation of the flat_hash_map design at CPPCON 2017 - my frustration with not being able to use it helped trigger my insight into the parallel_flat_hash_map. Also many thanks to the Abseil container developers - I believe the main contributors are Alkis Evlogimenos and Roman Perepelitsa - who created an excellent codebase into which the graft of this new hashmap took easily, and finally to Google for open-sourcing Abseil. Thanks also to my son Andre for reviewing this paper, and for his patience when I was rambling about the parallel_flat_hash_map and its benefits.

- -

Repository for the Parallel Hashmap, including the benchmark code used in this paper

-

Swiss Tables doc

-

Google Abseil repository

-

Matt Kulukindis: Designing a Fast, Efficient, Cache-friendly Hash Table, Step by Step

-
-
- -
- - - diff --git a/extern/phmap/parallel_hashmap/btree.h b/extern/phmap/parallel_hashmap/btree.h deleted file mode 100644 index cbfb8ee..0000000 --- a/extern/phmap/parallel_hashmap/btree.h +++ /dev/null @@ -1,4050 +0,0 @@ -// --------------------------------------------------------------------------- -// Copyright (c) 2019, Gregory Popovitch - greg7mdp@gmail.com -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Includes work from abseil-cpp (https://github.com/abseil/abseil-cpp) -// with modifications. -// -// Copyright 2018 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// --------------------------------------------------------------------------- - -#ifndef PHMAP_BTREE_BTREE_CONTAINER_H_ -#define PHMAP_BTREE_BTREE_CONTAINER_H_ - -#ifdef _MSC_VER - #pragma warning(push) - - #pragma warning(disable : 4127) // conditional expression is constant - #pragma warning(disable : 4324) // structure was padded due to alignment specifier - #pragma warning(disable : 4355) // 'this': used in base member initializer list - #pragma warning(disable : 4365) // conversion from 'int' to 'const unsigned __int64', signed/unsigned mismatch - #pragma warning(disable : 4514) // unreferenced inline function has been removed - #pragma warning(disable : 4623) // default constructor was implicitly defined as deleted - #pragma warning(disable : 4625) // copy constructor was implicitly defined as deleted - #pragma warning(disable : 4626) // assignment operator was implicitly defined as deleted - #pragma warning(disable : 4710) // function not inlined - #pragma warning(disable : 4711) // selected for automatic inline expansion - #pragma warning(disable : 4820) // '6' bytes padding added after data member - #pragma warning(disable : 4868) // compiler may not enforce left-to-right evaluation order in braced initializer list - #pragma warning(disable : 5026) // move constructor was implicitly defined as deleted - #pragma warning(disable : 5027) // move assignment operator was implicitly defined as deleted - #pragma warning(disable : 5045) // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified -#endif - - -#include -#include -#include -#include -#include - -#include "phmap_fwd_decl.h" -#include "phmap_base.h" - -#if PHMAP_HAVE_STD_STRING_VIEW - #include -#endif - -// MSVC constructibility traits do not detect destructor properties and so our -// implementations should not use them as a source-of-truth. -#if defined(_MSC_VER) && !defined(__clang__) && !defined(__GNUC__) - #define PHMAP_META_INTERNAL_STD_CONSTRUCTION_TRAITS_DONT_CHECK_DESTRUCTION 1 -#endif - -namespace phmap { - - // Defined and documented later on in this file. - template - struct is_trivially_destructible; - - // Defined and documented later on in this file. - template - struct is_trivially_move_assignable; - - namespace type_traits_internal { - - // Silence MSVC warnings about the destructor being defined as deleted. -#if defined(_MSC_VER) && !defined(__GNUC__) - #pragma warning(push) - #pragma warning(disable : 4624) -#endif // defined(_MSC_VER) && !defined(__GNUC__) - - template - union SingleMemberUnion { - T t; - }; - - // Restore the state of the destructor warning that was silenced above. -#if defined(_MSC_VER) && !defined(__GNUC__) - #pragma warning(pop) -#endif // defined(_MSC_VER) && !defined(__GNUC__) - - template - struct IsTriviallyMoveConstructibleObject - : std::integral_constant< - bool, std::is_move_constructible< - type_traits_internal::SingleMemberUnion>::value && - phmap::is_trivially_destructible::value> {}; - - template - struct IsTriviallyCopyConstructibleObject - : std::integral_constant< - bool, std::is_copy_constructible< - type_traits_internal::SingleMemberUnion>::value && - phmap::is_trivially_destructible::value> {}; - - template - struct IsTriviallyMoveAssignableReference : std::false_type {}; - - template - struct IsTriviallyMoveAssignableReference - : phmap::is_trivially_move_assignable::type {}; - - template - struct IsTriviallyMoveAssignableReference - : phmap::is_trivially_move_assignable::type {}; - - } // namespace type_traits_internal - - - template - using void_t = typename type_traits_internal::VoidTImpl::type; - - - template - struct is_function - : std::integral_constant< - bool, !(std::is_reference::value || - std::is_const::type>::value)> {}; - - - namespace type_traits_internal { - - template - class is_trivially_copyable_impl { - using ExtentsRemoved = typename std::remove_all_extents::type; - static constexpr bool kIsCopyOrMoveConstructible = - std::is_copy_constructible::value || - std::is_move_constructible::value; - static constexpr bool kIsCopyOrMoveAssignable = - phmap::is_copy_assignable::value || - phmap::is_move_assignable::value; - - public: - static constexpr bool kValue = - (__has_trivial_copy(ExtentsRemoved) || !kIsCopyOrMoveConstructible) && - (__has_trivial_assign(ExtentsRemoved) || !kIsCopyOrMoveAssignable) && - (kIsCopyOrMoveConstructible || kIsCopyOrMoveAssignable) && - is_trivially_destructible::value && - // We need to check for this explicitly because otherwise we'll say - // references are trivial copyable when compiled by MSVC. - !std::is_reference::value; - }; - - template - struct is_trivially_copyable - : std::integral_constant< - bool, type_traits_internal::is_trivially_copyable_impl::kValue> {}; - } // namespace type_traits_internal - - namespace swap_internal { - - // Necessary for the traits. - using std::swap; - - // This declaration prevents global `swap` and `phmap::swap` overloads from being - // considered unless ADL picks them up. - void swap(); - - template - using IsSwappableImpl = decltype(swap(std::declval(), std::declval())); - - // NOTE: This dance with the default template parameter is for MSVC. - template (), std::declval()))>> - using IsNothrowSwappableImpl = typename std::enable_if::type; - - template - struct IsSwappable - : phmap::type_traits_internal::is_detected {}; - - template - struct IsNothrowSwappable - : phmap::type_traits_internal::is_detected {}; - - template ::value, int> = 0> - void Swap(T& lhs, T& rhs) noexcept(IsNothrowSwappable::value) { - swap(lhs, rhs); - } - - using StdSwapIsUnconstrained = IsSwappable; - - } // namespace swap_internal - - namespace type_traits_internal { - - // Make the swap-related traits/function accessible from this namespace. - using swap_internal::IsNothrowSwappable; - using swap_internal::IsSwappable; - using swap_internal::Swap; - using swap_internal::StdSwapIsUnconstrained; - - } // namespace type_traits_internal - - namespace compare_internal { - - using value_type = int8_t; - - template - struct Fail { - static_assert(sizeof(T) < 0, "Only literal `0` is allowed."); - }; - - template - struct OnlyLiteralZero { - constexpr OnlyLiteralZero(NullPtrT) noexcept {} // NOLINT - - template < - typename T, - typename = typename std::enable_if< - std::is_same::value || - (std::is_integral::value && !std::is_same::value)>::type, - typename = typename Fail::type> - OnlyLiteralZero(T); // NOLINT - }; - - enum class eq : value_type { - equal = 0, - equivalent = equal, - nonequal = 1, - nonequivalent = nonequal, - }; - - enum class ord : value_type { less = -1, greater = 1 }; - - enum class ncmp : value_type { unordered = -127 }; - -#if defined(__cpp_inline_variables) && !defined(_MSC_VER) - -#define PHMAP_COMPARE_INLINE_BASECLASS_DECL(name) - -#define PHMAP_COMPARE_INLINE_SUBCLASS_DECL(type, name) \ - static const type name; - -#define PHMAP_COMPARE_INLINE_INIT(type, name, init) \ - inline constexpr type type::name(init) - -#else // __cpp_inline_variables - -#define PHMAP_COMPARE_INLINE_BASECLASS_DECL(name) \ - static const T name; - -#define PHMAP_COMPARE_INLINE_SUBCLASS_DECL(type, name) - -#define PHMAP_COMPARE_INLINE_INIT(type, name, init) \ - template \ - const T compare_internal::type##_base::name(init) - -#endif // __cpp_inline_variables - - // These template base classes allow for defining the values of the constants - // in the header file (for performance) without using inline variables (which - // aren't available in C++11). - template - struct weak_equality_base { - PHMAP_COMPARE_INLINE_BASECLASS_DECL(equivalent) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(nonequivalent) - }; - - template - struct strong_equality_base { - PHMAP_COMPARE_INLINE_BASECLASS_DECL(equal) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(nonequal) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(equivalent) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(nonequivalent) - }; - - template - struct partial_ordering_base { - PHMAP_COMPARE_INLINE_BASECLASS_DECL(less) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(equivalent) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(greater) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(unordered) - }; - - template - struct weak_ordering_base { - PHMAP_COMPARE_INLINE_BASECLASS_DECL(less) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(equivalent) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(greater) - }; - - template - struct strong_ordering_base { - PHMAP_COMPARE_INLINE_BASECLASS_DECL(less) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(equal) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(equivalent) - PHMAP_COMPARE_INLINE_BASECLASS_DECL(greater) - }; - - } // namespace compare_internal - - class weak_equality - : public compare_internal::weak_equality_base { - explicit constexpr weak_equality(compare_internal::eq v) noexcept - : value_(static_cast(v)) {} - friend struct compare_internal::weak_equality_base; - - public: - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(weak_equality, equivalent) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(weak_equality, nonequivalent) - - // Comparisons - friend constexpr bool operator==( - weak_equality v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ == 0; - } - friend constexpr bool operator!=( - weak_equality v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ != 0; - } - friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>, - weak_equality v) noexcept { - return 0 == v.value_; - } - friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>, - weak_equality v) noexcept { - return 0 != v.value_; - } - - private: - compare_internal::value_type value_; - }; - PHMAP_COMPARE_INLINE_INIT(weak_equality, equivalent, - compare_internal::eq::equivalent); - PHMAP_COMPARE_INLINE_INIT(weak_equality, nonequivalent, - compare_internal::eq::nonequivalent); - - class strong_equality - : public compare_internal::strong_equality_base { - explicit constexpr strong_equality(compare_internal::eq v) noexcept - : value_(static_cast(v)) {} - friend struct compare_internal::strong_equality_base; - - public: - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(strong_equality, equal) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(strong_equality, nonequal) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(strong_equality, equivalent) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(strong_equality, nonequivalent) - - // Conversion - constexpr operator weak_equality() const noexcept { // NOLINT - return value_ == 0 ? weak_equality::equivalent - : weak_equality::nonequivalent; - } - // Comparisons - friend constexpr bool operator==( - strong_equality v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ == 0; - } - friend constexpr bool operator!=( - strong_equality v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ != 0; - } - friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>, - strong_equality v) noexcept { - return 0 == v.value_; - } - friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>, - strong_equality v) noexcept { - return 0 != v.value_; - } - - private: - compare_internal::value_type value_; - }; - - PHMAP_COMPARE_INLINE_INIT(strong_equality, equal, compare_internal::eq::equal); - PHMAP_COMPARE_INLINE_INIT(strong_equality, nonequal, - compare_internal::eq::nonequal); - PHMAP_COMPARE_INLINE_INIT(strong_equality, equivalent, - compare_internal::eq::equivalent); - PHMAP_COMPARE_INLINE_INIT(strong_equality, nonequivalent, - compare_internal::eq::nonequivalent); - - class partial_ordering - : public compare_internal::partial_ordering_base { - explicit constexpr partial_ordering(compare_internal::eq v) noexcept - : value_(static_cast(v)) {} - explicit constexpr partial_ordering(compare_internal::ord v) noexcept - : value_(static_cast(v)) {} - explicit constexpr partial_ordering(compare_internal::ncmp v) noexcept - : value_(static_cast(v)) {} - friend struct compare_internal::partial_ordering_base; - - constexpr bool is_ordered() const noexcept { - return value_ != - compare_internal::value_type(compare_internal::ncmp::unordered); - } - - public: - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(partial_ordering, less) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(partial_ordering, equivalent) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(partial_ordering, greater) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(partial_ordering, unordered) - - // Conversion - constexpr operator weak_equality() const noexcept { // NOLINT - return value_ == 0 ? weak_equality::equivalent - : weak_equality::nonequivalent; - } - // Comparisons - friend constexpr bool operator==( - partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.is_ordered() && v.value_ == 0; - } - friend constexpr bool operator!=( - partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return !v.is_ordered() || v.value_ != 0; - } - friend constexpr bool operator<( - partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.is_ordered() && v.value_ < 0; - } - friend constexpr bool operator<=( - partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.is_ordered() && v.value_ <= 0; - } - friend constexpr bool operator>( - partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.is_ordered() && v.value_ > 0; - } - friend constexpr bool operator>=( - partial_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.is_ordered() && v.value_ >= 0; - } - friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>, - partial_ordering v) noexcept { - return v.is_ordered() && 0 == v.value_; - } - friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>, - partial_ordering v) noexcept { - return !v.is_ordered() || 0 != v.value_; - } - friend constexpr bool operator<(compare_internal::OnlyLiteralZero<>, - partial_ordering v) noexcept { - return v.is_ordered() && 0 < v.value_; - } - friend constexpr bool operator<=(compare_internal::OnlyLiteralZero<>, - partial_ordering v) noexcept { - return v.is_ordered() && 0 <= v.value_; - } - friend constexpr bool operator>(compare_internal::OnlyLiteralZero<>, - partial_ordering v) noexcept { - return v.is_ordered() && 0 > v.value_; - } - friend constexpr bool operator>=(compare_internal::OnlyLiteralZero<>, - partial_ordering v) noexcept { - return v.is_ordered() && 0 >= v.value_; - } - - private: - compare_internal::value_type value_; - }; - - PHMAP_COMPARE_INLINE_INIT(partial_ordering, less, compare_internal::ord::less); - PHMAP_COMPARE_INLINE_INIT(partial_ordering, equivalent, - compare_internal::eq::equivalent); - PHMAP_COMPARE_INLINE_INIT(partial_ordering, greater, - compare_internal::ord::greater); - PHMAP_COMPARE_INLINE_INIT(partial_ordering, unordered, - compare_internal::ncmp::unordered); - - class weak_ordering - : public compare_internal::weak_ordering_base { - explicit constexpr weak_ordering(compare_internal::eq v) noexcept - : value_(static_cast(v)) {} - explicit constexpr weak_ordering(compare_internal::ord v) noexcept - : value_(static_cast(v)) {} - friend struct compare_internal::weak_ordering_base; - - public: - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(weak_ordering, less) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(weak_ordering, equivalent) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(weak_ordering, greater) - - // Conversions - constexpr operator weak_equality() const noexcept { // NOLINT - return value_ == 0 ? weak_equality::equivalent - : weak_equality::nonequivalent; - } - constexpr operator partial_ordering() const noexcept { // NOLINT - return value_ == 0 ? partial_ordering::equivalent - : (value_ < 0 ? partial_ordering::less - : partial_ordering::greater); - } - // Comparisons - friend constexpr bool operator==( - weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ == 0; - } - friend constexpr bool operator!=( - weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ != 0; - } - friend constexpr bool operator<( - weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ < 0; - } - friend constexpr bool operator<=( - weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ <= 0; - } - friend constexpr bool operator>( - weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ > 0; - } - friend constexpr bool operator>=( - weak_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ >= 0; - } - friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>, - weak_ordering v) noexcept { - return 0 == v.value_; - } - friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>, - weak_ordering v) noexcept { - return 0 != v.value_; - } - friend constexpr bool operator<(compare_internal::OnlyLiteralZero<>, - weak_ordering v) noexcept { - return 0 < v.value_; - } - friend constexpr bool operator<=(compare_internal::OnlyLiteralZero<>, - weak_ordering v) noexcept { - return 0 <= v.value_; - } - friend constexpr bool operator>(compare_internal::OnlyLiteralZero<>, - weak_ordering v) noexcept { - return 0 > v.value_; - } - friend constexpr bool operator>=(compare_internal::OnlyLiteralZero<>, - weak_ordering v) noexcept { - return 0 >= v.value_; - } - - private: - compare_internal::value_type value_; - }; - - PHMAP_COMPARE_INLINE_INIT(weak_ordering, less, compare_internal::ord::less); - PHMAP_COMPARE_INLINE_INIT(weak_ordering, equivalent, - compare_internal::eq::equivalent); - PHMAP_COMPARE_INLINE_INIT(weak_ordering, greater, - compare_internal::ord::greater); - - class strong_ordering - : public compare_internal::strong_ordering_base { - explicit constexpr strong_ordering(compare_internal::eq v) noexcept - : value_(static_cast(v)) {} - explicit constexpr strong_ordering(compare_internal::ord v) noexcept - : value_(static_cast(v)) {} - friend struct compare_internal::strong_ordering_base; - - public: - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(strong_ordering, less) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(strong_ordering, equal) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(strong_ordering, equivalent) - PHMAP_COMPARE_INLINE_SUBCLASS_DECL(strong_ordering, greater) - - // Conversions - constexpr operator weak_equality() const noexcept { // NOLINT - return value_ == 0 ? weak_equality::equivalent - : weak_equality::nonequivalent; - } - constexpr operator strong_equality() const noexcept { // NOLINT - return value_ == 0 ? strong_equality::equal : strong_equality::nonequal; - } - constexpr operator partial_ordering() const noexcept { // NOLINT - return value_ == 0 ? partial_ordering::equivalent - : (value_ < 0 ? partial_ordering::less - : partial_ordering::greater); - } - constexpr operator weak_ordering() const noexcept { // NOLINT - return value_ == 0 - ? weak_ordering::equivalent - : (value_ < 0 ? weak_ordering::less : weak_ordering::greater); - } - // Comparisons - friend constexpr bool operator==( - strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ == 0; - } - friend constexpr bool operator!=( - strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ != 0; - } - friend constexpr bool operator<( - strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ < 0; - } - friend constexpr bool operator<=( - strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ <= 0; - } - friend constexpr bool operator>( - strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ > 0; - } - friend constexpr bool operator>=( - strong_ordering v, compare_internal::OnlyLiteralZero<>) noexcept { - return v.value_ >= 0; - } - friend constexpr bool operator==(compare_internal::OnlyLiteralZero<>, - strong_ordering v) noexcept { - return 0 == v.value_; - } - friend constexpr bool operator!=(compare_internal::OnlyLiteralZero<>, - strong_ordering v) noexcept { - return 0 != v.value_; - } - friend constexpr bool operator<(compare_internal::OnlyLiteralZero<>, - strong_ordering v) noexcept { - return 0 < v.value_; - } - friend constexpr bool operator<=(compare_internal::OnlyLiteralZero<>, - strong_ordering v) noexcept { - return 0 <= v.value_; - } - friend constexpr bool operator>(compare_internal::OnlyLiteralZero<>, - strong_ordering v) noexcept { - return 0 > v.value_; - } - friend constexpr bool operator>=(compare_internal::OnlyLiteralZero<>, - strong_ordering v) noexcept { - return 0 >= v.value_; - } - - private: - compare_internal::value_type value_; - }; - PHMAP_COMPARE_INLINE_INIT(strong_ordering, less, compare_internal::ord::less); - PHMAP_COMPARE_INLINE_INIT(strong_ordering, equal, compare_internal::eq::equal); - PHMAP_COMPARE_INLINE_INIT(strong_ordering, equivalent, - compare_internal::eq::equivalent); - PHMAP_COMPARE_INLINE_INIT(strong_ordering, greater, - compare_internal::ord::greater); - -#undef PHMAP_COMPARE_INLINE_BASECLASS_DECL -#undef PHMAP_COMPARE_INLINE_SUBCLASS_DECL -#undef PHMAP_COMPARE_INLINE_INIT - - namespace compare_internal { - // We also provide these comparator adapter functions for internal phmap use. - - // Helper functions to do a boolean comparison of two keys given a boolean - // or three-way comparator. - // SFINAE prevents implicit conversions to bool (such as from int). - template ::value, int> = 0> - constexpr bool compare_result_as_less_than(const BoolType r) { return r; } - constexpr bool compare_result_as_less_than(const phmap::weak_ordering r) { - return r < 0; - } - - template - constexpr bool do_less_than_comparison(const Compare &compare, const K &x, - const LK &y) { - return compare_result_as_less_than(compare(x, y)); - } - - // Helper functions to do a three-way comparison of two keys given a boolean or - // three-way comparator. - // SFINAE prevents implicit conversions to int (such as from bool). - template ::value, int> = 0> - constexpr phmap::weak_ordering compare_result_as_ordering(const Int c) { - return c < 0 ? phmap::weak_ordering::less - : c == 0 ? phmap::weak_ordering::equivalent - : phmap::weak_ordering::greater; - } - constexpr phmap::weak_ordering compare_result_as_ordering( - const phmap::weak_ordering c) { - return c; - } - - template < - typename Compare, typename K, typename LK, - phmap::enable_if_t>::value, - int> = 0> - constexpr phmap::weak_ordering do_three_way_comparison(const Compare &compare, - const K &x, const LK &y) { - return compare_result_as_ordering(compare(x, y)); - } - template < - typename Compare, typename K, typename LK, - phmap::enable_if_t>::value, - int> = 0> - constexpr phmap::weak_ordering do_three_way_comparison(const Compare &compare, - const K &x, const LK &y) { - return compare(x, y) ? phmap::weak_ordering::less - : compare(y, x) ? phmap::weak_ordering::greater - : phmap::weak_ordering::equivalent; - } - - } // namespace compare_internal -} - - -namespace phmap { - -namespace priv { - - // A helper class that indicates if the Compare parameter is a key-compare-to - // comparator. - template - using btree_is_key_compare_to = - std::is_convertible, - phmap::weak_ordering>; - - struct StringBtreeDefaultLess { - using is_transparent = void; - - StringBtreeDefaultLess() = default; - - // Compatibility constructor. - StringBtreeDefaultLess(std::less) {} // NOLINT -#if PHMAP_HAVE_STD_STRING_VIEW - StringBtreeDefaultLess(std::less) {} // NOLINT - StringBtreeDefaultLess(phmap::Less) {} // NOLINT - - phmap::weak_ordering operator()(std::string_view lhs, - std::string_view rhs) const { - return compare_internal::compare_result_as_ordering(lhs.compare(rhs)); - } -#else - phmap::weak_ordering operator()(std::string lhs, - std::string rhs) const { - return compare_internal::compare_result_as_ordering(lhs.compare(rhs)); - } -#endif - }; - - struct StringBtreeDefaultGreater { - using is_transparent = void; - - StringBtreeDefaultGreater() = default; - - StringBtreeDefaultGreater(std::greater) {} // NOLINT -#if PHMAP_HAVE_STD_STRING_VIEW - StringBtreeDefaultGreater(std::greater) {} // NOLINT - - phmap::weak_ordering operator()(std::string_view lhs, - std::string_view rhs) const { - return compare_internal::compare_result_as_ordering(rhs.compare(lhs)); - } -#else - phmap::weak_ordering operator()(std::string lhs, - std::string rhs) const { - return compare_internal::compare_result_as_ordering(rhs.compare(lhs)); - } -#endif - }; - - // A helper class to convert a boolean comparison into a three-way "compare-to" - // comparison that returns a negative value to indicate less-than, zero to - // indicate equality and a positive value to indicate greater-than. This helper - // class is specialized for less, greater, - // less, and greater. - // - // key_compare_to_adapter is provided so that btree users - // automatically get the more efficient compare-to code when using common - // google string types with common comparison functors. - // These string-like specializations also turn on heterogeneous lookup by - // default. - template - struct key_compare_to_adapter { - using type = Compare; - }; - - template <> - struct key_compare_to_adapter> { - using type = StringBtreeDefaultLess; - }; - - template <> - struct key_compare_to_adapter> { - using type = StringBtreeDefaultLess; - }; - - template <> - struct key_compare_to_adapter> { - using type = StringBtreeDefaultGreater; - }; - -#if PHMAP_HAVE_STD_STRING_VIEW - template <> - struct key_compare_to_adapter> { - using type = StringBtreeDefaultLess; - }; - - template <> - struct key_compare_to_adapter> { - using type = StringBtreeDefaultLess; - }; - - template <> - struct key_compare_to_adapter> { - using type = StringBtreeDefaultGreater; - }; -#endif - - template - struct common_params { - // If Compare is a common comparator for a std::string-like type, then we adapt it - // to use heterogeneous lookup and to be a key-compare-to comparator. - using key_compare = typename key_compare_to_adapter::type; - // A type which indicates if we have a key-compare-to functor or a plain old - // key-compare functor. - using is_key_compare_to = btree_is_key_compare_to; - - using allocator_type = Alloc; - using key_type = Key; - using size_type = std::size_t ; - using difference_type = ptrdiff_t; - - // True if this is a multiset or multimap. - using is_multi_container = std::integral_constant; - - using slot_policy = SlotPolicy; - using slot_type = typename slot_policy::slot_type; - using value_type = typename slot_policy::value_type; - using init_type = typename slot_policy::mutable_value_type; - using pointer = value_type *; - using const_pointer = const value_type *; - using reference = value_type &; - using const_reference = const value_type &; - - enum { - kTargetNodeSize = TargetNodeSize, - - // Upper bound for the available space for values. This is largest for leaf - // nodes, which have overhead of at least a pointer + 4 bytes (for storing - // 3 field_types and an enum). - kNodeValueSpace = - TargetNodeSize - /*minimum overhead=*/(sizeof(void *) + 4), - }; - - // This is an integral type large enough to hold as many - // ValueSize-values as will fit a node of TargetNodeSize bytes. - using node_count_type = - phmap::conditional_t<(kNodeValueSpace / sizeof(value_type) > - (std::numeric_limits::max)()), - uint16_t, uint8_t>; // NOLINT - - // The following methods are necessary for passing this struct as PolicyTraits - // for node_handle and/or are used within btree. - static value_type &element(slot_type *slot) { - return slot_policy::element(slot); - } - static const value_type &element(const slot_type *slot) { - return slot_policy::element(slot); - } - template - static void construct(Alloc *alloc, slot_type *slot, Args &&... args) { - slot_policy::construct(alloc, slot, std::forward(args)...); - } - static void construct(Alloc *alloc, slot_type *slot, slot_type *other) { - slot_policy::construct(alloc, slot, other); - } - static void destroy(Alloc *alloc, slot_type *slot) { - slot_policy::destroy(alloc, slot); - } - static void transfer(Alloc *alloc, slot_type *new_slot, slot_type *old_slot) { - construct(alloc, new_slot, old_slot); - destroy(alloc, old_slot); - } - static void swap(Alloc *alloc, slot_type *a, slot_type *b) { - slot_policy::swap(alloc, a, b); - } - static void move(Alloc *alloc, slot_type *src, slot_type *dest) { - slot_policy::move(alloc, src, dest); - } - static void move(Alloc *alloc, slot_type *first, slot_type *last, - slot_type *result) { - slot_policy::move(alloc, first, last, result); - } - }; - - // A parameters structure for holding the type parameters for a btree_map. - // Compare and Alloc should be nothrow copy-constructible. - template - struct map_params : common_params> { - using super_type = typename map_params::common_params; - using mapped_type = Data; - // This type allows us to move keys when it is safe to do so. It is safe - // for maps in which value_type and mutable_value_type are layout compatible. - using slot_policy = typename super_type::slot_policy; - using slot_type = typename super_type::slot_type; - using value_type = typename super_type::value_type; - using init_type = typename super_type::init_type; - - using key_compare = typename super_type::key_compare; - // Inherit from key_compare for empty base class optimization. - struct value_compare : private key_compare { - value_compare() = default; - explicit value_compare(const key_compare &cmp) : key_compare(cmp) {} - - template - auto operator()(const T &left, const U &right) const - -> decltype(std::declval()(left.first, right.first)) { - return key_compare::operator()(left.first, right.first); - } - }; - using is_map_container = std::true_type; - - static const Key &key(const value_type &x) { return x.first; } - static const Key &key(const init_type &x) { return x.first; } - static const Key &key(const slot_type *x) { return slot_policy::key(x); } - static mapped_type &value(value_type *value) { return value->second; } - }; - - // This type implements the necessary functions from the - // btree::priv::slot_type interface. - template - struct set_slot_policy { - using slot_type = Key; - using value_type = Key; - using mutable_value_type = Key; - - static value_type &element(slot_type *slot) { return *slot; } - static const value_type &element(const slot_type *slot) { return *slot; } - - template - static void construct(Alloc *alloc, slot_type *slot, Args &&... args) { - phmap::allocator_traits::construct(*alloc, slot, - std::forward(args)...); - } - - template - static void construct(Alloc *alloc, slot_type *slot, slot_type *other) { - phmap::allocator_traits::construct(*alloc, slot, std::move(*other)); - } - - template - static void destroy(Alloc *alloc, slot_type *slot) { - phmap::allocator_traits::destroy(*alloc, slot); - } - - template - static void swap(Alloc * /*alloc*/, slot_type *a, slot_type *b) { - using std::swap; - swap(*a, *b); - } - - template - static void move(Alloc * /*alloc*/, slot_type *src, slot_type *dest) { - *dest = std::move(*src); - } - - template - static void move(Alloc *alloc, slot_type *first, slot_type *last, - slot_type *result) { - for (slot_type *src = first, *dest = result; src != last; ++src, ++dest) - move(alloc, src, dest); - } - }; - - // A parameters structure for holding the type parameters for a btree_set. - // Compare and Alloc should be nothrow copy-constructible. - template - struct set_params : common_params> { - using value_type = Key; - using slot_type = typename set_params::common_params::slot_type; - using value_compare = typename set_params::common_params::key_compare; - using is_map_container = std::false_type; - - static const Key &key(const value_type &x) { return x; } - static const Key &key(const slot_type *x) { return *x; } - }; - - // An adapter class that converts a lower-bound compare into an upper-bound - // compare. Note: there is no need to make a version of this adapter specialized - // for key-compare-to functors because the upper-bound (the first value greater - // than the input) is never an exact match. - template - struct upper_bound_adapter { - explicit upper_bound_adapter(const Compare &c) : comp(c) {} - template - bool operator()(const K &a, const LK &b) const { - // Returns true when a is not greater than b. - return !phmap::compare_internal::compare_result_as_less_than(comp(b, a)); - } - - private: - Compare comp; - }; - - enum class MatchKind : uint8_t { kEq, kNe }; - - template - struct SearchResult { - V value; - MatchKind match; - - static constexpr bool HasMatch() { return true; } - bool IsEq() const { return match == MatchKind::kEq; } - }; - - // When we don't use CompareTo, `match` is not present. - // This ensures that callers can't use it accidentally when it provides no - // useful information. - template - struct SearchResult { - V value; - - static constexpr bool HasMatch() { return false; } - static constexpr bool IsEq() { return false; } - }; - - // A node in the btree holding. The same node type is used for both internal - // and leaf nodes in the btree, though the nodes are allocated in such a way - // that the children array is only valid in internal nodes. - template - class btree_node { - using is_key_compare_to = typename Params::is_key_compare_to; - using is_multi_container = typename Params::is_multi_container; - using field_type = typename Params::node_count_type; - using allocator_type = typename Params::allocator_type; - using slot_type = typename Params::slot_type; - - public: - using params_type = Params; - using key_type = typename Params::key_type; - using value_type = typename Params::value_type; - using pointer = typename Params::pointer; - using const_pointer = typename Params::const_pointer; - using reference = typename Params::reference; - using const_reference = typename Params::const_reference; - using key_compare = typename Params::key_compare; - using size_type = typename Params::size_type; - using difference_type = typename Params::difference_type; - - // Btree decides whether to use linear node search as follows: - // - If the key is arithmetic and the comparator is std::less or - // std::greater, choose linear. - // - Otherwise, choose binary. - // TODO(ezb): Might make sense to add condition(s) based on node-size. - using use_linear_search = std::integral_constant< - bool, - std::is_arithmetic::value && - (std::is_same, key_compare>::value || - std::is_same, key_compare>::value || - std::is_same, key_compare>::value)>; - - - ~btree_node() = default; - btree_node(btree_node const &) = delete; - btree_node &operator=(btree_node const &) = delete; - - // Public for EmptyNodeType. - constexpr static size_type Alignment() { - static_assert(LeafLayout(1).Alignment() == InternalLayout().Alignment(), - "Alignment of all nodes must be equal."); - return (size_type)InternalLayout().Alignment(); - } - - protected: - btree_node() = default; - - private: - using layout_type = phmap::priv::Layout; - constexpr static size_type SizeWithNValues(size_type n) { - return (size_type)layout_type(/*parent*/ 1, - /*position, start, count, max_count*/ 4, - /*values*/ (size_t)n, - /*children*/ 0) - .AllocSize(); - } - // A lower bound for the overhead of fields other than values in a leaf node. - constexpr static size_type MinimumOverhead() { - return (size_type)(SizeWithNValues(1) - sizeof(value_type)); - } - - // Compute how many values we can fit onto a leaf node taking into account - // padding. - constexpr static size_type NodeTargetValues(const int begin, const int end) { - return begin == end ? begin - : SizeWithNValues((begin + end) / 2 + 1) > - params_type::kTargetNodeSize - ? NodeTargetValues(begin, (begin + end) / 2) - : NodeTargetValues((begin + end) / 2 + 1, end); - } - - enum { - kTargetNodeSize = params_type::kTargetNodeSize, - kNodeTargetValues = NodeTargetValues(0, params_type::kTargetNodeSize), - - // We need a minimum of 3 values per internal node in order to perform - // splitting (1 value for the two nodes involved in the split and 1 value - // propagated to the parent as the delimiter for the split). - kNodeValues = kNodeTargetValues >= 3 ? kNodeTargetValues : 3, - - // The node is internal (i.e. is not a leaf node) if and only if `max_count` - // has this value. - kInternalNodeMaxCount = 0, - }; - - // Leaves can have less than kNodeValues values. - constexpr static layout_type LeafLayout(const int max_values = kNodeValues) { - return layout_type(/*parent*/ 1, - /*position, start, count, max_count*/ 4, - /*values*/ (size_t)max_values, - /*children*/ 0); - } - constexpr static layout_type InternalLayout() { - return layout_type(/*parent*/ 1, - /*position, start, count, max_count*/ 4, - /*values*/ kNodeValues, - /*children*/ kNodeValues + 1); - } - constexpr static size_type LeafSize(const int max_values = kNodeValues) { - return (size_type)LeafLayout(max_values).AllocSize(); - } - constexpr static size_type InternalSize() { - return (size_type)InternalLayout().AllocSize(); - } - - // N is the index of the type in the Layout definition. - // ElementType is the Nth type in the Layout definition. - template - inline typename layout_type::template ElementType *GetField() { - // We assert that we don't read from values that aren't there. - assert(N < 3 || !leaf()); - return InternalLayout().template Pointer(reinterpret_cast(this)); - } - - template - inline const typename layout_type::template ElementType *GetField() const { - assert(N < 3 || !leaf()); - return InternalLayout().template Pointer( - reinterpret_cast(this)); - } - - void set_parent(btree_node *p) { *GetField<0>() = p; } - field_type &mutable_count() { return GetField<1>()[2]; } - slot_type *slot(size_type i) { return &GetField<2>()[i]; } - const slot_type *slot(size_type i) const { return &GetField<2>()[i]; } - void set_position(field_type v) { GetField<1>()[0] = v; } - void set_start(field_type v) { GetField<1>()[1] = v; } - void set_count(field_type v) { GetField<1>()[2] = v; } - void set_max_count(field_type v) { GetField<1>()[3] = v; } - - public: - // Whether this is a leaf node or not. This value doesn't change after the - // node is created. - bool leaf() const { return GetField<1>()[3] != kInternalNodeMaxCount; } - - // Getter for the position of this node in its parent. - field_type position() const { return GetField<1>()[0]; } - - // Getter for the offset of the first value in the `values` array. - field_type start() const { return GetField<1>()[1]; } - - // Getters for the number of values stored in this node. - field_type count() const { return GetField<1>()[2]; } - field_type max_count() const { - // Internal nodes have max_count==kInternalNodeMaxCount. - // Leaf nodes have max_count in [1, kNodeValues]. - const field_type max_cnt = GetField<1>()[3]; - return max_cnt == field_type{kInternalNodeMaxCount} - ? field_type{kNodeValues} - : max_cnt; - } - - // Getter for the parent of this node. - btree_node *parent() const { return *GetField<0>(); } - // Getter for whether the node is the root of the tree. The parent of the - // root of the tree is the leftmost node in the tree which is guaranteed to - // be a leaf. - bool is_root() const { return parent()->leaf(); } - void make_root() { - assert(parent()->is_root()); - set_parent(parent()->parent()); - } - - // Getters for the key/value at position i in the node. - const key_type &key(size_type i) const { return params_type::key(slot(i)); } - reference value(size_type i) { return params_type::element(slot(i)); } - const_reference value(size_type i) const { return params_type::element(slot(i)); } - - // Getters/setter for the child at position i in the node. - btree_node *child(size_type i) const { return GetField<3>()[i]; } - btree_node *&mutable_child(size_type i) { return GetField<3>()[i]; } - void clear_child(size_type i) { - phmap::priv::SanitizerPoisonObject(&mutable_child(i)); - } - void set_child(size_type i, btree_node *c) { - phmap::priv::SanitizerUnpoisonObject(&mutable_child(i)); - mutable_child(i) = c; - c->set_position((field_type)i); - } - void init_child(int i, btree_node *c) { - set_child(i, c); - c->set_parent(this); - } - - // Returns the position of the first value whose key is not less than k. - template - SearchResult lower_bound( - const K &k, const key_compare &comp) const { - return use_linear_search::value ? linear_search(k, comp) - : binary_search(k, comp); - } - // Returns the position of the first value whose key is greater than k. - template - int upper_bound(const K &k, const key_compare &comp) const { - auto upper_compare = upper_bound_adapter(comp); - return use_linear_search::value ? linear_search(k, upper_compare).value - : binary_search(k, upper_compare).value; - } - - template - SearchResult::value> - linear_search(const K &k, const Compare &comp) const { - return linear_search_impl(k, 0, count(), comp, - btree_is_key_compare_to()); - } - - template - SearchResult::value> - binary_search(const K &k, const Compare &comp) const { - return binary_search_impl(k, 0, count(), comp, - btree_is_key_compare_to()); - } - - // Returns the position of the first value whose key is not less than k using - // linear search performed using plain compare. - template - SearchResult linear_search_impl( - const K &k, int s, const int e, const Compare &comp, - std::false_type /* IsCompareTo */) const { - while (s < e) { - if (!comp(key(s), k)) { - break; - } - ++s; - } - return {s}; - } - - // Returns the position of the first value whose key is not less than k using - // linear search performed using compare-to. - template - SearchResult linear_search_impl( - const K &k, int s, const int e, const Compare &comp, - std::true_type /* IsCompareTo */) const { - while (s < e) { - const phmap::weak_ordering c = comp(key(s), k); - if (c == 0) { - return {s, MatchKind::kEq}; - } else if (c > 0) { - break; - } - ++s; - } - return {s, MatchKind::kNe}; - } - - // Returns the position of the first value whose key is not less than k using - // binary search performed using plain compare. - template - SearchResult binary_search_impl( - const K &k, int s, int e, const Compare &comp, - std::false_type /* IsCompareTo */) const { - while (s != e) { - const int mid = (s + e) >> 1; - if (comp(key(mid), k)) { - s = mid + 1; - } else { - e = mid; - } - } - return {s}; - } - - // Returns the position of the first value whose key is not less than k using - // binary search performed using compare-to. - template - SearchResult binary_search_impl( - const K &k, int s, int e, const CompareTo &comp, - std::true_type /* IsCompareTo */) const { - if (is_multi_container::value) { - MatchKind exact_match = MatchKind::kNe; - while (s != e) { - const int mid = (s + e) >> 1; - const phmap::weak_ordering c = comp(key(mid), k); - if (c < 0) { - s = mid + 1; - } else { - e = mid; - if (c == 0) { - // Need to return the first value whose key is not less than k, - // which requires continuing the binary search if this is a - // multi-container. - exact_match = MatchKind::kEq; - } - } - } - return {s, exact_match}; - } else { // Not a multi-container. - while (s != e) { - const int mid = (s + e) >> 1; - const phmap::weak_ordering c = comp(key(mid), k); - if (c < 0) { - s = mid + 1; - } else if (c > 0) { - e = mid; - } else { - return {mid, MatchKind::kEq}; - } - } - return {s, MatchKind::kNe}; - } - } - - // Emplaces a value at position i, shifting all existing values and - // children at positions >= i to the right by 1. - template - void emplace_value(size_type i, allocator_type *alloc, Args &&... args); - - // Removes the value at position i, shifting all existing values and children - // at positions > i to the left by 1. - void remove_value(int i, allocator_type *alloc); - - // Removes the values at positions [i, i + to_erase), shifting all values - // after that range to the left by to_erase. Does not change children at all. - void remove_values_ignore_children(int i, size_type to_erase, - allocator_type *alloc); - - // Rebalances a node with its right sibling. - void rebalance_right_to_left(int to_move, btree_node *right, - allocator_type *alloc); - void rebalance_left_to_right(int to_move, btree_node *right, - allocator_type *alloc); - - // Splits a node, moving a portion of the node's values to its right sibling. - void split(int insert_position, btree_node *dest, allocator_type *alloc); - - // Merges a node with its right sibling, moving all of the values and the - // delimiting key in the parent node onto itself. - void merge(btree_node *sibling, allocator_type *alloc); - - // Swap the contents of "this" and "src". - void swap(btree_node *src, allocator_type *alloc); - - // Node allocation/deletion routines. - static btree_node *init_leaf(btree_node *n, btree_node *parent, - int max_cnt) { - n->set_parent(parent); - n->set_position(0); - n->set_start(0); - n->set_count(0); - n->set_max_count((field_type)max_cnt); - phmap::priv::SanitizerPoisonMemoryRegion( - n->slot(0), max_cnt * sizeof(slot_type)); - return n; - } - static btree_node *init_internal(btree_node *n, btree_node *parent) { - init_leaf(n, parent, kNodeValues); - // Set `max_count` to a sentinel value to indicate that this node is - // internal. - n->set_max_count(kInternalNodeMaxCount); - phmap::priv::SanitizerPoisonMemoryRegion( - &n->mutable_child(0), (kNodeValues + 1) * sizeof(btree_node *)); - return n; - } - void destroy(allocator_type *alloc) { - for (int i = 0; i < count(); ++i) { - value_destroy(i, alloc); - } - } - - public: - // Exposed only for tests. - static bool testonly_uses_linear_node_search() { - return use_linear_search::value; - } - - private: - template - void value_init(const size_type i, allocator_type *alloc, Args &&... args) { - phmap::priv::SanitizerUnpoisonObject(slot(i)); - params_type::construct(alloc, slot(i), std::forward(args)...); - } - void value_destroy(const size_type i, allocator_type *alloc) { - params_type::destroy(alloc, slot(i)); - phmap::priv::SanitizerPoisonObject(slot(i)); - } - - // Move n values starting at value i in this node into the values starting at - // value j in node x. - void uninitialized_move_n(const size_type n, const size_type i, - const size_type j, btree_node *x, - allocator_type *alloc) { - phmap::priv::SanitizerUnpoisonMemoryRegion( - x->slot(j), n * sizeof(slot_type)); - for (slot_type *src = slot(i), *end = src + n, *dest = x->slot(j); - src != end; ++src, ++dest) { - params_type::construct(alloc, dest, src); - } - } - - // Destroys a range of n values, starting at index i. - void value_destroy_n(const size_type i, const size_type n, - allocator_type *alloc) { - for (size_type j = 0; j < n; ++j) { - value_destroy(i + j, alloc); - } - } - - template - friend class btree; - template - friend struct btree_iterator; - friend class BtreeNodePeer; - }; - - template - struct btree_iterator { - private: - using key_type = typename Node::key_type; - using size_type = typename Node::size_type; - using params_type = typename Node::params_type; - - using node_type = Node; - using normal_node = typename std::remove_const::type; - using const_node = const Node; - using normal_pointer = typename params_type::pointer; - using normal_reference = typename params_type::reference; - using const_pointer = typename params_type::const_pointer; - using const_reference = typename params_type::const_reference; - using slot_type = typename params_type::slot_type; - - using iterator = - btree_iterator; - using const_iterator = - btree_iterator; - - public: - // These aliases are public for std::iterator_traits. - using difference_type = typename Node::difference_type; - using value_type = typename params_type::value_type; - using pointer = Pointer; - using reference = Reference; - using iterator_category = std::bidirectional_iterator_tag; - - btree_iterator() : node(nullptr), position(-1) {} - btree_iterator(Node *n, int p) : node(n), position(p) {} - - // NOTE: this SFINAE allows for implicit conversions from iterator to - // const_iterator, but it specifically avoids defining copy constructors so - // that btree_iterator can be trivially copyable. This is for performance and - // binary size reasons. - template , iterator>::value && - std::is_same::value, - int> = 0> - btree_iterator(const btree_iterator &x) // NOLINT - : node(x.node), position(x.position) {} - - private: - // This SFINAE allows explicit conversions from const_iterator to - // iterator, but also avoids defining a copy constructor. - // NOTE: the const_cast is safe because this constructor is only called by - // non-const methods and the container owns the nodes. - template , const_iterator>::value && - std::is_same::value, - int> = 0> - explicit btree_iterator(const btree_iterator &x) - : node(const_cast(x.node)), position(x.position) {} - - // Increment/decrement the iterator. - void increment() { - if (node->leaf() && ++position < node->count()) { - return; - } - increment_slow(); - } - void increment_slow(); - - void decrement() { - if (node->leaf() && --position >= 0) { - return; - } - decrement_slow(); - } - void decrement_slow(); - - public: - bool operator==(const const_iterator &x) const { - return node == x.node && position == x.position; - } - bool operator!=(const const_iterator &x) const { - return node != x.node || position != x.position; - } - - // Accessors for the key/value the iterator is pointing at. - reference operator*() const { - return node->value(position); - } - pointer operator->() const { - return &node->value(position); - } - - btree_iterator& operator++() { - increment(); - return *this; - } - btree_iterator& operator--() { - decrement(); - return *this; - } - btree_iterator operator++(int) { - btree_iterator tmp = *this; - ++*this; - return tmp; - } - btree_iterator operator--(int) { - btree_iterator tmp = *this; - --*this; - return tmp; - } - - private: - template - friend class btree; - template - friend class btree_container; - template - friend class btree_set_container; - template - friend class btree_map_container; - template - friend class btree_multiset_container; - template - friend struct btree_iterator; - template - friend class base_checker; - - const key_type &key() const { return node->key(position); } - slot_type *slot() { return node->slot(position); } - - // The node in the tree the iterator is pointing at. - Node *node; - // The position within the node of the tree the iterator is pointing at. - // TODO(ezb): make this a field_type - int position; - }; - - template - class btree { - using node_type = btree_node; - using is_key_compare_to = typename Params::is_key_compare_to; - - // We use a static empty node for the root/leftmost/rightmost of empty btrees - // in order to avoid branching in begin()/end(). - struct alignas(node_type::Alignment()) EmptyNodeType : node_type { - using field_type = typename node_type::field_type; - node_type *parent; - field_type position = 0; - field_type start = 0; - field_type count = 0; - // max_count must be != kInternalNodeMaxCount (so that this node is regarded - // as a leaf node). max_count() is never called when the tree is empty. - field_type max_count = node_type::kInternalNodeMaxCount + 1; - -#ifdef _MSC_VER - // MSVC has constexpr code generations bugs here. - EmptyNodeType() : parent(this) {} -#else - constexpr EmptyNodeType(node_type *p) : parent(p) {} -#endif - }; - - static node_type *EmptyNode() { -#ifdef _MSC_VER - static EmptyNodeType empty_node; - // This assert fails on some other construction methods. - assert(empty_node.parent == &empty_node); - return &empty_node; -#else - static constexpr EmptyNodeType empty_node( - const_cast(&empty_node)); - return const_cast(&empty_node); -#endif - } - - enum { - kNodeValues = node_type::kNodeValues, - kMinNodeValues = kNodeValues / 2, - }; - - struct node_stats { - using size_type = typename Params::size_type; - - node_stats(size_type l, size_type i) - : leaf_nodes(l), - internal_nodes(i) { - } - - node_stats& operator+=(const node_stats &x) { - leaf_nodes += x.leaf_nodes; - internal_nodes += x.internal_nodes; - return *this; - } - - size_type leaf_nodes; - size_type internal_nodes; - }; - - public: - using key_type = typename Params::key_type; - using value_type = typename Params::value_type; - using size_type = typename Params::size_type; - using difference_type = typename Params::difference_type; - using key_compare = typename Params::key_compare; - using value_compare = typename Params::value_compare; - using allocator_type = typename Params::allocator_type; - using reference = typename Params::reference; - using const_reference = typename Params::const_reference; - using pointer = typename Params::pointer; - using const_pointer = typename Params::const_pointer; - using iterator = btree_iterator; - using const_iterator = typename iterator::const_iterator; - using reverse_iterator = std::reverse_iterator; - using const_reverse_iterator = std::reverse_iterator; - using node_handle_type = node_handle; - - // Internal types made public for use by btree_container types. - using params_type = Params; - using slot_type = typename Params::slot_type; - - private: - // For use in copy_or_move_values_in_order. - const value_type &maybe_move_from_iterator(const_iterator x) { return *x; } - value_type &&maybe_move_from_iterator(iterator x) { return std::move(*x); } - - // Copies or moves (depending on the template parameter) the values in - // x into this btree in their order in x. This btree must be empty before this - // method is called. This method is used in copy construction, copy - // assignment, and move assignment. - template - void copy_or_move_values_in_order(Btree *x); - - // Validates that various assumptions/requirements are true at compile time. - constexpr static bool static_assert_validation(); - - public: - btree(const key_compare &comp, const allocator_type &alloc); - - btree(const btree &x); - btree(btree &&x) noexcept - : root_(std::move(x.root_)), - rightmost_(phmap::exchange(x.rightmost_, EmptyNode())), - size_(phmap::exchange(x.size_, 0)) { - x.mutable_root() = EmptyNode(); - } - - ~btree() { - // Put static_asserts in destructor to avoid triggering them before the type - // is complete. - static_assert(static_assert_validation(), "This call must be elided."); - clear(); - } - - // Assign the contents of x to *this. - btree &operator=(const btree &x); - btree &operator=(btree &&x) noexcept; - - iterator begin() { - return iterator(leftmost(), 0); - } - const_iterator begin() const { - return const_iterator(leftmost(), 0); - } - iterator end() { return iterator(rightmost_, rightmost_->count()); } - const_iterator end() const { - return const_iterator(rightmost_, rightmost_->count()); - } - reverse_iterator rbegin() { - return reverse_iterator(end()); - } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - reverse_iterator rend() { - return reverse_iterator(begin()); - } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } - - // Finds the first element whose key is not less than key. - template - iterator lower_bound(const K &key) { - return internal_end(internal_lower_bound(key)); - } - template - const_iterator lower_bound(const K &key) const { - return internal_end(internal_lower_bound(key)); - } - - // Finds the first element whose key is greater than key. - template - iterator upper_bound(const K &key) { - return internal_end(internal_upper_bound(key)); - } - template - const_iterator upper_bound(const K &key) const { - return internal_end(internal_upper_bound(key)); - } - - // Finds the range of values which compare equal to key. The first member of - // the returned pair is equal to lower_bound(key). The second member pair of - // the pair is equal to upper_bound(key). - template - std::pair equal_range(const K &key) { - return {lower_bound(key), upper_bound(key)}; - } - template - std::pair equal_range(const K &key) const { - return {lower_bound(key), upper_bound(key)}; - } - - // Inserts a value into the btree only if it does not already exist. The - // boolean return value indicates whether insertion succeeded or failed. - // Requirement: if `key` already exists in the btree, does not consume `args`. - // Requirement: `key` is never referenced after consuming `args`. - template - std::pair insert_unique(const key_type &key, Args &&... args); - - // Inserts with hint. Checks to see if the value should be placed immediately - // before `position` in the tree. If so, then the insertion will take - // amortized constant time. If not, the insertion will take amortized - // logarithmic time as if a call to insert_unique() were made. - // Requirement: if `key` already exists in the btree, does not consume `args`. - // Requirement: `key` is never referenced after consuming `args`. - template - std::pair insert_hint_unique(iterator position, - const key_type &key, - Args &&... args); - - // Insert a range of values into the btree. - template - void insert_iterator_unique(InputIterator b, InputIterator e); - - // Inserts a value into the btree. - template - iterator insert_multi(const key_type &key, ValueType &&v); - - // Inserts a value into the btree. - template - iterator insert_multi(ValueType &&v) { - return insert_multi(params_type::key(v), std::forward(v)); - } - - // Insert with hint. Check to see if the value should be placed immediately - // before position in the tree. If it does, then the insertion will take - // amortized constant time. If not, the insertion will take amortized - // logarithmic time as if a call to insert_multi(v) were made. - template - iterator insert_hint_multi(iterator position, ValueType &&v); - - // Insert a range of values into the btree. - template - void insert_iterator_multi(InputIterator b, InputIterator e); - - // Erase the specified iterator from the btree. The iterator must be valid - // (i.e. not equal to end()). Return an iterator pointing to the node after - // the one that was erased (or end() if none exists). - // Requirement: does not read the value at `*iter`. - iterator erase(iterator iter); - - // Erases range. Returns the number of keys erased and an iterator pointing - // to the element after the last erased element. - std::pair erase(iterator begin, iterator end); - - // Erases the specified key from the btree. Returns 1 if an element was - // erased and 0 otherwise. - template - size_type erase_unique(const K &key); - - // Erases all of the entries matching the specified key from the - // btree. Returns the number of elements erased. - template - size_type erase_multi(const K &key); - - // Finds the iterator corresponding to a key or returns end() if the key is - // not present. - template - iterator find(const K &key) { - return internal_end(internal_find(key)); - } - template - const_iterator find(const K &key) const { - return internal_end(internal_find(key)); - } - - // Returns a count of the number of times the key appears in the btree. - template - size_type count_unique(const K &key) const { - const iterator beg = internal_find(key); - if (beg.node == nullptr) { - // The key doesn't exist in the tree. - return 0; - } - return 1; - } - // Returns a count of the number of times the key appears in the btree. - template - size_type count_multi(const K &key) const { - const auto range = equal_range(key); - return std::distance(range.first, range.second); - } - - // Clear the btree, deleting all of the values it contains. - void clear(); - - // Swap the contents of *this and x. - void swap(btree &x); - - const key_compare &key_comp() const noexcept { - return root_.template get<0>(); - } - template - bool compare_keys(const K &x, const LK &y) const { - return compare_internal::compare_result_as_less_than(key_comp()(x, y)); - } - - value_compare value_comp() const { return value_compare(key_comp()); } - - // Verifies the structure of the btree. - void verify() const; - - // Size routines. - size_type size() const { return size_; } - size_type max_size() const { return (std::numeric_limits::max)(); } - bool empty() const { return size_ == 0; } - - // The height of the btree. An empty tree will have height 0. - size_type height() const { - size_type h = 0; - if (!empty()) { - // Count the length of the chain from the leftmost node up to the - // root. We actually count from the root back around to the level below - // the root, but the calculation is the same because of the circularity - // of that traversal. - const node_type *n = root(); - do { - ++h; - n = n->parent(); - } while (n != root()); - } - return h; - } - - // The number of internal, leaf and total nodes used by the btree. - size_type leaf_nodes() const { - return internal_stats(root()).leaf_nodes; - } - size_type internal_nodes() const { - return internal_stats(root()).internal_nodes; - } - size_type nodes() const { - node_stats stats = internal_stats(root()); - return stats.leaf_nodes + stats.internal_nodes; - } - - // The total number of bytes used by the btree. - size_type bytes_used() const { - node_stats stats = internal_stats(root()); - if (stats.leaf_nodes == 1 && stats.internal_nodes == 0) { - return sizeof(*this) + - node_type::LeafSize(root()->max_count()); - } else { - return sizeof(*this) + - stats.leaf_nodes * node_type::LeafSize() + - stats.internal_nodes * node_type::InternalSize(); - } - } - - // The average number of bytes used per value stored in the btree. - static double average_bytes_per_value() { - // Returns the number of bytes per value on a leaf node that is 75% - // full. Experimentally, this matches up nicely with the computed number of - // bytes per value in trees that had their values inserted in random order. - return node_type::LeafSize() / (kNodeValues * 0.75); - } - - // The fullness of the btree. Computed as the number of elements in the btree - // divided by the maximum number of elements a tree with the current number - // of nodes could hold. A value of 1 indicates perfect space - // utilization. Smaller values indicate space wastage. - // Returns 0 for empty trees. - double fullness() const { - if (empty()) return 0.0; - return static_cast(size()) / (nodes() * kNodeValues); - } - // The overhead of the btree structure in bytes per node. Computed as the - // total number of bytes used by the btree minus the number of bytes used for - // storing elements divided by the number of elements. - // Returns 0 for empty trees. - double overhead() const { - if (empty()) return 0.0; - return (bytes_used() - size() * sizeof(value_type)) / - static_cast(size()); - } - - // The allocator used by the btree. - allocator_type get_allocator() const { - return allocator(); - } - - private: - // Internal accessor routines. - node_type *root() { return root_.template get<2>(); } - const node_type *root() const { return root_.template get<2>(); } - node_type *&mutable_root() noexcept { return root_.template get<2>(); } - key_compare *mutable_key_comp() noexcept { return &root_.template get<0>(); } - - // The leftmost node is stored as the parent of the root node. - node_type *leftmost() { return root()->parent(); } - const node_type *leftmost() const { return root()->parent(); } - - // Allocator routines. - allocator_type *mutable_allocator() noexcept { - return &root_.template get<1>(); - } - const allocator_type &allocator() const noexcept { - return root_.template get<1>(); - } - - // Allocates a correctly aligned node of at least size bytes using the - // allocator. - node_type *allocate(const size_type sz) { - return reinterpret_cast( - phmap::priv::Allocate( - mutable_allocator(), (size_t)sz)); - } - - // Node creation/deletion routines. - node_type* new_internal_node(node_type *parent) { - node_type *p = allocate(node_type::InternalSize()); - return node_type::init_internal(p, parent); - } - node_type* new_leaf_node(node_type *parent) { - node_type *p = allocate(node_type::LeafSize()); - return node_type::init_leaf(p, parent, kNodeValues); - } - node_type *new_leaf_root_node(const int max_count) { - node_type *p = allocate(node_type::LeafSize(max_count)); - return node_type::init_leaf(p, p, max_count); - } - - // Deletion helper routines. - void erase_same_node(iterator begin, iterator end); - iterator erase_from_leaf_node(iterator begin, size_type to_erase); - iterator rebalance_after_delete(iterator iter); - - // Deallocates a node of a certain size in bytes using the allocator. - void deallocate(const size_type sz, node_type *node) { - phmap::priv::Deallocate( - mutable_allocator(), node, (size_t)sz); - } - - void delete_internal_node(node_type *node) { - node->destroy(mutable_allocator()); - deallocate(node_type::InternalSize(), node); - } - void delete_leaf_node(node_type *node) { - node->destroy(mutable_allocator()); - deallocate(node_type::LeafSize(node->max_count()), node); - } - - // Rebalances or splits the node iter points to. - void rebalance_or_split(iterator *iter); - - // Merges the values of left, right and the delimiting key on their parent - // onto left, removing the delimiting key and deleting right. - void merge_nodes(node_type *left, node_type *right); - - // Tries to merge node with its left or right sibling, and failing that, - // rebalance with its left or right sibling. Returns true if a merge - // occurred, at which point it is no longer valid to access node. Returns - // false if no merging took place. - bool try_merge_or_rebalance(iterator *iter); - - // Tries to shrink the height of the tree by 1. - void try_shrink(); - - iterator internal_end(iterator iter) { - return iter.node != nullptr ? iter : end(); - } - const_iterator internal_end(const_iterator iter) const { - return iter.node != nullptr ? iter : end(); - } - - // Emplaces a value into the btree immediately before iter. Requires that - // key(v) <= iter.key() and (--iter).key() <= key(v). - template - iterator internal_emplace(iterator iter, Args &&... args); - - // Returns an iterator pointing to the first value >= the value "iter" is - // pointing at. Note that "iter" might be pointing to an invalid location as - // iter.position == iter.node->count(). This routine simply moves iter up in - // the tree to a valid location. - // Requires: iter.node is non-null. - template - static IterType internal_last(IterType iter); - - // Returns an iterator pointing to the leaf position at which key would - // reside in the tree. We provide 2 versions of internal_locate. The first - // version uses a less-than comparator and is incapable of distinguishing when - // there is an exact match. The second version is for the key-compare-to - // specialization and distinguishes exact matches. The key-compare-to - // specialization allows the caller to avoid a subsequent comparison to - // determine if an exact match was made, which is important for keys with - // expensive comparison, such as strings. - template - SearchResult internal_locate( - const K &key) const; - - template - SearchResult internal_locate_impl( - const K &key, std::false_type /* IsCompareTo */) const; - - template - SearchResult internal_locate_impl( - const K &key, std::true_type /* IsCompareTo */) const; - - // Internal routine which implements lower_bound(). - template - iterator internal_lower_bound(const K &key) const; - - // Internal routine which implements upper_bound(). - template - iterator internal_upper_bound(const K &key) const; - - // Internal routine which implements find(). - template - iterator internal_find(const K &key) const; - - // Deletes a node and all of its children. - void internal_clear(node_type *node); - - // Verifies the tree structure of node. - int internal_verify(const node_type *node, - const key_type *lo, const key_type *hi) const; - - node_stats internal_stats(const node_type *node) const { - // The root can be a static empty node. - if (node == nullptr || (node == root() && empty())) { - return node_stats(0, 0); - } - if (node->leaf()) { - return node_stats(1, 0); - } - node_stats res(0, 1); - for (int i = 0; i <= node->count(); ++i) { - res += internal_stats(node->child(i)); - } - return res; - } - - public: - // Exposed only for tests. - static bool testonly_uses_linear_node_search() { - return node_type::testonly_uses_linear_node_search(); - } - - private: - // We use compressed tuple in order to save space because key_compare and - // allocator_type are usually empty. - phmap::priv::CompressedTuple - root_; - - // A pointer to the rightmost node. Note that the leftmost node is stored as - // the root's parent. - node_type *rightmost_; - - // Number of values. - size_type size_; - }; - - //// - // btree_node methods - template - template - inline void btree_node

::emplace_value(const size_type i, - allocator_type *alloc, - Args &&... args) { - assert(i <= count()); - // Shift old values to create space for new value and then construct it in - // place. - if (i < count()) { - value_init(count(), alloc, slot(count() - 1)); - for (size_type j = count() - 1; j > i; --j) - params_type::move(alloc, slot(j - 1), slot(j)); - value_destroy(i, alloc); - } - value_init(i, alloc, std::forward(args)...); - set_count((field_type)(count() + 1)); - - if (!leaf() && count() > i + 1) { - for (int j = count(); j > (int)(i + 1); --j) { - set_child(j, child(j - 1)); - } - clear_child(i + 1); - } - } - - template - inline void btree_node

::remove_value(const int i, allocator_type *alloc) { - if (!leaf() && count() > i + 1) { - assert(child(i + 1)->count() == 0); - for (size_type j = i + 1; j < count(); ++j) { - set_child(j, child(j + 1)); - } - clear_child(count()); - } - - remove_values_ignore_children(i, /*to_erase=*/1, alloc); - } - - template - inline void btree_node

::remove_values_ignore_children( - int i, size_type to_erase, allocator_type *alloc) { - params_type::move(alloc, slot(i + to_erase), slot(count()), slot(i)); - value_destroy_n(count() - to_erase, to_erase, alloc); - set_count((field_type)(count() - to_erase)); - } - - template - void btree_node

::rebalance_right_to_left(const int to_move, - btree_node *right, - allocator_type *alloc) { - assert(parent() == right->parent()); - assert(position() + 1 == right->position()); - assert(right->count() >= count()); - assert(to_move >= 1); - assert(to_move <= right->count()); - - // 1) Move the delimiting value in the parent to the left node. - value_init(count(), alloc, parent()->slot(position())); - - // 2) Move the (to_move - 1) values from the right node to the left node. - right->uninitialized_move_n(to_move - 1, 0, count() + 1, this, alloc); - - // 3) Move the new delimiting value to the parent from the right node. - params_type::move(alloc, right->slot(to_move - 1), - parent()->slot(position())); - - // 4) Shift the values in the right node to their correct position. - params_type::move(alloc, right->slot(to_move), right->slot(right->count()), - right->slot(0)); - - // 5) Destroy the now-empty to_move entries in the right node. - right->value_destroy_n(right->count() - to_move, to_move, alloc); - - if (!leaf()) { - // Move the child pointers from the right to the left node. - for (int i = 0; i < to_move; ++i) { - init_child(count() + i + 1, right->child(i)); - } - for (int i = 0; i <= right->count() - to_move; ++i) { - assert(i + to_move <= right->max_count()); - right->init_child(i, right->child(i + to_move)); - right->clear_child(i + to_move); - } - } - - // Fixup the counts on the left and right nodes. - set_count((field_type)(count() + to_move)); - right->set_count((field_type)(right->count() - to_move)); - } - - template - void btree_node

::rebalance_left_to_right(const int to_move, - btree_node *right, - allocator_type *alloc) { - assert(parent() == right->parent()); - assert(position() + 1 == right->position()); - assert(count() >= right->count()); - assert(to_move >= 1); - assert(to_move <= count()); - - // Values in the right node are shifted to the right to make room for the - // new to_move values. Then, the delimiting value in the parent and the - // other (to_move - 1) values in the left node are moved into the right node. - // Lastly, a new delimiting value is moved from the left node into the - // parent, and the remaining empty left node entries are destroyed. - - if (right->count() >= to_move) { - // The original location of the right->count() values are sufficient to hold - // the new to_move entries from the parent and left node. - - // 1) Shift existing values in the right node to their correct positions. - right->uninitialized_move_n(to_move, right->count() - to_move, - right->count(), right, alloc); - for (slot_type *src = right->slot(right->count() - to_move - 1), - *dest = right->slot(right->count() - 1), - *end = right->slot(0); - src >= end; --src, --dest) { - params_type::move(alloc, src, dest); - } - - // 2) Move the delimiting value in the parent to the right node. - params_type::move(alloc, parent()->slot(position()), - right->slot(to_move - 1)); - - // 3) Move the (to_move - 1) values from the left node to the right node. - params_type::move(alloc, slot(count() - (to_move - 1)), slot(count()), - right->slot(0)); - } else { - // The right node does not have enough initialized space to hold the new - // to_move entries, so part of them will move to uninitialized space. - - // 1) Shift existing values in the right node to their correct positions. - right->uninitialized_move_n(right->count(), 0, to_move, right, alloc); - - // 2) Move the delimiting value in the parent to the right node. - right->value_init(to_move - 1, alloc, parent()->slot(position())); - - // 3) Move the (to_move - 1) values from the left node to the right node. - const size_type uninitialized_remaining = to_move - right->count() - 1; - uninitialized_move_n(uninitialized_remaining, - count() - uninitialized_remaining, right->count(), - right, alloc); - params_type::move(alloc, slot(count() - (to_move - 1)), - slot(count() - uninitialized_remaining), right->slot(0)); - } - - // 4) Move the new delimiting value to the parent from the left node. - params_type::move(alloc, slot(count() - to_move), parent()->slot(position())); - - // 5) Destroy the now-empty to_move entries in the left node. - value_destroy_n(count() - to_move, to_move, alloc); - - if (!leaf()) { - // Move the child pointers from the left to the right node. - for (int i = right->count(); i >= 0; --i) { - right->init_child(i + to_move, right->child(i)); - right->clear_child(i); - } - for (int i = 1; i <= to_move; ++i) { - right->init_child(i - 1, child(count() - to_move + i)); - clear_child(count() - to_move + i); - } - } - - // Fixup the counts on the left and right nodes. - set_count((field_type)(count() - to_move)); - right->set_count((field_type)(right->count() + to_move)); - } - - template - void btree_node

::split(const int insert_position, btree_node *dest, - allocator_type *alloc) { - assert(dest->count() == 0); - assert(max_count() == kNodeValues); - - // We bias the split based on the position being inserted. If we're - // inserting at the beginning of the left node then bias the split to put - // more values on the right node. If we're inserting at the end of the - // right node then bias the split to put more values on the left node. - if (insert_position == 0) { - dest->set_count((field_type)(count() - 1)); - } else if (insert_position == kNodeValues) { - dest->set_count(0); - } else { - dest->set_count((field_type)(count() / 2)); - } - set_count((field_type)(count() - dest->count())); - assert(count() >= 1); - - // Move values from the left sibling to the right sibling. - uninitialized_move_n(dest->count(), count(), 0, dest, alloc); - - // Destroy the now-empty entries in the left node. - value_destroy_n(count(), dest->count(), alloc); - - // The split key is the largest value in the left sibling. - set_count((field_type)(count() - 1)); - parent()->emplace_value(position(), alloc, slot(count())); - value_destroy(count(), alloc); - parent()->init_child(position() + 1, dest); - - if (!leaf()) { - for (int i = 0; i <= dest->count(); ++i) { - assert(child(count() + i + 1) != nullptr); - dest->init_child(i, child(count() + i + 1)); - clear_child(count() + i + 1); - } - } - } - - template - void btree_node

::merge(btree_node *src, allocator_type *alloc) { - assert(parent() == src->parent()); - assert(position() + 1 == src->position()); - - // Move the delimiting value to the left node. - value_init(count(), alloc, parent()->slot(position())); - - // Move the values from the right to the left node. - src->uninitialized_move_n(src->count(), 0, count() + 1, this, alloc); - - // Destroy the now-empty entries in the right node. - src->value_destroy_n(0, src->count(), alloc); - - if (!leaf()) { - // Move the child pointers from the right to the left node. - for (int i = 0; i <= src->count(); ++i) { - init_child(count() + i + 1, src->child(i)); - src->clear_child(i); - } - } - - // Fixup the counts on the src and dest nodes. - set_count((field_type)(1 + count() + src->count())); - src->set_count(0); - - // Remove the value on the parent node. - parent()->remove_value(position(), alloc); - } - - template - void btree_node

::swap(btree_node *x, allocator_type *alloc) { - using std::swap; - assert(leaf() == x->leaf()); - - // Determine which is the smaller/larger node. - btree_node *smaller = this, *larger = x; - if (smaller->count() > larger->count()) { - swap(smaller, larger); - } - - // Swap the values. - for (slot_type *a = smaller->slot(0), *b = larger->slot(0), - *end = a + smaller->count(); - a != end; ++a, ++b) { - params_type::swap(alloc, a, b); - } - - // Move values that can't be swapped. - const size_type to_move = larger->count() - smaller->count(); - larger->uninitialized_move_n(to_move, smaller->count(), smaller->count(), - smaller, alloc); - larger->value_destroy_n(smaller->count(), to_move, alloc); - - if (!leaf()) { - // Swap the child pointers. - std::swap_ranges(&smaller->mutable_child(0), - &smaller->mutable_child(smaller->count() + 1), - &larger->mutable_child(0)); - // Update swapped children's parent pointers. - int i = 0; - for (; i <= smaller->count(); ++i) { - smaller->child(i)->set_parent(smaller); - larger->child(i)->set_parent(larger); - } - // Move the child pointers that couldn't be swapped. - for (; i <= larger->count(); ++i) { - smaller->init_child(i, larger->child(i)); - larger->clear_child(i); - } - } - - // Swap the counts. - swap(mutable_count(), x->mutable_count()); - } - - //// - // btree_iterator methods - template - void btree_iterator::increment_slow() { - if (node->leaf()) { - assert(position >= node->count()); - btree_iterator save(*this); - while (position == node->count() && !node->is_root()) { - assert(node->parent()->child(node->position()) == node); - position = node->position(); - node = node->parent(); - } - if (position == node->count()) { - *this = save; - } - } else { - assert(position < node->count()); - node = node->child(position + 1); - while (!node->leaf()) { - node = node->child(0); - } - position = 0; - } - } - - template - void btree_iterator::decrement_slow() { - if (node->leaf()) { - assert(position <= -1); - btree_iterator save(*this); - while (position < 0 && !node->is_root()) { - assert(node->parent()->child(node->position()) == node); - position = node->position() - 1; - node = node->parent(); - } - if (position < 0) { - *this = save; - } - } else { - assert(position >= 0); - node = node->child(position); - while (!node->leaf()) { - node = node->child(node->count()); - } - position = node->count() - 1; - } - } - - //// - // btree methods - template - template - void btree

::copy_or_move_values_in_order(Btree *x) { - static_assert(std::is_same::value || - std::is_same::value, - "Btree type must be same or const."); - assert(empty()); - - // We can avoid key comparisons because we know the order of the - // values is the same order we'll store them in. - auto iter = x->begin(); - if (iter == x->end()) return; - insert_multi(maybe_move_from_iterator(iter)); - ++iter; - for (; iter != x->end(); ++iter) { - // If the btree is not empty, we can just insert the new value at the end - // of the tree. - internal_emplace(end(), maybe_move_from_iterator(iter)); - } - } - - template - constexpr bool btree

::static_assert_validation() { - static_assert(std::is_nothrow_copy_constructible::value, - "Key comparison must be nothrow copy constructible"); - static_assert(std::is_nothrow_copy_constructible::value, - "Allocator must be nothrow copy constructible"); - static_assert(type_traits_internal::is_trivially_copyable::value, - "iterator not trivially copyable."); - - // Note: We assert that kTargetValues, which is computed from - // Params::kTargetNodeSize, must fit the node_type::field_type. - static_assert( - kNodeValues < (1 << (8 * sizeof(typename node_type::field_type))), - "target node size too large"); - - // Verify that key_compare returns an phmap::{weak,strong}_ordering or bool. - using compare_result_type = - phmap::invoke_result_t; - static_assert( - std::is_same::value || - std::is_convertible::value, - "key comparison function must return phmap::{weak,strong}_ordering or " - "bool."); - - // Test the assumption made in setting kNodeValueSpace. - static_assert(node_type::MinimumOverhead() >= sizeof(void *) + 4, - "node space assumption incorrect"); - - return true; - } - - template - btree

::btree(const key_compare &comp, const allocator_type &alloc) - : root_(comp, alloc, EmptyNode()), rightmost_(EmptyNode()), size_(0) {} - - template - btree

::btree(const btree &x) : btree(x.key_comp(), x.allocator()) { - copy_or_move_values_in_order(&x); - } - - template - template - auto btree

::insert_unique(const key_type &key, Args &&... args) - -> std::pair { - if (empty()) { - mutable_root() = rightmost_ = new_leaf_root_node(1); - } - - auto res = internal_locate(key); - iterator &iter = res.value; - - if (res.HasMatch()) { - if (res.IsEq()) { - // The key already exists in the tree, do nothing. - return {iter, false}; - } - } else { - iterator last = internal_last(iter); - if (last.node && !compare_keys(key, last.key())) { - // The key already exists in the tree, do nothing. - return {last, false}; - } - } - return {internal_emplace(iter, std::forward(args)...), true}; - } - - template - template - inline auto btree

::insert_hint_unique(iterator position, const key_type &key, - Args &&... args) - -> std::pair { - if (!empty()) { - if (position == end() || compare_keys(key, position.key())) { - iterator prev = position; - if (position == begin() || compare_keys((--prev).key(), key)) { - // prev.key() < key < position.key() - return {internal_emplace(position, std::forward(args)...), true}; - } - } else if (compare_keys(position.key(), key)) { - ++position; - if (position == end() || compare_keys(key, position.key())) { - // {original `position`}.key() < key < {current `position`}.key() - return {internal_emplace(position, std::forward(args)...), true}; - } - } else { - // position.key() == key - return {position, false}; - } - } - return insert_unique(key, std::forward(args)...); - } - - template - template - void btree

::insert_iterator_unique(InputIterator b, InputIterator e) { - for (; b != e; ++b) { - insert_hint_unique(end(), params_type::key(*b), *b); - } - } - - template - template - auto btree

::insert_multi(const key_type &key, ValueType &&v) -> iterator { - if (empty()) { - mutable_root() = rightmost_ = new_leaf_root_node(1); - } - - iterator iter = internal_upper_bound(key); - if (iter.node == nullptr) { - iter = end(); - } - return internal_emplace(iter, std::forward(v)); - } - - template - template - auto btree

::insert_hint_multi(iterator position, ValueType &&v) -> iterator { - if (!empty()) { - const key_type &key = params_type::key(v); - if (position == end() || !compare_keys(position.key(), key)) { - iterator prev = position; - if (position == begin() || !compare_keys(key, (--prev).key())) { - // prev.key() <= key <= position.key() - return internal_emplace(position, std::forward(v)); - } - } else { - iterator next = position; - ++next; - if (next == end() || !compare_keys(next.key(), key)) { - // position.key() < key <= next.key() - return internal_emplace(next, std::forward(v)); - } - } - } - return insert_multi(std::forward(v)); - } - - template - template - void btree

::insert_iterator_multi(InputIterator b, InputIterator e) { - for (; b != e; ++b) { - insert_hint_multi(end(), *b); - } - } - - template - auto btree

::operator=(const btree &x) -> btree & { - if (this != &x) { - clear(); - - *mutable_key_comp() = x.key_comp(); - if (phmap::allocator_traits< - allocator_type>::propagate_on_container_copy_assignment::value) { - *mutable_allocator() = x.allocator(); - } - - copy_or_move_values_in_order(&x); - } - return *this; - } - - template - auto btree

::operator=(btree &&x) noexcept -> btree & { - if (this != &x) { - clear(); - - using std::swap; - if (phmap::allocator_traits< - allocator_type>::propagate_on_container_copy_assignment::value) { - // Note: `root_` also contains the allocator and the key comparator. - swap(root_, x.root_); - swap(rightmost_, x.rightmost_); - swap(size_, x.size_); - } else { - if (allocator() == x.allocator()) { - swap(mutable_root(), x.mutable_root()); - swap(*mutable_key_comp(), *x.mutable_key_comp()); - swap(rightmost_, x.rightmost_); - swap(size_, x.size_); - } else { - // We aren't allowed to propagate the allocator and the allocator is - // different so we can't take over its memory. We must move each element - // individually. We need both `x` and `this` to have `x`s key comparator - // while moving the values so we can't swap the key comparators. - *mutable_key_comp() = x.key_comp(); - copy_or_move_values_in_order(&x); - } - } - } - return *this; - } - - template - auto btree

::erase(iterator iter) -> iterator { - bool internal_delete = false; - if (!iter.node->leaf()) { - // Deletion of a value on an internal node. First, move the largest value - // from our left child here, then delete that position (in remove_value() - // below). We can get to the largest value from our left child by - // decrementing iter. - iterator internal_iter(iter); - --iter; - assert(iter.node->leaf()); - params_type::move(mutable_allocator(), iter.node->slot(iter.position), - internal_iter.node->slot(internal_iter.position)); - internal_delete = true; - } - - // Delete the key from the leaf. - iter.node->remove_value(iter.position, mutable_allocator()); - --size_; - - // We want to return the next value after the one we just erased. If we - // erased from an internal node (internal_delete == true), then the next - // value is ++(++iter). If we erased from a leaf node (internal_delete == - // false) then the next value is ++iter. Note that ++iter may point to an - // internal node and the value in the internal node may move to a leaf node - // (iter.node) when rebalancing is performed at the leaf level. - - iterator res = rebalance_after_delete(iter); - - // If we erased from an internal node, advance the iterator. - if (internal_delete) { - ++res; - } - return res; - } - - template - auto btree

::rebalance_after_delete(iterator iter) -> iterator { - // Merge/rebalance as we walk back up the tree. - iterator res(iter); - bool first_iteration = true; - for (;;) { - if (iter.node == root()) { - try_shrink(); - if (empty()) { - return end(); - } - break; - } - if (iter.node->count() >= kMinNodeValues) { - break; - } - bool merged = try_merge_or_rebalance(&iter); - // On the first iteration, we should update `res` with `iter` because `res` - // may have been invalidated. - if (first_iteration) { - res = iter; - first_iteration = false; - } - if (!merged) { - break; - } - iter.position = iter.node->position(); - iter.node = iter.node->parent(); - } - - // Adjust our return value. If we're pointing at the end of a node, advance - // the iterator. - if (res.position == res.node->count()) { - res.position = res.node->count() - 1; - ++res; - } - - return res; - } - - template - auto btree

::erase(iterator _begin, iterator _end) - -> std::pair { - difference_type count = std::distance(_begin, _end); - assert(count >= 0); - - if (count == 0) { - return {0, _begin}; - } - - if (count == (difference_type)size_) { - clear(); - return {count, this->end()}; - } - - if (_begin.node == _end.node) { - erase_same_node(_begin, _end); - size_ -= count; - return {count, rebalance_after_delete(_begin)}; - } - - const size_type target_size = size_ - count; - while (size_ > target_size) { - if (_begin.node->leaf()) { - const size_type remaining_to_erase = size_ - target_size; - const size_type remaining_in_node = _begin.node->count() - _begin.position; - _begin = erase_from_leaf_node( - _begin, (std::min)(remaining_to_erase, remaining_in_node)); - } else { - _begin = erase(_begin); - } - } - return {count, _begin}; - } - - template - void btree

::erase_same_node(iterator _begin, iterator _end) { - assert(_begin.node == _end.node); - assert(_end.position > _begin.position); - - node_type *node = _begin.node; - size_type to_erase = _end.position - _begin.position; - if (!node->leaf()) { - // Delete all children between _begin and _end. - for (size_type i = 0; i < to_erase; ++i) { - internal_clear(node->child(_begin.position + i + 1)); - } - // Rotate children after _end into new positions. - for (size_type i = _begin.position + to_erase + 1; i <= node->count(); ++i) { - node->set_child(i - to_erase, node->child(i)); - node->clear_child(i); - } - } - node->remove_values_ignore_children(_begin.position, to_erase, - mutable_allocator()); - - // Do not need to update rightmost_, because - // * either _end == this->end(), and therefore node == rightmost_, and still - // exists - // * or _end != this->end(), and therefore rightmost_ hasn't been erased, since - // it wasn't covered in [_begin, _end) - } - - template - auto btree

::erase_from_leaf_node(iterator _begin, size_type to_erase) - -> iterator { - node_type *node = _begin.node; - assert(node->leaf()); - assert(node->count() > _begin.position); - assert(_begin.position + to_erase <= node->count()); - - node->remove_values_ignore_children(_begin.position, to_erase, - mutable_allocator()); - - size_ -= to_erase; - - return rebalance_after_delete(_begin); - } - - template - template - auto btree

::erase_unique(const K &key) -> size_type { - const iterator iter = internal_find(key); - if (iter.node == nullptr) { - // The key doesn't exist in the tree, return nothing done. - return 0; - } - erase(iter); - return 1; - } - - template - template - auto btree

::erase_multi(const K &key) -> size_type { - const iterator _begin = internal_lower_bound(key); - if (_begin.node == nullptr) { - // The key doesn't exist in the tree, return nothing done. - return 0; - } - // Delete all of the keys between _begin and upper_bound(key). - const iterator _end = internal_end(internal_upper_bound(key)); - return erase(_begin, _end).first; - } - - template - void btree

::clear() { - if (!empty()) { - internal_clear(root()); - } - mutable_root() = EmptyNode(); - rightmost_ = EmptyNode(); - size_ = 0; - } - - template - void btree

::swap(btree &x) { - using std::swap; - if (phmap::allocator_traits< - allocator_type>::propagate_on_container_swap::value) { - // Note: `root_` also contains the allocator and the key comparator. - swap(root_, x.root_); - } else { - // It's undefined behavior if the allocators are unequal here. - assert(allocator() == x.allocator()); - swap(mutable_root(), x.mutable_root()); - swap(*mutable_key_comp(), *x.mutable_key_comp()); - } - swap(rightmost_, x.rightmost_); - swap(size_, x.size_); - } - - template - void btree

::verify() const { - assert(root() != nullptr); - assert(leftmost() != nullptr); - assert(rightmost_ != nullptr); - assert(empty() || size() == internal_verify(root(), nullptr, nullptr)); - assert(leftmost() == (++const_iterator(root(), -1)).node); - assert(rightmost_ == (--const_iterator(root(), root()->count())).node); - assert(leftmost()->leaf()); - assert(rightmost_->leaf()); - } - - template - void btree

::rebalance_or_split(iterator *iter) { - node_type *&node = iter->node; - int &insert_position = iter->position; - assert(node->count() == node->max_count()); - assert(kNodeValues == node->max_count()); - - // First try to make room on the node by rebalancing. - node_type *parent = node->parent(); - if (node != root()) { - if (node->position() > 0) { - // Try rebalancing with our left sibling. - node_type *left = parent->child(node->position() - 1); - assert(left->max_count() == kNodeValues); - if (left->count() < kNodeValues) { - // We bias rebalancing based on the position being inserted. If we're - // inserting at the end of the right node then we bias rebalancing to - // fill up the left node. - int to_move = (kNodeValues - left->count()) / - (1 + (insert_position < kNodeValues)); - to_move = (std::max)(1, to_move); - - if (((insert_position - to_move) >= 0) || - ((left->count() + to_move) < kNodeValues)) { - left->rebalance_right_to_left(to_move, node, mutable_allocator()); - - assert(node->max_count() - node->count() == to_move); - insert_position = insert_position - to_move; - if (insert_position < 0) { - insert_position = insert_position + left->count() + 1; - node = left; - } - - assert(node->count() < node->max_count()); - return; - } - } - } - - if (node->position() < parent->count()) { - // Try rebalancing with our right sibling. - node_type *right = parent->child(node->position() + 1); - assert(right->max_count() == kNodeValues); - if (right->count() < kNodeValues) { - // We bias rebalancing based on the position being inserted. If we're - // inserting at the _beginning of the left node then we bias rebalancing - // to fill up the right node. - int to_move = - (kNodeValues - right->count()) / (1 + (insert_position > 0)); - to_move = (std::max)(1, to_move); - - if ((insert_position <= (node->count() - to_move)) || - ((right->count() + to_move) < kNodeValues)) { - node->rebalance_left_to_right(to_move, right, mutable_allocator()); - - if (insert_position > node->count()) { - insert_position = insert_position - node->count() - 1; - node = right; - } - - assert(node->count() < node->max_count()); - return; - } - } - } - - // Rebalancing failed, make sure there is room on the parent node for a new - // value. - assert(parent->max_count() == kNodeValues); - if (parent->count() == kNodeValues) { - iterator parent_iter(node->parent(), node->position()); - rebalance_or_split(&parent_iter); - } - } else { - // Rebalancing not possible because this is the root node. - // Create a new root node and set the current root node as the child of the - // new root. - parent = new_internal_node(parent); - parent->init_child(0, root()); - mutable_root() = parent; - // If the former root was a leaf node, then it's now the rightmost node. - assert(!parent->child(0)->leaf() || parent->child(0) == rightmost_); - } - - // Split the node. - node_type *split_node; - if (node->leaf()) { - split_node = new_leaf_node(parent); - node->split(insert_position, split_node, mutable_allocator()); - if (rightmost_ == node) rightmost_ = split_node; - } else { - split_node = new_internal_node(parent); - node->split(insert_position, split_node, mutable_allocator()); - } - - if (insert_position > node->count()) { - insert_position = insert_position - node->count() - 1; - node = split_node; - } - } - - template - void btree

::merge_nodes(node_type *left, node_type *right) { - left->merge(right, mutable_allocator()); - if (right->leaf()) { - if (rightmost_ == right) rightmost_ = left; - delete_leaf_node(right); - } else { - delete_internal_node(right); - } - } - - template - bool btree

::try_merge_or_rebalance(iterator *iter) { - node_type *parent = iter->node->parent(); - if (iter->node->position() > 0) { - // Try merging with our left sibling. - node_type *left = parent->child(iter->node->position() - 1); - assert(left->max_count() == kNodeValues); - if ((1 + left->count() + iter->node->count()) <= kNodeValues) { - iter->position += 1 + left->count(); - merge_nodes(left, iter->node); - iter->node = left; - return true; - } - } - if (iter->node->position() < parent->count()) { - // Try merging with our right sibling. - node_type *right = parent->child(iter->node->position() + 1); - assert(right->max_count() == kNodeValues); - if ((1 + iter->node->count() + right->count()) <= kNodeValues) { - merge_nodes(iter->node, right); - return true; - } - // Try rebalancing with our right sibling. We don't perform rebalancing if - // we deleted the first element from iter->node and the node is not - // empty. This is a small optimization for the common pattern of deleting - // from the front of the tree. - if ((right->count() > kMinNodeValues) && - ((iter->node->count() == 0) || - (iter->position > 0))) { - int to_move = (right->count() - iter->node->count()) / 2; - to_move = (std::min)(to_move, right->count() - 1); - iter->node->rebalance_right_to_left(to_move, right, mutable_allocator()); - return false; - } - } - if (iter->node->position() > 0) { - // Try rebalancing with our left sibling. We don't perform rebalancing if - // we deleted the last element from iter->node and the node is not - // empty. This is a small optimization for the common pattern of deleting - // from the back of the tree. - node_type *left = parent->child(iter->node->position() - 1); - if ((left->count() > kMinNodeValues) && - ((iter->node->count() == 0) || - (iter->position < iter->node->count()))) { - int to_move = (left->count() - iter->node->count()) / 2; - to_move = (std::min)(to_move, left->count() - 1); - left->rebalance_left_to_right(to_move, iter->node, mutable_allocator()); - iter->position += to_move; - return false; - } - } - return false; - } - - template - void btree

::try_shrink() { - if (root()->count() > 0) { - return; - } - // Deleted the last item on the root node, shrink the height of the tree. - if (root()->leaf()) { - assert(size() == 0); - delete_leaf_node(root()); - mutable_root() = EmptyNode(); - rightmost_ = EmptyNode(); - } else { - node_type *child = root()->child(0); - child->make_root(); - delete_internal_node(root()); - mutable_root() = child; - } - } - - template - template - inline IterType btree

::internal_last(IterType iter) { - assert(iter.node != nullptr); - while (iter.position == iter.node->count()) { - iter.position = iter.node->position(); - iter.node = iter.node->parent(); - if (iter.node->leaf()) { - iter.node = nullptr; - break; - } - } - return iter; - } - - template - template - inline auto btree

::internal_emplace(iterator iter, Args &&... args) - -> iterator { - if (!iter.node->leaf()) { - // We can't insert on an internal node. Instead, we'll insert after the - // previous value which is guaranteed to be on a leaf node. - --iter; - ++iter.position; - } - const int max_count = iter.node->max_count(); - if (iter.node->count() == max_count) { - // Make room in the leaf for the new item. - if (max_count < kNodeValues) { - // Insertion into the root where the root is smaller than the full node - // size. Simply grow the size of the root node. - assert(iter.node == root()); - iter.node = - new_leaf_root_node((std::min)(kNodeValues, 2 * max_count)); - iter.node->swap(root(), mutable_allocator()); - delete_leaf_node(root()); - mutable_root() = iter.node; - rightmost_ = iter.node; - } else { - rebalance_or_split(&iter); - } - } - iter.node->emplace_value(iter.position, mutable_allocator(), - std::forward(args)...); - ++size_; - return iter; - } - - template - template - inline auto btree

::internal_locate(const K &key) const - -> SearchResult { - return internal_locate_impl(key, is_key_compare_to()); - } - - template - template - inline auto btree

::internal_locate_impl( - const K &key, std::false_type /* IsCompareTo */) const - -> SearchResult { - iterator iter(const_cast(root()), 0); - for (;;) { - iter.position = iter.node->lower_bound(key, key_comp()).value; - // NOTE: we don't need to walk all the way down the tree if the keys are - // equal, but determining equality would require doing an extra comparison - // on each node on the way down, and we will need to go all the way to the - // leaf node in the expected case. - if (iter.node->leaf()) { - break; - } - iter.node = iter.node->child(iter.position); - } - return {iter}; - } - - template - template - inline auto btree

::internal_locate_impl( - const K &key, std::true_type /* IsCompareTo */) const - -> SearchResult { - iterator iter(const_cast(root()), 0); - for (;;) { - SearchResult res = iter.node->lower_bound(key, key_comp()); - iter.position = res.value; - if (res.match == MatchKind::kEq) { - return {iter, MatchKind::kEq}; - } - if (iter.node->leaf()) { - break; - } - iter.node = iter.node->child(iter.position); - } - return {iter, MatchKind::kNe}; - } - - template - template - auto btree

::internal_lower_bound(const K &key) const -> iterator { - iterator iter(const_cast(root()), 0); - for (;;) { - iter.position = iter.node->lower_bound(key, key_comp()).value; - if (iter.node->leaf()) { - break; - } - iter.node = iter.node->child(iter.position); - } - return internal_last(iter); - } - - template - template - auto btree

::internal_upper_bound(const K &key) const -> iterator { - iterator iter(const_cast(root()), 0); - for (;;) { - iter.position = iter.node->upper_bound(key, key_comp()); - if (iter.node->leaf()) { - break; - } - iter.node = iter.node->child(iter.position); - } - return internal_last(iter); - } - - template - template - auto btree

::internal_find(const K &key) const -> iterator { - auto res = internal_locate(key); - if (res.HasMatch()) { - if (res.IsEq()) { - return res.value; - } - } else { - const iterator iter = internal_last(res.value); - if (iter.node != nullptr && !compare_keys(key, iter.key())) { - return iter; - } - } - return {nullptr, 0}; - } - - template - void btree

::internal_clear(node_type *node) { - if (!node->leaf()) { - for (int i = 0; i <= node->count(); ++i) { - internal_clear(node->child(i)); - } - delete_internal_node(node); - } else { - delete_leaf_node(node); - } - } - - template - int btree

::internal_verify( - const node_type *node, const key_type *lo, const key_type *hi) const { - assert(node->count() > 0); - assert(node->count() <= node->max_count()); - if (lo) { - assert(!compare_keys(node->key(0), *lo)); - } - if (hi) { - assert(!compare_keys(*hi, node->key(node->count() - 1))); - } - for (int i = 1; i < node->count(); ++i) { - assert(!compare_keys(node->key(i), node->key(i - 1))); - } - int count = node->count(); - if (!node->leaf()) { - for (int i = 0; i <= node->count(); ++i) { - assert(node->child(i) != nullptr); - assert(node->child(i)->parent() == node); - assert(node->child(i)->position() == i); - count += internal_verify( - node->child(i), - (i == 0) ? lo : &node->key(i - 1), - (i == node->count()) ? hi : &node->key(i)); - } - } - return count; - } - - // A common base class for btree_set, btree_map, btree_multiset, and btree_multimap. - // --------------------------------------------------------------------------------- - template - class btree_container { - using params_type = typename Tree::params_type; - - protected: - // Alias used for heterogeneous lookup functions. - // `key_arg` evaluates to `K` when the functors are transparent and to - // `key_type` otherwise. It permits template argument deduction on `K` for the - // transparent case. - template - using key_arg = - typename KeyArg::value>:: - template type; - - public: - using key_type = typename Tree::key_type; - using value_type = typename Tree::value_type; - using size_type = typename Tree::size_type; - using difference_type = typename Tree::difference_type; - using key_compare = typename Tree::key_compare; - using value_compare = typename Tree::value_compare; - using allocator_type = typename Tree::allocator_type; - using reference = typename Tree::reference; - using const_reference = typename Tree::const_reference; - using pointer = typename Tree::pointer; - using const_pointer = typename Tree::const_pointer; - using iterator = typename Tree::iterator; - using const_iterator = typename Tree::const_iterator; - using reverse_iterator = typename Tree::reverse_iterator; - using const_reverse_iterator = typename Tree::const_reverse_iterator; - using node_type = typename Tree::node_handle_type; - - // Constructors/assignments. - btree_container() : tree_(key_compare(), allocator_type()) {} - explicit btree_container(const key_compare &comp, - const allocator_type &alloc = allocator_type()) - : tree_(comp, alloc) {} - btree_container(const btree_container &x) = default; - btree_container(btree_container &&x) noexcept = default; - btree_container &operator=(const btree_container &x) = default; - btree_container &operator=(btree_container &&x) noexcept( - std::is_nothrow_move_assignable::value) = default; - - // Iterator routines. - iterator begin() { return tree_.begin(); } - const_iterator begin() const { return tree_.begin(); } - const_iterator cbegin() const { return tree_.begin(); } - iterator end() { return tree_.end(); } - const_iterator end() const { return tree_.end(); } - const_iterator cend() const { return tree_.end(); } - reverse_iterator rbegin() { return tree_.rbegin(); } - const_reverse_iterator rbegin() const { return tree_.rbegin(); } - const_reverse_iterator crbegin() const { return tree_.rbegin(); } - reverse_iterator rend() { return tree_.rend(); } - const_reverse_iterator rend() const { return tree_.rend(); } - const_reverse_iterator crend() const { return tree_.rend(); } - - // Lookup routines. - template - iterator find(const key_arg &key) { - return tree_.find(key); - } - template - const_iterator find(const key_arg &key) const { return tree_.find(key); } - - template - bool contains(const key_arg &key) const { return find(key) != end(); } - - template - iterator lower_bound(const key_arg &key) { return tree_.lower_bound(key); } - - template - const_iterator lower_bound(const key_arg &key) const { return tree_.lower_bound(key); } - - template - iterator upper_bound(const key_arg &key) { return tree_.upper_bound(key); } - - template - const_iterator upper_bound(const key_arg &key) const { return tree_.upper_bound(key); } - - template - std::pair equal_range(const key_arg &key) { return tree_.equal_range(key); } - - template - std::pair equal_range( - const key_arg &key) const { - return tree_.equal_range(key); - } - - iterator erase(const_iterator iter) { return tree_.erase(iterator(iter)); } - iterator erase(iterator iter) { return tree_.erase(iter); } - iterator erase(const_iterator first, const_iterator last) { - return tree_.erase(iterator(first), iterator(last)).second; - } - - node_type extract(iterator position) { - // Use Move instead of Transfer, because the rebalancing code expects to - // have a valid object to scribble metadata bits on top of. - auto node = CommonAccess::Move(get_allocator(), position.slot()); - erase(position); - return node; - } - - node_type extract(const_iterator position) { - return extract(iterator(position)); - } - - public: - void clear() { tree_.clear(); } - void swap(btree_container &x) { tree_.swap(x.tree_); } - void verify() const { tree_.verify(); } - - size_type size() const { return tree_.size(); } - size_type max_size() const { return tree_.max_size(); } - bool empty() const { return tree_.empty(); } - - friend bool operator==(const btree_container &x, const btree_container &y) { - if (x.size() != y.size()) return false; - return std::equal(x.begin(), x.end(), y.begin()); - } - - friend bool operator!=(const btree_container &x, const btree_container &y) { return !(x == y); } - - friend bool operator<(const btree_container &x, const btree_container &y) { - return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end()); - } - - friend bool operator>(const btree_container &x, const btree_container &y) { return y < x; } - - friend bool operator<=(const btree_container &x, const btree_container &y) { return !(y < x); } - - friend bool operator>=(const btree_container &x, const btree_container &y) { return !(x < y); } - - // The allocator used by the btree. - allocator_type get_allocator() const { return tree_.get_allocator(); } - - // The key comparator used by the btree. - key_compare key_comp() const { return tree_.key_comp(); } - value_compare value_comp() const { return tree_.value_comp(); } - - // Support absl::Hash. - template - friend State AbslHashValue(State h, const btree_container &b) { - for (const auto &v : b) { - h = State::combine(std::move(h), v); - } - return State::combine(std::move(h), b.size()); - } - - protected: - Tree tree_; - }; - - // A common base class for btree_set and btree_map. - // ----------------------------------------------- - template - class btree_set_container : public btree_container { - using super_type = btree_container; - using params_type = typename Tree::params_type; - using init_type = typename params_type::init_type; - using is_key_compare_to = typename params_type::is_key_compare_to; - friend class BtreeNodePeer; - - protected: - template - using key_arg = typename super_type::template key_arg; - - public: - using key_type = typename Tree::key_type; - using value_type = typename Tree::value_type; - using size_type = typename Tree::size_type; - using key_compare = typename Tree::key_compare; - using allocator_type = typename Tree::allocator_type; - using iterator = typename Tree::iterator; - using const_iterator = typename Tree::const_iterator; - using node_type = typename super_type::node_type; - using insert_return_type = InsertReturnType; - using super_type::super_type; - btree_set_container() {} - - template - btree_set_container(InputIterator b, InputIterator e, - const key_compare &comp = key_compare(), - const allocator_type &alloc = allocator_type()) - : super_type(comp, alloc) { - insert(b, e); - } - - btree_set_container(std::initializer_list init, - const key_compare &comp = key_compare(), - const allocator_type &alloc = allocator_type()) - : btree_set_container(init.begin(), init.end(), comp, alloc) {} - - // Lookup routines. - template - size_type count(const key_arg &key) const { - return this->tree_.count_unique(key); - } - - // Insertion routines. - std::pair insert(const value_type &x) { - return this->tree_.insert_unique(params_type::key(x), x); - } - std::pair insert(value_type &&x) { - return this->tree_.insert_unique(params_type::key(x), std::move(x)); - } - template - std::pair emplace(Args &&... args) { - init_type v(std::forward(args)...); - return this->tree_.insert_unique(params_type::key(v), std::move(v)); - } - iterator insert(const_iterator position, const value_type &x) { - return this->tree_ - .insert_hint_unique(iterator(position), params_type::key(x), x) - .first; - } - iterator insert(const_iterator position, value_type &&x) { - return this->tree_ - .insert_hint_unique(iterator(position), params_type::key(x), - std::move(x)) - .first; - } - - template - iterator emplace_hint(const_iterator position, Args &&... args) { - init_type v(std::forward(args)...); - return this->tree_ - .insert_hint_unique(iterator(position), params_type::key(v), - std::move(v)) - .first; - } - - template - void insert(InputIterator b, InputIterator e) { - this->tree_.insert_iterator_unique(b, e); - } - - void insert(std::initializer_list init) { - this->tree_.insert_iterator_unique(init.begin(), init.end()); - } - - insert_return_type insert(node_type &&node) { - if (!node) return {this->end(), false, node_type()}; - std::pair res = - this->tree_.insert_unique(params_type::key(CommonAccess::GetSlot(node)), - CommonAccess::GetSlot(node)); - if (res.second) { - CommonAccess::Destroy(&node); - return {res.first, true, node_type()}; - } else { - return {res.first, false, std::move(node)}; - } - } - - iterator insert(const_iterator hint, node_type &&node) { - if (!node) return this->end(); - std::pair res = this->tree_.insert_hint_unique( - iterator(hint), params_type::key(CommonAccess::GetSlot(node)), - CommonAccess::GetSlot(node)); - if (res.second) CommonAccess::Destroy(&node); - return res.first; - } - - template - size_type erase(const key_arg &key) { return this->tree_.erase_unique(key); } - using super_type::erase; - - template - node_type extract(const key_arg &key) { - auto it = this->find(key); - return it == this->end() ? node_type() : extract(it); - } - - using super_type::extract; - - // Merge routines. - // Moves elements from `src` into `this`. If the element already exists in - // `this`, it is left unmodified in `src`. - template < - typename T, - typename phmap::enable_if_t< - phmap::conjunction< - std::is_same, - std::is_same, - std::is_same>::value, - int> = 0> - void merge(btree_container &src) { // NOLINT - for (auto src_it = src.begin(); src_it != src.end();) { - if (insert(std::move(*src_it)).second) { - src_it = src.erase(src_it); - } else { - ++src_it; - } - } - } - - template < - typename T, - typename phmap::enable_if_t< - phmap::conjunction< - std::is_same, - std::is_same, - std::is_same>::value, - int> = 0> - void merge(btree_container &&src) { - merge(src); - } - }; - - // Base class for btree_map. - // ------------------------- - template - class btree_map_container : public btree_set_container { - using super_type = btree_set_container; - using params_type = typename Tree::params_type; - - protected: - template - using key_arg = typename super_type::template key_arg; - - public: - using key_type = typename Tree::key_type; - using mapped_type = typename params_type::mapped_type; - using value_type = typename Tree::value_type; - using key_compare = typename Tree::key_compare; - using allocator_type = typename Tree::allocator_type; - using iterator = typename Tree::iterator; - using const_iterator = typename Tree::const_iterator; - - // Inherit constructors. - using super_type::super_type; - btree_map_container() {} - - // Insertion routines. - template - std::pair try_emplace(const key_type &k, Args &&... args) { - return this->tree_.insert_unique( - k, std::piecewise_construct, std::forward_as_tuple(k), - std::forward_as_tuple(std::forward(args)...)); - } - template - std::pair try_emplace(key_type &&k, Args &&... args) { - // Note: `key_ref` exists to avoid a ClangTidy warning about moving from `k` - // and then using `k` unsequenced. This is safe because the move is into a - // forwarding reference and insert_unique guarantees that `key` is never - // referenced after consuming `args`. - const key_type& key_ref = k; - return this->tree_.insert_unique( - key_ref, std::piecewise_construct, std::forward_as_tuple(std::move(k)), - std::forward_as_tuple(std::forward(args)...)); - } - template - iterator try_emplace(const_iterator hint, const key_type &k, - Args &&... args) { - return this->tree_ - .insert_hint_unique(iterator(hint), k, std::piecewise_construct, - std::forward_as_tuple(k), - std::forward_as_tuple(std::forward(args)...)) - .first; - } - template - iterator try_emplace(const_iterator hint, key_type &&k, Args &&... args) { - // Note: `key_ref` exists to avoid a ClangTidy warning about moving from `k` - // and then using `k` unsequenced. This is safe because the move is into a - // forwarding reference and insert_hint_unique guarantees that `key` is - // never referenced after consuming `args`. - const key_type& key_ref = k; - return this->tree_ - .insert_hint_unique(iterator(hint), key_ref, std::piecewise_construct, - std::forward_as_tuple(std::move(k)), - std::forward_as_tuple(std::forward(args)...)) - .first; - } - mapped_type &operator[](const key_type &k) { - return try_emplace(k).first->second; - } - mapped_type &operator[](key_type &&k) { - return try_emplace(std::move(k)).first->second; - } - - template - mapped_type &at(const key_arg &key) { - auto it = this->find(key); - if (it == this->end()) - base_internal::ThrowStdOutOfRange("phmap::btree_map::at"); - return it->second; - } - template - const mapped_type &at(const key_arg &key) const { - auto it = this->find(key); - if (it == this->end()) - base_internal::ThrowStdOutOfRange("phmap::btree_map::at"); - return it->second; - } - }; - - // A common base class for btree_multiset and btree_multimap. - template - class btree_multiset_container : public btree_container { - using super_type = btree_container; - using params_type = typename Tree::params_type; - using init_type = typename params_type::init_type; - using is_key_compare_to = typename params_type::is_key_compare_to; - - template - using key_arg = typename super_type::template key_arg; - - public: - using key_type = typename Tree::key_type; - using value_type = typename Tree::value_type; - using size_type = typename Tree::size_type; - using key_compare = typename Tree::key_compare; - using allocator_type = typename Tree::allocator_type; - using iterator = typename Tree::iterator; - using const_iterator = typename Tree::const_iterator; - using node_type = typename super_type::node_type; - - // Inherit constructors. - using super_type::super_type; - btree_multiset_container() {} - - // Range constructor. - template - btree_multiset_container(InputIterator b, InputIterator e, - const key_compare &comp = key_compare(), - const allocator_type &alloc = allocator_type()) - : super_type(comp, alloc) { - insert(b, e); - } - - // Initializer list constructor. - btree_multiset_container(std::initializer_list init, - const key_compare &comp = key_compare(), - const allocator_type &alloc = allocator_type()) - : btree_multiset_container(init.begin(), init.end(), comp, alloc) {} - - // Lookup routines. - template - size_type count(const key_arg &key) const { - return this->tree_.count_multi(key); - } - - // Insertion routines. - iterator insert(const value_type &x) { return this->tree_.insert_multi(x); } - iterator insert(value_type &&x) { - return this->tree_.insert_multi(std::move(x)); - } - iterator insert(const_iterator position, const value_type &x) { - return this->tree_.insert_hint_multi(iterator(position), x); - } - iterator insert(const_iterator position, value_type &&x) { - return this->tree_.insert_hint_multi(iterator(position), std::move(x)); - } - template - void insert(InputIterator b, InputIterator e) { - this->tree_.insert_iterator_multi(b, e); - } - void insert(std::initializer_list init) { - this->tree_.insert_iterator_multi(init.begin(), init.end()); - } - template - iterator emplace(Args &&... args) { - return this->tree_.insert_multi(init_type(std::forward(args)...)); - } - template - iterator emplace_hint(const_iterator position, Args &&... args) { - return this->tree_.insert_hint_multi( - iterator(position), init_type(std::forward(args)...)); - } - iterator insert(node_type &&node) { - if (!node) return this->end(); - iterator res = - this->tree_.insert_multi(params_type::key(CommonAccess::GetSlot(node)), - CommonAccess::GetSlot(node)); - CommonAccess::Destroy(&node); - return res; - } - iterator insert(const_iterator hint, node_type &&node) { - if (!node) return this->end(); - iterator res = this->tree_.insert_hint_multi( - iterator(hint), - std::move(params_type::element(CommonAccess::GetSlot(node)))); - CommonAccess::Destroy(&node); - return res; - } - - // Deletion routines. - template - size_type erase(const key_arg &key) { - return this->tree_.erase_multi(key); - } - using super_type::erase; - - // Node extraction routines. - template - node_type extract(const key_arg &key) { - auto it = this->find(key); - return it == this->end() ? node_type() : extract(it); - } - using super_type::extract; - - // Merge routines. - // Moves all elements from `src` into `this`. - template < - typename T, - typename phmap::enable_if_t< - phmap::conjunction< - std::is_same, - std::is_same, - std::is_same>::value, - int> = 0> - void merge(btree_container &src) { // NOLINT - insert(std::make_move_iterator(src.begin()), - std::make_move_iterator(src.end())); - src.clear(); - } - - template < - typename T, - typename phmap::enable_if_t< - phmap::conjunction< - std::is_same, - std::is_same, - std::is_same>::value, - int> = 0> - void merge(btree_container &&src) { - merge(src); - } - }; - - // A base class for btree_multimap. - template - class btree_multimap_container : public btree_multiset_container { - using super_type = btree_multiset_container; - using params_type = typename Tree::params_type; - - public: - using mapped_type = typename params_type::mapped_type; - - // Inherit constructors. - using super_type::super_type; - btree_multimap_container() {} - }; - -} // namespace priv - - - - // ---------------------------------------------------------------------- - // btree_set - default values in phmap_fwd_decl.h - // ---------------------------------------------------------------------- - template - class btree_set : public priv::btree_set_container< - priv::btree>> - { - using Base = typename btree_set::btree_set_container; - - public: - btree_set() {} - using Base::Base; - using Base::begin; - using Base::cbegin; - using Base::end; - using Base::cend; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::emplace; - using Base::emplace_hint; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::get_allocator; - using Base::key_comp; - using Base::value_comp; - }; - - // Swaps the contents of two `phmap::btree_set` containers. - // ------------------------------------------------------- - template - void swap(btree_set &x, btree_set &y) { - return x.swap(y); - } - - // Erases all elements that satisfy the predicate pred from the container. - // ---------------------------------------------------------------------- - template - void erase_if(btree_set &set, Pred pred) { - for (auto it = set.begin(); it != set.end();) { - if (pred(*it)) { - it = set.erase(it); - } else { - ++it; - } - } - } - - // ---------------------------------------------------------------------- - // btree_multiset - default values in phmap_fwd_decl.h - // ---------------------------------------------------------------------- - template - class btree_multiset : public priv::btree_multiset_container< - priv::btree>> - { - using Base = typename btree_multiset::btree_multiset_container; - - public: - btree_multiset() {} - using Base::Base; - using Base::begin; - using Base::cbegin; - using Base::end; - using Base::cend; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::emplace; - using Base::emplace_hint; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::get_allocator; - using Base::key_comp; - using Base::value_comp; - }; - - // Swaps the contents of two `phmap::btree_multiset` containers. - // ------------------------------------------------------------ - template - void swap(btree_multiset &x, btree_multiset &y) { - return x.swap(y); - } - - // Erases all elements that satisfy the predicate pred from the container. - // ---------------------------------------------------------------------- - template - void erase_if(btree_multiset &set, Pred pred) { - for (auto it = set.begin(); it != set.end();) { - if (pred(*it)) { - it = set.erase(it); - } else { - ++it; - } - } - } - - - // ---------------------------------------------------------------------- - // btree_map - default values in phmap_fwd_decl.h - // ---------------------------------------------------------------------- - template - class btree_map : public priv::btree_map_container< - priv::btree>> - { - using Base = typename btree_map::btree_map_container; - - public: - btree_map() {} - using Base::Base; - using Base::begin; - using Base::cbegin; - using Base::end; - using Base::cend; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::emplace; - using Base::emplace_hint; - using Base::try_emplace; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::at; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::operator[]; - using Base::get_allocator; - using Base::key_comp; - using Base::value_comp; - }; - - // Swaps the contents of two `phmap::btree_map` containers. - // ------------------------------------------------------- - template - void swap(btree_map &x, btree_map &y) { - return x.swap(y); - } - - // ---------------------------------------------------------------------- - template - void erase_if(btree_map &map, Pred pred) { - for (auto it = map.begin(); it != map.end();) { - if (pred(*it)) { - it = map.erase(it); - } else { - ++it; - } - } - } - - // ---------------------------------------------------------------------- - // btree_multimap - default values in phmap_fwd_decl.h - // ---------------------------------------------------------------------- - template - class btree_multimap : public priv::btree_multimap_container< - priv::btree>> - { - using Base = typename btree_multimap::btree_multimap_container; - - public: - btree_multimap() {} - using Base::Base; - using Base::begin; - using Base::cbegin; - using Base::end; - using Base::cend; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::emplace; - using Base::emplace_hint; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::get_allocator; - using Base::key_comp; - using Base::value_comp; - }; - - // Swaps the contents of two `phmap::btree_multimap` containers. - // ------------------------------------------------------------ - template - void swap(btree_multimap &x, btree_multimap &y) { - return x.swap(y); - } - - // Erases all elements that satisfy the predicate pred from the container. - // ---------------------------------------------------------------------- - template - void erase_if(btree_multimap &map, Pred pred) { - for (auto it = map.begin(); it != map.end();) { - if (pred(*it)) { - it = map.erase(it); - } else { - ++it; - } - } - } - - -} // namespace btree - -#ifdef _MSC_VER - #pragma warning(pop) -#endif - - -#endif // PHMAP_BTREE_BTREE_CONTAINER_H_ diff --git a/extern/phmap/parallel_hashmap/conanfile.py b/extern/phmap/parallel_hashmap/conanfile.py deleted file mode 100644 index c046377..0000000 --- a/extern/phmap/parallel_hashmap/conanfile.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from conans import ConanFile, tools -import os - -class SparseppConan(ConanFile): - name = "parallel_hashmap" - version = "1.27" - description = "A header-only, very fast and memory-friendly hash map" - - # Indicates License type of the packaged library - license = "https://github.com/greg7mdp/parallel-hashmap/blob/master/LICENSE" - - # Packages the license for the conanfile.py - exports = ["LICENSE"] - - # Custom attributes for Bincrafters recipe conventions - source_subfolder = "source_subfolder" - - def source(self): - source_url = "https://github.com/greg7mdp/parallel-hashmap" - tools.get("{0}/archive/{1}.tar.gz".format(source_url, self.version)) - extracted_dir = self.name + "-" + self.version - - #Rename to "source_folder" is a convention to simplify later steps - os.rename(extracted_dir, self.source_subfolder) - - - def package(self): - include_folder = os.path.join(self.source_subfolder, "parallel_hashmap") - self.copy(pattern="LICENSE") - self.copy(pattern="*", dst="include/parallel_hashmap", src=include_folder) - - def package_id(self): - self.info.header_only() diff --git a/extern/phmap/parallel_hashmap/meminfo.h b/extern/phmap/parallel_hashmap/meminfo.h deleted file mode 100644 index 872f3c6..0000000 --- a/extern/phmap/parallel_hashmap/meminfo.h +++ /dev/null @@ -1,195 +0,0 @@ -#if !defined(spp_memory_h_guard) -#define spp_memory_h_guard - -#include -#include -#include - -#if defined(_WIN32) || defined( __CYGWIN__) - #define SPP_WIN -#endif - -#ifdef SPP_WIN - #include - #include - #undef min - #undef max -#elif defined(__linux__) - #include - #include -#elif defined(__FreeBSD__) - #include - #include - #include - #include - #include - #include -#endif - -namespace spp -{ - uint64_t GetSystemMemory(); - uint64_t GetTotalMemoryUsed(); - uint64_t GetProcessMemoryUsed(); - uint64_t GetPhysicalMemory(); - - uint64_t GetSystemMemory() - { -#ifdef SPP_WIN - MEMORYSTATUSEX memInfo; - memInfo.dwLength = sizeof(MEMORYSTATUSEX); - GlobalMemoryStatusEx(&memInfo); - return static_cast(memInfo.ullTotalPageFile); -#elif defined(__linux__) - struct sysinfo memInfo; - sysinfo (&memInfo); - auto totalVirtualMem = memInfo.totalram; - - totalVirtualMem += memInfo.totalswap; - totalVirtualMem *= memInfo.mem_unit; - return static_cast(totalVirtualMem); -#elif defined(__FreeBSD__) - kvm_t *kd; - u_int pageCnt; - size_t pageCntLen = sizeof(pageCnt); - u_int pageSize; - struct kvm_swap kswap; - uint64_t totalVirtualMem; - - pageSize = static_cast(getpagesize()); - - sysctlbyname("vm.stats.vm.v_page_count", &pageCnt, &pageCntLen, NULL, 0); - totalVirtualMem = pageCnt * pageSize; - - kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open"); - kvm_getswapinfo(kd, &kswap, 1, 0); - kvm_close(kd); - totalVirtualMem += kswap.ksw_total * pageSize; - - return totalVirtualMem; -#else - return 0; -#endif - } - - uint64_t GetTotalMemoryUsed() - { -#ifdef SPP_WIN - MEMORYSTATUSEX memInfo; - memInfo.dwLength = sizeof(MEMORYSTATUSEX); - GlobalMemoryStatusEx(&memInfo); - return static_cast(memInfo.ullTotalPageFile - memInfo.ullAvailPageFile); -#elif defined(__linux__) - struct sysinfo memInfo; - sysinfo(&memInfo); - auto virtualMemUsed = memInfo.totalram - memInfo.freeram; - - virtualMemUsed += memInfo.totalswap - memInfo.freeswap; - virtualMemUsed *= memInfo.mem_unit; - - return static_cast(virtualMemUsed); -#elif defined(__FreeBSD__) - kvm_t *kd; - u_int pageSize; - u_int pageCnt, freeCnt; - size_t pageCntLen = sizeof(pageCnt); - size_t freeCntLen = sizeof(freeCnt); - struct kvm_swap kswap; - uint64_t virtualMemUsed; - - pageSize = static_cast(getpagesize()); - - sysctlbyname("vm.stats.vm.v_page_count", &pageCnt, &pageCntLen, NULL, 0); - sysctlbyname("vm.stats.vm.v_free_count", &freeCnt, &freeCntLen, NULL, 0); - virtualMemUsed = (pageCnt - freeCnt) * pageSize; - - kd = kvm_open(NULL, _PATH_DEVNULL, NULL, O_RDONLY, "kvm_open"); - kvm_getswapinfo(kd, &kswap, 1, 0); - kvm_close(kd); - virtualMemUsed += kswap.ksw_used * pageSize; - - return virtualMemUsed; -#else - return 0; -#endif - } - - uint64_t GetProcessMemoryUsed() - { -#ifdef SPP_WIN - PROCESS_MEMORY_COUNTERS_EX pmc; - GetProcessMemoryInfo(GetCurrentProcess(), reinterpret_cast(&pmc), sizeof(pmc)); - return static_cast(pmc.PrivateUsage); -#elif defined(__linux__) - auto parseLine = - [](char* line)->int - { - auto i = strlen(line); - - while(*line < '0' || *line > '9') - { - line++; - } - - line[i-3] = '\0'; - i = atoi(line); - return i; - }; - - auto file = fopen("/proc/self/status", "r"); - auto result = -1; - char line[128]; - - while(fgets(line, 128, file) != nullptr) - { - if(strncmp(line, "VmSize:", 7) == 0) - { - result = parseLine(line); - break; - } - } - - fclose(file); - return static_cast(result) * 1024; -#elif defined(__FreeBSD__) - struct kinfo_proc info; - size_t infoLen = sizeof(info); - int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid() }; - - sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &infoLen, NULL, 0); - return static_cast(info.ki_rssize * getpagesize()); -#else - return 0; -#endif - } - - uint64_t GetPhysicalMemory() - { -#ifdef SPP_WIN - MEMORYSTATUSEX memInfo; - memInfo.dwLength = sizeof(MEMORYSTATUSEX); - GlobalMemoryStatusEx(&memInfo); - return static_cast(memInfo.ullTotalPhys); -#elif defined(__linux__) - struct sysinfo memInfo; - sysinfo(&memInfo); - - auto totalPhysMem = memInfo.totalram; - - totalPhysMem *= memInfo.mem_unit; - return static_cast(totalPhysMem); -#elif defined(__FreeBSD__) - u_long physMem; - size_t physMemLen = sizeof(physMem); - int mib[] = { CTL_HW, HW_PHYSMEM }; - - sysctl(mib, sizeof(mib) / sizeof(*mib), &physMem, &physMemLen, NULL, 0); - return physMem; -#else - return 0; -#endif - } - -} - -#endif // spp_memory_h_guard diff --git a/extern/phmap/parallel_hashmap/phmap.h b/extern/phmap/parallel_hashmap/phmap.h deleted file mode 100644 index f8de239..0000000 --- a/extern/phmap/parallel_hashmap/phmap.h +++ /dev/null @@ -1,4812 +0,0 @@ -#if !defined(phmap_h_guard_) -#define phmap_h_guard_ - -// --------------------------------------------------------------------------- -// Copyright (c) 2019, Gregory Popovitch - greg7mdp@gmail.com -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Includes work from abseil-cpp (https://github.com/abseil/abseil-cpp) -// with modifications. -// -// Copyright 2018 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// --------------------------------------------------------------------------- - -#ifdef _MSC_VER - #pragma warning(push) - - #pragma warning(disable : 4127) // conditional expression is constant - #pragma warning(disable : 4324) // structure was padded due to alignment specifier - #pragma warning(disable : 4514) // unreferenced inline function has been removed - #pragma warning(disable : 4623) // default constructor was implicitly defined as deleted - #pragma warning(disable : 4625) // copy constructor was implicitly defined as deleted - #pragma warning(disable : 4626) // assignment operator was implicitly defined as deleted - #pragma warning(disable : 4710) // function not inlined - #pragma warning(disable : 4711) // selected for automatic inline expansion - #pragma warning(disable : 4820) // '6' bytes padding added after data member - #pragma warning(disable : 4868) // compiler may not enforce left-to-right evaluation order in braced initializer list - #pragma warning(disable : 5027) // move assignment operator was implicitly defined as deleted - #pragma warning(disable : 5045) // Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "phmap_fwd_decl.h" -#include "phmap_utils.h" -#include "phmap_base.h" - -#if PHMAP_HAVE_STD_STRING_VIEW - #include -#endif - -namespace phmap { - -namespace priv { - -// -------------------------------------------------------------------------- -template -class probe_seq -{ -public: - probe_seq(size_t hashval, size_t mask) { - assert(((mask + 1) & mask) == 0 && "not a mask"); - mask_ = mask; - offset_ = hashval & mask_; - } - size_t offset() const { return offset_; } - size_t offset(size_t i) const { return (offset_ + i) & mask_; } - - void next() { - index_ += Width; - offset_ += index_; - offset_ &= mask_; - } - // 0-based probe index. The i-th probe in the probe sequence. - size_t getindex() const { return index_; } - -private: - size_t mask_; - size_t offset_; - size_t index_ = 0; -}; - -// -------------------------------------------------------------------------- -template -struct RequireUsableKey -{ - template - std::pair< - decltype(std::declval()(std::declval())), - decltype(std::declval()(std::declval(), - std::declval()))>* - operator()(const PassedKey&, const Args&...) const; -}; - -// -------------------------------------------------------------------------- -template -struct IsDecomposable : std::false_type {}; - -template -struct IsDecomposable< - phmap::void_t(), - std::declval()...))>, - Policy, Hash, Eq, Ts...> : std::true_type {}; - -// TODO(alkis): Switch to std::is_nothrow_swappable when gcc/clang supports it. -// -------------------------------------------------------------------------- -template -constexpr bool IsNoThrowSwappable() { - using std::swap; - return noexcept(swap(std::declval(), std::declval())); -} - -// -------------------------------------------------------------------------- -template -int TrailingZeros(T x) { - PHMAP_IF_CONSTEXPR(sizeof(T) == 8) - return base_internal::CountTrailingZerosNonZero64(static_cast(x)); - else - return base_internal::CountTrailingZerosNonZero32(static_cast(x)); -} - -// -------------------------------------------------------------------------- -template -int LeadingZeros(T x) { - PHMAP_IF_CONSTEXPR(sizeof(T) == 8) - return base_internal::CountLeadingZeros64(static_cast(x)); - else - return base_internal::CountLeadingZeros32(static_cast(x)); -} - -// -------------------------------------------------------------------------- -// An abstraction over a bitmask. It provides an easy way to iterate through the -// indexes of the set bits of a bitmask. When Shift=0 (platforms with SSE), -// this is a true bitmask. On non-SSE, platforms the arithematic used to -// emulate the SSE behavior works in bytes (Shift=3) and leaves each bytes as -// either 0x00 or 0x80. -// -// For example: -// for (int i : BitMask(0x5)) -> yields 0, 2 -// for (int i : BitMask(0x0000000080800000)) -> yields 2, 3 -// -------------------------------------------------------------------------- -template -class BitMask -{ - static_assert(std::is_unsigned::value, ""); - static_assert(Shift == 0 || Shift == 3, ""); - -public: - // These are useful for unit tests (gunit). - using value_type = int; - using iterator = BitMask; - using const_iterator = BitMask; - - explicit BitMask(T mask) : mask_(mask) {} - BitMask& operator++() { - mask_ &= (mask_ - 1); - return *this; - } - explicit operator bool() const { return mask_ != 0; } - int operator*() const { return LowestBitSet(); } - int LowestBitSet() const { - return priv::TrailingZeros(mask_) >> Shift; - } - int HighestBitSet() const { - return (sizeof(T) * CHAR_BIT - priv::LeadingZeros(mask_) - - 1) >> - Shift; - } - - BitMask begin() const { return *this; } - BitMask end() const { return BitMask(0); } - - int TrailingZeros() const { - return priv::TrailingZeros(mask_) >> Shift; - } - - int LeadingZeros() const { - constexpr int total_significant_bits = SignificantBits << Shift; - constexpr int extra_bits = sizeof(T) * 8 - total_significant_bits; - return priv::LeadingZeros(mask_ << extra_bits) >> Shift; - } - -private: - friend bool operator==(const BitMask& a, const BitMask& b) { - return a.mask_ == b.mask_; - } - friend bool operator!=(const BitMask& a, const BitMask& b) { - return a.mask_ != b.mask_; - } - - T mask_; -}; - -// -------------------------------------------------------------------------- -using ctrl_t = signed char; -using h2_t = uint8_t; - -// -------------------------------------------------------------------------- -// The values here are selected for maximum performance. See the static asserts -// below for details. -// -------------------------------------------------------------------------- -enum Ctrl : ctrl_t -{ - kEmpty = -128, // 0b10000000 - kDeleted = -2, // 0b11111110 - kSentinel = -1, // 0b11111111 -}; - -static_assert( - kEmpty & kDeleted & kSentinel & 0x80, - "Special markers need to have the MSB to make checking for them efficient"); -static_assert(kEmpty < kSentinel && kDeleted < kSentinel, - "kEmpty and kDeleted must be smaller than kSentinel to make the " - "SIMD test of IsEmptyOrDeleted() efficient"); -static_assert(kSentinel == -1, - "kSentinel must be -1 to elide loading it from memory into SIMD " - "registers (pcmpeqd xmm, xmm)"); -static_assert(kEmpty == -128, - "kEmpty must be -128 to make the SIMD check for its " - "existence efficient (psignb xmm, xmm)"); -static_assert(~kEmpty & ~kDeleted & kSentinel & 0x7F, - "kEmpty and kDeleted must share an unset bit that is not shared " - "by kSentinel to make the scalar test for MatchEmptyOrDeleted() " - "efficient"); -static_assert(kDeleted == -2, - "kDeleted must be -2 to make the implementation of " - "ConvertSpecialToEmptyAndFullToDeleted efficient"); - -// -------------------------------------------------------------------------- -// A single block of empty control bytes for tables without any slots allocated. -// This enables removing a branch in the hot path of find(). -// -------------------------------------------------------------------------- -inline ctrl_t* EmptyGroup() { - alignas(16) static constexpr ctrl_t empty_group[] = { - kSentinel, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, - kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty, kEmpty}; - return const_cast(empty_group); -} - -// -------------------------------------------------------------------------- -inline size_t HashSeed(const ctrl_t* ctrl) { - // The low bits of the pointer have little or no entropy because of - // alignment. We shift the pointer to try to use higher entropy bits. A - // good number seems to be 12 bits, because that aligns with page size. - return reinterpret_cast(ctrl) >> 12; -} - -#ifdef PHMAP_NON_DETERMINISTIC - -inline size_t H1(size_t hashval, const ctrl_t* ctrl) { - // use ctrl_ pointer to add entropy to ensure - // non-deterministic iteration order. - return (hashval >> 7) ^ HashSeed(ctrl); -} - -#else - -inline size_t H1(size_t hashval, const ctrl_t* ) { - return (hashval >> 7); -} - -#endif - - -inline ctrl_t H2(size_t hashval) { return (ctrl_t)(hashval & 0x7F); } - -inline bool IsEmpty(ctrl_t c) { return c == kEmpty; } -inline bool IsFull(ctrl_t c) { return c >= 0; } -inline bool IsDeleted(ctrl_t c) { return c == kDeleted; } -inline bool IsEmptyOrDeleted(ctrl_t c) { return c < kSentinel; } - -#if PHMAP_HAVE_SSE2 - -#ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable : 4365) // conversion from 'int' to 'T', signed/unsigned mismatch -#endif - -// -------------------------------------------------------------------------- -// https://github.com/abseil/abseil-cpp/issues/209 -// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87853 -// _mm_cmpgt_epi8 is broken under GCC with -funsigned-char -// Work around this by using the portable implementation of Group -// when using -funsigned-char under GCC. -// -------------------------------------------------------------------------- -inline __m128i _mm_cmpgt_epi8_fixed(__m128i a, __m128i b) { -#if defined(__GNUC__) && !defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Woverflow" - - if (std::is_unsigned::value) { - const __m128i mask = _mm_set1_epi8(static_cast(0x80)); - const __m128i diff = _mm_subs_epi8(b, a); - return _mm_cmpeq_epi8(_mm_and_si128(diff, mask), mask); - } - - #pragma GCC diagnostic pop -#endif - return _mm_cmpgt_epi8(a, b); -} - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -struct GroupSse2Impl -{ - enum { kWidth = 16 }; // the number of slots per group - - explicit GroupSse2Impl(const ctrl_t* pos) { - ctrl = _mm_loadu_si128(reinterpret_cast(pos)); - } - - // Returns a bitmask representing the positions of slots that match hash. - // ---------------------------------------------------------------------- - BitMask Match(h2_t hash) const { - auto match = _mm_set1_epi8((char)hash); - return BitMask( - _mm_movemask_epi8(_mm_cmpeq_epi8(match, ctrl))); - } - - // Returns a bitmask representing the positions of empty slots. - // ------------------------------------------------------------ - BitMask MatchEmpty() const { -#if PHMAP_HAVE_SSSE3 - // This only works because kEmpty is -128. - return BitMask( - _mm_movemask_epi8(_mm_sign_epi8(ctrl, ctrl))); -#else - return Match(static_cast(kEmpty)); -#endif - } - - // Returns a bitmask representing the positions of empty or deleted slots. - // ----------------------------------------------------------------------- - BitMask MatchEmptyOrDeleted() const { - auto special = _mm_set1_epi8(kSentinel); - return BitMask( - _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl))); - } - - // Returns the number of trailing empty or deleted elements in the group. - // ---------------------------------------------------------------------- - uint32_t CountLeadingEmptyOrDeleted() const { - auto special = _mm_set1_epi8(kSentinel); - return TrailingZeros( - _mm_movemask_epi8(_mm_cmpgt_epi8_fixed(special, ctrl)) + 1); - } - - // ---------------------------------------------------------------------- - void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const { - auto msbs = _mm_set1_epi8(static_cast(-128)); - auto x126 = _mm_set1_epi8(126); -#if PHMAP_HAVE_SSSE3 - auto res = _mm_or_si128(_mm_shuffle_epi8(x126, ctrl), msbs); -#else - auto zero = _mm_setzero_si128(); - auto special_mask = _mm_cmpgt_epi8_fixed(zero, ctrl); - auto res = _mm_or_si128(msbs, _mm_andnot_si128(special_mask, x126)); -#endif - _mm_storeu_si128(reinterpret_cast<__m128i*>(dst), res); - } - - __m128i ctrl; -}; - -#ifdef _MSC_VER - #pragma warning(pop) -#endif - -#endif // PHMAP_HAVE_SSE2 - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -struct GroupPortableImpl -{ - enum { kWidth = 8 }; - - explicit GroupPortableImpl(const ctrl_t* pos) - : ctrl(little_endian::Load64(pos)) {} - - BitMask Match(h2_t hash) const { - // For the technique, see: - // http://graphics.stanford.edu/~seander/bithacks.html##ValueInWord - // (Determine if a word has a byte equal to n). - // - // Caveat: there are false positives but: - // - they only occur if there is a real match - // - they never occur on kEmpty, kDeleted, kSentinel - // - they will be handled gracefully by subsequent checks in code - // - // Example: - // v = 0x1716151413121110 - // hash = 0x12 - // retval = (v - lsbs) & ~v & msbs = 0x0000000080800000 - constexpr uint64_t msbs = 0x8080808080808080ULL; - constexpr uint64_t lsbs = 0x0101010101010101ULL; - auto x = ctrl ^ (lsbs * hash); - return BitMask((x - lsbs) & ~x & msbs); - } - - BitMask MatchEmpty() const { - constexpr uint64_t msbs = 0x8080808080808080ULL; - return BitMask((ctrl & (~ctrl << 6)) & msbs); - } - - BitMask MatchEmptyOrDeleted() const { - constexpr uint64_t msbs = 0x8080808080808080ULL; - return BitMask((ctrl & (~ctrl << 7)) & msbs); - } - - uint32_t CountLeadingEmptyOrDeleted() const { - constexpr uint64_t gaps = 0x00FEFEFEFEFEFEFEULL; - return (uint32_t)((TrailingZeros(((~ctrl & (ctrl >> 7)) | gaps) + 1) + 7) >> 3); - } - - void ConvertSpecialToEmptyAndFullToDeleted(ctrl_t* dst) const { - constexpr uint64_t msbs = 0x8080808080808080ULL; - constexpr uint64_t lsbs = 0x0101010101010101ULL; - auto x = ctrl & msbs; - auto res = (~x + (x >> 7)) & ~lsbs; - little_endian::Store64(dst, res); - } - - uint64_t ctrl; -}; - -#if PHMAP_HAVE_SSE2 - using Group = GroupSse2Impl; -#else - using Group = GroupPortableImpl; -#endif - -template -class raw_hash_set; - -inline bool IsValidCapacity(size_t n) { return ((n + 1) & n) == 0 && n > 0; } - -// -------------------------------------------------------------------------- -// PRECONDITION: -// IsValidCapacity(capacity) -// ctrl[capacity] == kSentinel -// ctrl[i] != kSentinel for all i < capacity -// Applies mapping for every byte in ctrl: -// DELETED -> EMPTY -// EMPTY -> EMPTY -// FULL -> DELETED -// -------------------------------------------------------------------------- -inline void ConvertDeletedToEmptyAndFullToDeleted( - ctrl_t* ctrl, size_t capacity) -{ - assert(ctrl[capacity] == kSentinel); - assert(IsValidCapacity(capacity)); - for (ctrl_t* pos = ctrl; pos != ctrl + capacity + 1; pos += Group::kWidth) { - Group{pos}.ConvertSpecialToEmptyAndFullToDeleted(pos); - } - // Copy the cloned ctrl bytes. - std::memcpy(ctrl + capacity + 1, ctrl, Group::kWidth); - ctrl[capacity] = kSentinel; -} - -// -------------------------------------------------------------------------- -// Rounds up the capacity to the next power of 2 minus 1, with a minimum of 1. -// -------------------------------------------------------------------------- -inline size_t NormalizeCapacity(size_t n) -{ - return n ? ~size_t{} >> LeadingZeros(n) : 1; -} - -// -------------------------------------------------------------------------- -// We use 7/8th as maximum load factor. -// For 16-wide groups, that gives an average of two empty slots per group. -// -------------------------------------------------------------------------- -inline size_t CapacityToGrowth(size_t capacity) -{ - assert(IsValidCapacity(capacity)); - // `capacity*7/8` - PHMAP_IF_CONSTEXPR (Group::kWidth == 8) { - if (capacity == 7) - { - // x-x/8 does not work when x==7. - return 6; - } - } - return capacity - capacity / 8; -} - -// -------------------------------------------------------------------------- -// From desired "growth" to a lowerbound of the necessary capacity. -// Might not be a valid one and required NormalizeCapacity(). -// -------------------------------------------------------------------------- -inline size_t GrowthToLowerboundCapacity(size_t growth) -{ - // `growth*8/7` - PHMAP_IF_CONSTEXPR (Group::kWidth == 8) { - if (growth == 7) - { - // x+(x-1)/7 does not work when x==7. - return 8; - } - } - return growth + static_cast((static_cast(growth) - 1) / 7); -} - -namespace hashtable_debug_internal { - -// If it is a map, call get<0>(). -using std::get; -template -auto GetKey(const typename T::value_type& pair, int) -> decltype(get<0>(pair)) { - return get<0>(pair); -} - -// If it is not a map, return the value directly. -template -const typename T::key_type& GetKey(const typename T::key_type& key, char) { - return key; -} - -// -------------------------------------------------------------------------- -// Containers should specialize this to provide debug information for that -// container. -// -------------------------------------------------------------------------- -template -struct HashtableDebugAccess -{ - // Returns the number of probes required to find `key` in `c`. The "number of - // probes" is a concept that can vary by container. Implementations should - // return 0 when `key` was found in the minimum number of operations and - // should increment the result for each non-trivial operation required to find - // `key`. - // - // The default implementation uses the bucket api from the standard and thus - // works for `std::unordered_*` containers. - // -------------------------------------------------------------------------- - static size_t GetNumProbes(const Container& c, - const typename Container::key_type& key) { - if (!c.bucket_count()) return {}; - size_t num_probes = 0; - size_t bucket = c.bucket(key); - for (auto it = c.begin(bucket), e = c.end(bucket);; ++it, ++num_probes) { - if (it == e) return num_probes; - if (c.key_eq()(key, GetKey(*it, 0))) return num_probes; - } - } -}; - -} // namespace hashtable_debug_internal - -// ---------------------------------------------------------------------------- -// I N F O Z S T U B S -// ---------------------------------------------------------------------------- -struct HashtablezInfo -{ - void PrepareForSampling() {} -}; - -inline void RecordRehashSlow(HashtablezInfo*, size_t ) {} - -static inline void RecordInsertSlow(HashtablezInfo* , size_t, size_t ) {} - -static inline void RecordEraseSlow(HashtablezInfo*) {} - -static inline HashtablezInfo* SampleSlow(int64_t*) { return nullptr; } -static inline void UnsampleSlow(HashtablezInfo* ) {} - -class HashtablezInfoHandle -{ -public: - inline void RecordStorageChanged(size_t , size_t ) {} - inline void RecordRehash(size_t ) {} - inline void RecordInsert(size_t , size_t ) {} - inline void RecordErase() {} - friend inline void swap(HashtablezInfoHandle& , - HashtablezInfoHandle& ) noexcept {} -}; - -static inline HashtablezInfoHandle Sample() { return HashtablezInfoHandle(); } - -class HashtablezSampler -{ -public: - // Returns a global Sampler. - static HashtablezSampler& Global() { static HashtablezSampler hzs; return hzs; } - HashtablezInfo* Register() { static HashtablezInfo info; return &info; } - void Unregister(HashtablezInfo* ) {} - - using DisposeCallback = void (*)(const HashtablezInfo&); - DisposeCallback SetDisposeCallback(DisposeCallback ) { return nullptr; } - int64_t Iterate(const std::function& ) { return 0; } -}; - -static inline void SetHashtablezEnabled(bool ) {} -static inline void SetHashtablezSampleParameter(int32_t ) {} -static inline void SetHashtablezMaxSamples(int32_t ) {} - - -namespace memory_internal { - -// Constructs T into uninitialized storage pointed by `ptr` using the args -// specified in the tuple. -// ---------------------------------------------------------------------------- -template -void ConstructFromTupleImpl(Alloc* alloc, T* ptr, Tuple&& t, - phmap::index_sequence) { - phmap::allocator_traits::construct( - *alloc, ptr, std::get(std::forward(t))...); -} - -template -struct WithConstructedImplF { - template - decltype(std::declval()(std::declval())) operator()( - Args&&... args) const { - return std::forward(f)(T(std::forward(args)...)); - } - F&& f; -}; - -template -decltype(std::declval()(std::declval())) WithConstructedImpl( - Tuple&& t, phmap::index_sequence, F&& f) { - return WithConstructedImplF{std::forward(f)}( - std::get(std::forward(t))...); -} - -template -auto TupleRefImpl(T&& t, phmap::index_sequence) - -> decltype(std::forward_as_tuple(std::get(std::forward(t))...)) { - return std::forward_as_tuple(std::get(std::forward(t))...); -} - -// Returns a tuple of references to the elements of the input tuple. T must be a -// tuple. -// ---------------------------------------------------------------------------- -template -auto TupleRef(T&& t) -> decltype( - TupleRefImpl(std::forward(t), - phmap::make_index_sequence< - std::tuple_size::type>::value>())) { - return TupleRefImpl( - std::forward(t), - phmap::make_index_sequence< - std::tuple_size::type>::value>()); -} - -template -decltype(std::declval()(std::declval(), std::piecewise_construct, - std::declval>(), std::declval())) -DecomposePairImpl(F&& f, std::pair, V> p) { - const auto& key = std::get<0>(p.first); - return std::forward(f)(key, std::piecewise_construct, std::move(p.first), - std::move(p.second)); -} - -} // namespace memory_internal - - -// ---------------------------------------------------------------------------- -// R A W _ H A S H _ S E T -// ---------------------------------------------------------------------------- -// An open-addressing -// hashtable with quadratic probing. -// -// This is a low level hashtable on top of which different interfaces can be -// implemented, like flat_hash_set, node_hash_set, string_hash_set, etc. -// -// The table interface is similar to that of std::unordered_set. Notable -// differences are that most member functions support heterogeneous keys when -// BOTH the hash and eq functions are marked as transparent. They do so by -// providing a typedef called `is_transparent`. -// -// When heterogeneous lookup is enabled, functions that take key_type act as if -// they have an overload set like: -// -// iterator find(const key_type& key); -// template -// iterator find(const K& key); -// -// size_type erase(const key_type& key); -// template -// size_type erase(const K& key); -// -// std::pair equal_range(const key_type& key); -// template -// std::pair equal_range(const K& key); -// -// When heterogeneous lookup is disabled, only the explicit `key_type` overloads -// exist. -// -// find() also supports passing the hash explicitly: -// -// iterator find(const key_type& key, size_t hash); -// template -// iterator find(const U& key, size_t hash); -// -// In addition the pointer to element and iterator stability guarantees are -// weaker: all iterators and pointers are invalidated after a new element is -// inserted. -// -// IMPLEMENTATION DETAILS -// -// The table stores elements inline in a slot array. In addition to the slot -// array the table maintains some control state per slot. The extra state is one -// byte per slot and stores empty or deleted marks, or alternatively 7 bits from -// the hash of an occupied slot. The table is split into logical groups of -// slots, like so: -// -// Group 1 Group 2 Group 3 -// +---------------+---------------+---------------+ -// | | | | | | | | | | | | | | | | | | | | | | | | | -// +---------------+---------------+---------------+ -// -// On lookup the hash is split into two parts: -// - H2: 7 bits (those stored in the control bytes) -// - H1: the rest of the bits -// The groups are probed using H1. For each group the slots are matched to H2 in -// parallel. Because H2 is 7 bits (128 states) and the number of slots per group -// is low (8 or 16) in almost all cases a match in H2 is also a lookup hit. -// -// On insert, once the right group is found (as in lookup), its slots are -// filled in order. -// -// On erase a slot is cleared. In case the group did not have any empty slots -// before the erase, the erased slot is marked as deleted. -// -// Groups without empty slots (but maybe with deleted slots) extend the probe -// sequence. The probing algorithm is quadratic. Given N the number of groups, -// the probing function for the i'th probe is: -// -// P(0) = H1 % N -// -// P(i) = (P(i - 1) + i) % N -// -// This probing function guarantees that after N probes, all the groups of the -// table will be probed exactly once. -// ---------------------------------------------------------------------------- -template -class raw_hash_set -{ - using PolicyTraits = hash_policy_traits; - using KeyArgImpl = - KeyArg::value && IsTransparent::value>; - -public: - using init_type = typename PolicyTraits::init_type; - using key_type = typename PolicyTraits::key_type; - // TODO(sbenza): Hide slot_type as it is an implementation detail. Needs user - // code fixes! - using slot_type = typename PolicyTraits::slot_type; - using allocator_type = Alloc; - using size_type = size_t; - using difference_type = ptrdiff_t; - using hasher = Hash; - using key_equal = Eq; - using policy_type = Policy; - using value_type = typename PolicyTraits::value_type; - using reference = value_type&; - using const_reference = const value_type&; - using pointer = typename phmap::allocator_traits< - allocator_type>::template rebind_traits::pointer; - using const_pointer = typename phmap::allocator_traits< - allocator_type>::template rebind_traits::const_pointer; - - // Alias used for heterogeneous lookup functions. - // `key_arg` evaluates to `K` when the functors are transparent and to - // `key_type` otherwise. It permits template argument deduction on `K` for the - // transparent case. - template - using key_arg = typename KeyArgImpl::template type; - -private: - // Give an early error when key_type is not hashable/eq. - auto KeyTypeCanBeHashed(const Hash& h, const key_type& k) -> decltype(h(k)); - auto KeyTypeCanBeEq(const Eq& eq, const key_type& k) -> decltype(eq(k, k)); - - using Layout = phmap::priv::Layout; - - static Layout MakeLayout(size_t capacity) { - assert(IsValidCapacity(capacity)); - return Layout(capacity + Group::kWidth + 1, capacity); - } - - using AllocTraits = phmap::allocator_traits; - using SlotAlloc = typename phmap::allocator_traits< - allocator_type>::template rebind_alloc; - using SlotAllocTraits = typename phmap::allocator_traits< - allocator_type>::template rebind_traits; - - static_assert(std::is_lvalue_reference::value, - "Policy::element() must return a reference"); - - template - struct SameAsElementReference - : std::is_same::type>::type, - typename std::remove_cv< - typename std::remove_reference::type>::type> {}; - - // An enabler for insert(T&&): T must be convertible to init_type or be the - // same as [cv] value_type [ref]. - // Note: we separate SameAsElementReference into its own type to avoid using - // reference unless we need to. MSVC doesn't seem to like it in some - // cases. - template - using RequiresInsertable = typename std::enable_if< - phmap::disjunction, - SameAsElementReference>::value, - int>::type; - - // RequiresNotInit is a workaround for gcc prior to 7.1. - // See https://godbolt.org/g/Y4xsUh. - template - using RequiresNotInit = - typename std::enable_if::value, int>::type; - - template - using IsDecomposable = IsDecomposable; - -public: - static_assert(std::is_same::value, - "Allocators with custom pointer types are not supported"); - static_assert(std::is_same::value, - "Allocators with custom pointer types are not supported"); - - class iterator - { - friend class raw_hash_set; - - public: - using iterator_category = std::forward_iterator_tag; - using value_type = typename raw_hash_set::value_type; - using reference = - phmap::conditional_t; - using pointer = phmap::remove_reference_t*; - using difference_type = typename raw_hash_set::difference_type; - - iterator() {} - - // PRECONDITION: not an end() iterator. - reference operator*() const { return PolicyTraits::element(slot_); } - - // PRECONDITION: not an end() iterator. - pointer operator->() const { return &operator*(); } - - // PRECONDITION: not an end() iterator. - iterator& operator++() { - ++ctrl_; - ++slot_; - skip_empty_or_deleted(); - return *this; - } - // PRECONDITION: not an end() iterator. - iterator operator++(int) { - auto tmp = *this; - ++*this; - return tmp; - } - -#if PHMAP_BIDIRECTIONAL - // PRECONDITION: not a begin() iterator. - iterator& operator--() { - assert(ctrl_); - do { - --ctrl_; - --slot_; - } while (IsEmptyOrDeleted(*ctrl_)); - return *this; - } - - // PRECONDITION: not a begin() iterator. - iterator operator--(int) { - auto tmp = *this; - --*this; - return tmp; - } -#endif - - friend bool operator==(const iterator& a, const iterator& b) { - return a.ctrl_ == b.ctrl_; - } - friend bool operator!=(const iterator& a, const iterator& b) { - return !(a == b); - } - - private: - iterator(ctrl_t* ctrl) : ctrl_(ctrl) {} // for end() - iterator(ctrl_t* ctrl, slot_type* slot) : ctrl_(ctrl), slot_(slot) {} - - void skip_empty_or_deleted() { - while (IsEmptyOrDeleted(*ctrl_)) { - // ctrl is not necessarily aligned to Group::kWidth. It is also likely - // to read past the space for ctrl bytes and into slots. This is ok - // because ctrl has sizeof() == 1 and slot has sizeof() >= 1 so there - // is no way to read outside the combined slot array. - uint32_t shift = Group{ctrl_}.CountLeadingEmptyOrDeleted(); - ctrl_ += shift; - slot_ += shift; - } - } - - ctrl_t* ctrl_ = nullptr; - // To avoid uninitialized member warnings, put slot_ in an anonymous union. - // The member is not initialized on singleton and end iterators. - union { - slot_type* slot_; - }; - }; - - class const_iterator - { - friend class raw_hash_set; - - public: - using iterator_category = typename iterator::iterator_category; - using value_type = typename raw_hash_set::value_type; - using reference = typename raw_hash_set::const_reference; - using pointer = typename raw_hash_set::const_pointer; - using difference_type = typename raw_hash_set::difference_type; - - const_iterator() {} - // Implicit construction from iterator. - const_iterator(iterator i) : inner_(std::move(i)) {} - - reference operator*() const { return *inner_; } - pointer operator->() const { return inner_.operator->(); } - - const_iterator& operator++() { - ++inner_; - return *this; - } - const_iterator operator++(int) { return inner_++; } - - friend bool operator==(const const_iterator& a, const const_iterator& b) { - return a.inner_ == b.inner_; - } - friend bool operator!=(const const_iterator& a, const const_iterator& b) { - return !(a == b); - } - - private: - const_iterator(const ctrl_t* ctrl, const slot_type* slot) - : inner_(const_cast(ctrl), const_cast(slot)) {} - - iterator inner_; - }; - - using node_type = node_handle, Alloc>; - using insert_return_type = InsertReturnType; - - raw_hash_set() noexcept( - std::is_nothrow_default_constructible::value&& - std::is_nothrow_default_constructible::value&& - std::is_nothrow_default_constructible::value) {} - - explicit raw_hash_set(size_t bucket_cnt, const hasher& hashfn = hasher(), - const key_equal& eq = key_equal(), - const allocator_type& alloc = allocator_type()) - : ctrl_(EmptyGroup()), settings_(0, hashfn, eq, alloc) { - if (bucket_cnt) { - size_t new_capacity = NormalizeCapacity(bucket_cnt); - reset_growth_left(new_capacity); - initialize_slots(new_capacity); - capacity_ = new_capacity; - } - } - - raw_hash_set(size_t bucket_cnt, const hasher& hashfn, - const allocator_type& alloc) - : raw_hash_set(bucket_cnt, hashfn, key_equal(), alloc) {} - - raw_hash_set(size_t bucket_cnt, const allocator_type& alloc) - : raw_hash_set(bucket_cnt, hasher(), key_equal(), alloc) {} - - explicit raw_hash_set(const allocator_type& alloc) - : raw_hash_set(0, hasher(), key_equal(), alloc) {} - - template - raw_hash_set(InputIter first, InputIter last, size_t bucket_cnt = 0, - const hasher& hashfn = hasher(), const key_equal& eq = key_equal(), - const allocator_type& alloc = allocator_type()) - : raw_hash_set(bucket_cnt, hashfn, eq, alloc) { - insert(first, last); - } - - template - raw_hash_set(InputIter first, InputIter last, size_t bucket_cnt, - const hasher& hashfn, const allocator_type& alloc) - : raw_hash_set(first, last, bucket_cnt, hashfn, key_equal(), alloc) {} - - template - raw_hash_set(InputIter first, InputIter last, size_t bucket_cnt, - const allocator_type& alloc) - : raw_hash_set(first, last, bucket_cnt, hasher(), key_equal(), alloc) {} - - template - raw_hash_set(InputIter first, InputIter last, const allocator_type& alloc) - : raw_hash_set(first, last, 0, hasher(), key_equal(), alloc) {} - - // Instead of accepting std::initializer_list as the first - // argument like std::unordered_set does, we have two overloads - // that accept std::initializer_list and std::initializer_list. - // This is advantageous for performance. - // - // // Turns {"abc", "def"} into std::initializer_list, then - // // copies the strings into the set. - // std::unordered_set s = {"abc", "def"}; - // - // // Turns {"abc", "def"} into std::initializer_list, then - // // copies the strings into the set. - // phmap::flat_hash_set s = {"abc", "def"}; - // - // The same trick is used in insert(). - // - // The enabler is necessary to prevent this constructor from triggering where - // the copy constructor is meant to be called. - // - // phmap::flat_hash_set a, b{a}; - // - // RequiresNotInit is a workaround for gcc prior to 7.1. - template = 0, RequiresInsertable = 0> - raw_hash_set(std::initializer_list init, size_t bucket_cnt = 0, - const hasher& hashfn = hasher(), const key_equal& eq = key_equal(), - const allocator_type& alloc = allocator_type()) - : raw_hash_set(init.begin(), init.end(), bucket_cnt, hashfn, eq, alloc) {} - - raw_hash_set(std::initializer_list init, size_t bucket_cnt = 0, - const hasher& hashfn = hasher(), const key_equal& eq = key_equal(), - const allocator_type& alloc = allocator_type()) - : raw_hash_set(init.begin(), init.end(), bucket_cnt, hashfn, eq, alloc) {} - - template = 0, RequiresInsertable = 0> - raw_hash_set(std::initializer_list init, size_t bucket_cnt, - const hasher& hashfn, const allocator_type& alloc) - : raw_hash_set(init, bucket_cnt, hashfn, key_equal(), alloc) {} - - raw_hash_set(std::initializer_list init, size_t bucket_cnt, - const hasher& hashfn, const allocator_type& alloc) - : raw_hash_set(init, bucket_cnt, hashfn, key_equal(), alloc) {} - - template = 0, RequiresInsertable = 0> - raw_hash_set(std::initializer_list init, size_t bucket_cnt, - const allocator_type& alloc) - : raw_hash_set(init, bucket_cnt, hasher(), key_equal(), alloc) {} - - raw_hash_set(std::initializer_list init, size_t bucket_cnt, - const allocator_type& alloc) - : raw_hash_set(init, bucket_cnt, hasher(), key_equal(), alloc) {} - - template = 0, RequiresInsertable = 0> - raw_hash_set(std::initializer_list init, const allocator_type& alloc) - : raw_hash_set(init, 0, hasher(), key_equal(), alloc) {} - - raw_hash_set(std::initializer_list init, - const allocator_type& alloc) - : raw_hash_set(init, 0, hasher(), key_equal(), alloc) {} - - raw_hash_set(const raw_hash_set& that) - : raw_hash_set(that, AllocTraits::select_on_container_copy_construction( - that.alloc_ref())) {} - - raw_hash_set(const raw_hash_set& that, const allocator_type& a) - : raw_hash_set(0, that.hash_ref(), that.eq_ref(), a) { - reserve(that.size()); - // Because the table is guaranteed to be empty, we can do something faster - // than a full `insert`. - for (const auto& v : that) { - const size_t hashval = PolicyTraits::apply(HashElement{hash_ref()}, v); - auto target = find_first_non_full(hashval); - set_ctrl(target.offset, H2(hashval)); - emplace_at(target.offset, v); - infoz_.RecordInsert(hashval, target.probe_length); - } - size_ = that.size(); - growth_left() -= that.size(); - } - - raw_hash_set(raw_hash_set&& that) noexcept( - std::is_nothrow_copy_constructible::value&& - std::is_nothrow_copy_constructible::value&& - std::is_nothrow_copy_constructible::value) - : ctrl_(phmap::exchange(that.ctrl_, EmptyGroup())), - slots_(phmap::exchange(that.slots_, nullptr)), - size_(phmap::exchange(that.size_, 0)), - capacity_(phmap::exchange(that.capacity_, 0)), - infoz_(phmap::exchange(that.infoz_, HashtablezInfoHandle())), - // Hash, equality and allocator are copied instead of moved because - // `that` must be left valid. If Hash is std::function, moving it - // would create a nullptr functor that cannot be called. - settings_(that.settings_) { - // growth_left was copied above, reset the one from `that`. - that.growth_left() = 0; - } - - raw_hash_set(raw_hash_set&& that, const allocator_type& a) - : ctrl_(EmptyGroup()), - slots_(nullptr), - size_(0), - capacity_(0), - settings_(0, that.hash_ref(), that.eq_ref(), a) { - if (a == that.alloc_ref()) { - std::swap(ctrl_, that.ctrl_); - std::swap(slots_, that.slots_); - std::swap(size_, that.size_); - std::swap(capacity_, that.capacity_); - std::swap(growth_left(), that.growth_left()); - std::swap(infoz_, that.infoz_); - } else { - reserve(that.size()); - // Note: this will copy elements of dense_set and unordered_set instead of - // moving them. This can be fixed if it ever becomes an issue. - for (auto& elem : that) insert(std::move(elem)); - } - } - - raw_hash_set& operator=(const raw_hash_set& that) { - raw_hash_set tmp(that, - AllocTraits::propagate_on_container_copy_assignment::value - ? that.alloc_ref() - : alloc_ref()); - swap(tmp); - return *this; - } - - raw_hash_set& operator=(raw_hash_set&& that) noexcept( - phmap::allocator_traits::is_always_equal::value&& - std::is_nothrow_move_assignable::value&& - std::is_nothrow_move_assignable::value) { - // TODO(sbenza): We should only use the operations from the noexcept clause - // to make sure we actually adhere to that contract. - return move_assign( - std::move(that), - typename AllocTraits::propagate_on_container_move_assignment()); - } - - ~raw_hash_set() { destroy_slots(); } - - iterator begin() { - auto it = iterator_at(0); - it.skip_empty_or_deleted(); - return it; - } - iterator end() - { -#if PHMAP_BIDIRECTIONAL - return iterator_at(capacity_); -#else - return {ctrl_ + capacity_}; -#endif - } - - const_iterator begin() const { - return const_cast(this)->begin(); - } - const_iterator end() const { return const_cast(this)->end(); } - const_iterator cbegin() const { return begin(); } - const_iterator cend() const { return end(); } - - bool empty() const { return !size(); } - size_t size() const { return size_; } - size_t capacity() const { return capacity_; } - size_t max_size() const { return (std::numeric_limits::max)(); } - - PHMAP_ATTRIBUTE_REINITIALIZES void clear() { - // Iterating over this container is O(bucket_count()). When bucket_count() - // is much greater than size(), iteration becomes prohibitively expensive. - // For clear() it is more important to reuse the allocated array when the - // container is small because allocation takes comparatively long time - // compared to destruction of the elements of the container. So we pick the - // largest bucket_count() threshold for which iteration is still fast and - // past that we simply deallocate the array. - if (empty()) - return; - if (capacity_ > 127) { - destroy_slots(); - } else if (capacity_) { - for (size_t i = 0; i != capacity_; ++i) { - if (IsFull(ctrl_[i])) { - PolicyTraits::destroy(&alloc_ref(), slots_ + i); - } - } - size_ = 0; - reset_ctrl(capacity_); - reset_growth_left(capacity_); - } - assert(empty()); - infoz_.RecordStorageChanged(0, capacity_); - } - - // This overload kicks in when the argument is an rvalue of insertable and - // decomposable type other than init_type. - // - // flat_hash_map m; - // m.insert(std::make_pair("abc", 42)); - template = 0, - typename std::enable_if::value, int>::type = 0, - T* = nullptr> - std::pair insert(T&& value) { - return emplace(std::forward(value)); - } - - // This overload kicks in when the argument is a bitfield or an lvalue of - // insertable and decomposable type. - // - // union { int n : 1; }; - // flat_hash_set s; - // s.insert(n); - // - // flat_hash_set s; - // const char* p = "hello"; - // s.insert(p); - // - // TODO(romanp): Once we stop supporting gcc 5.1 and below, replace - // RequiresInsertable with RequiresInsertable. - // We are hitting this bug: https://godbolt.org/g/1Vht4f. - template = 0, - typename std::enable_if::value, int>::type = 0> - std::pair insert(const T& value) { - return emplace(value); - } - - // This overload kicks in when the argument is an rvalue of init_type. Its - // purpose is to handle brace-init-list arguments. - // - // flat_hash_set s; - // s.insert({"abc", 42}); - std::pair insert(init_type&& value) { - return emplace(std::move(value)); - } - - template = 0, - typename std::enable_if::value, int>::type = 0, - T* = nullptr> - iterator insert(const_iterator, T&& value) { - return insert(std::forward(value)).first; - } - - // TODO(romanp): Once we stop supporting gcc 5.1 and below, replace - // RequiresInsertable with RequiresInsertable. - // We are hitting this bug: https://godbolt.org/g/1Vht4f. - template = 0, - typename std::enable_if::value, int>::type = 0> - iterator insert(const_iterator, const T& value) { - return insert(value).first; - } - - iterator insert(const_iterator, init_type&& value) { - return insert(std::move(value)).first; - } - - template - using IsRandomAccess = std::is_same::iterator_category, - std::random_access_iterator_tag>; - - - template - struct has_difference_operator - { - private: - using yes = std::true_type; - using no = std::false_type; - - template static auto test(int) -> decltype(std::declval() - std::declval() == 1, yes()); - template static no test(...); - - public: - static constexpr bool value = std::is_same(0)), yes>::value; - }; - - template ::value, int> = 0> - void insert(InputIt first, InputIt last) { - this->reserve(this->size() + (last - first)); - for (; first != last; ++first) - emplace(*first); - } - - template ::value, int> = 0> - void insert(InputIt first, InputIt last) { - for (; first != last; ++first) - emplace(*first); - } - - template = 0, RequiresInsertable = 0> - void insert(std::initializer_list ilist) { - insert(ilist.begin(), ilist.end()); - } - - void insert(std::initializer_list ilist) { - insert(ilist.begin(), ilist.end()); - } - - insert_return_type insert(node_type&& node) { - if (!node) return {end(), false, node_type()}; - const auto& elem = PolicyTraits::element(CommonAccess::GetSlot(node)); - auto res = PolicyTraits::apply( - InsertSlot{*this, std::move(*CommonAccess::GetSlot(node))}, - elem); - if (res.second) { - CommonAccess::Reset(&node); - return {res.first, true, node_type()}; - } else { - return {res.first, false, std::move(node)}; - } - } - - insert_return_type insert(node_type&& node, size_t hashval) { - if (!node) return {end(), false, node_type()}; - const auto& elem = PolicyTraits::element(CommonAccess::GetSlot(node)); - auto res = PolicyTraits::apply( - InsertSlotWithHash{*this, std::move(*CommonAccess::GetSlot(node)), hashval}, - elem); - if (res.second) { - CommonAccess::Reset(&node); - return {res.first, true, node_type()}; - } else { - return {res.first, false, std::move(node)}; - } - } - - iterator insert(const_iterator, node_type&& node) { - return insert(std::move(node)).first; - } - - // This overload kicks in if we can deduce the key from args. This enables us - // to avoid constructing value_type if an entry with the same key already - // exists. - // - // For example: - // - // flat_hash_map m = {{"abc", "def"}}; - // // Creates no std::string copies and makes no heap allocations. - // m.emplace("abc", "xyz"); - template ::value, int>::type = 0> - std::pair emplace(Args&&... args) { - return PolicyTraits::apply(EmplaceDecomposable{*this}, - std::forward(args)...); - } - - template ::value, int>::type = 0> - std::pair emplace_with_hash(size_t hashval, Args&&... args) { - return PolicyTraits::apply(EmplaceDecomposableHashval{*this, hashval}, std::forward(args)...); - } - - // This overload kicks in if we cannot deduce the key from args. It constructs - // value_type unconditionally and then either moves it into the table or - // destroys. - template ::value, int>::type = 0> - std::pair emplace(Args&&... args) { - typename std::aligned_storage::type - raw; - slot_type* slot = reinterpret_cast(&raw); - - PolicyTraits::construct(&alloc_ref(), slot, std::forward(args)...); - const auto& elem = PolicyTraits::element(slot); - return PolicyTraits::apply(InsertSlot{*this, std::move(*slot)}, elem); - } - - template ::value, int>::type = 0> - std::pair emplace_with_hash(size_t hashval, Args&&... args) { - typename std::aligned_storage::type raw; - slot_type* slot = reinterpret_cast(&raw); - - PolicyTraits::construct(&alloc_ref(), slot, std::forward(args)...); - const auto& elem = PolicyTraits::element(slot); - return PolicyTraits::apply(InsertSlotWithHash{*this, std::move(*slot), hashval}, elem); - } - - template - iterator emplace_hint(const_iterator, Args&&... args) { - return emplace(std::forward(args)...).first; - } - - template - iterator emplace_hint_with_hash(size_t hashval, const_iterator, Args&&... args) { - return emplace_with_hash(hashval, std::forward(args)...).first; - } - - // Extension API: support for lazy emplace. - // - // Looks up key in the table. If found, returns the iterator to the element. - // Otherwise calls f with one argument of type raw_hash_set::constructor. f - // MUST call raw_hash_set::constructor with arguments as if a - // raw_hash_set::value_type is constructed, otherwise the behavior is - // undefined. - // - // For example: - // - // std::unordered_set s; - // // Makes ArenaStr even if "abc" is in the map. - // s.insert(ArenaString(&arena, "abc")); - // - // flat_hash_set s; - // // Makes ArenaStr only if "abc" is not in the map. - // s.lazy_emplace("abc", [&](const constructor& ctor) { - // ctor(&arena, "abc"); - // }); - // - // WARNING: This API is currently experimental. If there is a way to implement - // the same thing with the rest of the API, prefer that. - class constructor - { - friend class raw_hash_set; - - public: - template - void operator()(Args&&... args) const { - assert(*slot_); - PolicyTraits::construct(alloc_, *slot_, std::forward(args)...); - *slot_ = nullptr; - } - - private: - constructor(allocator_type* a, slot_type** slot) : alloc_(a), slot_(slot) {} - - allocator_type* alloc_; - slot_type** slot_; - }; - - template - iterator lazy_emplace(const key_arg& key, F&& f) { - auto res = find_or_prepare_insert(key); - if (res.second) { - lazy_emplace_at(res.first, std::forward(f)); - } - return iterator_at(res.first); - } - - template - iterator lazy_emplace_with_hash(const key_arg& key, size_t &hashval, F&& f) { - auto res = find_or_prepare_insert(key, hashval); - if (res.second) { - lazy_emplace_at(res.first, std::forward(f)); - } - return iterator_at(res.first); - } - - template - void lazy_emplace_at(size_t& idx, F&& f) { - slot_type* slot = slots_ + idx; - std::forward(f)(constructor(&alloc_ref(), &slot)); - assert(!slot); - } - - - // Extension API: support for heterogeneous keys. - // - // std::unordered_set s; - // // Turns "abc" into std::string. - // s.erase("abc"); - // - // flat_hash_set s; - // // Uses "abc" directly without copying it into std::string. - // s.erase("abc"); - template - size_type erase(const key_arg& key) { - auto it = find(key); - if (it == end()) return 0; - _erase(it); - return 1; - } - - - iterator erase(const_iterator cit) { return erase(cit.inner_); } - - // Erases the element pointed to by `it`. Unlike `std::unordered_set::erase`, - // this method returns void to reduce algorithmic complexity to O(1). In - // order to erase while iterating across a map, use the following idiom (which - // also works for standard containers): - // - // for (auto it = m.begin(), end = m.end(); it != end;) { - // if () { - // m._erase(it++); - // } else { - // ++it; - // } - // } - void _erase(iterator it) { - assert(it != end()); - PolicyTraits::destroy(&alloc_ref(), it.slot_); - erase_meta_only(it); - } - void _erase(const_iterator cit) { _erase(cit.inner_); } - - // This overload is necessary because otherwise erase(const K&) would be - // a better match if non-const iterator is passed as an argument. - iterator erase(iterator it) { - auto res = it; - ++res; - _erase(it); - return res; - } - - iterator erase(const_iterator first, const_iterator last) { - while (first != last) { - _erase(first++); - } - return last.inner_; - } - - // Moves elements from `src` into `this`. - // If the element already exists in `this`, it is left unmodified in `src`. - template - void merge(raw_hash_set& src) { // NOLINT - assert(this != &src); - for (auto it = src.begin(), e = src.end(); it != e; ++it) { - if (PolicyTraits::apply(InsertSlot{*this, std::move(*it.slot_)}, - PolicyTraits::element(it.slot_)) - .second) { - src.erase_meta_only(it); - } - } - } - - template - void merge(raw_hash_set&& src) { - merge(src); - } - - node_type extract(const_iterator position) { - auto node = - CommonAccess::Make(alloc_ref(), position.inner_.slot_); - erase_meta_only(position); - return node; - } - - template < - class K = key_type, - typename std::enable_if::value, int>::type = 0> - node_type extract(const key_arg& key) { - auto it = find(key); - return it == end() ? node_type() : extract(const_iterator{it}); - } - - void swap(raw_hash_set& that) noexcept( - IsNoThrowSwappable() && IsNoThrowSwappable() && - (!AllocTraits::propagate_on_container_swap::value || - IsNoThrowSwappable())) { - using std::swap; - swap(ctrl_, that.ctrl_); - swap(slots_, that.slots_); - swap(size_, that.size_); - swap(capacity_, that.capacity_); - swap(growth_left(), that.growth_left()); - swap(hash_ref(), that.hash_ref()); - swap(eq_ref(), that.eq_ref()); - swap(infoz_, that.infoz_); - if (AllocTraits::propagate_on_container_swap::value) { - swap(alloc_ref(), that.alloc_ref()); - } else { - // If the allocators do not compare equal it is officially undefined - // behavior. We choose to do nothing. - } - } - -#if !defined(PHMAP_NON_DETERMINISTIC) - template - bool phmap_dump(OutputArchive&) const; - - template - bool phmap_load(InputArchive&); -#endif - - void rehash(size_t n) { - if (n == 0 && capacity_ == 0) return; - if (n == 0 && size_ == 0) { - destroy_slots(); - infoz_.RecordStorageChanged(0, 0); - return; - } - // bitor is a faster way of doing `max` here. We will round up to the next - // power-of-2-minus-1, so bitor is good enough. - auto m = NormalizeCapacity((std::max)(n, size())); - // n == 0 unconditionally rehashes as per the standard. - if (n == 0 || m > capacity_) { - resize(m); - } - } - - void reserve(size_t n) { rehash(GrowthToLowerboundCapacity(n)); } - - // Extension API: support for heterogeneous keys. - // - // std::unordered_set s; - // // Turns "abc" into std::string. - // s.count("abc"); - // - // ch_set s; - // // Uses "abc" directly without copying it into std::string. - // s.count("abc"); - template - size_t count(const key_arg& key) const { - return find(key) == end() ? size_t(0) : size_t(1); - } - - // Issues CPU prefetch instructions for the memory needed to find or insert - // a key. Like all lookup functions, this support heterogeneous keys. - // - // NOTE: This is a very low level operation and should not be used without - // specific benchmarks indicating its importance. - void prefetch_hash(size_t hashval) const { - (void)hashval; -#if defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86)) - auto seq = probe(hashval); - _mm_prefetch((const char *)(ctrl_ + seq.offset()), _MM_HINT_NTA); - _mm_prefetch((const char *)(slots_ + seq.offset()), _MM_HINT_NTA); -#elif defined(__GNUC__) - auto seq = probe(hashval); - __builtin_prefetch(static_cast(ctrl_ + seq.offset())); - __builtin_prefetch(static_cast(slots_ + seq.offset())); -#endif // __GNUC__ - } - - template - void prefetch(const key_arg& key) const { - prefetch_hash(this->hash(key)); - } - - // The API of find() has two extensions. - // - // 1. The hash can be passed by the user. It must be equal to the hash of the - // key. - // - // 2. The type of the key argument doesn't have to be key_type. This is so - // called heterogeneous key support. - template - iterator find(const key_arg& key, size_t hashval) { - size_t offset; - if (find_impl(key, hashval, offset)) - return iterator_at(offset); - else - return end(); - } - - template - pointer find_ptr(const key_arg& key, size_t hashval) { - size_t offset; - if (find_impl(key, hashval, offset)) - return &PolicyTraits::element(slots_ + offset); - else - return nullptr; - } - - template - iterator find(const key_arg& key) { - return find(key, this->hash(key)); - } - - template - const_iterator find(const key_arg& key, size_t hashval) const { - return const_cast(this)->find(key, hashval); - } - template - const_iterator find(const key_arg& key) const { - return find(key, this->hash(key)); - } - - template - bool contains(const key_arg& key) const { - return find(key) != end(); - } - - template - bool contains(const key_arg& key, size_t hashval) const { - return find(key, hashval) != end(); - } - - template - std::pair equal_range(const key_arg& key) { - auto it = find(key); - if (it != end()) return {it, std::next(it)}; - return {it, it}; - } - template - std::pair equal_range( - const key_arg& key) const { - auto it = find(key); - if (it != end()) return {it, std::next(it)}; - return {it, it}; - } - - size_t bucket_count() const { return capacity_; } - float load_factor() const { - return capacity_ ? static_cast(size()) / capacity_ : 0.0; - } - float max_load_factor() const { return 1.0f; } - void max_load_factor(float) { - // Does nothing. - } - - hasher hash_function() const { return hash_ref(); } // warning: doesn't match internal hash - use hash() member function - key_equal key_eq() const { return eq_ref(); } - allocator_type get_allocator() const { return alloc_ref(); } - - friend bool operator==(const raw_hash_set& a, const raw_hash_set& b) { - if (a.size() != b.size()) return false; - const raw_hash_set* outer = &a; - const raw_hash_set* inner = &b; - if (outer->capacity() > inner->capacity()) - std::swap(outer, inner); - for (const value_type& elem : *outer) - if (!inner->has_element(elem)) return false; - return true; - } - - friend bool operator!=(const raw_hash_set& a, const raw_hash_set& b) { - return !(a == b); - } - - friend void swap(raw_hash_set& a, - raw_hash_set& b) noexcept(noexcept(a.swap(b))) { - a.swap(b); - } - - template - size_t hash(const K& key) const { - return HashElement{hash_ref()}(key); - } - -private: - template - friend struct phmap::priv::hashtable_debug_internal::HashtableDebugAccess; - - template - bool find_impl(const key_arg& key, size_t hashval, size_t& offset) { - auto seq = probe(hashval); - while (true) { - Group g{ ctrl_ + seq.offset() }; - for (int i : g.Match((h2_t)H2(hashval))) { - offset = seq.offset((size_t)i); - if (PHMAP_PREDICT_TRUE(PolicyTraits::apply( - EqualElement{key, eq_ref()}, - PolicyTraits::element(slots_ + offset)))) - return true; - } - if (PHMAP_PREDICT_TRUE(g.MatchEmpty())) - return false; - seq.next(); - } - } - - struct FindElement - { - template - const_iterator operator()(const K& key, Args&&...) const { - return s.find(key); - } - const raw_hash_set& s; - }; - - struct HashElement - { - template - size_t operator()(const K& key, Args&&...) const { - return phmap_mix()(h(key)); - } - const hasher& h; - }; - - template - struct EqualElement - { - template - bool operator()(const K2& lhs, Args&&...) const { - return eq(lhs, rhs); - } - const K1& rhs; - const key_equal& eq; - }; - - template - std::pair emplace_decomposable(const K& key, size_t hashval, - Args&&... args) - { - auto res = find_or_prepare_insert(key, hashval); - if (res.second) { - emplace_at(res.first, std::forward(args)...); - } - return {iterator_at(res.first), res.second}; - } - - struct EmplaceDecomposable - { - template - std::pair operator()(const K& key, Args&&... args) const { - return s.emplace_decomposable(key, s.hash(key), std::forward(args)...); - } - raw_hash_set& s; - }; - - struct EmplaceDecomposableHashval { - template - std::pair operator()(const K& key, Args&&... args) const { - return s.emplace_decomposable(key, hashval, std::forward(args)...); - } - raw_hash_set& s; - size_t hashval; - }; - - template - struct InsertSlot - { - template - std::pair operator()(const K& key, Args&&...) && { - auto res = s.find_or_prepare_insert(key); - if (res.second) { - PolicyTraits::transfer(&s.alloc_ref(), s.slots_ + res.first, &slot); - } else if (do_destroy) { - PolicyTraits::destroy(&s.alloc_ref(), &slot); - } - return {s.iterator_at(res.first), res.second}; - } - raw_hash_set& s; - // Constructed slot. Either moved into place or destroyed. - slot_type&& slot; - }; - - template - struct InsertSlotWithHash - { - template - std::pair operator()(const K& key, Args&&...) && { - auto res = s.find_or_prepare_insert(key, hashval); - if (res.second) { - PolicyTraits::transfer(&s.alloc_ref(), s.slots_ + res.first, &slot); - } else if (do_destroy) { - PolicyTraits::destroy(&s.alloc_ref(), &slot); - } - return {s.iterator_at(res.first), res.second}; - } - raw_hash_set& s; - // Constructed slot. Either moved into place or destroyed. - slot_type&& slot; - size_t &hashval; - }; - - // "erases" the object from the container, except that it doesn't actually - // destroy the object. It only updates all the metadata of the class. - // This can be used in conjunction with Policy::transfer to move the object to - // another place. - void erase_meta_only(const_iterator it) { - assert(IsFull(*it.inner_.ctrl_) && "erasing a dangling iterator"); - --size_; - const size_t index = (size_t)(it.inner_.ctrl_ - ctrl_); - const size_t index_before = (index - Group::kWidth) & capacity_; - const auto empty_after = Group(it.inner_.ctrl_).MatchEmpty(); - const auto empty_before = Group(ctrl_ + index_before).MatchEmpty(); - - // We count how many consecutive non empties we have to the right and to the - // left of `it`. If the sum is >= kWidth then there is at least one probe - // window that might have seen a full group. - bool was_never_full = - empty_before && empty_after && - static_cast(empty_after.TrailingZeros() + - empty_before.LeadingZeros()) < Group::kWidth; - - set_ctrl(index, was_never_full ? kEmpty : kDeleted); - growth_left() += was_never_full; - infoz_.RecordErase(); - } - - void initialize_slots(size_t new_capacity) { - assert(new_capacity); - if (std::is_same>::value && - slots_ == nullptr) { - infoz_ = Sample(); - } - - auto layout = MakeLayout(new_capacity); - char* mem = static_cast( - Allocate(&alloc_ref(), layout.AllocSize())); - ctrl_ = reinterpret_cast(layout.template Pointer<0>(mem)); - slots_ = layout.template Pointer<1>(mem); - reset_ctrl(new_capacity); - reset_growth_left(new_capacity); - infoz_.RecordStorageChanged(size_, new_capacity); - } - - void destroy_slots() { - if (!capacity_) return; - for (size_t i = 0; i != capacity_; ++i) { - if (IsFull(ctrl_[i])) { - PolicyTraits::destroy(&alloc_ref(), slots_ + i); - } - } - auto layout = MakeLayout(capacity_); - // Unpoison before returning the memory to the allocator. - SanitizerUnpoisonMemoryRegion(slots_, sizeof(slot_type) * capacity_); - Deallocate(&alloc_ref(), ctrl_, layout.AllocSize()); - ctrl_ = EmptyGroup(); - slots_ = nullptr; - size_ = 0; - capacity_ = 0; - growth_left() = 0; - } - - void resize(size_t new_capacity) { - assert(IsValidCapacity(new_capacity)); - auto* old_ctrl = ctrl_; - auto* old_slots = slots_; - const size_t old_capacity = capacity_; - initialize_slots(new_capacity); - capacity_ = new_capacity; - - for (size_t i = 0; i != old_capacity; ++i) { - if (IsFull(old_ctrl[i])) { - size_t hashval = PolicyTraits::apply(HashElement{hash_ref()}, - PolicyTraits::element(old_slots + i)); - auto target = find_first_non_full(hashval); - size_t new_i = target.offset; - set_ctrl(new_i, H2(hashval)); - PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, old_slots + i); - } - } - if (old_capacity) { - SanitizerUnpoisonMemoryRegion(old_slots, - sizeof(slot_type) * old_capacity); - auto layout = MakeLayout(old_capacity); - Deallocate(&alloc_ref(), old_ctrl, - layout.AllocSize()); - } - } - - void drop_deletes_without_resize() PHMAP_ATTRIBUTE_NOINLINE { - assert(IsValidCapacity(capacity_)); - assert(!is_small()); - // Algorithm: - // - mark all DELETED slots as EMPTY - // - mark all FULL slots as DELETED - // - for each slot marked as DELETED - // hash = Hash(element) - // target = find_first_non_full(hash) - // if target is in the same group - // mark slot as FULL - // else if target is EMPTY - // transfer element to target - // mark slot as EMPTY - // mark target as FULL - // else if target is DELETED - // swap current element with target element - // mark target as FULL - // repeat procedure for current slot with moved from element (target) - ConvertDeletedToEmptyAndFullToDeleted(ctrl_, capacity_); - typename std::aligned_storage::type - raw; - slot_type* slot = reinterpret_cast(&raw); - for (size_t i = 0; i != capacity_; ++i) { - if (!IsDeleted(ctrl_[i])) continue; - size_t hashval = PolicyTraits::apply(HashElement{hash_ref()}, - PolicyTraits::element(slots_ + i)); - auto target = find_first_non_full(hashval); - size_t new_i = target.offset; - - // Verify if the old and new i fall within the same group wrt the hashval. - // If they do, we don't need to move the object as it falls already in the - // best probe we can. - const auto probe_index = [&](size_t pos) { - return ((pos - probe(hashval).offset()) & capacity_) / Group::kWidth; - }; - - // Element doesn't move. - if (PHMAP_PREDICT_TRUE(probe_index(new_i) == probe_index(i))) { - set_ctrl(i, H2(hashval)); - continue; - } - if (IsEmpty(ctrl_[new_i])) { - // Transfer element to the empty spot. - // set_ctrl poisons/unpoisons the slots so we have to call it at the - // right time. - set_ctrl(new_i, H2(hashval)); - PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, slots_ + i); - set_ctrl(i, kEmpty); - } else { - assert(IsDeleted(ctrl_[new_i])); - set_ctrl(new_i, H2(hashval)); - // Until we are done rehashing, DELETED marks previously FULL slots. - // Swap i and new_i elements. - PolicyTraits::transfer(&alloc_ref(), slot, slots_ + i); - PolicyTraits::transfer(&alloc_ref(), slots_ + i, slots_ + new_i); - PolicyTraits::transfer(&alloc_ref(), slots_ + new_i, slot); - --i; // repeat - } - } - reset_growth_left(capacity_); - } - - void rehash_and_grow_if_necessary() { - if (capacity_ == 0) { - resize(1); - } else if (size() <= CapacityToGrowth(capacity()) / 2) { - // Squash DELETED without growing if there is enough capacity. - drop_deletes_without_resize(); - } else { - // Otherwise grow the container. - resize(capacity_ * 2 + 1); - } - } - - bool has_element(const value_type& elem, size_t hashval) const { - auto seq = probe(hashval); - while (true) { - Group g{ctrl_ + seq.offset()}; - for (int i : g.Match((h2_t)H2(hashval))) { - if (PHMAP_PREDICT_TRUE(PolicyTraits::element(slots_ + seq.offset((size_t)i)) == - elem)) - return true; - } - if (PHMAP_PREDICT_TRUE(g.MatchEmpty())) return false; - seq.next(); - assert(seq.getindex() < capacity_ && "full table!"); - } - return false; - } - - bool has_element(const value_type& elem) const { - size_t hashval = PolicyTraits::apply(HashElement{hash_ref()}, elem); - return has_element(elem, hashval); - } - - // Probes the raw_hash_set with the probe sequence for hash and returns the - // pointer to the first empty or deleted slot. - // NOTE: this function must work with tables having both kEmpty and kDelete - // in one group. Such tables appears during drop_deletes_without_resize. - // - // This function is very useful when insertions happen and: - // - the input is already a set - // - there are enough slots - // - the element with the hash is not in the table - struct FindInfo - { - size_t offset; - size_t probe_length; - }; - FindInfo find_first_non_full(size_t hashval) { - auto seq = probe(hashval); - while (true) { - Group g{ctrl_ + seq.offset()}; - auto mask = g.MatchEmptyOrDeleted(); - if (mask) { - return {seq.offset((size_t)mask.LowestBitSet()), seq.getindex()}; - } - assert(seq.getindex() < capacity_ && "full table!"); - seq.next(); - } - } - - // TODO(alkis): Optimize this assuming *this and that don't overlap. - raw_hash_set& move_assign(raw_hash_set&& that, std::true_type) { - raw_hash_set tmp(std::move(that)); - swap(tmp); - return *this; - } - raw_hash_set& move_assign(raw_hash_set&& that, std::false_type) { - raw_hash_set tmp(std::move(that), alloc_ref()); - swap(tmp); - return *this; - } - -protected: - template - std::pair find_or_prepare_insert(const K& key, size_t hashval) { - auto seq = probe(hashval); - while (true) { - Group g{ctrl_ + seq.offset()}; - for (int i : g.Match((h2_t)H2(hashval))) { - if (PHMAP_PREDICT_TRUE(PolicyTraits::apply( - EqualElement{key, eq_ref()}, - PolicyTraits::element(slots_ + seq.offset((size_t)i))))) - return {seq.offset((size_t)i), false}; - } - if (PHMAP_PREDICT_TRUE(g.MatchEmpty())) break; - seq.next(); - } - return {prepare_insert(hashval), true}; - } - - template - std::pair find_or_prepare_insert(const K& key) { - return find_or_prepare_insert(key, this->hash(key)); - } - - size_t prepare_insert(size_t hashval) PHMAP_ATTRIBUTE_NOINLINE { - auto target = find_first_non_full(hashval); - if (PHMAP_PREDICT_FALSE(growth_left() == 0 && - !IsDeleted(ctrl_[target.offset]))) { - rehash_and_grow_if_necessary(); - target = find_first_non_full(hashval); - } - ++size_; - growth_left() -= IsEmpty(ctrl_[target.offset]); - set_ctrl(target.offset, H2(hashval)); - infoz_.RecordInsert(hashval, target.probe_length); - return target.offset; - } - - // Constructs the value in the space pointed by the iterator. This only works - // after an unsuccessful find_or_prepare_insert() and before any other - // modifications happen in the raw_hash_set. - // - // PRECONDITION: i is an index returned from find_or_prepare_insert(k), where - // k is the key decomposed from `forward(args)...`, and the bool - // returned by find_or_prepare_insert(k) was true. - // POSTCONDITION: *m.iterator_at(i) == value_type(forward(args)...). - template - void emplace_at(size_t i, Args&&... args) { - PolicyTraits::construct(&alloc_ref(), slots_ + i, - std::forward(args)...); - - assert(PolicyTraits::apply(FindElement{*this}, *iterator_at(i)) == - iterator_at(i) && - "constructed value does not match the lookup key"); - } - - iterator iterator_at(size_t i) { return {ctrl_ + i, slots_ + i}; } - const_iterator iterator_at(size_t i) const { return {ctrl_ + i, slots_ + i}; } - -private: - friend struct RawHashSetTestOnlyAccess; - - probe_seq probe(size_t hashval) const { - return probe_seq(H1(hashval, ctrl_), capacity_); - } - - // Reset all ctrl bytes back to kEmpty, except the sentinel. - void reset_ctrl(size_t capacity) { - std::memset(ctrl_, kEmpty, capacity + Group::kWidth); - ctrl_[capacity] = kSentinel; - SanitizerPoisonMemoryRegion(slots_, sizeof(slot_type) * capacity); - } - - void reset_growth_left(size_t capacity) { - growth_left() = CapacityToGrowth(capacity) - size_; - } - - // Sets the control byte, and if `i < Group::kWidth`, set the cloned byte at - // the end too. - void set_ctrl(size_t i, ctrl_t h) { - assert(i < capacity_); - - if (IsFull(h)) { - SanitizerUnpoisonObject(slots_ + i); - } else { - SanitizerPoisonObject(slots_ + i); - } - - ctrl_[i] = h; - ctrl_[((i - Group::kWidth) & capacity_) + 1 + - ((Group::kWidth - 1) & capacity_)] = h; - } - - size_t& growth_left() { return settings_.template get<0>(); } - - template class RefSet, - class M, class P, class H, class E, class A> - friend class parallel_hash_set; - - template class RefSet, - class M, class P, class H, class E, class A> - friend class parallel_hash_map; - - // The representation of the object has two modes: - // - small: For capacities < kWidth-1 - // - large: For the rest. - // - // Differences: - // - In small mode we are able to use the whole capacity. The extra control - // bytes give us at least one "empty" control byte to stop the iteration. - // This is important to make 1 a valid capacity. - // - // - In small mode only the first `capacity()` control bytes after the - // sentinel are valid. The rest contain dummy kEmpty values that do not - // represent a real slot. This is important to take into account on - // find_first_non_full(), where we never try ShouldInsertBackwards() for - // small tables. - bool is_small() const { return capacity_ < Group::kWidth - 1; } - - hasher& hash_ref() { return settings_.template get<1>(); } - const hasher& hash_ref() const { return settings_.template get<1>(); } - key_equal& eq_ref() { return settings_.template get<2>(); } - const key_equal& eq_ref() const { return settings_.template get<2>(); } - allocator_type& alloc_ref() { return settings_.template get<3>(); } - const allocator_type& alloc_ref() const { - return settings_.template get<3>(); - } - - // TODO(alkis): Investigate removing some of these fields: - // - ctrl/slots can be derived from each other - // - size can be moved into the slot array - ctrl_t* ctrl_ = EmptyGroup(); // [(capacity + 1) * ctrl_t] - slot_type* slots_ = nullptr; // [capacity * slot_type] - size_t size_ = 0; // number of full slots - size_t capacity_ = 0; // total number of slots - HashtablezInfoHandle infoz_; - phmap::priv::CompressedTuple - settings_{0, hasher{}, key_equal{}, allocator_type{}}; -}; - - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -class raw_hash_map : public raw_hash_set -{ - // P is Policy. It's passed as a template argument to support maps that have - // incomplete types as values, as in unordered_map. - // MappedReference<> may be a non-reference type. - template - using MappedReference = decltype(P::value( - std::addressof(std::declval()))); - - // MappedConstReference<> may be a non-reference type. - template - using MappedConstReference = decltype(P::value( - std::addressof(std::declval()))); - - using KeyArgImpl = - KeyArg::value && IsTransparent::value>; - - using Base = raw_hash_set; - -public: - using key_type = typename Policy::key_type; - using mapped_type = typename Policy::mapped_type; - template - using key_arg = typename KeyArgImpl::template type; - - static_assert(!std::is_reference::value, ""); - // TODO(alkis): remove this assertion and verify that reference mapped_type is - // supported. - static_assert(!std::is_reference::value, ""); - - using iterator = typename raw_hash_map::raw_hash_set::iterator; - using const_iterator = typename raw_hash_map::raw_hash_set::const_iterator; - - raw_hash_map() {} - using Base::raw_hash_set; // use raw_hash_set constructor - - // The last two template parameters ensure that both arguments are rvalues - // (lvalue arguments are handled by the overloads below). This is necessary - // for supporting bitfield arguments. - // - // union { int n : 1; }; - // flat_hash_map m; - // m.insert_or_assign(n, n); - template - std::pair insert_or_assign(key_arg&& k, V&& v) { - return insert_or_assign_impl(std::forward(k), std::forward(v)); - } - - template - std::pair insert_or_assign(key_arg&& k, const V& v) { - return insert_or_assign_impl(std::forward(k), v); - } - - template - std::pair insert_or_assign(const key_arg& k, V&& v) { - return insert_or_assign_impl(k, std::forward(v)); - } - - template - std::pair insert_or_assign(const key_arg& k, const V& v) { - return insert_or_assign_impl(k, v); - } - - template - iterator insert_or_assign(const_iterator, key_arg&& k, V&& v) { - return insert_or_assign(std::forward(k), std::forward(v)).first; - } - - template - iterator insert_or_assign(const_iterator, key_arg&& k, const V& v) { - return insert_or_assign(std::forward(k), v).first; - } - - template - iterator insert_or_assign(const_iterator, const key_arg& k, V&& v) { - return insert_or_assign(k, std::forward(v)).first; - } - - template - iterator insert_or_assign(const_iterator, const key_arg& k, const V& v) { - return insert_or_assign(k, v).first; - } - - template ::value, int>::type = 0, - K* = nullptr> - std::pair try_emplace(key_arg&& k, Args&&... args) { - return try_emplace_impl(std::forward(k), std::forward(args)...); - } - - template ::value, int>::type = 0> - std::pair try_emplace(const key_arg& k, Args&&... args) { - return try_emplace_impl(k, std::forward(args)...); - } - - template - iterator try_emplace(const_iterator, key_arg&& k, Args&&... args) { - return try_emplace(std::forward(k), std::forward(args)...).first; - } - - template - iterator try_emplace(const_iterator, const key_arg& k, Args&&... args) { - return try_emplace(k, std::forward(args)...).first; - } - - template - MappedReference

at(const key_arg& key) { - auto it = this->find(key); - if (it == this->end()) - phmap::base_internal::ThrowStdOutOfRange("phmap at(): lookup non-existent key"); - return Policy::value(&*it); - } - - template - MappedConstReference

at(const key_arg& key) const { - auto it = this->find(key); - if (it == this->end()) - phmap::base_internal::ThrowStdOutOfRange("phmap at(): lookup non-existent key"); - return Policy::value(&*it); - } - - template - MappedReference

operator[](key_arg&& key) { - return Policy::value(&*try_emplace(std::forward(key)).first); - } - - template - MappedReference

operator[](const key_arg& key) { - return Policy::value(&*try_emplace(key).first); - } - -private: - template - std::pair insert_or_assign_impl(K&& k, V&& v) { - auto res = this->find_or_prepare_insert(k); - if (res.second) - this->emplace_at(res.first, std::forward(k), std::forward(v)); - else - Policy::value(&*this->iterator_at(res.first)) = std::forward(v); - return {this->iterator_at(res.first), res.second}; - } - - template - std::pair try_emplace_impl(K&& k, Args&&... args) { - auto res = this->find_or_prepare_insert(k); - if (res.second) - this->emplace_at(res.first, std::piecewise_construct, - std::forward_as_tuple(std::forward(k)), - std::forward_as_tuple(std::forward(args)...)); - return {this->iterator_at(res.first), res.second}; - } -}; - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -// Returns "random" seed. -inline size_t RandomSeed() -{ -#if PHMAP_HAVE_THREAD_LOCAL - static thread_local size_t counter = 0; - size_t value = ++counter; -#else // PHMAP_HAVE_THREAD_LOCAL - static std::atomic counter(0); - size_t value = counter.fetch_add(1, std::memory_order_relaxed); -#endif // PHMAP_HAVE_THREAD_LOCAL - return value ^ static_cast(reinterpret_cast(&counter)); -} - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -template class RefSet, - class Mtx_, - class Policy, class Hash, class Eq, class Alloc> -class parallel_hash_set -{ - using PolicyTraits = hash_policy_traits; - using KeyArgImpl = - KeyArg::value && IsTransparent::value>; - - static_assert(N <= 12, "N = 12 means 4096 hash tables!"); - constexpr static size_t num_tables = 1 << N; - constexpr static size_t mask = num_tables - 1; - -public: - using EmbeddedSet = RefSet; - using EmbeddedIterator= typename EmbeddedSet::iterator; - using EmbeddedConstIterator= typename EmbeddedSet::const_iterator; - using constructor = typename EmbeddedSet::constructor; - using init_type = typename PolicyTraits::init_type; - using key_type = typename PolicyTraits::key_type; - using slot_type = typename PolicyTraits::slot_type; - using allocator_type = Alloc; - using size_type = size_t; - using difference_type = ptrdiff_t; - using hasher = Hash; - using key_equal = Eq; - using policy_type = Policy; - using value_type = typename PolicyTraits::value_type; - using reference = value_type&; - using const_reference = const value_type&; - using pointer = typename phmap::allocator_traits< - allocator_type>::template rebind_traits::pointer; - using const_pointer = typename phmap::allocator_traits< - allocator_type>::template rebind_traits::const_pointer; - - // Alias used for heterogeneous lookup functions. - // `key_arg` evaluates to `K` when the functors are transparent and to - // `key_type` otherwise. It permits template argument deduction on `K` for the - // transparent case. - // -------------------------------------------------------------------- - template - using key_arg = typename KeyArgImpl::template type; - -protected: - using Lockable = phmap::LockableImpl; - - // -------------------------------------------------------------------- - struct Inner : public Lockable - { - bool operator==(const Inner& o) const - { - typename Lockable::SharedLocks l(const_cast(*this), const_cast(o)); - return set_ == o.set_; - } - - EmbeddedSet set_; - }; - -private: - // Give an early error when key_type is not hashable/eq. - // -------------------------------------------------------------------- - auto KeyTypeCanBeHashed(const Hash& h, const key_type& k) -> decltype(h(k)); - auto KeyTypeCanBeEq(const Eq& eq, const key_type& k) -> decltype(eq(k, k)); - - using AllocTraits = phmap::allocator_traits; - - static_assert(std::is_lvalue_reference::value, - "Policy::element() must return a reference"); - - template - struct SameAsElementReference : std::is_same< - typename std::remove_cv::type>::type, - typename std::remove_cv::type>::type> {}; - - // An enabler for insert(T&&): T must be convertible to init_type or be the - // same as [cv] value_type [ref]. - // Note: we separate SameAsElementReference into its own type to avoid using - // reference unless we need to. MSVC doesn't seem to like it in some - // cases. - // -------------------------------------------------------------------- - template - using RequiresInsertable = typename std::enable_if< - phmap::disjunction, - SameAsElementReference>::value, - int>::type; - - // RequiresNotInit is a workaround for gcc prior to 7.1. - // See https://godbolt.org/g/Y4xsUh. - template - using RequiresNotInit = - typename std::enable_if::value, int>::type; - - template - using IsDecomposable = IsDecomposable; - -public: - static_assert(std::is_same::value, - "Allocators with custom pointer types are not supported"); - static_assert(std::is_same::value, - "Allocators with custom pointer types are not supported"); - - // --------------------- i t e r a t o r ------------------------------ - class iterator - { - friend class parallel_hash_set; - - public: - using iterator_category = std::forward_iterator_tag; - using value_type = typename parallel_hash_set::value_type; - using reference = - phmap::conditional_t; - using pointer = phmap::remove_reference_t*; - using difference_type = typename parallel_hash_set::difference_type; - using Inner = typename parallel_hash_set::Inner; - using EmbeddedSet = typename parallel_hash_set::EmbeddedSet; - using EmbeddedIterator = typename EmbeddedSet::iterator; - - iterator() {} - - reference operator*() const { return *it_; } - pointer operator->() const { return &operator*(); } - - iterator& operator++() { - assert(inner_); // null inner means we are already at the end - ++it_; - skip_empty(); - return *this; - } - - iterator operator++(int) { - assert(inner_); // null inner means we are already at the end - auto tmp = *this; - ++*this; - return tmp; - } - - friend bool operator==(const iterator& a, const iterator& b) { - return a.inner_ == b.inner_ && (!a.inner_ || a.it_ == b.it_); - } - - friend bool operator!=(const iterator& a, const iterator& b) { - return !(a == b); - } - - private: - iterator(Inner *inner, Inner *inner_end, const EmbeddedIterator& it) : - inner_(inner), inner_end_(inner_end), it_(it) { // for begin() and end() - if (inner) - it_end_ = inner->set_.end(); - } - - void skip_empty() { - while (it_ == it_end_) { - ++inner_; - if (inner_ == inner_end_) { - inner_ = nullptr; // marks end() - break; - } - else { - it_ = inner_->set_.begin(); - it_end_ = inner_->set_.end(); - } - } - } - - Inner *inner_ = nullptr; - Inner *inner_end_ = nullptr; - EmbeddedIterator it_, it_end_; - }; - - // --------------------- c o n s t i t e r a t o r ----------------- - class const_iterator - { - friend class parallel_hash_set; - - public: - using iterator_category = typename iterator::iterator_category; - using value_type = typename parallel_hash_set::value_type; - using reference = typename parallel_hash_set::const_reference; - using pointer = typename parallel_hash_set::const_pointer; - using difference_type = typename parallel_hash_set::difference_type; - using Inner = typename parallel_hash_set::Inner; - - const_iterator() {} - // Implicit construction from iterator. - const_iterator(iterator i) : iter_(std::move(i)) {} - - reference operator*() const { return *(iter_); } - pointer operator->() const { return iter_.operator->(); } - - const_iterator& operator++() { - ++iter_; - return *this; - } - const_iterator operator++(int) { return iter_++; } - - friend bool operator==(const const_iterator& a, const const_iterator& b) { - return a.iter_ == b.iter_; - } - friend bool operator!=(const const_iterator& a, const const_iterator& b) { - return !(a == b); - } - - private: - const_iterator(const Inner *inner, const Inner *inner_end, const EmbeddedIterator& it) - : iter_(const_cast(inner), - const_cast(inner_end), - const_cast(it)) {} - - iterator iter_; - }; - - using node_type = node_handle, Alloc>; - using insert_return_type = InsertReturnType; - - // ------------------------- c o n s t r u c t o r s ------------------ - - parallel_hash_set() noexcept( - std::is_nothrow_default_constructible::value&& - std::is_nothrow_default_constructible::value&& - std::is_nothrow_default_constructible::value) {} - - explicit parallel_hash_set(size_t bucket_cnt, - const hasher& hash_param = hasher(), - const key_equal& eq = key_equal(), - const allocator_type& alloc = allocator_type()) { - for (auto& inner : sets_) - inner.set_ = EmbeddedSet(bucket_cnt / N, hash_param, eq, alloc); - } - - parallel_hash_set(size_t bucket_cnt, - const hasher& hash_param, - const allocator_type& alloc) - : parallel_hash_set(bucket_cnt, hash_param, key_equal(), alloc) {} - - parallel_hash_set(size_t bucket_cnt, const allocator_type& alloc) - : parallel_hash_set(bucket_cnt, hasher(), key_equal(), alloc) {} - - explicit parallel_hash_set(const allocator_type& alloc) - : parallel_hash_set(0, hasher(), key_equal(), alloc) {} - - template - parallel_hash_set(InputIter first, InputIter last, size_t bucket_cnt = 0, - const hasher& hash_param = hasher(), const key_equal& eq = key_equal(), - const allocator_type& alloc = allocator_type()) - : parallel_hash_set(bucket_cnt, hash_param, eq, alloc) { - insert(first, last); - } - - template - parallel_hash_set(InputIter first, InputIter last, size_t bucket_cnt, - const hasher& hash_param, const allocator_type& alloc) - : parallel_hash_set(first, last, bucket_cnt, hash_param, key_equal(), alloc) {} - - template - parallel_hash_set(InputIter first, InputIter last, size_t bucket_cnt, - const allocator_type& alloc) - : parallel_hash_set(first, last, bucket_cnt, hasher(), key_equal(), alloc) {} - - template - parallel_hash_set(InputIter first, InputIter last, const allocator_type& alloc) - : parallel_hash_set(first, last, 0, hasher(), key_equal(), alloc) {} - - // Instead of accepting std::initializer_list as the first - // argument like std::unordered_set does, we have two overloads - // that accept std::initializer_list and std::initializer_list. - // This is advantageous for performance. - // - // // Turns {"abc", "def"} into std::initializer_list, then copies - // // the strings into the set. - // std::unordered_set s = {"abc", "def"}; - // - // // Turns {"abc", "def"} into std::initializer_list, then - // // copies the strings into the set. - // phmap::flat_hash_set s = {"abc", "def"}; - // - // The same trick is used in insert(). - // - // The enabler is necessary to prevent this constructor from triggering where - // the copy constructor is meant to be called. - // - // phmap::flat_hash_set a, b{a}; - // - // RequiresNotInit is a workaround for gcc prior to 7.1. - // -------------------------------------------------------------------- - template = 0, RequiresInsertable = 0> - parallel_hash_set(std::initializer_list init, size_t bucket_cnt = 0, - const hasher& hash_param = hasher(), const key_equal& eq = key_equal(), - const allocator_type& alloc = allocator_type()) - : parallel_hash_set(init.begin(), init.end(), bucket_cnt, hash_param, eq, alloc) {} - - parallel_hash_set(std::initializer_list init, size_t bucket_cnt = 0, - const hasher& hash_param = hasher(), const key_equal& eq = key_equal(), - const allocator_type& alloc = allocator_type()) - : parallel_hash_set(init.begin(), init.end(), bucket_cnt, hash_param, eq, alloc) {} - - template = 0, RequiresInsertable = 0> - parallel_hash_set(std::initializer_list init, size_t bucket_cnt, - const hasher& hash_param, const allocator_type& alloc) - : parallel_hash_set(init, bucket_cnt, hash_param, key_equal(), alloc) {} - - parallel_hash_set(std::initializer_list init, size_t bucket_cnt, - const hasher& hash_param, const allocator_type& alloc) - : parallel_hash_set(init, bucket_cnt, hash_param, key_equal(), alloc) {} - - template = 0, RequiresInsertable = 0> - parallel_hash_set(std::initializer_list init, size_t bucket_cnt, - const allocator_type& alloc) - : parallel_hash_set(init, bucket_cnt, hasher(), key_equal(), alloc) {} - - parallel_hash_set(std::initializer_list init, size_t bucket_cnt, - const allocator_type& alloc) - : parallel_hash_set(init, bucket_cnt, hasher(), key_equal(), alloc) {} - - template = 0, RequiresInsertable = 0> - parallel_hash_set(std::initializer_list init, const allocator_type& alloc) - : parallel_hash_set(init, 0, hasher(), key_equal(), alloc) {} - - parallel_hash_set(std::initializer_list init, - const allocator_type& alloc) - : parallel_hash_set(init, 0, hasher(), key_equal(), alloc) {} - - parallel_hash_set(const parallel_hash_set& that) - : parallel_hash_set(that, AllocTraits::select_on_container_copy_construction( - that.alloc_ref())) {} - - parallel_hash_set(const parallel_hash_set& that, const allocator_type& a) - : parallel_hash_set(0, that.hash_ref(), that.eq_ref(), a) { - for (size_t i=0; i::value&& - std::is_nothrow_copy_constructible::value&& - std::is_nothrow_copy_constructible::value) - : parallel_hash_set(std::move(that), that.alloc_ref()) { - } - - parallel_hash_set(parallel_hash_set&& that, const allocator_type& a) - { - for (size_t i=0; i::is_always_equal::value && - std::is_nothrow_move_assignable::value && - std::is_nothrow_move_assignable::value) { - for (size_t i=0; i(this)->begin(); } - const_iterator end() const { return const_cast(this)->end(); } - const_iterator cbegin() const { return begin(); } - const_iterator cend() const { return end(); } - - bool empty() const { return !size(); } - - size_t size() const { - size_t sz = 0; - for (const auto& inner : sets_) - sz += inner.set_.size(); - return sz; - } - - size_t capacity() const { - size_t c = 0; - for (const auto& inner : sets_) - c += inner.set_.capacity(); - return c; - } - - size_t max_size() const { return (std::numeric_limits::max)(); } - - PHMAP_ATTRIBUTE_REINITIALIZES void clear() { - for (auto& inner : sets_) - { - typename Lockable::UniqueLock m(inner); - inner.set_.clear(); - } - } - - // extension - clears only soecified submap - // ---------------------------------------- - void clear(std::size_t submap_index) { - Inner& inner = sets_[submap_index]; - typename Lockable::UniqueLock m(inner); - inner.set_.clear(); - } - - // This overload kicks in when the argument is an rvalue of insertable and - // decomposable type other than init_type. - // - // flat_hash_map m; - // m.insert(std::make_pair("abc", 42)); - // -------------------------------------------------------------------- - template = 0, - typename std::enable_if::value, int>::type = 0, - T* = nullptr> - std::pair insert(T&& value) { - return emplace(std::forward(value)); - } - - // This overload kicks in when the argument is a bitfield or an lvalue of - // insertable and decomposable type. - // - // union { int n : 1; }; - // flat_hash_set s; - // s.insert(n); - // - // flat_hash_set s; - // const char* p = "hello"; - // s.insert(p); - // - // TODO(romanp): Once we stop supporting gcc 5.1 and below, replace - // RequiresInsertable with RequiresInsertable. - // We are hitting this bug: https://godbolt.org/g/1Vht4f. - // -------------------------------------------------------------------- - template < - class T, RequiresInsertable = 0, - typename std::enable_if::value, int>::type = 0> - std::pair insert(const T& value) { - return emplace(value); - } - - // This overload kicks in when the argument is an rvalue of init_type. Its - // purpose is to handle brace-init-list arguments. - // - // flat_hash_set> s; - // s.insert({"abc", 42}); - // -------------------------------------------------------------------- - std::pair insert(init_type&& value) { - return emplace(std::move(value)); - } - - template = 0, - typename std::enable_if::value, int>::type = 0, - T* = nullptr> - iterator insert(const_iterator, T&& value) { - return insert(std::forward(value)).first; - } - - // TODO(romanp): Once we stop supporting gcc 5.1 and below, replace - // RequiresInsertable with RequiresInsertable. - // We are hitting this bug: https://godbolt.org/g/1Vht4f. - // -------------------------------------------------------------------- - template < - class T, RequiresInsertable = 0, - typename std::enable_if::value, int>::type = 0> - iterator insert(const_iterator, const T& value) { - return insert(value).first; - } - - iterator insert(const_iterator, init_type&& value) { - return insert(std::move(value)).first; - } - - template - void insert(InputIt first, InputIt last) { - for (; first != last; ++first) insert(*first); - } - - template = 0, RequiresInsertable = 0> - void insert(std::initializer_list ilist) { - insert(ilist.begin(), ilist.end()); - } - - void insert(std::initializer_list ilist) { - insert(ilist.begin(), ilist.end()); - } - - insert_return_type insert(node_type&& node) { - if (!node) - return {end(), false, node_type()}; - auto& key = node.key(); - size_t hashval = this->hash(key); - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - - typename Lockable::UniqueLock m(inner); - auto res = set.insert(std::move(node), hashval); - return { make_iterator(&inner, res.position), - res.inserted, - res.inserted ? node_type() : std::move(res.node) }; - } - - iterator insert(const_iterator, node_type&& node) { - return insert(std::move(node)).first; - } - - struct ReturnKey_ - { - template - Key operator()(Key&& k, const Args&...) const { - return std::forward(k); - } - }; - - // -------------------------------------------------------------------- - // phmap expension: emplace_with_hash - // ---------------------------------- - // same as emplace, but hashval is provided - // -------------------------------------------------------------------- - template - std::pair emplace_decomposable_with_hash(const K& key, size_t hashval, Args&&... args) - { - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - typename Lockable::UniqueLock m(inner); - return make_rv(&inner, set.emplace_decomposable(key, hashval, std::forward(args)...)); - } - - struct EmplaceDecomposableHashval - { - template - std::pair operator()(const K& key, Args&&... args) const { - return s.emplace_decomposable_with_hash(key, hashval, std::forward(args)...); - } - parallel_hash_set& s; - size_t hashval; - }; - - // This overload kicks in if we can deduce the key from args. This enables us - // to avoid constructing value_type if an entry with the same key already - // exists. - // - // For example: - // - // flat_hash_map m = {{"abc", "def"}}; - // // Creates no std::string copies and makes no heap allocations. - // m.emplace("abc", "xyz"); - // -------------------------------------------------------------------- - template ::value, int>::type = 0> - std::pair emplace_with_hash(size_t hashval, Args&&... args) { - return PolicyTraits::apply(EmplaceDecomposableHashval{*this, hashval}, - std::forward(args)...); - } - - // This overload kicks in if we cannot deduce the key from args. It constructs - // value_type unconditionally and then either moves it into the table or - // destroys. - // -------------------------------------------------------------------- - template ::value, int>::type = 0> - std::pair emplace_with_hash(size_t hashval, Args&&... args) { - typename std::aligned_storage::type raw; - slot_type* slot = reinterpret_cast(&raw); - - PolicyTraits::construct(&alloc_ref(), slot, std::forward(args)...); - const auto& elem = PolicyTraits::element(slot); - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - typename Lockable::UniqueLock m(inner); - typename EmbeddedSet::template InsertSlotWithHash f { - inner, std::move(*slot), hashval}; - return make_rv(PolicyTraits::apply(f, elem)); - } - - template - iterator emplace_hint_with_hash(size_t hashval, const_iterator, Args&&... args) { - return emplace_with_hash(hashval, std::forward(args)...).first; - } - - template - iterator lazy_emplace_with_hash(size_t hashval, const key_arg& key, F&& f) { - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - typename Lockable::UniqueLock m(inner); - return make_iterator(&inner, set.lazy_emplace_with_hash(key, hashval, std::forward(f))); - } - - // -------------------------------------------------------------------- - // end of phmap expension - // -------------------------------------------------------------------- - - template - std::pair emplace_decomposable(const K& key, Args&&... args) - { - size_t hashval = this->hash(key); - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - typename Lockable::UniqueLock m(inner); - return make_rv(&inner, set.emplace_decomposable(key, hashval, std::forward(args)...)); - } - - struct EmplaceDecomposable - { - template - std::pair operator()(const K& key, Args&&... args) const { - return s.emplace_decomposable(key, std::forward(args)...); - } - parallel_hash_set& s; - }; - - // This overload kicks in if we can deduce the key from args. This enables us - // to avoid constructing value_type if an entry with the same key already - // exists. - // - // For example: - // - // flat_hash_map m = {{"abc", "def"}}; - // // Creates no std::string copies and makes no heap allocations. - // m.emplace("abc", "xyz"); - // -------------------------------------------------------------------- - template ::value, int>::type = 0> - std::pair emplace(Args&&... args) { - return PolicyTraits::apply(EmplaceDecomposable{*this}, - std::forward(args)...); - } - - // This overload kicks in if we cannot deduce the key from args. It constructs - // value_type unconditionally and then either moves it into the table or - // destroys. - // -------------------------------------------------------------------- - template ::value, int>::type = 0> - std::pair emplace(Args&&... args) { - typename std::aligned_storage::type raw; - slot_type* slot = reinterpret_cast(&raw); - size_t hashval = this->hash(PolicyTraits::key(slot)); - - PolicyTraits::construct(&alloc_ref(), slot, std::forward(args)...); - const auto& elem = PolicyTraits::element(slot); - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - typename Lockable::UniqueLock m(inner); - typename EmbeddedSet::template InsertSlotWithHash f { - inner, std::move(*slot), hashval}; - return make_rv(PolicyTraits::apply(f, elem)); - } - - template - iterator emplace_hint(const_iterator, Args&&... args) { - return emplace(std::forward(args)...).first; - } - - iterator make_iterator(Inner* inner, const EmbeddedIterator it) - { - if (it == inner->set_.end()) - return iterator(); - return iterator(inner, &sets_[0] + num_tables, it); - } - - std::pair make_rv(Inner* inner, - const std::pair& res) - { - return {iterator(inner, &sets_[0] + num_tables, res.first), res.second}; - } - - template - iterator lazy_emplace(const key_arg& key, F&& f) { - auto hashval = this->hash(key); - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - typename Lockable::UniqueLock m(inner); - return make_iterator(&inner, set.lazy_emplace_with_hash(key, hashval, std::forward(f))); - } - - template - bool lazy_emplace_l(const key_arg& key, FExists&& fExists, FEmplace&& fEmplace) { - typename Lockable::UniqueLock m; - auto res = this->find_or_prepare_insert(key, m); - Inner* inner = std::get<0>(res); - if (std::get<2>(res)) - inner->set_.lazy_emplace_at(std::get<1>(res), std::forward(fEmplace)); - else { - auto it = this->iterator_at(inner, inner->set_.iterator_at(std::get<1>(res))); - std::forward(fExists)(Policy::value(&*it)); - } - return std::get<2>(res); - } - - // Extension API: support iterating over all values - // - // flat_hash_set s; - // s.insert(...); - // s.for_each([](auto const & key) { - // // Safely iterates over all the keys - // }); - template - void for_each(F&& fCallback) const { - for (auto const& inner : sets_) { - typename Lockable::SharedLock m(const_cast(inner)); - std::for_each(inner.set_.begin(), inner.set_.end(), fCallback); - } - } - - // this version allows to modify the values - void for_each_m(std::function && fCallback) { - for (auto& inner : sets_) { - typename Lockable::UniqueLock m(const_cast(inner)); - std::for_each(inner.set_.begin(), inner.set_.end(), fCallback); - } - } - - // Extension API: support for heterogeneous keys. - // - // std::unordered_set s; - // // Turns "abc" into std::string. - // s.erase("abc"); - // - // flat_hash_set s; - // // Uses "abc" directly without copying it into std::string. - // s.erase("abc"); - // -------------------------------------------------------------------- - template - size_type erase(const key_arg& key) { - auto hashval = this->hash(key); - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - typename Lockable::UpgradeLock m(inner); - auto it = set.find(key, hashval); - if (it == set.end()) - return 0; - - typename Lockable::UpgradeToUnique unique(m); - set._erase(it); - return 1; - } - - // -------------------------------------------------------------------- - iterator erase(const_iterator cit) { return erase(cit.iter_); } - - // Erases the element pointed to by `it`. Unlike `std::unordered_set::erase`, - // this method returns void to reduce algorithmic complexity to O(1). In - // order to erase while iterating across a map, use the following idiom (which - // also works for standard containers): - // - // for (auto it = m.begin(), end = m.end(); it != end;) { - // if () { - // m._erase(it++); - // } else { - // ++it; - // } - // } - // -------------------------------------------------------------------- - void _erase(iterator it) { - assert(it.inner_ != nullptr); - it.inner_->set_._erase(it.it_); - } - void _erase(const_iterator cit) { _erase(cit.iter_); } - - // This overload is necessary because otherwise erase(const K&) would be - // a better match if non-const iterator is passed as an argument. - // -------------------------------------------------------------------- - iterator erase(iterator it) { _erase(it++); return it; } - - iterator erase(const_iterator first, const_iterator last) { - while (first != last) { - _erase(first++); - } - return last.iter_; - } - - // Moves elements from `src` into `this`. - // If the element already exists in `this`, it is left unmodified in `src`. - // -------------------------------------------------------------------- - template - void merge(parallel_hash_set& src) { // NOLINT - assert(this != &src); - if (this != &src) - { - for (size_t i=0; i - void merge(parallel_hash_set&& src) { - merge(src); - } - - node_type extract(const_iterator position) { - return position.iter_.inner_->set_.extract(EmbeddedConstIterator(position.iter_.it_)); - } - - template < - class K = key_type, - typename std::enable_if::value, int>::type = 0> - node_type extract(const key_arg& key) { - auto it = find(key); - return it == end() ? node_type() : extract(const_iterator{it}); - } - - void swap(parallel_hash_set& that) noexcept( - IsNoThrowSwappable() && - (!AllocTraits::propagate_on_container_swap::value || - IsNoThrowSwappable())) { - using std::swap; - for (size_t i=0; i target ? normalized : target); - } - - // Extension API: support for heterogeneous keys. - // - // std::unordered_set s; - // // Turns "abc" into std::string. - // s.count("abc"); - // - // ch_set s; - // // Uses "abc" directly without copying it into std::string. - // s.count("abc"); - // -------------------------------------------------------------------- - template - size_t count(const key_arg& key) const { - return find(key) == end() ? 0 : 1; - } - - // Issues CPU prefetch instructions for the memory needed to find or insert - // a key. Like all lookup functions, this support heterogeneous keys. - // - // NOTE: This is a very low level operation and should not be used without - // specific benchmarks indicating its importance. - // -------------------------------------------------------------------- - void prefetch_hash(size_t hashval) const { - const Inner& inner = sets_[subidx(hashval)]; - const auto& set = inner.set_; - typename Lockable::SharedLock m(const_cast(inner)); - set.prefetch_hash(hashval); - } - - template - void prefetch(const key_arg& key) const { - prefetch_hash(this->hash(key)); - } - - // The API of find() has two extensions. - // - // 1. The hash can be passed by the user. It must be equal to the hash of the - // key. - // - // 2. The type of the key argument doesn't have to be key_type. This is so - // called heterogeneous key support. - // -------------------------------------------------------------------- - template - iterator find(const key_arg& key, size_t hashval) { - typename Lockable::SharedLock m; - return find(key, hashval, m); - } - - template - iterator find(const key_arg& key) { - return find(key, this->hash(key)); - } - - template - const_iterator find(const key_arg& key, size_t hashval) const { - return const_cast(this)->find(key, hashval); - } - - template - const_iterator find(const key_arg& key) const { - return find(key, this->hash(key)); - } - - template - bool contains(const key_arg& key) const { - return find(key) != end(); - } - - template - bool contains(const key_arg& key, size_t hashval) const { - return find(key, hashval) != end(); - } - - template - std::pair equal_range(const key_arg& key) { - auto it = find(key); - if (it != end()) return {it, std::next(it)}; - return {it, it}; - } - - template - std::pair equal_range( - const key_arg& key) const { - auto it = find(key); - if (it != end()) return {it, std::next(it)}; - return {it, it}; - } - - size_t bucket_count() const { - size_t sz = 0; - for (const auto& inner : sets_) - { - typename Lockable::SharedLock m(const_cast(inner)); - sz += inner.set_.bucket_count(); - } - return sz; - } - - float load_factor() const { - size_t _capacity = bucket_count(); - return _capacity ? static_cast(static_cast(size()) / _capacity) : 0; - } - - float max_load_factor() const { return 1.0f; } - void max_load_factor(float) { - // Does nothing. - } - - hasher hash_function() const { return hash_ref(); } // warning: doesn't match internal hash - use hash() member function - key_equal key_eq() const { return eq_ref(); } - allocator_type get_allocator() const { return alloc_ref(); } - - friend bool operator==(const parallel_hash_set& a, const parallel_hash_set& b) { - return std::equal(a.sets_.begin(), a.sets_.end(), b.sets_.begin()); - } - - friend bool operator!=(const parallel_hash_set& a, const parallel_hash_set& b) { - return !(a == b); - } - - friend void swap(parallel_hash_set& a, - parallel_hash_set& b) noexcept(noexcept(a.swap(b))) { - a.swap(b); - } - - template - size_t hash(const K& key) const { - return HashElement{hash_ref()}(key); - } - -#if !defined(PHMAP_NON_DETERMINISTIC) - template - bool phmap_dump(OutputArchive& ar) const; - - template - bool phmap_load(InputArchive& ar); -#endif - -private: - template - friend struct phmap::priv::hashtable_debug_internal::HashtableDebugAccess; - - struct FindElement - { - template - const_iterator operator()(const K& key, Args&&...) const { - return s.find(key); - } - const parallel_hash_set& s; - }; - - struct HashElement - { - template - size_t operator()(const K& key, Args&&...) const { - return phmap_mix()(h(key)); - } - const hasher& h; - }; - - template - struct EqualElement - { - template - bool operator()(const K2& lhs, Args&&...) const { - return eq(lhs, rhs); - } - const K1& rhs; - const key_equal& eq; - }; - - // "erases" the object from the container, except that it doesn't actually - // destroy the object. It only updates all the metadata of the class. - // This can be used in conjunction with Policy::transfer to move the object to - // another place. - // -------------------------------------------------------------------- - void erase_meta_only(const_iterator cit) { - auto &it = cit.iter_; - assert(it.set_ != nullptr); - it.set_.erase_meta_only(const_iterator(it.it_)); - } - - void drop_deletes_without_resize() PHMAP_ATTRIBUTE_NOINLINE { - for (auto& inner : sets_) - { - typename Lockable::UniqueLock m(inner); - inner.set_.drop_deletes_without_resize(); - } - } - - bool has_element(const value_type& elem) const { - size_t hashval = PolicyTraits::apply(HashElement{hash_ref()}, elem); - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - typename Lockable::SharedLock m(const_cast(inner)); - return set.has_element(elem, hashval); - } - - // TODO(alkis): Optimize this assuming *this and that don't overlap. - // -------------------------------------------------------------------- - parallel_hash_set& move_assign(parallel_hash_set&& that, std::true_type) { - parallel_hash_set tmp(std::move(that)); - swap(tmp); - return *this; - } - - parallel_hash_set& move_assign(parallel_hash_set&& that, std::false_type) { - parallel_hash_set tmp(std::move(that), alloc_ref()); - swap(tmp); - return *this; - } - -protected: - template - pointer find_ptr(const key_arg& key, size_t hashval, L& mutexlock) - { - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - mutexlock = std::move(L(inner)); - return set.find_ptr(key, hashval); - } - - template - iterator find(const key_arg& key, size_t hashval, L& mutexlock) { - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - mutexlock = std::move(L(inner)); - return make_iterator(&inner, set.find(key, hashval)); - } - - template - std::tuple - find_or_prepare_insert_with_hash(size_t hashval, const K& key, typename Lockable::UniqueLock &mutexlock) { - Inner& inner = sets_[subidx(hashval)]; - auto& set = inner.set_; - mutexlock = std::move(typename Lockable::UniqueLock(inner)); - auto p = set.find_or_prepare_insert(key, hashval); // std::pair - return std::make_tuple(&inner, p.first, p.second); - } - - template - std::tuple - find_or_prepare_insert(const K& key, typename Lockable::UniqueLock &mutexlock) { - return find_or_prepare_insert_with_hash(this->hash(key), key, mutexlock); - } - - iterator iterator_at(Inner *inner, - const EmbeddedIterator& it) { - return {inner, &sets_[0] + num_tables, it}; - } - const_iterator iterator_at(Inner *inner, - const EmbeddedIterator& it) const { - return {inner, &sets_[0] + num_tables, it}; - } - - static size_t subidx(size_t hashval) { - return ((hashval >> 8) ^ (hashval >> 16) ^ (hashval >> 24)) & mask; - } - - static size_t subcnt() { - return num_tables; - } - -private: - friend struct RawHashSetTestOnlyAccess; - - size_t growth_left() { - size_t sz = 0; - for (const auto& set : sets_) - sz += set.growth_left(); - return sz; - } - - hasher& hash_ref() { return sets_[0].set_.hash_ref(); } - const hasher& hash_ref() const { return sets_[0].set_.hash_ref(); } - key_equal& eq_ref() { return sets_[0].set_.eq_ref(); } - const key_equal& eq_ref() const { return sets_[0].set_.eq_ref(); } - allocator_type& alloc_ref() { return sets_[0].set_.alloc_ref(); } - const allocator_type& alloc_ref() const { - return sets_[0].set_.alloc_ref(); - } - -protected: // protected in case users want to derive fromm this - std::array sets_; -}; - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template class RefSet, - class Mtx_, - class Policy, class Hash, class Eq, class Alloc> -class parallel_hash_map : public parallel_hash_set -{ - // P is Policy. It's passed as a template argument to support maps that have - // incomplete types as values, as in unordered_map. - // MappedReference<> may be a non-reference type. - template - using MappedReference = decltype(P::value( - std::addressof(std::declval()))); - - // MappedConstReference<> may be a non-reference type. - template - using MappedConstReference = decltype(P::value( - std::addressof(std::declval()))); - - using KeyArgImpl = - KeyArg::value && IsTransparent::value>; - - using Base = typename parallel_hash_map::parallel_hash_set; - using Lockable = phmap::LockableImpl; - -public: - using key_type = typename Policy::key_type; - using mapped_type = typename Policy::mapped_type; - template - using key_arg = typename KeyArgImpl::template type; - - static_assert(!std::is_reference::value, ""); - // TODO(alkis): remove this assertion and verify that reference mapped_type is - // supported. - static_assert(!std::is_reference::value, ""); - - using iterator = typename parallel_hash_map::parallel_hash_set::iterator; - using const_iterator = typename parallel_hash_map::parallel_hash_set::const_iterator; - - parallel_hash_map() {} - -#ifdef __INTEL_COMPILER - using Base::parallel_hash_set; -#else - using parallel_hash_map::parallel_hash_set::parallel_hash_set; -#endif - - // The last two template parameters ensure that both arguments are rvalues - // (lvalue arguments are handled by the overloads below). This is necessary - // for supporting bitfield arguments. - // - // union { int n : 1; }; - // flat_hash_map m; - // m.insert_or_assign(n, n); - template - std::pair insert_or_assign(key_arg&& k, V&& v) { - return insert_or_assign_impl(std::forward(k), std::forward(v)); - } - - template - std::pair insert_or_assign(key_arg&& k, const V& v) { - return insert_or_assign_impl(std::forward(k), v); - } - - template - std::pair insert_or_assign(const key_arg& k, V&& v) { - return insert_or_assign_impl(k, std::forward(v)); - } - - template - std::pair insert_or_assign(const key_arg& k, const V& v) { - return insert_or_assign_impl(k, v); - } - - template - iterator insert_or_assign(const_iterator, key_arg&& k, V&& v) { - return insert_or_assign(std::forward(k), std::forward(v)).first; - } - - template - iterator insert_or_assign(const_iterator, key_arg&& k, const V& v) { - return insert_or_assign(std::forward(k), v).first; - } - - template - iterator insert_or_assign(const_iterator, const key_arg& k, V&& v) { - return insert_or_assign(k, std::forward(v)).first; - } - - template - iterator insert_or_assign(const_iterator, const key_arg& k, const V& v) { - return insert_or_assign(k, v).first; - } - - template ::value, int>::type = 0, - K* = nullptr> - std::pair try_emplace(key_arg&& k, Args&&... args) { - return try_emplace_impl(std::forward(k), std::forward(args)...); - } - - template ::value, int>::type = 0> - std::pair try_emplace(const key_arg& k, Args&&... args) { - return try_emplace_impl(k, std::forward(args)...); - } - - template - iterator try_emplace(const_iterator, key_arg&& k, Args&&... args) { - return try_emplace(std::forward(k), std::forward(args)...).first; - } - - template - iterator try_emplace(const_iterator, const key_arg& k, Args&&... args) { - return try_emplace(k, std::forward(args)...).first; - } - - template - MappedReference

at(const key_arg& key) { - auto it = this->find(key); - if (it == this->end()) - phmap::base_internal::ThrowStdOutOfRange("phmap at(): lookup non-existent key"); - return Policy::value(&*it); - } - - template - MappedConstReference

at(const key_arg& key) const { - auto it = this->find(key); - if (it == this->end()) - phmap::base_internal::ThrowStdOutOfRange("phmap at(): lookup non-existent key"); - return Policy::value(&*it); - } - - // ----------- phmap extensions -------------------------- - - template ::value, int>::type = 0, - K* = nullptr> - std::pair try_emplace_with_hash(size_t hashval, key_arg&& k, Args&&... args) { - return try_emplace_impl_with_hash(hashval, std::forward(k), std::forward(args)...); - } - - template ::value, int>::type = 0> - std::pair try_emplace_with_hash(size_t hashval, const key_arg& k, Args&&... args) { - return try_emplace_impl_with_hash(hashval, k, std::forward(args)...); - } - - template - iterator try_emplace_with_hash(size_t hashval, const_iterator, key_arg&& k, Args&&... args) { - return try_emplace_with_hash(hashval, std::forward(k), std::forward(args)...).first; - } - - template - iterator try_emplace_with_hash(size_t hashval, const_iterator, const key_arg& k, Args&&... args) { - return try_emplace_with_hash(hashval, k, std::forward(args)...).first; - } - - // if map contains key, lambda is called with the mapped value (under read lock protection), - // and if_contains returns true. This is a const API and lambda should not modify the value - // ----------------------------------------------------------------------------------------- - template - bool if_contains(const key_arg& key, F&& f) const { - return const_cast(this)->template - modify_if_impl(key, std::forward(f)); - } - - // if map contains key, lambda is called with the mapped value without read lock protection, - // and if_contains_unsafe returns true. This is a const API and lambda should not modify the value - // This should be used only if we know that no other thread may be mutating the map at the time. - // ----------------------------------------------------------------------------------------- - template - bool if_contains_unsafe(const key_arg& key, F&& f) const { - return const_cast(this)->template - modify_if_impl::DoNothing>(key, std::forward(f)); - } - - // if map contains key, lambda is called with the mapped value (under write lock protection), - // and modify_if returns true. This is a non-const API and lambda is allowed to modify the mapped value - // ---------------------------------------------------------------------------------------------------- - template - bool modify_if(const key_arg& key, F&& f) { - return modify_if_impl(key, std::forward(f)); - } - - - // if map contains key, lambda is called with the mapped value (under write lock protection). - // If the lambda returns true, the key is subsequently erased from the map (the write lock - // is only released after erase). - // returns true if key was erased, false otherwise. - // ---------------------------------------------------------------------------------------------------- - template - bool erase_if(const key_arg& key, F&& f) { - return erase_if_impl(key, std::forward(f)); - } - - // if map does not contains key, it is inserted and the mapped value is value-constructed - // with the provided arguments (if any), as with try_emplace. - // if map already contains key, then the lambda is called with the mapped value (under - // write lock protection) and can update the mapped value. - // returns true if key was not already present, false otherwise. - // --------------------------------------------------------------------------------------- - template - bool try_emplace_l(K&& k, F&& f, Args&&... args) { - typename Lockable::UniqueLock m; - auto res = this->find_or_prepare_insert(k, m); - typename Base::Inner *inner = std::get<0>(res); - if (std::get<2>(res)) - inner->set_.emplace_at(std::get<1>(res), std::piecewise_construct, - std::forward_as_tuple(std::forward(k)), - std::forward_as_tuple(std::forward(args)...)); - else { - auto it = this->iterator_at(inner, inner->set_.iterator_at(std::get<1>(res))); - std::forward(f)(Policy::value(&*it)); - } - return std::get<2>(res); - } - - // ----------- end of phmap extensions -------------------------- - - template - MappedReference

operator[](key_arg&& key) { - return Policy::value(&*try_emplace(std::forward(key)).first); - } - - template - MappedReference

operator[](const key_arg& key) { - return Policy::value(&*try_emplace(key).first); - } - -private: - template - bool modify_if_impl(const key_arg& key, F&& f) { -#if __cplusplus >= 201703L - static_assert(std::is_invocable::value); -#endif - L m; - auto ptr = this->template find_ptr(key, this->hash(key), m); - if (ptr == nullptr) - return false; - std::forward(f)(Policy::value(ptr)); - return true; - } - - template - bool erase_if_impl(const key_arg& key, F&& f) { -#if __cplusplus >= 201703L - static_assert(std::is_invocable::value); -#endif - L m; - auto it = this->template find(key, this->hash(key), m); - if (it == this->end()) return false; - if (std::forward(f)(Policy::value(&*it))) - { - this->erase(it); - return true; - } - return false; - } - - - template - std::pair insert_or_assign_impl(K&& k, V&& v) { - typename Lockable::UniqueLock m; - auto res = this->find_or_prepare_insert(k, m); - typename Base::Inner *inner = std::get<0>(res); - if (std::get<2>(res)) - inner->set_.emplace_at(std::get<1>(res), std::forward(k), std::forward(v)); - else - Policy::value(&*inner->set_.iterator_at(std::get<1>(res))) = std::forward(v); - return {this->iterator_at(inner, inner->set_.iterator_at(std::get<1>(res))), - std::get<2>(res)}; - } - - template - std::pair try_emplace_impl(K&& k, Args&&... args) { - typename Lockable::UniqueLock m; - auto res = this->find_or_prepare_insert(k, m); - typename Base::Inner *inner = std::get<0>(res); - if (std::get<2>(res)) - inner->set_.emplace_at(std::get<1>(res), std::piecewise_construct, - std::forward_as_tuple(std::forward(k)), - std::forward_as_tuple(std::forward(args)...)); - return {this->iterator_at(inner, inner->set_.iterator_at(std::get<1>(res))), - std::get<2>(res)}; - } - - template - std::pair try_emplace_impl_with_hash(size_t hashval, K&& k, Args&&... args) { - typename Lockable::UniqueLock m; - auto res = this->find_or_prepare_insert_with_hash(hashval, k, m); - typename Base::Inner *inner = std::get<0>(res); - if (std::get<2>(res)) - inner->set_.emplace_at(std::get<1>(res), std::piecewise_construct, - std::forward_as_tuple(std::forward(k)), - std::forward_as_tuple(std::forward(args)...)); - return {this->iterator_at(inner, inner->set_.iterator_at(std::get<1>(res))), - std::get<2>(res)}; - } - - -}; - - -// Constructs T into uninitialized storage pointed by `ptr` using the args -// specified in the tuple. -// ---------------------------------------------------------------------------- -template -void ConstructFromTuple(Alloc* alloc, T* ptr, Tuple&& t) { - memory_internal::ConstructFromTupleImpl( - alloc, ptr, std::forward(t), - phmap::make_index_sequence< - std::tuple_size::type>::value>()); -} - -// Constructs T using the args specified in the tuple and calls F with the -// constructed value. -// ---------------------------------------------------------------------------- -template -decltype(std::declval()(std::declval())) WithConstructed( - Tuple&& t, F&& f) { - return memory_internal::WithConstructedImpl( - std::forward(t), - phmap::make_index_sequence< - std::tuple_size::type>::value>(), - std::forward(f)); -} - -// ---------------------------------------------------------------------------- -// Given arguments of an std::pair's consructor, PairArgs() returns a pair of -// tuples with references to the passed arguments. The tuples contain -// constructor arguments for the first and the second elements of the pair. -// -// The following two snippets are equivalent. -// -// 1. std::pair p(args...); -// -// 2. auto a = PairArgs(args...); -// std::pair p(std::piecewise_construct, -// std::move(p.first), std::move(p.second)); -// ---------------------------------------------------------------------------- -inline std::pair, std::tuple<>> PairArgs() { return {}; } - -template -std::pair, std::tuple> PairArgs(F&& f, S&& s) { - return {std::piecewise_construct, std::forward_as_tuple(std::forward(f)), - std::forward_as_tuple(std::forward(s))}; -} - -template -std::pair, std::tuple> PairArgs( - const std::pair& p) { - return PairArgs(p.first, p.second); -} - -template -std::pair, std::tuple> PairArgs(std::pair&& p) { - return PairArgs(std::forward(p.first), std::forward(p.second)); -} - -template -auto PairArgs(std::piecewise_construct_t, F&& f, S&& s) - -> decltype(std::make_pair(memory_internal::TupleRef(std::forward(f)), - memory_internal::TupleRef(std::forward(s)))) { - return std::make_pair(memory_internal::TupleRef(std::forward(f)), - memory_internal::TupleRef(std::forward(s))); -} - -// A helper function for implementing apply() in map policies. -// ---------------------------------------------------------------------------- -template -auto DecomposePair(F&& f, Args&&... args) - -> decltype(memory_internal::DecomposePairImpl( - std::forward(f), PairArgs(std::forward(args)...))) { - return memory_internal::DecomposePairImpl( - std::forward(f), PairArgs(std::forward(args)...)); -} - -// A helper function for implementing apply() in set policies. -// ---------------------------------------------------------------------------- -template -decltype(std::declval()(std::declval(), std::declval())) -DecomposeValue(F&& f, Arg&& arg) { - const auto& key = arg; - return std::forward(f)(key, std::forward(arg)); -} - - -// -------------------------------------------------------------------------- -// Policy: a policy defines how to perform different operations on -// the slots of the hashtable (see hash_policy_traits.h for the full interface -// of policy). -// -// Hash: a (possibly polymorphic) functor that hashes keys of the hashtable. The -// functor should accept a key and return size_t as hash. For best performance -// it is important that the hash function provides high entropy across all bits -// of the hash. -// -// Eq: a (possibly polymorphic) functor that compares two keys for equality. It -// should accept two (of possibly different type) keys and return a bool: true -// if they are equal, false if they are not. If two keys compare equal, then -// their hash values as defined by Hash MUST be equal. -// -// Allocator: an Allocator [https://devdocs.io/cpp/concept/allocator] with which -// the storage of the hashtable will be allocated and the elements will be -// constructed and destroyed. -// -------------------------------------------------------------------------- -template -struct FlatHashSetPolicy -{ - using slot_type = T; - using key_type = T; - using init_type = T; - using constant_iterators = std::true_type; - - template - static void construct(Allocator* alloc, slot_type* slot, Args&&... args) { - phmap::allocator_traits::construct(*alloc, slot, - std::forward(args)...); - } - - template - static void destroy(Allocator* alloc, slot_type* slot) { - phmap::allocator_traits::destroy(*alloc, slot); - } - - template - static void transfer(Allocator* alloc, slot_type* new_slot, - slot_type* old_slot) { - construct(alloc, new_slot, std::move(*old_slot)); - destroy(alloc, old_slot); - } - - static T& element(slot_type* slot) { return *slot; } - - template - static decltype(phmap::priv::DecomposeValue( - std::declval(), std::declval()...)) - apply(F&& f, Args&&... args) { - return phmap::priv::DecomposeValue( - std::forward(f), std::forward(args)...); - } - - static size_t space_used(const T*) { return 0; } -}; - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -struct FlatHashMapPolicy -{ - using slot_policy = priv::map_slot_policy; - using slot_type = typename slot_policy::slot_type; - using key_type = K; - using mapped_type = V; - using init_type = std::pair; - - template - static void construct(Allocator* alloc, slot_type* slot, Args&&... args) { - slot_policy::construct(alloc, slot, std::forward(args)...); - } - - template - static void destroy(Allocator* alloc, slot_type* slot) { - slot_policy::destroy(alloc, slot); - } - - template - static void transfer(Allocator* alloc, slot_type* new_slot, - slot_type* old_slot) { - slot_policy::transfer(alloc, new_slot, old_slot); - } - - template - static decltype(phmap::priv::DecomposePair( - std::declval(), std::declval()...)) - apply(F&& f, Args&&... args) { - return phmap::priv::DecomposePair(std::forward(f), - std::forward(args)...); - } - - static size_t space_used(const slot_type*) { return 0; } - - static std::pair& element(slot_type* slot) { return slot->value; } - - static V& value(std::pair* kv) { return kv->second; } - static const V& value(const std::pair* kv) { return kv->second; } -}; - -template -struct node_hash_policy { - static_assert(std::is_lvalue_reference::value, ""); - - using slot_type = typename std::remove_cv< - typename std::remove_reference::type>::type*; - - template - static void construct(Alloc* alloc, slot_type* slot, Args&&... args) { - *slot = Policy::new_element(alloc, std::forward(args)...); - } - - template - static void destroy(Alloc* alloc, slot_type* slot) { - Policy::delete_element(alloc, *slot); - } - - template - static void transfer(Alloc*, slot_type* new_slot, slot_type* old_slot) { - *new_slot = *old_slot; - } - - static size_t space_used(const slot_type* slot) { - if (slot == nullptr) return Policy::element_space_used(nullptr); - return Policy::element_space_used(*slot); - } - - static Reference element(slot_type* slot) { return **slot; } - - template - static auto value(T* elem) -> decltype(P::value(elem)) { - return P::value(elem); - } - - template - static auto apply(Ts&&... ts) -> decltype(P::apply(std::forward(ts)...)) { - return P::apply(std::forward(ts)...); - } -}; - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -struct NodeHashSetPolicy - : phmap::priv::node_hash_policy> -{ - using key_type = T; - using init_type = T; - using constant_iterators = std::true_type; - - template - static T* new_element(Allocator* alloc, Args&&... args) { - using ValueAlloc = - typename phmap::allocator_traits::template rebind_alloc; - ValueAlloc value_alloc(*alloc); - T* res = phmap::allocator_traits::allocate(value_alloc, 1); - phmap::allocator_traits::construct(value_alloc, res, - std::forward(args)...); - return res; - } - - template - static void delete_element(Allocator* alloc, T* elem) { - using ValueAlloc = - typename phmap::allocator_traits::template rebind_alloc; - ValueAlloc value_alloc(*alloc); - phmap::allocator_traits::destroy(value_alloc, elem); - phmap::allocator_traits::deallocate(value_alloc, elem, 1); - } - - template - static decltype(phmap::priv::DecomposeValue( - std::declval(), std::declval()...)) - apply(F&& f, Args&&... args) { - return phmap::priv::DecomposeValue( - std::forward(f), std::forward(args)...); - } - - static size_t element_space_used(const T*) { return sizeof(T); } -}; - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -class NodeHashMapPolicy - : public phmap::priv::node_hash_policy< - std::pair&, NodeHashMapPolicy> -{ - using value_type = std::pair; - -public: - using key_type = Key; - using mapped_type = Value; - using init_type = std::pair; - - template - static value_type* new_element(Allocator* alloc, Args&&... args) { - using PairAlloc = typename phmap::allocator_traits< - Allocator>::template rebind_alloc; - PairAlloc pair_alloc(*alloc); - value_type* res = - phmap::allocator_traits::allocate(pair_alloc, 1); - phmap::allocator_traits::construct(pair_alloc, res, - std::forward(args)...); - return res; - } - - template - static void delete_element(Allocator* alloc, value_type* pair) { - using PairAlloc = typename phmap::allocator_traits< - Allocator>::template rebind_alloc; - PairAlloc pair_alloc(*alloc); - phmap::allocator_traits::destroy(pair_alloc, pair); - phmap::allocator_traits::deallocate(pair_alloc, pair, 1); - } - - template - static decltype(phmap::priv::DecomposePair( - std::declval(), std::declval()...)) - apply(F&& f, Args&&... args) { - return phmap::priv::DecomposePair(std::forward(f), - std::forward(args)...); - } - - static size_t element_space_used(const value_type*) { - return sizeof(value_type); - } - - static Value& value(value_type* elem) { return elem->second; } - static const Value& value(const value_type* elem) { return elem->second; } -}; - - -// -------------------------------------------------------------------------- -// hash_default -// -------------------------------------------------------------------------- - -#if PHMAP_HAVE_STD_STRING_VIEW - -// support char16_t wchar_t .... -template -struct StringHashT -{ - using is_transparent = void; - - size_t operator()(std::basic_string_view v) const { - std::string_view bv{reinterpret_cast(v.data()), v.size() * sizeof(CharT)}; - return std::hash()(bv); - } -}; - -// Supports heterogeneous lookup for basic_string-like elements. -template -struct StringHashEqT -{ - using Hash = StringHashT; - - struct Eq { - using is_transparent = void; - - bool operator()(std::basic_string_view lhs, std::basic_string_view rhs) const { - return lhs == rhs; - } - }; -}; - -template <> -struct HashEq : StringHashEqT {}; - -template <> -struct HashEq : StringHashEqT {}; - -// char16_t -template <> -struct HashEq : StringHashEqT {}; - -template <> -struct HashEq : StringHashEqT {}; - -// wchar_t -template <> -struct HashEq : StringHashEqT {}; - -template <> -struct HashEq : StringHashEqT {}; - -#endif - -// Supports heterogeneous lookup for pointers and smart pointers. -// ------------------------------------------------------------- -template -struct HashEq -{ - struct Hash { - using is_transparent = void; - template - size_t operator()(const U& ptr) const { - return phmap::Hash{}(HashEq::ToPtr(ptr)); - } - }; - - struct Eq { - using is_transparent = void; - template - bool operator()(const A& a, const B& b) const { - return HashEq::ToPtr(a) == HashEq::ToPtr(b); - } - }; - -private: - static const T* ToPtr(const T* ptr) { return ptr; } - - template - static const T* ToPtr(const std::unique_ptr& ptr) { - return ptr.get(); - } - - template - static const T* ToPtr(const std::shared_ptr& ptr) { - return ptr.get(); - } -}; - -template -struct HashEq> : HashEq {}; - -template -struct HashEq> : HashEq {}; - -namespace hashtable_debug_internal { - -// -------------------------------------------------------------------------- -// -------------------------------------------------------------------------- -template -struct HashtableDebugAccess> -{ - using Traits = typename Set::PolicyTraits; - using Slot = typename Traits::slot_type; - - static size_t GetNumProbes(const Set& set, - const typename Set::key_type& key) { - size_t num_probes = 0; - size_t hashval = set.hash(key); - auto seq = set.probe(hashval); - while (true) { - priv::Group g{set.ctrl_ + seq.offset()}; - for (int i : g.Match(priv::H2(hashval))) { - if (Traits::apply( - typename Set::template EqualElement{ - key, set.eq_ref()}, - Traits::element(set.slots_ + seq.offset((size_t)i)))) - return num_probes; - ++num_probes; - } - if (g.MatchEmpty()) return num_probes; - seq.next(); - ++num_probes; - } - } - - static size_t AllocatedByteSize(const Set& c) { - size_t capacity = c.capacity_; - if (capacity == 0) return 0; - auto layout = Set::MakeLayout(capacity); - size_t m = layout.AllocSize(); - - size_t per_slot = Traits::space_used(static_cast(nullptr)); - if (per_slot != ~size_t{}) { - m += per_slot * c.size(); - } else { - for (size_t i = 0; i != capacity; ++i) { - if (priv::IsFull(c.ctrl_[i])) { - m += Traits::space_used(c.slots_ + i); - } - } - } - return m; - } - - static size_t LowerBoundAllocatedByteSize(size_t size) { - size_t capacity = GrowthToLowerboundCapacity(size); - if (capacity == 0) return 0; - auto layout = Set::MakeLayout(NormalizeCapacity(capacity)); - size_t m = layout.AllocSize(); - size_t per_slot = Traits::space_used(static_cast(nullptr)); - if (per_slot != ~size_t{}) { - m += per_slot * size; - } - return m; - } -}; - -} // namespace hashtable_debug_internal -} // namespace priv - -// ----------------------------------------------------------------------------- -// phmap::flat_hash_set -// ----------------------------------------------------------------------------- -// An `phmap::flat_hash_set` is an unordered associative container which has -// been optimized for both speed and memory footprint in most common use cases. -// Its interface is similar to that of `std::unordered_set` with the -// following notable differences: -// -// * Supports heterogeneous lookup, through `find()`, `operator[]()` and -// `insert()`, provided that the set is provided a compatible heterogeneous -// hashing function and equality operator. -// * Invalidates any references and pointers to elements within the table after -// `rehash()`. -// * Contains a `capacity()` member function indicating the number of element -// slots (open, deleted, and empty) within the hash set. -// * Returns `void` from the `_erase(iterator)` overload. -// ----------------------------------------------------------------------------- -template // default values in phmap_fwd_decl.h -class flat_hash_set - : public phmap::priv::raw_hash_set< - phmap::priv::FlatHashSetPolicy, Hash, Eq, Alloc> -{ - using Base = typename flat_hash_set::raw_hash_set; - -public: - flat_hash_set() {} -#ifdef __INTEL_COMPILER - using Base::raw_hash_set; -#else - using Base::Base; -#endif - using Base::begin; - using Base::cbegin; - using Base::cend; - using Base::end; - using Base::capacity; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; // may shrink - To avoid shrinking `erase(begin(), end())` - using Base::erase; - using Base::insert; - using Base::emplace; - using Base::emplace_hint; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::rehash; - using Base::reserve; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::bucket_count; - using Base::load_factor; - using Base::max_load_factor; - using Base::get_allocator; - using Base::hash_function; - using Base::hash; - using Base::key_eq; -}; - -// ----------------------------------------------------------------------------- -// phmap::flat_hash_map -// ----------------------------------------------------------------------------- -// -// An `phmap::flat_hash_map` is an unordered associative container which -// has been optimized for both speed and memory footprint in most common use -// cases. Its interface is similar to that of `std::unordered_map` with -// the following notable differences: -// -// * Supports heterogeneous lookup, through `find()`, `operator[]()` and -// `insert()`, provided that the map is provided a compatible heterogeneous -// hashing function and equality operator. -// * Invalidates any references and pointers to elements within the table after -// `rehash()`. -// * Contains a `capacity()` member function indicating the number of element -// slots (open, deleted, and empty) within the hash map. -// * Returns `void` from the `_erase(iterator)` overload. -// ----------------------------------------------------------------------------- -template // default values in phmap_fwd_decl.h -class flat_hash_map : public phmap::priv::raw_hash_map< - phmap::priv::FlatHashMapPolicy, - Hash, Eq, Alloc> { - using Base = typename flat_hash_map::raw_hash_map; - -public: - flat_hash_map() {} -#ifdef __INTEL_COMPILER - using Base::raw_hash_map; -#else - using Base::Base; -#endif - using Base::begin; - using Base::cbegin; - using Base::cend; - using Base::end; - using Base::capacity; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::insert_or_assign; - using Base::emplace; - using Base::emplace_hint; - using Base::try_emplace; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::rehash; - using Base::reserve; - using Base::at; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::operator[]; - using Base::bucket_count; - using Base::load_factor; - using Base::max_load_factor; - using Base::get_allocator; - using Base::hash_function; - using Base::hash; - using Base::key_eq; -}; - -// ----------------------------------------------------------------------------- -// phmap::node_hash_set -// ----------------------------------------------------------------------------- -// An `phmap::node_hash_set` is an unordered associative container which -// has been optimized for both speed and memory footprint in most common use -// cases. Its interface is similar to that of `std::unordered_set` with the -// following notable differences: -// -// * Supports heterogeneous lookup, through `find()`, `operator[]()` and -// `insert()`, provided that the map is provided a compatible heterogeneous -// hashing function and equality operator. -// * Contains a `capacity()` member function indicating the number of element -// slots (open, deleted, and empty) within the hash set. -// * Returns `void` from the `erase(iterator)` overload. -// ----------------------------------------------------------------------------- -template // default values in phmap_fwd_decl.h -class node_hash_set - : public phmap::priv::raw_hash_set< - phmap::priv::NodeHashSetPolicy, Hash, Eq, Alloc> -{ - using Base = typename node_hash_set::raw_hash_set; - -public: - node_hash_set() {} -#ifdef __INTEL_COMPILER - using Base::raw_hash_set; -#else - using Base::Base; -#endif - using Base::begin; - using Base::cbegin; - using Base::cend; - using Base::end; - using Base::capacity; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::emplace; - using Base::emplace_hint; - using Base::emplace_with_hash; - using Base::emplace_hint_with_hash; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::rehash; - using Base::reserve; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::bucket_count; - using Base::load_factor; - using Base::max_load_factor; - using Base::get_allocator; - using Base::hash_function; - using Base::hash; - using Base::key_eq; - typename Base::hasher hash_funct() { return this->hash_function(); } - void resize(typename Base::size_type hint) { this->rehash(hint); } -}; - -// ----------------------------------------------------------------------------- -// phmap::node_hash_map -// ----------------------------------------------------------------------------- -// -// An `phmap::node_hash_map` is an unordered associative container which -// has been optimized for both speed and memory footprint in most common use -// cases. Its interface is similar to that of `std::unordered_map` with -// the following notable differences: -// -// * Supports heterogeneous lookup, through `find()`, `operator[]()` and -// `insert()`, provided that the map is provided a compatible heterogeneous -// hashing function and equality operator. -// * Contains a `capacity()` member function indicating the number of element -// slots (open, deleted, and empty) within the hash map. -// * Returns `void` from the `erase(iterator)` overload. -// ----------------------------------------------------------------------------- -template // default values in phmap_fwd_decl.h -class node_hash_map - : public phmap::priv::raw_hash_map< - phmap::priv::NodeHashMapPolicy, Hash, Eq, - Alloc> -{ - using Base = typename node_hash_map::raw_hash_map; - -public: - node_hash_map() {} -#ifdef __INTEL_COMPILER - using Base::raw_hash_map; -#else - using Base::Base; -#endif - using Base::begin; - using Base::cbegin; - using Base::cend; - using Base::end; - using Base::capacity; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::insert_or_assign; - using Base::emplace; - using Base::emplace_hint; - using Base::try_emplace; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::rehash; - using Base::reserve; - using Base::at; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::operator[]; - using Base::bucket_count; - using Base::load_factor; - using Base::max_load_factor; - using Base::get_allocator; - using Base::hash_function; - using Base::hash; - using Base::key_eq; - typename Base::hasher hash_funct() { return this->hash_function(); } - void resize(typename Base::size_type hint) { this->rehash(hint); } -}; - -// ----------------------------------------------------------------------------- -// phmap::parallel_flat_hash_set -// ----------------------------------------------------------------------------- -template // default values in phmap_fwd_decl.h -class parallel_flat_hash_set - : public phmap::priv::parallel_hash_set< - N, phmap::priv::raw_hash_set, Mtx_, - phmap::priv::FlatHashSetPolicy, - Hash, Eq, Alloc> -{ - using Base = typename parallel_flat_hash_set::parallel_hash_set; - -public: - parallel_flat_hash_set() {} -#ifdef __INTEL_COMPILER - using Base::parallel_hash_set; -#else - using Base::Base; -#endif - using Base::hash; - using Base::subidx; - using Base::subcnt; - using Base::begin; - using Base::cbegin; - using Base::cend; - using Base::end; - using Base::capacity; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::emplace; - using Base::emplace_hint; - using Base::emplace_with_hash; - using Base::emplace_hint_with_hash; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::rehash; - using Base::reserve; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::bucket_count; - using Base::load_factor; - using Base::max_load_factor; - using Base::get_allocator; - using Base::hash_function; - using Base::key_eq; -}; - -// ----------------------------------------------------------------------------- -// phmap::parallel_flat_hash_map - default values in phmap_fwd_decl.h -// ----------------------------------------------------------------------------- -template -class parallel_flat_hash_map : public phmap::priv::parallel_hash_map< - N, phmap::priv::raw_hash_set, Mtx_, - phmap::priv::FlatHashMapPolicy, - Hash, Eq, Alloc> -{ - using Base = typename parallel_flat_hash_map::parallel_hash_map; - -public: - parallel_flat_hash_map() {} -#ifdef __INTEL_COMPILER - using Base::parallel_hash_map; -#else - using Base::Base; -#endif - using Base::hash; - using Base::subidx; - using Base::subcnt; - using Base::begin; - using Base::cbegin; - using Base::cend; - using Base::end; - using Base::capacity; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::insert_or_assign; - using Base::emplace; - using Base::emplace_hint; - using Base::try_emplace; - using Base::emplace_with_hash; - using Base::emplace_hint_with_hash; - using Base::try_emplace_with_hash; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::rehash; - using Base::reserve; - using Base::at; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::operator[]; - using Base::bucket_count; - using Base::load_factor; - using Base::max_load_factor; - using Base::get_allocator; - using Base::hash_function; - using Base::key_eq; -}; - -// ----------------------------------------------------------------------------- -// phmap::parallel_node_hash_set -// ----------------------------------------------------------------------------- -template -class parallel_node_hash_set - : public phmap::priv::parallel_hash_set< - N, phmap::priv::raw_hash_set, Mtx_, - phmap::priv::NodeHashSetPolicy, Hash, Eq, Alloc> -{ - using Base = typename parallel_node_hash_set::parallel_hash_set; - -public: - parallel_node_hash_set() {} -#ifdef __INTEL_COMPILER - using Base::parallel_hash_set; -#else - using Base::Base; -#endif - using Base::hash; - using Base::subidx; - using Base::subcnt; - using Base::begin; - using Base::cbegin; - using Base::cend; - using Base::end; - using Base::capacity; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::emplace; - using Base::emplace_hint; - using Base::emplace_with_hash; - using Base::emplace_hint_with_hash; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::rehash; - using Base::reserve; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::bucket_count; - using Base::load_factor; - using Base::max_load_factor; - using Base::get_allocator; - using Base::hash_function; - using Base::key_eq; - typename Base::hasher hash_funct() { return this->hash_function(); } - void resize(typename Base::size_type hint) { this->rehash(hint); } -}; - -// ----------------------------------------------------------------------------- -// phmap::parallel_node_hash_map -// ----------------------------------------------------------------------------- -template -class parallel_node_hash_map - : public phmap::priv::parallel_hash_map< - N, phmap::priv::raw_hash_set, Mtx_, - phmap::priv::NodeHashMapPolicy, Hash, Eq, - Alloc> -{ - using Base = typename parallel_node_hash_map::parallel_hash_map; - -public: - parallel_node_hash_map() {} -#ifdef __INTEL_COMPILER - using Base::parallel_hash_map; -#else - using Base::Base; -#endif - using Base::hash; - using Base::subidx; - using Base::subcnt; - using Base::begin; - using Base::cbegin; - using Base::cend; - using Base::end; - using Base::capacity; - using Base::empty; - using Base::max_size; - using Base::size; - using Base::clear; - using Base::erase; - using Base::insert; - using Base::insert_or_assign; - using Base::emplace; - using Base::emplace_hint; - using Base::try_emplace; - using Base::emplace_with_hash; - using Base::emplace_hint_with_hash; - using Base::try_emplace_with_hash; - using Base::extract; - using Base::merge; - using Base::swap; - using Base::rehash; - using Base::reserve; - using Base::at; - using Base::contains; - using Base::count; - using Base::equal_range; - using Base::find; - using Base::operator[]; - using Base::bucket_count; - using Base::load_factor; - using Base::max_load_factor; - using Base::get_allocator; - using Base::hash_function; - using Base::key_eq; - typename Base::hasher hash_funct() { return this->hash_function(); } - void resize(typename Base::size_type hint) { this->rehash(hint); } -}; - -} // namespace phmap - -#ifdef _MSC_VER - #pragma warning(pop) -#endif - - -#endif // phmap_h_guard_ diff --git a/extern/phmap/parallel_hashmap/phmap_base.h b/extern/phmap/parallel_hashmap/phmap_base.h deleted file mode 100644 index 6b9ea9e..0000000 --- a/extern/phmap/parallel_hashmap/phmap_base.h +++ /dev/null @@ -1,5171 +0,0 @@ -#if !defined(phmap_base_h_guard_) -#define phmap_base_h_guard_ - -// --------------------------------------------------------------------------- -// Copyright (c) 2019, Gregory Popovitch - greg7mdp@gmail.com -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -// Includes work from abseil-cpp (https://github.com/abseil/abseil-cpp) -// with modifications. -// -// Copyright 2018 The Abseil Authors. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// --------------------------------------------------------------------------- - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include // for std::lock - -#include "phmap_config.h" - -#ifdef PHMAP_HAVE_SHARED_MUTEX - #include // after "phmap_config.h" -#endif - -#ifdef _MSC_VER - #pragma warning(push) - #pragma warning(disable : 4514) // unreferenced inline function has been removed - #pragma warning(disable : 4582) // constructor is not implicitly called - #pragma warning(disable : 4625) // copy constructor was implicitly defined as deleted - #pragma warning(disable : 4626) // assignment operator was implicitly defined as deleted - #pragma warning(disable : 4710) // function not inlined - #pragma warning(disable : 4711) // selected for automatic inline expansion - #pragma warning(disable : 4820) // '6' bytes padding added after data member -#endif // _MSC_VER - -namespace phmap { - -template using Allocator = typename std::allocator; - -template using Pair = typename std::pair; - -template -struct EqualTo -{ - inline bool operator()(const T& a, const T& b) const - { - return std::equal_to()(a, b); - } -}; - -template -struct Less -{ - inline bool operator()(const T& a, const T& b) const - { - return std::less()(a, b); - } -}; - -namespace type_traits_internal { - -template -struct VoidTImpl { - using type = void; -}; - -// This trick to retrieve a default alignment is necessary for our -// implementation of aligned_storage_t to be consistent with any implementation -// of std::aligned_storage. -// --------------------------------------------------------------------------- -template > -struct default_alignment_of_aligned_storage; - -template -struct default_alignment_of_aligned_storage> { - static constexpr size_t value = Align; -}; - -// NOTE: The `is_detected` family of templates here differ from the library -// fundamentals specification in that for library fundamentals, `Op` is -// evaluated as soon as the type `is_detected` undergoes -// substitution, regardless of whether or not the `::value` is accessed. That -// is inconsistent with all other standard traits and prevents lazy evaluation -// in larger contexts (such as if the `is_detected` check is a trailing argument -// of a `conjunction`. This implementation opts to instead be lazy in the same -// way that the standard traits are (this "defect" of the detection idiom -// specifications has been reported). -// --------------------------------------------------------------------------- - -template class Op, class... Args> -struct is_detected_impl { - using type = std::false_type; -}; - -template