diff --git a/BUILD b/BUILD index e89fae1a802..ea9e79d5832 100644 --- a/BUILD +++ b/BUILD @@ -2270,28 +2270,94 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "iomgr_ee_time_averaged_stats", + srcs = ["src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc"], + hdrs = [ + "src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h", + ], + tags = ["grpc-autodeps"], + deps = ["gpr_base"], +) + +grpc_cc_library( + name = "iomgr_ee_timer", + srcs = [ + "src/core/lib/event_engine/iomgr_engine/timer.cc", + "src/core/lib/event_engine/iomgr_engine/timer_heap.cc", + ], + hdrs = [ + "src/core/lib/event_engine/iomgr_engine/timer.h", + "src/core/lib/event_engine/iomgr_engine/timer_heap.h", + ], + external_deps = [ + "absl/base:core_headers", + "absl/types:optional", + ], + tags = ["grpc-autodeps"], + deps = [ + "event_engine_base_hdrs", + "gpr_base", + "iomgr_ee_time_averaged_stats", + "time", + "useful", + ], +) + +grpc_cc_library( + name = "iomgr_ee_thread_pool", + srcs = ["src/core/lib/event_engine/iomgr_engine/thread_pool.cc"], + hdrs = [ + "src/core/lib/event_engine/iomgr_engine/thread_pool.h", + ], + tags = ["grpc-autodeps"], + deps = ["gpr_base"], +) + +grpc_cc_library( + name = "iomgr_ee_timer_manager", + srcs = ["src/core/lib/event_engine/iomgr_engine/timer_manager.cc"], + hdrs = [ + "src/core/lib/event_engine/iomgr_engine/timer_manager.h", + ], + external_deps = [ + "absl/base:core_headers", + "absl/memory", + "absl/time", + "absl/types:optional", + ], + tags = ["grpc-autodeps"], + deps = [ + "event_engine_base_hdrs", + "gpr_base", + "gpr_codegen", + "iomgr_ee_timer", + "time", + ], +) + grpc_cc_library( name = "iomgr_event_engine", - srcs = ["src/core/lib/event_engine/iomgr_engine.cc"], - hdrs = ["src/core/lib/event_engine/iomgr_engine.h"], + srcs = ["src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc"], + hdrs = ["src/core/lib/event_engine/iomgr_engine/iomgr_engine.h"], external_deps = [ - "absl/cleanup", + "absl/base:core_headers", "absl/container:flat_hash_set", - "absl/time", + "absl/status", + "absl/status:statusor", "absl/strings", ], + tags = ["grpc-autodeps"], deps = [ - "closure", - "error", "event_engine_base_hdrs", "event_engine_common", "event_engine_trace", - "exec_ctx", "gpr_base", "gpr_platform", "grpc_trace", - "iomgr_timer", - "match", + "iomgr_ee_thread_pool", + "iomgr_ee_timer", + "iomgr_ee_timer_manager", "time", ], ) diff --git a/CMakeLists.txt b/CMakeLists.txt index dedbe0981e5..4cae41aca9c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,8 +110,6 @@ set(gRPC_ABSL_USED_TARGETS absl_bits absl_city absl_civil_time - absl_cleanup - absl_cleanup_internal absl_compressed_tuple absl_config absl_container_common @@ -919,11 +917,11 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_c tcp_server_posix_test) endif() add_dependencies(buildtests_c test_core_gpr_time_test) + add_dependencies(buildtests_c test_core_iomgr_time_averaged_stats_test) + add_dependencies(buildtests_c test_core_iomgr_timer_heap_test) + add_dependencies(buildtests_c test_core_iomgr_timer_list_test) add_dependencies(buildtests_c thd_test) add_dependencies(buildtests_c threadpool_test) - add_dependencies(buildtests_c time_averaged_stats_test) - add_dependencies(buildtests_c timer_heap_test) - add_dependencies(buildtests_c timer_list_test) add_dependencies(buildtests_c transport_security_common_api_test) add_dependencies(buildtests_c transport_security_test) add_dependencies(buildtests_c varint_test) @@ -1169,6 +1167,9 @@ if(gRPC_BUILD_TESTS) add_dependencies(buildtests_cxx string_ref_test) add_dependencies(buildtests_cxx system_roots_test) add_dependencies(buildtests_cxx table_test) + add_dependencies(buildtests_cxx test_core_event_engine_iomgr_event_engine_time_averaged_stats_test) + add_dependencies(buildtests_cxx test_core_event_engine_iomgr_event_engine_timer_heap_test) + add_dependencies(buildtests_cxx test_core_event_engine_iomgr_event_engine_timer_list_test) add_dependencies(buildtests_cxx test_core_event_engine_slice_buffer_test) add_dependencies(buildtests_cxx test_core_gprpp_time_test) add_dependencies(buildtests_cxx test_core_security_credentials_test) @@ -2059,7 +2060,12 @@ add_library(grpc src/core/lib/event_engine/channel_args_endpoint_config.cc src/core/lib/event_engine/default_event_engine_factory.cc src/core/lib/event_engine/event_engine.cc - src/core/lib/event_engine/iomgr_engine.cc + src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc + src/core/lib/event_engine/iomgr_engine/thread_pool.cc + src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + src/core/lib/event_engine/iomgr_engine/timer.cc + src/core/lib/event_engine/iomgr_engine/timer_heap.cc + src/core/lib/event_engine/iomgr_engine/timer_manager.cc src/core/lib/event_engine/memory_allocator.cc src/core/lib/event_engine/resolved_address.cc src/core/lib/event_engine/slice.cc @@ -2338,7 +2344,6 @@ target_link_libraries(grpc ${_gRPC_RE2_LIBRARIES} ${_gRPC_UPB_LIBRARIES} ${_gRPC_ALLTARGETS_LIBRARIES} - absl::cleanup absl::flat_hash_map absl::flat_hash_set absl::inlined_vector @@ -2687,7 +2692,12 @@ add_library(grpc_unsecure src/core/lib/event_engine/channel_args_endpoint_config.cc src/core/lib/event_engine/default_event_engine_factory.cc src/core/lib/event_engine/event_engine.cc - src/core/lib/event_engine/iomgr_engine.cc + src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc + src/core/lib/event_engine/iomgr_engine/thread_pool.cc + src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + src/core/lib/event_engine/iomgr_engine/timer.cc + src/core/lib/event_engine/iomgr_engine/timer_heap.cc + src/core/lib/event_engine/iomgr_engine/timer_manager.cc src/core/lib/event_engine/memory_allocator.cc src/core/lib/event_engine/resolved_address.cc src/core/lib/event_engine/slice.cc @@ -2902,7 +2912,6 @@ target_link_libraries(grpc_unsecure ${_gRPC_RE2_LIBRARIES} ${_gRPC_UPB_LIBRARIES} ${_gRPC_ALLTARGETS_LIBRARIES} - absl::cleanup absl::flat_hash_map absl::flat_hash_set absl::inlined_vector @@ -7106,11 +7115,11 @@ target_link_libraries(test_core_gpr_time_test endif() if(gRPC_BUILD_TESTS) -add_executable(thd_test - test/core/gprpp/thd_test.cc +add_executable(test_core_iomgr_time_averaged_stats_test + test/core/iomgr/time_averaged_stats_test.cc ) -target_include_directories(thd_test +target_include_directories(test_core_iomgr_time_averaged_stats_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include @@ -7124,7 +7133,7 @@ target_include_directories(thd_test ${_gRPC_ZLIB_INCLUDE_DIR} ) -target_link_libraries(thd_test +target_link_libraries(test_core_iomgr_time_averaged_stats_test ${_gRPC_ALLTARGETS_LIBRARIES} grpc_test_util ) @@ -7133,11 +7142,11 @@ target_link_libraries(thd_test endif() if(gRPC_BUILD_TESTS) -add_executable(threadpool_test - test/core/iomgr/threadpool_test.cc +add_executable(test_core_iomgr_timer_heap_test + test/core/iomgr/timer_heap_test.cc ) -target_include_directories(threadpool_test +target_include_directories(test_core_iomgr_timer_heap_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include @@ -7151,7 +7160,7 @@ target_include_directories(threadpool_test ${_gRPC_ZLIB_INCLUDE_DIR} ) -target_link_libraries(threadpool_test +target_link_libraries(test_core_iomgr_timer_heap_test ${_gRPC_ALLTARGETS_LIBRARIES} grpc_test_util ) @@ -7160,11 +7169,11 @@ target_link_libraries(threadpool_test endif() if(gRPC_BUILD_TESTS) -add_executable(time_averaged_stats_test - test/core/iomgr/time_averaged_stats_test.cc +add_executable(test_core_iomgr_timer_list_test + test/core/iomgr/timer_list_test.cc ) -target_include_directories(time_averaged_stats_test +target_include_directories(test_core_iomgr_timer_list_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include @@ -7178,7 +7187,7 @@ target_include_directories(time_averaged_stats_test ${_gRPC_ZLIB_INCLUDE_DIR} ) -target_link_libraries(time_averaged_stats_test +target_link_libraries(test_core_iomgr_timer_list_test ${_gRPC_ALLTARGETS_LIBRARIES} grpc_test_util ) @@ -7187,11 +7196,11 @@ target_link_libraries(time_averaged_stats_test endif() if(gRPC_BUILD_TESTS) -add_executable(timer_heap_test - test/core/iomgr/timer_heap_test.cc +add_executable(thd_test + test/core/gprpp/thd_test.cc ) -target_include_directories(timer_heap_test +target_include_directories(thd_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include @@ -7205,7 +7214,7 @@ target_include_directories(timer_heap_test ${_gRPC_ZLIB_INCLUDE_DIR} ) -target_link_libraries(timer_heap_test +target_link_libraries(thd_test ${_gRPC_ALLTARGETS_LIBRARIES} grpc_test_util ) @@ -7214,11 +7223,11 @@ target_link_libraries(timer_heap_test endif() if(gRPC_BUILD_TESTS) -add_executable(timer_list_test - test/core/iomgr/timer_list_test.cc +add_executable(threadpool_test + test/core/iomgr/threadpool_test.cc ) -target_include_directories(timer_list_test +target_include_directories(threadpool_test PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include @@ -7232,7 +7241,7 @@ target_include_directories(timer_list_test ${_gRPC_ZLIB_INCLUDE_DIR} ) -target_link_libraries(timer_list_test +target_link_libraries(threadpool_test ${_gRPC_ALLTARGETS_LIBRARIES} grpc_test_util ) @@ -16269,6 +16278,281 @@ target_link_libraries(table_test ) +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_core_event_engine_iomgr_event_engine_time_averaged_stats_test + src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + src/core/lib/gpr/alloc.cc + src/core/lib/gpr/atm.cc + src/core/lib/gpr/cpu_iphone.cc + src/core/lib/gpr/cpu_linux.cc + src/core/lib/gpr/cpu_posix.cc + src/core/lib/gpr/cpu_windows.cc + src/core/lib/gpr/env_linux.cc + src/core/lib/gpr/env_posix.cc + src/core/lib/gpr/env_windows.cc + src/core/lib/gpr/log.cc + src/core/lib/gpr/log_android.cc + src/core/lib/gpr/log_linux.cc + src/core/lib/gpr/log_posix.cc + src/core/lib/gpr/log_windows.cc + src/core/lib/gpr/murmur_hash.cc + src/core/lib/gpr/string.cc + src/core/lib/gpr/string_posix.cc + src/core/lib/gpr/string_util_windows.cc + src/core/lib/gpr/string_windows.cc + src/core/lib/gpr/sync.cc + src/core/lib/gpr/sync_abseil.cc + src/core/lib/gpr/sync_posix.cc + src/core/lib/gpr/sync_windows.cc + src/core/lib/gpr/time.cc + src/core/lib/gpr/time_posix.cc + src/core/lib/gpr/time_precise.cc + src/core/lib/gpr/time_windows.cc + src/core/lib/gpr/tmpfile_msys.cc + src/core/lib/gpr/tmpfile_posix.cc + src/core/lib/gpr/tmpfile_windows.cc + src/core/lib/gpr/wrap_memcpy.cc + src/core/lib/gprpp/examine_stack.cc + src/core/lib/gprpp/fork.cc + src/core/lib/gprpp/global_config_env.cc + src/core/lib/gprpp/host_port.cc + src/core/lib/gprpp/mpscq.cc + src/core/lib/gprpp/stat_posix.cc + src/core/lib/gprpp/stat_windows.cc + src/core/lib/gprpp/thd_posix.cc + src/core/lib/gprpp/thd_windows.cc + src/core/lib/gprpp/time_util.cc + src/core/lib/profiling/basic_timers.cc + src/core/lib/profiling/stap_timers.cc + test/core/event_engine/iomgr_event_engine/time_averaged_stats_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(test_core_event_engine_iomgr_event_engine_time_averaged_stats_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(test_core_event_engine_iomgr_event_engine_time_averaged_stats_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + absl::base + absl::core_headers + absl::memory + absl::random_random + absl::status + absl::cord + absl::str_format + absl::strings + absl::synchronization + absl::time + absl::optional +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_core_event_engine_iomgr_event_engine_timer_heap_test + src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + src/core/lib/event_engine/iomgr_engine/timer.cc + src/core/lib/event_engine/iomgr_engine/timer_heap.cc + src/core/lib/gpr/alloc.cc + src/core/lib/gpr/atm.cc + src/core/lib/gpr/cpu_iphone.cc + src/core/lib/gpr/cpu_linux.cc + src/core/lib/gpr/cpu_posix.cc + src/core/lib/gpr/cpu_windows.cc + src/core/lib/gpr/env_linux.cc + src/core/lib/gpr/env_posix.cc + src/core/lib/gpr/env_windows.cc + src/core/lib/gpr/log.cc + src/core/lib/gpr/log_android.cc + src/core/lib/gpr/log_linux.cc + src/core/lib/gpr/log_posix.cc + src/core/lib/gpr/log_windows.cc + src/core/lib/gpr/murmur_hash.cc + src/core/lib/gpr/string.cc + src/core/lib/gpr/string_posix.cc + src/core/lib/gpr/string_util_windows.cc + src/core/lib/gpr/string_windows.cc + src/core/lib/gpr/sync.cc + src/core/lib/gpr/sync_abseil.cc + src/core/lib/gpr/sync_posix.cc + src/core/lib/gpr/sync_windows.cc + src/core/lib/gpr/time.cc + src/core/lib/gpr/time_posix.cc + src/core/lib/gpr/time_precise.cc + src/core/lib/gpr/time_windows.cc + src/core/lib/gpr/tmpfile_msys.cc + src/core/lib/gpr/tmpfile_posix.cc + src/core/lib/gpr/tmpfile_windows.cc + src/core/lib/gpr/wrap_memcpy.cc + src/core/lib/gprpp/examine_stack.cc + src/core/lib/gprpp/fork.cc + src/core/lib/gprpp/global_config_env.cc + src/core/lib/gprpp/host_port.cc + src/core/lib/gprpp/mpscq.cc + src/core/lib/gprpp/stat_posix.cc + src/core/lib/gprpp/stat_windows.cc + src/core/lib/gprpp/thd_posix.cc + src/core/lib/gprpp/thd_windows.cc + src/core/lib/gprpp/time.cc + src/core/lib/gprpp/time_util.cc + src/core/lib/profiling/basic_timers.cc + src/core/lib/profiling/stap_timers.cc + test/core/event_engine/iomgr_event_engine/timer_heap_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(test_core_event_engine_iomgr_event_engine_timer_heap_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(test_core_event_engine_iomgr_event_engine_timer_heap_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + absl::base + absl::core_headers + absl::memory + absl::random_random + absl::status + absl::statusor + absl::cord + absl::str_format + absl::strings + absl::synchronization + absl::time + absl::optional +) + + +endif() +if(gRPC_BUILD_TESTS) + +add_executable(test_core_event_engine_iomgr_event_engine_timer_list_test + src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + src/core/lib/event_engine/iomgr_engine/timer.cc + src/core/lib/event_engine/iomgr_engine/timer_heap.cc + src/core/lib/gpr/alloc.cc + src/core/lib/gpr/atm.cc + src/core/lib/gpr/cpu_iphone.cc + src/core/lib/gpr/cpu_linux.cc + src/core/lib/gpr/cpu_posix.cc + src/core/lib/gpr/cpu_windows.cc + src/core/lib/gpr/env_linux.cc + src/core/lib/gpr/env_posix.cc + src/core/lib/gpr/env_windows.cc + src/core/lib/gpr/log.cc + src/core/lib/gpr/log_android.cc + src/core/lib/gpr/log_linux.cc + src/core/lib/gpr/log_posix.cc + src/core/lib/gpr/log_windows.cc + src/core/lib/gpr/murmur_hash.cc + src/core/lib/gpr/string.cc + src/core/lib/gpr/string_posix.cc + src/core/lib/gpr/string_util_windows.cc + src/core/lib/gpr/string_windows.cc + src/core/lib/gpr/sync.cc + src/core/lib/gpr/sync_abseil.cc + src/core/lib/gpr/sync_posix.cc + src/core/lib/gpr/sync_windows.cc + src/core/lib/gpr/time.cc + src/core/lib/gpr/time_posix.cc + src/core/lib/gpr/time_precise.cc + src/core/lib/gpr/time_windows.cc + src/core/lib/gpr/tmpfile_msys.cc + src/core/lib/gpr/tmpfile_posix.cc + src/core/lib/gpr/tmpfile_windows.cc + src/core/lib/gpr/wrap_memcpy.cc + src/core/lib/gprpp/examine_stack.cc + src/core/lib/gprpp/fork.cc + src/core/lib/gprpp/global_config_env.cc + src/core/lib/gprpp/host_port.cc + src/core/lib/gprpp/mpscq.cc + src/core/lib/gprpp/stat_posix.cc + src/core/lib/gprpp/stat_windows.cc + src/core/lib/gprpp/thd_posix.cc + src/core/lib/gprpp/thd_windows.cc + src/core/lib/gprpp/time.cc + src/core/lib/gprpp/time_util.cc + src/core/lib/profiling/basic_timers.cc + src/core/lib/profiling/stap_timers.cc + test/core/event_engine/iomgr_event_engine/timer_list_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + +target_include_directories(test_core_event_engine_iomgr_event_engine_timer_list_test + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/include + ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR} + ${_gRPC_RE2_INCLUDE_DIR} + ${_gRPC_SSL_INCLUDE_DIR} + ${_gRPC_UPB_GENERATED_DIR} + ${_gRPC_UPB_GRPC_GENERATED_DIR} + ${_gRPC_UPB_INCLUDE_DIR} + ${_gRPC_XXHASH_INCLUDE_DIR} + ${_gRPC_ZLIB_INCLUDE_DIR} + third_party/googletest/googletest/include + third_party/googletest/googletest + third_party/googletest/googlemock/include + third_party/googletest/googlemock + ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(test_core_event_engine_iomgr_event_engine_timer_list_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + absl::base + absl::core_headers + absl::memory + absl::random_random + absl::status + absl::statusor + absl::cord + absl::str_format + absl::strings + absl::synchronization + absl::time + absl::optional +) + + endif() if(gRPC_BUILD_TESTS) @@ -20120,7 +20404,7 @@ generate_pkgconfig( "gRPC" "high performance general RPC framework" "${gRPC_CORE_VERSION}" - "gpr openssl absl_base absl_bind_front absl_cleanup absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant" + "gpr openssl absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant" "-lgrpc -laddress_sorting -lre2 -lupb -lcares -lz" "" "grpc.pc") @@ -20130,7 +20414,7 @@ generate_pkgconfig( "gRPC unsecure" "high performance general RPC framework without SSL" "${gRPC_CORE_VERSION}" - "gpr absl_base absl_bind_front absl_cleanup absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant" + "gpr absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant" "-lgrpc_unsecure" "" "grpc_unsecure.pc") @@ -20140,7 +20424,7 @@ generate_pkgconfig( "gRPC++" "C++ wrapper for gRPC" "${gRPC_CPP_VERSION}" - "grpc absl_base absl_bind_front absl_cleanup absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant" + "grpc absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant" "-lgrpc++" "" "grpc++.pc") @@ -20150,7 +20434,7 @@ generate_pkgconfig( "gRPC++ unsecure" "C++ wrapper for gRPC without SSL" "${gRPC_CPP_VERSION}" - "grpc_unsecure absl_base absl_bind_front absl_cleanup absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant" + "grpc_unsecure absl_base absl_bind_front absl_cord absl_core_headers absl_flat_hash_map absl_flat_hash_set absl_hash absl_inlined_vector absl_memory absl_optional absl_random_random absl_span absl_status absl_statusor absl_str_format absl_strings absl_synchronization absl_time absl_type_traits absl_utility absl_variant" "-lgrpc++_unsecure" "" "grpc++_unsecure.pc") diff --git a/Makefile b/Makefile index bee072568cf..bcd125b3b81 100644 --- a/Makefile +++ b/Makefile @@ -1440,7 +1440,12 @@ LIBGRPC_SRC = \ src/core/lib/event_engine/channel_args_endpoint_config.cc \ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/event_engine.cc \ - src/core/lib/event_engine/iomgr_engine.cc \ + src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc \ + src/core/lib/event_engine/iomgr_engine/thread_pool.cc \ + src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc \ + src/core/lib/event_engine/iomgr_engine/timer.cc \ + src/core/lib/event_engine/iomgr_engine/timer_heap.cc \ + src/core/lib/event_engine/iomgr_engine/timer_manager.cc \ src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ @@ -1908,7 +1913,12 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/event_engine/channel_args_endpoint_config.cc \ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/event_engine.cc \ - src/core/lib/event_engine/iomgr_engine.cc \ + src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc \ + src/core/lib/event_engine/iomgr_engine/thread_pool.cc \ + src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc \ + src/core/lib/event_engine/iomgr_engine/timer.cc \ + src/core/lib/event_engine/iomgr_engine/timer_heap.cc \ + src/core/lib/event_engine/iomgr_engine/timer_manager.cc \ src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 1c6fb7a829c..bff9710aa60 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -744,7 +744,12 @@ libs: - src/core/lib/event_engine/channel_args_endpoint_config.h - src/core/lib/event_engine/event_engine_factory.h - src/core/lib/event_engine/handle_containers.h - - src/core/lib/event_engine/iomgr_engine.h + - src/core/lib/event_engine/iomgr_engine/iomgr_engine.h + - src/core/lib/event_engine/iomgr_engine/thread_pool.h + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h + - src/core/lib/event_engine/iomgr_engine/timer.h + - src/core/lib/event_engine/iomgr_engine/timer_heap.h + - src/core/lib/event_engine/iomgr_engine/timer_manager.h - src/core/lib/event_engine/trace.h - src/core/lib/gprpp/atomic_utils.h - src/core/lib/gprpp/bitset.h @@ -1419,7 +1424,12 @@ libs: - src/core/lib/event_engine/channel_args_endpoint_config.cc - src/core/lib/event_engine/default_event_engine_factory.cc - src/core/lib/event_engine/event_engine.cc - - src/core/lib/event_engine/iomgr_engine.cc + - src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc + - src/core/lib/event_engine/iomgr_engine/thread_pool.cc + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + - src/core/lib/event_engine/iomgr_engine/timer.cc + - src/core/lib/event_engine/iomgr_engine/timer_heap.cc + - src/core/lib/event_engine/iomgr_engine/timer_manager.cc - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/event_engine/resolved_address.cc - src/core/lib/event_engine/slice.cc @@ -1660,7 +1670,6 @@ libs: - src/core/tsi/transport_security.cc - src/core/tsi/transport_security_grpc.cc deps: - - absl/cleanup:cleanup - absl/container:flat_hash_map - absl/container:flat_hash_set - absl/container:inlined_vector @@ -1954,7 +1963,12 @@ libs: - src/core/lib/event_engine/channel_args_endpoint_config.h - src/core/lib/event_engine/event_engine_factory.h - src/core/lib/event_engine/handle_containers.h - - src/core/lib/event_engine/iomgr_engine.h + - src/core/lib/event_engine/iomgr_engine/iomgr_engine.h + - src/core/lib/event_engine/iomgr_engine/thread_pool.h + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h + - src/core/lib/event_engine/iomgr_engine/timer.h + - src/core/lib/event_engine/iomgr_engine/timer_heap.h + - src/core/lib/event_engine/iomgr_engine/timer_manager.h - src/core/lib/event_engine/trace.h - src/core/lib/gprpp/atomic_utils.h - src/core/lib/gprpp/bitset.h @@ -2279,7 +2293,12 @@ libs: - src/core/lib/event_engine/channel_args_endpoint_config.cc - src/core/lib/event_engine/default_event_engine_factory.cc - src/core/lib/event_engine/event_engine.cc - - src/core/lib/event_engine/iomgr_engine.cc + - src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc + - src/core/lib/event_engine/iomgr_engine/thread_pool.cc + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + - src/core/lib/event_engine/iomgr_engine/timer.cc + - src/core/lib/event_engine/iomgr_engine/timer_heap.cc + - src/core/lib/event_engine/iomgr_engine/timer_manager.cc - src/core/lib/event_engine/memory_allocator.cc - src/core/lib/event_engine/resolved_address.cc - src/core/lib/event_engine/slice.cc @@ -2456,7 +2475,6 @@ libs: - src/core/tsi/transport_security.cc - src/core/tsi/transport_security_grpc.cc deps: - - absl/cleanup:cleanup - absl/container:flat_hash_map - absl/container:flat_hash_set - absl/container:inlined_vector @@ -4269,48 +4287,48 @@ targets: deps: - grpc_test_util uses_polling: false -- name: thd_test +- name: test_core_iomgr_time_averaged_stats_test build: test language: c headers: [] src: - - test/core/gprpp/thd_test.cc + - test/core/iomgr/time_averaged_stats_test.cc deps: - grpc_test_util uses_polling: false -- name: threadpool_test +- name: test_core_iomgr_timer_heap_test build: test language: c headers: [] src: - - test/core/iomgr/threadpool_test.cc + - test/core/iomgr/timer_heap_test.cc deps: - grpc_test_util uses_polling: false -- name: time_averaged_stats_test +- name: test_core_iomgr_timer_list_test build: test language: c headers: [] src: - - test/core/iomgr/time_averaged_stats_test.cc + - test/core/iomgr/timer_list_test.cc deps: - grpc_test_util uses_polling: false -- name: timer_heap_test +- name: thd_test build: test language: c headers: [] src: - - test/core/iomgr/timer_heap_test.cc + - test/core/gprpp/thd_test.cc deps: - grpc_test_util uses_polling: false -- name: timer_list_test +- name: threadpool_test build: test language: c headers: [] src: - - test/core/iomgr/timer_list_test.cc + - test/core/iomgr/threadpool_test.cc deps: - grpc_test_util uses_polling: false @@ -8159,6 +8177,297 @@ targets: - absl/types:optional - absl/utility:utility uses_polling: false +- name: test_core_event_engine_iomgr_event_engine_time_averaged_stats_test + gtest: true + build: test + language: c++ + headers: + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h + - src/core/lib/gpr/alloc.h + - src/core/lib/gpr/env.h + - src/core/lib/gpr/murmur_hash.h + - src/core/lib/gpr/spinlock.h + - src/core/lib/gpr/string.h + - src/core/lib/gpr/string_windows.h + - src/core/lib/gpr/time_precise.h + - src/core/lib/gpr/tls.h + - src/core/lib/gpr/tmpfile.h + - src/core/lib/gpr/useful.h + - src/core/lib/gprpp/construct_destruct.h + - src/core/lib/gprpp/debug_location.h + - src/core/lib/gprpp/examine_stack.h + - src/core/lib/gprpp/fork.h + - src/core/lib/gprpp/global_config.h + - src/core/lib/gprpp/global_config_custom.h + - src/core/lib/gprpp/global_config_env.h + - src/core/lib/gprpp/global_config_generic.h + - src/core/lib/gprpp/host_port.h + - src/core/lib/gprpp/manual_constructor.h + - src/core/lib/gprpp/memory.h + - src/core/lib/gprpp/mpscq.h + - src/core/lib/gprpp/stat.h + - src/core/lib/gprpp/sync.h + - src/core/lib/gprpp/thd.h + - src/core/lib/gprpp/time_util.h + - src/core/lib/profiling/timers.h + src: + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + - src/core/lib/gpr/alloc.cc + - src/core/lib/gpr/atm.cc + - src/core/lib/gpr/cpu_iphone.cc + - src/core/lib/gpr/cpu_linux.cc + - src/core/lib/gpr/cpu_posix.cc + - src/core/lib/gpr/cpu_windows.cc + - src/core/lib/gpr/env_linux.cc + - src/core/lib/gpr/env_posix.cc + - src/core/lib/gpr/env_windows.cc + - src/core/lib/gpr/log.cc + - src/core/lib/gpr/log_android.cc + - src/core/lib/gpr/log_linux.cc + - src/core/lib/gpr/log_posix.cc + - src/core/lib/gpr/log_windows.cc + - src/core/lib/gpr/murmur_hash.cc + - src/core/lib/gpr/string.cc + - src/core/lib/gpr/string_posix.cc + - src/core/lib/gpr/string_util_windows.cc + - src/core/lib/gpr/string_windows.cc + - src/core/lib/gpr/sync.cc + - src/core/lib/gpr/sync_abseil.cc + - src/core/lib/gpr/sync_posix.cc + - src/core/lib/gpr/sync_windows.cc + - src/core/lib/gpr/time.cc + - src/core/lib/gpr/time_posix.cc + - src/core/lib/gpr/time_precise.cc + - src/core/lib/gpr/time_windows.cc + - src/core/lib/gpr/tmpfile_msys.cc + - src/core/lib/gpr/tmpfile_posix.cc + - src/core/lib/gpr/tmpfile_windows.cc + - src/core/lib/gpr/wrap_memcpy.cc + - src/core/lib/gprpp/examine_stack.cc + - src/core/lib/gprpp/fork.cc + - src/core/lib/gprpp/global_config_env.cc + - src/core/lib/gprpp/host_port.cc + - src/core/lib/gprpp/mpscq.cc + - src/core/lib/gprpp/stat_posix.cc + - src/core/lib/gprpp/stat_windows.cc + - src/core/lib/gprpp/thd_posix.cc + - src/core/lib/gprpp/thd_windows.cc + - src/core/lib/gprpp/time_util.cc + - src/core/lib/profiling/basic_timers.cc + - src/core/lib/profiling/stap_timers.cc + - test/core/event_engine/iomgr_event_engine/time_averaged_stats_test.cc + deps: + - absl/base:base + - absl/base:core_headers + - absl/memory:memory + - absl/random:random + - absl/status:status + - absl/strings:cord + - absl/strings:str_format + - absl/strings:strings + - absl/synchronization:synchronization + - absl/time:time + - absl/types:optional + uses_polling: false +- name: test_core_event_engine_iomgr_event_engine_timer_heap_test + gtest: true + build: test + language: c++ + headers: + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h + - src/core/lib/event_engine/iomgr_engine/timer.h + - src/core/lib/event_engine/iomgr_engine/timer_heap.h + - src/core/lib/gpr/alloc.h + - src/core/lib/gpr/env.h + - src/core/lib/gpr/murmur_hash.h + - src/core/lib/gpr/spinlock.h + - src/core/lib/gpr/string.h + - src/core/lib/gpr/string_windows.h + - src/core/lib/gpr/time_precise.h + - src/core/lib/gpr/tls.h + - src/core/lib/gpr/tmpfile.h + - src/core/lib/gpr/useful.h + - src/core/lib/gprpp/bitset.h + - src/core/lib/gprpp/construct_destruct.h + - src/core/lib/gprpp/debug_location.h + - src/core/lib/gprpp/examine_stack.h + - src/core/lib/gprpp/fork.h + - src/core/lib/gprpp/global_config.h + - src/core/lib/gprpp/global_config_custom.h + - src/core/lib/gprpp/global_config_env.h + - src/core/lib/gprpp/global_config_generic.h + - src/core/lib/gprpp/host_port.h + - src/core/lib/gprpp/manual_constructor.h + - src/core/lib/gprpp/memory.h + - src/core/lib/gprpp/mpscq.h + - src/core/lib/gprpp/stat.h + - src/core/lib/gprpp/sync.h + - src/core/lib/gprpp/thd.h + - src/core/lib/gprpp/time.h + - src/core/lib/gprpp/time_util.h + - src/core/lib/profiling/timers.h + src: + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + - src/core/lib/event_engine/iomgr_engine/timer.cc + - src/core/lib/event_engine/iomgr_engine/timer_heap.cc + - src/core/lib/gpr/alloc.cc + - src/core/lib/gpr/atm.cc + - src/core/lib/gpr/cpu_iphone.cc + - src/core/lib/gpr/cpu_linux.cc + - src/core/lib/gpr/cpu_posix.cc + - src/core/lib/gpr/cpu_windows.cc + - src/core/lib/gpr/env_linux.cc + - src/core/lib/gpr/env_posix.cc + - src/core/lib/gpr/env_windows.cc + - src/core/lib/gpr/log.cc + - src/core/lib/gpr/log_android.cc + - src/core/lib/gpr/log_linux.cc + - src/core/lib/gpr/log_posix.cc + - src/core/lib/gpr/log_windows.cc + - src/core/lib/gpr/murmur_hash.cc + - src/core/lib/gpr/string.cc + - src/core/lib/gpr/string_posix.cc + - src/core/lib/gpr/string_util_windows.cc + - src/core/lib/gpr/string_windows.cc + - src/core/lib/gpr/sync.cc + - src/core/lib/gpr/sync_abseil.cc + - src/core/lib/gpr/sync_posix.cc + - src/core/lib/gpr/sync_windows.cc + - src/core/lib/gpr/time.cc + - src/core/lib/gpr/time_posix.cc + - src/core/lib/gpr/time_precise.cc + - src/core/lib/gpr/time_windows.cc + - src/core/lib/gpr/tmpfile_msys.cc + - src/core/lib/gpr/tmpfile_posix.cc + - src/core/lib/gpr/tmpfile_windows.cc + - src/core/lib/gpr/wrap_memcpy.cc + - src/core/lib/gprpp/examine_stack.cc + - src/core/lib/gprpp/fork.cc + - src/core/lib/gprpp/global_config_env.cc + - src/core/lib/gprpp/host_port.cc + - src/core/lib/gprpp/mpscq.cc + - src/core/lib/gprpp/stat_posix.cc + - src/core/lib/gprpp/stat_windows.cc + - src/core/lib/gprpp/thd_posix.cc + - src/core/lib/gprpp/thd_windows.cc + - src/core/lib/gprpp/time.cc + - src/core/lib/gprpp/time_util.cc + - src/core/lib/profiling/basic_timers.cc + - src/core/lib/profiling/stap_timers.cc + - test/core/event_engine/iomgr_event_engine/timer_heap_test.cc + deps: + - absl/base:base + - absl/base:core_headers + - absl/memory:memory + - absl/random:random + - absl/status:status + - absl/status:statusor + - absl/strings:cord + - absl/strings:str_format + - absl/strings:strings + - absl/synchronization:synchronization + - absl/time:time + - absl/types:optional + uses_polling: false +- name: test_core_event_engine_iomgr_event_engine_timer_list_test + gtest: true + build: test + language: c++ + headers: + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h + - src/core/lib/event_engine/iomgr_engine/timer.h + - src/core/lib/event_engine/iomgr_engine/timer_heap.h + - src/core/lib/gpr/alloc.h + - src/core/lib/gpr/env.h + - src/core/lib/gpr/murmur_hash.h + - src/core/lib/gpr/spinlock.h + - src/core/lib/gpr/string.h + - src/core/lib/gpr/string_windows.h + - src/core/lib/gpr/time_precise.h + - src/core/lib/gpr/tls.h + - src/core/lib/gpr/tmpfile.h + - src/core/lib/gpr/useful.h + - src/core/lib/gprpp/construct_destruct.h + - src/core/lib/gprpp/debug_location.h + - src/core/lib/gprpp/examine_stack.h + - src/core/lib/gprpp/fork.h + - src/core/lib/gprpp/global_config.h + - src/core/lib/gprpp/global_config_custom.h + - src/core/lib/gprpp/global_config_env.h + - src/core/lib/gprpp/global_config_generic.h + - src/core/lib/gprpp/host_port.h + - src/core/lib/gprpp/manual_constructor.h + - src/core/lib/gprpp/memory.h + - src/core/lib/gprpp/mpscq.h + - src/core/lib/gprpp/stat.h + - src/core/lib/gprpp/sync.h + - src/core/lib/gprpp/thd.h + - src/core/lib/gprpp/time.h + - src/core/lib/gprpp/time_util.h + - src/core/lib/profiling/timers.h + src: + - src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc + - src/core/lib/event_engine/iomgr_engine/timer.cc + - src/core/lib/event_engine/iomgr_engine/timer_heap.cc + - src/core/lib/gpr/alloc.cc + - src/core/lib/gpr/atm.cc + - src/core/lib/gpr/cpu_iphone.cc + - src/core/lib/gpr/cpu_linux.cc + - src/core/lib/gpr/cpu_posix.cc + - src/core/lib/gpr/cpu_windows.cc + - src/core/lib/gpr/env_linux.cc + - src/core/lib/gpr/env_posix.cc + - src/core/lib/gpr/env_windows.cc + - src/core/lib/gpr/log.cc + - src/core/lib/gpr/log_android.cc + - src/core/lib/gpr/log_linux.cc + - src/core/lib/gpr/log_posix.cc + - src/core/lib/gpr/log_windows.cc + - src/core/lib/gpr/murmur_hash.cc + - src/core/lib/gpr/string.cc + - src/core/lib/gpr/string_posix.cc + - src/core/lib/gpr/string_util_windows.cc + - src/core/lib/gpr/string_windows.cc + - src/core/lib/gpr/sync.cc + - src/core/lib/gpr/sync_abseil.cc + - src/core/lib/gpr/sync_posix.cc + - src/core/lib/gpr/sync_windows.cc + - src/core/lib/gpr/time.cc + - src/core/lib/gpr/time_posix.cc + - src/core/lib/gpr/time_precise.cc + - src/core/lib/gpr/time_windows.cc + - src/core/lib/gpr/tmpfile_msys.cc + - src/core/lib/gpr/tmpfile_posix.cc + - src/core/lib/gpr/tmpfile_windows.cc + - src/core/lib/gpr/wrap_memcpy.cc + - src/core/lib/gprpp/examine_stack.cc + - src/core/lib/gprpp/fork.cc + - src/core/lib/gprpp/global_config_env.cc + - src/core/lib/gprpp/host_port.cc + - src/core/lib/gprpp/mpscq.cc + - src/core/lib/gprpp/stat_posix.cc + - src/core/lib/gprpp/stat_windows.cc + - src/core/lib/gprpp/thd_posix.cc + - src/core/lib/gprpp/thd_windows.cc + - src/core/lib/gprpp/time.cc + - src/core/lib/gprpp/time_util.cc + - src/core/lib/profiling/basic_timers.cc + - src/core/lib/profiling/stap_timers.cc + - test/core/event_engine/iomgr_event_engine/timer_list_test.cc + deps: + - absl/base:base + - absl/base:core_headers + - absl/memory:memory + - absl/random:random + - absl/status:status + - absl/status:statusor + - absl/strings:cord + - absl/strings:str_format + - absl/strings:strings + - absl/synchronization:synchronization + - absl/time:time + - absl/types:optional + uses_polling: false - name: test_core_event_engine_slice_buffer_test gtest: true build: test diff --git a/config.m4 b/config.m4 index 76345e70e78..9ed9418f2e0 100644 --- a/config.m4 +++ b/config.m4 @@ -465,7 +465,12 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/event_engine/channel_args_endpoint_config.cc \ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/event_engine.cc \ - src/core/lib/event_engine/iomgr_engine.cc \ + src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc \ + src/core/lib/event_engine/iomgr_engine/thread_pool.cc \ + src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc \ + src/core/lib/event_engine/iomgr_engine/timer.cc \ + src/core/lib/event_engine/iomgr_engine/timer_heap.cc \ + src/core/lib/event_engine/iomgr_engine/timer_manager.cc \ src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ @@ -1302,6 +1307,7 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/config) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/debug) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/event_engine) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/event_engine/iomgr_engine) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gpr) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gprpp) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/http) diff --git a/config.w32 b/config.w32 index b8f1dc4d887..7a6341f07b2 100644 --- a/config.w32 +++ b/config.w32 @@ -431,7 +431,12 @@ if (PHP_GRPC != "no") { "src\\core\\lib\\event_engine\\channel_args_endpoint_config.cc " + "src\\core\\lib\\event_engine\\default_event_engine_factory.cc " + "src\\core\\lib\\event_engine\\event_engine.cc " + - "src\\core\\lib\\event_engine\\iomgr_engine.cc " + + "src\\core\\lib\\event_engine\\iomgr_engine\\iomgr_engine.cc " + + "src\\core\\lib\\event_engine\\iomgr_engine\\thread_pool.cc " + + "src\\core\\lib\\event_engine\\iomgr_engine\\time_averaged_stats.cc " + + "src\\core\\lib\\event_engine\\iomgr_engine\\timer.cc " + + "src\\core\\lib\\event_engine\\iomgr_engine\\timer_heap.cc " + + "src\\core\\lib\\event_engine\\iomgr_engine\\timer_manager.cc " + "src\\core\\lib\\event_engine\\memory_allocator.cc " + "src\\core\\lib\\event_engine\\resolved_address.cc " + "src\\core\\lib\\event_engine\\slice.cc " + @@ -1424,6 +1429,7 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\config"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\debug"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\event_engine"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\event_engine\\iomgr_engine"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gpr"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gprpp"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\http"); diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 73ca24739b2..750ee7e77ed 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -198,7 +198,6 @@ Pod::Spec.new do |s| abseil_version = '1.20211102.0' ss.dependency 'abseil/base/base', abseil_version ss.dependency 'abseil/base/core_headers', abseil_version - ss.dependency 'abseil/cleanup/cleanup', abseil_version ss.dependency 'abseil/container/flat_hash_map', abseil_version ss.dependency 'abseil/container/flat_hash_set', abseil_version ss.dependency 'abseil/container/inlined_vector', abseil_version @@ -675,7 +674,12 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/channel_args_endpoint_config.h', 'src/core/lib/event_engine/event_engine_factory.h', 'src/core/lib/event_engine/handle_containers.h', - 'src/core/lib/event_engine/iomgr_engine.h', + 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.h', + 'src/core/lib/event_engine/iomgr_engine/thread_pool.h', + 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h', + 'src/core/lib/event_engine/iomgr_engine/timer.h', + 'src/core/lib/event_engine/iomgr_engine/timer_heap.h', + 'src/core/lib/event_engine/iomgr_engine/timer_manager.h', 'src/core/lib/event_engine/trace.h', 'src/core/lib/gpr/alloc.h', 'src/core/lib/gpr/env.h', @@ -1496,7 +1500,12 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/channel_args_endpoint_config.h', 'src/core/lib/event_engine/event_engine_factory.h', 'src/core/lib/event_engine/handle_containers.h', - 'src/core/lib/event_engine/iomgr_engine.h', + 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.h', + 'src/core/lib/event_engine/iomgr_engine/thread_pool.h', + 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h', + 'src/core/lib/event_engine/iomgr_engine/timer.h', + 'src/core/lib/event_engine/iomgr_engine/timer_heap.h', + 'src/core/lib/event_engine/iomgr_engine/timer_manager.h', 'src/core/lib/event_engine/trace.h', 'src/core/lib/gpr/alloc.h', 'src/core/lib/gpr/env.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 8c3264b8d8f..95849b7938a 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -175,7 +175,6 @@ Pod::Spec.new do |s| ss.dependency 'Libuv-gRPC', '0.0.10' ss.dependency 'abseil/base/base', abseil_version ss.dependency 'abseil/base/core_headers', abseil_version - ss.dependency 'abseil/cleanup/cleanup', abseil_version ss.dependency 'abseil/container/flat_hash_map', abseil_version ss.dependency 'abseil/container/flat_hash_set', abseil_version ss.dependency 'abseil/container/inlined_vector', abseil_version @@ -1040,8 +1039,18 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/event_engine.cc', 'src/core/lib/event_engine/event_engine_factory.h', 'src/core/lib/event_engine/handle_containers.h', - 'src/core/lib/event_engine/iomgr_engine.cc', - 'src/core/lib/event_engine/iomgr_engine.h', + 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc', + 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.h', + 'src/core/lib/event_engine/iomgr_engine/thread_pool.cc', + 'src/core/lib/event_engine/iomgr_engine/thread_pool.h', + 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc', + 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h', + 'src/core/lib/event_engine/iomgr_engine/timer.cc', + 'src/core/lib/event_engine/iomgr_engine/timer.h', + 'src/core/lib/event_engine/iomgr_engine/timer_heap.cc', + 'src/core/lib/event_engine/iomgr_engine/timer_heap.h', + 'src/core/lib/event_engine/iomgr_engine/timer_manager.cc', + 'src/core/lib/event_engine/iomgr_engine/timer_manager.h', 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/resolved_address.cc', 'src/core/lib/event_engine/slice.cc', @@ -2098,7 +2107,12 @@ Pod::Spec.new do |s| 'src/core/lib/event_engine/channel_args_endpoint_config.h', 'src/core/lib/event_engine/event_engine_factory.h', 'src/core/lib/event_engine/handle_containers.h', - 'src/core/lib/event_engine/iomgr_engine.h', + 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.h', + 'src/core/lib/event_engine/iomgr_engine/thread_pool.h', + 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h', + 'src/core/lib/event_engine/iomgr_engine/timer.h', + 'src/core/lib/event_engine/iomgr_engine/timer_heap.h', + 'src/core/lib/event_engine/iomgr_engine/timer_manager.h', 'src/core/lib/event_engine/trace.h', 'src/core/lib/gpr/alloc.h', 'src/core/lib/gpr/env.h', diff --git a/grpc.gemspec b/grpc.gemspec index 07028ed1399..5a57be48d7b 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -953,8 +953,18 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/event_engine/event_engine.cc ) s.files += %w( src/core/lib/event_engine/event_engine_factory.h ) s.files += %w( src/core/lib/event_engine/handle_containers.h ) - s.files += %w( src/core/lib/event_engine/iomgr_engine.cc ) - s.files += %w( src/core/lib/event_engine/iomgr_engine.h ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/iomgr_engine.h ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/thread_pool.cc ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/thread_pool.h ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/timer.cc ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/timer.h ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/timer_heap.cc ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/timer_heap.h ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/timer_manager.cc ) + s.files += %w( src/core/lib/event_engine/iomgr_engine/timer_manager.h ) s.files += %w( src/core/lib/event_engine/memory_allocator.cc ) s.files += %w( src/core/lib/event_engine/resolved_address.cc ) s.files += %w( src/core/lib/event_engine/slice.cc ) @@ -1565,8 +1575,6 @@ Gem::Specification.new do |s| s.files += %w( third_party/abseil-cpp/absl/base/policy_checks.h ) s.files += %w( third_party/abseil-cpp/absl/base/port.h ) s.files += %w( third_party/abseil-cpp/absl/base/thread_annotations.h ) - s.files += %w( third_party/abseil-cpp/absl/cleanup/cleanup.h ) - s.files += %w( third_party/abseil-cpp/absl/cleanup/internal/cleanup.h ) s.files += %w( third_party/abseil-cpp/absl/container/fixed_array.h ) s.files += %w( third_party/abseil-cpp/absl/container/flat_hash_map.h ) s.files += %w( third_party/abseil-cpp/absl/container/flat_hash_set.h ) diff --git a/grpc.gyp b/grpc.gyp index 75a1e6d696c..f1d7c81c4e0 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -356,7 +356,6 @@ 'target_name': 'grpc', 'type': 'static_library', 'dependencies': [ - 'absl/cleanup:cleanup', 'absl/container:flat_hash_map', 'absl/container:flat_hash_set', 'absl/container:inlined_vector', @@ -797,7 +796,12 @@ 'src/core/lib/event_engine/channel_args_endpoint_config.cc', 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/event_engine.cc', - 'src/core/lib/event_engine/iomgr_engine.cc', + 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc', + 'src/core/lib/event_engine/iomgr_engine/thread_pool.cc', + 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc', + 'src/core/lib/event_engine/iomgr_engine/timer.cc', + 'src/core/lib/event_engine/iomgr_engine/timer_heap.cc', + 'src/core/lib/event_engine/iomgr_engine/timer_manager.cc', 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/resolved_address.cc', 'src/core/lib/event_engine/slice.cc', @@ -1110,7 +1114,6 @@ 'target_name': 'grpc_unsecure', 'type': 'static_library', 'dependencies': [ - 'absl/cleanup:cleanup', 'absl/container:flat_hash_map', 'absl/container:flat_hash_set', 'absl/container:inlined_vector', @@ -1257,7 +1260,12 @@ 'src/core/lib/event_engine/channel_args_endpoint_config.cc', 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/event_engine.cc', - 'src/core/lib/event_engine/iomgr_engine.cc', + 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc', + 'src/core/lib/event_engine/iomgr_engine/thread_pool.cc', + 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc', + 'src/core/lib/event_engine/iomgr_engine/timer.cc', + 'src/core/lib/event_engine/iomgr_engine/timer_heap.cc', + 'src/core/lib/event_engine/iomgr_engine/timer_manager.cc', 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/resolved_address.cc', 'src/core/lib/event_engine/slice.cc', diff --git a/package.xml b/package.xml index 1f1c46b56fa..065b067c665 100644 --- a/package.xml +++ b/package.xml @@ -935,8 +935,18 @@ - - + + + + + + + + + + + + @@ -1569,8 +1579,6 @@ - - diff --git a/src/core/lib/event_engine/default_event_engine_factory.cc b/src/core/lib/event_engine/default_event_engine_factory.cc index 214651781b4..3f2ce66353e 100644 --- a/src/core/lib/event_engine/default_event_engine_factory.cc +++ b/src/core/lib/event_engine/default_event_engine_factory.cc @@ -20,7 +20,7 @@ #include #include "src/core/lib/event_engine/event_engine_factory.h" -#include "src/core/lib/event_engine/iomgr_engine.h" +#include "src/core/lib/event_engine/iomgr_engine/iomgr_engine.h" namespace grpc_event_engine { namespace experimental { diff --git a/src/core/lib/event_engine/iomgr_engine.cc b/src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc similarity index 63% rename from src/core/lib/event_engine/iomgr_engine.cc rename to src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc index 20f93f141bd..61064cf2b52 100644 --- a/src/core/lib/event_engine/iomgr_engine.cc +++ b/src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc @@ -13,14 +13,12 @@ // limitations under the License. #include -#include "src/core/lib/event_engine/iomgr_engine.h" +#include "src/core/lib/event_engine/iomgr_engine/iomgr_engine.h" #include #include -#include #include -#include "absl/cleanup/cleanup.h" #include "absl/container/flat_hash_set.h" #include "absl/strings/str_cat.h" @@ -28,46 +26,49 @@ #include #include "src/core/lib/debug/trace.h" +#include "src/core/lib/event_engine/iomgr_engine/timer.h" #include "src/core/lib/event_engine/trace.h" -#include "src/core/lib/gprpp/match.h" #include "src/core/lib/gprpp/time.h" -#include "src/core/lib/iomgr/closure.h" -#include "src/core/lib/iomgr/error.h" -#include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/iomgr/executor.h" -#include "src/core/lib/iomgr/timer.h" namespace grpc_event_engine { namespace experimental { namespace { -struct ClosureData { - grpc_timer timer; - grpc_closure closure; - absl::variant, EventEngine::Closure*> cb; - IomgrEventEngine* engine; - EventEngine::TaskHandle handle; -}; +std::string HandleToString(EventEngine::TaskHandle handle) { + return absl::StrCat("{", handle.keys[0], ",", handle.keys[1], "}"); +} -grpc_core::Timestamp ToTimestamp(EventEngine::Duration when) { - grpc_core::ExecCtx::Get()->InvalidateNow(); - return grpc_core::ExecCtx::Get()->Now() + +} // namespace + +grpc_core::Timestamp IomgrEventEngine::ToTimestamp(EventEngine::Duration when) { + return timer_manager_.Now() + std::max(grpc_core::Duration::Milliseconds(1), grpc_core::Duration::NanosecondsRoundUp(when.count())) + grpc_core::Duration::Milliseconds(1); } -std::string HandleToString(EventEngine::TaskHandle handle) { - return absl::StrCat("{", handle.keys[0], ",", handle.keys[1], "}"); -} +struct IomgrEventEngine::ClosureData final : public EventEngine::Closure { + std::function cb; + iomgr_engine::Timer timer; + IomgrEventEngine* engine; + EventEngine::TaskHandle handle; -} // namespace + void Run() override { + GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p executing callback:%s", engine, + HandleToString(handle).c_str()); + { + grpc_core::MutexLock lock(&engine->mu_); + engine->known_handles_.erase(handle); + } + cb(); + delete this; + } +}; IomgrEventEngine::IomgrEventEngine() {} IomgrEventEngine::~IomgrEventEngine() { - grpc_core::ExecCtx::Get()->Flush(); grpc_core::MutexLock lock(&mu_); if (GRPC_TRACE_FLAG_ENABLED(grpc_event_engine_trace)) { for (auto handle : known_handles_) { @@ -84,9 +85,10 @@ bool IomgrEventEngine::Cancel(EventEngine::TaskHandle handle) { grpc_core::MutexLock lock(&mu_); if (!known_handles_.contains(handle)) return false; auto* cd = reinterpret_cast(handle.keys[0]); - grpc_timer_cancel(&cd->timer); + bool r = timer_manager_.TimerCancel(&cd->timer); known_handles_.erase(handle); - return true; + if (r) delete cd; + return r; } EventEngine::TaskHandle IomgrEventEngine::RunAfter( @@ -96,41 +98,23 @@ EventEngine::TaskHandle IomgrEventEngine::RunAfter( EventEngine::TaskHandle IomgrEventEngine::RunAfter( Duration when, EventEngine::Closure* closure) { - return RunAfterInternal(when, closure); + return RunAfterInternal(when, [closure]() { closure->Run(); }); } void IomgrEventEngine::Run(std::function closure) { - RunInternal(closure); + thread_pool_.Add(closure); } void IomgrEventEngine::Run(EventEngine::Closure* closure) { - RunInternal(closure); + thread_pool_.Add([closure]() { closure->Run(); }); } EventEngine::TaskHandle IomgrEventEngine::RunAfterInternal( - Duration when, - absl::variant, EventEngine::Closure*> cb) { + Duration when, std::function cb) { auto when_ts = ToTimestamp(when); auto* cd = new ClosureData; cd->cb = std::move(cb); cd->engine = this; - GRPC_CLOSURE_INIT( - &cd->closure, - [](void* arg, grpc_error_handle error) { - auto* cd = static_cast(arg); - GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p executing callback:%s", - cd->engine, HandleToString(cd->handle).c_str()); - { - grpc_core::MutexLock lock(&cd->engine->mu_); - cd->engine->known_handles_.erase(cd->handle); - } - auto cleaner = absl::MakeCleanup([cd] { delete cd; }); - if (error == GRPC_ERROR_CANCELLED) return; - grpc_core::Match( - cd->cb, [](EventEngine::Closure* cb) { cb->Run(); }, - [](std::function fn) { fn(); }); - }, - cd, nullptr); EventEngine::TaskHandle handle{reinterpret_cast(cd), aba_token_.fetch_add(1)}; grpc_core::MutexLock lock(&mu_); @@ -138,29 +122,10 @@ EventEngine::TaskHandle IomgrEventEngine::RunAfterInternal( cd->handle = handle; GRPC_EVENT_ENGINE_TRACE("IomgrEventEngine:%p scheduling callback:%s", this, HandleToString(handle).c_str()); - grpc_timer_init(&cd->timer, when_ts, &cd->closure); + timer_manager_.TimerInit(&cd->timer, when_ts, cd); return handle; } -void IomgrEventEngine::RunInternal( - absl::variant, EventEngine::Closure*> cb) { - auto* cd = new ClosureData; - cd->cb = std::move(cb); - cd->engine = this; - GRPC_CLOSURE_INIT( - &cd->closure, - [](void* arg, grpc_error_handle /*error*/) { - auto* cd = static_cast(arg); - auto cleaner = absl::MakeCleanup([cd] { delete cd; }); - grpc_core::Match( - cd->cb, [](EventEngine::Closure* cb) { cb->Run(); }, - [](std::function fn) { fn(); }); - }, - cd, nullptr); - // TODO(hork): have the EE spawn dedicated closure thread(s) - grpc_core::Executor::Run(&cd->closure, GRPC_ERROR_NONE); -} - std::unique_ptr IomgrEventEngine::GetDNSResolver( EventEngine::DNSResolver::ResolverOptions const& /*options*/) { GPR_ASSERT(false && "unimplemented"); diff --git a/src/core/lib/event_engine/iomgr_engine.h b/src/core/lib/event_engine/iomgr_engine/iomgr_engine.h similarity index 86% rename from src/core/lib/event_engine/iomgr_engine.h rename to src/core/lib/event_engine/iomgr_engine/iomgr_engine.h index ebc239eb638..eab19473509 100644 --- a/src/core/lib/event_engine/iomgr_engine.h +++ b/src/core/lib/event_engine/iomgr_engine/iomgr_engine.h @@ -11,8 +11,8 @@ // 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 GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H -#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H +#ifndef GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H +#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H #include #include @@ -25,7 +25,6 @@ #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/string_view.h" -#include "absl/types/variant.h" #include #include @@ -33,7 +32,10 @@ #include #include "src/core/lib/event_engine/handle_containers.h" +#include "src/core/lib/event_engine/iomgr_engine/thread_pool.h" +#include "src/core/lib/event_engine/iomgr_engine/timer_manager.h" #include "src/core/lib/gprpp/sync.h" +#include "src/core/lib/gprpp/time.h" namespace grpc_event_engine { namespace experimental { @@ -101,12 +103,13 @@ class IomgrEventEngine final : public EventEngine { bool Cancel(TaskHandle handle) override; private: - EventEngine::TaskHandle RunAfterInternal( - Duration when, - absl::variant, EventEngine::Closure*> cb); + struct ClosureData; + EventEngine::TaskHandle RunAfterInternal(Duration when, + std::function cb); + grpc_core::Timestamp ToTimestamp(EventEngine::Duration when); - void RunInternal( - absl::variant, EventEngine::Closure*> cb); + iomgr_engine::TimerManager timer_manager_; + iomgr_engine::ThreadPool thread_pool_{2}; grpc_core::Mutex mu_; TaskHandleSet known_handles_ ABSL_GUARDED_BY(mu_); @@ -116,4 +119,4 @@ class IomgrEventEngine final : public EventEngine { } // namespace experimental } // namespace grpc_event_engine -#endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_H +#endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_IOMGR_ENGINE_H diff --git a/src/core/lib/event_engine/iomgr_engine/thread_pool.cc b/src/core/lib/event_engine/iomgr_engine/thread_pool.cc new file mode 100644 index 00000000000..2d52d244bc3 --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/thread_pool.cc @@ -0,0 +1,123 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 "src/core/lib/event_engine/iomgr_engine/thread_pool.h" + +#include "src/core/lib/gprpp/thd.h" + +namespace grpc_event_engine { +namespace iomgr_engine { + +ThreadPool::Thread::Thread(ThreadPool* pool) + : pool_(pool), + thd_( + "iomgr_eventengine_pool", + [](void* th) { static_cast(th)->ThreadFunc(); }, + this) { + thd_.Start(); +} +ThreadPool::Thread::~Thread() { thd_.Join(); } + +void ThreadPool::Thread::ThreadFunc() { + pool_->ThreadFunc(); + // Now that we have killed ourselves, we should reduce the thread count + grpc_core::MutexLock lock(&pool_->mu_); + pool_->nthreads_--; + // Move ourselves to dead list + pool_->dead_threads_.push_back(this); + + if ((pool_->shutdown_) && (pool_->nthreads_ == 0)) { + pool_->shutdown_cv_.Signal(); + } +} + +void ThreadPool::ThreadFunc() { + for (;;) { + // Wait until work is available or we are shutting down. + grpc_core::ReleasableMutexLock lock(&mu_); + if (!shutdown_ && callbacks_.empty()) { + // If there are too many threads waiting, then quit this thread + if (threads_waiting_ >= reserve_threads_) { + break; + } + threads_waiting_++; + cv_.Wait(&mu_); + threads_waiting_--; + } + // Drain callbacks before considering shutdown to ensure all work + // gets completed. + if (!callbacks_.empty()) { + auto cb = callbacks_.front(); + callbacks_.pop(); + lock.Release(); + cb(); + } else if (shutdown_) { + break; + } + } +} + +ThreadPool::ThreadPool(int reserve_threads) + : shutdown_(false), + reserve_threads_(reserve_threads), + nthreads_(0), + threads_waiting_(0) { + for (int i = 0; i < reserve_threads_; i++) { + grpc_core::MutexLock lock(&mu_); + nthreads_++; + new Thread(this); + } +} + +void ThreadPool::ReapThreads(std::vector* tlist) { + for (auto* t : *tlist) delete t; + tlist->clear(); +} + +ThreadPool::~ThreadPool() { + grpc_core::MutexLock lock(&mu_); + shutdown_ = true; + cv_.SignalAll(); + while (nthreads_ != 0) { + shutdown_cv_.Wait(&mu_); + } + ReapThreads(&dead_threads_); +} + +void ThreadPool::Add(const std::function& callback) { + grpc_core::MutexLock lock(&mu_); + // Add works to the callbacks list + callbacks_.push(callback); + // Increase pool size or notify as needed + if (threads_waiting_ == 0) { + // Kick off a new thread + nthreads_++; + new Thread(this); + } else { + cv_.Signal(); + } + // Also use this chance to harvest dead threads + if (!dead_threads_.empty()) { + ReapThreads(&dead_threads_); + } +} + +} // namespace iomgr_engine +} // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/iomgr_engine/thread_pool.h b/src/core/lib/event_engine/iomgr_engine/thread_pool.h new file mode 100644 index 00000000000..245be30a964 --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/thread_pool.h @@ -0,0 +1,70 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H +#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H + +#include + +#include +#include +#include + +#include "src/core/lib/gprpp/sync.h" +#include "src/core/lib/gprpp/thd.h" + +namespace grpc_event_engine { +namespace iomgr_engine { + +class ThreadPool final { + public: + explicit ThreadPool(int reserve_threads); + ~ThreadPool(); + + void Add(const std::function& callback); + + private: + class Thread { + public: + explicit Thread(ThreadPool* pool); + ~Thread(); + + private: + ThreadPool* pool_; + grpc_core::Thread thd_; + void ThreadFunc(); + }; + + void ThreadFunc(); + static void ReapThreads(std::vector* tlist); + + grpc_core::Mutex mu_; + grpc_core::CondVar cv_; + grpc_core::CondVar shutdown_cv_; + bool shutdown_; + std::queue> callbacks_; + int reserve_threads_; + int nthreads_; + int threads_waiting_; + std::vector dead_threads_; +}; + +} // namespace iomgr_engine +} // namespace grpc_event_engine + +#endif // GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_THREAD_POOL_H diff --git a/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc b/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc new file mode 100644 index 00000000000..89ecdb6e8e0 --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc @@ -0,0 +1,62 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 "src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h" + +namespace grpc_event_engine { +namespace iomgr_engine { + +TimeAveragedStats::TimeAveragedStats(double init_avg, double regress_weight, + double persistence_factor) + : init_avg_(init_avg), + regress_weight_(regress_weight), + persistence_factor_(persistence_factor) {} + +void TimeAveragedStats::AddSample(double value) { + batch_total_value_ += value; + ++batch_num_samples_; +} + +double TimeAveragedStats::UpdateAverage() { + /* Start with the current batch: */ + double weighted_sum = batch_total_value_; + double total_weight = batch_num_samples_; + if (regress_weight_ > 0) { + /* Add in the regression towards init_avg_: */ + weighted_sum += regress_weight_ * init_avg_; + total_weight += regress_weight_; + } + if (persistence_factor_ > 0) { + /* Add in the persistence: */ + const double prev_sample_weight = + persistence_factor_ * aggregate_total_weight_; + weighted_sum += prev_sample_weight * aggregate_weighted_avg_; + total_weight += prev_sample_weight; + } + aggregate_weighted_avg_ = + (total_weight > 0) ? (weighted_sum / total_weight) : init_avg_; + aggregate_total_weight_ = total_weight; + batch_num_samples_ = 0; + batch_total_value_ = 0; + return aggregate_weighted_avg_; +} + +} // namespace iomgr_engine +} // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h b/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h new file mode 100644 index 00000000000..c023a1e133b --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h @@ -0,0 +1,81 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H +#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H + +namespace grpc_event_engine { +namespace iomgr_engine { + +/* This tracks a time-decaying weighted average. It works by collecting + batches of samples and then mixing their average into a time-decaying + weighted mean. It is designed for batch operations where we do many adds + before updating the average. */ + +class TimeAveragedStats { + public: + TimeAveragedStats(double init_avg, double regress_weight, + double persistence_factor); + + /* Add a sample to the current batch. */ + void AddSample(double value); + /* Complete a batch and compute the new estimate of the average sample + value. */ + double UpdateAverage(); + + double aggregate_weighted_avg() const { return aggregate_weighted_avg_; } + double aggregate_total_weight() const { return aggregate_total_weight_; } + + private: + /* The initial average value. This is the reported average until the first + grpc_time_averaged_stats_update_average call. If a positive regress_weight + is used, we also regress towards this value on each update. */ + const double init_avg_; + /* The sample weight of "init_avg" that is mixed in with each call to + grpc_time_averaged_stats_update_average. If the calls to + grpc_time_averaged_stats_add_sample stop, this will cause the average to + regress back to the mean. This should be non-negative. Set it to 0 to + disable the bias. A value of 1 has the effect of adding in 1 bonus sample + with value init_avg to each sample period. */ + const double regress_weight_; + /* This determines the rate of decay of the time-averaging from one period + to the next by scaling the aggregate_total_weight of samples from prior + periods when combining with the latest period. It should be in the range + [0,1]. A higher value adapts more slowly. With a value of 0.5, if the + batches each have k samples, the samples_in_avg_ will grow to 2 k, so the + weighting of the time average will eventually be 1/3 new batch and 2/3 + old average. */ + const double persistence_factor_; + + /* The total value of samples since the last UpdateAverage(). */ + double batch_total_value_ = 0; + /* The number of samples since the last UpdateAverage(). */ + double batch_num_samples_ = 0; + /* The time-decayed sum of batch_num_samples_ over previous batches. This is + the "weight" of the old aggregate_weighted_avg_ when updating the + average. */ + double aggregate_total_weight_ = 0; + /* A time-decayed average of the (batch_total_value_ / batch_num_samples_), + computed by decaying the samples_in_avg_ weight in the weighted average. */ + double aggregate_weighted_avg_ = init_avg_; +}; + +} // namespace iomgr_engine +} // namespace grpc_event_engine + +#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIME_AVERAGED_STATS_H */ diff --git a/src/core/lib/event_engine/iomgr_engine/timer.cc b/src/core/lib/event_engine/iomgr_engine/timer.cc new file mode 100644 index 00000000000..4ea69235321 --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/timer.cc @@ -0,0 +1,312 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 "src/core/lib/event_engine/iomgr_engine/timer.h" + +#include +#include +#include +#include +#include + +#include + +#include "src/core/lib/event_engine/iomgr_engine/timer_heap.h" +#include "src/core/lib/gpr/useful.h" +#include "src/core/lib/gprpp/time.h" + +namespace grpc_event_engine { +namespace iomgr_engine { + +static const size_t kInvalidHeapIndex = std::numeric_limits::max(); +static const double kAddDeadlineScale = 0.33; +static const double kMinQueueWindowDuration = 0.01; +static const double kMaxQueueWindowDuration = 1.0; + +grpc_core::Timestamp TimerList::Shard::ComputeMinDeadline() { + return heap.is_empty() + ? queue_deadline_cap + grpc_core::Duration::Epsilon() + : grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch( + heap.Top()->deadline); +} + +TimerList::Shard::Shard() : stats(1.0 / kAddDeadlineScale, 0.1, 0.5) {} + +TimerList::TimerList(TimerListHost* host) + : host_(host), + num_shards_(grpc_core::Clamp(2 * gpr_cpu_num_cores(), 1u, 32u)), + min_timer_(host_->Now().milliseconds_after_process_epoch()), + shards_(new Shard[num_shards_]), + shard_queue_(new Shard*[num_shards_]) { + for (size_t i = 0; i < num_shards_; i++) { + Shard& shard = shards_[i]; + shard.queue_deadline_cap = + grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch( + min_timer_.load(std::memory_order_relaxed)); + shard.shard_queue_index = i; + shard.list.next = shard.list.prev = &shard.list; + shard.min_deadline = shard.ComputeMinDeadline(); + shard_queue_[i] = &shard; + } +} + +namespace { +/* returns true if the first element in the list */ +void ListJoin(Timer* head, Timer* timer) { + timer->next = head; + timer->prev = head->prev; + timer->next->prev = timer->prev->next = timer; +} + +void ListRemove(Timer* timer) { + timer->next->prev = timer->prev; + timer->prev->next = timer->next; +} +} // namespace + +void TimerList::SwapAdjacentShardsInQueue(uint32_t first_shard_queue_index) { + Shard* temp; + temp = shard_queue_[first_shard_queue_index]; + shard_queue_[first_shard_queue_index] = + shard_queue_[first_shard_queue_index + 1]; + shard_queue_[first_shard_queue_index + 1] = temp; + shard_queue_[first_shard_queue_index]->shard_queue_index = + first_shard_queue_index; + shard_queue_[first_shard_queue_index + 1]->shard_queue_index = + first_shard_queue_index + 1; +} + +void TimerList::NoteDeadlineChange(Shard* shard) { + while (shard->shard_queue_index > 0 && + shard->min_deadline < + shard_queue_[shard->shard_queue_index - 1]->min_deadline) { + SwapAdjacentShardsInQueue(shard->shard_queue_index - 1); + } + while (shard->shard_queue_index < num_shards_ - 1 && + shard->min_deadline > + shard_queue_[shard->shard_queue_index + 1]->min_deadline) { + SwapAdjacentShardsInQueue(shard->shard_queue_index); + } +} + +void TimerList::TimerInit(Timer* timer, grpc_core::Timestamp deadline, + experimental::EventEngine::Closure* closure) { + bool is_first_timer = false; + Shard* shard = &shards_[grpc_core::HashPointer(timer, num_shards_)]; + timer->closure = closure; + timer->deadline = deadline.milliseconds_after_process_epoch(); + +#ifndef NDEBUG + timer->hash_table_next = nullptr; +#endif + + { + grpc_core::MutexLock lock(&shard->mu); + timer->pending = true; + grpc_core::Timestamp now = host_->Now(); + if (deadline <= now) { + deadline = now; + } + + shard->stats.AddSample((deadline - now).millis() / 1000.0); + + if (deadline < shard->queue_deadline_cap) { + is_first_timer = shard->heap.Add(timer); + } else { + timer->heap_index = kInvalidHeapIndex; + ListJoin(&shard->list, timer); + } + } + + /* Deadline may have decreased, we need to adjust the main queue. Note + that there is a potential racy unlocked region here. There could be a + reordering of multiple TimerInit calls, at this point, but the < test + below should ensure that we err on the side of caution. There could + also be a race with TimerCheck, which might beat us to the lock. In + that case, it is possible that the timer that we added will have already + run by the time we hold the lock, but that too is a safe error. + Finally, it's possible that the TimerCheck that intervened failed to + trigger the new timer because the min_deadline hadn't yet been reduced. + In that case, the timer will simply have to wait for the next + TimerCheck. */ + if (is_first_timer) { + grpc_core::MutexLock lock(&mu_); + if (deadline < shard->min_deadline) { + grpc_core::Timestamp old_min_deadline = shard_queue_[0]->min_deadline; + shard->min_deadline = deadline; + NoteDeadlineChange(shard); + if (shard->shard_queue_index == 0 && deadline < old_min_deadline) { + min_timer_.store(deadline.milliseconds_after_process_epoch(), + std::memory_order_relaxed); + host_->Kick(); + } + } + } +} + +bool TimerList::TimerCancel(Timer* timer) { + Shard* shard = &shards_[grpc_core::HashPointer(timer, num_shards_)]; + grpc_core::MutexLock lock(&shard->mu); + + if (timer->pending) { + timer->pending = false; + if (timer->heap_index == kInvalidHeapIndex) { + ListRemove(timer); + } else { + shard->heap.Remove(timer); + } + return true; + } + + return false; +} + +/* Rebalances the timer shard by computing a new 'queue_deadline_cap' and moving + all relevant timers in shard->list (i.e timers with deadlines earlier than + 'queue_deadline_cap') into into shard->heap. + Returns 'true' if shard->heap has at least ONE element */ +bool TimerList::Shard::RefillHeap(grpc_core::Timestamp now) { + /* Compute the new queue window width and bound by the limits: */ + double computed_deadline_delta = stats.UpdateAverage() * kAddDeadlineScale; + double deadline_delta = + grpc_core::Clamp(computed_deadline_delta, kMinQueueWindowDuration, + kMaxQueueWindowDuration); + Timer *timer, *next; + + /* Compute the new cap and put all timers under it into the queue: */ + queue_deadline_cap = std::max(now, queue_deadline_cap) + + grpc_core::Duration::FromSecondsAsDouble(deadline_delta); + + for (timer = list.next; timer != &list; timer = next) { + next = timer->next; + auto timer_deadline = + grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch( + timer->deadline); + + if (timer_deadline < queue_deadline_cap) { + ListRemove(timer); + heap.Add(timer); + } + } + return !heap.is_empty(); +} + +/* This pops the next non-cancelled timer with deadline <= now from the + queue, or returns NULL if there isn't one. */ +Timer* TimerList::Shard::PopOne(grpc_core::Timestamp now) { + Timer* timer; + for (;;) { + if (heap.is_empty()) { + if (now < queue_deadline_cap) return nullptr; + if (!RefillHeap(now)) return nullptr; + } + timer = heap.Top(); + auto timer_deadline = + grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch( + timer->deadline); + if (timer_deadline > now) return nullptr; + timer->pending = false; + heap.Pop(); + return timer; + } +} + +void TimerList::Shard::PopTimers( + grpc_core::Timestamp now, grpc_core::Timestamp* new_min_deadline, + std::vector* out) { + grpc_core::MutexLock lock(&mu); + while (Timer* timer = PopOne(now)) { + out->push_back(timer->closure); + } + *new_min_deadline = ComputeMinDeadline(); +} + +std::vector TimerList::FindExpiredTimers( + grpc_core::Timestamp now, grpc_core::Timestamp* next) { + grpc_core::Timestamp min_timer = + grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch( + min_timer_.load(std::memory_order_relaxed)); + + std::vector done; + if (now < min_timer) { + if (next != nullptr) *next = std::min(*next, min_timer); + return done; + } + + grpc_core::MutexLock lock(&mu_); + + while (shard_queue_[0]->min_deadline < now || + (now != grpc_core::Timestamp::InfFuture() && + shard_queue_[0]->min_deadline == now)) { + grpc_core::Timestamp new_min_deadline; + + /* For efficiency, we pop as many available timers as we can from the + shard. This may violate perfect timer deadline ordering, but that + shouldn't be a big deal because we don't make ordering guarantees. */ + shard_queue_[0]->PopTimers(now, &new_min_deadline, &done); + + /* An TimerInit() on the shard could intervene here, adding a new + timer that is earlier than new_min_deadline. However, + TimerInit() will block on the mutex before it can call + set_min_deadline, so this one will complete first and then the Addtimer + will reduce the min_deadline (perhaps unnecessarily). */ + shard_queue_[0]->min_deadline = new_min_deadline; + NoteDeadlineChange(shard_queue_[0]); + } + + if (next) { + *next = std::min(*next, shard_queue_[0]->min_deadline); + } + + min_timer_.store( + shard_queue_[0]->min_deadline.milliseconds_after_process_epoch(), + std::memory_order_relaxed); + + return done; +} + +absl::optional> +TimerList::TimerCheck(grpc_core::Timestamp* next) { + // prelude + grpc_core::Timestamp now = host_->Now(); + + /* fetch from a thread-local first: this avoids contention on a globally + mutable cacheline in the common case */ + grpc_core::Timestamp min_timer = + grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch( + min_timer_.load(std::memory_order_relaxed)); + + if (now < min_timer) { + if (next != nullptr) { + *next = std::min(*next, min_timer); + } + return std::vector(); + } + + if (!checker_mu_.TryLock()) return absl::nullopt; + std::vector run = + FindExpiredTimers(now, next); + checker_mu_.Unlock(); + + return std::move(run); +} + +} // namespace iomgr_engine +} // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/iomgr_engine/timer.h b/src/core/lib/event_engine/iomgr_engine/timer.h new file mode 100644 index 00000000000..629e4a00fe3 --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/timer.h @@ -0,0 +1,193 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_H +#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_H + +#include + +#include + +#include +#include +#include +#include + +#include "absl/base/thread_annotations.h" +#include "absl/types/optional.h" + +#include + +#include "src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h" +#include "src/core/lib/event_engine/iomgr_engine/timer_heap.h" +#include "src/core/lib/gprpp/sync.h" +#include "src/core/lib/gprpp/time.h" + +namespace grpc_event_engine { +namespace iomgr_engine { + +struct Timer { + int64_t deadline; + // kInvalidHeapIndex if not in heap. + size_t heap_index; + bool pending; + struct Timer* next; + struct Timer* prev; + experimental::EventEngine::Closure* closure; +#ifndef NDEBUG + struct Timer* hash_table_next; +#endif + + grpc_event_engine::experimental::EventEngine::TaskHandle task_handle; +}; + +// Dependency injection: allow tests and/or TimerManager to inject +// their own implementations of Now, Kick. +class TimerListHost { + public: + // Return the current timestamp. + // Abstracted so that tests can be run deterministically. + virtual grpc_core::Timestamp Now() = 0; + // Wake up a thread to check for timers. + virtual void Kick() = 0; + + protected: + ~TimerListHost() = default; +}; + +class TimerList { + public: + explicit TimerList(TimerListHost* host); + + TimerList(const TimerList&) = delete; + TimerList& operator=(const TimerList&) = delete; + + /* Initialize *timer. When expired or canceled, closure will be called with + error set to indicate if it expired (GRPC_ERROR_NONE) or was canceled + (GRPC_ERROR_CANCELLED). *closure is guaranteed to be called exactly once, and + application code should check the error to determine how it was invoked. The + application callback is also responsible for maintaining information about + when to free up any user-level state. Behavior is undefined for a deadline of + grpc_core::Timestamp::InfFuture(). */ + void TimerInit(Timer* timer, grpc_core::Timestamp deadline, + experimental::EventEngine::Closure* closure); + + /* Note that there is no timer destroy function. This is because the + timer is a one-time occurrence with a guarantee that the callback will + be called exactly once, either at expiration or cancellation. Thus, all + the internal timer event management state is destroyed just before + that callback is invoked. If the user has additional state associated with + the timer, the user is responsible for determining when it is safe to + destroy that state. */ + + /* Cancel an *timer. + There are three cases: + 1. We normally cancel the timer + 2. The timer has already run + 3. We can't cancel the timer because it is "in flight". + + In all of these cases, the cancellation is still considered successful. + They are essentially distinguished in that the timer_cb will be run + exactly once from either the cancellation (with error GRPC_ERROR_CANCELLED) + or from the activation (with error GRPC_ERROR_NONE). + + Note carefully that the callback function MAY occur in the same callstack + as grpc_timer_cancel. It's expected that most timers will be cancelled + (their primary use is to implement deadlines), and so this code is + optimized such that cancellation costs as little as possible. Making + callbacks run inline matches this aim. + + Requires: cancel() must happen after init() on a given timer */ + bool TimerCancel(Timer* timer) GRPC_MUST_USE_RESULT; + + /* iomgr internal api for dealing with timers */ + + /* Check for timers to be run, and return them. + Return nullopt if timers could not be checked due to contention with + another thread checking. + Return a vector of closures that *must* be run otherwise. + If next is non-null, TRY to update *next with the next running timer + IF that timer occurs before *next current value. + *next is never guaranteed to be updated on any given execution; however, + with high probability at least one thread in the system will see an update + at any time slice. */ + absl::optional> TimerCheck( + grpc_core::Timestamp* next); + + private: + /* A "timer shard". Contains a 'heap' and a 'list' of timers. All timers with + * deadlines earlier than 'queue_deadline_cap' are maintained in the heap and + * others are maintained in the list (unordered). This helps to keep the + * number of elements in the heap low. + * + * The 'queue_deadline_cap' gets recomputed periodically based on the timer + * stats maintained in 'stats' and the relevant timers are then moved from the + * 'list' to 'heap'. + */ + struct Shard { + Shard(); + + grpc_core::Timestamp ComputeMinDeadline() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu); + bool RefillHeap(grpc_core::Timestamp now) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu); + Timer* PopOne(grpc_core::Timestamp now) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu); + void PopTimers(grpc_core::Timestamp now, + grpc_core::Timestamp* new_min_deadline, + std::vector* out) + ABSL_LOCKS_EXCLUDED(mu); + + grpc_core::Mutex mu; + TimeAveragedStats stats ABSL_GUARDED_BY(mu); + /* All and only timers with deadlines < this will be in the heap. */ + grpc_core::Timestamp queue_deadline_cap ABSL_GUARDED_BY(mu); + /* The deadline of the next timer due in this shard. */ + grpc_core::Timestamp min_deadline ABSL_GUARDED_BY(&TimerList::mu_); + /* Index of this timer_shard in the g_shard_queue. */ + uint32_t shard_queue_index ABSL_GUARDED_BY(&TimerList::mu_); + /* This holds all timers with deadlines < queue_deadline_cap. Timers in this + list have the top bit of their deadline set to 0. */ + TimerHeap heap ABSL_GUARDED_BY(mu); + /* This holds timers whose deadline is >= queue_deadline_cap. */ + Timer list ABSL_GUARDED_BY(mu); + }; + + void SwapAdjacentShardsInQueue(uint32_t first_shard_queue_index) + ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); + void NoteDeadlineChange(Shard* shard) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); + std::vector FindExpiredTimers( + grpc_core::Timestamp now, grpc_core::Timestamp* next); + + TimerListHost* const host_; + const size_t num_shards_; + grpc_core::Mutex mu_; + /* The deadline of the next timer due across all timer shards */ + std::atomic min_timer_; + /* Allow only one FindExpiredTimers at once (used as a TryLock, protects no + * fields but ensures limits on concurrency) */ + grpc_core::Mutex checker_mu_; + /* Array of timer shards. Whenever a timer (Timer *) is added, its address + * is hashed to select the timer shard to add the timer to */ + const std::unique_ptr shards_; + /* Maintains a sorted list of timer shards (sorted by their min_deadline, i.e + * the deadline of the next timer in each shard). */ + const std::unique_ptr shard_queue_ ABSL_GUARDED_BY(mu_); +}; + +} // namespace iomgr_engine +} // namespace grpc_event_engine + +#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_H */ diff --git a/src/core/lib/event_engine/iomgr_engine/timer_heap.cc b/src/core/lib/event_engine/iomgr_engine/timer_heap.cc new file mode 100644 index 00000000000..da14d666b09 --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/timer_heap.cc @@ -0,0 +1,107 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 "src/core/lib/event_engine/iomgr_engine/timer_heap.h" + +#include + +#include + +#include "src/core/lib/event_engine/iomgr_engine/timer.h" + +namespace grpc_event_engine { +namespace iomgr_engine { + +/* Adjusts a heap so as to move a hole at position i closer to the root, + until a suitable position is found for element t. Then, copies t into that + position. This functor is called each time immediately after modifying a + value in the underlying container, with the offset of the modified element as + its argument. */ +void TimerHeap::AdjustUpwards(size_t i, Timer* t) { + while (i > 0) { + size_t parent = (i - 1) / 2; + if (timers_[parent]->deadline <= t->deadline) break; + timers_[i] = timers_[parent]; + timers_[i]->heap_index = i; + i = parent; + } + timers_[i] = t; + t->heap_index = i; +} + +/* Adjusts a heap so as to move a hole at position i farther away from the root, + until a suitable position is found for element t. Then, copies t into that + position. */ +void TimerHeap::AdjustDownwards(size_t i, Timer* t) { + for (;;) { + size_t left_child = 1 + 2 * i; + if (left_child >= timers_.size()) break; + size_t right_child = left_child + 1; + size_t next_i = + right_child < timers_.size() && + timers_[left_child]->deadline > timers_[right_child]->deadline + ? right_child + : left_child; + if (t->deadline <= timers_[next_i]->deadline) break; + timers_[i] = timers_[next_i]; + timers_[i]->heap_index = i; + i = next_i; + } + timers_[i] = t; + t->heap_index = i; +} + +void TimerHeap::NoteChangedPriority(Timer* timer) { + uint32_t i = timer->heap_index; + uint32_t parent = static_cast((static_cast(i) - 1) / 2); + if (timers_[parent]->deadline > timer->deadline) { + AdjustUpwards(i, timer); + } else { + AdjustDownwards(i, timer); + } +} + +bool TimerHeap::Add(Timer* timer) { + timer->heap_index = timers_.size(); + timers_.push_back(timer); + AdjustUpwards(timer->heap_index, timer); + return timer->heap_index == 0; +} + +void TimerHeap::Remove(Timer* timer) { + uint32_t i = timer->heap_index; + if (i == timers_.size() - 1) { + timers_.pop_back(); + return; + } + timers_[i] = timers_[timers_.size() - 1]; + timers_[i]->heap_index = i; + timers_.pop_back(); + NoteChangedPriority(timers_[i]); +} + +bool TimerHeap::is_empty() { return timers_.empty(); } + +Timer* TimerHeap::Top() { return timers_[0]; } + +void TimerHeap::Pop() { Remove(Top()); } + +} // namespace iomgr_engine +} // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/iomgr_engine/timer_heap.h b/src/core/lib/event_engine/iomgr_engine/timer_heap.h new file mode 100644 index 00000000000..ff8083df553 --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/timer_heap.h @@ -0,0 +1,56 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_HEAP_H +#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_HEAP_H + +#include + +#include +#include + +namespace grpc_event_engine { +namespace iomgr_engine { + +struct Timer; + +class TimerHeap { + public: + /* return true if the new timer is the first timer in the heap */ + bool Add(Timer* timer); + + void Remove(Timer* timer); + Timer* Top(); + void Pop(); + + bool is_empty(); + + const std::vector& TestOnlyGetTimers() const { return timers_; } + + private: + void AdjustUpwards(size_t i, Timer* t); + void AdjustDownwards(size_t i, Timer* t); + void NoteChangedPriority(Timer* timer); + + std::vector timers_; +}; + +} // namespace iomgr_engine +} // namespace grpc_event_engine + +#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_HEAP_H */ diff --git a/src/core/lib/event_engine/iomgr_engine/timer_manager.cc b/src/core/lib/event_engine/iomgr_engine/timer_manager.cc new file mode 100644 index 00000000000..3d1de28fab8 --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/timer_manager.cc @@ -0,0 +1,254 @@ +/* + * + * Copyright 2017 gRPC 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 + * + * http://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 "src/core/lib/event_engine/iomgr_engine/timer_manager.h" + +#include +#include +#include + +#include "absl/memory/memory.h" +#include "absl/time/time.h" +#include "absl/types/optional.h" + +#include +#include +#include + +#include "src/core/lib/gprpp/thd.h" + +namespace grpc_event_engine { +namespace iomgr_engine { + +namespace { +class ThreadCollector { + public: + ThreadCollector() = default; + ~ThreadCollector(); + + void Collect(std::vector threads) { + GPR_ASSERT(threads_.empty()); + threads_ = std::move(threads); + } + + private: + std::vector threads_; +}; + +ThreadCollector::~ThreadCollector() { + for (auto& t : threads_) t.Join(); +} +} // namespace + +void TimerManager::StartThread() { + ++waiter_count_; + ++thread_count_; + auto* thread = new RunThreadArgs(); + thread->self = this; + thread->thread = + grpc_core::Thread("timer_manager", &TimerManager::RunThread, thread); + thread->thread.Start(); +} + +void TimerManager::RunSomeTimers( + std::vector timers) { + // if there's something to execute... + ThreadCollector collector; + { + grpc_core::MutexLock lock(&mu_); + // remove a waiter from the pool, and start another thread if necessary + --waiter_count_; + if (waiter_count_ == 0) { + // The number of timer threads is always increasing until all the threads + // are stopped. In rare cases, if a large number of timers fire + // simultaneously, we may end up using a large number of threads. + // TODO(ctiller): We could avoid this by exiting threads in WaitUntil(). + StartThread(); + } else { + // if there's no thread waiting with a timeout, kick an existing untimed + // waiter so that the next deadline is not missed + if (!has_timed_waiter_) { + cv_.Signal(); + } + } + } + for (auto* timer : timers) { + timer->Run(); + } + { + grpc_core::MutexLock lock(&mu_); + collector.Collect(std::move(completed_threads_)); + // get ready to wait again + ++waiter_count_; + } +} + +// wait until 'next' (or forever if there is already a timed waiter in the pool) +// returns true if the thread should continue executing (false if it should +// shutdown) +bool TimerManager::WaitUntil(grpc_core::Timestamp next) { + grpc_core::MutexLock lock(&mu_); + + if (shutdown_) { + return false; + } + + // TODO(ctiller): if there are too many waiting threads, this would be a good + // place to exit the current thread. + + // If kicked_ is true at this point, it means there was a kick from the timer + // system that the timer-manager threads here missed. We cannot trust 'next' + // here any longer (since there might be an earlier deadline). So if kicked_ + // is true at this point, we should quickly exit this and get the next + // deadline from the timer system + + if (!kicked_) { + // if there's no timed waiter, we should become one: that waiter waits + // only until the next timer should expire. All other timers wait forever + // + // 'timed_waiter_generation_' is a global generation counter. The idea here + // is that the thread becoming a timed-waiter increments and stores this + // global counter locally in 'my_timed_waiter_generation' before going to + // sleep. After waking up, if my_timed_waiter_generation == + // timed_waiter_generation_, it can be sure that it was the timed_waiter + // thread (and that no other thread took over while this was asleep) + // + // Initialize my_timed_waiter_generation to some value that is NOT equal to + // timed_waiter_generation_ + uint64_t my_timed_waiter_generation = timed_waiter_generation_ - 1; + + /* If there's no timed waiter, we should become one: that waiter waits only + until the next timer should expire. All other timer threads wait forever + unless their 'next' is earlier than the current timed-waiter's deadline + (in which case the thread with earlier 'next' takes over as the new timed + waiter) */ + if (next != grpc_core::Timestamp::InfFuture()) { + if (!has_timed_waiter_ || (next < timed_waiter_deadline_)) { + my_timed_waiter_generation = ++timed_waiter_generation_; + has_timed_waiter_ = true; + timed_waiter_deadline_ = next; + } else { // timed_waiter_ == true && next >= timed_waiter_deadline_ + next = grpc_core::Timestamp::InfFuture(); + } + } + + cv_.WaitWithTimeout(&mu_, + absl::Milliseconds((next - host_.Now()).millis())); + + // if this was the timed waiter, then we need to check timers, and flag + // that there's now no timed waiter... we'll look for a replacement if + // there's work to do after checking timers (code above) + if (my_timed_waiter_generation == timed_waiter_generation_) { + ++wakeups_; + has_timed_waiter_ = false; + timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture(); + } + } + + kicked_ = false; + + return true; +} + +void TimerManager::MainLoop() { + for (;;) { + grpc_core::Timestamp next = grpc_core::Timestamp::InfFuture(); + absl::optional> + check_result = timer_list_->TimerCheck(&next); + if (check_result.has_value()) { + if (!check_result->empty()) { + RunSomeTimers(std::move(*check_result)); + continue; + } + } else { + /* This case only happens under contention, meaning more than one timer + manager thread checked timers concurrently. + + If that happens, we're guaranteed that some other thread has just + checked timers, and this will avalanche into some other thread seeing + empty timers and doing a timed sleep. + + Consequently, we can just sleep forever here and be happy at some + saved wakeup cycles. */ + next = grpc_core::Timestamp::InfFuture(); + } + if (!WaitUntil(next)) return; + } +} + +void TimerManager::RunThread(void* arg) { + std::unique_ptr thread(static_cast(arg)); + thread->self->MainLoop(); + { + grpc_core::MutexLock lock(&thread->self->mu_); + thread->self->thread_count_--; + thread->self->completed_threads_.push_back(std::move(thread->thread)); + } + thread->self->cv_.Signal(); +} + +TimerManager::TimerManager() : host_(this) { + timer_list_ = absl::make_unique(&host_); + grpc_core::MutexLock lock(&mu_); + StartThread(); +} + +grpc_core::Timestamp TimerManager::Host::Now() { + return grpc_core::Timestamp::FromTimespecRoundDown( + gpr_now(GPR_CLOCK_MONOTONIC)); +} + +void TimerManager::TimerInit(Timer* timer, grpc_core::Timestamp deadline, + experimental::EventEngine::Closure* closure) { + timer_list_->TimerInit(timer, deadline, closure); +} + +bool TimerManager::TimerCancel(Timer* timer) { + return timer_list_->TimerCancel(timer); +} + +TimerManager::~TimerManager() { + { + grpc_core::MutexLock lock(&mu_); + shutdown_ = true; + cv_.SignalAll(); + } + while (true) { + ThreadCollector collector; + grpc_core::MutexLock lock(&mu_); + collector.Collect(std::move(completed_threads_)); + if (thread_count_ == 0) break; + cv_.Wait(&mu_); + } +} + +void TimerManager::Host::Kick() { timer_manager_->Kick(); } + +void TimerManager::Kick() { + grpc_core::MutexLock lock(&mu_); + has_timed_waiter_ = false; + timed_waiter_deadline_ = grpc_core::Timestamp::InfFuture(); + ++timed_waiter_generation_; + kicked_ = true; + cv_.Signal(); +} + +} // namespace iomgr_engine +} // namespace grpc_event_engine diff --git a/src/core/lib/event_engine/iomgr_engine/timer_manager.h b/src/core/lib/event_engine/iomgr_engine/timer_manager.h new file mode 100644 index 00000000000..6e93621e0ea --- /dev/null +++ b/src/core/lib/event_engine/iomgr_engine/timer_manager.h @@ -0,0 +1,111 @@ +/* + * + * Copyright 2017 gRPC 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 + * + * http://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 GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H +#define GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H + +#include + +#include +#include + +#include +#include + +#include "absl/base/thread_annotations.h" + +#include + +#include "src/core/lib/event_engine/iomgr_engine/timer.h" +#include "src/core/lib/gprpp/sync.h" +#include "src/core/lib/gprpp/thd.h" +#include "src/core/lib/gprpp/time.h" + +namespace grpc_event_engine { +namespace iomgr_engine { + +// Timer Manager tries to keep only one thread waiting for the next timeout at +// all times, and thus effectively preventing the thundering herd problem. +// TODO(ctiller): consider unifying this thread pool and the one in +// thread_pool.{h,cc}. +class TimerManager final { + public: + TimerManager(); + ~TimerManager(); + + grpc_core::Timestamp Now() { return host_.Now(); } + + void TimerInit(Timer* timer, grpc_core::Timestamp deadline, + experimental::EventEngine::Closure* closure); + bool TimerCancel(Timer* timer); + + private: + struct RunThreadArgs { + TimerManager* self; + grpc_core::Thread thread; + }; + + class Host final : public TimerListHost { + public: + explicit Host(TimerManager* timer_manager) + : timer_manager_(timer_manager) {} + + void Kick() override; + grpc_core::Timestamp Now() override; + + private: + TimerManager* const timer_manager_; + }; + + void StartThread() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); + static void RunThread(void* arg); + void MainLoop(); + void RunSomeTimers(std::vector timers); + bool WaitUntil(grpc_core::Timestamp next); + void Kick(); + + grpc_core::Mutex mu_; + grpc_core::CondVar cv_; + Host host_; + // number of threads in the system + size_t thread_count_ ABSL_GUARDED_BY(mu_) = 0; + // number of threads sitting around waiting + size_t waiter_count_ ABSL_GUARDED_BY(mu_) = 0; + // Threads waiting to be joined + std::vector completed_threads_ ABSL_GUARDED_BY(mu_); + // is there a thread waiting until the next timer should fire? + bool has_timed_waiter_ ABSL_GUARDED_BY(mu_) = false; + // are we shutting down? + bool shutdown_ ABSL_GUARDED_BY(mu_) = false; + // are we shutting down? + bool kicked_ ABSL_GUARDED_BY(mu_) = false; + // the deadline of the current timed waiter thread (only relevant if + // has_timed_waiter_ is true) + grpc_core::Timestamp timed_waiter_deadline_ ABSL_GUARDED_BY(mu_); + // generation counter to track which thread is waiting for the next timer + uint64_t timed_waiter_generation_ ABSL_GUARDED_BY(mu_) = 0; + // number of timer wakeups + uint64_t wakeups_ ABSL_GUARDED_BY(mu_) = 0; + // actual timer implementation + std::unique_ptr timer_list_; +}; + +} // namespace iomgr_engine +} // namespace grpc_event_engine + +#endif /* GRPC_CORE_LIB_EVENT_ENGINE_IOMGR_ENGINE_TIMER_MANAGER_H */ diff --git a/src/core/lib/gpr/time_posix.cc b/src/core/lib/gpr/time_posix.cc index 0a9e1158b32..5af7a769dff 100644 --- a/src/core/lib/gpr/time_posix.cc +++ b/src/core/lib/gpr/time_posix.cc @@ -88,17 +88,14 @@ static gpr_timespec now_impl(gpr_clock_type clock_type) { #include #include -static double g_time_scale; -static uint64_t g_time_start; - -void gpr_time_init(void) { +static double g_time_scale = []() { mach_timebase_info_data_t tb = {0, 1}; - gpr_precise_clock_init(); mach_timebase_info(&tb); - g_time_scale = tb.numer; - g_time_scale /= tb.denom; - g_time_start = mach_absolute_time(); -} + return static_cast(tb.numer) / static_cast(tb.denom); +}(); +static uint64_t g_time_start = mach_absolute_time(); + +void gpr_time_init(void) { gpr_precise_clock_init(); } static gpr_timespec now_impl(gpr_clock_type clock) { gpr_timespec now; diff --git a/src/core/lib/gpr/time_windows.cc b/src/core/lib/gpr/time_windows.cc index 39bca1b0940..57323fb8a07 100644 --- a/src/core/lib/gpr/time_windows.cc +++ b/src/core/lib/gpr/time_windows.cc @@ -31,15 +31,18 @@ #include "src/core/lib/gpr/time_precise.h" -static LARGE_INTEGER g_start_time; -static double g_time_scale; - -void gpr_time_init(void) { +static LARGE_INTEGER g_start_time = []() { + LARGE_INTEGER x; + QueryPerformanceCounter(&x); + return x; +}(); +static double g_time_scale = []() { LARGE_INTEGER frequency; QueryPerformanceFrequency(&frequency); - QueryPerformanceCounter(&g_start_time); - g_time_scale = 1.0 / (double)frequency.QuadPart; -} + return 1.0 / (double)frequency.QuadPart; +}(); + +void gpr_time_init(void) {} static gpr_timespec now_impl(gpr_clock_type clock) { gpr_timespec now_tv; diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index fd5cf31ff44..3d63c967592 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -440,7 +440,12 @@ CORE_SOURCE_FILES = [ 'src/core/lib/event_engine/channel_args_endpoint_config.cc', 'src/core/lib/event_engine/default_event_engine_factory.cc', 'src/core/lib/event_engine/event_engine.cc', - 'src/core/lib/event_engine/iomgr_engine.cc', + 'src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc', + 'src/core/lib/event_engine/iomgr_engine/thread_pool.cc', + 'src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc', + 'src/core/lib/event_engine/iomgr_engine/timer.cc', + 'src/core/lib/event_engine/iomgr_engine/timer_heap.cc', + 'src/core/lib/event_engine/iomgr_engine/timer_manager.cc', 'src/core/lib/event_engine/memory_allocator.cc', 'src/core/lib/event_engine/resolved_address.cc', 'src/core/lib/event_engine/slice.cc', diff --git a/test/core/end2end/fuzzers/BUILD b/test/core/end2end/fuzzers/BUILD index 839bd3d0c1d..d403cb1b063 100644 --- a/test/core/end2end/fuzzers/BUILD +++ b/test/core/end2end/fuzzers/BUILD @@ -26,6 +26,9 @@ grpc_proto_fuzzer( corpus = "api_fuzzer_corpus", language = "C++", proto = "api_fuzzer.proto", + proto_deps = [ + "//test/core/event_engine/fuzzing_event_engine:fuzzing_event_engine_proto", + ], tags = ["no_windows"], uses_event_engine = False, uses_polling = False, @@ -33,6 +36,7 @@ grpc_proto_fuzzer( "//:gpr", "//:grpc", "//test/core/end2end:ssl_test_data", + "//test/core/event_engine/fuzzing_event_engine", "//test/core/util:grpc_test_util", ], ) diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc index 3dad73e0184..48056e110a1 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.cc +++ b/test/core/end2end/fuzzers/api_fuzzer.cc @@ -18,6 +18,8 @@ #include +#include + #include #include #include @@ -28,6 +30,7 @@ #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/address_utils/parse_address.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/event_engine/event_engine_factory.h" #include "src/core/lib/gpr/env.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/resolve_address.h" @@ -41,10 +44,28 @@ #include "src/libfuzzer/libfuzzer_macro.h" #include "test/core/end2end/data/ssl_test_data.h" #include "test/core/end2end/fuzzers/api_fuzzer.pb.h" +#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h" #include "test/core/util/passthru_endpoint.h" -static constexpr uint64_t kMaxAdvanceTimeMicros = - 31536000000000; // 1 year (24 * 365 * 3600 * 1000000) +static grpc_event_engine::experimental::FuzzingEventEngine* g_event_engine = + new grpc_event_engine::experimental::FuzzingEventEngine( + grpc_event_engine::experimental::FuzzingEventEngine::Options()); +static int g_unused_initialize_event_engine = []() { + grpc_event_engine::experimental::SetDefaultEventEngineFactory( + new std::function()>([]() { + // HACK HACK HACK + // We know that this event engine will never be deleted by the + // caller, instead release() will be called and the value stashed in + // a global elsewhere. Therefore it's safe to wrap our global in a + // unique_ptr and return it, knowing it will never be deleted + // elsewhere. + return std::unique_ptr( + g_event_engine); + })); + return 42; +}(); + // Applicable when simulating channel actions. Prevents overflows. static constexpr uint64_t kMaxWaitMs = 31536000000; // 1 year (24 * 365 * 3600 * 1000) @@ -64,22 +85,12 @@ static void dont_log(gpr_log_func_args* /*args*/) {} //////////////////////////////////////////////////////////////////////////////// // global state -static gpr_timespec g_now; static grpc_server* g_server; static grpc_channel* g_channel; static grpc_resource_quota* g_resource_quota; static std::vector g_channel_actions; static std::atomic g_channel_force_delete{false}; -extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type); - -static gpr_timespec now_impl(gpr_clock_type clock_type) { - GPR_ASSERT(clock_type != GPR_TIMESPAN); - gpr_timespec ts = g_now; - ts.clock_type = clock_type; - return ts; -} - //////////////////////////////////////////////////////////////////////////////// // dns resolution @@ -762,9 +773,7 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) { if (squelch && grpc_trace_fuzzer == nullptr) gpr_set_log_function(dont_log); gpr_free(grpc_trace_fuzzer); grpc_set_tcp_client_impl(&fuzz_tcp_client_vtable); - g_now = {1, 0, GPR_CLOCK_MONOTONIC}; - grpc_core::TestOnlySetProcessEpoch(g_now); - gpr_now_impl = now_impl; + g_event_engine->Restart(msg.event_engine_actions()); grpc_init(); grpc_timer_manager_set_threading(false); { @@ -808,7 +817,10 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) { while (action_index < msg.actions_size() || g_channel != nullptr || g_server != nullptr || pending_channel_watches > 0 || pending_pings > 0 || ActiveCall() != nullptr) { + g_event_engine->Tick(); + if (action_index == msg.actions_size()) { + g_event_engine->FuzzingDone(); if (g_channel != nullptr) { grpc_channel_destroy(g_channel); g_channel = nullptr; @@ -831,11 +843,6 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) { call->Shutdown(); } - g_now = gpr_time_add( - g_now, - gpr_time_from_seconds( - std::max(1, static_cast(kMaxWaitMs / 1000)), - GPR_TIMESPAN)); grpc_timer_manager_tick(); GPR_ASSERT(!poll_cq()); continue; @@ -860,15 +867,6 @@ DEFINE_PROTO_FUZZER(const api_fuzzer::Msg& msg) { GPR_ASSERT(!poll_cq()); break; } - // increment global time - case api_fuzzer::Action::kAdvanceTime: { - g_now = gpr_time_add( - g_now, gpr_time_from_micros( - std::min(static_cast(action.advance_time()), - kMaxAdvanceTimeMicros), - GPR_TIMESPAN)); - break; - } // create an insecure channel case api_fuzzer::Action::kCreateChannel: { if (!action.create_channel().channel_actions_size() || diff --git a/test/core/end2end/fuzzers/api_fuzzer.proto b/test/core/end2end/fuzzers/api_fuzzer.proto index eab3551cb01..fa6ab6e1566 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.proto +++ b/test/core/end2end/fuzzers/api_fuzzer.proto @@ -16,6 +16,8 @@ syntax = "proto3"; package api_fuzzer; +import "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto"; + message Empty {} message ByteSlice { @@ -162,9 +164,9 @@ message Batch { } message Action { + reserved 2; oneof type { Empty poll_cq = 1; - uint32 advance_time = 2; CreateChannel create_channel = 3; Empty close_channel = 4; CreateServer create_server = 5; @@ -190,4 +192,5 @@ message Action { message Msg { repeated Action actions = 1; + fuzzing_event_engine.Actions event_engine_actions = 2; } diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/alloc-idx b/test/core/end2end/fuzzers/api_fuzzer_corpus/alloc-idx deleted file mode 100644 index 5669fb9cc1f..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/alloc-idx +++ /dev/null @@ -1,350 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "dns:server" - channel_args { - key: "grpc.secondary_user_agent" - str: "grpc.secondary\235\262\362\245\277\255\364\207\275\252\363\203\262\201\361\265\240\262\360\237\255\264\361\275\224\223\363\220\252\242\362\261\223\273\362\275\233\250\360\242\272\277\363\266\265\262\364\212\211\235\362\243\206\273\362\242\201\226\362\251\230\213\363\216\207\260\360\231\252\245\362\225\271\226\361\234\240\225\363\222\245\203\362\242\275\251\361\214\233\272\363\235\271\275\361\236\21ã211\361\220\253\241\360\226\204\216\363\254\255\210\363\264\271\217\360\243\226\265\363\276\220\215\363\216\237\256\362\266\245\273\362\225\206\253\360\225\246\245\362\226\207\224\362\206\234\201\362\223\247\233\361\265\260\234\360\277\217\271\360\265\216\250\363\236\213\224\362\203\204\251\364\215\213\215\361\265\252\214\363\222\234\275\363\212\211\211\363\262\256\200\363\241\243\241\362\201\245\254\361\205\232\252\361\202\220\234\361\277\235\234\363\236\205\274\362\254\214\262\363\252\234\220\360\241\222\242\360\274\240\232\360\260\224\250\363\206\213\221\363\274\250\262\360\236\243\260\361\211\232\273\361\211\251\250\362\226\230\217\361\241\220\200\362\210\212\265\364\217\020\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\30719\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\3077\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\3073\201\361\264\227\230\363\230\234\261\362\227\204\204\362\201\251\230\360\254\242\223\363\222\255\266\362\222\241\213\361\265\247\234\362\277\200\230\363\275\257\215\362\224\210\274\360\267\202\245\362\202\240\217\363\205\232\276\362\257\223\267\361\263\260\201\363\243\242\210\362\213\241\246\363\225\257\210\363\276\256\250\361\254\221\205\363\227\270\267\363\223\215\266\363\232\250\274\362\225\250\255\361\224\240\216\364\207\274\273\362\227\212\234\361\205\213\231\361\211\224\201\363\256\220\232\361\265\261\230\364\200\220\221\360\240\271\221\363\210\275\265\364\215\200\271\360\224\242\203\362\256\233\257\360\235\236\221\362\225\225\203\361\254\217\202\363\213\263\221\362\241\226\271\362\220\230\252\361\213\225\205\360\254\274\211\363\273\217\270\360\250\264\273\361\270\256\203\363\247\224\236\362\204\275\223\362\203\226\272\363\233\271\226\361\264\260\266\363\240\256\277\362\273\225\254\362\220\226\206\362\275\221\244\362\203\252\212\362\221\205\226\363\257\215\244\362\250\200\214\362\232\212\252\362\231\245\226\362\263\211\271\361\216\266\275\362\260\262\275\362\232\245\221\363\276\271\264\361\252\257\227\363\265\230\202\363\225\252\213\361\261\223\263\362\246\232\233\363\201\211\203\362\250\271\272\362\236\276\243\362\270\204\242\361\230\261\202\363\221\241\271\363\205\265\260\362\236\205\202\361\201\207\235\361\262\245\222\362\267\222\247\361\203\236\242\362\224\222\242\361\271\204\275\361\237\236\246\361\243\227\211\362\253\217\207\360\270\207\274\363\236\214\220\361\210\225\243\363\245\230\270\361\240\253\271\360\24759975837\216\277\360\233\201\262\362\212\224\255\361\201\246\210\363\223\236\276\361\213\270\206\361\237\240\210\363\243\212\211\363\231\225\206\362\216\267\230\362\254\216\246\361\203\242\243\361\243\275\233\361\264\210\210\363\251\201\236\362\252\250\273\362\274\234\267\360\272\215\203\364\210\266\205\363\271\231\230\364\213\217\264\363\261\241\217\362\276\261\247\361\271\277\236\363\212\237\204\362\207\267\216\361\211\246\222\363\200\217\226\362\253\240\226\364\206\204\234\362\235\220\204\360\273\223\207\361\266\245\225\360\224\227\267\362\245\264\206\363\233\262\212\361\220\214\217\363\256\226\213\361\266\271\266\362\211\270\201\363\204\213\206\361\235\264\210\362\273\223\216\361\201\210\273\363\215\234\223\360\222\247\263\362\205\210\227\360\241\247\215\360\245\241\231\360\277\253\221\363\225\244\236\362\234\212\264\360\257\237\272\361\265\204\256\361\262\224\231\363\266\211\270\362\271\207\201\360\267\217\241\362\242\243\252\363\200\274\276\364\217\262\243\361\277\210\207\364\310\246\235\362\227\237\205\360\225\256\235\363\211\264\263\364\212\207\267\363\263\256\250\361\221\263\201\362\274\275\207\361\204\221\222\360\227\270\241\362\213\270\203\363\263\221\277\363\257\212\225\360\232\260\223\363\277\244\220\361\254\266\217\361\213\247\204\360\256\205\213\360\233\264\222\361\212\261\247\362\265\244\225\361\225\236\265\362\205\225\256\361\276\254\245\363\250\212\206\362\213\262\231\361\217\235\241\361\210\232\200\364\200\211\202\363\211\202\274\360\235\214\236\360\241\231\216\363\250\211\252\361\201\223\203\362\244\222\225\363\214\235\213\360\227\203\262\360\257\237\223\362\251\224\200\362\206\210\212\360\227\224\221\363\203\272\213\361\275\256\233\363\215\215\232\360\267\207\265\363\274\262\267\363\221\267\223\363\232\214\215\363\247\233\261\364\214\271\225\363\214\267\255\361\210\236\201\363\223\213\227\362\202\243\241\361\261\223\245\364\200\230\207\360\272\232\227\360\273\224\226\360\221\256\202\361\223\220\207\364\211\257\254\362\264\257\265\362\243\241\261\362\271\205\245\363\262\214\251\362\242\270\214\360\271\246\215\362\233\251\221\361\227\264\233\360\277\244\225\361\253\220\223\363\276\225\267\361\277\265\222\360\233\206\234\361\203\237\274\362\261\215\261\362\240\207\255\361\205\235\235\362\207\212\257\360\274\216\266\361\266\262\205\362\241\205\270\361\265\247\220\360\264\202\264\362\212\271\207\362\203\257\223\362\261\256\274\361\230\275\277\363\263\273\274\362\210\246\275\363\262\245\215\363\267\260\251\361\266\236\276\361\230\241\270\360\243\237\255\360\250\235\216\362\236\220\253\362\224\202\274\362\201\274\273\363\200\247\245\364\210\242\224\362\276\234\202\363\244\241\246\362\213\266\272\362\225\257\255\363\266\200\242\360\261\247\210\363\231\236\234\360\220\260\215\360\241\271\225\362\203\256\275\362\260\265\270\360\276\234\212\363\204\257\232\361\224\265\233\362\200\223\225\362\245\255\265\361\245\252\217\364\216\253\241\360\267\277\226\362\210\206\256\363\257\271\265\360\227\216\246\364\207\200\257\361\204\254\204\364\200\260\274\361\234\220\271\361\223\223\212\363\274\250\241\361\220\240\263\362\207\251\261\362\247\252\265\362\251\245\204\363\212\220\231\361\217\233\212\361\221\261\257\363\267\266\273\363\266\271\230\362\243\261\240\360\221\261\261\361\212\254\274\363\254\252\216\361\253\223\272\362\237\246\277\363\232\264\204\361\234\233\212\362\226\205\227\363\200\227\250\364\216\241\204\361\255\253\235\360\225\214\276\360\243\232\271\363\266\250\222\361\216\243\207\360\270\201\273\360\236\236\231\361\270\230\267\361\265\257\271\362\241\236\206\363\207\245\201\361\247\275\225\361\253\237\253\361\202\261\200\361\257\272\264\361\264\246\261\360\263\224\214\360\247\243\201\360\241\245\274\361\245\203\223\361\220\201\227\363\236\220\244\363\275\204\240\363\203\233\262\363\265\221\272\363\215\220\246\362\225\270\203\362\207\236\227\360\220\260\266\364\211\250\277\363\263\214\272\363\260\230\203\360\233\237\201\362\251\232\237\362\240\222\246\361\235\275\210\360\274\237\267\362\226\212\266\363\252\243\263\361\240\244\223\362\276\203\203\361\216\272\203\363\205\204\271\362\247\265\224\362\211\215\263\361\236\240\220\362\270\261\237\363\202\205\271\363\256\257\236\364\201\204\240\364\206\212\253\363\272\242\240\361\274\263\200\362\274\266\241\363\221\234\203\362\215\231\260\363\225\220\245\364\204\221\202\362\227\205\220\364\203\223\256\363\273\207\253\364\206\241\240\361\201\256\215\362\245\210\276\363\210\203\224\362\254\260\200\362\261\235\234\363\211\260\207\360\270\260\201\363\264\230\216\363\225\206\272\362\211\252\236\363\233\251\247\360\231\244\205\361\265\217\267\361\200\277\202\362\240\243\200\362\261\275\267\361\214\220\203\363\254\253\267\360\274\221\266\361\205\234\216\363\237\246\213\360\274\202\252\362\214\275\277\364\202\240\221\361\241\254\240\361\275\270\260\360\262\256\272\361\222\210\213\360\230\232\231\361\240\211\266\363\224\212\212\362\211\240\231\360\241\277\207\362\222\264\211\361\230\265\255\362\217\236\203\362\235\247\241\361\226\216\226\361\273\260\246\360\221\270\237\360\240\241\253\361\207\224\265\360\263\243\257\363\262\212\202\363\260\265\206\362\257\243\244\362\273\245\211\360\226\271\240\363\236\257\252\362\233\252\236\363\246\236\255\360\244\260\235\360\223\253\235\363\223\272\236\361\214\200\254\362\246\240\202\361\207\205\262\363\250\230\215\360\232\241\216\362\223\273\251\363\277\275\225\361\215\261\205\363\216\235\217\361\250\265\273\360\250\251\265\363\210\276\214\360\236\202\246\362\235\231\213\364\216\275\244\361\245\216\207\360\255\234\222\362\242\211\244\363\232\250\230\363\257\213\242\362\254\217\261\362\272\260\265\363\262\265\234\363\215\231\276\360\266\215\262\363\273\201\235\362\254\246\241\362\276\253\257\360\251\234\201\362\242\254\217\364\206\215\222\362\257\273\214\361\230\235\215\361\245\260\204\360\264\263\222\361\230\222\234\362\251\277\215\363\213\257\220\363\212\234\226\362\207\202\231\362\247\233\263\361\233\261\276\361\202\202\236\361\224\276\231\363\263\223\205\360\236\244\210\361\237\230\277\363\235\237\214\362\206\260\202\362\215\270\244\362\231\247\216\360\266\240\205\363\240\234\205\364\211\272\211\362\211\202\254\362\236\234\224\363\236\226\200\364\204\267\206\363\202\242\272\361\242\267\226\363\271\246\214\363\207\206\233\361\201\241\227\363\204\272\207\363\244\264\203\363\246\224\224\362\202\232\250\361\203\233\276\364\206\214\264\361\215\213\273\361\231\237\260\362\256\232\237\361\251\207\202\362\216\214\222\362\263\267\251\360\237\273\265\363\211\235\261\360\254\203\242\360\250\246\273\360\265\241\277\363\261\213\256\361\233\277\271\361\210\230\227\360\251\202\211\361\250\233\243\361\263\257\254\363\250\227\270\360\242\216\257\362\231\201\233\363\226\233\247\364\217\235\237\361\264\213\261\362\254\267\244\363\273\230\211\362\204\271\210\360\275\276\271\362\212\210\211\361\200\224\275\362\260\265\240\360\241\234\263\361\263\244\233\362\276\201\206\362\217\250\246\362\254\226\220\363\222\222\276\361\235\226\266\361\264\243\220\363\227\221\236\362\275\223\211\360\245\267\205\360\247\270\247\363\202\253\257\361\247\252\213\363\275\246\221\360\277\267\264\363\220\274\271\363\201\265\254\360\252\271\217\361\202\255\246\361\237\236\242\360\262\227\277\363\211\250\270\363\247\243\233\362\224\261\222\360\223\227\266\360\221\212\205\361\243\234\277\363\250\232\215\363\274\220\252\364\204\264\234\363\257\250\244\360\272\201\233\363\206\231\255\362\210\216\240\363\241\276\230\362\243\265\236\363\206\203\251\362\204\247\204\364\205\276\225\362\240\260\205\360\270\256\224\363\260\241\246\360\276\210\263\363\202\202\254\361\267\222\247\362\200\264\223\363\205\270\274\363\277\232\246\363\271\261\201\362\263\226\261\360\274\206\267\363\253\274\236\362\243\236\210\364\201\204\252\361\265\206\226\360\273\275\240\361\234\273\247\360\270\222\270\360\221\234\232\361\244\222\265\362\211\235\272\363\222\241\257\363\245\213\224\361\262\212\252\361\210\232\205\360\270\275\262\361\273\204\274\361\270\245\214\363\212\254\275\361\270\212\246\361\261\202\250\364\207\212\270\360\241\252\224\361\211\266\207\361\236\275\267\363\262\204\260\361\237\267\234\362\233\276\275\360\274\232\210\362\260\232\250\363\266\242\260\363\271\250\207\361\262\242\203\360\251\210\212\360\243\255\266\363\212\206\215\361\215\230\265\361\227\201\277\362\245\217\277\361\271\266\246\362\246\220\224\363\273\246\234\362\240\227\253\361\221\236\224\362\275\233\203\361\271\242\200\363\260\257\262\364\214\227\215\361\206\200\260\362\201\274\275\363\230\230\244\360\267\251\215\361\224\241\224\360\277\222\275\360\264\204\200\364\200\274\250\363\217\251\235\363\267\272\271\362\246\271\277\363\205\246\221\363\266\275\243\363\254\263\200\361\214\251\262\363\201\204\243\361\244\250\247\362\264\222\205\363\277\262\264\361\230\255\220\362\246\263\225\360\251\242\253\361\200\225\207\360\237\207\273\363\234\264\245\363\271\256\214\361\235\213\250\361\246\232\240\361\204\235\205\363\231\207\242\362\227\272\277\361\220\246\231\364\200\211\207\364\203\204\252\362\224\263\227\360\253\243\215\363\252\216\253\360\236\264\207\361\271\214\217\363\220\246\261\362\233\223\242\361\224\263\251\360\275\253\242\362\206\203\232\360\220\212\210\363\270\214\227\360\251\221\267\362\265\273\204\361\223\207\274\363\266\256\203\361\200\246\255\363\270\253\275\360\266\242\213\364\207\256\212\360\230\262\224\363\221\226\251\362\252\200\211\362\224\272\275\362\212\267\271\363\267\236\215\360\254\212\215\363\232\214\217\364\207\231\244\361\247\265\265\361\220\230\243\360\257\202\212\363\221\247\264\360\274\245\237\360\242\210\204\363\260\211\224\362\254\200\257\361\261\240\224\362\201\263\274\361\212\243\272\361\222\274\255\363\231\222\262\362\277\231\220\361\211\221\243\362\245\257\213\361\224\255\244\361\224\261\272\360\242\225\217\362\277\205\235\363\265\273\233\360\240\273\241\361\246\261\225\362\205\255\235\361\254\206\254\360\276\235\267\363\217\266\233\360\245\250\276\362\226\212\252\361\234\235\242\362\225\277\251\363\260\273\247\363\233\277\252\360\222\227\212\361\264\265\215\362\271\205\245\363\263\215\206\362\204\225\216\361\266\214\232\362\243\265\207\362\274\217\201\361\261\252\266\362\212\212\277\362\245\207\241\362\202\201\266\360\270\235\226\363\257\217\223\363\202\253\261\362\204\200\254\363\262\202\276\360\235\210\222\363\210\275\205\363\237\276\263\363\204\270\223\362\213\271\242\361\234\216\273\362\211\204\270\360\222\264\216\360\233\216\256\362\237\223\273\362\270\253\203\363\215\222\254\363\205\256\210\360\235\245\274\360\251\207\255\363\214\271\251\363\273\215\226\362\270\242\212\362\231\207\264\362\257\217\270\362\265\215\210\363\266\275\262\362\242\204\241\363\275\267\200\362\220\227\267\363\256\236\245\360\276\252\201\362\233\217\203\360\235\232\273\362\266\216\230\360\273\235\275\361\241\232\255\364\216\213\276\361\204\207\270\361\240\204\273\361\225\212\277\364\206\244\216\360\274\236\240\362\221\257\230\362\277\214\260\361\257\265\276\360\261\205\201\361\224\222\251\364\210\264\206\360\245\235\264\362\256\222\276\361\200\270\246\362\260\237\221\362\232\201\274\363\254\237\264\362\277\254\203\362\247\205\250\360\221\261\231\360\262\225\253\363\271\215\220\361\221\222\255\362\211\274\216\360\235\275\232\361\213\261\212\363\257\211\221\363\274\246\275\362\276\205\225\364\203\261\277\360\242\272\246\363\221\277\226\362\221\236\201\362\231\254\212\363\200\235\214\361\265\261\232\360\235\200\214\363\263\226\264\360\244\241\200\362\212\234\205\363\274\251\215\361\237\206\226\363\257\214\225\364\210\240\225\363\246\272\222\361\242\230\236\364\202\263\245\361\205\251\270\360\235\210\247\363\205\220\250\360\265\212\264\362\254\271\252\360\242\234\216\361\230\244\261\362\254\225\242\362\264\205\273\360\256\250\234\364\201\242\276\363\204\254\221\360\235\202\235\362\241\203\270\362\217\202\265\361\253\243\200\360\222\223\207\362\207\251\232\362\234\231\202\360\223\220\232\360\252\203\206\362\277\272\225\362\266\241\257\361\201\275\257\361\236\202\263\363\262\215\224\362\232\245\264\362\240\207\237\362\234\204\234\361\255\240\276\360\267\276\213\360\232\224\261\363\252\264\240\362\217\261\237\363\234\211\246\361\236\247\274\361\230\241\263\363\253\204\227\361\224\234\203\363\201\212\253\361\260\212\213\362\273\272\203\362\247\243\242\360\256\213\270\363\237\251\262\363\225\255\251\362\251\262\214\361\272\260\226\363\206\277\265\363\231\234\263\360\275\212\225\362\265\255\264\361\207\234\277\360\276\205\263\363\244\221\264\364\202\276\260\360\255\234\203\363\262\213\276\362\245\244\246\360\254\222\206\360\227\234\255\362\234\255\213\361\254\263\270\361\233\223\213\362\203\231\242\362\222\252\262\363\216\245\232\361\266\253\260\363\277\243\223\362\242\216\235\361\211\206\246\361\247\205\205\362\257\276\204\363\217\214\263\362\204\203\274\362\204\212\233\362\247\255\271\362\264\216\270\362\225\210\221\363\211\250\234\362\233\210\226\361\227\234\233\362\211\236\240\362\223\217\227\362\216\215\277\362\270\212\277\361\230\265\225\361\270\271\225\360\234\206\274\361\201\237\250\362\260\247\225\361\235\262\243\364\216\215\240\363\210\254\272\360\267\250\243\361\245\220\254\363\202\232\265\362\226\255\203\362\262\211\271\363\204\242\230\363\260\226\203\360\272\222\274\361\242\222\212\361\253\235\216\364\211\274\204\360\261\202\205\362\254\246\236\362\241\222\214\362\273\212\205\361\223\215\252\363\210\220\210\361\246\262\246\360\270\234\237\361\242\263\270\363\210\202\235\360\250\220\264\364\217\205\200\361\213\266\242\363\202\215\255\363\252\237\235\362\223\276\206\360\276\265\224\363\253\211\216\362\233\277\217\360\220\217\215\363\247\225\223\363\264\241\233\363\270\213\217\363\225\212\264\364\205\220\234\361\255\275\266\361\206\214\274\361\247\234\206\362\205\215\206\360\223\276\202\362\214\263\254\362\260\227\240\363\200\207\234\361\227\217\240\361\273\204\245\361\243\206\263\362\206\274\211\360\277\213\203\363\262\207\260\360\264\217\223\361\212\232\254\360\247\236\254\361\250\203\266\362\234\217\217\360\264\217\232\362\235\252\215\360\273\263\257\362\222\260\240\362\250\255\254\362\246\256\205\362\253\202\206\363\237\255\275\360\251\250\224\363\234\204\211\361\215\232\206\360\220\273\241\361\271\237\270\362\262\241\260\364\215\200\267\363\277\270\223\361\277\276\255\363\234\224\242\362\227\211\264\361\256\201\237\363\277\267\273\361\241\263\266\360\234\251\230\362\271\226\236\362\265\246\207\362\230\214\212\363\253\241\257\363\231\231\207\361\236\233\251\360\237\234\253\363\272\203\224\362\236\254\226\360\231\200\207\362\201\200\262\362\220\222\215\361\203\237\217\362\244\245\264\360\267\244\253\363\264\223\223\361\223\273\263\362\266\261\205\361\262\243\262\361\210\242\265\364\210\270\211\364\214\225\246\362\203\212\215\361\261\261\261\363\261\262\263\361\267\230\210\363\202\265\270\361\214\221\210\360\235\216\215\361\201\221\226\362\232\261\254\362\237\217\225\360\256\220\234\361\226\273\266\362\220\234\261\361\237\255\274\362\235\207\210\363\237\207\217\364\217\223\235\363\235\251\220\360\257\267\227\362\206\276\267\360\270\243\254\362\241\267\223\364\214\213\214\363\231\232\261\361\207\237\243\363\215\213\246\363\233\266\254\362\253\236\221\363\244\240\203\363\276\223\227\360\227\250\223\363\211\257\243\362\213\270\216\361\274\235\230\364\205\265\215\362\277\264\201\360\236\246\243\362\205\232\260\361\217\224\212\362\260\223\220\360\273\202\244\362\266\224\213\361\215\235\237\360\220\213\230\362\250\201\262\361\204\260\242\360\252\244\270\361\214\222\210\364\206\251\200\361\233\260\236\363\222\214\255\363\262\231\231\360\251\243\241\363\200\253\211\362\210\224\262\361\241\232\213\361\272\235\272\361\271\236\224\360\223\273\257\363\206\274\216\360\270\255\273\363\212\250\241\361\241\231\222\363\240\226\227\360\264\201\252\360\232\201\202\362\277\223\247\362\243\213\276\361\276\221\216\361\213\221\216\363\222\261\270\361\262\262\272\363\227\277\277\363\211\236\243\361\265\254\225\360\252\240\273\362\252\275\226\363\245\242\222\360\235\234\245\362\224\234\265\363\213\236\252\363\252\231\244\360\263\242\214\361\246\240\260\362\255\262\254\360\251\234\267\360\231\253\205\360\226\227\270\363\215\273\272\360\262\231\276\362\244\270\212\361\202\220\221\363\275\212\241\361\272\224\225\360\276\270\210\360\251\230\224\362\265\241\242\360\227\220\237\362\227\225\261\362\253\244\233\364\200\251\274\363\204\225\230\362\250\206\244\361\240\272\212\360\251\204\266\361\234\255\242\362\266\277\277\361\231\276\206\363\225\221\251\360\245\231\240\363\272\224\220\362\206\237\213\363\242\266\260\363\201\205\213\360\277\200\260\362\233\276\223\361\216\211\245\363\277\216\230\363\273\265\233\363\216\261\204\363\224\202\243\360\243\205\276\361\222\214\207\362\247\252\262\362\200\261\246\363\223\214\217\360\236\234\240\363\247\231\207\360\261\257\250\363\237\264\200\363\262\216\204\363\212\257\241\364\206\214\221\362\255\236\260\361\257\246\246\363\246\200\270\361\203\245\202\362\271\224\222\361\212\221\270\360\262\247\250\363\230\240\203\361\210\253\237\362\203\274\246\363\245\253\237\360\265\276\245\360\256\213\270\363\241\002\3076\212\362\264\237\271\362\260\263\240\360\272\242\251\362\246\257\236\363\212\246\200\363\270\251\225\361\273\200\212\361\233\240\251\360\261\221\241\360\260\225\232\360\230\222\214\360\251\237\235\363\204\271\202\362\261\233\261\363\237\262\201\360\233\247\277\364\217\204\214\363\250\233\266\363\216\222\256\361\245\262\234\360\264\236\237\364\214\226\230\363\217\252\262\363\242\204\233\361\272\232\210\361\225\256\207\362\206\264\253\361\200\204\226\362\270\257\224\361\236\233\206\362\213\220\203\360\240\250\240\361\251\200\245\362\211\264\211\361\234\202\251\361\237\272\232\361\224\273\275\362\274\266\276\360\251\241\250\360\247\205\243\361\220\217\220\363\215\276\230\361\270\211\225\362\263\266\204\361\271\253\250\361\225\261\252\363\276\232\227\362\267\214\271\361\241\220\205\363\200\217\255\362\263\214\256\362\242\257\212\362\230\273\264\361\221\240\262\364\210\240\272\362\235\201\242\361\252\214\276\362\227\262\231\363\274\277\275\361\243\247\243\363\275\254\261\361\250\214\275\361\261\212\225\363\202\210\262\361\250\275\240\361\273\234\203\362\215\204\255\363\222\236\206\360\254\216\227\360\230\265\230\363\234\217\274\364\207\211\217\361\220\267\263\361\206\265\214\363\276\241\211\362\266\222\213\361\252\253\231\360\273\216\240\363\240\204\276\363\266\263\231\363\277\233\272\363\227\233\261\360\227\231\246\361\266\261\256\362\224\212\231\361\267\262\226\363\275\220\237\360\226\272\246\360\232\266\220\362\212\274\277\363\263\263\276\364\207\271\242\362\235\213\243\363\244\251\243\363\263\272\250\362\243\256\202\363\227\223\274\364\212\241\250\363\225\231\224\362\273\231\275\360\227\261\275\360\273\215\221\360\277\217\223\361\263\242\201\362\252\260\222\361\250\220\230\362\205\244\256\362\260\237\277\363\201\243\275\363\261\251\236\363\275\245\266\364\206\274\265\363\200\232\257\360\263\265\267\361\230\251\272\363\224\226\271\364\213\203\216\363\217\256\274\360\227\233\212\360\221\215\236\361\237\257\273\361\267\263\203\360\220\203\246\362\274\266\263\362\254\226\235\361\261\206\256\360\227\205\275\362\225\250\206\362\207\232\204\361\241\240\267\360\264\262\251\361\265\231\247\363\276\276\210\360\226\266\251\361\262\237\264\362\226\257\253\361\265\206\277\360\241\267\224\362\022&\242\251\364\211\201\237\362\235\254\226\362\212\202\225\360\241\242\230\363\245\227\205\360\237\207\210\362\201\231\262\360\267\257\263\362\271\262\241\361\235\270\211\362\207\224\277\361\250\266\234\362\257\200\200\363\266\204\266\363\237\203\266\360\220\266\202\361\225\227\270\364\200\221\234\362\220\200\251\362\210\222\277\360\230\200\213\360\231\276\207\360\245\224\253\363\207\260\273\361\277\275\277\363\201\247\203\364\205\262\245\364\200\231\262\360\242\243\226\361\216\207\263\362\274\207\251\362\267\250\245\363\265\261\265\363\230\226\202\363\205\235\251\362\220\272\261\363\210\266\224\363\261\237\247\363\267\220\201\361\235\274\272\362\227\241\254\363\212\244\271\362\275\202\202\363\206\201\217\361\253\247\205\360\227\245\276\363\255\243\212\360\247\214\252\361\207\235\235\362\234\225\234\361\272\203\220\363\260\235\262\363\275\223\254\362\211\253\223\361\215\273\244\362\261\201\233\361\205\212\212\362\250\251\260\364\215\263\227\363\205\233\211\360\264\271\264\362\220\260\276\363\244\204\223\360\261\220\260\363\244\277\216\363\225\214\214\360\232\201\235\364\201\243\215\361\264\230\214\360\275\216\200\362\206\242\230\361\227\256\220\360\223\227\224\361\275\232\244\361\201\256\257\360\264\236\261\363\235\201\220\361\227\262\216\362\273\243\205\363\272\225\270\361\217\277\234\360\277\214\227\363\221\243\244\362\263\211\265\360\242\245\263\362\211\215\236\361\245\274\265\363\224\241\230\363\257\202\230\362\254\264\244\360\240\211\253\362\220\231\275\360\234\272\204\363\251\261\227\363\204\263\271\362\212\244\234\362\240\220\216\361\231\256\220\360\257\273\277\360\253\202\270\362\254\220\244\360\221\251\232\362\263\230\245\362\223\210\274\362\247\262\257\363\270\230\232\362\243\210\227\363\232\243\275\363\242\241\252\362\230\217\221\360\225\212\200\361\237\203\275\363\255\231\220\363\263\274\203\363\233\203\252\361\212\270\243\360\245\267\270\361\270\207\236\360\267\204\235\364\203\240\242\362\273\223\216\361\210\222\255\361\277\234\252\362\215\265\217\363\212\276\215\361\214\267\205\363\256\224\262\361\235\206\246\362\217\201\236\361\247\200\271\361\237\206\275\363\203\270\277\364\202\270\210\362\254\223\221\364\203\254\240\363\270\242\221\362\261\245\235\361\250\267\271\363\263\251\265\360\255\240\251\362\202\204\234\363\243\264\240\362\252\240\237\363\235\213\272\362\267\242\253\362\217\211\252\362\201\224\262\361\271\273\231\362\276\255\211\361\215\205\202\364\205\226\223\362\263\236\274\361\226\230\242\362\204\211\270\364\202\246\272\363\261\260\246\363\277\227\236\363\210\230\254\362\243\261\254\362\247\241\236\360\227\226\255\363\254\227\226\363\221\261\265\362\274\205\232\360\246\265\200\362\223\254\200\363\265\230\270\361\233\263\204\361\273\214\240\362\272\271\202\360\234\211\203\362\200\233\255\361\002\337qS200\210\363\217\215\210\362\203\257\252\363\203\226\215\362\216\214\247\362\252\277\200\363\202\207\202\361\205\275\202\362\206\266\251\364\214\227\215\360\277\211\231\360\220\227\214\361\256\237\214\362\206\233\225\362\217\206\260\363\262\241\233\363\226\224\267\360\256\200\206\360\252\200\207\363\265\221\217\363\222\223\220\360\272\201\275\361\235\226\257\360\234\252\242\360\243\272\272\361\207\275\253\362\221\250\213\362\221\240\203\362\240\272\273\360\255\267\222\360\265\230\210\363\242\215\237\360\246\242\241\360\230\205\253\361\225\202\234\363\235\264\226\363\234\242\214\363\222\215\271\361\246\267\250\360\223\213\237\362\247\250\262\362\244\265\201\364\202\277\222\362\276\252\221\363\225\231\203\363\265\202\222\363\204\273\262\363\215\242\276\362\273\220\235\360\235\222\201\361\275\264\265\362\245\222\242\363\272\241\240\362\206\235\204\362\246\257\270\363\266\254\265\362\253\212\216\363\222\252\235\362\217\235\240\363\274\235\272\360\224\226\212\362\241\201\265\361\276\226\220d360\235\221\243\360\231\205\231\364\217\206\223\360\237\255\200\360\225\241\255\360\274\265\206\360\245\234\236\362\276\203\203\361\212\276\241\362\261\224\252\363\256\242\206\362\220\261\206\361\201\230\252\360\251\271\226\364\207\246\226\360\227\261\226\361\260\235\200\360\264\240\206\363\221\222\246\362\275\257\222\360\223\211\270\363\242\224\277\361\205\245\242\361\225\225\273\361\206\245\216\363\262\242\240\364\202\250\271\363\211\203\247\360\232\261\257\361\203\245\244\361\211\261\212\363\210\241\275\363\255\222\210\363\267\224\232\361\212\201\246\360\267\230\225\362\224\232\267\364\203\216\225\360\225\225\276\362\247\267\277\361\254\241\227\363\211\220\214\360\2570\237\360\264\223\221\364\202\276\215\362\217\217\227\361\217\234\266\361\211\221\252\363\276\221\240\362\243\270\241\362\276\202\261\361\267\206\210\362\266\237\235\362\207\202\227\362\213\274\242\360\250\245\201\362\230\256\212\360\232\266\205\364\206\251\271\363\270\252\251\361\225\221\250\362\224\220\215\362\237\251\225\363\213\245\233\363\224\244\242\360\272\273\257\362\220\260\245\362\275\210\243\363\260\235\212\360\253\201\226\360\260\216\233\362\200\201\254\362\245\240\205\363\242\216\254\362\267\246\257\362\210\233\244\361\233\200\210\361\244\273\236\361\203\255\265\362\247\274\211\362\254\277\247\362\250\233\212\364\207\206\225\362\275\205\211\363\252\206\266\364\216\231\251\362\214\223\221\360\242\271\221\363\244\201\221\361\207\263\271\362\275\217\260\360\250\274\230\361\251\241\216\362\274\254\214\361\244\226\250\362\266\265\267\362\214\217\262\363\242\215\225\362\270\223\231\360\240\250\234\360\270\231\256\361\204\273\220\362\273\273\212\363\257\211\275\364\202\243\226\361\255\250\205\360\251\224\257\360\255\200\260\362\213\242\207\361\232\266\266\364\217\213\256\360\226\256\264\361\241\243\265\363\254\274\206\364\216\222\233\361\207\246\244\361\264\203\212\361\205\244\270\361\243\255\215\362\253\231\215\363\271\227\265\361\267\244\233\363\271\273\216\362\273\253\247\360\247\247\216\362\205\264\253\362\250\236\267\363\270\225\262\363\237\277\236\363\204\251\241\363\276\203\207\361\201\233\250\363\240\220\220\360\256\242\262\361\233\207\223\362\203\210\201\363\276\264\235\362\237\272\224\363\213\255\225\360\242\264\271\363\277\264\231\363\273\200\204\362\231\271\226\362\234\211\264\361\204\201\251\363\277\223\224\362\214\205\204\361\224\267\200\360\256\231\267\360\225\230\204\363\222\200\257\362\250\236\252\361\226\272\235\361\265\253\221\364\206\201\231\362\237\202\206\360\261\257\212\362\202\220\243\362\220\251\215\364\206\263\264\360\264\247\256\360\275\245\261\362\212\240\271\360\255\225\216\363\230\253\272\360\271\266\220\363\241\277\227\362\207\231\256\361\246\213\215\360\250\253\235\362\224\226\241\360\262\266\213\362\270\226\236\360\255\232\241\361\271\243\207\360\277\220\211\363\252\254\252\361\263\240\227\363\204\243\202\363\247\246\245\363\251\207\251\363\240\275\201\360\221\215\214\362\212\232\200\363\243\264\220\363\252\215\227\360\277\271\264\362\267\214\224\362\261\242\256\361\234\243\220\361\254\232\231\361\210\232\216\362\250\210\243\360\270\277\277\364\200\240\263\363\224\237\265\361\247\265\232\364\216\272\252\363\230\244\207\361\201\232\261\361\237\231\264\361\211\256\265\363\253\220\225\362\214\212\222\362\264\232\277\361\201\203\271\363\267\266\212\362\274\271\213\362\252\226\267\361\274\226\270\363\230\226\265\360\232\257\207\362\202\225\266\360\255\250\214\362\274\230\200\363\255\242\266\360\267\241\210\362\201\274\201\360\222\233\206\360\225\235\262\362\245\277\255\364\207\275\252\363\203\262\201\361\265\240\262\360\237\255\264\361\275\224\223\363\220\252\242\362\261\223\273\362\275\233\250\360\242\272\277\363\266\265\262\364\212\211\235\362\243\206\273\362\242\201\226\362\251\230\213\363\216\207\260\360\231\252\245\362\225\271\226\361\234\240\225\363\222\245\203\362\242\275\251\361\214\233\272\363\235\271\275\361\236\217\211\361\220\253\241\360\226\204\216\363\254\255\210\363\264\271\217\360\243\226\265\363\276\220\215\363\216\237\256\362\266\245\273\362\225\206\253\360\225\246\245\362\226\207\224\362\206\234\201\362\223\247\233\361\265\260\234\360\277\217\271\360\265\216\250\363\236\213\224\362\203\204\251\364\215\213\215\361\265\252\214\363\222\234\275\363\212\211\211\363\262\256\200\363\241\243\241\362\201\245\254\361\205\232\252\361\202\220\234\361\277\235\234\363\236\205\274\362\254\214\262\363\252\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\7\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\307\30741267\362\204\260\231\362\204\200\232\360\235\251\264\362\220\272\263\363\234\217\233\362\200\254\204\362\206\212\270\360\230\265\223\362\232\221\220\364\213\257\211\360\264\276\231\364\217\264\216\361\252\201\210\362\272\251\275\362\264\214\270\362\252\263\200\361\244\252\227\363\231\253\231\360\276\216\235\361\251\207\247\360\276\272\206\363\271\201\211\362\243\224\226\360\253\276\243\362\201\221\230\361\263\216\217\361\234\234\262\361\240\237\205\361\240\244\201\363\256\246\277\363\271\215\226\362\234\206\225\363\265\273\250\362\263\233\241\360\276\206\223\361\233\256\211\363\264\212\266\361\255\250\204\360\237\254\246\363\252\250\246\361\273\233\233\362\260\234\244\362\253\227\261\362\274\270\216\363\223\246\201\364\216\256\217\360\266\256\266\361\242\211\204\362\243\264\206\362\275\222\267\361\221\255\261\361\203\255\240\362\261\252\214\361\237\216\223\361\236\211\220\363\264\272\222\360\263\265\267\361\241\261\250\362\233\207\275\360\257\270\242\364\203\273\215\361\215\210\225\362\271\256\267\362\234\225\256\361\217\253\246\363\204\267\213\360\264\236\200\362\233\220\220\362\250\273\201\363\254\247\222\362\277\231\204\362\270\227\273\361\261\277\274\362\253\260\267\362\252\272\200\364\212\251\215\360\253\205\211\361\232\256\277\363\241\210\220\360\251\222\254\360\242\250\213\362\205\205\276\360\220\254\252\362\257\247\215\361\262\276\252\361\272\262\234\363\255\232\223\360\221\224\202\362\267\245\245\360\237\211\247\363\224\257\201\360\237\235\210\361\226\223\213\362\262\267\217\361\233\210\235\363\255\221\215\361\206\225\224\360\231\224\264\361\266\277\270\361\211\231\257\363\205\261\210\363\265\216\246\364\216\213\261\362\257\240\226\360\276\200\264\360\262\273\265\361\241\245\240\363\230\211\230\361\263\246\227\361\267\227\216\360\223\200\234\360\235\216\253\362\242\205\276\361\210\260\203\363\264\251\257\361\257\217\232\362\223\225\201\360\263\274\257\362\232\200\223\360\231\246\270\362\263\217\237\363\210\220\210\361\245\264\256\363\257\227\251\361\233\265\247\363\275\247\256\362\212\233\210\360\260\271\250\363\207\261\231\363\244\252\265\362\277\233\205\362\252\277\211\360\263\244\201\363\205\271\216\363\213\235\201\364\216\231\221\361\266\205\257\363\274\262\237\362\261\271\272\362\250\244\252\364\204\225\274\364\211\274\236\361\234\233\217\363\223\266\205\361\247\246\272\361\237\263\214\360\227\247\260\360\246\260\205\360\224\211\207\360\262\273\204\360\241\240\202\363\275\250\223\360\274\276\232\362\226\210\270\360\240\200\271\362\263\256\231\363\233\261\242\361\270\233\223\362\241\235\271\360\254\211\264\362\255\277\212\363\242\264\260\363\227\206\200\363\264\210\276\363\257\223\201\362\264\205\212\363\262\252\252\364\211\210\263\360\237\246\203\362\240\246\205\362\274\236\236\363\266\272\251\361\236\217\207\360\273\224\236\361\262\207\204\362\264\212\230\361\213\252\233\360\226\211\276\363\235\227\275\360\267\230\272\361\216\227\231\362\254\257\211\360\252\242\236\360\257\230\204\361\233\245\207\361\227\202\244\361\231\216\277\364\213\231\246\362\273\207\241\363\215\241\250\363\202\205\255\361\232\237\270\361\245\274\243\363\272\233\277\361\211\276\210\364\203\217\277\363\263\211\242\364\202\263\213\364\217\233\220\363\230\212\263\362\246\207\230\362\251\205\277\360\277\230\240\362\224\227\235\363\270\212\201\360\276\255\241\363\250\200\257\363\260\226\233\361\216\240\253\364\206\262\230\363\262\215\270\361\205\244\205\364\210\237\253\363\271\204\277\363\274\202\272\362\210\207\262\360\225\236\247\360\237\246\207\363\210\255\226\361\277\226\201\363\276\225\276\363\212\224\251\363\231\265\232\363\205\273\214\362\231\252\211\363\217\270\226\363\216\214\206\363\243\266\236\361\264\214\212\363\210\262\204\361\245\270\201\362\247\260\242\361\263\233\267\362\201\241\223\361\232\267\214\360\225\217\210\361\267\233\246\363\272\243\252\363\247\214\232\363\202\212\273\363\200\237\217\361\263\263\223\362\222\270\264\360\242\270\227\360\271\277\263\363\272\260\263\362\237\266\215\362\267\233\265\361\246\201\226\360\242\270\220\363\251\244\257\362\220\271\267\360\236\264\236\362\216\253\227\360\277\271\273\364\210\214\215\362\234\216\265\364\200\215\205\362\276\232\262\360\272\214\221\362\272\270\224\364\205\256\223\361\236\216\242\361\277\222\277\360\226\217\223\362\210\227\225\363\245\200\271\362\270\240\215\363\225\215\272\360\243\202\203\363\210\273\207\364\213\266\255\362\203\263\247\361\251\205\264\363\275\227\212\363\200\201\263\363\201\261\212\363\220\255\213\361\264\242\224\360\231\267\250\364\214\245\274\362\255\233\264\363\204\200\200\362\254\202\221\363\255\263\261\360\222\242\260\362\233\272\261\363\253\256\234\361\207\273\211\360\231\254\225\363\205\245\270\363\220\215\216\361\216\263\260\360\267\201\223\362\277\273\255\363\214\225\232\360\271\247\212\361\244\237\247\360\251\254\202\363\217\207\247\360\271\225\237\361\230\242\274\361\204\253\237\361\217\246\261\362\212\275\213\362\202\203\234\363\262\253\236\361\262\275\201\362\241\267\272\363\231\243\201\362\224\257\204\362\207\222\221\361\251\205\201\362\234\233\273\362\235\262\211\362\237\263\205\362\202\242\236\361\242\200\232\360\241\210\202\361\216\255\255\361\256\202\241\364\211\200\253\360\257\215\205\363\273\271\206\362\234\215\265\360\220\205\220\362\223\266\254\361\257\227\245\362\255\244\266\361\237\224\221\363\267\232\222\362\225\202\202\361\246\241\253\361\241\267\272\360\231\237\277\361\241\211\231\360\221\216\251\363\215\277\255\361\240\207\223\361\215\212\212\360\240\212\265\363\271\274\237\361\266\257\272\360\276\264\275\363\221\245\256\364\216\237\256\361\273\225\266\361\201\231\245\363\231\260\247\362\243\236\252\362\224\250\231\363\236\217\206\362\261\247\200\363\264\205\273\363\253\265\242\360\263\245\266\360\251\222\256\361\203\231\211\362\261\265\225\360\252\257\236\362\205\221\237\363\275\212\215\362\222\257\225\360\263\210\227\361\223\263\277\362\264\234\212\362\256\237\200\362\267\222\267\363\273\253\240\362\215\244\210\361\237\201\267\362\275\265\245\362\236\217\204\363\224\200\266\360\234\217\266\362\203\254\257\360\253\277\216\361\271\207\266\363\244\213\250\363\213\245\233\363\234\217\234\362\224\205\242\360\253\210\240\361\201\254\255\360\271\231\263\364\206\221\254\362\246\254\240\364\213\245\274\360\231\255\205\363\274\227\236\360\225\246\244\362\210\227\267\361\267\256\210\362\213\273\243\361\212\264\226\363\204\264\263\360\272\243\264\360\233\202\224\360\221\231\251\360\273\221\245\363\263\253\236\363\273\231\213\362\224\205\253\362\225\231\270\362\242\262\254\364\201\203\273\361\215\215\210\363\233\232\202\360\274\232\236\362\254\241\251\361\247\246\274\361\257\236\231\362\270\237\224\360\274\230\237\363\223\272\253\363\251\201\242\363\230\241\245\363\210\273\244\361\251\257\211\362\276\213\220\361\263\275\240\362\241\224\262\361\234\225\200\361\266\263\267\363\243\272\245\362\217\212\255\362\225\252\244\363\226\215\264\361\263\225\222\360\247\242\222\363\273\273\247\364\202\246\233\362\202\251\272\361\204\235\206\363\244\225\253\361\250\207\254\363\263\264\241\362\244\237\236\362\206\243\262\361\271\273\274\361\237\236\264\364\210\201\204\363\211\244\247\361\222\246\266\361\256\266\243\361\235\275\222\362\255\267\254\363\245\226\250\363\203\272\224\363\247\204\211\361\247\265\245\362\223\237\204\363\222\264\241\360\267\241\204\361\220\214\247\364\215\213\230\363\275\273\260\362\217\237\271\364\205\250\261\360\226\207\224\364\202\203\215\362\275\222\203\363\255\256\247\363\244\256\242\362\244\221\250\362\272\256\273\361\227\262\253\360\221\274\201\361\276\230\202\361\244\264\246\364\202\232\261\360\246\246\255\361\256\224\231\362\266\213\231\361\256\267\251\362\223\275\267\362\220\241\233\360\235\245\254\361\257\252\265\361\237\271\264\362\226\272\254\363\237\230\250\361\222\227\270\361\234\264\261\360\221\211\220\363\263\222\273\362\261\235\214\360\222\241\231\362\236\224\234\362\257\226\210\360\245\232\265\363\244\233\216\363\201\247\207\360\275\226\253\360\223\213\215\363\213\255\214\362\264\210\254\361\220\252\246\361\234\247\202\362\221\203\253\364\203\246\270\361\244\253\232\363\254\207\222\361\265\215\205\360\221\242\202\363\271\262\252\362\212\272\200\360\250\270\236\363\243\220\236\362\203\273\256\361\217\225\241\362\270\242\242\362\261\201\220\362\277\235\274\360\231\244\271\363\224\213\252\363\267\231\223\362\261\206\274\362\200\261\236\361\265\210\257\361\203\235\273\363\213\252\212\363\216\266\206\362\243\232\215\361\267\240\270\362\203\206\241\362\223\256\271\361\271\275\205\362\271\245\217\360\275\237\230\362\260\262\263\360\255\275\251\363\254\225\264\361\211\200\224\363\247\233\252\362\263\272\221\363\233\261\227\363\267\231\230\363\262\256\203\364\213\200\246\360\224\236\216\361\252\224\256\361\255\213\204\362\246\246\213\361\244\241\234\362\216\276\225\360\253\204\202\360\233\211\245\362\200\200\270\361\212\235\276\363\222\256\263\361\236\247\216\360\274\263\266\361\270\220\207\362\252\216\212\363\233\252\217\363\270\203\243\360\251\221\263\362\206\272\276\363\207\245\274\360\235\247\206\362\222\222\252\362\265\244\240\363\223\255\202\362\265\211\263\360\252\203\277\361\246\235\227\362\247\241\212\360\247\264\230\361\207\203\216\361\220\241\241\362\241\263\272\364\217\221\245\361\234\226\272\364\217\225\254\361\266\250\241\361\274\237\220\362\211\241\270\362\201\220\246\360\246\233\276\363\227\221\270\363\272\234\264\362\266\206\231\362\264\230\266\363\252\240\202\361\210\243\260\362\276\203\225\360\244\227\225\364\214\233\210\363\224\246\262\363\233\215\276\362\257\246\210\361\203\243\201\363\211\223\271\364\215\260\243\362\202\211\234\362\236\225\211\363\200\264\213\360\246\270\231\362\214\225\265\362\261\234\205\363\207\246\266\363\217\232\207\363\200\224\251\361\200\230\204\363\226\224\246\361\255\274\204\364\211\216\203\362\234\255\270\362\203\202\266\363\204\272\267\360\226\264\255\363\203\243\242\363\220\236\213\361\203\205\200\361\232\244\204\362\273\240\242\361\276\235\202\360\231\220\226\361\215\231\214\361\251\202\253\362\270\237\236\362\257\214\230\361\245\213\227\360\230\274\224\361\206\211\216\361\257\270\252\360\232\235\236\362\212\227\266\362\204\213\247\360\242\223\220\363\253\263\211\360\237\201\263\363\212\221\255\360\264\260\264\364\216\276\230\363\214\271\255\360\243\253\235\363\201\202\226\363\251\215\274\361\242\277\221\361\227\207\216\364\215\242\222\361\265\220\266\360\257\221\201\362\225\220\213\364\215\276\277\364\210\260\246\363\224\212\223\363\257\255\230\361\244\270\257\360\262\235\245\361\201\220\247\361\253\274\225\362\262\206\267\363\222\242\250\362\202\252\253\362\213\265\272\362\246\265\244\362\274\243\253\361\211\234\265\363\255\234\242\362\247\234\221\363\201\227\213\361\202\231\261\363\273\274\264\362\221\205\252\363\232\262\271\363\242\237\232\363\272\225\240\360\252\231\240\363\216\231\262\360\265\204\232\363\215\201\211\360\221\215\264\361\237\261\260\363\221\205\210\364\213\223\277\360\262\260\236\363\255\210\231\361\217\203\274\363\250\266\206\360\253\275\202\364\203\224\217\361\272\277\213\361\264\240\271\363\243\217\252\360\244\222\247\360\243\233\211\362\260\245\245\360\267\212\203\362\207\245\275\361\255\265\273\363\255\217\245\361\271\240\213\362\226\271\277\363\221\245\214\361\273\224\252\363\204\253\245\360\226\211\253\363\277\240\276\363\212\224\204\360\250\202\257\362\232\206\246\362\242\224\255\362\262\211\263\361\266\277\264\360\240\232\207\364\200\226\224\363\254\201\233\360\267\235\271\363\270\206\240\363\244\233\237\362\202\267\230\363\270\213\221\363\246\246\254\362\253\216\242\362\207\211\273\363\233\217\215\361\217\224\226\361\207\261\205\361\264\232\252\362\203\275\204\361\213\232\277\362\227\266\254\362\253\252\200\361\266\225\214\362\213\202\221\362\203\246\237\363\202\257\211\361\257\224\206\361\247\247\274\361\245\246\226\362\223\231\234\360\275\212\230\363\224\244\212\360\243\226\214\360\230\201\261\363\221\267\205\360\270\267\270\360\232\255\265\362\273\217\267\361\236\251\256\362\234\272\222\364\217\265\225\362\255\237\267\362\254\272\241\362\260\251\234\362\231\250\207\363\231\236\262\360\231\205\205\360\231\204\273\362\245\240\232\363\232\265\204\361\212\200\216\360\253\203\245\362\276\274\224\364\204\216\214\360\275\275\244\362\244\217\237\361\257\211\200\362\272\271\233\361\200\253\246\361\241\247\270\363\241\224\246\362\213\210\254\361\262\225\212\360\266\214\232\363\245\236\256\362\236\222\277\361\241\260\257\363\265\244\250\363\264\263\264\360\246\261\250\362\243\263\234\363\220\217\222\361\246\206\230\363\267\261\235\363\237\244\233\364\216\216\273\363\275\221\231\363\204\251\247\361\200\235\203\362\207\254\233\361\274\213\213\361\240\217\242\362\220\244\222\362\210\217\212\363\220\277\272\362\244\215\243\362\273\247\245\361\205\203\221\361\241\232\277\363\241\225\274\362\210\211\235\364\202\225\275\364\202\213\237\360\250\277\246\363\247\201\211\362\233\233\263\362\252\212\204\363\207\225\203\361\241\244\222\361\210\270\203\362\212\276\203\360\220\250\246\362\272\252\277\362\266\246\257\363\273\221\232\362\256\261\247\362\215\210\242\360\226\247\255\361\264\271\262\360\275\214\213\360\241\256\251\364\212\243\205\360\233\205\263\361\226\271\264\362\223\204\207\361\257\270\243\363\207\244\233\362\245\272\221\364\210\215\213\361\271\216\240\362\204\272\250\362\243\266\233\362\220\216\254\363\245\214\211\363\245\212\252\362\200\271\270\360\264\212\216\361\226\223\245\363\244\232\265\362\224\216\271\363\200\202\266\363\225\230\272\362\213\275\211\363\275\270\226\362\200\260\277\364\204\245\276\361\206\236\251\362\221\202\270\362\254\204\223\363\262\242\255\362\230\240\226\361\236\265\277\362\273\226\252\361\243\226\264\362\271\276\223\360\220\224\224\363\265\203\247\362\262\224\223\361\252\265\245\361\201\213\250\363\203\202\247\363\216\264\232\362\254\233\204\364\202\236\244\361\233\225\224\363\223\273\263\360\272\242\237\360\257\253\263\361\270\224\250\363\274\230\236\364\213\203\204\361\232\247\257\362\202\265\264\361\226\262\220\361\215\210\250\362\242\213\236\361\277\206\231\363\263\210\251\361\250\204\245\363\206\242\231\360\237\274\250\360\233\255\271\361\271\207\237\363\227\246\216\363\247\266\264\362\272\216\262\362\237\220\245\363\226\202\250\361\274\243\231\362\272\221\247\363\273\251\234\362\201\240\227\362\232\200\261\361\265\224\207\363\211\214\217\362\203\233\255\364\202\226\214\362\250\242\203\361\234\276\257\361\247\251\244\360\262\245\204\361\213\262\256\362\205\213\252\363\221\215\227\361\217\211\227\363\245\253\240\361\204\215\225\361\267\215\227\364\206\245\256\362\250\271\240\361\261\274\233\361\224\267\201\360\257\260\232\360\220\273\232\360\243\230\246\360\257\264\203\363\217\210\216\364\211\232\232\364\212\275\272\360\247\215\273\363\272\213\200\360\273\275\273\362\233\265\247\362\267\267\242\364\207\243\261\361\275\207\253\362\244\226\222\361\255\275\227\363\232\276\265\360\222\210\245\362\212\270\264\362\256\257\235\360\267\266\234\361\207\271\231\363\266\210\240\362\247\217\277\362\224\251\266\360\243\217\261\360\256\253\234\363\237\261\224\364\206\235\270\362\214\207\246\363\210\275\245\361\230\247\257\361\245\270\206\363\240\272\221\363\276\220\252\360\243\266\200\363\226\244\200\363\221\252\221\361\267\210\212\362\267\275\275\363\254\210\263\363\261\222\212\361\221\223\211\363\227\217\251\361\235\265\242\363\227\234\227\363\227\254\226\363\252\256\267\363\264\205\260\361\261\261\277\362\224\202\202\363\237\201\243\361\213\271\210\361\242\270\246\362\250\217\256\361\236\223\257\363\225\217\245\360\222\203\240\362\216\247\267\363\255\277\227\361\206\212\233\364\201\273\237\363\277\232\242\363\213\214\272\362\236\215\263\360\226\272\244\364\200\264\242\363\260\271\250\364\210\266\213\361\205\271\251\362\214\270\267\363\255\210\270\362\267\245\254\361\262\245\222\362\267\232\256\360\242\230\224\363\217\206\270\360\226\250\235\362\253\200\222\362\217\254\234\363\277\245\207\363\271\255\221\362\246\270\220\362\243\263\210\363\235\256\214\362\264\263\225\363\266\226\240\363\252\240\236\362\220\200\251\362\203\243\271\360\234\253\272\360\260\214\225\361\231\241\254\360\247\207\221\361\242\247\202\363\256\230\243\361\266\214\257\362\241\216\250\360\271\231\252\362\233\236\264\362\210\253\272\362\212\264\260\362\257\263\213\362\262\212\214\362\241\261\215\360\230\253\214\363\224\236\234\361\205\231\227\361\261\265\236\363\232\203\257\363\263\256\254\362\201\215\221\361\222\202\224\363\217\244\204\360\224\207\267\362\210\243\241\363\215\272\233\363\221\273\241\361\213\253\234\360\225\202\264\360\271\232\237\360\224\225\226\360\273\243\222\360\231\227\264\361\217\263\252\362\207\214\264\361\225\232\222\360\233\242\242\363\277\206\250\360\252\224\277\361\265\200\242\360\242\272\265\362\203\277\253\363\266\221\257\363\227\240\262\363\232\270\261\360\263\251\213\363\272\202\212\360\266\235\263\360\242\225\233\361\207\255\210\363\215\204\252\361\261\214\263\364\211\224\215\362\272\200\225\364\211\233\254\363\214\263\252\361\223\256\253\360\220\254\234\364\217\212\210\361\247\240\235\361\235\205\210\360\275\204\214\362\227\220\220\361\250\225\210\362\211\212\242\363\203\267\230\360\277\224\252\360\274\231\210\362\277\252\222\361\261\235\261\364\210\255\255\361\221\235\203\364\211\205\252\363\237\217\206\360\272\207\215\363\225\260\244\361\205\206\244\360\220\233\215\361\210\265\217\360\275\253\272\362\232\276\234\360\252\212\235\361\266\226\203\364\217\275\235\362\234\227\276\363\264\243\227\362\251\202\241\364\202\203\252\360\221\225\265\364\201\246\220\361\255\224\234\361\215\217\244\364\212\210\251\360\277\272\275\360\224\265\217\360\262\241\246\360\230\256\240\362\237\203\205\360\220\266\200\360\273\274\205\360\250\226\260\362\225\240\251\362\234\223\237\362\272\261\205\362\254\214\263\363\263\270\216\362\225\224\202\361\264\230\246\361\256\231\252\360\270\254\253\360\223\277\233\362\256\200\243\364\205\220\263\361\264\213\214\363\262\251\227\360\274\277\205\362\222\221\255\363\252\227\212\360\244\265\203\362\227\250\237\363\214\235\243\360\257\247\274\360\234\265\222\363\217\234\266\363\220\250\240\362\265\203\235\361\270\213\267\360\252\266\220\361\277\210\201\362\273\214\237\361\254\244\207\363\246\237\274\363\210\255\257\362\255\227\266\360\227\236\214\363\274\202\226\363\232\207\234\363\235\214\276\363\230\271\270\361\231\207\241\360\222\226\253\364\213\260\265\360\261\210\220\363\240\262\252\362\225\242\214\360\245\213\277\360\255\201\206\362\214\206\214\362\234\245\271\363\267\234\222\361\270\207\221\362\247\233\237\361\257\201\271\363\204\245\232\363\241\255\252\361\243\216\247\362\204\246\202\363\267\230\235\360\267\200\210\361\204\232\254\363\216\223\226\361\204\232\257\363\262\274\243\363\200\277\262\361\234\261\242\362\210\265\226\361\215\271\263\361\272\247\237\362\253\247\210\363\277\204\265\363\233\226\207\362\257\201\232\360\230\265\241\360\277\212\251\362\274\225\266\362\221\214\267\360\223\205\215\360\247\206\222\361\272\253\250\363\231\270\270\363\276\267\202\360\273\235\263\363\261\234\200\361\222\273\256\363\261\261\212\362\236\253\247\363\252\213\210\362\251\251\237\363\216\240\274\361\223\236\216\362\227\261\274\362\257\220\213\362\227\245\215\360\244\212\227\363\230\215\250\363\272\254\240\363\260\275\263\361\223\260\237\361\244\261\276\361\201\250\240\363\227\273\236\361\275\267\225\364\212\250\266\360\236\263\221\363\270\256\236\362\236\221\224\361\265\266\212\360\232\260\244\363\215\252\211\363\234\260\261\362\275\212\226\360\274\271\247\361\261\213\262\364\210\200\224\362\221\240\241\364\201\207\203\362\201\224\260\361\244\254\264\364\217\232\273\363\251\223\214\363\235\273\212\363\251\246\261\362\222\231\236\363\205\216\234\363\201\266\253\360\225\230\242\360\256\206\251\361\260\271\272\361\234\237\251\363\217\207\231\362\231\243\270\361\225\256\277\360\234\250\231\363\225\203\234\361\210\271\261\362\224\274\240\360\241\205\225\361\231\207\261\363\207\247\205\361\273\252\242\360\262\245\271\362\275\270\212\360\270\241\212\360\256\274\246\361\246\216\253\361\251\266\225\363\244\246\263\363\235\240\260\360\242\231\267\361\240\226\240\360\226\216\270\361\216\264\274\362\273\221\230\363\222\220\225\362\233\275\244\360\242\233\265\360\250\240\274\362\216\277\256\360\273\226\212\361\261\216\216\360\272\203\203\362\217\243\270\363\212\235\264\363\235\253\206\362\230\264\277\360\270\267\276\361\236\202\224\362\206\252\275\362\230\201\267\362\222\260\226\360\254\275\210\363\233\257\236\361\240\252\265\363\275\236\265\361\226\267\252\360\263\250\257\362\267\250\250\360\231\241\274\360\246\265\237\363\271\247\253\360\245\247\252\362\261\237\255\361\274\230\263\362\202\255\275\360\261\233\277\364\207\211\215\360\273\274\257\360\231\221\205\361\271\271\202\363\220\217\235\363\256\201\237\362\204\274\273\361\254\225\264\363\216\216\242\360\222\212\273\361\256\211\235\361\276\271\264\363\242\267\230\362\227\234\250\363\242\214\225\363\205\261\277\362\200\253\262\362\251\277\204\361\252\225\231\361\262\223\270\361\256\244\271\361\231\245\250\363\205\256\215\361\241\204\257\361\226\203\247\363\234\261\240\363\250\207\267\363\257\275\244\360\227\204\200\363\216\226\227\360\246\275\252\360\220\256\203\363\215\256\223\360\236\222\261\361\201\254\271\362\275\216\254\364\210\232\274\364\211\256\233\363\267\264\216\363\277\230\233\362\226\256\257\362\252\230\216\362\201\260\245\361\242\243\271\362\254\230\221\362\275\276\262\362\275\270\221\362\207\230\203\361\267\264\266\361\225\267\263\364\215\273\240\363\202\201\276\361\237\256\215\361\234\274\263\362\256\273\246\363\263\274\273\361\247\203\235\363\244\271\277\361\247\251\253\361\274\211\240\361\257\246\216\363\220\215\210\360\221\220\221\362\237\234\215\360\224\255\262\360\273\236\266\364\200\257\243\361\207\274\276\361\267\232\227\361\220\215\246\363\252\253\236\363\276\220\231\361\240\214\271\363\221\271\214\361\256\241\273\005\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\0: 37\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\037\0_user_agent" - } - channel_actions { - add_n_bytes_writable: 2314850208468434944 - add_n_bytes_readable: 54 - } - channel_actions { - add_n_bytes_readable: 18014398509481984 - wait_ms: 15616 - } - channel_actions { - add_n_bytes_writable: 11532154961920 - } - channel_actions { - add_n_bytes_writable: 18014398509481984 - add_n_bytes_readable: 15616 - wait_ms: 2293760 - } - } -} -actions { - create_call { - method { - value: "dns:segeW:[rver" - intern: true - } - host { - value: "dns:server" - intern: true - } - timeout: 193985152 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - flags: 80 - } - operations { - flags: 65416 - } - operations { - send_message { - } - } - } -} -actions { - change_active_call { - } -} -actions { - advance_time: 10000000 -} -actions { - queue_batch { - operations { - receive_message { - } - } - } -} -actions { - advance_time: 0 -} -actions { - check_connectivity: true -} -actions { - create_call { - propagation_mask: 1953785960 - method { - value: "dns:server" - intern: true - } - host { - value: "e:=" - intern: true - } - timeout: 1000000000 - } -} -actions { - ping { - } -} -actions { - change_active_call { - } -} -actions { - ping { - } -} -actions { - advance_time: 1000 -} -actions { - advance_time: 10000000 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "hello world" -} -actions { - create_call { - method { - value: "/foo" - } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - flags: 80 - } - operations { - flags: 1 - } - operations { - receive_initial_metadata { - } - } - operations { - } - } -} -actions { - change_active_call { - } -} -actions { - advance_time: 1 -} -actions { - watch_connectivity: 11000000 -} -actions { - ping { - } -} -actions { - queue_batch { - operations { - receive_message { - } - } - } -} -actions { - create_call { - method { - value: "/foo" - } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - receive_initial_metadata { - } - } - } -} -actions { - advance_time: 1000000 -} -actions { - resize_resource_quota: 1 -} -actions { - destroy_call { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - receive_close_on_server { - } - } - } -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - send_close_from_client { - } - } - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - receive_message { - } - } - } -} -actions { - advance_time: 1000000 -} -actions { - get_target { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - send_message { - message { - value: "hello world" - } - } - } - } -} -actions { - request_call { - } -} -actions { - queue_batch { - operations { - receive_close_on_server { - } - } - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 4293996864 -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - receive_message { - } - } - } -} -actions { -} -actions { - get_peer { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/append b/test/core/end2end/fuzzers/api_fuzzer_corpus/append deleted file mode 100644 index 20e315d2c81..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/append +++ /dev/null @@ -1,33 +0,0 @@ -actions { - create_channel { - channel_actions {} - } -} -actions { - create_call { - method { - value: - "contenttype" - } - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - metadata { - key { - value: - "content-type" - } - } - metadata { - key { - value: - "content-type" - } - } - } - } - } -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-streaming b/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-streaming deleted file mode 100644 index 4d52068086d..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-streaming +++ /dev/null @@ -1,618 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "dns:server" - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - } -} -actions { - create_call { - method: { value: "/foo" } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - send_initial_metadata {} - } - operations { - receive_initial_metadata {} - } - } -} -actions { - request_call {} -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - change_active_call {} -} -actions { - queue_batch { - operations { - send_initial_metadata {} - } - } -} -actions { - poll_cq: {} -} -actions { - change_active_call {} -} -actions { - queue_batch { - operations { - send_message { - message { - value: "hello world" - } - } - } - } -} -actions { - change_active_call {} -} -actions { - queue_batch { - operations { - receive_message {} - } - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - change_active_call {} -} -actions { - queue_batch { - operations { - send_message { - message { - value: "hello world" - } - } - } - } -} -actions { - change_active_call {} -} -actions { - queue_batch { - operations { - receive_message {} - } - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - change_active_call {} -} -actions { - queue_batch { - operations { - receive_status_on_client {} - } - } -} -actions { - change_active_call {} -} -actions { - queue_batch { - operations { - send_status_from_server { - status_code: 0 - } - } - operations { - receive_close_on_server {} - } - } -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - queue_batch { - operations { - send_close_from_client {} - } - } -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} - diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-unary b/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-unary deleted file mode 100644 index 5c9d9d6c052..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/call-complete-unary +++ /dev/null @@ -1,496 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "dns:server" - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - } - channel_actions { - wait_ms: 1000 - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - } -} -actions { - create_call { - method: { value: "/foo" } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - send_initial_metadata {} - } - operations { - receive_initial_metadata {} - } - operations { - receive_message {} - } - operations { - send_close_from_client {} - } - operations { - receive_status_on_client {} - } - } -} -actions { - request_call {} -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - change_active_call {} -} -actions { - queue_batch { - operations { - send_initial_metadata {} - } - operations { - send_message { - message { - value: "hello world" - } - } - } - } -} -actions { - queue_batch { - operations { - send_status_from_server { - status_code: 0 - } - } - operations { - receive_close_on_server {} - } - } -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 1000000 -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/channelz-crash b/test/core/end2end/fuzzers/api_fuzzer_corpus/channelz-crash deleted file mode 100644 index 0eaa5877cf8..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/channelz-crash +++ /dev/null @@ -1,19 +0,0 @@ -actions { - create_channel { - target: "\001\000\000\000\323\273`*" - channel_args { - key: "grpc.channelz_channel_node" - resource_quota { - } - } - channel_args { - resource_quota { - } - } - channel_args { - resource_quota { - } - } - } -} - diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-4849973711994880 b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-4849973711994880 deleted file mode 100644 index cd6a2537b53..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-4849973711994880 +++ /dev/null @@ -1,55 +0,0 @@ -actions { - create_channel { - target: "dse:snrver" - } -} -actions { - create_call { - method { - value: "%:?" - } - } -} -actions { - queue_batch { - operations { - receive_initial_metadata { - } - } - operations { - send_message { - message { - intern: true - } - message { - intern: true - } - message { - intern: true - } - message { - value: "bob" - } - message { - intern: true - } - message { - intern: true - } - message { - intern: true - } - message { - intern: true - } - message { - intern: true - } - } - } - operations { - receive_initial_metadata { - } - } - } -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5180720131997696 b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5180720131997696 deleted file mode 100644 index 20c76dc1da1..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5180720131997696 +++ /dev/null @@ -1,106 +0,0 @@ -actions { - create_channel { - target: "unix:" - channel_actions { - add_n_bytes_writable: 150 - wait_ms: 150 - } - } -} -actions { - check_connectivity: true -} -actions { - create_server { - channel_args { - key: "grpc.http2.max_ping_strikes" - } - } -} -actions { - request_call { - } -} -actions { - advance_time: 1886680168 -} -actions { - watch_connectivity: 1886680167 -} -actions { - advance_time: 1886680168 -} -actions { - ping { - } -} -actions { - advance_time: 4194238464 -} -actions { - shutdown_server { - } -} -actions { - advance_time: 1543528704 -} -actions { - advance_time: 4194238464 -} -actions { - get_target { - } -} -actions { - advance_time: 1886680168 -} -actions { - advance_time: 745829480 -} -actions { - enable_tracer: "all" -} -actions { - request_call { - } -} -actions { - shutdown_server { - } -} -actions { - advance_time: 1886680168 -} -actions { - advance_time: 1886680167 -} -actions { - advance_time: 1886680168 -} -actions { - advance_time: 1543528704 -} -actions { - ping { - } -} -actions { - advance_time: 4194238464 -} -actions { - advance_time: 4194238464 -} -actions { - advance_time: 4194238464 -} -actions { - advance_time: 4194238464 -} -actions { -} -actions { - destroy_call { - } -} -actions { -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5590514309398528.test b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5590514309398528.test deleted file mode 100644 index 4735742e93b..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-api_fuzzer-5590514309398528.test +++ /dev/null @@ -1,117 +0,0 @@ -actions { - create_server { - channel_args { - key: "grpc.resource_quota" - resource_quota { - } - } - channel_args { - } - } -} -actions { - create_channel { - target: "dns:server" - channel_args { - resource_quota { - } - } - channel_args { - i: 1 - } - } -} -actions { - create_call { - method { - value: "dns:sers:s" - intern: true - } - timeout: 999962120 - } -} -actions { - create_call { - method { - value: "dns:se0s[s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000W\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000D08796287\000\000\000\000\000\000\000\000\000\000\000\000\000" - } - host { - value: "dns:sers:s" - intern: true - } - timeout: 1000000000 - } -} -actions { - get_peer { - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - operations { - flags: 1634992128 - } - } -} -actions { - change_active_call { - } -} -actions { - advance_time: 10000000 -} -actions { - queue_batch { - } -} -actions { - advance_time: 10000000 -} -actions { - watch_connectivity: 10131072 -} -actions { - advance_time: 80 -} -actions { - create_call { - method { - value: "dns:sers:ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" - intern: true - } - host { - value: "dns:sers:s" - intern: true - } - timeout: 999962120 - } -} -actions { - poll_cq { - } -} -actions { - destroy_call { - } -} -actions { - resize_resource_quota: 0 -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - operations { - flags: 1634992128 - } - } -} -actions { - disable_tracer: "dns:sers:s" -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a807143b6ea93ba41d3b8e76bb99d06022c82565 b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a807143b6ea93ba41d3b8e76bb99d06022c82565 deleted file mode 100644 index b96a5fd2448..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-a807143b6ea93ba41d3b8e76bb99d06022c82565 +++ /dev/null @@ -1,21 +0,0 @@ -actions { - create_channel { - channel_actions { - } - } -} -actions { - create_call { - method { - value: "contenttype" - } - } -} -actions { - queue_batch { - operations { - receive_initial_metadata { - } - } - } -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-on-unknown-compression-algorithm b/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-on-unknown-compression-algorithm deleted file mode 100644 index 0ef0af809d2..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/crash-on-unknown-compression-algorithm +++ /dev/null @@ -1,19 +0,0 @@ -actions { - create_channel { - target: "unix:phttpShttp6\327\227Go" - channel_args { - key: "grpc.default_compression_algorithm" - i: 4702337453602635775 - } - } -} -actions { - create_server {} -} -actions { - check_connectivity: true -} -actions { - advance_time: 6881403 -} -actions {} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/create_connection.textproto b/test/core/end2end/fuzzers/api_fuzzer_corpus/create_connection.textproto deleted file mode 100644 index 294a1687ff5..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/create_connection.textproto +++ /dev/null @@ -1,86 +0,0 @@ -actions { - create_server {} -} -actions { - create_channel { - target: "dns:server" - } -} -actions { - create_call { - method: { value: "/foo" } - host: { value: "bob" } - timeout: 1000000000 - } -} -actions { - request_call {} -} -actions { - queue_batch { - operations { - send_initial_metadata {} - } - operations { - send_message {} - } - operations { - send_close_from_client {} - } - operations { - receive_initial_metadata {} - } - operations { - receive_message {} - } - operations { - receive_status_on_client {} - } - } -} -actions { - change_active_call {} -} -actions { - advance_time: 10000000 -} -actions { - advance_time: 1000 -} -actions { - advance_time: 10000000 -} -actions { - advance_time: 100000 -} -actions { - poll_cq: {} -} -actions { - queue_batch { - operations { - send_initial_metadata {} - } - operations { - send_message {} - } - operations { - send_status_from_server {} - } - operations { - receive_message {} - } - operations { - receive_close_on_server {} - } - } -} -actions { - advance_time: 100000 -} -actions { - poll_cq: {} -} -actions { - advance_time: 100000 -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/get-leak b/test/core/end2end/fuzzers/api_fuzzer_corpus/get-leak deleted file mode 100644 index 2828b2dcec2..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/get-leak +++ /dev/null @@ -1,32 +0,0 @@ -actions { - create_server {} -} -actions { - create_channel { - target: - "unix:\360\32367\227Go\254" - } -} -actions { - create_call { - method { - value: "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000" - } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations{ - send_initial_metadata {} - flags: 64 - } - operations { - send_message {} - } - } -} -actions { - advance_time : 10000000 -} -actions {} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/long-path b/test/core/end2end/fuzzers/api_fuzzer_corpus/long-path deleted file mode 100644 index 11af088665d..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/long-path +++ /dev/null @@ -1,164 +0,0 @@ -actions { - create_server { - channel_args { - key: "grpc.http2.bdp_probe" - } - } -} -actions { - create_channel { - target: "dns:server" - channel_actions { - add_n_bytes_writable: 12366884576759382016 - add_n_bytes_readable: 5832 - } - channel_actions { - add_n_bytes_readable: 18014398509481984 - wait_ms: 15616 - } - channel_actions { - add_n_bytes_writable: 11532154961920 - add_n_bytes_readable: 14073748835532 - } - channel_actions { - add_n_bytes_writable: 18014398509481792 - add_n_bytes_readable: 15616 - } - } -} -actions { - create_call { - propagation_mask: 2621440 - method { - value: "nssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss¶sssssssssssssssssssss¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢¢kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkôkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk”kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkw§kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkktvkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkÌ£kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkktvkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk”kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé1054éééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééêéééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééé¼ééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééééssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\257dssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss2863ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛssssssssss\18446744073709551401sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\222fsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss:server" - } - timeout: 1935985152 - } -} -actions { - request_call { - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - flags: 80 - } - operations { - flags: 1 - } - operations { - send_message { - message { - value: "http" - } - } - } - operations { - } - } -} -actions { - change_active_call { - } -} -actions { - advance_time: 10000000 -} -actions { - advance_time: 16 -} -actions { - advance_time: 10000000 -} -actions { - advance_time: 4 -} -actions { - check_connectivity: true -} -actions { - create_call { - method { - value: "dns:server" - intern: true - } - timeout: 1000000000 - } -} -actions { - ping { - } -} -actions { - change_active_call { - } -} -actions { - ping { - } -} -actions { - advance_time: 1000 -} -actions { - advance_time: 1000000 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "dns:server" -} -actions { - create_call { - host { - value: "dns:server" - } - timeout: 1000000000 - } -} -actions { -} -actions { -} -actions { - advance_time: 10000000 -} -actions { - watch_connectivity: 9998208 -} -actions { - requess_call { - } -} -actions { - ping { - } -} -actions { - ping { - } -} -actions { - request_call { - } -} -actions { - get_peer { - } -} -actions { -} -actions { - get_peer { - } -} -actions { - shutdown_server { - } -} -actions { -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/min_time_rounding b/test/core/end2end/fuzzers/api_fuzzer_corpus/min_time_rounding deleted file mode 100644 index 7a14cd77e85..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/min_time_rounding +++ /dev/null @@ -1,15 +0,0 @@ -actions { - create_channel { - channel_actions {} - } -} -actions { - advance_time : 2 -} -actions { - watch_connectivity : 1 -} -actions { - poll_cq {} -} - diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/shifty-mcshifter b/test/core/end2end/fuzzers/api_fuzzer_corpus/shifty-mcshifter deleted file mode 100644 index 6c615467610..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/shifty-mcshifter +++ /dev/null @@ -1,21 +0,0 @@ -actions { - create_channel { - target: "unix:" - channel_args { - key: "grpc.default_compression_algorithm" - i: 71776123355660288 - } - } -} -actions { - create_server { - } -} -actions { - check_connectivity: true -} -actions { - advance_time: 6881279 -} -actions { -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4563554393260032 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4563554393260032 deleted file mode 100644 index 242264d5470..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4563554393260032 +++ /dev/null @@ -1,46 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "unix::::::::::::::::::::::::::;:::::;:::::::::::::>:::::::::::::::::::::::9:::::\026I:::::::c::,:::\332\261::::::::::::::::" - channel_actions { - add_n_bytes_writable: 18446744073709551607 - add_n_bytes_readable: 18446744073709551607 - } - } -} -actions { - create_call { - propagation_mask: 6881280 - method { - value: "/foo" - } - timeout: 1953002608 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - operations { - send_message { - message { - intern: true - } - message { - value: "Bh\007-600" - intern: true - } - } - } - } -} -actions { - advance_time: 6881280 -} -actions { -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4572962842083328 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4572962842083328 deleted file mode 100644 index 423a784d56a..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4572962842083328 +++ /dev/null @@ -1,29 +0,0 @@ -actions { - create_channel { - target: "unix::pehttpP~GK467440737046,,\343\236\234,,t49,Sac,,t" - channel_args { - key: "grpc.lb_policy_name" - str: "unix::pehttpP~GK467440737046,,\343\236\234,,t49,Sac,,t" - } - channel_actions { - add_n_bytes_writable: 32769 - wait_ms: 89 - } - } -} -actions { - create_call { - method { - value: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - } - timeout: 858993408 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - } -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4825725484269568 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4825725484269568 deleted file mode 100644 index 3335a8b4358..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4825725484269568 +++ /dev/null @@ -1,400 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "dns:server" - channel_actions { - add_n_bytes_writable: 1320 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - wait_ms: 20 - } - channel_actions { - add_n_bytes_writable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_readable: 20 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 532 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 1000 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 532 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 16400 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 2338333577814474752 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 34359738388 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 20 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 1000 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - wait_ms: 1000 - } - } -} -actions { - create_call { - propagation_mask: 536870912 - method { - value: "/voo" - } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - operations { - receive_initial_metadata { - } - } - } -} -actions { - request_call { - } -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 16960 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - send_message { - message { - value: "hello wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwworld" - } - } - } - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - queue_batch { - operations { - receive_message { - } - } - operations { - send_message { - message { - value: "hello wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb00\\000\\000\\000\\000\\000\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n }\n channel_args {\n str:\337\"\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n key: \"\\022\"\n str: \"\"\n }\n channel_args {\n resource_quota {\n }\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n }\n channel_args {\n key: \"xds_clustes {\\n create_server {\\n r_resolver_e\"\n str: \"http\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n }\n channel_args {\n }\n channel_args {\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n str: \"\"\n }\n channel_args {\n str: \"\"\n }\n }\n}\nactions {\n create_channel {\n channel_args {\n key: \"http\"\n str: \"\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031\\031wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwworld" - } - } - } - } -} -actions { - change_active_call { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - send_close_from_client { - } - } - operations { - receive_status_on_client { - } - } - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - send_message { - message { - value: "hello" - } - } - } - } -} -actions { - queue_batch { - operations { - send_status_from_server { - } - } - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - queue_batch { - operations { - receive_message { - } - } - } -} - diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4902018028535808 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4902018028535808 deleted file mode 100644 index e8a4b0c7b13..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4902018028535808 +++ /dev/null @@ -1,35 +0,0 @@ -actions { - create_channel { - target: "unix:" - channel_actions { - add_n_bytes_writable: 42932895744 - add_n_bytes_readable: 34359738368 - } - } -} -actions { - create_call { - propagation_mask: 9869440 - method { - value: "v" - intern: true - } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - metadata { - key { - value: "content-type" - } - value { - value: "u-bin" - } - } - } - } - } -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4953856886308864 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4953856886308864 deleted file mode 100644 index 50fd147eb5e..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-4953856886308864 +++ /dev/null @@ -1,46 +0,0 @@ -actions { - create_channel { - target: "unix::\360,\206=\211::::::::::6::::::::::::,:::\354\327:::::::::::::::::::::::::174515::::::::::::::::::::174515:::::::::::::::::, \310\013::::::, \310/::::::::::::::::::::::\177::::::::::::::::::::::::, \310/\032::travel/flights/summary/proto/fac::::::::, \310/\032::::::::::::::74515::::::::::::::\251:::, \310/::::::, \310/:::::::8c\017\303:::::::::::\177::::::::::::::::::::::::, \310/\032::::::::::, \310/\032::::::::::::::::::::::::::::::::::::::::::::::::::?:::::::::::::::::::::::::;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::?:::::::::::::::::::::::::;::::::::::::::" - channel_creds { - composite_channel_creds { - channel_creds { - composite_channel_creds { - channel_creds { - composite_channel_creds { - channel_creds { - ssl_channel_creds { - } - } - } - } - call_creds { - composite_call_creds { - call_creds { - composite_call_creds { - call_creds { - access_token: "" - } - call_creds { - iam { - } - } - } - } - } - } - } - } - call_creds { - composite_call_creds { - call_creds { - access_token: "" - } - } - } - } - } - } -} -actions { - check_connectivity: true -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5097648256581632 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5097648256581632 deleted file mode 100644 index 181a8a0ec67..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5097648256581632 +++ /dev/null @@ -1,2086 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "dns:server" - channel_actions { - add_n_bytes_writable: 1320 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 1 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 199 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 1 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 199 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_readable: 20 - wait_ms: 2432595770428919637 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 20 - add_n_bytes_readable: 20 - wait_ms: 1000 - } - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 10 - wait_ms: 1000 - } - } -} -actions { - create_call { - method { - value: "/foo" - } - host { - value: "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" - } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - operations { - receive_initial_metadata { - } - } - } -} -actions { - request_call { - } -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - advance_time: 1000000 -} -actions { - shutdown_server { - } -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - receive_message { - } - } - } -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - send_message { - message { - value: "hello wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwworld" - } - } - } - } -} -actions { - change_active_call { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - shutdown_server { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "-3333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - cancel_all_calls_if_shutdown { - } -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 1449353472 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - enable_tracer: "\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031\031" -} -actions { - poll_cq { - } -} -actions { - request_call { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - operations { - receive_initial_metadata { - } - } - } -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - queue_batch { - operations { - flags: 8069235 - } - operations { - send_status_from_server { - } - flags: 219 - } - operations { - send_close_from_client { - } - } - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1131758447 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - change_active_call { - } -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - ping { - } -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 6881280 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1449353472 -} -actions { - get_target { - } -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { -} -actions { - change_active_call { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449197568 -} -actions { - advance_time: 262144 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - disable_tracer: "2" -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - get_peer { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - shutdown_server { - } -} -actions { - shutdown_server { - } -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - get_target { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1633051392 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1510145 -} -actions { - check_connectivity: true -} -actions { -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - watch_connectivity: 4244570112 -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: false -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - cancel_call { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { -} -actions { - ping { - } -} -actions { - check_connectivity: false -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 5134505 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: false -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - advance_time: 1449353472 -} -actions { - watch_connectivity: 474896553 -} -actions { - check_connectivity: true -} -actions { - enable_tracer: "" -} -actions { - poll_cq { - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 656 -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "2" -} -actions { - poll_cq { - } -} -actions { - advance_time: 6881280 -} -actions { - shutdown_server { - } -} -actions { - advance_time: 0 -} -actions { - ping { - } -} -actions { - check_connectivity: true -} -actions { - disable_tracer: "33333" -} -actions { - poll_cq { - } -} -actions { - disable_tracer: "33333" -} -actions { - advance_time: 1449353472 -} -actions { - poll_cq { - } -} -actions { - advance_time: 779436911 -} -actions { - poll_cq { - } -} -actions { - watch_connectivity: 1 -} -actions { -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - receive_message { - } - } - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - receive_status_on_client { - } - } - } -} -actions { - change_active_call { - } -} -actions { - queue_batch { - operations { - send_status_from_server { - } - } - operations { - receive_close_on_server { - } - } - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - queue_batch { - operations { - send_close_from_client { - } - } - } -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} -actions { - poll_cq { - } -} -actions { - advance_time: 1000000 -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5212802075197440 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5212802075197440 deleted file mode 100644 index e79c06b0a63..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5212802075197440 +++ /dev/null @@ -1,17 +0,0 @@ -actions { - create_channel { - target: "unix::\360,\206::::::::::::\354\327::::::::::::::::::\213\300:::::174515:::::::::::::::::, \310/:::::::::::::::::::::::::::::::::::::::?:::::::::::::::::::::::::;::::::::::::::" - channel_args { - key: "grpc.channel_credentials" - resource_quota { - } - } - channel_creds { - ssl_channel_creds { - } - } - } -} -actions { - check_connectivity: true -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5404970078044160 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5404970078044160 deleted file mode 100644 index d7dc5f4388d..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5404970078044160 +++ /dev/null @@ -1,57 +0,0 @@ -actions { - create_channel { - target: "unix:" - channel_actions { - add_n_bytes_writable: 10 - add_n_bytes_readable: 1000002 - } - } -} -actions { - create_call { - method { - value: "0" - } - timeout: 869738192 - } -} -actions { - queue_batch { - operations { - send_message { - message { - intern: true - } - message { - intern: true - } - message { - intern: true - } - message { - } - message { - intern: true - } - message { - } - message { - value: "Z" - intern: true - } - message { - intern: true - } - message { - value: "http" - intern: true - } - } - } - operations { - receive_message { - } - flags: 11008 - } - } -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5550279127072768 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5550279127072768 deleted file mode 100644 index 0a3cde58182..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5550279127072768 +++ /dev/null @@ -1,48 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "unix:" - channel_args { - key: "grpgrpc.max_r+ceivc.max_r+ceiv" - str: "http" - } - channel_actions { - add_n_bytes_writable: 34359738368 - add_n_bytes_readable: 34359738368 - } - } -} -actions { - create_call { - propagation_mask: 2621440 - method { - value: "htth" - } - host { - value: "http" - intern: true - } - timeout: 1935985152 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - metadata { - key { - value: "te" - } - value { - value: "invalid-value" - intern: true - } - } - } - } - } -} - diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5560572032974848 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5560572032974848 deleted file mode 100644 index 985d096eb48..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-5560572032974848 +++ /dev/null @@ -1,33 +0,0 @@ -actions { - create_channel { - target: "unix::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,:p,,257,,,,,,,,,l,,,,,,,,(:,,,-2070333693,,,-1_47483649,,,[,,,,,,,,,,,,,,,&,::p,,6,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:,,(:2,\"0,,,,,,,,,(,,,,,,,,,,,,,,,,,(:127,\"32769,,,,.,,,,,,,,,,,,,,:1,\"32769,,,,.,,,,,,,,,,,,,,:" - channel_args { - key: "grpc.use_local_subchannel_pool" - i: -26859368237907295 - } - channel_creds { - composite_channel_creds { - channel_creds { - composite_channel_creds { - channel_creds { - ssl_channel_creds { - } - } - call_creds { - access_token: "grpc.use_local_subchannel_pool" - } - } - } - call_creds { - access_token: "grpc.use_local_subchannel_pool" - } - } - } - channel_actions { - wait_ms: 15 - } - } -} -actions { - check_connectivity: true -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-6703968097271808 b/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-6703968097271808 deleted file mode 100644 index cb144eb09f4..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/testcase-6703968097271808 +++ /dev/null @@ -1,62 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "dns:server" - } -} -actions { - create_call { - method { - value: "/foo" - } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - } -} -actions { - advance_time: 9541248 -} -actions { - queue_batch { - operations { - send_close_from_client { - } - } - operations { - send_message { - } - } - operations { - receive_initial_metadata { - } - flags: 1895825408 - } - } -} -actions { - queue_batch { - operations { - send_message { - message { - value: "grp[.default_authority" - intern: true - } - } - } - } -} -actions { - advance_time: 10000000 -} -actions { -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout1 b/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout1 deleted file mode 100644 index d77be10d56b..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/timeout1 +++ /dev/null @@ -1,105 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "unix::::::::::::::::::::::::::;:::::;:::::::::::>:::::::::::::::::::::::9:::::\026I:::::::c::,::::\001::::::::::::::::" - channel_actions { - add_n_bytes_writable: 55 - add_n_bytes_readable: 106652627894272 - } - } -} -actions { - advance_time: 257 -} -actions { - create_call { - propagation_mask: 83968879 - method { - value: "u-bin" - } - host { - value: "\361\243\275\203\361\226\215\265\363\274\273\202\363\234\232\265\360\243\230\252\361\241\227\253\360\233\262\234\363\242\252\237\362\231\230\250\360\260\203\220\362\225\271\250\360\264\257\267\361\201\262\227\363\235\256\253\360\250\251\207\362\254\245\212\362\270\225\220\362\227\235\250\363\227\272\241\362\254\272\206\361\251\216\231\361\200\275\233\363\242\271\201\361\252\244\252\361\253\210\274\361\214\232\240\362\272\276\276\362\234\247\242\345\225\225" - intern: true - } - timeout: 1000000000 - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - metadata { - key { - value: "oo" - } - value { - value: "u-bin" - intern: true - } - } - metadata { - key { - value: "u-bio" - } - value { - value: "u-bin" - } - } - metadata { - key { - value: "u-biogrpc.lame_filter_error" - intern: true - } - value { - value: "u-bin" - intern: true - } - } - metadata { - key { - value: "u-bin" - intern: true - } - value { - value: "unix::pehttp,\014,,Sac,,t" - } - } - } - } - operations { - flags: 53 - } - operations { - flags: 1886680168 - } - } -} -actions { - request_call { - } -} -actions { - advance_time: 9869440 -} -actions { - create_server { - } -} -actions { -} -actions { - get_target { - } -} -actions { - enable_tracer: "u-bin" -} -actions { -} -actions { -} -actions { -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/validator-fail b/test/core/end2end/fuzzers/api_fuzzer_corpus/validator-fail deleted file mode 100644 index c735e9a10c6..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/validator-fail +++ /dev/null @@ -1,67 +0,0 @@ -actions { - create_server { - } -} -actions { - create_channel { - target: "dns:server" - } -} -actions { - create_call { - method { - value: "/foo" - } - timeout: 1000000000 - } -} -actions { - request_call { - } -} -actions { - queue_batch { - operations { - send_initial_metadata { - } - } - operations { - send_message { - } - } - } -} -actions { - change_active_call { - } -} -actions { - advance_time: 10000000 -} -actions { - advance_time: 10000000 -} -actions { - poll_cq { - } -} -actions { - queue_batch { - operations { - receive_message { - } - } - } -} -actions { - queue_batch { - operations { - send_close_from_client { - } - } - operations { - receive_close_on_server { - } - } - } -} diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/xds-client-grpc-error-leak b/test/core/end2end/fuzzers/api_fuzzer_corpus/xds-client-grpc-error-leak deleted file mode 100644 index 422b794c2b1..00000000000 --- a/test/core/end2end/fuzzers/api_fuzzer_corpus/xds-client-grpc-error-leak +++ /dev/null @@ -1,22 +0,0 @@ -actions { - create_channel { - target: "xds:SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSTSSSS\323\213MSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS}SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS\323\227^SSSSS¬SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS3209695SSSSSSSSSSSSS————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS18446744073709551330222222222222222222222222222222" - channel_args { - } - channel_args { - resource_quota { - } - } - channel_actions { - add_n_bytes_writable: 1952669952 - add_n_bytes_readable: 34657102164287744 - } - } -} -actions { - check_connectivity: true -} -actions { -} -actions { -} diff --git a/test/core/event_engine/fuzzing_event_engine/BUILD b/test/core/event_engine/fuzzing_event_engine/BUILD index d4223a71a54..3766178ff34 100644 --- a/test/core/event_engine/fuzzing_event_engine/BUILD +++ b/test/core/event_engine/fuzzing_event_engine/BUILD @@ -28,6 +28,7 @@ grpc_cc_library( deps = [ ":fuzzing_event_engine_proto", "//:event_engine_base_hdrs", + "//:time", ], ) diff --git a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc index 1449872124a..172e0afc3cd 100644 --- a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc +++ b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.cc @@ -14,25 +14,101 @@ #include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h" +#include + #include +#include + +#include "src/core/lib/gprpp/time.h" +#include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h" + +extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type); + namespace grpc_event_engine { namespace experimental { namespace { const intptr_t kTaskHandleSalt = 12345; -} +FuzzingEventEngine* g_fuzzing_event_engine = nullptr; +} // namespace FuzzingEventEngine::FuzzingEventEngine(Options options) : final_tick_length_(options.final_tick_length) { - for (const auto& delay : options.actions.tick_lengths()) { - tick_increments_[delay.id()] += std::chrono::microseconds(delay.delay_us()); + GPR_ASSERT(g_fuzzing_event_engine == nullptr); + g_fuzzing_event_engine = this; + + gpr_now_impl = GlobalNowImpl; + + Restart(fuzzing_event_engine::Actions()); +} + +void FuzzingEventEngine::Restart(const fuzzing_event_engine::Actions& actions) { + grpc_core::MutexLock lock(&mu_); + + tick_increments_.clear(); + task_delays_.clear(); + tasks_by_id_.clear(); + tasks_by_time_.clear(); + next_task_id_ = 1; + current_tick_ = 0; + // Start at 5 seconds after the epoch. + // This needs to be more than 1, and otherwise is kind of arbitrary. + // The grpc_core::Timer code special cases the zero second time period after + // epoch to allow for some fancy atomic stuff. + now_ = Time() + std::chrono::seconds(5); + + // Whilst a fuzzing event engine is active we override grpc's now function. + grpc_core::TestOnlySetProcessEpoch(NowAsTimespec(GPR_CLOCK_MONOTONIC)); + + auto update_delay = [](std::map* map, + fuzzing_event_engine::Delay delay, Duration max) { + auto& value = (*map)[delay.id()]; + if (delay.delay_us() > max.count() / GPR_NS_PER_US) { + value = max; + return; + } + Duration add = std::chrono::microseconds(delay.delay_us()); + if (add >= max - value) { + value = max; + } else { + value += add; + } + }; + + for (const auto& delay : actions.tick_lengths()) { + update_delay(&tick_increments_, delay, std::chrono::hours(24)); } - for (const auto& delay : options.actions.run_delay()) { - task_delays_[delay.id()] += std::chrono::microseconds(delay.delay_us()); + for (const auto& delay : actions.run_delay()) { + update_delay(&task_delays_, delay, std::chrono::seconds(30)); } } +void FuzzingEventEngine::FuzzingDone() { + grpc_core::MutexLock lock(&mu_); + tick_increments_.clear(); +} + +FuzzingEventEngine::~FuzzingEventEngine() { + GPR_ASSERT(g_fuzzing_event_engine == this); + g_fuzzing_event_engine = nullptr; +} + +gpr_timespec FuzzingEventEngine::NowAsTimespec(gpr_clock_type clock_type) { + // TODO(ctiller): add a facility to track realtime and monotonic clocks + // separately to simulate divergence. + GPR_ASSERT(clock_type != GPR_TIMESPAN); + const Duration d = now_.time_since_epoch(); + auto secs = std::chrono::duration_cast(d); + return {secs.count(), static_cast((d - secs).count()), clock_type}; +} + +gpr_timespec FuzzingEventEngine::GlobalNowImpl(gpr_clock_type clock_type) { + GPR_ASSERT(g_fuzzing_event_engine != nullptr); + grpc_core::MutexLock lock(&g_fuzzing_event_engine->mu_); + return g_fuzzing_event_engine->NowAsTimespec(clock_type); +} + void FuzzingEventEngine::Tick() { std::vector> to_run; { @@ -41,9 +117,11 @@ void FuzzingEventEngine::Tick() { auto tick_it = tick_increments_.find(current_tick_); if (tick_it != tick_increments_.end()) { now_ += tick_it->second; + GPR_ASSERT(now_.time_since_epoch().count() >= 0); tick_increments_.erase(tick_it); } else if (tick_increments_.empty()) { now_ += final_tick_length_; + GPR_ASSERT(now_.time_since_epoch().count() >= 0); } ++current_tick_; // Find newly expired timers. diff --git a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h index 38d9efeb8fc..87f8c659a88 100644 --- a/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h +++ b/test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h @@ -20,6 +20,7 @@ #include #include +#include #include "src/core/lib/gprpp/sync.h" #include "test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.pb.h" @@ -34,9 +35,12 @@ class FuzzingEventEngine : public EventEngine { // After all scheduled tick lengths are completed, this is the amount of // time Now() will be incremented each tick. Duration final_tick_length = std::chrono::seconds(1); - fuzzing_event_engine::Actions actions; }; explicit FuzzingEventEngine(Options options); + ~FuzzingEventEngine() override; + + void Restart(const fuzzing_event_engine::Actions& actions); + void FuzzingDone(); void Tick(); absl::StatusOr> CreateListener( @@ -77,13 +81,18 @@ class FuzzingEventEngine : public EventEngine { std::function closure; }; + gpr_timespec NowAsTimespec(gpr_clock_type clock_type) + ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); + static gpr_timespec GlobalNowImpl(gpr_clock_type clock_type) + ABSL_LOCKS_EXCLUDED(mu_); + const Duration final_tick_length_; grpc_core::Mutex mu_; - intptr_t next_task_id_ ABSL_GUARDED_BY(mu_) = 1; - intptr_t current_tick_ ABSL_GUARDED_BY(mu_) = 0; - Time now_ ABSL_GUARDED_BY(mu_) = Time::min(); + intptr_t next_task_id_ ABSL_GUARDED_BY(mu_); + intptr_t current_tick_ ABSL_GUARDED_BY(mu_); + Time now_ ABSL_GUARDED_BY(mu_); std::map tick_increments_ ABSL_GUARDED_BY(mu_); std::map task_delays_ ABSL_GUARDED_BY(mu_); std::map> tasks_by_id_ ABSL_GUARDED_BY(mu_); diff --git a/test/core/event_engine/iomgr_event_engine/BUILD b/test/core/event_engine/iomgr_event_engine/BUILD new file mode 100644 index 00000000000..363114eebd6 --- /dev/null +++ b/test/core/event_engine/iomgr_event_engine/BUILD @@ -0,0 +1,62 @@ +# Copyright 2017 gRPC 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 +# +# http://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. + +load("//bazel:grpc_build_system.bzl", "grpc_cc_test", "grpc_package") + +licenses(["notice"]) + +grpc_package( + name = "test/core/event_engine/iomgr_event_engine", + visibility = "public", +) # Useful for third party devs to test their io manager implementation. + +grpc_cc_test( + name = "time_averaged_stats_test", + srcs = ["time_averaged_stats_test.cc"], + external_deps = ["gtest"], + language = "C++", + uses_event_engine = False, + uses_polling = False, + deps = [ + "//:iomgr_ee_time_averaged_stats", + "//test/core/util:grpc_suppressions", + ], +) + +grpc_cc_test( + name = "timer_heap_test", + srcs = ["timer_heap_test.cc"], + external_deps = ["gtest"], + language = "C++", + uses_event_engine = False, + uses_polling = False, + deps = [ + "//:bitset", + "//:iomgr_ee_timer", + "//test/core/util:grpc_suppressions", + ], +) + +grpc_cc_test( + name = "timer_list_test", + srcs = ["timer_list_test.cc"], + external_deps = ["gtest"], + language = "C++", + uses_event_engine = False, + uses_polling = False, + deps = [ + "//:iomgr_ee_timer", + "//test/core/util:grpc_suppressions", + ], +) diff --git a/test/core/event_engine/iomgr_event_engine/time_averaged_stats_test.cc b/test/core/event_engine/iomgr_event_engine/time_averaged_stats_test.cc new file mode 100644 index 00000000000..4abeb86b9b7 --- /dev/null +++ b/test/core/event_engine/iomgr_event_engine/time_averaged_stats_test.cc @@ -0,0 +1,179 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 "src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h" + +#include + +#include + +namespace grpc_event_engine { +namespace iomgr_engine { + +TEST(TimeAveragedStatsTest, NoRegressNoPersistTest1) { + TimeAveragedStats tas(1000, 0, 0.0); + EXPECT_DOUBLE_EQ(1000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(0, tas.aggregate_total_weight()); + + /* Should have no effect */ + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(1000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(0, tas.aggregate_total_weight()); + + /* Should replace old average */ + tas.AddSample(2000); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(2000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(1, tas.aggregate_total_weight()); +} + +TEST(TimeAveragedStatsTest, NoRegressNoPersistTest2) { + TimeAveragedStats tas(1000, 0, 0.0); + EXPECT_DOUBLE_EQ(1000, tas.aggregate_weighted_avg()); + /* Should replace init value */ + tas.AddSample(2000); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(2000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(1, tas.aggregate_total_weight()); + + tas.AddSample(3000); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(3000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(1, tas.aggregate_total_weight()); +} + +TEST(TimeAveragedStatsTest, NoRegressNoPersistTest3) { + TimeAveragedStats tas(1000, 0, 0.0); + EXPECT_DOUBLE_EQ(1000, tas.aggregate_weighted_avg()); + /* Should replace init value */ + tas.AddSample(2500); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(2500, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(1, tas.aggregate_total_weight()); + + tas.AddSample(3500); + tas.AddSample(4500); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(4000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(2, tas.aggregate_total_weight()); +} + +TEST(TimeAveragedStatsTest, SomeRegressNoPersistTest) { + TimeAveragedStats tas(1000, 0.5, 0.0); + EXPECT_DOUBLE_EQ(1000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(0, tas.aggregate_total_weight()); + tas.AddSample(2000); + tas.AddSample(2000); + tas.UpdateAverage(); + /* (2 * 2000 + 0.5 * 1000) / 2.5 */ + EXPECT_DOUBLE_EQ(1800, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(2.5, tas.aggregate_total_weight()); +} + +TEST(TimeAveragedStatsTest, SomeDecayTest) { + TimeAveragedStats tas(1000, 1, 0.0); + EXPECT_EQ(1000, tas.aggregate_weighted_avg()); + /* Should avg with init value */ + tas.AddSample(2000); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(1500, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(2, tas.aggregate_total_weight()); + + tas.AddSample(2000); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(1500, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(2, tas.aggregate_total_weight()); + + tas.AddSample(2000); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(1500, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(2, tas.aggregate_total_weight()); +} + +TEST(TimeAveragedStatsTest, NoRegressFullPersistTest) { + TimeAveragedStats tas(1000, 0, 1.0); + EXPECT_DOUBLE_EQ(1000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(0, tas.aggregate_total_weight()); + + /* Should replace init value */ + tas.AddSample(2000); + tas.UpdateAverage(); + EXPECT_EQ(2000, tas.aggregate_weighted_avg()); + EXPECT_EQ(1, tas.aggregate_total_weight()); + + /* Will result in average of the 3 samples. */ + tas.AddSample(2300); + tas.AddSample(2300); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(2200, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(3, tas.aggregate_total_weight()); +} + +TEST(TimeAveragedStatsTest, NoRegressSomePersistTest) { + TimeAveragedStats tas(1000, 0, 0.5); + /* Should replace init value */ + tas.AddSample(2000); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(2000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(1, tas.aggregate_total_weight()); + + tas.AddSample(2500); + tas.AddSample(4000); + tas.UpdateAverage(); + EXPECT_DOUBLE_EQ(3000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(2.5, tas.aggregate_total_weight()); +} + +TEST(TimeAveragedStatsTest, SomeRegressSomePersistTest) { + TimeAveragedStats tas(1000, 0.4, 0.6); + /* Sample weight = 0 */ + EXPECT_EQ(1000, tas.aggregate_weighted_avg()); + EXPECT_EQ(0, tas.aggregate_total_weight()); + + tas.UpdateAverage(); + /* (0.6 * 0 * 1000 + 0.4 * 1000 / 0.4) */ + EXPECT_DOUBLE_EQ(1000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(0.4, tas.aggregate_total_weight()); + + tas.AddSample(2640); + tas.UpdateAverage(); + /* (1 * 2640 + 0.6 * 0.4 * 1000 + 0.4 * 1000 / (1 + 0.6 * 0.4 + 0.4) */ + EXPECT_DOUBLE_EQ(2000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(1.64, tas.aggregate_total_weight()); + + tas.AddSample(2876.8); + tas.UpdateAverage(); + /* (1 * 2876.8 + 0.6 * 1.64 * 2000 + 0.4 * 1000 / (1 + 0.6 * 1.64 + 0.4) */ + EXPECT_DOUBLE_EQ(2200, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(2.384, tas.aggregate_total_weight()); + + tas.AddSample(4944.32); + tas.UpdateAverage(); + /* (1 * 4944.32 + 0.6 * 2.384 * 2200 + 0.4 * 1000) / + (1 + 0.6 * 2.384 + 0.4) */ + EXPECT_DOUBLE_EQ(3000, tas.aggregate_weighted_avg()); + EXPECT_DOUBLE_EQ(2.8304, tas.aggregate_total_weight()); +} + +} // namespace iomgr_engine +} // namespace grpc_event_engine + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/event_engine/iomgr_event_engine/timer_heap_test.cc b/test/core/event_engine/iomgr_event_engine/timer_heap_test.cc new file mode 100644 index 00000000000..818004be924 --- /dev/null +++ b/test/core/event_engine/iomgr_event_engine/timer_heap_test.cc @@ -0,0 +1,202 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 "src/core/lib/event_engine/iomgr_engine/timer_heap.h" + +#include +#include + +#include +#include + +#include "src/core/lib/event_engine/iomgr_engine/timer.h" +#include "src/core/lib/gpr/useful.h" +#include "src/core/lib/gprpp/bitset.h" + +using testing::Contains; +using testing::Not; + +namespace grpc_event_engine { +namespace iomgr_engine { + +namespace { +int64_t RandomDeadline(void) { return rand(); } + +std::vector CreateTestElements(size_t num_elements) { + std::vector elems(num_elements); + for (size_t i = 0; i < num_elements; i++) { + elems[i].deadline = RandomDeadline(); + } + return elems; +} + +void CheckValid(TimerHeap* pq) { + const std::vector& timers = pq->TestOnlyGetTimers(); + for (size_t i = 0; i < timers.size(); ++i) { + size_t left_child = 1u + 2u * i; + size_t right_child = left_child + 1u; + if (left_child < timers.size()) { + EXPECT_LE(timers[i]->deadline, timers[left_child]->deadline); + } + if (right_child < timers.size()) { + EXPECT_LE(timers[i]->deadline, timers[right_child]->deadline); + } + } +} + +TEST(TimerHeapTest, Basics) { + TimerHeap pq; + const size_t num_test_elements = 200; + const size_t num_test_operations = 10000; + size_t i; + std::vector test_elements = CreateTestElements(num_test_elements); + grpc_core::BitSet inpq; + + EXPECT_TRUE(pq.is_empty()); + CheckValid(&pq); + for (i = 0; i < num_test_elements; ++i) { + EXPECT_THAT(pq.TestOnlyGetTimers(), Not(Contains(&test_elements[i]))); + pq.Add(&test_elements[i]); + CheckValid(&pq); + EXPECT_THAT(pq.TestOnlyGetTimers(), Contains(&test_elements[i])); + inpq.set(i); + } + for (i = 0; i < num_test_elements; ++i) { + /* Test that check still succeeds even for element that wasn't just + inserted. */ + EXPECT_THAT(pq.TestOnlyGetTimers(), Contains(&test_elements[i])); + } + + EXPECT_EQ(pq.TestOnlyGetTimers().size(), num_test_elements); + CheckValid(&pq); + + for (i = 0; i < num_test_operations; ++i) { + size_t elem_num = static_cast(rand()) % num_test_elements; + Timer* el = &test_elements[elem_num]; + if (!inpq.is_set(elem_num)) { /* not in pq */ + EXPECT_THAT(pq.TestOnlyGetTimers(), Not(Contains(el))); + el->deadline = RandomDeadline(); + pq.Add(el); + EXPECT_THAT(pq.TestOnlyGetTimers(), Contains(el)); + inpq.set(elem_num); + CheckValid(&pq); + } else { + EXPECT_THAT(pq.TestOnlyGetTimers(), Contains(el)); + pq.Remove(el); + EXPECT_THAT(pq.TestOnlyGetTimers(), Not(Contains(el))); + inpq.clear(elem_num); + CheckValid(&pq); + } + } +} + +struct ElemStruct { + Timer elem; + bool inserted = false; +}; + +ElemStruct* SearchElems(std::vector& elems, bool inserted) { + std::vector search_order; + for (size_t i = 0; i < elems.size(); i++) { + search_order.push_back(i); + } + for (size_t i = 0; i < elems.size() * 2; i++) { + size_t a = static_cast(rand()) % elems.size(); + size_t b = static_cast(rand()) % elems.size(); + std::swap(search_order[a], search_order[b]); + } + ElemStruct* out = nullptr; + for (size_t i = 0; out == nullptr && i < elems.size(); i++) { + if (elems[search_order[i]].inserted == inserted) { + out = &elems[search_order[i]]; + } + } + return out; +} + +// TODO(ctiller): this should be an actual fuzzer +TEST(TimerHeapTest, RandomMutations) { + TimerHeap pq; + + static const size_t elems_size = 1000; + std::vector elems(elems_size); + size_t num_inserted = 0; + + for (size_t round = 0; round < 10000; round++) { + int r = rand() % 1000; + if (r <= 550) { + /* 55% of the time we try to add something */ + ElemStruct* el = SearchElems(elems, false); + if (el != nullptr) { + el->elem.deadline = RandomDeadline(); + pq.Add(&el->elem); + el->inserted = true; + num_inserted++; + CheckValid(&pq); + } + } else if (r <= 650) { + /* 10% of the time we try to remove something */ + ElemStruct* el = SearchElems(elems, true); + if (el != nullptr) { + pq.Remove(&el->elem); + el->inserted = false; + num_inserted--; + CheckValid(&pq); + } + } else { + /* the remaining times we pop */ + if (num_inserted > 0) { + Timer* top = pq.Top(); + pq.Pop(); + for (size_t i = 0; i < elems_size; i++) { + if (top == &elems[i].elem) { + GPR_ASSERT(elems[i].inserted); + elems[i].inserted = false; + } + } + num_inserted--; + CheckValid(&pq); + } + } + + if (num_inserted) { + int64_t* min_deadline = nullptr; + for (size_t i = 0; i < elems_size; i++) { + if (elems[i].inserted) { + if (min_deadline == nullptr) { + min_deadline = &elems[i].elem.deadline; + } else { + if (elems[i].elem.deadline < *min_deadline) { + min_deadline = &elems[i].elem.deadline; + } + } + } + } + GPR_ASSERT(pq.Top()->deadline == *min_deadline); + } + } +} + +} // namespace +} // namespace iomgr_engine +} // namespace grpc_event_engine + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/event_engine/iomgr_event_engine/timer_list_test.cc b/test/core/event_engine/iomgr_event_engine/timer_list_test.cc new file mode 100644 index 00000000000..e9dea62528c --- /dev/null +++ b/test/core/event_engine/iomgr_event_engine/timer_list_test.cc @@ -0,0 +1,247 @@ +/* + * + * Copyright 2015 gRPC 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 + * + * http://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 "src/core/lib/event_engine/iomgr_engine/timer.h" +#include "src/core/lib/gprpp/time.h" + +using testing::Mock; +using testing::Return; +using testing::StrictMock; + +namespace grpc_event_engine { +namespace iomgr_engine { + +namespace { +const int64_t kHoursIn25Days = 25 * 24; +const grpc_core::Duration k25Days = grpc_core::Duration::Hours(kHoursIn25Days); + +class MockClosure : public experimental::EventEngine::Closure { + public: + MOCK_METHOD(void, Run, ()); +}; + +class MockHost : public TimerListHost { + public: + virtual ~MockHost() {} + MOCK_METHOD(grpc_core::Timestamp, Now, ()); + MOCK_METHOD(void, Kick, ()); +}; + +enum class CheckResult { kTimersFired, kCheckedAndEmpty, kNotChecked }; + +CheckResult FinishCheck( + absl::optional> result) { + if (!result.has_value()) return CheckResult::kNotChecked; + if (result->empty()) return CheckResult::kCheckedAndEmpty; + for (auto closure : *result) { + closure->Run(); + } + return CheckResult::kTimersFired; +} + +} // namespace + +TEST(TimerListTest, Add) { + Timer timers[20]; + StrictMock closures[20]; + + const auto kStart = + grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(100); + + StrictMock host; + EXPECT_CALL(host, Now()).WillOnce(Return(kStart)); + TimerList timer_list(&host); + + /* 10 ms timers. will expire in the current epoch */ + for (int i = 0; i < 10; i++) { + EXPECT_CALL(host, Now()).WillOnce(Return(kStart)); + timer_list.TimerInit(&timers[i], + kStart + grpc_core::Duration::Milliseconds(10), + &closures[i]); + } + + /* 1010 ms timers. will expire in the next epoch */ + for (int i = 10; i < 20; i++) { + EXPECT_CALL(host, Now()).WillOnce(Return(kStart)); + timer_list.TimerInit(&timers[i], + kStart + grpc_core::Duration::Milliseconds(1010), + &closures[i]); + } + + /* collect timers. Only the first batch should be ready. */ + EXPECT_CALL(host, Now()) + .WillOnce(Return(kStart + grpc_core::Duration::Milliseconds(500))); + for (int i = 0; i < 10; i++) { + EXPECT_CALL(closures[i], Run()); + } + EXPECT_EQ(FinishCheck(timer_list.TimerCheck(nullptr)), + CheckResult::kTimersFired); + for (int i = 0; i < 10; i++) { + Mock::VerifyAndClearExpectations(&closures[i]); + } + + EXPECT_CALL(host, Now()) + .WillOnce(Return(kStart + grpc_core::Duration::Milliseconds(600))); + EXPECT_EQ(FinishCheck(timer_list.TimerCheck(nullptr)), + CheckResult::kCheckedAndEmpty); + + /* collect the rest of the timers */ + EXPECT_CALL(host, Now()) + .WillOnce(Return(kStart + grpc_core::Duration::Milliseconds(1500))); + for (int i = 10; i < 20; i++) { + EXPECT_CALL(closures[i], Run()); + } + EXPECT_EQ(FinishCheck(timer_list.TimerCheck(nullptr)), + CheckResult::kTimersFired); + for (int i = 10; i < 20; i++) { + Mock::VerifyAndClearExpectations(&closures[i]); + } + + EXPECT_CALL(host, Now()) + .WillOnce(Return(kStart + grpc_core::Duration::Milliseconds(1600))); + EXPECT_EQ(FinishCheck(timer_list.TimerCheck(nullptr)), + CheckResult::kCheckedAndEmpty); +} + +/* Cleaning up a list with pending timers. */ +TEST(TimerListTest, Destruction) { + Timer timers[5]; + StrictMock closures[5]; + + StrictMock host; + EXPECT_CALL(host, Now()) + .WillOnce( + Return(grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(0))); + TimerList timer_list(&host); + + EXPECT_CALL(host, Now()) + .WillOnce( + Return(grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(0))); + timer_list.TimerInit( + &timers[0], grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(100), + &closures[0]); + EXPECT_CALL(host, Now()) + .WillOnce( + Return(grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(0))); + timer_list.TimerInit( + &timers[1], grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(3), + &closures[1]); + EXPECT_CALL(host, Now()) + .WillOnce( + Return(grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(0))); + timer_list.TimerInit( + &timers[2], grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(100), + &closures[2]); + EXPECT_CALL(host, Now()) + .WillOnce( + Return(grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(0))); + timer_list.TimerInit( + &timers[3], grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(3), + &closures[3]); + EXPECT_CALL(host, Now()) + .WillOnce( + Return(grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(0))); + timer_list.TimerInit( + &timers[4], grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(1), + &closures[4]); + EXPECT_CALL(host, Now()) + .WillOnce( + Return(grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(2))); + EXPECT_CALL(closures[4], Run()); + EXPECT_EQ(FinishCheck(timer_list.TimerCheck(nullptr)), + CheckResult::kTimersFired); + Mock::VerifyAndClearExpectations(&closures[4]); + EXPECT_FALSE(timer_list.TimerCancel(&timers[4])); + EXPECT_TRUE(timer_list.TimerCancel(&timers[0])); + EXPECT_TRUE(timer_list.TimerCancel(&timers[3])); + EXPECT_TRUE(timer_list.TimerCancel(&timers[1])); + EXPECT_TRUE(timer_list.TimerCancel(&timers[2])); +} + +/* Cleans up a list with pending timers that simulate long-running-services. + This test does the following: + 1) Simulates grpc server start time to 25 days in the past (completed in + `main` using TestOnlyGlobalInit()) + 2) Creates 4 timers - one with a deadline 25 days in the future, one just + 3 milliseconds in future, one way out in the future, and one using the + Timestamp::FromTimespecRoundUp function to compute a deadline of 25 + days in the future + 3) Simulates 4 milliseconds of elapsed time by changing `now` (cached at + step 1) to `now+4` + 4) Shuts down the timer list + https://github.com/grpc/grpc/issues/15904 */ +TEST(TimerListTest, LongRunningServiceCleanup) { + Timer timers[4]; + StrictMock closures[4]; + + const auto kStart = + grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch(k25Days.millis()); + + StrictMock host; + EXPECT_CALL(host, Now()).WillOnce(Return(kStart)); + TimerList timer_list(&host); + + EXPECT_CALL(host, Now()).WillOnce(Return(kStart)); + timer_list.TimerInit(&timers[0], kStart + k25Days, &closures[0]); + EXPECT_CALL(host, Now()).WillOnce(Return(kStart)); + timer_list.TimerInit( + &timers[1], kStart + grpc_core::Duration::Milliseconds(3), &closures[1]); + EXPECT_CALL(host, Now()).WillOnce(Return(kStart)); + timer_list.TimerInit(&timers[2], + grpc_core::Timestamp::FromMillisecondsAfterProcessEpoch( + std::numeric_limits::max() - 1), + &closures[2]); + + gpr_timespec deadline_spec = + (kStart + k25Days).as_timespec(gpr_clock_type::GPR_CLOCK_MONOTONIC); + + /* Timestamp::FromTimespecRoundUp is how users usually compute a millisecond + input value into grpc_timer_init, so we mimic that behavior here */ + EXPECT_CALL(host, Now()).WillOnce(Return(kStart)); + timer_list.TimerInit(&timers[3], + grpc_core::Timestamp::FromTimespecRoundUp(deadline_spec), + &closures[3]); + + EXPECT_CALL(host, Now()) + .WillOnce(Return(kStart + grpc_core::Duration::Milliseconds(4))); + EXPECT_CALL(closures[1], Run()); + EXPECT_EQ(FinishCheck(timer_list.TimerCheck(nullptr)), + CheckResult::kTimersFired); + EXPECT_TRUE(timer_list.TimerCancel(&timers[0])); + EXPECT_FALSE(timer_list.TimerCancel(&timers[1])); + EXPECT_TRUE(timer_list.TimerCancel(&timers[2])); + EXPECT_TRUE(timer_list.TimerCancel(&timers[3])); +} + +} // namespace iomgr_engine +} // namespace grpc_event_engine + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/event_engine/test_suite/iomgr_event_engine_test.cc b/test/core/event_engine/test_suite/iomgr_event_engine_test.cc index 387ac5b5036..41accf703f3 100644 --- a/test/core/event_engine/test_suite/iomgr_event_engine_test.cc +++ b/test/core/event_engine/test_suite/iomgr_event_engine_test.cc @@ -13,7 +13,7 @@ // limitations under the License. #include -#include "src/core/lib/event_engine/iomgr_engine.h" +#include "src/core/lib/event_engine/iomgr_engine/iomgr_engine.h" #include "test/core/event_engine/test_suite/event_engine_test.h" #include "test/core/util/test_config.h" @@ -24,8 +24,6 @@ int main(int argc, char** argv) { return absl::make_unique< grpc_event_engine::experimental::IomgrEventEngine>(); }); - grpc_init(); auto result = RUN_ALL_TESTS(); - grpc_shutdown(); return result; } diff --git a/test/core/util/grpc_fuzzer.bzl b/test/core/util/grpc_fuzzer.bzl index d94432d6996..157c3df63ac 100644 --- a/test/core/util/grpc_fuzzer.bzl +++ b/test/core/util/grpc_fuzzer.bzl @@ -16,9 +16,7 @@ Includes fuzzer rules. """ -load("//bazel:grpc_build_system.bzl", "grpc_cc_test") -load("@rules_proto//proto:defs.bzl", "proto_library") -load("@rules_cc//cc:defs.bzl", "cc_proto_library") +load("//bazel:grpc_build_system.bzl", "grpc_cc_test", "grpc_proto_library") def grpc_fuzzer(name, corpus, srcs = [], tags = [], deps = [], data = [], size = "large", **kwargs): """Instantiates a fuzzer test. @@ -54,13 +52,14 @@ def grpc_fuzzer(name, corpus, srcs = [], tags = [], deps = [], data = [], size = **kwargs ) -def grpc_proto_fuzzer(name, corpus, proto, srcs = [], tags = [], deps = [], data = [], size = "large", **kwargs): +def grpc_proto_fuzzer(name, corpus, proto, proto_deps = [], srcs = [], tags = [], deps = [], data = [], size = "large", **kwargs): """Instantiates a protobuf mutator fuzzer test. Args: name: The name of the test. corpus: The corpus for the test. proto: The proto for the test. + proto_deps: Deps for proto. srcs: The source files for the test. deps: The dependencies of the test. data: The data dependencies of the test. @@ -69,17 +68,13 @@ def grpc_proto_fuzzer(name, corpus, proto, srcs = [], tags = [], deps = [], data **kwargs: Other arguments to supply to the test. """ PROTO_LIBRARY = "_%s_proto" % name - CC_PROTO_LIBRARY = "_%s_cc_proto" % name CORPUS_DIR = native.package_name() + "/" + corpus - proto_library( + grpc_proto_library( name = PROTO_LIBRARY, srcs = [proto], - ) - - cc_proto_library( - name = CC_PROTO_LIBRARY, - deps = [PROTO_LIBRARY], + deps = proto_deps, + has_services = False, ) grpc_cc_test( @@ -88,7 +83,7 @@ def grpc_proto_fuzzer(name, corpus, proto, srcs = [], tags = [], deps = [], data tags = tags + ["grpc-fuzzer", "no-cache"], deps = deps + [ "@com_google_libprotobuf_mutator//:libprotobuf_mutator", - CC_PROTO_LIBRARY, + PROTO_LIBRARY, ] + select({ "//:grpc_build_fuzzers": [], "//conditions:default": ["//test/core/util:fuzzer_corpus_test"], diff --git a/tools/distrib/fix_build_deps.py b/tools/distrib/fix_build_deps.py index 69bf3f45e05..96480b0ca07 100755 --- a/tools/distrib/fix_build_deps.py +++ b/tools/distrib/fix_build_deps.py @@ -55,6 +55,8 @@ EXTERNAL_DEPS = { 'absl/container:flat_hash_set', 'absl/container/inlined_vector.h': 'absl/container:inlined_vector', + 'absl/cleanup/cleanup.h': + 'absl/cleanup', 'absl/functional/bind_front.h': 'absl/functional:bind_front', 'absl/functional/function_ref.h': diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 305d875380b..ba18759ed4d 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1936,8 +1936,18 @@ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/event_engine.cc \ src/core/lib/event_engine/event_engine_factory.h \ src/core/lib/event_engine/handle_containers.h \ -src/core/lib/event_engine/iomgr_engine.cc \ -src/core/lib/event_engine/iomgr_engine.h \ +src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc \ +src/core/lib/event_engine/iomgr_engine/iomgr_engine.h \ +src/core/lib/event_engine/iomgr_engine/thread_pool.cc \ +src/core/lib/event_engine/iomgr_engine/thread_pool.h \ +src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc \ +src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h \ +src/core/lib/event_engine/iomgr_engine/timer.cc \ +src/core/lib/event_engine/iomgr_engine/timer.h \ +src/core/lib/event_engine/iomgr_engine/timer_heap.cc \ +src/core/lib/event_engine/iomgr_engine/timer_heap.h \ +src/core/lib/event_engine/iomgr_engine/timer_manager.cc \ +src/core/lib/event_engine/iomgr_engine/timer_manager.h \ src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index cd53ea6db47..0c36d2289ba 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1727,8 +1727,18 @@ src/core/lib/event_engine/default_event_engine_factory.cc \ src/core/lib/event_engine/event_engine.cc \ src/core/lib/event_engine/event_engine_factory.h \ src/core/lib/event_engine/handle_containers.h \ -src/core/lib/event_engine/iomgr_engine.cc \ -src/core/lib/event_engine/iomgr_engine.h \ +src/core/lib/event_engine/iomgr_engine/iomgr_engine.cc \ +src/core/lib/event_engine/iomgr_engine/iomgr_engine.h \ +src/core/lib/event_engine/iomgr_engine/thread_pool.cc \ +src/core/lib/event_engine/iomgr_engine/thread_pool.h \ +src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc \ +src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h \ +src/core/lib/event_engine/iomgr_engine/timer.cc \ +src/core/lib/event_engine/iomgr_engine/timer.h \ +src/core/lib/event_engine/iomgr_engine/timer_heap.cc \ +src/core/lib/event_engine/iomgr_engine/timer_heap.h \ +src/core/lib/event_engine/iomgr_engine/timer_manager.cc \ +src/core/lib/event_engine/iomgr_engine/timer_manager.h \ src/core/lib/event_engine/memory_allocator.cc \ src/core/lib/event_engine/resolved_address.cc \ src/core/lib/event_engine/slice.cc \ diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 5b5e1bce6ef..2f96c71b02e 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -2348,7 +2348,7 @@ "flaky": false, "gtest": false, "language": "c", - "name": "thd_test", + "name": "test_core_iomgr_time_averaged_stats_test", "platforms": [ "linux", "mac", @@ -2372,7 +2372,7 @@ "flaky": false, "gtest": false, "language": "c", - "name": "threadpool_test", + "name": "test_core_iomgr_timer_heap_test", "platforms": [ "linux", "mac", @@ -2396,7 +2396,7 @@ "flaky": false, "gtest": false, "language": "c", - "name": "time_averaged_stats_test", + "name": "test_core_iomgr_timer_list_test", "platforms": [ "linux", "mac", @@ -2420,7 +2420,7 @@ "flaky": false, "gtest": false, "language": "c", - "name": "timer_heap_test", + "name": "thd_test", "platforms": [ "linux", "mac", @@ -2444,7 +2444,7 @@ "flaky": false, "gtest": false, "language": "c", - "name": "timer_list_test", + "name": "threadpool_test", "platforms": [ "linux", "mac", @@ -6925,6 +6925,78 @@ ], "uses_polling": false }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "test_core_event_engine_iomgr_event_engine_time_averaged_stats_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": false + }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "test_core_event_engine_iomgr_event_engine_timer_heap_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": false + }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "test_core_event_engine_iomgr_event_engine_timer_list_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": false + }, { "args": [], "benchmark": false,